瀏覽代碼

Merge remote-tracking branch 'origin/main'

4 天之前
父節點
當前提交
26ef28d14e
共有 45 個文件被更改,包括 1060 次插入87 次删除
  1. 0 42
      edu-travel-adapter/edu-travel-adapter-currency/pom.xml
  2. 22 1
      edu-travel-adapter/edu-travel-adapter-upload/src/main/java/edu/travel/adapter/service/upload/UploadAdapter.java
  3. 17 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/AddFavoriteDto.java
  4. 1 1
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductSkuDto.java
  5. 13 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/UpdateShopCarDto.java
  6. 1 1
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ProductImageVo.java
  7. 2 1
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ProductSkuVo.java
  8. 5 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ShopCartListVo.java
  9. 29 1
      edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/dto/tenant/BannerDto.java
  10. 4 1
      edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/vo/banner/BannerVo.java
  11. 6 0
      edu-travel-remote/edu-travel-remote-upload/pom.xml
  12. 9 1
      edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/UploadRemoteController.java
  13. 56 0
      edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/vo/EduFileBlobVo.java
  14. 50 0
      edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/vo/EduFileVo.java
  15. 9 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/constant/BaseConstant.java
  16. 0 6
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/entity/ShopProductImage.java
  17. 1 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/exception/GlobalExceptionHandler.java
  18. 2 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopFavoriteService.java
  19. 7 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopShoppingCartService.java
  20. 15 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopFavoriteServiceImpl.java
  21. 1 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java
  22. 6 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSpecServiceImpl.java
  23. 30 2
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopShoppingCartServiceImpl.java
  24. 17 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopFavoriteController.java
  25. 53 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopOpinionController.java
  26. 9 5
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductController.java
  27. 27 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopShoppingCartController.java
  28. 1 2
      edu-travel-service/edu-travel-service-commodity/src/main/resources/mapper/ShopProductImageMapper.xml
  29. 1 1
      edu-travel-service/edu-travel-service-tenement/pom.xml
  30. 43 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/constant/BaseConstant.java
  31. 19 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/constant/RedisKey.java
  32. 13 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/entity/ShopBanner.java
  33. 4 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ShopBannerService.java
  34. 152 3
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ShopBannerServiceImpl.java
  35. 17 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/FIleUtil.java
  36. 13 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/IdUtils.java
  37. 19 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/ObjectUtils.java
  38. 28 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/PageUtil.java
  39. 36 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/RedisUtil.java
  40. 26 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/StringUtil.java
  41. 16 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/TokenData.java
  42. 161 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/TreeUtils.java
  43. 43 12
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/ShopBannerController.java
  44. 75 1
      edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/web/UploadController.java
  45. 1 1
      edu-travel-service/edu-travel-service-upload/src/main/resources/bootstrap.yml

+ 0 - 42
edu-travel-adapter/edu-travel-adapter-currency/pom.xml

@@ -1,42 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>edu.travel</groupId>
-        <artifactId>edu-travel-adapter</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-
-    <artifactId>edu-travel-adapter-currency</artifactId>
-    <packaging>jar</packaging>
-
-    <name>edu-travel-adapter-currency</name>
-    <url>http://maven.apache.org</url>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-aop</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>edu.travel</groupId>
-            <artifactId>edu-travel-remote-country</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>edu.travel</groupId>
-            <artifactId>edu-travel-common-adapter</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-    </dependencies>
-</project>

+ 22 - 1
edu-travel-adapter/edu-travel-adapter-upload/src/main/java/edu/travel/adapter/service/upload/UploadAdapter.java

@@ -5,10 +5,11 @@ import edu.travel.adapter.annotation.AdapterAnnotation;
 import edu.travel.remote.upload.UploadRemoteController;
 import edu.travel.remote.upload.dto.EduFileBlobDTO;
 import edu.travel.remote.upload.dto.EduFileDTO;
+import edu.travel.remote.upload.vo.EduFileVo;
 import edu.travel.rpc.RPCBaseResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
@@ -48,4 +49,24 @@ public class UploadAdapter  {
         RPCBaseResponse rpcBaseResponse = uploadRemoteController.uploadFile(JSON.toJSONString(eduFileDTO),file);
         return rpcBaseResponse;
     }
+    @AdapterAnnotation
+    public RPCBaseResponse<EduFileVo> getFormId(@RequestParam("id") String id) {
+        return uploadRemoteController.getFormId(id);
+    }
+    @AdapterAnnotation
+    public RPCBaseResponse<EduFileVo> updateTargetFormId(EduFileDTO entity) {
+        return uploadRemoteController.updateTargetFormId(entity);
+    }
+    @AdapterAnnotation
+    public RPCBaseResponse<EduFileVo> saveFormTarget(EduFileDTO entity) {
+        return uploadRemoteController.saveFormTarget(entity);
+    }
+    @AdapterAnnotation
+    public RPCBaseResponse<EduFileVo> deleteTargetFormId(List<String> ids) {
+        return uploadRemoteController.deleteTargetFormId(ids);
+    }
+    @AdapterAnnotation
+    public RPCBaseResponse<List<EduFileVo>> getAllForm() {
+        return uploadRemoteController.getAllForm();
+    }
 }

+ 17 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/AddFavoriteDto.java

@@ -0,0 +1,17 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+@Data
+public class AddFavoriteDto {
+    /**
+     * 商品id
+     */
+    private String productId;
+
+    /**
+     * 国家
+     */
+    private String countryId;
+
+}

+ 1 - 1
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductSkuDto.java

