【萌新向】全栈初体验,从头开始搭建前后端交互项目vue3+python+django+mysql
糯米饭团饭米糯 2024-08-25 15:03:01 阅读 76
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语句:
<code>/* 新建操作 */
create database dbname; // 创建数据库
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
...
); // 新建表 其中每个column最后可添加一些关键字,如 第1行改为 id varchar(50) PRIMARY
// KEY,表示id为此表的主键
/* 删除操作 */
drop database dbname // 删除数据库
dorp table table_name // 删除表
/* 插入数据 */
insert into table_name(key1, key2) value(value1, value2); // 将某条数据插入表中
inset into table_name value (value1, value2, value3, ...) // 此value必须按照key的顺序来
use dbname // 使用某个具体数据库
/* 查询 */
select * from table_name; // * 为通配符,表示”全部“,如果前面没用use database,
// 则此处使用dbname.table_name
select key1, key2 from table_name; // 查询指定的列名/属性
select * from table_name where key1 = value // 查询key1值为value的所有记录
使用sql语句建表,细心的同学可以发现,这些sql语句在2.1.1步骤建表时就会自动生成,这里我直接套用上述自动生成的结果:
CREATE TABLE `new_schema`.`all_users` (
`id` VARCHAR(50) NOT NULL,
`pwd` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE);
INSERT INTO `new_schema`.`all_users` (`id`, `pwd`) VALUES ('1', '123456');
INSERT INTO `new_schema`.`all_users` (`id`, `pwd`) VALUES ('2', '666666');
再用2.1.1中的方法查询,检查一下是否成功,这步也可不做。
2.2 编写后端接口
打开pycharm
2.2.1 准备环境
(1)安装mysql驱动,目的是连接后端与数据库
pip install mysql-connector-python
// 如果第一条命令安装速度过慢或者网络响应超时,则可使用此条镜像命令
pip install mysql-connector-python -i https://pypi.tuna.tsinghua.edu.cn/simple
看到下图内容,就代表成功:
(2)安装django框架
<code>// 安装使用镜像
pip install some_package --index https://pypi.mirrors.ustc.edu.cn/simple/
// 安装django镜像
pip install django
配置环境变量,安装完django后,在python/Scripts目录下,会有django-admin.exe文件
将django-admin.exe文件的路径加到环境变量中:
查看django是否安装成功:
在终端命令如下命令,见到红框内容(为django的版本信息),则代表成功。
<code>python
import django
django.VERSION
(3)创建django项目
在pycharm的终端中输入命令:
<code>django-admin startproject project_name .
随后就会出现以project_name为名字的文件夹,python中将整体不同的模块功能称为“app”,比如编写银行系统时,可分为“用户管理”、“账户管理”、“存储”、“理财”等多个app,可用如下命令创建app:
<code>// 创建django内app(项目路径下)
django-admin startapp app_name
文件结构如图:
(4)配置pycharm的python解释器
(5)启动服务器
<code>// 启动django服务器
python manage.py runserver localhost:8000
// 验证:从网页进入localhost:portnum(8000)可查看
进入网页可看到:
2.2.2 后端接口代码准备
website\website\urls.py
此处编写路由映射
<code>from django.contrib import admin
from django.urls import path,include, re_path
from dj_api import views
from django.views.generic.base import TemplateView
import app_name
import app_name.views
urlpatterns = [
path('admin/', admin.site.urls),
path('dj_api/', include('dj_api.urls'))
]
website\website\settgins.py
此处是编写一些配置信息
由于我是添加了两个app,一个叫app_name,另一个叫dj_api,大家加的时候,按照自己添加的app名字添加即可
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_name',
'dj_api'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', # 跨域
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'website.urls'
CORS_ORIGIN_ALLOW_ALL = True
另附不加跨域代码出现问题的情况图,大家可自行参考:
website\dj_api\views.py
此处编写的是该app的业务代码,在此处直接提供接口
db中填写需要联接的数据库的信息
login接口的类型是GET
<code>from django.shortcuts import render, HttpResponse
import mysql.connector
import requests
# Create your views here.
db = mysql.connector.connect(
host="localhost", # MySQL servercode>
user="root",code>
password="123456",code>
database="jebot_task1"code>
)
# create cursor object
cursor = db.cursor()
# query
# def print():
# results = cursor.fetchall()
# print('xw')
# for row in results:
# print(row)
# return 0
def verify_login(user_id, pwd):
sql = "SELECT * FROM all_users WHERE username = %(user_id)s AND pwd = %(pwd)s"
cursor.execute(sql, {"user_id": user_id, "pwd": pwd})
# cursor.execute("SELECT * FROM all_users")
results = cursor.fetchall()
if len(results) == 0:
return False
else:
return True
def login(request):
if request.method == 'GET':
user_id = request.GET.get('user_id', '')
pwd = request.GET.get('pwd', '')
if str(user_id) == '':
return JsonResponse({'code': 1001, 'msg': 'id can\'t be empty'})
if str(pwd) == '':
return JsonResponse({'code': 1001, 'msg': 'password can\'t be empty'})
else:
if verify_login(user_id=user_id, pwd=pwd):
return JsonResponse({'code': 1002, 'msg': 'OK'})
else:
return JsonResponse({'code': 1002, 'msg': 'NO'})
else:
return JsonResponse({'code': 1003, 'msg': 'invalid request'})
website\dj_api\urls.py
app内的路由信息
from django.urls import path,include, re_path
from dj_api import views
urlpatterns = [
path('hello/', views.hello),
path('login/',views.login)
]
运行效果:
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
<code><script setup lang="ts">code>
import HelloWorld from './components/HelloWorld.vue'
</script>
<template>
<div id="app-div">code>
<router-view>
<HelloWorld/>
</router-view>
</div>
</template>
<style scoped lang="less">code>
#app-div {
height: 100%;
width: 100%;
}
</style>
src\components\HellowWorld.vue
<template>
<div class="login_box">code>
<div class="user_id_box">code>
<span class="login_title">用户名</span>code>
<el-input
v-model="id"code>
style="width: 240px"code>
placeholder="please input the id"code>
/>
</div>
<div class="pwd_box">code>
<span class="login_title">密码</span>code>
<el-input
v-model="pwd"code>
style="width: 240px"code>
placeholder="please input the password"code>
/>
</div>
<el-button @click="goLogin">登陆</el-button>code>
<el-button @click="cleanInput">取消</el-button>code>
</div>
</template>
<script setup lang="ts">code>
import { ref } from 'vue'
import axios from 'axios';
const id = ref();
const pwd = ref();
enum RequestEnums {
TIMEOUT = 30000,
FAIL = 999,
SUCCESS = 200,
}
const goLogin = async () =>{
const res = await axios.get('http://127.0.0.1:8000/dj_api/login/?user_id='+id.value+'&pwd='+pwd.value);
let flag = res.data.msg
if (flag == 'OK') {code>
ElMessage({
message: 'login success',
type: 'success',
})
}
else {
ElMessage({
message: 'login fail, please try again',
type: 'warning',
})
}
console.log('res message is ', res.data);
}
const cleanInput = () =>{
id.value = '';
pwd.value = '';
}
</script>
<style scoped lang="less">code>
.login_box {
width: 400px;
height: 400px;
margin-left: 400px;
margin-top: 300px;
div {
margin-bottom: 20px;
}
}
.login_title {
display: inline-block;
width: 75px;
}
</style>
在终端使用命令运行前端网页:
npm run dev
3 最后效果
完成啦!有问题的小伙伴可以留言
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。