express+mysql+vue,从零搭建一个商城管理系统7--token

提示:学习express,搭建管理系统

文章目录

  • 前言
  • 一、安装jsonwebtoken
  • 二、新建config/jwt.js
  • 三、修改models/user.js
  • 四、修改routes下的user.js
  • 五、修改index.js
  • 六、Api新建user/queryUserList接口
  • 七、token验证失败示例
  • 总结


前言

需求:主要学习express,所以先写service部分

一、安装jsonwebtoken

npm install jsonwebtoken --save

在这里插入图片描述

二、新建config/jwt.js

jwt.js

const jsonwebtoken = require('jsonwebtoken');
const secretKey = 'longlongago';
const jwt = {
    sign:(data,params,key)=>{
        return jsonwebtoken.sign(data,key||secretKey,{expiresIn:60*60,...params});
    },
    verify:(authorization,key)=>{
        let token = authorization.includes('Bearer')?authorization.replace('Bearer ',''):authorization;
        return jsonwebtoken.verify(token,key||secretKey,(err,data)=>{
            if(err)return {success:false,msg:'token验证失败'}
            return {success:true,msg:'token验证成功'}
        });
    },
}
module.exports = jwt;

在这里插入图片描述

三、修改models/user.js

const query = require('../config/db');
const bcrypt = require('../config/bcrypt');
const md5 = require('md5');
const jwt = require('../config/jwt');
const secretKey = 'longlongago';

