手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(一)login页面

全栈开发一条龙——前端篇
第一篇:框架确定、ide设置与项目创建
第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。
第三篇:setup语法,设置响应式数据。
第四篇:数据绑定、计算属性和watch监视
第五篇 : 组件间通信及知识补充
第六篇:生命周期和自定义hooks
第七篇:路由
第八篇:传参
第九篇:插槽,常用api和全局api。
全栈开发一条龙——全栈篇
第一篇:初识Flask&MySQL实现前后端通信
第二篇: sql操作、发送http请求和邮件发送
第三篇:全栈实现发送验证码注册账号
第四篇:图片验证码及知识补充

本章正式进入实战篇,来前后端分离制作一个问卷网站,有前后台和数据分析,最后项目上线。

文章目录

  • 一、后端
    • dataset_info
    • data_set
    • main
    • token_ex
    • login_blueprint
  • 二、前端
    • login.vue
    • router
    • app
  • 三、效果展示
  • 总结与预告
  • 补充:内容加密/令牌token
    • 与后端结合
    • 与前端结合

第一步,我们实现login页面。

一、后端

我们创建一个social(后端内容都在里面)

dataset_info

我们首先将我们数据库的信息写入,建议还是要单独建立一个py文件,不然你后面项目上线,在服务器配置服务器还要专门去程序里面找东西改,太费劲了。

mysql_account = "root"
mysql_password = "xxx"
mysql_host = "localhost"
mysql_port = "3306"
mysql_data_col = "test_data"

需要加入的内容如上

data_set

接下来我们建立数据库对象,单独建立一个文件是因为我们可能在不同地方都要使用数据库,防止循环导入。

from flask_sqlalchemy import SQLAlchemy
import pymysql

pymysql.install_as_MySQLdb()

db = SQLAlchemy()

main

接下来我们制作我们的入口主程序,在这里,我们将我们的数据库连接上我们的flask服务程序,这样我们可以在后续的flask服务中操作,配置跨域,这样可以实现前后端全分离。最后,我们run一下服务。要打开服务,你在当前文件夹打开cmd,输入python main.py就好了。

from flask import Flask,jsonify,request
#jsonify将py数据转换为json数据,传给前端接口
from flask_cors import CORS
#跨域,因为有浏览器的同源策略,不同协议、域名、端口不能通信,我们要用cors来通信
from sqlalchemy import text

from flask.views import MethodView


#建立对象
app = Flask(__name__)


#转码,老外跟我们用的不一样,不改会乱码,如果有中文你要加上
app.config["JSON_AS_ASCII"] = False

from dataset_info import *
#导入数据库
from data_set import db
# 配置数据库
URI = "mysql://" + mysql_account + ":" + mysql_password + "@" + mysql_host + ":" + mysql_port + "/" + mysql_data_col
app.config["SQLALCHEMY_DATABASE_URI"] = URI
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
#初始化操作
db.init_app(app)

#配置跨域,*表示所有人
CORS(app,cors_allowed_orgins = "*")

if __name__ == "__main__":

     app.run(debug=True, host = "0.0.0.0",port = 5000)

token_ex

从这里开始,我们要开始正式写我们的登录逻辑了。我们输入一个账号和密码,然后后端验证,如果是有权限的,就生成一个token(登录凭证,这样在后续的内容中,就可以用令牌来证明身份来操作数据库等等)。于是我们需要先把生成令牌和解读令牌的逻辑写了。

import jwt
password = "1234"


class jwt_safe:

    def __init__(self,data):
        self.data = data


    def encode(self):

        try:
            payload = jwt.encode( self.data , password , algorithm='HS256')
            return payload
    
        except jwt.DecodeError:
        # 令牌解码失败
            return 'Invalid token'
        except jwt.ExpiredSignatureError:
        # 令牌过期
            return 'Expired token'

    def decode(self):

        try:
            payload = jwt.decode( self.data,  password , algorithms=['HS256'])
            return payload
        except jwt.DecodeError:
        # 令牌解码失败
            return 'Invalid token'
        except jwt.ExpiredSignatureError:
        # 令牌过期
            return 'Expired token'


if __name__ == '__main__':
   
    data = {'msg' : 123}
    res = jwt_safe(data= data)
    res = res.encode()
    print(res) 
    res2 = jwt_safe(data = res)
    res2 = res2.decode()
    print(res2)

