befly 3.9.12 → 3.9.14
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 +85 -0
- package/docs/addon.md +512 -0
- package/docs/api.md +1604 -0
- package/docs/cipher.md +580 -0
- package/docs/config.md +638 -0
- package/docs/database.md +147 -3
- package/docs/examples.md +892 -0
- package/docs/hook.md +754 -0
- package/docs/logger.md +495 -0
- package/docs/plugin.md +978 -0
- package/docs/quickstart.md +331 -0
- package/docs/sync.md +586 -0
- package/docs/table.md +765 -0
- package/docs/validator.md +618 -0
- package/loader/loadApis.ts +33 -36
- package/package.json +3 -3
- package/sync/syncDb/apply.ts +1 -1
- package/sync/syncDb/constants.ts +0 -11
- package/sync/syncDb/helpers.ts +0 -1
- package/sync/syncDb/table.ts +2 -2
- package/sync/syncDb/tableCreate.ts +3 -3
- package/tests/syncDb-constants.test.ts +1 -23
- package/tests/syncDb-helpers.test.ts +0 -1
- package/types/database.d.ts +0 -2
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` 表
|