@lovrabet/rabetbase-cli 2.2.4 → 2.2.5-beta.2

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 (240) hide show
  1. package/README.md +1 -1
  2. package/lib/api/api-doc.js +1 -1
  3. package/lib/api/fetch-model-list.js +1 -1
  4. package/lib/api/generate-api-file.js +1 -1
  5. package/lib/auth/auth-server-ui.js +1 -1
  6. package/lib/auth/auth-server.js +1 -1
  7. package/lib/auth/constant.js +1 -1
  8. package/lib/auth/get-cookie.js +1 -1
  9. package/lib/auth/get-session-user.js +1 -1
  10. package/lib/auth/is-session-valid.js +1 -1
  11. package/lib/auth/login-success-html.js +1 -1
  12. package/lib/auth/logout.js +1 -1
  13. package/lib/cli-flags.js +1 -1
  14. package/lib/cli.js +1 -1
  15. package/lib/commands/api/generate.js +1 -1
  16. package/lib/commands/api/index.js +1 -1
  17. package/lib/commands/api/list.js +1 -1
  18. package/lib/commands/api/pull.js +1 -1
  19. package/lib/commands/api/shared.js +1 -1
  20. package/lib/commands/app/add.js +1 -1
  21. package/lib/commands/app/discover.js +1 -1
  22. package/lib/commands/app/index.js +1 -1
  23. package/lib/commands/app/list.js +1 -1
  24. package/lib/commands/app/remove.js +1 -1
  25. package/lib/commands/app/shared.js +1 -1
  26. package/lib/commands/app/use.js +1 -1
  27. package/lib/commands/app-config/delete.js +1 -0
  28. package/lib/commands/app-config/get.js +1 -0
  29. package/lib/commands/app-config/index.js +1 -0
  30. package/lib/commands/app-config/list.js +1 -0
  31. package/lib/commands/app-config/set.js +1 -0
  32. package/lib/commands/app-config/shared.js +1 -0
  33. package/lib/commands/auth/index.js +1 -1
  34. package/lib/commands/bff/create.js +1 -1
  35. package/lib/commands/bff/delete.js +1 -1
  36. package/lib/commands/bff/detail.js +1 -1
  37. package/lib/commands/bff/index.js +1 -1
  38. package/lib/commands/bff/list.js +1 -1
  39. package/lib/commands/bff/pull.js +1 -1
  40. package/lib/commands/bff/push.js +1 -1
  41. package/lib/commands/bff/status.js +1 -1
  42. package/lib/commands/cli-update.js +1 -1
  43. package/lib/commands/codegen/index.js +1 -1
  44. package/lib/commands/codegen/sdk.js +1 -1
  45. package/lib/commands/codegen/sql.js +1 -1
  46. package/lib/commands/common/app-selector.js +1 -1
  47. package/lib/commands/common/flags.js +1 -1
  48. package/lib/commands/common/validate.js +1 -1
  49. package/lib/commands/config/get.js +1 -1
  50. package/lib/commands/config/index.js +1 -1
  51. package/lib/commands/config/list.js +1 -1
  52. package/lib/commands/config/set.js +1 -1
  53. package/lib/commands/config/shared.js +1 -1
  54. package/lib/commands/data/filter.js +1 -1
  55. package/lib/commands/data/getOne.js +1 -1
  56. package/lib/commands/data/index.js +1 -1
  57. package/lib/commands/data/shared.js +1 -1
  58. package/lib/commands/dataset/business-group-update.js +1 -0
  59. package/lib/commands/dataset/capability.js +1 -1
  60. package/lib/commands/dataset/delete.js +1 -1
  61. package/lib/commands/dataset/detail.js +1 -1
  62. package/lib/commands/dataset/extend-update.js +1 -1
  63. package/lib/commands/dataset/field-update.js +1 -1
  64. package/lib/commands/dataset/index.js +1 -1
  65. package/lib/commands/dataset/list.js +1 -1
  66. package/lib/commands/dataset/operations.js +1 -1
  67. package/lib/commands/dataset/relation-create.js +1 -1
  68. package/lib/commands/dataset/relation-delete.js +1 -1
  69. package/lib/commands/dataset/relation-shared.js +1 -1
  70. package/lib/commands/dataset/relation-update.js +1 -1
  71. package/lib/commands/dataset/relations.js +1 -1
  72. package/lib/commands/dataset/rename.js +1 -1
  73. package/lib/commands/dataset/restore.js +1 -0
  74. package/lib/commands/db/analyze-cancel.js +1 -1
  75. package/lib/commands/db/analyze-start.js +1 -1
  76. package/lib/commands/db/analyze-status.js +1 -1
  77. package/lib/commands/db/create.js +1 -1
  78. package/lib/commands/db/delete.js +1 -1
  79. package/lib/commands/db/detail.js +1 -1
  80. package/lib/commands/db/diff.js +1 -1
  81. package/lib/commands/db/index.js +1 -1
  82. package/lib/commands/db/list.js +1 -1
  83. package/lib/commands/db/shared.js +1 -1
  84. package/lib/commands/db/tables.js +1 -1
  85. package/lib/commands/db/test.js +1 -1
  86. package/lib/commands/db/update.js +1 -1
  87. package/lib/commands/doctor.js +1 -1
  88. package/lib/commands/init/index.js +1 -1
  89. package/lib/commands/issue/index.js +1 -1
  90. package/lib/commands/issue/nudge.js +1 -1
  91. package/lib/commands/issue/report.js +1 -1
  92. package/lib/commands/issue/shared.js +1 -1
  93. package/lib/commands/logs/index.js +1 -1
  94. package/lib/commands/menu/index.js +1 -1
  95. package/lib/commands/menu/list.js +1 -1
  96. package/lib/commands/menu/shared/compare-table.js +1 -1
  97. package/lib/commands/menu/shared/index.js +1 -1
  98. package/lib/commands/menu/shared/inquirer.js +1 -1
  99. package/lib/commands/menu/shared/local-pages.js +1 -1
  100. package/lib/commands/menu/shared/logic.js +1 -1
  101. package/lib/commands/menu/shared/service.js +1 -1
  102. package/lib/commands/menu/shared/sync-core.js +1 -1
  103. package/lib/commands/menu/shared/update-core.js +1 -1
  104. package/lib/commands/menu/shared/valid-url.js +1 -1
  105. package/lib/commands/menu/sync.js +1 -1
  106. package/lib/commands/menu/update.js +1 -1
  107. package/lib/commands/page/generate-start.js +1 -1
  108. package/lib/commands/page/generate-status.js +1 -1
  109. package/lib/commands/page/index.js +1 -1
  110. package/lib/commands/page/pull.js +1 -1
  111. package/lib/commands/page/push.js +1 -1
  112. package/lib/commands/page/relation-audit.js +1 -1
  113. package/lib/commands/page/shared.js +1 -1
  114. package/lib/commands/page/standard-page-status.js +1 -1
  115. package/lib/commands/page/sync.js +1 -1
  116. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  117. package/lib/commands/project/create/format-elapsed.js +1 -1
  118. package/lib/commands/project/create/main.js +1 -1
  119. package/lib/commands/project/create/non-interactive.js +1 -1
  120. package/lib/commands/project/create/project-template-path.js +1 -1
  121. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  122. package/lib/commands/project/create/use-format-code.js +1 -1
  123. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  124. package/lib/commands/project/index.js +1 -1
  125. package/lib/commands/project/init.js +1 -1
  126. package/lib/commands/project/upgrade.js +1 -1
  127. package/lib/commands/registry.js +1 -1
  128. package/lib/commands/run/index.js +1 -1
  129. package/lib/commands/schema.js +1 -1
  130. package/lib/commands/skill/index.js +1 -1
  131. package/lib/commands/sql/create.js +1 -1
  132. package/lib/commands/sql/delete.js +1 -1
  133. package/lib/commands/sql/detail.js +1 -1
  134. package/lib/commands/sql/exec.js +1 -1
  135. package/lib/commands/sql/index.js +1 -1
  136. package/lib/commands/sql/list.js +1 -1
  137. package/lib/commands/sql/pull.js +1 -1
  138. package/lib/commands/sql/push.js +1 -1
  139. package/lib/commands/sql/save.js +1 -1
  140. package/lib/commands/sql/shared.js +1 -1
  141. package/lib/commands/sql/status.js +1 -1
  142. package/lib/commands/sql/validate.js +1 -1
  143. package/lib/commands/workspace/index.js +1 -1
  144. package/lib/config/schema.js +1 -1
  145. package/lib/constant/cdn.js +1 -1
  146. package/lib/constant/cli.js +1 -1
  147. package/lib/constant/defaults.js +1 -1
  148. package/lib/constant/domain.js +1 -1
  149. package/lib/constant/env.js +1 -1
  150. package/lib/constant/output.js +1 -1
  151. package/lib/constant/paths.js +1 -1
  152. package/lib/constant/risk.js +1 -1
  153. package/lib/context/app-resolver.js +1 -1
  154. package/lib/context/auth-resolver.js +1 -1
  155. package/lib/context/config-loader.js +1 -1
  156. package/lib/context.js +1 -1
  157. package/lib/core/alias-resolver.js +1 -1
  158. package/lib/core/api-client.js +1 -1
  159. package/lib/core/bff/config.js +1 -1
  160. package/lib/core/bff/file-system.js +1 -1
  161. package/lib/core/bff/hash.js +1 -1
  162. package/lib/core/bff/lock.js +1 -1
  163. package/lib/core/bff/utils.js +1 -1
  164. package/lib/core/db-resolver.js +1 -1
  165. package/lib/core/page/file-system.js +1 -1
  166. package/lib/core/page/hash.js +1 -1
  167. package/lib/core/page/lock.js +1 -1
  168. package/lib/core/sql-sync/config.js +1 -1
  169. package/lib/core/sql-sync/file-system.js +1 -1
  170. package/lib/core/sql-sync/hash.js +1 -1
  171. package/lib/core/sql-sync/lock.js +1 -1
  172. package/lib/core/sql-sync/utils.js +1 -1
  173. package/lib/core/sql-validator.js +1 -1
  174. package/lib/errors.js +1 -1
  175. package/lib/framework/build-all-flags.js +1 -1
  176. package/lib/framework/flags.js +1 -1
  177. package/lib/framework/help.js +1 -1
  178. package/lib/framework/index.js +1 -1
  179. package/lib/framework/output.js +1 -1
  180. package/lib/framework/response.js +1 -1
  181. package/lib/framework/runner-alias.js +1 -1
  182. package/lib/framework/runner.js +1 -1
  183. package/lib/framework/schema-export.js +1 -1
  184. package/lib/framework/types.js +1 -1
  185. package/lib/generated/build-info.js +1 -1
  186. package/lib/help.js +1 -1
  187. package/lib/skills/main.js +1 -1
  188. package/lib/skills/npx-skills-add.js +1 -1
  189. package/lib/telemetry/cli-command-trace.js +1 -1
  190. package/lib/telemetry/cli-help-trace.js +1 -1
  191. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  192. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  193. package/lib/telemetry/send-cli-trace-log.js +1 -1
  194. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  195. package/lib/utils/ai_config.js +1 -1
  196. package/lib/utils/apply-jq-filter.js +1 -1
  197. package/lib/utils/cdn-config.js +1 -1
  198. package/lib/utils/check-sdk-version.js +1 -1
  199. package/lib/utils/cli-version-check.js +1 -1
  200. package/lib/utils/cli-version-policy.js +1 -1
  201. package/lib/utils/config.js +1 -1
  202. package/lib/utils/copy-directory.js +1 -1
  203. package/lib/utils/entity-with-id.js +1 -1
  204. package/lib/utils/file-utils.js +1 -1
  205. package/lib/utils/guides-cdn.js +1 -1
  206. package/lib/utils/http-client.js +1 -1
  207. package/lib/utils/is-non-interactive.js +1 -1
  208. package/lib/utils/logger.js +1 -1
  209. package/lib/utils/params.js +1 -1
  210. package/lib/utils/platform.js +1 -1
  211. package/lib/utils/rules-cdn.js +1 -1
  212. package/lib/utils/sleep.js +1 -1
  213. package/lib/utils/template-replacer.js +1 -1
  214. package/lib/utils/update-notice.js +1 -1
  215. package/lib/utils/version.js +1 -1
  216. package/lib/utils/with-active-cookie.js +1 -1
  217. package/lib/utils/write-cli-side-channel.js +1 -1
  218. package/package.json +1 -1
  219. package/templates/README.md +15 -25
  220. package/templates/generate-api/api.ts.tpl +2 -2
  221. package/templates/generate-api/client.ts.tpl +2 -2
  222. package/templates/projects/sub-app-react-demo/CHANGELOG.md +15 -1
  223. package/templates/projects/sub-app-react-demo/README.md +159 -231
  224. package/templates/projects/sub-app-react-demo/docs/quick-start.md +145 -426
  225. package/templates/projects/sub-app-react-demo/src/api/api.ts +8 -65
  226. package/templates/projects/sub-app-react-demo/src/api/client.ts +10 -42
  227. package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.module.css +28 -0
  228. package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.tsx +55 -0
  229. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +6 -9
  230. package/templates/projects/sub-app-react-demo/src/main.tsx +10 -6
  231. package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +3 -5
  232. package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +153 -148
  233. package/templates/projects/sub-app-react-demo/src/pages/index.module.css +500 -0
  234. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +517 -343
  235. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +325 -242
  236. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +8 -6
  237. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +174 -87
  238. package/templates/projects/sub-app-react-demo/src/style.css +19 -3
  239. package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +1 -1
  240. package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +0 -212
