明树Git Lab
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
L
letian_backend
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zengfanpei
letian_backend
Commits
0ea7df3f
Commit
0ea7df3f
authored
Sep 12, 2024
by
zengfanpei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
17403af0
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
180 additions
and
146 deletions
+180
-146
menuController.js
controller/menuController.js
+32
-32
userController.js
controller/userController.js
+80
-63
systemButton.js
db/models/systemButton.js
+47
-45
systemRole.js
db/models/systemRole.js
+3
-1
userModule.js
module/userModule.js
+16
-3
menuRouter.js
router/menuRouter.js
+2
-2
No files found.
controller/menuController.js
View file @
0ea7df3f
...
...
@@ -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
controller/userController.js
View file @
0ea7df3f
...
...
@@ -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
)
{
...
...
db/models/systemButton.js
View file @
0ea7df3f
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
db/models/systemRole.js
View file @
0ea7df3f
...
...
@@ -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
:
"记录的是按钮的集合"
},
/* -------------------------------------- */
...
...
module/userModule.js
View file @
0ea7df3f
...
...
@@ -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
++
)
{
...
...
router/menuRouter.js
View file @
0ea7df3f
...
...
@@ -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);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment