From fe19fb8ca23995969560401380c44b23121cbc2e Mon Sep 17 00:00:00 2001 From: ziin Date: Thu, 4 Dec 2025 16:17:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(character):=20=E6=B7=BB=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BA=BA=E8=AE=BE=E6=8E=A5=E5=8F=A3=E5=8F=8A=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 /character/addUserCharacter 端点,支持用户将人设加入个人列表并自动维护排序数组。引入 KeyboardUserCharacterAddDTO、KeyboardUserSortMapper 及相关错误码,实现事务级插入与排序更新。 --- .../com/yolo/keyborad/common/ErrorCode.java | 3 +- .../keyborad/config/SaTokenConfigure.java | 3 +- .../controller/CharacterController.java | 13 +++-- .../mapper/KeyboardUserCharacterMapper.java | 1 + .../mapper/KeyboardUserSortMapper.java | 28 +++++++++++ .../KeyboardUserCharacterAddDTO.java | 15 ++++++ .../service/KeyboardCharacterService.java | 3 ++ .../impl/KeyboardCharacterServiceImpl.java | 48 ++++++++++++++++++- .../mapper/KeyboardUserCharacterMapper.xml | 46 ++++++++---------- .../mapper/KeyboardUserSortMapper.xml | 22 +++++++++ 10 files changed, 151 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/yolo/keyborad/mapper/KeyboardUserSortMapper.java create mode 100644 src/main/java/com/yolo/keyborad/model/dto/userCharacter/KeyboardUserCharacterAddDTO.java create mode 100644 src/main/resources/mapper/KeyboardUserSortMapper.xml diff --git a/src/main/java/com/yolo/keyborad/common/ErrorCode.java b/src/main/java/com/yolo/keyborad/common/ErrorCode.java index 1338d51..fca7010 100644 --- a/src/main/java/com/yolo/keyborad/common/ErrorCode.java +++ b/src/main/java/com/yolo/keyborad/common/ErrorCode.java @@ -32,7 +32,8 @@ public enum ErrorCode { USER_INFO_UPDATE_FAILED(50002, "用户信息更新失败"), PASSWORD_OR_MAIL_ERROR(50003,"密码或邮箱错误" ), SEND_MAIL_FAILED(50004,"邮件发送失败" ), - CONFIRM_PASSWORD_NOT_MATCH(50005,"重复密码不匹配" ); + CONFIRM_PASSWORD_NOT_MATCH(50005,"重复密码不匹配" ), + USER_CHARACTER_ADD_ERROR(50006,"添加用户键盘字符失败" ); /** * 状态码 */ diff --git a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java index aa88be3..ceaa7bf 100644 --- a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java +++ b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java @@ -76,7 +76,8 @@ public class SaTokenConfigure implements WebMvcConfigurer { "/user/updateInfo", "/user/detail", "/user/register", - "/character/updateUserCharacterSort" + "/character/updateUserCharacterSort", + "/character/addUserCharacter" }; } @Bean diff --git a/src/main/java/com/yolo/keyborad/controller/CharacterController.java b/src/main/java/com/yolo/keyborad/controller/CharacterController.java index a462840..5476f61 100644 --- a/src/main/java/com/yolo/keyborad/controller/CharacterController.java +++ b/src/main/java/com/yolo/keyborad/controller/CharacterController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import com.yolo.keyborad.common.BaseResponse; import com.yolo.keyborad.common.ResultUtils; +import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterAddDTO; import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterDTO; import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterSortUpdateDTO; import com.yolo.keyborad.model.entity.KeyboardCharacter; @@ -49,7 +50,7 @@ public class CharacterController { @Operation(summary = "人设详情", description = "人设详情接口") public BaseResponse detail(@RequestParam("id") Long id) { KeyboardCharacter character = characterService.getById(id); - return ResultUtils.success(BeanUtil.copyProperties(character ,KeyboardCharacterRespVO.class)); + return ResultUtils.success(BeanUtil.copyProperties(character, KeyboardCharacterRespVO.class)); } @GetMapping("/listByTag") @@ -67,10 +68,16 @@ public class CharacterController { @PostMapping("/updateUserCharacterSort") - @Operation(summary = "更新用户人设排序",description = "更新用户人设排序接口") + @Operation(summary = "更新用户人设排序", description = "更新用户人设排序接口") public BaseResponse updateUserCharacterSort(@RequestBody KeyboardUserCharacterSortUpdateDTO sortUpdateDTO) { characterService.updateSort(sortUpdateDTO); return ResultUtils.success(true); } -} + @PostMapping("/addUserCharacter") + @Operation(summary = "添加用户人设", description = "添加用户人设接口") + public BaseResponse addUserCharacter(@RequestBody KeyboardUserCharacterAddDTO addDTO) { + characterService.addUserCharacter(addDTO); + return ResultUtils.success(true); + } +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/mapper/KeyboardUserCharacterMapper.java b/src/main/java/com/yolo/keyborad/mapper/KeyboardUserCharacterMapper.java index 5ffc16a..2cb6fbc 100644 --- a/src/main/java/com/yolo/keyborad/mapper/KeyboardUserCharacterMapper.java +++ b/src/main/java/com/yolo/keyborad/mapper/KeyboardUserCharacterMapper.java @@ -18,4 +18,5 @@ public interface KeyboardUserCharacterMapper extends BaseMapper selectSortByUserId(@Param("userId") Long userId); } \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/mapper/KeyboardUserSortMapper.java b/src/main/java/com/yolo/keyborad/mapper/KeyboardUserSortMapper.java new file mode 100644 index 0000000..3467c41 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/mapper/KeyboardUserSortMapper.java @@ -0,0 +1,28 @@ +package com.yolo.keyborad.mapper; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +public interface KeyboardUserSortMapper { + + /** + * 查询某个用户的人设排序(按顺序展开成列表) + */ + List selectSortByUserId(@Param("userId") Long userId); + + /** + * 更新用户排序数组 + */ + int updateSortByUserId(@Param("userId") Long userId, + @Param("sort") Long[] sort); + + /** + * 插入一条新的用户排序记录 + */ + int insertUserSort(@Param("userId") Long userId, + @Param("sort") Long[] sort); +} diff --git a/src/main/java/com/yolo/keyborad/model/dto/userCharacter/KeyboardUserCharacterAddDTO.java b/src/main/java/com/yolo/keyborad/model/dto/userCharacter/KeyboardUserCharacterAddDTO.java new file mode 100644 index 0000000..9863a1f --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/dto/userCharacter/KeyboardUserCharacterAddDTO.java @@ -0,0 +1,15 @@ +package com.yolo.keyborad.model.dto.userCharacter; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "用户键盘顺序更新 DTO") +@Data +public class KeyboardUserCharacterAddDTO { + + @Schema(description="键盘人设 id") + private Long characterId; + +} diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java b/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java index 61efc9f..a062e16 100644 --- a/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java +++ b/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java @@ -1,5 +1,6 @@ package com.yolo.keyborad.service; +import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterAddDTO; import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterSortUpdateDTO; import com.yolo.keyborad.model.entity.KeyboardCharacter; import com.baomidou.mybatisplus.extension.service.IService; @@ -23,4 +24,6 @@ public interface KeyboardCharacterService extends IService{ List selectListByUserId(); void updateSort(KeyboardUserCharacterSortUpdateDTO sortUpdateDTO); + + void addUserCharacter(KeyboardUserCharacterAddDTO addDTO); } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java index b067fbb..3b75885 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java @@ -1,12 +1,18 @@ package com.yolo.keyborad.service.impl; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.yolo.keyborad.common.ErrorCode; +import com.yolo.keyborad.exception.BusinessException; import com.yolo.keyborad.mapper.KeyboardCharacterMapper; import com.yolo.keyborad.mapper.KeyboardUserCharacterMapper; +import com.yolo.keyborad.mapper.KeyboardUserSortMapper; +import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterAddDTO; import com.yolo.keyborad.model.dto.userCharacter.KeyboardUserCharacterSortUpdateDTO; +import com.yolo.keyborad.model.entity.KeyboardUser; import com.yolo.keyborad.model.entity.KeyboardUserCharacter; import com.yolo.keyborad.model.vo.character.KeyboardUserCharacterVO; import jakarta.annotation.Resource; @@ -32,6 +38,9 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl selectListWithRank() { return keyboardCharacterMapper.selectList(new LambdaQueryWrapper() @@ -50,7 +59,6 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl selectListByUserId() { long loginId = StpUtil.getLoginIdAsLong(); - return keyboardUserCharacterMapper.selectByUserId(loginId); } @@ -64,4 +72,42 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl oldSortList = keyboardUserSortMapper.selectSortByUserId(userId); + // selectSortByUserId 用 unnest(user_characteu_id_sort) 实现,见下面 mapper 部分 + + // 3. 组装新的排序:在末尾加上新 id + List newSortList = new ArrayList<>(); + if (oldSortList != null && !oldSortList.isEmpty()) { + newSortList.addAll(oldSortList); + } + newSortList.add(newId); + + Long[] newSortArray = newSortList.toArray(new Long[0]); + + // 4. 更新 keyboard_user_sort,如果没有记录就插入一条 + int updated = keyboardUserSortMapper.updateSortByUserId(userId, newSortArray); + if (updated == 0) { + // 说明该 userId 还没有排序记录,插入一条 + keyboardUserSortMapper.insertUserSort(userId, newSortArray); + } + } } diff --git a/src/main/resources/mapper/KeyboardUserCharacterMapper.xml b/src/main/resources/mapper/KeyboardUserCharacterMapper.xml index d2dd47a..f44cf58 100644 --- a/src/main/resources/mapper/KeyboardUserCharacterMapper.xml +++ b/src/main/resources/mapper/KeyboardUserCharacterMapper.xml @@ -2,39 +2,35 @@ - - - - - - - - - - - - - - UPDATE keyboard_user_character - SET sort = #{sort,jdbcType=ARRAY} - where user_id = #{userId} - AND deleted = FALSE - + + + UPDATE keyboard_user_sort + SET user_characteu_id_sort = #{sort,jdbcType=ARRAY} + where user_id = #{userId} + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/KeyboardUserSortMapper.xml b/src/main/resources/mapper/KeyboardUserSortMapper.xml new file mode 100644 index 0000000..45e055b --- /dev/null +++ b/src/main/resources/mapper/KeyboardUserSortMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + UPDATE keyboard_user_sort + SET user_characteu_id_sort = #{sort, jdbcType=ARRAY} + WHERE user_id = #{userId} + + + + INSERT INTO keyboard_user_sort (user_id, user_characteu_id_sort) + VALUES (#{userId}, #{sort, jdbcType=ARRAY}) + + + \ No newline at end of file