serv-模块、权限、成就
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
// 转换为Map,key为achievementID
|
||||
Map<String, TbUserAchievement> userAchievementMap = userAchievements.stream()
|
||||
.collect(Collectors.toMap(TbUserAchievement::getAchievementID, ua -> ua));
|
||||
|
||||
// 3. 获取用户的成就进度列表
|
||||
List<TbUserAchievementProgress> progressList = progressMapper.selectByUserId(userID);
|
||||
|
||||
// 转换为Map,key为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) {
|
||||
|
||||
Reference in New Issue
Block a user