手把手教你实现一个vue3+ts+nodeJS后台管理系统(八)
前言
前面我们几乎实现了用户模块的所有路由接口,剩下的几个接口大同小异,都是获取id后对数据库进行对应的操作。我们再来看看总共有多少用户接口。
若有疑问,可到我的github仓库查看代码,有vue前端和node.js后端两个文件夹。后端所用到数据校验的模块是express-joi(中间件),以及一些名称与本系统不一致。其它基本一致。
角色模型实现
接下来我们再来进行角色模块。首先我们得明确本系统用户与角色的关系:一用户对多角色
接下来我们便可依此而建表。建立一个角色表,因为一对多的关系需要多建一个联结表来存储用户的角色信息。
建立数据表
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方法。
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