@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,89 +1,97 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Title:
|
|
2
|
+
* Title: 子应用启动台
|
|
3
3
|
*/
|
|
4
4
|
import React from "react";
|
|
5
|
+
import { Link } from "react-router-dom";
|
|
6
|
+
import { Alert, Button, Card, Space, Tag, Typography } from "antd";
|
|
5
7
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Row,
|
|
9
|
-
Col,
|
|
10
|
-
Button,
|
|
11
|
-
Tabs,
|
|
12
|
-
Alert,
|
|
13
|
-
Space,
|
|
14
|
-
Tag,
|
|
15
|
-
} from "antd";
|
|
16
|
-
import {
|
|
17
|
-
CodeOutlined,
|
|
18
|
-
RobotOutlined,
|
|
19
|
-
ToolOutlined,
|
|
20
|
-
BookOutlined,
|
|
8
|
+
ApiOutlined,
|
|
9
|
+
AppstoreOutlined,
|
|
21
10
|
ArrowRightOutlined,
|
|
22
|
-
|
|
11
|
+
BarChartOutlined,
|
|
12
|
+
BookOutlined,
|
|
13
|
+
CheckCircleOutlined,
|
|
23
14
|
CheckOutlined,
|
|
15
|
+
CloudUploadOutlined,
|
|
16
|
+
CodeOutlined,
|
|
17
|
+
CopyOutlined,
|
|
18
|
+
DashboardOutlined,
|
|
19
|
+
DatabaseOutlined,
|
|
20
|
+
DeploymentUnitOutlined,
|
|
21
|
+
LinkOutlined,
|
|
22
|
+
PlayCircleOutlined,
|
|
24
23
|
RocketOutlined,
|
|
25
|
-
|
|
24
|
+
SettingOutlined,
|
|
25
|
+
ToolOutlined,
|
|
26
|
+
WarningOutlined,
|
|
26
27
|
} from "@ant-design/icons";
|
|
28
|
+
import styles from "./index.module.css";
|
|
27
29
|
|
|
28
30
|
const { Title, Paragraph, Text } = Typography;
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
interface CopyableCodeProps {
|
|
33
|
+
code: string;
|
|
34
|
+
label: string;
|
|
35
|
+
compact?: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function CopyableCode({ code, label, compact = false }: CopyableCodeProps) {
|
|
32
39
|
const [copied, setCopied] = React.useState(false);
|
|
33
40
|
|
|
34
41
|
const handleCopy = async () => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
try {
|
|
43
|
+
if (navigator.clipboard?.writeText) {
|
|
44
|
+
await navigator.clipboard.writeText(code);
|
|
45
|
+
}
|
|
46
|
+
setCopied(true);
|
|
47
|
+
window.setTimeout(() => setCopied(false), 2000);
|
|
48
|
+
} catch (err) {
|
|
49
|
+
console.error("复制失败:", err);
|
|
50
|
+
}
|
|
38
51
|
};
|
|
39
52
|
|
|
40
53
|
return (
|
|
41
|
-
<div
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
marginBottom: 8,
|
|
48
|
-
}}
|
|
49
|
-
>
|
|
54
|
+
<div
|
|
55
|
+
className={`${styles.copyBlock} ${
|
|
56
|
+
compact ? styles.copyBlockCompact : ""
|
|
57
|
+
}`}
|
|
58
|
+
>
|
|
59
|
+
<div className={styles.copyHeader}>
|
|
50
60
|
<Text type="secondary">{label}</Text>
|
|
51
61
|
<Button
|
|
52
|
-
type="primary"
|
|
53
62
|
size="small"
|
|
54
63
|
icon={copied ? <CheckOutlined /> : <CopyOutlined />}
|
|
55
64
|
onClick={handleCopy}
|
|
65
|
+
className={styles.copyButton}
|
|
56
66
|
>
|
|
57
67
|
{copied ? "已复制" : "复制"}
|
|
58
68
|
</Button>
|
|
59
69
|
</div>
|
|
60
|
-
<pre
|
|
61
|
-
style={{
|
|
62
|
-
background: "#1e1e1e",
|
|
63
|
-
borderRadius: 8,
|
|
64
|
-
padding: "16px 20px",
|
|
65
|
-
margin: 0,
|
|
66
|
-
fontFamily: "'JetBrains Mono', 'Monaco', monospace",
|
|
67
|
-
fontSize: 13,
|
|
68
|
-
lineHeight: 1.6,
|
|
69
|
-
color: "#e4e4e7",
|
|
70
|
-
overflowX: "auto",
|
|
71
|
-
}}
|
|
72
|
-
>
|
|
70
|
+
<pre className={styles.copyPre}>
|
|
73
71
|
<code>{code}</code>
|
|
74
72
|
</pre>
|
|
75
73
|
</div>
|
|
76
74
|
);
|
|
77
75
|
}
|
|
78
76
|
|
|
79
|
-
// 从 api.ts 提取 appCode
|
|
80
77
|
function getAppCodeFromApi(content: string): string | null {
|
|
81
78
|
const match =
|
|
82
79
|
content.match(/RABETBASE_APP_CODE\s*=\s*["']([^"']+)["']/) ||
|
|
80
|
+
content.match(/LOVRABET_APP_CODE\s*=\s*["']([^"']+)["']/) ||
|
|
83
81
|
content.match(/appCode:\s*["']([^"']+)["']/);
|
|
84
82
|
return match ? match[1] : null;
|
|
85
83
|
}
|
|
86
84
|
|
|
85
|
+
const feishuDocs = {
|
|
86
|
+
root: "https://qizhiyuntu.feishu.cn/wiki/EaApwb1Wpi2j0ykAkhNcya0ZnEh",
|
|
87
|
+
onboarding:
|
|
88
|
+
"https://qizhiyuntu.feishu.cn/wiki/T5gJwrcQqixLCikNYO2caZYDnsc",
|
|
89
|
+
core: "https://qizhiyuntu.feishu.cn/wiki/S71hw5c2HiwyoHkLgyecKrI8n3M",
|
|
90
|
+
systemPageSdk:
|
|
91
|
+
"https://qizhiyuntu.feishu.cn/wiki/XCdWwnN7ViYOc0knRu8c411uneh",
|
|
92
|
+
sdk: "https://qizhiyuntu.feishu.cn/wiki/B1PLw34AwiDtNmkCAlCcO3T2ngh",
|
|
93
|
+
};
|
|
94
|
+
|
|
87
95
|
function HomePage() {
|
|
88
96
|
const [appCode, setAppCode] = React.useState<string | null>(null);
|
|
89
97
|
const [loading, setLoading] = React.useState(true);
|
|
@@ -112,355 +120,521 @@ function HomePage() {
|
|
|
112
120
|
loadAppCode();
|
|
113
121
|
}, []);
|
|
114
122
|
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
const mcpConfig = `{
|
|
120
|
-
"mcpServers": {
|
|
121
|
-
"lovrabet-dataset": {
|
|
122
|
-
"command": "npx",
|
|
123
|
-
"args": ["-y", "@lovrabet/dataset-mcp-server"],
|
|
124
|
-
"env": {
|
|
125
|
-
"RABETBASE_APP_CODE": "${displayAppCode}"
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}`;
|
|
123
|
+
const isConfigured = !loading && appCode !== null && appCode !== "NOT-SET";
|
|
124
|
+
const displayAppCode = isConfigured ? appCode : "your-app-code";
|
|
125
|
+
const statusLabel = loading ? "读取中" : isConfigured ? "已配置" : "待配置";
|
|
130
126
|
|
|
131
|
-
const
|
|
132
|
-
|
|
127
|
+
const setupPrompt = `请帮我检查当前 Lovrabet React 子应用的项目配置。
|
|
128
|
+
确认 AppCode、.rabetbase.json、SDK 模型文件和 src/api/client.ts 是否完整。
|
|
129
|
+
如果缺少配置,请按当前项目情况补齐,并告诉我可以用于页面开发的数据模型。`;
|
|
133
130
|
|
|
134
|
-
|
|
135
|
-
lovrabet menu sync`;
|
|
131
|
+
const agentSurfaces = ["Claude Code", "Cursor", "Codex"];
|
|
136
132
|
|
|
137
|
-
const
|
|
133
|
+
const docLinks = [
|
|
138
134
|
{
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
</span>
|
|
144
|
-
),
|
|
145
|
-
children: (
|
|
146
|
-
<div>
|
|
147
|
-
<Paragraph>claude code 配置:</Paragraph>
|
|
148
|
-
<Paragraph style={{ fontSize: 12, color: "#666" }}>
|
|
149
|
-
配置文件路径:
|
|
150
|
-
<br />
|
|
151
|
-
macOS: ~/Library/Application
|
|
152
|
-
Support/Claude/claude_desktop_config.json
|
|
153
|
-
<br />
|
|
154
|
-
Windows: %APPDATA%/Claude/claude_desktop_config.json
|
|
155
|
-
</Paragraph>
|
|
156
|
-
<CopyableCode code={mcpConfig} label="claude_desktop_config.json" />
|
|
157
|
-
|
|
158
|
-
<Paragraph style={{ marginTop: 16 }}>Cursor 配置:</Paragraph>
|
|
159
|
-
<Paragraph style={{ fontSize: 12, color: "#666" }}>
|
|
160
|
-
设置 → MCP → 添加服务器
|
|
161
|
-
</Paragraph>
|
|
162
|
-
<CopyableCode
|
|
163
|
-
code={`// Cursor MCP 配置
|
|
164
|
-
{
|
|
165
|
-
"mcpServers": {
|
|
166
|
-
"lovrabet-dataset": {
|
|
167
|
-
"command": "npx",
|
|
168
|
-
"args": ["-y", "@lovrabet/dataset-mcp-server"],
|
|
169
|
-
"env": {
|
|
170
|
-
"RABETBASE_APP_CODE": "${displayAppCode}"
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}`}
|
|
175
|
-
label="Cursor MCP 配置"
|
|
176
|
-
/>
|
|
177
|
-
|
|
178
|
-
<Paragraph style={{ marginTop: 16 }}>
|
|
179
|
-
Claude Code (VS Code 扩展):
|
|
180
|
-
</Paragraph>
|
|
181
|
-
<CopyableCode
|
|
182
|
-
code={`claude mcp add lovrabet-dataset npx @lovrabet/dataset-mcp-server@latest -e RABETBASE_APP_CODE=${displayAppCode}`}
|
|
183
|
-
label="Claude Code 终端命令"
|
|
184
|
-
/>
|
|
185
|
-
|
|
186
|
-
<Button
|
|
187
|
-
type="link"
|
|
188
|
-
href="https://open.lovrabet.com/docs/mcp/intro"
|
|
189
|
-
target="_blank"
|
|
190
|
-
>
|
|
191
|
-
查看完整文档 <ArrowRightOutlined />
|
|
192
|
-
</Button>
|
|
193
|
-
</div>
|
|
194
|
-
),
|
|
135
|
+
title: "Rabetbase CLI 文库",
|
|
136
|
+
description: "从上手路径进入完整研发能力目录。",
|
|
137
|
+
url: feishuDocs.root,
|
|
138
|
+
icon: <BookOutlined />,
|
|
195
139
|
},
|
|
196
140
|
{
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
<Button
|
|
208
|
-
type="link"
|
|
209
|
-
href="https://open.lovrabet.com/docs/lovrabet-cli/quickstart"
|
|
210
|
-
target="_blank"
|
|
211
|
-
>
|
|
212
|
-
查看完整文档 <ArrowRightOutlined />
|
|
213
|
-
</Button>
|
|
214
|
-
</div>
|
|
215
|
-
),
|
|
141
|
+
title: "系统页面开发",
|
|
142
|
+
description: "用 SDK 开发列表页、详情页、表单和看板。",
|
|
143
|
+
url: feishuDocs.systemPageSdk,
|
|
144
|
+
icon: <CodeOutlined />,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
title: "TypeScript SDK",
|
|
148
|
+
description: "查看模型客户端、数据读写和类型使用方式。",
|
|
149
|
+
url: feishuDocs.sdk,
|
|
150
|
+
icon: <ApiOutlined />,
|
|
216
151
|
},
|
|
217
152
|
];
|
|
218
153
|
|
|
219
|
-
const
|
|
154
|
+
const taskGuides = [
|
|
220
155
|
{
|
|
221
|
-
title: "
|
|
156
|
+
title: "刚创建项目",
|
|
157
|
+
description: "确认项目结构、AppCode、SDK 模型和本地启动方式。",
|
|
158
|
+
action: "查看入门与上手",
|
|
159
|
+
url: feishuDocs.onboarding,
|
|
222
160
|
icon: <RocketOutlined />,
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
title: "开发客户列表页",
|
|
164
|
+
description: "让 Agent 基于数据模型生成筛选、表格、详情和表单。",
|
|
165
|
+
action: "查看页面开发",
|
|
166
|
+
url: feishuDocs.systemPageSdk,
|
|
167
|
+
icon: <CodeOutlined />,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
title: "调用 SDK 读写数据",
|
|
171
|
+
description: "确认模型别名、字段类型、filter、getOne 和写入接口。",
|
|
172
|
+
action: "查看 SDK 文档",
|
|
173
|
+
url: feishuDocs.sdk,
|
|
174
|
+
icon: <ApiOutlined />,
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
title: "做统计和看板",
|
|
178
|
+
description: "把客户活跃度、跟进转化和销售机会做成指标视图。",
|
|
179
|
+
action: "查看核心能力",
|
|
180
|
+
url: feishuDocs.core,
|
|
181
|
+
icon: <BarChartOutlined />,
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
title: "封装服务端逻辑",
|
|
185
|
+
description: "把稳定的写入、校验或聚合操作沉淀成可复用能力。",
|
|
186
|
+
action: "查看核心能力",
|
|
187
|
+
url: feishuDocs.core,
|
|
188
|
+
icon: <DeploymentUnitOutlined />,
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
title: "构建并发布",
|
|
192
|
+
description: "检查构建产物、页面配置、菜单、路由和主应用接入。",
|
|
193
|
+
action: "查看发布路径",
|
|
194
|
+
url: feishuDocs.core,
|
|
195
|
+
icon: <CloudUploadOutlined />,
|
|
196
|
+
},
|
|
197
|
+
];
|
|
198
|
+
|
|
199
|
+
const promptCards = [
|
|
200
|
+
{
|
|
201
|
+
title: "检查项目上下文",
|
|
202
|
+
description:
|
|
203
|
+
"让 Agent 识别 AppCode、项目配置和 SDK 模型,后续开发不再手动查接口。",
|
|
204
|
+
icon: <SettingOutlined />,
|
|
205
|
+
tags: ["项目配置", "模型同步"],
|
|
206
|
+
prompt: setupPrompt,
|
|
207
|
+
commands: [
|
|
208
|
+
"rabetbase project init",
|
|
209
|
+
"rabetbase config get",
|
|
210
|
+
"rabetbase api pull",
|
|
233
211
|
],
|
|
212
|
+
docUrl: feishuDocs.onboarding,
|
|
213
|
+
docLabel: "入门与上手",
|
|
234
214
|
},
|
|
235
215
|
{
|
|
236
|
-
title: "
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
216
|
+
title: "开发客户列表页",
|
|
217
|
+
description:
|
|
218
|
+
"用真实 CRM 场景描述页面目标,让 Agent 生成列表、筛选和详情交互。",
|
|
219
|
+
icon: <PlayCircleOutlined />,
|
|
220
|
+
tags: ["页面开发", "SDK 接入"],
|
|
221
|
+
prompt: `请在当前 React 子应用里开发一个客户列表页。
|
|
222
|
+
页面需要支持按客户名称、负责人、客户等级和最近跟进时间筛选。
|
|
223
|
+
列表展示客户名称、联系人、负责人、客户等级、最近跟进时间和状态。
|
|
224
|
+
点击客户后打开详情抽屉,详情数据和列表数据都使用 @lovrabet/sdk。`,
|
|
225
|
+
commands: [
|
|
226
|
+
"rabetbase api pull",
|
|
227
|
+
"rabetbase dataset list",
|
|
228
|
+
"rabetbase dataset detail",
|
|
229
|
+
],
|
|
230
|
+
docUrl: feishuDocs.systemPageSdk,
|
|
231
|
+
docLabel: "系统页面开发",
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
title: "接入客户编辑表单",
|
|
235
|
+
description: "在列表页基础上补齐新增、编辑和字段校验,形成完整业务闭环。",
|
|
236
|
+
icon: <CodeOutlined />,
|
|
237
|
+
tags: ["表单开发", "写入校验"],
|
|
238
|
+
prompt: `请给客户列表页增加新增客户和编辑客户能力。
|
|
239
|
+
先确认客户模型里可写字段、必填字段和选项字段。
|
|
240
|
+
表单需要包含客户名称、联系人、联系电话、客户等级、负责人和备注。
|
|
241
|
+
提交后使用 @lovrabet/sdk 写入数据,并刷新列表。`,
|
|
242
|
+
commands: [
|
|
243
|
+
"rabetbase dataset detail",
|
|
244
|
+
"rabetbase dataset operations",
|
|
245
|
+
"rabetbase api pull",
|
|
256
246
|
],
|
|
247
|
+
docUrl: feishuDocs.sdk,
|
|
248
|
+
docLabel: "TypeScript SDK",
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
title: "改造销售看板",
|
|
252
|
+
description: "把示例看板变成客户活跃度、跟进转化和销售机会分析页。",
|
|
253
|
+
icon: <DashboardOutlined />,
|
|
254
|
+
tags: ["二次开发", "统计看板"],
|
|
255
|
+
prompt: `请把 /dashboard 改造成销售客户看板。
|
|
256
|
+
先读取当前 SDK 模型配置,确认客户、跟进记录和销售机会可用字段。
|
|
257
|
+
页面展示客户总数、本周新增客户、待跟进客户、销售机会金额和最近跟进列表。
|
|
258
|
+
不要写死模拟接口,优先使用项目里的 SDK 客户端。`,
|
|
259
|
+
commands: [
|
|
260
|
+
"rabetbase api pull",
|
|
261
|
+
"rabetbase dataset detail",
|
|
262
|
+
"rabetbase run build",
|
|
263
|
+
],
|
|
264
|
+
docUrl: feishuDocs.systemPageSdk,
|
|
265
|
+
docLabel: "系统页面开发",
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
title: "发布接入主应用",
|
|
269
|
+
description:
|
|
270
|
+
"让 Agent 检查构建产物、Lovrabet 主应用接入方式、菜单和路由配置。",
|
|
271
|
+
icon: <DeploymentUnitOutlined />,
|
|
272
|
+
tags: ["构建检查", "主应用接入"],
|
|
273
|
+
prompt: `请检查这个 React 子应用是否可以接入 Lovrabet 主应用。
|
|
274
|
+
确认构建产物、页面路由、basename、菜单同步和 import 加载配置。
|
|
275
|
+
如果发现缺口,请直接修复或列出需要我确认的项。`,
|
|
276
|
+
commands: [
|
|
277
|
+
"rabetbase run build",
|
|
278
|
+
"rabetbase run preview",
|
|
279
|
+
"rabetbase menu sync",
|
|
280
|
+
],
|
|
281
|
+
docUrl: feishuDocs.core,
|
|
282
|
+
docLabel: "核心研发能力",
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
|
|
286
|
+
const pageEntries = [
|
|
287
|
+
{
|
|
288
|
+
title: "SDK 演示",
|
|
289
|
+
path: "/sdk-demo",
|
|
290
|
+
description:
|
|
291
|
+
"集中验证 filter、getOne、create、update、delete 等 SDK 调用。",
|
|
292
|
+
icon: <ApiOutlined />,
|
|
293
|
+
tags: ["SDK", "API"],
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
title: "工作台",
|
|
297
|
+
path: "/workbench",
|
|
298
|
+
description: "面向日常运营的概览页结构,适合扩展成业务人员首页。",
|
|
299
|
+
icon: <DashboardOutlined />,
|
|
300
|
+
tags: ["运营", "概览"],
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
title: "数据看板",
|
|
304
|
+
path: "/dashboard",
|
|
305
|
+
description: "用图表和指标卡展示业务数据,适合作为管理驾驶舱起点。",
|
|
306
|
+
icon: <DatabaseOutlined />,
|
|
307
|
+
tags: ["图表", "指标"],
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
title: "数据大屏",
|
|
311
|
+
path: "/data-screen",
|
|
312
|
+
description: "全屏展示型页面示例,适合投屏、会议室和实时监控场景。",
|
|
313
|
+
icon: <BarChartOutlined />,
|
|
314
|
+
tags: ["大屏", "实时"],
|
|
257
315
|
},
|
|
258
316
|
];
|
|
259
317
|
|
|
318
|
+
const integrationSteps = [
|
|
319
|
+
"让 Agent 确认当前项目上下文里已有 AppCode。",
|
|
320
|
+
"让 Agent 刷新 SDK 类型,保持本地模型与平台数据模型一致。",
|
|
321
|
+
"让 Agent 构建并检查可发布到 CDN 的静态产物。",
|
|
322
|
+
"在 Lovrabet 主应用新增或更新页面,选择 import 接入方式。",
|
|
323
|
+
"让 Agent 核对菜单、路由、basename 和主应用访问路径。",
|
|
324
|
+
];
|
|
325
|
+
|
|
260
326
|
return (
|
|
261
|
-
<
|
|
262
|
-
{
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
基于 Lovrabet 平台的后端即服务(BaaS)
|
|
279
|
-
</Paragraph>
|
|
327
|
+
<main className={styles.homepage}>
|
|
328
|
+
<section className={styles.hero}>
|
|
329
|
+
<div className={styles.heroCopy}>
|
|
330
|
+
<Tag color="blue" icon={<RocketOutlined />}>
|
|
331
|
+
Agent-first Rabetbase Template
|
|
332
|
+
</Tag>
|
|
333
|
+
<Title level={1} className={styles.heroTitle}>
|
|
334
|
+
用 Agent 开发 Lovrabet React 子应用
|
|
335
|
+
</Title>
|
|
336
|
+
<Paragraph className={styles.heroText}>
|
|
337
|
+
这是可运行的 React 微前端模板。描述页面目标,Agent
|
|
338
|
+
会读取项目上下文、调用 SDK、改页面并完成构建检查。
|
|
339
|
+
</Paragraph>
|
|
340
|
+
<div className={styles.surfaceRow}>
|
|
341
|
+
{agentSurfaces.map((name) => (
|
|
342
|
+
<Tag key={name}>{name}</Tag>
|
|
343
|
+
))}
|
|
280
344
|
</div>
|
|
281
|
-
<Space size=
|
|
282
|
-
<
|
|
283
|
-
|
|
345
|
+
<Space size={12} wrap className={styles.heroActions}>
|
|
346
|
+
<Link to="/sdk-demo">
|
|
347
|
+
<Button type="primary" icon={<ApiOutlined />}>
|
|
348
|
+
查看 SDK 演示
|
|
349
|
+
</Button>
|
|
350
|
+
</Link>
|
|
351
|
+
<Button
|
|
352
|
+
href={feishuDocs.systemPageSdk}
|
|
284
353
|
target="_blank"
|
|
285
354
|
rel="noopener noreferrer"
|
|
355
|
+
icon={<BookOutlined />}
|
|
286
356
|
>
|
|
287
|
-
|
|
288
|
-
</
|
|
289
|
-
<
|
|
290
|
-
href=
|
|
357
|
+
页面开发文档
|
|
358
|
+
</Button>
|
|
359
|
+
<Button
|
|
360
|
+
href={feishuDocs.sdk}
|
|
291
361
|
target="_blank"
|
|
292
362
|
rel="noopener noreferrer"
|
|
363
|
+
icon={<LinkOutlined />}
|
|
293
364
|
>
|
|
294
|
-
|
|
295
|
-
</
|
|
296
|
-
{
|
|
297
|
-
<
|
|
365
|
+
SDK 文档
|
|
366
|
+
</Button>
|
|
367
|
+
{isConfigured && appCode && (
|
|
368
|
+
<Button
|
|
298
369
|
href={`https://app.lovrabet.com/app/${appCode}/data/intro/`}
|
|
299
370
|
target="_blank"
|
|
300
|
-
|
|
371
|
+
icon={<AppstoreOutlined />}
|
|
301
372
|
>
|
|
302
373
|
应用配置后台
|
|
303
|
-
</
|
|
374
|
+
</Button>
|
|
304
375
|
)}
|
|
305
376
|
</Space>
|
|
306
377
|
</div>
|
|
307
|
-
</div>
|
|
308
378
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
<strong>Rabetbase 是 Lovrabet 面向技术岗位的开发者平台。</strong>
|
|
320
|
-
<br />
|
|
321
|
-
Lovrabet 工作台让业务人员用 AI
|
|
322
|
-
生成管理系统,但有些个性化需求(如小程序、ERP
|
|
323
|
-
对接、复杂业务逻辑)需要开发者介入。 Rabetbase 把 Lovrabet
|
|
324
|
-
平台的数据能力开放出来,让开发者专注于写业务逻辑。
|
|
325
|
-
</Paragraph>
|
|
326
|
-
<Space wrap>
|
|
327
|
-
<Button
|
|
328
|
-
size="small"
|
|
329
|
-
href="https://open.lovrabet.com/docs/category/openapi"
|
|
330
|
-
target="_blank"
|
|
331
|
-
>
|
|
332
|
-
OpenAPI
|
|
333
|
-
</Button>
|
|
334
|
-
<Button
|
|
335
|
-
size="small"
|
|
336
|
-
href="https://open.lovrabet.com/docs/category/lovrabet-node-sdk"
|
|
337
|
-
target="_blank"
|
|
338
|
-
>
|
|
339
|
-
TypeScript SDK
|
|
340
|
-
</Button>
|
|
341
|
-
<Button
|
|
342
|
-
size="small"
|
|
343
|
-
href="https://open.lovrabet.com/docs/category/java-opensdk"
|
|
344
|
-
target="_blank"
|
|
345
|
-
>
|
|
346
|
-
Java SDK
|
|
347
|
-
</Button>
|
|
348
|
-
<Button
|
|
349
|
-
size="small"
|
|
350
|
-
href="https://open.lovrabet.com/docs/mcp/intro"
|
|
351
|
-
target="_blank"
|
|
352
|
-
>
|
|
353
|
-
MCP
|
|
354
|
-
</Button>
|
|
355
|
-
<Button
|
|
356
|
-
size="small"
|
|
357
|
-
href="https://open.lovrabet.com/docs/lovrabet-cli/"
|
|
358
|
-
target="_blank"
|
|
359
|
-
>
|
|
360
|
-
CLI 工具
|
|
361
|
-
</Button>
|
|
362
|
-
</Space>
|
|
363
|
-
</Col>
|
|
364
|
-
<Col xs={24} lg={8}>
|
|
365
|
-
<div
|
|
366
|
-
style={{
|
|
367
|
-
background: "#f5f5f5",
|
|
368
|
-
borderRadius: 8,
|
|
369
|
-
padding: 20,
|
|
370
|
-
}}
|
|
379
|
+
<aside className={styles.statusPanel}>
|
|
380
|
+
<div className={styles.statusHeader}>
|
|
381
|
+
<div>
|
|
382
|
+
<Text type="secondary">项目状态</Text>
|
|
383
|
+
<Title level={2}>项目上下文</Title>
|
|
384
|
+
</div>
|
|
385
|
+
<Tag
|
|
386
|
+
color={
|
|
387
|
+
loading ? "processing" : isConfigured ? "success" : "warning"
|
|
388
|
+
}
|
|
371
389
|
>
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
+
{statusLabel}
|
|
391
|
+
</Tag>
|
|
392
|
+
</div>
|
|
393
|
+
<div className={styles.statusCode}>
|
|
394
|
+
<Text type="secondary">AppCode</Text>
|
|
395
|
+
<strong>{loading ? "读取中" : displayAppCode}</strong>
|
|
396
|
+
</div>
|
|
397
|
+
<div className={styles.statusGrid}>
|
|
398
|
+
<div>
|
|
399
|
+
<Text type="secondary">API 文件</Text>
|
|
400
|
+
<strong>src/api/api.ts</strong>
|
|
401
|
+
</div>
|
|
402
|
+
<div>
|
|
403
|
+
<Text type="secondary">路由模式</Text>
|
|
404
|
+
<strong>src/pages 自动路由</strong>
|
|
405
|
+
</div>
|
|
406
|
+
<div>
|
|
407
|
+
<Text type="secondary">SDK 客户端</Text>
|
|
408
|
+
<strong>src/api/client.ts</strong>
|
|
409
|
+
</div>
|
|
410
|
+
<div>
|
|
411
|
+
<Text type="secondary">推荐下一步</Text>
|
|
412
|
+
<strong>开发客户列表页</strong>
|
|
390
413
|
</div>
|
|
391
|
-
</
|
|
392
|
-
|
|
393
|
-
|
|
414
|
+
</div>
|
|
415
|
+
<div className={styles.statusLinks}>
|
|
416
|
+
<Button
|
|
417
|
+
block
|
|
418
|
+
href={feishuDocs.systemPageSdk}
|
|
419
|
+
target="_blank"
|
|
420
|
+
rel="noopener noreferrer"
|
|
421
|
+
icon={<BookOutlined />}
|
|
422
|
+
>
|
|
423
|
+
系统页面开发文档
|
|
424
|
+
</Button>
|
|
425
|
+
<Button
|
|
426
|
+
block
|
|
427
|
+
href={feishuDocs.root}
|
|
428
|
+
target="_blank"
|
|
429
|
+
rel="noopener noreferrer"
|
|
430
|
+
icon={<LinkOutlined />}
|
|
431
|
+
>
|
|
432
|
+
Rabetbase 文库首页
|
|
433
|
+
</Button>
|
|
434
|
+
</div>
|
|
435
|
+
</aside>
|
|
436
|
+
</section>
|
|
394
437
|
|
|
395
|
-
{
|
|
396
|
-
{isNotSet && !loading && (
|
|
438
|
+
{!loading && !isConfigured && (
|
|
397
439
|
<Alert
|
|
398
440
|
type="warning"
|
|
399
|
-
|
|
441
|
+
showIcon
|
|
442
|
+
icon={<WarningOutlined />}
|
|
443
|
+
className={styles.setupAlert}
|
|
400
444
|
message="项目尚未配置 AppCode"
|
|
401
445
|
description={
|
|
402
|
-
<div
|
|
403
|
-
<Paragraph
|
|
404
|
-
|
|
405
|
-
|
|
446
|
+
<div className={styles.alertBody}>
|
|
447
|
+
<Paragraph>
|
|
448
|
+
直接把下面这段话发给 Claude Code、Cursor 或 Codex。Agent
|
|
449
|
+
会根据项目情况补齐配置并刷新 SDK 模型。
|
|
406
450
|
</Paragraph>
|
|
407
451
|
<CopyableCode
|
|
408
|
-
code={
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
# 2. 拉取 API 配置
|
|
412
|
-
lovrabet api pull`}
|
|
413
|
-
label="初始化命令"
|
|
452
|
+
code={setupPrompt}
|
|
453
|
+
label="可直接输入的 Prompt"
|
|
454
|
+
compact
|
|
414
455
|
/>
|
|
415
|
-
<Paragraph style={{ marginBottom: 0 }}>
|
|
416
|
-
执行完成后刷新页面即可。
|
|
417
|
-
</Paragraph>
|
|
418
456
|
</div>
|
|
419
457
|
}
|
|
420
|
-
style={{ marginBottom: 24 }}
|
|
421
458
|
/>
|
|
422
459
|
)}
|
|
423
460
|
|
|
424
|
-
{
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
461
|
+
<section className={styles.section}>
|
|
462
|
+
<div className={styles.sectionHeader}>
|
|
463
|
+
<div>
|
|
464
|
+
<Text type="secondary">飞书文库导航</Text>
|
|
465
|
+
<Title level={2}>按任务选择下一步</Title>
|
|
466
|
+
</div>
|
|
467
|
+
</div>
|
|
468
|
+
<div className={styles.taskGrid}>
|
|
469
|
+
{taskGuides.map((item) => (
|
|
470
|
+
<a
|
|
471
|
+
key={item.title}
|
|
472
|
+
className={styles.taskCard}
|
|
473
|
+
href={item.url}
|
|
474
|
+
target="_blank"
|
|
475
|
+
rel="noopener noreferrer"
|
|
476
|
+
>
|
|
477
|
+
<span className={styles.iconBox}>{item.icon}</span>
|
|
478
|
+
<span>
|
|
479
|
+
<strong>{item.title}</strong>
|
|
480
|
+
<span>{item.description}</span>
|
|
481
|
+
</span>
|
|
482
|
+
<em>
|
|
483
|
+
{item.action} <ArrowRightOutlined />
|
|
484
|
+
</em>
|
|
485
|
+
</a>
|
|
486
|
+
))}
|
|
487
|
+
</div>
|
|
488
|
+
</section>
|
|
489
|
+
|
|
490
|
+
<section className={styles.section}>
|
|
491
|
+
<div className={styles.sectionHeader}>
|
|
492
|
+
<div>
|
|
493
|
+
<Text type="secondary">在线文库</Text>
|
|
494
|
+
<Title level={2}>常用入口</Title>
|
|
495
|
+
</div>
|
|
496
|
+
</div>
|
|
497
|
+
<div className={styles.docGrid}>
|
|
498
|
+
{docLinks.map((item) => (
|
|
499
|
+
<a
|
|
500
|
+
key={item.title}
|
|
501
|
+
className={styles.docCard}
|
|
502
|
+
href={item.url}
|
|
503
|
+
target="_blank"
|
|
504
|
+
rel="noopener noreferrer"
|
|
505
|
+
>
|
|
506
|
+
<span className={styles.routeIcon}>{item.icon}</span>
|
|
507
|
+
<strong>{item.title}</strong>
|
|
508
|
+
<span>{item.description}</span>
|
|
509
|
+
<em>
|
|
510
|
+
打开文档 <ArrowRightOutlined />
|
|
511
|
+
</em>
|
|
512
|
+
</a>
|
|
513
|
+
))}
|
|
514
|
+
</div>
|
|
515
|
+
</section>
|
|
428
516
|
|
|
429
|
-
{
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
<
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
517
|
+
<section className={styles.section}>
|
|
518
|
+
<div className={styles.sectionHeader}>
|
|
519
|
+
<div>
|
|
520
|
+
<Text type="secondary">AI 开发方式</Text>
|
|
521
|
+
<Title level={2}>直接输入这些 Prompt</Title>
|
|
522
|
+
</div>
|
|
523
|
+
<Button
|
|
524
|
+
href={feishuDocs.systemPageSdk}
|
|
525
|
+
target="_blank"
|
|
526
|
+
rel="noopener noreferrer"
|
|
527
|
+
icon={<ToolOutlined />}
|
|
528
|
+
>
|
|
529
|
+
查看页面开发文档
|
|
530
|
+
</Button>
|
|
531
|
+
</div>
|
|
532
|
+
<div className={styles.promptGrid}>
|
|
533
|
+
{promptCards.map((item) => (
|
|
534
|
+
<Card key={item.title} className={styles.promptCard}>
|
|
535
|
+
<div className={styles.cardHeading}>
|
|
536
|
+
<span className={styles.iconBox}>{item.icon}</span>
|
|
537
|
+
<div>
|
|
538
|
+
<Title level={3}>{item.title}</Title>
|
|
539
|
+
<Paragraph>{item.description}</Paragraph>
|
|
540
|
+
</div>
|
|
446
541
|
</div>
|
|
447
|
-
{
|
|
448
|
-
|
|
449
|
-
<
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
542
|
+
<div className={styles.tagRow}>
|
|
543
|
+
{item.tags.map((tag) => (
|
|
544
|
+
<Tag key={tag}>{tag}</Tag>
|
|
545
|
+
))}
|
|
546
|
+
</div>
|
|
547
|
+
<div className={styles.commandList}>
|
|
548
|
+
<Text type="secondary">AI 可能调用</Text>
|
|
549
|
+
<div>
|
|
550
|
+
{item.commands.map((command) => (
|
|
551
|
+
<Text code key={command}>
|
|
552
|
+
{command}
|
|
553
|
+
</Text>
|
|
554
|
+
))}
|
|
457
555
|
</div>
|
|
458
|
-
|
|
556
|
+
</div>
|
|
557
|
+
<CopyableCode
|
|
558
|
+
code={item.prompt}
|
|
559
|
+
label="可直接输入的 Prompt"
|
|
560
|
+
compact
|
|
561
|
+
/>
|
|
562
|
+
<Button
|
|
563
|
+
type="link"
|
|
564
|
+
href={item.docUrl}
|
|
565
|
+
target="_blank"
|
|
566
|
+
rel="noopener noreferrer"
|
|
567
|
+
className={styles.inlineDocLink}
|
|
568
|
+
>
|
|
569
|
+
{item.docLabel} <ArrowRightOutlined />
|
|
570
|
+
</Button>
|
|
459
571
|
</Card>
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
</
|
|
463
|
-
|
|
572
|
+
))}
|
|
573
|
+
</div>
|
|
574
|
+
</section>
|
|
575
|
+
|
|
576
|
+
<section className={styles.section}>
|
|
577
|
+
<div className={styles.sectionHeader}>
|
|
578
|
+
<div>
|
|
579
|
+
<Text type="secondary">页面示例</Text>
|
|
580
|
+
<Title level={2}>内置页面入口</Title>
|
|
581
|
+
</div>
|
|
582
|
+
</div>
|
|
583
|
+
<div className={styles.pageGrid}>
|
|
584
|
+
{pageEntries.map((entry) => (
|
|
585
|
+
<Card key={entry.path} className={styles.routeCard}>
|
|
586
|
+
<div className={styles.routeIcon}>{entry.icon}</div>
|
|
587
|
+
<Title level={3}>{entry.title}</Title>
|
|
588
|
+
<Paragraph>{entry.description}</Paragraph>
|
|
589
|
+
<div className={styles.tagRow}>
|
|
590
|
+
{entry.tags.map((tag) => (
|
|
591
|
+
<Tag key={tag}>{tag}</Tag>
|
|
592
|
+
))}
|
|
593
|
+
</div>
|
|
594
|
+
<Link className={styles.routeLink} to={entry.path}>
|
|
595
|
+
打开页面 <ArrowRightOutlined />
|
|
596
|
+
</Link>
|
|
597
|
+
</Card>
|
|
598
|
+
))}
|
|
599
|
+
</div>
|
|
600
|
+
</section>
|
|
601
|
+
|
|
602
|
+
<section className={styles.bottomGrid}>
|
|
603
|
+
<Card className={styles.sectionCard}>
|
|
604
|
+
<div className={styles.cardTitleLine}>
|
|
605
|
+
<CloudUploadOutlined />
|
|
606
|
+
<Title level={2}>接入主应用检查清单</Title>
|
|
607
|
+
</div>
|
|
608
|
+
<ol className={styles.checkList}>
|
|
609
|
+
{integrationSteps.map((step) => (
|
|
610
|
+
<li key={step}>
|
|
611
|
+
<CheckCircleOutlined />
|
|
612
|
+
<span>{step}</span>
|
|
613
|
+
</li>
|
|
614
|
+
))}
|
|
615
|
+
</ol>
|
|
616
|
+
</Card>
|
|
617
|
+
|
|
618
|
+
<Card className={styles.sectionCard}>
|
|
619
|
+
<div className={styles.cardTitleLine}>
|
|
620
|
+
<ToolOutlined />
|
|
621
|
+
<Title level={2}>Agent 开发提示</Title>
|
|
622
|
+
</div>
|
|
623
|
+
<Paragraph className={styles.mutedText}>
|
|
624
|
+
日常开发时,直接描述业务页面、数据来源、交互方式和验收标准。
|
|
625
|
+
Agent 会结合当前项目配置、SDK 模型和飞书文库完成实现。
|
|
626
|
+
</Paragraph>
|
|
627
|
+
<CopyableCode
|
|
628
|
+
code={`请基于当前 Lovrabet React 子应用开发客户列表页。
|
|
629
|
+
先确认可用的客户数据模型和字段。
|
|
630
|
+
页面需要包含筛选、表格、详情抽屉和新增表单。
|
|
631
|
+
数据读写使用项目里的 @lovrabet/sdk,并在完成后运行构建检查。`}
|
|
632
|
+
label="推荐起步 Prompt"
|
|
633
|
+
compact
|
|
634
|
+
/>
|
|
635
|
+
</Card>
|
|
636
|
+
</section>
|
|
637
|
+
</main>
|
|
464
638
|
);
|
|
465
639
|
}
|
|
466
640
|
|