新增标签国际化查询并改用包装类返回标签数据
This commit is contained in:
@@ -1,10 +1,7 @@
|
|||||||
package com.yolo.keyborad.controller;
|
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.BaseResponse;
|
||||||
import com.yolo.keyborad.common.ResultUtils;
|
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.model.vo.tags.TagsRespVO;
|
||||||
import com.yolo.keyborad.service.TagService;
|
import com.yolo.keyborad.service.TagService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
@@ -12,6 +9,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
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.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
@@ -32,8 +30,9 @@ public class TagController {
|
|||||||
|
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
@Operation(summary = "标签列表", description = "标签列表接口")
|
@Operation(summary = "标签列表", description = "标签列表接口")
|
||||||
public BaseResponse<List<TagsRespVO>> list() {
|
public BaseResponse<List<TagsRespVO>> list(
|
||||||
List<KeyboardTag> list = tagService.selectList();
|
@RequestHeader(value = "Accept-Language", required = false) String acceptLanguage
|
||||||
return ResultUtils.success(BeanUtil.copyToList(list, TagsRespVO.class));
|
) {
|
||||||
|
return ResultUtils.success(tagService.selectList(acceptLanguage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
}
|
||||||
@@ -22,10 +22,6 @@ public class KeyboardTag {
|
|||||||
@Schema(description="主键 id")
|
@Schema(description="主键 id")
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
@TableField(value = "tag_name")
|
|
||||||
@Schema(description="标签名")
|
|
||||||
private String tagName;
|
|
||||||
|
|
||||||
@TableField(value = "created_at")
|
@TableField(value = "created_at")
|
||||||
@Schema(description="创建时间")
|
@Schema(description="创建时间")
|
||||||
private Date createdAt;
|
private Date createdAt;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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>{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.yolo.keyborad.service;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.yolo.keyborad.model.entity.KeyboardTag;
|
import com.yolo.keyborad.model.entity.KeyboardTag;
|
||||||
|
import com.yolo.keyborad.model.vo.tags.TagsRespVO;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -10,6 +11,10 @@ import java.util.List;
|
|||||||
* @date: 2025/12/3 14:11
|
* @date: 2025/12/3 14:11
|
||||||
*/
|
*/
|
||||||
public interface TagService extends IService<KeyboardTag> {
|
public interface TagService extends IService<KeyboardTag> {
|
||||||
List<KeyboardTag> selectList();
|
List<TagsRespVO> selectList(String acceptLanguage);
|
||||||
|
|
||||||
|
default List<TagsRespVO> selectList() {
|
||||||
|
return selectList(null);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,14 +1,24 @@
|
|||||||
package com.yolo.keyborad.service.impl;
|
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.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.yolo.keyborad.mapper.KeyboardTagI18nMapper;
|
||||||
import com.yolo.keyborad.mapper.KeyboardTagMapper;
|
import com.yolo.keyborad.mapper.KeyboardTagMapper;
|
||||||
import com.yolo.keyborad.model.entity.KeyboardTag;
|
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.service.TagService;
|
||||||
|
import com.yolo.keyborad.utils.RequestLocaleUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @author: ziin
|
* @author: ziin
|
||||||
@@ -19,9 +29,52 @@ public class TagServiceImpl extends ServiceImpl<KeyboardTagMapper, KeyboardTag>
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private KeyboardTagMapper keyboardTagMapper;
|
private KeyboardTagMapper keyboardTagMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private KeyboardTagI18nMapper keyboardTagI18nMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<KeyboardTag> selectList() {
|
public List<TagsRespVO> selectList(String acceptLanguage) {
|
||||||
return keyboardTagMapper.selectList(new
|
List<KeyboardTag> tags = keyboardTagMapper.selectList(new QueryWrapper<KeyboardTag>().eq("deleted", false));
|
||||||
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
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
src/main/resources/mapper/KeyboardTagI18nMapper.xml
Normal file
18
src/main/resources/mapper/KeyboardTagI18nMapper.xml
Normal 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>
|
||||||
Reference in New Issue
Block a user