@@ -42,7 +42,7 @@ public class InsertProductSkuDto {
     /**
      * 商品SKU图片
      */
-    private List<String> imageUrl;
+    private List<FIleDto> imageUrl;
     /**
      * 销量
      */

+ 13 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/UpdateShopCarDto.java

@@ -0,0 +1,13 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+@Data
+public class UpdateShopCarDto {
+    //商品ID
+    private String id;
+    //商品SKU
+    private String skuId;
+    //商品数量
+    private Integer query;
+}

+ 1 - 1
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ProductImageVo.java

@@ -22,7 +22,7 @@ public class ProductImageVo {
     /**
      * 判断图片/视频,默认0,0图片,1视频
      */
-    private Integer urlType;
+    private String urlType;
 
     /**是否默认列表图片*/
     private Integer isDefault;

+ 2 - 1
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ProductSkuVo.java

@@ -1,5 +1,6 @@
 package edu.travel.remote.vo;
 
+import edu.travel.remote.dto.FIleDto;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -53,7 +54,7 @@ public class ProductSkuVo {
     /**
      * 商品SKU图片
      */
-    private List<ProductImageVo> imageUrl;
+    private List<FIleDto> imageUrls;
     /**
      * 销量
      */

+ 5 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ShopCartListVo.java

@@ -64,4 +64,9 @@ public class ShopCartListVo {
      */
     private List<SpecValueVo> specValue;
 
+    /**
+     * state  0 上架 1 下架
+     */
+    private String state;
+
 }

+ 29 - 1
edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/dto/tenant/BannerDto.java

@@ -1,7 +1,10 @@
 package edu.travel.remote.feign.mode.dto.tenant;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
+import java.util.Date;
+
 @Data
 public class BannerDto {
     /**
@@ -13,7 +16,10 @@ public class BannerDto {
      * 图片/视频
      */
     private String url;
-
+    /**
+     * 图片id(上传方法返回)
+     */
+    private String imageId;
     /**
      * 判断图片/视频,默认0,0图片,1视频
      */
@@ -36,5 +42,27 @@ public class BannerDto {
      * mode 0 首页轮播图
      */
     private String mode;
+    /**
+     * 是否默认 0 否 1是
+     */
+    private Integer isDefault;
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
 
 }

+ 4 - 1
edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/vo/banner/BannerVo.java

@@ -27,7 +27,10 @@ public class BannerVo {
      * 国家
      */
     private String countryId;
-
+    /**
+     * 模块
+     */
+    private String mode;
     /**
      * 链接地址
      */

+ 6 - 0
edu-travel-remote/edu-travel-remote-upload/pom.xml

@@ -28,5 +28,11 @@
             <artifactId>edu-travel-common-openfeign</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-remote-base</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 9 - 1
edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/UploadRemoteController.java

@@ -1,7 +1,9 @@
 package edu.travel.remote.upload;
 
+import edu.travel.remote.base.RemoteBaseController;
 import edu.travel.remote.upload.dto.EduFileBlobDTO;
 import edu.travel.remote.upload.dto.EduFileDTO;
+import edu.travel.remote.upload.vo.EduFileVo;
 import edu.travel.rpc.RPCBaseResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
@@ -13,7 +15,7 @@ import java.io.Serializable;
 import java.util.List;
 
 @FeignClient(name = "upload-dev",path = "/upload")
-public interface UploadRemoteController {
+public interface UploadRemoteController extends RemoteBaseController<EduFileVo, EduFileDTO> {
     @PostMapping("/init")
     public RPCBaseResponse<String> initializeUpload();
     /**
@@ -55,4 +57,10 @@ public interface UploadRemoteController {
      */
     @PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     RPCBaseResponse uploadFile(@RequestParam("eduFileDTO") String dto,@RequestPart("file") MultipartFile file) throws IOException;
+
+    /**
+     * 通过id获取文件
+     */
+    @GetMapping("/getFormId")
+    RPCBaseResponse<EduFileVo> getFormId(@RequestParam("id")String id);
 }

+ 56 - 0
edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/vo/EduFileBlobVo.java

@@ -0,0 +1,56 @@
+package edu.travel.remote.upload.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import edu.travel.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "edu.edu_file_blob")
+public class EduFileBlobVo extends BaseEntity {
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 分片名字
+     */
+    @TableField(value = "blob_name")
+    private String blobName;
+
+    /**
+     * 传了第几片
+     */
+    @TableField(value = "blob_num")
+    private Integer blobNum;
+
+    /**
+     * 分片地址
+     */
+    @TableField(value = "blob_path")
+    private String blobPath;
+
+    /**
+     * 分片md5
+     */
+    @TableField(value = "blob_md5")
+    private String blobMd5;
+
+    /**
+     * 文件md5
+     */
+    @TableField(value = "file_md5")
+    private String fileMd5;
+
+    /**
+     * 总共多少片
+     */
+    @TableField(value = "total_count")
+    private Integer totalCount;
+
+}

+ 50 - 0
edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/vo/EduFileVo.java

@@ -0,0 +1,50 @@
+package edu.travel.remote.upload.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import edu.travel.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "edu.edu_file")
+public class EduFileVo extends BaseEntity {
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 文件md5
+     */
+    @TableField(value = "file_md5")
+    private String fileMd5;
+
+    /**
+     * 文件名
+     */
+    @TableField(value = "file_name")
+    private String fileName;
+
+    /**
+     * 文件系统名
+     */
+    @TableField(value = "file_sys_name")
+    private String fileSysName;
+
+    /**
+     * 文件路径
+     */
+    @TableField(value = "file_path")
+    private String filePath;
+
+    /**
+     * 文件类型
+     */
+    @TableField(value = "file_type")
+    private String fileType;
+
+}

+ 9 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/constant/BaseConstant.java

@@ -30,7 +30,12 @@ public class BaseConstant {
     private static final Set<String> PRODUCT_IMAGE_TYPES = new HashSet<>(
             Arrays.asList("jpg", "jpeg", "png")
     );
-
+    /**
+     * 意见文件类型
+     */
+    private static final Set<String> OPINION_FILE_TYPES = new HashSet<>(
+            Arrays.asList("jpg", "jpeg", "png","mp4")
+    );
     public static Set<String> getProductImageTypes() {
         return PRODUCT_IMAGE_TYPES;
     }
@@ -40,4 +45,7 @@ public class BaseConstant {
     public static Set<String> getBannerImageTypes() {
         return PRODUCT_IMAGE_TYPES;
     }
+    public static Set<String> getOpinionFileTypes() {
+        return OPINION_FILE_TYPES;
+    }
 }

+ 0 - 6
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/entity/ShopProductImage.java

@@ -26,12 +26,6 @@ public class ShopProductImage extends BaseEntity {
     private Long id;
 
     /**
-     * sku
-     */
-    @TableField(value = "sku_id")
-    private Long skuId;
-
-    /**
      * 商品ID
      */
     @TableField(value = "product_id")

+ 1 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/exception/GlobalExceptionHandler.java

@@ -24,7 +24,7 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(BaseException.class)
     public BaseResponse<Object> handleUserInfoException(BaseException e){
         e.printStackTrace();
-        return  PageResponse.out(e.getCode(),e.getMessage(),null);
+        return new BaseResponse<>(e.getCode(),e.getMessage(),null);
     }
 
     @ExceptionHandler(IllegalArgumentException.class)

+ 2 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopFavoriteService.java

@@ -3,6 +3,7 @@ package edu.travel.commodity.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.commodity.entity.ShopFavorite;
 import com.baomidou.mybatisplus.extension.service.IService;
+import edu.travel.remote.dto.AddFavoriteDto;
 import edu.travel.remote.dto.BaseDto;
 import edu.travel.remote.vo.ShopFavoriteVo;
 
@@ -11,4 +12,5 @@ public interface ShopFavoriteService extends IService<ShopFavorite>{
 
     Page<ShopFavoriteVo> getFavorite(BaseDto baseDto);
 
+    void addFavorite(AddFavoriteDto params);
 }

+ 7 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopShoppingCartService.java

@@ -5,12 +5,19 @@ import edu.travel.commodity.entity.ShopShoppingCart;
 import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.remote.dto.AddShopCartDto;
 import edu.travel.remote.dto.BaseDto;
+import edu.travel.remote.dto.UpdateShopCarDto;
 import edu.travel.remote.vo.ShopCartListVo;
 
+import java.util.Set;
+
 public interface ShopShoppingCartService extends IService<ShopShoppingCart>{
 
 
     Boolean addShopCart(AddShopCartDto params);
 
     Page<ShopCartListVo> getShopCartList(BaseDto params);
+
+    Boolean updateCart(UpdateShopCarDto params);
+
+    Integer delCart(Set<String> ids);
 }

+ 15 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopFavoriteServiceImpl.java

@@ -11,6 +11,8 @@ import edu.travel.commodity.service.ShopFavoriteService;
 import edu.travel.commodity.service.ShopProductService;
 import edu.travel.commodity.utils.PageUtil;
 import edu.travel.commodity.utils.TokenData;
+import edu.travel.exception.BaseException;
+import edu.travel.remote.dto.AddFavoriteDto;
 import edu.travel.remote.dto.BaseDto;
 import edu.travel.service.SysServiceImpl;
 import edu.travel.remote.vo.ShopFavoriteVo;
@@ -54,7 +56,7 @@ public class ShopFavoriteServiceImpl extends SysServiceImpl<ShopFavoriteMapper,
             if(!ObjectUtil.isEmpty(shopProduct)){
                 shopProductVo.setProductName(shopProduct.getProductName());
                 shopProductVo.setDescription(shopProduct.getDescription());
-                shopProductVo.setMainImageUrl(shopProduct.getDescription());
+                shopProductVo.setMainImageUrl(shopProduct.getMainImageUrl());
                 shopProductVo.setHeatValue(shopProduct.getHeatValue());
                 shopProductVo.setSalesVolume(shopProduct.getSalesVolume());
                 shopProductVo.setDefaultPrice(shopProduct.getDefaultPrice());
@@ -64,4 +66,16 @@ public class ShopFavoriteServiceImpl extends SysServiceImpl<ShopFavoriteMapper,
         }
         return pageEntity;
     }
+
+    @Override
+    public void addFavorite(AddFavoriteDto params) {
+        ShopProduct product = shopProductService.getById(params.getProductId());
+        if(ObjectUtil.isEmpty(product) ||!product.getCountryId().toString().equals(params.getCountryId())){
+            throw new BaseException("商品不存在");
+        }
+        ShopFavorite shopFavorite = new ShopFavorite();
+        shopFavorite.setProductId(product.getId());
+        shopFavorite.setUserId(Long.valueOf(TokenData.getUserId()));
+        save(shopFavorite);
+    }
 }

+ 1 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java

@@ -239,7 +239,7 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
             for (InsertProductSkuDto insertProductSkuDto : skus) {
                 ShopProductSku bean = BeanUtil.toBean(insertProductSkuDto, ShopProductSku.class);
                 bean.setProductId(product.getId());
-                bean.setImageUrl(StringUtil.toListString(insertProductSkuDto.getImageUrl()));
+                bean.setImageUrl(JSONUtil.toJsonStr(insertProductSkuDto.getImageUrl()));
                 shopProductSkus.add(bean);
                 for (SkuValueDto skuValues : insertProductSkuDto.getSkuValues()) {
                     ShopSkuSpecValue skuValue = new ShopSkuSpecValue();

+ 6 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSpecServiceImpl.java

@@ -2,6 +2,8 @@ package edu.travel.commodity.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -10,6 +12,8 @@ import edu.travel.commodity.entity.*;
 import edu.travel.commodity.mapper.ShopProductSpecMapper;
 import edu.travel.commodity.service.*;
 import edu.travel.commodity.utils.IdUtils;
+import edu.travel.commodity.utils.StringUtil;
+import edu.travel.remote.dto.FIleDto;
 import edu.travel.remote.dto.InsertProductSpecDto;
 import edu.travel.remote.dto.ProductSpecDto;
 import edu.travel.remote.dto.SpecValueDto;
@@ -85,6 +89,8 @@ public class ShopProductSpecServiceImpl extends ServiceImpl<ShopProductSpecMappe
             bean.setImages(imageMap.get(info.getSkuId().toString()));
             List<ShopSkuSpecValueVo> shopSkuSpecValueVos = map.get(info.getSkuId().toString());
             infoVo.setSpecValue(shopSkuSpecValueVos);
+            JSONArray objects = JSONUtil.parseArray(info.getImageUrl());
+            infoVo.setImageUrls(JSONUtil.toList(objects, FIleDto.class));
             productSkuVos.add(infoVo);
         }
         List<SpecSortVo> specSortVoList= getSpecSortVoList(param.getProductId());

+ 30 - 2
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopShoppingCartServiceImpl.java

@@ -20,6 +20,7 @@ import edu.travel.commodity.utils.TokenData;
 import edu.travel.remote.dto.AddShopCartDto;
 import edu.travel.remote.dto.BaseDto;
 import edu.travel.exception.BaseException;
+import edu.travel.remote.dto.UpdateShopCarDto;
 import edu.travel.remote.vo.ShopCartListVo;
 import edu.travel.remote.vo.ShopSkuSpecValueVo;
 import edu.travel.remote.vo.SpecValueVo;
@@ -42,6 +43,9 @@ public class ShopShoppingCartServiceImpl extends ServiceImpl<ShopShoppingCartMap
     private ShopProductSpecMapper shopProductSpecMapper;
     @Override
     public Boolean addShopCart(AddShopCartDto params) {
+        if(params.getQuantity()<=0){
+            throw new BaseException("数量有误,请重新选择");
+        }
         // 获取用户id
         String userId = TokenData.getUserId();
         ShopProduct byId = shopProductService.getById(params.getProductId());
@@ -51,11 +55,11 @@ public class ShopShoppingCartServiceImpl extends ServiceImpl<ShopShoppingCartMap
         if(byId==null||byId.getStatus().equals(BaseConstant.BASIC_STATUS_YES_NUM)||one==null){
             throw new BaseException("商品已经下架");
         }
-
         ShopShoppingCart shopShoppingCart = new ShopShoppingCart();
         shopShoppingCart.setProductSkuId(one.getId());
         shopShoppingCart.setUserId(Long.valueOf(userId));
         shopShoppingCart.setQuantity(params.getQuantity());
+        shopShoppingCart.setProductId(one.getProductId());
         return save(shopShoppingCart);
     }
 
@@ -91,7 +95,9 @@ public class ShopShoppingCartServiceImpl extends ServiceImpl<ShopShoppingCartMap
         String project = request.getHeader("project");
         List<ShopSkuSpecValueVo> skuValue = shopProductSpecMapper.getSkuValue(skus, project);
         Map<String, List<ShopSkuSpecValueVo>> sku = skuValue.stream().collect(Collectors.groupingBy(ShopSkuSpecValueVo::getSkuId));
-
+        if(ObjectUtil.isEmpty(collect)){
+            return pageEntity;
+        }
 
         List<ShopProduct> shopProducts = shopProductService.listByIds(collect);
         HashMap<String, ShopProduct> map = new HashMap<>();
@@ -111,6 +117,8 @@ public class ShopShoppingCartServiceImpl extends ServiceImpl<ShopShoppingCartMap
                     record.setPrice(shopProductSku.getPrice());
                     record.setInventory(shopProductSku.getInventory());
                     record.setSkuId(shopProductSku.getSkuId().toString());
+                    //0 上架 1 下架
+                    record.setState(shopProductSku.getStatus().toString());
                 }
                 String skuId = record.getSkuId();
                 if(ObjectUtil.isEmpty(skuId))continue;
@@ -124,5 +132,25 @@ public class ShopShoppingCartServiceImpl extends ServiceImpl<ShopShoppingCartMap
         return pageEntity;
     }
 
+    @Override
+    public Boolean updateCart(UpdateShopCarDto params) {
+        ShopShoppingCart cart = getById(params.getId());
+        if(cart==null){
+            return false;
+        }
+        if(!ObjectUtil.isEmpty(params.getQuery())&&params.getQuery()>0){
+            cart.setQuantity(params.getQuery());
+        }
+        if(!ObjectUtil.isEmpty(params.getSkuId())){
+            cart.setProductSkuId(Long.valueOf(params.getSkuId()));
+        }
+        return updateById(cart);
+    }
+
+    @Override
+    public Integer delCart(Set<String> ids) {
+        return baseMapper.deleteBatchIds(ids);
+    }
+
 
 }

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

@@ -2,6 +2,7 @@ package edu.travel.commodity.web;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.commodity.service.ShopFavoriteService;
+import edu.travel.remote.dto.AddFavoriteDto;
 import edu.travel.remote.dto.BaseDto;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.remote.vo.ShopFavoriteVo;
@@ -9,6 +10,8 @@ import org.springframework.web.bind.annotation.*;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
+import static edu.travel.rpc.RPCBaseResponse.success;
+
 /**
 * 收藏表(shop_favorite)表控制层
 *
@@ -29,6 +32,19 @@ public class ShopFavoriteController {
      */
     @GetMapping("/getFavorite")
     public RPCBaseResponse<Page<ShopFavoriteVo>> getFavorite(BaseDto baseDto){
-        return RPCBaseResponse.success(shopFavoriteService.getFavorite(baseDto));
+        return success(shopFavoriteService.getFavorite(baseDto));
+    }
+
+
+    /**
+     *  添加收藏
+     * @param params
+     * @return {@link RPCBaseResponse }<{@link Void }>
+     */
+
+    @GetMapping("/addFavorite")
+    public RPCBaseResponse<Void> addFavorite(@RequestBody AddFavoriteDto params){
+        shopFavoriteService.addFavorite(params);
+        return success();
     }
 }

+ 53 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopOpinionController.java

@@ -1,10 +1,18 @@
 package edu.travel.commodity.web;
 
+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 com.baomidou.mybatisplus.core.metadata.IPage;
+import edu.travel.adapter.service.upload.UploadAdapter;
+import edu.travel.commodity.constant.BaseConstant;
 import edu.travel.commodity.entity.ShopOpinion;
 import edu.travel.commodity.service.ShopOpinionService;
+import edu.travel.commodity.utils.FIleUtil;
 import edu.travel.remote.dto.ShopOpinionDto;
 import edu.travel.remote.opinion.ShopOpinionRemoteController;
+import edu.travel.remote.upload.dto.EduFileDTO;
 import edu.travel.remote.vo.ShopOpinionVo;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.web.BaseController;
@@ -12,9 +20,14 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.util.Date;
 import java.util.List;
 
+import static edu.travel.rpc.RPCBaseResponse.error;
+import static edu.travel.rpc.RPCBaseResponse.success;
+
 /**
 * 意见表(shop_opinion)表控制层
 *
@@ -28,6 +41,8 @@ public class ShopOpinionController extends BaseController<ShopOpinion> implement
 */
     @Autowired
     private ShopOpinionService shopOpinionService;
+    @Autowired
+    private UploadAdapter uploadAdapter;
     /**
      * 分页查询(连表)
      */
@@ -99,4 +114,42 @@ public class ShopOpinionController extends BaseController<ShopOpinion> implement
         return baseCountryVoRPCBaseResponse;
     }
 
