From fd4c381d335e86205737884c1b07157d42c0a9e9 Mon Sep 17 00:00:00 2001 From: ziin Date: Mon, 26 Jan 2026 15:06:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-companion):=20=E6=96=B0=E5=A2=9EAI?= =?UTF-8?q?=E4=BC=B4=E4=BE=A3=E6=A8=A1=E5=9D=97=E5=8F=8A=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyborad/config/SaTokenConfigure.java | 3 +- .../controller/AiCompanionController.java | 34 +++++ .../mapper/KeyboardAiCompanionMapper.java | 12 ++ .../model/entity/KeyboardAiCompanion.java | 141 ++++++++++++++++++ .../service/KeyboardAiCompanionService.java | 21 +++ .../impl/KeyboardAiCompanionServiceImpl.java | 29 ++++ .../mapper/KeyboardAiCompanionMapper.xml | 31 ++++ 7 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/yolo/keyborad/controller/AiCompanionController.java create mode 100644 src/main/java/com/yolo/keyborad/mapper/KeyboardAiCompanionMapper.java create mode 100644 src/main/java/com/yolo/keyborad/model/entity/KeyboardAiCompanion.java create mode 100644 src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java create mode 100644 src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java create mode 100644 src/main/resources/mapper/KeyboardAiCompanionMapper.xml diff --git a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java index 68bf69c..7a2a1ec 100644 --- a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java +++ b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java @@ -111,7 +111,8 @@ public class SaTokenConfigure implements WebMvcConfigurer { "/themes/restore", "/chat/message", "/chat/voice", - "/chat/audio/*" + "/chat/audio/*", + "/ai-companion/page" }; } @Bean diff --git a/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java b/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java new file mode 100644 index 0000000..fd25987 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java @@ -0,0 +1,34 @@ +package com.yolo.keyborad.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yolo.keyborad.common.BaseResponse; +import com.yolo.keyborad.common.ResultUtils; +import com.yolo.keyborad.model.dto.PageDTO; +import com.yolo.keyborad.model.entity.KeyboardAiCompanion; +import com.yolo.keyborad.service.KeyboardAiCompanionService; +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.*; + +/* + * @author: ziin + * @date: 2026/1/26 + */ +@RestController +@Slf4j +@RequestMapping("/ai-companion") +@Tag(name = "AI陪聊角色", description = "AI陪聊角色管理接口") +public class AiCompanionController { + + @Resource + private KeyboardAiCompanionService aiCompanionService; + + @PostMapping("/page") + @Operation(summary = "分页查询AI陪聊角色", description = "分页查询已上线的AI陪聊角色列表") + public BaseResponse> pageList(@RequestBody PageDTO pageDTO) { + IPage result = aiCompanionService.pageList(pageDTO.getPageNum(), pageDTO.getPageSize()); + return ResultUtils.success(result); + } +} diff --git a/src/main/java/com/yolo/keyborad/mapper/KeyboardAiCompanionMapper.java b/src/main/java/com/yolo/keyborad/mapper/KeyboardAiCompanionMapper.java new file mode 100644 index 0000000..5b0fe46 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/mapper/KeyboardAiCompanionMapper.java @@ -0,0 +1,12 @@ +package com.yolo.keyborad.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yolo.keyborad.model.entity.KeyboardAiCompanion; + +/* +* @author: ziin +* @date: 2026/1/26 13:51 +*/ + +public interface KeyboardAiCompanionMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/entity/KeyboardAiCompanion.java b/src/main/java/com/yolo/keyborad/model/entity/KeyboardAiCompanion.java new file mode 100644 index 0000000..fc0cf41 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardAiCompanion.java @@ -0,0 +1,141 @@ +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/1/26 13:51 +*/ + +/** + * AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 + */ +@Schema(description="AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设") +@Data +@TableName(value = "keyboard_ai_companion") +public class KeyboardAiCompanion { + /** + * 陪聊角色唯一ID + */ + @TableId(value = "id", type = IdType.AUTO) + @Schema(description="陪聊角色唯一ID") + private Long id; + + /** + * 角色名称(展示用,如:Katie Leona) + */ + @TableField(value = "\"name\"") + @Schema(description="角色名称(展示用,如:Katie Leona)") + private String name; + + /** + * 角色头像URL,用于列表页和聊天页 + */ + @TableField(value = "avatar_url") + @Schema(description="角色头像URL,用于列表页和聊天页") + private String avatarUrl; + + /** + * 角色封面图URL,用于角色详情页 + */ + @TableField(value = "cover_image_url") + @Schema(description="角色封面图URL,用于角色详情页") + private String coverImageUrl; + + /** + * 角色性别(male / female / other) + */ + @TableField(value = "gender") + @Schema(description="角色性别(male / female / other)") + private String gender; + + /** + * 角色年龄段描述(如:20s、25-30) + */ + @TableField(value = "age_range") + @Schema(description="角色年龄段描述(如:20s、25-30)") + private String ageRange; + + /** + * 一句话人设描述,用于卡片或列表展示 + */ + @TableField(value = "short_desc") + @Schema(description="一句话人设描述,用于卡片或列表展示") + private String shortDesc; + + /** + * 角色详细介绍文案,用于角色详情页 + */ + @TableField(value = "intro_text") + @Schema(description="角色详细介绍文案,用于角色详情页") + private String introText; + + /** + * 角色性格标签数组(如:温柔、黏人、治愈) + */ + @TableField(value = "personality_tags") + @Schema(description="角色性格标签数组(如:温柔、黏人、治愈)") + private String personalityTags; + + /** + * 角色说话风格(如:撒娇型、理性型、活泼型) + */ + @TableField(value = "speaking_style") + @Schema(description="角色说话风格(如:撒娇型、理性型、活泼型)") + private String speakingStyle; + + /** + * AI系统Prompt,定义角色核心人设,仅供模型使用 + */ + @TableField(value = "system_prompt") + @Schema(description="AI系统Prompt,定义角色核心人设,仅供模型使用") + private String systemPrompt; + + /** + * 角色状态:1=上线,0=下线 + */ + @TableField(value = "\"status\"") + @Schema(description="角色状态:1=上线,0=下线") + private Short status; + + /** + * 角色可见性:1=公开,2=内测,3=隐藏 + */ + @TableField(value = "visibility") + @Schema(description="角色可见性:1=公开,2=内测,3=隐藏") + private Short visibility; + + /** + * 排序权重,数值越大排序越靠前 + */ + @TableField(value = "sort_order") + @Schema(description="排序权重,数值越大排序越靠前") + private Integer sortOrder; + + /** + * 角色热度评分,用于推荐排序 + */ + @TableField(value = "popularity_score") + @Schema(description="角色热度评分,用于推荐排序") + private Integer popularityScore; + + /** + * 创建时间 + */ + @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/KeyboardAiCompanionService.java b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java new file mode 100644 index 0000000..6946243 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java @@ -0,0 +1,21 @@ +package com.yolo.keyborad.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yolo.keyborad.model.entity.KeyboardAiCompanion; +import com.baomidou.mybatisplus.extension.service.IService; + +/* + * @author: ziin + * @date: 2026/1/26 13:51 + */ +public interface KeyboardAiCompanionService extends IService { + + /** + * 分页查询已上线的AI陪聊角色 + * + * @param pageNum 页码 + * @param pageSize 每页数量 + * @return 分页结果 + */ + IPage pageList(Integer pageNum, Integer pageSize); +} diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java new file mode 100644 index 0000000..895fb89 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java @@ -0,0 +1,29 @@ +package com.yolo.keyborad.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yolo.keyborad.model.entity.KeyboardAiCompanion; +import com.yolo.keyborad.mapper.KeyboardAiCompanionMapper; +import com.yolo.keyborad.service.KeyboardAiCompanionService; + +/* + * @author: ziin + * @date: 2026/1/26 13:51 + */ +@Service +public class KeyboardAiCompanionServiceImpl extends ServiceImpl implements KeyboardAiCompanionService { + + @Override + public IPage pageList(Integer pageNum, Integer pageSize) { + Page page = new Page<>(pageNum, pageSize); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(KeyboardAiCompanion::getStatus, 1) + .eq(KeyboardAiCompanion::getVisibility, 1) + .orderByDesc(KeyboardAiCompanion::getSortOrder) + .orderByDesc(KeyboardAiCompanion::getPopularityScore); + return this.page(page, queryWrapper); + } +} diff --git a/src/main/resources/mapper/KeyboardAiCompanionMapper.xml b/src/main/resources/mapper/KeyboardAiCompanionMapper.xml new file mode 100644 index 0000000..6b1bf1e --- /dev/null +++ b/src/main/resources/mapper/KeyboardAiCompanionMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + id, "name", avatar_url, cover_image_url, gender, age_range, short_desc, intro_text, + personality_tags, speaking_style, system_prompt, "status", visibility, sort_order, + popularity_score, created_at, updated_at + + \ No newline at end of file