明树Git Lab
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
J
jt_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
jt_backend
Commits
dd3436a3
Commit
dd3436a3
authored
Oct 29, 2025
by
zfp1
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
ead0be59
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
256 additions
and
68 deletions
+256
-68
menuController.js
controller/menuController.js
+127
-0
roleController.js
controller/roleController.js
+37
-2
userController.js
controller/userController.js
+31
-14
index.js
db/index.js
+14
-12
menu.js
db/model/menu.js
+17
-12
requestLog.js
db/model/requestLog.js
+1
-1
role.js
db/model/role.js
+1
-1
roleMenu.js
db/model/roleMenu.js
+3
-3
userRole.js
db/model/userRole.js
+2
-2
menuRouter.js
router/menuRouter.js
+0
-9
userRouter.js
router/userRouter.js
+14
-3
server.js
server.js
+1
-1
index.js
utils/index.js
+8
-8
No files found.
controller/menuController.js
0 → 100644
View file @
dd3436a3
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
controller/roleController.js
View file @
dd3436a3
...
...
@@ -38,7 +38,7 @@ async function deleteRole(req, res, next) {
async
function
listRole
(
req
,
res
,
next
)
{
try
{
let
search
=
{};
let
search
=
{
where
:
{
del
:
0
}
};
let
page
=
req
.
body
.
page
||
1
;
let
limit
=
req
.
body
.
pageSize
||
10
;
let
offset
=
(
page
-
1
)
*
limit
;
...
...
@@ -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
=
{
getRole
,
createRole
,
listRole
,
updateRole
,
deleteRole
deleteRole
,
setRoleMenu
,
}
\ No newline at end of file
controller/userController.js
View file @
dd3436a3
...
...
@@ -31,12 +31,20 @@ async function login(req, res, next) {
const
{
mobile
,
password
}
=
req
.
body
;
let
user
=
await
DB
.
User
.
findOne
({
where
:
{
mobile
,
del
:
0
,
enable
:
0
},
include
:
{
include
:
[
{
model
:
DB
.
Role
,
as
:
'roles'
,
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
();
if
(
!
user
)
{
...
...
@@ -56,11 +64,20 @@ async function login(req, res, next) {
user
.
token
=
token
.
split
(
'-'
).
join
(
""
);
let
userStr
=
JSON
.
stringify
(
user
);
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;
return
res
.
sendData
(
ret
);
//处理菜单
const
roles
=
user
.
roles
||
[];
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
)
{
next
(
error
);
}
...
...
@@ -127,7 +144,7 @@ async function updateUser(req, res, next) {
async
function
listUser
(
req
,
res
,
next
)
{
try
{
let
search
=
{};
let
search
=
{
where
:
{
del
:
0
}
};
let
page
=
req
.
body
.
page
||
1
;
let
limit
=
req
.
body
.
pageSize
||
10
;
let
offset
=
(
page
-
1
)
*
limit
;
...
...
@@ -175,15 +192,15 @@ async function setUserRole(req, res, next) {
try
{
let
{
userId
,
roleIds
}
=
req
.
body
;
//1. 先查被设置用户 有什么角色
const
roles
=
await
DB
.
UserRole
.
findAll
({
where
:
{
user
_id
:
req
.
body
.
userId
},
raw
:
true
,
attributes
:
[
'role_id'
,
'user_i
d'
]
});
const
roles
=
await
DB
.
UserRole
.
findAll
({
where
:
{
user
Id
:
req
.
body
.
userId
},
raw
:
true
,
attributes
:
[
'roleId'
,
'userI
d'
]
});
//需新增得
let
dbRoleIds
=
[],
needAddRoleIds
=
[],
needDelRoleIds
=
[];
for
(
let
index
=
0
;
index
<
roles
.
length
;
index
++
)
{
const
element
=
roles
[
index
];
dbRoleIds
.
push
(
element
.
role
_i
d
);
if
(
!
roleIds
.
includes
(
element
.
role
_i
d
))
{
dbRoleIds
.
push
(
element
.
role
I
d
);
if
(
!
roleIds
.
includes
(
element
.
role
I
d
))
{
// 1. roleIds里面没有 但是关系表里有的 需要删除
needDelRoleIds
.
push
(
element
.
role
_i
d
);
needDelRoleIds
.
push
(
element
.
role
I
d
);
}
}
for
(
let
index
=
0
;
index
<
roleIds
.
length
;
index
++
)
{
...
...
@@ -193,11 +210,11 @@ async function setUserRole(req, res, next) {
}
}
if
(
needAddRoleIds
.
length
)
{
let
objs
=
needAddRoleIds
.
map
(
o
=>
{
return
{
user
_id
:
userId
,
role_i
d
:
o
}
});
let
objs
=
needAddRoleIds
.
map
(
o
=>
{
return
{
user
Id
:
userId
,
roleI
d
:
o
}
});
await
DB
.
UserRole
.
bulkCreate
(
objs
);
}
if
(
needDelRoleIds
.
length
)
{
await
DB
.
UserRole
.
destroy
({
where
:
{
user
_id
:
userId
,
role_i
d
:
{
[
Op
.
in
]:
needDelRoleIds
}
}
});
await
DB
.
UserRole
.
destroy
({
where
:
{
user
Id
:
userId
,
roleI
d
:
{
[
Op
.
in
]:
needDelRoleIds
}
}
});
}
return
res
.
sendData
();
}
catch
(
error
)
{
...
...
db/index.js
View file @
dd3436a3
...
...
@@ -14,6 +14,7 @@ global.DB = {
RequestLog
,
Role
,
UserRole
,
Menu
,
RoleMenu
,
}
...
...
@@ -23,32 +24,33 @@ global.DB = {
/**
* 关联关系定义
*/
User
.
hasMany
(
RequestLog
,
{
foreignKey
:
'user
_i
d'
});
User
.
hasMany
(
RequestLog
,
{
foreignKey
:
'user
I
d'
});
RequestLog
.
belongsTo
(
User
,
{
foreignKey
:
'user
_i
d'
});
RequestLog
.
belongsTo
(
User
,
{
foreignKey
:
'user
I
d'
});
User
.
belongsToMany
(
Role
,
{
through
:
'system_user_role'
,
// 中间表名
foreignKey
:
'user
_i
d'
,
// 用户ID外键
otherKey
:
'role
_i
d'
,
// 角色ID外键
foreignKey
:
'user
I
d'
,
// 用户ID外键
otherKey
:
'role
I
d'
,
// 角色ID外键
as
:
'roles'
,
});
Role
.
belongsToMany
(
User
,
{
through
:
'system_user_role'
,
foreignKey
:
'role
_i
d'
,
otherKey
:
'user
_i
d'
,
foreignKey
:
'role
I
d'
,
otherKey
:
'user
I
d'
,
as
:
'users'
});
Role
.
belongsToMany
(
Menu
,
{
through
:
'systen_role_menu'
,
foreignKey
:
'role_id'
,
otherKey
:
'menu_id'
through
:
'system_role_menu'
,
foreignKey
:
'roleId'
,
otherKey
:
'menuId'
,
as
:
'menus'
});
Menu
.
belongsToMany
(
Role
,
{
through
:
'syste
n
_role_menu'
,
foreignKey
:
'menu
_i
d'
,
otherKey
:
'role
_i
d'
through
:
'syste
m
_role_menu'
,
foreignKey
:
'menu
I
d'
,
otherKey
:
'role
I
d'
});
db/model/menu.js
View file @
dd3436a3
...
...
@@ -16,13 +16,11 @@ const Menu = sequelize.define('Menu', {
level
:
DataTypes
.
INTEGER
,
url
:
{
type
:
DataTypes
.
STRING
,
unique
:
true
,
comment
:
"菜单唯一标识"
comment
:
"地址"
},
key
:
{
type
:
DataTypes
.
STRING
,
unique
:
true
,
comment
:
"按钮唯一标识"
,
comment
:
"唯一标识"
,
},
order
:
{
type
:
DataTypes
.
INTEGER
,
...
...
@@ -30,24 +28,31 @@ const Menu = sequelize.define('Menu', {
},
parent
_i
d
:
{
parent
I
d
:
{
type
:
DataTypes
.
INTEGER
,
default
:
null
,
},
parentIds
:
{
type
:
DataTypes
.
STRING
(
500
),
default
:
""
,
},
type
:
{
type
:
DataTypes
.
INTEGER
,
comment
:
"类型: 1. 菜单, 2. 按钮"
,
default
:
1
},
enable
:
{
type
:
DataTypes
.
BOOLEAN
,
defaultValue
:
true
,
comment
:
"true: 启用, false: 不启用"
// enable: {
// type: DataTypes.INTEGER,
// defaultValue: 0,
// comment: "0: 启用, 1: 不启用"
// },
del
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
,
comment
:
"0 正常 1 删除"
},
},
{
tableName
:
'system_menu'
,
// 指定表名(如果与模型名不同)
timestamps
:
true
,
// 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
...
...
@@ -55,7 +60,7 @@ const Menu = sequelize.define('Menu', {
// 同步模型到数据库(创建表)
Menu
.
sync
({
force
:
false
,
// force: true 会删除已存在表并重新创建
//
force: false, // force: true 会删除已存在表并重新创建
// alter: true
})
.
then
(()
=>
{
...
...
db/model/requestLog.js
View file @
dd3436a3
...
...
@@ -13,7 +13,7 @@ const RequestLog = sequelize.define('User', {
type
:
DataTypes
.
STRING
,
comment
:
"给每一个请求分配一个id"
},
user
_i
d
:
{
user
I
d
:
{
type
:
DataTypes
.
INTEGER
,
comment
:
"关联查询用"
},
...
...
db/model/role.js
View file @
dd3436a3
...
...
@@ -35,7 +35,7 @@ const Role = sequelize.define('Role', {
// 同步模型到数据库(创建表)
Role
.
sync
({
// force: false, // force: true 会删除已存在表并重新创建
alter
:
true
//
alter: true
})
.
then
(()
=>
{
console
.
log
(
'Role 表同步成功'
);
...
...
db/model/roleMenu.js
View file @
dd3436a3
...
...
@@ -11,11 +11,11 @@ const RoleMenu = sequelize.define('RoleMenu', {
primaryKey
:
true
,
autoIncrement
:
true
},
menu
_i
d
:
{
menu
I
d
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
Menu
,
key
:
'id'
}
},
role
_i
d
:
{
role
I
d
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
Role
,
key
:
'id'
}
}
...
...
@@ -27,7 +27,7 @@ const RoleMenu = sequelize.define('RoleMenu', {
// 同步模型到数据库(创建表)
RoleMenu
.
sync
({
// force: false, // force: true 会删除已存在表并重新创建
//
alter: true
alter
:
true
})
.
then
(()
=>
{
console
.
log
(
'RoleMenu 表同步成功'
);
...
...
db/model/userRole.js
View file @
dd3436a3
...
...
@@ -11,11 +11,11 @@ const UserRole = sequelize.define('UserRole', {
primaryKey
:
true
,
autoIncrement
:
true
},
user
_i
d
:
{
user
I
d
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
User
,
key
:
'id'
}
},
role
_i
d
:
{
role
I
d
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
Role
,
key
:
'id'
}
}
...
...
router/menuRouter.js
deleted
100644 → 0
View file @
ead0be59
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
router/userRouter.js
View file @
dd3436a3
...
...
@@ -5,8 +5,11 @@ const router = express.Router();
const
userController
=
require
(
'../controller/userController'
);
const
roleController
=
require
(
'../controller/roleController'
);
const
menuController
=
require
(
'../controller/menuController'
);
/**
* 用户
*/
router
.
post
(
'/regist'
,
userController
.
regist
);
router
.
post
(
'/login'
,
userController
.
login
);
router
.
post
(
'/manage/listUser'
,
userController
.
listUser
);
...
...
@@ -26,9 +29,17 @@ router.post('/role/updateRole', roleController.updateRole);
router
.
post
(
'/role/deleteRole'
,
roleController
.
deleteRole
);
router
.
post
(
'/role/listRole'
,
roleController
.
listRole
);
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
;
\ No newline at end of file
server.js
View file @
dd3436a3
...
...
@@ -50,7 +50,7 @@ app.use(function(req, res, next) {
// error handler
app
.
use
(
function
(
err
,
req
,
res
,
next
)
{
console
.
log
(
err
.
code
,
err
.
status
)
console
.
log
(
err
)
// 记录下错误日志
// requestLogModule.createRequestLog({
// url: req.path,
...
...
utils/index.js
View file @
dd3436a3
...
...
@@ -30,23 +30,23 @@ function checkUserPassword({ reqPw, salt, userPw }) {
function
buildTree
(
nodes
)
{
// 创建一个映射,将节点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数组中
nodes
.
forEach
(
node
=>
{
const
parent
_id
=
String
(
node
.
parent_i
d
);
if
(
parent
_i
d
!==
null
)
{
const
parent
Id
=
String
(
node
.
parentI
d
);
if
(
parent
I
d
!==
null
)
{
// 确保父节点在映射中存在
if
(
nodeMap
.
has
(
parent
_i
d
))
{
if
(
nodeMap
.
has
(
parent
I
d
))
{
// 将当前节点添加到父节点的children数组中
nodeMap
.
get
(
parent
_id
).
children
.
push
(
nodeMap
.
get
(
String
(
node
.
_
id
)));
nodeMap
.
get
(
parent
_id
).
children
=
_
.
orderBy
(
nodeMap
.
get
(
parent_i
d
).
children
,
'order'
)
nodeMap
.
get
(
parent
Id
).
children
.
push
(
nodeMap
.
get
(
String
(
node
.
id
)));
nodeMap
.
get
(
parent
Id
).
children
=
_
.
orderBy
(
nodeMap
.
get
(
parentI
d
).
children
,
'order'
)
}
}
});
// 从映射中提取顶级节点(parent
_i
d为null)
return
_
.
orderBy
(
Array
.
from
(
nodeMap
.
values
()).
filter
(
node
=>
node
.
parent
_i
d
===
null
),
'order'
);
// 从映射中提取顶级节点(parent
I
d为null)
return
_
.
orderBy
(
Array
.
from
(
nodeMap
.
values
()).
filter
(
node
=>
node
.
parent
I
d
===
null
),
'order'
);
}
function
disTree
(
tree
)
{
...
...
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