express+mysql+vue,从零搭建一个商城管理系统6--数据校验和登录

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

文章目录

  • 前言
  • 一、修改models/user.js
  • 二、修改routes下的user.js
  • 三、Api新建user/login接口
  • 四、删除数据库原有数据,添加新验证规则的用户
  • 四、用户登录
  • 总结


前言

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

一、修改models/user.js

const query = require('../config/db');
const bcrypt = require('../config/bcrypt');
const md5 = require('md5');
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
        if(comparePassword)return sucFun({},'登录成功');
        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({},'用户名和密码格式正确');
    },
}

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);
    });
}
module.exports = userRoutes;

在这里插入图片描述

三、Api新建user/login接口

url:http://localhost:1990/user/login
name:/user/login
params:{
“userName”: “longlongago1”,
“password”: “long123456”
}
在这里插入图片描述

四、删除数据库原有数据,添加新验证规则的用户

添加用户
url:http://localhost:1990/user/register
name:/user/register
params:{
“userName”:“longlongago1”,
“password”:“long123456”
}
在这里插入图片描述

四、用户登录

1、用户登录成功
url:http://localhost:1990/user/login
name:/user/login
params:{
“userName”: “longlongago1”,
“password”: “long123456”
}
在这里插入图片描述
2、用户名错误
url:http://localhost:1990/user/login
name:/user/login
params:{
“userName”: “longlongago”,
“password”: “long123456”
}
在这里插入图片描述
3、密码错误
url:http://localhost:1990/user/login
name:/user/login
params:{
“userName”: “longlongago1”,
“password”: “long12345”
}
在这里插入图片描述

总结

踩坑路漫漫长@~@

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

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

相关文章

【Linux】基础篇-Linux四种环境搭建的方式(详细安装说明步骤,搭载下载安装地址)

目录 1. 使用虚拟机(推荐VMware)centos 7版本 1.1VMware虚拟机下载 1.2VMware 安装 1.3centos-7 清华大学镜像下载 1.4 centos-7 清华大学镜像导入虚拟机VMware 2.使用虚拟机ubuntu 20.04版本 2.1虚拟机下载同上 2.2虚拟机安装同上 2.3ubunt…

ROS-Ubuntu 版本相关