+    /**
+     * 意见图片上传
+     */
+    @GetMapping("/uploadOpinionImage")
+    public RPCBaseResponse<String> uploadOpinionImage(MultipartFile file) {
+        if (file == null || file.isEmpty()) {
+            return error();
+        }
+        try {
+            // 通过文件的字节流获取真实类型(Hutool自动解析魔数)
+            String fileType = FileTypeUtil.getType(file.getInputStream());
+            // 判断类型是否在支持的图片类型集合中
+            if (fileType != null && BaseConstant.getOpinionFileTypes().contains(fileType.toLowerCase())) {
+                String filename = file.getOriginalFilename();
+                if(ObjectUtil.isEmpty(filename)){
+                    return error();
+                }
+                RPCBaseResponse<String> stringRPCBaseResponse = uploadAdapter.initializeUpload();
+
+                EduFileDTO eduFileDTO = new EduFileDTO();
+                eduFileDTO.setUploadId(stringRPCBaseResponse.getData());
+                eduFileDTO.setFileType(fileType);
+                eduFileDTO.setFileName(filename);
+                eduFileDTO.setFileSysName(IdUtil.fastSimpleUUID()+ DateUtil.format(new Date(),"yyyyMMddHHmmss") +"."+fileType);
+                eduFileDTO.setFileMd5(FIleUtil.calculateFileMd5(file.getBytes()));
+                RPCBaseResponse rpcBaseResponse = uploadAdapter.uploadFile(eduFileDTO, file);
+                return success(rpcBaseResponse.getData().toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 处理流读取异常或类型解析失败
+            return error("文件上传失败");
+        }
+        return error();
+    }
+
+
+
 }

+ 9 - 5
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductController.java

@@ -11,6 +11,7 @@ import edu.travel.commodity.constant.BaseConstant;
 import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.service.ShopProductService;
 import edu.travel.commodity.utils.FIleUtil;
+import edu.travel.commodity.utils.IdUtils;
 import edu.travel.remote.dto.GetProductByTypeDto;
 import edu.travel.remote.dto.InsertProductDto;
 import edu.travel.remote.dto.SearchProductDto;
@@ -68,6 +69,11 @@ public class ShopProductController extends BaseController<ShopProduct> {
     }
 
 
+    /**
+     *  上传商品图片
+     * @param file
+     * @return {@link RPCBaseResponse }<{@link String }>
+     */
 
     @PostMapping("/uploadProductImage")
     public RPCBaseResponse<String> searchProduct(MultipartFile file) throws IOException {
@@ -117,14 +123,12 @@ public class ShopProductController extends BaseController<ShopProduct> {
 
     /**
      *  获取SkuId
-     * @param params
      * @return {@link RPCBaseResponse }<{@link String }>
      */
 
     @GetMapping("/getSkuId")
-    public RPCBaseResponse<String> getSkuId(@RequestBody InsertProductDto params){
-        Snowflake snowflake = IdUtil.createSnowflake(1, 1);
-        long orderNum = snowflake.nextId();
-        return success(orderNum+"");
+    public RPCBaseResponse<String> getSkuId(){
+        long id = IdUtils.getSnowflakeId();
+        return success(id+"");
     }
 }

+ 27 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopShoppingCartController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.commodity.service.ShopShoppingCartService;
 import edu.travel.remote.dto.AddShopCartDto;
 import edu.travel.remote.dto.BaseDto;
+import edu.travel.remote.dto.UpdateShopCarDto;
 import edu.travel.resp.BaseResponse;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.remote.vo.ShopCartListVo;
@@ -11,6 +12,8 @@ import org.springframework.web.bind.annotation.*;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.Set;
+
 import static edu.travel.rpc.RPCBaseResponse.success;
 
 /**
@@ -49,5 +52,29 @@ public class ShopShoppingCartController {
         return success(shopShoppingCartService.getShopCartList(params));
     }
 
+    /**
+     * 修改购物车信息
+     * @param params
+     * @return {@link BaseResponse }<{@link Page }<{@link ShopCartListVo }>>
+     */
+
+    @PostMapping("/updateCart")
+    public RPCBaseResponse<Boolean> updateCart(@RequestBody UpdateShopCarDto params) {
+        return success(shopShoppingCartService.updateCart(params));
+    }
+    /**
+     * 删除购物车
+     * @param ids
+     * @return {@link BaseResponse }<{@link Page }<{@link ShopCartListVo }>>
+     */
+
+    @PostMapping("/delCart")
+    public RPCBaseResponse<Integer> delCart(@RequestBody Set<String> ids) {
+        return success(shopShoppingCartService.delCart(ids));
+    }
+
+
+
+
 
 }

+ 1 - 2
edu-travel-service/edu-travel-service-commodity/src/main/resources/mapper/ShopProductImageMapper.xml

@@ -5,7 +5,6 @@
     <!--@mbg.generated-->
     <!--@Table shop_product_image-->
     <id column="id" jdbcType="BIGINT" property="id" />
-    <result column="sku_id" jdbcType="BIGINT" property="skuId" />
     <result column="product_id" jdbcType="BIGINT" property="productId" />
     <result column="url" jdbcType="VARCHAR" property="url" />
     <result column="url_type" jdbcType="VARCHAR" property="urlType" />
@@ -20,7 +19,7 @@
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
-    id, sku_id, product_id, url, url_type, sort_order, project, create_time, create_user_id, 
+    id, product_id, url, url_type, sort_order, project, create_time, create_user_id,
     update_time, update_user_id, delete_flag,is_default
   </sql>
 </mapper>

+ 1 - 1
edu-travel-service/edu-travel-service-tenement/pom.xml

@@ -141,7 +141,7 @@
         </dependency>
         <dependency>
             <groupId>edu.travel</groupId>
-            <artifactId>edu-travel-service-commodity</artifactId>
+            <artifactId>edu-travel-adapter-country</artifactId>
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>

+ 43 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/constant/BaseConstant.java

@@ -0,0 +1,43 @@
+package edu.travel.tenant.constant;
+
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class BaseConstant {
+    /**
+     * 删除标记 正常
+     */
+    public static final Integer BASIC_STATUS_NO_NUM = 0;
+    public static final String BASIC_STATUS_NO_STR = "0";
+
+    /**
+     * 删除标记 删除
+     */
+    public static final Integer BASIC_STATUS_YES_NUM = 1;
+    public static final String BASIC_STATUS_YES_STR = "1";
+
+    /**
+     * 删除标记 正常
+     */
+    public static final Integer BASIC_IS_DEFAULT_YES = 0;
+    public static final Integer BASIC_IS_DEFAULT_YES_NO = 1;
+
+    /**
+     * 商品文件上传图片类型
+     */
+    private static final Set<String> PRODUCT_IMAGE_TYPES = new HashSet<>(
+            Arrays.asList("jpg", "jpeg", "png")
+    );
+
+    public static Set<String> getProductImageTypes() {
+        return PRODUCT_IMAGE_TYPES;
+    }
+    /**
+     * 获取banner 图片类型
+     */
+    public static Set<String> getBannerImageTypes() {
+        return PRODUCT_IMAGE_TYPES;
+    }
+}

+ 19 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/constant/RedisKey.java

@@ -0,0 +1,19 @@
+package edu.travel.tenant.constant;
+
+public interface RedisKey {
+    /**商品类型*/
+    String BASH = "shop:";
+    /**商品类型*/
+   String PRODUCT_TYPE = BASH +"product:type";
+   /**热门商品类型*/
+   String PRODUCT_HOT_TYPE = BASH +"product:hot:type";
+    /**热门二级商品类型*/
+   String PRODUCT_TO_HOT_TYPE = BASH +"product:to:hot:type";
+    /**
+     * 加上国家
+     */
+
+
+    String PRODUCT_ORDER = BASH +"product:order";
+
+}

+ 13 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/entity/ShopBanner.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import edu.travel.entity.BaseEntity;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -89,5 +90,17 @@ public class ShopBanner extends BaseEntity {
      */
     @TableField(value = "`enable`")
     private Integer enable;
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
 
 }

+ 4 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ShopBannerService.java

@@ -16,4 +16,8 @@ public interface ShopBannerService extends IService<ShopBanner>{
     List<BannerVo> getBanner(BannerDto mode);
 
     RPCBaseResponse<String> uploadBannerImage(MultipartFile file);
+
+    RPCBaseResponse<BannerVo> saveBannerCountry(BannerDto banner);
+
+    RPCBaseResponse<BannerVo> updateBannerCountry(BannerDto banner);
 }

+ 152 - 3
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ShopBannerServiceImpl.java

@@ -8,16 +8,18 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import edu.travel.adapter.service.country.CountryAdapter;
 import edu.travel.adapter.service.upload.UploadAdapter;
-import edu.travel.commodity.constant.BaseConstant;
-import edu.travel.commodity.utils.FIleUtil;
 import edu.travel.remote.feign.mode.dto.tenant.BannerDto;
 import edu.travel.remote.feign.mode.vo.banner.BannerVo;
 import edu.travel.remote.upload.dto.EduFileDTO;
+import edu.travel.remote.upload.vo.EduFileVo;
 import edu.travel.rpc.RPCBaseResponse;
+import edu.travel.tenant.constant.BaseConstant;
 import edu.travel.tenant.entity.ShopBanner;
 import edu.travel.tenant.mapper.ShopBannerMapper;
 import edu.travel.tenant.service.ShopBannerService;
+import edu.travel.tenant.utils.FIleUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -33,6 +35,8 @@ import static edu.travel.rpc.RPCBaseResponse.success;
 public class ShopBannerServiceImpl extends ServiceImpl<ShopBannerMapper, ShopBanner> implements ShopBannerService {
     @Autowired
     private UploadAdapter uploadAdapter;
+    @Autowired
+    private CountryAdapter countryAdapter;
     @Override
     public List<BannerVo> getBanner(BannerDto mode) {
        List<BannerVo> list = new ArrayList<>();
@@ -76,7 +80,6 @@ public class ShopBannerServiceImpl extends ServiceImpl<ShopBannerMapper, ShopBan
                 eduFileDTO.setUploadId(stringRPCBaseResponse.getData()); // 设置上传 ID
                 eduFileDTO.setFileType(fileType); // 设置文件类型
                 eduFileDTO.setFileName(filename); // 设置文件原始名称
-
                 // 生成系统文件名,确保唯一性
                 eduFileDTO.setFileSysName(IdUtil.fastSimpleUUID() + DateUtil.format(new Date(), "yyyyMMddHHmmss") + "." + fileType);
                 // 计算文件的 MD5 值以便后续验证
@@ -92,4 +95,150 @@ public class ShopBannerServiceImpl extends ServiceImpl<ShopBannerMapper, ShopBan
         }
         return error(); // 如果文件类型不支持,返回错误响应
     }
+
+    /**
+     * 新增轮播图信息
+     * @param banner
+     * @return
+     */
+    @Override
+    public RPCBaseResponse<BannerVo> saveBannerCountry(BannerDto banner) {
+        // 验证输入参数的有效性
+        if (ObjectUtil.isEmpty(banner)) {
+            return error("Banner data cannot be null");
+        }
+
+        // 检查 isDefault 是否被输入
+        if (banner.getIsDefault() == null) {
+            return error("isDefault must be provided");
+        }
+
+        // 如果 isDefault 为 0,检查 startTime 和 endTime
+        if (banner.getIsDefault() == 0) {
+            if (ObjectUtil.isEmpty(banner.getStartTime()) || ObjectUtil.isEmpty(banner.getEndTime())) {
+                return error("startTime and endTime must be provided when isDefault is false");
+            }
+        }
+
+        try {
+            // 使用 uploadAdapter.getFormId 查找出 file_path 和 fileType
+            RPCBaseResponse<EduFileVo> fileResponse = uploadAdapter.getFormId(banner.getImageId());
+            if (fileResponse.getData() == null) {
+                return error("Failed to retrieve file information");
+            }
+            EduFileVo fileData = fileResponse.getData();
+            String filePath = fileData.getFilePath(); // 假设 EduFileDTO 有 getFilePath 方法
+            String fileType = fileData.getFileType(); // 假设 EduFileDTO 有 getFileType 方法
+
+            // 创建新的 BannerVo 对象
+            BannerVo bannerVo = new BannerVo();
+            bannerVo.setUrl(filePath); // 设置文件路径
+            bannerVo.setUrlType("image".equalsIgnoreCase(fileType) ? 0 : 1); // 假设0为图片,1为视频
+            bannerVo.setContent(banner.getContent()); // 设置名称
+            bannerVo.setCountryId(banner.getCountryId()); // 设置国家
+            bannerVo.setLinkUrl(banner.getLinkUrl()); // 设置链接地址
+            bannerVo.setMode(banner.getMode());
+
+            // 这里可以进行其他必要的字段设置,比如与 banner 相关的其他信息
+            bannerVo.setId(banner.getId()); // 如果需要设置ID,可以从DTO中获取
+
+            // 保存横幅信息到数据库,假设我们有一个方法 saveBanner
+            ShopBanner shopBanner = new ShopBanner();
+            // 将 bannerVo 转换为 shopBanner (可以使用 BeanUtil.copyProperties 或自定义转换)
+            BeanUtil.copyProperties(bannerVo, shopBanner);
+            // 设置其他必要字段
+            shopBanner.setEnable(0); // 示例:设置为启用状态
+            shopBanner.setCreateTime(new Date()); // 设置当前时间为创建时间
+
+            // 设置 isDefault、startTime 和 endTime 字段
+            shopBanner.setIsDefault(banner.getIsDefault());
+            if (banner.getIsDefault() == 0) {
+                shopBanner.setStartTime(banner.getStartTime());
+                shopBanner.setEndTime(banner.getEndTime());
+            }
+
+            // 调用 mapper 保存到数据库
+            this.save(shopBanner);
+
+            return success(bannerVo); // 返回成功的响应
+        } catch (Exception e) {
+            e.printStackTrace();
+            return error("Failed to save banner country");
+        }
+    }
+
+    /**
+     * 更新横幅信息
+     * @param banner
+     * @return
+     */
+    @Override
+    public RPCBaseResponse<BannerVo> updateBannerCountry(BannerDto banner) {
+        // 验证输入参数的有效性
+        if (ObjectUtil.isEmpty(banner) || ObjectUtil.isEmpty(banner.getId())) {
+            return error("Banner data cannot be null and id must be provided");
+        }
+
+        // 检查 isDefault 是否被输入
+        if (banner.getIsDefault() == null) {
+            return error("isDefault must be provided");
+        }
+
+        // 如果 isDefault 为 0,检查 startTime 和 endTime
+        if (banner.getIsDefault() == 0) {
+            if (ObjectUtil.isEmpty(banner.getStartTime()) || ObjectUtil.isEmpty(banner.getEndTime())) {
+                return error("startTime and endTime must be provided when isDefault is 0");
+            }
+        }
+
+        try {
+            // 使用 uploadAdapter.getFormId 查找出 file_path 和 fileType
+            RPCBaseResponse<EduFileVo> fileResponse = uploadAdapter.getFormId(banner.getImageId());
+            if (fileResponse.getData() == null) {
+                return error("Failed to retrieve file information");
+            }
+            EduFileVo fileData = fileResponse.getData();
+            String filePath = fileData.getFilePath(); // 假设 EduFileDTO 有 getFilePath 方法
+            String fileType = fileData.getFileType(); // 假设 EduFileDTO 有 getFileType 方法
+
+            // 查找现有的 ShopBanner 对象进行更新
+            ShopBanner shopBanner = this.getById(banner.getId());
+            if (shopBanner == null) {
+                return error("Banner not found");
+            }
+
+            // 更新 BannerVo 对象
+            BannerVo bannerVo = new BannerVo();
+            bannerVo.setUrl(filePath); // 设置文件路径
+            bannerVo.setUrlType("image".equalsIgnoreCase(fileType) ? 0 : 1); // 假设0为图片,1为视频
+            bannerVo.setContent(banner.getContent()); // 设置名称
+            bannerVo.setCountryId(banner.getCountryId()); // 设置国家
+            bannerVo.setLinkUrl(banner.getLinkUrl()); // 设置链接地址
+            bannerVo.setMode(banner.getMode());
+            bannerVo.setId(banner.getId()); // 保持ID一致
+
+            // 将 bannerVo 转换为 shopBanner,并设置其他字段
+            BeanUtil.copyProperties(bannerVo, shopBanner);
+            shopBanner.setEnable(0); // 示例:设置为启用状态
+            shopBanner.setUpdateTime(new Date()); // 设置当前时间为更新时间
+
+            // 设置 isDefault、startTime 和 endTime 字段
+            shopBanner.setIsDefault(banner.getIsDefault());
+            if (banner.getIsDefault() == 0) {
+                shopBanner.setStartTime(banner.getStartTime());
+                shopBanner.setEndTime(banner.getEndTime());
+            }
+
+            // 调用 mapper 更新到数据库
+            this.updateById(shopBanner);
+
+            return success(bannerVo); // 返回成功的响应
+        } catch (Exception e) {
+            e.printStackTrace();
+            return error("Failed to update banner country");
+        }
+    }
+
+
+
 }

+ 17 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/FIleUtil.java

@@ -0,0 +1,17 @@
+package edu.travel.tenant.utils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class FIleUtil {
+
+    public static String calculateFileMd5(byte[] data) throws NoSuchAlgorithmException {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] digest = md.digest(data);
+        StringBuilder sb = new StringBuilder();
+        for (byte b : digest) {
+            sb.append(String.format("%02x", b));
+        }
+        return sb.toString();
+    }
+}

