likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 49

前言

前面我们几乎实现了用户模块的所有路由接口,剩下的几个接口大同小异,都是获取id后对数据库进行对应的操作。我们再来看看总共有多少用户接口。

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

若有疑问,可到我的github仓库查看代码,有vue前端和node.js后端两个文件夹。后端所用到数据校验的模块是express-joi(中间件),以及一些名称与本系统不一致。其它基本一致。

角色模型实现

接下来我们再来进行角色模块。首先我们得明确本系统用户与角色的关系:一用户对多角色

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

接下来我们便可依此而建表。建立一个角色表,因为一对多的关系需要多建一个联结表来存储用户的角色信息。

建立数据表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles`  (
  `role_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `role_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称',
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
  `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态',
  `menu_ids` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '菜单ID',
  `buttons` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '权限标识',
  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`role_id`, `role_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
​
-- ----------------------------
-- Table structure for users_roles
-- ----------------------------
DROP TABLE IF EXISTS `users_roles`;
CREATE TABLE `users_roles`  (
  `user_role_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `role_id` int NOT NULL COMMENT '角色ID',
  `user_id` int NOT NULL COMMENT '用户ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`user_role_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
​
SET FOREIGN_KEY_CHECKS = 1;

首先我们可以看到数据库字段上的menu_ids以及buttons,这两个字段是为了实现权限管理添加权限而设置的。我们再看users_roles表可以通过user_id以及role_id建立联结

利用sequelize实现orm

还是和用户模型一样,通过sequelize的define方法一一映射数据库中两个表的字段,注意类型对应上即可。

model/roles.js

const Sequelize = require('sequelize');
const moment = require('moment');
const sequelize = require('./init');
​
// 定义表的模型
const RolesModel = sequelize.define('roles', {
  role_id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  role_name: {
    type: Sequelize.STRING(255)
  },
  remark: {
    type: Sequelize.STRING(255)
  },
  status: {
    type: Sequelize.TINYINT,
    defaultValue: 0
  },
  menu_ids: {
    type: Sequelize.TEXT,
    set(val) {
      this.setDataValue('menu_ids', val && val.length > 0 ? JSON.stringify(val) : JSON.stringify([]));
    },
    get() {
      return this.getDataValue('menu_ids') ? JSON.parse(this.getDataValue('menu_ids')) : [];
    }
  },
  buttons: {
    type: Sequelize.TEXT,
    set(val) {
      this.setDataValue('buttons', val && val.length > 0 ? JSON.stringify(val) : JSON.stringify([]));
    },
    get() {
      return this.getDataValue('buttons') ? JSON.parse(this.getDataValue('buttons')) : [];
    }
  },
  update_time: {
    type: Sequelize.DATE,
    get() {
      return this.getDataValue('update_time')
        ? moment(this.getDataValue('update_time')).format('YYYY-MM-DD HH:mm:ss')
        : null;
    }
  },
  create_time: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
    get() {
      return moment(this.getDataValue('create_time')).format('YYYY-MM-DD HH:mm:ss');
    }
  }
});
​
module.exports = RolesModel;

model/users_roles.js

const Sequelize = require('sequelize')
const moment = require('moment')
const sequelize = require('./init')
​
// 定义表的模型
const UsresRolesModel = sequelize.define('users_roles', {
  user_role_id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  role_id: {
    type: Sequelize.INTEGER
  },
  user_id: {
    type: Sequelize.INTEGER
  },
  create_time: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
    get() {
      return moment(this.getDataValue('create_time')).format('YYYY-MM-DD HH:mm:ss')
    }
  }
})
​
module.exports = UsresRolesModel

建立联结

但我们要怎么在三个模型(用户模型、角色模型、用户角色模型)之间建立联结呢。我们可以在sequelize中文文档中看到有很多定义二者关系的方法。而我们的用户是属于多个角色的,通过用户角色模型来联结。所以我们用belongsToMany方法。

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

model/user.js

// 导入角色模型
const RolesModel = require('./roles');
// 导入用户角色模型
const UsersRolesModel = require('./users-roles');
...
UsersModel.belongsToMany(RolesModel, {
  through: {
    model: UsersRolesModel
  },
  foreignKey: 'user_id',
  otherKey: 'role_id'
});
​
module.exports=UsersModel

这样就建立好了联结关系。

但是,我们之前的用户接口中,是不是都没有建立与角色信息的关联。所以我们将在下文改造接口来进行关联。

转载自:https://juejin.cn/post/7172001041125212191
评论
请登录