后端Node学习项目-用户管理-增删改查

model层实现

文件创建

在models文件夹下创建user.js

代码实现

const { DataTypes } = require('sequelize')
const { db } = require('./index')const User = db.define('user', {id: {type: DataTypes.INTEGER,primaryKey: true, // 主键autoIncrement: true, // 内容自增allowNull: false, // 是否允许为空unique: true, // 不可重复comment: '用户id,唯一'},username: {type: DataTypes.STRING,allowNull: false,comment: '用户姓名'},nickname: {type: DataTypes.STRING,allowNull: true,comment: '用户昵称'},password: {type: DataTypes.STRING,allowNull: false,comment: '用户密码'},gender: {type: DataTypes.INTEGER,allowNull: false,comment: '用户性别'},avatar: {type: DataTypes.STRING,allowNull: false,comment: '头像'},role: {type: DataTypes.INTEGER,allowNull: false,comment: '角色'},education: {type: DataTypes.INTEGER,allowNull: true,comment: '学历'},school: {type: DataTypes.STRING,allowNull: true,comment: '毕业院校'},banjiId: {type: DataTypes.INTEGER,allowNull: true,comment: '班级id'}
})
// 同步创建user表
// User.sync({
//   force: false
// }).then(res => {
//   console.log('res====>', res);
// }).catch(err => {
//   console.log('err====>', err);
// })module.exports = User

内容解释

DataTypes

是一个含有常用数据类型的类,它用于使用sequelize.define()方法定义模型时指定列的数据类型 参考文章

创建时间和更新时间

这两个字段不用创建,在上文中数据库连接配置中,timestamps属性就是做这个的,后续的赋值和修改也不用做处理

数据表同步

主要是不会在软件中建表,我第一次就是自己在Navicat中建的,结果查询一直出错。直接同步,成功。
同步建表时候需要把导出语句:module.exports = user 这一句先注释掉哈

service层实现

文件创建

  • 根目录下创建service文件夹
  • 在service文件夹下创建user.js

代码实现

const User = require('../models/user')
const { Op } = require("sequelize"); // 设置数据库语句查询条件
class UserService {// 查询所有用户async findAllUser (ctx) {const { username, gender, role, size, page } = ctx.queryconst queryParams = {}if (username) {  // 主要用于参数为空时不设置数据库查询条件queryParams.username = {[Op.like]: `%${username}%`}}if (gender) {queryParams.gender = gender}if (role) {queryParams.role = role}// + 的作用在于将size转为数字const res = await User.findAndCountAll({where: queryParams,limit: +size,offset: (page - 1) * size,})return {total: res.count,records: res.rows}}// 查询用户async findUser (userInfo) {const res = await User.findOne({where: {username: userInfo.username}})return res.dataValues}// 创建用户async createUser (userInfo) {const res = await User.create(userInfo)return res.dataValues}// 更新用户async updateUser (id, userInfo) {const res = await User.update(userInfo, {where: {id}})return res.dataValues}// 删除用户async deleteUser (id) {const res = await User.destroy({where: {id}})return res.dataValues}
}module.exports = new UserService()

内容解释

Op的使用

参考文章

controller层实现

文件创建

  • 根目录下创建controller文件夹
  • 在controller文件夹下创建user.js

代码实现

const { findAllUser, createUser, updateUser, deleteUser } = require('../service/user')
class UserController {// 查询所有用户async findAllUser (ctx) {const res = await findAllUser(ctx)ctx.body = {code: 200,message: '查询成功',data: res,}}// 创建用户async addUserInfo (ctx) {const userInfo = ctx.request.bodytry {const res = await createUser(userInfo)console.log('res===>create', res);ctx.body = {code: 200,message: '用户创建成功',data: {id: res.id,userName: res.userName,},}} catch (error) {}}// 更新用户async updateUserInfo (ctx) {const { id, ...info } = ctx.request.bodytry {const res = await updateUser(id, info)console.log('res===>update', res);ctx.body = {code: 200,message: '用户更新成功',data: res,}} catch (error) {}}// 删除用户async deleteUserInfo (ctx) {const { id } = ctx.request.bodytry {const res = await deleteUser(id)console.log('res===>delete', res);ctx.body = {code: 200,message: '用户删除成功',data: res,}} catch (error) {}}
}module.exports = new UserController()

内容解释

请求参数的获取
  • get请求:参数中ctx.query中及逆行解构即可
  • post请求:参数都在ctx.request.body中
响应数据封装

后续可以对响应数据结构进行封装,各位自行实现哈,或者等待下一版本的开发记录

router层实现

文件创建

  • 根目录下创建router文件夹
  • 在router文件夹下创建user.js

代码实现

const Router = require('koa-router')
const router = new Router({ prefix: '/user' })
const { findAllUser, addUserInfo, updateUserInfo, deleteUserInfo } = require('../controller/user')
router.get('/getList', findAllUser)
router.post('/addUser', addUserInfo)
router.post('/updateUser', updateUserInfo)
router.post('/delUser', deleteUserInfo)module.exports = router

内容解释

prefix

模块主路由设置。

const router = new Router({ prefix: '/user' })  

表示用户模块的接口地址都以/user开头

启动文件补充

const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
// 引入路由
const Router = require('koa-router');
const router = new Router();
const { serverSetting } = require('./config');
// 引入用户模块路由
const userRouter = require('./router/user');
const app = new Koa();
app.use(bodyParser());
// 总路由加载用户路由
router.use(userRouter.routes())
//服务加载总路由信息
app.use(router.routes()).use(router.allowedMethods())
app.listen(serverSetting.port, () => {console.log(`server is running at http://${serverSetting.ipAddress}:${serverSetting.port}/${serverSetting.proxy}`)
})

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

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

相关文章

B+树的介绍

B树的概念 规则: B跟B树不同B树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B树每个非叶子节点所能保存的关键字大大增加 B树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次…

【Rust调用Windows API】获取正在运行的全部进程信息

前言 WIndows API官方文档 提供了C的调用示例,最近想尝试用Rust去实现,本系列博客记录一下实现过程。 依赖 Rust调用Windows API需要引入依赖winapi,在Cargo.toml中添加依赖 winapi "0.3.9"调用不同的API集就需要使用相应的功…

鸿蒙HarmonyOS 网络请求获取数据Http

注意的是;要为接口返回值指定类型 ,以及定义接口数据类型 index.ets import { http } from kit.NetworkKit;interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: }Component export default struct TabBar {State dat…

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂,死如秋叶之静美

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂,死如秋叶之静美 《飞鸟集》[印]泰戈尔,一本有意思的诗集,中英文对照着读更有意思。“你是谁,读者,百年后读着我的诗?”让我觉得有些久别重逢,忽…

ROS Action

在 ROS 中,Action 是一种支持长时间异步任务的通信机制。与 Service 不同,Action 允许客户端发起一个请求,并在任务执行的过程中不断接收反馈,直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务,比如机器…

C++设计模式和编程框架两种设计元素的比较与相互关系

C设计模式和编程框架都是软件设计中的重要元素,它们各自具有独特的特点和应用场景。以下是对它们的比较,并通过举例说明它们的关系。 C设计模式 定义 设计模式是在软件设计中反复出现的特定问题的解决方案。它们是经过验证的、可复用的设计方案&#…

约束(MYSQL)

not null(非空) unique(唯一) default(默认约束,规定值) 主键约束primary key(非空且唯一) auto_increment(自增类型) 复合主键 check&#xff08…

MySQL 权限困境:从权限丢失到权限重生的完整解决方案20241108

🛠️ MySQL 权限困境:从权限丢失到权限重生的完整解决方案 引言 在使用 MySQL 的过程中,我们常常会遇到权限设置不当或丢失的问题,特别是在初次安装或配置更改后。这种权限困境的修复不仅复杂,而且往往是环环相扣&…

笔记 | image may have poor performance,or fail,if run via emulation

在Docker Desktop中现象如图: 当你运行 AMD64 平台代码时(Intel 和 AMD 芯),你的 Mac 必须模拟其CPU架构(因为你自身是ARM)。这通常会非常吃性能。 Docker Desktop 警告你在模拟 Intel/AMD x64 CPU 时性能可…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:C 个人主页:Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

【WebRTC】视频发送链路中类的简单分析(下)

目录 1.任务队列节流发送器(TaskQueuePacedSender)1.1 节流控制器添加RTP数据包(PacingController::EnqueuePacket())1.2 监测是否要处理Packet(PacingController::MaybeProcessPackets()) 2.数据包路由&am…

24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的,共有m个数据(x,x,...,x)。我们希望将这m个数据的维度从n维降到k维,希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表…

JS 实现SSE通讯和了解SSE通讯

SSE 介绍: Server-Sent Events(SSE)是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比,SSE提供了更高效和实时的数据推送机制。 SSE基于HTTP协议,允许服务器将数据以事件流(…

C/C++每日一练:查找链表的中间节点

链表(Linked List) 链表是一种线性数据结构,由一系列节点(Node)通过指针链接在一起。与数组不同,链表中的元素在内存中不需要连续存储,每个节点包含两部分: 数据部分:存…

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密:密码学的基石及 RSA 算法详解 在当今数字化的时代,信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术,为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…

PH47代码框架全局函数及功能类

PH47代码框架全局函数及功能类 概述 全局函数及功能类体系是PH47框架当中除了4个逻辑层之外最重要的组成部分之一,它们可以在 整个PH7 代码框架及用户代码中使用。常用全局函数及功能类为 PH7 代码框架提供了最常用和最基础的功能实现。 全局函数主要包含了对时间…

Spark 中的 RDD 分区的设定规则与高阶函数、Lambda 表达式详解

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

Spring学习笔记_30——事务接口PlatformTransactionManager

PlatformTransactionManager是Spring框架中事务管理的核心接口,它负责管理事务的创建、提交和回滚等操作。 源码 /** Copyright 2002-2020 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you m…

力扣 LeetCode 203. 移除链表元素(Day2:链表)

解题思路: 方法一:头节点和非头节点分开处理 方法二:定义一个dummy虚拟节点,后面的节点就可以采用相同的处理方式 注意: cur需要指向要删除的节点的上一个节点,因为要越过这一个被删除的节点 class Sol…

Python小游戏25——黄金矿工

首先,你需要安装Pygame库。 如果你还没有安装,可以使用以下命令进行安装: 【bash】 pip install pygame 【python】代码展示 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 60…