保姆級教程:Vue3 + Django + MySQL 前后端聯調(PyCharm+VSCode版)

一、環境準備與驗證

這里為減少篇幅,默認大家都安裝好了這些軟件。不會下載安裝的,教程也很多,這里不再做贅述。話不多說,咱們開始:

1. 安裝驗證

確保已安裝以下軟件并驗證版本:

# 驗證Node.js
node -v  # 應顯示v16.x或更高,我安裝的是v20.18.0
npm -v# 驗證Python
python --version  # 應顯示3.8.x或更高,這是 Django 5.0 支持的最低版本。我用的3.12.9
pip --version# 驗證MySQL
mysql --version

2. 開發工具準備

  • ?PyCharm專業版:用于Django后端開發
  • ?VSCode:用于Vue前端開發
  • ?Navicat(可選):數據庫可視化工具

?二、MySQL數據庫配置?

如果有數據庫可視化工具就直接點點點創建即可,這里不做贅述,只說明如何用命令行創建:

mysql -u root -p //登錄數據庫,回車后輸入密碼即可CREATE DATABASE fullstack;  //創建數據庫,注意分號結尾SHOW DATABASES; //產看數據庫是否創建成功

?示例:

注意,這里不用手動創建數據表或者使用原生SQL語句,下面在Django 中定義模型類并通過遷移系統創建表。這就是我們常說的ORM(對象關系映射)

?三、后端項目初始化(PyCharm)

這里有兩種方法,專業版的可以直接手動創建,不是專業版的可以用另一種命令行創建的方法。

  • 這里推薦大家學習使用如何用命令行創建,能夠學到關于虛擬環境的創建方法。虛擬環境對于我們日后的學習如何管理python項目很有用。
  • 在虛擬環境中安裝的庫不會影響全局 Python 環境和其他虛擬環境。這樣就可以為每個項目精確地安裝所需的依賴,避免了不同項目之間依賴庫版本的沖突。
  • 而且可以通過導出虛擬環境中的依賴列表(使用?pip freeze > requirements.txt 命令),來快速重建相同的環境

1. 創建Django項目

手動創建:

  1. 打開PyCharm → New Project
  2. 選擇"Django"項目類型
  3. 配置:
    • Location:?your-path/backend
    • Python解釋器:選擇3.8+
    • 勾選"Create virtual environment"
    • Django版本:5.0.3
  4. 點擊Create

命令行創建?

首先創建一個虛擬環境,注意我這里使用 conda 創建虛擬環境。

conda create -n django_env python=3.12.9  //創建虛擬環境conda activate django_env //激活虛擬環境pip install django==5.0.3 //安裝必要庫mkdir fullstack-project //創建文件夾,存放前后端項目文件cd fullstack-project //切換到文件夾django-admin startproject backend  //命令行創建項目文件python manage.py startapp Login  //創建登錄應用pip install django-cors-headers mysqlclient// 在該虛擬環境下安裝必要依賴?

其中:?

  • django-cors-headers:用于解決 Django 項目中的跨域問題,配置靈活,使用簡單。
  • mysqlclient:用于 Python 連接 MySQL 數據庫,性能優越,功能強大,是 Django 推薦的 MySQL 數據庫驅動之一。

?用PyCharm打開即可看到目錄結構長這樣:

2.配置項目

修改?backend/settings.py:

INSTALLED_APPS = [...'rest_framework','corsheaders','Login',
]MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware',#需注意與其他中間件順序,這里放在最前面即可...
]# 允許所有域名跨域訪問(開發環境使用,生產環境需要配置具體域名)
CORS_ORIGIN_ALLOW_ALL = True# 數據庫配置
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'fullstack',  //要創建的數據庫名,我用的是fullstack'USER': 'your_mysql_username',  //數據庫用戶名'PASSWORD': 'your_mysql_password',  //數據庫密碼'HOST': 'localhost','PORT': '3306',}
}

3.模型定義(Login/models.py)

也就是通過簡答的代碼創建數據表,簡單解釋下:

  1. 將數據庫表映射為類:每個數據庫表對應一個類(稱為模型類)。
  2. 將表中的記錄映射為對象:表中的每一行數據對應一個對象實例。
  3. 通過對象操作數據庫:開發者可以通過操作對象來實現對數據庫的增、刪、改、查操作,而無需直接編寫 SQL 語句。
