【django+vue】连接数据库、登录功能
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~
【django+vue专栏】
1.【django+vue】项目搭建、解决跨域访问
【django+vue】连接数据库、登录功能
- django连接数据库
- 1.安装MySQL驱动程序
- 2.创建数据库
- 3.配置settings.py文件
- 4.创建表
- 5.添加数据
- 登录功能
- 1.django实现登录功能
- URL映射
- 视图函数
- 2.vue实现登录功能
- 需要用到的扩展或依赖
- vue-router
- qs
- less less-loader@6
- 使用 Vue Router 的API定义路由规则和创建路由实例
- main.js使用 Vue Router 插件
- 登录页面组件Login.vue
django连接数据库
参考博客:
【python】Django——连接mysql数据库
https://blog.csdn.net/weixin_44319595/article/details/134411910
1.安装MySQL驱动程序
首先,确保你已经安装了适用于Python的MySQL驱动程序。
安装mysqlclient
pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple
mysqlclient #2.2.0
2.创建数据库
需要在mysql中完成
3.配置settings.py文件
打开你的Django项目中的settings.py文件,找到DATABASES设置部分,并进行如下配置:
DATABASES = {"default": {"ENGINE": "django.db.backends.mysql","NAME": "restaurantdb", # 数据库名称'USER': 'root','PASSWORD': 'root', # 修改为自己的mysql密码'HOST': 'localhost','PORT': '3306',}
}
4.创建表
用户表
用户:id,用户名,密码,权限
# 在models.py中定义模型
from django.db import models# Create your models here.
class User(models.Model):id = models.AutoField(primary_key=True)username = models.CharField(max_length=50, unique=True)password = models.CharField(max_length=100) # 实际应用中建议使用加密存储,比如 bcryptpermission = models.CharField(max_length=20)
使用Django的管理命令manage.py来执行数据库迁移操作,将模型映射到实际的数据库表。在命令行中执行以下命令:
python manage.py makemigrations # 生成数据库迁移文件
python manage.py migrate # 应用数据库迁移
生成名为myapp_user的表
5.添加数据
登录功能
1.django实现登录功能
URL映射
用于将特定的URL请求与相应的视图函数关联起来。例如,当用户访问"/login/"路径时,Django将调用名为"login"的视图函数来处理该请求。
urls.py
from django.urls import pathfrom myapp import viewsurlpatterns = [# path('admin/', admin.site.urls),path("login/", views.login),
视图函数
views.py
# views.py
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exemptfrom myapp.models import User# Create your views here.
@csrf_exempt
def login(request):username = request.POST.get("username")password = request.POST.get("password")try:user = User.objects.get(username=username)except User.DoesNotExist:date = {'flag': 'no', "msg": "no such user"}return JsonResponse({'request': date})if password == user.password:date_msg = "Login successful"date_flag = "yes"response = JsonResponse({'request': {'flag': date_flag, 'msg': date_msg}})# 在这里设置Cookieresponse.set_cookie(key='sessionid', value='yourSessionId', httponly=True)return responseelse:date_msg = "Incorrect password"date_flag = "no"date = {'flag': date_flag, 'msg': date_msg}return JsonResponse({'request': date})
上面登录函数的示例下面是对代码的一些解释:
@csrf_exempt
:这个装饰器用于取消对该视图函数的CSRF保护。CSRF(Cross-Site Request Forgery)是一种攻击方式,Django通过在表单中生成和验证CSRF令牌来防止这种攻击。在某些情况下,可以使用@csrf_exempt
来取消对特定视图函数的CSRF保护。def login(request)
:这是一个名为login
的视图函数,它接收一个request
参数,代表用户的HTTP请求。username = request.POST.get("username")
和password = request.POST.get("password")
:这两行代码从POST请求中获取username
和password
参数的值。try-except
块:这里使用try
语句来尝试从数据库中获取与给定username
匹配的用户对象。如果用户不存在,会触发User.DoesNotExist
异常,并返回一个JSON响应,指示用户不存在。- 密码验证:如果用户存在,代码将检查输入的密码是否与数据库中存储的密码匹配。如果匹配成功,将返回一个JSON响应,指示登录成功,并设置一个名为
sessionid
的cookie,用于在用户的浏览器中存储会话ID。 - 密码不匹配:如果密码不匹配,将返回一个JSON响应,指示密码错误。
这段代码的主要功能是接受用户的登录请求,验证用户名和密码,并根据验证结果返回相应的JSON响应。在成功登录时,它还设置了一个sessionid
cookie,用于管理用户的会话。
这只是一个简单的示例,实际的登录过程可能涉及更多安全性和验证步骤。对于真实的生产环境,建议使用Django内置的认证系统或其他验证机制来处理用户登录。
2.vue实现登录功能
需要用到的扩展或依赖
vue-router
Vue Router 是 Vue.js 的官方路由管理器。它与 Vue.js 框架深度集成,用于构建单页面应用程序(SPA)中的前端路由。
Vue Router 提供了以下主要特性:
- 嵌套路由:允许你在一个路由规则中嵌套另一个路由规则,从而构建复杂的页面结构和嵌套的组件关系。
- 路由参数:支持在路由规则中定义参数,以便在 URL 中传递数据,并在组件中进行处理。
- 编程式导航:提供了一组方法,允许你在 Vue 组件中进行页面跳转和导航操作。
- 命名路由:可以为路由规则指定名称,以便更方便地进行跳转和导航。
- 路由视图:通过
<router-view>
组件,实现根据当前 URL 匹配到的路由规则,自动渲染对应的组件。 - 导航守卫:允许你在路由切换前后执行一些逻辑,比如权限验证、页面加载状态管理等。
- 路由懒加载:通过动态导入组件,可以优化应用的性能,减少初始加载时间。
- HTML5 历史模式:支持使用 HTML5 的历史模式来实现路由,不再需要 URL 中带有
#
符号。
使用 Vue Router 可以使得在 Vue.js 应用程序中进行前端路由管理变得更加简单和灵活,同时也提供了丰富的功能和扩展性,适用于各种规模的应用程序开发。
安装vue-router
npm install vue-router
qs
在 Vue 3 中,你可以使用 qs
模块来处理查询字符串。你可以使用 npm 安装 qs
模块,然后在 Vue 3 的项目中使用它来进行查询字符串的处理。
安装 qs
npm install qs
使用 qs 模块示例
import qs from 'qs';// 创建一个包含用户名和密码的对象
const data = {username: this.loginForm.username,password: this.loginForm.password
};// 将对象转换为 URL 查询字符串
const encodedData = qs.stringify(data);// 现在 encodedData 就是 URL 编码后的字符串
// 你可以将其用于发送请求等操作
在这个示例中,我们使用了 qs.stringify 方法将一个对象转换为 URL 查询字符串的格式,并将结果保存在 encodedData 变量中。这样,你就可以在 Vue 3 项目中使用 qs 模块来处理查询字符串了。
less less-loader@6
在Vue项目中,可以使用less和less-loader@6来处理样式文件,从而提供更加灵活和可维护的样式代码。通过使用less的特性,可以减少样式代码的冗余和重复,同时也可以更方便地管理样式表的结构和层次。而less-loader@6则是将less文件编译成CSS的关键工具,它可以让开发者更加便捷地使用less语法,并将其转换为浏览器可识别的CSS格式。
在Vue项目中使用less作为样式预处理器
npm install less less-loader@6
使用 Vue Router 的API定义路由规则和创建路由实例
src下创建router.js
// 导入vue-router
import { createRouter, createWebHistory } from 'vue-router';// 导入你的组件
import HelloWorld from './components/HelloWorld.vue';
import Login from './components/Login.vue' // 引入Login组件// 定义路由规则
const routes = [{ path: '/',component: Login},{ path: '/login',component: Login},// 其他路由...
];// 创建路由实例
const router = createRouter({history: createWebHistory(),routes
});export default router;
这段代码使用 Vue Router 的 API 定义了路由规则和创建了一个路由实例。
具体来说,这段代码的作用如下:
- 定义了一组路由规则(routes),用于匹配不同的 URL 路径和对应的组件。每个路由规则都是一个对象,包含以下属性:
path
:指定路由的 URL 路径;component
:指定匹配到该路由时要渲染的组件。
- 使用
createRouter
API 创建了一个路由实例(router)。该实例通过传入的routes
配置项来初始化路由规则。 - 通过
createWebHistory()
创建了一个 HTML5 历史模式的路由记录管理器,并将其作为参数传递给createRouter
方法,从而创建了一个支持 HTML5 历史模式的路由实例。 - 最终将创建的路由实例导出,供应用程序使用。
这段代码定义了一组路由规则,并创建了一个路由实例,以便在 Vue.js 应用程序中进行前端路由管理。路由实例可以根据 URL 路径自动匹配对应的组件,并进行页面跳转和导航操作。
main.js使用 Vue Router 插件
使用 Vue Router 插件
import { createApp } from 'vue'
import App from './App.vue'
// 导入router
import router from './router.js';// createApp(App).mount('#app')
const app = createApp(App)app.use(router)
这段代码是在 Vue.js 应用程序中使用 Vue Router 插件的方式。
具体来说,它的作用如下:
- 使用
import
关键字导入了router
对象,该对象是一个 Vue Router 路由实例,可以处理应用程序中的前端路由管理。 - 在 Vue.js 应用程序中使用
app.use()
方法,将router
对象作为参数传递给该方法,以便在应用程序中使用 Vue Router 插件。 - 通过上述操作,Vue.js 应用程序就能够使用 Vue Router 提供的各种功能,比如路由跳转、导航守卫、路由参数等。
总之,这段代码是在 Vue.js 应用程序中使用 Vue Router 插件的标准方式,可以使应用程序具备前端路由管理能力,并提供一些方便的 API 来进行页面跳转和导航操作。
登录页面组件Login.vue
登录页面组件,它包含了登录表单、用户名和密码输入框、登录按钮、重置按钮等元素。该组件使用了Element UI组件库中的表单、输入框和按钮组件,同时使用了less预处理器编写样式。
数据方面
该组件定义了loginForm对象,包含了用户名和密码两个属性,设置了相应的验证规则loginRules。
在方法方面
定义了resetLoginForm方法用于重置表单内容
定义了login方法用于登录操作,并使用了$http实现异步请求,发送POST请求到后台,验证用户身份。在登录成功或失败时,该组件会进行相应的提示操作,并跳转到对应的页面。
<template><div class="login_container"><!-- 登录块 --><div class="login_box"><!-- 图标区域 --><div class="avatar_box"><img src="../assets/p.png" alt /></div><div class="text_box">餐饮管理系统</div><!--添加表单--><el-formref="loginFormRef":model="loginForm":rules="loginRules"class="login_form"label-width="0px"><!-- 用户名 --><el-form-item prop="username"><el-input v-model="loginForm.username"></el-input></el-form-item><!-- 密码 --><el-form-item prop="password"><el-input v-model="loginForm.password" type="password"></el-input></el-form-item><!-- 按钮 --><el-form-item class="btns"><el-button type="primary" @click="login">登录</el-button><el-button type="info" @click="resetLoginForm">重置</el-button></el-form-item></el-form></div></div>
</template><script>
import Qs from "qs";
export default {data() {return {loginForm: {// 表单数据username: "admin",password: "123456",},// 验证对象loginRules: {// 校验用户名username: [{ required: true, message: "请输入用户名", trigger: "blur" },{min: 4,max: 12,message: "长度在 5 到 12 个字符",trigger: "blur",},],// 校验密码password: [{ required: true, message: "请输入密码", trigger: "blur" },{ min: 6, max: 10, message: "密码为 6~10 位", trigger: "blur" },],},};},methods: {// 重置表单内容resetLoginForm() {this.$refs.loginFormRef.resetFields();},// 登录方法login() {// 验证校验规则this.$refs.loginFormRef.validate(async (valid) => {if (!valid) return; //验证失败则结束var data = Qs.stringify({username: this.loginForm.username,password: this.loginForm.password,});console.log(data);this.$http.post("/login/", data) // 访问后台.then((response) => {const result = response.data.request;if (result.flag === "yes") {// 登录成功,处理相关逻辑console.log(result.msg);document.cookie = `sessionid=${response.data.sessionid}`;// 跳转到指定页面this.$router.push("/home");} else {// 登录失败,处理相关逻辑console.log(result.msg);}}).catch((error) => {console.error(error);});});},},
};
</script><style lang="less" scoped>
// 根节点样式
.login_container {background-color: #79abde;height: 100%;
}.login_box {width: 450px;height: 300px;background-color: #fff;border-radius: 3px; // 圆角position: absolute; // 绝对定位left: 50%;top: 50%;transform: translate(-50%, -50%); // 根据自己位置 以自己为长度位移.avatar_box {width: 130px;height: 130px;border: 1px solid #eee;border-radius: 50%; // 加圆角padding: 10px;box-shadow: 0 0 10px #ddd; // 盒子阴影position: absolute;left: 50%;transform: translate(-50%, -50%);background-color: rgba(109, 109, 196, 0.544);img {width: 100%;height: 100%;border-radius: 50%; // 加圆角background-color: #eee;}}.text_box {padding: 90px 0 0 150px;font-size: 25px;}.btns {padding: 0 0 0 140px;}.login_form {position: absolute;bottom: 0%;width: 100%;padding: 0 10px;box-sizing: border-box; // 设置边框}
}
</style>
实现效果:
相关文章:

【django+vue】连接数据库、登录功能
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【djangovue专栏】 1.【djangovue】项目搭建、解决跨域访问 【djangovue】连接数据库、登录功能 django连接数据库1.安装MySQL驱动程序2.创建数据库3.配置settings.py文件4.创建表5.添加数据 登录功能1.django实现…...

NX二次开发UF_CSYS_edit_matrix_of_object 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_edit_matrix_of_object Defined in: uf_csys.h int UF_CSYS_edit_matrix_of_object(tag_t object_id, tag_t matrix_id ) overview 概述 Updates the specified coordinat…...
封装公共el-form表单
1.公共表单组件 //commonForm.vue <script> import {TEXT,SELECT,PASSWORD,TEXTAREA,RADIO,DATE_PICKER } from /conf/uiTypes import { deepClone } from /utils export default {name: GFormCreator,props: {config: { // title/itemstype: Object,required: true}}…...
OpenHarmony-4.0-Release 源码编译记录
本文基于 Ubuntu 20.04.4 LTS 1、环境准备 这个没啥好说的,都是搞机的,用之前编译 aosp 的 linux 环境就行,有小伙伴担心会把之前的环境搞崩, 也有用 docker 编译的,我这里就直接在 aosp 环境下搞了,还省…...
HTML新手入门笔记整理:块元素和行内元素
块元素 在HTML中,块元素在浏览器显示状态下独占一行,并且排斥其他元素与其位于一行。一般情况下,块元素内部可以容纳其他块元素和行内元素。 常见块元素 块元素 说明 h1~h6 标题元素 p 段落元素 div div元素 hr 水平线 ol 有序列…...

Hook+jsdom 解决cookie逆向
前言 记录下如何破cookie逆向 目标 目标网址:https://q.10jqka.com.cn/ 目标接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 对抗:cookie反爬虫处理,关键字v,如图 解决步骤 1、JS中关键字查找 如上,我们找到了关键字 v,…...

【封装UI组件库系列】封装Icon图标组件
封装UI组件库系列第三篇封装Icon图标组件 🌟前言 🌟封装Icon 1.创建Icon组件 2.引用svg图标库 第一步 第二步 第三步 3.二次封装 4.封装自定义属性 🌟总结 🌟前言 在前端开发中,大家可能已经用过各种各样的UI组…...

STM32:基本定时器原理和定时程序
一、初识定时器TIM 定时器就是计数器,定时器的作用就是设置一个时间,然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能,还可以实现捕获脉冲宽度,计算PWM占空比,输出PWM波形&am…...
EntityFramework 批量删除操作
刚刚开始使用Entityframwork 来操作数据库。遇到了批量删除数据。 EF内部用的方法是:dbcontext.Datas.RemoveRange(list); 这总方法,少量数据是可行的。 但遇到大数据量的时候,这个方法完全不能用。 所以找了另一种方法: stri…...
springboot使用的设计模式
设计模式是在软件设计中常用的一些通用解决方案。在开发商城编码时,以下设计模式可能会有用: 工厂模式(Factory Pattern): 用于创建对象的模式。在商城中,可能会涉及到创建不同类型的商品、订单等对象&…...

IP地址定位技术发展与未来趋势
随着互联网的快速发展,人们对网络的需求和依赖程度越来越高。在海量的网络数据传输中,IP地址定位技术作为网络安全与信息追踪的重要手段,其精准度一直备受关注。近年来,随着技术的不断进步,IP地址定位的精准度得到了显…...

AI与交通运输
人工智能(AI)正在改变几乎所有行业,交通运输也不例外。 虽然与某些行业相比,我们运输货物和乘客的方式在过去 50 年里变化相对较小,但人工智能有望引发一场运输革命—如果你正在寻找人工智能的机会,不要错过…...
window.requestAnimationFrame+localStorage+canvas实现跨窗口小球连线效果
文章目录 前言效果代码后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端系列文章 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家…...
使用AndResGuard报错:copy res file not in resources.arsc file:Ezi.xml
Android使用AndResGuard进行资源混淆,压缩。 源码地址:GitHub - shwenzhang/AndResGuard: proguard resource for Android by wechat team 集成完成后编译过程中出现如下错误: 14:57:05 copy res file not in resources.arsc file:IUk.xml…...

插入排序(形象类比)
最近在看riscv手册的时候,里面有一段代码是插入排序,但是单看代码的时候有点迷,没看懂咋操作的,后来又查资料复习了一下,最终才把代码看明白,所以写篇博客记录一下。 插入排序像打扑克牌 这是我听到过比较形…...
ElasticSearch 同步的方式
ElasticSearch 同步的方式 ElasticSearch是一款强大的分布式搜索和分析引擎,支持多种方式同步数据和日志。下面介绍几种常见的同步方式: 1. Logstash Logstash 是 ElasticStack 的一部分,用于收集、处理和转发日志和事件数据。通过配置 Lo…...
easyExcel实现分批导入,动态表头分批导出,以及导出表格样式设置
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency> 一,分批导入 1.首先配置表格头映射类 Getter Setter EqualsAndHashCode public class …...
Android BottomNavigationView底部菜单栏文字显示问题
1. BottomNavigationView 如果tab栏数据小于等于3个,那么图标和文字都是展示出来; 2. BottomNavigationView 如果tab栏数据大于3个,那么图标会显示出来,但是文字会隐藏; 3. 解决方式: (当底部…...
从零开始学习typescript——运算符(条件运算法、逻辑运算符、类型运算符、位运算)
条件运算符 条件运算符是一个根据条件返回不同运算结果的运算符 关键字:?: 三元运算符 它可以换成if …else 判断 ? true : false 判断为true,返回?号后面的,判断为false ,返回: 号后面的 逻辑运算符 用…...

【开源】基于Vue.js的康复中心管理系统
项目编号: S 056 ,文末获取源码。 \color{red}{项目编号:S056,文末获取源码。} 项目编号:S056,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...