明树Git Lab

Commit 0ea7df3f authored by zengfanpei's avatar zengfanpei

update

parent 17403af0
...@@ -78,14 +78,14 @@ async function listMenu(req, res, next) { ...@@ -78,14 +78,14 @@ async function listMenu(req, res, next) {
async function treeMenu(req, res, next) { async function treeMenu(req, res, next) {
try { try {
let nodes = await DB.Menu.find({del: 0}).lean().exec(); let nodes = await DB.Menu.find({del: 0}).lean().exec();
let buttons = await DB.Button.find({del: 0}).select('name key menuId').lean().exec(); // let buttons = await DB.Button.find({del: 0}).select('name key menuId').lean().exec();
let buttonMap = {}; // let buttonMap = {};
for (let index = 0; index < buttons.length; index++) { // for (let index = 0; index < buttons.length; index++) {
const element = buttons[index]; // const element = buttons[index];
buttonMap[element.menuId] = buttonMap[element.menuId] || []; // buttonMap[element.menuId] = buttonMap[element.menuId] || [];
buttonMap[element.menuId].push(element); // buttonMap[element.menuId].push(element);
} // }
nodes = nodes.map(o => {o.buttons = buttonMap[o._id]; return o}) // nodes = nodes.map(o => {o.buttons = buttonMap[o._id]; return o})
const tree = utils.buildTree(nodes); const tree = utils.buildTree(nodes);
res.sendData(tree); res.sendData(tree);
} catch (error) { } catch (error) {
...@@ -119,28 +119,28 @@ async function treeMenu(req, res, next) { ...@@ -119,28 +119,28 @@ async function treeMenu(req, res, next) {
/**----------------------按钮---------------------------- */ /**----------------------按钮---------------------------- */
async function createButton(req, res, next) { // async function createButton(req, res, next) {
try { // try {
let ret = await DB.Button.create(req.body); // let ret = await DB.Button.create(req.body);
res.sendData(ret); // res.sendData(ret);
} catch (error) { // } catch (error) {
next(error) // next(error)
} // }
} // }
async function updateButton(req, res, next) { // async function updateButton(req, res, next) {
try { // try {
let updateObj = { // let updateObj = {
...req.body, // ...req.body,
_id: undefined, // _id: undefined,
createdAt: undefined, // createdAt: undefined,
updatedAt: undefined, // updatedAt: undefined,
} // }
let ret = await DB.Button.findOneAndUpdate({ _id: req.body._id }, updateObj); // let ret = await DB.Button.findOneAndUpdate({ _id: req.body._id }, updateObj);
res.sendData(ret); // res.sendData(ret);
} catch (error) { // } catch (error) {
next(error) // next(error)
} // }
} // }
...@@ -173,7 +173,7 @@ module.exports = { ...@@ -173,7 +173,7 @@ module.exports = {
updateMenu, updateMenu,
treeMenu, treeMenu,
createButton, // createButton,
updateButton, // updateButton,
} }
\ No newline at end of file
...@@ -10,12 +10,12 @@ setTimeout(async () => { ...@@ -10,12 +10,12 @@ setTimeout(async () => {
const { salt, passwordHash } = utils.saltHashPassword("123456"); const { salt, passwordHash } = utils.saltHashPassword("123456");
const mobile = "11111111111"; const mobile = "11111111111";
const _id = "66d6c4099f8480c6db53ce13"; const _id = "66d6c4099f8480c6db53ce13";
await userModule.findOneAndUpdate({_id},{ await userModule.findOneAndUpdate({ _id }, {
mobile, mobile,
salt, salt,
name: "系统管理员", name: "系统管理员",
password: passwordHash, password: passwordHash,
}, {upsert: true}) }, { upsert: true })
}, "5000"); }, "5000");
// 注册 暂时用作注册admin 后续用户应该以后台添加方式进行 // 注册 暂时用作注册admin 后续用户应该以后台添加方式进行
...@@ -90,7 +90,7 @@ async function listUser(req, res, next) { ...@@ -90,7 +90,7 @@ async function listUser(req, res, next) {
} }
let count = await DB.User.countDocuments(search); let count = await DB.User.countDocuments(search);
let list = await userModule.findList(search, ['-password', '-salt'], { skip, limit: pageSize }); let list = await userModule.findList(search, ['-password', '-salt'], { skip, limit: pageSize });
res.sendData({count, list}); res.sendData({ count, list });
} catch (error) { } catch (error) {
next(error); next(error);
} }
...@@ -197,35 +197,35 @@ async function getRole(req, res, next) { ...@@ -197,35 +197,35 @@ async function getRole(req, res, next) {
if (!(ret && ret._id)) { if (!(ret && ret._id)) {
res.sendError(errorMessage.resourceNotFound); res.sendError(errorMessage.resourceNotFound);
} }
/** // /**
* 将role拥有的menus、buttons标记(permission)到菜单树结构中 返回给前端 // * 将role拥有的menus、buttons标记(permission)到菜单树结构中 返回给前端
*/ // */
// 1. 处理当前角色自己的menus、buttons并建立map // // 1. 处理当前角色自己的menus、buttons并建立map
let roleMenuMap = {}, roleButMap = {}; // let roleMenuMap = {}, roleButMap = {};
ret.menus = ret.menus || []; // ret.menus = ret.menus || [];
ret.bottons = ret.bottons || []; // ret.bottons = ret.bottons || [];
ret.menus.map(o => {roleMenuMap[o] = true}); // ret.menus.map(o => { roleMenuMap[o] = true });
ret.bottons.map(o => {roleButMap[o] = true}); // ret.bottons.map(o => { roleButMap[o] = true });
// 2. 拿到所有的菜单\按钮 // // 2. 拿到所有的菜单\按钮
let allMenus = await DB.Menu.find({del: 0}).lean().exec(); // let allMenus = await DB.Menu.find({ del: 0 }).lean().exec();
let allButtons = await DB.Button.find({del: 0}).lean().exec(); // let allButtons = await DB.Button.find({ del: 0 }).lean().exec();
let allButMap = {}; // let allButMap = {};
for (let i = 0; i < allButtons.length; i++) { // for (let i = 0; i < allButtons.length; i++) {
const element = allButtons[i]; // const element = allButtons[i];
element.permission = !!roleButMap[element._id]; // element.permission = !!roleButMap[element._id];
allButMap[element.menuId] = allButMap[element.menuId] || []; // allButMap[element.menuId] = allButMap[element.menuId] || [];
allButMap[element.menuId].push(element); // allButMap[element.menuId].push(element);
} // }
let menNodes = []; // let menNodes = [];
for (let i = 0; i < allMenus.length; i++) { // for (let i = 0; i < allMenus.length; i++) {
const element = allMenus[i]; // const element = allMenus[i];
element.permission = !!roleMenuMap[element._id]; // element.permission = !!roleMenuMap[element._id];
element.buttons = allButMap[element._id]; // element.buttons = allButMap[element._id];
menNodes.push(element); // menNodes.push(element);
} // }
let tree = utils.buildTree(menNodes); // let tree = utils.buildTree(menNodes);
ret.menus = tree; // ret.menus = tree;
delete ret.buttons; // delete ret.buttons;
res.sendData(ret); res.sendData(ret);
} catch (error) { } catch (error) {
next(error) next(error)
...@@ -256,23 +256,32 @@ async function createRole(req, res, next) { ...@@ -256,23 +256,32 @@ async function createRole(req, res, next) {
menus: [], menus: [],
buttons: [] buttons: []
} }
// 1. 创建角色时同步设置角色权限, 这里让前端直接将有选中状态的菜单tree传递到后端 // // 1. 创建角色时同步设置角色权限, 这里让前端直接将有选中状态的菜单tree传递到后端
// let menus = req.body.menus || [];
// let menusNodes = utils.disTree(menus);
// //选中状态 permission: true 将menus buttons平行存入role中.
// for (let i = 0; i < menusNodes.length; i++) {
// const element = menusNodes[i];
// if (element.permission) {
// obj.menus.push(element._id);
// }
// element.buttons = element.buttons || [];
// for (let i = 0; i < element.buttons.length; i++) {
// const but = element.buttons[i];
// if (but.permission) {
// obj.buttons.push(but._id);
// }
// }
// }
// 2. 前端传一个选中的id的一维数组
let menus = req.body.menus || []; let menus = req.body.menus || [];
let menusNodes = utils.disTree(menus); menus = menus.map(o => { return o._id || o });
//选中状态 permission: true 将menus buttons平行存入role中. // 查找所有为button的节点 放置在对应角色的buttos里面
for (let i = 0; i < menusNodes.length; i++) { let dbMenus = await DB.Menu.find({ del: 0, type: 2, _id: { $in: menus } }).select('type').lean().exec();
const element = menusNodes[i]; let objButtons = dbMenus.map(o => { return o && o._id });
if (element.permission) { obj.menus = menus;
obj.menus.push(element._id); obj.buttons = objButtons;
}
element.buttons = element.buttons || [];
for (let i = 0; i < element.buttons.length; i++) {
const but = element.buttons[i];
if (but.permission) {
obj.buttons.push(but._id);
}
}
}
let ret = await DB.Role.create(obj); let ret = await DB.Role.create(obj);
res.sendData(ret); res.sendData(ret);
} catch (error) { } catch (error) {
...@@ -288,22 +297,30 @@ async function updateRole(req, res, next) { ...@@ -288,22 +297,30 @@ async function updateRole(req, res, next) {
menus: [], menus: [],
buttons: [] buttons: []
}; };
// let menus = req.body.menus || [];
// let menusNodes = utils.disTree(menus);
// //选中状态 permission: true 将menus buttons平行存入role中.
// for (let i = 0; i < menusNodes.length; i++) {
// const element = menusNodes[i];
// if (element.permission) {
// obj.menus.push(element._id);
// }
// element.buttons = element.buttons || [];
// for (let i = 0; i < element.buttons.length; i++) {
// const but = element.buttons[i];
// if (but.permission) {
// obj.buttons.push(but._id);
// }
// }
// }
// 2. 前端传一个选中的id的一维数组
let menus = req.body.menus || []; let menus = req.body.menus || [];
let menusNodes = utils.disTree(menus); menus = menus.map(o => { return o._id || o });
//选中状态 permission: true 将menus buttons平行存入role中. // 查找所有为button的节点 放置在对应角色的buttos里面
for (let i = 0; i < menusNodes.length; i++) { let dbMenus = await DB.Menu.find({ del: 0, type: 2, _id: { $in: menus } }).select('type').lean().exec();
const element = menusNodes[i]; let objButtons = dbMenus.map(o => { return o && o._id });
if (element.permission) { obj.menus = menus;
obj.menus.push(element._id); obj.buttons = objButtons;
}
element.buttons = element.buttons || [];
for (let i = 0; i < element.buttons.length; i++) {
const but = element.buttons[i];
if (but.permission) {
obj.buttons.push(but._id);
}
}
}
let ret = await roleModule.findOneAndUpdate({ _id: req.body._id }, obj); let ret = await roleModule.findOneAndUpdate({ _id: req.body._id }, obj);
res.sendData(ret); res.sendData(ret);
} catch (error) { } catch (error) {
......
const mongoose = require('mongoose'); // const mongoose = require('mongoose');
const Schema = mongoose.Schema; // const Schema = mongoose.Schema;
const moment = require('moment'); // const moment = require('moment');
/** // /**
* 按钮 与菜单关联 字段按前端需要增删 // * 按钮 与菜单关联 字段按前端需要增删
*/ // */
const buttonSchema = new Schema({ // const buttonSchema = new Schema({
name: { // name: {
type: String, // type: String,
required: true, // required: true,
commnet: "按钮名称", // commnet: "按钮名称",
}, // },
key: { // key: {
type: String, // type: String,
required: true, // required: true,
commnet: "按钮标志", // commnet: "按钮标志",
}, // },
menuId: { // menuId: {
type: mongoose.Types.ObjectId, // type: mongoose.Types.ObjectId,
required: true, // required: true,
comment: "所属哪一个菜单", // comment: "所属哪一个菜单",
}, // },
createdAt: { // createdAt: {
type: Date, // type: Date,
default: Date.now, // default: Date.now,
get: v => moment(v).format("YYYY-MM-DD HH:mm:ss"), // get: v => moment(v).format("YYYY-MM-DD HH:mm:ss"),
}, // },
updatedAt: { // updatedAt: {
type: Date, // type: Date,
default: Date.now, // default: Date.now,
get: v => moment(v).format("YYYY-MM-DD HH:mm:ss"), // get: v => moment(v).format("YYYY-MM-DD HH:mm:ss"),
}, // },
del: { // del: {
type: Number, // type: Number,
default: 0, // default: 0,
comment: '默认0 , 1:表示删除,若有其他隐藏业务 不要混用此字段。' // comment: '默认0 , 1:表示删除,若有其他隐藏业务 不要混用此字段。'
} // }
}, { // }, {
id: false, // id: false,
toJSON: { // toJSON: {
getters: true, // getters: true,
} // }
}); // });
const Button = mongoose.model('Button', buttonSchema, 'systemButton'); // const Button = mongoose.model('Button', buttonSchema, 'systemButton');
module.exports = Button; // module.exports = Button;
\ No newline at end of file
// 合并到menus里面,方便前端处理。
\ No newline at end of file
...@@ -21,10 +21,12 @@ const roleSchema = new Schema({ ...@@ -21,10 +21,12 @@ const roleSchema = new Schema({
menus: { menus: {
type: [mongoose.Types.ObjectId], type: [mongoose.Types.ObjectId],
ref: "Menu", ref: "Menu",
comment: "记录的是包含菜单和按钮的集合,方便展示树结构"
}, },
buttons: { buttons: {
type: [mongoose.Types.ObjectId], type: [mongoose.Types.ObjectId],
ref: "Button", ref: "Menu",
comment: "记录的是按钮的集合"
}, },
/* -------------------------------------- */ /* -------------------------------------- */
......
...@@ -42,10 +42,23 @@ async function getRoleMenus(roles) { ...@@ -42,10 +42,23 @@ async function getRoleMenus(roles) {
buttonIds = buttonIds.concat(element.buttons); buttonIds = buttonIds.concat(element.buttons);
} }
console.log(menuIds) console.log(menuIds)
let buts = await DB.Button.find({ del: 0, _id: { $in: buttonIds } }).lean().exec(); let buts = await DB.Menu.find({ del: 0, _id: { $in: buttonIds } }).lean().exec();
// 把按钮的最近一级的父节点,作为map的key,按钮在下面放到对应的菜单中
let bMap = {}; let bMap = {};
buts.map(o => { bMap[o.menuId] = bMap[o.menuId] || []; o.permission = true; bMap[o.menuId].push(o) }); for (let i = 0; i < buts.length; i++) {
let mes = await DB.Menu.find({ del: 0, enable: true, _id: { $in: menuIds } }).populate({ path: "parentIds" }).lean().exec(); const o = buts[i];
o.permission = true;
if(o.parentIds && o.parentIds.length > 0) {
let bpreId = o.parentIds.pop();
bMap[bpreId] = bMap[bpreId] || [];
bMap[bpreId].push(o);
}
}
//获取用户有效的菜单 type : 1
let mes = await DB.Menu.find({ del: 0, type: 1, enable: true, _id: { $in: menuIds } }).populate({ path: "parentIds" }).lean().exec();
console.log(mes) console.log(mes)
let nodes = [], nodeMap = {}; let nodes = [], nodeMap = {};
for (let index = 0; index < mes.length; index++) { for (let index = 0; index < mes.length; index++) {
......
...@@ -17,8 +17,8 @@ router.post('/tree', menuController.treeMenu); ...@@ -17,8 +17,8 @@ router.post('/tree', menuController.treeMenu);
/** /**
* 按钮 * 按钮
*/ */
router.post('/button/create', menuController.createButton); // router.post('/button/create', menuController.createButton);
router.post('/button/update', menuController.updateButton); // router.post('/button/update', menuController.updateButton);
// router.post('/button/create', menuController.createButton); // router.post('/button/create', menuController.createButton);
......
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