diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/KeyboardCharacterController.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/KeyboardCharacterController.java index 2324cf4..4341f7b 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/KeyboardCharacterController.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/KeyboardCharacterController.java @@ -1,5 +1,6 @@ package com.yolo.keyboard.controller.admin.character; +import com.yolo.keyboard.dal.dataobject.character.CharacterI18nDO; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -100,5 +101,56 @@ public class KeyboardCharacterController { ExcelUtils.write(response, "键盘人设.xls", "数据", KeyboardCharacterRespVO.class, BeanUtils.toBean(list, KeyboardCharacterRespVO.class)); } + // ==================== 子表(键盘人设国际化内容) ==================== + + @GetMapping("/character-i18n/page") + @Operation(summary = "获得键盘人设国际化内容分页") + @Parameter(name = "characterId", description = "角色主表id") + @PreAuthorize("@ss.hasPermission('keyboard:character:query')") + public CommonResult> getCharacterI18nPage(PageParam pageReqVO, + @RequestParam("characterId") Long characterId) { + return success(characterService.getCharacterI18nPage(pageReqVO, characterId)); + } + + @PostMapping("/character-i18n/create") + @Operation(summary = "创建键盘人设国际化内容") + @PreAuthorize("@ss.hasPermission('keyboard:character:create')") + public CommonResult createCharacterI18n(@Valid @RequestBody CharacterI18nDO characterI18n) { + return success(characterService.createCharacterI18n(characterI18n)); + } + + @PutMapping("/character-i18n/update") + @Operation(summary = "更新键盘人设国际化内容") + @PreAuthorize("@ss.hasPermission('keyboard:character:update')") + public CommonResult updateCharacterI18n(@Valid @RequestBody CharacterI18nDO characterI18n) { + characterService.updateCharacterI18n(characterI18n); + return success(true); + } + + @DeleteMapping("/character-i18n/delete") + @Parameter(name = "id", description = "编号", required = true) + @Operation(summary = "删除键盘人设国际化内容") + @PreAuthorize("@ss.hasPermission('keyboard:character:delete')") + public CommonResult deleteCharacterI18n(@RequestParam("id") Long id) { + characterService.deleteCharacterI18n(id); + return success(true); + } + + @DeleteMapping("/character-i18n/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除键盘人设国际化内容") + @PreAuthorize("@ss.hasPermission('keyboard:character:delete')") + public CommonResult deleteCharacterI18nList(@RequestParam("ids") List ids) { + characterService.deleteCharacterI18nListByIds(ids); + return success(true); + } + + @GetMapping("/character-i18n/get") + @Operation(summary = "获得键盘人设国际化内容") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('keyboard:character:query')") + public CommonResult getCharacterI18n(@RequestParam("id") Long id) { + return success(characterService.getCharacterI18n(id)); + } } \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterPageReqVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterPageReqVO.java index 0f481d7..03d1e83 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterPageReqVO.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterPageReqVO.java @@ -13,12 +13,6 @@ import static com.yolo.keyboard.framework.common.util.date.DateUtils.FORMAT_YEAR @Data public class KeyboardCharacterPageReqVO extends PageParam { - @Schema(description = "标题", example = "王五") - private String characterName; - - @Schema(description = "背景描述") - private String characterBackground; - @Schema(description = "角色头像", example = "https://www.iocoder.cn") private String avatarUrl; diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterRespVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterRespVO.java index 508f880..456f2f5 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterRespVO.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterRespVO.java @@ -16,14 +16,6 @@ public class KeyboardCharacterRespVO { @ExcelProperty("主键 Id") private Long id; - @Schema(description = "标题", example = "王五") - @ExcelProperty("标题") - private String characterName; - - @Schema(description = "背景描述") - @ExcelProperty("背景描述") - private String characterBackground; - @Schema(description = "角色头像", example = "https://www.iocoder.cn") @ExcelProperty("角色头像") private String avatarUrl; diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterSaveReqVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterSaveReqVO.java index 60d765e..104ef0b 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterSaveReqVO.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/character/vo/KeyboardCharacterSaveReqVO.java @@ -14,12 +14,6 @@ public class KeyboardCharacterSaveReqVO { @Schema(description = "主键 Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7592") private Long id; - @Schema(description = "标题", example = "王五") - private String characterName; - - @Schema(description = "背景描述") - private String characterBackground; - @Schema(description = "角色头像", example = "https://www.iocoder.cn") private String avatarUrl; diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/character/CharacterI18nDO.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/character/CharacterI18nDO.java new file mode 100644 index 0000000..be18ea1 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/character/CharacterI18nDO.java @@ -0,0 +1,56 @@ +package com.yolo.keyboard.dal.dataobject.character; + +import com.yolo.keyboard.framework.tenant.core.aop.TenantIgnore; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.yolo.keyboard.framework.mybatis.core.dataobject.BaseDO; + +/** + * 键盘人设国际化内容 DO + * + * @author ziin + */ +@TableName("keyboard_character_i18n") +@KeySequence("keyboard_character_i18n_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TenantIgnore +public class CharacterI18nDO { + + /** + * 主键 Id + */ + @TableId + private Long id; + /** + * 角色主表id + */ + private Long characterId; + /** + * 语言标识,如 zh-CN/en-US/ja-JP + */ + private String locale; + /** + * 标题 + */ + private String characterName; + /** + * 背景描述 + */ + private String characterBackground; + /** + * 创建时间 + */ + private LocalDateTime createdAt; + /** + * 更新时间 + */ + private LocalDateTime updatedAt; + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/character/KeyboardCharacterDO.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/character/KeyboardCharacterDO.java index a7150b3..875f68a 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/character/KeyboardCharacterDO.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/character/KeyboardCharacterDO.java @@ -28,14 +28,6 @@ public class KeyboardCharacterDO { */ @TableId private Long id; - /** - * 标题 - */ - private String characterName; - /** - * 背景描述 - */ - private String characterBackground; /** * 角色头像 */ diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/character/CharacterI18nMapper.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/character/CharacterI18nMapper.java new file mode 100644 index 0000000..c714889 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/character/CharacterI18nMapper.java @@ -0,0 +1,34 @@ +package com.yolo.keyboard.dal.mysql.character; + +import java.util.*; + +import com.yolo.keyboard.dal.dataobject.character.CharacterI18nDO; +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.common.pojo.PageParam; +import com.yolo.keyboard.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.yolo.keyboard.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +/** + * 键盘人设国际化内容 Mapper + * + * @author ziin + */ +@Mapper +public interface CharacterI18nMapper extends BaseMapperX { + + default PageResult selectPage(PageParam reqVO, Long characterId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(CharacterI18nDO::getCharacterId, characterId) + .orderByDesc(CharacterI18nDO::getId)); + } + + default int deleteByCharacterId(Long characterId) { + return delete(CharacterI18nDO::getCharacterId, characterId); + } + + default int deleteByCharacterIds(List characterIds) { + return deleteBatch(CharacterI18nDO::getCharacterId, characterIds); + } + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/character/KeyboardCharacterMapper.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/character/KeyboardCharacterMapper.java index 75ddfa7..34e9c3f 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/character/KeyboardCharacterMapper.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/character/KeyboardCharacterMapper.java @@ -19,8 +19,6 @@ public interface KeyboardCharacterMapper extends BaseMapperX selectPage(KeyboardCharacterPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(KeyboardCharacterDO::getCharacterName, reqVO.getCharacterName()) - .eqIfPresent(KeyboardCharacterDO::getCharacterBackground, reqVO.getCharacterBackground()) .eqIfPresent(KeyboardCharacterDO::getAvatarUrl, reqVO.getAvatarUrl()) .eqIfPresent(KeyboardCharacterDO::getDownload, reqVO.getDownload()) .eqIfPresent(KeyboardCharacterDO::getTag, reqVO.getTag()) diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterService.java b/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterService.java index 65beeb6..0ebc34f 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterService.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterService.java @@ -1,6 +1,9 @@ package com.yolo.keyboard.service.character; import java.util.*; + +import com.yolo.keyboard.dal.dataobject.character.CharacterI18nDO; +import com.yolo.keyboard.framework.common.pojo.PageParam; import jakarta.validation.*; import com.yolo.keyboard.controller.admin.character.vo.*; import com.yolo.keyboard.dal.dataobject.character.KeyboardCharacterDO; @@ -57,5 +60,51 @@ public interface KeyboardCharacterService { * @return 键盘人设分页 */ PageResult getCharacterPage(KeyboardCharacterPageReqVO pageReqVO); + // ==================== 子表(键盘人设国际化内容) ==================== + /** + * 获得键盘人设国际化内容分页 + * + * @param pageReqVO 分页查询 + * @param characterId 角色主表id + * @return 键盘人设国际化内容分页 + */ + PageResult getCharacterI18nPage(PageParam pageReqVO, Long characterId); + + /** + * 创建键盘人设国际化内容 + * + * @param characterI18n 创建信息 + * @return 编号 + */ + Long createCharacterI18n(@Valid CharacterI18nDO characterI18n); + + /** + * 更新键盘人设国际化内容 + * + * @param characterI18n 更新信息 + */ + void updateCharacterI18n(@Valid CharacterI18nDO characterI18n); + + /** + * 删除键盘人设国际化内容 + * + * @param id 编号 + */ + void deleteCharacterI18n(Long id); + + /** + * 批量删除键盘人设国际化内容 + * + * @param ids 编号 + */ + void deleteCharacterI18nListByIds(List ids); + + /** + * 获得键盘人设国际化内容 + * + * @param id 编号 + * @return 键盘人设国际化内容 + */ + CharacterI18nDO getCharacterI18n(Long id); } \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterServiceImpl.java b/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterServiceImpl.java index a615e53..c8072a2 100644 --- a/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterServiceImpl.java +++ b/keyboard-server/src/main/java/com/yolo/keyboard/service/character/KeyboardCharacterServiceImpl.java @@ -4,7 +4,10 @@ import java.util.*; import java.util.concurrent.TimeUnit; import com.yolo.keyboard.controller.admin.character.vo.*; +import com.yolo.keyboard.dal.dataobject.character.CharacterI18nDO; import com.yolo.keyboard.dal.dataobject.character.KeyboardCharacterDO; +import com.yolo.keyboard.dal.mysql.character.CharacterI18nMapper; +import com.yolo.keyboard.framework.common.pojo.PageParam; import com.yolo.keyboard.framework.common.pojo.PageResult; import com.yolo.keyboard.framework.common.util.object.BeanUtils; import com.yolo.keyboard.dal.mysql.character.KeyboardCharacterMapper; @@ -14,6 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import static com.yolo.keyboard.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.yolo.keyboard.module.infra.enums.ErrorCodeConstants.CHARACTER_I18N_NOT_EXISTS; import static com.yolo.keyboard.module.infra.enums.ErrorCodeConstants.CHARACTER_NOT_EXISTS; @@ -29,6 +33,9 @@ public class KeyboardCharacterServiceImpl implements KeyboardCharacterService { private static final String CHARACTER_CACHE_KEY_PREFIX = "character:"; private static final long CHARACTER_CACHE_TTL_MINUTES = 5L; + @Resource + private CharacterI18nMapper characterI18nMapper; + @Resource private KeyboardCharacterMapper characterMapper; @@ -80,6 +87,59 @@ public class KeyboardCharacterServiceImpl implements KeyboardCharacterService { deleteCharacterCaches(ids); } + // ==================== 子表(键盘人设国际化内容) ==================== + + @Override + public PageResult getCharacterI18nPage(PageParam pageReqVO, Long characterId) { + return characterI18nMapper.selectPage(pageReqVO, characterId); + } + + @Override + public Long createCharacterI18n(CharacterI18nDO characterI18n) { + characterI18nMapper.insert(characterI18n); + return characterI18n.getId(); + } + + @Override + public void updateCharacterI18n(CharacterI18nDO characterI18n) { + // 校验存在 + validateCharacterI18nExists(characterI18n.getId()); + // 更新 + characterI18nMapper.updateById(characterI18n); + } + + @Override + public void deleteCharacterI18n(Long id) { + // 删除 + characterI18nMapper.deleteById(id); + } + + @Override + public void deleteCharacterI18nListByIds(List ids) { + // 删除 + characterI18nMapper.deleteByIds(ids); + } + + @Override + public CharacterI18nDO getCharacterI18n(Long id) { + return characterI18nMapper.selectById(id); + } + + private void validateCharacterI18nExists(Long id) { + if (characterI18nMapper.selectById(id) == null) { + throw exception(CHARACTER_I18N_NOT_EXISTS); + } + } + + private void deleteCharacterI18nByCharacterId(Long characterId) { + characterI18nMapper.deleteByCharacterId(characterId); + } + + private void deleteCharacterI18nByCharacterIds(List characterIds) { + characterI18nMapper.deleteByCharacterIds(characterIds); + } + + private void validateCharacterExists(Long id) { if (characterMapper.selectById(id) == null) { diff --git a/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java b/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java index 43d9b4a..67ea8ae 100644 --- a/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java +++ b/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java @@ -97,4 +97,5 @@ public interface ErrorCodeConstants { ErrorCode AI_COMPANION_NOT_EXISTS = new ErrorCode(1_001_202_023, "AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设不存在"); ErrorCode WARNING_MESSAGE_NOT_EXISTS = new ErrorCode(1_001_202_024, "用户注销提示信息不存在"); ErrorCode APP_VERSIONS_NOT_EXISTS = new ErrorCode(1_001_202_025, "App 版本发布与更新检查表信息不存在"); + ErrorCode CHARACTER_I18N_NOT_EXISTS = new ErrorCode(1_001_202_026, "键盘人设国际化内容不存在"); }