@@ -1,526 +1,245 @@
1
- # Lovrabet子应用接入指南 - React 18 + Vite 实操版
1
+ # Rabetbase React 子应用快速开始
2
2
 
3
- > 🎯 **目标**:通过实际操作完成React项目接入Lovrabet平台
4
- > 📦 **官方代码**:https://github.com/lovrabet-ai/sub-app-react-demo
5
- > ⏱️ **预计时间**:20min可以走通从本地开发到线上部署的完成流程,看到自定义页面在平台中的渲染效果
3
+ 本文面向通过 `rabetbase project create` 初始化出来的 React 微前端项目,也适用于直接克隆本模板源码进行本地调试。
6
4
 
7
- ---
5
+ 目标是在 20 分钟内完成:
8
6
 
9
- ## 🚀 场景一:Hello World 实操(10min)
7
+ 1. 启动本地开发环境;
8
+ 2. 确认当前模板内置页面;
9
+ 3. 拉取 Lovrabet SDK 模型配置;
10
+ 4. 构建产物并接入 Lovrabet 主应用;
11
+ 5. 理解如何继续二次开发。
10
12
 
11
- **目标**:下载官方代码,本地运行验证,构建部署,集成到主应用
13
+ ## 1. 环境准备
12
14
 
13
- ### Step 1: 下载GitHub仓库
15
+ 请先确认本机具备:
14
16
 
