@svton/cli 1.2.2 → 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.
Files changed (102) hide show
  1. package/dist/index.js +58 -27
  2. package/dist/index.mjs +58 -27
  3. package/package.json +1 -3
  4. package/templates/apps/admin/next-env.d.ts +0 -2
  5. package/templates/apps/admin/next.config.js +0 -15
  6. package/templates/apps/admin/package.json.tpl +0 -54
  7. package/templates/apps/admin/postcss.config.js +0 -6
  8. package/templates/apps/admin/src/app/globals.css +0 -37
  9. package/templates/apps/admin/src/app/layout.tsx +0 -19
  10. package/templates/apps/admin/src/app/login/page.tsx +0 -96
  11. package/templates/apps/admin/src/app/page.tsx +0 -8
  12. package/templates/apps/admin/src/app/users/page.tsx +0 -165
  13. package/templates/apps/admin/src/components/ui/switch.tsx +0 -29
  14. package/templates/apps/admin/src/hooks/useAPI.ts +0 -130
  15. package/templates/apps/admin/src/lib/api-client.ts +0 -112
  16. package/templates/apps/admin/src/lib/api-server.ts +0 -95
  17. package/templates/apps/admin/tailwind.config.js +0 -54
  18. package/templates/apps/admin/tsconfig.json +0 -22
  19. package/templates/apps/backend/.env.example +0 -29
  20. package/templates/apps/backend/nest-cli.json +0 -8
  21. package/templates/apps/backend/package.json.tpl +0 -57
  22. package/templates/apps/backend/prisma/schema.prisma +0 -72
  23. package/templates/apps/backend/prisma/seed.ts +0 -32
  24. package/templates/apps/backend/src/app.controller.ts +0 -15
  25. package/templates/apps/backend/src/app.module.ts +0 -85
  26. package/templates/apps/backend/src/app.service.ts +0 -12
  27. package/templates/apps/backend/src/auth/auth.controller.ts +0 -31
  28. package/templates/apps/backend/src/auth/auth.module.ts +0 -27
  29. package/templates/apps/backend/src/auth/auth.service.ts +0 -89
  30. package/templates/apps/backend/src/auth/jwt-auth.guard.ts +0 -5
  31. package/templates/apps/backend/src/auth/jwt.strategy.ts +0 -27
  32. package/templates/apps/backend/src/config/env.schema.ts +0 -35
  33. package/templates/apps/backend/src/main.ts +0 -51
  34. package/templates/apps/backend/src/object-storage/object-storage.controller.ts +0 -114
  35. package/templates/apps/backend/src/object-storage/object-storage.module.ts +0 -7
  36. package/templates/apps/backend/src/prisma/prisma.module.ts +0 -9
  37. package/templates/apps/backend/src/prisma/prisma.service.ts +0 -13
  38. package/templates/apps/backend/src/user/user.controller.ts +0 -50
  39. package/templates/apps/backend/src/user/user.module.ts +0 -12
  40. package/templates/apps/backend/src/user/user.service.ts +0 -117
  41. package/templates/apps/backend/tsconfig.json +0 -23
  42. package/templates/apps/mobile/babel.config.js +0 -8
  43. package/templates/apps/mobile/config/index.ts +0 -65
  44. package/templates/apps/mobile/package.json.tpl +0 -48
  45. package/templates/apps/mobile/project.config.json.tpl +0 -17
  46. package/templates/apps/mobile/src/app.config.ts +0 -9
  47. package/templates/apps/mobile/src/app.scss +0 -4
  48. package/templates/apps/mobile/src/app.ts +0 -8
  49. package/templates/apps/mobile/src/hooks/useAPI.ts +0 -285
  50. package/templates/apps/mobile/src/pages/index/index.scss +0 -7
  51. package/templates/apps/mobile/src/pages/index/index.tsx +0 -49
  52. package/templates/apps/mobile/src/services/api.ts +0 -155
  53. package/templates/apps/mobile/src/services/upload.service.ts +0 -41
  54. package/templates/apps/mobile/tsconfig.json +0 -21
  55. package/templates/configs/authz.config.ts +0 -10
  56. package/templates/configs/cache.config.ts +0 -14
  57. package/templates/configs/oauth.config.ts +0 -20
  58. package/templates/configs/payment.config.ts +0 -44
  59. package/templates/configs/queue.config.ts +0 -21
  60. package/templates/configs/rate-limit.config.ts +0 -16
  61. package/templates/configs/sms.config.ts +0 -11
  62. package/templates/configs/storage.config.ts +0 -14
  63. package/templates/examples/README.md +0 -258
  64. package/templates/examples/authz/README.md +0 -273
  65. package/templates/examples/authz/roles.guard.ts +0 -37
  66. package/templates/examples/authz/user.controller.ts +0 -116
  67. package/templates/examples/cache/README.md +0 -82
  68. package/templates/examples/cache/user.controller.ts +0 -42
  69. package/templates/examples/cache/user.service.ts +0 -78
  70. package/templates/examples/oauth/README.md +0 -192
  71. package/templates/examples/oauth/auth.controller.ts +0 -99
  72. package/templates/examples/oauth/auth.service.ts +0 -97
  73. package/templates/examples/payment/README.md +0 -151
  74. package/templates/examples/payment/order.controller.ts +0 -56
  75. package/templates/examples/payment/order.service.ts +0 -132
  76. package/templates/examples/payment/webhook.controller.ts +0 -73
  77. package/templates/examples/queue/README.md +0 -134
  78. package/templates/examples/queue/email.controller.ts +0 -34
  79. package/templates/examples/queue/email.processor.ts +0 -68
  80. package/templates/examples/queue/email.service.ts +0 -64
  81. package/templates/examples/rate-limit/README.md +0 -249
  82. package/templates/examples/rate-limit/api.controller.ts +0 -113
  83. package/templates/examples/sms/README.md +0 -121
  84. package/templates/examples/sms/sms.service.ts +0 -69
  85. package/templates/examples/sms/verification.controller.ts +0 -100
  86. package/templates/examples/storage/README.md +0 -224
  87. package/templates/examples/storage/upload.controller.ts +0 -117
  88. package/templates/examples/storage/upload.service.ts +0 -123
  89. package/templates/packages/types/package.json.tpl +0 -16
  90. package/templates/packages/types/src/api.ts +0 -88
  91. package/templates/packages/types/src/common.ts +0 -89
  92. package/templates/packages/types/src/index.ts +0 -3
  93. package/templates/packages/types/tsconfig.json +0 -16
  94. package/templates/skills/authz.skill.md +0 -42
  95. package/templates/skills/base.skill.md +0 -57
  96. package/templates/skills/cache.skill.md +0 -88
  97. package/templates/skills/oauth.skill.md +0 -41
  98. package/templates/skills/payment.skill.md +0 -129
  99. package/templates/skills/queue.skill.md +0 -140
  100. package/templates/skills/rate-limit.skill.md +0 -38
  101. package/templates/skills/sms.skill.md +0 -39
  102. package/templates/skills/storage.skill.md +0 -42