如上,我们设置一个密钥,然后根据这个密钥,我们制作一个可逆的加密,这样我们可以用encode来加密,然后用decode来解密验证。

login_blueprint

万事俱备,我们开始给我们的服务加上登录功能

from flask import Blueprint,jsonify,request
from flask.views import MethodView
from data_set import db
from token_ex import jwt_safe 
login = Blueprint("login",__name__)

class login_(MethodView):
    def get(self):
        account = request.args.get("account",None)
        password = request.args.get("password",None)

        
        if not account or not password:
            return jsonify( {"errcode":2,"msg":"缺失账号和密码"} )

        if account == "123456" and password=="123456":
            token_temp = {"account":account}
            token = jwt_safe(token_temp)
            res = token.encode()
            return jsonify( {"errcode":0,"msg":"登录成功","token":res} )
        
        
        return jsonify( {"errcode":1,"msg":"账号或密码错误"} )


    pass




login.add_url_rule("/login/",view_func=login_.as_view("login")  )

我们建立一个login对象,然后将类试图方法接在这个对象上。登录逻辑很简单,从前端用get方法获取账号和密码,如果账号密码正确,就生成一个令牌返回。

然后我们把这个蓝图在主服务程序中加入,

from login_blueprint import login
app.register_blueprint(login)

这样这个login就声明好了,我们可以通过访问host:5000/login/来访问

二、前端

我们后端写好了,再来写前端,前端需要一个界面,让我们输入账号密码,然后可以提交给后端验证。

login.vue

我们来写登录界面

<template>
    <div class="register-box">
      <h2>登录</h2>
      <div class="form-group">
        <label for="account">账号:</label>
        <input type="text" id="account" v-model="account">
      </div>
      <div class="form-group">
        <label for="password">密码:</label>
        <input type="password" id="password" v-model="password">
      </div>
      <br>
      <button @click="login">登录</button>
    </div>



  </template>
  



<script setup name="login">
  
  import { ref } from 'vue';




    const account = ref('');
    const password = ref('');

    import axios from 'axios';
    import { routeLocationKey, useRouter } from 'vue-router';
    const router = useRouter()
    async function login() {
      try{

        let result=await axios.get('http://127.0.0.1:5000/login/',{params:{
            account:account.value,
            password:password.value              
        }})
  
        window.alert(result.data.msg)

        if(result.data.errcode == 0)
            {
            localStorage.setItem("token",result.data.token)
            
            router.replace
            setTimeout(()=>{router.push({path:"/home"})},2500)
            }

   
      }catch(error){alert(error)}

    };





</script>


<style>
.register-box {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 300px;
  height: 300px;
  margin: auto;
  padding: 20px;
  border: 1px solid #ccc;
  
}

.form-group {
  margin-bottom: 10px;
}

label {
  font-weight: bold;
}

input[type="text"],
input[type="password"] {
  width: 100%;
  padding: 5px;
}

button {
  width: 100%;
  padding: 10px;
  background-color: #007bff;
  color: #fff;
  border: none;
  cursor: pointer;
}

button:hover {
  background-color: #0069d9;
}
</style>

此段的逻辑很简单,绑定页面上的账号和密码变量,一旦用户点击登录,就向后端发送验证,如果验证通过,我们就将返回的令牌保存再本地,然后跳转到home页面。

router

我们还需要配置路由器,不然不能push切换新页面

import { createRouter } from "vue-router"
import home from "@/components/home.vue";
import login from "@/components/login.vue"
import { createWebHashHistory } from "vue-router";
const router = createRouter({
    history:createWebHashHistory(),
    //管理路由
     routes:[  //一个一个的路由规则
       {
         name:'home',
         //路径
          path:'/home',
        //组件绑定
          component:home
       },
       {
         path:'/login',
         name : 'login',
         component:login

       },
       {
        path:'/',
        redirect:'login'
       }
     ]
})

export default router


我们在这里配置了login路由和home路由,同时将/这个初始的访问重定向到login页面。

app

最后,我们在app.vue中加入路由占位

<template>


 <router-view></router-view>
</template>


<script setup name="app">

import login from '@/components/login.vue'
import { RouterView } from 'vue-router';

</script>

<style>
</style>

三、效果展示


这样我们就实现了最初的登录页面

