@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 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('/api/token').then(r => r.json());
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); // 生成的 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
- appCode: "prod-app",
200
- models: { /* ... */ },
201
- }, "prod");
202
-
203
- registerModels({
204
- appCode: "dev-app",
205
- models: { /* ... */ },
206
- }, "dev");
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; // OpenAPI 密钥(服务端)
272
- secretKey?: string; // 密钥(可选)
273
- token?: string; // 预生成 token(浏览器)
274
- timestamp?: number; // token 时间戳
275
- env?: 'online' | 'daily'; // 环境
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('/api/token').then(r => r.json());
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 服务端** | `accessKey` | SSR、API 路由、后端服务 |
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";