befly-tpl 3.9.49 → 3.9.50
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 +8 -6
- package/apis/test/typedExample.ts +150 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -37,12 +37,14 @@ bunx befly init
|
|
|
37
37
|
|
|
38
38
|
```typescript
|
|
39
39
|
// main.ts
|
|
40
|
-
import {
|
|
40
|
+
import { Befly } from 'befly';
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
const app = new Befly({
|
|
43
|
+
appName: 'My API',
|
|
44
|
+
appPort: 3000
|
|
45
45
|
});
|
|
46
|
+
|
|
47
|
+
await app.start();
|
|
46
48
|
```
|
|
47
49
|
|
|
48
50
|
运行项目:
|
|
@@ -55,7 +57,7 @@ bun run main.ts
|
|
|
55
57
|
|
|
56
58
|
```typescript
|
|
57
59
|
// apis/user/hello.ts
|
|
58
|
-
import type { ApiRoute } from 'befly';
|
|
60
|
+
import type { ApiRoute } from 'befly/types/index';
|
|
59
61
|
|
|
60
62
|
export default {
|
|
61
63
|
name: '问候接口',
|
|
@@ -79,7 +81,7 @@ export default {
|
|
|
79
81
|
### TypeScript 全面支持
|
|
80
82
|
|
|
81
83
|
```typescript
|
|
82
|
-
import type { ApiRoute, BeflyContext } from 'befly';
|
|
84
|
+
import type { ApiRoute, BeflyContext } from 'befly/types/index';
|
|
83
85
|
import type { User } from './types/models';
|
|
84
86
|
|
|
85
87
|
export default {
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DbHelper 泛型类型使用示例
|
|
3
|
+
*
|
|
4
|
+
* 本文件演示如何使用类型安全的数据库操作
|
|
5
|
+
* 通过扩展 DatabaseTables 接口,可以获得完整的类型推断和智能提示
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { BaseTable, TypedWhereConditions } from 'befly/types/table';
|
|
9
|
+
|
|
10
|
+
// ============================================
|
|
11
|
+
// 步骤 1: 定义表类型
|
|
12
|
+
// ============================================
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 用户表类型定义
|
|
16
|
+
* 只需定义业务字段,系统字段(id, state, createdAt 等)由 BaseTable 自动添加
|
|
17
|
+
*/
|
|
18
|
+
interface UserFields {
|
|
19
|
+
email: string;
|
|
20
|
+
username: string;
|
|
21
|
+
password: string;
|
|
22
|
+
nickname: string | null;
|
|
23
|
+
avatar: string | null;
|
|
24
|
+
roleId: number;
|
|
25
|
+
lastLoginAt: number | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 完整的用户表类型(包含系统字段)
|
|
30
|
+
*/
|
|
31
|
+
type UserTable = BaseTable<UserFields>;
|
|
32
|
+
|
|
33
|
+
// ============================================
|
|
34
|
+
// 步骤 2: 扩展 DatabaseTables(可选,推荐)
|
|
35
|
+
// ============================================
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 在项目的 types/index.d.ts 中添加以下声明:
|
|
39
|
+
*
|
|
40
|
+
* declare module 'befly/types/table' {
|
|
41
|
+
* interface DatabaseTables {
|
|
42
|
+
* user: BaseTable<{
|
|
43
|
+
* email: string;
|
|
44
|
+
* username: string;
|
|
45
|
+
* password: string;
|
|
46
|
+
* nickname: string | null;
|
|
47
|
+
* avatar: string | null;
|
|
48
|
+
* roleId: number;
|
|
49
|
+
* lastLoginAt: number | null;
|
|
50
|
+
* }>;
|
|
51
|
+
* }
|
|
52
|
+
* }
|
|
53
|
+
*
|
|
54
|
+
* 扩展后,db.getOne({ table: 'user' }) 的返回类型会自动推断
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
// ============================================
|
|
58
|
+
// 步骤 3: 在 API 中使用类型安全的数据库操作
|
|
59
|
+
// ============================================
|
|
60
|
+
|
|
61
|
+
export default {
|
|
62
|
+
name: '类型安全示例',
|
|
63
|
+
auth: false,
|
|
64
|
+
handler: async (befly, ctx) => {
|
|
65
|
+
// ----------------------------------------
|
|
66
|
+
// 示例 1: 类型安全的 WHERE 条件
|
|
67
|
+
// ----------------------------------------
|
|
68
|
+
|
|
69
|
+
// 定义类型安全的查询条件
|
|
70
|
+
const where: TypedWhereConditions<UserTable> = {
|
|
71
|
+
state: 1, // 精确匹配
|
|
72
|
+
roleId$in: [1, 2, 3], // IN 数组(必须是 number[])
|
|
73
|
+
email$like: '%@gmail.com', // LIKE 匹配(必须是 string)
|
|
74
|
+
lastLoginAt$gte: Date.now() - 86400000 // 大于等于(必须是 number)
|
|
75
|
+
// roleId$in: 'invalid', // ❌ 类型错误:应为 number[]
|
|
76
|
+
// email$like: 123, // ❌ 类型错误:应为 string
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// ----------------------------------------
|
|
80
|
+
// 示例 2: 使用泛型指定返回类型
|
|
81
|
+
// ----------------------------------------
|
|
82
|
+
|
|
83
|
+
// 方式 A: 手动指定泛型
|
|
84
|
+
const user = await befly.db.getOne<UserTable>({
|
|
85
|
+
table: 'user',
|
|
86
|
+
where: { id: ctx.body.id }
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (user) {
|
|
90
|
+
// 有完整的类型提示
|
|
91
|
+
const email = user.email; // string
|
|
92
|
+
const createdAt = user.createdAt; // number(系统字段)
|
|
93
|
+
const nickname = user.nickname; // string | null
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ----------------------------------------
|
|
97
|
+
// 示例 3: 类型安全的列表查询
|
|
98
|
+
// ----------------------------------------
|
|
99
|
+
|
|
100
|
+
const result = await befly.db.getList<UserTable>({
|
|
101
|
+
table: 'user',
|
|
102
|
+
fields: ['id', 'email', 'nickname', 'createdAt'],
|
|
103
|
+
where: where,
|
|
104
|
+
orderBy: ['createdAt#DESC'],
|
|
105
|
+
page: 1,
|
|
106
|
+
limit: 10
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// result.lists 类型为 UserTable[]
|
|
110
|
+
for (const item of result.lists) {
|
|
111
|
+
// 完整的类型提示
|
|
112
|
+
console.log(item.email, item.createdAt);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ----------------------------------------
|
|
116
|
+
// 示例 4: 复杂 WHERE 条件($or, $and)
|
|
117
|
+
// ----------------------------------------
|
|
118
|
+
|
|
119
|
+
const complexWhere: TypedWhereConditions<UserTable> = {
|
|
120
|
+
state: 1,
|
|
121
|
+
$or: [{ email$like: '%@gmail.com' }, { email$like: '%@qq.com' }],
|
|
122
|
+
$and: [{ roleId$in: [1, 2] }, { lastLoginAt$notNull: true }]
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const activeUsers = await befly.db.getAll<UserTable>({
|
|
126
|
+
table: 'user',
|
|
127
|
+
where: complexWhere,
|
|
128
|
+
orderBy: ['lastLoginAt#DESC']
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// ----------------------------------------
|
|
132
|
+
// 示例 5: BETWEEN 范围查询
|
|
133
|
+
// ----------------------------------------
|
|
134
|
+
|
|
135
|
+
const rangeWhere: TypedWhereConditions<UserTable> = {
|
|
136
|
+
state: 1,
|
|
137
|
+
createdAt$between: [
|
|
138
|
+
Date.now() - 7 * 86400000, // 7天前
|
|
139
|
+
Date.now() // 现在
|
|
140
|
+
],
|
|
141
|
+
roleId$between: [1, 10] // 角色 ID 1-10
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
return befly.tool.Yes('类型安全示例', {
|
|
145
|
+
user: user,
|
|
146
|
+
total: result.total,
|
|
147
|
+
activeCount: activeUsers.length
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "befly-tpl",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.50",
|
|
4
4
|
"description": "Befly 3.0 TypeScript Template",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
],
|
|
29
29
|
"type": "module",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@befly-addon/admin": "^1.0.
|
|
32
|
-
"befly": "^3.8.
|
|
31
|
+
"@befly-addon/admin": "^1.0.55",
|
|
32
|
+
"befly": "^3.8.30"
|
|
33
33
|
},
|
|
34
34
|
"engines": {
|
|
35
35
|
"bun": ">=1.3.0"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "2031550167896390ac58c50aeb52b8c23426844e"
|
|
38
38
|
}
|