手把手教你实现一个vue3+ts+nodeJS后台管理系统(十)

329 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

前言

改造完用户接口后,我们继续来进行角色模块的接口编写。大体上需要的接口有增删改查角色、获取角色列表等。其中会与用户角色表有关联的接口只有删除角色接口,其它增改查不涉及对角色id的修改。所以我们本文着重来写一下增、删角色接口,其它与用户模块的接口大同小异,大家可以参考着写。

添加角色接口

添加角色的接口逻辑比较简单。还是校验入参然后数据入库的流程。

校验入参规则

schema/role.js

const joi = require('joi');
/**
 * string() 值必须是字符串
 * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
 * min(length) 最小长度
 * max(length) 最大长度
 * required() 值是必填项,不能为 undefined
 * pattern(正则表达式) 值必须符合正则表达式的规则
 */
// 角色名的校验规则
const role_name = joi.string().min(1).max(10).required();
// 定义 id, nickname, emial 的验证规则
const role_id = joi.number().integer().min(0).required();
const remark = joi.string();
const status = joi.number().valid(0, 1);
// 角色id数组
const role_ids = joi.array().items(joi.number()).required();
// 分页参数
const pageSize = joi.number().required();
const currentPage = joi.number().required();
​
// 添加角色的验证规则对象
exports.add_role_schema = joi.object().keys({
  // 对res.body对象进行验证
  role_name,
  remark,
  status
});
// 获取角色列表的验证规则对象
exports.get_role_list_schema = joi.object().keys({
  pageSize,
  currentPage,
  role_name: joi.string().min(1).max(10)
});
// 修改角色的验证规则对象
exports.edit_role_schema = joi.object().keys({
  role_name,
  remark,
  status
});
// 删除角色的验证规则对象
exports.delete_role_schema = joi.object().keys({
  role_ids
});
// 获取单角色的验证规则对象
exports.get_role_schema = joi.object().keys({
  // 对query参数进行验证
  role_id
});

路由

router/role.js

const express = require('express');
// 创建路由对象
const router = express.Router();
const roleHandler = require('../router_handler/role');
​
// 添加角色
router.post('/addRole', roleHandler.addRole);

路由回调

const RoleModel = require('../model/roles');
// 导入需要的验证规则对象
const {
  get_role_list_schema,
  add_role_schema,
  edit_role_schema,
  delete_role_schema,
  get_role_schema
} = require('../schema/role');
​
// 添加角色接口
exports.addRole = (req, res) => {
  const { value, error } = add_role_schema.validate(req.body);
  if (error) throw error;
  RoleModel.create(value).then(function (role) {
    if (!role) {
      return res.send({
        code: 1,
        message: '创建失败',
        data: null
      });
    }
    return res.send({
      code: 0,
      message: '创建成功',
      data: role
    });
  });
};

删除角色接口

删除角色的接口的实现步骤如下:

  1. 校验是否有角色id数组
  2. 获取要删除的角色id数组
  3. 删除对应角色表中角色id数组的角色id
  4. 对用户角色表中的含角色id的记录进行删除

所以我们先在角色模型中定义好删除的方法,再进行路由的编写。

model/role.js

这里我们还是采用事务的写法,有异常即回滚。

const UsersRolesModel = require('./users-roles');
...
const RolesModel=sequelize.define(...)
// 删除角色的方法
RolesModel.delRole = async function (role_ids) {
  const t = await sequelize.transaction();
  try {
    // 删除角色表中角色id数组的角色
    await RolesModel.destroy({
      where: { role_id: role_ids }
    });
    // 删除用户角色表中角色id数组的角色记录
    await UsersRolesModel.destroy({
      where: { role_id: role_ids }
    });
    t.commit();
    return true;
  } catch (e) {
    t.rollback();
    return false;
  }
};
...

路由

router/role.js

// 删除角色
router.post('/delRole', roleHandler.deleteRole);

路由回调

router_handler/role.js

// 删除角色接口
exports.deleteRole = (req, res) => {
  const { value, error } = delete_role_schema.validate(req.body);
  if (error) throw error;
  const role_ids = value.role_ids;
  // 对应角色id数组进行删除
  RoleModel.delRole(role_ids || []).then(function (role) {
    if (role !== true) {
      return res.send({
        code: 1,
        message: '删除失败',
        data: null
      });
    }
    return res.send({
      code: 0,
      message: '删除成功',
      data: role
    });
  });
};

测试

  1. 在主文件中添加角色模块 app.js

    ...
    app.use('/user',userRouter)
    // 导入并注册用户角色模块
    const roleRouter = require('./router/role');
    app.use('/user/role', roleRouter);
    ...
    
  2. 添加角色路由测试

image.png

  1. 删除角色路由测试

image.png

那么我们角色模块到这里就完成了,剩下的接口大家可以自行对应用户模块的写法自行完成。最后附上所有路由。

image.png