From 9bd9a2646f59fd3bc95e2eab39967060eb16afe7 Mon Sep 17 00:00:00 2001 From: ziin Date: Thu, 2 Apr 2026 14:38:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A0=87=E7=AD=BE=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E6=9F=A5=E8=AF=A2=E5=B9=B6=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E5=8C=85=E8=A3=85=E7=B1=BB=E8=BF=94=E5=9B=9E=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyborad/controller/TagController.java | 11 ++-- .../mapper/KeyboardTagI18nMapper.java | 12 ++++ .../keyborad/model/entity/KeyboardTag.java | 4 -- .../model/entity/KeyboardTagI18n.java | 64 +++++++++++++++++++ .../service/KeyboardTagI18nService.java | 13 ++++ .../com/yolo/keyborad/service/TagService.java | 7 +- .../impl/KeyboardTagI18nServiceImpl.java | 18 ++++++ .../keyborad/service/impl/TagServiceImpl.java | 59 ++++++++++++++++- .../mapper/KeyboardTagI18nMapper.xml | 18 ++++++ 9 files changed, 192 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/yolo/keyborad/mapper/KeyboardTagI18nMapper.java create mode 100644 src/main/java/com/yolo/keyborad/model/entity/KeyboardTagI18n.java create mode 100644 src/main/java/com/yolo/keyborad/service/KeyboardTagI18nService.java create mode 100644 src/main/java/com/yolo/keyborad/service/impl/KeyboardTagI18nServiceImpl.java create mode 100644 src/main/resources/mapper/KeyboardTagI18nMapper.xml diff --git a/src/main/java/com/yolo/keyborad/controller/TagController.java b/src/main/java/com/yolo/keyborad/controller/TagController.java index 6e99a72..8a6ba73 100644 --- a/src/main/java/com/yolo/keyborad/controller/TagController.java +++ b/src/main/java/com/yolo/keyborad/controller/TagController.java @@ -1,10 +1,7 @@ package com.yolo.keyborad.controller; -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.entity.KeyboardTag; import com.yolo.keyborad.model.vo.tags.TagsRespVO; import com.yolo.keyborad.service.TagService; import io.swagger.v3.oas.annotations.Operation; @@ -12,6 +9,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -32,8 +30,9 @@ public class TagController { @GetMapping("/list") @Operation(summary = "标签列表", description = "标签列表接口") - public BaseResponse> list() { - List list = tagService.selectList(); - return ResultUtils.success(BeanUtil.copyToList(list, TagsRespVO.class)); + public BaseResponse> list( + @RequestHeader(value = "Accept-Language", required = false) String acceptLanguage + ) { + return ResultUtils.success(tagService.selectList(acceptLanguage)); } } diff --git a/src/main/java/com/yolo/keyborad/mapper/KeyboardTagI18nMapper.java b/src/main/java/com/yolo/keyborad/mapper/KeyboardTagI18nMapper.java new file mode 100644 index 0000000..ea2e2ac --- /dev/null +++ b/src/main/java/com/yolo/keyborad/mapper/KeyboardTagI18nMapper.java @@ -0,0 +1,12 @@ +package com.yolo.keyborad.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yolo.keyborad.model.entity.KeyboardTagI18n; + +/* +* @author: ziin +* @date: 2026/4/2 13:54 +*/ + +public interface KeyboardTagI18nMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/entity/KeyboardTag.java b/src/main/java/com/yolo/keyborad/model/entity/KeyboardTag.java index 9d1dbb4..2b78832 100644 --- a/src/main/java/com/yolo/keyborad/model/entity/KeyboardTag.java +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardTag.java @@ -22,10 +22,6 @@ public class KeyboardTag { @Schema(description="主键 id") private Integer id; - @TableField(value = "tag_name") - @Schema(description="标签名") - private String tagName; - @TableField(value = "created_at") @Schema(description="创建时间") private Date createdAt; diff --git a/src/main/java/com/yolo/keyborad/model/entity/KeyboardTagI18n.java b/src/main/java/com/yolo/keyborad/model/entity/KeyboardTagI18n.java new file mode 100644 index 0000000..6c62b9f --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardTagI18n.java @@ -0,0 +1,64 @@ +package com.yolo.keyborad.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.Date; +import lombok.Data; + +/* +* @author: ziin +* @date: 2026/4/2 13:54 +*/ + +/** + * 人设标签国际化表 + */ +@Schema(description="人设标签国际化表") +@Data +@TableName(value = "keyboard_tag_i18n") +public class KeyboardTagI18n { + /** + * 主键 Id + */ + @TableId(value = "id", type = IdType.AUTO) + @Schema(description="主键 Id") + private Long id; + + /** + * 标签主表ID,对应 keyboard_tag.id + */ + @TableField(value = "tag_id") + @Schema(description="标签主表ID,对应 keyboard_tag.id") + private Integer tagId; + + /** + * 语言标识,如 zh-CN、en-US、ja-JP + */ + @TableField(value = "\"locale\"") + @Schema(description="语言标识,如 zh-CN、en-US、ja-JP") + private String locale; + + /** + * 标签名称(多语言) + */ + @TableField(value = "tag_name") + @Schema(description="标签名称(多语言)") + private String tagName; + + /** + * 创建时间 + */ + @TableField(value = "created_at") + @Schema(description="创建时间") + private Date createdAt; + + /** + * 更新时间 + */ + @TableField(value = "updated_at") + @Schema(description="更新时间") + private Date updatedAt; +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardTagI18nService.java b/src/main/java/com/yolo/keyborad/service/KeyboardTagI18nService.java new file mode 100644 index 0000000..f52b254 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/KeyboardTagI18nService.java @@ -0,0 +1,13 @@ +package com.yolo.keyborad.service; + +import com.yolo.keyborad.model.entity.KeyboardTagI18n; +import com.baomidou.mybatisplus.extension.service.IService; + /* +* @author: ziin +* @date: 2026/4/2 13:54 +*/ + +public interface KeyboardTagI18nService extends IService{ + + +} diff --git a/src/main/java/com/yolo/keyborad/service/TagService.java b/src/main/java/com/yolo/keyborad/service/TagService.java index 5370a65..65c1933 100644 --- a/src/main/java/com/yolo/keyborad/service/TagService.java +++ b/src/main/java/com/yolo/keyborad/service/TagService.java @@ -2,6 +2,7 @@ package com.yolo.keyborad.service; import com.baomidou.mybatisplus.extension.service.IService; import com.yolo.keyborad.model.entity.KeyboardTag; +import com.yolo.keyborad.model.vo.tags.TagsRespVO; import java.util.List; @@ -10,6 +11,10 @@ import java.util.List; * @date: 2025/12/3 14:11 */ public interface TagService extends IService { - List selectList(); + List selectList(String acceptLanguage); + + default List selectList() { + return selectList(null); + } } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardTagI18nServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardTagI18nServiceImpl.java new file mode 100644 index 0000000..9e44eb8 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardTagI18nServiceImpl.java @@ -0,0 +1,18 @@ +package com.yolo.keyborad.service.impl; + +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yolo.keyborad.mapper.KeyboardTagI18nMapper; +import com.yolo.keyborad.model.entity.KeyboardTagI18n; +import com.yolo.keyborad.service.KeyboardTagI18nService; +/* +* @author: ziin +* @date: 2026/4/2 13:54 +*/ + +@Service +public class KeyboardTagI18nServiceImpl extends ServiceImpl implements KeyboardTagI18nService{ + +} diff --git a/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java index c00f8a3..14c854f 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java @@ -1,14 +1,24 @@ package com.yolo.keyborad.service.impl; +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.extension.service.impl.ServiceImpl; +import com.yolo.keyborad.mapper.KeyboardTagI18nMapper; import com.yolo.keyborad.mapper.KeyboardTagMapper; import com.yolo.keyborad.model.entity.KeyboardTag; +import com.yolo.keyborad.model.entity.KeyboardTagI18n; +import com.yolo.keyborad.model.vo.tags.TagsRespVO; import com.yolo.keyborad.service.TagService; +import com.yolo.keyborad.utils.RequestLocaleUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /* * @author: ziin @@ -19,9 +29,52 @@ public class TagServiceImpl extends ServiceImpl @Resource private KeyboardTagMapper keyboardTagMapper; + + @Resource + private KeyboardTagI18nMapper keyboardTagI18nMapper; + @Override - public List selectList() { - return keyboardTagMapper.selectList(new - QueryWrapper().eq("deleted", false)); + public List selectList(String acceptLanguage) { + List tags = keyboardTagMapper.selectList(new QueryWrapper().eq("deleted", false)); + return buildTagRespList(tags, acceptLanguage); + } + + private List buildTagRespList(List tags, String acceptLanguage) { + if (tags == null || tags.isEmpty()) { + return Collections.emptyList(); + } + List respVOS = BeanUtil.copyToList(tags, TagsRespVO.class); + String locale = RequestLocaleUtils.resolveLanguage(acceptLanguage); + if (!StringUtils.hasText(locale)) { + return respVOS; + } + List tagIds = tags.stream().map(KeyboardTag::getId).toList(); + Map i18nMap = loadI18nMap(tagIds, locale); + respVOS.forEach(tag -> { + KeyboardTagI18n i18n = i18nMap.get(tag.getId()); + if (i18n != null) { + tag.setTagName(i18n.getTagName()); + } + }); + return respVOS; + } + + private Map loadI18nMap(List tagIds, String locale) { + if (tagIds == null || tagIds.isEmpty()) { + return Collections.emptyMap(); + } + List i18nList = keyboardTagI18nMapper.selectList( + new LambdaQueryWrapper() + .in(KeyboardTagI18n::getTagId, tagIds) + .eq(KeyboardTagI18n::getLocale, locale) + ); + if (i18nList == null || i18nList.isEmpty()) { + return Collections.emptyMap(); + } + return i18nList.stream().collect(Collectors.toMap( + KeyboardTagI18n::getTagId, + item -> item, + (left, right) -> left + )); } } diff --git a/src/main/resources/mapper/KeyboardTagI18nMapper.xml b/src/main/resources/mapper/KeyboardTagI18nMapper.xml new file mode 100644 index 0000000..6ec868f --- /dev/null +++ b/src/main/resources/mapper/KeyboardTagI18nMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + id, tag_id, "locale", tag_name, created_at, updated_at + + \ No newline at end of file