后端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}`)
})
相关推荐
向前看-1 小时前
验证码机制
前端·后端
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__3 小时前
Web APIs学习 (操作DOM BOM)
学习
AskHarries4 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
理想不理想v5 小时前
webpack最基础的配置
前端·webpack·node.js
数据的世界015 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐5 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
isolusion5 小时前
Springboot的创建方式
java·spring boot·后端