+ 13 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/IdUtils.java

@@ -0,0 +1,13 @@
+package edu.travel.tenant.utils;
+
+import cn.hutool.core.lang.Singleton;
+import cn.hutool.core.lang.Snowflake;
+import lombok.Data;
+
+@Data
+public class IdUtils {
+    public static long getSnowflakeId() {
+        Snowflake snowflake = Singleton.get(Snowflake.class, 1L, 1L, true);
+        return  snowflake.nextId();
+    }
+}

+ 19 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/ObjectUtils.java

@@ -0,0 +1,19 @@
+package edu.travel.tenant.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ObjectUtils {
+
+
+    public static <T> List<T> castList(Object obj, Class<T> clazz) {
+        List<T> result = new ArrayList<T>();
+        if (obj instanceof List<?>) {
+            for (Object o : (List<?>) obj) {
+                result.add(clazz.cast(o));
+            }
+            return result;
+        }
+        return null;
+    }
+}

+ 28 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/PageUtil.java

@@ -0,0 +1,28 @@
+package edu.travel.tenant.utils;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.BeanUtils;
+
+public class PageUtil{
+
+    /**
+     * Page类型entity转换
+     * @param source
+     * @param type
+     * @return
+     */
+    public static <T,E> Page<E> toPageEntity(Page<T> source, Class<E> type) {
+        Page<E> target = new Page<E>();
+        BeanUtils.copyProperties(source, target);
+        target.setRecords(BeanUtil.copyToList(source.getRecords(), type));
+        return target;
+    }
+    public static <T,E> Page<E> toPageEntity(IPage<T> source, Class<E> type) {
+        Page<E> target = new Page<E>();
+        BeanUtils.copyProperties(source, target);
+        target.setRecords(BeanUtil.copyToList(source.getRecords(), type));
+        return target;
+    }
+}

