@befly-addon/admin 1.1.30 → 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.
Files changed (111) hide show
  1. package/apis/admin/cacheRefresh.ts +29 -21
  2. package/apis/admin/del.ts +10 -10
  3. package/apis/admin/detail.ts +7 -7
  4. package/apis/admin/ins.ts +11 -11
  5. package/apis/admin/list.ts +10 -10
  6. package/apis/admin/upd.ts +14 -14
  7. package/apis/api/all.ts +8 -8
  8. package/apis/api/list.ts +10 -10
  9. package/apis/auth/login.ts +43 -43
  10. package/apis/auth/sendSmsCode.ts +6 -6
  11. package/apis/dashboard/configStatus.ts +18 -18
  12. package/apis/dashboard/environmentInfo.ts +12 -12
  13. package/apis/dashboard/performanceMetrics.ts +5 -5
  14. package/apis/dashboard/permissionStats.ts +7 -7
  15. package/apis/dashboard/serviceStatus.ts +29 -29
  16. package/apis/dashboard/systemInfo.ts +5 -5
  17. package/apis/dashboard/systemOverview.ts +7 -7
  18. package/apis/dashboard/systemResources.ts +8 -8
  19. package/apis/dict/all.ts +16 -16
  20. package/apis/dict/del.ts +6 -6
  21. package/apis/dict/detail.ts +19 -19
  22. package/apis/dict/ins.ts +9 -9
  23. package/apis/dict/items.ts +8 -8
  24. package/apis/dict/list.ts +22 -22
  25. package/apis/dict/upd.ts +11 -11
  26. package/apis/dictType/all.ts +5 -5
  27. package/apis/dictType/del.ts +8 -8
  28. package/apis/dictType/detail.ts +6 -6
  29. package/apis/dictType/ins.ts +7 -7
  30. package/apis/dictType/list.ts +8 -10
  31. package/apis/dictType/upd.ts +8 -8
  32. package/apis/email/config.ts +4 -4
  33. package/apis/email/logList.ts +8 -8
  34. package/apis/email/send.ts +18 -18
  35. package/apis/email/verify.ts +5 -5
  36. package/apis/loginLog/list.ts +8 -8
  37. package/apis/menu/all.ts +16 -18
  38. package/apis/menu/list.ts +12 -12
  39. package/apis/operateLog/list.ts +8 -8
  40. package/apis/role/all.ts +7 -7
  41. package/apis/role/apiSave.ts +10 -13
  42. package/apis/role/apis.ts +7 -12
  43. package/apis/role/del.ts +14 -14
  44. package/apis/role/detail.ts +6 -6
  45. package/apis/role/ins.ts +10 -10
  46. package/apis/role/list.ts +11 -11
  47. package/apis/role/menuSave.ts +8 -11
  48. package/apis/role/menus.ts +7 -12
  49. package/apis/role/save.ts +12 -12
  50. package/apis/role/upd.ts +10 -10
  51. package/apis/sysConfig/all.ts +5 -5
  52. package/apis/sysConfig/del.ts +9 -9
  53. package/apis/sysConfig/get.ts +9 -9
  54. package/apis/sysConfig/ins.ts +11 -11
  55. package/apis/sysConfig/list.ts +9 -9
  56. package/apis/sysConfig/upd.ts +10 -10
  57. package/libs/emailHelper.ts +7 -7
  58. package/package.json +46 -34
  59. package/plugins/email.ts +9 -9
  60. package/tables/role.json +4 -2
  61. package/views/403_1/index.vue +19 -3
  62. package/views/config/dict/components/edit.vue +26 -28
  63. package/views/config/dict/index.vue +88 -52
  64. package/views/config/dictType/components/edit.vue +22 -23
  65. package/views/config/dictType/index.vue +82 -46
  66. package/views/config/index.vue +12 -0
  67. package/views/config/system/components/edit.vue +36 -36
  68. package/views/config/system/index.vue +79 -50
  69. package/views/index/components/addonList.vue +3 -3
  70. package/views/index/components/environmentInfo.vue +10 -10
  71. package/views/index/components/operationLogs.vue +10 -10
  72. package/views/index/components/performanceMetrics.vue +8 -8
  73. package/views/index/components/quickActions.vue +3 -3
  74. package/views/index/components/serviceStatus.vue +19 -19
  75. package/views/index/components/systemNotifications.vue +12 -12
  76. package/views/index/components/systemOverview.vue +7 -7
  77. package/views/index/components/systemResources.vue +11 -11
  78. package/views/index/components/userInfo.vue +20 -19
  79. package/views/index/index.vue +12 -5
  80. package/views/log/email/index.vue +58 -51
  81. package/views/log/index.vue +12 -0
  82. package/views/log/login/index.vue +45 -38
  83. package/views/log/operate/index.vue +55 -48
  84. package/views/login_1/index.vue +25 -18
  85. package/views/people/admin/components/edit.vue +25 -26
  86. package/views/people/admin/index.vue +76 -40
  87. package/views/people/index.vue +12 -0
  88. package/views/permission/api/index.vue +21 -15
  89. package/views/permission/index.vue +12 -0
  90. package/views/permission/menu/index.vue +31 -16
  91. package/views/permission/role/components/api.vue +21 -21
  92. package/views/permission/role/components/edit.vue +18 -18
  93. package/views/permission/role/components/menu.vue +14 -16
  94. package/views/permission/role/index.vue +84 -49
  95. package/views/403_1/meta.json +0 -4
  96. package/views/config/dict/meta.json +0 -4
  97. package/views/config/dictType/meta.json +0 -4
  98. package/views/config/meta.json +0 -4
  99. package/views/config/system/meta.json +0 -4
  100. package/views/index/meta.json +0 -4
  101. package/views/log/email/meta.json +0 -4
  102. package/views/log/login/meta.json +0 -4
  103. package/views/log/meta.json +0 -4
  104. package/views/log/operate/meta.json +0 -4
  105. package/views/login_1/meta.json +0 -4
  106. package/views/people/admin/meta.json +0 -4
  107. package/views/people/meta.json +0 -4
  108. package/views/permission/api/meta.json +0 -4
  109. package/views/permission/menu/meta.json +0 -4
  110. package/views/permission/meta.json +0 -4
  111. package/views/permission/role/meta.json +0 -4