15
- ```bash
16
- # 推荐使用SSH(需要配置GitHub SSH密钥)
17
- git clone git@github.com:lovrabet-ai/sub-app-react-demo.git
18
-
19
- # 或使用HTTPS(适合快速体验)
20
- # git clone https://github.com/lovrabet-ai/sub-app-react-demo.git
17
+ - Node.js 20+
18
+ - `rabetbase` CLI
19
+ - 需要访问真实数据时,已完成 `rabetbase auth login`
21
20
 
22
- cd sub-app-react-demo
23
- git checkout main
21
+ ```bash
22
+ npm install -g @lovrabet/rabetbase-cli
23
+ rabetbase --help
24
24
  ```
25
25
 
26
- ### Step 2: 本地安装和运行
26
+ 如果需要拉取 API 配置:
27
27
 
28
28
  ```bash
29
- # 安装依赖
30
- npm i
31
-
32
- # 本地运行查看效果
33
- npm start
29
+ rabetbase auth login
34
30
  ```
35
31
 
36
- **本地验证**:
32
+ ## 2. 创建或打开项目
37
33
 
38
- - 浏览器打开 https://dev.lovrabet.com:5173/hello-world
39
- - 确认Hello World页面正常显示
40
- - 检查控制台无报错信息
41
-
42
- ![本地终端运行](https://i.yuntooai.com/u/AZjq66VncACe2C_z8m9_Qg.png)
43
-
44
- ### Step 3: 构建产物
34
+ ### 方式 A:通过 CLI 创建新项目
45
35
 
46
36
  ```bash
