【django+vue】连接数据库、登录功能

news2024/12/29 11:35:01

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~

【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)  # 实际应用中建议使用加密存储,比如 bcrypt
    permission = 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 path

from myapp import views

urlpatterns = [
    # 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_exempt

from 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}})
        # 在这里设置Cookie
        response.set_cookie(key='sessionid', value='yourSessionId', httponly=True)
        return response
    else:
        date_msg = "Incorrect password"
        date_flag = "no"
        date = {'flag': date_flag, 'msg': date_msg}
        return JsonResponse({'request': date})

上面登录函数的示例下面是对代码的一些解释:

  1. @csrf_exempt:这个装饰器用于取消对该视图函数的CSRF保护。CSRF(Cross-Site Request Forgery)是一种攻击方式,Django通过在表单中生成和验证CSRF令牌来防止这种攻击。在某些情况下,可以使用@csrf_exempt来取消对特定视图函数的CSRF保护。
  2. def login(request):这是一个名为login的视图函数,它接收一个request参数,代表用户的HTTP请求。
  3. username = request.POST.get("username")password = request.POST.get("password"):这两行代码从POST请求中获取usernamepassword参数的值。
  4. try-except块:这里使用try语句来尝试从数据库中获取与给定username匹配的用户对象。如果用户不存在,会触发User.DoesNotExist异常,并返回一个JSON响应,指示用户不存在。
  5. 密码验证:如果用户存在,代码将检查输入的密码是否与数据库中存储的密码匹配。如果匹配成功,将返回一个JSON响应,指示登录成功,并设置一个名为sessionid的cookie,用于在用户的浏览器中存储会话ID。
  6. 密码不匹配:如果密码不匹配,将返回一个JSON响应,指示密码错误。

这段代码的主要功能是接受用户的登录请求,验证用户名和密码,并根据验证结果返回相应的JSON响应。在成功登录时,它还设置了一个sessionid cookie,用于管理用户的会话。

这只是一个简单的示例,实际的登录过程可能涉及更多安全性和验证步骤。对于真实的生产环境,建议使用Django内置的认证系统或其他验证机制来处理用户登录。

2.vue实现登录功能

需要用到的扩展或依赖

vue-router

Vue Router 是 Vue.js 的官方路由管理器。它与 Vue.js 框架深度集成,用于构建单页面应用程序(SPA)中的前端路由。

Vue Router 提供了以下主要特性:

  1. 嵌套路由:允许你在一个路由规则中嵌套另一个路由规则,从而构建复杂的页面结构和嵌套的组件关系。
  2. 路由参数:支持在路由规则中定义参数,以便在 URL 中传递数据,并在组件中进行处理。
  3. 编程式导航:提供了一组方法,允许你在 Vue 组件中进行页面跳转和导航操作。
  4. 命名路由:可以为路由规则指定名称,以便更方便地进行跳转和导航。
  5. 路由视图:通过 <router-view> 组件,实现根据当前 URL 匹配到的路由规则,自动渲染对应的组件。
  6. 导航守卫:允许你在路由切换前后执行一些逻辑,比如权限验证、页面加载状态管理等。
  7. 路由懒加载:通过动态导入组件,可以优化应用的性能,减少初始加载时间。
  8. 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 定义了路由规则和创建了一个路由实例。

具体来说,这段代码的作用如下:

  1. 定义了一组路由规则(routes),用于匹配不同的 URL 路径和对应的组件。每个路由规则都是一个对象,包含以下属性:
    • path:指定路由的 URL 路径;
    • component:指定匹配到该路由时要渲染的组件。
  2. 使用 createRouter API 创建了一个路由实例(router)。该实例通过传入的 routes 配置项来初始化路由规则。
  3. 通过 createWebHistory() 创建了一个 HTML5 历史模式的路由记录管理器,并将其作为参数传递给 createRouter 方法,从而创建了一个支持 HTML5 历史模式的路由实例。
  4. 最终将创建的路由实例导出,供应用程序使用。

