befly 3.17.0 → 3.17.3
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/README.md +6 -0
- package/apis/admin/cacheRefresh.js +122 -0
- package/apis/admin/del.js +34 -0
- package/apis/admin/detail.js +23 -0
- package/apis/admin/ins.js +69 -0
- package/apis/admin/list.js +28 -0
- package/apis/admin/upd.js +95 -0
- package/apis/api/all.js +24 -0
- package/apis/api/list.js +31 -0
- package/apis/auth/login.js +123 -0
- package/apis/auth/sendSmsCode.js +24 -0
- package/apis/dashboard/configStatus.js +39 -0
- package/apis/dashboard/environmentInfo.js +43 -0
- package/apis/dashboard/performanceMetrics.js +20 -0
- package/apis/dashboard/permissionStats.js +27 -0
- package/apis/dashboard/serviceStatus.js +75 -0
- package/apis/dashboard/systemInfo.js +19 -0
- package/apis/dashboard/systemOverview.js +30 -0
- package/apis/dashboard/systemResources.js +106 -0
- package/apis/dict/all.js +23 -0
- package/apis/dict/del.js +16 -0
- package/apis/dict/detail.js +27 -0
- package/apis/dict/ins.js +51 -0
- package/apis/dict/items.js +30 -0
- package/apis/dict/list.js +36 -0
- package/apis/dict/upd.js +74 -0
- package/apis/dictType/all.js +16 -0
- package/apis/dictType/del.js +38 -0
- package/apis/dictType/detail.js +20 -0
- package/apis/dictType/ins.js +37 -0
- package/apis/dictType/list.js +26 -0
- package/apis/dictType/upd.js +51 -0
- package/apis/email/config.js +25 -0
- package/apis/email/logList.js +23 -0
- package/apis/email/send.js +66 -0
- package/apis/email/verify.js +21 -0
- package/apis/loginLog/list.js +23 -0
- package/apis/menu/all.js +41 -0
- package/apis/menu/list.js +25 -0
- package/apis/operateLog/list.js +23 -0
- package/apis/role/all.js +21 -0
- package/apis/role/apiSave.js +43 -0
- package/apis/role/apis.js +22 -0
- package/apis/role/del.js +49 -0
- package/apis/role/detail.js +32 -0
- package/apis/role/ins.js +46 -0
- package/apis/role/list.js +27 -0
- package/apis/role/menuSave.js +42 -0
- package/apis/role/menus.js +22 -0
- package/apis/role/save.js +40 -0
- package/apis/role/upd.js +50 -0
- package/apis/sysConfig/all.js +16 -0
- package/apis/sysConfig/del.js +36 -0
- package/apis/sysConfig/get.js +49 -0
- package/apis/sysConfig/ins.js +50 -0
- package/apis/sysConfig/list.js +24 -0
- package/apis/sysConfig/upd.js +62 -0
- package/checks/api.js +55 -0
- package/checks/config.js +107 -0
- package/checks/hook.js +38 -0
- package/checks/menu.js +58 -0
- package/checks/plugin.js +38 -0
- package/checks/table.js +78 -0
- package/configs/beflyConfig.json +61 -0
- package/configs/beflyMenus.json +85 -0
- package/configs/constConfig.js +34 -0
- package/configs/regexpAlias.json +55 -0
- package/hooks/auth.js +34 -0
- package/hooks/cors.js +39 -0
- package/hooks/parser.js +90 -0
- package/hooks/permission.js +71 -0
- package/hooks/validator.js +43 -0
- package/index.js +334 -0
- package/lib/cacheHelper.js +483 -0
- package/lib/cacheKeys.js +42 -0
- package/lib/connect.js +120 -0
- package/lib/dbHelper/builders.js +698 -0
- package/lib/dbHelper/context.js +131 -0
- package/lib/dbHelper/dataOps.js +505 -0
- package/lib/dbHelper/execute.js +65 -0
- package/lib/dbHelper/index.js +27 -0
- package/lib/dbHelper/transaction.js +43 -0
- package/lib/dbHelper/util.js +58 -0
- package/lib/dbHelper/validate.js +549 -0
- package/lib/emailHelper.js +110 -0
- package/lib/logger.js +604 -0
- package/lib/redisHelper.js +684 -0
- package/lib/sqlBuilder/batch.js +113 -0
- package/lib/sqlBuilder/check.js +150 -0
- package/lib/sqlBuilder/compiler.js +347 -0
- package/lib/sqlBuilder/errors.js +60 -0
- package/lib/sqlBuilder/index.js +218 -0
- package/lib/sqlBuilder/parser.js +296 -0
- package/lib/sqlBuilder/util.js +260 -0
- package/lib/validator.js +303 -0
- package/package.json +19 -12
- package/paths.js +112 -0
- package/plugins/cache.js +16 -0
- package/plugins/config.js +11 -0
- package/plugins/email.js +27 -0
- package/plugins/logger.js +20 -0
- package/plugins/mysql.js +36 -0
- package/plugins/redis.js +34 -0
- package/plugins/tool.js +155 -0
- package/router/api.js +140 -0
- package/router/static.js +71 -0
- package/sql/admin.sql +18 -0
- package/sql/api.sql +12 -0
- package/sql/dict.sql +13 -0
- package/sql/dictType.sql +12 -0
- package/sql/emailLog.sql +20 -0
- package/sql/loginLog.sql +25 -0
- package/sql/menu.sql +12 -0
- package/sql/operateLog.sql +22 -0
- package/sql/role.sql +14 -0
- package/sql/sysConfig.sql +16 -0
- package/sync/api.js +93 -0
- package/sync/cache.js +13 -0
- package/sync/dev.js +171 -0
- package/sync/menu.js +99 -0
- package/tables/admin.json +56 -0
- package/tables/api.json +26 -0
- package/tables/dict.json +30 -0
- package/tables/dictType.json +24 -0
- package/tables/emailLog.json +61 -0
- package/tables/loginLog.json +86 -0
- package/tables/menu.json +24 -0
- package/tables/operateLog.json +68 -0
- package/tables/role.json +32 -0
- package/tables/sysConfig.json +43 -0
- package/utils/calcPerfTime.js +13 -0
- package/utils/cors.js +17 -0
- package/utils/deepMerge.js +78 -0
- package/utils/fieldClear.js +65 -0
- package/utils/formatYmdHms.js +23 -0
- package/utils/formatZodIssues.js +109 -0
- package/utils/getClientIp.js +47 -0
- package/utils/importDefault.js +51 -0
- package/utils/is.js +462 -0
- package/utils/loggerUtils.js +185 -0
- package/utils/processInfo.js +39 -0
- package/utils/regexpUtil.js +52 -0
- package/utils/response.js +114 -0
- package/utils/scanFiles.js +124 -0
- package/utils/scanSources.js +68 -0
- package/utils/sortModules.js +75 -0
- package/utils/toSessionTtlSeconds.js +14 -0
- package/utils/util.js +374 -0
- package/befly.js +0 -16413
- package/befly.min.js +0 -72
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取性能指标",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
return befly.tool.Yes("获取成功", {
|
|
10
|
+
avgResponseTime: 125,
|
|
11
|
+
qps: 856,
|
|
12
|
+
errorRate: 0.8,
|
|
13
|
+
activeConnections: 45,
|
|
14
|
+
slowestApi: {
|
|
15
|
+
path: "/api/core/menu/list",
|
|
16
|
+
time: 450
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取权限统计",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
const menuCount = await befly.mysql.getCount({
|
|
10
|
+
table: "beflyMenu"
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const apiCount = await befly.mysql.getCount({
|
|
14
|
+
table: "beflyApi"
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const roleCount = await befly.mysql.getCount({
|
|
18
|
+
table: "beflyRole"
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return befly.tool.Yes("获取成功", {
|
|
22
|
+
menuCount: menuCount.data,
|
|
23
|
+
apiCount: apiCount.data,
|
|
24
|
+
roleCount: roleCount.data
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取服务状态",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
const services = [];
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
const startTime = Date.now();
|
|
13
|
+
await befly.mysql.execute("SELECT 1");
|
|
14
|
+
const responseTime = Date.now() - startTime;
|
|
15
|
+
services.push({
|
|
16
|
+
name: "数据库",
|
|
17
|
+
status: "running",
|
|
18
|
+
responseTime: `${responseTime}ms`
|
|
19
|
+
});
|
|
20
|
+
} catch (error) {
|
|
21
|
+
befly.logger.error("数据库状态检测失败", error);
|
|
22
|
+
services.push({
|
|
23
|
+
name: "数据库",
|
|
24
|
+
status: "stopped",
|
|
25
|
+
responseTime: "-"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (befly.redis) {
|
|
30
|
+
try {
|
|
31
|
+
const startTime = Date.now();
|
|
32
|
+
await befly.redis.ping();
|
|
33
|
+
const responseTime = Date.now() - startTime;
|
|
34
|
+
services.push({
|
|
35
|
+
name: "Redis",
|
|
36
|
+
status: "running",
|
|
37
|
+
responseTime: `${responseTime}ms`
|
|
38
|
+
});
|
|
39
|
+
} catch (error) {
|
|
40
|
+
befly.logger.error("Redis状态检测失败", error);
|
|
41
|
+
services.push({
|
|
42
|
+
name: "Redis",
|
|
43
|
+
status: "stopped",
|
|
44
|
+
responseTime: "-"
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
services.push({
|
|
49
|
+
name: "Redis",
|
|
50
|
+
status: "stopped",
|
|
51
|
+
responseTime: "-"
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
services.push({
|
|
56
|
+
name: "文件系统",
|
|
57
|
+
status: "running",
|
|
58
|
+
responseTime: "-"
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
services.push({
|
|
62
|
+
name: "邮件服务",
|
|
63
|
+
status: "unconfigured",
|
|
64
|
+
responseTime: "-"
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
services.push({
|
|
68
|
+
name: "OSS存储",
|
|
69
|
+
status: "unconfigured",
|
|
70
|
+
responseTime: "-"
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return befly.tool.Yes("获取成功", { services: services });
|
|
74
|
+
}
|
|
75
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取系统信息",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
const startTime = Date.now() - Math.floor(process.uptime() * 1000);
|
|
10
|
+
const uptime = Math.floor(process.uptime() * 1000);
|
|
11
|
+
const environment = process.env.RUN_MODE || "development";
|
|
12
|
+
|
|
13
|
+
return befly.tool.Yes("获取成功", {
|
|
14
|
+
environment: environment,
|
|
15
|
+
startTime: startTime,
|
|
16
|
+
uptime: uptime
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取系统概览数据",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
const menuCount = await befly.mysql.getCount({
|
|
10
|
+
table: "beflyMenu",
|
|
11
|
+
where: { state: 1 }
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const roleCount = await befly.mysql.getCount({
|
|
15
|
+
table: "beflyRole",
|
|
16
|
+
where: { state: 1 }
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const apiCount = await befly.mysql.getCount({
|
|
20
|
+
table: "beflyApi",
|
|
21
|
+
where: { state: 1 }
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return befly.tool.Yes("获取成功", {
|
|
25
|
+
menuCount: menuCount.data,
|
|
26
|
+
roleCount: roleCount.data,
|
|
27
|
+
apiCount: apiCount.data
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
name: "获取系统资源",
|
|
7
|
+
method: "POST",
|
|
8
|
+
body: "none",
|
|
9
|
+
auth: true,
|
|
10
|
+
fields: {},
|
|
11
|
+
required: [],
|
|
12
|
+
handler: async (befly) => {
|
|
13
|
+
const cpus = os.cpus();
|
|
14
|
+
const cpuCount = cpus.length;
|
|
15
|
+
|
|
16
|
+
const startMeasure = cpus.map((cpu) => {
|
|
17
|
+
let total = 0;
|
|
18
|
+
for (const value of Object.values(cpu.times)) {
|
|
19
|
+
total += value;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
idle: cpu.times.idle,
|
|
23
|
+
total: total
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
28
|
+
|
|
29
|
+
const endCpus = os.cpus();
|
|
30
|
+
const endMeasure = endCpus.map((cpu) => {
|
|
31
|
+
let total = 0;
|
|
32
|
+
for (const value of Object.values(cpu.times)) {
|
|
33
|
+
total += value;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
idle: cpu.times.idle,
|
|
37
|
+
total: total
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
let totalIdle = 0;
|
|
42
|
+
let totalTick = 0;
|
|
43
|
+
for (let i = 0; i < startMeasure.length; i++) {
|
|
44
|
+
const end = endMeasure[i];
|
|
45
|
+
if (!end) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const idleDiff = end.idle - startMeasure[i].idle;
|
|
49
|
+
const totalDiff = end.total - startMeasure[i].total;
|
|
50
|
+
totalIdle += idleDiff;
|
|
51
|
+
totalTick += totalDiff;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const cpuUsage = totalTick > 0 ? Math.round(((totalTick - totalIdle) / totalTick) * 100) : 0;
|
|
55
|
+
|
|
56
|
+
const totalMem = os.totalmem();
|
|
57
|
+
const freeMem = os.freemem();
|
|
58
|
+
const usedMem = totalMem - freeMem;
|
|
59
|
+
const memoryPercentage = totalMem > 0 ? Math.round((usedMem / totalMem) * 100) : 0;
|
|
60
|
+
|
|
61
|
+
let diskPercentage = 0;
|
|
62
|
+
let diskUsed = 0;
|
|
63
|
+
let diskTotal = 0;
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
if (fs.statfs) {
|
|
67
|
+
const statfsAsync = promisify(fs.statfs);
|
|
68
|
+
const stats = await statfsAsync(process.cwd());
|
|
69
|
+
|
|
70
|
+
const totalSpace = stats.blocks * stats.bsize;
|
|
71
|
+
const freeSpace = stats.bfree * stats.bsize;
|
|
72
|
+
const usedSpace = totalSpace - freeSpace;
|
|
73
|
+
|
|
74
|
+
if (totalSpace > 0) {
|
|
75
|
+
diskTotal = Math.round(totalSpace / 1024 / 1024 / 1024);
|
|
76
|
+
diskUsed = Math.round(usedSpace / 1024 / 1024 / 1024);
|
|
77
|
+
diskPercentage = Math.round((usedSpace / totalSpace) * 100);
|
|
78
|
+
}
|
|
79
|
+
} else {
|
|
80
|
+
befly.logger.warn("fs.statfs 不可用,无法获取磁盘信息");
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
befly.logger.warn("获取磁盘信息失败", { err: error });
|
|
84
|
+
diskPercentage = 0;
|
|
85
|
+
diskUsed = 0;
|
|
86
|
+
diskTotal = 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return befly.tool.Yes("获取成功", {
|
|
90
|
+
cpu: {
|
|
91
|
+
usage: cpuUsage,
|
|
92
|
+
cores: cpuCount
|
|
93
|
+
},
|
|
94
|
+
memory: {
|
|
95
|
+
used: (usedMem / 1024 / 1024 / 1024).toFixed(1),
|
|
96
|
+
total: (totalMem / 1024 / 1024 / 1024).toFixed(1),
|
|
97
|
+
percentage: memoryPercentage
|
|
98
|
+
},
|
|
99
|
+
disk: {
|
|
100
|
+
used: diskUsed,
|
|
101
|
+
total: diskTotal,
|
|
102
|
+
percentage: diskPercentage
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
};
|
package/apis/dict/all.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取所有字典",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
const result = await befly.mysql.getAll({
|
|
10
|
+
table: "beflyDict",
|
|
11
|
+
joins: [
|
|
12
|
+
{
|
|
13
|
+
table: "beflyDictType",
|
|
14
|
+
on: "beflyDict.typeCode = beflyDictType.code"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
fields: ["beflyDict.id", "beflyDict.typeCode", "beflyDict.key", "beflyDict.label", "beflyDict.sort", "beflyDict.remark", "beflyDict.createdAt", "beflyDict.updatedAt", "beflyDictType.name AS typeName"],
|
|
18
|
+
orderBy: ["beflyDict.sort#ASC", "beflyDict.id#ASC"]
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return befly.tool.Yes("获取成功", result.data);
|
|
22
|
+
}
|
|
23
|
+
};
|
package/apis/dict/del.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "删除字典",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: { id: { name: "ID", input: "integer", min: 1, max: null } },
|
|
7
|
+
required: ["id"],
|
|
8
|
+
handler: async (befly, ctx) => {
|
|
9
|
+
await befly.mysql.delData({
|
|
10
|
+
table: "beflyDict",
|
|
11
|
+
where: { id: ctx.body.id }
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
return befly.tool.Yes("删除成功");
|
|
15
|
+
}
|
|
16
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取字典详情",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: { id: { name: "ID", input: "integer", min: 1, max: null } },
|
|
7
|
+
required: ["id"],
|
|
8
|
+
handler: async (befly, ctx) => {
|
|
9
|
+
const dict = await befly.mysql.getOne({
|
|
10
|
+
table: "beflyDict",
|
|
11
|
+
joins: [
|
|
12
|
+
{
|
|
13
|
+
table: "beflyDictType",
|
|
14
|
+
on: "beflyDict.typeCode = beflyDictType.code"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
fields: ["beflyDict.id", "beflyDict.typeCode", "beflyDict.key", "beflyDict.label", "beflyDict.sort", "beflyDict.remark", "beflyDict.createdAt", "beflyDict.updatedAt", "beflyDictType.name AS typeName"],
|
|
18
|
+
where: { "beflyDict.id": ctx.body.id }
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (!dict.data || !dict.data.id) {
|
|
22
|
+
return befly.tool.No("字典项不存在");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return befly.tool.Yes("获取成功", dict.data);
|
|
26
|
+
}
|
|
27
|
+
};
|
package/apis/dict/ins.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import adminDictTable from "../../tables/dict.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "添加字典",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
typeCode: adminDictTable.typeCode,
|
|
10
|
+
key: adminDictTable.key,
|
|
11
|
+
label: adminDictTable.label,
|
|
12
|
+
sort: adminDictTable.sort,
|
|
13
|
+
remark: adminDictTable.remark
|
|
14
|
+
},
|
|
15
|
+
required: ["typeCode", "key", "label"],
|
|
16
|
+
handler: async (befly, ctx) => {
|
|
17
|
+
const dictType = await befly.mysql.getOne({
|
|
18
|
+
table: "beflyDictType",
|
|
19
|
+
where: { code: ctx.body.typeCode }
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
if (!dictType.data || !dictType.data.id) {
|
|
23
|
+
return befly.tool.No("字典类型不存在");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const existing = await befly.mysql.getOne({
|
|
27
|
+
table: "beflyDict",
|
|
28
|
+
where: {
|
|
29
|
+
typeCode: ctx.body.typeCode,
|
|
30
|
+
key: ctx.body.key
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
if (existing.data && existing.data.id) {
|
|
35
|
+
return befly.tool.No("该类型下已存在相同的键名");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const dictId = await befly.mysql.insData({
|
|
39
|
+
table: "beflyDict",
|
|
40
|
+
data: {
|
|
41
|
+
typeCode: ctx.body.typeCode,
|
|
42
|
+
key: ctx.body.key,
|
|
43
|
+
label: ctx.body.label,
|
|
44
|
+
sort: ctx.body.sort,
|
|
45
|
+
remark: ctx.body.remark
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return befly.tool.Yes("添加成功", { id: dictId.data });
|
|
50
|
+
}
|
|
51
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import dictTable from "../../tables/dict.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "获取字典项列表",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
typeCode: dictTable.typeCode
|
|
10
|
+
},
|
|
11
|
+
required: ["typeCode"],
|
|
12
|
+
handler: async (befly, ctx) => {
|
|
13
|
+
const dictType = await befly.mysql.getOne({
|
|
14
|
+
table: "beflyDictType",
|
|
15
|
+
where: { code: ctx.body.typeCode }
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
if (!dictType.data || !dictType.data.id) {
|
|
19
|
+
return befly.tool.No("字典类型不存在");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const items = await befly.mysql.getAll({
|
|
23
|
+
table: "beflyDict",
|
|
24
|
+
where: { typeCode: ctx.body.typeCode },
|
|
25
|
+
orderBy: ["sort#ASC", "id#ASC"]
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return befly.tool.Yes("获取成功", items.data);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import dictTable from "../../tables/dict.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "获取字典列表",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
page: { name: "页码", input: "integer", min: 1, max: 9999 },
|
|
10
|
+
limit: { name: "每页数量", input: "integer", min: 1, max: 100 },
|
|
11
|
+
typeCode: dictTable.typeCode,
|
|
12
|
+
keyword: { name: "关键词", input: "string", min: 0, max: 50 }
|
|
13
|
+
},
|
|
14
|
+
required: [],
|
|
15
|
+
handler: async (befly, ctx) => {
|
|
16
|
+
const result = await befly.mysql.getList({
|
|
17
|
+
table: "beflyDict",
|
|
18
|
+
joins: [
|
|
19
|
+
{
|
|
20
|
+
table: "beflyDictType",
|
|
21
|
+
on: "beflyDict.typeCode = beflyDictType.code"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
fields: ["beflyDict.id", "beflyDict.typeCode", "beflyDict.key", "beflyDict.label", "beflyDict.sort", "beflyDict.remark", "beflyDict.createdAt", "beflyDict.updatedAt", "beflyDictType.name AS typeName"],
|
|
25
|
+
where: {
|
|
26
|
+
"beflyDict.typeCode": ctx.body.typeCode,
|
|
27
|
+
$or: [{ "beflyDict.key$like": `%${ctx.body.keyword}%` }, { "beflyDict.label$like": `%${ctx.body.keyword}%` }]
|
|
28
|
+
},
|
|
29
|
+
page: ctx.body.page,
|
|
30
|
+
limit: ctx.body.limit,
|
|
31
|
+
orderBy: ["beflyDict.sort#ASC", "beflyDict.id#ASC"]
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return befly.tool.Yes("获取成功", result.data);
|
|
35
|
+
}
|
|
36
|
+
};
|
package/apis/dict/upd.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import adminDictTable from "../../tables/dict.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "更新字典",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
id: { name: "ID", input: "integer", min: 1, max: null },
|
|
10
|
+
typeCode: adminDictTable.typeCode,
|
|
11
|
+
key: adminDictTable.key,
|
|
12
|
+
label: adminDictTable.label,
|
|
13
|
+
sort: adminDictTable.sort,
|
|
14
|
+
remark: adminDictTable.remark
|
|
15
|
+
},
|
|
16
|
+
required: ["id"],
|
|
17
|
+
handler: async (befly, ctx) => {
|
|
18
|
+
const id = ctx.body.id;
|
|
19
|
+
const typeCode = ctx.body.typeCode;
|
|
20
|
+
const key = ctx.body.key;
|
|
21
|
+
const label = ctx.body.label;
|
|
22
|
+
const sort = ctx.body.sort;
|
|
23
|
+
const remark = ctx.body.remark;
|
|
24
|
+
|
|
25
|
+
if (typeCode) {
|
|
26
|
+
const dictType = await befly.mysql.getOne({
|
|
27
|
+
table: "beflyDictType",
|
|
28
|
+
where: { code: typeCode }
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
if (!dictType.data || !dictType.data.id) {
|
|
32
|
+
return befly.tool.No("字典类型不存在");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (typeCode || key) {
|
|
37
|
+
const current = await befly.mysql.getOne({
|
|
38
|
+
table: "beflyDict",
|
|
39
|
+
where: { id: id }
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const checkTypeCode = typeCode || (current.data ? current.data.typeCode : undefined);
|
|
43
|
+
const checkKey = key || (current.data ? current.data.key : undefined);
|
|
44
|
+
|
|
45
|
+
const existing = await befly.mysql.getOne({
|
|
46
|
+
table: "beflyDict",
|
|
47
|
+
where: {
|
|
48
|
+
typeCode: checkTypeCode,
|
|
49
|
+
key: checkKey,
|
|
50
|
+
id$ne: id
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
if (existing.data && existing.data.id) {
|
|
55
|
+
return befly.tool.No("该类型下已存在相同的键名");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const updateData = {};
|
|
60
|
+
if (typeCode !== undefined) updateData["typeCode"] = typeCode;
|
|
61
|
+
if (key !== undefined) updateData["key"] = key;
|
|
62
|
+
if (label !== undefined) updateData["label"] = label;
|
|
63
|
+
if (sort !== undefined) updateData["sort"] = sort;
|
|
64
|
+
if (remark !== undefined) updateData["remark"] = remark;
|
|
65
|
+
|
|
66
|
+
await befly.mysql.updData({
|
|
67
|
+
table: "beflyDict",
|
|
68
|
+
data: updateData,
|
|
69
|
+
where: { id: id }
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return befly.tool.Yes("更新成功");
|
|
73
|
+
}
|
|
74
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取所有字典类型",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
const result = await befly.mysql.getAll({
|
|
10
|
+
table: "beflyDictType",
|
|
11
|
+
orderBy: ["sort#ASC", "id#ASC"]
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
return befly.tool.Yes("操作成功", { lists: result.data.lists });
|
|
15
|
+
}
|
|
16
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "删除字典类型",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: { id: { name: "ID", input: "integer", min: 1, max: null } },
|
|
7
|
+
required: ["id"],
|
|
8
|
+
handler: async (befly, ctx) => {
|
|
9
|
+
const id = ctx.body.id;
|
|
10
|
+
|
|
11
|
+
const dictType = await befly.mysql.getOne({
|
|
12
|
+
table: "beflyDictType",
|
|
13
|
+
where: { id: id }
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
if (!dictType.data || !dictType.data.code) {
|
|
17
|
+
return befly.tool.No("字典类型不存在");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const dictItems = await befly.mysql.getOne({
|
|
21
|
+
table: "beflyDict",
|
|
22
|
+
where: {
|
|
23
|
+
typeCode: dictType.data.code
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
if (dictItems.data && dictItems.data.id) {
|
|
28
|
+
return befly.tool.No("该类型下存在字典项,无法删除");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
await befly.mysql.delData({
|
|
32
|
+
table: "beflyDictType",
|
|
33
|
+
where: { id: id }
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
return befly.tool.Yes("删除成功");
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "字典类型详情",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: { id: { name: "ID", input: "integer", min: 1, max: null } },
|
|
7
|
+
required: ["id"],
|
|
8
|
+
handler: async (befly, ctx) => {
|
|
9
|
+
const detail = await befly.mysql.getOne({
|
|
10
|
+
table: "beflyDictType",
|
|
11
|
+
where: { id: ctx.body.id }
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
if (!detail.data || !detail.data.id) {
|
|
15
|
+
return befly.tool.No("字典类型不存在");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return befly.tool.Yes("获取成功", detail.data);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import dictTypeTable from "../../tables/dictType.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "添加字典类型",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
code: dictTypeTable.code,
|
|
10
|
+
name: dictTypeTable.name,
|
|
11
|
+
description: dictTypeTable.description,
|
|
12
|
+
sort: dictTypeTable.sort
|
|
13
|
+
},
|
|
14
|
+
required: ["code", "name"],
|
|
15
|
+
handler: async (befly, ctx) => {
|
|
16
|
+
const existing = await befly.mysql.getOne({
|
|
17
|
+
table: "beflyDictType",
|
|
18
|
+
where: { code: ctx.body.code }
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (existing.data && existing.data.id) {
|
|
22
|
+
return befly.tool.No("类型代码已存在");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const typeId = await befly.mysql.insData({
|
|
26
|
+
table: "beflyDictType",
|
|
27
|
+
data: {
|
|
28
|
+
code: ctx.body.code,
|
|
29
|
+
name: ctx.body.name,
|
|
30
|
+
description: ctx.body.description,
|
|
31
|
+
sort: ctx.body.sort
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return befly.tool.Yes("添加成功", { id: typeId.data });
|
|
36
|
+
}
|
|
37
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取字典类型列表",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {
|
|
7
|
+
page: { name: "页码", input: "integer", min: 1, max: 9999 },
|
|
8
|
+
limit: { name: "每页数量", input: "integer", min: 1, max: 100 },
|
|
9
|
+
keyword: { name: "关键词", input: "string", min: 0, max: 50 },
|
|
10
|
+
state: { name: "状态", input: "integer", min: 0, max: 2 }
|
|
11
|
+
},
|
|
12
|
+
required: [],
|
|
13
|
+
handler: async (befly, ctx) => {
|
|
14
|
+
const result = await befly.mysql.getList({
|
|
15
|
+
table: "beflyDictType",
|
|
16
|
+
where: {
|
|
17
|
+
name$like: ctx.body.keyword ? `%${ctx.body.keyword}%` : undefined
|
|
18
|
+
},
|
|
19
|
+
orderBy: ["sort#ASC", "id#ASC"],
|
|
20
|
+
page: ctx.body.page,
|
|
21
|
+
limit: ctx.body.limit
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return befly.tool.Yes("操作成功", result.data);
|
|
25
|
+
}
|
|
26
|
+
};
|