保姆级教程: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.mzph.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. 依赖…