+ 36 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/RedisUtil.java

@@ -0,0 +1,36 @@
+package edu.travel.tenant.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RedisUtil {
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
+    /**
+     *通过KEY 获取值
+     */
+    public String getString(String key) {
+        return stringRedisTemplate.opsForValue().get(key);
+    }
+    /**
+     * 设置KEY 和 VALUE
+     */
+    public void setString(String key, String value) {
+        stringRedisTemplate.opsForValue().set(key, value);
+    }
+
+    /**
+     * @param key KEY
+     * @param value 值
+     * @param expire 过期时间
+     * @param timeUnit 时间单位
+     */
+    public void setString(String key, String value,long expire,TimeUnit timeUnit) {
+        stringRedisTemplate.opsForValue().set(key, value,expire, timeUnit);
+    }
+
+}

+ 26 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/StringUtil.java

@@ -0,0 +1,26 @@
+package edu.travel.tenant.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Data
+public class StringUtil {
+
+    public static List<String> toList(String str){
+        if(!ObjectUtil.isEmpty(str)){
+            return Arrays.asList(str.split(","));
+        }
+        return new ArrayList<>();
+    }
+    public static String toListString(List<String> list){
+        String result="";
+        for (String s : list) {
+            result=s+",";
+        }
+        return result;
+    }
+}

