当前位置:   article > 正文

【萌新向】全栈初体验,从头开始搭建前后端交互项目vue3+python+django+mysql_python vue django

python vue django

1 准备工具

(1)前端:vue3+vite+ts/js

(2)后端:python+django+pycharm

(3)数据库:MySQL+MySQLWorkbench

(4)测试工具:Apipost

安装教程可参考以下链接:

(1)前端,这里我们创建vue3项目,加入路由,导入axios、elementui(plus)、less(sass)即可

vite+vue3+ts 手把手教你创建一个vue3项目_vite创建vue3项目-CSDN博客

(2)后端,使用的框架是django,用的编辑器是pycharm,语言是python

Python及Pycharm专业版下载安装教程(Python 3.11版)附JetBrains学生认证教程_python专业版下载教程-CSDN博客

(3)数据库,使用了workbench作为可视化的工具

MySQL8.0版安装教程 + Workbench可视化配置教程(史上最细、一步一图解)_mysql workbench8.0安装教程-CSDN博客

2 工作拆解

我们可以按照

数据库建表 -> 后端连接数据库 -> 后端接口代码 -> 测试接口 -> 前端代码 -> 前端调用接口

这个顺序来进行,切忌不要一次性做太多内容而不进行测试,出错了都不知道问题出现在哪一步。

本文以写一个登陆的接口为例。

2.1 数据库建表

2.1.1 使用可视化工具建表(简单 直观)

如果看见以下提示:

则在计算机管理中打开数据库的进程,右键MySQL80 -> 启动

正常启动后,workbench内容如下:

(1)首先创建一个数据库

(2)随后可以在这里看到刚创建的数据库,之后可以新建表了

(3)设计表内容,我们做的是用户表,实现登陆注册,一切从简,只用了两个属性,id和pwd

分别是登陆名(不能重复、不能为空)与密码

(4)往数据库中插入数据

填入数据,选择apply,我们就得到了两条数据, 可使用上方sql代码验证是否成功插入。

闪电标识为执行当前sql语句的意思,执行结果如下方红框所示,代表插入成功。

2.1.2 使用sql语句建表

首先复习一下sql语句:

  1. /* 新建操作 */
  2. create database dbname;  // 创建数据库
  3. CREATE TABLE table_name (
  4.     column1 datatype,
  5.     column2 datatype,
  6.     column3 datatype,
  7.     ...
  8. );  // 新建表 其中每个column最后可添加一些关键字,如 第1行改为 id varchar(50) PRIMARY 
  9. // KEY,表示id为此表的主键
  10. /* 删除操作 */
  11. drop database dbname // 删除数据库
  12. dorp table table_name // 删除表
  13. /* 插入数据 */
  14. insert into table_name(key1, key2) value(value1, value2);  // 将某条数据插入表中
  15. inset into table_name value (value1, value2, value3, ...) //value必须按照key的顺序来
  16. use dbname // 使用某个具体数据库
  17. /* 查询 */
  18. select * from table_name;  // * 为通配符,表示”全部“,如果前面没用use database,
  19.                           // 则此处使用dbname.table_name
  20. select key1, key2 from table_name; // 查询指定的列名/属性
  21. select * from table_name where key1 = value // 查询key1值为value的所有记录

使用sql语句建表,细心的同学可以发现,这些sql语句在2.1.1步骤建表时就会自动生成,这里我直接套用上述自动生成的结果:

  1. CREATE TABLE `new_schema`.`all_users` (
  2.   `id` VARCHAR(50) NOT NULL,
  3.   `pwd` VARCHAR(45) NOT NULL,
  4.   PRIMARY KEY (`id`),
  5.   UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE);
  6. INSERT INTO `new_schema`.`all_users` (`id`, `pwd`) VALUES ('1', '123456');
  7. INSERT INTO `new_schema`.`all_users` (`id`, `pwd`) VALUES ('2', '666666');

再用2.1.1中的方法查询,检查一下是否成功,这步也可不做。

 2.2 编写后端接口

打开pycharm

2.2.1 准备环境

(1)安装mysql驱动,目的是连接后端与数据库

  1. pip install mysql-connector-python
  2. // 如果第一条命令安装速度过慢或者网络响应超时,则可使用此条镜像命令
  3. pip install mysql-connector-python -i https://pypi.tuna.tsinghua.edu.cn/simple

