---
name: springboot-notification-module-skill
description: Spring Boot 通知模块技能。面向已有 Spring Boot 项目的开发者,提供短信发送、邮件推送、站内消息、推送通知等能力的快速集成。触发词:"短信验证码"、"发送短信"、"发送邮件"、"站内消息"、"通知模块"、"notification module"、"sms"、"email"、"mail"。
---
# Spring Notification Module Skill
面向**已有 Spring Boot 项目**的开发者,快速集成通知能力。
## 能力清单
| 能力 | 说明 |
|------|------|
| **短信发送** | 验证码/通知短信 |
| **邮件推送** | HTML/文本邮件/模板邮件 |
| **站内消息** | 系统通知/未读消息 |
| **推送通知** | 极光/信鸽/个推 |
| **消息模板** | 模板管理和渲染 |
## 触发场景
用户说"帮我加短信"或"集成通知"时触发。
## 核心实现
### 依赖配置
```xml
com.aliyun
dysmsapi20170525
org.springframework.boot
spring-boot-starter-mail
org.springframework.boot
spring-boot-starter-data-redis
```
### 配置
```yaml
# 短信配置
sms:
aliyun:
access-key: ${SMS_ACCESS_KEY:}
secret-key: ${SMS_SECRET_KEY:}
sign-name: ${SMS_SIGN_NAME:}
template-code: ${SMS_TEMPLATE_CODE:}
# 邮件配置
spring:
mail:
host: ${MAIL_HOST:smtp.qq.com}
port: 587
username: ${MAIL_USERNAME:}
password: ${MAIL_PASSWORD:}
properties:
mail:
smtp:
auth: true
starttls:
enable: true
# 站内消息配置
notification:
redis-key-prefix: notification:
```
### 实体类
```java
// 站内消息
@Entity
@Table(name = "wg_notification")
public class Notification {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userId;
private String title;
@Column(columnDefinition = "text")
private String content;
@Enumerated(EnumType.STRING)
private NotificationType type;
private String link;
private Integer isRead;
private LocalDateTime createdAt;
}
public enum NotificationType { SYSTEM, SMS, EMAIL, PUSH }
@Entity
@Table(name = "wg_sms_code")
public class SmsCode {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String phone;
private String code;
private String templateCode;
private LocalDateTime expireTime;
private Integer used;
private LocalDateTime createdAt;
}
```
### 服务层
```java
@Service
public class NotificationService {
@Autowired
private SmsTemplate smsTemplate;
@Autowired
private SpringMailSender mailSender;
@Autowired
private NotificationRepository notificationRepository;
// 发送短信验证码
public void sendSmsCode(String phone, String templateCode) {
String code = generateCode(6);
// 调用短信API
SendSmsRequest request = new SendSmsRequest()
.setPhoneNumbers(phone)
.setSignName("您的签名")
.setTemplateCode(templateCode)
.setTemplateParam("{\"code\":\"" + code + "\"}");
smsTemplate.send(request);
// 保存验证码
SmsCode smsCode = new SmsCode();
smsCode.setPhone(phone);
smsCode.setCode(code);
smsCode.setTemplateCode(templateCode);
smsCode.setExpireTime(LocalDateTime.now().plusMinutes(5));
smsCodeRepository.save(smsCode);
}
// 发送邮件
public void sendEmail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("noreply@example.com");
message.setTo(to);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
// 发送站内消息
public void sendNotification(String userId, String title, String content, NotificationType type) {
Notification notification = new Notification();
notification.setUserId(userId);
notification.setTitle(title);
notification.setContent(content);
notification.setType(type);
notification.setIsRead(0);
notification.setCreatedAt(LocalDateTime.now());
notificationRepository.save(notification);
// Redis 推送
redisTemplate.convertAndSend("notification:" + userId, notification);
}
}
```
### Controller
```java
@RestController
@RequestMapping("/api/notification")
public class NotificationController {
@Autowired
private NotificationService notificationService;
// 发送短信验证码
@PostMapping("/sms/send")
public ApiResponse sendSms(@RequestParam String phone) {
notificationService.sendSmsCode(phone, "SMS_123456789");
return ApiResponse.ok(null);
}
// 验证短信验证码
@PostMapping("/sms/verify")
public ApiResponse verifySms(@RequestParam String phone, @RequestParam String code) {
boolean valid = notificationService.verifySmsCode(phone, code);
return ApiResponse.ok(valid);
}
// 发送邮件
@PostMapping("/email/send")
public ApiResponse sendEmail(@RequestBody SendEmailRequest request) {
notificationService.sendEmail(request.getTo(), request.getSubject(), request.getContent());
return ApiResponse.ok(null);
}
// 发送站内消息
@PostMapping("/send")
public ApiResponse sendNotification(@RequestBody SendNotificationRequest request) {
notificationService.sendNotification(
request.getUserId(),
request.getTitle(),
request.getContent(),
NotificationType.valueOf(request.getType())
);
return ApiResponse.ok(null);
}
// 查询未读消息
@GetMapping("/unread")
public ApiResponse> getUnread(@RequestParam String userId) {
List list = notificationService.getUnreadNotifications(userId);
return ApiResponse.ok(list);
}
}
```
## 不做
- 不负责短信/邮件服务商账号配置
- 不处理复杂的推送策略
- 不提供 UI 相关代码