总结与预告

本章我们创建了基础的工程,串联了前后端,制作了基础的登录页面,在之后,我们要先来制作管理员操作的后台。这之中,会用到flask Vue和mysql。

补充:内容加密/令牌token

加密

解密


我们不能让这个token永久有效,不然就可以让攻击者一直使用这个token

与后端结合

我们只在用户登录成功时生成token

与前端结合

我们前端拿到token之后,可以将它存放在本地存储里,这样在一段时间内,即使关掉会话或刷新,也可以继续维持登录状态

保存好之后我我们在其他地方访问:

localStorage.getItem("token")

如果访问到了,就会返回数值,不然返回null

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Memory测试工具-lmbench使用详解

✨前言&#xff1a; 什么是lmbench&#xff1f; lmbench 是一个广泛使用的、开源的系统性能测量工具&#xff0c;它能对Unix-like操作系统&#xff08;包括Linux、BSD等&#xff09;进行全面的性能测试。这个套件包含了一系列针对不同系统组件&#xff08;如处理器、内存、文件…

吴恩达2022机器学习专项课程C2W2:2.23 选修_反向传播算法的工作原理(什么是导数图计算大型神经网络)

目录 引言一.导数的计算1.epsilon与导数的关系2.其它导数符号形式3.导数小结 二.小型神经网络的计算图1.什么是计算图&#xff08;前向传播过程&#xff09;2.反向传播计算过程3.验证反向传播的计算结果4.为什么用反向传播计算导数&#xff1f; 三.扩大神经网络的计算图1.计算反…

迅狐短剧小程序源码:打造个性化的追剧体验

随着移动互联网的普及&#xff0c;短剧小程序源码的开发成为了影视爱好者的新宠。它不仅为用户提供了便捷的追剧体验&#xff0c;还通过推荐系统、观看历史、个性化喜好等特色功能&#xff0c;满足了用户的多样化需求。本文将深入探讨短剧小程序源码的特点、优势以及如何实现多…

Linux和windows之间文件传输解决方案

我们初学Linux时&#xff0c;经常会在windows下载软件或者文档&#xff0c;然后想办法从windows上传输到Linux上&#xff1b;还有Linux上的文件&#xff0c;我们想再Windows上储存&#xff0c;这时&#xff0c;就会用到Linux和windows之间文件传输&#xff01;&#xff01; 一…

ant X6高亮

先附上效果图 // 节点内属性的点击事件&#xff1a;node:port:click graph.on(‘node:port:click’, ({ node, port }) > { resetAllHighlights(); highlightPort(node, port, true); highlightEdgesForPort(port, new Set()); }); // 以下为源码 <template><div…

Win11下只支持IE浏览器的老网站顺畅运行的方法

在Windows 11操作系统中&#xff0c;由于Internet Explorer&#xff08;IE&#xff09;浏览器的逐步淘汰&#xff0c;微软官方已不再直接支持IE浏览器。然而&#xff0c;当您遇到必须访问仅支持IE的老旧网站时&#xff0c;Windows 11仍然提供了一些实用的替代方案来应对这一挑战…

GA/T 1400视频汇聚平台EasyCVR级联后,平台显示无通道是什么原因?

国标GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有GA/T 1400、国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&#xff…

【python】OpenCV—Bitplane

学习来自&#xff1a; 位平面分割&#xff08;Bit-Plane Slicing&#xff09;使用OpenCVPython进行图像处理的初学者指南 位平面 位平面&#xff08;bitplane&#xff09;是一个在计算机科学中用于描述图像数据的概念&#xff0c;具体定义如下&#xff1a; 【定义】&#x…

22、matlab锯齿波、三角波、方波:rectpuls()函数/sawtooth()函数/square()函数

1、采样的非周期性矩形 语法 语法1&#xff1a;y rectpuls(t) 返回一个以数组 t 中指示的采样时间采样的连续非周期性单位高度矩形脉冲&#xff0c;该矩形脉冲以 t 0 为中心。 语法2&#xff1a;y rectpuls(t,w) 生成一个宽度为 w 的矩形 参数 t:采样时间 w:矩形宽度…

网络编程(五)

网络编程&#xff08;五&#xff09; 网络服务器超时检测使用select进行超时检测套接字属性**getsockopt:获取socket软通道的某项属性值**setsockopt:设置socket软通道的某项属性值**&#xff08;socket建立之后就可使用&#xff09; 信号**signal()&#xff1a;信号处理函数se…

