befly 3.16.11 → 3.17.2
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 +326 -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 +20 -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/scripts/syncDb/context.js +99 -0
- package/scripts/syncDb/diff.js +133 -0
- package/scripts/syncDb/index.js +70 -0
- package/scripts/syncDb/query.js +26 -0
- package/scripts/syncDb/report.js +190 -0
- package/scripts/syncDb/transform.js +111 -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 -12769
- package/befly.min.js +0 -47
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
id: { name: "ID", input: "integer", min: 1, max: null },
|
|
10
|
+
code: dictTypeTable.code,
|
|
11
|
+
name: dictTypeTable.name,
|
|
12
|
+
description: dictTypeTable.description,
|
|
13
|
+
sort: dictTypeTable.sort
|
|
14
|
+
},
|
|
15
|
+
required: ["id"],
|
|
16
|
+
handler: async (befly, ctx) => {
|
|
17
|
+
const id = ctx.body.id;
|
|
18
|
+
const code = ctx.body.code;
|
|
19
|
+
const name = ctx.body.name;
|
|
20
|
+
const description = ctx.body.description;
|
|
21
|
+
const sort = ctx.body.sort;
|
|
22
|
+
|
|
23
|
+
if (code) {
|
|
24
|
+
const existing = await befly.mysql.getOne({
|
|
25
|
+
table: "beflyDictType",
|
|
26
|
+
where: {
|
|
27
|
+
code: code,
|
|
28
|
+
id$ne: id
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
if (existing.data && existing.data.id) {
|
|
33
|
+
return befly.tool.No("类型代码已被使用");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const updateData = {};
|
|
38
|
+
if (code !== undefined) updateData["code"] = code;
|
|
39
|
+
if (name !== undefined) updateData["name"] = name;
|
|
40
|
+
if (description !== undefined) updateData["description"] = description;
|
|
41
|
+
if (sort !== undefined) updateData["sort"] = sort;
|
|
42
|
+
|
|
43
|
+
await befly.mysql.updData({
|
|
44
|
+
table: "beflyDictType",
|
|
45
|
+
data: updateData,
|
|
46
|
+
where: { id: id }
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return befly.tool.Yes("更新成功");
|
|
50
|
+
}
|
|
51
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取邮件配置",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
if (!befly.email) {
|
|
10
|
+
return befly.tool.No("邮件插件未加载,请检查配置");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const config = befly.email.getConfig();
|
|
14
|
+
|
|
15
|
+
return befly.tool.Yes("获取成功", {
|
|
16
|
+
host: config.host,
|
|
17
|
+
port: config.port,
|
|
18
|
+
secure: config.secure,
|
|
19
|
+
user: config.user,
|
|
20
|
+
pass: config.pass,
|
|
21
|
+
fromName: config.fromName,
|
|
22
|
+
configured: Boolean(config.user)
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
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: "beflyEmailLog",
|
|
16
|
+
page: ctx.body.page,
|
|
17
|
+
limit: ctx.body.limit,
|
|
18
|
+
orderBy: ["sendTime#DESC"]
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return befly.tool.Yes("获取成功", result.data);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import emailLogTable from "../../tables/emailLog.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "发送邮件",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
to: emailLogTable.toEmail,
|
|
10
|
+
subject: emailLogTable.subject,
|
|
11
|
+
content: emailLogTable.content,
|
|
12
|
+
cc: emailLogTable.ccEmail,
|
|
13
|
+
bcc: emailLogTable.bccEmail,
|
|
14
|
+
isHtml: {
|
|
15
|
+
name: "是否HTML",
|
|
16
|
+
min: null,
|
|
17
|
+
max: null,
|
|
18
|
+
input: "string"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
required: ["to", "subject", "content"],
|
|
22
|
+
handler: async (befly, ctx) => {
|
|
23
|
+
if (!befly.email) {
|
|
24
|
+
return befly.tool.No("邮件插件未加载,请检查配置");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const startTime = Date.now();
|
|
28
|
+
|
|
29
|
+
const result = await befly.email.send({
|
|
30
|
+
to: ctx.body.to,
|
|
31
|
+
subject: ctx.body.subject,
|
|
32
|
+
html: ctx.body.isHtml ? ctx.body.content : undefined,
|
|
33
|
+
text: ctx.body.isHtml ? undefined : ctx.body.content,
|
|
34
|
+
cc: ctx.body.cc || undefined,
|
|
35
|
+
bcc: ctx.body.bcc || undefined
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
await befly.mysql.insData({
|
|
40
|
+
table: "beflyEmailLog",
|
|
41
|
+
data: {
|
|
42
|
+
adminId: ctx.userId || 0,
|
|
43
|
+
username: "",
|
|
44
|
+
nickname: ctx.nickname || "",
|
|
45
|
+
toEmail: ctx.body.to,
|
|
46
|
+
subject: ctx.body.subject,
|
|
47
|
+
content: ctx.body.content,
|
|
48
|
+
ccEmail: ctx.body.cc || "",
|
|
49
|
+
bccEmail: ctx.body.bcc || "",
|
|
50
|
+
sendTime: startTime,
|
|
51
|
+
sendResult: result.success ? 1 : 0,
|
|
52
|
+
messageId: result.messageId || "",
|
|
53
|
+
failReason: result.error || ""
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
} catch (logError) {
|
|
57
|
+
befly.logger.error("记录邮件日志失败", logError);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (result.success) {
|
|
61
|
+
return befly.tool.Yes("发送成功", { messageId: result.messageId });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return befly.tool.No(result.error || "发送失败");
|
|
65
|
+
}
|
|
66
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "验证邮件配置",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
if (!befly.email) {
|
|
10
|
+
return befly.tool.No("邮件插件未加载,请检查配置");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const isValid = await befly.email.verify();
|
|
14
|
+
|
|
15
|
+
if (isValid) {
|
|
16
|
+
return befly.tool.Yes("邮件服务配置正常");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return befly.tool.No("邮件服务配置异常,请检查 SMTP 设置");
|
|
20
|
+
}
|
|
21
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
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: "beflyLoginLog",
|
|
16
|
+
page: ctx.body.page,
|
|
17
|
+
limit: ctx.body.limit,
|
|
18
|
+
orderBy: ["loginTime#DESC"]
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return befly.tool.Yes("获取成功", result.data);
|
|
22
|
+
}
|
|
23
|
+
};
|
package/apis/menu/all.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { isNonEmptyString, isString } from "../../utils/is.js";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "获取用户菜单",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {},
|
|
9
|
+
required: [],
|
|
10
|
+
handler: async (befly, ctx) => {
|
|
11
|
+
try {
|
|
12
|
+
const roleCode = isNonEmptyString(ctx.roleCode) ? ctx.roleCode : "";
|
|
13
|
+
if (!isNonEmptyString(roleCode)) {
|
|
14
|
+
return befly.tool.No("角色缺失", { lists: [] });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const menuPaths = await befly.cache.getRoleMenuPermissions(roleCode);
|
|
18
|
+
|
|
19
|
+
if (menuPaths.length === 0) {
|
|
20
|
+
return befly.tool.Yes("菜单为空", { lists: [] });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const allMenus = await befly.cache.getMenus();
|
|
24
|
+
|
|
25
|
+
if (allMenus.length === 0) {
|
|
26
|
+
return befly.tool.No("菜单缓存不存在,请刷新缓存", { lists: [] });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const menuPathSet = new Set(menuPaths);
|
|
30
|
+
const authorizedMenus = allMenus.filter((menu) => {
|
|
31
|
+
const path = menu["path"];
|
|
32
|
+
return isString(path) && menuPathSet.has(path);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return befly.tool.Yes("获取菜单成功", { lists: authorizedMenus });
|
|
36
|
+
} catch (error) {
|
|
37
|
+
befly.logger.error("获取用户菜单失败", error);
|
|
38
|
+
return befly.tool.No("获取菜单失败");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
try {
|
|
15
|
+
const menus = await befly.mysql.getAll({
|
|
16
|
+
table: "beflyMenu"
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
return befly.tool.Yes("操作成功", { lists: menus.data.lists });
|
|
20
|
+
} catch (error) {
|
|
21
|
+
befly.logger.error("获取菜单列表失败", error);
|
|
22
|
+
return befly.tool.No("操作失败");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
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: "beflyOperateLog",
|
|
16
|
+
page: ctx.body.page,
|
|
17
|
+
limit: ctx.body.limit,
|
|
18
|
+
orderBy: ["operateTime#DESC"]
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return befly.tool.Yes("获取成功", result.data);
|
|
22
|
+
}
|
|
23
|
+
};
|
package/apis/role/all.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "获取所有角色",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {},
|
|
7
|
+
required: [],
|
|
8
|
+
handler: async (befly) => {
|
|
9
|
+
const roles = await befly.mysql.getAll({
|
|
10
|
+
table: "beflyRole",
|
|
11
|
+
where: {
|
|
12
|
+
code: {
|
|
13
|
+
$ne: "dev"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
orderBy: ["sort#ASC", "id#ASC"]
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
return befly.tool.Yes("操作成功", { lists: roles.data.lists, total: roles.data.total });
|
|
20
|
+
}
|
|
21
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import adminRoleTable from "../../tables/role.json";
|
|
2
|
+
import { isNonEmptyString } from "../../utils/is.js";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
name: "保存角色接口权限",
|
|
6
|
+
method: "POST",
|
|
7
|
+
body: "none",
|
|
8
|
+
auth: true,
|
|
9
|
+
fields: {
|
|
10
|
+
roleCode: adminRoleTable.code,
|
|
11
|
+
apiPaths: adminRoleTable.apis
|
|
12
|
+
},
|
|
13
|
+
required: [],
|
|
14
|
+
handler: async (befly, ctx) => {
|
|
15
|
+
const apiPaths = ctx.body.apiPaths || [];
|
|
16
|
+
|
|
17
|
+
const role = await befly.mysql.getOne({
|
|
18
|
+
table: "beflyRole",
|
|
19
|
+
where: { code: ctx.body.roleCode }
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
if (!role.data || !role.data.id) {
|
|
23
|
+
return befly.tool.No("角色不存在");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const roleCode = role.data.code;
|
|
27
|
+
if (!isNonEmptyString(roleCode)) {
|
|
28
|
+
return befly.tool.No("角色不存在");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
await befly.mysql.updData({
|
|
32
|
+
table: "beflyRole",
|
|
33
|
+
where: { code: ctx.body.roleCode },
|
|
34
|
+
data: {
|
|
35
|
+
apis: apiPaths
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await befly.cache.refreshRoleApiPermissions(roleCode, apiPaths);
|
|
40
|
+
|
|
41
|
+
return befly.tool.Yes("操作成功");
|
|
42
|
+
}
|
|
43
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import adminRoleTable from "../../tables/role.json";
|
|
2
|
+
import { isNonEmptyString } from "../../utils/is.js";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
name: "获取角色接口权限",
|
|
6
|
+
method: "POST",
|
|
7
|
+
body: "none",
|
|
8
|
+
auth: true,
|
|
9
|
+
fields: {
|
|
10
|
+
roleCode: adminRoleTable.code
|
|
11
|
+
},
|
|
12
|
+
required: [],
|
|
13
|
+
handler: async (befly, ctx) => {
|
|
14
|
+
const roleCode = isNonEmptyString(ctx.body.roleCode) ? ctx.body.roleCode : "";
|
|
15
|
+
if (!isNonEmptyString(roleCode)) {
|
|
16
|
+
return befly.tool.No("参数不合法");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const apiPaths = await befly.cache.getRolePermissions(roleCode);
|
|
20
|
+
return befly.tool.Yes("操作成功", { apiPaths: apiPaths });
|
|
21
|
+
}
|
|
22
|
+
};
|
package/apis/role/del.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: "删除角色",
|
|
3
|
+
method: "POST",
|
|
4
|
+
body: "none",
|
|
5
|
+
auth: true,
|
|
6
|
+
fields: {
|
|
7
|
+
id: { name: "ID", input: "integer", min: 1, max: null }
|
|
8
|
+
},
|
|
9
|
+
required: ["id"],
|
|
10
|
+
handler: async (befly, ctx) => {
|
|
11
|
+
try {
|
|
12
|
+
const role = await befly.mysql.getOne({
|
|
13
|
+
table: "beflyRole",
|
|
14
|
+
where: { id: ctx.body.id },
|
|
15
|
+
fields: ["code"]
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
if (!role.data || !role.data.code) {
|
|
19
|
+
return befly.tool.No("角色不存在");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const systemRoles = ["dev", "user", "admin", "guest"];
|
|
23
|
+
if (systemRoles.includes(role.data.code)) {
|
|
24
|
+
return befly.tool.No(`系统角色 [${role.data.code}] 不允许删除`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const adminList = await befly.mysql.getList({
|
|
28
|
+
table: "beflyAdmin",
|
|
29
|
+
where: { roleCode: role.data.code }
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
if (adminList.data.total > 0) {
|
|
33
|
+
return befly.tool.No("该角色已分配给用户,无法删除");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
await befly.mysql.delData({
|
|
37
|
+
table: "beflyRole",
|
|
38
|
+
where: { id: ctx.body.id }
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await befly.cache.deleteRolePermissions(role.data.code);
|
|
42
|
+
|
|
43
|
+
return befly.tool.Yes("操作成功");
|
|
44
|
+
} catch (error) {
|
|
45
|
+
befly.logger.error("删除角色失败", error);
|
|
46
|
+
return befly.tool.No("操作失败");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import roleTable from "../../tables/role.json";
|
|
2
|
+
import { isNumber } from "../../utils/is.js";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
name: "获取用户角色",
|
|
6
|
+
method: "POST",
|
|
7
|
+
body: "none",
|
|
8
|
+
auth: true,
|
|
9
|
+
fields: {
|
|
10
|
+
id: roleTable.code
|
|
11
|
+
},
|
|
12
|
+
required: [],
|
|
13
|
+
handler: async (befly, ctx) => {
|
|
14
|
+
let roleInfo = null;
|
|
15
|
+
if (ctx.body.id && ctx.roleType === "admin") {
|
|
16
|
+
const roleInfoResult = await befly.mysql.getOne({
|
|
17
|
+
table: "beflyRole",
|
|
18
|
+
where: { code: ctx.body.id }
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const roleId = roleInfoResult.data ? roleInfoResult.data.id : undefined;
|
|
22
|
+
if (isNumber(roleId)) {
|
|
23
|
+
roleInfo = roleInfoResult.data;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return befly.tool.Yes("操作成功", {
|
|
28
|
+
roleCode: ctx.body.id,
|
|
29
|
+
role: roleInfo
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
};
|
package/apis/role/ins.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import adminRoleTable from "../../tables/role.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "创建角色",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
name: adminRoleTable.name,
|
|
10
|
+
code: adminRoleTable.code,
|
|
11
|
+
description: adminRoleTable.description,
|
|
12
|
+
menus: adminRoleTable.menus,
|
|
13
|
+
apis: adminRoleTable.apis,
|
|
14
|
+
sort: adminRoleTable.sort
|
|
15
|
+
},
|
|
16
|
+
required: [],
|
|
17
|
+
handler: async (befly, ctx) => {
|
|
18
|
+
const apiPaths = ctx.body.apis || [];
|
|
19
|
+
const menuPaths = ctx.body.menus || [];
|
|
20
|
+
|
|
21
|
+
const existing = await befly.mysql.getOne({
|
|
22
|
+
table: "beflyRole",
|
|
23
|
+
where: { code: ctx.body.code }
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (existing.data && existing.data.id) {
|
|
27
|
+
return befly.tool.No("角色代码已存在");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const roleId = await befly.mysql.insData({
|
|
31
|
+
table: "beflyRole",
|
|
32
|
+
data: {
|
|
33
|
+
name: ctx.body.name,
|
|
34
|
+
code: ctx.body.code,
|
|
35
|
+
description: ctx.body.description,
|
|
36
|
+
menus: menuPaths,
|
|
37
|
+
apis: apiPaths,
|
|
38
|
+
sort: ctx.body.sort
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
await befly.cache.refreshRoleApiPermissions(ctx.body.code, apiPaths);
|
|
43
|
+
|
|
44
|
+
return befly.tool.Yes("操作成功", { id: roleId.data });
|
|
45
|
+
}
|
|
46
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
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 roles = await befly.mysql.getList({
|
|
15
|
+
limit: 30,
|
|
16
|
+
table: "beflyRole",
|
|
17
|
+
where: {
|
|
18
|
+
code: {
|
|
19
|
+
$ne: "dev"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
orderBy: ["sort#ASC", "id#ASC"]
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return befly.tool.Yes("操作成功", roles.data);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import adminRoleTable from "../../tables/role.json";
|
|
2
|
+
import { isNonEmptyString } from "../../utils/is.js";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
name: "保存角色菜单权限",
|
|
6
|
+
method: "POST",
|
|
7
|
+
body: "none",
|
|
8
|
+
auth: true,
|
|
9
|
+
fields: {
|
|
10
|
+
roleCode: adminRoleTable.code,
|
|
11
|
+
menuPaths: adminRoleTable.menus
|
|
12
|
+
},
|
|
13
|
+
required: [],
|
|
14
|
+
handler: async (befly, ctx) => {
|
|
15
|
+
const roleCode = isNonEmptyString(ctx.body.roleCode) ? ctx.body.roleCode : "";
|
|
16
|
+
if (!isNonEmptyString(roleCode)) {
|
|
17
|
+
return befly.tool.No("参数不合法");
|
|
18
|
+
}
|
|
19
|
+
const menuPaths = ctx.body.menuPaths || [];
|
|
20
|
+
|
|
21
|
+
const role = await befly.mysql.getOne({
|
|
22
|
+
table: "beflyRole",
|
|
23
|
+
where: { code: roleCode }
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (!role.data || !role.data.id) {
|
|
27
|
+
return befly.tool.No("角色不存在");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
await befly.mysql.updData({
|
|
31
|
+
table: "beflyRole",
|
|
32
|
+
where: { code: roleCode },
|
|
33
|
+
data: {
|
|
34
|
+
menus: menuPaths
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
await befly.cache.refreshRoleMenuPermissions(roleCode, menuPaths);
|
|
39
|
+
|
|
40
|
+
return befly.tool.Yes("操作成功");
|
|
41
|
+
}
|
|
42
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import adminRoleTable from "../../tables/role.json";
|
|
2
|
+
import { isNonEmptyString } from "../../utils/is.js";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
name: "获取角色菜单权限",
|
|
6
|
+
method: "POST",
|
|
7
|
+
body: "none",
|
|
8
|
+
auth: true,
|
|
9
|
+
fields: {
|
|
10
|
+
roleCode: adminRoleTable.code
|
|
11
|
+
},
|
|
12
|
+
required: [],
|
|
13
|
+
handler: async (befly, ctx) => {
|
|
14
|
+
const roleCode = isNonEmptyString(ctx.body.roleCode) ? ctx.body.roleCode : "";
|
|
15
|
+
if (!isNonEmptyString(roleCode)) {
|
|
16
|
+
return befly.tool.No("参数不合法");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const menuPaths = await befly.cache.getRoleMenuPermissions(roleCode);
|
|
20
|
+
return befly.tool.Yes("操作成功", menuPaths);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import roleTable from "../../tables/role.json";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
name: "角色保存",
|
|
5
|
+
method: "POST",
|
|
6
|
+
body: "none",
|
|
7
|
+
auth: true,
|
|
8
|
+
fields: {
|
|
9
|
+
roleCode: roleTable.code
|
|
10
|
+
},
|
|
11
|
+
required: [],
|
|
12
|
+
handler: async (befly, ctx) => {
|
|
13
|
+
try {
|
|
14
|
+
const role = await befly.mysql.getOne({
|
|
15
|
+
table: "beflyRole",
|
|
16
|
+
where: { code: ctx.body.roleCode }
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
if (!role.data || !role.data.id) {
|
|
20
|
+
return befly.tool.No("角色不存在");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const roleType = role.data.code === "dev" || role.data.code === "admin" ? "admin" : "user";
|
|
24
|
+
|
|
25
|
+
await befly.mysql.updData({
|
|
26
|
+
table: "beflyAdmin",
|
|
27
|
+
where: { id: ctx.body.adminId },
|
|
28
|
+
data: {
|
|
29
|
+
roleCode: role.data.code,
|
|
30
|
+
roleType: roleType
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return befly.tool.Yes("操作成功");
|
|
35
|
+
} catch (error) {
|
|
36
|
+
befly.logger.error("保存用户角色失败", error);
|
|
37
|
+
return befly.tool.No("操作失败");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|