47
- # 构建微前端产物
48
- npm run build
37
+ rabetbase project create my-sub-app --appcode app-xxxx
38
+ cd my-sub-app
49
39
  ```
50
40
 
51
- **构建验证**:
52
-
53
- - 检查 `dist/` 目录生成
54
- - 确认存在 `dist/assets/main.js` 文件(ES modules格式)
55
- - 确认存在 `dist/assets/main.css` 样式文件
56
-
57
- 本地构建成功
58
- ![本地构建产物](https://i.yuntooai.com/u/AZjq8hJFcACYdK1TnupxaA.png)
41
+ 说明:
59
42
 
60
- 本地构建后生成的产物
61
- ![本地构建后生成的产物](https://i.yuntooai.com/u/AZjrffaucACvb0HJGELOAQ.png)
43
+ - `--appcode` 可省略;省略后在创建好的项目目录内执行 `rabetbase config set appcode app-xxxx`。
44
+ - 有 AppCode 时,CLI 会尝试自动拉取 `src/api/api.ts`。
45
+ - 如果自动拉取失败,后续手动执行 `rabetbase api pull` 即可。
62
46
 
63
- ### Step 4: 上传构建产物到CDN
64
-
65
- #### 选项A:使用业务方已有CDN
47
+ ### 方式 B:直接调试模板源码
66
48
 
67
49
  ```bash
68
- # 将 dist/ 目录内容上传到您的CDN
69
- # 例如:https://your-cdn.com/sub-app-react-demo/
50
+ cd sub-app-react-demo
51
+ npm install
70
52
  ```
71
53
 
72
- #### 选项B:使用Lovrabet临时CDN服务
54
+ ## 3. 本地启动
73
55
 
74
56
  ```bash
75
- # 联系Lovrabet的技术支持 @风月 获取临时CDN上传地址,仅用于功能体验,3天后CDN链接会失效
57
+ rabetbase run start
76
58
  ```
77
59
 
78
- **CDN验证**:
79
-
80
- - 确认JS文件可访问:
81
- - 🔧 **您的CDN格式**:`https://your-cdn.com/sub-app-react-demo/dist/assets/main.js`
82
- - 📌 **演示环境示例**:`https://g.yuntooai.com/dist/sub-app-react-demo/202508271755/main.js`
83
- - 确认CSS文件可访问:
84
- - 🔧 **您的CDN格式**:`https://your-cdn.com/sub-app-react-demo/dist/assets/main.css`
85
- - 📌 **演示环境示例**:`https://g.yuntooai.com/dist/sub-app-react-demo/202508271755/main.css`
86
-
87
- > 💡 **说明**:`your-cdn.com` 需替换为您实际的CDN域名
88
-
89
- ### Step 5: 到Lovrabet主应用中集成Hello World页面
90
-
91
- 在Lovrabet平台配置页面:
60
+ 默认访问地址:
92
61
 
93
62
  ```text
94
- 页面配置:
95
- ├── 页面名称: Hello World Demo # 🔧 可自定义:菜单中显示的名称
96
- ├── 路由路径: /hello-world # ⚠️ 必须与 src/router/index.tsx 中的 path 保持一致
97
- ├── 微应用唯一标识: react-hello-world # 🔧 可自定义:用于区分不同微应用
98
- ├── 资源加载方式: import # ⚡ 固定值:Vite项目必须选择import
99
- └── 资源加载列表: # 🔧 替换为您的CDN地址
100
- ├── https://your-cdn.com/sub-app-react-demo/dist/assets/main.js
101
- └── https://your-cdn.com/sub-app-react-demo/dist/assets/main.css
63
+ https://dev.lovrabet.com:5173
102
64
  ```
103
65
 
