From 23dbfb64c450aa29f3e8d695b06136cbd18d34fd Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 3 Dec 2025 15:25:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E6=96=B0=E5=A2=9E=E4=BA=BA?= =?UTF-8?q?=E8=AE=BE=E4=B8=8E=E6=A0=87=E7=AD=BE=E6=A8=A1=E5=9D=97=E5=8F=8A?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 KeyboardCharacter/Tag 实体、Mapper、Service 及 VO - 新增 CharacterController 与 TagController 提供 /list 接口 - 放开 /character/list、/tag/list 免登录访问 - 补充对应 XML 查询与 .gitignore 忽略 CLAUDE.md --- .gitignore | 3 +- .../keyborad/config/SaTokenConfigure.java | 4 +- .../controller/CharacterController.java | 40 ++++++++++++ .../keyborad/controller/TagController.java | 39 ++++++++++++ .../mapper/KeyboardCharacterMapper.java | 12 ++++ .../keyborad/mapper/KeyboardTagMapper.java | 12 ++++ .../model/entity/KeyboardCharacter.java | 63 +++++++++++++++++++ .../keyborad/model/entity/KeyboardTag.java | 40 ++++++++++++ .../keyborad/model/entity/KeyboardUser.java | 1 - .../vo/character/KeyboardCharacterRespVO.java | 41 ++++++++++++ .../keyborad/model/vo/tags/TagsRespVO.java | 26 ++++++++ .../service/KeyboardCharacterService.java | 17 +++++ .../com/yolo/keyborad/service/TagService.java | 15 +++++ .../impl/KeyboardCharacterServiceImpl.java | 30 +++++++++ .../keyborad/service/impl/TagServiceImpl.java | 27 ++++++++ .../mapper/KeyboardCharacter‌Mapper.xml | 22 +++++++ .../resources/mapper/KeyboardTagMapper.xml | 15 +++++ 17 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/yolo/keyborad/controller/CharacterController.java create mode 100644 src/main/java/com/yolo/keyborad/controller/TagController.java create mode 100644 src/main/java/com/yolo/keyborad/mapper/KeyboardCharacterMapper.java create mode 100644 src/main/java/com/yolo/keyborad/mapper/KeyboardTagMapper.java create mode 100644 src/main/java/com/yolo/keyborad/model/entity/KeyboardCharacter.java create mode 100644 src/main/java/com/yolo/keyborad/model/entity/KeyboardTag.java create mode 100644 src/main/java/com/yolo/keyborad/model/vo/character/KeyboardCharacterRespVO.java create mode 100644 src/main/java/com/yolo/keyborad/model/vo/tags/TagsRespVO.java create mode 100644 src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java create mode 100644 src/main/java/com/yolo/keyborad/service/TagService.java create mode 100644 src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java create mode 100644 src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java create mode 100644 src/main/resources/mapper/KeyboardCharacter‌Mapper.xml create mode 100644 src/main/resources/mapper/KeyboardTagMapper.xml diff --git a/.gitignore b/.gitignore index 76be2c2..0b0008a 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,5 @@ build/ !**/src/test/**/build/ ### VS Code ### -.vscode/ \ No newline at end of file +.vscode/ +/CLAUDE.md diff --git a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java index eb08929..a36ba09 100644 --- a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java +++ b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java @@ -66,7 +66,9 @@ public class SaTokenConfigure implements WebMvcConfigurer { "/demo/testSearch", "/demo/tsetSearchText", "/file/upload", - "/user/logout" + "/user/logout", + "/tag/list", + "/character/list" }; } @Bean diff --git a/src/main/java/com/yolo/keyborad/controller/CharacterController.java b/src/main/java/com/yolo/keyborad/controller/CharacterController.java new file mode 100644 index 0000000..8e57cc1 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/controller/CharacterController.java @@ -0,0 +1,40 @@ +package com.yolo.keyborad.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.yolo.keyborad.common.BaseResponse; +import com.yolo.keyborad.common.ResultUtils; +import com.yolo.keyborad.model.entity.KeyboardCharacter; +import com.yolo.keyborad.model.entity.KeyboardTag; +import com.yolo.keyborad.model.vo.character.KeyboardCharacterRespVO; +import com.yolo.keyborad.model.vo.tags.TagsRespVO; +import com.yolo.keyborad.service.KeyboardCharacterService; +import io.swagger.v3.oas.annotations.Operation; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/* + * @author: ziin + * @date: 2025/12/3 14:23 + */ +@RestController +@Slf4j +@RequestMapping("/character") +@Tag(name = "人设信息") +public class CharacterController { + + @Resource + private KeyboardCharacterService characterService; + + @GetMapping("/list") + @Operation(summary = "人设列表", description = "人设列表接口按 rank 排名") + public BaseResponse> list() { + List list = characterService.selectListWithRank(); + return ResultUtils.success(BeanUtil.copyToList(list, KeyboardCharacterRespVO.class)); + } +} diff --git a/src/main/java/com/yolo/keyborad/controller/TagController.java b/src/main/java/com/yolo/keyborad/controller/TagController.java new file mode 100644 index 0000000..6e99a72 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/controller/TagController.java @@ -0,0 +1,39 @@ +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; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/* + * @author: ziin + * @date: 2025/12/3 14:10 + */ +@RestController +@Slf4j +@RequestMapping("/tag") +@Tag(name = "人设标签") +public class TagController { + + @Resource + private TagService tagService; + + @GetMapping("/list") + @Operation(summary = "标签列表", description = "标签列表接口") + public BaseResponse> list() { + List list = tagService.selectList(); + return ResultUtils.success(BeanUtil.copyToList(list, TagsRespVO.class)); + } +} diff --git a/src/main/java/com/yolo/keyborad/mapper/KeyboardCharacterMapper.java b/src/main/java/com/yolo/keyborad/mapper/KeyboardCharacterMapper.java new file mode 100644 index 0000000..ec28917 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/mapper/KeyboardCharacterMapper.java @@ -0,0 +1,12 @@ +package com.yolo.keyborad.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yolo.keyborad.model.entity.KeyboardCharacter; + +/* +* @author: ziin +* @date: 2025/12/3 14:18 +*/ + +public interface KeyboardCharacterMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/mapper/KeyboardTagMapper.java b/src/main/java/com/yolo/keyborad/mapper/KeyboardTagMapper.java new file mode 100644 index 0000000..192c670 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/mapper/KeyboardTagMapper.java @@ -0,0 +1,12 @@ +package com.yolo.keyborad.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yolo.keyborad.model.entity.KeyboardTag; + +/* +* @author: ziin +* @date: 2025/12/3 14:09 +*/ + +public interface KeyboardTagMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/entity/KeyboardCharacter.java b/src/main/java/com/yolo/keyborad/model/entity/KeyboardCharacter.java new file mode 100644 index 0000000..cdc9397 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardCharacter.java @@ -0,0 +1,63 @@ +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: 2025/12/3 14:18 +*/ + +@Schema +@Data +@TableName("keyboard_character") +public class KeyboardCharacter { + @TableId(value = "id", type = IdType.AUTO) + @Schema(description="主键 Id") + private Long id; + + @TableField(value = "title") + @Schema(description="标题") + private String title; + + @TableField(value = "\"character_background\"") + @Schema(description="背景描述") + private String characterBackground; + + @TableField(value = "avatar_url") + @Schema(description="角色头像") + private String avatarUrl; + + @TableField(value = "download") + @Schema(description="下载次数") + private String download; + + @TableField(value = "tag") + @Schema(description="标签id") + private Long tag; + + @TableField(value = "deleted") + @Schema(description="是否删除") + private Boolean deleted; + + @TableField(value = "created_at") + @Schema(description="创建时间") + private Date createdAt; + + @TableField(value = "updated_at") + @Schema(description="更新时间") + private Date updatedAt; + + @TableField(value = "prompt") + @Schema(description="人设提示词") + private String prompt; + + @TableField(value = "\"rank\"") + @Schema(description="排名顺序") + private Integer rank; +} \ 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 new file mode 100644 index 0000000..9d1dbb4 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardTag.java @@ -0,0 +1,40 @@ +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: 2025/12/3 14:09 +*/ + +@Schema +@Data +@TableName(value = "keyboard_tag") +public class KeyboardTag { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description="主键 id") + private Integer id; + + @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; + + @TableField(value = "deleted") + @Schema(description="是否删除") + private Boolean deleted; +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/entity/KeyboardUser.java b/src/main/java/com/yolo/keyborad/model/entity/KeyboardUser.java index af9abe8..e199160 100644 --- a/src/main/java/com/yolo/keyborad/model/entity/KeyboardUser.java +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardUser.java @@ -1,7 +1,6 @@ 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 io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/yolo/keyborad/model/vo/character/KeyboardCharacterRespVO.java b/src/main/java/com/yolo/keyborad/model/vo/character/KeyboardCharacterRespVO.java new file mode 100644 index 0000000..af254b0 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/vo/character/KeyboardCharacterRespVO.java @@ -0,0 +1,41 @@ +package com.yolo.keyborad.model.vo.character; + +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 lombok.Data; + +import java.util.Date; + +/* +* @author: ziin +* @date: 2025/12/3 14:18 +*/ + +@Schema +@Data +public class KeyboardCharacterRespVO { + @Schema(description="主键 Id") + private Long id; + + @Schema(description="标题") + private String title; + + + @Schema(description="背景描述") + private String characterBackground; + + @Schema(description="角色头像") + private String avatarUrl; + + @Schema(description="下载次数") + private String download; + + @Schema(description="标签id") + private Long tag; + + @Schema(description="排名顺序") + private Integer rank; +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/vo/tags/TagsRespVO.java b/src/main/java/com/yolo/keyborad/model/vo/tags/TagsRespVO.java new file mode 100644 index 0000000..eee7bfb --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/vo/tags/TagsRespVO.java @@ -0,0 +1,26 @@ +package com.yolo.keyborad.model.vo.tags; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +/* + * @author: ziin + * @date: 2025/12/3 14:12 + */ +@Data +public class TagsRespVO { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description="主键 id") + private Integer id; + + @TableField(value = "tag_name") + @Schema(description="标签名") + private String tagName; + +} diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java b/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java new file mode 100644 index 0000000..2d9ef42 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java @@ -0,0 +1,17 @@ +package com.yolo.keyborad.service; + +import com.yolo.keyborad.model.entity.KeyboardCharacter; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yolo.keyborad.model.entity.KeyboardTag; + +import java.util.List; +/* +* @author: ziin +* @date: 2025/12/3 14:18 +*/ + +public interface KeyboardCharacterService extends IService{ + + + List selectListWithRank(); +} diff --git a/src/main/java/com/yolo/keyborad/service/TagService.java b/src/main/java/com/yolo/keyborad/service/TagService.java new file mode 100644 index 0000000..5370a65 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/TagService.java @@ -0,0 +1,15 @@ +package com.yolo.keyborad.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yolo.keyborad.model.entity.KeyboardTag; + +import java.util.List; + +/* + * @author: ziin + * @date: 2025/12/3 14:11 + */ +public interface TagService extends IService { + List selectList(); + +} diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java new file mode 100644 index 0000000..1f41fcf --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java @@ -0,0 +1,30 @@ +package com.yolo.keyborad.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yolo.keyborad.mapper.KeyboardCharacterMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yolo.keyborad.model.entity.KeyboardCharacter; +import com.yolo.keyborad.service.KeyboardCharacterService; + +import java.util.List; +/* +* @author: ziin +* @date: 2025/12/3 14:18 +*/ + +@Service +public class KeyboardCharacterServiceImpl extends ServiceImpl implements KeyboardCharacterService{ + + @Resource + private KeyboardCharacterMapper keyboardCharacterMapper; + + @Override + public List selectListWithRank() { + return keyboardCharacterMapper.selectList(new LambdaQueryWrapper() + .eq(KeyboardCharacter::getDeleted, false) + .orderByDesc(KeyboardCharacter::getRank)); + } +} diff --git a/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java new file mode 100644 index 0000000..c00f8a3 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/impl/TagServiceImpl.java @@ -0,0 +1,27 @@ +package com.yolo.keyborad.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yolo.keyborad.mapper.KeyboardTagMapper; +import com.yolo.keyborad.model.entity.KeyboardTag; +import com.yolo.keyborad.service.TagService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; + +/* + * @author: ziin + * @date: 2025/12/3 14:12 + */ +@Service +public class TagServiceImpl extends ServiceImpl implements TagService { + + @Resource + private KeyboardTagMapper keyboardTagMapper; + @Override + public List selectList() { + return keyboardTagMapper.selectList(new + QueryWrapper().eq("deleted", false)); + } +} diff --git a/src/main/resources/mapper/KeyboardCharacter‌Mapper.xml b/src/main/resources/mapper/KeyboardCharacter‌Mapper.xml new file mode 100644 index 0000000..c4e5535 --- /dev/null +++ b/src/main/resources/mapper/KeyboardCharacter‌Mapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + id, title, "character_background", avatar_url, download, tag, deleted, created_at, + updated_at, prompt, "rank" + + \ No newline at end of file diff --git a/src/main/resources/mapper/KeyboardTagMapper.xml b/src/main/resources/mapper/KeyboardTagMapper.xml new file mode 100644 index 0000000..e9d2947 --- /dev/null +++ b/src/main/resources/mapper/KeyboardTagMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + id, tag_name, created_at, updated_at, deleted + + \ No newline at end of file