@@ -1,4 +1,4 @@
1
- /**
1
+ /**
2
2
  * 刷新全部缓存接口
3
3
  *
4
4
  * 功能:
@@ -12,40 +12,39 @@
12
12
  * - 缓存出现异常需要重建
13
13
  */
14
14
 
15
- import { RedisKeys } from 'befly-shared/redisKeys';
15
+ import { CacheKeys } from "befly/lib/cacheKeys";
16
16
 
17
17
  export default {
18
- name: '刷新全部缓存',
19
- handler: async (befly, ctx) => {
18
+ name: "刷新全部缓存",
19
+ handler: async (befly, _ctx) => {
20
20
  try {
21
21
  const results: Record<string, any> = {
22
22
  apis: { success: false, count: 0 },
23
23
  menus: { success: false, count: 0 },
24
- roles: { success: false, count: 0 }
24
+ roles: { success: false, count: 0 },
25
+ roleApiPermissions: { success: false }
25
26
  };
26
27
 
27
28
  // 1. 刷新接口缓存
28
29
  try {
29
30
  const apis = await befly.db.getAll({
30
- table: 'addon_admin_api',
31
- orderBy: ['addonName#ASC', 'path#ASC']
31
+ table: "addon_admin_api"
32
32
  });
33
33
 
34
- await befly.redis.setObject(RedisKeys.apisAll(), apis.lists);
34
+ await befly.redis.setObject(CacheKeys.apisAll(), apis.lists);
35
35
  results.apis = { success: true, count: apis.lists.length };
36
36
  } catch (error: any) {
37
- befly.logger.error({ err: error }, '刷新接口缓存失败');
37
+ befly.logger.error({ err: error }, "刷新接口缓存失败");
38
38
  results.apis = { success: false, error: error.message };
39
39
  }
40
40
 
41
41
  // 2. 刷新菜单缓存
42
42
  try {
43
43
  const menus = await befly.db.getAll({
44
- table: 'addon_admin_menu',
45
- orderBy: ['sort#ASC', 'id#ASC']
44
+ table: "addon_admin_menu"
46
45
  });
47
46
 
48
- await befly.redis.setObject(RedisKeys.menusAll(), menus.lists);
47
+ await befly.redis.setObject(CacheKeys.menusAll(), menus.lists);
49
48
 
50
49
  const parentCount = menus.lists.filter((m: any) => m.pid === 0).length;
51
50
  const childCount = menus.lists.filter((m: any) => m.pid !== 0).length;
@@ -57,41 +56,50 @@ export default {
57
56
  childCount: childCount
58
57
  };
59
58
  } catch (error: any) {
60
- befly.logger.error({ err: error }, '刷新菜单缓存失败');
59
+ befly.logger.error({ err: error }, "刷新菜单缓存失败");
61
60
  results.menus = { success: false, error: error.message };
62
61
  }
63
62
 
64
63
  // 3. 刷新角色权限缓存
65
64
  try {
66
65
  const roles = await befly.db.getAll({
67
- table: 'addon_admin_role'
66
+ table: "addon_admin_role"
68
67
  });
69
68
 
70
69
  // 使用 setBatch 批量缓存所有角色
71
70
  const count = await befly.redis.setBatch(
72
71
  roles.lists.map((role: any) => ({
73
- key: RedisKeys.roleInfo(role.code),
72
+ key: CacheKeys.roleInfo(role.code),
74
73
  value: role
75
74
  }))
76
75
  );
77
76
 
78
77
  results.roles = { success: true, count: count };
79
78
  } catch (error: any) {
80
- befly.logger.error({ err: error }, '刷新角色缓存失败');
79
+ befly.logger.error({ err: error }, "刷新角色缓存失败");
81
80
  results.roles = { success: false, error: error.message };
82
81
  }
83
82
 
83
+ // 4. 重建角色接口权限缓存(版本化 + 原子切换)
84
+ try {
85
+ await befly.cache.rebuildRoleApiPermissions();
86
+ results.roleApiPermissions = { success: true };
87
+ } catch (error: any) {
88
+ befly.logger.error({ err: error }, "重建角色接口权限缓存失败");
89
+ results.roleApiPermissions = { success: false, error: error.message };
90
+ }
91
+
84
92
  // 检查是否全部成功
85
- const allSuccess = results.apis.success && results.menus.success && results.roles.success;
93
+ const allSuccess = results.apis.success && results.menus.success && results.roles.success && results.roleApiPermissions.success;
86
94
 
87
95
  if (allSuccess) {
88
- return befly.tool.Yes('全部缓存刷新成功', results);
96
+ return befly.tool.Yes("全部缓存刷新成功", results);
89
97
  } else {
90
- return befly.tool.No('部分缓存刷新失败', results);
98
+ return befly.tool.No("部分缓存刷新失败", results);
91
99
  }
92
100
  } catch (error: any) {
93
- befly.logger.error({ err: error }, '刷新全部缓存失败');
94
- return befly.tool.No('刷新全部缓存失败', { error: error.message });
101
+ befly.logger.error({ err: error }, "刷新全部缓存失败");
102
+ return befly.tool.No("刷新全部缓存失败", { error: error.message });
95
103
  }
96
104
  }
97
105
  };
package/apis/admin/del.ts CHANGED
@@ -1,31 +1,31 @@
1
- export default {
2
- name: '删除管理员',
1
+ export default {
2
+ name: "删除管理员",
3
3
  fields: {
4
- id: '@id'
4
+ id: "@id"
5
5
  },
6
- required: ['id'],
6
+ required: ["id"],
7
7
  handler: async (befly, ctx) => {
8
8
  // 检查管理员是否存在
9
9
  const adminData = await befly.db.getOne({
10
- table: 'addon_admin_admin',
10
+ table: "addon_admin_admin",
11
11
  where: { id: ctx.body.id }
12
12
  });
13
13
 
14
14
  if (!adminData?.id) {
15
- return befly.tool.No('管理员不存在');
15
+ return befly.tool.No("管理员不存在");
16
16
  }
17
17
 
18
18
  // 不能删除 dev 角色的管理员
19
- if (adminData.roleCode === 'dev') {
20
- return befly.tool.No('不能删除开发管理员');
19
+ if (adminData.roleCode === "dev") {
20
+ return befly.tool.No("不能删除开发管理员");
21
21
  }
22
22
 
23
23
  // 删除管理员
24
24
  await befly.db.delData({
25
- table: 'addon_admin_admin',
25
+ table: "addon_admin_admin",
26
26
  where: { id: ctx.body.id }
27
27
  });
28
28
 
29
- return befly.tool.Yes('删除成功');
29
+ return befly.tool.Yes("删除成功");
30
30
  }
31
31
  };
@@ -1,19 +1,19 @@
1
- export default {
2
- name: '获取管理员信息',
1
+ export default {
2
+ name: "获取管理员信息",
3
3
  fields: {
4
- id: '@id'
4
+ id: "@id"
5
5
  },
6
6
  handler: async (befly, ctx) => {
7
7
  const adminData = await befly.db.getOne({
8
- table: 'addon_admin_admin',
9
- fields: ['!password'],
8
+ table: "addon_admin_admin",
9
+ fields: ["!password"],
10
10
  where: { id: ctx.user?.id }
11
11
  });
12
12
 
13
13
  if (!adminData?.id) {
14
- return befly.tool.No('管理员不存在');
14
+ return befly.tool.No("管理员不存在");
15
15
  }
16
16
 
17
- return befly.tool.Yes('查询成功', adminData);
17
+ return befly.tool.Yes("查询成功", adminData);
18
18
  }
19
19
  };
package/apis/admin/ins.ts CHANGED
@@ -1,40 +1,40 @@
1
- import adminTable from '../../tables/admin.json';
1
+ import adminTable from "../../tables/admin.json";
2
2
 
3
3
  export default {
4
- name: '添加管理员',
4
+ name: "添加管理员",
5
5
  fields: adminTable,
6
- required: ['username', 'password', 'roleCode'],
6
+ required: ["username", "password", "roleCode"],
7
7
  handler: async (befly, ctx) => {
8
8
  // 检查用户名是否已存在
9
9
  const existingByUsername = await befly.db.getOne({
10
- table: 'addon_admin_admin',
10
+ table: "addon_admin_admin",
11
11
  where: { username: ctx.body.username }
12
12
  });
13
13
 
14
14
  if (existingByUsername?.id) {
15
- return befly.tool.No('用户名已被使用');
15
+ return befly.tool.No("用户名已被使用");
16
16
  }
17
17
 
18
18
  // 检查昵称是否已存在
19
19
  if (ctx.body.nickname) {
20
20
  const existingByNickname = await befly.db.getOne({
21
- table: 'addon_admin_admin',
21
+ table: "addon_admin_admin",
22
22
  where: { nickname: ctx.body.nickname }
23
23
  });
24
24
 
25
25
  if (existingByNickname?.id) {
26
- return befly.tool.No('昵称已被使用');
26
+ return befly.tool.No("昵称已被使用");
27
27
  }
28
28
  }
29
29
 
30
30
  // 查询角色信息
31
31
  const roleData = await befly.db.getOne({
32
- table: 'addon_admin_role',
32
+ table: "addon_admin_role",
33
33
  where: { code: ctx.body.roleCode }
34
34
  });
35
35
 
36
36
  if (!roleData?.id) {
37
- return befly.tool.No('角色不存在');
37
+ return befly.tool.No("角色不存在");
38
38
  }
39
39
 
40
40
  // 加密密码
@@ -42,7 +42,7 @@ export default {
42
42
 
43
43
  // 创建管理员
44
44
  const adminId = await befly.db.insData({
45
- table: 'addon_admin_admin',
45
+ table: "addon_admin_admin",
46
46
  data: {
47
47
  username: ctx.body.username,
48
48
  password: hashedPassword,
@@ -51,7 +51,7 @@ export default {
51
51
  }
52
52
  });
53
53
 
54
- return befly.tool.Yes('添加成功', {
54
+ return befly.tool.Yes("添加成功", {
55
55
  id: adminId
56
56
  });
57
57
  }
@@ -1,24 +1,24 @@
1
- export default {
2
- name: '查询管理员列表',
1
+ export default {
2
+ name: "查询管理员列表",
3
3
  fields: {
4
- page: '@page',
5
- limit: '@limit',
6
- keyword: '@keyword',
7
- state: '@state'
4
+ page: "@page",
5
+ limit: "@limit",
6
+ keyword: "@keyword",
7
+ state: "@state"
8
8
  },
9
9
  handler: async (befly, ctx) => {
10
10
  const result = await befly.db.getList({
11
- table: 'addon_admin_admin',
11
+ table: "addon_admin_admin",
12
12
  page: ctx.body.page,
13
13
  limit: ctx.body.limit,
14
14
  where: {
15
15
  roleCode: {
16
- $ne: 'dev'
16
+ $ne: "dev"
17
17
  }
18
18
  },
19
- orderBy: ['createdAt#DESC']
19
+ orderBy: ["createdAt#DESC"]
20
20
  });
21
21
 
22
- return befly.tool.Yes('获取成功', result);
22
+ return befly.tool.Yes("获取成功", result);
23
23
  }
24
24
  };
package/apis/admin/upd.ts CHANGED
@@ -1,52 +1,52 @@
1
- import adminTable from '../../tables/admin.json';
1
+ import adminTable from "../../tables/admin.json";
2
2
 
3
3
  export default {
4
- name: '更新管理员',
5
- fields: { id: '@id', ...adminTable },
6
- required: ['id'],
4
+ name: "更新管理员",
5
+ fields: { id: "@id", ...adminTable },
6
+ required: ["id"],
7
7
  handler: async (befly, ctx) => {
8
8
  const { id, username, nickname, roleCode, ...updateData } = ctx.body;
9
9
 
10
10
  // 检查管理员是否存在
11
11
  const admin = await befly.db.getOne({
12
- table: 'addon_admin_admin',
12
+ table: "addon_admin_admin",
13
13
  where: { id }
14
14
  });
15
15
 
16
16
  if (!admin?.id) {
17
- return befly.tool.No('管理员不存在');
17
+ return befly.tool.No("管理员不存在");
18
18
  }
19
19
 
20
20
  // 检查用户名是否已被其他管理员使用
21
21
  if (username && username !== admin.username) {
22
22
  const existingUsername = await befly.db.getOne({
23
- table: 'addon_admin_admin',
23
+ table: "addon_admin_admin",
24
24
  where: { username, id: { $ne: id } }
25
25
  });
26
26
  if (existingUsername?.id) {
27
- return befly.tool.No('用户名已被使用');
27
+ return befly.tool.No("用户名已被使用");
28
28
  }
29
29
  }
30
30
 
31
31
  // 检查昵称是否已被其他管理员使用
32
32
  if (nickname && nickname !== admin.nickname) {
33
33
  const existingNickname = await befly.db.getOne({
34
- table: 'addon_admin_admin',
34
+ table: "addon_admin_admin",
35
35
  where: { nickname, id: { $ne: id } }
36
36
  });
37
37
  if (existingNickname?.id) {
38
- return befly.tool.No('昵称已被使用');
38
+ return befly.tool.No("昵称已被使用");
39
39
  }
40
40
  }
41
41
 
42
42
  // 检查角色是否存在
43
43
  if (roleCode && roleCode !== admin.roleCode) {
44
44
  const role = await befly.db.getOne({
45
- table: 'addon_admin_role',
45
+ table: "addon_admin_role",
46
46
  where: { code: roleCode }
47
47
  });
48
48
  if (!role?.id) {
49
- return befly.tool.No('角色不存在');
49
+ return befly.tool.No("角色不存在");
50
50
  }
51
51
  }
52
52
 
@@ -58,11 +58,11 @@ export default {
58
58
 
59
59
  // 更新管理员信息
60
60
  await befly.db.updData({
61
- table: 'addon_admin_admin',
61
+ table: "addon_admin_admin",
62
62
  data: dataToUpdate,
63
63
  where: { id }
64
64
  });
65
65
 
66
- return befly.tool.Yes('更新成功');
66
+ return befly.tool.Yes("更新成功");
67
67
  }
68
68
  };
package/apis/api/all.ts CHANGED
@@ -1,6 +1,6 @@
1
- export default {
2
- name: '获取所有接口',
3
- handler: async (befly, ctx) => {
1
+ export default {
2
+ name: "获取所有接口",
3
+ handler: async (befly) => {
4
4
  try {
5
5
  // 从缓存获取所有接口
6
6
  let allApis = await befly.cache.getApis();
@@ -8,8 +8,8 @@
8
8
  // 如果缓存不存在,从数据库查询并缓存
9
9
  if (allApis.length === 0) {
10
10
  const result = await befly.db.getAll({
11
- table: 'addon_admin_api',
12
- orderBy: ['id#ASC']
11
+ table: "addon_admin_api",
12
+ orderBy: ["id#ASC"]
13
13
  });
14
14
  allApis = result.lists;
15
15
 
@@ -19,10 +19,10 @@
19
19
  }
20
20
  }
21
21
 
22
- return befly.tool.Yes('操作成功', { lists: allApis });
22
+ return befly.tool.Yes("操作成功", { lists: allApis });
23
23
  } catch (error: any) {
24
- befly.logger.error({ err: error }, '获取接口列表失败');
25
- return befly.tool.No('获取接口列表失败');
24
+ befly.logger.error({ err: error }, "获取接口列表失败");
25
+ return befly.tool.No("获取接口列表失败");
26
26
  }
27
27
  }
28
28
  };
package/apis/api/list.ts CHANGED
@@ -1,27 +1,27 @@
1
1
  export default {
2
- name: '获取接口列表',
2
+ name: "获取接口列表",
3
3
  fields: {
4
- page: '@page',
5
- limit: '@limit',
6
- keyword: '@keyword',
7
- state: '@state'
4
+ page: "@page",
5
+ limit: "@limit",
6
+ keyword: "@keyword",
7
+ state: "@state"
8
8
  },
9
9
  handler: async (befly, ctx) => {
10
10
  try {
11
11
  const result = await befly.db.getList({
12
- table: 'addon_admin_api',
12
+ table: "addon_admin_api",
13
13
  where: {
14
14
  $or: ctx.body.keyword ? [{ name$like: `%${ctx.body.keyword}%` }, { path$like: `%${ctx.body.keyword}%` }] : undefined
15
15
  },
16
- orderBy: ['id#ASC'],
16
+ orderBy: ["id#ASC"],
17
17
  page: ctx.body.page,
18
18
  limit: ctx.body.limit
19
19
  });
20
20
 
21
- return befly.tool.Yes('操作成功', result);
21
+ return befly.tool.Yes("操作成功", result);
22
22
  } catch (error: any) {
23
- befly.logger.error({ err: error }, '获取接口列表失败');
24
- return befly.tool.No('获取接口列表失败');
23
+ befly.logger.error({ err: error }, "获取接口列表失败");
24
+ return befly.tool.No("获取接口列表失败");
25
25
  }
26
26
  }
27
27
  };
@@ -1,103 +1,103 @@
1
- import { UAParser } from 'ua-parser-js';
1
+ import { UAParser } from "ua-parser-js";
2
2
 
3
- import adminTable from '../../tables/admin.json';
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: 'string',
10
+ name: "账号",
11
+ type: "string",
12
12
  min: 3,
13
13
  max: 100
14
14
  },
15
15
  password: adminTable.password,
16
16
  loginType: {
17
- name: '登录类型',
18
- type: 'string',
19
- regexp: '^(username|email|phone)$'
17
+ name: "登录类型",
18
+ type: "string",
19
+ regexp: "^(username|email|phone)$"
20
20
  }
21
21
  },
22
- required: ['account', 'password', 'loginType'],
22
+ required: ["account", "password", "loginType"],
23
23
  handler: async (befly, ctx) => {
24
24
  // 解析 User-Agent
25
- const userAgent = ctx.req.headers.get('user-agent') || '';
25
+ const userAgent = ctx.req.headers.get("user-agent") || "";
26
26
  const uaResult = UAParser(userAgent);
27
27
 
28
28
  // 日志数据(公共部分)
29
29
  const logData = {
30
30
  adminId: 0,
31
31
  username: ctx.body.account,
32
- nickname: '',
33
- ip: ctx.ip || 'unknown',
32
+ nickname: "",
33
+ ip: ctx.ip || "unknown",
34
34
  userAgent: userAgent.substring(0, 500),
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 || '',
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 || "",
44
44
  loginTime: Date.now(),
45
45
  loginResult: 0,
46
- failReason: ''
46
+ failReason: ""
47
47
  };
48
48
 
49
49
  // 根据登录类型构建查询条件
50
50
  const whereCondition: Record<string, any> = {};
51
- if (ctx.body.loginType === 'username') {
51
+ if (ctx.body.loginType === "username") {
52
52
  whereCondition.username = ctx.body.account;
53
- } else if (ctx.body.loginType === 'email') {
53
+ } else if (ctx.body.loginType === "email") {
54
54
  whereCondition.email = ctx.body.account;
55
- } else if (ctx.body.loginType === 'phone') {
55
+ } else if (ctx.body.loginType === "phone") {
56
56
  whereCondition.phone = ctx.body.account;
57
57
  }
58
58
 
59
59
  // 查询管理员
60
60
  const admin = await befly.db.getOne({
61
- table: 'addon_admin_admin',
61
+ table: "addon_admin_admin",
62
62
  where: whereCondition
63
63
  });
64
64
 
65
65
  if (!admin?.id) {
66
- logData.failReason = '账号不存在';
67
- await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
68
- return befly.tool.No('账号或密码错误');
66
+ logData.failReason = "账号不存在";
67
+ await befly.db.insData({ table: "addon_admin_login_log", data: logData });
68
+ return befly.tool.No("账号或密码错误");
69
69
  }
70
70
 
71
71
  // 更新日志数据(已找到用户)
72
72
  logData.adminId = admin.id;
73
73
  logData.username = admin.username;
74
- logData.nickname = admin.nickname || '';
74
+ logData.nickname = admin.nickname || "";
75
75
 
76
76
  // 验证密码
77
77
  try {
78
78
  const isValid = await befly.cipher.verifyPassword(ctx.body.password, admin.password);
79
79
  if (!isValid) {
80
- logData.failReason = '密码错误';
81
- await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
82
- return befly.tool.No('账号或密码错误');
80
+ logData.failReason = "密码错误";
81
+ await befly.db.insData({ table: "addon_admin_login_log", data: logData });
82
+ return befly.tool.No("账号或密码错误");
83
83
  }
84
84
  } catch (error: any) {
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('密码格式错误,请重新设置密码');
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("密码格式错误,请重新设置密码");
89
89
  }
90
90
 
91
91
  // 检查账号状态(state=1 表示正常,state=2 表示禁用)
92
92
  if (admin.state === 2) {
93
- logData.failReason = '账号已被禁用';
94
- await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
95
- return befly.tool.No('账号已被禁用');
93
+ logData.failReason = "账号已被禁用";
94
+ await befly.db.insData({ table: "addon_admin_login_log", data: logData });
95
+ return befly.tool.No("账号已被禁用");
96
96
  }
97
97
 
98
98
  // 登录成功,记录日志
99
99
  logData.loginResult = 1;
100
- await befly.db.insData({ table: 'addon_admin_login_log', data: logData });
100
+ await befly.db.insData({ table: "addon_admin_login_log", data: logData });
101
101
 
102
102
  // 生成 JWT Token(包含核心身份信息)
103
103
  const token = await befly.jwt.sign(
@@ -108,14 +108,14 @@ export default {
108
108
  roleType: admin.roleType
109
109
  },
110
110
  {
111
- expiresIn: '30d'
111
+ expiresIn: "30d"
112
112
  }
113
113
  );
114
114
 
115
115
  // 返回用户信息(不包含密码)
116
116
  const { password: _, ...userWithoutPassword } = admin;
117
117
 
118
- return befly.tool.Yes('登录成功', {
118
+ return befly.tool.Yes("登录成功", {
119
119
  token: token,
120
120
  userInfo: userWithoutPassword
121
121
  });
@@ -1,12 +1,12 @@
1
- import adminTable from '../../tables/admin.json';
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: ['phone'],
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, 'EX', 300); // 5分钟过期
22
+ await befly.redis.set(key, code, "EX", 300); // 5分钟过期
23
23
  }
24
24
 
25
25
  // 开发环境下返回验证码(生产环境应该删除)
26
- const isDev = befly.config.nodeEnv === 'development';
26
+ const isDev = befly.config.nodeEnv === "development";
27
27
 
28
- return befly.tool.Yes('验证码已发送', isDev ? { code } : null);
28
+ return befly.tool.Yes("验证码已发送", isDev ? { code } : null);
29
29
  }
30
30
  };