diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/KeyboardAiCompanionController.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/KeyboardAiCompanionController.java new file mode 100644 index 0000000..2807eeb --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/KeyboardAiCompanionController.java @@ -0,0 +1,104 @@ +package com.yolo.keyboard.controller.admin.aicompanion; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.yolo.keyboard.framework.common.pojo.PageParam; +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.common.pojo.CommonResult; +import com.yolo.keyboard.framework.common.util.object.BeanUtils; +import static com.yolo.keyboard.framework.common.pojo.CommonResult.success; + +import com.yolo.keyboard.framework.excel.core.util.ExcelUtils; + +import com.yolo.keyboard.framework.apilog.core.annotation.ApiAccessLog; +import static com.yolo.keyboard.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.yolo.keyboard.controller.admin.aicompanion.vo.*; +import com.yolo.keyboard.dal.dataobject.aicompanion.KeyboardAiCompanionDO; +import com.yolo.keyboard.service.aicompanion.KeyboardAiCompanionService; + +@Tag(name = "管理后台 - AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设") +@RestController +@RequestMapping("/keyboard/ai-companion") +@Validated +public class KeyboardAiCompanionController { + + @Resource + private KeyboardAiCompanionService aiCompanionService; + + @PostMapping("/create") + @Operation(summary = "创建AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设") + @PreAuthorize("@ss.hasPermission('keyboard:ai-companion:create')") + public CommonResult createAiCompanion(@Valid @RequestBody KeyboardAiCompanionSaveReqVO createReqVO) { + return success(aiCompanionService.createAiCompanion(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设") + @PreAuthorize("@ss.hasPermission('keyboard:ai-companion:update')") + public CommonResult updateAiCompanion(@Valid @RequestBody KeyboardAiCompanionSaveReqVO updateReqVO) { + aiCompanionService.updateAiCompanion(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('keyboard:ai-companion:delete')") + public CommonResult deleteAiCompanion(@RequestParam("id") Long id) { + aiCompanionService.deleteAiCompanion(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设") + @PreAuthorize("@ss.hasPermission('keyboard:ai-companion:delete')") + public CommonResult deleteAiCompanionList(@RequestParam("ids") List ids) { + aiCompanionService.deleteAiCompanionListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('keyboard:ai-companion:query')") + public CommonResult getAiCompanion(@RequestParam("id") Long id) { + KeyboardAiCompanionDO aiCompanion = aiCompanionService.getAiCompanion(id); + return success(BeanUtils.toBean(aiCompanion, KeyboardAiCompanionRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设分页") + @PreAuthorize("@ss.hasPermission('keyboard:ai-companion:query')") + public CommonResult> getAiCompanionPage(@Valid KeyboardAiCompanionPageReqVO pageReqVO) { + PageResult pageResult = aiCompanionService.getAiCompanionPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, KeyboardAiCompanionRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 Excel") + @PreAuthorize("@ss.hasPermission('keyboard:ai-companion:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportAiCompanionExcel(@Valid KeyboardAiCompanionPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = aiCompanionService.getAiCompanionPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设.xls", "数据", KeyboardAiCompanionRespVO.class, + BeanUtils.toBean(list, KeyboardAiCompanionRespVO.class)); + } + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionPageReqVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionPageReqVO.java new file mode 100644 index 0000000..1353e2d --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionPageReqVO.java @@ -0,0 +1,73 @@ +package com.yolo.keyboard.controller.admin.aicompanion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yolo.keyboard.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.yolo.keyboard.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设分页 Request VO") +@Data +public class KeyboardAiCompanionPageReqVO extends PageParam { + + @Schema(description = "角色名称(展示用,如:Katie Leona)", example = "张三") + private String name; + + @Schema(description = "角色头像URL,用于列表页和聊天页", example = "https://www.iocoder.cn") + private String avatarUrl; + + @Schema(description = "角色封面图URL,用于角色详情页", example = "https://www.iocoder.cn") + private String coverImageUrl; + + @Schema(description = "角色性别(male / female / other)") + private String gender; + + @Schema(description = "角色年龄段描述(如:20s、25-30)") + private String ageRange; + + @Schema(description = "一句话人设描述,用于卡片或列表展示") + private String shortDesc; + + @Schema(description = "角色详细介绍文案,用于角色详情页") + private String introText; + + @Schema(description = "角色性格标签数组(如:温柔、黏人、治愈)") + private Object personalityTags; + + @Schema(description = "角色说话风格(如:撒娇型、理性型、活泼型)") + private String speakingStyle; + + @Schema(description = "AI系统Prompt,定义角色核心人设,仅供模型使用") + private String systemPrompt; + + @Schema(description = "角色状态:1=上线,0=下线", example = "2") + private Short status; + + @Schema(description = "角色可见性:1=公开,2=内测,3=隐藏") + private Short visibility; + + @Schema(description = "排序权重,数值越大排序越靠前") + private Integer sortOrder; + + @Schema(description = "角色热度评分,用于推荐排序") + private Integer popularityScore; + + @Schema(description = "创建时间") + private LocalDateTime createdAt; + + @Schema(description = "更新时间") + private LocalDateTime updatedAt; + + @Schema(description = "开场白") + private String prologue; + + @Schema(description = "开场白音频") + private String prologueAudio; + + @Schema(description = "音频Id", example = "31328") + private String voiceId; + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionRespVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionRespVO.java new file mode 100644 index 0000000..d32317b --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionRespVO.java @@ -0,0 +1,95 @@ +package com.yolo.keyboard.controller.admin.aicompanion.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 Response VO") +@Data +@ExcelIgnoreUnannotated +public class KeyboardAiCompanionRespVO { + + @Schema(description = "陪聊角色唯一ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7816") + @ExcelProperty("陪聊角色唯一ID") + private Long id; + + @Schema(description = "角色名称(展示用,如:Katie Leona)", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("角色名称(展示用,如:Katie Leona)") + private String name; + + @Schema(description = "角色头像URL,用于列表页和聊天页", example = "https://www.iocoder.cn") + @ExcelProperty("角色头像URL,用于列表页和聊天页") + private String avatarUrl; + + @Schema(description = "角色封面图URL,用于角色详情页", example = "https://www.iocoder.cn") + @ExcelProperty("角色封面图URL,用于角色详情页") + private String coverImageUrl; + + @Schema(description = "角色性别(male / female / other)") + @ExcelProperty("角色性别(male / female / other)") + private String gender; + + @Schema(description = "角色年龄段描述(如:20s、25-30)") + @ExcelProperty("角色年龄段描述(如:20s、25-30)") + private String ageRange; + + @Schema(description = "一句话人设描述,用于卡片或列表展示") + @ExcelProperty("一句话人设描述,用于卡片或列表展示") + private String shortDesc; + + @Schema(description = "角色详细介绍文案,用于角色详情页") + @ExcelProperty("角色详细介绍文案,用于角色详情页") + private String introText; + + @Schema(description = "角色性格标签数组(如:温柔、黏人、治愈)") + @ExcelProperty("角色性格标签数组(如:温柔、黏人、治愈)") + private Object personalityTags; + + @Schema(description = "角色说话风格(如:撒娇型、理性型、活泼型)") + @ExcelProperty("角色说话风格(如:撒娇型、理性型、活泼型)") + private String speakingStyle; + + @Schema(description = "AI系统Prompt,定义角色核心人设,仅供模型使用", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("AI系统Prompt,定义角色核心人设,仅供模型使用") + private String systemPrompt; + + @Schema(description = "角色状态:1=上线,0=下线", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("角色状态:1=上线,0=下线") + private Short status; + + @Schema(description = "角色可见性:1=公开,2=内测,3=隐藏", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("角色可见性:1=公开,2=内测,3=隐藏") + private Short visibility; + + @Schema(description = "排序权重,数值越大排序越靠前") + @ExcelProperty("排序权重,数值越大排序越靠前") + private Integer sortOrder; + + @Schema(description = "角色热度评分,用于推荐排序") + @ExcelProperty("角色热度评分,用于推荐排序") + private Integer popularityScore; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createdAt; + + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("更新时间") + private LocalDateTime updatedAt; + + @Schema(description = "开场白") + @ExcelProperty("开场白") + private String prologue; + + @Schema(description = "开场白音频") + @ExcelProperty("开场白音频") + private String prologueAudio; + + @Schema(description = "音频Id", example = "31328") + @ExcelProperty("音频Id") + private String voiceId; + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionSaveReqVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionSaveReqVO.java new file mode 100644 index 0000000..f0bec0f --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/aicompanion/vo/KeyboardAiCompanionSaveReqVO.java @@ -0,0 +1,80 @@ +package com.yolo.keyboard.controller.admin.aicompanion.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设新增/修改 Request VO") +@Data +public class KeyboardAiCompanionSaveReqVO { + + @Schema(description = "陪聊角色唯一ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7816") + private Long id; + + @Schema(description = "角色名称(展示用,如:Katie Leona)", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "角色名称(展示用,如:Katie Leona)不能为空") + private String name; + + @Schema(description = "角色头像URL,用于列表页和聊天页", example = "https://www.iocoder.cn") + private String avatarUrl; + + @Schema(description = "角色封面图URL,用于角色详情页", example = "https://www.iocoder.cn") + private String coverImageUrl; + + @Schema(description = "角色性别(male / female / other)") + private String gender; + + @Schema(description = "角色年龄段描述(如:20s、25-30)") + private String ageRange; + + @Schema(description = "一句话人设描述,用于卡片或列表展示") + private String shortDesc; + + @Schema(description = "角色详细介绍文案,用于角色详情页") + private String introText; + + @Schema(description = "角色性格标签数组(如:温柔、黏人、治愈)") + private Object personalityTags; + + @Schema(description = "角色说话风格(如:撒娇型、理性型、活泼型)") + private String speakingStyle; + + @Schema(description = "AI系统Prompt,定义角色核心人设,仅供模型使用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "AI系统Prompt,定义角色核心人设,仅供模型使用不能为空") + private String systemPrompt; + + @Schema(description = "角色状态:1=上线,0=下线", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "角色状态:1=上线,0=下线不能为空") + private Short status; + + @Schema(description = "角色可见性:1=公开,2=内测,3=隐藏", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "角色可见性:1=公开,2=内测,3=隐藏不能为空") + private Short visibility; + + @Schema(description = "排序权重,数值越大排序越靠前") + private Integer sortOrder; + + @Schema(description = "角色热度评分,用于推荐排序") + private Integer popularityScore; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "创建时间不能为空") + private LocalDateTime createdAt; + + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "更新时间不能为空") + private LocalDateTime updatedAt; + + @Schema(description = "开场白") + private String prologue; + + @Schema(description = "开场白音频") + private String prologueAudio; + + @Schema(description = "音频Id", example = "31328") + private String voiceId; + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/aicompanion/KeyboardAiCompanionDO.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/aicompanion/KeyboardAiCompanionDO.java new file mode 100644 index 0000000..59b6f41 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/aicompanion/KeyboardAiCompanionDO.java @@ -0,0 +1,108 @@ +package com.yolo.keyboard.dal.dataobject.aicompanion; + +import com.yolo.keyboard.framework.tenant.core.aop.TenantIgnore;import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.yolo.keyboard.framework.mybatis.core.dataobject.BaseDO; + +/** + * AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 DO + * + * @author ziin + */ +@TableName("keyboard_ai_companion") +@KeySequence("keyboard_ai_companion_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TenantIgnore +public class KeyboardAiCompanionDO { + + /** + * 陪聊角色唯一ID + */ + @TableId + private Long id; + /** + * 角色名称(展示用,如:Katie Leona) + */ + private String name; + /** + * 角色头像URL,用于列表页和聊天页 + */ + private String avatarUrl; + /** + * 角色封面图URL,用于角色详情页 + */ + private String coverImageUrl; + /** + * 角色性别(male / female / other) + */ + private String gender; + /** + * 角色年龄段描述(如:20s、25-30) + */ + private String ageRange; + /** + * 一句话人设描述,用于卡片或列表展示 + */ + private String shortDesc; + /** + * 角色详细介绍文案,用于角色详情页 + */ + private String introText; + /** + * 角色性格标签数组(如:温柔、黏人、治愈) + */ + private Object personalityTags; + /** + * 角色说话风格(如:撒娇型、理性型、活泼型) + */ + private String speakingStyle; + /** + * AI系统Prompt,定义角色核心人设,仅供模型使用 + */ + private String systemPrompt; + /** + * 角色状态:1=上线,0=下线 + */ + private Short status; + /** + * 角色可见性:1=公开,2=内测,3=隐藏 + */ + private Short visibility; + /** + * 排序权重,数值越大排序越靠前 + */ + private Integer sortOrder; + /** + * 角色热度评分,用于推荐排序 + */ + private Integer popularityScore; + /** + * 创建时间 + */ + private LocalDateTime createdAt; + /** + * 更新时间 + */ + private LocalDateTime updatedAt; + /** + * 开场白 + */ + private String prologue; + /** + * 开场白音频 + */ + private String prologueAudio; + /** + * 音频Id + */ + private String voiceId; + + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/aicompanion/KeyboardAiCompanionMapper.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/aicompanion/KeyboardAiCompanionMapper.java new file mode 100644 index 0000000..4774426 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/aicompanion/KeyboardAiCompanionMapper.java @@ -0,0 +1,44 @@ +package com.yolo.keyboard.dal.mysql.aicompanion; + +import java.util.*; + +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.yolo.keyboard.framework.mybatis.core.mapper.BaseMapperX; +import com.yolo.keyboard.dal.dataobject.aicompanion.KeyboardAiCompanionDO; +import org.apache.ibatis.annotations.Mapper; +import com.yolo.keyboard.controller.admin.aicompanion.vo.*; + +/** + * AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 Mapper + * + * @author ziin + */ +@Mapper +public interface KeyboardAiCompanionMapper extends BaseMapperX { + + default PageResult selectPage(KeyboardAiCompanionPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(KeyboardAiCompanionDO::getName, reqVO.getName()) + .eqIfPresent(KeyboardAiCompanionDO::getAvatarUrl, reqVO.getAvatarUrl()) + .eqIfPresent(KeyboardAiCompanionDO::getCoverImageUrl, reqVO.getCoverImageUrl()) + .eqIfPresent(KeyboardAiCompanionDO::getGender, reqVO.getGender()) + .eqIfPresent(KeyboardAiCompanionDO::getAgeRange, reqVO.getAgeRange()) + .eqIfPresent(KeyboardAiCompanionDO::getShortDesc, reqVO.getShortDesc()) + .eqIfPresent(KeyboardAiCompanionDO::getIntroText, reqVO.getIntroText()) + .eqIfPresent(KeyboardAiCompanionDO::getPersonalityTags, reqVO.getPersonalityTags()) + .eqIfPresent(KeyboardAiCompanionDO::getSpeakingStyle, reqVO.getSpeakingStyle()) + .eqIfPresent(KeyboardAiCompanionDO::getSystemPrompt, reqVO.getSystemPrompt()) + .eqIfPresent(KeyboardAiCompanionDO::getStatus, reqVO.getStatus()) + .eqIfPresent(KeyboardAiCompanionDO::getVisibility, reqVO.getVisibility()) + .eqIfPresent(KeyboardAiCompanionDO::getSortOrder, reqVO.getSortOrder()) + .eqIfPresent(KeyboardAiCompanionDO::getPopularityScore, reqVO.getPopularityScore()) + .eqIfPresent(KeyboardAiCompanionDO::getCreatedAt, reqVO.getCreatedAt()) + .eqIfPresent(KeyboardAiCompanionDO::getUpdatedAt, reqVO.getUpdatedAt()) + .eqIfPresent(KeyboardAiCompanionDO::getPrologue, reqVO.getPrologue()) + .eqIfPresent(KeyboardAiCompanionDO::getPrologueAudio, reqVO.getPrologueAudio()) + .eqIfPresent(KeyboardAiCompanionDO::getVoiceId, reqVO.getVoiceId()) + .orderByDesc(KeyboardAiCompanionDO::getId)); + } + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/service/aicompanion/KeyboardAiCompanionService.java b/keyboard-server/src/main/java/com/yolo/keyboard/service/aicompanion/KeyboardAiCompanionService.java new file mode 100644 index 0000000..cd499bc --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/service/aicompanion/KeyboardAiCompanionService.java @@ -0,0 +1,63 @@ +package com.yolo.keyboard.service.aicompanion; + +import com.yolo.keyboard.controller.admin.aicompanion.vo.KeyboardAiCompanionPageReqVO; +import com.yolo.keyboard.controller.admin.aicompanion.vo.KeyboardAiCompanionSaveReqVO; +import com.yolo.keyboard.dal.dataobject.aicompanion.KeyboardAiCompanionDO; +import com.yolo.keyboard.framework.common.pojo.PageResult; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 Service 接口 + * + * @author ziin + */ +public interface KeyboardAiCompanionService { + + /** + * 创建AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createAiCompanion(@Valid KeyboardAiCompanionSaveReqVO createReqVO); + + /** + * 更新AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 + * + * @param updateReqVO 更新信息 + */ + void updateAiCompanion(@Valid KeyboardAiCompanionSaveReqVO updateReqVO); + + /** + * 删除AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 + * + * @param id 编号 + */ + void deleteAiCompanion(Long id); + + /** + * 批量删除AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 + * + * @param ids 编号 + */ + void deleteAiCompanionListByIds(List ids); + + /** + * 获得AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 + * + * @param id 编号 + * @return AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 + */ + KeyboardAiCompanionDO getAiCompanion(Long id); + + /** + * 获得AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设分页 + * + * @param pageReqVO 分页查询 + * @return AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设分页 + */ + PageResult getAiCompanionPage(KeyboardAiCompanionPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/service/aicompanion/KeyboardAiCompanionServiceImpl.java b/keyboard-server/src/main/java/com/yolo/keyboard/service/aicompanion/KeyboardAiCompanionServiceImpl.java new file mode 100644 index 0000000..0e2d422 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/service/aicompanion/KeyboardAiCompanionServiceImpl.java @@ -0,0 +1,80 @@ +package com.yolo.keyboard.service.aicompanion; + +import com.yolo.keyboard.controller.admin.aicompanion.vo.KeyboardAiCompanionPageReqVO; +import com.yolo.keyboard.controller.admin.aicompanion.vo.KeyboardAiCompanionSaveReqVO; +import com.yolo.keyboard.dal.dataobject.aicompanion.KeyboardAiCompanionDO; +import com.yolo.keyboard.dal.mysql.aicompanion.KeyboardAiCompanionMapper; +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.common.util.object.BeanUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static com.yolo.keyboard.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.yolo.keyboard.module.infra.enums.ErrorCodeConstants.AI_COMPANION_NOT_EXISTS; + +/** + * AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设 Service 实现类 + * + * @author ziin + */ +@Service +@Validated +public class KeyboardAiCompanionServiceImpl implements KeyboardAiCompanionService { + + @Resource + private KeyboardAiCompanionMapper aiCompanionMapper; + + @Override + public Long createAiCompanion(KeyboardAiCompanionSaveReqVO createReqVO) { + // 插入 + KeyboardAiCompanionDO aiCompanion = BeanUtils.toBean(createReqVO, KeyboardAiCompanionDO.class); + aiCompanionMapper.insert(aiCompanion); + + // 返回 + return aiCompanion.getId(); + } + + @Override + public void updateAiCompanion(KeyboardAiCompanionSaveReqVO updateReqVO) { + // 校验存在 + validateAiCompanionExists(updateReqVO.getId()); + // 更新 + KeyboardAiCompanionDO updateObj = BeanUtils.toBean(updateReqVO, KeyboardAiCompanionDO.class); + aiCompanionMapper.updateById(updateObj); + } + + @Override + public void deleteAiCompanion(Long id) { + // 校验存在 + validateAiCompanionExists(id); + // 删除 + aiCompanionMapper.deleteById(id); + } + + @Override + public void deleteAiCompanionListByIds(List ids) { + // 删除 + aiCompanionMapper.deleteByIds(ids); + } + + + private void validateAiCompanionExists(Long id) { + if (aiCompanionMapper.selectById(id) == null) { + throw exception(AI_COMPANION_NOT_EXISTS); + } + } + + @Override + public KeyboardAiCompanionDO getAiCompanion(Long id) { + return aiCompanionMapper.selectById(id); + } + + @Override + public PageResult getAiCompanionPage(KeyboardAiCompanionPageReqVO pageReqVO) { + return aiCompanionMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/keyboard-server/src/main/resources/mapper/aicompanion/KeyboardAiCompanionMapper.xml b/keyboard-server/src/main/resources/mapper/aicompanion/KeyboardAiCompanionMapper.xml new file mode 100644 index 0000000..14e47fe --- /dev/null +++ b/keyboard-server/src/main/resources/mapper/aicompanion/KeyboardAiCompanionMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java b/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java index 0fd8653..4981531 100644 --- a/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java +++ b/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java @@ -94,6 +94,6 @@ public interface ErrorCodeConstants { ErrorCode USER_INVITE_CODES_NOT_EXISTS = new ErrorCode(1_001_202_020, "用户生成的邀请码表,用于邀请新用户注册/安装并建立邀请关系不存在"); ErrorCode USER_INVITES_NOT_EXISTS = new ErrorCode(1_001_202_021, "用户邀请关系绑定台账表,记录新用户最终归属的邀请人不存在"); ErrorCode TENANT_COMMISSION_NOT_EXISTS = new ErrorCode(1_001_202_022, "租户内购分成记录不存在"); - + ErrorCode AI_COMPANION_NOT_EXISTS = new ErrorCode(1_001_202_023, "AI陪聊角色表,用于定义恋爱/陪伴型虚拟角色的基础信息与人设不存在"); }