(Login/models.py)from django.db import models# Create your models here.
class User(models.Model):username = models.CharField(max_length=50)password = models.CharField(max_length=50)

編寫完后打開終端cd到當前目錄下,我們要創建遷移文件并應用遷移,也就是讓代碼生效:

# 創建遷移文件并應用遷移
python manage.py makemigrations
python manage.py migrate

示例:

如果這時候你安裝有可視化數據庫軟件,打開刷新即可看到?:

4.創建視圖 (Login/views.py)

from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Userclass RegisterView(APIView):def post(self, request):username = request.data.get('username')password = request.data.get('password')if username and password:user = User.objects.create(username=username, password=password)return Response("User created successfully", status=status.HTTP_201_CREATED)else:return Response("Username and password are required", status=status.HTTP_400_BAD_REQUEST)

5.配置URL

注意:這里需要配置兩處urls。除默認創建好的,還要在Login目錄下手動創建一個urls.py文件,注意區分!具體配置如下:

(backend/urls.py)?
from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('Login/', include('Login.urls')),
](backend/Login/urls.py)
from django.urls import path
from .views import RegisterViewurlpatterns = [path('register/', RegisterView.as_view(), name='register'),
]

?6.啟動后端

在完成上面操作后,在終端當前目錄下,運行以下命令,啟動后端:

python manage.py runserver

?示例:

四、前端項目初始化(VSCode)

1.創建vue3項目

這里記得進入到目錄fullstack-project下

進入目錄后運行以下命令:注意這個命令是安裝Node.js中之后才能運行的。這一指令將會安裝并執行?create-vue,它是 Vue 官方的項目腳手架工具。你將會看到一些諸如 TypeScript 和測試支持之類的可選功能提示:

如果不知道怎么選的按我這個就行,然后回車應該還會有功能,不用再空格選了,直接回車。frontend創建好后進入該目錄,然后按提示依次運行命令即可:

注意:npm run format?是一個用于代碼格式化的命令,通常用于確保代碼風格一致。它并不是啟動項目的必要步驟。這里直接跳過,運行啟動命令即可正常啟動。

運行命令啟動看是否創建成功,點擊出現的默認url:

npm run dev

示例:

2.配置項目?

VS Code打開剛創建好的前端項目,這里還要做一些小配置,為前后端聯調做準備。