const errFun = (msg,code)=>{
    return {
        code:code||500,
        success:false,
        msg:msg||'操作失败'
    }
}
const sucFun = (data,msg)=>{
    return {
        code:200,
        success:true,
        msg:msg||'操作成功',
        data,
    }
}
const userDao = {
    //注册
    register:async(data)=>{
        //验证账号密码格式
        const validateResult =userDao.validateUserNameAndPassword(data);
        if(!validateResult.success)return errFun(validateResult.msg);
        //查询用户名是否已存在
        const userResult = await userDao.queryUserByUserName(data);
        if(userResult.success)return errFun('用户名已存在');
        //生成userId
        const userId = md5(data.userName+secretKey);
        //加密password
        const password = bcrypt.hash(data.password+secretKey);
        //根据userName查询user
        const sql = `insert into user (userId,userName,password) values('${userId}','${data.userName}','${password}')`;
        const result = await query(sql);
        if(result&&result.affectedRows==1)return sucFun({},'添加用户成功');
        return errFun('添加用户失败');
    },
    //登录
    login:async(data)=>{
        //验证账号密码格式
        const validateResult =userDao.validateUserNameAndPassword(data);
        if(!validateResult.success)return errFun(validateResult.msg);
        //查询用户是否存在
        const userResult = await userDao.queryUserByUserName(data);
        if(!userResult.success)return errFun('用户名错误');
        //验证密码是否正确
        const comparePassword = bcrypt.compare(data.password+secretKey,userResult.data.password);
        //生成token并返回
        userResult.data.token = jwt.sign(data);
        if(comparePassword)return sucFun(userResult.data,'登录成功');
        return errFun('密码错误');
    },
    //通过用户名查询用户信息
    queryUserByUserName:async(data)=>{
        //根据userName查询user
        const sql = `select * from user where userName='${data.userName}'`;
        const result = await query(sql);
        if(result&&result.length>0)return sucFun(result[0],'查询用户成功');
        return errFun('查询用户失败');
    },
    //验证用户名密码
    validateUserNameAndPassword:(data)=>{
        //只包含大小写字母数字,包含1种即可
        let nameReg = /[\da-zA-z]{6,16}$/;
        let nameValidate = nameReg.test(data.userName);
        if(!nameValidate)return errFun('用户名格式错误');
        //大写字母,小写字母,特殊符号,包含2种以上
        passwordReg = /^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)(?![~!@#$%^&*.]+$)[\da-zA-z~!@#$%^&*.]{6,16}$/;
        let passwordValidate = passwordReg.test(data.password);
        if(!passwordValidate)return errFun('密码格式错误');
        return sucFun({},'用户名和密码格式正确');
    },
    //获取用户列表
    queryUserList:async()=>{
        //根据userName查询user
        const sql = `select userId,userName from user`;
        const result = await query(sql);
        if(result&&result.length>0)return sucFun(result,'查询用户列表成功');
        return errFun('查询用户列表失败');
    },
}

module.exports = userDao;

在这里插入图片描述

四、修改routes下的user.js

const userDao = require('../models/user');
const userRoutes = (router)=>{
    router.post('/user/register',async (req,res)=>{
        const result = await userDao.register(req.body);
        res.json(result);
    });
    router.post('/user/login',async (req,res)=>{
        const result = await userDao.login(req.body);
        res.json(result);
    });
    router.post('/user/queryUserList',async (req,res)=>{
        const result = await userDao.queryUserList(req.body);
        res.json(result);
    });
}
module.exports = userRoutes;

在这里插入图片描述

五、修改index.js

const express = require('express');
const app = express();
const router = express.Router();
const jwt = require('./config/jwt');

const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

const port = 1990;


//全局验证token
app.use('/*',(req,res,next)=>{
    let notValidateData = ['/user/login','/user/register'];
    if(notValidateData.indexOf(req.baseUrl)>-1)return next();
    if((jwt.verify(req.headers.authorization||'')||{}).success)return next();
    return res.json({success:false,code:500,msg:'token验证失败'});
})

//初始化路由
require('./routes/index')(router);

app.use('/', router);
app.listen(port,()=>{
    console.log('http://localhost:'+port);
})

在这里插入图片描述

六、Api新建user/queryUserList接口

url:http://localhost:1990/user/login
name:/user/login
headers:{
“Authorization”:“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyTmFtZSI6Imxvbmdsb25nYWdvMSIsInBhc3N3b3JkIjoibG9uZzEyMzQ1NiIsImlhdCI6MTcwOTAzMzE2OCwiZXhwIjoxNzA5MDM2NzY4fQ.KMHlT7wi8APoQtidXMVbPlW_iFDJvFXz2f7HUclhAbA”,
}
在这里插入图片描述

七、token验证失败示例

添加用户
url:http://localhost:1990/user/register
name:/user/register
headers:{
“Authorization”:“123456789”
}
在这里插入图片描述

总结

踩坑路漫漫长@~@

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

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

相关文章

Python爬虫副业真的可行吗?

首先回答你,是可行的,python爬虫能当副业,副业的方式比较多,等下我会讲几种。 那学到哪个层次可以接单呢?主要看你是接什么样的单,爬一些资料,视频这种简单的学一两个月就没什么问题&#xff0…

(unity学习)一些效果的学习

一、学习视频 【Unity教程】零基础带你从小白到超神 二、效果实现 三、问题解决 Unity 点击UI与点击屏幕冲突的解决方案 关于unity UI界面操作与场景内操作不冲突问题

TCPDump 使用教程

每次服务器网络不通的时候,总会听到一个声音,你去抓包啊,那这里就来介绍下TCPDump,一款强大的网络分析工具,可以捕获网络上的数据包,并进行分析。这款工具在网络管理员和安全专家中非常受欢迎。 一、安装 …

进程间通信之消息队列及共享内存

1.IPC对象: 内存文件 1.ipcs 查看系统重的消息队列、共享内存、信号灯的信息 2.ipcrm 删除消息队列、共享内存、信号灯 ipcrm -Q/-M/-S key ipcrm -q/-m/-s 消息队列ID/共享内存ID/信号灯ID 消息队列: 3.操作流程: …

【论文阅读】High-Resolution Image Synthesis with Latent Diffusion Model

High-Resolution Image Synthesis with Latent Diffusion Model 引用: Rombach R, Blattmann A, Lorenz D, et al. High-resolution image synthesis with latent diffusion models[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern re…

智慧城市的创新实践:全球案例分享

一、引言 在全球化和数字化的时代,智慧城市已经成为城市发展的前沿趋势。智慧城市运用先进的信息技术,如大数据、物联网、云计算和人工智能等,提升城市管理的智能化水平,增强公共服务效率,优化居民生活质量。本文将通…

AI-RAN联盟在MWC24上正式启动

AI-RAN联盟在MWC24上正式启动。它的logo是这个样的: 2月26日,AI-RAN联盟(AI-RAN Alliance)在2024年世界移动通信大会(MWC 2024)上成立。创始成员包括亚马逊云科技、Arm、DeepSig、爱立信、微软、诺基亚、美…

技术面没过,居然是因为没用过Pytest框架

01 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 简单灵活,容易上手,文档丰富; 支持参数化,可以细粒度地控制要测试的测试用例; 能够支持简单的单元测试和复杂的…

相机,棱镜和光场

一、成像方法 Imaging Synthesis Capture 1.Synthesis(图形学上)合成:比如之前学过的光线追踪或者光栅化 2.Capture(捕捉):把真实世界存在的东西捕捉成为照片 二、相机 1.小孔成像 利用小孔成像的相…

MES系统在离散制造企业中的功能解析

随着信息技术的快速发展和制造业的转型升级,MES在离散制造企业中的作用日益凸显。MES系统不仅提高了生产效率和产品质量,还优化了资源配置,增强了企业的市场竞争力。 一、生产管理功能 MES系统能够实时监控生产现场的各种数据,包…

【SQL】608. 树节点(流控制语句 CASE + IF语句)

前述 知识点推荐学习: sql中的 IF 条件语句的用法 MySQL:if语句、if…else语句、case语句,使用方法解析 题目描述 leetcode 题目:608. 树节点 思路 关键点:如何确定有没有子节点 根节点:父节点为空内节…

FreeRTOS任务管理(创建、删除、挂起、恢复)

目录 一、任务概念 二、系统启动与空闲任务 三、任务创建 四、任务删除 五、任务挂起 六、任务恢复(普通模式和中断模式) 七、任务管理编程实战 一、任务概念 1、任务的基本概念 从系统的角度看,任务是竞争系统资源的最小运行单元 …

Flutter(三):Stack、Positioned、屏幕相关尺寸、Navigator路由跳转

页面尺寸 通知栏高度:MediaQuery.of(context).padding.top顶部导航高度:kToolbarHeight底部导航高度:kBottomNavigationBarHeight屏幕宽:MediaQuery.of(context).size.width屏幕高:MediaQuery.of(context).size.height…

基于STM32制作的示波器(可对任意信号进行描点)

基于STM32制作的示波器(可对任意信号进行描点) 注意:用的屏幕是TFT-LCD(MCU 屏)正点原子同款屏幕 液晶显示器,即 Liquid Crystal Display,利用了液晶导电后透光性可变的特性,配合显…

2024洗地机选购攻略 | 洗地机好用吗?洗地机如何挑选?

在众多清洁工具中,洗地机以其卓越的清洁能力和便捷的操作方式,获得了广泛关注。2024年,市场上涌现出众多品牌的洗地机,但哪些品牌的洗地机值得推荐呢?在这里,我们将详细探讨几个备受好评的洗地机品牌&#…

Fisher矩阵与自然梯度法

文章目录 Fisher矩阵及自然梯度法Fisher矩阵自然梯度法总结参考链接 Fisher矩阵及自然梯度法 自然梯度法相比传统的梯度下降法具有以下优势: 更好的适应性:自然梯度法通过引入黎曼流形上的梯度概念,能够更好地适应参数空间的几何结构。这使…

向上生长笔记

第一章 成为一个很厉害的人(持续输入,反复练习) 为什么要学习及如何学习 1、自毁趋势(熵增),故需要能量输入(负熵流) //引申:水往低处流是趋势,学习是逆趋势。 2、持续输入能量(物质和信息),…

BUUCTF---[ACTF2020 新生赛]BackupFile1

1.题目描述 2.题目提示backup file ,是备份文件的意思。点开链接,页面提示 3.查看源码没有什么有用信息,也没有登录界面,所以也不会用到蚁剑链接来找备份文件,所以大概率就是通过构造playload来查找备份文件。 4.备份…

vue+element ui上传图片到七牛云服务器

本来打算做一个全部都是前端完成的资源上传到七牛云的demo,但是需要获取token,经历了九九八十一难,最终还是选择放弃,token从后端获取(springboot)。如果你们有前端直接能解决的麻烦记得私我哦!…

详解自动化测试框架特点和原理

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程,一周学完让你面试通过率提高90%!(自动化测试) 今天捡一些比较典型的工具型自动化框架来介绍,主要围绕历史、特点和原理来讲解,至于使用教程…