@lovrabet/cli 1.2.1-beta.4 → 1.2.4
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 +33 -17
- package/lib/add-page/input-page-router.js +1 -1
- package/lib/add-page/main.js +1 -1
- package/lib/add-page/select-page-template.js +1 -1
- package/lib/api/api-doc-ui.js +1 -1
- package/lib/api/api-doc.js +1 -1
- package/lib/api/api-pull-ui.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.js +1 -1
- package/lib/api/main.js +1 -1
- package/lib/api/pull-silent.js +1 -1
- package/lib/app-menu/app-menu-sync-ui.js +1 -1
- package/lib/app-menu/create-menu.js +1 -1
- package/lib/app-menu/get-local-pages.js +1 -1
- package/lib/app-menu/get-online-menu-list.js +1 -1
- package/lib/app-menu/use-get-online-menu-list.js +1 -1
- package/lib/app-menu/utils.js +1 -1
- package/lib/app-menu/valid-url.js +1 -1
- package/lib/app-menu-update-cdn/current-content.js +1 -1
- package/lib/app-menu-update-cdn/input-cdn-asset.js +1 -1
- package/lib/app-menu-update-cdn/main.js +1 -1
- package/lib/app-menu-update-cdn/update-menu-cdn-url.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/is-session-valid.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/cmd/build-watch.js +1 -1
- package/lib/cmd/build.js +1 -1
- package/lib/cmd/logs.js +1 -1
- package/lib/cmd/preview.js +1 -1
- package/lib/cmd/start.js +1 -1
- package/lib/config/config-help.js +1 -1
- package/lib/config/main.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/create-app/enhanced-guided-create.js +1 -1
- package/lib/create-app/format-elapsed.js +1 -1
- package/lib/create-app/main.js +1 -1
- package/lib/create-app/task-finished.js +1 -1
- package/lib/create-app/task-loading.js +1 -1
- package/lib/create-app/task-running.js +1 -1
- package/lib/create-app/task-time.js +1 -1
- package/lib/create-app/use-copy-project-template.js +1 -1
- package/lib/create-app/use-format-code.js +1 -1
- package/lib/create-app/use-install-dependencies.js +1 -1
- package/lib/help.js +1 -1
- package/lib/init/main.js +1 -1
- package/lib/mcp/cursor.js +1 -1
- package/lib/mcp/main.js +1 -1
- package/lib/utils/check-sdk-version.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/copy-directory.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/router-updater.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/package.json +3 -3
- package/templates/projects/sub-app-react-demo/package.json +2 -2
- package/templates/projects/sub-app-react-demo/src/api/api.ts +42 -25
- package/templates/projects/sub-app-react-demo/src/api/client.ts +11 -10
- package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +72 -19
- package/templates/projects/sub-app-react-demo/package-lock.json +0 -4062
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generated by Lovrabet CLI
|
|
3
|
+
* Created: 2025-12-30T11:26:52.194Z
|
|
3
4
|
*
|
|
4
5
|
* 这个文件包含了项目的模型配置,并自动注册到 SDK 中
|
|
5
6
|
* CLI 工具会自动维护这个文件,通常不需要手动修改
|
|
@@ -11,41 +12,57 @@ export const LOVRABET_APP_CODE = "app-c4c89304";
|
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* 项目的模型配置
|
|
14
|
-
*
|
|
15
|
+
* 使用数组格式,每个模型包含 datasetCode、tableName、name 和可选的 alias
|
|
16
|
+
*
|
|
17
|
+
* 访问方式:
|
|
18
|
+
* - 标准访问:client.models.dataset_[datasetCode]
|
|
19
|
+
* - 别名访问:client.models.[alias](如果配置了 alias)
|
|
15
20
|
*/
|
|
16
21
|
export const LOVRABET_MODELS_CONFIG: ModelsConfig = {
|
|
17
22
|
appCode: LOVRABET_APP_CODE,
|
|
18
|
-
models:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
tableName: "requirements",
|
|
25
|
-
datasetCode: "d26ed512e878461ca97d287a47606fd3",
|
|
26
|
-
},
|
|
27
|
-
Projects: {
|
|
28
|
-
tableName: "projects",
|
|
29
|
-
datasetCode: "c6e55d6720b84ffcb21698b0a04ccd23",
|
|
23
|
+
models: [
|
|
24
|
+
{
|
|
25
|
+
datasetCode: "3ff202af07164d0a9c5df7ddd8f83c23",
|
|
26
|
+
tableName: "dataset_f83c23",
|
|
27
|
+
name: "客户访谈记录",
|
|
28
|
+
alias: "datasetF83c23",
|
|
30
29
|
},
|
|
31
|
-
|
|
32
|
-
tableName: "iterations",
|
|
30
|
+
{
|
|
33
31
|
datasetCode: "a60f11c17c5344e7a26d5144212cf366",
|
|
32
|
+
tableName: "iterations",
|
|
33
|
+
name: "迭代信息",
|
|
34
|
+
alias: "iterations",
|
|
34
35
|
},
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
{
|
|
37
|
+
datasetCode: "d26ed512e878461ca97d287a47606fd3",
|
|
38
|
+
tableName: "requirements",
|
|
39
|
+
name: "需求",
|
|
40
|
+
alias: "requirements",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
37
43
|
datasetCode: "f17f1ee941c1468e87e6a0ca655ce00e",
|
|
44
|
+
tableName: "requirement_types",
|
|
45
|
+
name: "需求类型",
|
|
46
|
+
alias: "requirementTypes",
|
|
38
47
|
},
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
48
|
+
{
|
|
49
|
+
datasetCode: "c6e55d6720b84ffcb21698b0a04ccd23",
|
|
50
|
+
tableName: "projects",
|
|
51
|
+
name: "项目",
|
|
52
|
+
alias: "projects",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
datasetCode: "71494bcba13f4ec7858abe90794183ad",
|
|
56
|
+
tableName: "project_members",
|
|
57
|
+
name: "项目成员",
|
|
58
|
+
alias: "projectMembers",
|
|
42
59
|
},
|
|
43
|
-
|
|
60
|
+
],
|
|
44
61
|
} as const;
|
|
45
62
|
|
|
46
63
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
64
|
+
* 自动注册配置
|
|
65
|
+
* 配置名称: CONFIG_NAMES.DEFAULT
|
|
49
66
|
*/
|
|
50
67
|
registerModels(LOVRABET_MODELS_CONFIG, CONFIG_NAMES.DEFAULT);
|
|
51
68
|
|
|
@@ -55,12 +72,12 @@ registerModels(LOVRABET_MODELS_CONFIG, CONFIG_NAMES.DEFAULT);
|
|
|
55
72
|
* // 开发环境配置
|
|
56
73
|
* registerModels({
|
|
57
74
|
* appCode: 'app-dev-123',
|
|
58
|
-
* models:
|
|
75
|
+
* models: [...]
|
|
59
76
|
* }, 'dev');
|
|
60
77
|
*
|
|
61
78
|
* // 其他项目配置
|
|
62
79
|
* registerModels({
|
|
63
80
|
* appCode: 'other-project',
|
|
64
|
-
* models:
|
|
81
|
+
* models: [...]
|
|
65
82
|
* }, 'project-b');
|
|
66
83
|
*/
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Lovrabet SDK 客户端实例
|
|
3
|
+
* Generated by Lovrabet CLI
|
|
4
|
+
* Created: 2025-12-30T11:26:52.241Z
|
|
3
5
|
*
|
|
4
6
|
* 这个文件负责创建和导出统一的客户端实例,供整个应用使用
|
|
5
7
|
* 通过导入 './api' 文件来自动执行配置注册
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
|
-
import { createClient } from "@lovrabet/sdk";
|
|
10
|
+
import { createClient, CONFIG_NAMES } from "@lovrabet/sdk";
|
|
9
11
|
import "./api"; // 导入配置文件,执行 registerModels() 注册
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* 主要的客户端实例
|
|
13
|
-
*
|
|
15
|
+
* 使用配置名称 'CONFIG_NAMES.DEFAULT' 创建客户端
|
|
14
16
|
*/
|
|
15
17
|
export const lovrabetClient = createClient();
|
|
16
18
|
|
|
@@ -21,26 +23,25 @@ export const lovrabetClient = createClient();
|
|
|
21
23
|
* import { lovrabetClient } from '@/api/client';
|
|
22
24
|
*
|
|
23
25
|
* // 获取数据列表
|
|
24
|
-
* const
|
|
26
|
+
* const data = await lovrabetClient.models.datasetF83c23.getList({
|
|
25
27
|
* currentPage: 1,
|
|
26
28
|
* pageSize: 20
|
|
27
29
|
* });
|
|
28
30
|
*
|
|
29
31
|
* // 获取单条记录
|
|
30
|
-
* const
|
|
32
|
+
* const record = await lovrabetClient.models.datasetF83c23.getOne('123');
|
|
31
33
|
*
|
|
32
34
|
* // 创建新记录
|
|
33
|
-
* const
|
|
34
|
-
*
|
|
35
|
-
* description: '需求描述'
|
|
35
|
+
* const newRecord = await lovrabetClient.models.datasetF83c23.create({
|
|
36
|
+
* // 记录数据
|
|
36
37
|
* });
|
|
37
38
|
*/
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
41
|
* 其他创建客户端的方式(根据需要选择):
|
|
41
42
|
*
|
|
42
|
-
* 1.
|
|
43
|
-
* export const lovrabetClient = createClient(
|
|
43
|
+
* 1. 使用默认配置(无参数调用):
|
|
44
|
+
* export const lovrabetClient = createClient();
|
|
44
45
|
*
|
|
45
46
|
* 2. 使用其他已注册的配置:
|
|
46
47
|
* export const devClient = createClient('dev');
|
|
@@ -52,7 +53,7 @@ export const lovrabetClient = createClient();
|
|
|
52
53
|
*
|
|
53
54
|
* 4. 通过 ClientConfig 指定配置名和其他选项:
|
|
54
55
|
* export const lovrabetClient = createClient({
|
|
55
|
-
*
|
|
56
|
+
* apiConfigName: 'default',
|
|
56
57
|
* token: 'custom-token',
|
|
57
58
|
* env: 'daily'
|
|
58
59
|
* });
|
|
@@ -19,22 +19,34 @@ export default function SdkDemo() {
|
|
|
19
19
|
const [loading, setLoading] = useState(false);
|
|
20
20
|
const [data, setData] = useState<any[]>([]);
|
|
21
21
|
const [columns, setColumns] = useState<any[]>([]);
|
|
22
|
-
const [modelList, setModelList] = useState<
|
|
22
|
+
const [modelList, setModelList] = useState<
|
|
23
|
+
Array<{
|
|
24
|
+
value: string;
|
|
25
|
+
label: string;
|
|
26
|
+
alias?: string;
|
|
27
|
+
name?: string;
|
|
28
|
+
datasetCode: string;
|
|
29
|
+
}>
|
|
30
|
+
>([]);
|
|
23
31
|
const [selectedModel, setSelectedModel] = useState<string>("");
|
|
24
32
|
const [selectOptions, setSelectOptions] = useState<any[]>([]);
|
|
25
33
|
const [codeField, setCodeField] = useState<string>("id");
|
|
26
34
|
const [labelField, setLabelField] = useState<string>("");
|
|
27
35
|
|
|
36
|
+
// 获取选中模型的信息(用于代码示例展示 alias)
|
|
37
|
+
const selectedModelInfo = modelList.find((m) => m.value === selectedModel);
|
|
38
|
+
|
|
28
39
|
/**
|
|
29
40
|
* 加载可用的数据模型列表
|
|
30
41
|
*/
|
|
31
42
|
useEffect(() => {
|
|
32
43
|
try {
|
|
33
|
-
|
|
44
|
+
// 使用 getModelListDetails 获取人类友好的模型列表
|
|
45
|
+
const models = lovrabetClient.getModelListDetails();
|
|
34
46
|
setModelList(models);
|
|
35
47
|
// 默认选择第一个模型
|
|
36
48
|
if (models.length > 0) {
|
|
37
|
-
setSelectedModel(models[0]);
|
|
49
|
+
setSelectedModel(models[0].value);
|
|
38
50
|
}
|
|
39
51
|
} catch (error) {
|
|
40
52
|
console.error("获取模型列表失败:", error);
|
|
@@ -93,6 +105,16 @@ export default function SdkDemo() {
|
|
|
93
105
|
column.title || column.dataIndex || column.key || String(column),
|
|
94
106
|
dataIndex: column.dataIndex || column.key || String(column),
|
|
95
107
|
key: column.dataIndex || column.key || String(column),
|
|
108
|
+
// 处理对象/数组类型的值,避免 React Error #31
|
|
109
|
+
render: (value: any) => {
|
|
110
|
+
if (value === null || value === undefined) {
|
|
111
|
+
return "-";
|
|
112
|
+
}
|
|
113
|
+
if (typeof value === "object") {
|
|
114
|
+
return JSON.stringify(value);
|
|
115
|
+
}
|
|
116
|
+
return String(value);
|
|
117
|
+
},
|
|
96
118
|
}));
|
|
97
119
|
setColumns(tableColumns);
|
|
98
120
|
} else if (tableData.length > 0) {
|
|
@@ -103,6 +125,16 @@ export default function SdkDemo() {
|
|
|
103
125
|
title: key,
|
|
104
126
|
dataIndex: key,
|
|
105
127
|
key: key,
|
|
128
|
+
// 处理对象/数组类型的值,避免 React Error #31
|
|
129
|
+
render: (value: any) => {
|
|
130
|
+
if (value === null || value === undefined) {
|
|
131
|
+
return "-";
|
|
132
|
+
}
|
|
133
|
+
if (typeof value === "object") {
|
|
134
|
+
return JSON.stringify(value);
|
|
135
|
+
}
|
|
136
|
+
return String(value);
|
|
137
|
+
},
|
|
106
138
|
}));
|
|
107
139
|
setColumns(tableColumns);
|
|
108
140
|
}
|
|
@@ -182,13 +214,12 @@ export default function SdkDemo() {
|
|
|
182
214
|
<Space>
|
|
183
215
|
<Select
|
|
184
216
|
placeholder="选择要查询的数据模型"
|
|
185
|
-
style={{ width:
|
|
217
|
+
style={{ width: 350 }}
|
|
186
218
|
value={selectedModel}
|
|
187
219
|
onChange={setSelectedModel}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}))}
|
|
220
|
+
showSearch
|
|
221
|
+
optionFilterProp="label"
|
|
222
|
+
options={modelList}
|
|
192
223
|
/>
|
|
193
224
|
<Button
|
|
194
225
|
type="primary"
|
|
@@ -215,28 +246,39 @@ export default function SdkDemo() {
|
|
|
215
246
|
overflow: "auto",
|
|
216
247
|
}}
|
|
217
248
|
>
|
|
218
|
-
{`//
|
|
249
|
+
{`// ========== 方式一:标准 dataset_code 模式(推荐 AI/LLM 使用)==========
|
|
219
250
|
const response = await lovrabetClient
|
|
220
|
-
.models
|
|
251
|
+
.models['${selectedModel || "dataset_xxx"}'].filter({
|
|
221
252
|
currentPage: 1,
|
|
222
253
|
pageSize: 10
|
|
223
254
|
});
|
|
224
|
-
|
|
225
|
-
|
|
255
|
+
${
|
|
256
|
+
selectedModelInfo?.alias
|
|
257
|
+
? `
|
|
258
|
+
// ========== 方式二:人类友好的 alias 模式 ==========
|
|
259
|
+
const response = await lovrabetClient
|
|
260
|
+
.models.${selectedModelInfo.alias}.filter({
|
|
261
|
+
currentPage: 1,
|
|
262
|
+
pageSize: 10
|
|
263
|
+
});
|
|
264
|
+
`
|
|
265
|
+
: ""
|
|
266
|
+
}
|
|
267
|
+
// ========== 完整查询示例(所有参数均为可选)==========
|
|
226
268
|
const response = await lovrabetClient
|
|
227
|
-
.models
|
|
269
|
+
.models['${selectedModel || "dataset_xxx"}'].filter({
|
|
228
270
|
// where: 条件查询(可选)
|
|
229
271
|
// where: {
|
|
230
272
|
// age: { $gte: 18 },
|
|
231
273
|
// status: { $eq: 'active' }
|
|
232
274
|
// },
|
|
233
|
-
|
|
275
|
+
|
|
234
276
|
// select: 字段选择(可选)
|
|
235
277
|
// select: ['id', 'name', 'age'],
|
|
236
|
-
|
|
278
|
+
|
|
237
279
|
// orderBy: 排序(可选)
|
|
238
280
|
// orderBy: [{ createTime: 'desc' }],
|
|
239
|
-
|
|
281
|
+
|
|
240
282
|
// 分页参数(必需)
|
|
241
283
|
currentPage: 1,
|
|
242
284
|
pageSize: 10
|
|
@@ -345,13 +387,24 @@ const response = await lovrabetClient
|
|
|
345
387
|
border: "1px solid #d9d9d9",
|
|
346
388
|
}}
|
|
347
389
|
>
|
|
348
|
-
{`//
|
|
390
|
+
{`// ========== 方式一:标准 dataset_code 模式(推荐 AI/LLM 使用)==========
|
|
349
391
|
const options = await lovrabetClient
|
|
350
|
-
.models
|
|
392
|
+
.models['${selectedModel || "dataset_xxx"}'].getSelectOptions({
|
|
351
393
|
code: "${codeField || "id"}",
|
|
352
394
|
label: "${labelField || "name"}"
|
|
353
395
|
});
|
|
354
|
-
|
|
396
|
+
${
|
|
397
|
+
selectedModelInfo?.alias
|
|
398
|
+
? `
|
|
399
|
+
// ========== 方式二:人类友好的 alias 模式 ==========
|
|
400
|
+
const options = await lovrabetClient
|
|
401
|
+
.models.${selectedModelInfo.alias}.getSelectOptions({
|
|
402
|
+
code: "${codeField || "id"}",
|
|
403
|
+
label: "${labelField || "name"}"
|
|
404
|
+
});
|
|
405
|
+
`
|
|
406
|
+
: ""
|
|
407
|
+
}
|
|
355
408
|
// 返回格式:[{ label: "显示文本", value: "选项值" }]`}
|
|
356
409
|
</pre>
|
|
357
410
|
</Space>
|