express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize
提示:学习express,搭建管理系统
文章目录
- 前言
- 一、安装sequelize和mysql2
- 二、修改config/db.js
- 三、修改models/user.js,models/shop.js,models/goods.js
- 四、新建dao/user.js,dao/shop.js,dao/goods.js
- 五、修改routes/user.js,routes/shop.js,routes/goods.js
- 六、添加商品
- 总结
前言
需求:主要学习express,所以先写service部分
一、安装sequelize和mysql2
sequelize中文官网
sequelize匹配使用mysql2
npm install sequelize mysql2 --save

二、修改config/db.js
config/db.js
const {Sequelize} = require('sequelize');
const dbConfig = {host:'localhost',ipport:'3306',user:'root',password:'123456',database:'express_service'
}
const sequelize = new Sequelize(dbConfig.database,dbConfig.user,dbConfig.password,{host:dbConfig.host,dialect:'mysql',port:dbConfig.ipport,pool: {max: 5, // 最大连接数min: 0, // 最小连接数idle: 10000, // 释放连接的最长空闲时间msacquire: 30000, // 连接错误后,重新连接的间隔时间ms},
});const connectDb = async()=>{try{await sequelize.authenticate();console.log('数据库连接成功√√√√√');}catch{console.log('数据库连接失败×××××');}
}
connectDb();module.exports = sequelize;
三、修改models/user.js,models/shop.js,models/goods.js
models/user.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/db');const UserModel = sequelize.define('User',{id: {type: DataTypes.INTEGER,autoIncrement: true,primaryKey: true},userId:DataTypes.STRING,userName:{type: DataTypes.STRING,allowNull: false,unique: true,},password:DataTypes.STRING,
},{tableName:'user'
});//无user表创建user表
UserModel.sync();
module.exports = UserModel;
models/shop.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/db');const ShopModel = sequelize.define('Shop',{id: {type: DataTypes.INTEGER,autoIncrement: true,primaryKey: true},shopId:DataTypes.STRING,shopName:{type: DataTypes.STRING,allowNull: false,unique: true,},createId:DataTypes.STRING,
},{tableName:'shop'
});//无shop表创建shop表
ShopModel.sync();
module.exports = ShopModel;
models/goods.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/db');const GoodsModel = sequelize.define('Goods',{id: {type: DataTypes.INTEGER,autoIncrement: true,primaryKey: true},//商品IDgoodsId:DataTypes.STRING,//商品名称goodsName:{type: DataTypes.STRING,allowNull: false,unique: true,},//创建人userIdcreateId:DataTypes.STRING,//商户IDshopId:DataTypes.STRING,//商户名shopName:DataTypes.STRING,//价格price:DataTypes.FLOAT,//库存inventory:DataTypes.INTEGER,//规格specs:DataTypes.STRING,
},{tableName:'goods'
});//无goods表创建goods表
GoodsModel.sync();
module.exports = GoodsModel;

