@lovrabet/cli 1.1.0

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 (76) hide show
  1. package/README.md +28 -0
  2. package/lib/add-page/input-page-router.js +1 -0
  3. package/lib/add-page/main.js +1 -0
  4. package/lib/add-page/select-page-template.js +1 -0
  5. package/lib/api/api-pull-ui.js +1 -0
  6. package/lib/api/format-dataset.js +1 -0
  7. package/lib/api/generate-api-file.js +1 -0
  8. package/lib/api/main.js +1 -0
  9. package/lib/api/pull-silent.js +1 -0
  10. package/lib/api/pull.js +1 -0
  11. package/lib/api/types.js +1 -0
  12. package/lib/auth/auth-server-ui.js +1 -0
  13. package/lib/auth/auth-server.js +1 -0
  14. package/lib/auth/constant.js +1 -0
  15. package/lib/auth/get-cookie.js +1 -0
  16. package/lib/auth/is-session-valid.js +1 -0
  17. package/lib/auth/logout.js +1 -0
  18. package/lib/cli.js +2 -0
  19. package/lib/cmd/build-watch.js +1 -0
  20. package/lib/cmd/build.js +1 -0
  21. package/lib/cmd/logs.js +1 -0
  22. package/lib/cmd/preview.js +1 -0
  23. package/lib/cmd/start.js +1 -0
  24. package/lib/config/config-help.js +1 -0
  25. package/lib/config/main.js +1 -0
  26. package/lib/constant/domain.js +1 -0
  27. package/lib/constant/env.js +1 -0
  28. package/lib/create-app/enhanced-guided-create.js +1 -0
  29. package/lib/create-app/format-elapsed.js +1 -0
  30. package/lib/create-app/main.js +1 -0
  31. package/lib/create-app/task-finished.js +1 -0
  32. package/lib/create-app/task-loading.js +1 -0
  33. package/lib/create-app/task-running.js +1 -0
  34. package/lib/create-app/task-time.js +1 -0
  35. package/lib/create-app/use-copy-project-template.js +1 -0
  36. package/lib/create-app/use-format-code.js +1 -0
  37. package/lib/create-app/use-install-dependencies.js +1 -0
  38. package/lib/help.js +1 -0
  39. package/lib/utils/config.js +1 -0
  40. package/lib/utils/copy-directory.js +1 -0
  41. package/lib/utils/logger.js +1 -0
  42. package/lib/utils/router-updater.js +1 -0
  43. package/lib/utils/template-replacer.js +1 -0
  44. package/package.json +41 -0
  45. package/templates/README.md +115 -0
  46. package/templates/generate-api/api.ts.tpl +42 -0
  47. package/templates/generate-api/client.ts.tpl +64 -0
  48. package/templates/pages/blank/index.tsx.tpl +13 -0
  49. package/templates/pages/sdk-fetch/index.tsx.tpl +82 -0
  50. package/templates/projects/sub-app-react-demo/.prettierrc +1 -0
  51. package/templates/projects/sub-app-react-demo/.vscode/extensions.json +3 -0
  52. package/templates/projects/sub-app-react-demo/.vscode/settings.json +57 -0
  53. package/templates/projects/sub-app-react-demo/CHANGELOG.md +37 -0
  54. package/templates/projects/sub-app-react-demo/README.md +209 -0
  55. package/templates/projects/sub-app-react-demo/bun.lock +600 -0
  56. package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +212 -0
  57. package/templates/projects/sub-app-react-demo/docs/quick-start.md +526 -0
  58. package/templates/projects/sub-app-react-demo/index.html +39 -0
  59. package/templates/projects/sub-app-react-demo/package.json +34 -0
  60. package/templates/projects/sub-app-react-demo/public/vite.svg +1 -0
  61. package/templates/projects/sub-app-react-demo/src/api/api.ts +66 -0
  62. package/templates/projects/sub-app-react-demo/src/api/client.ts +63 -0
  63. package/templates/projects/sub-app-react-demo/src/components/ApiUrlDisplay.tsx +111 -0
  64. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +116 -0
  65. package/templates/projects/sub-app-react-demo/src/main.tsx +48 -0
  66. package/templates/projects/sub-app-react-demo/src/pages/chart-fetch/index.tsx +137 -0
  67. package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +572 -0
  68. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +129 -0
  69. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +182 -0
  70. package/templates/projects/sub-app-react-demo/src/pages/table-display.tsx +130 -0
  71. package/templates/projects/sub-app-react-demo/src/router/index.tsx +30 -0
  72. package/templates/projects/sub-app-react-demo/src/style.css +47 -0
  73. package/templates/projects/sub-app-react-demo/src/utils/api.ts +12 -0
  74. package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +2 -0
  75. package/templates/projects/sub-app-react-demo/tsconfig.json +26 -0
  76. package/templates/projects/sub-app-react-demo/vite.config.ts +88 -0
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@lovrabet/cli",
3
+ "version": "1.1.0",
4
+ "license": "MIT",
5
+ "bin": {
6
+ "lovrabet": "lib/cli.js"
7
+ },
8
+ "type": "module",
9
+ "module": "lib/cli.js",
10
+ "main": "lib/cli.js",
11
+ "engines": {
12
+ "node": ">=20"
13
+ },
14
+ "scripts": {
15
+ "build": "rm -rf lib && tsc && javascript-obfuscator lib --output lib",
16
+ "start": "tsc --watch",
17
+ "sync-template": "node scripts/sync-template.js",
18
+ "release": "bun run build && bun pm version patch && git push && git push origin --tag && bun publish"
19
+ },
20
+ "files": [
21
+ "lib",
22
+ "templates"
23
+ ],
24
+ "dependencies": {
25
+ "@types/winston": "^2.4.4",
26
+ "execa": "^9.6.0",
27
+ "ink": "^6.2.3",
28
+ "ink-spinner": "^5.0.0",
29
+ "javascript-obfuscator": "^4.1.1",
30
+ "listr": "^0.14.3",
31
+ "meow": "^13.2.0",
32
+ "prettier": "^3.6.2",
33
+ "react": "^19.1.1",
34
+ "winston": "^3.17.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/listr": "^0.14.9",
38
+ "@types/react": "^19.1.12",
39
+ "typescript": "latest"
40
+ }
41
+ }
@@ -0,0 +1,115 @@
1
+ # Lovrabet CLI 模板说明
2
+
3
+ 此目录包含 Lovrabet CLI 工具的模板文件。
4
+
5
+ ## 目录结构
6
+
7
+ ```
8
+ templates/
9
+ ├── README.md # 本说明文档
10
+ ├── pages/ # 页面模板,用于 `lovrabet add page` 命令
11
+ │ ├── blank/ # 简单空白页面模板
12
+ │ └── hello-world/ # 功能丰富的演示页面模板
13
+ └── projects/ # 项目模板,用于 `lovrabet create project` 命令
14
+ └── sub-app-react-demo/ # Git 子模块,指向主模板仓库
15
+ ```
16
+
17
+ ## 页面模板
18
+
19
+ ### 可用占位符标签
20
+
21
+ 创建页面模板(`.tsx.tpl` 文件)时,可以使用以下占位符标签,它们会被自动替换:
22
+
23
+ | 标签 | 说明 | 示例 |
24
+ |-----|------|------|
25
+ | `{ComponentName}` | PascalCase 组件名 | `UserProfile` |
26
+ | `{DisplayTitle}` | 人类可读的标题 | `User Profile` |
27
+ | `{PageName}` | 原始的 kebab-case 页面名 | `user-profile` |
28
+ | `{TemplateName}` | 使用的模板名称 | `blank` |
29
+ | `{CreatedAt}` | 创建时的 ISO 时间戳 | `2024-09-14T15:30:45.123Z` |
30
+ | `{CreatedDate}` | 创建日期 | `2024-09-14` |
31
+ | `{CreatedTime}` | 创建时间 | `15:30:45` |
32
+
33
+ ### 模板文件命名
34
+
35
+ - 模板文件应使用 `.tpl` 扩展名(如 `index.tsx.tpl`)
36
+ - 生成时会自动移除 `.tpl` 扩展名
37
+ - CLI 会处理所有文本文件(`.tsx`, `.ts`, `.jsx`, `.js`, `.json`, `.md`, `.css`, `.scss`, `.tpl`)
38
+
39
+ ### 模板使用示例
40
+
41
+ ```tsx
42
+ /**
43
+ * Generated by Lovrabet CLI
44
+ * Template: {TemplateName}
45
+ * Created: {CreatedAt}
46
+ * Page: {PageName}
47
+ */
48
+ import React from "react";
49
+
50
+ function {ComponentName}() {
51
+ return <div>{DisplayTitle} 页面</div>;
52
+ }
53
+
54
+ export default {ComponentName};
55
+ ```
56
+
57
+ ### 添加新页面模板
58
+
59
+ 1. 在 `templates/pages/` 下创建新目录(如 `templates/pages/my-template/`)
60
+ 2. 添加带 `.tpl` 扩展名的模板文件
61
+ 3. 使用上述文档化的占位符标签
62
+ 4. 无需修改 CLI 代码 - 任何新模板都会自动工作!
63
+
64
+ ## 项目模板
65
+
66
+ ### Git 子模块同步
67
+
68
+ `projects/sub-app-react-demo/` 目录是一个 Git 子模块,指向:
69
+ **仓库地址**: https://github.com/lovrabet-ai/sub-app-react-demo
70
+
71
+ #### 开发者:同步模板
72
+
73
+ 更新项目模板到最新版本:
74
+
75
+ ```bash
76
+ # 方法一:使用内置同步脚本
77
+ npm run sync
78
+
79
+ # 方法二:手动 git 子模块命令
80
+ git submodule update --remote --merge
81
+ git add templates/projects/sub-app-react-demo
82
+ git commit -m "Update project template to latest version"
83
+ ```
84
+
85
+ #### 初始设置(新克隆时)
86
+
87
+ ```bash
88
+ # 初始化并更新所有子模块
89
+ git submodule update --init --recursive
90
+ ```
91
+
92
+ ### 模板结构
93
+
94
+ 项目模板应维护以下结构:
95
+ - 标准的 React + Vite 设置
96
+ - Ant Design 集成
97
+ - icestark 微前端配置
98
+ - 页面管理的路由配置
99
+
100
+ ## 贡献指南
101
+
102
+ 添加新模板时:
103
+
104
+ 1. **页面模板**:放置在 `templates/pages/[template-name]/` 中
105
+ 2. **使用占位符标签**:遵循文档化的标签系统
106
+ 3. **文件扩展名**:需要处理的模板文件使用 `.tpl`
107
+ 4. **本地测试**:提交前使用新模板生成页面进行测试
108
+ 5. **更新此 README**:记录任何新功能或标签
109
+
110
+ ## 注意事项
111
+
112
+ - 模板在页面/项目生成过程中被复制和处理
113
+ - CLI 使用 `TemplateReplacer` 工具进行标签替换
114
+ - 生成的文件包含显示生成元数据的头部注释
115
+ - 所有模板支持国际化并可根据需要扩展
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Generated by Lovrabet CLI
3
+ * Created: {CreatedAt}
4
+ *
5
+ * 这个文件包含了项目的模型配置,并自动注册到 SDK 中
6
+ * CLI 工具会自动维护这个文件,通常不需要手动修改
7
+ */
8
+
9
+ import { registerModels, CONFIG_NAMES, type ModelsConfig } from "@lovrabet/sdk";
10
+
11
+ export const LOVRABET_APP_CODE = "{AppCode}";
12
+
13
+ /**
14
+ * 项目的模型配置
15
+ * 包含所有数据表的映射关系
16
+ */
17
+ export const LOVRABET_MODELS_CONFIG: ModelsConfig = {
18
+ appCode: LOVRABET_APP_CODE,
19
+ models: {{ModelConfigs}}
20
+ } as const;
21
+
22
+ /**
23
+ * 自动注册配置
24
+ * 配置名称: {ConfigName}
25
+ */
26
+ registerModels(LOVRABET_MODELS_CONFIG, {ConfigName});
27
+
28
+ /**
29
+ * 如果需要支持多项目或多环境,可以注册额外的配置:
30
+ *
31
+ * // 开发环境配置
32
+ * registerModels({
33
+ * appCode: 'app-dev-123',
34
+ * models: { ... }
35
+ * }, 'dev');
36
+ *
37
+ * // 其他项目配置
38
+ * registerModels({
39
+ * appCode: 'other-project',
40
+ * models: { ... }
41
+ * }, 'project-b');
42
+ */
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Lovrabet SDK 客户端实例
3
+ * Generated by Lovrabet CLI
4
+ * Created: {CreatedAt}
5
+ *
6
+ * 这个文件负责创建和导出统一的客户端实例,供整个应用使用
7
+ * 通过导入 './api' 文件来自动执行配置注册
8
+ */
9
+
10
+ import { createClient } from "@lovrabet/sdk";
11
+ import "./{ApiFileName}"; // 导入配置文件,执行 registerModels() 注册
12
+
13
+ /**
14
+ * 主要的客户端实例
15
+ * 使用配置名称 '{ConfigName}' 创建客户端
16
+ */
17
+ export const lovrabetClient = createClient({ClientConfigParam});
18
+
19
+ /**
20
+ * 使用示例:
21
+ *
22
+ * // 在组件中使用
23
+ * import { lovrabetClient } from '@/api/client';
24
+ *
25
+ * // 获取数据列表
26
+ * const data = await lovrabetClient.models.{ExampleModelName}.getList({
27
+ * currentPage: 1,
28
+ * pageSize: 20
29
+ * });
30
+ *
31
+ * // 获取单条记录
32
+ * const record = await lovrabetClient.models.{ExampleModelName}.getOne('123');
33
+ *
34
+ * // 创建新记录
35
+ * const newRecord = await lovrabetClient.models.{ExampleModelName}.create({
36
+ * // 记录数据
37
+ * });
38
+ */
39
+
40
+ /**
41
+ * 其他创建客户端的方式(根据需要选择):
42
+ *
43
+ * 1. 使用默认配置(无参数调用):
44
+ * export const lovrabetClient = createClient();
45
+ *
46
+ * 2. 使用其他已注册的配置:
47
+ * export const devClient = createClient('dev');
48
+ * export const prodClient = createClient('prod');
49
+ *
50
+ * 3. 直接传入配置对象:
51
+ * import { LOVRABET_MODELS_CONFIG } from './api';
52
+ * export const lovrabetClient = createClient(LOVRABET_MODELS_CONFIG);
53
+ *
54
+ * 4. 通过 ClientConfig 指定配置名和其他选项:
55
+ * export const lovrabetClient = createClient({
56
+ * apiConfigName: 'default',
57
+ * token: 'custom-token',
58
+ * env: 'daily'
59
+ * });
60
+ *
61
+ * 5. 多项目支持示例:
62
+ * export const projectAClient = createClient('project-a');
63
+ * export const projectBClient = createClient('project-b');
64
+ */
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generated by Lovrabet CLI
3
+ * Template: {TemplateName}
4
+ * Created: {CreatedAt}
5
+ * Page: {PageName}
6
+ */
7
+ import React from "react";
8
+
9
+ function {ComponentName}() {
10
+ return <div style={{ padding: "24px" }}>{DisplayTitle} 页面</div>;
11
+ }
12
+
13
+ export default {ComponentName};
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Generated by Lovrabet CLI
3
+ * Template: {TemplateName}
4
+ * Created: {CreatedAt}
5
+ * Page: {PageName}
6
+ */
7
+ import React, { useState, useEffect } from "react";
8
+ import { Card, Button, Space, Typography, Alert } from "antd";
9
+ import { ReloadOutlined, ApiOutlined } from "@ant-design/icons";
10
+ import { lovrabetClient } from "../../api/client";
11
+
12
+ const { Title, Paragraph, Text } = Typography;
13
+
14
+ function {ComponentName}() {
15
+ const [loading, setLoading] = useState(false);
16
+ const [data, setData] = useState<any[]>([]);
17
+
18
+ // SDK 调用示例
19
+ const fetchData = async () => {
20
+ setLoading(true);
21
+ try {
22
+ // TODO: 替换为实际的模型名称
23
+ const response = await lovrabetClient.models.YourModel.getList({
24
+ currentPage: 1,
25
+ pageSize: 10,
26
+ });
27
+ setData(response.tableData || []);
28
+ } catch (error) {
29
+ console.error("获取数据失败:", error);
30
+ } finally {
31
+ setLoading(false);
32
+ }
33
+ };
34
+
35
+ return (
36
+ <div style={{ padding: "24px" }}>
37
+ <Title level={2}>
38
+ <ApiOutlined /> {DisplayTitle}
39
+ </Title>
40
+ <Paragraph style={{ color: "#666", marginBottom: 24 }}>
41
+ 使用 lovrabetClient 调用 SDK 的示例页面
42
+ </Paragraph>
43
+
44
+ <Space direction="vertical" size="large" style={{ width: "100%" }}>
45
+ <Alert
46
+ message="SDK 调用示例"
47
+ description={
48
+ <div style={{ margin: "8px 0" }}>
49
+ <Text code>lovrabetClient.models.YourModel.getList()</Text> - 获取数据列表
50
+ <br />
51
+ <Text code>lovrabetClient.models.YourModel.create()</Text> - 创建数据
52
+ <br />
53
+ <Text code>lovrabetClient.models.YourModel.update()</Text> - 更新数据
54
+ <br />
55
+ <Text code>lovrabetClient.models.YourModel.delete()</Text> - 删除数据
56
+ </div>
57
+ }
58
+ type="info"
59
+ showIcon
60
+ />
61
+
62
+ <Card title="基础操作" size="small">
63
+ <Space>
64
+ <Button
65
+ type="primary"
66
+ icon={<ReloadOutlined />}
67
+ loading={loading}
68
+ onClick={fetchData}
69
+ >
70
+ 获取数据
71
+ </Button>
72
+ <Text type="secondary">数据条数: {data.length}</Text>
73
+ </Space>
74
+ </Card>
75
+
76
+ {/* 可以在这里添加更多功能 */}
77
+ </Space>
78
+ </div>
79
+ );
80
+ }
81
+
82
+ export default {ComponentName};
@@ -0,0 +1,3 @@
1
+ {
2
+ "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
3
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "eslint.validate": [
3
+ "javascript",
4
+ "javascriptreact",
5
+ "typescript",
6
+ "typescriptreact"
7
+ ],
8
+ "editor.formatOnSave": true,
9
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
10
+ "[javascript]": {
11
+ "editor.formatOnSave": true,
12
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
13
+ },
14
+ "[javascriptreact]": {
15
+ "editor.formatOnSave": true,
16
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
17
+ },
18
+ "[json]": {
19
+ "editor.formatOnSave": true,
20
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
21
+ },
22
+ "[typescript]": {
23
+ "editor.formatOnSave": true,
24
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
25
+ },
26
+ "[typescriptreact]": {
27
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
28
+ "editor.tabSize": 2
29
+ },
30
+ "[css]": {
31
+ "editor.codeActionsOnSave": {
32
+ "source.fixAll": "explicit"
33
+ },
34
+ "editor.formatOnSave": true,
35
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
36
+ },
37
+ "[scss]": {
38
+ "editor.codeActionsOnSave": {
39
+ "source.fixAll": "explicit"
40
+ },
41
+ "editor.formatOnSave": true,
42
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
43
+ },
44
+ "[shellscript]": {
45
+ "editor.defaultFormatter": "foxundermoon.shell-format"
46
+ },
47
+ "[properties]": {
48
+ "editor.defaultFormatter": "foxundermoon.shell-format"
49
+ },
50
+ "[dotenv]": {
51
+ "editor.defaultFormatter": "foxundermoon.shell-format"
52
+ },
53
+ "[ignore]": {
54
+ "editor.defaultFormatter": "foxundermoon.shell-format"
55
+ },
56
+ "cSpell.words": ["dbtable", "lovrabet", "lovrabetrc"]
57
+ }
@@ -0,0 +1,37 @@
1
+ # 更新记录
2
+
3
+ ## 2025-09-14
4
+
5
+ ### 🔧 实现自动路由生成
6
+
7
+ 引入 `vite-plugin-pages` 插件,基于文件系统自动生成路由配置。
8
+
9
+ **变更**:
10
+
11
+ - 新增 `vite-plugin-pages` 依赖
12
+ - 路由配置改用虚拟模块 `~react-pages`
13
+ - `HelloWorld.tsx` → `index.tsx` 作为默认首页
14
+
15
+ **使用**:
16
+
17
+ - `src/pages/index.tsx` → `/`
18
+ - `src/pages/table-display.tsx` → `/table-display`
19
+ - `src/pages/chart-fetch/index.tsx` → `/chart-fetch` (目录结构)
20
+
21
+ 支持文件和目录两种结构,新增页面只需在 `src/pages/` 下创建文件,无需手动配置路由。
22
+
23
+ ## 2025-09-12
24
+
25
+ ### 全面切换www.lovrabet.com域名
26
+
27
+ Lovrabet启用新品牌域名 Lovrabet.com,并为了简化API架构,我们将原有的 `smartapi/dbapi` 双调用方式统一为单一 api 接口,同时迁移域名并简化URL路径结构。
28
+
29
+ 快速替换指南:
30
+
31
+ 将所有的
32
+ `https://api.yuntooai.com/smartapi/runtime/[tenantCode]/`
33
+ `https://api.yuntooai.com/dbapi/runtime/[tenantCode]/`
34
+ 批量替换为
35
+ `https://runtime.lovrabet.com/api/`
36
+
37
+ 详情可查看 [Lovrabet API 地址规则变更通知](./docs/API_RULE_CHANGE.md)
@@ -0,0 +1,209 @@
1
+ [📝 项目更新记录 CHANGELOG](./CHANGELOG.md)
2
+
3
+ 注意:本项目会阶段性更新,如果git pull以后无法运行,可以删除 node_modules之后重新 npm install
4
+
5
+ # Lovrabet SDK React 演示项目
6
+
7
+ 项目展示了如何在现代 React 应用中集成 Lovrabet SDK,以及如何使用 icestark 微前端方案嵌入到 Lovrabet 主应用中。
8
+
9
+ ## 技术栈
10
+
11
+ - **@lovrabet/sdk** - Lovrabet 官方 SDK,支持现代化客户端实例管理
12
+ - **React 18** - 稳定的 React 版本,支持并发特性
13
+ - **TypeScript** - 类型安全的 JavaScript 超集
14
+ - **React Router v6** - 现代化的路由解决方案
15
+ - **Ant Design v5** - 企业级 UI 设计语言
16
+ - **Vite v7** - 下一代前端构建工具
17
+ - **icestark** - 阿里飞冰微前端框架
18
+ - **ECharts** - 数据可视化图表库
19
+
20
+ ## 项目结构
21
+
22
+ ```
23
+ ├── src/
24
+ │ ├── api/ # SDK 配置和客户端
25
+ │ │ ├── api.ts # CLI 生成的 SDK 配置文件
26
+ │ │ └── client.ts # SDK 客户端实例
27
+ │ ├── components/ # 通用组件
28
+ │ │ ├── ApiUrlDisplay.tsx # API URL 展示组件
29
+ │ │ └── PageHeader.tsx # 页面头部组件
30
+ │ ├── layouts/ # 布局组件
31
+ │ │ └── MainLayout.tsx
32
+ │ ├── pages/ # 页面组件(基于文件系统自动路由)
33
+ │ │ ├── index.tsx # 首页 - 项目概述(/ 路由)
34
+ │ │ ├── sdk-demo/ # SDK 演示页面
35
+ │ │ │ └── index.tsx # SDK 调用演示(/sdk-demo 路由)
36
+ │ │ ├── table-display.tsx # 表格展示(/table-display 路由)
37
+ │ │ ├── chart-fetch/ # 图表页面目录
38
+ │ │ │ └── index.tsx # 图表展示(/chart-fetch 路由)
39
+ │ │ └── dashboard/ # 仪表板页面
40
+ │ │ └── index.tsx # 数据看板(/dashboard 路由)
41
+ │ ├── router/ # 路由配置(自动生成)
42
+ │ │ └── index.tsx
43
+ │ ├── utils/ # 工具函数
44
+ │ │ └── api.ts # API 请求封装
45
+ │ ├── main.tsx # 微前端应用入口
46
+ │ ├── style.css # 全局样式
47
+ │ └── vite-env.d.ts # Vite 类型定义
48
+ ├── docs/ # 项目文档
49
+ │ └── API_RULE_CHANGE.md # API 变更指南
50
+ ├── vite.config.ts # Vite 配置文件(含微前端配置)
51
+ ├── tsconfig.json # TypeScript 配置
52
+ ├── CHANGELOG.md # 更新记录
53
+ └── package.json # 项目依赖
54
+ ```
55
+
56
+ ## 功能特性
57
+
58
+ - 🎯 **SDK 调用演示** - 展示 @lovrabet/sdk 的核心 CRUD 操作方法
59
+ - 🏠 **项目概述页** - 清晰介绍项目目的、功能和技术栈
60
+ - 📊 **数据图表** - 真实API调用的 ECharts 饼图,展示字段类型分布
61
+ - 📋 **数据表格** - 支持分页、排序、筛选的动态数据表格
62
+ - 📈 **仪表板展示** - 静态数据可视化演示页面
63
+ - 🚀 **自动路由生成** - 基于文件系统的约定式路由,零配置开发
64
+ - 🔌 **微前端支持** - 通过 icestark 实现与主应用的无缝集成
65
+ - 📱 **响应式设计** - 支持桌面端和移动端,自适应布局
66
+ - 🎨 **现代化 UI** - 基于 Ant Design v5 的美观界面
67
+ - ⚡ **极速构建** - Vite v7 + ES Modules,开发体验极佳
68
+ - 🧩 **组件复用** - 抽取通用组件如 PageHeader,提高代码复用性
69
+
70
+ ## 快速开始
71
+
72
+ ### 安装依赖
73
+
74
+ ```bash
75
+ npm install
76
+ ```
77
+
78
+ ### 开发模式
79
+
80
+ ```bash
81
+ npm run start
82
+ ```
83
+
84
+ 应用将在 `https://dev.lovrabet.com:5173` 启动(配置了HTTPS证书)
85
+ 说明:https://dev.lovrabet.com:${port} port不限5173端口,任意端口号都支持跨域
86
+
87
+ ### 微前端核心配置
88
+
89
+ 项目包含完整的微前端配置 (`vite.config.ts`):
90
+
91
+ - **icestark 集成**: 通过 `vite-plugin-index-html` 实现微前端打包
92
+ - **外部依赖**: React、ReactDOM、Ant Design 通过 CDN 加载
93
+ - **ES Modules 输出**: 支持主应用动态加载
94
+ - **HTTPS 支持**: 开发环境配置 HTTPS 证书,解决跨域问题
95
+ - **路径别名**: `@` 指向 `src` 目录
96
+
97
+ ### 构建生产版本
98
+
99
+ ```bash
100
+ npm run build
101
+ ```
102
+
103
+ ### 预览生产版本
104
+
105
+ ```bash
106
+ npm run preview
107
+ ```
108
+
109
+ ## 开发指南
110
+
111
+ ### SDK 集成使用
112
+
113
+ 项目展示了如何正确集成和使用 @lovrabet/sdk:
114
+
115
+ 1. **SDK 配置文件** (`src/api/api.ts`):
116
+ - 通过 Lovrabet CLI 自动生成
117
+ - 包含应用代码和模型配置
118
+ - 自动注册到 SDK 的配置管理器
119
+
120
+ 2. **客户端实例** (`src/api/client.ts`):
121
+ - 导入配置文件执行注册
122
+ - 使用 `createClient()` 创建客户端实例
123
+ - 导出供整个应用使用
124
+
125
+ 3. **SDK 调用示例** (`src/pages/sdk-demo/index.tsx`):
126
+ - 展示 `getList()` 获取数据列表
127
+ - 展示 `create()` 创建新数据
128
+ - 包含完整的错误处理
129
+
130
+ **典型使用模式**:
131
+
132
+ ```typescript
133
+ // 获取数据列表
134
+ const data = await lovrabetClient.models.Requirements.getList({
135
+ currentPage: 1,
136
+ pageSize: 20,
137
+ });
138
+
139
+ // 创建新数据
140
+ await lovrabetClient.models.Requirements.create({
141
+ title: "需求标题",
142
+ description: "需求描述",
143
+ });
144
+ ```
145
+
146
+ ### 微前端集成要点
147
+
148
+ 1. **入口文件配置** (`src/main.tsx`):
149
+ - 导出 `mount` 和 `unmount` 生命周期函数
150
+ - 使用 `isInIcestark()` 判断运行环境
151
+ - 支持接收主应用传递的 `customProps`
152
+
153
+ 2. **自动路由配置** (`src/router/index.tsx`):
154
+ - 使用 `vite-plugin-pages` 实现基于文件系统的约定式路由
155
+ - 使用 `getBasename()` 获取动态 basename
156
+ - 支持微应用内部路由跳转和嵌套路由
157
+
158
+ 3. **构建配置** (`vite.config.ts`):
159
+ - 使用 `vite-plugin-pages` 实现自动路由生成
160
+ - 使用 `vite-plugin-index-html` 插件支持微前端打包
161
+ - 配置 ES modules 输出格式,支持 Tree Shaking
162
+ - 外部化公共依赖减小包体积,CDN 友好
163
+ - HTTPS 开发环境,解决跨域问题
164
+
165
+ ### 约定式路由使用指南
166
+
167
+ 基于 `vite-plugin-pages` 的文件系统路由,支持以下约定:
168
+
169
+ **文件路由映射**:
170
+
171
+ - `src/pages/index.tsx` → `/` (首页 - 项目概述)
172
+ - `src/pages/sdk-demo/index.tsx` → `/sdk-demo` (SDK 调用演示)
173
+ - `src/pages/table-display.tsx` → `/table-display` (数据表格展示)
174
+ - `src/pages/chart-fetch/index.tsx` → `/chart-fetch` (图表数据获取)
175
+ - `src/pages/dashboard/index.tsx` → `/dashboard` (数据可视化仪表板)
176
+
177
+ **动态路由**:
178
+
179
+ - `src/pages/[id].tsx` → `/:id`
180
+ - `src/pages/user/[userId]/profile.tsx` → `/user/:userId/profile`
181
+
182
+ **嵌套路由**:
183
+
184
+ - 使用目录结构创建嵌套路由
185
+ - 支持 `layout.tsx` 文件作为嵌套布局
186
+
187
+ **新增页面**:
188
+ 只需在 `src/pages/` 目录下创建 `.tsx` 文件,路由会自动生成,无需手动配置。
189
+
190
+ ### 样式规范
191
+
192
+ - 优先使用 Ant Design 组件
193
+ - 自定义样式使用 CSS 或 styled-components
194
+ - 响应式设计支持移动端
195
+
196
+ ## 部署
197
+
198
+ 项目使用 Vite 构建,可以部署到任何静态文件服务器:
199
+
200
+ - Vercel
201
+ - Netlify
202
+ - GitHub Pages
203
+ - 阿里云 OSS
204
+ - 腾讯云 COS
205
+
206
+ ## 文档链接
207
+
208
+ - [开发者手册 quick-start](./docs/quick-start.md)
209
+ - [更新记录 CHANGELOG](./CHANGELOG.md)