feat(ai-companion): 新增AI伴侣模块及白名单路径
This commit is contained in:
@@ -111,7 +111,8 @@ public class SaTokenConfigure implements WebMvcConfigurer {
|
||||
"/themes/restore",
|
||||
"/chat/message",
|
||||
"/chat/voice",
|
||||
"/chat/audio/*"
|
||||
"/chat/audio/*",
|
||||
"/ai-companion/page"
|
||||
};
|
||||
}
|
||||
@Bean
|
||||
|
||||
@@ -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<IPage<KeyboardAiCompanion>> pageList(@RequestBody PageDTO pageDTO) {
|
||||
IPage<KeyboardAiCompanion> result = aiCompanionService.pageList(pageDTO.getPageNum(), pageDTO.getPageSize());
|
||||
return ResultUtils.success(result);
|
||||
}
|
||||
}
|
||||
@@ -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<KeyboardAiCompanion> {
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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<KeyboardAiCompanion> {
|
||||
|
||||
/**
|
||||
* 分页查询已上线的AI陪聊角色
|
||||
*
|
||||
* @param pageNum 页码
|
||||
* @param pageSize 每页数量
|
||||
* @return 分页结果
|
||||
*/
|
||||
IPage<KeyboardAiCompanion> pageList(Integer pageNum, Integer pageSize);
|
||||
}
|
||||
@@ -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<KeyboardAiCompanionMapper, KeyboardAiCompanion> implements KeyboardAiCompanionService {
|
||||
|
||||
@Override
|
||||
public IPage<KeyboardAiCompanion> pageList(Integer pageNum, Integer pageSize) {
|
||||
Page<KeyboardAiCompanion> page = new Page<>(pageNum, pageSize);
|
||||
LambdaQueryWrapper<KeyboardAiCompanion> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(KeyboardAiCompanion::getStatus, 1)
|
||||
.eq(KeyboardAiCompanion::getVisibility, 1)
|
||||
.orderByDesc(KeyboardAiCompanion::getSortOrder)
|
||||
.orderByDesc(KeyboardAiCompanion::getPopularityScore);
|
||||
return this.page(page, queryWrapper);
|
||||
}
|
||||
}
|
||||
31
src/main/resources/mapper/KeyboardAiCompanionMapper.xml
Normal file
31
src/main/resources/mapper/KeyboardAiCompanionMapper.xml
Normal file
@@ -0,0 +1,31 @@
|
||||
<?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.KeyboardAiCompanionMapper">
|
||||
<resultMap id="BaseResultMap" type="com.yolo.keyborad.model.entity.KeyboardAiCompanion">
|
||||
<!--@mbg.generated-->
|
||||
<!--@Table keyboard_ai_companion-->
|
||||
<id column="id" jdbcType="BIGINT" property="id" />
|
||||
<result column="name" jdbcType="VARCHAR" property="name" />
|
||||
<result column="avatar_url" jdbcType="VARCHAR" property="avatarUrl" />
|
||||
<result column="cover_image_url" jdbcType="VARCHAR" property="coverImageUrl" />
|
||||
<result column="gender" jdbcType="VARCHAR" property="gender" />
|
||||
<result column="age_range" jdbcType="VARCHAR" property="ageRange" />
|
||||
<result column="short_desc" jdbcType="VARCHAR" property="shortDesc" />
|
||||
<result column="intro_text" jdbcType="VARCHAR" property="introText" />
|
||||
<result column="personality_tags" jdbcType="VARCHAR" property="personalityTags" />
|
||||
<result column="speaking_style" jdbcType="VARCHAR" property="speakingStyle" />
|
||||
<result column="system_prompt" jdbcType="VARCHAR" property="systemPrompt" />
|
||||
<result column="status" jdbcType="SMALLINT" property="status" />
|
||||
<result column="visibility" jdbcType="SMALLINT" property="visibility" />
|
||||
<result column="sort_order" jdbcType="INTEGER" property="sortOrder" />
|
||||
<result column="popularity_score" jdbcType="INTEGER" property="popularityScore" />
|
||||
<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, "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
|
||||
</sql>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user