ROS-Ubuntu 版本相关:安装指引 年代ROS1版本Ubuntu 版本2014Indigo14.042016Kinetic16.042018Melodic18.042020Noetic20.04 & 22.04 ROS2兼顾了工业使用上的问题。 年代ROS2版本Ubuntu 版本2022Humble20.04 & 22.042023Iron16.04 相关参考: […

【Qt 学习之路】使用 cmake 在Windows上 编译 ZeroMQ

文章目录 1、概述2、编译2.1、用 Visual Studio 的解决方案方式2.1.1、找到 Builds 文件夹2.1.2、查看 deprecated-msvc 下的 libzmq.sln 文件2.1.3、使用 Visual Studio 打开 libzmq.sln 解决方案2.1.4、修改 libzmq.import.props 文件2.1.5、编译生成 2.2、用 C 的cmake方式2…

【前端入门】设计模式+单多页+React

设计模式是一种解决特定问题的经验总结,它提供了经过验证的解决方案,可以在软件开发过程中使用。设计模式可以帮助前端开发人员更有效地组织和管理代码,并提供一种共享的语言和框架,以便与其他开发人员进行交流。 以下是一些常见…

十二、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法(promotion)重新定义paintEvent事件 2、实现程序 (1)创建项目,基于QWidget (2)添加类,为Widget组件提升类 #inclu…

Delegate(P29 5.5delegate)

一、Delegate简介 每个代理都可以访问许多附加的属性,其中一些来自数据模型,另一些来自视图。 从模型中(Model):属性将每个项目的数据传递给 delegate。 从视图中(View):属性将状…

dcat admin 自定义页面

自定义用户详情页 整体分为两部分:用户信息、tab框 用户信息采用自定义页面加载,controller代码如下: protected function detail($id) {return Show::make($id, GameUser::with(finance), function (Show $show) {// 这段就是加载自定义页面…

pdf怎么合并在一起?

pdf怎么合并在一起?在日常工作和学习中,我们常常需要处理大量的PDF文件。有时候,我们可能希望将多个PDF文件合并成一个文件,以便于管理和分享。这时候,PDF文件合并工具就能派上用场了。PDF文件合并是一种将多个PDF文件…

MySQL 事务原理分析

事务 前提:有并发连接。定义:事务是用户定义的一系列操作,这些操作要么都做,要么都不做,是一个不可分割的单位。目的:事务将数据库从一种一致性状态转换为另一种一致性状态,保证系统始终处于一…

【数据结构】从链表到LinkedList类

🧧🧧🧧🧧🧧个人主页🎈🎈🎈🎈🎈 🧧🧧🧧🧧🧧数据结构专栏🎈🎈🎈&…

NerfStudio安装及第一个场景重建

NerfStudio文档是写在windows和linux上安装,本文记录Linux安装的过程,且我的cuda是11.7 创建环境 conda create --name nerfstudio -y python3.8 conda activate nerfstudio python -m pip install --upgrade pip Pytorch要求2.0.1之后的,文档推荐cud…

JavaWeb——005 请求响应 分层解耦(Postman、三层架构、IOC、DI、注解)

SpringBootWeb请求响应 这里写目录标题 SpringBootWeb请求响应前言1. 请求1.1 Postman1.1.1 介绍1.1.2 安装 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 …

产品老化试验目的、用途

什么是老化试验? 老化试验是通过模拟产品在使用过程中的老化情况,来评估产品在长期使用后的性能和可靠性。这种测试可以帮助制造商了解产品的寿命和耐久性,以及产品在不同环境条件下的表现。 模拟量采集/老化房采集软件 为什么需要进行老化试…

【Leetcode每日一刷】贪心算法01:455.分发饼干、376. 摆动序列、53. 最大子序和

博主简介:努力学习和进步中的的22级计科生博主主页: Yaoyao2024每日一句: “ 路虽远,行则将至。事虽难,做则可成。” 文章目录 前言:贪心算法一、455.分发饼干二、376. 摆动序列三、53. 最大子序和 前言:贪…

挑战杯 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,…

信号系统之切比雪夫过滤器

1 切比雪夫和巴特沃斯的响应 切比雪夫响应是一种数学策略,通过允许频率响应中的纹波来实现更快的滚降。使用这种方法的模拟和数字滤波器称为切比雪夫滤波器。这些滤波器因使用切比雪夫多项式而得名,切比雪夫多项式由俄罗斯数学家帕夫努蒂切比雪夫&#…

基于FPGA的9/7整数小波变换和逆变换verilog实现,包含testbench

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 9/7整数小波变换原理 4.2 逆变换过程 5.算法完整程序工程 1.算法运行效果图预览 将测试结果导入到matlab显示 2.算法运行软件版本 vivado2019.2,matlab2022a 3.部分核心程…

寒假作业Day 01

这个项目主要是为了复习博主之前关于C语言和数据结构的寒假作业,大家也可以根据这些题目自己进行填写并检查自己的知识点是否过关 博主也会有错误,所以如果大家看到错误,也希望大家能够进行指正,谢谢大家! Day 01 一…

静态链表(1)

什么叫静态链表?——用顺序表模拟链表,就叫做静态链表 第一列相当于数据域data,第二列相当于指针域next, 第一行(0)相当于头结点(头结点的数据域不放数据) (a&#xff…

Rocky Linux安装部署Elasticsearch(ELK日志服务器)

一、Elasticsearch的简介 Elasticsearch是一个强大的开源搜索和分析引擎,可用于实时处理和查询大量数据。它具有高性能、可扩展性和分布式特性,支持全文搜索、聚合分析、地理空间搜索等功能,是构建实时应用和大规模数据分析平台的首选工具。 …