保姆级教程:Vue3 + Django + MySQL 前后端联调(PyCharm+VSCode版) ...

打印 上一主题 下一主题

主题 1730|帖子 1730|积分 5190

一、情况预备与验证

这里为淘汰篇幅,默认大家都安装好了这些软件。不会下载安装的,教程也很多,这里不再做赘述。话不多说,咱们开始:
1. 安装验证

确保已安装以下软件并验证版本:
  1. # 验证Node.js
  2. node -v  # 应显示v16.x或更高,我安装的是v20.18.0
  3. npm -v
  4. # 验证Python
  5. python --version  # 应显示3.8.x或更高,这是 Django 5.0 支持的最低版本。我用的3.12.9
  6. pip --version
  7. # 验证MySQL
  8. mysql --version
复制代码
2. 开发工具预备



  • PyCharm专业版:用于Django后端开发
  • VSCode:用于Vue前端开发
  • Navicat(可选):数据库可视化工具
 二、MySQL数据库设置 

如果有数据库可视化工具就直接点点点创建即可,这里不做赘述,只阐明怎样用命令行创建:
  1. mysql -u root -p //登录数据库,回车后输入密码即可
  2. CREATE DATABASE fullstack;  //创建数据库,注意分号结尾
  3. SHOW DATABASES; //产看数据库是否创建成功
复制代码
 示例:

注意,这里不用手动创建数据表或者利用原生SQL语句,下面在Django 中定义模子类并通过迁移体系创建表。这就是我们常说的ORM(对象关系映射)
 三、后端项目初始化(PyCharm)

这里有两种方法,专业版的可以直接办动创建,不是专业版的可以用另一种命令行创建的方法。
   

  • 这里推荐大家学习利用怎样用命令行创建,能够学到关于虚拟情况的创建方法。虚拟情况对于我们日后的学习怎样管理python项目很有用。
  • 在虚拟情况中安装的库不会影响全局 Python 情况和其他虚拟情况。如许就可以为每个项目精确地安装所需的依赖,避免了差别项目之间依赖库版本的辩论。
  • 而且可以通过导出虚拟情况中的依赖列表(利用 pip freeze > requirements.txt 命令),来快速重建类似的情况
  1. 创建Django项目

手动创建:


  • 打开PyCharm → New Project
  • 选择"Django"项目类型
  • 设置:

    • Location: your-path/backend
    • Python表明器:选择3.8+
    • 勾选"Create virtual environment"
    • Django版本:5.0.3

  • 点击Create
命令行创建 

首先创建一个虚拟情况,注意我这里利用 conda 创建虚拟情况。
  1. conda create -n django_env python=3.12.9  //创建虚拟环境
  2. conda activate django_env //激活虚拟环境
  3. pip install django==5.0.3 //安装必要库
  4. mkdir fullstack-project //创建文件夹,存放前后端项目文件
  5. cd fullstack-project //切换到文件夹
  6. django-admin startproject backend  //命令行创建项目文件
  7. python manage.py startapp Login  //创建登录应用
  8. pip install django-cors-headers mysqlclient// 在该虚拟环境下安装必要依赖 
复制代码
此中: 


  • django-cors-headers:用于办理 Django 项目中的跨域题目,设置机动,利用简朴。
  • mysqlclient:用于 Python 连接 MySQL 数据库,性能优越,功能强大,是 Django 推荐的 MySQL 数据库驱动之一。
 用PyCharm打开即可看到目次布局长如许:

2.设置项目

修改 backend/settings.py:
  1. INSTALLED_APPS = [
  2.     ...
  3.     'rest_framework',
  4.     'corsheaders',
  5.     'Login',
  6. ]
  7. MIDDLEWARE = [
  8.    
  9.     'corsheaders.middleware.CorsMiddleware',#需注意与其他中间件顺序,这里放在最前面即可
  10.       ...
  11. ]
  12. # 允许所有域名跨域访问(开发环境使用,生产环境需要配置具体域名)
  13. CORS_ORIGIN_ALLOW_ALL = True
  14. # 数据库配置
  15. DATABASES = {
  16.     'default': {
  17.         'ENGINE': 'django.db.backends.mysql',
  18.         'NAME': 'fullstack',  //要创建的数据库名,我用的是fullstack
  19.         'USER': 'your_mysql_username',  //数据库用户名
  20.         'PASSWORD': 'your_mysql_password',  //数据库密码
  21.         'HOST': 'localhost',
  22.         'PORT': '3306',
  23.     }
  24. }