看到下图内容,就代表成功:

 

(2)安装django框架

  1. // 安装使用镜像
  2. pip install some_package --index https://pypi.mirrors.ustc.edu.cn/simple/
  3. // 安装django镜像
  4. pip install django

配置环境变量,安装完django后,在python/Scripts目录下,会有django-admin.exe文件

将django-admin.exe文件的路径加到环境变量中:

 查看django是否安装成功:

在终端命令如下命令,见到红框内容(为django的版本信息),则代表成功。

  1. python
  2. import django
  3. django.VERSION

 

(3)创建django项目

在pycharm的终端中输入命令:

django-admin startproject project_name .

随后就会出现以project_name为名字的文件夹,python中将整体不同的模块功能称为“app”,比如编写银行系统时,可分为“用户管理”、“账户管理”、“存储”、“理财”等多个app,可用如下命令创建app:

  1. // 创建django内app(项目路径下)
  2. django-admin startapp app_name

文件结构如图:

(4)配置pycharm的python解释器

(5)启动服务器

  1. // 启动django服务器
  2. python manage.py runserver localhost:8000
  3. // 验证:从网页进入localhost:portnum(8000)可查看

进入网页可看到:

 

2.2.2 后端接口代码准备

 website\website\urls.py

此处编写路由映射

  1. from django.contrib import admin
  2. from django.urls import path,include, re_path
  3. from dj_api import views
  4. from django.views.generic.base import TemplateView
  5. import app_name
  6. import app_name.views
  7. urlpatterns = [
  8. path('admin/', admin.site.urls),
  9. path('dj_api/', include('dj_api.urls'))
  10. ]
website\website\settgins.py

此处是编写一些配置信息

由于我是添加了两个app,一个叫app_name,另一个叫dj_api,大家加的时候,按照自己添加的app名字添加即可

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'app_name',
  9. 'dj_api'
  10. ]
  11. MIDDLEWARE = [
  12. 'django.middleware.security.SecurityMiddleware',
  13. 'django.contrib.sessions.middleware.SessionMiddleware',
  14. 'corsheaders.middleware.CorsMiddleware', # 跨域
  15. 'django.middleware.common.CommonMiddleware',
  16. 'django.middleware.csrf.CsrfViewMiddleware',
  17. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  18. 'django.contrib.messages.middleware.MessageMiddleware',
  19. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  20. ]
  21. ROOT_URLCONF = 'website.urls'
  22. CORS_ORIGIN_ALLOW_ALL = True

 另附不加跨域代码出现问题的情况图,大家可自行参考:

 

website\dj_api\views.py

 此处编写的是该app的业务代码,在此处直接提供接口

db中填写需要联接的数据库的信息

login接口的类型是GET

  1. from django.shortcuts import render, HttpResponse
  2. import mysql.connector
  3. import requests
  4. # Create your views here.
  5. db = mysql.connector.connect(
  6. host="localhost", # MySQL server
  7. user="root",
  8. password="123456",
  9. database="jebot_task1"
  10. )
  11. # create cursor object
  12. cursor = db.cursor()
  13. # query
  14. # def print():
  15. # results = cursor.fetchall()
  16. # print('xw')
  17. # for row in results:
  18. # print(row)
  19. # return 0
  20. def verify_login(user_id, pwd):
  21. sql = "SELECT * FROM all_users WHERE username = %(user_id)s AND pwd = %(pwd)s"
  22. cursor.execute(sql, {"user_id": user_id, "pwd": pwd})
  23. # cursor.execute("SELECT * FROM all_users")
  24. results = cursor.fetchall()
  25. if len(results) == 0:
  26. return False
  27. else:
  28. return True
  29. def login(request):
  30. if request.method == 'GET':
  31. user_id = request.GET.get('user_id', '')
  32. pwd = request.GET.get('pwd', '')
  33. if str(user_id) == '':
  34. return JsonResponse({'code': 1001, 'msg': 'id can\'t be empty'})
  35. if str(pwd) == '':
  36. return JsonResponse({'code': 1001, 'msg': 'password can\'t be empty'})
  37. else:
  38. if verify_login(user_id=user_id, pwd=pwd):
  39. return JsonResponse({'code': 1002, 'msg': 'OK'})
  40. else:
  41. return JsonResponse({'code': 1002, 'msg': 'NO'})
  42. else:
  43. return JsonResponse({'code': 1003, 'msg': 'invalid request'})