+ 16 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/TokenData.java

@@ -0,0 +1,16 @@
+package edu.travel.tenant.utils;
+
+import edu.travel.entity.EduTenantPO;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+public class TokenData {
+
+    /**
+     *  获取用户ID
+     * @return {@link String }
+     */
+    public static String getUserId(){
+        EduTenantPO principal =(EduTenantPO) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        return principal.getId().toString();
+    }
+}

+ 161 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/utils/TreeUtils.java

@@ -0,0 +1,161 @@
+package edu.travel.tenant.utils;
+
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+/**
+ * 通用树形结构构建工具类
+ *
+ * <p><strong>功能特性:</strong></p>
+ * <ul>
+ *   <li>支持任意 Java 对象(实体类/DTO/VO)</li>
+ *   <li>自动检测循环依赖(死循环)</li>
+ *   <li>零依赖(无需继承接口或父类)</li>
+ *   <li>编译期类型安全检查</li>
+ * </ul>
+ *
+ * <p><strong>使用示例:</strong></p>
+ * <pre>{@code
+ * List<Department> tree = TreeUtils.buildTree(
+ *     departments,
+ *     Department::getId,
+ *     Department::getParentId,
+ *     Department::setChildren
+ * );
+ * }</pre>
+ */
+public class TreeUtils {
+
+    /**
+     * 构建树形结构的核心方法
+     *
+     * @param nodes          待处理的节点列表(必须包含所有节点)
+     * @param idGetter       节点ID的获取方法(方法引用,如:User::getId)
+     * @param pidGetter      父节点ID的获取方法(方法引用,如:User::getParentId)
+     * @param childrenSetter 子节点列表的设置方法(如:(node, children) -> node.setChildren(children))
+     * @param <T>            节点类型(如:User.class)
+     * @param <ID>           ID 的类型(需正确实现 equals 和 hashCode)
+     * @return 树形结构的根节点列表
+     *
+     * @throws IllegalArgumentException 如果存在以下情况:
+     *                                  <ul>
+     *                                    <li>节点列表为null</li>
+     *                                    <li>存在重复ID</li>
+     *                                    <li>ID字段为null</li>
+     *                                  </ul>
+     * @throws IllegalStateException    如果检测到循环依赖
+     */
+    public static <T, ID> List<T> buildTree(List<T> nodes,
+                                            Function<T, ID> idGetter,
+                                            Function<T, ID> pidGetter,
+                                            BiConsumer<T, List<T>> childrenSetter) {
+        // 防御性拷贝,避免修改原始数据
+        List<T> copyNodes = new ArrayList<>(Optional.ofNullable(nodes).orElseGet(ArrayList::new));
+
+        //========== 数据校验 ==========//
+        validateNodes(copyNodes, idGetter);
+
+        //========== 初始化数据结构 ==========//
+        Map<ID, T> nodeMap = new HashMap<>(copyNodes.size());
+        List<T> rootNodes = new ArrayList<>();
+
+        // 构建 id -> node 映射表
+        copyNodes.forEach(node -> nodeMap.put(idGetter.apply(node), node));
+
+        //========== 构建父子关系 ==========//
+        for (T node : copyNodes) {
+            ID currentId = idGetter.apply(node);
+            ID parentId = pidGetter.apply(node);
+
+            // 判断根节点条件(父ID为空/等于自身/不存在于Map中)
+            if (isRootNode(parentId, currentId, nodeMap)) {
+                rootNodes.add(node);
+                continue;
+            }
+
+            // 获取父节点并建立关联
+            T parent = nodeMap.get(parentId);
+            if (parent != null) {
+                linkParentAndChild(parent, node, childrenSetter);
+                checkCircularDependency(parent, currentId, idGetter, pidGetter, nodeMap);
+            }
+        }
+
+        return rootNodes;
+    }
+
+    //========== 私有方法 ==========//
+
+    /**
+     * 数据校验
+     */
+    private static <T, ID> void validateNodes(List<T> nodes, Function<T, ID> idGetter) {
+        if (nodes == null) {
+            throw new IllegalArgumentException("节点列表不能为null");
+        }
+
+        Set<ID> idSet = new HashSet<>();
+        for (T node : nodes) {
+            ID id = idGetter.apply(node);
+            if (id == null) {
+                throw new IllegalArgumentException("节点存在空ID: " + node);
+            }
+            if (idSet.contains(id)) {
+                throw new IllegalArgumentException("存在重复ID: " + id);
+            }
+            idSet.add(id);
+        }
+    }
+
+    /**
+     * 判断是否为根节点
+     */
+    private static <ID> boolean isRootNode(ID parentId, ID currentId, Map<ID, ?> nodeMap) {
+        return parentId == null
+                || parentId.equals(currentId)
+                || !nodeMap.containsKey(parentId);
+    }
+
+    /**
+     * 建立父子关联关系
+     */
+    private static <T> void linkParentAndChild(T parent,
+                                               T child,
+                                               BiConsumer<T, List<T>> childrenSetter) {
+        List<T> children = new ArrayList<>();
+        childrenSetter.accept(parent, children);
+        children.add(child);
+    }
+
+    /**
+     * 循环依赖检测(核心安全机制)
+     */
+    private static <T, ID> void checkCircularDependency(T parent,
+                                                        ID childId,
+                                                        Function<T, ID> idGetter,
+                                                        Function<T, ID> pidGetter,
+                                                        Map<ID, T> nodeMap) {
+        Set<ID> visited = new HashSet<>();
+        T current = parent;
+
+        while (current != null) {
+            ID currentParentId = pidGetter.apply(current);
+            if (currentParentId == null) break;
+
+            // 发现直接循环(A→B→A)
+            if (currentParentId.equals(childId)) {
+                throw new IllegalStateException("检测到循环依赖:节点 "
+                        + idGetter.apply(current) + " → " + childId);
+            }
+
+            // 发现间接循环(A→B→C→A)
+            if (visited.contains(currentParentId)) {
+                throw new IllegalStateException("检测到循环依赖路径:" + visited);
+            }
+
+            visited.add(currentParentId);
+            current = nodeMap.get(currentParentId);
+        }
+    }
+}