104
- > ⚠️ **重要提示**:路由路径必须与代码中定义的路径完全对应,否则页面无法正确加载
105
-
106
- **集成验证**:
107
-
108
- - 主应用菜单出现"Hello World Demo"
109
- - 点击菜单能正常显示页面
110
- - 页面功能与本地运行效果一致
111
-
112
- #### 5.1 新增页面
113
-
114
- 访问菜单配置链接:https://app.lovrabet.com/app/app-f4c03acb/pages/
115
- ![](https://i.yuntooai.com/u/AZjrKSOvcACyPcNb4irCUA.png)
116
-
117
- #### 5.2 配置路由
118
-
119
- ![hello-world页面集成到主应用中](https://i.yuntooai.com/u/AZjq-EX5cACZF-TKk4EvTw.png)
120
-
121
- ### step 6:验证页面运行效果
122
-
123
- **✅ 场景一完成标志**:主应用中能正常访问Hello World页面
124
-
125
- https://app-f4c03acb.app.lovrabet.com/hello-world
126
- helloworld运行时页面: https://app-f4c03acb.app.lovrabet.com/hello-world
127
- ![helloworld运行时页面](https://i.yuntooai.com/u/AZjq_pSDcACOdA8Me_CFFQ.png)
128
-
129
- ---
130
-
131
- ## 📊 场景二:真实API数据请求与图表展示(10min)
132
-
133
- **目标**:体验调用真实业务接口、处理跨域请求、展示动态图表的完整功能
134
-
135
- ### Step 1: 更新图表页面代码
66
+ 如需切换端口:
136
67
 
137
68
  ```bash
138
- # 项目已包含 ChartFetch.tsx 页面
139
- # 使用真实 API:https://runtime.lovrabet.com/dbapi/runtime/yuntoo/app-f4c03acb/6c6c94a6ef064fe898cfa895fe5a38f5/getList
140
-
141
- cat src/pages/ChartFetch.tsx
69
+ PORT=3000 rabetbase run start
142
70
  ```
143
71
 
144
- [https://github.com/lovrabet-ai/sub-app-react-demo/blob/26f5dd3981ed5ad955dc3949501e308678438fb7/src/pages/ChartFetch.tsx#L33](https://github.com/lovrabet-ai/sub-app-react-demo/blob/26f5dd3981ed5ad955dc3949501e308678438fb7/src/pages/ChartFetch.tsx#L33)
72
+ 当前模板内置页面如下:
145
73
 
146
- 注意:
74
+ | 页面 | 路由 | 说明 |
75
+ | -------- | -------------- | ---------------------------------------------------- |
76
+ | 首页 | `/` | Prompt 开发入口、项目状态、Agent 场景示例和飞书文库导航 |
77
+ | SDK 演示 | `/sdk-demo` | 展示模型列表、查询、新增、更新、删除等 SDK 调用方式 |
78
+ | 工作台 | `/workbench` | 常见工作台页面示例 |
79
+ | 数据看板 | `/dashboard` | 指标和图表展示示例 |
80
+ | 数据大屏 | `/data-screen` | 全屏数据展示示例 |
147
81
 
148
- - API地址的结构说明:https://runtime.lovrabet.com/${type}/runtime/${tenentCode}/${appCode}/${datasetCode}/getList
149
- - 请将接口地址换成业务有权限的接口地址,就能运行看到自己负责业务的接口数据了,有权限的api地址请查看 https://app.lovrabet.com/app/${appCode}/admin/dataset,直接复制接口链接就能通过浏览器console控制验证接口请求的调用是否成功;
82
+ > 旧文档中提到的 `/hello-world`、`/chart-fetch`、`/intro` 已不是当前模板页面。请以 `src/pages` 目录为准。
150
83
 
151
- ### Step 2: 本地运行验证
84
+ 日常开发时,推荐在 Claude Code、Cursor、Codex 等 Agent 环境中直接描述目标,例如:
152
85
 
153
- ```bash
154
- # 项目已安装echarts依赖
155
- npm start
86
+ ```text
87
+ 请基于当前 Lovrabet 数据模型新增一个客户跟进工作台页面。
88
+ 页面需要包含筛选区、列表、详情抽屉和新增表单。
89
+ 数据读写请使用项目里的 @lovrabet/sdk 客户端。
156
90
  ```
157
91
 
158
- **本地验证**:
92
+ Agent 会根据项目中的 `rabetbase` 能力完成模型同步、页面开发、构建检查和主应用接入建议。
159
93
 
160
- - 浏览器访问 https://dev.lovrabet.com:5173/chart-fetch
161
- - 确认饼图显示客户状态分布(活跃、正常、流失)
94
+ ## 4. 拉取 SDK 模型配置
162
95
 
163
- ### Step 3: 构建更新的产物
96
+ 如果项目是通过 `rabetbase project create` 创建的,且 `src/api/api.ts` 还不是你的应用配置,执行:
164
97
 
165
98
  ```bash
166
- # 重新构建包含图表功能的版本
167
- npm run build
99
+ rabetbase config set appcode app-xxxx
100
+ rabetbase api pull
168
101
  ```
169
102
 
170
- **构建验证**:
171
-
172
- - `dist/assets/main.js` 包含echarts
173
- - `dist/assets/main.css` 样式文件更新
174
- - 注意:React、Ant Design已外部化,体积较小
175
-
176
- ### Step 4: 重新上传到CDN
103
+ 如果你是直接克隆模板源码,且当前目录还没有 `.rabetbase.json`,执行:
177
104
 
178
105
  ```bash
179
- # 将更新后的 dist/ 内容重新上传
180
- # 覆盖之前的文件或使用新的路径
181
- ```
182
-
183
- ### Step 5: 到Lovrabet主应用中集成ChartFetch页面
184
-
185
- **页面2:数据图表入口**
186
-
187
- ```text
188
- 页面配置:
189
- ├── 页面名称: 数据图表 # 🔧 可自定义:菜单中显示的名称
190
- ├── 路由路径: /chart-fetch # ⚠️ 必须与 src/router/index.tsx 中的 path 保持一致
191
- ├── 资源加载方式: import # ⚡ 固定值:Vite项目必须选择import
192
- └── 资源加载列表: # 🔧 替换为您的CDN地址(与Hello World共享同一构建产物)
193
- ├── https://your-cdn.com/sub-app-react-demo/dist/assets/main.js
194
- └── https://your-cdn.com/sub-app-react-demo/dist/assets/main.css
106
+ rabetbase project init --appcode app-xxxx
107
+ rabetbase api pull
195
108
  ```
196
109
 
197
- #### 5.1 配置
198
-
199
- 访问链接:https://app.lovrabet.com/app/app-f4c03acb/preview
200
- ![chart-fetch页面集成到主应用中](https://i.yuntooai.com/u/AZjq9nKvcACEawJpHIM4Gg.png)
110
+ 拉取后重点检查:
201
111
 
202
- **集成验证**:
112
+ - `src/api/api.ts` 中的 AppCode 是否正确;
113
+ - `models` 是否包含你需要的数据模型;
114
+ - 每个模型的 `alias` 是否符合代码中的调用方式。
203
115
 
204
- - 主应用此时又多了一个菜单项,总计出现了2个菜单
205
- - "Hello World"菜单 → 显示Hello World页面
206
- - "数据图表"菜单 → 显示图表页面,数据正常加载
116
+ 业务页面中统一从 `src/api/client.ts` 引入客户端:
207
117
 
208
- **✅ 场景二完成标志**:两个菜单都能正常工作,图表数据正常显示
209
-
210
- ![](https://i.yuntooai.com/u/AZjrAvi8cACGVAKkuXXkkQ.png)
211
-
212
- ---
118
+ ```typescript
119
+ import { lovrabetClient } from "@/api/client";
213
120
 
214
- ## 🔧 场景三:改造已有项目(20min)
121
+ const models = lovrabetClient.getModelList();
215
122
 
216
- **目标**:将您现有的React项目改造为微前端,直接请求真实的业务接口,实现无缝集成到Lovrabet平台
123
+ const result = await lovrabetClient.models.requirements.filter({
124
+ currentPage: 1,
125
+ pageSize: 20,
126
+ });
127
+ ```
217
128
 
218
- ### 改造已有项目流程
129
+ 实际模型名以 `src/api/api.ts` 生成结果为准。
219
130
 
220
- 1. **分析现有项目** → 确定改造范围和接口依赖
221
- 2. **修改入口文件** → 添加微前端生命周期函数
222
- 3. **配置构建工具** → 修改vite.config.js支持ES modules
223
- 4. **封装API调用** → 统一请求方式,直接调用真实接口
224
- 5. **本地开发测试** → 验证功能完整性
225
- 6. **构建部署** → 生成ES modules格式产物
226
- 7. **平台配置** → 配置多个页面入口
227
- 8. **生产验证** → 确保集成效果符合预期
131
+ ## 5. 新增页面
228
132
 
229
- ### 官方配置参数详解
133
+ 模板使用 `vite-plugin-pages`,无需手写路由表。
230
134
 
231
- 根据Lovrabet官方文档,配置页面时需要理解以下关键参数:
135
+ ```text
136
+ src/pages/customer/index.tsx -> /customer
137
+ src/pages/customer/[id].tsx -> /customer/:id
138
+ src/pages/report/month.tsx -> /report/month
139
+ ```
232
140
 
233
- #### 1. 路由路径 (path)
141
+ 新增页面后:
234
142
 
235
- ```text
236
- 说明:应用实际访问时链接URL中的path部分
237
- 格式:https://${appcode}.app.lovrabet.com/${pagePath}
143
+ 1. 本地访问对应路由确认渲染正常;
144
+ 2. 如果独立运行时需要左侧菜单入口,修改 `src/layouts/MainLayout.tsx`;
145
+ 3. 如果要在 Lovrabet 主应用中挂菜单,发布后在页面配置里使用同一个路由路径。
238
146
 
239
- ⚠️ 重要:路由路径必须与 src/router/index.tsx 中定义的路径完全一致
147
+ ## 6. 构建产物
240
148
 
241
- 示例对应关系:
149
+ ```bash
150
+ rabetbase run build
242
151
  ```
243
152
 
244
- ```typescript
245
- // src/router/index.tsx 中的配置
246
- {
247
- path: "hello-world", // <- 这里定义的路径
248
- element: <HelloWorld />,
249
- }
250
-
251
- // 平台配置中的路由路径
252
- 路由路径: /hello-world // <- 必须保持一致(加上/前缀)
253
- ```
153
+ 默认产物:
254
154
 
255
155
  ```text
256
- 实际访问链接示例:
257
- - 配置"/hello-world" → https://app-f4c03acb.app.lovrabet.com/hello-world
258
- - 配置"/chart-fetch" → https://app-f4c03acb.app.lovrabet.com/chart-fetch
156
+ dist/assets/main.js
157
+ dist/assets/main.css
158
+ ```
259
159
 
260
- 其中:
261
- - 🔧 appcode: 您的应用编码(创建应用时生成,如:app-f4c03acb)
262
- - ⚠️ pagePath: 必须与代码中的路由配置一致
160
+ 如果你希望产物带版本目录并自动生成 CDN base:
263
161
 
264
- 要求:路径需要在整个应用中唯一
162
+ ```bash
163
+ CDN_DOMAIN=https://your-cdn.com/ rabetbase run build
265
164
  ```
266
165
 
267
- #### 2. 微应用唯一标识
166
+ 构建后检查:
268
167
 
269
- ```text
270
- 说明:标记页面所属的源码微应用,多个页面可能属于同一个源码微应用
271
- 默认:如不填写,则实际运行时会将"路由路径(path)"作为应用标识
168
+ - `dist/` 目录已生成;
169
+ - `main.js` 是 ES module 产物;
170
+ - `main.css` 可被外部访问;
171
+ - CDN 上的 JS/CSS URL 可以在浏览器中直接打开。
272
172
 
273
- 🔧 建议:使用有意义的名称,如:react-hello-world、customer-management
274
- ```
173
+ ## 7. 接入 Lovrabet 主应用
275
174
 
276
- #### 3. Basename
175
+ Lovrabet 应用的页面配置中新增页面,示例:
277
176
 
278
177
  ```text
279
- 说明:指定微应用接收的basename,微应用包含前端路由的场景下需要使用
280
- 默认:如不填写,则默认"路由路径(path)"即作为basename
281
-
282
- 💡 提示:本示例项目已自动处理 basename,通常无需手动配置
178
+ 页面名称:SDK Demo
179
+ 路由路径:/sdk-demo
180
+ 微应用唯一标识:my-sub-app
181
+ 资源加载方式:import
182
+ 资源加载列表:
183
+ https://your-cdn.com/path/to/assets/main.js
184
+ https://your-cdn.com/path/to/assets/main.css
283
185
  ```
284
186
 
285
- #### 4. 资源加载方式
187
+ 配置规则:
286
188
 
287
- ```text
288
- 可选值:
289
- - script(默认):通过HTML <script /> 标签加载,适用于Angular CLI和Vue CLI
290
- - fetch:通过window.fetch 加载并缓存脚本资源,沙箱模式下使用
291
- - import:加载ES modules类型微应用
189
+ - `路由路径` 必须和 `src/pages` 生成的路由一致。
190
+ - Vite 项目必须选择 `import` 加载方式。
191
+ - 同一份构建产物可以挂多个页面,例如 `/sdk-demo`、`/dashboard`、`/data-screen`。
192
+ - 多个页面属于同一个微前端时,建议使用同一个微应用唯一标识。
292
193
 
293
- ⚡ 重要:Vite构建的项目必须选择 import
294
- ```
194
+ 验证方式:
295
195
 
296
- ### Step 1: 改造现有项目结构
297
-
298
- #### 1.1 修改入口文件
299
-
300
- ```jsx
301
- // src/main.jsx - 改造为微前端入口
302
- import React from "react";
303
- import { createRoot } from "react-dom/client";
304
- import { isInIcestark } from "@ice/stark-app";
305
- import { ConfigProvider } from "antd";
306
- import zhCN from "antd/locale/zh_CN";
307
- import App from "./router"; // 注意:App实际上是路由组件
308
- import "./style.css";
309
-
310
- // 判断是否在微前端环境中运行
311
- if (!isInIcestark()) {
312
- // 获取 index.html 中定义的根容器元素(id="root")
313
- const container = document.getElementById("root");
314
- if (container) {
315
- const root = createRoot(container);
316
- root.render(
317
- <ConfigProvider locale={zhCN}>
318
- <App />
319
- </ConfigProvider>,
320
- );
321
- }
322
- }
323
-
324
- // 关键:暴露 mount 供主应用加载时调用
325
- export function mount({ container, customProps }) {
326
- const root = createRoot(container);
327
- root.render(
328
- <React.StrictMode>
329
- <ConfigProvider locale={zhCN}>
330
- <App {...customProps} />
331
- </ConfigProvider>
332
- </React.StrictMode>,
333
- );
334
- return root;
335
- }
336
-
337
- // 关键:暴露 unmount 供主应用卸载时调用
338
- export function unmount({ container }) {
339
- // React 18 中不再需要手动卸载,但为了兼容性保留
340
- const root = container._reactRoot;
341
- if (root) {
342
- root.unmount();
343
- }
344
- }
345
- ```
196
+ 1. 主应用菜单能看到新页面;
197
+ 2. 点击菜单后页面正常渲染;
198
+ 3. 浏览器控制台没有资源加载或跨域错误;
199
+ 4. SDK 页面能正常读取当前登录态有权限的数据。
346
200
 
347
- #### 1.2 配置Vite构建
348
-
349
- ```javascript
350
- // vite.config.ts - 微前端构建配置
351
- import { defineConfig, loadEnv } from "vite";
352
- import react from "@vitejs/plugin-react";
353
- import htmlPlugin from "vite-plugin-index-html";
354
- import pluginExternal from "vite-plugin-external";
355
-
356
- export default defineConfig(async ({ mode }) => {
357
- const env = loadEnv(mode, process.cwd());
358
- const PORT = Number(env.VITE_APP_PORT) || 5173;
359
-
360
- return {
361
- plugins: [
362
- react(),
363
- // 关键配置:提供 vite lib 打包 + html plugin 能力
364
- htmlPlugin({
365
- input: "src/main.tsx",
366
- preserveEntrySignatures: "exports-only",
367
- }),
368
- // 外部化依赖,减小打包体积
369
- pluginExternal({
370
- externals: {
371
- react: "React",
372
- "react-dom": "ReactDOM",
373
- antd: "antd",
374
- dayjs: "dayjs",
375
- },
376
- }),
377
- ],
378
-
379
- // 开发服务器配置
380
- server: {
381
- port: PORT,
382
- host: "dev.lovrabet.com",
383
- headers: {
384
- "Access-Control-Allow-Origin": "*",
385
- },
386
- },
387
-
388
- // 生产构建配置 - ES modules格式
389
- build: {
390
- outDir: "dist",
391
- target: "esnext",
392
- rollupOptions: {
393
- output: {
394
- format: "es",
395
- entryFileNames: "assets/[name].js",
396
- assetFileNames: "assets/[name].css",
397
- },
398
- },
399
- },
400
- };
401
- });
402
- ```
201
+ ## 8. 改造已有 React 项目
403
202
 
404
- ### Step 2: API请求封装(核心配置)
405
-
406
- **🔑 关键点:直接请求真实接口的跨域问题必须配置 `credentials: 'include'` 来携带Cookie**
407
-
408
- ```javascript
409
- // 简单封装 apiRequest - 这是最简单有效的实现
410
- const apiRequest = async (path, options = {}) => {
411
- const response = await fetch(`https://runtime.lovrabet.com${path}`, {
412
- credentials: "include", // 关键配置:跨域请求携带Cookie
413
- headers: {
414
- "Content-Type": "application/json",
415
- ...options.headers,
416
- },
417
- ...options,
418
- });
419
- return response.json();
420
- };
421
-
422
- // 使用示例
423
- const fetchUserData = async () => {
424
- try {
425
- const data = await apiRequest(
426
- "/dbapi/runtime/yuntoo/app-f4c03acb/6c6c94a6ef064fe898cfa895fe5a38f5/getList",
427
- {
428
- method: "POST",
429
- body: JSON.stringify({ pageSize: 10, currentPage: 1 }),
430
- },
431
- );
432
-
433
- if (data.success) {
434
- console.log("数据获取成功:", data.data);
435
- }
436
- } catch (error) {
437
- console.error("请求失败:", error);
438
- }
439
- };
440
- ```
441
-
442
- ### Step 3: 路由配置
443
-
444
- ```jsx
445
- // src/router/index.jsx - 路由配置文件
446
- import React from "react";
447
- import { createBrowserRouter, RouterProvider } from "react-router";
448
- import { getBasename } from "@ice/stark-app";
449
- import MainLayout from "../layouts/MainLayout";
450
- import HelloWorld from "../pages/HelloWorld";
451
- import ChartFetch from "../pages/ChartFetch";
452
-
453
- const router = createBrowserRouter(
454
- [
455
- {
456
- path: "/",
457
- element: <MainLayout />,
458
- children: [
459
- {
460
- index: true,
461
- element: <HelloWorld />,
462
- },
463
- {
464
- path: "hello-world",
465
- element: <HelloWorld />,
466
- },
467
- {
468
- path: "chart-fetch",
469
- element: <ChartFetch />,
470
- },
471
- ],
472
- },
473
- ],
474
- {
475
- // 可选:通过getBasename()获取到微应用运行时的basename并传入
476
- basename: getBasename() || "/",
477
- },
478
- );
479
-
480
- console.log("MicroAppRouter:", {
481
- routes: router.routes,
482
- basename: router.basename,
483
- });
203
+ 如果你不是从模板开始,而是要改造已有 React + Vite 项目,最少需要补齐:
484
204
 
485
- const AppRouter: React.FC = () => {
486
- return <RouterProvider router={router} />;
487
- };
205
+ 1. `@ice/stark-app` 依赖;
206
+ 2. `src/main.tsx` 中的 `mount` / `unmount` 导出;
207
+ 3. `src/router/index.tsx` 中的 `getBasename()`;
208
+ 4. Vite 构建产物使用 ES module;
209
+ 5. Lovrabet 页面配置中使用 `import` 加载方式;
210
+ 6. 需要调用平台数据时,引入 `@lovrabet/sdk` 并生成 `src/api/api.ts`。
488
211
 
489
- export default AppRouter;
490
- ```
212
+ 建议直接对照本模板的 `src/main.tsx`、`src/router/index.tsx`、`vite.config.ts` 修改,而不是从旧的 Hello World 示例复制代码。
491
213
 
492
- ### Step 4: 本地开发、测试、集成到主应用
214
+ ## 常见问题
493
215
 
494
- 同场景一和场景二的操作
216
+ ### 本地打不开 `https://dev.lovrabet.com:5173`
495
217
 
496
- ## 🛠️ 常见问题和解决方案
218
+ 先确认命令是否正常运行;如果端口冲突,换端口启动:
497
219
 
498
- ### 改造相关问题
220
+ ```bash
221
+ PORT=3000 rabetbase run start
222
+ ```
499
223
 
500
- **问题1:现有项目路由冲突**
501
- **解决**:
224
+ ### SDK 页面没有模型
502
225
 
503
- - 使用正确的basename,确保在主应用中也是唯一的
504
- - 检查路由配置与平台配置的路径匹配
505
- - 使用相对路径而非绝对路径
226
+ 执行:
506
227
 
507
- **问题2:接口请求失败**
508
- **解决**:
228
+ ```bash
229
+ rabetbase api pull
230
+ ```
509
231
 
510
- - 检查API地址配置是否正确
511
- - 验证接口的CORS配置
232
+ 然后检查 `src/api/api.ts` 是否生成了当前应用的模型配置。
512
233
 
513
- ### 构建部署问题
234
+ ### 主应用里页面空白
514
235
 
515
- **问题4:构建后资源加载失败**
516
- **解决**:
236
+ 优先检查:
517
237
 
518
- - 确保选择import加载方式
519
- - 检查CDN地址是否正确
520
- - 验证资源文件是否完整上传
238
+ - 页面资源是否选择 `import`;
239
+ - JS/CSS URL 是否可访问;
240
+ - 路由路径是否和 `src/pages` 生成路径一致;
241
+ - CDN 是否返回了正确的 `Content-Type`。
521
242
 
522
- **问题5:我的业务工程能不能独立运行,仅调用Lovrabet的api接口**
523
- **解决**:
243
+ ### 本地独立运行有侧边栏,嵌入主应用后没有侧边栏
524
244
 
525
- - step1:子应用不挂载到主应用,也是支持独立运行的;
526
- - step2:联系Lovrabet技术 @fengyue 独立配置业务自有域名来解决cors跨域;
245
+ 这是预期行为。`MainLayout` 会在 icestark 环境下只渲染页面内容,由 Lovrabet 主应用提供外层导航。