befly-tpl 3.0.1

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 (142) hide show
  1. package/.env.development +83 -0
  2. package/LICENSE +201 -0
  3. package/README.md +20 -0
  4. package/README.ts.md +175 -0
  5. package/addon-loader.example.ts +99 -0
  6. package/addons/_template/README.md +123 -0
  7. package/addons/_template/addon.config.json +17 -0
  8. package/addons/_template/apis/example.ts +33 -0
  9. package/addons/_template/checks/example.ts +23 -0
  10. package/addons/_template/config/default.ts +12 -0
  11. package/addons/_template/plugins/example.ts +39 -0
  12. package/addons/_template/tables/example.json +7 -0
  13. package/addons/_template/types/index.d.ts +21 -0
  14. package/addons/admin/README.md +179 -0
  15. package/addons/admin/addon.config.json +13 -0
  16. package/addons/admin/apis/adminDel.ts +37 -0
  17. package/addons/admin/apis/adminInfo.ts +50 -0
  18. package/addons/admin/apis/adminIns.ts +70 -0
  19. package/addons/admin/apis/adminList.ts +24 -0
  20. package/addons/admin/apis/adminRoleDetail.ts +38 -0
  21. package/addons/admin/apis/adminRoleSave.ts +40 -0
  22. package/addons/admin/apis/adminUpd.ts +54 -0
  23. package/addons/admin/apis/apiAll.ts +38 -0
  24. package/addons/admin/apis/cacheRefresh.ts +36 -0
  25. package/addons/admin/apis/dashboardAddonList.ts +16 -0
  26. package/addons/admin/apis/dashboardChangelog.ts +41 -0
  27. package/addons/admin/apis/dashboardConfigStatus.ts +56 -0
  28. package/addons/admin/apis/dashboardEnvironmentInfo.ts +48 -0
  29. package/addons/admin/apis/dashboardPerformanceMetrics.ts +25 -0
  30. package/addons/admin/apis/dashboardPermissionStats.ts +33 -0
  31. package/addons/admin/apis/dashboardServiceStatus.ts +84 -0
  32. package/addons/admin/apis/dashboardSystemInfo.ts +34 -0
  33. package/addons/admin/apis/dashboardSystemOverview.ts +34 -0
  34. package/addons/admin/apis/dashboardSystemResources.ts +119 -0
  35. package/addons/admin/apis/dictAll.ts +26 -0
  36. package/addons/admin/apis/dictDel.ts +27 -0
  37. package/addons/admin/apis/dictDetail.ts +28 -0
  38. package/addons/admin/apis/dictIns.ts +38 -0
  39. package/addons/admin/apis/dictList.ts +27 -0
  40. package/addons/admin/apis/dictUpd.ts +44 -0
  41. package/addons/admin/apis/login.ts +123 -0
  42. package/addons/admin/apis/logout.ts +23 -0
  43. package/addons/admin/apis/menuAll.ts +70 -0
  44. package/addons/admin/apis/menuDel.ts +40 -0
  45. package/addons/admin/apis/menuIns.ts +31 -0
  46. package/addons/admin/apis/menuList.ts +26 -0
  47. package/addons/admin/apis/menuUpd.ts +41 -0
  48. package/addons/admin/apis/register.ts +50 -0
  49. package/addons/admin/apis/roleApiDetail.ts +34 -0
  50. package/addons/admin/apis/roleApiSave.ts +44 -0
  51. package/addons/admin/apis/roleDel.ts +48 -0
  52. package/addons/admin/apis/roleDetail.ts +28 -0
  53. package/addons/admin/apis/roleIns.ts +40 -0
  54. package/addons/admin/apis/roleList.ts +18 -0
  55. package/addons/admin/apis/roleMenuDetail.ts +33 -0
  56. package/addons/admin/apis/roleMenuSave.ts +39 -0
  57. package/addons/admin/apis/roleSave.ts +45 -0
  58. package/addons/admin/apis/roleUpd.ts +53 -0
  59. package/addons/admin/apis/sendSmsCode.ts +36 -0
  60. package/addons/admin/checks/admin.ts +36 -0
  61. package/addons/admin/config/index.ts +45 -0
  62. package/addons/admin/config/menu.json +44 -0
  63. package/addons/admin/scripts/syncApi.ts +285 -0
  64. package/addons/admin/scripts/syncDev.ts +203 -0
  65. package/addons/admin/scripts/syncMenu.ts +210 -0
  66. package/addons/admin/tables/admin.json +14 -0
  67. package/addons/admin/tables/api.json +8 -0
  68. package/addons/admin/tables/dict.json +8 -0
  69. package/addons/admin/tables/menu.json +8 -0
  70. package/addons/admin/tables/role.json +8 -0
  71. package/addons/admin/types/index.ts +44 -0
  72. package/addons/admin/util.ts +266 -0
  73. package/addons/befly/addon.config.json +13 -0
  74. package/addons/befly/apis/health/info.ts +77 -0
  75. package/addons/befly/apis/tool/tokenCheck.ts +52 -0
  76. package/addons/demo/README.md +62 -0
  77. package/addons/demo/addon.config.json +13 -0
  78. package/addons/demo/apis/demoIns.ts +36 -0
  79. package/addons/demo/apis/demoList.ts +36 -0
  80. package/addons/demo/checks/demo.ts +30 -0
  81. package/addons/demo/config/default.ts +17 -0
  82. package/addons/demo/plugins/tool.ts +61 -0
  83. package/addons/demo/tables/todo.json +6 -0
  84. package/addons/demo/types/index.d.ts +56 -0
  85. package/apis/article/articleDel.ts +33 -0
  86. package/apis/article/articleDetail.ts +26 -0
  87. package/apis/article/articleIns.ts +47 -0
  88. package/apis/article/articleList.ts +47 -0
  89. package/apis/article/articleUpd.ts +55 -0
  90. package/apis/article/increment.ts +37 -0
  91. package/apis/test/hi.ts +9 -0
  92. package/apis/user/login.ts +56 -0
  93. package/apis/user/userList.ts +40 -0
  94. package/bun.lock +140 -0
  95. package/checks/demo.ts +25 -0
  96. package/logs/2025-08-22.0.log +197 -0
  97. package/logs/2025-08-23.0.log +151 -0
  98. package/logs/2025-08-24.0.log +296 -0
  99. package/logs/2025-08-25.0.log +162 -0
  100. package/logs/2025-08-26.0.log +19 -0
  101. package/logs/2025-08-27.0.log +63 -0
  102. package/logs/2025-08-28.0.log +286 -0
  103. package/logs/2025-08-30.0.log +1 -0
  104. package/logs/2025-09-01.0.log +296 -0
  105. package/logs/2025-09-02.0.log +298 -0
  106. package/logs/2025-10-11.0.log +2718 -0
  107. package/logs/2025-10-12.0.log +4374 -0
  108. package/logs/2025-10-13.0.log +759 -0
  109. package/logs/2025-10-14.0.log +2350 -0
  110. package/logs/2025-10-15.0.log +2386 -0
  111. package/logs/2025-10-16.0.log +2807 -0
  112. package/logs/2025-10-17.0.log +1143 -0
  113. package/logs/2025-10-18.0.log +1292 -0
  114. package/logs/2025-10-19.0.log +1752 -0
  115. package/logs/2025-10-20.0.log +722 -0
  116. package/logs/2025-10-21.0.log +1075 -0
  117. package/logs/2025-10-23.0.log +3291 -0
  118. package/logs/2025-10-24.0.log +2341 -0
  119. package/logs/2025-10-25.0.log +1367 -0
  120. package/logs/debug.0.log +25174 -0
  121. package/main.ts +9 -0
  122. package/package.json +29 -0
  123. package/pm2.config.cjs +85 -0
  124. package/tables/article.json +11 -0
  125. package/tables/user.json +8 -0
  126. package/temp/addon-route-prefix-migration.md +400 -0
  127. package/temp/api-route-conflict-analysis.md +441 -0
  128. package/temp/interactive-cli-guide.md +199 -0
  129. package/temp/missing-apis-fix.md +362 -0
  130. package/temp/remove-status-field.md +239 -0
  131. package/temp/roleid-to-rolecode-optimization.md +321 -0
  132. package/temp/status-to-state-migration-complete.md +176 -0
  133. package/temp/syncMenu-guide.md +235 -0
  134. package/temp/test-admin-menus-cache.ts +125 -0
  135. package/temp/test-admin-menus.ts +110 -0
  136. package/temp/test-interactive-cli.ps1 +14 -0
  137. package/tests/core.test.ts +13 -0
  138. package/tsconfig.json +23 -0
  139. package/types/api.ts +128 -0
  140. package/types/index.ts +6 -0
  141. package/types/models.example.ts +267 -0
  142. package/types/models.ts +67 -0
