# 成就模块迁移指南 ## 📝 迁移概述 成就相关功能已从 `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 ${school-news.version} ``` #### 新的依赖配置(需要添加): ```xml org.xyzh api-achievement ${school-news.version} org.xyzh achievement ${school-news.version} ``` ## 🔧 代码迁移步骤 ### 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> stats = achievementService.getUserAchievementStatistics(userID); // 获取排行榜 ResultDomain> ranking = achievementService.getAchievementRanking(10); ``` ## 🚨 注意事项 ### 1. 破坏性变更 #### ❌ 已删除的类(不再可用) - `org.xyzh.api.usercenter.achievement.UserAchievementService` - `org.xyzh.usercenter.service.UCUserAchievementService` - `org.xyzh.usercenter.mapper.AchievementMapper` - `org.xyzh.usercenter.controller.UserAchievementController` #### ✅ 对应的新类 - `org.xyzh.api.achievement.AchievementService` - `org.xyzh.achievement.service.impl.ACHAchievementServiceImpl` - `org.xyzh.achievement.mapper.AchievementMapper` - `org.xyzh.achievement.controller.AchievementController` ### 2. 接口变化 新的 `AchievementService` 接口方法更多、更完善: - ✅ 所有旧方法都有对应的新方法 - ✅ 新增了事件处理、进度查询、统计等功能 - ✅ 方法签名大部分保持兼容 ### 3. 前端调用 如果你的前端代码调用了成就相关API,需要: 1. 更新API路径:`/usercenter/achievement/*` → `/achievement/*` 2. 检查返回数据格式(大部分保持兼容) 3. 利用新增的API(进度、统计、排行榜等) ## 📋 迁移检查清单 迁移时请检查以下项目: - [ ] 更新 pom.xml 依赖 - [ ] 更新 import 语句 - [ ] 更新服务注入 - [ ] 更新方法调用 - [ ] 测试成就创建功能 - [ ] 测试成就授予功能 - [ ] 测试成就查询功能 - [ ] 测试事件触发功能(如有) - [ ] 更新前端API路径(如有) - [ ] 更新相关文档 - [ ] 执行集成测试 ## 🆘 常见问题 ### Q1: 编译报错找不到 UserAchievementService **A:** 更新 import 语句为: ```java import org.xyzh.api.achievement.AchievementService; ``` ### Q2: 旧的成就数据会丢失吗? **A:** 不会。数据库表结构保持不变,所有数据完整保留。 ### Q3: 需要修改数据库吗? **A:** 需要执行新表创建SQL(`tb_user_achievement_progress`),见 `.bin/mysql/sql/createTableAchievement.sql`。 ### Q4: 如何使用新的事件驱动功能? **A:** 参考 `README.md` 中的"使用方法"章节。 ### Q5: admin模块已经自动配置好了吗? **A:** 是的,admin模块的pom.xml已自动添加achievement依赖。 ## 📚 相关文档 - [成就系统使用文档](../README.md) - [数据库建表SQL](../../.bin/mysql/sql/createTableAchievement.sql) ## 👥 联系支持 如果在迁移过程中遇到问题,请联系: - 开发者:yslg - 创建Issue或PR --- **迁移完成日期**: 2025-10-24 **版本**: 1.0.0