@befly-addon/admin 1.0.54 → 1.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apis/admin/cacheRefresh.ts +17 -14
- package/apis/admin/ins.ts +11 -15
- package/apis/admin/upd.ts +1 -13
- package/apis/api/all.ts +1 -1
- package/apis/api/list.ts +30 -0
- package/apis/auth/login.ts +51 -7
- package/apis/dashboard/serviceStatus.ts +2 -2
- package/apis/dashboard/systemResources.ts +1 -1
- package/apis/dict/all.ts +1 -1
- package/apis/dict/del.ts +1 -1
- package/apis/dict/detail.ts +2 -2
- package/apis/dict/ins.ts +1 -1
- package/apis/dict/upd.ts +1 -1
- package/apis/email/config.ts +16 -0
- package/apis/email/logList.ts +13 -0
- package/apis/email/send.ts +42 -0
- package/apis/email/verify.ts +12 -0
- package/apis/loginLog/list.ts +13 -0
- package/apis/menu/all.ts +2 -2
- package/apis/menu/list.ts +1 -1
- package/apis/operateLog/list.ts +13 -0
- package/apis/role/del.ts +2 -2
- package/apis/role/save.ts +2 -2
- package/apis/sysConfig/all.ts +12 -0
- package/apis/sysConfig/del.ts +30 -0
- package/apis/sysConfig/get.ts +31 -0
- package/apis/sysConfig/ins.ts +38 -0
- package/apis/sysConfig/list.ts +14 -0
- package/apis/sysConfig/upd.ts +50 -0
- package/package.json +14 -3
- package/plugins/email.ts +206 -0
- package/styles/variables.scss +121 -60
- package/tables/admin.json +0 -15
- package/tables/emailLog.json +69 -0
- package/tables/loginLog.json +96 -0
- package/tables/operateLog.json +82 -0
- package/tables/role.json +1 -1
- package/tables/sysConfig.json +53 -0
- package/views/403_1/meta.json +4 -0
- package/views/{dict → config/dict}/components/edit.vue +7 -5
- package/views/config/dict/index.vue +205 -0
- package/views/config/dict/meta.json +4 -0
- package/views/config/meta.json +4 -0
- package/views/config/system/components/edit.vue +179 -0
- package/views/config/system/index.vue +256 -0
- package/views/config/system/meta.json +4 -0
- package/views/index/index.vue +46 -9
- package/views/index/meta.json +4 -0
- package/views/log/email/index.vue +285 -0
- package/views/log/email/meta.json +4 -0
- package/views/log/login/index.vue +180 -0
- package/views/log/login/meta.json +4 -0
- package/views/log/meta.json +4 -0
- package/views/log/operate/index.vue +242 -0
- package/views/log/operate/meta.json +4 -0
- package/views/login_1/meta.json +4 -0
- package/views/{admin → people/admin}/components/edit.vue +23 -35
- package/views/{admin → people/admin}/index.vue +37 -96
- package/views/people/admin/meta.json +4 -0
- package/views/people/meta.json +4 -0
- package/views/permission/api/index.vue +143 -0
- package/views/permission/api/meta.json +4 -0
- package/views/permission/menu/index.vue +146 -0
- package/views/permission/menu/meta.json +4 -0
- package/views/permission/meta.json +4 -0
- package/views/{role → permission/role}/components/api.vue +22 -51
- package/views/{role → permission/role}/components/edit.vue +14 -15
- package/views/{role → permission/role}/components/menu.vue +11 -38
- package/views/permission/role/index.vue +227 -0
- package/views/permission/role/meta.json +4 -0
- package/apis/menu/del.ts +0 -31
- package/apis/menu/ins.ts +0 -19
- package/apis/menu/upd.ts +0 -27
- package/views/dict/index.vue +0 -162
- package/views/menu/components/edit.vue +0 -145
- package/views/menu/index.vue +0 -173
- package/views/role/index.vue +0 -184
- /package/views/{403 → 403_1}/index.vue +0 -0
- /package/views/{login → login_1}/components/emailLoginForm.vue +0 -0
- /package/views/{login → login_1}/components/registerForm.vue +0 -0
- /package/views/{login → login_1}/components/welcomePanel.vue +0 -0
- /package/views/{login/index_1.vue → login_1/index.vue} +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* 功能:
|
|
5
5
|
* 1. 刷新接口缓存(apis:all)
|
|
6
6
|
* 2. 刷新菜单缓存(menus:all)
|
|
7
|
-
* 3. 刷新角色权限缓存(role:{code})
|
|
7
|
+
* 3. 刷新角色权限缓存(role:info:{code})
|
|
8
8
|
*
|
|
9
9
|
* 使用场景:
|
|
10
10
|
* - 执行数据库同步后
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* - 缓存出现异常需要重建
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
import { RedisKeys } from 'befly-shared/redisKeys';
|
|
16
|
+
|
|
15
17
|
export default {
|
|
16
18
|
name: '刷新全部缓存',
|
|
17
19
|
handler: async (befly, ctx) => {
|
|
@@ -30,10 +32,10 @@ export default {
|
|
|
30
32
|
orderBy: ['addonName#ASC', 'path#ASC']
|
|
31
33
|
});
|
|
32
34
|
|
|
33
|
-
await befly.redis.setObject(
|
|
35
|
+
await befly.redis.setObject(RedisKeys.apisAll(), apis);
|
|
34
36
|
results.apis = { success: true, count: apis.length };
|
|
35
37
|
} catch (error: any) {
|
|
36
|
-
befly.logger.error('
|
|
38
|
+
befly.logger.error({ err: error }, '刷新接口缓存失败');
|
|
37
39
|
results.apis = { success: false, error: error.message };
|
|
38
40
|
}
|
|
39
41
|
|
|
@@ -45,7 +47,7 @@ export default {
|
|
|
45
47
|
orderBy: ['sort#ASC', 'id#ASC']
|
|
46
48
|
});
|
|
47
49
|
|
|
48
|
-
await befly.redis.setObject(
|
|
50
|
+
await befly.redis.setObject(RedisKeys.menusAll(), menus);
|
|
49
51
|
|
|
50
52
|
const parentCount = menus.filter((m: any) => m.pid === 0).length;
|
|
51
53
|
const childCount = menus.filter((m: any) => m.pid !== 0).length;
|
|
@@ -57,7 +59,7 @@ export default {
|
|
|
57
59
|
childCount: childCount
|
|
58
60
|
};
|
|
59
61
|
} catch (error: any) {
|
|
60
|
-
befly.logger.error('
|
|
62
|
+
befly.logger.error({ err: error }, '刷新菜单缓存失败');
|
|
61
63
|
results.menus = { success: false, error: error.message };
|
|
62
64
|
}
|
|
63
65
|
|
|
@@ -69,16 +71,17 @@ export default {
|
|
|
69
71
|
orderBy: ['id#ASC']
|
|
70
72
|
});
|
|
71
73
|
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
// 使用 setBatch 批量缓存所有角色(利用 Bun Redis auto-pipeline)
|
|
75
|
+
await befly.redis.setBatch(
|
|
76
|
+
roles.map((role: any) => ({
|
|
77
|
+
key: RedisKeys.roleInfo(role.code),
|
|
78
|
+
value: role
|
|
79
|
+
}))
|
|
80
|
+
);
|
|
78
81
|
|
|
79
|
-
results.roles = { success: true, count:
|
|
82
|
+
results.roles = { success: true, count: roles.length };
|
|
80
83
|
} catch (error: any) {
|
|
81
|
-
befly.logger.error('
|
|
84
|
+
befly.logger.error({ err: error }, '刷新角色缓存失败');
|
|
82
85
|
results.roles = { success: false, error: error.message };
|
|
83
86
|
}
|
|
84
87
|
|
|
@@ -91,7 +94,7 @@ export default {
|
|
|
91
94
|
return befly.tool.No('部分缓存刷新失败', results);
|
|
92
95
|
}
|
|
93
96
|
} catch (error: any) {
|
|
94
|
-
befly.logger.error('
|
|
97
|
+
befly.logger.error({ err: error }, '刷新全部缓存失败');
|
|
95
98
|
return befly.tool.No('刷新全部缓存失败', { error: error.message });
|
|
96
99
|
}
|
|
97
100
|
}
|
package/apis/admin/ins.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
export default {
|
|
4
4
|
name: '添加管理员',
|
|
5
5
|
fields: adminTable,
|
|
6
|
-
required: ['username', '
|
|
6
|
+
required: ['username', 'password', 'roleId'],
|
|
7
7
|
handler: async (befly, ctx) => {
|
|
8
8
|
// 检查用户名是否已存在
|
|
9
9
|
if (ctx.body.username) {
|
|
@@ -17,14 +17,15 @@ export default {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
//
|
|
21
|
-
const
|
|
22
|
-
table: '
|
|
23
|
-
where: {
|
|
20
|
+
// 查询角色信息
|
|
21
|
+
const role = await befly.db.getOne({
|
|
22
|
+
table: 'addon_admin_role',
|
|
23
|
+
where: { id: ctx.body.roleId },
|
|
24
|
+
columns: ['code']
|
|
24
25
|
});
|
|
25
26
|
|
|
26
|
-
if (
|
|
27
|
-
return befly.tool.No('
|
|
27
|
+
if (!role?.code) {
|
|
28
|
+
return befly.tool.No('角色不存在');
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
// 加密密码
|
|
@@ -35,21 +36,16 @@ export default {
|
|
|
35
36
|
table: 'addon_admin_admin',
|
|
36
37
|
data: {
|
|
37
38
|
username: ctx.body.username,
|
|
38
|
-
email: ctx.body.email,
|
|
39
39
|
password: hashedPassword,
|
|
40
|
-
name: ctx.body.name,
|
|
41
40
|
nickname: ctx.body.nickname,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
roleCode: ctx.body.roleCode || '',
|
|
45
|
-
roleType: ctx.body.roleType || 'user'
|
|
41
|
+
roleId: ctx.body.roleId,
|
|
42
|
+
roleCode: role.code
|
|
46
43
|
}
|
|
47
44
|
});
|
|
48
45
|
|
|
49
46
|
return befly.tool.Yes('添加成功', {
|
|
50
47
|
id: adminId,
|
|
51
|
-
username: ctx.body.username
|
|
52
|
-
email: ctx.body.email
|
|
48
|
+
username: ctx.body.username
|
|
53
49
|
});
|
|
54
50
|
}
|
|
55
51
|
};
|
package/apis/admin/upd.ts
CHANGED
|
@@ -17,22 +17,10 @@ export default {
|
|
|
17
17
|
where: { id }
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
-
if (!admin) {
|
|
20
|
+
if (!admin?.id) {
|
|
21
21
|
return befly.tool.No('管理员不存在');
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
// 如果更新邮箱,检查是否重复
|
|
25
|
-
if (updateData.email && updateData.email !== admin.email) {
|
|
26
|
-
const existingAdmin = await befly.db.getOne({
|
|
27
|
-
table: 'addon_admin_admin',
|
|
28
|
-
where: { email: updateData.email }
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
if (existingAdmin) {
|
|
32
|
-
return befly.tool.No('邮箱已被使用');
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
24
|
// 更新管理员信息
|
|
37
25
|
await befly.db.updData({
|
|
38
26
|
table: 'addon_admin_admin',
|
package/apis/api/all.ts
CHANGED
package/apis/api/list.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ApiRoute } from 'befly';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: '获取接口列表(分页)',
|
|
5
|
+
handler: async (befly, ctx) => {
|
|
6
|
+
try {
|
|
7
|
+
const { page = 1, limit = 30, keyword = '' } = ctx.body;
|
|
8
|
+
|
|
9
|
+
// 构建查询条件
|
|
10
|
+
const where: Record<string, any> = {};
|
|
11
|
+
if (keyword) {
|
|
12
|
+
where.$or = [{ name: { $like: `%${keyword}%` } }, { path: { $like: `%${keyword}%` } }];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const result = await befly.db.getList({
|
|
16
|
+
table: 'addon_admin_api',
|
|
17
|
+
fields: ['id', 'name', 'path', 'method', 'description', 'addon_name', 'addon_title'],
|
|
18
|
+
where: where,
|
|
19
|
+
orderBy: ['addon_name#ASC', 'path#ASC'],
|
|
20
|
+
page: page,
|
|
21
|
+
limit: limit
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return befly.tool.Yes('操作成功', result);
|
|
25
|
+
} catch (error: any) {
|
|
26
|
+
befly.logger.error({ err: error }, '获取接口列表失败');
|
|
27
|
+
return befly.tool.No('获取接口列表失败');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
} as ApiRoute;
|
package/apis/auth/login.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { UAParser } from 'ua-parser-js';
|
|
2
|
+
|
|
3
|
+
import adminTable from '../../tables/admin.json';
|
|
2
4
|
|
|
3
5
|
export default {
|
|
4
6
|
name: '管理员登录',
|
|
@@ -14,6 +16,31 @@ export default {
|
|
|
14
16
|
},
|
|
15
17
|
required: ['account', 'password'],
|
|
16
18
|
handler: async (befly, ctx) => {
|
|
19
|
+
// 解析 User-Agent
|
|
20
|
+
const userAgent = ctx.req.headers.get('user-agent') || '';
|
|
21
|
+
const uaResult = UAParser(userAgent);
|
|
22
|
+
|
|
23
|
+
// 日志数据(公共部分)
|
|
24
|
+
const logData = {
|
|
25
|
+
adminId: 0,
|
|
26
|
+
username: ctx.body.account,
|
|
27
|
+
nickname: '',
|
|
28
|
+
ip: ctx.ip || 'unknown',
|
|
29
|
+
userAgent: userAgent.substring(0, 500),
|
|
30
|
+
browserName: uaResult.browser.name || '',
|
|
31
|
+
browserVersion: uaResult.browser.version || '',
|
|
32
|
+
osName: uaResult.os.name || '',
|
|
33
|
+
osVersion: uaResult.os.version || '',
|
|
34
|
+
deviceType: uaResult.device.type || 'desktop',
|
|
35
|
+
deviceVendor: uaResult.device.vendor || '',
|
|
36
|
+
deviceModel: uaResult.device.model || '',
|
|
37
|
+
engineName: uaResult.engine.name || '',
|
|
38
|
+
cpuArchitecture: uaResult.cpu.architecture || '',
|
|
39
|
+
loginTime: Date.now(),
|
|
40
|
+
loginResult: 0,
|
|
41
|
+
failReason: ''
|
|
42
|
+
};
|
|
43
|
+
|
|
17
44
|
// 查询管理员(account 匹配 username 或 email)
|
|
18
45
|
const admin = await befly.db.getOne({
|
|
19
46
|
table: 'addon_admin_admin',
|
|
@@ -22,26 +49,43 @@ export default {
|
|
|
22
49
|
}
|
|
23
50
|
});
|
|
24
51
|
|
|
25
|
-
if (!admin) {
|
|
26
|
-
|
|
52
|
+
if (!admin?.id) {
|
|
53
|
+
logData.failReason = '账号不存在';
|
|
54
|
+
await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
|
|
55
|
+
return befly.tool.No('账号或密码错误');
|
|
27
56
|
}
|
|
28
57
|
|
|
58
|
+
// 更新日志数据(已找到用户)
|
|
59
|
+
logData.adminId = admin.id;
|
|
60
|
+
logData.username = admin.username;
|
|
61
|
+
logData.nickname = admin.nickname || '';
|
|
62
|
+
|
|
29
63
|
// 验证密码
|
|
30
64
|
try {
|
|
31
65
|
const isValid = await befly.cipher.verifyPassword(ctx.body.password, admin.password);
|
|
32
66
|
if (!isValid) {
|
|
33
|
-
|
|
67
|
+
logData.failReason = '密码错误';
|
|
68
|
+
await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
|
|
69
|
+
return befly.tool.No('账号或密码错误');
|
|
34
70
|
}
|
|
35
|
-
} catch (error) {
|
|
36
|
-
befly.logger.error('密码验证失败'
|
|
71
|
+
} catch (error: any) {
|
|
72
|
+
befly.logger.error({ err: error }, '密码验证失败');
|
|
73
|
+
logData.failReason = '密码格式错误';
|
|
74
|
+
await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
|
|
37
75
|
return befly.tool.No('密码格式错误,请重新设置密码');
|
|
38
76
|
}
|
|
39
77
|
|
|
40
78
|
// 检查账号状态(state=1 表示正常,state=2 表示禁用)
|
|
41
79
|
if (admin.state === 2) {
|
|
80
|
+
logData.failReason = '账号已被禁用';
|
|
81
|
+
await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
|
|
42
82
|
return befly.tool.No('账号已被禁用');
|
|
43
83
|
}
|
|
44
84
|
|
|
85
|
+
// 登录成功,记录日志
|
|
86
|
+
logData.loginResult = 1;
|
|
87
|
+
await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
|
|
88
|
+
|
|
45
89
|
// 更新最后登录信息
|
|
46
90
|
await befly.db.updData({
|
|
47
91
|
table: 'addon_admin_admin',
|
|
@@ -69,7 +113,7 @@ export default {
|
|
|
69
113
|
const { password: _, ...userWithoutPassword } = admin;
|
|
70
114
|
|
|
71
115
|
return befly.tool.Yes('登录成功', {
|
|
72
|
-
token,
|
|
116
|
+
token: token,
|
|
73
117
|
userInfo: userWithoutPassword
|
|
74
118
|
});
|
|
75
119
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
responseTime: `${responseTime}ms`
|
|
15
15
|
});
|
|
16
16
|
} catch (error) {
|
|
17
|
-
befly.logger.error('
|
|
17
|
+
befly.logger.error({ err: error }, '数据库状态检测失败');
|
|
18
18
|
services.push({
|
|
19
19
|
name: '数据库',
|
|
20
20
|
status: 'stopped',
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
responseTime: `${responseTime}ms`
|
|
35
35
|
});
|
|
36
36
|
} catch (error) {
|
|
37
|
-
befly.logger.error('Redis
|
|
37
|
+
befly.logger.error({ err: error }, 'Redis状态检测失败');
|
|
38
38
|
services.push({
|
|
39
39
|
name: 'Redis',
|
|
40
40
|
status: 'stopped',
|
package/apis/dict/all.ts
CHANGED
package/apis/dict/del.ts
CHANGED
package/apis/dict/detail.ts
CHANGED
package/apis/dict/ins.ts
CHANGED
package/apis/dict/upd.ts
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: '获取邮件配置',
|
|
3
|
+
handler: async (befly, ctx) => {
|
|
4
|
+
const config = befly.email.getConfig();
|
|
5
|
+
|
|
6
|
+
return befly.tool.Yes('获取成功', {
|
|
7
|
+
host: config.host,
|
|
8
|
+
port: config.port,
|
|
9
|
+
secure: config.secure,
|
|
10
|
+
user: config.user,
|
|
11
|
+
pass: config.pass,
|
|
12
|
+
fromName: config.fromName,
|
|
13
|
+
configured: !!config.user
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: '邮件发送日志列表',
|
|
3
|
+
handler: async (befly, ctx) => {
|
|
4
|
+
const result = await befly.db.getList({
|
|
5
|
+
table: 'addon_admin_email_log',
|
|
6
|
+
page: ctx.body.page || 1,
|
|
7
|
+
limit: ctx.body.limit || 30,
|
|
8
|
+
orderBy: ['sendTime#DESC']
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
return befly.tool.Yes('获取成功', result);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import emailLogTable from '../../tables/emailLog.json';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: '发送邮件',
|
|
5
|
+
fields: {
|
|
6
|
+
to: emailLogTable.toEmail,
|
|
7
|
+
subject: emailLogTable.subject,
|
|
8
|
+
content: {
|
|
9
|
+
name: '邮件内容',
|
|
10
|
+
type: 'string',
|
|
11
|
+
min: 1,
|
|
12
|
+
max: 50000
|
|
13
|
+
},
|
|
14
|
+
cc: emailLogTable.ccEmail,
|
|
15
|
+
bcc: emailLogTable.bccEmail,
|
|
16
|
+
isHtml: {
|
|
17
|
+
name: '是否HTML',
|
|
18
|
+
type: 'boolean',
|
|
19
|
+
default: true
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
required: ['to', 'subject', 'content'],
|
|
23
|
+
handler: async (befly, ctx) => {
|
|
24
|
+
const result = await befly.email.sendAndLog({
|
|
25
|
+
adminId: ctx.user?.id || 0,
|
|
26
|
+
username: ctx.user?.username || '',
|
|
27
|
+
nickname: ctx.user?.nickname || '',
|
|
28
|
+
to: ctx.body.to,
|
|
29
|
+
subject: ctx.body.subject,
|
|
30
|
+
html: ctx.body.isHtml ? ctx.body.content : undefined,
|
|
31
|
+
text: ctx.body.isHtml ? undefined : ctx.body.content,
|
|
32
|
+
cc: ctx.body.cc || undefined,
|
|
33
|
+
bcc: ctx.body.bcc || undefined
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
if (result.success) {
|
|
37
|
+
return befly.tool.Yes('发送成功', { messageId: result.messageId });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return befly.tool.No(result.error || '发送失败');
|
|
41
|
+
}
|
|
42
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: '获取登录日志列表',
|
|
3
|
+
handler: async (befly, ctx) => {
|
|
4
|
+
const result = await befly.db.getList({
|
|
5
|
+
table: 'addon_admin_login_log',
|
|
6
|
+
page: ctx.body.page || 1,
|
|
7
|
+
limit: ctx.body.limit || 30,
|
|
8
|
+
orderBy: ['loginTime#DESC']
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
return befly.tool.Yes('获取成功', result);
|
|
12
|
+
}
|
|
13
|
+
};
|
package/apis/menu/all.ts
CHANGED
|
@@ -53,8 +53,8 @@ export default {
|
|
|
53
53
|
|
|
54
54
|
// 6. 返回一维数组(由前端构建树形结构)
|
|
55
55
|
return befly.tool.Yes('获取菜单成功', authorizedMenus);
|
|
56
|
-
} catch (error) {
|
|
57
|
-
befly.logger.error('
|
|
56
|
+
} catch (error: any) {
|
|
57
|
+
befly.logger.error({ err: error }, '获取用户菜单失败');
|
|
58
58
|
return befly.tool.No('获取菜单失败');
|
|
59
59
|
}
|
|
60
60
|
}
|
package/apis/menu/list.ts
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: '获取操作日志列表',
|
|
3
|
+
handler: async (befly, ctx) => {
|
|
4
|
+
const result = await befly.db.getList({
|
|
5
|
+
table: 'addon_admin_operate_log',
|
|
6
|
+
page: ctx.body.page || 1,
|
|
7
|
+
limit: ctx.body.limit || 30,
|
|
8
|
+
orderBy: ['operateTime#DESC']
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
return befly.tool.Yes('获取成功', result);
|
|
12
|
+
}
|
|
13
|
+
};
|
package/apis/role/del.ts
CHANGED
package/apis/role/save.ts
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: '获取全部系统配置',
|
|
3
|
+
handler: async (befly, ctx) => {
|
|
4
|
+
const result = await befly.db.getAll({
|
|
5
|
+
table: 'addon_admin_sys_config',
|
|
6
|
+
fields: ['id', 'name', 'code', 'value', 'valueType', 'group', 'sort', 'isSystem', 'description'],
|
|
7
|
+
orderBy: ['group#ASC', 'sort#ASC', 'id#ASC']
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
return befly.tool.Yes('操作成功', result);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: '删除系统配置',
|
|
3
|
+
handler: async (befly, ctx) => {
|
|
4
|
+
try {
|
|
5
|
+
// 检查是否为系统配置
|
|
6
|
+
const config = await befly.db.getDetail({
|
|
7
|
+
table: 'addon_admin_sys_config',
|
|
8
|
+
where: { id: ctx.body.id }
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
if (!config) {
|
|
12
|
+
return befly.tool.No('配置不存在');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (config.isSystem === 1) {
|
|
16
|
+
return befly.tool.No('系统配置不允许删除');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
await befly.db.delData({
|
|
20
|
+
table: 'addon_admin_sys_config',
|
|
21
|
+
where: { id: ctx.body.id }
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return befly.tool.Yes('操作成功');
|
|
25
|
+
} catch (error) {
|
|
26
|
+
befly.logger.error({ err: error }, '删除系统配置失败');
|
|
27
|
+
return befly.tool.No('操作失败');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: '根据代码获取配置值',
|
|
3
|
+
auth: false,
|
|
4
|
+
handler: async (befly, ctx) => {
|
|
5
|
+
const config = await befly.db.getDetail({
|
|
6
|
+
table: 'addon_admin_sys_config',
|
|
7
|
+
fields: ['code', 'value', 'valueType'],
|
|
8
|
+
where: { code: ctx.body.code }
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
if (!config) {
|
|
12
|
+
return befly.tool.No('配置不存在');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// 根据类型转换值
|
|
16
|
+
let value = config.value;
|
|
17
|
+
if (config.valueType === 'number') {
|
|
18
|
+
value = Number(config.value);
|
|
19
|
+
} else if (config.valueType === 'boolean') {
|
|
20
|
+
value = config.value === 'true' || config.value === '1';
|
|
21
|
+
} else if (config.valueType === 'json') {
|
|
22
|
+
try {
|
|
23
|
+
value = JSON.parse(config.value);
|
|
24
|
+
} catch {
|
|
25
|
+
value = config.value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return befly.tool.Yes('操作成功', { code: config.code, value: value });
|
|
30
|
+
}
|
|
31
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import sysConfigTable from '../../tables/sysConfig.json';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: '添加系统配置',
|
|
5
|
+
fields: sysConfigTable,
|
|
6
|
+
handler: async (befly, ctx) => {
|
|
7
|
+
try {
|
|
8
|
+
// 检查 code 是否已存在
|
|
9
|
+
const existing = await befly.db.getDetail({
|
|
10
|
+
table: 'addon_admin_sys_config',
|
|
11
|
+
where: { code: ctx.body.code }
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (existing) {
|
|
15
|
+
return befly.tool.No('配置代码已存在');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const configId = await befly.db.insData({
|
|
19
|
+
table: 'addon_admin_sys_config',
|
|
20
|
+
data: {
|
|
21
|
+
name: ctx.body.name,
|
|
22
|
+
code: ctx.body.code,
|
|
23
|
+
value: ctx.body.value,
|
|
24
|
+
valueType: ctx.body.valueType || 'string',
|
|
25
|
+
group: ctx.body.group || '',
|
|
26
|
+
sort: ctx.body.sort || 0,
|
|
27
|
+
isSystem: ctx.body.isSystem || 0,
|
|
28
|
+
description: ctx.body.description || ''
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
return befly.tool.Yes('操作成功', { id: configId });
|
|
33
|
+
} catch (error) {
|
|
34
|
+
befly.logger.error({ err: error }, '添加系统配置失败');
|
|
35
|
+
return befly.tool.No('操作失败');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|