@@ -0,0 +1,123 @@
1
+ # Befly Addon 模板
2
+
3
+ 这是一个 Befly Addon 的标准模板,以 `_` 开头的目录会被框架自动跳过,不会被加载。
4
+
5
+ ## 目录结构
6
+
7
+ ```
8
+ _template/
9
+ ├── README.md # 本文档
10
+ ├── apis/ # API 接口目录
11
+ │ └── example.ts # 示例接口
12
+ ├── checks/ # 检查脚本目录
13
+ │ └── example.ts # 示例检查
14
+ ├── plugins/ # 插件目录
15
+ │ └── example.ts # 示例插件
16
+ ├── tables/ # 表定义目录
17
+ │ └── example.json # 示例表定义
18
+ ├── types/ # 类型定义目录
19
+ │ └── index.d.ts # 类型定义文件
20
+ └── config/ # 配置目录
21
+ └── default.ts # 默认配置文件
22
+ ```
23
+
24
+ ## 使用方法
25
+
26
+ 1. 复制此模板目录到 `tpl/addons/` 下
27
+ 2. 重命名为你的组件名(小驼峰命名,如 `payment`、`smsService`)
28
+ 3. 根据需要删除不需要的子目录
29
+ 4. 实现你的功能代码
30
+
31
+ ## 命名规则
32
+
33
+ ### 组件目录名
34
+
35
+ - 使用小驼峰命名:`payment`、`userCenter`、`smsService`
36
+ - 以 `_` 开头的目录会被跳过:`_template`、`_disabled`
37
+
38
+ ### API 路由
39
+
40
+ - 自动添加组件名前缀:`/api/{组件名}/{API路径}`
41
+ - 示例:`payment/apis/create.ts` → `POST /api/payment/create`
42
+
43
+ ### 数据库表名
44
+
45
+ - 自动添加组件名前缀:`{组件名}_{表名}`
46
+ - 示例:`payment/tables/order.json` → `payment_order` 表
47
+
48
+ ### 插件名称
49
+
50
+ - 自动添加组件名前缀:`{组件名}.{插件名}`
51
+ - 示例:`payment/plugins/alipay.ts` → `payment.alipay` 插件
52
+
53
+ ## 子目录说明
54
+
55
+ ### apis/ - API 接口
56
+
57
+ 存放组件的 HTTP API 接口定义,使用 `Api()` 函数创建。
58
+
59
+ **特点:**
60
+
61
+ - 路由自动添加 `/api/{组件名}/` 前缀
62
+ - 可以访问所有已加载的插件
63
+
64
+ ### checks/ - 检查脚本
65
+
66
+ 存放组件的启动检查脚本,在框架启动前执行。
67
+
68
+ **要求:**
69
+
70
+ - 必须使用 `export default` 导出函数
71
+ - 函数返回 `true`(通过)或 `false`(失败)
72
+ - 检查失败会阻止框架启动
73
+
74
+ ### plugins/ - 插件
75
+
76
+ 存放组件的插件,用于扩展 befly 对象功能。
77
+
78
+ **特点:**
79
+
80
+ - 插件名自动添加组件名前缀
81
+ - 可以注册中间件、扩展 befly 对象等
82
+ - 加载顺序:核心 → addons → 项目
83
+
84
+ ### tables/ - 表定义
85
+
86
+ 存放组件的数据库表定义(JSON 格式)。
87
+
88
+ **特点:**
89
+
90
+ - 表名自动添加组件名前缀
91
+ - 使用 `bun syncDb` 自动同步到数据库
92
+ - 支持字段规则定义(类型、长度、默认值等)
93
+
94
+ ### types/ - 类型定义
95
+
96
+ 存放组件的 TypeScript 类型定义。
97
+
98
+ **建议:**
99
+
100
+ - 统一导出到 `index.d.ts`
101
+ - 声明全局类型时使用 `declare global`
102
+
103
+ ### config/ - 配置文件
104
+
105
+ 存放组件的配置文件,通常在插件初始化时加载。
106
+
107
+ **建议:**
108
+
109
+ - 配置项从环境变量读取
110
+ - 提供合理的默认值
111
+ - 在插件的 `onInit` 中加载配置
112
+
113
+ ## 开发建议
114
+
115
+ 1. **保持独立性**:组件应该是自包含的,尽量减少对其他组件的依赖
116
+ 2. **环境变量**:使用 `{ADDON_NAME}_{CONFIG_KEY}` 格式命名
117
+ 3. **错误处理**:使用 `Logger` 统一记录错误,关键错误使用 `process.exit(1)` 退出
118
+ 4. **日志记录**:使用 `Logger` 记录关键操作
119
+ 5. **测试覆盖**:为组件编写测试用例
120
+
121
+ ## 示例
122
+
123
+ 参考 `tpl/addons/demo/` 目录下的完整示例。
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "your-addon-name",
3
+ "title": "你的组件名称",
4
+ "version": "0.0.1",
5
+ "description": "组件简短描述",
6
+ "author": {
7
+ "name": "作者名称",
8
+ "email": "author@example.com",
9
+ "url": "https://example.com"
10
+ },
11
+ "repo": "https://github.com/username/repo",
12
+ "keywords": ["keyword1", "keyword2"],
13
+ "entry": "index.ts",
14
+ "enabled": true,
15
+ "dependencies": {},
16
+ "license": "MIT"
17
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Addon API 示例
3
+ * 路由会自动添加组件名前缀:/api/{addonName}/example
4
+ */
5
+
6
+ export default {
7
+ name: '示例接口',
8
+ auth: false,
9
+ fields: {
10
+ name: '名称|string|1|50|null|0|null',
11
+ age: '年龄|number|1|150|18|0|null'
12
+ },
13
+ required: ['name'],
14
+ handler: async (befly, ctx) => {
15
+ // 访问组件的插件(如果有)
16
+ // const myPlugin = befly['addonName.pluginName'];
17
+
18
+ // 访问数据库
19
+ // const result = await befly.db.getOne({
20
+ // table: 'addon_addonName_tableName',
21
+ // where: { id: 1 }
22
+ // });
23
+
24
+ return {
25
+ code: 0,
26
+ msg: '操作成功',
27
+ data: {
28
+ name: ctx.body.name,
29
+ age: ctx.body.age || 18
30
+ }
31
+ };
32
+ }
33
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Addon 检查示例
3
+ * 在框架启动前执行,用于验证配置、依赖等
4
+ */
5
+
6
+ import { Logger } from 'befly';
7
+
8
+ export default async function (): Promise<boolean> {
9
+ try {
10
+ // 检查环境变量配置
11
+ // const config = process.env.ADDON_NAME_CONFIG;
12
+ // if (!config) {
13
+ // Logger.error('未配置 ADDON_NAME_CONFIG 环境变量');
14
+ // return false;
15
+ // }
16
+
17
+ Logger.info('Addon 示例检查通过');
18
+ return true;
19
+ } catch (error: any) {
20
+ Logger.error('Addon 示例检查失败:', error);
21
+ return false;
22
+ }
23
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Addon 默认配置
3
+ * 建议从环境变量读取配置
4
+ */
5
+
6
+ export default {
7
+ // 示例配置
8
+ apiKey: process.env.ADDON_API_KEY || '',
9
+ apiSecret: process.env.ADDON_API_SECRET || '',
10
+ timeout: Number(process.env.ADDON_TIMEOUT) || 30000,
11
+ enabled: process.env.ADDON_ENABLED === 'true'
12
+ };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Addon 插件示例
3
+ * 用于扩展 befly 对象功能
4
+ */
5
+
6
+ import { Logger } from 'befly';
7
+
8
+ export default {
9
+ name: 'example', // 实际插件名会是:{addonName}.example
10
+ version: '1.0.0',
11
+ priority: 100, // 优先级(数字越大越先加载)
12
+
13
+ /**
14
+ * 插件加载时执行
15
+ */
16
+ async onLoad(befly) {
17
+ Logger.info('Addon 示例插件加载中...');
18
+ },
19
+
20
+ /**
21
+ * 插件初始化时执行
22
+ * 这里可以扩展 befly 对象
23
+ */
24
+ async onInit(befly) {
25
+ // 扩展 befly 对象
26
+ return {
27
+ // 添加自定义方法或属性
28
+ sayHello: (name: string) => {
29
+ return `Hello, ${name}!`;
30
+ },
31
+
32
+ // 添加配置
33
+ config: {
34
+ apiKey: process.env.ADDON_API_KEY || '',
35
+ timeout: 30000
36
+ }
37
+ };
38
+ }
39
+ } as BeflyPlugin;
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "名称|string|1|100|null|1|null",
3
+ "age": "年龄|number|1|150|18|0|null",
4
+ "email": "邮箱|string|5|100|null|1|^[\\w\\.-]+@[\\w\\.-]+\\.\\w+$",
5
+ "status": "状态|string|1|20|active|1|^(active|inactive|pending)$",
6
+ "createdAt": "创建时间|number|0|9999999999999|0|1|null"
7
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Addon 类型定义
3
+ */
4
+
5
+ declare global {
6
+ namespace Befly {
7
+ interface Context {
8
+ // 扩展 befly 对象的类型
9
+ // 示例:如果插件名是 payment.alipay
10
+ // 'payment.alipay'?: {
11
+ // createOrder: (params: any) => Promise<string>;
12
+ // config: {
13
+ // appId: string;
14
+ // timeout: number;
15
+ // };
16
+ // };
17
+ }
18
+ }
19
+ }
20
+
21
+ export {};
@@ -0,0 +1,179 @@
1
+ # Admin 管理后台插件
2
+
3
+ ## 功能说明
4
+
5
+ 提供管理后台的基础功能,包括:
6
+
7
+ - 管理员注册
8
+ - 管理员登录(支持邮箱和手机号两种方式)
9
+ - 发送短信验证码
10
+ - 获取用户信息
11
+ - 退出登录
12
+
13
+ ## API 接口
14
+
15
+ 所有接口路由前缀: `/api/admin/`
16
+
17
+ ### 1. 注册接口
18
+
19
+ **路由**: `POST /api/admin/register`
20
+
21
+ **请求参数**:
22
+
23
+ ```json
24
+ {
25
+ "name": "管理员姓名",
26
+ "email": "admin@example.com",
27
+ "password": "密码(至少6位)"
28
+ }
29
+ ```
30
+
31
+ **响应**:
32
+
33
+ ```json
34
+ {
35
+ "code": 0,
36
+ "msg": "注册成功",
37
+ "data": {
38
+ "id": 1,
39
+ "name": "管理员姓名",
40
+ "email": "admin@example.com"
41
+ }
42
+ }
43
+ ```
44
+
45
+ ### 2. 登录接口
46
+
47
+ **路由**: `POST /api/admin/login`
48
+
49
+ **邮箱登录**:
50
+
51
+ ```json
52
+ {
53
+ "email": "admin@example.com",
54
+ "password": "密码"
55
+ }
56
+ ```
57
+
58
+ **手机号登录**:
59
+
60
+ ```json
61
+ {
62
+ "phone": "13800138000",
63
+ "code": "验证码"
64
+ }
65
+ ```
66
+
67
+ **响应**:
68
+
69
+ ```json
70
+ {
71
+ "code": 0,
72
+ "msg": "登录成功",
73
+ "data": {
74
+ "token": "JWT Token",
75
+ "userInfo": {
76
+ "id": 1,
77
+ "name": "管理员姓名",
78
+ "email": "admin@example.com",
79
+ "role": "admin",
80
+ "status": 1
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ ### 3. 发送短信验证码
87
+
88
+ **路由**: `POST /api/admin/sendSmsCode`
89
+
90
+ **请求参数**:
91
+
92
+ ```json
93
+ {
94
+ "phone": "13800138000"
95
+ }
96
+ ```
97
+
98
+ **响应**:
99
+
100
+ ```json
101
+ {
102
+ "code": 0,
103
+ "msg": "验证码已发送",
104
+ "data": {
105
+ "code": "123456" // 仅开发环境返回
106
+ }
107
+ }
108
+ ```
109
+
110
+ ### 4. 获取用户信息
111
+
112
+ **路由**: `GET /api/admin/userInfo`
113
+
114
+ **请求头**:
115
+
116
+ ```
117
+ Authorization: Bearer {token}
118
+ ```
119
+
120
+ **响应**:
121
+
122
+ ```json
123
+ {
124
+ "code": 0,
125
+ "msg": "获取成功",
126
+ "data": {
127
+ "id": 1,
128
+ "name": "管理员姓名",
129
+ "email": "admin@example.com",
130
+ "role": "admin",
131
+ "status": 1
132
+ }
133
+ }
134
+ ```
135
+
136
+ ### 5. 退出登录
137
+
138
+ **路由**: `POST /api/admin/logout`
139
+
140
+ **请求头**:
141
+
142
+ ```
143
+ Authorization: Bearer {token}
144
+ ```
145
+
146
+ **响应**:
147
+
148
+ ```json
149
+ {
150
+ "code": 0,
151
+ "msg": "退出成功",
152
+ "data": null
153
+ }
154
+ ```
155
+
156
+ ## 数据库表
157
+
158
+ ### admin_admin 表
159
+
160
+ | 字段 | 类型 | 说明 |
161
+ | --------------- | -------------------- | ------------------- |
162
+ | id | int | 主键 ID |
163
+ | name | varchar(50) | 姓名 |
164
+ | email | varchar(100) | 邮箱 |
165
+ | phone | varchar(20) | 手机号 |
166
+ | password | varchar(255) | 密码(加密) |
167
+ | role | enum('admin','user') | 角色 |
168
+ | status | tinyint(1) | 状态(1-启用 0-禁用) |
169
+ | last_login_time | datetime | 最后登录时间 |
170
+ | last_login_ip | varchar(50) | 最后登录 IP |
171
+ | created_at | datetime | 创建时间 |
172
+ | updated_at | datetime | 更新时间 |
173
+
174
+ ## 注意事项
175
+
176
+ 1. 短信验证码功能需要配置短信服务提供商
177
+ 2. 建议在生产环境配置 Redis 来存储验证码和 token 黑名单
178
+ 3. 密码使用 bcrypt 加密存储
179
+ 4. Token 有效期默认为 7 天
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "admin",
3
+ "title": "管理后台",
4
+ "version": "1.0.0",
5
+ "description": "提供管理后台的基础功能,包括管理员注册、登录、用户信息管理等",
6
+ "author": {
7
+ "name": "Befly Team"
8
+ },
9
+ "keywords": ["admin", "backend", "management"],
10
+ "entry": "index.ts",
11
+ "enabled": true,
12
+ "license": "MIT"
13
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 删除管理员
3
+ */
4
+
5
+ import { Yes, No, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '删除管理员',
9
+ fields: {
10
+ id: Fields._id
11
+ },
12
+ required: ['id'],
13
+ handler: async (befly, ctx) => {
14
+ // 检查管理员是否存在
15
+ const admin = await befly.db.getOne({
16
+ table: 'addon_admin_admin',
17
+ where: { id: ctx.body.id }
18
+ });
19
+
20
+ if (!admin) {
21
+ return No('管理员不存在');
22
+ }
23
+
24
+ // 不能删除 dev 角色的管理员
25
+ if (admin.roleCode === 'dev') {
26
+ return No('不能删除开发者账号');
27
+ }
28
+
29
+ // 删除管理员
30
+ await befly.db.delData({
31
+ table: 'addon_admin_admin',
32
+ where: { id: ctx.body.id }
33
+ });
34
+
35
+ return Yes('删除成功');
36
+ }
37
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 获取用户信息接口
3
+ *
4
+ * @returns 返回 admin 表的字段(不含 password)以及关联的角色信息(小驼峰格式):
5
+ * - id, name, email, phone, roleId, roleCode, state
6
+ * - lastLoginTime, lastLoginIp
7
+ * - createdAt, updatedAt
8
+ * - role: 角色完整信息(包含 menus 和 apis 权限)
9
+ */
10
+
11
+ import { Yes, No } from 'befly';
12
+
13
+ export default {
14
+ name: '获取用户信息',
15
+ handler: async (befly, ctx) => {
16
+ // 从 JWT token 中获取用户ID
17
+ const userId = ctx.user?.id;
18
+
19
+ if (!userId) {
20
+ return No('未授权');
21
+ }
22
+
23
+ // 查询用户信息(框架自动转换为小驼峰)
24
+ const admin = await befly.db.getOne({
25
+ table: 'addon_admin_admin',
26
+ where: { id: userId }
27
+ });
28
+
29
+ if (!admin) {
30
+ return No('用户不存在');
31
+ }
32
+
33
+ // 查询角色信息(使用 roleCode 而非 roleId,框架自动转换为小驼峰)
34
+ let roleInfo = null;
35
+ if (admin.roleCode) {
36
+ roleInfo = await befly.db.getOne({
37
+ table: 'addon_admin_role',
38
+ where: { code: admin.roleCode }
39
+ });
40
+ }
41
+
42
+ // 返回用户信息(不包含密码,字段已是小驼峰格式)
43
+ const { password: _, ...userWithoutPassword } = admin;
44
+
45
+ return Yes('获取成功', {
46
+ ...userWithoutPassword,
47
+ role: roleInfo
48
+ });
49
+ }
50
+ };
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 添加管理员
3
+ */
4
+
5
+ import { Yes, No, Fields, Crypto2 } from 'befly';
6
+ import adminTable from '../tables/admin.json';
7
+
8
+ export default {
9
+ name: '添加管理员',
10
+ fields: {
11
+ username: adminTable.username,
12
+ email: adminTable.email,
13
+ password: adminTable.password,
14
+ name: adminTable.name,
15
+ nickname: adminTable.nickname,
16
+ phone: adminTable.phone,
17
+ roleId: adminTable.roleId,
18
+ roleCode: adminTable.roleCode,
19
+ roleType: adminTable.roleType
20
+ },
21
+ required: ['username', 'email', 'password'],
22
+ handler: async (befly, ctx) => {
23
+ // 检查用户名是否已存在
24
+ if (ctx.body.username) {
25
+ const existingByUsername = await befly.db.getOne({
26
+ table: 'addon_admin_admin',
27
+ where: { username: ctx.body.username }
28
+ });
29
+
30
+ if (existingByUsername) {
31
+ return No('用户名已被使用');
32
+ }
33
+ }
34
+
35
+ // 检查邮箱是否已存在
36
+ const existingByEmail = await befly.db.getOne({
37
+ table: 'addon_admin_admin',
38
+ where: { email: ctx.body.email }
39
+ });
40
+
41
+ if (existingByEmail) {
42
+ return No('邮箱已被使用');
43
+ }
44
+
45
+ // 加密密码
46
+ const hashedPassword = await Crypto2.hashPassword(ctx.body.password);
47
+
48
+ // 创建管理员
49
+ const adminId = await befly.db.insData({
50
+ table: 'addon_admin_admin',
51
+ data: {
52
+ username: ctx.body.username,
53
+ email: ctx.body.email,
54
+ password: hashedPassword,
55
+ name: ctx.body.name,
56
+ nickname: ctx.body.nickname,
57
+ phone: ctx.body.phone,
58
+ roleId: ctx.body.roleId || 0,
59
+ roleCode: ctx.body.roleCode || '',
60
+ roleType: ctx.body.roleType || 'user'
61
+ }
62
+ });
63
+
64
+ return Yes('添加成功', {
65
+ id: adminId,
66
+ username: ctx.body.username,
67
+ email: ctx.body.email
68
+ });
69
+ }
70
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 获取管理员列表
3
+ */
4
+
5
+ import { Yes, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '获取管理员列表',
9
+ fields: {
10
+ page: Fields.page,
11
+ limit: Fields.limit
12
+ },
13
+ handler: async (befly, ctx) => {
14
+ // 查询所有管理员(框架自动排除password字段,自动转换字段名为小驼峰)
15
+ const result = await befly.db.getList({
16
+ table: 'addon_admin_admin',
17
+ page: ctx.body.page || 1,
18
+ limit: ctx.body.limit || 10,
19
+ orderBy: ['createdAt#DESC']
20
+ });
21
+
22
+ return Yes('获取成功', result);
23
+ }
24
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 获取管理员的角色(单角色模式)
3
+ */
4
+
5
+ import { Yes, No, Fields } from 'befly';
6
+
7
+ export default {
8
+ name: '获取管理员角色',
9
+ fields: {
10
+ adminId: Fields._id
11
+ },
12
+ handler: async (befly, ctx) => {
13
+ // 查询管理员信息(框架自动转换为小驼峰)
14
+ const admin = await befly.db.getOne({
15
+ table: 'addon_admin_admin',
16
+ where: { id: ctx.body.adminId }
17
+ });
18
+
19
+ if (!admin) {
20
+ return No('管理员不存在');
21
+ }
22
+
23
+ // 如果有角色编码,查询角色详细信息(使用 roleCode 而非 roleId)
24
+ let roleInfo = null;
25
+ if (admin.roleCode) {
26
+ roleInfo = await befly.db.getOne({
27
+ table: 'addon_admin_role',
28
+ where: { code: admin.roleCode }
29
+ });
30
+ }
31
+
32
+ return Yes('操作成功', {
33
+ roleId: admin.roleId,
34
+ roleCode: admin.roleCode,
35
+ role: roleInfo
36
+ });
37
+ }
38
+ };