style(service): 添加详细注释并优化人设列表查询逻辑

This commit is contained in:
2025-12-17 16:49:10 +08:00
parent 35c45abf73
commit 4666180b73

View File

@@ -65,61 +65,95 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl<KeyboardCharacterM
return character;
}
/**
* 查询所有人设列表并标记用户是否已添加
*
* @return 人设响应列表,包含是否已添加的标记
*/
@Override
public List<KeyboardCharacterRespVO> selectListWithRank() {
// 获取当前登录用户ID
long userId = StpUtil.getLoginIdAsLong();
// 先从缓存获取所有人设列表
// 定义缓存key用于存储所有人设列表
String cacheKey = "character:list:all";
// 尝试从Redis缓存中获取人设列表
List<KeyboardCharacter> keyboardCharacters = (List<KeyboardCharacter>) redisTemplate.opsForValue().get(cacheKey);
// 如果缓存中没有数据
if (keyboardCharacters == null) {
// 缓存未命中,从数据库查询
// 从数据库查询所有未删除的人设按rank升序排列
keyboardCharacters = keyboardCharacterMapper.selectList(new LambdaQueryWrapper<KeyboardCharacter>()
.eq(KeyboardCharacter::getDeleted, false)
.orderByAsc(KeyboardCharacter::getRank));
// 缓存到Redis7天过期
// 将查询结果缓存到Redis设置7天过期时间
if (keyboardCharacters != null && !keyboardCharacters.isEmpty()) {
redisTemplate.opsForValue().set(cacheKey, keyboardCharacters, 7, TimeUnit.DAYS);
}
}
// 查询当前用户已添加的人设列表
List<KeyboardUserCharacterVO> userCharacterVOList = keyboardUserCharacterMapper.selectByUserId(userId);
// 将KeyboardCharacter实体列表转换为KeyboardCharacterRespVO响应对象列表
List<KeyboardCharacterRespVO> keyboardCharacterRespVOS = BeanUtil.copyToList(keyboardCharacters, KeyboardCharacterRespVO.class);
// 遍历人设列表,标记每个人设是否已被当前用户添加
keyboardCharacterRespVOS.forEach(character -> {
// 检查用户已添加列表中是否存在该人设ID
character.setAdded(userCharacterVOList.stream().anyMatch(userCharacter ->
userCharacter.getCharacterId().equals(character.getId())));
});
return keyboardCharacterRespVOS;
}
/**
* 根据标签ID查询人设列表并标记用户是否已添加
*
* @param tagId 标签ID
* @return 人设响应列表,包含是否已添加的标记
*/
@Override
public List<KeyboardCharacterRespVO> selectListByTag(Long tagId) {
// 先从缓存获取指定标签的人设列表
// 构建缓存key用于存储指定标签的人设列表
String cacheKey = "character:list:tag:" + tagId;
// 尝试从Redis缓存中获取指定标签的人设列表
List<KeyboardCharacter> keyboardCharacters = (List<KeyboardCharacter>) redisTemplate.opsForValue().get(cacheKey);
// 如果缓存中没有数据
if (keyboardCharacters == null) {
// 缓存未命中,从数据库查询
// 从数据库查询指定标签的未删除人设按rank降序排列
keyboardCharacters = keyboardCharacterMapper.selectList(new LambdaQueryWrapper<KeyboardCharacter>()
.eq(KeyboardCharacter::getDeleted, false)
.eq(KeyboardCharacter::getTag, tagId)
.orderByDesc(KeyboardCharacter::getRank));
// 缓存到Redis7天过期
// 将查询结果缓存到Redis设置7天过期时间
if (keyboardCharacters != null && !keyboardCharacters.isEmpty()) {
redisTemplate.opsForValue().set(cacheKey, keyboardCharacters, 7, TimeUnit.DAYS);
}
}
// 获取当前登录用户ID
long userId = StpUtil.getLoginIdAsLong();
// 查询当前用户已添加的人设列表
List<KeyboardUserCharacterVO> userCharacterVOList = keyboardUserCharacterMapper.selectByUserId(userId);
// 将KeyboardCharacter实体列表转换为KeyboardCharacterRespVO响应对象列表
List<KeyboardCharacterRespVO> keyboardCharacterRespVOS = BeanUtil.copyToList(keyboardCharacters, KeyboardCharacterRespVO.class);
// 遍历人设列表,标记每个人设是否已被当前用户添加
keyboardCharacterRespVOS.forEach(character -> {
// 检查用户已添加列表中是否存在该人设ID
character.setAdded(userCharacterVOList.stream().anyMatch(userCharacter ->
userCharacter.getCharacterId().equals(character.getId())));
});
return keyboardCharacterRespVOS;
}
@@ -229,14 +263,29 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl<KeyboardCharacterM
return BeanUtil.copyToList(keyboardCharacters, KeyboardCharacterRespVO.class);
}
/**
* 为新用户添加默认人设
* 从所有人设列表中选取前5个自动添加到用户的人设列表中
*
* @param userId 用户ID
*/
@Override
public void addDefaultUserCharacter(Long userId) {
// 创建用户人设添加DTO对象用于复用添加逻辑
KeyboardUserCharacterAddDTO keyboardUserCharacterAddDTO = new KeyboardUserCharacterAddDTO();
// 获取所有人设列表未登录状态并限制取前5个
Stream<KeyboardCharacterRespVO> limit = selectListWithNotLoginRank().stream().limit(5);
// 遍历前5个人设为用户添加默认人设
limit.forEach(character -> {
// 设置人设ID
keyboardUserCharacterAddDTO.setCharacterId(character.getId());
// 设置人设表情符号
keyboardUserCharacterAddDTO.setEmoji(character.getEmoji());
this.addUserCharacter(keyboardUserCharacterAddDTO,userId);
// 调用添加用户人设的方法
this.addUserCharacter(keyboardUserCharacterAddDTO, userId);
});
}
}