# 成就模块迁移指南
## 📝 迁移概述
成就相关功能已从 `usercenter` 模块迁移到独立的 `achievement` 模块。
### 迁移日期
2025-10-24
### 迁移原因
- ✅ **模块职责分离** - usercenter负责用户中心,achievement专注于成就系统
- ✅ **更好的可维护性** - 独立模块易于管理和扩展
- ✅ **清晰的依赖关系** - 减少模块间的耦合
- ✅ **可扩展性** - 便于添加新的成就类型和功能
## 🔄 包路径变更
### API接口变更
**旧路径(已删除):**
```java
org.xyzh.api.usercenter.achievement.UserAchievementService
```
**新路径:**
```java
org.xyzh.api.achievement.AchievementService
```
### 服务实现变更
**旧路径(已删除):**
```java
org.xyzh.usercenter.service.UCUserAchievementService
org.xyzh.usercenter.service.impl.UCUserAchievementServiceImpl
```
**新路径:**
```java
org.xyzh.api.achievement.AchievementService
org.xyzh.achievement.service.impl.ACHAchievementServiceImpl
```
### Mapper变更
**旧路径(已删除):**
```java
org.xyzh.usercenter.mapper.AchievementMapper
org.xyzh.usercenter.mapper.UserAchievementMapper
```
**新路径:**
```java
org.xyzh.achievement.mapper.AchievementMapper
org.xyzh.achievement.mapper.UserAchievementMapper
org.xyzh.achievement.mapper.UserAchievementProgressMapper // 新增
```
### Controller变更
**旧路径(已删除):**
```java
org.xyzh.usercenter.controller.UserAchievementController
```
**新路径:**
```java
org.xyzh.achievement.controller.AchievementController
```
## 📦 依赖变更
### 如果你的模块之前依赖了成就功能
#### 旧的依赖配置(需要删除):
```xml
org.xyzh
api-usercenter
1.0.0
```
#### 新的依赖配置(需要添加):
```xml
org.xyzh
api-achievement
1.0.0
org.xyzh
achievement
1.0.0
```
## 🔧 代码迁移步骤
### 1. 更新导入语句
**旧代码:**
```java
import org.xyzh.api.usercenter.achievement.UserAchievementService;
```
**新代码:**
```java
import org.xyzh.api.achievement.AchievementService;
```
### 2. 更新服务注入
**旧代码:**
```java
@Autowired
private UserAchievementService userAchievementService;
```
**新代码:**
```java
@Autowired
private AchievementService achievementService;
```
### 3. 更新方法调用
大部分方法签名保持不变,只需更新服务名称:
**旧代码:**
```java
ResultDomain result = userAchievementService.getUserAchievements(userID, type);
```
**新代码:**
```java
ResultDomain result = achievementService.getUserAchievements(userID, type);
```
### 4. 新增功能调用
新的成就系统增加了事件驱动机制:
```java
// 发布成就事件
AchievementEvent event = AchievementEvent.builder(userID, AchievementEventType.COURSE_COMPLETED)
.value(1)
.build();
// 方式1:使用Spring事件发布(推荐)
eventPublisher.publishEvent(event);
// 方式2:直接调用服务
achievementService.processAchievementEvent(event);
```
## 🗄️ 数据库变更
### 新增表
```sql
-- 用户成就进度表(新增)
CREATE TABLE tb_user_achievement_progress (
id VARCHAR(32) NOT NULL,
user_id VARCHAR(32) NOT NULL,
achievement_id VARCHAR(32) NOT NULL,
current_value INT DEFAULT 0,
target_value INT DEFAULT 0,
progress_percentage INT DEFAULT 0,
completed TINYINT(1) DEFAULT 0,
last_update_time DATETIME,
create_time DATETIME,
PRIMARY KEY (id),
UNIQUE KEY uk_user_achievement_progress (user_id, achievement_id)
);
```
### 已有表
`tb_achievement` 和 `tb_user_achievement` 表结构保持不变,无需迁移数据。
## 🌐 REST API变更
### 接口路径变更
**旧路径:**
```
/usercenter/achievement/*
```
**新路径:**
```
/achievement/*
```
### 具体接口映射
| 功能 | 旧接口 | 新接口 | 变化 |
|-----|-------|-------|-----|
| 获取所有成就 | GET /usercenter/achievement/list | GET /achievement/list | 路径变更 |
| 获取用户成就 | GET /usercenter/achievement/user/{userID} | GET /achievement/user/{userID} | 路径变更 |
| 获取我的成就 | - | GET /achievement/my | **新增** |
| 授予成就 | POST /usercenter/achievement/grant | POST /achievement/grant | 路径变更 |
| 检查条件 | GET /usercenter/achievement/condition/{userID}/{achievementID} | GET /achievement/condition/check/{userID}/{achievementID} | 路径变更 |
| 获取进度 | - | GET /achievement/progress/{userID} | **新增** |
| 处理事件 | - | POST /achievement/event/process | **新增** |
| 获取统计 | - | GET /achievement/statistics/{userID} | **新增** |
| 排行榜 | - | GET /achievement/ranking | **新增** |
## ✨ 新增功能
### 1. 事件驱动机制
```java
// 自动监听业务事件并触发成就检测
@Autowired
private ApplicationEventPublisher eventPublisher;
AchievementEvent event = AchievementEvent.builder(userID, eventType)
.value(value)
.build();
eventPublisher.publishEvent(event);
```
### 2. 成就进度追踪
```java
// 查询用户的成就进度
ResultDomain result =
achievementService.getMyAchievementProgress(achievementID);
```
### 3. 策略模式检测器
- 可扩展的成就检测器
- 支持多种成就类型
- 易于添加新的成就类型
### 4. 统计和排行榜
```java
// 获取用户统计
ResultDomain