四、新建dao/user.js,dao/shop.js,dao/goods.js
dao/user.js
const UserModel = require('../models/user');
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);//生成userId passwordconst userId = md5(data.userName+secretKey+new Date().getTime());const password = bcrypt.hash(data.password+secretKey);//添加usertry {const user = await UserModel.create({userId,userName: data.userName,password});if(!user) errFun('注册失败!');return sucFun(user,'注册成功!')}catch(err){let errors = (err.errors||[])[0]||{};let messsage = '注册失败';(errors.message||'').indexOf('userName must be unique')>-1&&(messsage = '用户名已存在');(errors.message||'').indexOf('userName cannot be null')>-1&&(messsage = '用户名不能为空');return errFun(messsage);}},//登录login:async(data)=>{//验证账号密码格式const validateResult =UserDao.validateUserNameAndPassword(data);if(!validateResult.success)return errFun(validateResult.msg);//查询用户是否存在try{const user = await UserModel.findOne({ where: {userName:data.userName} });if(!user)return errFun('该用户不存在');//验证密码是否正确const comparePassword = bcrypt.compare(data.password+secretKey,user.password);if(!comparePassword)return errFun('密码错误');//生成tokenuser.token = jwt.sign(data);return sucFun(user,'登录成功');}catch(err){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查询usertry{const users = await UserModel.findAll();if(users&&users.length>0)return sucFun(users,'查询用户列表成功');return errFun('查询用户列表失败');}catch(err){return errFun('查询失败');}},
}module.exports = UserDao;
dao/shop.js
const ShopModel = require('../models/shop');
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 ShopDao = {//注册addShopByUserId:async(data)=>{//验证账号密码格式const validateResult =ShopDao.validateShopName(data);if(!validateResult.success)return errFun(validateResult.msg);//添加商户const shopId = md5(data.shopName + secretKey + new Date().getTime());try{const shop = await ShopModel.create({ shopId, createId:data.createId, shopName:data.shopName });if(!shop)errFun('添加商户失败');return sucFun(shop,'添加用户成功')}catch(err){let errors = (err.errors||[])[0]||{};let messsage = '添加商户失败';(errors.message||'').indexOf('shopName must be unique')>-1&&(messsage = '商户名已存在');(errors.message||'').indexOf('shopName cannot be null')>-1&&(messsage = '商户名不能为空');return errFun(messsage);}},//验证商户名密码validateShopName:(data)=>{//只包含大小写字母数字,包含1种即可let nameReg = /[\da-zA-z]{6,16}$/;let nameValidate = nameReg.test(data.shopName);if(!nameValidate)return errFun('商户名格式错误');return sucFun({},'商户名格式正确');},
}module.exports = ShopDao;
dao/goods.js
const GoodsModel = require('../models/goods');
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 GoodsDao = {//注册addGoodsByShopId:async(data)=>{//生成goodsIdconst goodsId = md5(data.goodsName+secretKey+new Date().getTime());try{const goods = await GoodsModel.create({goodsId,goodsName:data.goodsName,createId:data.createId,shopId:data.shopId,shopName:data.shopName,price:data.price,inventory:data.inventory,specs:data.specs,});if(!goods)return errFun('添加商品失败');return sucFun(goods,'添加商品成功');}catch(err){let errors = (err.errors||[])[0]||{};console.log(JSON.stringify(errors))let messsage = '添加商品失败';(errors.message||'').indexOf('goodsName must be unique')>-1&&(messsage = '商品名已存在');(errors.message||'').indexOf('goodsName cannot be null')>-1&&(messsage = '商品名不能为空');return errFun(messsage);}},//通过商品ID查询商品信息queryGoodsByGoodsId:async(data)=>{//根据goodsId查询goodsconst goods = GoodsModel.findOne({where:{goodsId:data.goodsId}});if(!goods)errFun('商品已下架或不存在');return sucFun(goods,'添加商品成功');},
}module.exports = GoodsDao;