复制代码
3.模子定义(Login/models.py)

也就是通过简答的代码创建数据表,简朴表明下:

  • 将数据库表映射为类:每个数据库表对应一个类(称为模子类)。
  • 将表中的记录映射为对象:表中的每一行数据对应一个对象实例。
  • 通过对象操作数据库开发者可以通过操作对象来实现对数据库的增、删、改、查操作,而无需直接编写 SQL 语句。
  1. (Login/models.py)
  2. from django.db import models
  3. # Create your models here.
  4. class User(models.Model):
  5.     username = models.CharField(max_length=50)
  6.     password = models.CharField(max_length=50)
复制代码
编写完后打开终端cd到当前目次下,我们要创建迁移文件并应用迁移,也就是让代码生效:
  1. # 创建迁移文件并应用迁移
  2. python manage.py makemigrations
  3. python manage.py migrate
复制代码
示例:

如果这时候你安装有可视化数据库软件,打开革新即可看到 :

4.创建视图 (Login/views.py)

  1. from rest_framework import status
  2. from rest_framework.views import APIView
  3. from rest_framework.response import Response
  4. from .models import User
  5. class RegisterView(APIView):
  6.     def post(self, request):
  7.         username = request.data.get('username')
  8.         password = request.data.get('password')
  9.         if username and password:
  10.             user = User.objects.create(username=username, password=password)
  11.             return Response("User created successfully", status=status.HTTP_201_CREATED)
  12.         else:
  13.             return Response("Username and password are required", status=status.HTTP_400_BAD_REQUEST)
复制代码
5.设置URL

注意:这里必要设置两处urls。除默认创建好的,还要在Login目次下手动创建一个urls.py文件,注意区分!详细设置如下:
  1. (backend/urls.py) 
  2. from django.contrib import admin
  3. from django.urls import path,include
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('Login/', include('Login.urls')),
  7. ]
  8. (backend/Login/urls.py)
  9. from django.urls import path
  10. from .views import RegisterView
  11. urlpatterns = [
  12.     path('register/', RegisterView.as_view(), name='register'),
  13. ]
复制代码
 6.启动后端

在完成上面操作后,在终端当前目次下,运行以下命令,启动后端:
  1. python manage.py runserver
复制代码
 示例:

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

1.创建vue3项目

这里记得进入到目次fullstack-project下
进入目次后运行以下命令:注意这个命令是安装Node.js中之后才华运行的。这一指令将会安装并实行 create-vue,它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示:

如果不知道怎么选的按我这个就行,然后回车应该还会有功能,不用再空格选了,直接回车。frontend创建好后进入该目次,然后按提示依次运行命令即可:
   注意:npm run format 是一个用于代码格式化的命令,通常用于确保代码风格一致。它并不是启动项目的必要步骤。这里直接跳过,运行启动命令即可正常启动。
  

运行命令启动看是否创建成功,点击出现的默认url:
  1. npm run dev
复制代码
示例:

2.设置项目 

