【功能新增】AI:腾讯图像创作

This commit is contained in:
zzt 2025-03-20 08:04:32 +08:00
parent 7b3401e216
commit ecf4df8620
13 changed files with 353 additions and 0 deletions

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.ai.controller.admin.creation;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.AiartReplaceBackgroundReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.AiartReplaceBackgroundResVO;
import cn.iocoder.yudao.module.ai.service.creation.AiartCreationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Tag(name = "管理后台 - 艺术创作")
@RestController
@RequestMapping("/ai/artcreation")
@Validated
public class AiartCreationController {
@Resource
private AiartCreationService aiartCreationService;
@Operation(summary = "商品图替换背景")
@PostMapping("/replacebackground")
public CommonResult<AiartReplaceBackgroundResVO> replaceBackground(@Valid @RequestBody AiartReplaceBackgroundReqVO replaceBackgroundReqVO) {
return success(aiartCreationService.replaceBackground(getLoginUserId(), replaceBackgroundReqVO));
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.ai.controller.admin.creation;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.BackgroundTemplateReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.BackgroundTemplateResVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.creation.AiartStyleBackgroundTemplateDO;
import cn.iocoder.yudao.module.ai.service.creation.AiartStyleService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 艺术创作模版")
@RestController
@RequestMapping("/ai/artstyle")
@Validated
public class AiartStyleController {
@Resource
private AiartStyleService aiartStyleService;
@PostMapping("/backgroundtemplate-list")
@Operation(summary = "获取商品背景模版列表")
@PreAuthorize("@ss.hasPermission('ai:artstyle-background:query')")
public CommonResult<List<BackgroundTemplateResVO>> queryBackgroundStyle(@Valid @RequestBody BackgroundTemplateReqVO backgroundTemplateReqVO) {
List<AiartStyleBackgroundTemplateDO> res = aiartStyleService.queryBackgroundStyle(backgroundTemplateReqVO);
return success(BeanUtils.toBean(res,BackgroundTemplateResVO.class));
}
}

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Schema(description = "管理后台 - 商品替换背景请求 VO")
@Data
public class AiartReplaceBackgroundReqVO {
@Schema(description = "提示词", requiredMode = Schema.RequiredMode.REQUIRED, example = "画一个长城")
@NotEmpty(message = "提示词不能为空")
@Size(max = 1200, message = "提示词最大 1200")
private String prompt;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 商品替换背景结果 VO")
@Data
public class AiartReplaceBackgroundResVO {
@Schema(description = "结果url", requiredMode = Schema.RequiredMode.REQUIRED, example = "根据参数不同不一样")
private String resultImage;
@Schema(description = "唯一请求 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "由服务端生成")
private String requestId;
@Schema(description = "MaskUrl", requiredMode = Schema.RequiredMode.REQUIRED, example = "如果 MaskUrl 未传,则返回使用内置商品分割算法得到的 Mask 结果")
private String maskImage;
}

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - AI API 密钥新增/修改 Request VO")
@Data
public class BackgroundTemplateReqVO {
@Schema(description = "一级级次名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "通用")
private String fistLevelName;
@Schema(description = "二级级次名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "色彩背景")
private String secondLevelName;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 商品替换背景模版 VO")
@Data
public class BackgroundTemplateResVO {
@Schema(description = "一级分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "汽车、通用")
private String levelFirst;
@Schema(description = "二级分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "色彩背景")
private String levelSecond;
@Schema(description = "背景模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "彩虹渐变")
private String name;
@Schema(description = "背景模版提示词", requiredMode = Schema.RequiredMode.REQUIRED, example = "背景为彩虹渐变墙面,亮暖色,清新简约风格,喷涂效果")
private String prompt;
@Schema(description = "背景模版商品示例", requiredMode = Schema.RequiredMode.REQUIRED, example = "小熊玩偶")
private String demProduct;
@Schema(description = "背景模版商品示例效果", requiredMode = Schema.RequiredMode.REQUIRED, example = "url")
private String demUrl;
}

View File

@ -0,0 +1,65 @@
package cn.iocoder.yudao.module.ai.dal.dataobject.creation;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* AI art商品背景风格 DO
*
* @author 芋道源码
*/
@TableName("ai_backgroundtemplate")
@KeySequence("ai_chat_conversation_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiartStyleBackgroundTemplateDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 名称
*/
private String levelFirst;
/**
* 名称
*/
private String levelSecond;
/**
* 模版名称
*/
private String name;
/**
* 模版提示词
*/
private String prompt;
/**
* 示例商品
*/
private String demoProduct;
/**
* 示例效果
*/
private String demoUrl;
/**
* 状态
*
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.ai.dal.mysql.creation;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.BackgroundTemplateReqVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.creation.AiartStyleBackgroundTemplateDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* AI style分隔 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiartStyleBackgroundTemplateMapper extends BaseMapperX<AiartStyleBackgroundTemplateDO> {
/**
* 获取有效的商品后端模版
* @param reqVO 请求对象
* @return 结果
*/
default List<AiartStyleBackgroundTemplateDO> selectList(BackgroundTemplateReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<AiartStyleBackgroundTemplateDO>()
.eqIfPresent(AiartStyleBackgroundTemplateDO::getLevelFirst,reqVO.getFistLevelName())
.eqIfPresent(AiartStyleBackgroundTemplateDO::getLevelSecond,reqVO.getSecondLevelName())
.eqIfPresent(AiartStyleBackgroundTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
.orderByDesc(AiartStyleBackgroundTemplateDO::getId));
}
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.ai.service.creation;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.AiartReplaceBackgroundReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.AiartReplaceBackgroundResVO;
/**
* AI创作Service 接口
*
* @author zzt
*/
public interface AiartCreationService {
/**
* 替换商品背景图片
* @param loginUserId 当前登录用户
* @param replaceBackgroundReqVO 请求对象
* @return 结果
*/
AiartReplaceBackgroundResVO replaceBackground(Long loginUserId, AiartReplaceBackgroundReqVO replaceBackgroundReqVO);
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.ai.service.creation;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.AiartReplaceBackgroundReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.AiartReplaceBackgroundResVO;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* AI创作Service 实现类
*
* @author zzt
*/
@Service
@Validated
public class AiartCreationServiceImpl implements AiartCreationService {
@Override
public AiartReplaceBackgroundResVO replaceBackground(Long loginUserId, AiartReplaceBackgroundReqVO replaceBackgroundReqVO) {
return null;
}
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.ai.service.creation;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.BackgroundTemplateReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.BackgroundTemplateResVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.creation.AiartStyleBackgroundTemplateDO;
import java.util.List;
/**
* AI风格Service 接口
*
* @author zzt
*/
public interface AiartStyleService {
/**
* 查询商品背景模版列表
* @param backgroundTemplateReqVO 商品背景模版请求对象
* @return 结果
*/
List<AiartStyleBackgroundTemplateDO> queryBackgroundStyle(BackgroundTemplateReqVO backgroundTemplateReqVO);
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.ai.service.creation;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.BackgroundTemplateReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.creation.vo.style.BackgroundTemplateResVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.creation.AiartStyleBackgroundTemplateDO;
import cn.iocoder.yudao.module.ai.dal.mysql.creation.AiartStyleBackgroundTemplateMapper;
import cn.iocoder.yudao.module.ai.dal.mysql.model.AiApiKeyMapper;
import jakarta.annotation.Resource;
import java.util.List;
/**
* AI风格Service 接口
*
* @author zzt
*/
public class AiartStyleServiceImpl implements AiartStyleService{
@Resource
private AiartStyleBackgroundTemplateMapper backgroundTemplateMapper;
@Override
public List<AiartStyleBackgroundTemplateDO> queryBackgroundStyle(BackgroundTemplateReqVO backgroundTemplateReqVO) {
return backgroundTemplateMapper.selectList(backgroundTemplateReqVO);
}
}

View File

@ -117,6 +117,13 @@
</exclusions>
</dependency>
<!-- 腾讯大模型图像创作引擎-->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-aiart</artifactId>
<version>3.1.1215</version>
</dependency>
<!-- Test 测试相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>