serv-模块、权限、成就

This commit is contained in:
2025-10-25 17:45:39 +08:00
parent 42f8a0a136
commit f7057a0cc9
15 changed files with 682 additions and 394 deletions

View File

@@ -7,12 +7,12 @@ import org.springframework.web.bind.annotation.*;
import org.xyzh.api.achievement.AchievementService;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.event.AchievementEvent;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.core.page.PageRequest;
import org.xyzh.common.dto.usercenter.TbAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievementProgress;
import org.xyzh.common.vo.AchievementVO;
import java.util.List;
import java.util.Map;
/**
@@ -23,7 +23,7 @@ import java.util.Map;
* @since 2025-10-24
*/
@RestController
@RequestMapping("/achievement")
@RequestMapping("/achievements")
public class AchievementController {
private static final Logger logger = LoggerFactory.getLogger(AchievementController.class);
@@ -35,7 +35,7 @@ public class AchievementController {
/**
* 创建成就
*/
@PostMapping("/create")
@PostMapping("/achievement")
public ResultDomain<TbAchievement> createAchievement(@RequestBody TbAchievement achievement) {
return achievementService.createAchievement(achievement);
}
@@ -43,7 +43,7 @@ public class AchievementController {
/**
* 更新成就
*/
@PutMapping("/update")
@PutMapping("/achievement")
public ResultDomain<TbAchievement> updateAchievement(@RequestBody TbAchievement achievement) {
return achievementService.updateAchievement(achievement);
}
@@ -51,36 +51,32 @@ public class AchievementController {
/**
* 删除成就
*/
@DeleteMapping("/delete/{achievementID}")
public ResultDomain<Void> deleteAchievement(@PathVariable String achievementID) {
return achievementService.deleteAchievement(achievementID);
@DeleteMapping("/achievement")
public ResultDomain<Void> deleteAchievement(@RequestBody TbAchievement achievement) {
return achievementService.deleteAchievement(achievement.getAchievementID());
}
/**
* 获取所有成就列表
*/
@GetMapping("/list")
public ResultDomain<TbAchievement> getAllAchievements(
@RequestParam(required = false) Integer type,
@RequestParam(required = false) Integer level) {
return achievementService.getAllAchievements(type, level);
@PostMapping("/list")
public ResultDomain<TbAchievement> getAllAchievements(TbAchievement filter) {
return achievementService.getAllAchievements(filter);
}
/**
* 分页查询成就
*/
@PostMapping("/page")
public ResultDomain<TbAchievement> getAchievementPage(
@RequestBody(required = false) TbAchievement filter,
PageParam pageParam) {
return achievementService.getAchievementPage(filter, pageParam);
public ResultDomain<TbAchievement> getAchievementPage(@RequestBody PageRequest<TbAchievement> pageRequest) {
return achievementService.getAchievementPage(pageRequest.getFilter(), pageRequest.getPageParam());
}
/**
* 获取成就详情
*/
@GetMapping("/detail/{achievementID}")
public ResultDomain<TbAchievement> getAchievementDetail(@PathVariable String achievementID) {
public ResultDomain<TbAchievement> getAchievementDetail(@PathVariable(name = "achievementID") String achievementID) {
return achievementService.getAchievementDetail(achievementID);
}
@@ -90,28 +86,26 @@ public class AchievementController {
* 获取用户已获得的成就
*/
@GetMapping("/user/{userID}")
public ResultDomain<TbUserAchievement> getUserAchievements(
@PathVariable String userID,
@RequestParam(required = false) Integer type) {
public ResultDomain<TbUserAchievement> getUserAchievements(@PathVariable(name = "userID") String userID, @RequestParam(required = false, value = "type") Integer type) {
return achievementService.getUserAchievements(userID, type);
}
/**
* 获取当前用户的成就列表
* 获取当前用户的成就列表(含进度信息)
* 返回所有成就,包括:
* - 已获得的成就:显示获得时间
* - 未获得的成就:显示当前进度
*/
@GetMapping("/my")
public ResultDomain<TbUserAchievement> getMyAchievements(
@RequestParam(required = false) Integer type) {
return achievementService.getMyAchievements(type);
public ResultDomain<AchievementVO> getMyAchievements(@RequestParam(required = false, value = "type") Integer type) {
return achievementService.getMyAchievementsWithProgress(type);
}
/**
* 检查用户是否已获得成就
*/
@GetMapping("/check/{userID}/{achievementID}")
public ResultDomain<Boolean> hasAchievement(
@PathVariable String userID,
@PathVariable String achievementID) {
public ResultDomain<Boolean> hasAchievement(@PathVariable(name = "userID") String userID, @PathVariable(name = "achievementID") String achievementID) {
return achievementService.hasAchievement(userID, achievementID);
}
@@ -122,8 +116,8 @@ public class AchievementController {
*/
@PostMapping("/grant")
public ResultDomain<TbUserAchievement> grantAchievement(
@RequestParam String userID,
@RequestParam String achievementID) {
@RequestParam(name = "userID") String userID,
@RequestParam(name = "achievementID") String achievementID) {
return achievementService.grantAchievement(userID, achievementID);
}
@@ -132,8 +126,8 @@ public class AchievementController {
*/
@DeleteMapping("/revoke")
public ResultDomain<Void> revokeAchievement(
@RequestParam String userID,
@RequestParam String achievementID) {
@RequestParam(name = "userID") String userID,
@RequestParam(name = "achievementID") String achievementID) {
return achievementService.revokeAchievement(userID, achievementID);
}
@@ -144,20 +138,11 @@ public class AchievementController {
*/
@GetMapping("/progress/{userID}")
public ResultDomain<TbUserAchievementProgress> getUserAchievementProgress(
@PathVariable String userID,
@RequestParam(required = false) String achievementID) {
@PathVariable(name = "userID") String userID,
@RequestParam(required = false, value = "achievementID") String achievementID) {
return achievementService.getUserAchievementProgress(userID, achievementID);
}
/**
* 获取当前用户的成就进度
*/
@GetMapping("/progress/my")
public ResultDomain<TbUserAchievementProgress> getMyAchievementProgress(
@RequestParam(required = false) String achievementID) {
return achievementService.getMyAchievementProgress(achievementID);
}
// ==================== 成就检测 ====================
/**
@@ -208,11 +193,9 @@ public class AchievementController {
/**
* 获取最近获得成就的用户
*/
@GetMapping("/recent/{achievementID}")
public ResultDomain<TbUserAchievement> getRecentAchievers(
@PathVariable String achievementID,
@RequestParam(required = false, defaultValue = "10") Integer limit) {
return achievementService.getRecentAchievers(achievementID, limit);
@PostMapping("/recent")
public ResultDomain<TbUserAchievement> getRecentAchievers(@RequestBody PageRequest<TbUserAchievement> pageRequest) {
return achievementService.getRecentAchievers(pageRequest.getFilter(), pageRequest.getPageParam());
}
}

View File

@@ -21,6 +21,7 @@ import org.xyzh.common.dto.usercenter.TbAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievementProgress;
import org.xyzh.common.utils.IDUtils;
import org.xyzh.common.vo.AchievementVO;
import org.xyzh.system.utils.LoginUtil;
import java.util.*;
@@ -101,13 +102,13 @@ public class ACHAchievementServiceImpl implements AchievementService {
ResultDomain<TbAchievement> resultDomain = new ResultDomain<>();
try {
// 参数验证
if (achievement == null || !StringUtils.hasText(achievement.getID())) {
if (achievement == null || !StringUtils.hasText(achievement.getAchievementID())) {
resultDomain.fail("成就ID不能为空");
return resultDomain;
}
// 检查成就是否存在
TbAchievement existing = achievementMapper.selectById(achievement.getID());
TbAchievement existing = achievementMapper.selectByAchievementId(achievement.getAchievementID());
if (existing == null) {
resultDomain.fail("成就不存在");
return resultDomain;
@@ -115,7 +116,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
// 检查名称是否重复
if (StringUtils.hasText(achievement.getName())) {
int count = achievementMapper.countByName(achievement.getName(), achievement.getID());
int count = achievementMapper.countByName(achievement.getName(), achievement.getAchievementID());
if (count > 0) {
resultDomain.fail("成就名称已存在");
return resultDomain;
@@ -172,19 +173,10 @@ public class ACHAchievementServiceImpl implements AchievementService {
}
@Override
public ResultDomain<TbAchievement> getAllAchievements(Integer type, Integer level) {
public ResultDomain<TbAchievement> getAllAchievements(TbAchievement filter) {
ResultDomain<TbAchievement> resultDomain = new ResultDomain<>();
try {
List<TbAchievement> list;
if (type != null && level != null) {
list = achievementMapper.selectByTypeAndLevel(type, level);
} else if (type != null) {
list = achievementMapper.selectByType(type);
} else {
TbAchievement filter = new TbAchievement();
filter.setDeleted(false);
list = achievementMapper.selectAchievements(filter);
}
List<TbAchievement> list = achievementMapper.selectAchievements(filter);
resultDomain.success("获取成就列表成功", list);
return resultDomain;
@@ -281,6 +273,110 @@ public class ACHAchievementServiceImpl implements AchievementService {
return getUserAchievements(user.getID(), type);
}
@Override
public ResultDomain<AchievementVO> getMyAchievementsWithProgress(Integer type) {
ResultDomain<AchievementVO> resultDomain = new ResultDomain<>();
try {
// 获取当前登录用户
TbSysUser user = LoginUtil.getCurrentUser();
if (user == null) {
resultDomain.fail("请先登录");
return resultDomain;
}
String userID = user.getID();
// 1. 获取所有成就列表根据type过滤
List<TbAchievement> allAchievements;
if (type != null) {
allAchievements = achievementMapper.selectByType(type);
} else {
TbAchievement filter = new TbAchievement();
filter.setDeleted(false);
allAchievements = achievementMapper.selectAchievements(filter);
}
// 2. 获取用户已获得的成就列表
List<TbUserAchievement> userAchievements = type != null
? userAchievementMapper.selectByUserIdAndType(userID, type)
: userAchievementMapper.selectByUserId(userID);
// 转换为Mapkey为achievementID
Map<String, TbUserAchievement> userAchievementMap = userAchievements.stream()
.collect(Collectors.toMap(TbUserAchievement::getAchievementID, ua -> ua));
// 3. 获取用户的成就进度列表
List<TbUserAchievementProgress> progressList = progressMapper.selectByUserId(userID);
// 转换为Mapkey为achievementID
Map<String, TbUserAchievementProgress> progressMap = progressList.stream()
.collect(Collectors.toMap(TbUserAchievementProgress::getAchievementID, p -> p));
// 4. 组装AchievementVO列表
List<AchievementVO> achievementVOList = new ArrayList<>();
for (TbAchievement achievement : allAchievements) {
AchievementVO vo = new AchievementVO();
// 复制成就基本信息
vo.setID(achievement.getID());
vo.setAchievementID(achievement.getAchievementID());
vo.setName(achievement.getName());
vo.setDescription(achievement.getDescription());
vo.setType(achievement.getType());
vo.setLevel(achievement.getLevel());
vo.setIcon(achievement.getIcon());
vo.setPoints(achievement.getPoints());
vo.setConditionType(achievement.getConditionType());
vo.setConditionValue(achievement.getConditionValue());
vo.setOrderNum(achievement.getOrderNum());
vo.setCreator(achievement.getCreator());
vo.setUpdater(achievement.getUpdater());
vo.setCreateTime(achievement.getCreateTime());
vo.setUpdateTime(achievement.getUpdateTime());
vo.setDeleted(achievement.getDeleted());
// 设置用户ID
vo.setUserID(userID);
// 填充用户成就信息(如果已获得)
TbUserAchievement userAchievement = userAchievementMap.get(achievement.getAchievementID());
if (userAchievement != null) {
vo.setUserAchievementID(userAchievement.getID());
vo.setObtainTime(userAchievement.getObtainTime());
vo.setObtained(true);
} else {
vo.setObtained(false);
}
// 填充进度信息
TbUserAchievementProgress progress = progressMap.get(achievement.getAchievementID());
if (progress != null) {
vo.setProgressID(progress.getID());
vo.setCurrentValue(progress.getCurrentValue());
vo.setTargetValue(progress.getTargetValue());
vo.setProgressPercentage(progress.getProgressPercentage());
vo.setCompleted(progress.getCompleted());
vo.setLastUpdateTime(progress.getLastUpdateTime());
} else {
// 没有进度记录,设置默认值
vo.setCurrentValue(0);
vo.setTargetValue(achievement.getConditionValue());
vo.setProgressPercentage(0);
vo.setCompleted(false);
}
achievementVOList.add(vo);
}
resultDomain.success("获取成就列表成功", achievementVOList);
return resultDomain;
} catch (Exception e) {
logger.error("获取成就列表异常: {}", e.getMessage(), e);
resultDomain.fail("获取成就列表失败: " + e.getMessage());
return resultDomain;
}
}
@Override
public ResultDomain<Boolean> hasAchievement(String userID, String achievementID) {
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
@@ -634,19 +730,10 @@ public class ACHAchievementServiceImpl implements AchievementService {
}
@Override
public ResultDomain<TbUserAchievement> getRecentAchievers(String achievementID, Integer limit) {
public ResultDomain<TbUserAchievement> getRecentAchievers(TbUserAchievement filter, PageParam pageParam) {
ResultDomain<TbUserAchievement> resultDomain = new ResultDomain<>();
try {
if (!StringUtils.hasText(achievementID)) {
resultDomain.fail("成就ID不能为空");
return resultDomain;
}
if (limit == null || limit <= 0) {
limit = 10;
}
List<TbUserAchievement> achievers = userAchievementMapper.selectRecentAchievers(achievementID, limit);
List<TbUserAchievement> achievers = userAchievementMapper.selectUserAchievementsPage(filter, pageParam);
resultDomain.success("获取最近获得者成功", achievers);
return resultDomain;
} catch (Exception e) {