@llryiop/avatar-boot-cli 1.0.0 → 1.0.2
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/docs/exam-question-generate-api.md +163 -0
- package/package.json +1 -1
- package/src/prompts.js +3 -3
- package/src/transform.js +1 -1
- package/templates/.claude/skills/avatar-boot-starter-feign/README.md +243 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +47 -219
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/212/237/350/203/275/350/257/246/350/247/243.md +65 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//351/205/215/347/275/256/345/217/202/350/200/203.md +70 -0
- package/templates/.claude/skills/avatar-boot-starter-job/README.md +437 -0
- package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +35 -414
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/270/270/350/247/201/351/227/256/351/242/230.md +55 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +124 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//347/233/221/346/216/247/346/214/207/346/240/207.md +72 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/README.md +580 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +36 -560
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/234/200/344/275/263/345/256/236/350/267/265.md +43 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/240/270/345/277/203/345/212/237/350/203/275.md +117 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//351/205/215/347/275/256/345/217/202/350/200/203.md +54 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/README.md +572 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +40 -550
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/256/236/344/275/223/344/270/216/345/212/237/350/203/275.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/346/225/260/346/215/256/346/272/220.md +91 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//351/253/230/347/272/247/347/211/271/346/200/247/344/270/216/351/205/215/347/275/256.md +59 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/README.md +901 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +40 -879
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/212/237/350/203/275/344/275/277/347/224/250.md +134 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//346/225/205/351/232/234/346/216/222/346/237/245.md +64 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/README.md +594 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +52 -570
- package/templates/.claude/skills/avatar-boot-starter-oss/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//346/240/270/345/277/203/345/212/237/350/203/275.md +94 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//350/247/204/350/214/203/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +61 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/README.md +586 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +42 -566
- package/templates/.claude/skills/avatar-boot-starter-redis/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +78 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//346/225/260/346/215/256/346/223/215/344/275/234.md +111 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//351/253/230/347/272/247/345/212/237/350/203/275.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/README.md +662 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +48 -640
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//346/240/270/345/277/203/345/212/237/350/203/275.md +101 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/205/215/347/275/256/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +44 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/253/230/347/272/247/347/211/271/346/200/247.md +71 -0
- package/templates/.claude/skills/avatar-boot-starter-web/README.md +1007 -0
- package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +150 -1003
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-LogInfo/346/263/250/350/247/243.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/345/205/250/345/261/200/345/274/202/345/270/270/345/244/204/347/220/206.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/214/207/346/240/207/347/233/221/346/216/247.md +74 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/227/245/345/277/227/344/275/223/347/263/273.md +73 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/350/257/267/346/261/202/344/270/212/344/270/213/346/226/207.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +52 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//346/263/250/346/204/217/344/272/213/351/241/271.md +68 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//350/207/252/345/256/232/344/271/211/346/211/251/345/261/225/346/214/207/345/215/227.md +107 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//351/205/215/347/275/256/345/217/202/350/200/203.md +107 -0
- package/templates/.claude/skills/crud-generator/SKILL.md +133 -64
- package/templates/.claude/skills/database-design/README.md +207 -0
- package/templates/.claude/skills/database-design/SKILL.md +469 -82
- package/templates/.claude/skills/database-design/references//345/221/275/345/220/215/350/247/204/350/214/203.md +232 -0
- package/templates/.claude/skills/database-design/references//345/255/227/346/256/265/347/261/273/345/236/213/350/247/204/350/214/203.md +400 -0
- package/templates/.claude/skills/database-design/references//347/264/242/345/274/225/350/247/204/350/214/203.md +506 -0
- package/templates/README.md +65 -100
- package/templates/avatar-scaffold-api/pom.xml +0 -5
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +2 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginErrorCode.java +25 -0
- package/templates/avatar-scaffold-service/pom.xml +25 -87
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +4 -1
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/UserLoginRepository.java +10 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +4 -1
- package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +3 -5
- package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +21 -21
- package/templates/pom.xml +9 -18
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Redis 数据操作
|
|
2
|
+
|
|
3
|
+
## String 操作
|
|
4
|
+
|
|
5
|
+
```java
|
|
6
|
+
@Resource
|
|
7
|
+
private RedisStringClient redisStringClient;
|
|
8
|
+
|
|
9
|
+
// 设置值(带过期时间)
|
|
10
|
+
redisStringClient.set("key", "value", Duration.ofMinutes(5));
|
|
11
|
+
|
|
12
|
+
// 获取值
|
|
13
|
+
String value = redisStringClient.get("key");
|
|
14
|
+
|
|
15
|
+
// 递增
|
|
16
|
+
Long count = redisStringClient.increment("counter");
|
|
17
|
+
|
|
18
|
+
// 批量操作
|
|
19
|
+
Map<String, String> batch = Map.of("k1", "v1", "k2", "v2");
|
|
20
|
+
redisStringClient.multiSet(batch);
|
|
21
|
+
Map<String, String> result = redisStringClient.multiGet(batch.keySet());
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Hash 操作
|
|
25
|
+
|
|
26
|
+
```java
|
|
27
|
+
@Resource
|
|
28
|
+
private RedisHashClient redisHashClient;
|
|
29
|
+
|
|
30
|
+
// 存储字段
|
|
31
|
+
redisHashClient.put("user:1", "name", "张三");
|
|
32
|
+
redisHashClient.put("user:1", "age", "25");
|
|
33
|
+
|
|
34
|
+
// 获取字段
|
|
35
|
+
String name = redisHashClient.get("user:1", "name");
|
|
36
|
+
|
|
37
|
+
// 获取所有字段
|
|
38
|
+
Map<Object, Object> user = redisHashClient.getAll("user:1");
|
|
39
|
+
|
|
40
|
+
// 递增字段
|
|
41
|
+
redisHashClient.increment("user:1", "age", 1);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Set 操作
|
|
45
|
+
|
|
46
|
+
```java
|
|
47
|
+
@Resource
|
|
48
|
+
private RedisSetClient redisSetClient;
|
|
49
|
+
|
|
50
|
+
// 添加成员
|
|
51
|
+
redisSetClient.add("tags", "java", "spring", "redis");
|
|
52
|
+
|
|
53
|
+
// 获取所有成员
|
|
54
|
+
Set<Object> tags = redisSetClient.members("tags");
|
|
55
|
+
|
|
56
|
+
// 判断是否存在
|
|
57
|
+
boolean exists = redisSetClient.isMember("tags", "java");
|
|
58
|
+
|
|
59
|
+
// 移除成员
|
|
60
|
+
redisSetClient.remove("tags", "redis");
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## ZSet 操作
|
|
64
|
+
|
|
65
|
+
```java
|
|
66
|
+
@Resource
|
|
67
|
+
private RedisZSetClient redisZSetClient;
|
|
68
|
+
|
|
69
|
+
// 添加成员(带分数)
|
|
70
|
+
redisZSetClient.add("ranking", "user1", 100.0);
|
|
71
|
+
redisZSetClient.add("ranking", "user2", 200.0);
|
|
72
|
+
|
|
73
|
+
// 获取排名(从高到低,取前10)
|
|
74
|
+
Set<Object> top = redisZSetClient.reverseRange("ranking", 0, 9);
|
|
75
|
+
|
|
76
|
+
// 获取分数
|
|
77
|
+
Double score = redisZSetClient.score("ranking", "user1");
|
|
78
|
+
|
|
79
|
+
// 递增分数
|
|
80
|
+
redisZSetClient.incrementScore("ranking", "user1", 10.0);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 缓存操作
|
|
84
|
+
|
|
85
|
+
```java
|
|
86
|
+
@Resource
|
|
87
|
+
private RedisCacheClient redisCacheClient;
|
|
88
|
+
|
|
89
|
+
// 设置缓存(自动 JSON 序列化)
|
|
90
|
+
redisCacheClient.set("cache:user:1", user, Duration.ofHours(1));
|
|
91
|
+
|
|
92
|
+
// 获取缓存(自动反序列化)
|
|
93
|
+
User user = redisCacheClient.get("cache:user:1", User.class);
|
|
94
|
+
|
|
95
|
+
// 删除缓存
|
|
96
|
+
redisCacheClient.delete("cache:user:1");
|
|
97
|
+
|
|
98
|
+
// 批量删除(按 pattern)
|
|
99
|
+
redisCacheClient.deletePattern("cache:user:*");
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Key 命名规范
|
|
103
|
+
|
|
104
|
+
使用冒号分隔,格式:`业务:类型:ID`
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
cache:user:123
|
|
108
|
+
lock:order:456
|
|
109
|
+
rate:api:sms
|
|
110
|
+
bloom:user:exists
|
|
111
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Redis 高级功能
|
|
2
|
+
|
|
3
|
+
## 分布式锁
|
|
4
|
+
|
|
5
|
+
```java
|
|
6
|
+
@Resource
|
|
7
|
+
private RedissonLockClient lockClient;
|
|
8
|
+
|
|
9
|
+
// 方式一:回调方式(推荐,自动释放锁)
|
|
10
|
+
lockClient.lock("order:lock:123", 30, TimeUnit.SECONDS, () -> {
|
|
11
|
+
processOrder(orderId);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// 方式二:手动加锁/解锁
|
|
15
|
+
boolean locked = lockClient.tryLock("order:lock:123", 3, 30, TimeUnit.SECONDS);
|
|
16
|
+
if (locked) {
|
|
17
|
+
try {
|
|
18
|
+
processOrder(orderId);
|
|
19
|
+
} finally {
|
|
20
|
+
lockClient.unlock("order:lock:123"); // 必须释放
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**注意**:
|
|
26
|
+
- 锁超时时间要大于业务执行时间,避免锁提前释放
|
|
27
|
+
- 必须使用 try-finally 或回调方式,防止异常导致死锁
|
|
28
|
+
- 锁 Key 命名规范:`lock:{业务}:{唯一标识}`
|
|
29
|
+
|
|
30
|
+
## 限流
|
|
31
|
+
|
|
32
|
+
```java
|
|
33
|
+
@Resource
|
|
34
|
+
private RedisRateLimiterClient rateLimiterClient;
|
|
35
|
+
|
|
36
|
+
// 令牌桶限流(每秒最多 10 个请求)
|
|
37
|
+
boolean allowed = rateLimiterClient.tryAcquire("api:limit", 10, 1, TimeUnit.SECONDS);
|
|
38
|
+
if (allowed) {
|
|
39
|
+
// 处理请求
|
|
40
|
+
} else {
|
|
41
|
+
throw new BusinessException(ResultCode.TOO_MANY_REQUESTS, "请求过于频繁");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 滑动窗口限流(60 秒内最多 10 次)
|
|
45
|
+
boolean allowed = rateLimiterClient.slidingWindowLimit("api:sms", 10, 60);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**选择建议**:
|
|
49
|
+
- **令牌桶**:适合平滑限流,允许短时突发
|
|
50
|
+
- **滑动窗口**:适合精确控制时间窗口内的请求次数(如短信验证码)
|
|
51
|
+
|
|
52
|
+
## 布隆过滤器
|
|
53
|
+
|
|
54
|
+
适用于大数据量下的快速存在性判断(如防止缓存穿透):
|
|
55
|
+
|
|
56
|
+
```java
|
|
57
|
+
@Resource
|
|
58
|
+
private RedisBloomFilterClient bloomFilterClient;
|
|
59
|
+
|
|
60
|
+
// 初始化(预期元素数量 100 万,误判率 0.01)
|
|
61
|
+
bloomFilterClient.init("user:bloom", 1000000, 0.01);
|
|
62
|
+
|
|
63
|
+
// 添加元素
|
|
64
|
+
bloomFilterClient.add("user:bloom", "user123");
|
|
65
|
+
|
|
66
|
+
// 判断是否存在(返回 false 一定不存在,返回 true 可能存在)
|
|
67
|
+
boolean exists = bloomFilterClient.contains("user:bloom", "user123");
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**防缓存穿透示例**:
|
|
71
|
+
```java
|
|
72
|
+
public User getUser(Long userId) {
|
|
73
|
+
String key = String.valueOf(userId);
|
|
74
|
+
// 布隆过滤器快速判断
|
|
75
|
+
if (!bloomFilterClient.contains("user:bloom", key)) {
|
|
76
|
+
return null; // 一定不存在,直接返回
|
|
77
|
+
}
|
|
78
|
+
// 查缓存
|
|
79
|
+
User user = redisCacheClient.get("cache:user:" + userId, User.class);
|
|
80
|
+
if (user != null) return user;
|
|
81
|
+
// 查数据库
|
|
82
|
+
user = userMapper.selectById(userId);
|
|
83
|
+
if (user != null) {
|
|
84
|
+
redisCacheClient.set("cache:user:" + userId, user, Duration.ofHours(1));
|
|
85
|
+
}
|
|
86
|
+
return user;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**注意**:布隆过滤器不支持删除元素,适合只增不删的场景。
|