befly-tpl 3.2.6 → 3.3.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 (91) hide show
  1. package/.env.development +3 -3
  2. package/apis/article/articleDel.ts +2 -2
  3. package/apis/article/articleDetail.ts +2 -2
  4. package/apis/article/articleList.ts +2 -4
  5. package/apis/article/articleUpd.ts +2 -2
  6. package/apis/article/increment.ts +2 -2
  7. package/apis/user/login.ts +3 -3
  8. package/apis/user/userList.ts +3 -5
  9. package/package.json +6 -10
  10. package/pm2.config.cjs +3 -3
  11. package/tables/user.json +1 -1
  12. package/addons/_template/README.md +0 -123
  13. package/addons/_template/addon.config.json +0 -17
  14. package/addons/_template/apis/example.ts +0 -33
  15. package/addons/_template/checks/example.ts +0 -23
  16. package/addons/_template/config/default.ts +0 -12
  17. package/addons/_template/plugins/example.ts +0 -39
  18. package/addons/_template/tables/example.json +0 -7
  19. package/addons/_template/types/index.d.ts +0 -21
  20. package/addons/admin/README.md +0 -179
  21. package/addons/admin/addon.config.json +0 -13
  22. package/addons/admin/apis/adminDel.ts +0 -37
  23. package/addons/admin/apis/adminInfo.ts +0 -50
  24. package/addons/admin/apis/adminIns.ts +0 -70
  25. package/addons/admin/apis/adminList.ts +0 -24
  26. package/addons/admin/apis/adminRoleDetail.ts +0 -38
  27. package/addons/admin/apis/adminRoleSave.ts +0 -40
  28. package/addons/admin/apis/adminUpd.ts +0 -54
  29. package/addons/admin/apis/apiAll.ts +0 -38
  30. package/addons/admin/apis/cacheRefresh.ts +0 -36
  31. package/addons/admin/apis/dashboardAddonList.ts +0 -16
  32. package/addons/admin/apis/dashboardChangelog.ts +0 -41
  33. package/addons/admin/apis/dashboardConfigStatus.ts +0 -56
  34. package/addons/admin/apis/dashboardEnvironmentInfo.ts +0 -48
  35. package/addons/admin/apis/dashboardPerformanceMetrics.ts +0 -25
  36. package/addons/admin/apis/dashboardPermissionStats.ts +0 -33
  37. package/addons/admin/apis/dashboardServiceStatus.ts +0 -84
  38. package/addons/admin/apis/dashboardSystemInfo.ts +0 -34
  39. package/addons/admin/apis/dashboardSystemOverview.ts +0 -34
  40. package/addons/admin/apis/dashboardSystemResources.ts +0 -119
  41. package/addons/admin/apis/dictAll.ts +0 -26
  42. package/addons/admin/apis/dictDel.ts +0 -27
  43. package/addons/admin/apis/dictDetail.ts +0 -28
  44. package/addons/admin/apis/dictIns.ts +0 -38
  45. package/addons/admin/apis/dictList.ts +0 -27
  46. package/addons/admin/apis/dictUpd.ts +0 -44
  47. package/addons/admin/apis/login.ts +0 -123
  48. package/addons/admin/apis/logout.ts +0 -23
  49. package/addons/admin/apis/menuAll.ts +0 -70
  50. package/addons/admin/apis/menuDel.ts +0 -40
  51. package/addons/admin/apis/menuIns.ts +0 -31
  52. package/addons/admin/apis/menuList.ts +0 -26
  53. package/addons/admin/apis/menuUpd.ts +0 -41
  54. package/addons/admin/apis/register.ts +0 -50
  55. package/addons/admin/apis/roleApiDetail.ts +0 -34
  56. package/addons/admin/apis/roleApiSave.ts +0 -44
  57. package/addons/admin/apis/roleDel.ts +0 -48
  58. package/addons/admin/apis/roleDetail.ts +0 -28
  59. package/addons/admin/apis/roleIns.ts +0 -40
  60. package/addons/admin/apis/roleList.ts +0 -18
  61. package/addons/admin/apis/roleMenuDetail.ts +0 -33
  62. package/addons/admin/apis/roleMenuSave.ts +0 -39
  63. package/addons/admin/apis/roleSave.ts +0 -45
  64. package/addons/admin/apis/roleUpd.ts +0 -53
  65. package/addons/admin/apis/sendSmsCode.ts +0 -36
  66. package/addons/admin/checks/admin.ts +0 -36
  67. package/addons/admin/config/index.ts +0 -45
  68. package/addons/admin/config/menu.json +0 -44
  69. package/addons/admin/scripts/syncApi.ts +0 -285
  70. package/addons/admin/scripts/syncDev.ts +0 -203
  71. package/addons/admin/scripts/syncMenu.ts +0 -210
  72. package/addons/admin/tables/admin.json +0 -14
  73. package/addons/admin/tables/api.json +0 -8
  74. package/addons/admin/tables/dict.json +0 -8
  75. package/addons/admin/tables/menu.json +0 -8
  76. package/addons/admin/tables/role.json +0 -8
  77. package/addons/admin/types/index.ts +0 -44
  78. package/addons/admin/util.ts +0 -266
  79. package/addons/befly/addon.config.json +0 -13
  80. package/addons/befly/apis/health/info.ts +0 -77
  81. package/addons/befly/apis/tool/tokenCheck.ts +0 -52
  82. package/addons/demo/README.md +0 -62
  83. package/addons/demo/addon.config.json +0 -13
  84. package/addons/demo/apis/demoIns.ts +0 -36
  85. package/addons/demo/apis/demoList.ts +0 -36
  86. package/addons/demo/checks/demo.ts +0 -30
  87. package/addons/demo/config/default.ts +0 -17
  88. package/addons/demo/plugins/tool.ts +0 -61
  89. package/addons/demo/tables/todo.json +0 -6
  90. package/addons/demo/types/index.d.ts +0 -56
  91. package/tests/core.test.ts +0 -13
