明树Git Lab

Commit 0ea7df3f authored by zengfanpei's avatar zengfanpei

update

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