@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.
- package/README.md +1 -1
- package/lib/api/api-doc.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.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/get-session-user.js +1 -1
- package/lib/auth/is-session-valid.js +1 -1
- package/lib/auth/login-success-html.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli-flags.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/commands/api/generate.js +1 -1
- package/lib/commands/api/index.js +1 -1
- package/lib/commands/api/list.js +1 -1
- package/lib/commands/api/pull.js +1 -1
- package/lib/commands/api/shared.js +1 -1
- package/lib/commands/app/add.js +1 -1
- package/lib/commands/app/discover.js +1 -1
- package/lib/commands/app/index.js +1 -1
- package/lib/commands/app/list.js +1 -1
- package/lib/commands/app/remove.js +1 -1
- package/lib/commands/app/shared.js +1 -1
- package/lib/commands/app/use.js +1 -1
- package/lib/commands/app-config/delete.js +1 -0
- package/lib/commands/app-config/get.js +1 -0
- package/lib/commands/app-config/index.js +1 -0
- package/lib/commands/app-config/list.js +1 -0
- package/lib/commands/app-config/set.js +1 -0
- package/lib/commands/app-config/shared.js +1 -0
- package/lib/commands/auth/index.js +1 -1
- package/lib/commands/bff/create.js +1 -1
- package/lib/commands/bff/delete.js +1 -1
- package/lib/commands/bff/detail.js +1 -1
- package/lib/commands/bff/index.js +1 -1
- package/lib/commands/bff/list.js +1 -1
- package/lib/commands/bff/pull.js +1 -1
- package/lib/commands/bff/push.js +1 -1
- package/lib/commands/bff/status.js +1 -1
- package/lib/commands/cli-update.js +1 -1
- package/lib/commands/codegen/index.js +1 -1
- package/lib/commands/codegen/sdk.js +1 -1
- package/lib/commands/codegen/sql.js +1 -1
- package/lib/commands/common/app-selector.js +1 -1
- package/lib/commands/common/flags.js +1 -1
- package/lib/commands/common/validate.js +1 -1
- package/lib/commands/config/get.js +1 -1
- package/lib/commands/config/index.js +1 -1
- package/lib/commands/config/list.js +1 -1
- package/lib/commands/config/set.js +1 -1
- package/lib/commands/config/shared.js +1 -1
- package/lib/commands/data/filter.js +1 -1
- package/lib/commands/data/getOne.js +1 -1
- package/lib/commands/data/index.js +1 -1
- package/lib/commands/data/shared.js +1 -1
- package/lib/commands/dataset/business-group-update.js +1 -0
- package/lib/commands/dataset/capability.js +1 -1
- package/lib/commands/dataset/delete.js +1 -1
- package/lib/commands/dataset/detail.js +1 -1
- package/lib/commands/dataset/extend-update.js +1 -1
- package/lib/commands/dataset/field-update.js +1 -1
- package/lib/commands/dataset/index.js +1 -1
- package/lib/commands/dataset/list.js +1 -1
- package/lib/commands/dataset/operations.js +1 -1
- package/lib/commands/dataset/relation-create.js +1 -1
- package/lib/commands/dataset/relation-delete.js +1 -1
- package/lib/commands/dataset/relation-shared.js +1 -1
- package/lib/commands/dataset/relation-update.js +1 -1
- package/lib/commands/dataset/relations.js +1 -1
- package/lib/commands/dataset/rename.js +1 -1
- package/lib/commands/dataset/restore.js +1 -0
- package/lib/commands/db/analyze-cancel.js +1 -1
- package/lib/commands/db/analyze-start.js +1 -1
- package/lib/commands/db/analyze-status.js +1 -1
- package/lib/commands/db/create.js +1 -1
- package/lib/commands/db/delete.js +1 -1
- package/lib/commands/db/detail.js +1 -1
- package/lib/commands/db/diff.js +1 -1
- package/lib/commands/db/index.js +1 -1
- package/lib/commands/db/list.js +1 -1
- package/lib/commands/db/shared.js +1 -1
- package/lib/commands/db/tables.js +1 -1
- package/lib/commands/db/test.js +1 -1
- package/lib/commands/db/update.js +1 -1
- package/lib/commands/doctor.js +1 -1
- package/lib/commands/init/index.js +1 -1
- package/lib/commands/issue/index.js +1 -1
- package/lib/commands/issue/nudge.js +1 -1
- package/lib/commands/issue/report.js +1 -1
- package/lib/commands/issue/shared.js +1 -1
- package/lib/commands/logs/index.js +1 -1
- package/lib/commands/menu/index.js +1 -1
- package/lib/commands/menu/list.js +1 -1
- package/lib/commands/menu/shared/compare-table.js +1 -1
- package/lib/commands/menu/shared/index.js +1 -1
- package/lib/commands/menu/shared/inquirer.js +1 -1
- package/lib/commands/menu/shared/local-pages.js +1 -1
- package/lib/commands/menu/shared/logic.js +1 -1
- package/lib/commands/menu/shared/service.js +1 -1
- package/lib/commands/menu/shared/sync-core.js +1 -1
- package/lib/commands/menu/shared/update-core.js +1 -1
- package/lib/commands/menu/shared/valid-url.js +1 -1
- package/lib/commands/menu/sync.js +1 -1
- package/lib/commands/menu/update.js +1 -1
- package/lib/commands/page/generate-start.js +1 -1
- package/lib/commands/page/generate-status.js +1 -1
- package/lib/commands/page/index.js +1 -1
- package/lib/commands/page/pull.js +1 -1
- package/lib/commands/page/push.js +1 -1
- package/lib/commands/page/relation-audit.js +1 -1
- package/lib/commands/page/shared.js +1 -1
- package/lib/commands/page/standard-page-status.js +1 -1
- package/lib/commands/page/sync.js +1 -1
- package/lib/commands/project/create/enhanced-guided-create.js +1 -1
- package/lib/commands/project/create/format-elapsed.js +1 -1
- package/lib/commands/project/create/main.js +1 -1
- package/lib/commands/project/create/non-interactive.js +1 -1
- package/lib/commands/project/create/project-template-path.js +1 -1
- package/lib/commands/project/create/use-copy-project-template.js +1 -1
- package/lib/commands/project/create/use-format-code.js +1 -1
- package/lib/commands/project/create/use-install-dependencies.js +1 -1
- package/lib/commands/project/index.js +1 -1
- package/lib/commands/project/init.js +1 -1
- package/lib/commands/project/upgrade.js +1 -1
- package/lib/commands/registry.js +1 -1
- package/lib/commands/run/index.js +1 -1
- package/lib/commands/schema.js +1 -1
- package/lib/commands/skill/index.js +1 -1
- package/lib/commands/sql/create.js +1 -1
- package/lib/commands/sql/delete.js +1 -1
- package/lib/commands/sql/detail.js +1 -1
- package/lib/commands/sql/exec.js +1 -1
- package/lib/commands/sql/index.js +1 -1
- package/lib/commands/sql/list.js +1 -1
- package/lib/commands/sql/pull.js +1 -1
- package/lib/commands/sql/push.js +1 -1
- package/lib/commands/sql/save.js +1 -1
- package/lib/commands/sql/shared.js +1 -1
- package/lib/commands/sql/status.js +1 -1
- package/lib/commands/sql/validate.js +1 -1
- package/lib/commands/workspace/index.js +1 -1
- package/lib/config/schema.js +1 -1
- package/lib/constant/cdn.js +1 -1
- package/lib/constant/cli.js +1 -1
- package/lib/constant/defaults.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/constant/output.js +1 -1
- package/lib/constant/paths.js +1 -1
- package/lib/constant/risk.js +1 -1
- package/lib/context/app-resolver.js +1 -1
- package/lib/context/auth-resolver.js +1 -1
- package/lib/context/config-loader.js +1 -1
- package/lib/context.js +1 -1
- package/lib/core/alias-resolver.js +1 -1
- package/lib/core/api-client.js +1 -1
- package/lib/core/bff/config.js +1 -1
- package/lib/core/bff/file-system.js +1 -1
- package/lib/core/bff/hash.js +1 -1
- package/lib/core/bff/lock.js +1 -1
- package/lib/core/bff/utils.js +1 -1
- package/lib/core/db-resolver.js +1 -1
- package/lib/core/page/file-system.js +1 -1
- package/lib/core/page/hash.js +1 -1
- package/lib/core/page/lock.js +1 -1
- package/lib/core/sql-sync/config.js +1 -1
- package/lib/core/sql-sync/file-system.js +1 -1
- package/lib/core/sql-sync/hash.js +1 -1
- package/lib/core/sql-sync/lock.js +1 -1
- package/lib/core/sql-sync/utils.js +1 -1
- package/lib/core/sql-validator.js +1 -1
- package/lib/errors.js +1 -1
- package/lib/framework/build-all-flags.js +1 -1
- package/lib/framework/flags.js +1 -1
- package/lib/framework/help.js +1 -1
- package/lib/framework/index.js +1 -1
- package/lib/framework/output.js +1 -1
- package/lib/framework/response.js +1 -1
- package/lib/framework/runner-alias.js +1 -1
- package/lib/framework/runner.js +1 -1
- package/lib/framework/schema-export.js +1 -1
- package/lib/framework/types.js +1 -1
- package/lib/generated/build-info.js +1 -1
- package/lib/help.js +1 -1
- package/lib/skills/main.js +1 -1
- package/lib/skills/npx-skills-add.js +1 -1
- package/lib/telemetry/cli-command-trace.js +1 -1
- package/lib/telemetry/cli-help-trace.js +1 -1
- package/lib/telemetry/ensure-cli-otel-config.js +1 -1
- package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
- package/lib/telemetry/send-cli-trace-log.js +1 -1
- package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
- package/lib/utils/ai_config.js +1 -1
- package/lib/utils/apply-jq-filter.js +1 -1
- package/lib/utils/cdn-config.js +1 -1
- package/lib/utils/check-sdk-version.js +1 -1
- package/lib/utils/cli-version-check.js +1 -1
- package/lib/utils/cli-version-policy.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/copy-directory.js +1 -1
- package/lib/utils/entity-with-id.js +1 -1
- package/lib/utils/file-utils.js +1 -1
- package/lib/utils/guides-cdn.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/is-non-interactive.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/platform.js +1 -1
- package/lib/utils/rules-cdn.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/lib/utils/update-notice.js +1 -1
- package/lib/utils/version.js +1 -1
- package/lib/utils/with-active-cookie.js +1 -1
- package/lib/utils/write-cli-side-channel.js +1 -1
- package/package.json +1 -1
- package/templates/README.md +15 -25
- package/templates/generate-api/api.ts.tpl +2 -2
- package/templates/generate-api/client.ts.tpl +2 -2
- package/templates/projects/sub-app-react-demo/CHANGELOG.md +15 -1
- package/templates/projects/sub-app-react-demo/README.md +159 -231
- package/templates/projects/sub-app-react-demo/docs/quick-start.md +145 -426
- package/templates/projects/sub-app-react-demo/src/api/api.ts +8 -65
- package/templates/projects/sub-app-react-demo/src/api/client.ts +10 -42
- package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.module.css +28 -0
- package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.tsx +55 -0
- package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +6 -9
- package/templates/projects/sub-app-react-demo/src/main.tsx +10 -6
- package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +3 -5
- package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +153 -148
- package/templates/projects/sub-app-react-demo/src/pages/index.module.css +500 -0
- package/templates/projects/sub-app-react-demo/src/pages/index.tsx +517 -343
- package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +325 -242
- package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +8 -6
- package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +174 -87
- package/templates/projects/sub-app-react-demo/src/style.css +19 -3
- package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +1 -1
- package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +0 -212
|
@@ -1,526 +1,245 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Rabetbase React 子应用快速开始
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
7
|
+
1. 启动本地开发环境;
|
|
8
|
+
2. 确认当前模板内置页面;
|
|
9
|
+
3. 拉取 Lovrabet SDK 模型配置;
|
|
10
|
+
4. 构建产物并接入 Lovrabet 主应用;
|
|
11
|
+
5. 理解如何继续二次开发。
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
## 1. 环境准备
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
请先确认本机具备:
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
23
|
-
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g @lovrabet/rabetbase-cli
|
|
23
|
+
rabetbase --help
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
|
|
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
|
-
|
|
39
|
-
- 确认Hello World页面正常显示
|
|
40
|
-
- 检查控制台无报错信息
|
|
41
|
-
|
|
42
|
-