这段代码定义了一组路由规则,并创建了一个路由实例,以便在 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 插件的方式。

具体来说,它的作用如下:

  1. 使用 import 关键字导入了 router 对象,该对象是一个 Vue Router 路由实例,可以处理应用程序中的前端路由管理。
  2. 在 Vue.js 应用程序中使用 app.use() 方法,将 router 对象作为参数传递给该方法,以便在应用程序中使用 Vue Router 插件。
  3. 通过上述操作,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-form
        ref="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>

实现效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1241406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql语法大全

1&#xff0c;创建数据库 create database 数据库名字; 2,查看所有的数据库名称 show databases; MySQL服务器已有4个数据库&#xff0c;这些数据库都是MySQL安装时自动创建的。 information_schema 和 performance_schema 数据库分别是 MySQL 服务器的数据字典&#xff08;…

【2021集创赛】基于ARM-M3的双目立体视觉避障系统 SOC设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;上海电力大学 队伍名称&#xff1a;骇行队 总决赛奖项&#xff1a;二等奖 1.摘要 随着信息技术的发展&#xff0c;AGV&#xff08;Automated Guided Vehic…

状态设计模式是什么?什么是 State 状态设计模式?Python 状态设计模式示例代码

什么是 State 状态设计模式&#xff1f; 状态设计模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态发生改变时改变其行为&#xff0c;使其看起来好像改变了其类。状态模式主要解决的问题是&#xff1a;当一个对象的行为取决于它的状态&#xff0c;并且在运行时…

如何写好科研论文

写好科研论文需要遵循以下步骤&#xff1a; 确定研究主题和目标&#xff1a;在开始撰写论文之前&#xff0c;你需要明确你的研究主题和目标。这有助于你更好地组织论文的内容&#xff0c;并确保你的论文能够准确地传达你的研究成果。做好文献调研&#xff1a;在撰写论文之前&a…

集团投融资大数据平台解决方案

一、项目背景 项目为集团型公司大数据平台项目&#xff0c;整个项目周期约为6个月&#xff0c;整体呈现了对外的数据大屏驾驶仓和对内的看板报表&#xff0c;减少了客户内部数据上报和报表制作的重复工作量&#xff0c;为集团数据决策奠定基础。 二、项目目标 战略层&#xff…

.net framework4.0框架下winform 实现寄宿式web api

首先Nuget中下载包&#xff1a;Microsoft.AspNet.WebApi.SelfHost&#xff0c;如下&#xff1a; 注意版本哦&#xff0c;最高版本只能4.0.30506能用。 1.配置路由 public static class WebApiConfig{public static void Register(this HttpSelfHostConfiguration config){// …

echarts 实时刷新图表

2023.11.23今天我学习了如何对echarts图表进行实时刷新&#xff0c;如&#xff1a;一分钟刷新一次&#xff0c;或是五分钟刷新一次。 代码如下&#xff1a; <template><div ref"bar" style"width:200px;height:200px"/> </template>&l…

电商API接口|电商数据接入|拼多多平台根据商品ID查商品详情SKU和商品价格参数

随着科技的不断进步&#xff0c;API开发领域也逐渐呈现出蓬勃发展的势头。今天我将向大家介绍API接口&#xff0c;电商API接口具备独特的特点&#xff0c;使得数据获取变得更加高效便捷。 快速获取API数据——优化数据访问速度 传统的数据获取方式可能需要经过多个中介环节&…

【开源】基于JAVA的在线课程教学系统

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…

office 365企业版安装教程

1.下载所需工具&#xff08;防火墙和防毒软件记得关闭&#xff09; 下载链接&#xff1a;所需文件 2.安装激活office 1.安装 office tool plus 2.已安装过office 先进行office的移除&#xff0c;再进行未安装office的步骤进行 3.未安装过office 1.设置部署 按照以下来进行安…

