@lovrabet/cli 1.2.4 → 1.2.5-beta.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.
- package/lib/add-page/input-page-router.js +1 -1
- package/lib/add-page/main.js +1 -1
- package/lib/add-page/select-page-template.js +1 -1
- package/lib/api/api-doc-ui.js +1 -1
- package/lib/api/api-doc.js +1 -1
- package/lib/api/api-pull-ui.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.js +1 -1
- package/lib/api/main.js +1 -1
- package/lib/api/pull-silent.js +1 -1
- package/lib/app-menu/app-menu-sync-ui.js +1 -1
- package/lib/app-menu/create-menu.js +1 -1
- package/lib/app-menu/get-local-pages.js +1 -1
- package/lib/app-menu/get-online-menu-list.js +1 -1
- package/lib/app-menu/use-get-online-menu-list.js +1 -1
- package/lib/app-menu/utils.js +1 -1
- package/lib/app-menu/valid-url.js +1 -1
- package/lib/app-menu-update-cdn/current-content.js +1 -1
- package/lib/app-menu-update-cdn/input-cdn-asset.js +1 -1
- package/lib/app-menu-update-cdn/main.js +1 -1
- package/lib/app-menu-update-cdn/update-menu-cdn-url.js +1 -1
- package/lib/auth/auth-server-ui.js +1 -1
- package/lib/auth/auth-server.js +1 -1
- package/lib/auth/constant.js +1 -1
- package/lib/auth/get-cookie.js +1 -1
- package/lib/auth/is-session-valid.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/cmd/build-watch.js +1 -1
- package/lib/cmd/build.js +1 -1
- package/lib/cmd/logs.js +1 -1
- package/lib/cmd/preview.js +1 -1
- package/lib/cmd/start.js +1 -1
- package/lib/config/config-help.js +1 -1
- package/lib/config/main.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/create-app/enhanced-guided-create.js +1 -1
- package/lib/create-app/format-elapsed.js +1 -1
- package/lib/create-app/main.js +1 -1
- package/lib/create-app/task-finished.js +1 -1
- package/lib/create-app/task-loading.js +1 -1
- package/lib/create-app/task-running.js +1 -1
- package/lib/create-app/task-time.js +1 -1
- package/lib/create-app/use-copy-project-template.js +1 -1
- package/lib/create-app/use-format-code.js +1 -1
- package/lib/create-app/use-install-dependencies.js +1 -1
- package/lib/help.js +1 -1
- package/lib/init/main.js +1 -1
- package/lib/mcp/claude.js +1 -0
- package/lib/mcp/cursor.js +1 -1
- package/lib/mcp/main.js +1 -1
- package/lib/skills/main.js +1 -0
- package/lib/utils/check-sdk-version.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/copy-directory.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/router-updater.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/package.json +1 -1
- package/templates/projects/sub-app-react-demo/index.html +22 -34
- package/templates/projects/sub-app-react-demo/public/logo.svg +1 -0
- package/templates/projects/sub-app-react-demo/src/api/api.ts +1 -1
- package/templates/projects/sub-app-react-demo/src/api/client.ts +1 -1
- package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +44 -71
- package/templates/projects/sub-app-react-demo/src/pages/index.tsx +387 -927
- package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +1 -1
- package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +293 -0
- package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +100 -414
- package/templates/projects/sub-app-react-demo/src/style.css +21 -15
- package/templates/projects/sub-app-react-demo/vite.config.ts +18 -13
- package/templates/rules/lovrabet_rules.mdc.tpl +636 -43
- package/templates/skills/.claude/skills/lovrabet/SKILL.md +257 -0
- package/templates/skills/.cursor/commands/lovrabet.md +247 -0
- package/templates/skills/.cursorrules +109 -0
- package/templates/skills/.shared/README.md +45 -0
- package/templates/skills/.shared/guides/01-filter-query/guide.md +300 -0
- package/templates/skills/.shared/guides/02-mcp-sql-workflow/guide.md +272 -0
- package/templates/skills/.shared/guides/03-antd-style/guide.md +227 -0
- package/templates/skills/.shared/guides/04-troubleshooting/guide.md +426 -0
- package/templates/skills/.shared/guides/05-api-integration/guide.md +327 -0
- package/templates/skills/.shared/guides/06-menu-management/guide.md +305 -0
- package/templates/skills/.windsurf/workflows/lovrabet.md +256 -0
- package/templates/projects/sub-app-react-demo/.vscode/extensions.json +0 -3
- package/templates/projects/sub-app-react-demo/.vscode/settings.json +0 -57
- package/templates/projects/sub-app-react-demo/src/pages/intro/index.tsx +0 -560
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# API 集成指南
|
|
2
|
+
|
|
3
|
+
> **目标**:使用 `lovrabet api pull` 集成数据集 API,自动生成类型和调用代码
|
|
4
|
+
|
|
5
|
+
## 🎯 为什么这个技能重要?
|
|
6
|
+
|
|
7
|
+
手动编写 API 调用代码容易出错:
|
|
8
|
+
- 字段名可能拼写错误
|
|
9
|
+
- 类型定义不完整
|
|
10
|
+
- 数据集更新后代码不同步
|
|
11
|
+
|
|
12
|
+
使用 `lovrabet api pull` 可以:
|
|
13
|
+
- 自动生成 TypeScript 类型
|
|
14
|
+
- 生成标准的 API 调用代码
|
|
15
|
+
- 保持代码与数据集定义同步
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🚀 快速开始
|
|
20
|
+
|
|
21
|
+
### 第1步:初始化项目配置
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 如果还没有初始化 Lovrabet 配置
|
|
25
|
+
lovrabet init --appcode <你的appcode>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 第2步:拉取 API 定义
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 拉取所有数据集的 API 定义
|
|
32
|
+
lovrabet api pull
|
|
33
|
+
|
|
34
|
+
# 只拉取指定的数据集
|
|
35
|
+
lovrabet api pull --datasetcode customer,order
|
|
36
|
+
|
|
37
|
+
# 指定输出目录
|
|
38
|
+
lovrabet api pull --output ./src/api
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 第3步:使用生成的 API
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// 引入生成的 API 文件
|
|
45
|
+
import { customerApi, orderApi } from '@/api/lovrabet';
|
|
46
|
+
|
|
47
|
+
// 使用自动生成的类型
|
|
48
|
+
import type { Customer, Order } from '@/api/lovrabet/types';
|
|
49
|
+
|
|
50
|
+
// 调用 API
|
|
51
|
+
const customers = await customerApi.filter({
|
|
52
|
+
where: { status: { $eq: 'active' } },
|
|
53
|
+
select: ['id', 'name', 'email'],
|
|
54
|
+
currentPage: 1,
|
|
55
|
+
pageSize: 20,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// 类型安全
|
|
59
|
+
customers.tableData.forEach((customer: Customer) => {
|
|
60
|
+
console.log(customer.name); // TypeScript 会提供完整的类型提示
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 📋 工作流详解
|
|
67
|
+
|
|
68
|
+
### 完整的 API 集成流程
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
1. lovrabet init 初始化配置
|
|
72
|
+
2. lovrabet api pull 拉取 API 定义
|
|
73
|
+
3. 编写业务代码 使用生成的 API
|
|
74
|
+
4. 数据集更新后 重新运行 api pull
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 第1步:初始化配置
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 创建 .lovrabetrc 配置文件
|
|
81
|
+
lovrabet init
|
|
82
|
+
|
|
83
|
+
# 或指定 appcode
|
|
84
|
+
lovrabet init --appcode app-xxx
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
生成的 `.lovrabetrc` 文件:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"appcode": "app-xxx",
|
|
92
|
+
"env": "online",
|
|
93
|
+
"outputDir": "./src/api"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 第2步:拉取 API 定义
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# 基本用法
|
|
101
|
+
lovrabet api pull
|
|
102
|
+
|
|
103
|
+
# 完整参数
|
|
104
|
+
lovrabet api pull \
|
|
105
|
+
--appcode app-xxx \
|
|
106
|
+
--env online \
|
|
107
|
+
--output ./src/api \
|
|
108
|
+
--datasetcode customer,order
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
参数说明:
|
|
112
|
+
|
|
113
|
+
| 参数 | 说明 | 默认值 |
|
|
114
|
+
|------|------|--------|
|
|
115
|
+
| `--appcode` | 应用代码 | 从 .lovrabetrc 读取 |
|
|
116
|
+
| `--env` | 环境 (online/daily) | online |
|
|
117
|
+
| `--output` | 输出目录 | ./src/api |
|
|
118
|
+
| `--datasetcode` | 指定数据集(逗号分隔) | 全部 |
|
|
119
|
+
|
|
120
|
+
### 第3步:查看生成的文件
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
src/api/
|
|
124
|
+
├── lovrabet/
|
|
125
|
+
│ ├── index.ts # 导出入口
|
|
126
|
+
│ ├── customer.ts # 客户数据集 API
|
|
127
|
+
│ ├── order.ts # 订单数据集 API
|
|
128
|
+
│ └── types.ts # TypeScript 类型定义
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 第4步:使用生成的代码
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// 引入 API 和类型
|
|
135
|
+
import { customerApi } from '@/api/lovrabet';
|
|
136
|
+
import type { Customer } from '@/api/lovrabet/types';
|
|
137
|
+
|
|
138
|
+
// 在组件中使用
|
|
139
|
+
function CustomerList() {
|
|
140
|
+
const [customers, setCustomers] = useState<Customer[]>([]);
|
|
141
|
+
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
// 数据集: 客户 | 数据表: customer
|
|
144
|
+
customerApi.filter({
|
|
145
|
+
where: { status: { $eq: 'active' } },
|
|
146
|
+
currentPage: 1,
|
|
147
|
+
pageSize: 20,
|
|
148
|
+
}).then(result => {
|
|
149
|
+
setCustomers(result.tableData);
|
|
150
|
+
});
|
|
151
|
+
}, []);
|
|
152
|
+
|
|
153
|
+
return (
|
|
154
|
+
<Table>
|
|
155
|
+
{customers.map(c => (
|
|
156
|
+
<tr key={c.id}>
|
|
157
|
+
<td>{c.name}</td>
|
|
158
|
+
<td>{c.email}</td>
|
|
159
|
+
</tr>
|
|
160
|
+
))}
|
|
161
|
+
</Table>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 🔄 数据集更新后
|
|
169
|
+
|
|
170
|
+
当数据集定义发生变化时(新增字段、修改类型等):
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# 重新拉取 API 定义
|
|
174
|
+
lovrabet api pull
|
|
175
|
+
|
|
176
|
+
# 检查生成的类型是否更新
|
|
177
|
+
cat src/api/lovrabet/types.ts
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**注意**:重新生成会覆盖现有文件,如果需要自定义修改,请创建单独的封装文件。
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## ⚠️ 常见问题
|
|
185
|
+
|
|
186
|
+
### 问题 1:提示 "未找到 appcode 配置"
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# 解决方法:先运行 init
|
|
190
|
+
lovrabet init --appcode <你的appcode>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 问题 2:生成的类型为空
|
|
194
|
+
|
|
195
|
+
检查:
|
|
196
|
+
1. appcode 是否正确
|
|
197
|
+
2. 是否有权限访问该数据集
|
|
198
|
+
3. 数据集是否已发布
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
# 查看详细日志
|
|
202
|
+
lovrabet logs
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 问题 3:如何自定义 API 调用
|
|
206
|
+
|
|
207
|
+
创建单独的封装文件,不要直接修改生成的文件:
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
// src/api/customer.ts (自定义封装)
|
|
211
|
+
import { customerApi as baseCustomerApi } from '@/api/lovrabet';
|
|
212
|
+
import type { Customer } from '@/api/lovrabet/types';
|
|
213
|
+
|
|
214
|
+
export const customerApi = {
|
|
215
|
+
// 使用生成的 API
|
|
216
|
+
...baseCustomerApi,
|
|
217
|
+
|
|
218
|
+
// 自定义方法
|
|
219
|
+
async getActiveCustomers(page = 1) {
|
|
220
|
+
return baseCustomerApi.filter({
|
|
221
|
+
where: { status: { $eq: 'active' } },
|
|
222
|
+
currentPage: page,
|
|
223
|
+
pageSize: 20,
|
|
224
|
+
});
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
async searchCustomers(keyword: string) {
|
|
228
|
+
return baseCustomerApi.filter({
|
|
229
|
+
where: {
|
|
230
|
+
$or: [
|
|
231
|
+
{ name: { $contain: keyword } },
|
|
232
|
+
{ email: { $contain: keyword } },
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 📝 实战示例
|
|
243
|
+
|
|
244
|
+
### 示例 1:用户管理页面
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# 1. 拉取用户数据集 API
|
|
248
|
+
lovrabet api pull --datasetcode users
|
|
249
|
+
|
|
250
|
+
# 2. 创建页面组件
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// src/pages/users/index.tsx
|
|
255
|
+
import { useState, useEffect } from 'react';
|
|
256
|
+
import { Table, Button, message } from 'antd';
|
|
257
|
+
import { usersApi } from '@/api/lovrabet';
|
|
258
|
+
import type { User } from '@/api/lovrabet/types';
|
|
259
|
+
|
|
260
|
+
export function UserList() {
|
|
261
|
+
const [users, setUsers] = useState<User[]>([]);
|
|
262
|
+
const [loading, setLoading] = useState(false);
|
|
263
|
+
const [pagination, setPagination] = useState({ current: 1, pageSize: 20, total: 0 });
|
|
264
|
+
|
|
265
|
+
const loadUsers = async (page = 1) => {
|
|
266
|
+
setLoading(true);
|
|
267
|
+
try {
|
|
268
|
+
// 数据集: 用户 | 数据表: users
|
|
269
|
+
const result = await usersApi.filter({
|
|
270
|
+
currentPage: page,
|
|
271
|
+
pageSize: 20,
|
|
272
|
+
select: ['id', 'username', 'email', 'status', 'createTime'],
|
|
273
|
+
orderBy: [{ createTime: 'desc' }],
|
|
274
|
+
});
|
|
275
|
+
setUsers(result.tableData);
|
|
276
|
+
setPagination({ ...pagination, current: page, total: result.total });
|
|
277
|
+
} catch (error) {
|
|
278
|
+
message.error('加载失败');
|
|
279
|
+
} finally {
|
|
280
|
+
setLoading(false);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
useEffect(() => {
|
|
285
|
+
loadUsers();
|
|
286
|
+
}, []);
|
|
287
|
+
|
|
288
|
+
return (
|
|
289
|
+
<div>
|
|
290
|
+
<Table
|
|
291
|
+
dataSource={users}
|
|
292
|
+
loading={loading}
|
|
293
|
+
rowKey="id"
|
|
294
|
+
pagination={{
|
|
295
|
+
...pagination,
|
|
296
|
+
onChange: (page) => loadUsers(page),
|
|
297
|
+
}}
|
|
298
|
+
columns={[
|
|
299
|
+
{ title: '用户名', dataIndex: 'username' },
|
|
300
|
+
{ title: '邮箱', dataIndex: 'email' },
|
|
301
|
+
{ title: '状态', dataIndex: 'status' },
|
|
302
|
+
{ title: '创建时间', dataIndex: 'createTime' },
|
|
303
|
+
]}
|
|
304
|
+
/>
|
|
305
|
+
</div>
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## ✅ 自检清单
|
|
313
|
+
|
|
314
|
+
使用 API 集成时,确认:
|
|
315
|
+
|
|
316
|
+
- [ ] 已运行 `lovrabet init` 初始化配置
|
|
317
|
+
- [ ] 已运行 `lovrabet api pull` 生成 API
|
|
318
|
+
- [ ] 生成的类型文件包含正确的类型定义
|
|
319
|
+
- [ ] 代码中添加了数据集和数据表注释
|
|
320
|
+
- [ ] 使用 filter() 时遵循查询规范
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## 🔗 相关资源
|
|
325
|
+
|
|
326
|
+
- [Pull 工作流](./pull-workflow.md) - api pull 详细流程
|
|
327
|
+
- [类型生成](./type-generation.md) - TypeScript 类型生成说明
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# 菜单管理指南
|
|
2
|
+
|
|
3
|
+
> **目标**:使用 `lovrabet menu sync` 和 `menu update` 管理应用菜单
|
|
4
|
+
|
|
5
|
+
## 🎯 为什么这个技能重要?
|
|
6
|
+
|
|
7
|
+
菜单是应用的导航结构,需要与平台保持同步:
|
|
8
|
+
- 新增页面后需要同步到平台
|
|
9
|
+
- 菜单图标需要更新到 CDN
|
|
10
|
+
- 菜单配置错误会导致页面无法访问
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 📋 两个命令
|
|
15
|
+
|
|
16
|
+
| 命令 | 作用 | 使用场景 |
|
|
17
|
+
|------|------|---------|
|
|
18
|
+
| `lovrabet menu sync` | 同步菜单到平台 | 新增/修改页面后 |
|
|
19
|
+
| `lovrabet menu update` | 更新菜单 CDN 资源 | 更新菜单图标后 |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 🚀 Menu Sync - 同步菜单
|
|
24
|
+
|
|
25
|
+
### 何时使用
|
|
26
|
+
|
|
27
|
+
- 创建了新页面
|
|
28
|
+
- 修改了页面路由
|
|
29
|
+
- 调整了菜单结构
|
|
30
|
+
- 修改了菜单权限配置
|
|
31
|
+
|
|
32
|
+
### 使用方法
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 基本用法
|
|
36
|
+
lovrabet menu sync
|
|
37
|
+
|
|
38
|
+
# 查看同步状态
|
|
39
|
+
lovrabet menu sync --dry-run
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 工作流程
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
1. 扫描本地页面结构
|
|
46
|
+
2. 分析路由配置
|
|
47
|
+
3. 生成菜单配置
|
|
48
|
+
4. 同步到 Lovrabet 平台
|
|
49
|
+
5. 确认同步结果
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 菜单配置示例
|
|
53
|
+
|
|
54
|
+
在页面文件中配置菜单:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// src/pages/dashboard/index.tsx
|
|
58
|
+
export default function Dashboard() {
|
|
59
|
+
return <div>仪表盘</div>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 菜单配置(通过文件注释或单独配置)
|
|
63
|
+
/**
|
|
64
|
+
* @menu
|
|
65
|
+
* {
|
|
66
|
+
* "title": "仪表盘",
|
|
67
|
+
* "icon": "DashboardOutlined",
|
|
68
|
+
* "path": "/dashboard",
|
|
69
|
+
* "order": 1
|
|
70
|
+
* }
|
|
71
|
+
*/
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
或者在 `.lovrabetrc` 中配置:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"appcode": "app-xxx",
|
|
79
|
+
"menus": [
|
|
80
|
+
{
|
|
81
|
+
"title": "仪表盘",
|
|
82
|
+
"path": "/dashboard",
|
|
83
|
+
"icon": "DashboardOutlined",
|
|
84
|
+
"order": 1
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"title": "用户管理",
|
|
88
|
+
"path": "/users",
|
|
89
|
+
"icon": "UserOutlined",
|
|
90
|
+
"order": 2
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 同步结果
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
$ lovrabet menu sync
|
|
100
|
+
|
|
101
|
+
正在扫描页面...
|
|
102
|
+
找到 5 个页面
|
|
103
|
+
|
|
104
|
+
正在同步菜单...
|
|
105
|
+
✓ 仪表盘 → /dashboard
|
|
106
|
+
✓ 用户管理 → /users
|
|
107
|
+
✓ 订单管理 → /orders
|
|
108
|
+
✓ 系统设置 → /settings
|
|
109
|
+
✓ 数据统计 → /statistics
|
|
110
|
+
|
|
111
|
+
菜单同步成功!
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 🔄 Menu Update - 更新 CDN 资源
|
|
117
|
+
|
|
118
|
+
### 何时使用
|
|
119
|
+
|
|
120
|
+
- 更新了菜单图标
|
|
121
|
+
- 修改了菜单样式
|
|
122
|
+
- 更新了静态资源
|
|
123
|
+
|
|
124
|
+
### 使用方法
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# 基本用法
|
|
128
|
+
lovrabet menu update
|
|
129
|
+
|
|
130
|
+
# 指定环境
|
|
131
|
+
lovrabet menu update --env daily
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 工作流程
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
1. 打包菜单相关静态资源
|
|
138
|
+
2. 上传到 CDN
|
|
139
|
+
3. 更新平台配置
|
|
140
|
+
4. 验证资源可访问
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 📝 完整示例
|
|
146
|
+
|
|
147
|
+
### 场景:添加新页面后同步菜单
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# 1. 创建新页面
|
|
151
|
+
lovrabet add page
|
|
152
|
+
|
|
153
|
+
# 输入页面信息:
|
|
154
|
+
# 页面名称: 产品管理
|
|
155
|
+
# 路由路径: /products
|
|
156
|
+
# 菜单图标: ShoppingOutlined
|
|
157
|
+
|
|
158
|
+
# 2. 同步菜单到平台
|
|
159
|
+
lovrabet menu sync
|
|
160
|
+
|
|
161
|
+
# 输出:
|
|
162
|
+
# 正在扫描页面...
|
|
163
|
+
# 找到 6 个页面
|
|
164
|
+
#
|
|
165
|
+
# 正在同步菜单...
|
|
166
|
+
# ✓ 仪表盘 → /dashboard
|
|
167
|
+
# ✓ 用户管理 → /users
|
|
168
|
+
# ✓ 订单管理 → /orders
|
|
169
|
+
# ✓ 产品管理 → /products [新增]
|
|
170
|
+
# ✓ 系统设置 → /settings
|
|
171
|
+
# ✓ 数据统计 → /statistics
|
|
172
|
+
#
|
|
173
|
+
# 菜单同步成功!
|
|
174
|
+
|
|
175
|
+
# 3. 如果有自定义菜单图标,更新 CDN
|
|
176
|
+
lovrabet menu update
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## ⚠️ 常见问题
|
|
182
|
+
|
|
183
|
+
### 问题 1:菜单同步后看不到新菜单
|
|
184
|
+
|
|
185
|
+
检查:
|
|
186
|
+
1. 是否已清除浏览器缓存
|
|
187
|
+
2. 是否需要重新登录
|
|
188
|
+
3. 菜单权限配置是否正确
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
# 清除缓存并重新登录
|
|
192
|
+
# 1. 退出登录
|
|
193
|
+
lovrabet logout
|
|
194
|
+
|
|
195
|
+
# 2. 重新登录
|
|
196
|
+
lovrabet auth
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 问题 2:菜单图标不显示
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# 更新 CDN 资源
|
|
203
|
+
lovrabet menu update
|
|
204
|
+
|
|
205
|
+
# 检查图标名称是否正确
|
|
206
|
+
# 使用 Ant Design 图标名称,如:
|
|
207
|
+
# - DashboardOutlined
|
|
208
|
+
# - UserOutlined
|
|
209
|
+
# - ShoppingOutlined
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 问题 3:菜单顺序不对
|
|
213
|
+
|
|
214
|
+
在 `.lovrabetrc` 中调整 `order` 字段:
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"menus": [
|
|
219
|
+
{ "title": "仪表盘", "order": 1 },
|
|
220
|
+
{ "title": "用户管理", "order": 2 },
|
|
221
|
+
{ "title": "产品管理", "order": 3 }
|
|
222
|
+
]
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
然后重新同步:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
lovrabet menu sync
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 📋 菜单配置规范
|
|
235
|
+
|
|
236
|
+
### 图标使用
|
|
237
|
+
|
|
238
|
+
使用 Ant Design 图标名称:
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
import {
|
|
242
|
+
DashboardOutlined,
|
|
243
|
+
UserOutlined,
|
|
244
|
+
ShoppingOutlined,
|
|
245
|
+
SettingOutlined,
|
|
246
|
+
FileTextOutlined,
|
|
247
|
+
BarChartOutlined,
|
|
248
|
+
} from '@ant-design/icons';
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
| 功能 | 推荐图标 |
|
|
252
|
+
|------|---------|
|
|
253
|
+
| 仪表盘 | DashboardOutlined |
|
|
254
|
+
| 用户管理 | UserOutlined |
|
|
255
|
+
| 订单/交易 | FileTextOutlined |
|
|
256
|
+
| 产品/商品 | ShoppingOutlined |
|
|
257
|
+
| 数据统计 | BarChartOutlined |
|
|
258
|
+
| 系统设置 | SettingOutlined |
|
|
259
|
+
|
|
260
|
+
### 路由规范
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
// ✅ 正确:使用小写和连字符
|
|
264
|
+
/products
|
|
265
|
+
/user-management
|
|
266
|
+
/order-list
|
|
267
|
+
|
|
268
|
+
// ❌ 错误:使用驼峰或大写
|
|
269
|
+
/Products
|
|
270
|
+
/userManagement
|
|
271
|
+
/OrderList
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 标题规范
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
// ✅ 正确:简洁明了
|
|
278
|
+
"仪表盘"
|
|
279
|
+
"用户管理"
|
|
280
|
+
"订单列表"
|
|
281
|
+
|
|
282
|
+
// ❌ 错误:冗余或过于简单
|
|
283
|
+
"系统仪表盘页面"
|
|
284
|
+
"用户"
|
|
285
|
+
"订单"
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## ✅ 自检清单
|
|
291
|
+
|
|
292
|
+
菜单同步前,确认:
|
|
293
|
+
|
|
294
|
+
- [ ] 页面路由已正确配置
|
|
295
|
+
- [ ] 菜单标题简洁明了
|
|
296
|
+
- [ ] 使用了正确的 Ant Design 图标名称
|
|
297
|
+
- [ ] 菜单顺序(order)已设置
|
|
298
|
+
- [ ] 权限配置正确(如需要)
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 🔗 相关资源
|
|
303
|
+
|
|
304
|
+
- [Sync 工作流](./sync-workflow.md) - menu sync 详细流程
|
|
305
|
+
- [Update 工作流](./update-workflow.md) - menu update 详细流程
|