+ 43 - 12
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/ShopBannerController.java

@@ -10,11 +10,7 @@ import edu.travel.tenant.service.ShopBannerService;
 import edu.travel.web.BaseController;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -45,17 +41,35 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
     public RPCBaseResponse<List<BannerVo>> getBanner(BannerDto banner){
         return success(shopBannerService.getBanner(banner));
     }
-
+    /**
+     * 新增轮播图(通过上传返回id自动填充)
+     */
+    @PostMapping("/saveBannerCountry")
+    public RPCBaseResponse<BannerVo> saveBannerCountry (BannerDto banner){
+        return shopBannerService.saveBannerCountry(banner);
+    }
+    /**
+     * 更新轮播图信息(通过上传返回id自动填充)
+     */
+    @PostMapping("/updateBannerCountry")
+    public RPCBaseResponse<BannerVo> updateBannerCountry(BannerDto banner){
+        return shopBannerService.updateBannerCountry(banner);
+    }
     /**
      * 上传banner图片
      * @param
      * @return
      */
-    @GetMapping("/uploadBannerImage")
-    public ResponseEntity<RPCBaseResponse<String>> uploadBannerImage(@RequestBody MultipartFile file){
-        return ResponseEntity.ok(shopBannerService.uploadBannerImage(file));
+    @PostMapping("/uploadBannerImage")
+    public RPCBaseResponse<String> uploadBannerImage(MultipartFile file){
+        return shopBannerService.uploadBannerImage(file);
     }
 
+    /**
+     * 根据id获取banner
+     * @param id
+     * @return
+     */
     @Override
     @GetMapping("/getFormId")
     public RPCBaseResponse<BannerVo> getFormId(String id) {
@@ -65,8 +79,13 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
+    /**
+     * 更新banner
+     * @param entity
+     * @return
+     */
     @Override
-    @GetMapping("/updateFormTarget")
+    @GetMapping("/updateTargetFormId")
     public RPCBaseResponse<BannerVo> updateTargetFormId(@RequestBody BannerDto entity) {
         ShopBanner shopBanner = new ShopBanner();
         BeanUtils.copyProperties(entity, shopBanner);
@@ -76,6 +95,11 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
+    /**
+     * 新增banner
+     * @param entity
+     * @return
+     */
     @Override
     @GetMapping("/saveFormTarget")
     public RPCBaseResponse<BannerVo> saveFormTarget(BannerDto entity) {
@@ -87,7 +111,11 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
-
+    /**
+     * 删除轮播图
+     * @param ids
+     * @return
+     */
     @Override
     @GetMapping("/deleteFormTarget")
     public RPCBaseResponse<BannerVo> deleteTargetFormId(List<String> ids) {
@@ -97,6 +125,10 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
+    /**
+     * 获取所有轮播图
+     * @return
+     */
     @Override
     @GetMapping("/getAllForm")
     public RPCBaseResponse<List<BannerVo>> getAllForm() {
@@ -105,5 +137,4 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         BeanUtils.copyProperties(countryRPCBaseResponse, baseCountryVoRPCBaseResponse);
         return baseCountryVoRPCBaseResponse;
     }
-
 }

+ 75 - 1
edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/web/UploadController.java

@@ -7,6 +7,7 @@ import com.obs.services.model.*;
 import edu.travel.remote.upload.UploadRemoteController;
 import edu.travel.remote.upload.dto.EduFileBlobDTO;
 import edu.travel.remote.upload.dto.EduFileDTO;
+import edu.travel.remote.upload.vo.EduFileVo;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.upload.config.MD5Calculator;
 import edu.travel.upload.entity.EduFile;
@@ -14,6 +15,7 @@ import edu.travel.upload.entity.EduFileBlob;
 import edu.travel.upload.obs.property.ObsProperties;
 import edu.travel.upload.service.EduFileBlobService;
 import edu.travel.upload.service.EduFileService;
+import edu.travel.web.BaseController;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,7 +37,7 @@ import java.util.concurrent.ThreadPoolExecutor;
 
 @RestController
 @RequestMapping("/upload")
-public class UploadController implements UploadRemoteController {
+public class UploadController extends BaseController<EduFile> implements UploadRemoteController {
     @Autowired
     private EduFileService eduFileService;
     @Autowired
@@ -150,4 +152,76 @@ public class UploadController implements UploadRemoteController {
         }
         return RPCBaseResponse.error();
     }
+
+    /**
+     * 通过id上传文件
+     * @param id
+     * @return
+     */
+    @Override
+    @GetMapping("/getFormId")
+    public RPCBaseResponse<EduFileVo> getFormId(@RequestParam("id")String id) {
+        RPCBaseResponse<EduFile> eduFileRPCBaseResponse = super.getId(id);
+        RPCBaseResponse<EduFileVo> eduFileVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(eduFileRPCBaseResponse, eduFileVoRPCBaseResponse);
+        return eduFileVoRPCBaseResponse;
+    }
+
+    /**
+     * 更新文件
+     * @param entity
+     * @return
+     */
+    @Override
+    @GetMapping("/updateTargetFormId")
+    public RPCBaseResponse<EduFileVo> updateTargetFormId(@RequestBody EduFileDTO entity) {
+        EduFile eduFile = new EduFile();
+        BeanUtils.copyProperties(entity, eduFile);
+        RPCBaseResponse<EduFile> eduFileRPCBaseResponse = super.updateTargetById(eduFile);
+        RPCBaseResponse<EduFileVo> eduFileVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(eduFileRPCBaseResponse, eduFileVoRPCBaseResponse);
+        return eduFileVoRPCBaseResponse;
+    }
+
+    /**
+     * 新增文件
+     * @param entity
+     * @return
+     */
+    @Override
+    @GetMapping("/saveFormTarget")
+    public RPCBaseResponse<EduFileVo> saveFormTarget(@RequestBody EduFileDTO entity) {
+        EduFile eduFile = new EduFile();
+        BeanUtils.copyProperties(entity, eduFile);
+        RPCBaseResponse<EduFile> eduFileRPCBaseResponse = super.saveTarget(eduFile);
+        RPCBaseResponse<EduFileVo> eduFileVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(eduFileRPCBaseResponse, eduFileVoRPCBaseResponse);
+        return eduFileVoRPCBaseResponse;
+    }
+
+    /**
+     * 删除文件
+     * @param ids
+     * @return
+     */
+    @Override
+    @GetMapping("/deleteTargetFormId")
+    public RPCBaseResponse<EduFileVo> deleteTargetFormId(@RequestBody List<String> ids) {
+        RPCBaseResponse<EduFile> eduFileRPCBaseResponse = super.deleteTargetById(ids);
+        RPCBaseResponse<EduFileVo> eduFileVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(eduFileRPCBaseResponse, eduFileVoRPCBaseResponse);
+        return eduFileVoRPCBaseResponse;
+    }
+
+    /**
+     * 获取全部文件
+     * @return
+     */
+    @Override
+    public RPCBaseResponse<List<EduFileVo>> getAllForm() {
+        RPCBaseResponse<List<EduFile>> eduFileRPCBaseResponse = super.listAll();
+        RPCBaseResponse<List<EduFileVo>> eduFileVoRPCBaseResponse = new RPCBaseResponse<>();
+        BeanUtils.copyProperties(eduFileRPCBaseResponse, eduFileVoRPCBaseResponse);
+        return eduFileVoRPCBaseResponse;
+    }
 }

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

@@ -1,5 +1,5 @@
 server:
-  port: 10005
+  port: 10010
 spring:
   application:
     name: upload-@env@