rbac主要是用來存放權限的,全稱叫作基於角色權限控制mysql
CREATE TABLE `role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色id',
`name` varchar(255) DEFAULT NULL COMMENT '標題',
`status` int(1) DEFAULT '1' COMMENT '0:不可用,1:可用',
`created_at` datetime DEFAULT NULL COMMENT '建立時間',
`updated_at` datetime DEFAULT NULL COMMENT '更改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `title` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色';
複製代碼
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id',
`username` varchar(255) DEFAULT NULL COMMENT '用戶名',
`password` varchar(255) DEFAULT NULL COMMENT '用戶密碼',
`created_at` datetime DEFAULT NULL COMMENT '建立時間',
`updated_at` datetime DEFAULT NULL COMMENT '更改時間',
`role_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';
複製代碼
CREATE TABLE `permission` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '權限id',
`title` varchar(255) DEFAULT NULL COMMENT '標題',
`url` varchar(255) DEFAULT NULL COMMENT '鏈接地址',
`status` int(1) DEFAULT '1' COMMENT '0:不可用,1:可用',
`created_at` datetime DEFAULT NULL COMMENT '建立時間',
`updated_at` datetime DEFAULT NULL COMMENT '更改時間',
`permission_id` int(11) DEFAULT NULL COMMENT '當前表id',
PRIMARY KEY (`id`),
UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='權限';
複製代碼
CREATE TABLE `role_permission` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色權限id',
`role_id` int(11) DEFAULT NULL COMMENT '角色id',
`permission_id` int(11) DEFAULT NULL COMMENT '權限id',
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB ENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='角色權限多對多';
複製代碼
egg-init egg-rbac --type=simple
cd egg-example
cnpm install
複製代碼
cnpm install egg-sequelize mysql2 egg-view-ejs --save
複製代碼
config\plugin.jssql
module.exports = {
ejs: {
enable: true,
package: 'egg-view-ejs',
},
sequelize: {
enable: true,
package: 'egg-sequelize',
},
};
複製代碼
config\config.default.js數據庫
config.sequelize = {
dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
dialectOptions: {
charset: 'utf8mb4',
},
database: 'eggrbac',
host: 'localhost',
port: '3306',
username: 'root',
password: '123456',
timezone: '+08:00',
};
複製代碼
由於查找role的時候,想要知道這個role下面有多少個user,因此npm
app.model.Role.hasMany(app.model.User, { as: 'user' });
複製代碼
app\model\role.jsbash
'use strict';
module.exports = app => {
const { INTEGER, STRING, DATE } = app.Sequelize;
const Role = app.model.define('role', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
name: {
type: STRING,
},
status: {
type: INTEGER,
},
created_at: DATE,
updated_at: DATE,
}, {
freezeTableName: true,
});
Role.associate = function() {
app.model.Role.hasMany(app.model.User, { as: 'user' });
};
return Role;
};
複製代碼
由於查找user的時候,想要知道這個user歸屬於哪個role,因此app
app.model.User.belongsTo(app.model.Role, { as: 'role' });
複製代碼
app\model\user.jsasync
'use strict';
module.exports = app => {
const { INTEGER, STRING, DATE } = app.Sequelize;
const User = app.model.define('user', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
username: {
type: STRING,
},
password: {
type: STRING,
},
created_at: DATE,
updated_at: DATE,
role_id: {
type: INTEGER,
},
}, {
freezeTableName: true,
});
User.associate = function() {
app.model.User.belongsTo(app.model.Role, { as: 'role' });
};
return User;
};
複製代碼
自關聯查詢,因此post
app.model.Permission.belongsTo(app.model.Permission, { as: 'permissions', foreignKey: 'permission_id' });
複製代碼
app\model\permission.js測試
'use strict';
module.exports = app => {
const { INTEGER, STRING, DATE } = app.Sequelize;
const Permission = app.model.define('permission', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
title: {
type: STRING,
},
url: {
type: STRING,
},
status: {
type: INTEGER,
},
created_at: DATE,
updated_at: DATE,
permission_id: {
type: INTEGER,
},
}, {
freezeTableName: true,
});
Permission.associate = function() {
app.model.Permission.belongsTo(app.model.Permission, { as: 'permissions', foreignKey: 'permission_id' });
};
return Permission;
};
複製代碼
查詢role_id,permission_id歸屬,因此ui
app.model.RolePermission.belongsTo(app.model.Role, { as: 'role' });
app.model.RolePermission.belongsTo(app.model.Permission, { as: 'permission' });
複製代碼
app\model\role_permission.js
'use strict';
module.exports = app => {
const { INTEGER, STRING, DATE } = app.Sequelize;
const RolePermission = app.model.define('role_permission', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
role_id: {
type: INTEGER,
},
permission_id: {
type: INTEGER,
},
created_at: DATE,
updated_at: DATE,
}, {
freezeTableName: true,
});
RolePermission.associate = function() {
app.model.RolePermission.belongsTo(app.model.Role, { as: 'role' });
app.model.RolePermission.belongsTo(app.model.Permission, { as: 'permission' });
};
return RolePermission;
};
複製代碼
app\controller\home.js
async index() {
const { ctx } = this;
const data = await ctx.model.Role.findAll();
ctx.body = data;
}
複製代碼