@lovrabet/sdk 1.1.15 → 1.1.17
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 +200 -29
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/src/models/abstract-base-model.d.ts +4 -3
- package/dist/src/models/openapi-model.d.ts +7 -1
- package/dist/src/models/webapi-model.d.ts +2 -1
- package/dist/src/types/index.d.ts +70 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,7 +72,7 @@ export async function GET() {
|
|
|
72
72
|
import { createClient } from "@lovrabet/sdk";
|
|
73
73
|
|
|
74
74
|
// 获取 token
|
|
75
|
-
const { token, timestamp } = await fetch(
|
|
75
|
+
const { token, timestamp } = await fetch("/api/token").then((r) => r.json());
|
|
76
76
|
|
|
77
77
|
// 创建客户端
|
|
78
78
|
const client = createClient({
|
|
@@ -124,8 +124,8 @@ const result = await generateOpenApiToken({
|
|
|
124
124
|
accessKey: process.env.LOVRABET_ACCESS_KEY!,
|
|
125
125
|
});
|
|
126
126
|
|
|
127
|
-
console.log(result.token);
|
|
128
|
-
console.log(result.timestamp);
|
|
127
|
+
console.log(result.token); // 生成的 token
|
|
128
|
+
console.log(result.timestamp); // 时间戳
|
|
129
129
|
console.log(result.expiresAt); // 过期时间
|
|
130
130
|
```
|
|
131
131
|
|
|
@@ -195,15 +195,25 @@ const users = await client.models.users.getList();
|
|
|
195
195
|
import { registerModels, createClient } from "@lovrabet/sdk";
|
|
196
196
|
|
|
197
197
|
// 注册不同环境的配置
|
|
198
|
-
registerModels(
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
198
|
+
registerModels(
|
|
199
|
+
{
|
|
200
|
+
appCode: "prod-app",
|
|
201
|
+
models: {
|
|
202
|
+
/* ... */
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
"prod"
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
registerModels(
|
|
209
|
+
{
|
|
210
|
+
appCode: "dev-app",
|
|
211
|
+
models: {
|
|
212
|
+
/* ... */
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
"dev"
|
|
216
|
+
);
|
|
207
217
|
|
|
208
218
|
// 创建不同环境的客户端
|
|
209
219
|
const prodClient = createClient("prod");
|
|
@@ -216,7 +226,9 @@ const devClient = createClient("dev");
|
|
|
216
226
|
// 创建客户端
|
|
217
227
|
const client = createClient({
|
|
218
228
|
appCode: "your-app-code",
|
|
219
|
-
models: {
|
|
229
|
+
models: {
|
|
230
|
+
/* ... */
|
|
231
|
+
},
|
|
220
232
|
});
|
|
221
233
|
|
|
222
234
|
// 后续更新 token
|
|
@@ -260,6 +272,12 @@ import {
|
|
|
260
272
|
type TokenResult,
|
|
261
273
|
type ListResponse,
|
|
262
274
|
type ListParams,
|
|
275
|
+
type SortList,
|
|
276
|
+
type SelectOption,
|
|
277
|
+
type SelectOptionsParams,
|
|
278
|
+
|
|
279
|
+
// 枚举
|
|
280
|
+
SortOrder,
|
|
263
281
|
} from "@lovrabet/sdk";
|
|
264
282
|
```
|
|
265
283
|
|
|
@@ -267,13 +285,13 @@ import {
|
|
|
267
285
|
|
|
268
286
|
```typescript
|
|
269
287
|
interface ClientConfig {
|
|
270
|
-
appCode?: string;
|
|
271
|
-
accessKey?: string;
|
|
272
|
-
secretKey?: string;
|
|
273
|
-
token?: string;
|
|
274
|
-
timestamp?: number;
|
|
275
|
-
env?:
|
|
276
|
-
models?: ModelsConfig;
|
|
288
|
+
appCode?: string; // 应用代码
|
|
289
|
+
accessKey?: string; // OpenAPI 密钥(服务端)
|
|
290
|
+
secretKey?: string; // 密钥(可选)
|
|
291
|
+
token?: string; // 预生成 token(浏览器)
|
|
292
|
+
timestamp?: number; // token 时间戳
|
|
293
|
+
env?: "online" | "daily"; // 环境
|
|
294
|
+
models?: ModelsConfig; // 模型配置
|
|
277
295
|
}
|
|
278
296
|
```
|
|
279
297
|
|
|
@@ -287,6 +305,17 @@ const response = await client.models.users.getList({
|
|
|
287
305
|
// 其他查询参数
|
|
288
306
|
});
|
|
289
307
|
|
|
308
|
+
// 查询列表(带排序)
|
|
309
|
+
import { SortOrder } from "@lovrabet/sdk";
|
|
310
|
+
|
|
311
|
+
const sortedUsers = await client.models.users.getList(
|
|
312
|
+
{ currentPage: 1, pageSize: 20 },
|
|
313
|
+
[
|
|
314
|
+
{ createTime: SortOrder.DESC }, // 按创建时间降序
|
|
315
|
+
{ name: SortOrder.ASC }, // 再按名称升序
|
|
316
|
+
]
|
|
317
|
+
);
|
|
318
|
+
|
|
290
319
|
// 获取单条记录
|
|
291
320
|
const user = await client.models.users.getOne("user-id");
|
|
292
321
|
|
|
@@ -303,6 +332,40 @@ const updated = await client.models.users.update("user-id", {
|
|
|
303
332
|
|
|
304
333
|
// 删除
|
|
305
334
|
await client.models.users.delete("user-id");
|
|
335
|
+
|
|
336
|
+
// 获取下拉选项(WebAPI 模式)
|
|
337
|
+
const options = await client.models.users.getSelectOptions({
|
|
338
|
+
code: "user_id", // 用作选项值的字段名
|
|
339
|
+
label: "user_name", // 用作显示文本的字段名
|
|
340
|
+
});
|
|
341
|
+
// 返回: [{ label: '张三', value: 'user001' }, { label: '李四', value: 'user002' }]
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### ⚠️ 操作限制
|
|
345
|
+
|
|
346
|
+
**OpenAPI 模式暂不支持以下操作:**
|
|
347
|
+
|
|
348
|
+
- ❌ `delete()` - 删除操作(如需删除,请使用 WebAPI 模式)
|
|
349
|
+
- ❌ `getSelectOptions()` - 获取下拉选项(仅 WebAPI 模式支持)
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
// OpenAPI 模式调用 delete 会抛出错误
|
|
353
|
+
try {
|
|
354
|
+
await client.models.users.delete("user-id");
|
|
355
|
+
} catch (error) {
|
|
356
|
+
// Error: OpenAPI 模式暂不支持 delete 操作。如需删除数据,请使用 WebAPI 模式(Cookie 认证)。
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// 如需删除,请使用 WebAPI 模式(Cookie 认证)
|
|
360
|
+
const webApiClient = createClient({
|
|
361
|
+
appCode: "your-app-code",
|
|
362
|
+
// 不提供 token/accessKey,自动使用 Cookie 认证
|
|
363
|
+
models: {
|
|
364
|
+
/* ... */
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
await webApiClient.models.users.delete("user-id"); // ✅ 可以使用
|
|
306
369
|
```
|
|
307
370
|
|
|
308
371
|
## 🛡️ 安全最佳实践
|
|
@@ -331,17 +394,17 @@ const client = createClient({
|
|
|
331
394
|
|
|
332
395
|
```typescript
|
|
333
396
|
// 使用服务端生成的 token
|
|
334
|
-
const { token } = await fetch(
|
|
397
|
+
const { token } = await fetch("/api/token").then((r) => r.json());
|
|
335
398
|
const client = createClient({ token });
|
|
336
399
|
```
|
|
337
400
|
|
|
338
401
|
## 🎯 选择正确的认证模式
|
|
339
402
|
|
|
340
|
-
| 环境
|
|
341
|
-
|
|
342
|
-
| **Node.js 服务端**
|
|
343
|
-
| **浏览器(未登录)** | `token`
|
|
344
|
-
| **浏览器(已登录)** | Cookie
|
|
403
|
+
| 环境 | 认证方式 | 使用场景 |
|
|
404
|
+
| -------------------- | ----------- | ----------------------- |
|
|
405
|
+
| **Node.js 服务端** | `accessKey` | SSR、API 路由、后端服务 |
|
|
406
|
+
| **浏览器(未登录)** | `token` | 公开数据访问、匿名用户 |
|
|
407
|
+
| **浏览器(已登录)** | Cookie | 已认证用户、私有数据 |
|
|
345
408
|
|
|
346
409
|
## 📚 文档
|
|
347
410
|
|
|
@@ -353,11 +416,118 @@ const client = createClient({ token });
|
|
|
353
416
|
|
|
354
417
|
## 📝 What's New
|
|
355
418
|
|
|
419
|
+
### v1.1.17 (2025-10-18)
|
|
420
|
+
|
|
421
|
+
**新增功能 (New Features):**
|
|
422
|
+
|
|
423
|
+
- ✨ **下拉选项接口** - 新增 `getSelectOptions` 方法,用于快速获取下拉选项数据
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
// 获取下拉选项(WebAPI 模式)
|
|
427
|
+
const options = await client.models.users.getSelectOptions({
|
|
428
|
+
code: "user_id", // 用作选项值的字段名
|
|
429
|
+
label: "user_name", // 用作显示文本的字段名
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
// 返回格式:
|
|
433
|
+
// [
|
|
434
|
+
// { label: '张三', value: 'user001' },
|
|
435
|
+
// { label: '李四', value: 'user002' },
|
|
436
|
+
// { label: '王五', value: 'user003' }
|
|
437
|
+
// ]
|
|
438
|
+
|
|
439
|
+
// 在 React 中使用
|
|
440
|
+
<Select>
|
|
441
|
+
{options.map((option) => (
|
|
442
|
+
<Option key={option.value} value={option.value}>
|
|
443
|
+
{option.label}
|
|
444
|
+
</Option>
|
|
445
|
+
))}
|
|
446
|
+
</Select>;
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
- 返回标准化的 `{ label, value }` 格式,直接适用于前端组件
|
|
450
|
+
- 自动从数据表字段映射为选项数据
|
|
451
|
+
- 适用于 Select、Radio、Checkbox 等表单组件
|
|
452
|
+
- **仅 WebAPI 模式(Cookie 认证)支持**
|
|
453
|
+
|
|
454
|
+
**操作限制说明 (Restrictions):**
|
|
455
|
+
|
|
456
|
+
- ⚠️ **明确 OpenAPI 模式限制** - OpenAPI 模式暂不支持以下操作:
|
|
457
|
+
|
|
458
|
+
- ❌ `delete()` - 删除操作(如需删除,请使用 WebAPI 模式)
|
|
459
|
+
- ❌ `getSelectOptions()` - 获取下拉选项(仅 WebAPI 模式支持)
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
// OpenAPI 模式调用这些方法会抛出明确的错误提示
|
|
463
|
+
try {
|
|
464
|
+
await client.models.users.delete("user-id");
|
|
465
|
+
} catch (error) {
|
|
466
|
+
// Error: OpenAPI 模式暂不支持 delete 操作。如需删除数据,请使用 WebAPI 模式(Cookie 认证)。
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
**类型定义 (Type Definitions):**
|
|
471
|
+
|
|
472
|
+
- 新增 `SelectOption` 接口:
|
|
473
|
+
|
|
474
|
+
```typescript
|
|
475
|
+
interface SelectOption {
|
|
476
|
+
label: string; // 显示文本
|
|
477
|
+
value: string; // 选项值
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
- 新增 `SelectOptionsParams` 接口:
|
|
482
|
+
```typescript
|
|
483
|
+
interface SelectOptionsParams {
|
|
484
|
+
code: string; // 用作选项值的字段名
|
|
485
|
+
label: string; // 用作显示文本的字段名
|
|
486
|
+
}
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
### v1.1.16 (2025-10-15)
|
|
492
|
+
|
|
493
|
+
**新增功能 (New Features):**
|
|
494
|
+
|
|
495
|
+
- ✨ **列表排序支持** - `getList` 方法现在支持多字段排序功能
|
|
496
|
+
|
|
497
|
+
```typescript
|
|
498
|
+
import { SortOrder } from "@lovrabet/sdk";
|
|
499
|
+
|
|
500
|
+
// 单字段排序
|
|
501
|
+
const users = await client.models.users.getList(
|
|
502
|
+
{ currentPage: 1, pageSize: 20 },
|
|
503
|
+
[{ createTime: SortOrder.DESC }]
|
|
504
|
+
);
|
|
505
|
+
|
|
506
|
+
// 多字段排序
|
|
507
|
+
const products = await client.models.products.getList(
|
|
508
|
+
{ currentPage: 1, pageSize: 20 },
|
|
509
|
+
[
|
|
510
|
+
{ priority: SortOrder.DESC }, // 优先级降序
|
|
511
|
+
{ createTime: SortOrder.DESC }, // 创建时间降序
|
|
512
|
+
{ name: SortOrder.ASC }, // 名称升序
|
|
513
|
+
]
|
|
514
|
+
);
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
- 使用简洁的 key-value 格式:`{ "字段名": SortOrder.ASC/DESC }`
|
|
518
|
+
- 支持多字段组合排序
|
|
519
|
+
- 同时支持 OpenAPI 和 WebAPI 两种模式
|
|
520
|
+
- 向后兼容,sortList 参数可选
|
|
521
|
+
- 导出 `SortOrder` 枚举和 `SortList` 类型供开发者使用
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
356
525
|
### v1.1.14 (2025-10-11)
|
|
357
526
|
|
|
358
527
|
**新增功能 (New Features):**
|
|
359
528
|
|
|
360
529
|
- ✨ **OpenAPI Create/Update 支持** - OpenAPI 模式现已支持完整的 CRUD 操作
|
|
530
|
+
|
|
361
531
|
```typescript
|
|
362
532
|
// 创建记录
|
|
363
533
|
const newUser = await client.models.users.create({
|
|
@@ -370,6 +540,7 @@ const client = createClient({ token });
|
|
|
370
540
|
name: "Jane Doe",
|
|
371
541
|
});
|
|
372
542
|
```
|
|
543
|
+
|
|
373
544
|
- 认证信息自动添加到请求头(X-Token、X-Time-Stamp)
|
|
374
545
|
- 请求体只包含业务数据(`appCode`、`datasetCode`、`paramMap`)
|
|
375
546
|
- 与查询接口保持一致的架构设计
|
|
@@ -401,6 +572,7 @@ const client = createClient({ token });
|
|
|
401
572
|
**新增功能 (New Features):**
|
|
402
573
|
|
|
403
574
|
- ✨ **后端 Token 生成器** - 新增 `generateOpenApiToken()` 函数,支持服务端生成 Token
|
|
575
|
+
|
|
404
576
|
```typescript
|
|
405
577
|
import { generateOpenApiToken } from "@lovrabet/sdk";
|
|
406
578
|
|
|
@@ -427,7 +599,6 @@ const client = createClient({ token });
|
|
|
427
599
|
|
|
428
600
|
---
|
|
429
601
|
|
|
430
|
-
|
|
431
602
|
### v1.1.5 (2025-09-27)
|
|
432
603
|
|
|
433
604
|
**重大变更 (Breaking Changes):**
|
|
@@ -441,7 +612,6 @@ const client = createClient({ token });
|
|
|
441
612
|
|
|
442
613
|
---
|
|
443
614
|
|
|
444
|
-
|
|
445
615
|
## 🤝 反馈
|
|
446
616
|
|
|
447
617
|
如遇到问题或有功能建议,欢迎提交 Issue!
|
|
@@ -451,6 +621,7 @@ const client = createClient({ token });
|
|
|
451
621
|
**专有软件(Proprietary)** - 详见 [LICENSE](./LICENSE) 文件
|
|
452
622
|
|
|
453
623
|
本 SDK 为 Lovrabet 开放平台的专有组件:
|
|
624
|
+
|
|
454
625
|
- ✅ **允许使用** - 可以安装并在项目中集成本 SDK
|
|
455
626
|
- ✅ **应用分发** - 可以分发包含本 SDK 的应用程序
|
|
456
627
|
- ✅ **商业使用** - 可用于个人和商业项目
|
|
@@ -458,4 +629,4 @@ const client = createClient({ token });
|
|
|
458
629
|
- ❌ **不得单独分发** - 不得单独复制或分发本 SDK
|
|
459
630
|
- ❌ **源代码不公开** - 本 SDK 为闭源软件
|
|
460
631
|
|
|
461
|
-
如需商业授权或有疑问,请访问 [lovrabet.com](https://www.lovrabet.com)
|
|
632
|
+
如需商业授权或有疑问,请访问 [lovrabet.com](https://www.lovrabet.com)
|
package/dist/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export { AbstractBaseModel, OpenApiModel, WebApiModel, ModelFactory, } from "./s
|
|
|
7
7
|
export { AuthManager, } from "./src/auth/index";
|
|
8
8
|
export { generateOpenApiToken, TokenGenerator, isTokenExpiring, getTokenRemainingTime, type GenerateTokenParams, type TokenResult } from "./src/auth/index";
|
|
9
9
|
export type { ClientConfig, LovrabetClient, ModelConfig, ModelsConfig, } from "./src/types/index";
|
|
10
|
-
export type { ListParams, ListResponse, Environment, BaseModelMethods, } from "./src/types/index";
|
|
10
|
+
export type { ListParams, ListResponse, Environment, BaseModelMethods, SortList, SelectOption, SelectOptionsParams, } from "./src/types/index";
|
|
11
|
+
export { SortOrder, } from "./src/types/index";
|