@befly-addon/admin 1.1.29 → 1.1.31
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 +29 -24
- package/apis/admin/del.ts +12 -12
- package/apis/admin/detail.ts +9 -41
- package/apis/admin/ins.ts +28 -21
- package/apis/admin/list.ts +12 -12
- package/apis/admin/upd.ts +49 -14
- package/apis/api/all.ts +14 -10
- package/apis/api/list.ts +16 -25
- package/apis/auth/login.ts +55 -52
- package/apis/auth/sendSmsCode.ts +6 -6
- package/apis/dashboard/configStatus.ts +18 -18
- package/apis/dashboard/environmentInfo.ts +12 -12
- package/apis/dashboard/performanceMetrics.ts +5 -5
- package/apis/dashboard/permissionStats.ts +7 -7
- package/apis/dashboard/serviceStatus.ts +29 -29
- package/apis/dashboard/systemInfo.ts +5 -5
- package/apis/dashboard/systemOverview.ts +7 -7
- package/apis/dashboard/systemResources.ts +8 -8
- package/apis/dict/all.ts +24 -7
- package/apis/dict/del.ts +9 -17
- package/apis/dict/detail.ts +30 -16
- package/apis/dict/ins.ts +36 -18
- package/apis/dict/items.ts +27 -0
- package/apis/dict/list.ts +35 -10
- package/apis/dict/upd.ts +54 -20
- package/apis/dictType/all.ts +11 -0
- package/apis/dictType/del.ts +32 -0
- package/apis/dictType/detail.ts +17 -0
- package/apis/dictType/ins.ts +30 -0
- package/apis/dictType/list.ts +22 -0
- package/apis/dictType/upd.ts +42 -0
- package/apis/email/config.ts +4 -4
- package/apis/email/logList.ts +10 -10
- package/apis/email/send.ts +18 -18
- package/apis/email/verify.ts +5 -5
- package/apis/loginLog/list.ts +10 -10
- package/apis/menu/all.ts +17 -20
- package/apis/menu/list.ts +12 -13
- package/apis/operateLog/list.ts +10 -10
- package/apis/role/all.ts +7 -7
- package/apis/role/apiSave.ts +14 -16
- package/apis/role/apis.ts +24 -0
- package/apis/role/del.ts +27 -19
- package/apis/role/detail.ts +6 -7
- package/apis/role/ins.ts +10 -10
- package/apis/role/list.ts +11 -11
- package/apis/role/menuSave.ts +12 -14
- package/apis/role/menus.ts +24 -0
- package/apis/role/save.ts +14 -15
- package/apis/role/upd.ts +10 -10
- package/apis/sysConfig/all.ts +5 -6
- package/apis/sysConfig/del.ts +10 -10
- package/apis/sysConfig/get.ts +10 -11
- package/apis/sysConfig/ins.ts +11 -11
- package/apis/sysConfig/list.ts +9 -9
- package/apis/sysConfig/upd.ts +11 -11
- package/libs/emailHelper.ts +7 -7
- package/package.json +46 -34
- package/plugins/email.ts +9 -9
- package/tables/admin.json +0 -6
- package/tables/dict.json +13 -19
- package/tables/dictType.json +28 -0
- package/tables/role.json +4 -2
- package/views/403_1/index.vue +19 -3
- package/views/config/dict/components/edit.vue +76 -124
- package/views/config/dict/index.vue +142 -84
- package/views/config/dictType/components/edit.vue +105 -0
- package/views/config/dictType/index.vue +242 -0
- package/views/config/index.vue +12 -0
- package/views/config/system/components/edit.vue +36 -36
- package/views/config/system/index.vue +79 -50
- package/views/index/components/addonList.vue +3 -3
- package/views/index/components/environmentInfo.vue +10 -10
- package/views/index/components/operationLogs.vue +10 -10
- package/views/index/components/performanceMetrics.vue +8 -8
- package/views/index/components/quickActions.vue +3 -3
- package/views/index/components/serviceStatus.vue +19 -19
- package/views/index/components/systemNotifications.vue +12 -12
- package/views/index/components/systemOverview.vue +7 -7
- package/views/index/components/systemResources.vue +11 -11
- package/views/index/components/userInfo.vue +20 -19
- package/views/index/index.vue +12 -5
- package/views/log/email/index.vue +58 -51
- package/views/log/index.vue +12 -0
- package/views/log/login/index.vue +45 -38
- package/views/log/operate/index.vue +55 -48
- package/views/login_1/index.vue +191 -2
- package/views/people/admin/components/edit.vue +28 -29
- package/views/people/admin/index.vue +76 -40
- package/views/people/index.vue +12 -0
- package/views/permission/api/index.vue +21 -15
- package/views/permission/index.vue +12 -0
- package/views/permission/menu/index.vue +31 -16
- package/views/permission/role/components/api.vue +23 -23
- package/views/permission/role/components/edit.vue +18 -18
- package/views/permission/role/components/menu.vue +17 -19
- package/views/permission/role/index.vue +84 -49
- package/apis/admin/roleDetail.ts +0 -29
- package/apis/admin/roleSave.ts +0 -39
- package/apis/auth/logout.ts +0 -17
- package/apis/auth/register.ts +0 -43
- package/apis/dashboard/changelog.ts +0 -31
- package/apis/role/apiDetail.ts +0 -24
- package/apis/role/menuDetail.ts +0 -24
- package/views/403_1/meta.json +0 -4
- package/views/config/dict/meta.json +0 -4
- package/views/config/meta.json +0 -4
- package/views/config/system/meta.json +0 -4
- package/views/index/meta.json +0 -4
- package/views/log/email/meta.json +0 -4
- package/views/log/login/meta.json +0 -4
- package/views/log/meta.json +0 -4
- package/views/log/operate/meta.json +0 -4
- package/views/login_1/components/emailLoginForm.vue +0 -174
- package/views/login_1/components/registerForm.vue +0 -175
- package/views/login_1/components/welcomePanel.vue +0 -61
- package/views/login_1/meta.json +0 -4
- package/views/people/admin/meta.json +0 -4
- package/views/people/meta.json +0 -4
- package/views/permission/api/meta.json +0 -4
- package/views/permission/menu/meta.json +0 -4
- package/views/permission/meta.json +0 -4
- package/views/permission/role/meta.json +0 -4
package/apis/auth/login.ts
CHANGED
|
@@ -1,100 +1,103 @@
|
|
|
1
|
-
|
|
1
|
+
import { UAParser } from "ua-parser-js";
|
|
2
2
|
|
|
3
|
-
import adminTable from
|
|
3
|
+
import adminTable from "../../tables/admin.json";
|
|
4
4
|
|
|
5
5
|
export default {
|
|
6
|
-
name:
|
|
6
|
+
name: "管理员登录",
|
|
7
7
|
auth: false,
|
|
8
8
|
fields: {
|
|
9
9
|
account: {
|
|
10
|
-
name:
|
|
11
|
-
type:
|
|
10
|
+
name: "账号",
|
|
11
|
+
type: "string",
|
|
12
12
|
min: 3,
|
|
13
13
|
max: 100
|
|
14
14
|
},
|
|
15
|
-
password: adminTable.password
|
|
15
|
+
password: adminTable.password,
|
|
16
|
+
loginType: {
|
|
17
|
+
name: "登录类型",
|
|
18
|
+
type: "string",
|
|
19
|
+
regexp: "^(username|email|phone)$"
|
|
20
|
+
}
|
|
16
21
|
},
|
|
17
|
-
required: [
|
|
22
|
+
required: ["account", "password", "loginType"],
|
|
18
23
|
handler: async (befly, ctx) => {
|
|
19
24
|
// 解析 User-Agent
|
|
20
|
-
const userAgent = ctx.req.headers.get(
|
|
25
|
+
const userAgent = ctx.req.headers.get("user-agent") || "";
|
|
21
26
|
const uaResult = UAParser(userAgent);
|
|
22
27
|
|
|
23
28
|
// 日志数据(公共部分)
|
|
24
29
|
const logData = {
|
|
25
30
|
adminId: 0,
|
|
26
31
|
username: ctx.body.account,
|
|
27
|
-
nickname:
|
|
28
|
-
ip: ctx.ip ||
|
|
32
|
+
nickname: "",
|
|
33
|
+
ip: ctx.ip || "unknown",
|
|
29
34
|
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 ||
|
|
35
|
-
deviceVendor: uaResult.device.vendor ||
|
|
36
|
-
deviceModel: uaResult.device.model ||
|
|
37
|
-
engineName: uaResult.engine.name ||
|
|
38
|
-
cpuArchitecture: uaResult.cpu.architecture ||
|
|
35
|
+
browserName: uaResult.browser.name || "",
|
|
36
|
+
browserVersion: uaResult.browser.version || "",
|
|
37
|
+
osName: uaResult.os.name || "",
|
|
38
|
+
osVersion: uaResult.os.version || "",
|
|
39
|
+
deviceType: uaResult.device.type || "desktop",
|
|
40
|
+
deviceVendor: uaResult.device.vendor || "",
|
|
41
|
+
deviceModel: uaResult.device.model || "",
|
|
42
|
+
engineName: uaResult.engine.name || "",
|
|
43
|
+
cpuArchitecture: uaResult.cpu.architecture || "",
|
|
39
44
|
loginTime: Date.now(),
|
|
40
45
|
loginResult: 0,
|
|
41
|
-
failReason:
|
|
46
|
+
failReason: ""
|
|
42
47
|
};
|
|
43
48
|
|
|
44
|
-
//
|
|
49
|
+
// 根据登录类型构建查询条件
|
|
50
|
+
const whereCondition: Record<string, any> = {};
|
|
51
|
+
if (ctx.body.loginType === "username") {
|
|
52
|
+
whereCondition.username = ctx.body.account;
|
|
53
|
+
} else if (ctx.body.loginType === "email") {
|
|
54
|
+
whereCondition.email = ctx.body.account;
|
|
55
|
+
} else if (ctx.body.loginType === "phone") {
|
|
56
|
+
whereCondition.phone = ctx.body.account;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 查询管理员
|
|
45
60
|
const admin = await befly.db.getOne({
|
|
46
|
-
table:
|
|
47
|
-
where:
|
|
48
|
-
$or: [{ username: ctx.body.account }, { email: ctx.body.account }]
|
|
49
|
-
}
|
|
61
|
+
table: "addon_admin_admin",
|
|
62
|
+
where: whereCondition
|
|
50
63
|
});
|
|
51
64
|
|
|
52
65
|
if (!admin?.id) {
|
|
53
|
-
logData.failReason =
|
|
54
|
-
await befly.db.insData({ table:
|
|
55
|
-
return befly.tool.No(
|
|
66
|
+
logData.failReason = "账号不存在";
|
|
67
|
+
await befly.db.insData({ table: "addon_admin_login_log", data: logData });
|
|
68
|
+
return befly.tool.No("账号或密码错误");
|
|
56
69
|
}
|
|
57
70
|
|
|
58
71
|
// 更新日志数据(已找到用户)
|
|
59
72
|
logData.adminId = admin.id;
|
|
60
73
|
logData.username = admin.username;
|
|
61
|
-
logData.nickname = admin.nickname ||
|
|
74
|
+
logData.nickname = admin.nickname || "";
|
|
62
75
|
|
|
63
76
|
// 验证密码
|
|
64
77
|
try {
|
|
65
78
|
const isValid = await befly.cipher.verifyPassword(ctx.body.password, admin.password);
|
|
66
79
|
if (!isValid) {
|
|
67
|
-
logData.failReason =
|
|
68
|
-
await befly.db.insData({ table:
|
|
69
|
-
return befly.tool.No(
|
|
80
|
+
logData.failReason = "密码错误";
|
|
81
|
+
await befly.db.insData({ table: "addon_admin_login_log", data: logData });
|
|
82
|
+
return befly.tool.No("账号或密码错误");
|
|
70
83
|
}
|
|
71
84
|
} catch (error: any) {
|
|
72
|
-
befly.logger.error({ err: error },
|
|
73
|
-
logData.failReason =
|
|
74
|
-
await befly.db.insData({ table:
|
|
75
|
-
return befly.tool.No(
|
|
85
|
+
befly.logger.error({ err: error }, "密码验证失败");
|
|
86
|
+
logData.failReason = "密码格式错误";
|
|
87
|
+
await befly.db.insData({ table: "addon_admin_login_log", data: logData });
|
|
88
|
+
return befly.tool.No("密码格式错误,请重新设置密码");
|
|
76
89
|
}
|
|
77
90
|
|
|
78
91
|
// 检查账号状态(state=1 表示正常,state=2 表示禁用)
|
|
79
92
|
if (admin.state === 2) {
|
|
80
|
-
logData.failReason =
|
|
81
|
-
await befly.db.insData({ table:
|
|
82
|
-
return befly.tool.No(
|
|
93
|
+
logData.failReason = "账号已被禁用";
|
|
94
|
+
await befly.db.insData({ table: "addon_admin_login_log", data: logData });
|
|
95
|
+
return befly.tool.No("账号已被禁用");
|
|
83
96
|
}
|
|
84
97
|
|
|
85
98
|
// 登录成功,记录日志
|
|
86
99
|
logData.loginResult = 1;
|
|
87
|
-
await befly.db.insData({ table:
|
|
88
|
-
|
|
89
|
-
// 更新最后登录信息
|
|
90
|
-
await befly.db.updData({
|
|
91
|
-
table: 'addon_admin_admin',
|
|
92
|
-
where: { id: admin.id },
|
|
93
|
-
data: {
|
|
94
|
-
lastLoginTime: Date.now(),
|
|
95
|
-
lastLoginIp: ctx.ip || 'unknown'
|
|
96
|
-
}
|
|
97
|
-
});
|
|
100
|
+
await befly.db.insData({ table: "addon_admin_login_log", data: logData });
|
|
98
101
|
|
|
99
102
|
// 生成 JWT Token(包含核心身份信息)
|
|
100
103
|
const token = await befly.jwt.sign(
|
|
@@ -105,14 +108,14 @@ export default {
|
|
|
105
108
|
roleType: admin.roleType
|
|
106
109
|
},
|
|
107
110
|
{
|
|
108
|
-
expiresIn:
|
|
111
|
+
expiresIn: "30d"
|
|
109
112
|
}
|
|
110
113
|
);
|
|
111
114
|
|
|
112
115
|
// 返回用户信息(不包含密码)
|
|
113
116
|
const { password: _, ...userWithoutPassword } = admin;
|
|
114
117
|
|
|
115
|
-
return befly.tool.Yes(
|
|
118
|
+
return befly.tool.Yes("登录成功", {
|
|
116
119
|
token: token,
|
|
117
120
|
userInfo: userWithoutPassword
|
|
118
121
|
});
|
package/apis/auth/sendSmsCode.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import adminTable from "../../tables/admin.json";
|
|
2
2
|
|
|
3
3
|
export default {
|
|
4
|
-
name:
|
|
4
|
+
name: "发送短信验证码",
|
|
5
5
|
auth: false,
|
|
6
6
|
fields: {
|
|
7
7
|
phone: adminTable.phone
|
|
8
8
|
},
|
|
9
|
-
required: [
|
|
9
|
+
required: ["phone"],
|
|
10
10
|
handler: async (befly, ctx) => {
|
|
11
11
|
// 生成6位数验证码
|
|
12
12
|
const code = Math.floor(100000 + Math.random() * 900000).toString();
|
|
@@ -19,12 +19,12 @@ export default {
|
|
|
19
19
|
// 如果项目没有 Redis,也可以存储到数据库中
|
|
20
20
|
if (befly.redis) {
|
|
21
21
|
const key = `sms_code:${ctx.body.phone}`;
|
|
22
|
-
await befly.redis.set(key, code,
|
|
22
|
+
await befly.redis.set(key, code, "EX", 300); // 5分钟过期
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// 开发环境下返回验证码(生产环境应该删除)
|
|
26
|
-
const isDev = befly.config.nodeEnv ===
|
|
26
|
+
const isDev = befly.config.nodeEnv === "development";
|
|
27
27
|
|
|
28
|
-
return befly.tool.Yes(
|
|
28
|
+
return befly.tool.Yes("验证码已发送", isDev ? { code } : null);
|
|
29
29
|
}
|
|
30
30
|
};
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
3
|
-
handler: async (befly
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取配置状态",
|
|
3
|
+
handler: async (befly) => {
|
|
4
4
|
const status = {
|
|
5
|
-
database: { status:
|
|
6
|
-
redis: { status:
|
|
7
|
-
fileSystem: { status:
|
|
8
|
-
email: { status:
|
|
9
|
-
oss: { status:
|
|
5
|
+
database: { status: "ok", latency: 0 },
|
|
6
|
+
redis: { status: "ok", latency: 0 },
|
|
7
|
+
fileSystem: { status: "ok" },
|
|
8
|
+
email: { status: "warning", message: "未配置" },
|
|
9
|
+
oss: { status: "warning", message: "未配置" }
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
// 检查数据库连接
|
|
13
13
|
try {
|
|
14
14
|
const startTime = Date.now();
|
|
15
|
-
await befly.db.query(
|
|
15
|
+
await befly.db.query("SELECT 1");
|
|
16
16
|
status.database.latency = Date.now() - startTime;
|
|
17
|
-
status.database.status =
|
|
18
|
-
} catch
|
|
19
|
-
status.database.status =
|
|
20
|
-
status.database.message =
|
|
17
|
+
status.database.status = "ok";
|
|
18
|
+
} catch {
|
|
19
|
+
status.database.status = "error";
|
|
20
|
+
status.database.message = "连接失败";
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
// 检查 Redis 连接
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
const startTime = Date.now();
|
|
26
26
|
await befly.redis.ping();
|
|
27
27
|
status.redis.latency = Date.now() - startTime;
|
|
28
|
-
status.redis.status =
|
|
29
|
-
} catch
|
|
30
|
-
status.redis.status =
|
|
31
|
-
status.redis.message =
|
|
28
|
+
status.redis.status = "ok";
|
|
29
|
+
} catch {
|
|
30
|
+
status.redis.status = "error";
|
|
31
|
+
status.redis.message = "连接失败";
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
return befly.tool.Yes(
|
|
34
|
+
return befly.tool.Yes("获取成功", status);
|
|
35
35
|
}
|
|
36
36
|
};
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
|
|
1
|
+
import os from "node:os";
|
|
2
2
|
|
|
3
3
|
export default {
|
|
4
|
-
name:
|
|
5
|
-
handler: async (befly
|
|
4
|
+
name: "获取运行环境信息",
|
|
5
|
+
handler: async (befly) => {
|
|
6
6
|
// 获取数据库版本
|
|
7
|
-
let databaseVersion =
|
|
7
|
+
let databaseVersion = "Unknown";
|
|
8
8
|
try {
|
|
9
|
-
const versionResult = await befly.db.query(
|
|
10
|
-
databaseVersion = versionResult?.[0]?.version ||
|
|
11
|
-
} catch
|
|
9
|
+
const versionResult = await befly.db.query("SELECT VERSION() as version");
|
|
10
|
+
databaseVersion = versionResult?.[0]?.version || "Unknown";
|
|
11
|
+
} catch {
|
|
12
12
|
// 忽略错误
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
// 获取 Redis 版本
|
|
16
|
-
let redisVersion =
|
|
16
|
+
let redisVersion = "未配置";
|
|
17
17
|
if (befly.redis) {
|
|
18
18
|
try {
|
|
19
|
-
const info = await befly.redis.info(
|
|
19
|
+
const info = await befly.redis.info("server");
|
|
20
20
|
const match = info.match(/redis_version:([^\r\n]+)/);
|
|
21
21
|
if (match) {
|
|
22
22
|
redisVersion = match[1];
|
|
23
23
|
}
|
|
24
|
-
} catch
|
|
25
|
-
redisVersion =
|
|
24
|
+
} catch {
|
|
25
|
+
redisVersion = "未知";
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
return befly.tool.Yes(
|
|
29
|
+
return befly.tool.Yes("获取成功", {
|
|
30
30
|
os: `${os.type()} ${os.arch()}`,
|
|
31
31
|
server: `${os.platform()} ${os.release()}`,
|
|
32
32
|
nodeVersion: process.version,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
3
|
-
handler: async (befly
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取性能指标",
|
|
3
|
+
handler: async (befly) => {
|
|
4
4
|
// 实际项目中,这些数据应该从监控系统或日志中获取
|
|
5
5
|
// 这里提供示例数据结构
|
|
6
|
-
return befly.tool.Yes(
|
|
6
|
+
return befly.tool.Yes("获取成功", {
|
|
7
7
|
avgResponseTime: 125,
|
|
8
8
|
qps: 856,
|
|
9
9
|
errorRate: 0.8,
|
|
10
10
|
activeConnections: 45,
|
|
11
11
|
slowestApi: {
|
|
12
|
-
path:
|
|
12
|
+
path: "/addon/admin/menuList",
|
|
13
13
|
time: 450
|
|
14
14
|
}
|
|
15
15
|
});
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
3
|
-
handler: async (befly
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取权限统计",
|
|
3
|
+
handler: async (befly) => {
|
|
4
4
|
// 统计菜单数量
|
|
5
5
|
const menuCount = await befly.db.count({
|
|
6
|
-
table:
|
|
6
|
+
table: "addon_admin_menu"
|
|
7
7
|
});
|
|
8
8
|
|
|
9
9
|
// 统计接口数量
|
|
10
10
|
const apiCount = await befly.db.count({
|
|
11
|
-
table:
|
|
11
|
+
table: "addon_admin_api"
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
// 统计角色数量
|
|
15
15
|
const roleCount = await befly.db.count({
|
|
16
|
-
table:
|
|
16
|
+
table: "addon_admin_role"
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
return befly.tool.Yes(
|
|
19
|
+
return befly.tool.Yes("获取成功", {
|
|
20
20
|
menuCount: menuCount,
|
|
21
21
|
apiCount: apiCount,
|
|
22
22
|
roleCount: roleCount
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
3
|
-
handler: async (befly
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取服务状态",
|
|
3
|
+
handler: async (befly) => {
|
|
4
4
|
const services = [];
|
|
5
5
|
|
|
6
6
|
// 数据库状态
|
|
7
7
|
try {
|
|
8
8
|
const startTime = Date.now();
|
|
9
|
-
await befly.db.query(
|
|
9
|
+
await befly.db.query("SELECT 1");
|
|
10
10
|
const responseTime = Date.now() - startTime;
|
|
11
11
|
services.push({
|
|
12
|
-
name:
|
|
13
|
-
status:
|
|
12
|
+
name: "数据库",
|
|
13
|
+
status: "running",
|
|
14
14
|
responseTime: `${responseTime}ms`
|
|
15
15
|
});
|
|
16
16
|
} catch (error) {
|
|
17
|
-
befly.logger.error({ err: error },
|
|
17
|
+
befly.logger.error({ err: error }, "数据库状态检测失败");
|
|
18
18
|
services.push({
|
|
19
|
-
name:
|
|
20
|
-
status:
|
|
21
|
-
responseTime:
|
|
19
|
+
name: "数据库",
|
|
20
|
+
status: "stopped",
|
|
21
|
+
responseTime: "-"
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -29,47 +29,47 @@
|
|
|
29
29
|
await befly.redis.ping();
|
|
30
30
|
const responseTime = Date.now() - startTime;
|
|
31
31
|
services.push({
|
|
32
|
-
name:
|
|
33
|
-
status:
|
|
32
|
+
name: "Redis",
|
|
33
|
+
status: "running",
|
|
34
34
|
responseTime: `${responseTime}ms`
|
|
35
35
|
});
|
|
36
36
|
} catch (error) {
|
|
37
|
-
befly.logger.error({ err: error },
|
|
37
|
+
befly.logger.error({ err: error }, "Redis状态检测失败");
|
|
38
38
|
services.push({
|
|
39
|
-
name:
|
|
40
|
-
status:
|
|
41
|
-
responseTime:
|
|
39
|
+
name: "Redis",
|
|
40
|
+
status: "stopped",
|
|
41
|
+
responseTime: "-"
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
} else {
|
|
45
45
|
services.push({
|
|
46
|
-
name:
|
|
47
|
-
status:
|
|
48
|
-
responseTime:
|
|
46
|
+
name: "Redis",
|
|
47
|
+
status: "stopped",
|
|
48
|
+
responseTime: "-"
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
// 文件系统状态
|
|
53
53
|
services.push({
|
|
54
|
-
name:
|
|
55
|
-
status:
|
|
56
|
-
responseTime:
|
|
54
|
+
name: "文件系统",
|
|
55
|
+
status: "running",
|
|
56
|
+
responseTime: "-"
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
// 邮件服务状态(示例)
|
|
60
60
|
services.push({
|
|
61
|
-
name:
|
|
62
|
-
status:
|
|
63
|
-
responseTime:
|
|
61
|
+
name: "邮件服务",
|
|
62
|
+
status: "unconfigured",
|
|
63
|
+
responseTime: "-"
|
|
64
64
|
});
|
|
65
65
|
|
|
66
66
|
// OSS存储状态(示例)
|
|
67
67
|
services.push({
|
|
68
|
-
name:
|
|
69
|
-
status:
|
|
70
|
-
responseTime:
|
|
68
|
+
name: "OSS存储",
|
|
69
|
+
status: "unconfigured",
|
|
70
|
+
responseTime: "-"
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
return befly.tool.Yes(
|
|
73
|
+
return befly.tool.Yes("获取成功", { services });
|
|
74
74
|
}
|
|
75
75
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
3
|
-
handler: async (befly
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取系统信息",
|
|
3
|
+
handler: async (befly) => {
|
|
4
4
|
// 系统启动时间(从进程启动时间计算)
|
|
5
5
|
const startTime = Date.now() - Math.floor(process.uptime() * 1000);
|
|
6
6
|
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
const uptime = Math.floor(process.uptime() * 1000);
|
|
9
9
|
|
|
10
10
|
// 环境
|
|
11
|
-
const environment = Env.NODE_ENV ||
|
|
11
|
+
const environment = Env.NODE_ENV || "development";
|
|
12
12
|
|
|
13
|
-
return befly.tool.Yes(
|
|
13
|
+
return befly.tool.Yes("获取成功", {
|
|
14
14
|
environment: environment,
|
|
15
15
|
startTime: startTime,
|
|
16
16
|
uptime: uptime
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
3
|
-
handler: async (befly
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取系统概览数据",
|
|
3
|
+
handler: async (befly) => {
|
|
4
4
|
// 权限统计
|
|
5
5
|
const menuCount = await befly.db.getCount({
|
|
6
|
-
table:
|
|
6
|
+
table: "addon_admin_menu",
|
|
7
7
|
where: { state: 1 }
|
|
8
8
|
});
|
|
9
9
|
|
|
10
10
|
const roleCount = await befly.db.getCount({
|
|
11
|
-
table:
|
|
11
|
+
table: "addon_admin_role",
|
|
12
12
|
where: { state: 1 }
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
const apiCount = await befly.db.getCount({
|
|
16
|
-
table:
|
|
16
|
+
table: "addon_admin_api",
|
|
17
17
|
where: { state: 1 }
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
-
return befly.tool.Yes(
|
|
20
|
+
return befly.tool.Yes("获取成功", {
|
|
21
21
|
menuCount,
|
|
22
22
|
roleCount,
|
|
23
23
|
apiCount
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import { promisify } from
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
4
|
|
|
5
5
|
export default {
|
|
6
|
-
name:
|
|
6
|
+
name: "获取系统资源",
|
|
7
7
|
auth: true,
|
|
8
8
|
fields: {},
|
|
9
|
-
handler: async (befly
|
|
9
|
+
handler: async (befly) => {
|
|
10
10
|
// CPU 使用率
|
|
11
11
|
const cpus = os.cpus();
|
|
12
12
|
const cpuCount = cpus.length; // 逻辑核心数(包括超线程)
|
|
@@ -84,17 +84,17 @@ export default {
|
|
|
84
84
|
}
|
|
85
85
|
} else {
|
|
86
86
|
// statfs 不可用,返回默认值
|
|
87
|
-
befly.logger.warn(
|
|
87
|
+
befly.logger.warn("fs.statfs 不可用,无法获取磁盘信息");
|
|
88
88
|
}
|
|
89
89
|
} catch (error) {
|
|
90
|
-
befly.logger.warn({ err: error },
|
|
90
|
+
befly.logger.warn({ err: error }, "获取磁盘信息失败");
|
|
91
91
|
// 获取失败时返回 0
|
|
92
92
|
diskPercentage = 0;
|
|
93
93
|
diskUsed = 0;
|
|
94
94
|
diskTotal = 0;
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
return befly.tool.Yes(
|
|
97
|
+
return befly.tool.Yes("获取成功", {
|
|
98
98
|
cpu: {
|
|
99
99
|
usage: cpuUsage,
|
|
100
100
|
cores: cpuCount
|
package/apis/dict/all.ts
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取所有字典",
|
|
3
3
|
handler: async (befly) => {
|
|
4
|
-
const
|
|
5
|
-
table:
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const result = await befly.db.getAll({
|
|
5
|
+
table: "addon_admin_dict",
|
|
6
|
+
joins: [
|
|
7
|
+
{
|
|
8
|
+
table: "addon_admin_dict_type",
|
|
9
|
+
on: "addon_admin_dict.type_code = addon_admin_dict_type.code"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
fields: [
|
|
13
|
+
//
|
|
14
|
+
"addon_admin_dict.id",
|
|
15
|
+
"addon_admin_dict.typeCode",
|
|
16
|
+
"addon_admin_dict.key",
|
|
17
|
+
"addon_admin_dict.label",
|
|
18
|
+
"addon_admin_dict.sort",
|
|
19
|
+
"addon_admin_dict.remark",
|
|
20
|
+
"addon_admin_dict.createdAt",
|
|
21
|
+
"addon_admin_dict.updatedAt",
|
|
22
|
+
"addon_admin_dict_type.name AS typeName"
|
|
23
|
+
],
|
|
24
|
+
orderBy: ["addon_admin_dict.sort#ASC", "addon_admin_dict.id#ASC"]
|
|
8
25
|
});
|
|
9
26
|
|
|
10
|
-
return befly.tool.Yes(
|
|
27
|
+
return befly.tool.Yes("获取成功", result);
|
|
11
28
|
}
|
|
12
29
|
};
|
package/apis/dict/del.ts
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
name:
|
|
3
|
-
fields: {
|
|
4
|
-
|
|
5
|
-
},
|
|
1
|
+
export default {
|
|
2
|
+
name: "删除字典",
|
|
3
|
+
fields: { "@id": true },
|
|
4
|
+
required: ["id"],
|
|
6
5
|
handler: async (befly, ctx) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
id: ctx.body.id
|
|
12
|
-
}
|
|
13
|
-
});
|
|
6
|
+
await befly.db.delData({
|
|
7
|
+
table: "addon_admin_dict",
|
|
8
|
+
where: { id: ctx.body.id }
|
|
9
|
+
});
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
} catch (error) {
|
|
17
|
-
befly.logger.error({ err: error }, '删除字典失败');
|
|
18
|
-
return befly.tool.No('操作失败');
|
|
19
|
-
}
|
|
11
|
+
return befly.tool.Yes("删除成功");
|
|
20
12
|
}
|
|
21
13
|
};
|