Commit 7c9714d014e7e41916920e594ec79a5a0917165c
1 parent
5bdc2db0
【功能新增】AI 大模型:支持思维导图的管理
Showing
7 changed files
with
150 additions
and
5 deletions
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ErrorCodeConstants.java
| @@ -45,9 +45,11 @@ public interface ErrorCodeConstants { | @@ -45,9 +45,11 @@ public interface ErrorCodeConstants { | ||
| 45 | // ========== API 音乐 1-040-006-000 ========== | 45 | // ========== API 音乐 1-040-006-000 ========== |
| 46 | ErrorCode MUSIC_NOT_EXISTS = new ErrorCode(1_022_006_000, "音乐不存在!"); | 46 | ErrorCode MUSIC_NOT_EXISTS = new ErrorCode(1_022_006_000, "音乐不存在!"); |
| 47 | 47 | ||
| 48 | - | ||
| 49 | // ========== API 写作 1-022-007-000 ========== | 48 | // ========== API 写作 1-022-007-000 ========== |
| 50 | ErrorCode WRITE_NOT_EXISTS = new ErrorCode(1_022_007_000, "作文不存在!"); | 49 | ErrorCode WRITE_NOT_EXISTS = new ErrorCode(1_022_007_000, "作文不存在!"); |
| 51 | ErrorCode WRITE_STREAM_ERROR = new ErrorCode(1_022_07_001, "写作生成异常!"); | 50 | ErrorCode WRITE_STREAM_ERROR = new ErrorCode(1_022_07_001, "写作生成异常!"); |
| 52 | 51 | ||
| 52 | + // ========== API 思维导图 1-040-008-000 ========== | ||
| 53 | + ErrorCode MIND_MAP_NOT_EXISTS = new ErrorCode(1_040_008_000, "思维导图不存在!"); | ||
| 54 | + | ||
| 53 | } | 55 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/AiMindMapController.java
| 1 | package cn.iocoder.yudao.module.ai.controller.admin.mindmap; | 1 | package cn.iocoder.yudao.module.ai.controller.admin.mindmap; |
| 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.mindmap.vo.AiMindMapGenerateReqVO; | 6 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; |
| 7 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapRespVO; | ||
| 9 | +import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | ||
| 5 | import cn.iocoder.yudao.module.ai.service.mindmap.AiMindMapService; | 10 | import cn.iocoder.yudao.module.ai.service.mindmap.AiMindMapService; |
| 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 AiMindMapController { | @@ -32,4 +37,23 @@ public class AiMindMapController { | ||
| 32 | return mindMapService.generateMindMap(generateReqVO, getLoginUserId()); | 37 | return mindMapService.generateMindMap(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:mind-map:delete')") | ||
| 46 | + public CommonResult<Boolean> deleteMindMap(@RequestParam("id") Long id) { | ||
| 47 | + mindMapService.deleteMindMap(id); | ||
| 48 | + return success(true); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + @GetMapping("/page") | ||
| 52 | + @Operation(summary = "获得思维导图分页") | ||
| 53 | + @PreAuthorize("@ss.hasPermission('ai:mind-map:query')") | ||
| 54 | + public CommonResult<PageResult<AiMindMapRespVO>> getMindMapPage(@Valid AiMindMapPageReqVO pageReqVO) { | ||
| 55 | + PageResult<AiMindMapDO> pageResult = mindMapService.getMindMapPage(pageReqVO); | ||
| 56 | + return success(BeanUtils.toBean(pageResult, AiMindMapRespVO.class)); | ||
| 57 | + } | ||
| 58 | + | ||
| 35 | } | 59 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.mindmap.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 AiMindMapPageReqVO extends PageParam { | ||
| 19 | + | ||
| 20 | + @Schema(description = "用户编号", example = "4325") | ||
| 21 | + private Long userId; | ||
| 22 | + | ||
| 23 | + @Schema(description = "生成内容提示", example = "Java 学习路线") | ||
| 24 | + private String prompt; | ||
| 25 | + | ||
| 26 | + @Schema(description = "创建时间") | ||
| 27 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 28 | + private LocalDateTime[] createTime; | ||
| 29 | + | ||
| 30 | +} | ||
| 0 | \ No newline at end of file | 31 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.ai.controller.admin.mindmap.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 AiMindMapRespVO { | ||
| 11 | + | ||
| 12 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3373") | ||
| 13 | + private Long id; | ||
| 14 | + | ||
| 15 | + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4325") | ||
| 16 | + private Long userId; | ||
| 17 | + | ||
| 18 | + @Schema(description = "生成内容提示", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 学习路线") | ||
| 19 | + private String prompt; | ||
| 20 | + | ||
| 21 | + @Schema(description = "生成的思维导图内容") | ||
| 22 | + private String generatedContent; | ||
| 23 | + | ||
| 24 | + @Schema(description = "平台", requiredMode = Schema.RequiredMode.REQUIRED, example = "OpenAI") | ||
| 25 | + private String platform; | ||
| 26 | + | ||
| 27 | + @Schema(description = "模型", requiredMode = Schema.RequiredMode.REQUIRED, example = "gpt-3.5-turbo-0125") | ||
| 28 | + private String model; | ||
| 29 | + | ||
| 30 | + @Schema(description = "错误信息") | ||
| 31 | + private String errorMessage; | ||
| 32 | + | ||
| 33 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 34 | + private LocalDateTime createTime; | ||
| 35 | + | ||
| 36 | +} | ||
| 0 | \ No newline at end of file | 37 | \ No newline at end of file |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/mindmap/AiMindMapMapper.java
| 1 | package cn.iocoder.yudao.module.ai.dal.mysql.mindmap; | 1 | package cn.iocoder.yudao.module.ai.dal.mysql.mindmap; |
| 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.mindmap.vo.AiMindMapPageReqVO; | ||
| 4 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | 7 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; |
| 5 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 9 | ||
| @@ -11,4 +14,13 @@ import org.apache.ibatis.annotations.Mapper; | @@ -11,4 +14,13 @@ import org.apache.ibatis.annotations.Mapper; | ||
| 11 | */ | 14 | */ |
| 12 | @Mapper | 15 | @Mapper |
| 13 | public interface AiMindMapMapper extends BaseMapperX<AiMindMapDO> { | 16 | public interface AiMindMapMapper extends BaseMapperX<AiMindMapDO> { |
| 17 | + | ||
| 18 | + default PageResult<AiMindMapDO> selectPage(AiMindMapPageReqVO reqVO) { | ||
| 19 | + return selectPage(reqVO, new LambdaQueryWrapperX<AiMindMapDO>() | ||
| 20 | + .eqIfPresent(AiMindMapDO::getUserId, reqVO.getUserId()) | ||
| 21 | + .eqIfPresent(AiMindMapDO::getPrompt, reqVO.getPrompt()) | ||
| 22 | + .betweenIfPresent(AiMindMapDO::getCreateTime, reqVO.getCreateTime()) | ||
| 23 | + .orderByDesc(AiMindMapDO::getId)); | ||
| 24 | + } | ||
| 25 | + | ||
| 14 | } | 26 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapService.java
| 1 | package cn.iocoder.yudao.module.ai.service.mindmap; | 1 | package cn.iocoder.yudao.module.ai.service.mindmap; |
| 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.mindmap.vo.AiMindMapGenerateReqVO; | 5 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; |
| 6 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | ||
| 5 | import reactor.core.publisher.Flux; | 8 | import reactor.core.publisher.Flux; |
| 6 | 9 | ||
| 7 | /** | 10 | /** |
| @@ -20,4 +23,19 @@ public interface AiMindMapService { | @@ -20,4 +23,19 @@ public interface AiMindMapService { | ||
| 20 | */ | 23 | */ |
| 21 | Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId); | 24 | Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId); |
| 22 | 25 | ||
| 26 | + /** | ||
| 27 | + * 删除思维导图 | ||
| 28 | + * | ||
| 29 | + * @param id 编号 | ||
| 30 | + */ | ||
| 31 | + void deleteMindMap(Long id); | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * 获得思维导图分页 | ||
| 35 | + * | ||
| 36 | + * @param pageReqVO 分页查询 | ||
| 37 | + * @return 思维导图分页 | ||
| 38 | + */ | ||
| 39 | + PageResult<AiMindMapDO> getMindMapPage(AiMindMapPageReqVO pageReqVO); | ||
| 40 | + | ||
| 23 | } | 41 | } |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapServiceImpl.java
| @@ -6,9 +6,11 @@ import cn.hutool.core.util.StrUtil; | @@ -6,9 +6,11 @@ import cn.hutool.core.util.StrUtil; | ||
| 6 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; | 6 | import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; |
| 7 | import cn.iocoder.yudao.framework.ai.core.util.AiUtils; | 7 | import cn.iocoder.yudao.framework.ai.core.util.AiUtils; |
| 8 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 8 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 9 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 9 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 10 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 10 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | 11 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; |
| 11 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; | 12 | import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO; |
| 13 | +import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO; | ||
| 12 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; | 14 | import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO; |
| 13 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | 15 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; |
| 14 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | 16 | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; |
| @@ -33,8 +35,10 @@ import reactor.core.publisher.Flux; | @@ -33,8 +35,10 @@ import reactor.core.publisher.Flux; | ||
| 33 | import java.util.ArrayList; | 35 | import java.util.ArrayList; |
| 34 | import java.util.List; | 36 | import java.util.List; |
| 35 | 37 | ||
| 38 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 36 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; | 39 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; |
| 37 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 40 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 41 | +import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.MIND_MAP_NOT_EXISTS; | ||
| 38 | 42 | ||
| 39 | /** | 43 | /** |
| 40 | * AI 思维导图 Service 实现类 | 44 | * AI 思维导图 Service 实现类 |
| @@ -131,4 +135,23 @@ public class AiMindMapServiceImpl implements AiMindMapService { | @@ -131,4 +135,23 @@ public class AiMindMapServiceImpl implements AiMindMapService { | ||
| 131 | return model; | 135 | return model; |
| 132 | } | 136 | } |
| 133 | 137 | ||
| 138 | + @Override | ||
| 139 | + public void deleteMindMap(Long id) { | ||
| 140 | + // 校验存在 | ||
| 141 | + validateMindMapExists(id); | ||
| 142 | + // 删除 | ||
| 143 | + mindMapMapper.deleteById(id); | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + private void validateMindMapExists(Long id) { | ||
| 147 | + if (mindMapMapper.selectById(id) == null) { | ||
| 148 | + throw exception(MIND_MAP_NOT_EXISTS); | ||
| 149 | + } | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + @Override | ||
| 153 | + public PageResult<AiMindMapDO> getMindMapPage(AiMindMapPageReqVO pageReqVO) { | ||
| 154 | + return mindMapMapper.selectPage(pageReqVO); | ||
| 155 | + } | ||
| 156 | + | ||
| 134 | } | 157 | } |