Ctrl+` 打開終端,安裝以下依賴項,其中,axios 用于與后端進行數據交互,vue-router 用于實現頁面的路由管理

npm install axios vue-router

安裝好后還要手動修改一下目錄結構:

frontend/
├── src/
│   ├── api/            # API請求封裝
│   ├── router/         # 路由配置
│   ├── views/          # 頁面組件
│   ├── App.vue
│   └── main.ts

然后將main.ts中的第一行樣式注銷:這是為了防止默認樣式干擾操作。

配置代理 (解決跨域)

在?frontend/vite.config.js?中添加:

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'// https://vite.dev/config/
export default defineConfig({plugins: [vue(),vueDevTools(),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))},},server: {proxy: {'/api': {target: 'http://localhost:8000',changeOrigin: true,}}}})

3.創建注冊頁面?

這里為方便直接在App.vue文件中作修改。拿去復制即可:

<template><div class="container"><div class="box"><div class="header"><h2>歡迎注冊</h2><svg t="1743150356672" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"p-id="4191" width="48" height="48"><pathd="M767.818667 409.173333C867.338667 444.266667 938.666667 539.136 938.666667 650.666667c0 42.709333-10.496 83.978667-30.261334 120.842666-1.792 3.338667-4.992 8.928-9.696 16.96l14.613334 53.557334c6.506667 23.893333-15.402667 45.813333-39.296 39.296l-53.642667-14.634667-6.229333 3.669333A254.933333 254.933333 0 0 1 682.666667 906.666667c-77.994667 0-147.84-34.88-194.805334-89.888a352.608 352.608 0 0 1-56.64 4.554666c-63.338667 0-124.266667-16.853333-177.472-48.298666-1.834667-1.088-6.410667-3.733333-13.632-7.893334l-80.544 21.653334c-23.914667 6.432-45.76-15.573333-39.146666-39.434667l21.792-78.752a961.205333 961.205333 0 0 1-15.904-27.317333A336.384 336.384 0 0 1 85.333333 480c0-188.618667 154.965333-341.333333 345.888-341.333333 159.914667 0 297.984 108.010667 335.818667 259.296 0.949333 3.765333 1.173333 7.552 0.778667 11.2z m-68.106667-13.952C662.88 282.037333 555.178667 202.666667 431.221333 202.666667 275.434667 202.666667 149.333333 326.933333 149.333333 480c0 46.272 11.498667 90.837333 33.194667 130.698667 2.88 5.290667 10.176 17.706667 21.621333 36.746666a32 32 0 0 1 3.413334 25.013334l-10.517334 37.994666 39.232-10.549333a32 32 0 0 1 24.234667 3.146667c14.272 8.192 22.773333 13.098667 25.802667 14.890666A283.882667 283.882667 0 0 0 431.221333 757.333333c6.154667 0 12.288-0.192 18.389334-0.576A255.061333 255.061333 0 0 1 426.666667 650.666667c0-141.386667 114.613333-256 256-256 5.728 0 11.413333 0.192 17.045333 0.554666z m133.706667 397.056a32 32 0 0 1 3.338666-24.725333 996.672 996.672 0 0 0 15.242667-26.293333A190.997333 190.997333 0 0 0 874.666667 650.666667c0-106.037333-85.962667-192-192-192s-192 85.962667-192 192 85.962667 192 192 192a190.933333 190.933333 0 0 0 98.570666-27.2c2.208-1.322667 8.288-4.874667 18.517334-10.837334a32 32 0 0 1 24.522666-3.210666l12.565334 3.424-3.424-12.565334zM330.666667 426.666667a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m192 0a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m85.333333 202.666666a32 32 0 1 1 0-64 32 32 0 0 1 0 64z m149.333333 0a32 32 0 1 1 0-64 32 32 0 0 1 0 64z"fill="#000000" p-id="4192"></path></svg></div><div class="content"><form @submit.prevent="login"><div class="form-item"><label>用戶名:</label><input v-model="username" type="text" required placeholder="請輸入用戶名"></div><div class="form-item"><label>密碼:</label><input v-model="password" type="password" required placeholder="請輸入密碼"></div><div class="button-group"><button class="register-btn">注冊</button></div></form></div></div></div><!-- <RouterView /> -->
</template>
<script setup lang="ts">
import axios from 'axios'
import { ref } from 'vue'
const username = ref('')
const password = ref('')const login = async () => {try {const response = await axios.post('http://localhost:8000/Login/register/', {username: username.value,password: password.value})console.log(response)alert(response.data)} catch (error: any) {console.log(error.response)}}</script>
<style scoped>
.container {display: flex;justify-content: center;align-items: center;height: 100vh;/* 使用視口高度,確保容器高度覆蓋整個屏幕 */.box {width: 400px;height: 400px;border-radius: 10px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);.header {display: flex;justify-content: center;align-items: center;margin-top: 10px;h2 {margin-left: 10px;}}.form-item {/* display: flex; */flex-direction: column;margin: 20px 0;label {display: block;margin-bottom: 8px;color: #666;margin-left: 50px;}input {width: 300px;height: 30px;border: 1px solid #ccc;border-radius: 5px;margin-left: 50px;}}.content {.form-item1 {display: flex;align-items: center;label {margin-bottom: 8px;color: #666;margin-left: 30px;}input {width: 300px;height: 30px;border: 1px solid #ccc;border-radius: 5px;}}.button-group {display: flex;justify-content: center;margin-top: 30px;.register-btn {background-color: #67C23A;color: white;width: 200px;height: 40px;border-radius: 4px;border: none;/* 去掉邊框 */cursor: pointer;/* 鼠標移上去顯示手型 */font-size: 16px;transition: background-color 0.3s;/*平滑過渡:當元素的背景顏色發生變化時,不會立即切換,而是會在0.3秒內逐漸過渡到新的顏色。*/}.register-btn:hover {background-color: #85ce61;}}}}
}
</style>

樣式:
?

在 Vue 3 中,const login = async () => { ... } 是一種常用的定義異步函數的方法,但它并不是 Vue 3 特有的寫法,而是 JavaScript 的語法。這種寫法在 Vue 3 的代碼中非常常見,尤其是在處理異步邏輯(如 API 請求)時。

這時候試著輸入內容,點擊注冊,即可看到彈框內容:注冊成功。

查看數據庫看到,內容成功存入數據庫:

總結?

順利走到這就實現了一個簡單的前后端聯調注冊功能^-^

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73704.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Data審計利器:@LastModifiedDate詳解!!!

&#x1f552; Spring Data審計利器&#xff1a;LastModifiedDate詳解&#x1f525; &#x1f31f; 簡介 在數據驅動的應用中&#xff0c;記錄數據的最后修改時間是常見需求。Spring Data的LastModifiedDate注解讓這一過程自動化成為可能&#xff01;本篇帶你掌握它的核心用法…

洛谷題單1-P1001 A+B Problem-python-流程圖重構

題目描述 輸入兩個整數 a,b&#xff0c;輸出它們的和&#xff08;∣a∣,∣b∣≤109&#xff09;。 輸入格式 兩個以空格分開的整數。 輸出格式 一個整數。 輸入輸出樣例 輸入 20 30輸出 50方式-print class Solution:staticmethoddef oi_input():"""從…

CCF CSP 第33次(2024.03)(2_相似度計算_C++)(字符串中字母大小寫轉換+哈希集合)

CCF CSP 第33次&#xff08;2024.03&#xff09;&#xff08;2_相似度計算_C&#xff09; 題目背景&#xff1a;題目描述&#xff1a;輸入格式&#xff1a;輸出格式&#xff1a;樣例1輸入&#xff1a;樣例1輸出&#xff1a;樣例1解釋&#xff1a;樣例2輸入&#xff1a;樣例2輸出…

Windows .gitignore文件不生效的情況排查

概述 今天下班在家里搗騰自己的代碼&#xff0c;在配置.gitignore文件忽略部分文件的時候&#xff0c;發現死活不生效 問題根源 經過一通分析和排查才發現&#xff0c;是.gitignore文件的編碼錯了&#xff0c;剛開始還沒注意到&#xff0c;因為是在Windows下開發&#xff0c…

Uniapp自定義TabBar組件全封裝實踐與疑難問題解決方案

前言 在當前公司小程序項目中&#xff0c;我們遇到了一個具有挑戰性的需求&#xff1a;根據不同用戶身份動態展示差異化的底部導航欄&#xff08;TabBar&#xff09; 。這種多角色場景下的UI適配需求&#xff0c;在提升用戶體驗和實現精細化運營方面具有重要意義。 在技術調研…

四川省汽車加氣站操作工備考題庫及答案分享

1.按壓力容器的設計壓力分為&#xff08; &#xff09;個壓力等級。 A. 三 B. 四 C. 五 D. 六 答案&#xff1a;B。解析&#xff1a;按壓力容器的設計壓力分為低壓、中壓、高壓、超高壓四個壓力等級。 2.緩沖罐的安裝位置在天然氣壓縮機&#xff08; &#xff09;。 A. 出口處 …

2025年- G27-Lc101-542. 01 矩陣--java版

1.題目描述 2.思路 總結&#xff1a;用廣度優先搜索&#xff0c;首先要確定0的位置&#xff0c;不為0的位置&#xff0c;我們要更新的它的值&#xff0c;只能往上下左右尋找跟它最近的0的位置。 解題思路 我們用 BFS&#xff08;廣度優先搜索&#xff09;求解&#xff0c;因為 …

CANopen基本理論

目錄 一、CANopen簡介 二、OD對象字典 2.1 OD對象字典簡介 2.2 CANopen預定義連接集 三、PDO過程數據對象 四、SDO過程數據對象 五、特殊協議 5.1 同步協議 5.2 時間戳協議 5.3 緊急報文協議 六、NMT網絡管理 6.1 NMT節點狀態 6.2 NMT節點上線報文 6.3 NMT心跳報…

【Zookeeper搭建】Zookeeper分布式集群搭建完整指南

Zookeeper分布式集群搭建 &#xff08;一&#xff09;克隆前準備工作 一、時鐘同步 步驟&#xff1a; 1、輸入date命令可以查看當前系統時間&#xff0c;可以看到此時系統時間為PDT&#xff08;部分機器或許為EST&#xff09;&#xff0c;并非中國標準時間。我們在中國地區…

MVC基礎概念及相應代碼示例

&#xff08;舊的&#xff09;代碼實現方法 一個功能模塊的代碼邏輯&#xff08;顯示處理&#xff0c;數據處理&#xff0c;邏輯判定&#xff09;都寫在一起(耦合) &#xff08;新的&#xff09;代碼MVC分層實現方法 顯示部分實現&#xff08;View視圖&#xff09; 數據處理實…

nginx優化(持續更新!!!)

1.調整文件描述符 # 查看當前系統文件描述符限制 ulimit -n# 永久修改文件描述符限制 # 編輯 /etc/security/limits.conf 文件&#xff0c;添加以下內容 * soft nofile 65535 * hard nofile 65535# 編輯 /etc/sysctl.conf 文件&#xff0c;添加以下內容 fs.file-max 655352.調…

apache連接池機制討論

apache連接池的連接有效性 server一般會配置keep-alive超時時間&#xff0c;過了這個時間還沒新請求到來&#xff0c;則關閉連接。客戶端從連接池里拿出連接時&#xff0c;會檢查一下連接是否已關閉&#xff0c;如已關閉&#xff0c;會丟棄掉該連接&#xff0c;并嘗試從連接池…

【QT5 多線程示例】條件變量

文章目錄 條件變量使用 wakeOne()使用 wakeAll() 條件變量 QT的條件變量類是QWaitCondition&#xff0c;有wakeOne() 和 wakeAll() 兩個方法 wakeOne()&#xff1a;僅喚醒一個等待的線程。wakeAll()&#xff1a;喚醒所有等待的線程。 使用 wakeOne() https://github.com/Bi…

備賽藍橋杯之第十六屆模擬賽第1期職業院校組第四題:世紀危機(人口增長推算)

提示&#xff1a;本篇文章僅僅是作者自己目前在備賽藍橋杯中&#xff0c;自己學習與刷題的學習筆記&#xff0c;寫的不好&#xff0c;歡迎大家批評與建議 由于個別題目代碼量與題目量偏大&#xff0c;請大家自己去藍橋杯官網【連接高校和企業 - 藍橋云課】去尋找原題&#xff0…

從零構建大語言模型全棧開發指南:第三部分:訓練與優化技術-3.2.3預訓練任務設計:掩碼語言建模(MLM)與下一句預測(NSP)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 3.2.3 預訓練任務設計:`掩碼語言建模(MLM)`與下一句預測(NSP)1. 掩碼語言建模(`Masked Language Modeling, MLM`)1.1 MLM的核心原理與數學形式1.2 高級掩碼優化技術1.2.1 `Span Masking(SpanBER…

OpenBMC:BmcWeb 生效路由2 Trie字典樹

OpenBMC:BmcWeb 生效路由1 基于method分類路由_openbmc web-CSDN博客 可以看到,在internalAdd中: std::vector<BaseRule*> rules; rules.emplace_back(ruleObject); trie.add(rule, static_cast<unsigned>(rules.size() - 1U)); ruleObject首先被放入了每個meth…

Appium中元素定位之一組元素定位API

應用場景 和定位一個元素相同&#xff0c;但如果想要批量的獲取某個相同特征的元素&#xff0c;使用定位一組元素的方式更加方便 在 Appium 中定位一組元素的 API 與定位單個元素的 API 類似&#xff0c;但它們返回的是一個元素列表&#xff08;List<MobileElement>&am…

第五周日志-重新學匯編(2)

機器語言 匯編語言(直接在硬件上工作——硬件系統結構&#xff09;&#xff1a; 1.機器語言 每一種微處理器硬件設計和內部結構不同&#xff08;決定了電信號不同&#xff0c;進而需要不同的機器指令&#xff09; #早期通過紙帶機/卡片機輸入計算機&#xff0c;進行運算 2…

【9】Strongswan collections —— enumerator

//以目錄枚舉為例子&#xff0c;說明enumerator&#xff0c;從源碼剝離可運行 #include <stdio.h> #include <stdbool.h> #include <dirent.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h&…

談談對spring IOC的理解,原理和實現

一、IoC 核心概念 1. 控制反轉&#xff08;Inversion of Control&#xff09; 傳統編程中對象自行管理依賴&#xff08;主動創建&#xff09;&#xff0c;而IoC將控制權轉移給容器&#xff0c;由容器負責對象的創建、裝配和管理&#xff0c;實現依賴關系的反向控制。 2. 依賴…