VS Code打开刚创建好的前端项目,这里还要做一些小设置,为前后端联调做预备。
Ctrl+` 打开终端,安装以下依赖项,此中,axios 用于与后端举行数据交互,vue-router 用于实现页面的路由管理
  1. npm install axios vue-router
复制代码
安装好后还要手动修改一下目次布局:
  1. frontend/
  2. ├── src/
  3. │   ├── api/            # API请求封装
  4. │   ├── router/         # 路由配置
  5. │   ├── views/          # 页面组件
  6. │   ├── App.vue
  7. │   └── main.ts
复制代码
然后将main.ts中的第一行样式注销:这是为了防止默认样式干扰操作。
设置署理 (办理跨域)
在 frontend/vite.config.js 中添加:
  1. import { fileURLToPath, URL } from 'node:url'
  2. import { defineConfig } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import vueDevTools from 'vite-plugin-vue-devtools'
  5. // https://vite.dev/config/
  6. export default defineConfig({
  7.   plugins: [
  8.     vue(),
  9.     vueDevTools(),
  10.   ],
  11.   resolve: {
  12.     alias: {
  13.       '@': fileURLToPath(new URL('./src', import.meta.url))
  14.     },
  15.   },
  16.   server: {
  17.     proxy: {
  18.       '/api': {
  19.         target: 'http://localhost:8000',
  20.         changeOrigin: true,
  21.       }
  22.     }
  23.   }
  24.   
  25. })
复制代码
3.创建注册页面 

这里为方便直接在App.vue文件中作修改。拿去复制即可:
  1. <template>
  2.   <div class="container">
  3.     <div class="box">
  4.       <div class="header">
  5.         <h2>欢迎注册</h2>
  6.          <svg t="1743150356672" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
  7.           p-id="4191" width="48" height="48">
  8.           <path
  9.             d="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"
  10.             fill="#000000" p-id="4192"></path>
  11.         </svg>
  12.       </div>
  13.       <div class="content">
  14.         <form @submit.prevent="login">
  15.           <div class="form-item">
  16.             <label>用户名:</label>
  17.             <input v-model="username" type="text" required placeholder="请输入用户名">
  18.           </div>
  19.           <div class="form-item">
  20.             <label>密码:</label>
  21.             <input v-model="password" type="password" required placeholder="请输入密码">
  22.           </div>
  23.           <div class="button-group">
  24.             <button class="register-btn">注册</button>
  25.           </div>
  26.         </form>
  27.       </div>
  28.     </div>
  29.   </div>
  30.   <!-- <RouterView /> -->
  31. </template>
  32. <script setup lang="ts">
  33. import axios from 'axios'
  34. import { ref } from 'vue'
  35. const username = ref('')
  36. const password = ref('')
  37. const login = async () => {
  38.   try {
  39.     const response = await axios.post('http://localhost:8000/Login/register/', {
  40.       username: username.value,
  41.       password: password.value
  42.     })
  43.     console.log(response)
  44.     alert(response.data)
  45.   } catch (error: any) {
  46.     console.log(error.response)
  47.   }
  48. }
  49. </script>
  50. <style scoped>
  51. .container {
  52.   display: flex;
  53.   justify-content: center;
  54.   align-items: center;
  55.   height: 100vh;
  56.   /* 使用视口高度,确保容器高度覆盖整个屏幕 */
  57.   .box {
  58.     width: 400px;
  59.     height: 400px;
  60.     border-radius: 10px;
  61.     box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  62.     .header {
  63.       display: flex;
  64.       justify-content: center;
  65.       align-items: center;
  66.       margin-top: 10px;
  67.       h2 {
  68.         margin-left: 10px;
  69.       }
  70.     }
  71.     .form-item {
  72.       /* display: flex; */
  73.       flex-direction: column;
  74.       margin: 20px 0;
  75.       label {
  76.         display: block;
  77.         margin-bottom: 8px;
  78.         color: #666;
  79.         margin-left: 50px;
  80.       }
  81.       input {
  82.         width: 300px;
  83.         height: 30px;
  84.         border: 1px solid #ccc;
  85.         border-radius: 5px;
  86.         margin-left: 50px;
  87.       }
  88.     }
  89.     .content {
  90.       .form-item1 {
  91.         display: flex;
  92.         align-items: center;
  93.         label {
  94.           margin-bottom: 8px;
  95.           color: #666;
  96.           margin-left: 30px;
  97.         }
  98.         input {
  99.           width: 300px;
  100.           height: 30px;
  101.           border: 1px solid #ccc;
  102.           border-radius: 5px;
  103.         }
  104.       }
  105.       .button-group {
  106.         display: flex;
  107.         justify-content: center;
  108.         margin-top: 30px;
  109.         .register-btn {
  110.           background-color: #67C23A;
  111.           color: white;
  112.           width: 200px;
  113.           height: 40px;
  114.           border-radius: 4px;
  115.           border: none;
  116.           /* 去掉边框 */
  117.           cursor: pointer;
  118.           /* 鼠标移上去显示手型 */
  119.           font-size: 16px;
  120.           transition: background-color 0.3s;
  121.           /*平滑过渡:当元素的背景颜色发生变化时,不会立即切换,而是会在0.3秒内逐渐过渡到新的颜色。*/
  122.         }
  123.         .register-btn:hover {
  124.           background-color: #85ce61;
  125.         }
  126.       }
  127.     }
  128.   }
  129. }
  130. </style>
复制代码
样式:
 

   在 Vue 3 中,const login = async () => { ... } 是一种常用的定义异步函数的方法,但它并不是 Vue 3 特有的写法,而是 JavaScript 的语法。这种写法在 Vue 3 的代码中非常常见,尤其是在处置惩罚异步逻辑(如 API 哀求)时。
  这时候试着输入内容,点击注册,即可看到弹框内容:注册成功。

检察数据库看到,内容成功存入数据库:

总结 

顺利走到这就实现了一个简朴的前后端联调注册功能^-^

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表