Bladeren bron

Merge remote-tracking branch 'origin/main'

classic_blue 3 dagen geleden
bovenliggende
commit
8ad6e6b890

+ 8 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/constant/BaseConstant.java

@@ -48,4 +48,12 @@ public class BaseConstant {
     public static Set<String> getOpinionFileTypes() {
         return OPINION_FILE_TYPES;
     }
+
+    /**
+     * 获取评论图片类型
+     */
+    public static Set<String> getReviewImageTypes() {
+        return PRODUCT_IMAGE_TYPES;
+    }
 }
+

+ 8 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopReviewService.java

@@ -6,6 +6,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.remote.dto.AddReviewDto;
 import edu.travel.remote.dto.ProductSpecDto;
 import edu.travel.remote.vo.ShopReviewVo;
+import edu.travel.rpc.RPCBaseResponse;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 public interface ShopReviewService extends IService<ShopReview>{
 
@@ -13,4 +17,8 @@ public interface ShopReviewService extends IService<ShopReview>{
     Page<ShopReviewVo> getShopReview(ProductSpecDto params);
 
     String addReview(AddReviewDto params);
+
+    RPCBaseResponse<String> uploadReviewImage(MultipartFile file);
+
+    RPCBaseResponse<String> uploadReviewImages(List<MultipartFile> files);
 }

+ 116 - 7
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopReviewServiceImpl.java

@@ -1,6 +1,9 @@
 package edu.travel.commodity.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileTypeUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -10,29 +13,31 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import edu.travel.adapter.service.order.OrderAdapter;
 import edu.travel.adapter.service.order.OrderItemAdapter;
 import edu.travel.adapter.service.tenant.TenantAdapter;
+import edu.travel.adapter.service.upload.UploadAdapter;
+import edu.travel.commodity.constant.BaseConstant;
 import edu.travel.commodity.entity.ShopReview;
 import edu.travel.commodity.enums.OrderStateEnum;
 import edu.travel.commodity.mapper.ShopReviewMapper;
 import edu.travel.commodity.service.ShopReviewService;
-import edu.travel.commodity.utils.ObjectUtils;
-import edu.travel.commodity.utils.PageUtil;
-import edu.travel.commodity.utils.StringUtil;
-import edu.travel.commodity.utils.TokenData;
+import edu.travel.commodity.utils.*;
 import edu.travel.remote.dto.AddReviewDto;
 import edu.travel.remote.dto.GetOrderItemDto;
 import edu.travel.remote.dto.ProductSpecDto;
 import edu.travel.exception.BaseException;
 import edu.travel.remote.feign.mode.vo.tenant.EduTenantVo;
+import edu.travel.remote.upload.dto.EduFileDTO;
 import edu.travel.remote.vo.*;
 import edu.travel.rpc.RPCBaseResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static edu.travel.rpc.RPCBaseResponse.error;
+import static edu.travel.rpc.RPCBaseResponse.success;
+
 
 @Service
 public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopReview> implements ShopReviewService {
@@ -42,6 +47,9 @@ public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopRev
     private OrderItemAdapter orderItemAdapter;
     @Autowired
     private OrderAdapter orderAdapter;
+    @Autowired
+    private UploadAdapter uploadAdapter;
+
     @Override
     public Page<ShopReviewVo> getShopReview(ProductSpecDto params) {
         LambdaQueryWrapper<ShopReview> query = Wrappers.<ShopReview>lambdaQuery()
@@ -131,4 +139,105 @@ public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopRev
         save(bean);
         return "评价成功";
     }
+
+    /**
+     * 评论文件上传
+     * @param file
+     * @return
+     */
+    @Override
+    public RPCBaseResponse<String> uploadReviewImage(MultipartFile file) {
+        //判断上传的文件是否为空或未选择
+        if (file == null || file.isEmpty()) {
+            return error();
+        }
+        try {
+            //获取文件类型
+            String fileType = FileTypeUtil.getType(file.getInputStream());
+            //检查文件类型是否有效且是否在允许的评论图片类型列表中
+            if (fileType != null && BaseConstant.getReviewImageTypes().contains(fileType.toLowerCase())) {
+                //获取用户上传的文件名
+                String filename = file.getOriginalFilename();
+                //检查文件名是否为空
+                if (ObjectUtil.isEmpty(filename)) {
+                    return error();
+                }
+                //初始化上传,获取上传 ID
+                RPCBaseResponse<String> stringRPCBaseResponse = uploadAdapter.initializeUpload();
+               //创建文件 DTO 对象,用于存储文件相关信息
+                EduFileDTO eduFileDTO = new EduFileDTO();
+                eduFileDTO.setUploadId(stringRPCBaseResponse.getData());
+                eduFileDTO.setFileType(fileType);
+                eduFileDTO.setFileName(filename);
+                //生成系统文件名
+                eduFileDTO.setFileSysName(IdUtil.fastSimpleUUID()+ DateUtil.format(new Date(),"yyyyMMddHHmmss") +"."+fileType);
+                //计算文件的 MD5 值以便后续验证
+                eduFileDTO.setFileMd5(FIleUtil.calculateFileMd5(file.getBytes()));
+                //调用上传适配器进行文件上传
+                RPCBaseResponse rpcBaseResponse = uploadAdapter.uploadFile(eduFileDTO, file);
+                //返回成功响应,包含上传后的数据
+                return success(rpcBaseResponse.getData().toString());
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+            return error("file upload fail");
+        }
+        return error();
+    }
+    public RPCBaseResponse<String> uploadReviewImages(List<MultipartFile> files) {
+        // 判断上传的文件列表是否为空或未选择
+        if (files == null || files.isEmpty()) {
+            return RPCBaseResponse.error("No files provided for upload.");
+        }
+
+        List<String> uploadedFileIds = new ArrayList<>(); // 用于存放上传成功的文件ID
+        try {
+            for (MultipartFile file : files) {
+                // 判断单个文件是否为空
+                if (file.isEmpty()) {
+                    continue; // 如果文件为空,跳过该文件
+                }
+                // 获取文件类型
+                String fileType = FileTypeUtil.getType(file.getInputStream());
+                // 检查文件类型是否有效且是否在允许的评论图片类型列表中
+                if (fileType != null && BaseConstant.getReviewImageTypes().contains(fileType.toLowerCase())) {
+                    // 获取用户上传的文件名
+                    String filename = file.getOriginalFilename();
+                    // 检查文件名是否为空
+                    if (ObjectUtil.isEmpty(filename)) {
+                        continue; // 如果文件名为空,跳过该文件
+                    }
+                    // 初始化上传,获取上传 ID
+                    RPCBaseResponse<String> stringRPCBaseResponse = uploadAdapter.initializeUpload();
+                    // 创建文件 DTO 对象,用于存储文件相关信息
+                    EduFileDTO eduFileDTO = new EduFileDTO();
+                    eduFileDTO.setUploadId(stringRPCBaseResponse.getData());
+                    eduFileDTO.setFileType(fileType);
+                    eduFileDTO.setFileName(filename);
+                    // 生成系统文件名
+                    eduFileDTO.setFileSysName(IdUtil.fastSimpleUUID() + DateUtil.format(new Date(), "yyyyMMddHHmmss") + "." + fileType);
+                    // 计算文件的 MD5 值以便后续验证
+                    eduFileDTO.setFileMd5(FIleUtil.calculateFileMd5(file.getBytes()));
+                    // 调用上传适配器进行文件上传
+                    RPCBaseResponse<?> rpcBaseResponse = uploadAdapter.uploadFile(eduFileDTO, file);
+                    // 如果上传成功,收集文件ID
+                    if (rpcBaseResponse.getCode() == 200) {
+                        uploadedFileIds.add(rpcBaseResponse.getData().toString());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return RPCBaseResponse.error("File upload failed: " + e.getMessage());
+        }
+
+        // 返回成功响应,包含上传后的文件ID,以逗号分隔
+        if (!uploadedFileIds.isEmpty()) {
+            String result = String.join(",", uploadedFileIds);
+            return RPCBaseResponse.success(result);
+        } else {
+            return RPCBaseResponse.error("No files were uploaded successfully.");
+        }
+    }
+
 }

+ 17 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopReviewController.java

@@ -2,6 +2,7 @@ package edu.travel.commodity.web;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.commodity.entity.ShopReview;
+import edu.travel.commodity.service.ShopOpinionService;
 import edu.travel.commodity.service.ShopReviewService;
 import edu.travel.remote.commodity.ShopReviewRemoteController;
 import edu.travel.remote.dto.AddReviewDto;
@@ -13,6 +14,7 @@ import edu.travel.web.BaseController;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -32,6 +34,8 @@ public class ShopReviewController extends BaseController<ShopReview> implements
      */
     @Autowired
     private ShopReviewService shopReviewService;
+    @Autowired
+    private ShopOpinionService shopOpinionService;
 
     /**
      * 获取商品评论
@@ -55,7 +59,19 @@ public class ShopReviewController extends BaseController<ShopReview> implements
     public RPCBaseResponse<String> addReview(@RequestBody AddReviewDto params) {
         return success(shopReviewService.addReview(params));
     }
-
+    /**
+     * 上传评论图片
+     */
+    @PostMapping("/uploadReviewImage")
+    public RPCBaseResponse<String> uploadReviewImage(MultipartFile file) {
+        return shopReviewService.uploadReviewImage(file);    }
+/**
+ * 上传多张图片/视频
+ */
+    @PostMapping("/uploadReviewImages")
+    public RPCBaseResponse<String> uploadReviewImages(List<MultipartFile> files) {
+        return shopReviewService.uploadReviewImages(files);
+    }
     /**
      * 通过id查找商品评论
      */

+ 6 - 1
edu-travel-service/edu-travel-service-upload/src/main/resources/bootstrap.yml

@@ -6,4 +6,9 @@ spring:
   profiles:
     active: @env@
   main:
-    allow-bean-definition-overriding: true
+    allow-bean-definition-overriding: true
+  servlet:
+    multipart:
+      enabled: true #默认支持文件上传
+      max-file-size: 50MB # 最大支持文件大小
+      max-request-size: 60MB # 最大支持请求大小