@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,101 @@
|
|
|
1
|
+
# RocketMQ 核心功能
|
|
2
|
+
|
|
3
|
+
## 1. 添加依赖
|
|
4
|
+
|
|
5
|
+
```xml
|
|
6
|
+
<dependency>
|
|
7
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
8
|
+
<artifactId>avatar-boot-starter-rocketmq</artifactId>
|
|
9
|
+
</dependency>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 2. 配置 RocketMQ
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
rocketmq:
|
|
16
|
+
name-server: 127.0.0.1:9876
|
|
17
|
+
producer:
|
|
18
|
+
group: my-producer-group
|
|
19
|
+
send-message-timeout: 3000
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
> 不需要 `@EnableRocketMQ` 注解,引入依赖自动配置。
|
|
23
|
+
|
|
24
|
+
## 3. 发送消息
|
|
25
|
+
|
|
26
|
+
```java
|
|
27
|
+
@Resource
|
|
28
|
+
private RocketMQProducer rocketMQProducer;
|
|
29
|
+
|
|
30
|
+
// 同步发送(等待结果)
|
|
31
|
+
rocketMQProducer.sendSync("test-topic", "test-tag", "Hello RocketMQ");
|
|
32
|
+
|
|
33
|
+
// 异步发送(不阻塞)
|
|
34
|
+
rocketMQProducer.sendAsync("test-topic", "test-tag", "Hello Async");
|
|
35
|
+
|
|
36
|
+
// 单向发送(不关心结果,最高性能)
|
|
37
|
+
rocketMQProducer.sendOneWay("test-topic", "test-tag", "Hello OneWay");
|
|
38
|
+
|
|
39
|
+
// 延迟消息(第4个参数为延迟级别,3=10秒)
|
|
40
|
+
rocketMQProducer.sendDelayed("test-topic", "test-tag", "Delayed Message", 3);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 4. 消费消息
|
|
44
|
+
|
|
45
|
+
```java
|
|
46
|
+
// 消费字符串消息
|
|
47
|
+
@Component
|
|
48
|
+
@RocketMQMessageListener(
|
|
49
|
+
topic = "test-topic",
|
|
50
|
+
consumerGroup = "my-consumer-group",
|
|
51
|
+
selectorExpression = "test-tag" // Tag 过滤,* 表示所有
|
|
52
|
+
)
|
|
53
|
+
public class TestConsumer implements RocketMQListener<String> {
|
|
54
|
+
|
|
55
|
+
@Override
|
|
56
|
+
public void onMessage(String message) {
|
|
57
|
+
log.info("收到消息: {}", message);
|
|
58
|
+
// 处理业务逻辑
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 消费对象消息(自动反序列化)
|
|
63
|
+
@Component
|
|
64
|
+
@RocketMQMessageListener(
|
|
65
|
+
topic = "order-topic",
|
|
66
|
+
consumerGroup = "order-consumer-group"
|
|
67
|
+
)
|
|
68
|
+
public class OrderConsumer implements RocketMQListener<Order> {
|
|
69
|
+
|
|
70
|
+
@Override
|
|
71
|
+
public void onMessage(Order order) {
|
|
72
|
+
log.info("收到订单: {}", order.getOrderId());
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// 顺序消费
|
|
77
|
+
@Component
|
|
78
|
+
@RocketMQMessageListener(
|
|
79
|
+
topic = "order-topic",
|
|
80
|
+
consumerGroup = "order-seq-group",
|
|
81
|
+
consumeMode = ConsumeMode.ORDERLY // 顺序消费
|
|
82
|
+
)
|
|
83
|
+
public class OrderSeqConsumer implements RocketMQListener<String> {
|
|
84
|
+
|
|
85
|
+
@Override
|
|
86
|
+
public void onMessage(String message) {
|
|
87
|
+
// 同一队列内的消息按顺序处理
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 延迟级别速查
|
|
93
|
+
|
|
94
|
+
| 级别 | 时间 | 级别 | 时间 |
|
|
95
|
+
|:--|:--|:--|:--|
|
|
96
|
+
| 1 | 1秒 | 10 | 6分钟 |
|
|
97
|
+
| 2 | 5秒 | 11 | 7分钟 |
|
|
98
|
+
| 3 | 10秒 | 14 | 10分钟 |
|
|
99
|
+
| 4 | 30秒 | 16 | 30分钟 |
|
|
100
|
+
| 5 | 1分钟 | 17 | 1小时 |
|
|
101
|
+
| 6 | 2分钟 | 18 | 2小时 |
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# RocketMQ 配置与注意事项
|
|
2
|
+
|
|
3
|
+
## 完整配置
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
rocketmq:
|
|
7
|
+
name-server: 127.0.0.1:9876 # NameServer 地址(必填)
|
|
8
|
+
producer:
|
|
9
|
+
group: my-producer-group # 生产者组名(必填)
|
|
10
|
+
send-message-timeout: 3000 # 发送超时时间(毫秒)
|
|
11
|
+
reliability:
|
|
12
|
+
enabled: false # 启用消息可靠性投递(默认 false)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 消费者注解参数
|
|
16
|
+
|
|
17
|
+
| 参数 | 说明 | 默认值 |
|
|
18
|
+
|:--|:--|:--|
|
|
19
|
+
| `topic` | 主题名称 | - |
|
|
20
|
+
| `consumerGroup` | 消费者组名 | - |
|
|
21
|
+
| `selectorExpression` | Tag 过滤表达式(`*` 表示所有) | `*` |
|
|
22
|
+
| `messageModel` | 消息模式(CLUSTERING/BROADCASTING) | `CLUSTERING` |
|
|
23
|
+
| `consumeMode` | 消费模式(CONCURRENTLY/ORDERLY) | `CONCURRENTLY` |
|
|
24
|
+
|
|
25
|
+
## 注意事项
|
|
26
|
+
|
|
27
|
+
1. **无需 @EnableRocketMQ**:引入依赖自动配置,不需要在启动类添加注解
|
|
28
|
+
|
|
29
|
+
2. **消费者幂等**:RocketMQ 自带重试机制,消费者**必须**实现幂等处理,防止重复消费
|
|
30
|
+
|
|
31
|
+
3. **异常处理**:消费者抛出异常会触发 RocketMQ 重试,谨慎捕获异常后不抛出
|
|
32
|
+
|
|
33
|
+
4. **消息大小**:单条消息不超过 4MB
|
|
34
|
+
|
|
35
|
+
5. **幂等性依赖 Redis**:`MessageIdempotentClient` 需要 Redis 支持,未配置 Redis 时自动禁用,不会报错
|
|
36
|
+
|
|
37
|
+
6. **顺序消费**:使用 `consumeMode = ConsumeMode.ORDERLY` 保证同一队列内顺序消费,但会降低并发性能
|
|
38
|
+
|
|
39
|
+
## 最佳实践
|
|
40
|
+
|
|
41
|
+
1. **Tag 过滤**:合理使用 Tag 减少无效消费,同一 Topic 下不同业务用不同 Tag 区分
|
|
42
|
+
2. **消费者组命名**:使用有意义的名称,如 `{服务名}-{业务}-consumer-group`
|
|
43
|
+
3. **批量发送**:大量消息使用批量发送提高性能
|
|
44
|
+
4. **死信队列**:消费多次失败后消息进入死信队列(`%DLQ%{consumerGroup}`),需监控处理
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# RocketMQ 高级特性
|
|
2
|
+
|
|
3
|
+
## 消息幂等性(可选,需要 Redis)
|
|
4
|
+
|
|
5
|
+
**启用条件**:配置了 Redis 连接信息,`MessageIdempotentClient` 自动检测 `RedissonClient` Bean,未配置 Redis 时自动禁用。
|
|
6
|
+
|
|
7
|
+
```java
|
|
8
|
+
@Resource
|
|
9
|
+
private MessageIdempotentClient idempotentClient;
|
|
10
|
+
|
|
11
|
+
@Component
|
|
12
|
+
@RocketMQMessageListener(topic = "order-topic", consumerGroup = "order-group")
|
|
13
|
+
public class OrderConsumer implements RocketMQListener<String> {
|
|
14
|
+
|
|
15
|
+
@Override
|
|
16
|
+
public void onMessage(String message) {
|
|
17
|
+
String messageId = extractMessageId(message); // 从消息中提取唯一ID
|
|
18
|
+
|
|
19
|
+
// 幂等检查
|
|
20
|
+
if (idempotentClient.isProcessed(messageId)) {
|
|
21
|
+
log.warn("消息已处理,跳过: {}", messageId);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
processMessage(message);
|
|
27
|
+
// 标记为已处理(保留 7 天)
|
|
28
|
+
idempotentClient.markProcessed(messageId, Duration.ofDays(7));
|
|
29
|
+
} catch (Exception e) {
|
|
30
|
+
log.error("消息处理失败", e);
|
|
31
|
+
throw e; // 抛出异常触发 RocketMQ 重试
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 消息可靠性投递(可选,基于本地文件)
|
|
38
|
+
|
|
39
|
+
**启用方式**:
|
|
40
|
+
```yaml
|
|
41
|
+
rocketmq:
|
|
42
|
+
reliability:
|
|
43
|
+
enabled: true
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**工作原理**:
|
|
47
|
+
1. 发送前:消息保存到本地文件(`~/.avatar/mq/messages/`,状态:PENDING)
|
|
48
|
+
2. 发送成功:更新状态为 SENT
|
|
49
|
+
3. 发送失败:记录失败原因,等待重试
|
|
50
|
+
4. 自动补偿:定时任务每分钟扫描 PENDING 消息并重试
|
|
51
|
+
5. 指数退避:重试间隔 60s → 120s → 240s → 480s → 960s
|
|
52
|
+
6. 自动清理:每天凌晨 2 点清理 7 天前已发送的消息
|
|
53
|
+
|
|
54
|
+
**消息文件格式**(`~/.avatar/mq/messages/{messageId}.json`):
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"messageId": "abc123",
|
|
58
|
+
"topic": "test-topic",
|
|
59
|
+
"tag": "test-tag",
|
|
60
|
+
"content": "Hello RocketMQ",
|
|
61
|
+
"status": "PENDING",
|
|
62
|
+
"retryCount": 0,
|
|
63
|
+
"maxRetryCount": 5,
|
|
64
|
+
"nextRetryTime": "2026-03-11T10:00:00"
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**特点**:
|
|
69
|
+
- 零侵入,不需要创建数据库表
|
|
70
|
+
- 消息存储在本地文件,重启后自动恢复
|
|
71
|
+
- 适合对消息丢失敏感的业务场景
|