express+mysql+vue,从零搭建一个商城管理系统9--添加商户

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

文章目录

  • 前言
  • 一、新建models/shop.js
  • 二、新建routes/shop.js
  • 三、修改routes下的index.js
  • 四、添加商户
  • 总结


前言

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

一、新建models/shop.js

models/shop.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 shopDao = {//注册addShopByUserId:async(data)=>{//验证账号密码格式const validateResult =shopDao.validateShopName(data);if(!validateResult.success)return errFun(validateResult.msg);//查询商户名是否已存在const userResult = await shopDao.queryShopByShopName(data);if(userResult.success)return errFun('商户名已存在');//生成shopIdconst shopId = md5(data.shopName+secretKey);//根据shopName查询shopconst sql = `insert into shop (shopId,shopName,createId) values('${shopId}','${data.shopName}','${data.createId}')`;const result = await query(sql);if(result&&result.affectedRows==1)return sucFun({},'添加商户成功');return errFun('添加商户失败');},//通过商户名查询商户信息queryShopByShopName:async(data)=>{//根据shopName查询shopconst sql = `select * from shop where shopName='${data.shopName}'`;const result = await query(sql);if(result&&result.length>0)return sucFun(result[0],'查询商户成功');return errFun('查询商户失败');},//通过商户名查询商户信息queryShopByShopId:async(data)=>{//根据shopName查询shopconst sql = `select * from shop where shopName='${data.shopName}'`;const result = await query(sql);if(result&&result.length>0)return sucFun(result[0],'查询商户成功');return errFun('查询商户失败');},//验证商户名密码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;

在这里插入图片描述

二、新建routes/shop.js

routes/shop.js

const shopDao = require('../models/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下的index.js

读取routes文件夹下的所有文件列表,过滤去掉index.js之后,引入并实例化剩余route
一劳永逸,不用每次添加route文件,都得修改index.js文件

const fs = require('fs');
const routes = (router)=>{const files = fs.readdirSync(__dirname)||[];files.forEach(item=>{if(item.indexOf('index')==-1)require(__dirname+'/'+item)(router);})
}module.exports = routes;

在这里插入图片描述

四、添加商户

url:http://localhost:1990/shop/addShopByUserId
name:/shop/addShopByUserId
params:{"shopName": "shop01","createId": "d9ef196010ee41be28ba70a0f819da9d"
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

params:{"shopName": "shop01","createId": "e9fd658aa2e171a3c145c4586d750b50"
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

踩坑路漫漫长@~@

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PortSwigger 基于dom的漏洞-利用 DOM 破坏来启用 XSS

进入实验随意进入一篇博客 我们可以尝试随意提交一些恶意代码看看会发生什么 很显然我们提交成功了但是我们的恶意代码貌似被过滤了 查看源码发现这里有一个过滤框架 我们打开源码分析 function loadComments(postCommentPath) {let xhr new XMLHttpRequest();xhr.onreadys…

#QT(串口助手-实现)

1.IDE:QTCreator 2.实验 3.记录 (1)在widget.h中加入必要文件,并且定义一个类指针 (2)如果有类的成员不知道怎么写,可以通过以下途径搜索 (2)设置串口数据 void Widget…

海王星(Neptune)系列和大禹(DAYU)系列OpenHarmony智能硬件配置解决方案

海王星(Neptune)系列和大禹(DAYU)系列OpenHarmony智能硬件对OS的适配、部件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:vendor/{产品解决方案厂商}/{产品名称}_。 解决方案的目录树规则如下&…

推理判断01-程永乐-图形1

课程安排 出题形式 图形推理 1、位置规律 图形题目

首尔之春在线资源最新电影1080p高清

打开下面这个链接就可以看到 首尔之春在线资源最新电影1080p高清 如果链接打不开,就复制下面的网址到浏览器打开 https://www.zhufaka.cn/liebiao/A09504AE3BF8BD06 用阿里云盘下载,下载完成之后,用迅雷播放 首尔之春在线资源最新电影10…

使用go语言实现简单的tcp通信功能

啥都不说了,直接上代码 服务端Server //Server.go package mainimport ("fmt""net""os" )func main(){//服务端在本机8888端口建立tcp监听listener,err :net.Listen("tcp","127.0.0.1:8888")ServerHandleError(…

DO-178C解读 - 软件配置索引(2)

B.3 软件生命周期环境配置索引Software Life Cycle Environment Configuration Index 软件生命周期环境配置索引(SECI)标识软件生命周期环境的配置。 编写该索引是为了帮助再现硬件和软件生命周期环境,以进行软件重新生成、重新验证或修改&a…

YoloV8改进策略:Block改进|MogaNet——高效的多阶门控聚合网络

文章目录 摘要论文:《MogaNet——高效的多阶门控聚合网络》1、简介2、相关工作2.1、视觉Transformers2.2、ViT时代的卷积网络3、从多阶博弈论交互的角度看表示瓶颈4、方法论4.1、MogaNet概述4.2、多阶门控聚合4.3、通过通道聚合进行多阶特征重新分配4.4、实现细节5、实验5.1、…

winui开发笔记(五)应用程序图标

应用程序图标、发布者、显示名称大部分都在package.appxmanifest清单文件中,可以正常打开,也可以使用xml文本编辑器打开。 以下是一个正常的应用程序中所有的与图标相关的图片: 但是设置之后会有一圈白,包括在电脑最下边一行&…

HDFS简介与部署以及故障排错(超简单)

文章目录 一、HDFS介绍1、简介2、结构模型3、文件写入过程4、文件读取过程5、文件块的存放6、存储空间管理机制6.1 文件删除和恢复删除6.2 复制因子配置6.3 文件命名空间6.4 数据复制机制 二、环境搭建(单机版)1、修改主机名2、配置ssh免密登录3、Hadoop…

自然语言:信息抽取技术在CRM系统中的应用与成效

一、引言 在当今快速变化的商业环境中,客户关系管理(CRM)已成为企业成功的关键因素。CRM系统的核心在于有效地管理客户信息,跟踪与客户的每一次互动,以及深入分析这些数据以提升客户满意度和忠诚度。在我最近参与的一个…

如何解决ros2与conda冲突的问题

在Ubuntu下安装ROS2之后,再安装Anaconda,Anaconda的base环境下的python将被作为默认python进行调用。当用户需要运行ROS2程序的时候,这种默认设置会导致报错。 安装conda并创建conda环境之后,ros2就会使用conda环境,就…

海尔电视的ip地址一般是什么

随着智能电视的普及,越来越多的用户开始关心其网络设置,特别是IP地址。IP地址是设备在网络中的唯一标识,对于海尔电视用户来说,了解如何查找和设置IP地址尤为重要。本文将带您深入了解海尔电视的IP地址相关知识,帮助您…

第十五届蓝桥杯第三期模拟赛(Java)

1. 【问题描述】 请问 2023 有多少个约数?即有多少个正整数,使得 2023 是这个正整数的整数倍。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,…

【数仓】kafka软件安装及集群配置

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用(集群配置)【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置 一、环境准备 准备3台虚拟机 Hadoop131&#xff…

O2O:Offline–Online Actor–Critic

IEEE TAI 2024 paper 1 Introduction 一篇offline to online 的文章,有效解决迁移过程出现的performance drop。所提出的O2AC算法首先在离线阶段添加一项BC惩罚项,用于限制策略靠近专家策略;而在在线微调阶段,通过动态调整BC的权…

【STM32F103】WDG看门狗

本系列在之前介绍时钟树的文章中有稍微提一下看门狗WDG(Watch Door Dog)。 简单来说,可以当成是一个计数器,一旦这个计数器溢出则单片机复位。因为我们需要每隔一段时间就把这个计数器的值清零(喂狗)。 I…

并发编程并发安全性之Lock锁及原理分析

ReentrantLock 用途:锁是用来解决线程安全问题的 重入锁-> 互斥锁 满足线程的互斥性意味着同一个时刻,只允许一个线程进入到加锁的代码中。多线程环境下,满足线程的顺序访问 锁的设计猜想 一定会涉及到锁的抢占,需要有一个标记来实现互…

C#不可识别的数据库格式解决方法

1.检查数据库文件路径和文件名: 确保指定的路径和文件名拼写正确,而且文件确实存在于指定的位置。使用绝对路径或相对路径都是可行的,但要确保路径的正确性 string connectionString "ProviderMicrosoft.ACE.OLEDB.12.0;Data SourceE:…

数字人解决方案——阿里EMO音频驱动肖像生成能说话能唱歌的逼真视频

前言 数字可以分为3D数字人和2D数字人。3D数字人以虚幻引擎的MetaHuman为代表,而2D数字人则现有的图像或者视频做为输入,然后生成对口型的数字人,比如有SadTalker和Wav2Lip。 SadTalker:SadTalker是一种2D数字人算法,…