新增标签国际化查询并改用包装类返回标签数据

This commit is contained in:
2026-04-02 14:38:23 +08:00
parent aa6cc25ab4
commit 9bd9a2646f
9 changed files with 192 additions and 14 deletions

View File

@@ -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<TagsRespVO>> list() {
List<KeyboardTag> list = tagService.selectList();
return ResultUtils.success(BeanUtil.copyToList(list, TagsRespVO.class));
public BaseResponse<List<TagsRespVO>> list(
@RequestHeader(value = "Accept-Language", required = false) String acceptLanguage
) {
return ResultUtils.success(tagService.selectList(acceptLanguage));
}
}

View File

@@ -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<KeyboardTagI18n> {
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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<KeyboardTagI18n>{
}

View File

@@ -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<KeyboardTag> {
List<KeyboardTag> selectList();
List<TagsRespVO> selectList(String acceptLanguage);
default List<TagsRespVO> selectList() {
return selectList(null);
}
}

View File

@@ -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<KeyboardTagI18nMapper, KeyboardTagI18n> implements KeyboardTagI18nService{
}

View File

@@ -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<KeyboardTagMapper, KeyboardTag>
@Resource
private KeyboardTagMapper keyboardTagMapper;
@Resource
private KeyboardTagI18nMapper keyboardTagI18nMapper;
@Override
public List<KeyboardTag> selectList() {
return keyboardTagMapper.selectList(new
QueryWrapper<KeyboardTag>().eq("deleted", false));
public List<TagsRespVO> selectList(String acceptLanguage) {
List<KeyboardTag> tags = keyboardTagMapper.selectList(new QueryWrapper<KeyboardTag>().eq("deleted", false));
return buildTagRespList(tags, acceptLanguage);
}
private List<TagsRespVO> buildTagRespList(List<KeyboardTag> tags, String acceptLanguage) {
if (tags == null || tags.isEmpty()) {
return Collections.emptyList();
}
List<TagsRespVO> respVOS = BeanUtil.copyToList(tags, TagsRespVO.class);
String locale = RequestLocaleUtils.resolveLanguage(acceptLanguage);
if (!StringUtils.hasText(locale)) {
return respVOS;
}
List<Integer> tagIds = tags.stream().map(KeyboardTag::getId).toList();
Map<Integer, KeyboardTagI18n> i18nMap = loadI18nMap(tagIds, locale);
respVOS.forEach(tag -> {
KeyboardTagI18n i18n = i18nMap.get(tag.getId());
if (i18n != null) {
tag.setTagName(i18n.getTagName());
}
});
return respVOS;
}
private Map<Integer, KeyboardTagI18n> loadI18nMap(List<Integer> tagIds, String locale) {
if (tagIds == null || tagIds.isEmpty()) {
return Collections.emptyMap();
}
List<KeyboardTagI18n> i18nList = keyboardTagI18nMapper.selectList(
new LambdaQueryWrapper<KeyboardTagI18n>()
.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
));
}
}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yolo.keyborad.mapper.KeyboardTagI18nMapper">
<resultMap id="BaseResultMap" type="com.yolo.keyborad.model.entity.KeyboardTagI18n">
<!--@mbg.generated-->
<!--@Table keyboard_tag_i18n-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="tag_id" jdbcType="INTEGER" property="tagId" />
<result column="locale" jdbcType="VARCHAR" property="locale" />
<result column="tag_name" jdbcType="VARCHAR" property="tagName" />
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, tag_id, "locale", tag_name, created_at, updated_at
</sql>
</mapper>