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

后端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.query
    const 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.body
    try {
      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.body
    try {
      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.body
    try {
      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.kler.cn/a/396812.html

相关文章:

  • 网络安全之WINDOWS端口及病毒编写
  • C++map和set(二)
  • 数据分析-48-时间序列变点检测之在线实时数据的CPD
  • 【Qt实现虚拟键盘】
  • vue 获取摄像头拍照,并旋转、裁剪生成新的图片
  • 直流保护电路设计及保护器件参数说明和选型
  • 开源共建 | 长安链开发常见问题及规避
  • Apache Spark Paimon Meetup · 北京站,助力 LakeHouse 架构生产落地
  • 使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行
  • 渗透测试之信息收集 DNS主机发现探测方式NetBIOS 协议发现主机 以及相关PorCheck scanline工具的使用哟
  • Spring Boot 核心配置文件
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.3:将AVFrame转换成AVPacket.封装。代码改动
  • 深入理解 MySQL 大小写敏感性:配置、问题与实践指南20241115
  • 每日小题--买股票的最佳时机
  • vue2.x elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局
  • flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例
  • 基于Java Springboot图书馆管理系统
  • (一)- DRM架构
  • 微信小程序设置屏幕安全距离
  • 表单自动化填写-JavaScript脚本
  • TypeORM在Node.js中的高级应用
  • 深度学习的核心思想
  • 【freertos】FreeRTOS时间管理
  • 代码随想录算法训练营第三十一天| 56. 合并区间 、738.单调递增的数字 。c++转java
  • 右键添加获取可供WSL使用的路径,对windows文件夹也适用,即获取符合Linux规范的路径内容给WSL
  • 搭建高效稳定的ChatGPT网络环境:从网络专线到IP地址管理的全流程解析