|
|
43
|
-
|
|
44
|
-
### Step 3: 构建产物
|
|
34
|
+
### 方式 A:通过 CLI 创建新项目
|
|
45
35
|
|
|
46
36
|
```bash
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-

|
|
41
|
+
说明:
|
|
59
42
|
|
|
60
|
-
|
|
61
|
-
|
|
43
|
+
- `--appcode` 可省略;省略后在创建好的项目目录内执行 `rabetbase config set appcode app-xxxx`。
|
|
44
|
+
- 有 AppCode 时,CLI 会尝试自动拉取 `src/api/api.ts`。
|
|
45
|
+
- 如果自动拉取失败,后续手动执行 `rabetbase api pull` 即可。
|
|
62
46
|
|
|
63
|
-
###
|
|
64
|
-
|
|
65
|
-
#### 选项A:使用业务方已有CDN
|
|
47
|
+
### 方式 B:直接调试模板源码
|
|
66
48
|
|
|
67
49
|
```bash
|
|
68
|
-
|
|
69
|
-
|
|
50
|
+
cd sub-app-react-demo
|
|
51
|
+
npm install
|
|
70
52
|
```
|
|
71
53
|
|
|
72
|
-
|
|
54
|
+
## 3. 本地启动
|
|
73
55
|
|
|
74
56
|
```bash
|
|
75
|
-
|
|
57
|
+
rabetbase run start
|
|
76
58
|
```
|
|
77
59
|
|
|
78
|
-
|
|
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
|
-

|
|
116
|
-
|
|
117
|
-
#### 5.2 配置路由
|
|
118
|
-
|
|
119
|
-

|
|
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
|
-

|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## 📊 场景二:真实API数据请求与图表展示(10min)
|
|
132
|
-
|
|
133
|
-
**目标**:体验调用真实业务接口、处理跨域请求、展示动态图表的完整功能
|
|
134
|
-
|
|
135
|
-
### Step 1: 更新图表页面代码
|
|
66
|
+
如需切换端口:
|
|
136
67
|
|
|
137
68
|
```bash
|
|
138
|
-
|
|
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
|
-
|
|
72
|
+
当前模板内置页面如下:
|
|
145
73
|
|
|
146
|
-
|
|
74
|
+
| 页面 | 路由 | 说明 |
|
|
75
|
+
| -------- | -------------- | ---------------------------------------------------- |
|
|
76
|
+
| 首页 | `/` | Prompt 开发入口、项目状态、Agent 场景示例和飞书文库导航 |
|
|
77
|
+
| SDK 演示 | `/sdk-demo` | 展示模型列表、查询、新增、更新、删除等 SDK 调用方式 |
|
|
78
|
+
| 工作台 | `/workbench` | 常见工作台页面示例 |
|
|
79
|
+
| 数据看板 | `/dashboard` | 指标和图表展示示例 |
|
|
80
|
+
| 数据大屏 | `/data-screen` | 全屏数据展示示例 |
|
|
147
81
|
|
|
148
|
-
-
|
|
149
|
-
- 请将接口地址换成业务有权限的接口地址,就能运行看到自己负责业务的接口数据了,有权限的api地址请查看 https://app.lovrabet.com/app/${appCode}/admin/dataset,直接复制接口链接就能通过浏览器console控制验证接口请求的调用是否成功;
|
|
82
|
+
> 旧文档中提到的 `/hello-world`、`/chart-fetch`、`/intro` 已不是当前模板页面。请以 `src/pages` 目录为准。
|
|
150
83
|
|
|
151
|
-
|
|
84
|
+
日常开发时,推荐在 Claude Code、Cursor、Codex 等 Agent 环境中直接描述目标,例如:
|
|
152
85
|
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
|
|
86
|
+
```text
|
|
87
|
+
请基于当前 Lovrabet 数据模型新增一个客户跟进工作台页面。
|
|
88
|
+
页面需要包含筛选区、列表、详情抽屉和新增表单。
|
|
89
|
+
数据读写请使用项目里的 @lovrabet/sdk 客户端。
|
|
156
90
|
```
|
|
157
91
|
|
|
158
|
-
|
|
92
|
+
Agent 会根据项目中的 `rabetbase` 能力完成模型同步、页面开发、构建检查和主应用接入建议。
|
|
159
93
|
|
|
160
|
-
|
|
161
|
-
- 确认饼图显示客户状态分布(活跃、正常、流失)
|
|
94
|
+
## 4. 拉取 SDK 模型配置
|
|
162
95
|
|
|
163
|
-
|
|
96
|
+
如果项目是通过 `rabetbase project create` 创建的,且 `src/api/api.ts` 还不是你的应用配置,执行:
|
|
164
97
|
|
|
165
98
|
```bash
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
访问链接:https://app.lovrabet.com/app/app-f4c03acb/preview
|
|
200
|
-

|
|
110
|
+
拉取后重点检查:
|
|
201
111
|
|
|
202
|
-
|
|
112
|
+
- `src/api/api.ts` 中的 AppCode 是否正确;
|
|
113
|
+
- `models` 是否包含你需要的数据模型;
|
|
114
|
+
- 每个模型的 `alias` 是否符合代码中的调用方式。
|
|
203
115
|
|
|
204
|
-
|
|
205
|
-
- "Hello World"菜单 → 显示Hello World页面
|
|
206
|
-
- "数据图表"菜单 → 显示图表页面,数据正常加载
|
|
116
|
+
业务页面中统一从 `src/api/client.ts` 引入客户端:
|
|
207
117
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-

|
|
211
|
-
|
|
212
|
-
---
|
|
118
|
+
```typescript
|
|
119
|
+
import { lovrabetClient } from "@/api/client";
|
|
213
120
|
|
|
214
|
-
|
|
121
|
+
const models = lovrabetClient.getModelList();
|
|
215
122
|
|
|
216
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
+
新增页面后:
|
|
234
142
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
143
|
+
1. 本地访问对应路由确认渲染正常;
|
|
144
|
+
2. 如果独立运行时需要左侧菜单入口,修改 `src/layouts/MainLayout.tsx`;
|
|
145
|
+
3. 如果要在 Lovrabet 主应用中挂菜单,发布后在页面配置里使用同一个路由路径。
|
|
238
146
|
|
|
239
|
-
|
|
147
|
+
## 6. 构建产物
|
|
240
148
|
|
|
241
|
-
|
|
149
|
+
```bash
|
|
150
|
+
rabetbase run build
|
|
242
151
|
```
|
|
243
152
|
|
|
244
|
-
|
|
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
|
-
|
|
258
|
-
|
|
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
|
-
|
|
166
|
+
构建后检查:
|
|
268
167
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
168
|
+
- `dist/` 目录已生成;
|
|
169
|
+
- `main.js` 是 ES module 产物;
|
|
170
|
+
- `main.css` 可被外部访问;
|
|
171
|
+
- CDN 上的 JS/CSS URL 可以在浏览器中直接打开。
|
|
272
172
|
|
|
273
|
-
|
|
274
|
-
```
|
|
173
|
+
## 7. 接入 Lovrabet 主应用
|
|
275
174
|
|
|
276
|
-
|
|
175
|
+
在 Lovrabet 应用的页面配置中新增页面,示例:
|
|
277
176
|
|
|
278
177
|
```text
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
187
|
+
配置规则:
|
|
286
188
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
- import:加载ES modules类型微应用
|
|
189
|
+
- `路由路径` 必须和 `src/pages` 生成的路由一致。
|
|
190
|
+
- Vite 项目必须选择 `import` 加载方式。
|
|
191
|
+
- 同一份构建产物可以挂多个页面,例如 `/sdk-demo`、`/dashboard`、`/data-screen`。
|
|
192
|
+
- 多个页面属于同一个微前端时,建议使用同一个微应用唯一标识。
|
|
292
193
|
|
|
293
|
-
|
|
294
|
-
```
|
|
194
|
+
验证方式:
|
|
295
195
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
486
|
-
|
|
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
|
-
|
|
490
|
-
```
|
|
212
|
+
建议直接对照本模板的 `src/main.tsx`、`src/router/index.tsx`、`vite.config.ts` 修改,而不是从旧的 Hello World 示例复制代码。
|
|
491
213
|
|
|
492
|
-
|
|
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
|
-
|
|
501
|
-
**解决**:
|
|
224
|
+
### SDK 页面没有模型
|
|
502
225
|
|
|
503
|
-
|
|
504
|
-
- 检查路由配置与平台配置的路径匹配
|
|
505
|
-
- 使用相对路径而非绝对路径
|
|
226
|
+
执行:
|
|
506
227
|
|
|
507
|
-
|
|
508
|
-
|
|
228
|
+
```bash
|
|
229
|
+
rabetbase api pull
|
|
230
|
+
```
|
|
509
231
|
|
|
510
|
-
|
|
511
|
-
- 验证接口的CORS配置
|
|
232
|
+
然后检查 `src/api/api.ts` 是否生成了当前应用的模型配置。
|
|
512
233
|
|
|
513
|
-
###
|
|
234
|
+
### 主应用里页面空白
|
|
514
235
|
|
|
515
|
-
|
|
516
|
-
**解决**:
|
|
236
|
+
优先检查:
|
|
517
237
|
|
|
518
|
-
-
|
|
519
|
-
-
|
|
520
|
-
-
|
|
238
|
+
- 页面资源是否选择 `import`;
|
|
239
|
+
- JS/CSS URL 是否可访问;
|
|
240
|
+
- 路由路径是否和 `src/pages` 生成路径一致;
|
|
241
|
+
- CDN 是否返回了正确的 `Content-Type`。
|
|
521
242
|
|
|
522
|
-
|
|
523
|
-
**解决**:
|
|
243
|
+
### 本地独立运行有侧边栏,嵌入主应用后没有侧边栏
|
|
524
244
|
|
|
525
|
-
|
|
526
|
-
- step2:联系Lovrabet技术 @fengyue 独立配置业务自有域名来解决cors跨域;
|
|
245
|
+
这是预期行为。`MainLayout` 会在 icestark 环境下只渲染页面内容,由 Lovrabet 主应用提供外层导航。
|