五、修改routes/user.js,routes/shop.js,routes/goods.js
routes/user.js
const UserDao = require('../dao/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;
routes/shop.js
const ShopDao = require('../dao/shop');
const shopRoutes = (router)=>{router.post('/shop/addShopByUserId',async (req,res)=>{const result = await ShopDao.addShopByUserId(req.body);res.json(result);});
}
module.exports = shopRoutes;
routes/goods.js
const GoodsDao = require('../dao/goods');
const goodsRoutes = (router)=>{router.post('/goods/addGoodsByShopId',async (req,res)=>{const result = await GoodsDao.addGoodsByShopId(req.body);res.json(result);});
}
module.exports = goodsRoutes;
六、添加商品
删除原有数据库表格,新建用户,新建商户,新建商品可以重新创建对应的表
url:http://localhost:1990/goods/addGoodsByShopId
params:{
“goodsName”: “乐事薯片”,
“createId”: “94bca74490de0f84e1f478ed602123d3”,
“shopId”: “098a0c4828d7d0c78f42e6124f911a77”,
“shopName”: “shop01”,
“inventory”: 200,
“price”: 6.40,
“specs”: “160克/罐”
}


总结
踩坑路漫漫长@~@
相关文章:
express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize
提示:学习express,搭建管理系统 文章目录 前言一、安装sequelize和mysql2二、修改config/db.js三、修改models/user.js,models/shop.js,models/goods.js四、新建dao/user.js,dao/shop.js,dao/goods.js五、修…...
霹雳学习笔记——6.1 ResNet网络结构、BN以及迁移学习
一、ResNet结构 ResNet是一个突破一千层的网络架构。主要是卷积层Conv和池化层的堆叠。但是普通的堆叠会使得错误率更高,如下图所述,这是因为会产生梯度消失/梯度爆炸等。(梯度就是增量,有大小有方向) 解决方法&#…...
Gitee的注册和代码提交(附有下载链接)
目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…...
机器学习是什么?
机器学习是一种人工智能(AI)的分支,其主要目标是使计算机系统能够通过数据和经验来改进和学习,而无需明确地编程。在机器学习中,计算机系统会通过对大量数据进行学习和分析,从中发现模式和规律,…...
复盘-PPT
调整PPT编号起始页码在设计→幻灯片大小 设置所有以及文本项目符号 ## 打开母版,找到对应级别设置重置 当自动生成的smartart图形不符合预期时 1 2...
springcloud gateway网关动态配置限流
上一篇记录了gateway网关的基础功能和配置,并且使用了默认的限流功能。 springcloud gateway网关-CSDN博客 这里简单记录一下gateway网关集成mybatisPlus实现动态限流。gateway网关默认的限流方式各项限流参数都是在配置文件中配置,不够灵活࿰…...
在Linux/Ubuntu/Debian中使用windows应用程序/软件
Wine 是一个兼容层,允许你在类 Unix 操作系统(包括 Ubuntu)上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤: 在 Ubuntu 上安装 Wine: 更新软件包列表: 打开终端并运行以下命令以…...
idea Springboot 组卷管理系统LayUI框架开发mysql数据库web结构java编程计算机网页
一、源码特点 springboot 组卷管理系统是一套完善的完整信息系统,结合mvc框架和LayUI框架完成本系统springboot spring mybatis ,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整…...
wordpress主题批量修改历史文章标题,文章内容
:wordpress模板,在我映像中还是比较受欢迎的,至少它该有的插件都是应有尽有,不像帝国cms虽然功能多,但是基本用不上,而且很多会出错。也不像织梦cms漏洞太多,搞的建站期间出现很多其他事情&am…...
Unity2019.2.x 导出apk 安装到安卓Android12+及以上的系统版本 安装出现-108 安装包似乎无效的解决办法
Unity2019.2.x 导出apk 安装到安卓Android12及以上的系统版本 安装出现-108 安装包似乎无效的解决办法 导出AndroidStudio工程后 需要设置 build.gradle文件 // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAINbuildscript {repositor…...
创建SpringCloudGateWay
创建SpringCloudGateWay 本案例基于尚硅谷《谷粒商城》项目,视频27 创建测试API网关 1、创建module 2、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:x…...
鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:StepperItem)
用作Stepper组件的页面子组件。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 接口 StepperItem() 属性 参数名参数类型参数描述prevLabelstring设置左侧文本按钮内…...
游戏盾SDK是如何实现智能加速的?
游戏盾SDK是一款能够提供内含windows、安卓、IOS版本的SDK下载,通过接入SDK,由SDK接管所有的通信流量,进行调度和加密传输,满足抗D、防C、流量加密等业务需求,为用户提供优质的网络环境,游戏极速畅通无阻。…...
西井科技参与IATA全球货运大会 以AI绿动能引领智慧空港新未来
3月12日至14日,由国际航空运输协会IATA主办的全球货运大会(World Cargo Symposium)在中国香港成功举办,这是全球航空货运领域最大规模与影响力的年度盛会。作为大物流领域全球领先的“智能化与新能源化”综合解决方案提供商&#…...
RPC通信原理(二)
RPC序列化 任何一种序列化框架,核心思想就是设计一种序列化协议,将对象的类型、属性类型、属性值一一按照固定的格式写到二进制字节流中来完成序列化,再按照固定的格式把数据一一读取出来,通过这些数据信息创建出一个新的对象&…...
Redis 淘汰策略
Redis 是一个使用键值对存储数据的内存中数据结构存储系统,它支持多种类型的数据结构,如字符串(strings),列表(lists),集合(sets),有序集合&#…...
游戏数据处理
游戏行业关键数据指标 ~ 总激活码发放量、总激活量、总登录账号数 激活率、激活登录率 激活率 激活量 / 安装量 激活率 激活量 / 激活码发放量 激活且登录率 激活且登录量 / 激活码激活量 激活且登录率应用场景 激活且登录率是非常常用的转化率指标之一,广泛…...
Qt+FFmpeg+opengl从零制作视频播放器-14.程序Ubuntu移植
首先查看的是Linux系统的版本,我使用的是Ubuntu20.04.6LTS版本。 去Qt官网下载Qt 的版本。 这里下载的是5.12.12版本,双击运行,然后安装好Qt。 回想一下,在之前的程序,我们都是在Windows上开发,仅仅使用Qt和ffmpeg,Qt前面的步骤运行完成就可以安装好了,所以在linux上…...
Go 语言中的 Cond 机制详解
概述 在并发编程中,条件同步是一个常见的需求。Go 语言提供了 sync.Cond 类型来满足这一需求。sync.Cond 基于互斥锁(sync.Mutex)提供了条件变量的同步机制,允许一组 goroutine 在满足某个条件时进行阻塞等待,或者在条…...
如何使用vue定义组件之——子组件调用父组件数据
1.定义父子模板template <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件,子组件必须依赖于父组件进行展示 --><!-- <my-…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
