Commit e39a6c3467489af442f8b4e54d20b3c9d5f11c46

Authored by YunaiV
1 parent d6b3b5e9

【代码新增】AI:写作管理界面

yudao-module-ai/yudao-module-ai-biz/pom.xml
@@ -60,5 +60,9 @@ @@ -60,5 +60,9 @@
60 <groupId>cn.iocoder.boot</groupId> 60 <groupId>cn.iocoder.boot</groupId>
61 <artifactId>yudao-spring-boot-starter-test</artifactId> 61 <artifactId>yudao-spring-boot-starter-test</artifactId>
62 </dependency> 62 </dependency>
  63 + <dependency>
  64 + <groupId>cn.iocoder.boot</groupId>
  65 + <artifactId>yudao-spring-boot-starter-excel</artifactId>
  66 + </dependency>
63 </dependencies> 67 </dependencies>
64 </project> 68 </project>
65 \ No newline at end of file 69 \ No newline at end of file
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/AiWriteController.java
1 package cn.iocoder.yudao.module.ai.controller.admin.write; 1 package cn.iocoder.yudao.module.ai.controller.admin.write;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
4 import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO; 6 import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO;
  7 +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWritePageReqVO;
  8 +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteRespVO;
  9 +import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO;
5 import cn.iocoder.yudao.module.ai.service.write.AiWriteService; 10 import cn.iocoder.yudao.module.ai.service.write.AiWriteService;
6 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
  12 +import io.swagger.v3.oas.annotations.Parameter;
7 import io.swagger.v3.oas.annotations.tags.Tag; 13 import io.swagger.v3.oas.annotations.tags.Tag;
8 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
9 import jakarta.annotation.security.PermitAll; 15 import jakarta.annotation.security.PermitAll;
10 import jakarta.validation.Valid; 16 import jakarta.validation.Valid;
11 import org.springframework.http.MediaType; 17 import org.springframework.http.MediaType;
12 -import org.springframework.web.bind.annotation.PostMapping;  
13 -import org.springframework.web.bind.annotation.RequestBody;  
14 -import org.springframework.web.bind.annotation.RequestMapping;  
15 -import org.springframework.web.bind.annotation.RestController; 18 +import org.springframework.security.access.prepost.PreAuthorize;
  19 +import org.springframework.web.bind.annotation.*;
16 import reactor.core.publisher.Flux; 20 import reactor.core.publisher.Flux;
17 21
  22 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
18 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 23 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
19 24
20 @Tag(name = "管理后台 - AI 写作") 25 @Tag(name = "管理后台 - AI 写作")
@@ -32,4 +37,23 @@ public class AiWriteController { @@ -32,4 +37,23 @@ public class AiWriteController {
32 return writeService.generateWriteContent(generateReqVO, getLoginUserId()); 37 return writeService.generateWriteContent(generateReqVO, getLoginUserId());
33 } 38 }
34 39
  40 + // ================ 写作管理 ================
  41 +
  42 + @DeleteMapping("/delete")
  43 + @Operation(summary = "删除写作")
  44 + @Parameter(name = "id", description = "编号", required = true)
  45 + @PreAuthorize("@ss.hasPermission('ai:write:delete')")
  46 + public CommonResult<Boolean> deleteWrite(@RequestParam("id") Long id) {
  47 + writeService.deleteWrite(id);
  48 + return success(true);
  49 + }
  50 +
  51 + @GetMapping("/page")
  52 + @Operation(summary = "获得写作分页")
  53 + @PreAuthorize("@ss.hasPermission('ai:write:query')")
  54 + public CommonResult<PageResult<AiWriteRespVO>> getWritePage(@Valid AiWritePageReqVO pageReqVO) {
  55 + PageResult<AiWriteDO> pageResult = writeService.getWritePage(pageReqVO);
  56 + return success(BeanUtils.toBean(pageResult, AiWriteRespVO.class));
  57 + }
  58 +
35 } 59 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWritePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.write.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - AI 写作分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class AiWritePageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "用户编号", example = "28404")
  21 + private Long userId;
  22 +
  23 + @Schema(description = "写作类型", example = "1")
  24 + private Integer type;
  25 +
  26 + @Schema(description = "平台", example = "TongYi")
  27 + private String platform;
  28 +
  29 + @Schema(description = "创建时间")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private LocalDateTime[] createTime;
  32 +
  33 +}
0 \ No newline at end of file 34 \ No newline at end of file
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWriteRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.write.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - AI 写作 Response VO")
  9 +@Data
  10 +public class AiWriteRespVO {
  11 +
  12 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5311")
  13 + private Long id;
  14 +
  15 + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28404")
  16 + private Long userId;
  17 +
  18 + @Schema(description = "写作类型", example = "1")
  19 + private Integer type;
  20 +
  21 + @Schema(description = "平台", requiredMode = Schema.RequiredMode.REQUIRED, example = "TongYi")
  22 + private String platform;
  23 +
  24 + @Schema(description = "模型", requiredMode = Schema.RequiredMode.REQUIRED, example = "qwen")
  25 + private String model;
  26 +
  27 + @Schema(description = "生成内容提示", requiredMode = Schema.RequiredMode.REQUIRED, example = "撰写:田忌赛马")
  28 + private String prompt;
  29 +
  30 + @Schema(description = "生成的内容", example = "你非常不错")
  31 + private String generatedContent;
  32 +
  33 + @Schema(description = "原文", example = "真的么?")
  34 + private String originalContent;
  35 +
  36 + @Schema(description = "长度提示词", example = "1")
  37 + private Integer length;
  38 +
  39 + @Schema(description = "格式提示词", example = "2")
  40 + private Integer format;
  41 +
  42 + @Schema(description = "语气提示词", example = "3")
  43 + private Integer tone;
  44 +
  45 + @Schema(description = "语言提示词", example = "4")
  46 + private Integer language;
  47 +
  48 + @Schema(description = "错误信息")
  49 + private String errorMessage;
  50 +
  51 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  52 + private LocalDateTime createTime;
  53 +
  54 +}