【MATLAB源码-第85期】基于farrow结构的滤波器仿真,截止频率等参数可调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Farrow结构是一种用于实现可变数字滤波器的方法&#xff0c;尤其适用于数字信号处理中的采样率转换和时变滤波。它通过多项式近似来实现对滤波器系数的平滑变化&#xff0c;使得滤波器具有可变的群延时或其他参数。 Farrow结…

详解——菱形继承及菱形虚拟继承

目录 一&#xff0c;菱形继承 1.1单继承 1.2多继承 1.3菱形继承 1.4菱形继承的问题 1.5虚拟继承解决数据冗余和二义性的原理 二.继承的总结和反思 一&#xff0c;菱形继承 C三大特性——继承-CSDN博客 1.1单继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继…

【HarmonyOS】 低代码平台组件拖拽使用技巧之登录组件

【关键字】 HarmonyOS、低代码平台、组件拖拽、登录组件、代码编辑器 1、写在前面 前面我们介绍了低代码中堆叠容器、滚动容器、网格布局、页签容器以及一些常用容器和组件的拖拽使用方法&#xff0c;本篇我们来介绍一个新的组件&#xff0c;这个组件是属于业务组件——登录组…

WPF实战项目十六(客户端):备忘录接口

1、新增IMemoService接口&#xff0c;继承IBaseService接口 public interface IMemoService : IBaseService<MemoDto>{} 2、新增MemoService类&#xff0c;继承BaseService和IMemoService接口 public class MemoService : BaseService<MemoDto>, IMemoService{pub…

毕业设计ASP.NET 1400动漫公司网站【程序源码+文档+调试运行】

摘要 本系统将实现一个动漫公司网站&#xff0c;包括前台用户模块和后台管理员模块。前台用户模块主要包括最新动漫、注册登录、公司简介、公司新闻、动漫中心、联系我们和会员中心等功能。后台管理员模块包括用户管理、公司简介管理、公司新闻管理、动漫类别管理、动漫管理、…

快速上手Banana Pi BPI-M4 Zero 全志科技H618开源硬件开发开发板

Linux[编辑] 准备[编辑] 1. Linux镜像支持SD卡或EMMC启动&#xff0c;并且会优先从SD卡启动。 2. 建议使用A1级卡&#xff0c;至少8GB。 3. 如果您想从 SD 卡启动&#xff0c;请确保可启动 EMMC 已格式化。 4. 如果您想从 EMMC 启动并使用 Sdcard 作为存储&#xff0c;请确…

阿里云服务器ECS产品知识及购买和使用常见问题及答案汇总

本文总结了阿里云用户在购买和使用阿里云服务器中的一些常见的问题&#xff0c;包括什么是云服务器ECS&#xff0c;特性与优势&#xff0c;应用场景&#xff0c;基本概念&#xff0c;使用限制等众多问题&#xff0c;让您全方位了解阿里云服务器&#xff0c;并根据自己的需求选择…

Modbus转Profinet网关:PLC与天信流量计通讯的经典案例

无论您是PLC或工业设备的制造商&#xff0c;还是工业自动化系统的维护人员&#xff0c;可能会遇到需要将不同协议的设备连接组合并通讯的情况&#xff0c;Modbus和Profinet是现代工业自动化中常见的两种通信协议&#xff0c;在工业控制领域中被广泛应用。 在这种情况绝大多数会…

Matlab通信仿真系列——滤波器及其分类

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、滤波器定义 二、滤波…

FastAPI通过SSE进行流式输出

服务端推送 在服务器推送技术中&#xff0c;服务器在消息可用后立即主动向客户端发送消息。其中&#xff0c;有两种类型的服务器推送&#xff1a;SSE和 WebSocket。 SSE&#xff08;Server-Send Events&#xff09; SSE 是一种在基于浏览器的 Web 应用程序中仅从服务器向客户…