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

model层实现

文件创建

在models文件夹下创建user.js

代码实现

javascript 复制代码
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

代码实现

javascript 复制代码
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

代码实现

javascript 复制代码
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

代码实现

javascript 复制代码
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

模块主路由设置。

javascript 复制代码
const router = new Router({ prefix: '/user' })  

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

启动文件补充

javascript 复制代码
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}`)
})
相关推荐
uhakadotcom1 小时前
使用postgresql时有哪些简单有用的最佳实践
后端·面试·github
IT毕设实战小研1 小时前
基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序
java·数据库·vue.js·spring boot·后端·小程序·课程设计
bobz9651 小时前
QT 字体
后端
泉城老铁1 小时前
Spring Boot 中根据 Word 模板导出包含表格、图表等复杂格式的文档
java·后端
用户4099322502121 小时前
如何在FastAPI中玩转APScheduler,实现动态定时任务的魔法?
后端·github·trae
风象南1 小时前
开发者必备工具:用 SpringBoot 构建轻量级日志查看器,省时又省力
后端
RainbowSea1 小时前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 04
java·spring boot·后端
楽码2 小时前
理解自动修复:编程语言的底层逻辑
后端·算法·编程语言
丁满与彭彭2 小时前
嵌入式学习笔记--MCU阶段--DAY12实时操作系统rt_thread1
笔记·学习
RainbowSea2 小时前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 03
java·spring boot·后端