@lovrabet/cli 1.2.3 → 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.
Files changed (89) hide show
  1. package/README.md +33 -17
  2. package/lib/add-page/input-page-router.js +1 -1
  3. package/lib/add-page/main.js +1 -1
  4. package/lib/add-page/select-page-template.js +1 -1
  5. package/lib/api/api-doc-ui.js +1 -1
  6. package/lib/api/api-doc.js +1 -1
  7. package/lib/api/api-pull-ui.js +1 -1
  8. package/lib/api/fetch-model-list.js +1 -1
  9. package/lib/api/generate-api-file.js +1 -1
  10. package/lib/api/main.js +1 -1
  11. package/lib/api/pull-silent.js +1 -1
  12. package/lib/app-menu/app-menu-sync-ui.js +1 -1
  13. package/lib/app-menu/create-menu.js +1 -1
  14. package/lib/app-menu/get-local-pages.js +1 -1
  15. package/lib/app-menu/get-online-menu-list.js +1 -1
  16. package/lib/app-menu/use-get-online-menu-list.js +1 -1
  17. package/lib/app-menu/utils.js +1 -1
  18. package/lib/app-menu/valid-url.js +1 -1
  19. package/lib/app-menu-update-cdn/current-content.js +1 -1
  20. package/lib/app-menu-update-cdn/input-cdn-asset.js +1 -1
  21. package/lib/app-menu-update-cdn/main.js +1 -1
  22. package/lib/app-menu-update-cdn/update-menu-cdn-url.js +1 -1
  23. package/lib/auth/auth-server-ui.js +1 -1
  24. package/lib/auth/auth-server.js +1 -1
  25. package/lib/auth/constant.js +1 -1
  26. package/lib/auth/get-cookie.js +1 -1
  27. package/lib/auth/is-session-valid.js +1 -1
  28. package/lib/auth/logout.js +1 -1
  29. package/lib/cli.js +1 -1
  30. package/lib/cmd/build-watch.js +1 -1
  31. package/lib/cmd/build.js +1 -1
  32. package/lib/cmd/logs.js +1 -1
  33. package/lib/cmd/preview.js +1 -1
  34. package/lib/cmd/start.js +1 -1
  35. package/lib/config/config-help.js +1 -1
  36. package/lib/config/main.js +1 -1
  37. package/lib/constant/domain.js +1 -1
  38. package/lib/constant/env.js +1 -1
  39. package/lib/create-app/enhanced-guided-create.js +1 -1
  40. package/lib/create-app/format-elapsed.js +1 -1
  41. package/lib/create-app/main.js +1 -1
  42. package/lib/create-app/task-finished.js +1 -1
  43. package/lib/create-app/task-loading.js +1 -1
  44. package/lib/create-app/task-running.js +1 -1
  45. package/lib/create-app/task-time.js +1 -1
  46. package/lib/create-app/use-copy-project-template.js +1 -1
  47. package/lib/create-app/use-format-code.js +1 -1
  48. package/lib/create-app/use-install-dependencies.js +1 -1
  49. package/lib/help.js +1 -1
  50. package/lib/init/main.js +1 -1
  51. package/lib/mcp/claude.js +1 -0
  52. package/lib/mcp/cursor.js +1 -1
  53. package/lib/mcp/main.js +1 -1
  54. package/lib/skills/main.js +1 -0
  55. package/lib/utils/check-sdk-version.js +1 -1
  56. package/lib/utils/config.js +1 -1
  57. package/lib/utils/copy-directory.js +1 -1
  58. package/lib/utils/http-client.js +1 -1
  59. package/lib/utils/logger.js +1 -1
  60. package/lib/utils/router-updater.js +1 -1
  61. package/lib/utils/sleep.js +1 -1
  62. package/lib/utils/template-replacer.js +1 -1
  63. package/package.json +1 -1
  64. package/templates/projects/sub-app-react-demo/index.html +22 -34
  65. package/templates/projects/sub-app-react-demo/public/logo.svg +1 -0
  66. package/templates/projects/sub-app-react-demo/src/api/api.ts +1 -1
  67. package/templates/projects/sub-app-react-demo/src/api/client.ts +1 -1
  68. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +44 -71
  69. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +387 -927
  70. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +1 -1
  71. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +293 -0
  72. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +100 -414
  73. package/templates/projects/sub-app-react-demo/src/style.css +21 -15
  74. package/templates/projects/sub-app-react-demo/vite.config.ts +18 -13
  75. package/templates/rules/lovrabet_rules.mdc.tpl +636 -43
  76. package/templates/skills/.claude/skills/lovrabet/SKILL.md +257 -0
  77. package/templates/skills/.cursor/commands/lovrabet.md +247 -0
  78. package/templates/skills/.cursorrules +109 -0
  79. package/templates/skills/.shared/README.md +45 -0
  80. package/templates/skills/.shared/guides/01-filter-query/guide.md +300 -0
  81. package/templates/skills/.shared/guides/02-mcp-sql-workflow/guide.md +272 -0
  82. package/templates/skills/.shared/guides/03-antd-style/guide.md +227 -0
  83. package/templates/skills/.shared/guides/04-troubleshooting/guide.md +426 -0
  84. package/templates/skills/.shared/guides/05-api-integration/guide.md +327 -0
  85. package/templates/skills/.shared/guides/06-menu-management/guide.md +305 -0
  86. package/templates/skills/.windsurf/workflows/lovrabet.md +256 -0
  87. package/templates/projects/sub-app-react-demo/.vscode/extensions.json +0 -3
  88. package/templates/projects/sub-app-react-demo/.vscode/settings.json +0 -57
  89. 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 详细流程