明树Git Lab

Commit dd3436a3 authored by zfp1's avatar zfp1

update

parent ead0be59
const errorMessage = require("../utils/errorMessage");
const { Op } = require('sequelize');
async function createMenu(req, res, next) {
try {
const body = req.body;
if (body.parentId) {
//查父节点
let parendNode = await DB.Menu.findOne({ where: { id: body.parentId }, raw: true, attributes: ['parentIds'] });
if (!parendNode) {
return res.sendError(errorMessage.resourceNotFound);
}
if (parendNode.parentIds) {
body.parentIds = parendNode.parentIds + "," + String(body.parentId);
} else {
body.parentIds = String(body.parentId);
}
}
const ret = await DB.Menu.create(body);
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function updateMenu(req, res, next) {
try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
// sequelize 只有update 写时需要注意条件 不能为空
const ret = await DB.Menu.update(body, { where: { id: body.id } });
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function listMenu(req, res, next) {
try {
let search = { where: { del: 0 } };
let page = req.body.page || 1;
let limit = req.body.pageSize || 10;
let offset = (page - 1) * limit;
if (req.body.name) {
search.where = {
[Op.or]: [
{ name: { [Op.like]: `%${req.body.name}%` } }
],
del: 0,
}
}
search.limit = limit;
search.offset = offset;
let ret = await DB.Menu.findAndCountAll(search);
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function treeMenu(req, res, next) {
try {
let nodes = await DB.Menu.findAll({ where: { del: 0 }, raw: true });
let tree = utils.buildTree(nodes);
return res.sendData(tree);
} catch (error) {
next(error);
}
}
/**
*
* 删除菜单,则此菜单所有子菜单借删除
*/
async function deleteMenu(req, res, next) {
try {
if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound);
}
let curNode = await DB.Menu.findOne({ where: { id: req.body.id } });
if (!(curNode && curNode.id)) {
return res.sendError(errorMessage.resourceNotFound);
}
let parStr = curNode.parentIds ? `${curNode.parentIds},${curNode.id}` : curNode.id;
const ret = await DB.Menu.update(
{ del: 1 },
{
where: {
[Op.or]: [
{ parentIds: { [Op.startsWith]: parStr } },
{ id: curNode.id }
]
}
});
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function getMenu(req, res, next) {
try {
if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound);
}
const ret = await DB.User.findOne({ where: { id: req.body.id }, raw: true });
return res.sendData(ret);
} catch (error) {
next(error);
}
}
module.exports = {
createMenu,
getMenu,
listMenu,
updateMenu,
deleteMenu,
treeMenu,
}
\ No newline at end of file
...@@ -38,7 +38,7 @@ async function deleteRole(req, res, next) { ...@@ -38,7 +38,7 @@ async function deleteRole(req, res, next) {
async function listRole(req, res, next) { async function listRole(req, res, next) {
try { try {
let search = {}; let search = {where: {del: 0}};
let page = req.body.page || 1; let page = req.body.page || 1;
let limit = req.body.pageSize || 10; let limit = req.body.pageSize || 10;
let offset = (page - 1) * limit; let offset = (page - 1) * limit;
...@@ -72,11 +72,46 @@ async function getRole(req, res, next) { ...@@ -72,11 +72,46 @@ async function getRole(req, res, next) {
} }
async function setRoleMenu(req, res, next) {
try {
const {roleId, menuIds} = req.body;
if(!roleId) {
return res.sendError(errorMessage.resourceNotFound);
}
const rolemenus = await DB.RoleMenu.findAll({where: {roleId: roleId}, raw: true});
let needAddIds = [], needDelIds = [], dbMenuIds = [];
for (let index = 0; index < rolemenus.length; index++) {
const element = rolemenus[index];
dbMenuIds.push(element.menuId);
if(!(menuIds.includes(element.menuId))) {
needDelIds.push(element.menuId);
}
}
for (let index = 0; index < menuIds.length; index++) {
const element = menuIds[index];
if(!(dbMenuIds.includes(element))) {
needAddIds.push(element);
}
}
if(needAddIds.length) {
let objs = needAddIds.map(o => {return {roleId, menuId: o}});
await DB.RoleMenu.bulkCreate(objs);
}
if(needDelIds.length) {
await DB.RoleMenu.destroy({where: {roleId, menuId: {[Op.in]: needDelIds}}});
}
return res.sendData();
} catch (error) {
next(error);
}
}
module.exports = { module.exports = {
getRole, getRole,
createRole, createRole,
listRole, listRole,
updateRole, updateRole,
deleteRole deleteRole,
setRoleMenu,
} }
\ No newline at end of file
...@@ -31,12 +31,20 @@ async function login(req, res, next) { ...@@ -31,12 +31,20 @@ async function login(req, res, next) {
const { mobile, password } = req.body; const { mobile, password } = req.body;
let user = await DB.User.findOne({ let user = await DB.User.findOne({
where: { mobile, del: 0, enable: 0 }, where: { mobile, del: 0, enable: 0 },
include: { include: [{
model: DB.Role, model: DB.Role,
as: 'roles', as: 'roles',
where: { del: 0 }, where: { del: 0 },
attributes: {exclude: ['system_user_role']} attributes: ["id", "name"],
} through: { attributes: [] },
include: [{
model: DB.Menu,
as: 'menus',
// where: { del: 0 },
// attributes: ['id', 'name', 'parentId'],
through: { attributes: [] },
}]
}]
}); });
user = user.toJSON(); user = user.toJSON();
if (!user) { if (!user) {
...@@ -56,11 +64,20 @@ async function login(req, res, next) { ...@@ -56,11 +64,20 @@ async function login(req, res, next) {
user.token = token.split('-').join(""); user.token = token.split('-').join("");
let userStr = JSON.stringify(user); let userStr = JSON.stringify(user);
await ioRedis.set(`token:${user.token}`, userStr, 'EX', sysConfig.tokenEx); await ioRedis.set(`token:${user.token}`, userStr, 'EX', sysConfig.tokenEx);
let ret = _.omit(user, ['password', 'salt']); user = _.omit(user, ['password', 'salt']);
// let menus = await userModule.getRoleMenus(ret.roles, user.mobile); //处理菜单
// ret.menus = menus; const roles = user.roles || [];
return res.sendData(ret); let newRoles = [], menus = [];
for (let index = 0; index < roles.length; index++) {
const element = roles[index];
menus = menus.concat(element.menus);
delete element.menus;
newRoles.push(element);
}
user.roles = roles || [];
user.menus = utils.buildTree(menus);
return res.sendData(user);
} catch (error) { } catch (error) {
next(error); next(error);
} }
...@@ -127,7 +144,7 @@ async function updateUser(req, res, next) { ...@@ -127,7 +144,7 @@ async function updateUser(req, res, next) {
async function listUser(req, res, next) { async function listUser(req, res, next) {
try { try {
let search = {}; let search = { where: { del: 0 } };
let page = req.body.page || 1; let page = req.body.page || 1;
let limit = req.body.pageSize || 10; let limit = req.body.pageSize || 10;
let offset = (page - 1) * limit; let offset = (page - 1) * limit;
...@@ -175,15 +192,15 @@ async function setUserRole(req, res, next) { ...@@ -175,15 +192,15 @@ async function setUserRole(req, res, next) {
try { try {
let { userId, roleIds } = req.body; let { userId, roleIds } = req.body;
//1. 先查被设置用户 有什么角色 //1. 先查被设置用户 有什么角色
const roles = await DB.UserRole.findAll({ where: { user_id: req.body.userId }, raw: true, attributes: ['role_id', 'user_id'] }); const roles = await DB.UserRole.findAll({ where: { userId: req.body.userId }, raw: true, attributes: ['roleId', 'userId'] });
//需新增得 //需新增得
let dbRoleIds = [], needAddRoleIds = [], needDelRoleIds = []; let dbRoleIds = [], needAddRoleIds = [], needDelRoleIds = [];
for (let index = 0; index < roles.length; index++) { for (let index = 0; index < roles.length; index++) {
const element = roles[index]; const element = roles[index];
dbRoleIds.push(element.role_id); dbRoleIds.push(element.roleId);
if (!roleIds.includes(element.role_id)) { if (!roleIds.includes(element.roleId)) {
// 1. roleIds里面没有 但是关系表里有的 需要删除 // 1. roleIds里面没有 但是关系表里有的 需要删除
needDelRoleIds.push(element.role_id); needDelRoleIds.push(element.roleId);
} }
} }
for (let index = 0; index < roleIds.length; index++) { for (let index = 0; index < roleIds.length; index++) {
...@@ -193,11 +210,11 @@ async function setUserRole(req, res, next) { ...@@ -193,11 +210,11 @@ async function setUserRole(req, res, next) {
} }
} }
if (needAddRoleIds.length) { if (needAddRoleIds.length) {
let objs = needAddRoleIds.map(o => { return { user_id: userId, role_id: o } }); let objs = needAddRoleIds.map(o => { return { userId: userId, roleId: o } });
await DB.UserRole.bulkCreate(objs); await DB.UserRole.bulkCreate(objs);
} }
if (needDelRoleIds.length) { if (needDelRoleIds.length) {
await DB.UserRole.destroy({ where: { user_id: userId, role_id: { [Op.in]: needDelRoleIds } } }); await DB.UserRole.destroy({ where: { userId: userId, roleId: { [Op.in]: needDelRoleIds } } });
} }
return res.sendData(); return res.sendData();
} catch (error) { } catch (error) {
......
...@@ -14,6 +14,7 @@ global.DB = { ...@@ -14,6 +14,7 @@ global.DB = {
RequestLog, RequestLog,
Role, Role,
UserRole, UserRole,
Menu,
RoleMenu, RoleMenu,
} }
...@@ -23,32 +24,33 @@ global.DB = { ...@@ -23,32 +24,33 @@ global.DB = {
/** /**
* 关联关系定义 * 关联关系定义
*/ */
User.hasMany(RequestLog, { foreignKey: 'user_id' }); User.hasMany(RequestLog, { foreignKey: 'userId' });
RequestLog.belongsTo(User, { foreignKey: 'user_id' }); RequestLog.belongsTo(User, { foreignKey: 'userId' });
User.belongsToMany(Role, { User.belongsToMany(Role, {
through: 'system_user_role', // 中间表名 through: 'system_user_role', // 中间表名
foreignKey: 'user_id', // 用户ID外键 foreignKey: 'userId', // 用户ID外键
otherKey: 'role_id', // 角色ID外键 otherKey: 'roleId', // 角色ID外键
as: 'roles', as: 'roles',
}); });
Role.belongsToMany(User, { Role.belongsToMany(User, {
through: 'system_user_role', through: 'system_user_role',
foreignKey: 'role_id', foreignKey: 'roleId',
otherKey: 'user_id', otherKey: 'userId',
as: 'users' as: 'users'
}); });
Role.belongsToMany(Menu, { Role.belongsToMany(Menu, {
through: 'systen_role_menu', through: 'system_role_menu',
foreignKey: 'role_id', foreignKey: 'roleId',
otherKey: 'menu_id' otherKey: 'menuId',
as: 'menus'
}); });
Menu.belongsToMany(Role, { Menu.belongsToMany(Role, {
through: 'systen_role_menu', through: 'system_role_menu',
foreignKey: 'menu_id', foreignKey: 'menuId',
otherKey: 'role_id' otherKey: 'roleId'
}); });
...@@ -16,13 +16,11 @@ const Menu = sequelize.define('Menu', { ...@@ -16,13 +16,11 @@ const Menu = sequelize.define('Menu', {
level: DataTypes.INTEGER, level: DataTypes.INTEGER,
url: { url: {
type: DataTypes.STRING, type: DataTypes.STRING,
unique: true, comment: "地址"
comment: "菜单唯一标识"
}, },
key: { key: {
type: DataTypes.STRING, type: DataTypes.STRING,
unique: true, comment: "唯一标识",
comment: "按钮唯一标识",
}, },
order: { order: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
...@@ -30,24 +28,31 @@ const Menu = sequelize.define('Menu', { ...@@ -30,24 +28,31 @@ const Menu = sequelize.define('Menu', {
}, },
parent_id: { parentId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
default: null, default: null,
}, },
parentIds: {
type: DataTypes.STRING(500),
default: "",
},
type: { type: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
comment: "类型: 1. 菜单, 2. 按钮", comment: "类型: 1. 菜单, 2. 按钮",
default: 1 default: 1
}, },
enable: { // enable: {
type: DataTypes.BOOLEAN, // type: DataTypes.INTEGER,
defaultValue: true, // defaultValue: 0,
comment: "true: 启用, false: 不启用" // comment: "0: 启用, 1: 不启用"
// },
del: {
type: DataTypes.INTEGER,
defaultValue: 0,
comment: "0 正常 1 删除"
}, },
}, { }, {
tableName: 'system_menu', // 指定表名(如果与模型名不同) tableName: 'system_menu', // 指定表名(如果与模型名不同)
timestamps: true, // 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置) timestamps: true, // 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
...@@ -55,7 +60,7 @@ const Menu = sequelize.define('Menu', { ...@@ -55,7 +60,7 @@ const Menu = sequelize.define('Menu', {
// 同步模型到数据库(创建表) // 同步模型到数据库(创建表)
Menu.sync({ Menu.sync({
force: false, // force: true 会删除已存在表并重新创建 // force: false, // force: true 会删除已存在表并重新创建
// alter: true // alter: true
}) })
.then(() => { .then(() => {
......
...@@ -13,7 +13,7 @@ const RequestLog = sequelize.define('User', { ...@@ -13,7 +13,7 @@ const RequestLog = sequelize.define('User', {
type: DataTypes.STRING, type: DataTypes.STRING,
comment: "给每一个请求分配一个id" comment: "给每一个请求分配一个id"
}, },
user_id: { userId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
comment:"关联查询用" comment:"关联查询用"
}, },
......
...@@ -35,7 +35,7 @@ const Role = sequelize.define('Role', { ...@@ -35,7 +35,7 @@ const Role = sequelize.define('Role', {
// 同步模型到数据库(创建表) // 同步模型到数据库(创建表)
Role.sync({ Role.sync({
// force: false, // force: true 会删除已存在表并重新创建 // force: false, // force: true 会删除已存在表并重新创建
alter: true // alter: true
}) })
.then(() => { .then(() => {
console.log('Role 表同步成功'); console.log('Role 表同步成功');
......
...@@ -11,11 +11,11 @@ const RoleMenu = sequelize.define('RoleMenu', { ...@@ -11,11 +11,11 @@ const RoleMenu = sequelize.define('RoleMenu', {
primaryKey: true, primaryKey: true,
autoIncrement: true autoIncrement: true
}, },
menu_id: { menuId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
references: { model: Menu, key: 'id' } references: { model: Menu, key: 'id' }
}, },
role_id: { roleId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
references: { model: Role, key: 'id' } references: { model: Role, key: 'id' }
} }
...@@ -27,7 +27,7 @@ const RoleMenu = sequelize.define('RoleMenu', { ...@@ -27,7 +27,7 @@ const RoleMenu = sequelize.define('RoleMenu', {
// 同步模型到数据库(创建表) // 同步模型到数据库(创建表)
RoleMenu.sync({ RoleMenu.sync({
// force: false, // force: true 会删除已存在表并重新创建 // force: false, // force: true 会删除已存在表并重新创建
// alter: true alter: true
}) })
.then(() => { .then(() => {
console.log('RoleMenu 表同步成功'); console.log('RoleMenu 表同步成功');
......
...@@ -11,11 +11,11 @@ const UserRole = sequelize.define('UserRole', { ...@@ -11,11 +11,11 @@ const UserRole = sequelize.define('UserRole', {
primaryKey: true, primaryKey: true,
autoIncrement: true autoIncrement: true
}, },
user_id: { userId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
references: { model: User, key: 'id' } references: { model: User, key: 'id' }
}, },
role_id: { roleId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
references: { model: Role, key: 'id' } references: { model: Role, key: 'id' }
} }
......
const express = require('express');
const router = express.Router();
const userController = require('../controller/userController');
router.post('/regist', userController.regist);
router.post('/login', userController.login);
\ No newline at end of file
...@@ -5,8 +5,11 @@ const router = express.Router(); ...@@ -5,8 +5,11 @@ const router = express.Router();
const userController = require('../controller/userController'); const userController = require('../controller/userController');
const roleController = require('../controller/roleController'); const roleController = require('../controller/roleController');
const menuController = require('../controller/menuController');
/**
* 用户
*/
router.post('/regist', userController.regist); router.post('/regist', userController.regist);
router.post('/login', userController.login); router.post('/login', userController.login);
router.post('/manage/listUser', userController.listUser); router.post('/manage/listUser', userController.listUser);
...@@ -26,9 +29,17 @@ router.post('/role/updateRole', roleController.updateRole); ...@@ -26,9 +29,17 @@ router.post('/role/updateRole', roleController.updateRole);
router.post('/role/deleteRole', roleController.deleteRole); router.post('/role/deleteRole', roleController.deleteRole);
router.post('/role/listRole', roleController.listRole); router.post('/role/listRole', roleController.listRole);
router.post('/role/getRole', roleController.getRole); router.post('/role/getRole', roleController.getRole);
router.post('/role/setRoleMenu', roleController.setRoleMenu);
/**
* 菜单
*/
router.post('/menu/createMenu', menuController.createMenu);
router.post('/menu/updateMenu', menuController.updateMenu);
router.post('/menu/deleteMenu', menuController.deleteMenu);
router.post('/menu/listMenu', menuController.listMenu);
router.post('/menu/treeMenu', menuController.treeMenu);
router.post('/menu/getMenu', menuController.getMenu);
module.exports = router; module.exports = router;
\ No newline at end of file
...@@ -50,7 +50,7 @@ app.use(function(req, res, next) { ...@@ -50,7 +50,7 @@ app.use(function(req, res, next) {
// error handler // error handler
app.use(function (err, req, res, next) { app.use(function (err, req, res, next) {
console.log(err.code, err.status) console.log(err)
// 记录下错误日志 // 记录下错误日志
// requestLogModule.createRequestLog({ // requestLogModule.createRequestLog({
// url: req.path, // url: req.path,
......
...@@ -30,23 +30,23 @@ function checkUserPassword({ reqPw, salt, userPw }) { ...@@ -30,23 +30,23 @@ function checkUserPassword({ reqPw, salt, userPw }) {
function buildTree(nodes) { function buildTree(nodes) {
// 创建一个映射,将节点ID映射到节点对象 // 创建一个映射,将节点ID映射到节点对象
const nodeMap = new Map(nodes.map(node => [String(node._id), { ...node, children: [] }])); const nodeMap = new Map(nodes.map(node => [String(node.id), { ...node, children: [] }]));
// 遍历所有节点,并将它们添加到对应父节点的children数组中 // 遍历所有节点,并将它们添加到对应父节点的children数组中
nodes.forEach(node => { nodes.forEach(node => {
const parent_id = String(node.parent_id); const parentId = String(node.parentId);
if (parent_id !== null) { if (parentId !== null) {
// 确保父节点在映射中存在 // 确保父节点在映射中存在
if (nodeMap.has(parent_id)) { if (nodeMap.has(parentId)) {
// 将当前节点添加到父节点的children数组中 // 将当前节点添加到父节点的children数组中
nodeMap.get(parent_id).children.push(nodeMap.get(String(node._id))); nodeMap.get(parentId).children.push(nodeMap.get(String(node.id)));
nodeMap.get(parent_id).children = _.orderBy(nodeMap.get(parent_id).children, 'order') nodeMap.get(parentId).children = _.orderBy(nodeMap.get(parentId).children, 'order')
} }
} }
}); });
// 从映射中提取顶级节点(parent_id为null) // 从映射中提取顶级节点(parentId为null)
return _.orderBy(Array.from(nodeMap.values()).filter(node => node.parent_id === null), 'order'); return _.orderBy(Array.from(nodeMap.values()).filter(node => node.parentId === null), 'order');
} }
function disTree(tree) { function disTree(tree) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment