明树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
3a3ea0d7
Commit
3a3ea0d7
authored
Oct 27, 2025
by
zfp1
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
47bb4647
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
302 additions
and
32 deletions
+302
-32
userController.js
controller/userController.js
+47
-3
index.js
db/index.js
+31
-4
index.js
db/model/index.js
+1
-1
menu.js
db/model/menu.js
+66
-0
requestLog.js
db/model/requestLog.js
+2
-2
role.js
db/model/role.js
+40
-0
roleMenu.js
db/model/roleMenu.js
+37
-0
user.js
db/model/user.js
+13
-5
userRole.js
db/model/userRole.js
+37
-0
external.js
middleware/external.js
+2
-2
request.js
middleware/request.js
+2
-2
response.js
middleware/response.js
+2
-2
requestModule.js
module/requestModule.js
+1
-1
userModule.js
module/userModule.js
+13
-2
userRouter.js
router/userRouter.js
+1
-1
index.js
utils/index.js
+7
-7
No files found.
controller/userController.js
View file @
3a3ea0d7
...
...
@@ -9,8 +9,51 @@ const errorMessage = require('../utils/errorMessage');
async
function
regist
(
req
,
res
,
next
)
{
try
{
const
body
=
req
.
body
;
const
ret
=
await
userModule
.
create
(
body
);
const
{
salt
,
passwordHash
}
=
utils
.
saltHashPassword
(
req
.
body
.
password
);
const
ret
=
await
userModule
.
create
({
...
req
.
body
,
salt
,
password
:
passwordHash
,
});
return
res
.
sendData
(
ret
);
}
catch
(
error
)
{
next
(
error
);
}
}
async
function
login
(
req
,
res
,
next
)
{
try
{
if
(
req
.
body
.
encryptLogStr
){
//避免差异 选用跟前端一样的包
let
encryptLogStr
=
CryptoJS
.
AES
.
decrypt
(
req
.
body
.
encryptLogStr
,
"GFG5w5AP0Ja2rNaa"
).
toString
(
CryptoJS
.
enc
.
Utf8
);
let
encArr
=
encryptLogStr
.
split
(
","
);
req
.
body
.
mobile
=
encArr
[
0
].
trim
();
req
.
body
.
password
=
encArr
[
1
];
}
const
{
mobile
,
password
}
=
req
.
body
;
const
user
=
await
userModule
.
findOne
({
mobile
});
console
.
log
(
"----------------------"
,
user
)
if
(
!
user
)
{
return
res
.
sendError
(
errorMessage
.
loginError
);
}
//判断删除状态 ,暂时不加
const
check
=
utils
.
checkUserPassword
({
reqPw
:
password
,
salt
:
user
.
salt
,
userPw
:
user
.
password
,
});
if
(
!
check
)
{
return
res
.
sendError
(
errorMessage
.
loginError
)
}
// 生成一个串 返回前端
let
token
=
crypto
.
randomUUID
();
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'
]);
// let menus = await userModule.getRoleMenus(ret.roles, user.mobile);
// ret.menus = menus;
return
res
.
sendData
(
ret
);
}
catch
(
error
)
{
next
(
error
);
...
...
@@ -19,5 +62,6 @@ async function regist(req, res, next) {
module
.
exports
=
{
regist
regist
,
login
,
}
\ No newline at end of file
db/index.js
View file @
3a3ea0d7
// 模型初始化
const
User
=
require
(
"./model/user"
);
const
Role
=
require
(
"./model/role"
);
const
Menu
=
require
(
"./model/menu"
);
const
RequestLog
=
require
(
"./model/requestLog"
);
global
.
DB
=
{
User
,
RequestLog
RequestLog
,
Role
,
}
...
...
@@ -16,6 +19,30 @@ global.DB = {
/**
* 关联关系定义
*/
User
.
hasMany
(
RequestLog
,
{
foreignKey
:
'userId'
});
RequestLog
.
belongsTo
(
User
,
{
foreignKey
:
'userId'
});
User
.
hasMany
(
RequestLog
,
{
foreignKey
:
'user_id'
});
RequestLog
.
belongsTo
(
User
,
{
foreignKey
:
'user_id'
});
User
.
belongsToMany
(
Role
,
{
through
:
'system_user_role'
,
// 中间表名
foreignKey
:
'user_id'
,
// 用户ID外键
otherKey
:
'role_id'
// 角色ID外键
});
Role
.
belongsToMany
(
User
,
{
through
:
'system_user_role'
,
foreignKey
:
'role_id'
,
otherKey
:
'user_id'
});
Role
.
belongsToMany
(
Menu
,
{
through
:
'systen_role_menu'
,
foreignKey
:
'role_id'
,
otherKey
:
'menu_id'
});
Menu
.
belongsToMany
(
Role
,
{
through
:
'systen_role_menu'
,
foreignKey
:
'menu_id'
,
otherKey
:
'role_id'
});
db/model/index.js
View file @
3a3ea0d7
...
...
@@ -5,7 +5,7 @@ const { Sequelize } = require('sequelize');
const
sequelize
=
new
Sequelize
(
sysConfig
.
database
||
'gzbjt'
,
sysConfig
.
username
||
'root'
,
sysConfig
.
password
||
'123456'
,
{
host
:
sysConfig
.
host
||
'localhost'
,
dialect
:
'mysql'
,
logging
:
console
.
log
,
// 显示日志(可选)
logging
:
false
,
// 显示日志(可选)
pool
:
{
max
:
5
,
// 连接池最大连接数
min
:
0
,
...
...
db/model/menu.js
0 → 100644
View file @
3a3ea0d7
// models/User.js
const
{
DataTypes
}
=
require
(
'sequelize'
);
const
sequelize
=
require
(
'./index'
);
const
Menu
=
sequelize
.
define
(
'Menu'
,
{
// 定义字段
id
:
{
type
:
DataTypes
.
INTEGER
,
primaryKey
:
true
,
autoIncrement
:
true
},
name
:
{
type
:
DataTypes
.
STRING
,
},
level
:
DataTypes
.
INTEGER
,
url
:
{
type
:
DataTypes
.
STRING
,
unique
:
true
,
comment
:
"菜单唯一标识"
},
key
:
{
type
:
DataTypes
.
STRING
,
unique
:
true
,
comment
:
"按钮唯一标识"
,
},
order
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
100
,
},
parent_id
:
{
type
:
DataTypes
.
INTEGER
,
default
:
null
,
},
type
:
{
type
:
DataTypes
.
INTEGER
,
comment
:
"类型: 1. 菜单, 2. 按钮"
,
default
:
1
},
enable
:
{
type
:
DataTypes
.
BOOLEAN
,
defaultValue
:
true
,
comment
:
"true: 启用, false: 不启用"
},
},
{
tableName
:
'system_menu'
,
// 指定表名(如果与模型名不同)
timestamps
:
true
,
// 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
Menu
.
sync
({
// force: false, // force: true 会删除已存在表并重新创建
alter
:
true
})
.
then
(()
=>
{
console
.
log
(
'Menu 表同步成功'
);
});
module
.
exports
=
Menu
;
\ No newline at end of file
db/model/requestLog.js
View file @
3a3ea0d7
...
...
@@ -9,11 +9,11 @@ const RequestLog = sequelize.define('User', {
primaryKey
:
true
,
autoIncrement
:
true
},
req
I
d
:
{
req
i
d
:
{
type
:
DataTypes
.
STRING
,
comment
:
"给每一个请求分配一个id"
},
user
I
d
:
{
user
_i
d
:
{
type
:
DataTypes
.
INTEGER
,
comment
:
"关联查询用"
},
...
...
db/model/role.js
0 → 100644
View file @
3a3ea0d7
// models/User.js
const
{
DataTypes
}
=
require
(
'sequelize'
);
const
sequelize
=
require
(
'./index'
);
const
Role
=
sequelize
.
define
(
'Role'
,
{
// 定义字段
id
:
{
type
:
DataTypes
.
INTEGER
,
primaryKey
:
true
,
autoIncrement
:
true
},
name
:
{
type
:
DataTypes
.
STRING
,
commnet
:
"角色名称"
,
},
key
:
{
type
:
DataTypes
.
STRING
,
commnet
:
"角色标识"
,
},
enable
:
{
type
:
DataTypes
.
BOOLEAN
,
defaultValue
:
true
,
comment
:
"true: 启用, false: 不启用"
},
},
{
tableName
:
'system_role'
,
// 指定表名(如果与模型名不同)
timestamps
:
true
,
// 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
Role
.
sync
({
// force: false, // force: true 会删除已存在表并重新创建
alter
:
true
})
.
then
(()
=>
{
console
.
log
(
'Role 表同步成功'
);
});
module
.
exports
=
Role
;
\ No newline at end of file
db/model/roleMenu.js
0 → 100644
View file @
3a3ea0d7
// models/User.js
const
{
DataTypes
}
=
require
(
'sequelize'
);
const
sequelize
=
require
(
'./index'
);
const
Menu
=
require
(
'./menu'
);
const
Role
=
require
(
'./role'
);
const
RoleMenu
=
sequelize
.
define
(
'RoleMenu'
,
{
// 定义字段
id
:
{
type
:
DataTypes
.
INTEGER
,
primaryKey
:
true
,
autoIncrement
:
true
},
menu_id
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
Menu
,
key
:
'id'
}
},
role_id
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
Role
,
key
:
'id'
}
}
},
{
tableName
:
'system_role_menu'
,
// 指定表名(如果与模型名不同)
timestamps
:
true
,
// 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
RoleMenu
.
sync
({
// force: false, // force: true 会删除已存在表并重新创建
alter
:
true
})
.
then
(()
=>
{
console
.
log
(
'RoleMenu 表同步成功'
);
});
module
.
exports
=
RoleMenu
;
\ No newline at end of file
db/model/user.js
View file @
3a3ea0d7
...
...
@@ -9,7 +9,7 @@ const User = sequelize.define('User', {
primaryKey
:
true
,
autoIncrement
:
true
},
usernam
e
:
{
mobil
e
:
{
type
:
DataTypes
.
STRING
(
50
),
allowNull
:
true
},
...
...
@@ -24,14 +24,22 @@ const User = sequelize.define('User', {
name
:
{
type
:
DataTypes
.
STRING
(
50
),
allowNull
:
true
}
},
enable
:
{
type
:
DataTypes
.
BOOLEAN
,
defaultValue
:
true
,
comment
:
"true: 启用, false: 不启用"
},
},
{
tableName
:
'system_user'
,
// 指定表名(如果与模型名不同)
timestamps
:
true
,
// 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
User
.
sync
({
force
:
false
})
// force: true 会删除已存在表并重新创建
User
.
sync
({
// force: false, // force: true 会删除已存在表并重新创建
alter
:
true
})
.
then
(()
=>
{
console
.
log
(
'User 表同步成功'
);
});
...
...
db/model/userRole.js
0 → 100644
View file @
3a3ea0d7
// models/User.js
const
{
DataTypes
}
=
require
(
'sequelize'
);
const
sequelize
=
require
(
'./index'
);
const
User
=
require
(
'./user'
);
const
Role
=
require
(
'./role'
);
const
UserRole
=
sequelize
.
define
(
'UserRole'
,
{
// 定义字段
id
:
{
type
:
DataTypes
.
INTEGER
,
primaryKey
:
true
,
autoIncrement
:
true
},
user_id
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
User
,
key
:
'id'
}
},
role_id
:
{
type
:
DataTypes
.
INTEGER
,
references
:
{
model
:
Role
,
key
:
'id'
}
}
},
{
tableName
:
'system_user_role'
,
// 指定表名(如果与模型名不同)
timestamps
:
true
,
// 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
UserRole
.
sync
({
// force: false, // force: true 会删除已存在表并重新创建
alter
:
true
})
.
then
(()
=>
{
console
.
log
(
'UserRole 表同步成功'
);
});
module
.
exports
=
UserRole
;
\ No newline at end of file
middleware/external.js
View file @
3a3ea0d7
...
...
@@ -4,7 +4,7 @@ const mongoose = require('mongoose');
//
module
.
exports
=
async
(
req
,
res
,
next
)
=>
{
req
.
req
I
d
=
new
mongoose
.
Types
.
ObjectId
();
req
.
req
i
d
=
new
mongoose
.
Types
.
ObjectId
();
/* --------------3. 记录所有进来的日志,是否记录响应的值有待 */
requestLogModule
.
createRequestLog
({
...
...
@@ -14,7 +14,7 @@ module.exports = async (req, res, next) => {
...
req
.
query
,
...
req
.
params
,
}),
req
Id
:
req
.
reqI
d
,
req
id
:
req
.
reqi
d
,
user
:
req
.
user
,
method
:
req
.
method
,
headers
:
JSON
.
stringify
(
req
.
headers
),
...
...
middleware/request.js
View file @
3a3ea0d7
...
...
@@ -5,7 +5,7 @@ const requestLogModule = require("../module/requestModule");
//
module
.
exports
=
async
(
req
,
res
,
next
)
=>
{
req
.
req
I
d
=
crypto
.
randomUUID
();
req
.
req
i
d
=
crypto
.
randomUUID
();
/* 1. 处理token */
if
(
!
checkPath
(
req
.
path
))
{
if
(
!
(
req
.
headers
.
authorization
||
req
.
headers
.
Authorization
))
{
...
...
@@ -37,7 +37,7 @@ module.exports = async (req, res, next) => {
...
req
.
query
,
...
req
.
params
,
}),
req
Id
:
req
.
reqI
d
,
req
id
:
req
.
reqi
d
,
userId
:
req
.
user
&&
req
.
user
.
id
,
user
:
JSON
.
stringify
(
req
.
user
),
method
:
req
.
method
,
...
...
middleware/response.js
View file @
3a3ea0d7
...
...
@@ -5,7 +5,7 @@ const requestLogModule = require("../module/requestModule");
module
.
exports
=
(
req
,
res
,
next
)
=>
{
res
[
'sendData'
]
=
(
data
)
=>
{
requestLogModule
.
updateRequestLog
({
req
Id
:
req
.
reqI
d
,
req
id
:
req
.
reqi
d
,
result
:
JSON
.
stringify
(
data
),
msg
:
"success"
,
status
:
200
,
...
...
@@ -19,7 +19,7 @@ module.exports = (req, res, next) => {
res
[
'sendError'
]
=
(
error
)
=>
{
requestLogModule
.
updateRequestLog
({
req
Id
:
req
.
reqI
d
,
req
id
:
req
.
reqi
d
,
result
:
JSON
.
stringify
(
error
.
message
),
msg
:
"error"
,
status
:
200
,
...
...
module/requestModule.js
View file @
3a3ea0d7
...
...
@@ -5,7 +5,7 @@ async function createRequestLog(params) {
return
DB
.
RequestLog
.
create
(
params
);
}
async
function
updateRequestLog
(
params
)
{
return
DB
.
RequestLog
.
update
(
params
,
{
where
:
{
req
Id
:
params
.
reqI
d
}});
return
DB
.
RequestLog
.
update
(
params
,
{
where
:
{
req
id
:
params
.
reqi
d
}});
}
...
...
module/userModule.js
View file @
3a3ea0d7
const
_
=
require
(
"lodash"
);
...
...
@@ -19,11 +19,22 @@ async function create(params) {
return
DB
.
User
.
create
(
params
);
}
async
function
findOne
(
params
)
{
if
(
_
.
isEmpty
(
params
))
{
return
null
;
}
console
.
log
(
params
,
"===="
)
return
DB
.
User
.
findOne
(
{
where
:
params
,
raw
:
true
}
);
}
module
.
exports
=
{
create
create
,
findOne
,
}
\ No newline at end of file
router/userRouter.js
View file @
3a3ea0d7
...
...
@@ -7,7 +7,7 @@ const userController = require('../controller/userController');
router
.
post
(
'/regist'
,
userController
.
regist
);
//
router.post('/login', userController.login);
router
.
post
(
'/login'
,
userController
.
login
);
// router.post('/checkUserToken', userController.checkUserToken);
// router.post('/changePassword', userController.changePassword);
...
...
utils/index.js
View file @
3a3ea0d7
...
...
@@ -34,19 +34,19 @@ function buildTree(nodes) {
// 遍历所有节点,并将它们添加到对应父节点的children数组中
nodes
.
forEach
(
node
=>
{
const
parent
Id
=
String
(
node
.
parentI
d
);
if
(
parent
I
d
!==
null
)
{
const
parent
_id
=
String
(
node
.
parent_i
d
);
if
(
parent
_i
d
!==
null
)
{
// 确保父节点在映射中存在
if
(
nodeMap
.
has
(
parent
I
d
))
{
if
(
nodeMap
.
has
(
parent
_i
d
))
{
// 将当前节点添加到父节点的children数组中
nodeMap
.
get
(
parent
I
d
).
children
.
push
(
nodeMap
.
get
(
String
(
node
.
_id
)));
nodeMap
.
get
(
parent
Id
).
children
=
_
.
orderBy
(
nodeMap
.
get
(
parentI
d
).
children
,
'order'
)
nodeMap
.
get
(
parent
_i
d
).
children
.
push
(
nodeMap
.
get
(
String
(
node
.
_id
)));
nodeMap
.
get
(
parent
_id
).
children
=
_
.
orderBy
(
nodeMap
.
get
(
parent_i
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