@@ -1,266 +0,0 @@
1
- /**
2
- * Admin 插件通用工具函数
3
- */
4
-
5
- import { Logger } from 'befly';
6
- import type { BeflyContext } from 'befly/types/befly';
7
- import { readdirSync, statSync, readFileSync } from 'node:fs';
8
- import path from 'node:path';
9
-
10
- /**
11
- * 递归扫描目录下的所有 .ts 文件
12
- * @param dir - 目录路径
13
- * @param fileList - 文件列表
14
- * @returns 文件路径数组
15
- */
16
- export function scanTsFiles(dir: string, fileList: string[] = []): string[] {
17
- try {
18
- const files = readdirSync(dir);
19
-
20
- for (const file of files) {
21
- const filePath = path.join(dir, file);
22
- const stat = statSync(filePath);
23
-
24
- if (stat.isDirectory()) {
25
- // 递归扫描子目录
26
- scanTsFiles(filePath, fileList);
27
- } else if (file.endsWith('.ts') && !file.endsWith('.d.ts')) {
28
- fileList.push(filePath);
29
- }
30
- }
31
- } catch (error: any) {
32
- Logger.warn(`扫描目录失败: ${dir}`, error.message);
33
- }
34
-
35
- return fileList;
36
- }
37
-
38
- /**
39
- * 收集配置文件中所有菜单的 path(最多2级:父级和子级)
40
- * @param menus - 菜单数组
41
- * @returns 路径集合
42
- */
43
- export function collectPaths(menus: any[]): Set<string> {
44
- const paths = new Set<string>();
45
-
46
- for (const menu of menus) {
47
- if (menu.path) {
48
- paths.add(menu.path);
49
- }
50
- // 只处理一级子菜单
51
- if (menu.children && menu.children.length > 0) {
52
- for (const child of menu.children) {
53
- if (child.path) {
54
- paths.add(child.path);
55
- }
56
- }
57
- }
58
- }
59
-
60
- return paths;
61
- }
62
-
63
- /**
64
- * 检查数据表是否存在
65
- * @param helper - DbHelper 实例
66
- * @param tableName - 表名
67
- * @returns 是否存在
68
- */
69
- export async function checkTableExists(helper: any, tableName: string): Promise<boolean> {
70
- Logger.info('=== 检查数据表 ===');
71
- const exists = await helper.tableExists(tableName);
72
-
73
- if (!exists) {
74
- Logger.error(`❌ 表 ${tableName} 不存在,请先运行 befly syncDb 同步数据库`);
75
- return false;
76
- }
77
-
78
- Logger.info(`✅ 表 ${tableName} 存在`);
79
- return true;
80
- }
81
-
82
- /**
83
- * 删除数据库中不存在于配置的记录
84
- * @param helper - DbHelper 实例
85
- * @param tableName - 表名
86
- * @param configPaths - 配置中的路径集合
87
- * @param pathField - 路径字段名(默认为 'path')
88
- * @returns 删除数量
89
- */
90
- export async function deleteObsoleteRecords(helper: any, tableName: string, configPaths: Set<string>, pathField: string = 'path'): Promise<number> {
91
- Logger.info(`\n=== 删除配置中不存在的记录 ===`);
92
-
93
- const allRecords = await helper.getAll({
94
- table: tableName,
95
- fields: ['id', pathField, 'name']
96
- });
97
-
98
- let deletedCount = 0;
99
- for (const record of allRecords) {
100
- if (record[pathField] && !configPaths.has(record[pathField])) {
101
- await helper.delData({
102
- table: tableName,
103
- where: { id: record.id }
104
- });
105
- deletedCount++;
106
- Logger.info(` └ 删除记录: ${record.name} (ID: ${record.id}, ${pathField}: ${record[pathField]})`);
107
- }
108
- }
109
-
110
- if (deletedCount === 0) {
111
- Logger.info(' ✅ 无需删除的记录');
112
- }
113
-
114
- return deletedCount;
115
- }
116
-
117
- /**
118
- * 输出同步统计信息
119
- * @param stats - 统计对象
120
- * @param deletedCount - 删除数量
121
- * @param resourceName - 资源名称(如:菜单、接口)
122
- */
123
- export function logSyncStats(stats: { created: number; updated: number }, deletedCount: number, resourceName: string = '记录'): void {
124
- Logger.info(`\n=== ${resourceName}同步完成 ===`);
125
- Logger.info(`新增${resourceName}: ${stats.created} 个`);
126
- Logger.info(`更新${resourceName}: ${stats.updated} 个`);
127
- Logger.info(`删除${resourceName}: ${deletedCount} 个`);
128
- }
129
-
130
- /**
131
- * 获取插件目录列表
132
- * @param addonsDir - addons 根目录路径
133
- * @returns 插件名称数组
134
- */
135
- export function getAddonDirs(addonsDir: string): string[] {
136
- try {
137
- return readdirSync(addonsDir).filter((name) => {
138
- const addonPath = path.join(addonsDir, name);
139
- return statSync(addonPath).isDirectory() && !name.startsWith('_');
140
- });
141
- } catch (error: any) {
142
- Logger.warn(`读取插件目录失败: ${addonsDir}`, error.message);
143
- return [];
144
- }
145
- }
146
-
147
- /**
148
- * 缓存角色权限到 Redis Set(增量更新)
149
- * @param befly - Befly 上下文
150
- * @param roleCode - 角色代码
151
- * @param apiIds - 接口 ID 数组(逗号分隔的字符串)
152
- */
153
- export async function cacheRolePermissions(befly: BeflyContext, roleCode: string, apiIds: string): Promise<void> {
154
- try {
155
- if (!apiIds) {
156
- // 如果没有权限,删除缓存
157
- await befly.redis.del(`role:apis:${roleCode}`);
158
- Logger.debug(`已删除角色 ${roleCode} 的权限缓存(无权限)`);
159
- return;
160
- }
161
-
162
- // 解析接口 ID 列表
163
- const apiIdArray = apiIds
164
- .split(',')
165
- .map((id: string) => parseInt(id.trim()))
166
- .filter((id: number) => !isNaN(id));
167
-
168
- if (apiIdArray.length === 0) {
169
- await befly.redis.del(`role:apis:${roleCode}`);
170
- Logger.debug(`已删除角色 ${roleCode} 的权限缓存(ID 列表为空)`);
171
- return;
172
- }
173
-
174
- // 查询所有接口
175
- const allApis = await befly.db.getAll({
176
- table: 'addon_admin_api',
177
- fields: ['id', 'path', 'method']
178
- });
179
-
180
- // 根据 ID 过滤出接口路径
181
- const roleApiPaths = allApis.filter((api: any) => apiIdArray.includes(api.id)).map((api: any) => `${api.method}${api.path}`);
182
-
183
- if (roleApiPaths.length === 0) {
184
- await befly.redis.del(`role:apis:${roleCode}`);
185
- Logger.debug(`已删除角色 ${roleCode} 的权限缓存(无匹配接口)`);
186
- return;
187
- }
188
-
189
- // 使用 Redis Set 缓存(先删除再添加,确保数据一致性)
190
- const redisKey = `role:apis:${roleCode}`;
191
- await befly.redis.del(redisKey);
192
- const result = await befly.redis.sadd(redisKey, roleApiPaths);
193
-
194
- Logger.debug(`已缓存角色 ${roleCode} 的权限: ${result} 个接口`);
195
- } catch (error: any) {
196
- Logger.warn(`缓存角色 ${roleCode} 权限失败:`, error?.message || '未知错误');
197
- }
198
- }
199
-
200
- /**
201
- * 删除角色权限缓存
202
- * @param befly - Befly 上下文
203
- * @param roleCode - 角色代码
204
- */
205
- export async function deleteRolePermissions(befly: BeflyContext, roleCode: string): Promise<void> {
206
- try {
207
- await befly.redis.del(`role:apis:${roleCode}`);
208
- Logger.debug(`已删除角色 ${roleCode} 的权限缓存`);
209
- } catch (error: any) {
210
- Logger.warn(`删除角色 ${roleCode} 权限缓存失败:`, error?.message || '未知错误');
211
- }
212
- }
213
-
214
- /**
215
- * 获取插件列表
216
- * @returns 插件列表
217
- */
218
- export function getAddonList(): Array<{ name: string; title: string; version: string; description: string; enabled: boolean }> {
219
- const addonList: Array<{ name: string; title: string; version: string; description: string; enabled: boolean }> = [];
220
-
221
- // 获取 addons 目录路径
222
- const addonsDir = path.join(process.cwd(), 'addons');
223
-
224
- try {
225
- const addonNames = readdirSync(addonsDir);
226
-
227
- for (const addonName of addonNames) {
228
- const addonPath = path.join(addonsDir, addonName);
229
- const stat = statSync(addonPath);
230
-
231
- // 只处理目录
232
- if (!stat.isDirectory()) {
233
- continue;
234
- }
235
-
236
- // 读取插件配置文件
237
- const configPath = path.join(addonPath, 'addon.config.json');
238
-
239
- try {
240
- const configContent = readFileSync(configPath, 'utf-8');
241
- const config = JSON.parse(configContent);
242
-
243
- addonList.push({
244
- name: config.name || addonName,
245
- title: config.title || addonName,
246
- version: config.version || '1.0.0',
247
- description: config.description || '',
248
- enabled: true
249
- });
250
- } catch (error) {
251
- // 配置文件不存在或解析失败,使用默认值
252
- addonList.push({
253
- name: addonName,
254
- title: addonName,
255
- version: '1.0.0',
256
- description: '',
257
- enabled: true
258
- });
259
- }
260
- }
261
- } catch (error: any) {
262
- Logger.warn(`扫描插件目录失败:`, error?.message || '未知错误');
263
- }
264
-
265
- return addonList;
266
- }
@@ -1,13 +0,0 @@
1
- {
2
- "name": "befly",
3
- "title": "Befly 核心组件",
4
- "version": "1.0.0",
5
- "description": "Befly 框架核心 API 组件",
6
- "author": {
7
- "name": "Befly Team"
8
- },
9
- "keywords": ["core", "api"],
10
- "entry": "index.ts",
11
- "enabled": true,
12
- "license": "MIT"
13
- }
@@ -1,77 +0,0 @@
1
- /**
2
- * 健康检查接口
3
- * 检查服务器、Redis、数据库等状态
4
- * 路由:GET /api/befly/health/info
5
- */
6
-
7
- import { Yes, Env, getRedis } from 'befly';
8
-
9
- interface HealthInfo {
10
- status: string;
11
- timestamp: string;
12
- uptime: number;
13
- memory: NodeJS.MemoryUsage;
14
- runtime: string;
15
- version: string;
16
- platform: string;
17
- arch: string;
18
- redis?: string;
19
- redisError?: string;
20
- database?: string;
21
- databaseError?: string;
22
- }
23
-
24
- export default {
25
- name: '健康检查',
26
- auth: false,
27
- handler: async (befly, ctx) => {
28
- const info = {
29
- status: 'ok',
30
- timestamp: new Date().toISOString(),
31
- uptime: process.uptime(),
32
- memory: process.memoryUsage(),
33
- runtime: 'Bun',
34
- version: Bun.version,
35
- platform: process.platform,
36
- arch: process.arch
37
- };
38
-
39
- // 检查 Redis 连接状态
40
- if (Env.REDIS_ENABLE === 1) {
41
- const redisClient = getRedis();
42
- if (redisClient) {
43
- try {
44
- await redisClient.ping();
45
- info.redis = '已连接';
46
- } catch (error: any) {
47
- info.redis = '未连接';
48
- info.redisError = error.message;
49
- }
50
- } else {
51
- info.redis = '未开启';
52
- }
53
- } else {
54
- info.redis = '禁用';
55
- }
56
-
57
- // 检查数据库连接状态
58
- if (Env.DB_ENABLE === 1) {
59
- if (befly.db) {
60
- try {
61
- // 执行简单查询测试连接
62
- await befly.db.query('SELECT 1');
63
- info.database = '已连接';
64
- } catch (error: any) {
65
- info.database = '未连接';
66
- info.databaseError = error.message;
67
- }
68
- } else {
69
- info.database = '未开启';
70
- }
71
- } else {
72
- info.database = '禁用';
73
- }
74
-
75
- return Yes('健康检查成功', info);
76
- }
77
- };
@@ -1,52 +0,0 @@
1
- /**
2
- * 令牌检测接口
3
- * 验证 JWT 令牌是否有效
4
- * 路由:POST /api/befly/tool/tokenCheck
5
- */
6
-
7
- import { Yes, No, Jwt } from 'befly';
8
-
9
- interface TokenCheckData {
10
- valid: boolean;
11
- payload?: any;
12
- expiresIn?: number;
13
- }
14
-
15
- export default {
16
- name: '令牌检测',
17
- auth: false,
18
- handler: async (befly, ctx) => {
19
- // 从 Authorization 头获取 token
20
- const authHeader = ctx.headers.authorization || '';
21
- const token = authHeader.split(' ')[1] || '';
22
-
23
- if (!token) {
24
- return No('令牌不能为空');
25
- }
26
-
27
- try {
28
- // 验证令牌
29
- const jwtData = await Jwt.verify(token);
30
-
31
- // 计算剩余有效期
32
- const expiresIn = jwtData.exp ? jwtData.exp - Math.floor(Date.now() / 1000) : undefined;
33
-
34
- const data = {
35
- valid: true,
36
- payload: jwtData,
37
- expiresIn
38
- };
39
-
40
- return Yes('令牌有效', data);
41
- } catch (error: any) {
42
- // 针对预期的令牌错误,返回友好提示(非致命错误)
43
- if (error.message.includes('expired')) {
44
- return No('令牌已过期', { expired: true });
45
- } else if (error.message.includes('invalid')) {
46
- return No('令牌无效', { invalid: true });
47
- }
48
- // 其他未知错误向上抛出,由路由层统一处理
49
- throw error;
50
- }
51
- }
52
- };
@@ -1,62 +0,0 @@
1
- # Demo Addon
2
-
3
- 这是一个完整的 Befly Addon 演示组件,展示了如何创建一个功能完整的组件。
4
-
5
- ## 功能说明
6
-
7
- Demo 组件提供了一个简单的待办事项(Todo)管理功能:
8
-
9
- - ✅ **API**:创建待办、查询待办列表
10
- - ✅ **插件**:提供工具函数
11
- - ✅ **检查**:启动时验证配置
12
- - ✅ **表定义**:自动创建 `demo_todo` 表
13
- - ✅ **类型定义**:TypeScript 类型支持
14
-
15
- ## 路由
16
-
17
- - `POST /api/demo/create` - 创建待办事项
18
- - `GET /api/demo/list` - 获取待办列表
19
-
20
- ## 数据库表
21
-
22
- - `demo_todo` - 待办事项表
23
- - id (自增主键)
24
- - title (标题)
25
- - content (内容)
26
- - completed (是否完成)
27
- - priority (优先级)
28
- - createdAt (创建时间)
29
-
30
- ## 插件
31
-
32
- - `demo.tool` - 工具插件,提供:
33
- - `formatTodo()` - 格式化待办数据
34
- - `validatePriority()` - 验证优先级
35
-
36
- ## 使用示例
37
-
38
- ### 创建待办
39
-
40
- ```bash
41
- curl -X POST http://localhost:3001/api/demo/create \
42
- -H "Content-Type: application/json" \
43
- -d '{
44
- "title": "学习 Befly",
45
- "content": "阅读文档并实践",
46
- "priority": "high"
47
- }'
48
- ```
49
-
50
- ### 查询待办列表
51
-
52
- ```bash
53
- curl http://localhost:3001/api/demo/list
54
- ```
55
-
56
- ## 环境变量
57
-
58
- ```env
59
- # Demo 组件配置
60
- DEMO_ENABLE=true
61
- DEMO_DEFAULT_PRIORITY=medium
62
- ```
@@ -1,13 +0,0 @@
1
- {
2
- "name": "demo",
3
- "title": "演示组件",
4
- "version": "1.0.0",
5
- "description": "完整的 Befly Addon 演示组件,展示待办事项(Todo)管理功能",
6
- "author": {
7
- "name": "Befly Team"
8
- },
9
- "keywords": ["demo", "example", "todo"],
10
- "entry": "index.ts",
11
- "enabled": true,
12
- "license": "MIT"
13
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * Demo Addon - 创建待办事项
3
- * 路由:POST /api/demo/create
4
- */
5
-
6
- import { Yes, Fields } from 'befly';
7
-
8
- export default {
9
- name: '创建待办事项',
10
- auth: false,
11
- fields: {
12
- title: Fields.title,
13
- content: '内容|string|0|500|null|0|null',
14
- priority: '优先级|string|1|10|medium|0|^(low|medium|high)$'
15
- },
16
- required: ['title'],
17
- handler: async (befly, ctx) => {
18
- // 插入数据到 demo_todo 表
19
- const result = await befly.db.insData({
20
- table: 'addon_demo_todo',
21
- data: {
22
- title: ctx.body.title,
23
- content: ctx.body.content || '',
24
- priority: ctx.body.priority || 'medium',
25
- completed: 0
26
- }
27
- });
28
-
29
- return Yes('待办创建成功', {
30
- id: result,
31
- title: ctx.body.title,
32
- content: ctx.body.content || '',
33
- priority: ctx.body.priority || 'medium'
34
- });
35
- }
36
- };
@@ -1,36 +0,0 @@
1
- /**
2
- * Demo Addon - 查询待办列表
3
- * 路由:GET /api/demo/list
4
- */
5
-
6
- import { Yes, Fields } from 'befly';
7
-
8
- export default {
9
- name: '查询待办列表',
10
- auth: false,
11
- fields: {
12
- completed: '是否完成|number|0|1|null|0|null',
13
- priority: '优先级|string|1|10|null|0|^(low|medium|high)$',
14
- page: Fields.page,
15
- limit: '每页数量|number|1|100|10|0|null'
16
- },
17
- handler: async (befly, ctx) => {
18
- // 查询数据(使用 getList 方法,带分页)
19
- const result = await befly.db.getList({
20
- table: 'addon_demo_todo',
21
- where: {
22
- completed: ctx.body.completed,
23
- priority: ctx.body.priority
24
- },
25
- page: ctx.body.page,
26
- limit: ctx.body.limit,
27
- orderBy: ['createdAt#DESC']
28
- });
29
-
30
- // 暂时不使用插件格式化,直接返回原始数据
31
- // const demoTool = befly['demo.tool'];
32
- // const formattedTodos = result.list.map((todo: any) => demoTool.formatTodo(todo));
33
-
34
- return Yes('查询成功', result);
35
- }
36
- };
@@ -1,30 +0,0 @@
1
- /**
2
- * Demo Addon 启动检查
3
- * 验证组件配置和依赖
4
- */
5
-
6
- import { Logger } from 'befly';
7
-
8
- export default async function (): Promise<boolean> {
9
- try {
10
- // 检查环境变量配置
11
- const demoEnable = process.env.DEMO_ENABLE;
12
- const defaultPriority = process.env.DEMO_DEFAULT_PRIORITY;
13
-
14
- if (demoEnable === 'false') {
15
- Logger.info('[Demo] 组件已禁用');
16
- return true;
17
- }
18
-
19
- // 验证默认优先级配置
20
- if (defaultPriority && !['low', 'medium', 'high'].includes(defaultPriority)) {
21
- Logger.warn(`[Demo] 无效的默认优先级配置: ${defaultPriority},将使用 'medium'`);
22
- }
23
-
24
- Logger.info('[Demo] 组件检查通过');
25
- return true;
26
- } catch (error: any) {
27
- Logger.error('[Demo] 组件检查失败:', error);
28
- return false;
29
- }
30
- }
@@ -1,17 +0,0 @@
1
- /**
2
- * Demo Addon 默认配置
3
- */
4
-
5
- export default {
6
- // 是否启用组件
7
- enabled: process.env.DEMO_ENABLE !== 'false',
8
-
9
- // 默认优先级
10
- defaultPriority: process.env.DEMO_DEFAULT_PRIORITY || 'medium',
11
-
12
- // 每页默认数量
13
- defaultPageSize: Number(process.env.DEMO_PAGE_SIZE) || 10,
14
-
15
- // 最大每页数量
16
- maxPageSize: Number(process.env.DEMO_MAX_PAGE_SIZE) || 100
17
- };
@@ -1,61 +0,0 @@
1
- /**
2
- * Demo Addon 工具插件
3
- * 提供待办事项相关的工具函数
4
- */
5
-
6
- import { Logger } from 'befly';
7
-
8
- export default {
9
- name: 'tool',
10
- version: '1.0.0',
11
- priority: 100,
12
-
13
- async onLoad(befly) {
14
- Logger.info('[Demo] 工具插件加载中...');
15
- },
16
-
17
- async onInit(befly) {
18
- Logger.info('[Demo] 工具插件初始化中...');
19
-
20
- return {
21
- /**
22
- * 验证优先级
23
- */
24
- validatePriority(priority: string): boolean {
25
- return ['low', 'medium', 'high'].includes(priority);
26
- },
27
-
28
- /**
29
- * 格式化待办数据
30
- */
31
- formatTodo(todo: any) {
32
- return {
33
- id: todo.id,
34
- title: todo.title,
35
- content: todo.content,
36
- priority: todo.priority,
37
- completed: Boolean(todo.completed),
38
- priorityLabel:
39
- {
40
- low: '低',
41
- medium: '中',
42
- high: '高'
43
- }[todo.priority] || '未知',
44
- statusLabel: todo.completed ? '已完成' : '未完成',
45
- createdAt: todo.created_at,
46
- createdAtFormatted: new Date(Number(todo.created_at)).toLocaleString('zh-CN')
47
- };
48
- },
49
-
50
- /**
51
- * 获取配置
52
- */
53
- getConfig() {
54
- return {
55
- enabled: process.env.DEMO_ENABLE !== 'false',
56
- defaultPriority: process.env.DEMO_DEFAULT_PRIORITY || 'medium'
57
- };
58
- }
59
- };
60
- }
61
- } as BeflyPlugin;
@@ -1,6 +0,0 @@
1
- {
2
- "title": "标题|string|1|100|null|1|null",
3
- "content": "内容|string|0|1000|null|0|null",
4
- "completed": "是否完成|number|0|1|0|1|null",
5
- "priority": "优先级|string|1|10|medium|1|^(low|medium|high)$"
6
- }