当前位置: 首页 > news >正文

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网关默认的限流方式各项限流参数都是在配置文件中配置,不够灵活&#xff0…...

在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 本案例基于尚硅谷《谷粒商城》项目&#xff0c;视频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组件的页面子组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 接口 StepperItem() 属性 参数名参数类型参数描述prevLabelstring设置左侧文本按钮内…...

游戏盾SDK是如何实现智能加速的?

游戏盾SDK是一款能够提供内含windows、安卓、IOS版本的SDK下载&#xff0c;通过接入SDK&#xff0c;由SDK接管所有的通信流量&#xff0c;进行调度和加密传输&#xff0c;满足抗D、防C、流量加密等业务需求&#xff0c;为用户提供优质的网络环境&#xff0c;游戏极速畅通无阻。…...

西井科技参与IATA全球货运大会 以AI绿动能引领智慧空港新未来

3月12日至14日&#xff0c;由国际航空运输协会IATA主办的全球货运大会&#xff08;World Cargo Symposium&#xff09;在中国香港成功举办&#xff0c;这是全球航空货运领域最大规模与影响力的年度盛会。作为大物流领域全球领先的“智能化与新能源化”综合解决方案提供商&#…...

RPC通信原理(二)

RPC序列化 任何一种序列化框架&#xff0c;核心思想就是设计一种序列化协议&#xff0c;将对象的类型、属性类型、属性值一一按照固定的格式写到二进制字节流中来完成序列化&#xff0c;再按照固定的格式把数据一一读取出来&#xff0c;通过这些数据信息创建出一个新的对象&…...

Redis 淘汰策略

Redis 是一个使用键值对存储数据的内存中数据结构存储系统&#xff0c;它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;&#xff0c;列表&#xff08;lists&#xff09;&#xff0c;集合&#xff08;sets&#xff09;&#xff0c;有序集合&#…...

游戏数据处理

游戏行业关键数据指标 ~ 总激活码发放量、总激活量、总登录账号数 激活率、激活登录率 激活率 激活量 / 安装量 激活率 激活量 / 激活码发放量 激活且登录率 激活且登录量 / 激活码激活量 激活且登录率应用场景 激活且登录率是非常常用的转化率指标之一&#xff0c;广泛…...

Qt+FFmpeg+opengl从零制作视频播放器-14.程序Ubuntu移植

首先查看的是Linux系统的版本,我使用的是Ubuntu20.04.6LTS版本。 去Qt官网下载Qt 的版本。 这里下载的是5.12.12版本,双击运行,然后安装好Qt。 回想一下,在之前的程序,我们都是在Windows上开发,仅仅使用Qt和ffmpeg,Qt前面的步骤运行完成就可以安装好了,所以在linux上…...

Go 语言中的 Cond 机制详解

概述 在并发编程中&#xff0c;条件同步是一个常见的需求。Go 语言提供了 sync.Cond 类型来满足这一需求。sync.Cond 基于互斥锁&#xff08;sync.Mutex&#xff09;提供了条件变量的同步机制&#xff0c;允许一组 goroutine 在满足某个条件时进行阻塞等待&#xff0c;或者在条…...

如何使用vue定义组件之——子组件调用父组件数据

1.定义父子模板template <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --><!-- <my-…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...