@@ -1,273 +0,0 @@
1
- # 权限控制示例
2
-
3
- 本示例展示如何使用 `@svton/nestjs-authz` 模块实现 RBAC 权限管理。
4
-
5
- ## 文件说明
6
-
7
- - `user.controller.ts` - 用户控制器,展示权限控制
8
- - `roles.guard.ts` - 角色守卫,验证用户权限
9
-
10
- ## 核心装饰器
11
-
12
- ### @Roles - 角色权限
13
-
14
- 限制只有特定角色才能访问:
15
-
16
- ```typescript
17
- @Roles('admin')
18
- @Get('admin')
19
- async adminOnly() {
20
- return { message: 'Admin only' };
21
- }
22
- ```
23
-
24
- 支持多个角色(满足其一即可):
25
-
26
- ```typescript
27
- @Roles('admin', 'manager')
28
- @Get('list')
29
- async list() {
30
- return { message: 'Admin or Manager' };
31
- }
32
- ```
33
-
34
- ### @Permissions - 细粒度权限
35
-
36
- 基于权限点的访问控制:
37
-
38
- ```typescript
39
- @Permissions('user:delete')
40
- @Delete(':id')
41
- async delete(@Param('id') id: string) {
42
- return { message: 'User deleted' };
43
- }
44
- ```
45
-
46
- 支持多个权限(需要全部满足):
47
-
48
- ```typescript
49
- @Permissions('user:update', 'user:sensitive')
50
- @Put(':id/sensitive')
51
- async updateSensitive() {
52
- return { message: 'Updated' };
53
- }
54
- ```
55
-
56
- ### 组合使用
57
-
58
- 同时检查角色和权限:
59
-
60
- ```typescript
61
- @Roles('admin')
62
- @Permissions('user:delete')
63
- @Delete(':id')
64
- async delete() {
65
- // 需要 admin 角色且有 user:delete 权限
66
- }
67
- ```
68
-
69
- ## 权限模型
70
-
71
- ### 角色(Roles)
72
-
73
- - `admin` - 管理员,拥有所有权限
74
- - `manager` - 管理者,拥有部分管理权限
75
- - `user` - 普通用户,基础权限
76
- - `guest` - 访客,只读权限
77
-
78
- ### 权限点(Permissions)
79
-
80
- - `user:create` - 创建用户
81
- - `user:read` - 查看用户
82
- - `user:update` - 更新用户
83
- - `user:delete` - 删除用户
84
- - `user:batch-delete` - 批量删除用户
85
- - `user:reset-password` - 重置密码
86
-
87
- ## 测试接口
88
-
89
- ### 查看用户列表(需要 admin 或 manager)
90
-
91
- ```bash
92
- curl http://localhost:3000/examples/users
93
- ```
94
-
95
- ### 查看用户详情(所有用户)
96
-
97
- ```bash
98
- curl http://localhost:3000/examples/users/1
99
- ```
100
-
101
- ### 创建用户(需要 admin)
102
-
103
- ```bash
104
- curl -X POST http://localhost:3000/examples/users \
105
- -H "Content-Type: application/json" \
106
- -d '{"name":"New User","email":"user@example.com"}'
107
- ```
108
-
109
- ### 更新用户(需要 user:update 权限)
110
-
111
- ```bash
112
- curl -X PUT http://localhost:3000/examples/users/1 \
113
- -H "Content-Type: application/json" \
114
- -d '{"name":"Updated Name"}'
115
- ```
116
-
117
- ### 删除用户(需要 admin 角色和 user:delete 权限)
118
-
119
- ```bash
120
- curl -X DELETE http://localhost:3000/examples/users/1
121
- ```
122
-
123
- ## 权限配置
124
-
125
- 在 `src/config/authz.config.ts` 中配置:
126
-
127
- ```typescript
128
- export const useAuthzConfig = (configService: ConfigService) => ({
129
- roles: ['admin', 'manager', 'user', 'guest'],
130
- defaultRole: 'guest',
131
- rolePermissions: {
132
- admin: ['*'], // 所有权限
133
- manager: [
134
- 'user:read',
135
- 'user:update',
136
- 'user:reset-password',
137
- ],
138
- user: [
139
- 'user:read',
140
- ],
141
- guest: [],
142
- },
143
- });
144
- ```
145
-
146
- ## 实现原理
147
-
148
- ### 1. 定义守卫
149
-
150
- ```typescript
151
- @Injectable()
152
- export class RolesGuard implements CanActivate {
153
- canActivate(context: ExecutionContext): boolean {
154
- const requiredRoles = this.reflector.get('roles', context.getHandler());
155
- const user = context.switchToHttp().getRequest().user;
156
-
157
- return requiredRoles.some(role => user.role === role);
158
- }
159
- }
160
- ```
161
-
162
- ### 2. 应用守卫
163
-
164
- ```typescript
165
- @Controller('users')
166
- @UseGuards(RolesGuard)
167
- export class UserController {
168
- // 所有接口都会应用权限检查
169
- }
170
- ```
171
-
172
- ### 3. 使用装饰器
173
-
174
- ```typescript
175
- @Roles('admin')
176
- @Get('admin')
177
- async adminOnly() { }
178
- ```
179
-
180
- ## 最佳实践
181
-
182
- 1. **最小权限原则**:只授予必要的权限
183
- 2. **角色分层**:设计合理的角色层级
184
- 3. **权限粒度**:根据业务需求设计权限点
185
- 4. **动态权限**:支持运行时动态调整权限
186
- 5. **权限缓存**:缓存用户权限,提高性能
187
-
188
- ## 常见场景
189
-
190
- ### 用户管理
191
-
192
- ```typescript
193
- @Roles('admin')
194
- @Get('users')
195
- async getUsers() { } // 只有管理员可以查看用户列表
196
-
197
- @Permissions('user:update')
198
- @Put('users/:id')
199
- async updateUser() { } // 需要更新权限
200
- ```
201
-
202
- ### 内容管理
203
-
204
- ```typescript
205
- @Roles('admin', 'editor')
206
- @Post('articles')
207
- async createArticle() { } // 管理员和编辑可以创建文章
208
-
209
- @Permissions('article:publish')
210
- @Post('articles/:id/publish')
211
- async publishArticle() { } // 需要发布权限
212
- ```
213
-
214
- ### 数据导出
215
-
216
- ```typescript
217
- @Roles('admin', 'manager')
218
- @Get('export')
219
- async export() { } // 管理员和管理者可以导出数据
220
- ```
221
-
222
- ## 高级用法
223
-
224
- ### 动态权限检查
225
-
226
- ```typescript
227
- @Get(':id')
228
- async findOne(@Param('id') id: string, @Req() req) {
229
- const user = req.user;
230
-
231
- // 用户只能查看自己的数据,管理员可以查看所有
232
- if (user.role !== 'admin' && user.id !== parseInt(id)) {
233
- throw new ForbiddenException('Access denied');
234
- }
235
-
236
- return this.userService.findOne(id);
237
- }
238
- ```
239
-
240
- ### 资源级权限
241
-
242
- ```typescript
243
- @Put(':id')
244
- async update(@Param('id') id: string, @Req() req) {
245
- const resource = await this.userService.findOne(id);
246
-
247
- // 检查用户是否有权限修改这个资源
248
- if (!this.authzService.canModify(req.user, resource)) {
249
- throw new ForbiddenException('Access denied');
250
- }
251
-
252
- return this.userService.update(id, data);
253
- }
254
- ```
255
-
256
- ### 条件权限
257
-
258
- ```typescript
259
- @Post('approve')
260
- @Permissions('order:approve')
261
- async approve(@Body() data, @Req() req) {
262
- // 只能审批金额小于 10000 的订单
263
- if (data.amount > 10000 && !req.user.permissions.includes('order:approve-large')) {
264
- throw new ForbiddenException('Cannot approve large orders');
265
- }
266
-
267
- return this.orderService.approve(data.id);
268
- }
269
- ```
270
-
271
- ## 更多信息
272
-
273
- 查看官方文档:https://751848178.github.io/svton/packages/nestjs-authz
@@ -1,37 +0,0 @@
1
- import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
2
- import { Reflector } from '@nestjs/core';
3
-
4
- @Injectable()
5
- export class RolesGuard implements CanActivate {
6
- constructor(private reflector: Reflector) {}
7
-
8
- canActivate(context: ExecutionContext): boolean {
9
- // 获取装饰器设置的角色
10
- const requiredRoles = this.reflector.getAllAndOverride<string[]>('roles', [
11
- context.getHandler(),
12
- context.getClass(),
13
- ]);
14
-
15
- if (!requiredRoles) {
16
- return true;
17
- }
18
-
19
- const request = context.switchToHttp().getRequest();
20
- const user = request.user;
21
-
22
- // TODO: 实际项目中从 JWT 或 Session 获取用户信息
23
- // 这里模拟用户信息
24
- if (!user) {
25
- // 模拟用户(实际应从认证中间件获取)
26
- request.user = {
27
- id: 1,
28
- name: 'Test User',
29
- role: 'admin', // 可以改为 'user', 'manager', 'guest' 测试不同角色
30
- permissions: ['user:update', 'user:delete', 'user:batch-delete', 'user:reset-password'],
31
- };
32
- }
33
-
34
- // 检查用户角色
35
- return requiredRoles.some((role) => user.role === role);
36
- }
37
- }
@@ -1,116 +0,0 @@
1
- import {
2
- Controller,
3
- Get,
4
- Post,
5
- Put,
6
- Delete,
7
- Body,
8
- Param,
9
- UseGuards,
10
- } from '@nestjs/common';
11
- import { Roles, Permissions, RolesGuard } from '@svton/nestjs-authz';
12
-
13
- @Controller('examples/users')
14
- @UseGuards(RolesGuard)
15
- export class UserController {
16
- /**
17
- * 查看用户列表 - 需要 admin 或 manager 角色
18
- */
19
- @Get()
20
- @Roles('admin', 'manager')
21
- findAll() {
22
- return {
23
- message: 'User list',
24
- users: [
25
- { id: 1, name: 'User 1', role: 'admin' },
26
- { id: 2, name: 'User 2', role: 'user' },
27
- ],
28
- };
29
- }
30
-
31
- /**
32
- * 查看用户详情 - 所有登录用户都可以
33
- */
34
- @Get(':id')
35
- findOne(@Param('id') id: string) {
36
- return {
37
- message: 'User detail',
38
- user: { id, name: `User ${id}`, role: 'user' },
39
- };
40
- }
41
-
42
- /**
43
- * 创建用户 - 需要 admin 角色
44
- */
45
- @Post()
46
- @Roles('admin')
47
- create(@Body() data: any) {
48
- return {
49
- message: 'User created',
50
- user: { id: 3, ...data },
51
- };
52
- }
53
-
54
- /**
55
- * 更新用户 - 需要 user:update 权限
56
- */
57
- @Put(':id')
58
- @Permissions('user:update')
59
- update(@Param('id') id: string, @Body() data: any) {
60
- return {
61
- message: 'User updated',
62
- user: { id, ...data },
63
- };
64
- }
65
-
66
- /**
67
- * 删除用户 - 需要 admin 角色和 user:delete 权限
68
- */
69
- @Delete(':id')
70
- @Roles('admin')
71
- @Permissions('user:delete')
72
- delete(@Param('id') id: string) {
73
- return {
74
- message: 'User deleted',
75
- userId: id,
76
- };
77
- }
78
-
79
- /**
80
- * 批量删除 - 需要 admin 角色和 user:batch-delete 权限
81
- */
82
- @Delete()
83
- @Roles('admin')
84
- @Permissions('user:batch-delete')
85
- batchDelete(@Body() data: { ids: string[] }) {
86
- return {
87
- message: 'Users deleted',
88
- count: data.ids.length,
89
- };
90
- }
91
-
92
- /**
93
- * 导出用户 - 需要 admin 或 manager 角色
94
- */
95
- @Get('export')
96
- @Roles('admin', 'manager')
97
- export() {
98
- return {
99
- message: 'Export users',
100
- url: 'https://example.com/users.xlsx',
101
- };
102
- }
103
-
104
- /**
105
- * 重置密码 - 需要 user:reset-password 权限
106
- */
107
- @Post(':id/reset-password')
108
- @Permissions('user:reset-password')
109
- resetPassword(@Param('id') id: string) {
110
- return {
111
- message: 'Password reset',
112
- userId: id,
113
- newPassword: 'temp123456',
114
- };
115
- }
116
- }
@@ -1,82 +0,0 @@
1
- # 缓存功能示例
2
-
3
- 本示例展示如何使用 `@svton/nestjs-cache` 模块进行声明式缓存。
4
-
5
- ## 文件说明
6
-
7
- - `user.service.ts` - 使用缓存装饰器的 Service 层
8
- - `user.controller.ts` - 对应的 Controller 层
9
-
10
- ## 核心装饰器
11
-
12
- ### @Cacheable - 缓存查询结果
13
-
14
- ```typescript
15
- @Cacheable({ key: 'user:#id', ttl: 3600 })
16
- async findOne(id: number) {
17
- // 首次调用会执行方法并缓存结果
18
- // 后续调用直接返回缓存数据
19
- }
20
- ```
21
-
22
- ### @CacheEvict - 清除缓存
23
-
24
- ```typescript
25
- @CacheEvict({ key: 'user:#id' })
26
- async update(id: number, data: any) {
27
- // 方法执行后会清除对应的缓存
28
- }
29
- ```
30
-
31
- ### @CachePut - 更新缓存
32
-
33
- ```typescript
34
- @CachePut({ key: 'user:#id' })
35
- async updateAndRefresh(id: number, data: any) {
36
- // 方法执行后会用返回值更新缓存
37
- }
38
- ```
39
-
40
- ## Key 表达式
41
-
42
- - `#id` - 从 request.params 获取
43
- - `#0`, `#1` - 位置参数
44
- - `#paramName` - 参数名
45
- - `#body.field` - 从 request.body 获取
46
- - `user:*` - 通配符模式(需要 pattern: true)
47
-
48
- ## 测试接口
49
-
50
- 启动项目后,可以通过以下接口测试:
51
-
52
- ```bash
53
- # 查询用户(首次会查询数据库,后续返回缓存)
54
- curl http://localhost:3000/examples/users/1
55
-
56
- # 查询用户列表
57
- curl http://localhost:3000/examples/users?page=1&pageSize=10
58
-
59
- # 更新用户(会清除缓存)
60
- curl -X PUT http://localhost:3000/examples/users/1 \
61
- -H "Content-Type: application/json" \
62
- -d '{"name":"New Name"}'
63
-
64
- # 更新用户并刷新缓存
65
- curl -X PUT http://localhost:3000/examples/users/1/refresh \
66
- -H "Content-Type: application/json" \
67
- -d '{"name":"New Name"}'
68
-
69
- # 清除所有用户缓存
70
- curl -X DELETE http://localhost:3000/examples/users/cache
71
- ```
72
-
73
- ## 最佳实践
74
-
75
- 1. **合理设置 TTL**:根据数据更新频率设置过期时间
76
- 2. **及时清除缓存**:更新/删除操作使用 @CacheEvict
77
- 3. **避免缓存穿透**:对空结果也进行缓存
78
- 4. **使用命名空间**:key 前缀区分不同业务
79
-
80
- ## 更多信息
81
-
82
- 查看官方文档:https://751848178.github.io/svton/packages/nestjs-cache
@@ -1,42 +0,0 @@
1
- import { Controller, Get, Put, Delete, Param, Body, Query } from '@nestjs/common';
2
- import { UserService, User } from './user.service';
3
-
4
- @Controller('examples/users')
5
- export class UserController {
6
- constructor(private readonly userService: UserService) {}
7
-
8
- @Get(':id')
9
- async findOne(@Param('id') id: string): Promise<User> {
10
- return this.userService.findOne(Number(id));
11
- }
12
-
13
- @Get()
14
- async findAll(
15
- @Query('page') page: string = '1',
16
- @Query('pageSize') pageSize: string = '10',
17
- ): Promise<User[]> {
18
- return this.userService.findAll(Number(page), Number(pageSize));
19
- }
20
-
21
- @Put(':id')
22
- async update(
23
- @Param('id') id: string,
24
- @Body() data: Partial<User>,
25
- ): Promise<User> {
26
- return this.userService.update(Number(id), data);
27
- }
28
-
29
- @Put(':id/refresh')
30
- async updateAndRefresh(
31
- @Param('id') id: string,
32
- @Body() data: Partial<User>,
33
- ): Promise<User> {
34
- return this.userService.updateAndRefresh(Number(id), data);
35
- }
36
-
37
- @Delete('cache')
38
- async clearCache(): Promise<{ message: string }> {
39
- await this.userService.clearAllCache();
40
- return { message: 'Cache cleared successfully' };
41
- }
42
- }
@@ -1,78 +0,0 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { Cacheable, CacheEvict, CachePut } from '@svton/nestjs-cache';
3
-
4
- export interface User {
5
- id: number;
6
- name: string;
7
- email: string;
8
- }
9
-
10
- @Injectable()
11
- export class UserService {
12
- /**
13
- * 缓存查询结果
14
- * key: user:#id 会自动从参数中获取 id 值
15
- * ttl: 缓存过期时间(秒)
16
- */
17
- @Cacheable({ key: 'user:#id', ttl: 3600 })
18
- async findOne(id: number): Promise<User> {
19
- console.log(`Fetching user ${id} from database...`);
20
- // TODO: 实际项目中从数据库查询
21
- return {
22
- id,
23
- name: `User ${id}`,
24
- email: `user${id}@example.com`,
25
- };
26
- }
27
-
28
- /**
29
- * 更新数据时清除缓存
30
- */
31
- @CacheEvict({ key: 'user:#id' })
32
- async update(id: number, data: Partial<User>): Promise<User> {
33
- console.log(`Updating user ${id}...`);
34
- // TODO: 实际项目中更新数据库
35
- return {
36
- id,
37
- name: data.name || `User ${id}`,
38
- email: data.email || `user${id}@example.com`,
39
- };
40
- }
41
-
42
- /**
43
- * 更新数据并刷新缓存
44
- */
45
- @CachePut({ key: 'user:#id' })
46
- async updateAndRefresh(id: number, data: Partial<User>): Promise<User> {
47
- console.log(`Updating and refreshing cache for user ${id}...`);
48
- // TODO: 实际项目中更新数据库
49
- return {
50
- id,
51
- name: data.name || `User ${id}`,
52
- email: data.email || `user${id}@example.com`,
53
- };
54
- }
55
-
56
- /**
57
- * 批量清除缓存(使用通配符)
58
- */
59
- @CacheEvict({ key: 'user:*', pattern: true })
60
- async clearAllCache(): Promise<void> {
61
- console.log('Clearing all user cache...');
62
- }
63
-
64
- /**
65
- * 列表查询缓存
66
- * 支持多个参数
67
- */
68
- @Cacheable({ key: 'users:list:#page:#pageSize', ttl: 300 })
69
- async findAll(page: number, pageSize: number): Promise<User[]> {
70
- console.log(`Fetching users page ${page}...`);
71
- // TODO: 实际项目中从数据库查询
72
- return Array.from({ length: pageSize }, (_, i) => ({
73
- id: (page - 1) * pageSize + i + 1,
74
- name: `User ${(page - 1) * pageSize + i + 1}`,
75
- email: `user${(page - 1) * pageSize + i + 1}@example.com`,
76
- }));
77
- }
78
- }