0 \ No newline at end of file 55 \ No newline at end of file
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/write/AiWriteMapper.java
1 package cn.iocoder.yudao.module.ai.dal.mysql.write; 1 package cn.iocoder.yudao.module.ai.dal.mysql.write;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWritePageReqVO;
4 import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO; 7 import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO;
5 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
6 9
7 /** 10 /**
8 - * AI 音乐 Mapper 11 + * AI 写作 Mapper
9 * 12 *
10 * @author xiaoxin 13 * @author xiaoxin
11 */ 14 */
12 @Mapper 15 @Mapper
13 public interface AiWriteMapper extends BaseMapperX<AiWriteDO> { 16 public interface AiWriteMapper extends BaseMapperX<AiWriteDO> {
  17 +
  18 + default PageResult<AiWriteDO> selectPage(AiWritePageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<AiWriteDO>()
  20 + .eqIfPresent(AiWriteDO::getUserId, reqVO.getUserId())
  21 + .eqIfPresent(AiWriteDO::getType, reqVO.getType())
  22 + .eqIfPresent(AiWriteDO::getPlatform, reqVO.getPlatform())
  23 + .betweenIfPresent(AiWriteDO::getCreateTime, reqVO.getCreateTime())
  24 + .orderByDesc(AiWriteDO::getId));
  25 + }
  26 +
14 } 27 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteService.java
1 package cn.iocoder.yudao.module.ai.service.write; 1 package cn.iocoder.yudao.module.ai.service.write;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO; 5 import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO;
  6 +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWritePageReqVO;
  7 +import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO;
5 import reactor.core.publisher.Flux; 8 import reactor.core.publisher.Flux;
6 9
7 /** 10 /**
@@ -20,4 +23,19 @@ public interface AiWriteService { @@ -20,4 +23,19 @@ public interface AiWriteService {
20 */ 23 */
21 Flux<CommonResult<String>> generateWriteContent(AiWriteGenerateReqVO generateReqVO, Long userId); 24 Flux<CommonResult<String>> generateWriteContent(AiWriteGenerateReqVO generateReqVO, Long userId);
22 25
  26 + /**
  27 + * 删除写作
  28 + *
  29 + * @param id 编号
  30 + */
  31 + void deleteWrite(Long id);
  32 +
  33 + /**
  34 + * 获得写作分页
  35 + *
  36 + * @param pageReqVO 分页查询
  37 + * @return AI 写作分页
  38 + */
  39 + PageResult<AiWriteDO> getWritePage(AiWritePageReqVO pageReqVO);
  40 +
23 } 41 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java
@@ -5,9 +5,11 @@ import cn.hutool.core.util.StrUtil; @@ -5,9 +5,11 @@ import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; 5 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
6 import cn.iocoder.yudao.framework.ai.core.util.AiUtils; 6 import cn.iocoder.yudao.framework.ai.core.util.AiUtils;
7 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 7 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; 10 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
10 import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO; 11 import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO;
  12 +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWritePageReqVO;
11 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; 13 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
12 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; 14 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
13 import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO; 15 import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO;
@@ -36,8 +38,10 @@ import java.util.ArrayList; @@ -36,8 +38,10 @@ import java.util.ArrayList;
36 import java.util.List; 38 import java.util.List;
37 import java.util.Objects; 39 import java.util.Objects;
38 40
  41 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
39 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; 42 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
40 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 43 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  44 +import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.WRITE_NOT_EXISTS;
41 45
42 /** 46 /**
43 * AI 写作 Service 实现类 47 * AI 写作 Service 实现类
@@ -132,4 +136,23 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -132,4 +136,23 @@ public class AiWriteServiceImpl implements AiWriteService {
132 } 136 }
133 } 137 }
134 138
  139 + @Override
  140 + public void deleteWrite(Long id) {
  141 + // 校验存在
  142 + validateWriteExists(id);
  143 + // 删除
  144 + writeMapper.deleteById(id);
  145 + }
  146 +
  147 + private void validateWriteExists(Long id) {
  148 + if (writeMapper.selectById(id) == null) {
  149 + throw exception(WRITE_NOT_EXISTS);
  150 + }
  151 + }
  152 +
  153 + @Override
  154 + public PageResult<AiWriteDO> getWritePage(AiWritePageReqVO pageReqVO) {
  155 + return writeMapper.selectPage(pageReqVO);
  156 + }
  157 +
135 } 158 }