package cn.iocoder.yudao.module.ai.controller.admin.image; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO; import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO; import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; import cn.iocoder.yudao.module.ai.service.image.AiImageService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - AI 绘画") @RestController @RequestMapping("/ai/image") @Slf4j public class AiImageController { @Resource private AiImageService imageService; @GetMapping("/my-page") @Operation(summary = "获取【我的】绘图分页") public CommonResult> getImagePageMy(@Validated AiImagePageReqVO pageReqVO) { PageResult pageResult = imageService.getImagePageMy(getLoginUserId(), pageReqVO); return success(BeanUtils.toBean(pageResult, AiImageRespVO.class)); } @GetMapping("/public-page") @Operation(summary = "获取公开的绘图分页") public CommonResult> getImagePagePublic(AiImagePublicPageReqVO pageReqVO) { PageResult pageResult = imageService.getImagePagePublic(pageReqVO); return success(BeanUtils.toBean(pageResult, AiImageRespVO.class)); } @GetMapping("/get-my") @Operation(summary = "获取【我的】绘图记录") @Parameter(name = "id", required = true, description = "绘画编号", example = "1024") public CommonResult getImageMy(@RequestParam("id") Long id) { AiImageDO image = imageService.getImage(id); if (image == null || ObjUtil.notEqual(getLoginUserId(), image.getUserId())) { return success(null); } return success(BeanUtils.toBean(image, AiImageRespVO.class)); } @GetMapping("/my-list-by-ids") @Operation(summary = "获取【我的】绘图记录列表") @Parameter(name = "ids", required = true, description = "绘画编号数组", example = "1024,2048") public CommonResult> getImageListMyByIds(@RequestParam("ids") List ids) { List imageList = imageService.getImageList(ids); imageList.removeIf(item -> !ObjUtil.equal(getLoginUserId(), item.getUserId())); return success(BeanUtils.toBean(imageList, AiImageRespVO.class)); } @Operation(summary = "生成图片") @PostMapping("/draw") public CommonResult drawImage(@Valid @RequestBody AiImageDrawReqVO drawReqVO) { return success(imageService.drawImage(getLoginUserId(), drawReqVO)); } @Operation(summary = "删除【我的】绘画记录") @DeleteMapping("/delete-my") @Parameter(name = "id", required = true, description = "绘画编号", example = "1024") public CommonResult deleteImageMy(@RequestParam("id") Long id) { imageService.deleteImageMy(id, getLoginUserId()); return success(true); } // ================ midjourney 专属 ================ @Operation(summary = "【Midjourney】生成图片") @PostMapping("/midjourney/imagine") public CommonResult midjourneyImagine(@Valid @RequestBody AiMidjourneyImagineReqVO reqVO) { Long imageId = imageService.midjourneyImagine(getLoginUserId(), reqVO); return success(imageId); } @Operation(summary = "【Midjourney】通知图片进展", description = "由 Midjourney Proxy 回调") @PostMapping("/midjourney/notify") // 必须是 POST 方法,否则会报错 @PermitAll @TenantIgnore public CommonResult midjourneyNotify(@Valid @RequestBody MidjourneyApi.Notify notify) { imageService.midjourneyNotify(notify); return success(true); } @Operation(summary = "【Midjourney】Action 操作(二次生成图片)", description = "例如说:放大、缩小、U1、U2 等") @PostMapping("/midjourney/action") public CommonResult midjourneyAction(@Valid @RequestBody AiMidjourneyActionReqVO reqVO) { Long imageId = imageService.midjourneyAction(getLoginUserId(), reqVO); return success(imageId); } // ================ 绘图管理 ================ @GetMapping("/page") @Operation(summary = "获得绘画分页") @PreAuthorize("@ss.hasPermission('ai:image:query')") public CommonResult> getImagePage(@Valid AiImagePageReqVO pageReqVO) { PageResult pageResult = imageService.getImagePage(pageReqVO); return success(BeanUtils.toBean(pageResult, AiImageRespVO.class)); } @PutMapping("/update") @Operation(summary = "更新绘画") @PreAuthorize("@ss.hasPermission('ai:image:update')") public CommonResult updateImage(@Valid @RequestBody AiImageUpdateReqVO updateReqVO) { imageService.updateImage(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除绘画") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('ai:image:delete')") public CommonResult deleteImage(@RequestParam("id") Long id) { imageService.deleteImage(id); return success(true); } }