befly 3.9.12 → 3.9.13

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/docs/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # Befly Core 文档
2
+
3
+ > Befly 是基于 Bun 的高性能 API 框架
4
+
5
+ ## 快速开始
6
+
7
+ - [Quickstart 快速入门](./quickstart.md) - 5 分钟搭建第一个 API 服务
8
+
9
+ ## 核心概念
10
+
11
+ | 文档 | 说明 |
12
+ | -------------------------------- | ---------------------------- |
13
+ | [API 开发](./api.md) | API 定义、字段验证、权限控制 |
14
+ | [Table 表结构](./table.md) | JSON 表定义格式、字段类型 |
15
+ | [Database 数据库](./database.md) | CRUD 操作、事务、批量操作 |
16
+ | [Config 配置](./config.md) | 配置文件、环境分离 |
17
+
18
+ ## 扩展开发
19
+
20
+ | 文档 | 说明 |
21
+ | -------------------------- | -------------- |
22
+ | [Plugin 插件](./plugin.md) | 自定义插件开发 |
23
+ | [Hook 钩子](./hook.md) | 请求处理钩子 |
24
+ | [Addon 插件包](./addon.md) | 可复用功能模块 |
25
+
26
+ ## 工具系统
27
+
28
+ | 文档 | 说明 |
29
+ | -------------------------------- | ------------------ |
30
+ | [Validator 验证](./validator.md) | 参数验证、正则别名 |
31
+ | [Logger 日志](./logger.md) | 日志系统配置 |
32
+ | [Cipher 加密](./cipher.md) | 哈希、签名、JWT |
33
+ | [Redis 缓存](./redis.md) | Redis 操作 |
34
+
35
+ ## 命令工具
36
+
37
+ | 文档 | 说明 |
38
+ | ---------------------- | --------------------- |
39
+ | [Sync 同步](./sync.md) | 数据库、API、菜单同步 |
40
+
41
+ ## 实战示例
42
+
43
+ - [Examples 实战示例](./examples.md) - 用户管理、文章管理、文件上传完整示例
44
+
45
+ ## 文档索引
46
+
47
+ ### 入门篇
48
+
49
+ 1. **[Quickstart](./quickstart.md)** - 环境准备、项目创建、第一个 API
50
+
51
+ ### 开发篇
52
+
53
+ 2. **[API](./api.md)** - API 路由定义、字段验证、权限控制、响应格式
54
+ 3. **[Table](./table.md)** - 表定义格式、字段类型、系统字段、命名规范
55
+ 4. **[Database](./database.md)** - 数据库连接、CRUD 操作、事务处理、批量操作
56
+ 5. **[Config](./config.md)** - 配置文件结构、环境分离、运行时配置
57
+
58
+ ### 扩展篇
59
+
60
+ 6. **[Plugin](./plugin.md)** - 插件生命周期、依赖管理、内置插件
61
+ 7. **[Hook](./hook.md)** - 钩子执行顺序、洋葱模型、内置钩子
62
+ 8. **[Addon](./addon.md)** - Addon 结构、创建发布、命名规范
63
+
64
+ ### 工具篇
65
+
66
+ 9. **[Validator](./validator.md)** - 验证规则、类型转换、正则别名
67
+ 10. **[Logger](./logger.md)** - 日志级别、文件轮转、测试 Mock
68
+ 11. **[Cipher](./cipher.md)** - 哈希算法、HMAC 签名、密码加密、JWT 令牌
69
+ 12. **[Redis](./redis.md)** - 缓存操作、键值存储、过期管理
70
+
71
+ ### 运维篇
72
+
73
+ 13. **[Sync](./sync.md)** - syncDb、syncApi、syncMenu、syncDev 命令
74
+
75
+ ## 常用链接
76
+
77
+ - [GitHub](https://github.com/chenbimo/befly)
78
+ - [npm](https://www.npmjs.com/package/befly-core)
79
+
80
+ ## 版本信息
81
+
82
+ - Befly Core: 1.x
83
+ - 运行时: Bun >= 1.0
84
+ - 数据库: MySQL >= 8.0
85
+ - 缓存: Redis >= 6.0
package/docs/addon.md ADDED
@@ -0,0 +1,512 @@
1
+ # Addon 插件包开发
2
+
3
+ > 可复用的功能模块,包含 API、表、插件、视图
4
+
5
+ ## 目录
6
+
7
+ - [概述](#概述)
8
+ - [Addon 结构](#addon-结构)
9
+ - [创建 Addon](#创建-addon)
10
+ - [发布 Addon](#发布-addon)
11
+ - [使用 Addon](#使用-addon)
12
+ - [命名规范](#命名规范)
13
+ - [API 路由](#api-路由)
14
+ - [表定义](#表定义)
15
+ - [插件开发](#插件开发)
16
+ - [视图与菜单](#视图与菜单)
17
+ - [官方 Addon](#官方-addon)
18
+ - [FAQ](#faq)
19
+
20
+ ---
21
+
22
+ ## 概述
23
+
24
+ Addon 是 Befly 的可复用功能模块,一个 Addon 可以包含:
25
+
26
+ | 目录 | 说明 | 自动加载 |
27
+ | ---------- | ---------- | -------- |
28
+ | `apis/` | API 接口 | ✅ |
29
+ | `tables/` | 表定义 | ✅ |
30
+ | `plugins/` | 自定义插件 | ✅ |
31
+ | `views/` | 前端页面 | ✅ |
32
+ | `styles/` | 样式文件 | 手动引入 |
33
+
34
+ **加载顺序**:Addon 的资源会在项目资源之前加载,项目可以覆盖 Addon 的配置。
35
+
36
+ ---
37
+
38
+ ## Addon 结构
39
+
40
+ ### 标准目录结构
41
+
42
+ ```
43
+ @befly-addon/admin/
44
+ ├── apis/ # API 接口
45
+ │ ├── admin/ # 管理员相关
46
+ │ │ ├── login.ts
47
+ │ │ ├── logout.ts
48
+ │ │ └── info.ts
49
+ │ ├── role/ # 角色管理
50
+ │ │ ├── list.ts
51
+ │ │ └── update.ts
52
+ │ └── menu/ # 菜单管理
53
+ │ └── list.ts
54
+ ├── tables/ # 表定义
55
+ │ ├── admin.json # 管理员表
56
+ │ ├── role.json # 角色表
57
+ │ └── menu.json # 菜单表
58
+ ├── plugins/ # 自定义插件
59
+ │ └── email.ts # 邮件插件
60
+ ├── views/ # 前端视图
61
+ │ ├── login_1/ # 登录页
62
+ │ │ ├── login.vue
63
+ │ │ └── meta.json
64
+ │ └── permission/ # 权限管理
65
+ │ ├── permission.vue
66
+ │ └── meta.json
67
+ ├── styles/ # 样式文件
68
+ │ └── variables.scss
69
+ ├── package.json # 包配置
70
+ └── README.md # 文档
71
+ ```
72
+
73
+ ### package.json 配置
74
+
75
+ ```json
76
+ {
77
+ "name": "@befly-addon/admin",
78
+ "version": "1.0.0",
79
+ "title": "管理后台",
80
+ "description": "Befly - 管理后台功能组件",
81
+ "type": "module",
82
+ "private": false,
83
+ "publishConfig": {
84
+ "access": "public",
85
+ "registry": "https://registry.npmjs.org"
86
+ },
87
+ "main": "package.json",
88
+ "exports": {
89
+ ".": "./package.json",
90
+ "./styles/*": "./styles/*"
91
+ },
92
+ "files": ["apis", "plugins", "styles", "tables", "views", "package.json", "README.md"],
93
+ "keywords": ["befly", "addon"],
94
+ "dependencies": {
95
+ "befly-shared": "^1.2.0"
96
+ }
97
+ }
98
+ ```
99
+
100
+ ---
101
+
102
+ ## 创建 Addon
103
+
104
+ ### 1. 初始化目录
105
+
106
+ ```bash
107
+ mkdir my-addon
108
+ cd my-addon
109
+ bun init
110
+ ```
111
+
112
+ ### 2. 修改 package.json
113
+
114
+ ```json
115
+ {
116
+ "name": "@befly-addon/my-addon",
117
+ "version": "1.0.0",
118
+ "title": "我的插件",
119
+ "type": "module",
120
+ "main": "package.json",
121
+ "files": ["apis", "tables", "plugins", "views"]
122
+ }
123
+ ```
124
+
125
+ ### 3. 创建 API
126
+
127
+ `apis/hello/world.ts`:
128
+
129
+ ```typescript
130
+ import type { ApiRoute } from 'befly-core/types/api.js';
131
+
132
+ export default {
133
+ name: 'Hello World',
134
+ method: 'GET',
135
+ auth: false,
136
+ handler: async (befly, ctx) => {
137
+ return Yes('Hello from my-addon!');
138
+ }
139
+ } as ApiRoute;
140
+ ```
141
+
142
+ ### 4. 创建表定义
143
+
144
+ `tables/example.json`:
145
+
146
+ ```json
147
+ {
148
+ "title": "标题|string|2|100||true",
149
+ "content": "内容|text|0|10000",
150
+ "sort": "排序|number|0|9999|0"
151
+ }
152
+ ```
153
+
154
+ ### 5. 本地测试
155
+
156
+ 在项目中链接本地 Addon:
157
+
158
+ ```bash
159
+ # 在 addon 目录
160
+ bun link
161
+
162
+ # 在项目目录
163
+ bun link @befly-addon/my-addon
164
+ ```
165
+
166
+ ---
167
+
168
+ ## 发布 Addon
169
+
170
+ ### 1. 检查配置
171
+
172
+ 确保 `package.json` 包含:
173
+
174
+ ```json
175
+ {
176
+ "name": "@befly-addon/your-addon-name",
177
+ "publishConfig": {
178
+ "access": "public"
179
+ },
180
+ "files": ["apis", "tables", "plugins", "views"]
181
+ }
182
+ ```
183
+
184
+ ### 2. 登录 npm
185
+
186
+ ```bash
187
+ npm login
188
+ ```
189
+
190
+ ### 3. 发布
191
+
192
+ ```bash
193
+ npm publish
194
+ ```
195
+
196
+ ---
197
+
198
+ ## 使用 Addon
199
+
200
+ ### 安装
201
+
202
+ ```bash
203
+ bun add @befly-addon/admin
204
+ ```
205
+
206
+ ### 自动加载
207
+
208
+ 安装后,Befly 会自动扫描并加载:
209
+
210
+ - `node_modules/@befly-addon/*/apis/` 下的所有 API
211
+ - `node_modules/@befly-addon/*/tables/` 下的所有表定义
212
+ - `node_modules/@befly-addon/*/plugins/` 下的所有插件
213
+ - `node_modules/@befly-addon/*/views/` 下的所有视图
214
+
215
+ ### 手动引入样式
216
+
217
+ ```typescript
218
+ // main.ts 或 vite.config.js
219
+ import '@befly-addon/admin/styles/variables.scss';
220
+ ```
221
+
222
+ ---
223
+
224
+ ## 命名规范
225
+
226
+ ### 包名
227
+
228
+ - 格式:`@befly-addon/{addon-name}`
229
+ - 示例:`@befly-addon/admin`、`@befly-addon/cms`
230
+
231
+ ### 表名前缀
232
+
233
+ Addon 的表自动添加 `addon_{name}_` 前缀:
234
+
235
+ | Addon | 表文件 | 数据库表名 |
236
+ | ------- | -------------- | ------------------- |
237
+ | `admin` | `role.json` | `addon_admin_role` |
238
+ | `admin` | `menu.json` | `addon_admin_menu` |
239
+ | `cms` | `article.json` | `addon_cms_article` |
240
+
241
+ ### API 路由前缀
242
+
243
+ Addon 的 API 自动添加 `/addon/{name}/` 前缀:
244
+
245
+ | Addon | API 文件 | 路由 |
246
+ | ------- | --------------------- | ----------------------------------- |
247
+ | `admin` | `apis/admin/login.ts` | `POST /api/addon/admin/admin/login` |
248
+ | `admin` | `apis/role/list.ts` | `POST /api/addon/admin/role/list` |
249
+
250
+ ---
251
+
252
+ ## API 路由
253
+
254
+ ### 文件结构
255
+
256
+ ```
257
+ apis/
258
+ ├── admin/
259
+ │ ├── login.ts → /api/addon/{name}/admin/login
260
+ │ ├── logout.ts → /api/addon/{name}/admin/logout
261
+ │ └── info.ts → /api/addon/{name}/admin/info
262
+ └── role/
263
+ ├── list.ts → /api/addon/{name}/role/list
264
+ └── update.ts → /api/addon/{name}/role/update
265
+ ```
266
+
267
+ ### API 定义示例
268
+
269
+ ```typescript
270
+ import type { ApiRoute } from 'befly-core/types/api.js';
271
+
272
+ export default {
273
+ name: '管理员登录',
274
+ method: 'POST',
275
+ auth: false,
276
+ desc: '管理员邮箱密码登录',
277
+ fields: {
278
+ email: { name: '邮箱', type: 'string', min: 5, max: 100, regexp: '@email' },
279
+ password: { name: '密码', type: 'string', min: 6, max: 100 }
280
+ },
281
+ required: ['email', 'password'],
282
+ handler: async (befly, ctx) => {
283
+ // 使用 addon 表时需要完整表名
284
+ const admin = await befly.db.getDetail({
285
+ table: 'addon_admin_admin',
286
+ columns: ['id', 'email', 'password', 'nickname'],
287
+ where: { email: ctx.body.email }
288
+ });
289
+
290
+ // ... 业务逻辑
291
+
292
+ return Yes('登录成功', { token: token });
293
+ }
294
+ } as ApiRoute;
295
+ ```
296
+
297
+ ---
298
+
299
+ ## 表定义
300
+
301
+ ### 文件格式
302
+
303
+ 表定义使用 JSON 格式,与项目表定义一致:
304
+
305
+ ```json
306
+ {
307
+ "email": "邮箱|string|5|100||true|@email",
308
+ "password": "密码|string|6|100||true",
309
+ "nickname": "昵称|string|2|50|用户",
310
+ "role_id": "角色ID|number|1||",
311
+ "last_login_at": "最后登录|number|0||"
312
+ }
313
+ ```
314
+
315
+ ### 表名转换
316
+
317
+ | 定义文件 | 数据库表名 |
318
+ | ------------------------- | --------------------------- |
319
+ | `tables/admin.json` | `addon_{name}_admin` |
320
+ | `tables/role.json` | `addon_{name}_role` |
321
+ | `tables/userProfile.json` | `addon_{name}_user_profile` |
322
+
323
+ ### 在代码中使用
324
+
325
+ ```typescript
326
+ // 使用完整表名
327
+ await befly.db.getList({
328
+ table: 'addon_admin_role', // addon_{name}_{table}
329
+ columns: ['id', 'name', 'code']
330
+ });
331
+ ```
332
+
333
+ ---
334
+
335
+ ## 插件开发
336
+
337
+ ### 插件定义
338
+
339
+ `plugins/email.ts`:
340
+
341
+ ```typescript
342
+ import type { Plugin } from 'befly-core/types/plugin.js';
343
+
344
+ export interface EmailConfig {
345
+ host: string;
346
+ port: number;
347
+ user: string;
348
+ pass: string;
349
+ }
350
+
351
+ const emailPlugin: Plugin = {
352
+ after: ['config'], // 依赖 config 插件
353
+ async handler(befly) {
354
+ const config = befly.config.get('email') as EmailConfig;
355
+
356
+ return {
357
+ async send(to: string, subject: string, html: string) {
358
+ // 发送邮件逻辑
359
+ }
360
+ };
361
+ }
362
+ };
363
+
364
+ export default emailPlugin;
365
+ ```
366
+
367
+ ### 插件命名
368
+
369
+ - 插件名称由文件名决定(自动转小驼峰)
370
+ - `email.ts` → `befly.email`
371
+ - `myPlugin.ts` → `befly.myPlugin`
372
+
373
+ ### 使用插件
374
+
375
+ ```typescript
376
+ // 在 API 中使用
377
+ export default {
378
+ name: '发送邮件',
379
+ handler: async (befly, ctx) => {
380
+ await befly.email.send(ctx.body.to, '欢迎注册', '<h1>欢迎使用</h1>');
381
+ return Yes('发送成功');
382
+ }
383
+ } as ApiRoute;
384
+ ```
385
+
386
+ ---
387
+
388
+ ## 视图与菜单
389
+
390
+ ### 视图结构
391
+
392
+ ```
393
+ views/
394
+ ├── login_1/ # 使用 layout 1
395
+ │ ├── login.vue # 页面组件
396
+ │ └── meta.json # 菜单配置
397
+ ├── permission/
398
+ │ ├── permission.vue
399
+ │ ├── meta.json
400
+ │ ├── role/ # 子菜单
401
+ │ │ ├── role.vue
402
+ │ │ └── meta.json
403
+ │ └── menu/
404
+ │ ├── menu.vue
405
+ │ └── meta.json
406
+ ```
407
+
408
+ ### meta.json 配置
409
+
410
+ ```json
411
+ {
412
+ "name": "权限管理",
413
+ "icon": "Shield",
414
+ "sort": 10
415
+ }
416
+ ```
417
+
418
+ ### 目录命名规则
419
+
420
+ - `name_1/` → 使用 `layouts/1.vue` 布局
421
+ - `name_2/` → 使用 `layouts/2.vue` 布局
422
+ - `name/` → 使用默认布局
423
+
424
+ ---
425
+
426
+ ## 官方 Addon
427
+
428
+ ### @befly-addon/admin
429
+
430
+ 管理后台基础功能:
431
+
432
+ | 功能 | API | 表 |
433
+ | ---------- | -------------- | ------------------------- |
434
+ | 管理员管理 | `admin/*` | `addon_admin_admin` |
435
+ | 角色管理 | `role/*` | `addon_admin_role` |
436
+ | 菜单管理 | `menu/*` | `addon_admin_menu` |
437
+ | API 管理 | `api/*` | `addon_admin_api` |
438
+ | 字典管理 | `dict/*` | `addon_admin_dict` |
439
+ | 登录日志 | `loginLog/*` | `addon_admin_login_log` |
440
+ | 操作日志 | `operateLog/*` | `addon_admin_operate_log` |
441
+ | 邮件日志 | `email/*` | `addon_admin_email_log` |
442
+ | 系统配置 | `sysConfig/*` | `addon_admin_sys_config` |
443
+
444
+ **安装**:
445
+
446
+ ```bash
447
+ bun add @befly-addon/admin
448
+ ```
449
+
450
+ ---
451
+
452
+ ## FAQ
453
+
454
+ ### Q: 如何覆盖 Addon 的 API?
455
+
456
+ A: 在项目中创建同路径的 API 文件,项目 API 优先级高于 Addon。
457
+
458
+ ### Q: 如何禁用 Addon 的某个插件?
459
+
460
+ A: 在配置文件中设置:
461
+
462
+ ```json
463
+ {
464
+ "disablePlugins": ["email"]
465
+ }
466
+ ```
467
+
468
+ ### Q: Addon 的表如何迁移?
469
+
470
+ A: 使用 `befly sync:db` 命令,会自动同步所有 Addon 的表定义。
471
+
472
+ ### Q: 如何在 Addon 中访问项目配置?
473
+
474
+ A: 通过 `befly.config` 访问:
475
+
476
+ ```typescript
477
+ const dbConfig = befly.config.get('db');
478
+ const customConfig = befly.config.get('myAddon');
479
+ ```
480
+
481
+ ### Q: Addon 之间可以互相依赖吗?
482
+
483
+ A: 可以,在 `package.json` 中声明依赖:
484
+
485
+ ```json
486
+ {
487
+ "dependencies": {
488
+ "@befly-addon/admin": "^1.0.0"
489
+ }
490
+ }
491
+ ```
492
+
493
+ ### Q: 如何本地开发调试 Addon?
494
+
495
+ A: 使用 `bun link`:
496
+
497
+ ```bash
498
+ # 在 addon 目录
499
+ bun link
500
+
501
+ # 在项目目录
502
+ bun link @befly-addon/my-addon
503
+
504
+ # 修改 addon 代码后会自动生效
505
+ ```
506
+
507
+ ### Q: Addon 的视图如何与项目视图合并?
508
+
509
+ A: Addon 视图会自动合并到路由系统中:
510
+
511
+ - Addon 视图路由前缀:`/addon/{name}/`
512
+ - 菜单会自动同步到 `addon_admin_menu` 表