website\dj_api\urls.py

app内的路由信息

  1. from django.urls import path,include, re_path
  2. from dj_api import views
  3. urlpatterns = [
  4. path('hello/', views.hello),
  5. path('login/',views.login)
  6. ]

运行效果:

 

 localhost:8000是本地地址

dj_api是在website\website\urls.py中设置的第一层,

此代码就代表有 localhost:8000/admin 以及  localhost:8000/dj_api 两个可跳转的路由。

而在website\dj_api\urls.py中,可以看到跳转到属于dj_api这个app的路由下,则有hello与login两个可跳转的下级路由, 直接使用 localhost:8000/dj_api 这个地址是无效的。

 2.3 测试接口

 此处需要用到测试工具apipost

可以按照下述用例逐个测试,查看与预期结果是否相符,接着再进行下一步。

(1)id为空,pwd不为空

(2)id不为空,pwd为空

(3)错误的id与pwd(皆不为空)

(4) 正确的id与pwd(皆不为空)

测试无误,则接口没有问题,后端连接数据库也没有问题。

2.4 前端代码

 此处是基于已经创建好vue3项目的前提下,如果还未准备好环境,请回到 “1 准备工具” 中的前端准备,放的链接都是亲测可行的。

创建一个组件,把登陆的页面塞到这里,当然我这里直接用vue的模板改改用了,名字也没换,大家创建的时候,需要命名严谨。

 App.vue

  1. <script setup lang="ts">
  2. import HelloWorld from './components/HelloWorld.vue'
  3. </script>
  4. <template>
  5. <div id="app-div">
  6. <router-view>
  7. <HelloWorld/>
  8. </router-view>
  9. </div>
  10. </template>
  11. <style scoped lang="less">
  12. #app-div {
  13. height: 100%;
  14. width: 100%;
  15. }
  16. </style>

src\components\HellowWorld.vue

  1. <template>
  2. <div class="login_box">
  3. <div class="user_id_box">
  4. <span class="login_title">用户名</span>
  5. <el-input
  6. v-model="id"
  7. style="width: 240px"
  8. placeholder="please input the id"
  9. />
  10. </div>
  11. <div class="pwd_box">
  12. <span class="login_title">密码</span>
  13. <el-input
  14. v-model="pwd"
  15. style="width: 240px"
  16. placeholder="please input the password"
  17. />
  18. </div>
  19. <el-button @click="goLogin">登陆</el-button>
  20. <el-button @click="cleanInput">取消</el-button>
  21. </div>
  22. </template>
  23. <script setup lang="ts">
  24. import { ref } from 'vue'
  25. import axios from 'axios';
  26. const id = ref();
  27. const pwd = ref();
  28. enum RequestEnums {
  29. TIMEOUT = 30000,
  30. FAIL = 999,
  31. SUCCESS = 200,
  32. }
  33. const goLogin = async () =>{
  34. const res = await axios.get('http://127.0.0.1:8000/dj_api/login/?user_id='+id.value+'&pwd='+pwd.value);
  35. let flag = res.data.msg
  36. if (flag == 'OK') {
  37. ElMessage({
  38. message: 'login success',
  39. type: 'success',
  40. })
  41. }
  42. else {
  43. ElMessage({
  44. message: 'login fail, please try again',
  45. type: 'warning',
  46. })
  47. }
  48. console.log('res message is ', res.data);
  49. }
  50. const cleanInput = () =>{
  51. id.value = '';
  52. pwd.value = '';
  53. }
  54. </script>
  55. <style scoped lang="less">
  56. .login_box {
  57. width: 400px;
  58. height: 400px;
  59. margin-left: 400px;
  60. margin-top: 300px;
  61. div {
  62. margin-bottom: 20px;
  63. }
  64. }
  65. .login_title {
  66. display: inline-block;
  67. width: 75px;
  68. }
  69. </style>

在终端使用命令运行前端网页:

npm run dev

 

3 最后效果

完成啦!有问题的小伙伴可以留言 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1012062
推荐阅读
相关标签
  

闽ICP备14008679号