diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java index d3fc1ed5..c96af691 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -279,7 +279,24 @@ public class MinioUtil { } } - + /** + * 将桶名、文件名从url中分离出来 + * @param url 带桶名、文件名的url + * @param expiry 图片过期时间 + * @return 可以直接访问的minio图片地址 + */ + public String splitThenGetPreviewUrl(String url,int expiry){ + String[] parts = url.split("/"); + String bucketName = parts[0]; + StringBuilder fileName = new StringBuilder(); + for (int i = 1; i < parts.length; i++){ + fileName.append(parts[i]); + if (i != parts.length -1){ + fileName.append("/"); + } + } + return getPresignedUrl(bucketName, String.valueOf(fileName),expiry); + } } diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java index c4ed674c..275c153d 100644 --- a/src/main/java/com/ai/da/controller/GenerateController.java +++ b/src/main/java/com/ai/da/controller/GenerateController.java @@ -9,6 +9,7 @@ import com.ai.da.model.vo.GenerateLikeVO; import com.ai.da.service.GenerateService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -46,4 +47,11 @@ public class GenerateController { return Response.success(generateService.generateLike(generateLikeDTO)); } + @ApiOperation(value = "取消喜欢") + @GetMapping("/dislike") + public Response dislike(@ApiParam("generateDetailId") @RequestParam Long generateDetailId, + @ApiParam("timeZone") @RequestParam String timeZone) { + return Response.success(generateService.generateDislike(generateDetailId,timeZone)); + } + } diff --git a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java b/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java index 224ef2bf..dcdf3a58 100644 --- a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java +++ b/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java @@ -37,6 +37,11 @@ public class GenerateDetail { */ private Byte isLike; + /** + * 喜欢的图片添加到library对应的id + */ + private Long libraryId; + /** * 创建时间 */ diff --git a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java index 62b8d2e0..dbf978a6 100644 --- a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java @@ -32,4 +32,11 @@ public class DesignItemClothesDetailVO { @ApiModelProperty("对应图层信息") private List layersObject; + + public DesignItemClothesDetailVO() { + } + + public DesignItemClothesDetailVO(String type) { + this.type = type; + } } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 8ff136d1..8c6efe7a 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -1354,7 +1354,7 @@ public class PythonService { bodyPath = designLibraryModelPoint.getTemplateUrl(); } else { // bodyPath = "/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"; - bodyPath = "model_1693218345.2714431.png"; + bodyPath = "aida-mannequins/model_1693218345.2714431.png"; } response.add(new DesignPythonItem(SysFileLevel2TypeEnum.BODY.getRealName(),bodyPath,pythonTAllInfoService.getImageIdByPath(bodyPath))); return response; @@ -1363,8 +1363,8 @@ public class PythonService { private DesignPythonItemPrint resolveDesignSinglePrint(DesignSinglePrintDTO printObject, String clothesPath) { - if (Objects.isNull(printObject)) { - return null; + if (Objects.isNull(printObject.getPath()) || CollectionUtil.isEmpty(printObject.getPrints())) { + return new DesignPythonItemPrint(new ArrayList<>(),false); } DesignPythonItemPrint print = CopyUtil.copyObject(printObject, DesignPythonItemPrint.class); if(StringUtils.isEmpty(printObject.getPath())){ @@ -1528,8 +1528,8 @@ public class PythonService { } public JSONObject designNew(DesignPythonObjects designPythonObjects) { - //限流校验 - AccessLimitUtils.validate("design",5); + // todo 限流校验 +// AccessLimitUtils.validate("design",5); OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) @@ -1561,7 +1561,7 @@ public class PythonService { log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException)); } //去除限流 - AccessLimitUtils.validateOut("design"); +// AccessLimitUtils.validateOut("design"); if (Objects.isNull(response)) { log.error("PythonService##design异常###{}", "response or body is empty!"); throw new BusinessException("system error!"); @@ -1641,9 +1641,9 @@ public class PythonService { content.put("user_id", userId); content.put("image_url", url); content.put("category", category); - content.put("mode",mode); // + content.put("mode",mode); content.put("str", text); - content.put("version",modelName); + content.put("version",2); RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); Request request = new Request.Builder() // .url(accessPythonIp + ":2828/aida/diffusion") @@ -1659,6 +1659,15 @@ public class PythonService { log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(content)); response = client.newCall(request).execute(); bodyString = response.body().string(); +// bodyString = "{\n" + +// " \"code\": 200,\n" + +// " \"data\": {\n" + +// " \"list\": [\n" + +// " \"aida-users/12/print_1695088687_0.png\"\n" + +// " ]\n" + +// " },\n" + +// " \"msg\": \"OK!\"\n" + +// "}"; } catch (IOException ioException) { log.error("PythonService##generateSketchOrPrint异常###{}", ExceptionUtil.getThrowableList(ioException)); } @@ -1669,10 +1678,11 @@ public class PythonService { log.error("PythonService##generateSketchOrPrint异常###{}", "response or body is empty!"); throw new BusinessException("generate exception!"); } - JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(bodyString)); - Boolean result = jsonObject.getBoolean("successful"); + JSONObject jsonObject = JSON.parseObject(bodyString); + Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful"); +// Boolean result = Boolean.TRUE; if (result) { - return setGenerateImageList(jsonObject.getJSONObject("date")); + return setGenerateImageList(jsonObject.getJSONObject("data")); } log.info("generateSketchOrPrintPrint失败###{}", jsonObject); //生成失败 @@ -1708,13 +1718,13 @@ public class PythonService { } private static List setGenerateImageList(JSONObject jsonObject){ - if (Objects.isNull(jsonObject.getJSONObject("list"))){ + List imageUrlList = JSONObject.parseArray(jsonObject.get("list").toString(),String.class); + if (imageUrlList.size() == 0){ log.error("PythonService##generateSketchOrPrint异常###{}","diffusion response list is null"); - // todo 如果这里返回为空,是判断出错还是返回给前端空 throw new BusinessException("Some errors occurred, please try again later"); } - return JSONArray.parseArray(JSONObject.toJSONString(jsonObject.get("list")), String.class); + return imageUrlList; } } diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java b/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java index 6e0e5941..642c29eb 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java @@ -60,4 +60,9 @@ public class DesignPythonItemPrint { public DesignPythonItemPrint(String path) { this.path = path; } + + public DesignPythonItemPrint(List print_path_list, Boolean ifSingle) { + this.print_path_list = print_path_list; + IfSingle = ifSingle; + } } diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index dd312874..86e8dfc1 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -16,4 +16,6 @@ public interface GenerateService extends IService { GenerateCollectionVO generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO); GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO); + + Boolean generateDislike(Long generateDetailId,String timeZone); } diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index 5c3ee07c..adc37cfa 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -413,7 +413,7 @@ public class DesignItemServiceImpl extends ServiceImpl clothes = new ArrayList<>(); + DesignItemClothesDetailVO body = new DesignItemClothesDetailVO("body"); designSingleVO.setDesignItemId(designItemId); designSingleVO.setDesignItemUrl(designItemUrl); designSingleVO.setClothes(clothes); @@ -433,9 +434,13 @@ public class DesignItemServiceImpl extends ServiceImpl singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0])).collect(Collectors.toList())); + layers -> singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0]) + ).collect(Collectors.toList())); + body.setLayersObject(layersObject.stream().filter(layers -> layers.getImageCategory().equals("body")).collect(Collectors.toList())); + clothes.add(designItemClothesDetailVO); }); + clothes.add(body); return designSingleVO; } diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index 1773a13a..47be3aa2 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -827,6 +827,9 @@ public class DesignServiceImpl extends ServiceImpl impleme d.setPrintObject(new DesignPythonItemPrint()); })); return editDesignItemLayer(flag, designPythonOutfit, designItem.getDesignUrl(), editResponseColor(designItemDetails, response)); + return editDesignItemLayer(flag,designPythonOutfit, + minIoUtil.splitThenGetPreviewUrl(designItem.getDesignUrl(),480), + editResponseColor(designItemDetails,response)); } private String converTypeToLevel1(String type) { @@ -924,7 +927,7 @@ public class DesignServiceImpl extends ServiceImpl impleme }); // 2、将查询出的图层信息填充到designItemDetailVO中 - designItemDetailVO.setDesignItemUrl(designPythonOutfit.getDesignUrl()); + designItemDetailVO.setDesignItemUrl(minIoUtil.splitThenGetPreviewUrl(designPythonOutfit.getDesignUrl(),480)); // 2.1 填充clothes designItemDetailVO.getClothes().forEach(c -> { String type = c.getType().toLowerCase(); @@ -938,14 +941,14 @@ public class DesignServiceImpl extends ServiceImpl impleme String type = o.getType().toLowerCase(); List outfitVOS = detailsVO.stream().filter(detail -> detail.getImageCategory().equals(type + "_back") || detail.getImageCategory().equals(type + "_front") || - detail.getImageCategory().equals("body")).collect(Collectors.toList()); - + detail.getImageCategory().equals(type + "_left") || + detail.getImageCategory().equals(type + "_right") || + detail.getImageCategory().equals(type)).collect(Collectors.toList()); o.setLayersObject(outfitVOS); }); } else { designItemDetailVO.setDesignItemUrl(designItemUrl); } - return designItemDetailVO; } } diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 8dd79cf9..27f2dfb2 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -7,6 +7,7 @@ import com.ai.da.common.enums.GenerateModeEnum; import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MD5Utils; +import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.CollectionElementMapper; import com.ai.da.mapper.GenerateDetailMapper; import com.ai.da.mapper.GenerateMapper; @@ -21,6 +22,7 @@ import com.ai.da.service.LibraryService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import io.netty.util.internal.StringUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -44,6 +46,11 @@ public class GenerateServiceImpl extends ServiceImpl im @Resource private CollectionElementService collectionElementService; + @Resource + private MinioUtil minioUtil; + @Value("${minio.bucketName4}") + private String bucketName4; + @Override public GenerateCaptionVO generateCaption(Long sketchElementId) { CollectionElement collectionElement = collectionElementMapper.selectById(sketchElementId); @@ -86,7 +93,8 @@ public class GenerateServiceImpl extends ServiceImpl im int mode = GenerateModeEnum.TEXT.getValue().equals(generate.getGenerateType()) ? GenerateModeEnum.TEXT.getCode() : GenerateModeEnum.TEXT_IMAGE.getCode(); String category = generateThroughImageTextDTO.getLevel1Type().equals(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName()) ? "sketch" : generateThroughImageTextDTO.getLevel1Type().equals(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName()) ? "print" : "moodboard"; - List generatedSketchUrl = pythonService.generateSketchOrPrint(accountId,collectionElement.getUrl(),category,text,mode,generateThroughImageTextDTO.getVersion()); + List generatedSketchUrl = pythonService.generateSketchOrPrint(accountId,Objects.isNull(elementId) ? null : collectionElement.getUrl(), + category,text,mode,generateThroughImageTextDTO.getVersion()); // List generatedSketchUrl = Arrays.asList("testUrl1","testUrl2","testUrl3","testUrl4"); @@ -102,7 +110,7 @@ public class GenerateServiceImpl extends ServiceImpl im GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); generateCollectionItemVO.setGenerateItemId(generateDetail.getId()); - generateCollectionItemVO.setGenerateItemUrl(item); + generateCollectionItemVO.setGenerateItemUrl(minioUtil.splitThenGetPreviewUrl(item,480)); generatedCollectionItems.add(generateCollectionItemVO); }); @@ -145,17 +153,44 @@ public class GenerateServiceImpl extends ServiceImpl im Assert.isTrue(generateLikeDTO.getLevel1Type().equals(generate.getLevel1Type()),"level1Type does not match"); // 2、将like的图片信息存入library + // 2.1、不能重复喜欢 + Library libraryDetail = libraryService.getById(generateDetail.getLibraryId()); + Assert.isTrue(Objects.isNull(generateDetail.getLibraryId()) || Objects.isNull(libraryDetail), + "Duplicate likes are not allowed"); + // 2.2、添加到library AuthPrincipalVo userInfo = UserContext.getUserHolder(); Long accountId = userInfo.getId(); Library library = setLibrary(accountId, generateLikeDTO, generateDetail.getUrl()); libraryService.save(library); - // 3、更新generateDetail表的isLike列 - updateLikeStatus(generateLikeDTO.getGenerateDetailId(),(byte)1); + // 3、更新generateDetail表的isLike列和libraryId列 + updateLikeStatus(generateLikeDTO.getGenerateDetailId(),(byte)1,library.getId(),generateLikeDTO.getTimeZone()); return new GenerateLikeVO(library.getId()); } + @Override + public Boolean generateDislike(Long generateDetailId, String timeZone) { + // 1、确定generateDetail中是否有这条记录 + GenerateDetail generateDetail = generateDetailMapper.selectById(generateDetailId); + Assert.notNull(generateDetail,"generateItem does not exist"); + + // 2、修改generateDetail表中的isLike、libraryId字段 + updateLikeStatus(generateDetailId,(byte)0,0L,timeZone); + + // 3、确定library中是否添加该条记录 + Library libraryDetail = libraryService.getById(generateDetail.getLibraryId()); + if (Objects.isNull(libraryDetail)){ + return Boolean.TRUE; + } + + // 4、删除library相关记录 + libraryService.removeById(libraryDetail.getId()); + + // 5、返回成功 + return Boolean.TRUE; + } + public Library setLibrary(Long accountId,GenerateLikeDTO generateLikeDTO,String imageUrl){ Library library = new Library(); library.setAccountId(accountId); @@ -163,17 +198,19 @@ public class GenerateServiceImpl extends ServiceImpl im library.setLevel2Type(StringUtil.isNullOrEmpty(generateLikeDTO.getLevel2Type()) ? null : generateLikeDTO.getLevel2Type()); library.setName(DateUtil.dateToStr(new Date(),DateUtil.YYYY_MM_DD)); library.setUrl(imageUrl); - library.setMd5(MD5Utils.encryptFile(imageUrl,Boolean.FALSE)); + library.setMd5(MD5Utils.encryptFile(minioUtil.splitThenGetPreviewUrl(imageUrl,5),Boolean.FALSE)); library.setCreateDate(DateUtil.getByTimeZone(generateLikeDTO.getTimeZone())); return library; } - public void updateLikeStatus(Long generateDetailId,Byte hasLike){ + public void updateLikeStatus(Long generateDetailId,Byte hasLike,Long libraryId,String timeZone){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", generateDetailId); GenerateDetail generateDetail = new GenerateDetail(); generateDetail.setIsLike(hasLike); + generateDetail.setLibraryId(libraryId); + generateDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone)); generateDetailMapper.update(generateDetail,queryWrapper); } } diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index 418154d7..11b2f707 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -8,6 +8,8 @@ import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; +import com.ai.da.common.utils.FileUtil; +import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.LibraryMapper; import com.ai.da.mapper.entity.*; import com.ai.da.model.dto.*; @@ -124,6 +126,9 @@ public class LibraryServiceImpl extends ServiceImpl impl IPage convert = page.convert((Function) library -> { QueryLibraryPageVO libraryPageVO = CopyUtil.copyObject(library,QueryLibraryPageVO.class); libraryPageVO.setDesignType(DesignTypeEnum.LIBRARY.getRealName()); + if (library.getUrl().startsWith("aida")){ + libraryPageVO.setUrl(minioUtil.splitThenGetPreviewUrl(library.getUrl(),480)); + } if(finalMap != null && finalMap.containsKey(library.getId())){ libraryPageVO.setLibraryModelPoint(finalMap.get(library.getId())); } diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java index 63c5e6cf..aa91ed55 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java @@ -30,6 +30,8 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl) JSON.parse(detail.getPosition())); - designPythonOutfitVO.setImageSize((List) JSON.parse(detail.getImageSize())); - designPythonOutfitVO.setImageUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : minIoUtil.getPresignedUrl(bucketName2,detail.getImageUrl(),5)); - designPythonOutfitVO.setMaskUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : minIoUtil.getPresignedUrl(bucketName2,detail.getMaskUrl(),5)); + designPythonOutfitVO.setPosition(StringUtil.isNullOrEmpty(detail.getPosition()) ? null : (List) JSON.parse(detail.getPosition())); + designPythonOutfitVO.setImageSize(StringUtil.isNullOrEmpty(detail.getImageSize()) ? null : (List) JSON.parse(detail.getImageSize())); + if (detail.getImageCategory().equals("body")){ + designPythonOutfitVO.setImageUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : minIoUtil.splitThenGetPreviewUrl(detail.getImageUrl(),480)); + }else { + designPythonOutfitVO.setImageUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : minIoUtil.splitThenGetPreviewUrl(detail.getImageUrl(),480)); + } + designPythonOutfitVO.setMaskUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : minIoUtil.splitThenGetPreviewUrl(detail.getMaskUrl(),480)); return designPythonOutfitVO; } diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index e19661d7..ffd37423 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -48,6 +48,8 @@ minio.accessKey=minioadmin minio.secretKey=minioadmin minio.bucketName=aida-results minio.bucketName2=aida-clothing +minio.bucketName3=aida-mannequins +minio.bucketName4=aida-users