34. 【Java教程】反射

本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射&#xff08;reflection&#xff09;&#xff0c;很多小伙伴即便参与了工作&#xff0c;可能也极少用到 Java 反射机制&#xff0c;但是如果你想要开发一个 web 框架&#xff0c;反射是不可或缺的知识点。本小节我们将…

天诚学校物联网锁、公租房智能门锁亮相2024永康门博会

5月26-28日&#xff0c;全场景AIoT解决方案服务商——江苏新巢天诚智能技术有限公司&#xff08;以下简称“天诚”&#xff09;盛装出席第14届中国&#xff08;永康&#xff09;国际门业博览会&#xff08;以下简称“门博会”&#xff09;。 门博会亮点十足 作为享誉海内外的…

产品评测:Coolmuster Android Eraser - 安全彻底删除Android数据的利器

产品概述 在数字化时代&#xff0c;智能手机成为了个人敏感信息的集中地。当涉及到数据隐私和安全时&#xff0c;简单的删除操作并不能满足我们对数据彻底清除的需求。Coolmuster Android Eraser正是为了解决这一问题而生&#xff0c;它是一款专为Android设备设计的第三方软件&…

VUE封装-自定义权限控制指令

在实际开发中&#xff0c;会遇到很多的权限控制、资源位的场景&#xff0c;其实就是用来控制某个组件的展示与否&#xff0c;可以是一个按钮、一个报表、一个TAB页面等 例如下图&#xff0c;我想通过当前登录的用户控制谷歌的这个logo显示与否 因为设计到的权限、资源位控制比…

图片中线段和圆圈检测(python opencv)

前言 本文实现将一个图片中的线段和圆圈检测出来&#xff0c;效果就像这样 开始之前请先自行安装 opencv 另外还用到了一个用来检测直线&#xff1a; http://olena.pages.lre.epita.fr/pylena/index.html pip install pylena直线检测 先用 opencv 来检测直线, 因为下面代码…

天融信 2023 的年终奖。。

天融信 过去几天&#xff0c;最大的瓜&#xff0c;是天融信 2023 的年终奖脚踝砍。 "天融信"是国内首家网络安全企业&#xff0c;同时也是一家上市公司。 就在前些天&#xff0c;有网友爆料出&#xff0c;天融信年终奖到账只有几百元&#xff0c;甚至只有几十元&…

铝包木门窗性能优异 国内产量及需求量总体呈增长态势

铝包木门窗性能优异 国内产量及需求量总体呈增长态势 铝包木门窗是在保留纯实木门窗特性和功能的前提下&#xff0c;将隔热断桥铝合金型材和实木通过机械方法复合而成的框体。铝包木门窗具有良好的密封性、保温性、抗腐蚀性、隔音性等&#xff0c;能够满足市场对门窗质量要求不…

【Linux-阻塞,非阻塞,异步】

Linux-阻塞&#xff0c;非阻塞&#xff0c;异步 ■ Linux-阻塞-非阻塞 IO-异步■ Linux-阻塞IO■ 阻塞IO简介■ open■ 等待队列■ 示例一&#xff1a;APP阻塞IO读取进入睡眠后-等待队列唤醒进程■■ ■ Linux-非阻塞IO■ 非阻塞IO简介■ open■ 轮询■ 1、select 函数■ 2、po…

【轻触按键】开关机电路--填坑1

接上文&#xff0c;挖的坑 一、翻转电路 二、真值表 按键按下去&#xff0c;1G17会拉低&#xff0c;A端脚会掉电&#xff0c;下降沿&#xff1b;终到逻辑“0” 松开按键&#xff0c;1G17会拉高&#xff0c;A端脚充电&#xff0c;上升沿&#xff1b;终到逻辑“1”&#xff1b; …

[补题记录]LeetCode 6.Z字形变换

传送门&#xff1a;Z字形变换 转自&#xff1a;Z字形变换 Thought/思路 关键点在于&#xff0c;最后的答案是一行行连接起来的。 这样我们就会发现&#xff0c;这个 Z 字&#xff0c;实际上会让行数 不断加 1&#xff0c;然后又 不断减 1。每次按顺序选择 S 中的一个字符即…