Browse Source

Merge remote-tracking branch 'origin/master'

weifanli 2 years ago
parent
commit
dcea8a194f
25 changed files with 958 additions and 617 deletions
  1. 8 6
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java
  2. 39 24
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UploadFileController.java
  3. 6 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupDao.java
  4. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherFreeTimeDao.java
  5. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImGroupResultDto.java
  6. 54 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImGroupSearchDto.java
  7. 63 81
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java
  8. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java
  9. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  10. 20 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java
  11. 126 107
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UploadFileService.java
  12. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  13. 11 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  14. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  15. 21 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LessonGroupVo.java
  16. 32 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  17. 15 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherFreeTimeMapper.xml
  18. 15 6
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImGroupController.java
  19. 2 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java
  20. 7 7
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java
  21. 42 0
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/entity/UploadSign.java
  22. 42 28
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePlugin.java
  23. 35 28
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePluginContext.java
  24. 187 138
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/AliyunOssStoragePlugin.java
  25. 192 146
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/KS3StoragePlugin.java

+ 8 - 6
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java

@@ -3,14 +3,18 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.utils.validator.ValidationKit;
 import io.swagger.annotations.*;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.util.List;
 import java.util.Map;
 
@@ -39,16 +43,14 @@ public class ImGroupController extends BaseController {
         return succeed(imGroupService.getById(groupId));
     }
 
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "search", dataType = "String", value = "根据群名称、编号、简介模糊查询"),
-    })
     @ApiOperation("群列表")
     @PostMapping(value = "/queryAll")
     @PreAuthorize("@pcs.hasPermissions('imGroup/queryAll')")
-    public HttpResponseResult<List<ImGroup>> queryAll(@RequestBody Map<String,Object> params) throws Exception {
+    public HttpResponseResult<List<ImGroup>> queryAll(@Valid @RequestBody ImGroupSearchDto imGroupSearchDto, BindingResult bindingResult) throws Exception {
+        ValidationKit.ignoreFields(bindingResult,"createUserId");
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        params.put("userId",sysUser.getId());
-        return succeed(imGroupService.queryAll(params));
+        imGroupSearchDto.setUserId(sysUser.getId());
+        return succeed(imGroupService.queryAll(imGroupSearchDto));
     }
 }
 

+ 39 - 24
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UploadFileController.java

@@ -1,13 +1,16 @@
 package com.yonge.cooleshow.admin.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiParam;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
+import io.swagger.annotations.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -17,32 +20,44 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.UploadReturnBean;
 import com.yonge.toolset.utils.upload.UploadUtil;
 
-/** 
+/**
  * 上传控制层
  */
 @RestController
 @Api(tags = "文件上传服务")
 public class UploadFileController extends BaseController {
 
-	private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
-
-	@Autowired
-	private UploadFileService uploadFileService;
-
-	@PostMapping(value = "uploadFile")
-	public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
-		try {
-			if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
-				UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
-				bean.setName(file.getOriginalFilename());
-				if (bean.isStatus()) {
-					return succeed(bean);
-				}
-				return failed(bean.getMessage());
-			}
-		} catch (Exception e) {
-			LOGGER.error("上传失败", e);
-		}
-		return failed("上传失败");
-	}
+    private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
+
+    @Autowired
+    private UploadFileService uploadFileService;
+
+    @PostMapping(value = "uploadFile")
+    public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
+        try {
+            if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
+                UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
+                bean.setName(file.getOriginalFilename());
+                if (bean.isStatus()) {
+                    return succeed(bean);
+                }
+                return failed(bean.getMessage());
+            }
+        } catch (Exception e) {
+            LOGGER.error("上传失败", e);
+        }
+        return failed("上传失败");
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+            @ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+                    "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+            @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+    })
+    @ApiOperation("获取上传文件签名")
+    @PostMapping("/getUploadSign")
+    public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
+        return succeed(uploadFileService.getUploadSign(uploadSign));
+    }
 }

+ 6 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupDao.java

@@ -1,11 +1,12 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * 即时通讯群组(ImGroup)表数据库访问层
@@ -15,6 +16,9 @@ import java.util.Map;
  */
 public interface ImGroupDao extends BaseMapper<ImGroup> {
 
-    List<ImGroup> findAll(Map<String, Object> params);
+    List<ImGroup> findAll(@Param("imGroupDto") ImGroupSearchDto imGroupSearchDto);
+
+    //获取指定用户的群聊列表
+    List<ImGroupResultDto> queryTeacherFun(@Param("imGroupDto") ImGroupSearchDto imGroupSearchDto);
 }
 

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherFreeTimeDao.java

@@ -55,5 +55,8 @@ public interface TeacherFreeTimeDao extends BaseMapper<TeacherFreeTime> {
 
     //查询老师声部默认售价
     TeacherSubjectPrice selectSubjectPrice(@Param("teacherId") Long teacherId, @Param("subjectId") Long subjectId);
+
+    //查询老师所有声部配置
+    List<TeacherSubjectPrice> selectPriceByTeacherId(Long teacherId);
 }
 

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImGroupResultDto.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import io.swagger.annotations.ApiModelProperty;
+
+public class ImGroupResultDto extends ImGroup {
+    @ApiModelProperty(value = "是否已经在当前群组")
+    private boolean existFlag;
+
+    @ApiModelProperty(value = "是否有待审核的申请")
+    private boolean hasWaitAuditFlag;
+
+    public boolean isExistFlag() {
+        return existFlag;
+    }
+
+    public void setExistFlag(boolean existFlag) {
+        this.existFlag = existFlag;
+    }
+
+    public boolean isHasWaitAuditFlag() {
+        return hasWaitAuditFlag;
+    }
+
+    public void setHasWaitAuditFlag(boolean hasWaitAuditFlag) {
+        this.hasWaitAuditFlag = hasWaitAuditFlag;
+    }
+}
+

+ 54 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImGroupSearchDto.java

@@ -0,0 +1,54 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+public class ImGroupSearchDto {
+    @ApiModelProperty(value = "群类型 FAN 粉丝群,COURSE 课程群")
+    private String type = "FAN";
+
+    @ApiModelProperty(value = "根据群名称、编号、简介模糊查询")
+    private String search;
+
+    @ApiModelProperty(value = "群成员")
+    private Long userId;
+
+    @NotNull(message = "请指定群管理员")
+    @ApiModelProperty(value = "创建人(群创建者)")
+    private Long createUserId;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Long getCreateUserId() {
+        return createUserId;
+    }
+
+    public void setCreateUserId(Long createUserId) {
+        this.createUserId = createUserId;
+    }
+
+    public String getSearch() {
+        return search;
+    }
+
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+}
+

+ 63 - 81
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java

@@ -13,6 +13,8 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 视频课基本信息表
@@ -50,7 +52,7 @@ public class VideoLessonGroup extends BaseEntity {
     @TableField("lesson_price_")
     @ApiModelProperty(value = "课程价格", required = true)
     @NotNull(message = "课程价格不能为空;", groups = {AddGroup.class, UpdateGroup.class})
-    private Integer lessonPrice;  //课程价格
+    private BigDecimal lessonPrice;  //课程价格
 
     @TableField("lesson_cover_url_")
     @ApiModelProperty(value = "课程封面图片URL", required = true)
@@ -101,25 +103,28 @@ public class VideoLessonGroup extends BaseEntity {
     @ApiModelProperty(value = "审批人id")
     private Integer auditId;
 
-    public String getAuditName() {
-        return auditName;
+    public Long getId() {
+        return id;
     }
 
-    public void setAuditName(String auditName) {
-        this.auditName = auditName;
+    public void setId(Long id) {
+        this.id = id;
     }
 
-    public Integer getAuditId() {
-        return auditId;
+    public String getLessonName() {
+        return lessonName;
     }
 
-    public void setAuditId(Integer auditId) {
-        this.auditId = auditId;
+    public void setLessonName(String lessonName) {
+        this.lessonName = lessonName;
     }
 
-    public VideoLessonGroup setId(Long id) {
-        this.id = id;
-        return this;
+    public String getLessonSubject() {
+        return lessonSubject;
+    }
+
+    public void setLessonSubject(String lessonSubject) {
+        this.lessonSubject = lessonSubject;
     }
 
     public String getLessonSubjectName() {
@@ -130,107 +135,76 @@ public class VideoLessonGroup extends BaseEntity {
         this.lessonSubjectName = lessonSubjectName;
     }
 
-    public Long getId() {
-        return this.id;
-    }
-
-    public VideoLessonGroup setLessonName(String lessonName) {
-        this.lessonName = lessonName;
-        return this;
-    }
-
-    public String getLessonName() {
-        return this.lessonName;
-    }
-
-    public VideoLessonGroup setLessonSubject(String lessonSubject) {
-        this.lessonSubject = lessonSubject;
-        return this;
-    }
-
-    public String getLessonSubject() {
-        return this.lessonSubject;
+    public String getLessonDesc() {
+        return lessonDesc;
     }
 
-    public VideoLessonGroup setLessonDesc(String lessonDesc) {
+    public void setLessonDesc(String lessonDesc) {
         this.lessonDesc = lessonDesc;
-        return this;
     }
 
-    public String getLessonDesc() {
-        return this.lessonDesc;
+    public BigDecimal getLessonPrice() {
+        return lessonPrice;
     }
 
-    public VideoLessonGroup setLessonPrice(Integer lessonPrice) {
+    public void setLessonPrice(BigDecimal lessonPrice) {
         this.lessonPrice = lessonPrice;
-        return this;
     }
 
-    public Integer getLessonPrice() {
-        return this.lessonPrice;
+    public String getLessonCoverUrl() {
+        return lessonCoverUrl;
     }
 
-    public VideoLessonGroup setLessonCoverUrl(String lessonCoverUrl) {
+    public void setLessonCoverUrl(String lessonCoverUrl) {
         this.lessonCoverUrl = lessonCoverUrl;
-        return this;
     }
 
-    public String getLessonCoverUrl() {
-        return this.lessonCoverUrl;
+    public Long getTeacherId() {
+        return teacherId;
     }
 
-    public VideoLessonGroup setTeacherId(Long teacherId) {
+    public void setTeacherId(Long teacherId) {
         this.teacherId = teacherId;
-        return this;
     }
 
-    public Long getTeacherId() {
-        return this.teacherId;
+    public Integer getLessonCount() {
+        return lessonCount;
     }
 
-    public VideoLessonGroup setLessonCount(Integer lessonCount) {
+    public void setLessonCount(Integer lessonCount) {
         this.lessonCount = lessonCount;
-        return this;
     }
 
-    public Integer getLessonCount() {
-        return this.lessonCount;
+    public Integer getSortNumber() {
+        return sortNumber;
     }
 
-    public VideoLessonGroup setSortNumber(Integer sortNumber) {
+    public void setSortNumber(Integer sortNumber) {
         this.sortNumber = sortNumber;
-        return this;
     }
 
-    public Integer getSortNumber() {
-        return this.sortNumber;
+    public String getLessonTag() {
+        return lessonTag;
     }
 
-    public VideoLessonGroup setLessonTag(String lessonTag) {
+    public void setLessonTag(String lessonTag) {
         this.lessonTag = lessonTag;
-        return this;
     }
 
-    public String getLessonTag() {
-        return this.lessonTag;
+    public Integer getTopFlag() {
+        return topFlag;
     }
 
-    public VideoLessonGroup setTopFlag(Integer topFlag) {
+    public void setTopFlag(Integer topFlag) {
         this.topFlag = topFlag;
-        return this;
     }
 
-    public Integer getTopFlag() {
-        return this.topFlag;
+    public Integer getHotFlag() {
+        return hotFlag;
     }
 
-    public VideoLessonGroup setHotFlag(Integer hotFlag) {
+    public void setHotFlag(Integer hotFlag) {
         this.hotFlag = hotFlag;
-        return this;
-    }
-
-    public Integer getHotFlag() {
-        return this.hotFlag;
     }
 
     public AuthStatusEnum getAuditStatus() {
@@ -241,27 +215,35 @@ public class VideoLessonGroup extends BaseEntity {
         this.auditStatus = auditStatus;
     }
 
-    public VideoLessonGroup setCreateTime(java.util.Date createTime) {
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
         this.createTime = createTime;
-        return this;
     }
 
-    public java.util.Date getCreateTime() {
-        return this.createTime;
+    public Date getUpdateTime() {
+        return updateTime;
     }
 
-    public VideoLessonGroup setUpdateTime(java.util.Date updateTime) {
+    public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
-        return this;
     }
 
-    public java.util.Date getUpdateTime() {
-        return this.updateTime;
+    public String getAuditName() {
+        return auditName;
     }
 
-    @Override
-    public String toString() {
-        return ToStringBuilder.reflectionToString(this);
+    public void setAuditName(String auditName) {
+        this.auditName = auditName;
     }
 
+    public Integer getAuditId() {
+        return auditId;
+    }
+
+    public void setAuditId(Integer auditId) {
+        this.auditId = auditId;
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java

@@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull;
  * @version v1.0
  **/
 @ApiModel(value = "video_lesson_group_detail-视频课明细表")
-public class VideoLessonGroupDetail extends BaseEntity {
+public class 	VideoLessonGroupDetail extends BaseEntity {
 
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -187,6 +187,6 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     StudentHomePage queryLiveAndVideo(Long studentId);
 
-    TeacherSubjectPrice teacherSubjectPrice(Long teacherId, Long subjectId);
+    List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId);
 }
 

+ 20 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java

@@ -2,9 +2,11 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+
 import java.util.List;
-import java.util.Map;
 
 /**
  * 即时通讯群组(ImGroup)表服务接口
@@ -49,6 +51,22 @@ public interface ImGroupService extends IService<ImGroup> {
     */
     void syncGroupMemberNum(String groupId) throws Exception;
 
-    List<ImGroup> queryAll(Map<String, Object> params);
+    /**
+    * @description: 获取群列表
+     * @param imGroupSearchDto
+    * @return java.util.List<com.yonge.cooleshow.biz.dal.entity.ImGroup>
+    * @author zx
+    * @date 2022/4/27 10:23
+    */
+    List<ImGroup> queryAll(ImGroupSearchDto imGroupSearchDto);
+
+    /**
+    * @description: 获取指定用户创建的群聊
+     * @param imGroupSearchDto
+    * @return java.util.List<com.yonge.cooleshow.biz.dal.entity.ImGroupResultDto>
+    * @author zx
+    * @date 2022/4/27 10:56
+    */
+    List<ImGroupResultDto> queryTeacherFun(ImGroupSearchDto imGroupSearchDto);
 }
 

+ 126 - 107
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UploadFileService.java

@@ -7,6 +7,8 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -21,116 +23,133 @@ import com.yonge.toolset.thirdparty.storage.StoragePluginContext;
 import com.yonge.toolset.thirdparty.storage.provider.KS3StoragePlugin;
 import com.yonge.toolset.utils.upload.UploadUtil;
 
-/** 
+/**
  * 上传工具服务层实现类
  */
 @Service
 public class UploadFileService {
 
-	@Autowired
-	private StoragePluginContext storagePluginContext;
-
-	/** 最大上传大小,单位kb */
-	@Value("${common.upload.maxSize:153600}")
-	private int maxSize;
-
-	/** 支持的扩展名 */
-	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf,psd,eps,rar,zip}")
-	private String supportExtensions;
-
-	/** 文件根目录 */
-	@Value("/var/tmp/")
-	private String fileRoot;
-
-	public UploadReturnBean uploadFile(InputStream in, String ext) {
-		UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
-		String fileName = UploadUtil.getFileName(ext);
-
-		String supportType = supportExtensions;
-		if (!UploadUtil.validateImgFile(ext, supportType)) {
-			uploadReturn.setMessage("上传图片格式错误,目前只支持" + supportType);
-			return uploadReturn;
-		}
-
-		String root = fileRoot;
-		if (StringUtils.isBlank(root)) {
-			uploadReturn.setMessage("上传临时目录没有配置");
-			return uploadReturn;
-		}
-
-		String staticFloder = "";
-
-		String folder = UploadUtil.getFileFloder();
-		String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
-		File file = uploadFile(in, filePath, fileName);
-		if (maxSize > 0 && maxSize < file.length() / 1024) {
-			FileUtils.deleteQuietly(file);
-			uploadReturn.setMessage("超出允许的大小(" + (maxSize / 1024) + "M)限制");
-			return uploadReturn;
-		}
-
-		//String url = storagePlugin.uploadFile(staticFloder + folder, file);
-		String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME,staticFloder + folder, file);
-
-		FileUtils.deleteQuietly(file);
-		uploadReturn.setStatus(true);
-		uploadReturn.setUrl(url);
-		return uploadReturn;
-	}
-
-
-	@Async
-	public UploadReturnBean uploadImHistoryMsgFile(File msgFile) throws FileNotFoundException {
-		InputStream in = new FileInputStream(msgFile);
-		UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
-		String fileName = UploadUtil.getFileName(msgFile.getName());
-
-		String root = fileRoot + "im_history_msg/";
-		if (StringUtils.isBlank(root)) {
-			uploadReturn.setMessage("上传临时目录没有配置");
-			return uploadReturn;
-		}
-
-		String staticFloder = "";
-		String folder = UploadUtil.getFileFloder();
-		String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
-		File file = uploadFile(in, filePath, fileName);
-		String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME,staticFloder + folder, file);
-
-		FileUtils.deleteQuietly(file);
-
-		uploadReturn.setStatus(true);
-		uploadReturn.setUrl(url);
-		return uploadReturn;
-	}
-
-	public void setMaxSize(int maxSize) {
-		this.maxSize = maxSize;
-	}
-
-	/**
-	 * 上传文件的工具方法
-	 * @param in
-	 * @param path
-	 * @return
-	 */
-	private File uploadFile(InputStream inputStream, String filePath, String fileName) {
-		File file = new File(filePath + "/" + fileName);
-		try {
-			if (!file.getParentFile().exists()) {
-				file.getParentFile().mkdirs();
-			}
-			FileOutputStream fos = new FileOutputStream(file);
-			IOUtils.copy(inputStream, fos);
-			if (!file.exists() || file.length() == 0) {
-				throw new BizException("图片上传出现错误,请重新上传");
-			}
-		} catch (IOException e) {
-			throw new BizException("图片上传失败", e);
-		} finally {
-			IOUtils.closeQuietly(inputStream);
-		}
-		return file;
-	}
-
+    @Autowired
+    private StoragePluginContext storagePluginContext;
+
+    /**
+     * 最大上传大小,单位kb
+     */
+    @Value("${common.upload.maxSize:153600}")
+    private int maxSize;
+
+    /**
+     * 支持的扩展名
+     */
+    @Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf,psd,eps,rar,zip}")
+    private String supportExtensions;
+
+    /**
+     * 文件根目录
+     */
+    @Value("/var/tmp/")
+    private String fileRoot;
+
+    public UploadReturnBean uploadFile(InputStream in, String ext) {
+        UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
+        String fileName = UploadUtil.getFileName(ext);
+
+        String supportType = supportExtensions;
+        if (!UploadUtil.validateImgFile(ext, supportType)) {
+            uploadReturn.setMessage("上传图片格式错误,目前只支持" + supportType);
+            return uploadReturn;
+        }
+
+        String root = fileRoot;
+        if (StringUtils.isBlank(root)) {
+            uploadReturn.setMessage("上传临时目录没有配置");
+            return uploadReturn;
+        }
+
+        String staticFloder = "";
+
+        String folder = UploadUtil.getFileFloder();
+        String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
+        File file = uploadFile(in, filePath, fileName);
+        if (maxSize > 0 && maxSize < file.length() / 1024) {
+            FileUtils.deleteQuietly(file);
+            uploadReturn.setMessage("超出允许的大小(" + (maxSize / 1024) + "M)限制");
+            return uploadReturn;
+        }
+
+        //String url = storagePlugin.uploadFile(staticFloder + folder, file);
+        String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, staticFloder + folder, file);
+
+        FileUtils.deleteQuietly(file);
+        uploadReturn.setStatus(true);
+        uploadReturn.setUrl(url);
+        return uploadReturn;
+    }
+
+
+    @Async
+    public UploadReturnBean uploadImHistoryMsgFile(File msgFile) throws FileNotFoundException {
+        InputStream in = new FileInputStream(msgFile);
+        UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
+        String fileName = UploadUtil.getFileName(msgFile.getName());
+
+        String root = fileRoot + "im_history_msg/";
+        if (StringUtils.isBlank(root)) {
+            uploadReturn.setMessage("上传临时目录没有配置");
+            return uploadReturn;
+        }
+
+        String staticFloder = "";
+        String folder = UploadUtil.getFileFloder();
+        String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
+        File file = uploadFile(in, filePath, fileName);
+        String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, staticFloder + folder, file);
+
+        FileUtils.deleteQuietly(file);
+
+        uploadReturn.setStatus(true);
+        uploadReturn.setUrl(url);
+        return uploadReturn;
+    }
+
+    public void setMaxSize(int maxSize) {
+        this.maxSize = maxSize;
+    }
+
+    /**
+     * 上传文件的工具方法
+     *
+     * @param inputStream
+     * @param filePath
+     * @param fileName
+     * @return
+     */
+    private File uploadFile(InputStream inputStream, String filePath, String fileName) {
+        File file = new File(filePath + "/" + fileName);
+        try {
+            if (!file.getParentFile().exists()) {
+                file.getParentFile().mkdirs();
+            }
+            FileOutputStream fos = new FileOutputStream(file);
+            IOUtils.copy(inputStream, fos);
+            if (!file.exists() || file.length() == 0) {
+                throw new BizException("图片上传出现错误,请重新上传");
+            }
+        } catch (IOException e) {
+            throw new BizException("图片上传失败", e);
+        } finally {
+            IOUtils.closeQuietly(inputStream);
+        }
+        return file;
+    }
+
+    /**
+     * 获取上传文件签名
+     *
+     * @param uploadSign
+     * @return
+     */
+    public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+        return storagePluginContext.getUploadSign(KS3StoragePlugin.PLUGIN_NAME, uploadSign);
+    }
 }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -983,7 +983,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/4/26
      */
-    public TeacherSubjectPrice teacherSubjectPrice(Long teacherId,Long subjectId){
-        return teacherFreeTimeDao.selectSubjectPrice(teacherId,subjectId);
+    public List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId){
+        return teacherFreeTimeDao.selectPriceByTeacherId(teacherId);
     }
 }

+ 11 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java

@@ -1,24 +1,21 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
 import com.yonge.cooleshow.biz.dal.dao.*;
-import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
-import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
-import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.common.exception.BizException;
-import com.yonge.cooleshow.common.page.PageInfo;
 import io.rong.models.Result;
 import io.rong.models.group.GroupMember;
 import io.rong.models.group.GroupModel;
@@ -30,7 +27,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * 即时通讯群组(ImGroup)表服务实现类
@@ -175,8 +171,15 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     }
 
     @Override
-    public List<ImGroup> queryAll(Map<String, Object> params) {
-        return baseMapper.findAll(params);
+    public List<ImGroup> queryAll(ImGroupSearchDto imGroupSearchDto) {
+        return baseMapper.findAll(imGroupSearchDto);
+    }
+
+    @Override
+    public List<ImGroupResultDto> queryTeacherFun(ImGroupSearchDto imGroupSearchDto) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        imGroupSearchDto.setUserId(sysUser.getId());
+        return baseMapper.queryTeacherFun(imGroupSearchDto);
     }
 }
 

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java

@@ -95,16 +95,16 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         purchaseRecord.setOrderNo(orderNo);
         purchaseRecord.setStudentId(studentId);
         purchaseRecord.setOrderStatus(0);
-        purchaseRecord.setOriginalPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//原价
-        purchaseRecord.setExpectPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//预计价格
+        purchaseRecord.setOriginalPrice(lessonGroup.getLessonPrice());//原价
+        purchaseRecord.setExpectPrice(lessonGroup.getLessonPrice());//预计价格
         videoLessonPurchaseRecordDao.insert(purchaseRecord);
 
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         orderCreateRes.setRes(true);
         orderCreateRes.setMerchId(lessonGroup.getTeacherId());
         orderCreateRes.setBizId(orderReqInfo.getCouponId());
-        orderCreateRes.setOriginalPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//原价
-        orderCreateRes.setExpectPrice(BigDecimal.valueOf(lessonGroup.getLessonPrice()));//预计价格
+        orderCreateRes.setOriginalPrice(lessonGroup.getLessonPrice());//原价
+        orderCreateRes.setExpectPrice(lessonGroup.getLessonPrice());//预计价格
         orderCreateRes.setActualPrice(purchaseRecord.getPayMoney());//实际价格
         orderCreateRes.setGoodNum(lessonGroup.getLessonCount());
         orderCreateRes.setGoodType(GoodTypeEnum.VIDEO);

+ 21 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LessonGroupVo.java

@@ -4,6 +4,8 @@ import com.yonge.cooleshow.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.math.BigDecimal;
+
 /**
  * @Author: cy
  * @Date: 2022/4/11
@@ -26,7 +28,7 @@ public class LessonGroupVo extends BaseEntity {
     private String lessonDesc;
 
     @ApiModelProperty(value = "课程价格")
-    private Integer lessonPrice;
+    private BigDecimal lessonPrice;
 
     @ApiModelProperty(value = "课程封面")
     private String lessonCoverUrl;
@@ -46,22 +48,6 @@ public class LessonGroupVo extends BaseEntity {
     @ApiModelProperty("购买人数")
     private Integer countStudent;
 
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public void setAvatar(String avatar) {
-        this.avatar = avatar;
-    }
-
     public Long getId() {
         return id;
     }
@@ -102,11 +88,11 @@ public class LessonGroupVo extends BaseEntity {
         this.lessonDesc = lessonDesc;
     }
 
-    public Integer getLessonPrice() {
+    public BigDecimal getLessonPrice() {
         return lessonPrice;
     }
 
-    public void setLessonPrice(Integer lessonPrice) {
+    public void setLessonPrice(BigDecimal lessonPrice) {
         this.lessonPrice = lessonPrice;
     }
 
@@ -134,6 +120,22 @@ public class LessonGroupVo extends BaseEntity {
         this.teacherId = teacherId;
     }
 
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
     public Integer getCountStudent() {
         return countStudent;
     }

+ 32 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMapper.xml

@@ -38,14 +38,41 @@
         SELECT ig.* FROM im_group ig
         LEFT JOIN im_group_member igm ON igm.group_id_ = ig.id_
         <where>
-            <if test="userId != null">
-                AND igm.user_id_ = #{userId}
+            <if test="imGroupDto.type != null and imGroupDto.type != ''">
+                AND ig.type_ = #{imGroupDto.type}
             </if>
-            <if test="search != null and search != ''">
-                AND (ig.id_ = #{search} OR
-                ig.name_ LIKE CONCAT('%',#{search},'%') OR ig.introduce_ LIKE CONCAT('%',#{search},'%'))
+            <if test="imGroupDto.createUserId != null">
+                AND ig.create_by_ = #{imGroupDto.createUserId}
+            </if>
+            <if test="imGroupDto.userId != null">
+                AND igm.user_id_ = #{imGroupDto.userId}
+            </if>
+            <if test="imGroupDto.search != null and imGroupDto.search != ''">
+                AND (ig.id_ = #{imGroupDto.search} OR
+                ig.name_ LIKE CONCAT('%',#{imGroupDto.search},'%') OR ig.introduce_ LIKE CONCAT('%',#{imGroupDto.search},'%'))
             </if>
         </where>
         ORDER BY id_ DESC
     </select>
+    <resultMap id="ImGroupResultDto" type="com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto" extends="BaseResultMap">
+        <result property="existFlag" column="existFlag"/>
+        <result property="hasWaitAuditFlag" column="hasWaitAuditFlag"/>
+    </resultMap>
+    <select id="queryTeacherFun" resultMap="ImGroupResultDto">
+        SELECT ig.*,
+               CASE WHEN igm.id_ IS NULL THEN 0 ELSE 1 END existFlag,
+               CASE WHEN igma.id_ IS NULL THEN 0 ELSE 1 END hasWaitAuditFlag
+        FROM im_group ig
+                 LEFT JOIN im_group_member igm ON ig.id_ = igm.group_id_ AND igm.user_id_ = #{imGroupDto.userId}
+                 LEFT JOIN im_group_member_audit igma ON igma.group_id_ = ig.id_ AND igma.audit_status_ = 'AUDITING'
+        WHERE ig.create_by_ = #{imGroupDto.createUserId}
+        <if test="imGroupDto.type != null and imGroupDto.type != ''">
+            AND ig.type_ = #{imGroupDto.type}
+        </if>
+        <if test="imGroupDto.search != null and imGroupDto.search != ''">
+            AND (ig.id_ = #{imGroupDto.search} OR
+            ig.name_ LIKE CONCAT('%',#{imGroupDto.search},'%') OR ig.introduce_ LIKE CONCAT('%',#{imGroupDto.search},'%'))
+        </if>
+        GROUP BY ig.id_
+    </select>
 </mapper>

+ 15 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherFreeTimeMapper.xml

@@ -95,4 +95,19 @@
         LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
         WHERE f.teacher_id_=#{teacherId} AND f.default_flag_=1 AND p.subject_id_=#{subjectId}
     </select>
+    <select id="selectPriceByTeacherId" resultType="com.yonge.cooleshow.biz.dal.entity.TeacherSubjectPrice"
+            parameterType="java.lang.Long">
+        SELECT
+            p.id_ AS id,
+            p.teacher_free_time_id AS teacherFreeTimeId,
+            p.teacher_id_ AS teacherId,
+            p.free_minutes_ AS freeMinutes,
+            p.course_minutes_ AS courseMinutes,
+            p.subject_id_ AS subjectId,
+            p.subject_name_ AS subjectName,
+            p.subject_price_ AS subjectPrice
+        FROM teacher_free_time f
+                 LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
+        WHERE f.teacher_id_=#{teacherId} AND f.default_flag_=1
+    </select>
 </mapper>

+ 15 - 6
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImGroupController.java

@@ -3,15 +3,20 @@ package com.yonge.cooleshow.student.controller;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.toolset.utils.validator.ValidationKit;
 import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.util.List;
 import java.util.Map;
 
@@ -39,15 +44,19 @@ public class ImGroupController extends BaseController {
         return succeed(imGroupService.getById(groupId));
     }
 
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "search", dataType = "String", value = "根据群名称、编号、简介模糊查询"),
-    })
     @ApiOperation("群列表")
     @PostMapping(value = "/queryAll")
-    public HttpResponseResult<List<ImGroup>> queryAll(@RequestBody Map<String,Object> params) throws Exception {
+    public HttpResponseResult<List<ImGroup>> queryAll(@Valid @RequestBody ImGroupSearchDto imGroupSearchDto, BindingResult bindingResult) throws Exception {
+        ValidationKit.ignoreFields(bindingResult,"createUserId");
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        params.put("userId",sysUser.getId());
-        return succeed(imGroupService.queryAll(params));
+        imGroupSearchDto.setUserId(sysUser.getId());
+        return succeed(imGroupService.queryAll(imGroupSearchDto));
+    }
+
+    @ApiOperation("获取指定用户的群列表")
+    @PostMapping(value = "/queryTeacherGroup")
+    public HttpResponseResult<List<ImGroupResultDto>> queryTeacherGroup(@RequestBody ImGroupSearchDto imGroupSearchDto) throws Exception {
+        return succeed(imGroupService.queryTeacherFun(imGroupSearchDto));
     }
 }
 

+ 2 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java

@@ -152,8 +152,8 @@ public class StudentCourseScheduleController extends BaseController {
 
     @ApiOperation("查询老师陪练课配置")
     @GetMapping("/getTeacherSubjectPrice")
-    public HttpResponseResult<TeacherSubjectPrice> getTeacherSubjectPrice(@NotNull Long teacherId, @NotNull Long subjectId) {
-        return succeed(courseScheduleService.teacherSubjectPrice(teacherId, subjectId));
+    public HttpResponseResult<List<TeacherSubjectPrice>> getTeacherSubjectPrice(@NotNull Long teacherId) {
+        return succeed(courseScheduleService.teacherSubjectPrice(teacherId));
     }
 }
 

+ 7 - 7
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.teacher.controller;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
+import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -15,7 +17,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.util.List;
-import java.util.Map;
+import java.util.Objects;
 
 /**
  * 即时通讯群组(ImGroup)表控制层
@@ -58,15 +60,13 @@ public class ImGroupController extends BaseController {
         return succeed(imGroupService.getById(groupId));
     }
 
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "search", dataType = "String", value = "根据群名称、编号、简介模糊查询"),
-    })
     @ApiOperation("群列表")
     @PostMapping(value = "/queryAll")
-    public HttpResponseResult<List<ImGroup>> queryAll(@RequestBody Map<String,Object> params) throws Exception {
+    public HttpResponseResult<List<ImGroup>> queryAll(@Valid @RequestBody ImGroupSearchDto imGroupSearchDto, BindingResult bindingResult) throws Exception {
+        ValidationKit.ignoreFields(bindingResult,"createUserId");
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        params.put("userId",sysUser.getId());
-        return succeed(imGroupService.queryAll(params));
+        imGroupSearchDto.setUserId(sysUser.getId());
+        return succeed(imGroupService.queryAll(imGroupSearchDto));
     }
 
     @ApiOperation("修改群信息")

+ 42 - 0
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/entity/UploadSign.java

@@ -0,0 +1,42 @@
+package com.yonge.toolset.thirdparty.entity;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/27
+ */
+public class UploadSign implements Serializable {
+    private String fileName;
+    
+    private Map<String, String> postData;
+    
+    private List<String> unknowValueField;
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public Map<String, String> getPostData() {
+        return postData;
+    }
+
+    public void setPostData(Map<String, String> postData) {
+        this.postData = postData;
+    }
+
+    public List<String> getUnknowValueField() {
+        return unknowValueField;
+    }
+
+    public void setUnknowValueField(List<String> unknowValueField) {
+        this.unknowValueField = unknowValueField;
+    }
+}
+

+ 42 - 28
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePlugin.java

@@ -1,35 +1,49 @@
 package com.yonge.toolset.thirdparty.storage;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
+
 import java.io.File;
 import java.io.IOException;
 
 public interface StoragePlugin {
-	
-	String getName();
-
-	/**
-	 * 上传文件
-	 * @param folderName 文件夹
-	 * @param file 需要上传的文件
-	 * @return 返回文件路径
-	 */
-	String uploadFile(String folderName, File file);
-
-	/**
-	 * 上传文件
-	 * @param folderName 文件夹
-	 * @param file 需要上传的文件
-	 * @param delLocalFile 删除本地文件
-	 * @return 返回文件路径
-	 */
-	String asyncUploadFile(String folderName, File file, boolean delLocalFile);
-
-	/**
-	 * 下载文件
-	 * @param folderName 文件夹
-	 * @param fileName 文件名称
-	 * @return 返回文件内容
-	 * @throws IOException
-	 */
-	byte[] getFile(String folderName, String fileName) throws IOException;
+
+    String getName();
+
+    /**
+     * 上传文件
+     *
+     * @param folderName 文件夹
+     * @param file       需要上传的文件
+     * @return 返回文件路径
+     */
+    String uploadFile(String folderName, File file);
+
+    /**
+     * 上传文件
+     *
+     * @param folderName   文件夹
+     * @param file         需要上传的文件
+     * @param delLocalFile 删除本地文件
+     * @return 返回文件路径
+     */
+    String asyncUploadFile(String folderName, File file, boolean delLocalFile);
+
+    /**
+     * 下载文件
+     *
+     * @param folderName 文件夹
+     * @param fileName   文件名称
+     * @return 返回文件内容
+     * @throws IOException
+     */
+    byte[] getFile(String folderName, String fileName) throws IOException;
+
+    /**
+     * 获取上传文件签名
+     *
+     * @param uploadSign
+     * @return
+     */
+    PostObjectFormFields getUploadSign(UploadSign uploadSign);
 }

+ 35 - 28
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/StoragePluginContext.java

@@ -2,8 +2,11 @@ package com.yonge.toolset.thirdparty.storage;
 
 import java.io.File;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.springframework.stereotype.Component;
 
 import com.yonge.toolset.thirdparty.exception.ThirdpartyException;
@@ -11,33 +14,37 @@ import com.yonge.toolset.thirdparty.exception.ThirdpartyException;
 @Component
 public class StoragePluginContext {
 
-	private static final Map<String, StoragePlugin> mapper = new HashMap<String, StoragePlugin>();
-	
-	public static void addStoragePlugin(StoragePlugin storagePlugin) {
-		if (mapper.containsKey(storagePlugin.getName())) {
-			throw new ThirdpartyException("存储插件:{}已存在", storagePlugin.getName());
-		}
-		mapper.put(storagePlugin.getName(), storagePlugin);
-	}
-	
-	public String uploadFile(String storagePluginName, String folderName, File file){
-		StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
-		return StoragePlugin.uploadFile(folderName, file);
-	}
-	
-	public String asyncUploadFile(String storagePluginName, String folderName, File file, boolean delLocalFile){
-		StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
-		return StoragePlugin.asyncUploadFile(folderName, file, delLocalFile);
-	}
-
-	private StoragePlugin getStoragePlugin(String storagePluginName) {
-		StoragePlugin storagePlugin = mapper.get(storagePluginName);
-
-		if (storagePlugin == null) {
-			throw new ThirdpartyException("存储插件:{}不存在", storagePluginName);
-		}
-
-		return storagePlugin;
-	}
+    private static final Map<String, StoragePlugin> mapper = new HashMap<String, StoragePlugin>();
 
+    public static void addStoragePlugin(StoragePlugin storagePlugin) {
+        if (mapper.containsKey(storagePlugin.getName())) {
+            throw new ThirdpartyException("存储插件:{}已存在", storagePlugin.getName());
+        }
+        mapper.put(storagePlugin.getName(), storagePlugin);
+    }
+
+    public String uploadFile(String storagePluginName, String folderName, File file) {
+        StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
+        return StoragePlugin.uploadFile(folderName, file);
+    }
+
+    public String asyncUploadFile(String storagePluginName, String folderName, File file, boolean delLocalFile) {
+        StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
+        return StoragePlugin.asyncUploadFile(folderName, file, delLocalFile);
+    }
+
+    public PostObjectFormFields getUploadSign(String storagePluginName, UploadSign uploadSign) {
+        StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
+        return StoragePlugin.getUploadSign(uploadSign);
+    }
+
+    private StoragePlugin getStoragePlugin(String storagePluginName) {
+        StoragePlugin storagePlugin = mapper.get(storagePluginName);
+
+        if (storagePlugin == null) {
+            throw new ThirdpartyException("存储插件:{}不存在", storagePluginName);
+        }
+
+        return storagePlugin;
+    }
 }

+ 187 - 138
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/AliyunOssStoragePlugin.java

@@ -2,8 +2,17 @@ package com.yonge.toolset.thirdparty.storage.provider;
 
 import java.io.File;
 import java.io.IOException;
-
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ksyun.ks3.service.Ks3;
+import com.ksyun.ks3.service.Ks3Client;
+import com.ksyun.ks3.service.Ks3ClientConfig;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.util.IOUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -20,141 +29,181 @@ import com.yonge.toolset.thirdparty.storage.StoragePluginContext;
 @Component
 public class AliyunOssStoragePlugin implements StoragePlugin, InitializingBean, DisposableBean {
 
-	public final static String PLUGIN_NAME = "Aliyun";
-
-	@Value("${storage.oss.endpoint:oss-cn-beijing.aliyuncs.com}")
-	private String endpoint;
-
-	@Value("${storage.oss.accessKeyId:LTAI4Fdhxwfo7FsBDZKK8Wfv}")
-	private String accessKeyId;
-
-	@Value("${storage.oss.accessKeySecret:ERRma4P9VWbD98n93gspnZXmoq7rn5}")
-	private String accessKeySecret;
-
-	@Value("${storage.oss.bucketName:daya-online}")
-	private String bucketName;
-
-	private OSSClient ossClient;
-
-	public String getName() {
-		return PLUGIN_NAME;
-	}
-
-	@Override
-	public void afterPropertiesSet() throws Exception {
-		// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
-		ClientConfiguration conf = new ClientConfiguration();
-
-		// 设置OSSClient允许打开的最大HTTP连接数,默认为1024个。
-		conf.setMaxConnections(200);
-		// 设置Socket层传输数据的超时时间,默认为50000毫秒。
-		conf.setSocketTimeout(10000);
-		// 设置建立连接的超时时间,默认为50000毫秒。
-		conf.setConnectionTimeout(10000);
-		// 设置从连接池中获取连接的超时时间(单位:毫秒),默认不超时。
-		conf.setConnectionRequestTimeout(1000);
-		// 设置连接空闲超时时间。超时则关闭连接,默认为60000毫秒。
-		conf.setIdleConnectionTime(10000);
-		// 设置失败请求重试次数,默认为3次。
-		conf.setMaxErrorRetry(5);
-		// 设置是否支持将自定义域名作为Endpoint,默认支持。
-		conf.setSupportCname(true);
-
-		ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, conf);
-		
-		StoragePluginContext.addStoragePlugin(this);
-	}
-
-	@Override
-	public String uploadFile(String folderName, File file) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-
-		ossClient.putObject(bucketName, folderName + "/" + file.getName(), file);
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-		
-		final String dir = folderName;
-		
-		Thread thread = new Thread(new Runnable() {
-			
-			@Override
-			public void run() {
-				ossClient.putObject(bucketName, dir + "/" + file.getName(), file);
-				if(delLocalFile){
-					FileUtils.deleteQuietly(file);
-				}
-			}
-		});
-		thread.start();
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public byte[] getFile(String folderName, String fileName) throws IOException {
-		OSSObject ossObject = ossClient.getObject(bucketName, folderName + "/" + fileName);
-		try {
-			return IOUtils.toByteArray(ossObject.getObjectContent());
-		} finally {
-			if (ossObject != null) {
-				ossObject.close();
-			}
-		}
-	}
-
-	@Override
-	public void destroy() throws Exception {
-		if (ossClient != null) {
-			ossClient.shutdown();
-		}
-	}
-
-	public void setEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-	}
-
-	public void setAccessKeyId(String accessKeyId) {
-		this.accessKeyId = accessKeyId;
-	}
-
-	public void setAccessKeySecret(String accessKeySecret) {
-		this.accessKeySecret = accessKeySecret;
-	}
-
-	public void setBucketName(String bucketName) {
-		this.bucketName = bucketName;
-	}
-
-	public static void main(String[] args) throws Exception {
-		AliyunOssStoragePlugin aliyunOssStorageService = new AliyunOssStoragePlugin();
-		aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
-		aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
-		aliyunOssStorageService.setBucketName("yooma-test");
-		aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
-		aliyunOssStorageService.afterPropertiesSet();
-
-		File file = new File("e:/var/2.jpg");
-		System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
-
-		System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
-
-		aliyunOssStorageService.destroy();
-	}
+    public final static String PLUGIN_NAME = "Aliyun";
+
+    @Value("${storage.oss.endpoint:oss-cn-beijing.aliyuncs.com}")
+    private String endpoint;
+
+    @Value("${storage.oss.accessKeyId:LTAI4Fdhxwfo7FsBDZKK8Wfv}")
+    private String accessKeyId;
+
+    @Value("${storage.oss.accessKeySecret:ERRma4P9VWbD98n93gspnZXmoq7rn5}")
+    private String accessKeySecret;
+
+    @Value("${storage.oss.bucketName:daya-online}")
+    private String bucketName;
+
+    private OSSClient ossClient;
+
+    public String getName() {
+        return PLUGIN_NAME;
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        // 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
+        ClientConfiguration conf = new ClientConfiguration();
+
+        // 设置OSSClient允许打开的最大HTTP连接数,默认为1024个。
+        conf.setMaxConnections(200);
+        // 设置Socket层传输数据的超时时间,默认为50000毫秒。
+        conf.setSocketTimeout(10000);
+        // 设置建立连接的超时时间,默认为50000毫秒。
+        conf.setConnectionTimeout(10000);
+        // 设置从连接池中获取连接的超时时间(单位:毫秒),默认不超时。
+        conf.setConnectionRequestTimeout(1000);
+        // 设置连接空闲超时时间。超时则关闭连接,默认为60000毫秒。
+        conf.setIdleConnectionTime(10000);
+        // 设置失败请求重试次数,默认为3次。
+        conf.setMaxErrorRetry(5);
+        // 设置是否支持将自定义域名作为Endpoint,默认支持。
+        conf.setSupportCname(true);
+
+        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, conf);
+
+        StoragePluginContext.addStoragePlugin(this);
+    }
+
+    @Override
+    public String uploadFile(String folderName, File file) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        ossClient.putObject(bucketName, folderName + "/" + file.getName(), file);
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        final String dir = folderName;
+
+        Thread thread = new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                ossClient.putObject(bucketName, dir + "/" + file.getName(), file);
+                if (delLocalFile) {
+                    FileUtils.deleteQuietly(file);
+                }
+            }
+        });
+        thread.start();
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public byte[] getFile(String folderName, String fileName) throws IOException {
+        OSSObject ossObject = ossClient.getObject(bucketName, folderName + "/" + fileName);
+        try {
+            return IOUtils.toByteArray(ossObject.getObjectContent());
+        } finally {
+            if (ossObject != null) {
+                ossObject.close();
+            }
+        }
+    }
+
+    @Override
+    public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+        //要上传的文件名称,不包含路径信息
+        String fileName = uploadSign.getFileName();
+        //可以确定值得表单项
+        Map<String, String> postData = uploadSign.getPostData();
+        //无法确定值得表单项
+        List<String> unknowValueField = uploadSign.getUnknowValueField();
+
+        Ks3ClientConfig config = new Ks3ClientConfig();
+        // 设置域名
+        config.setEndpoint(endpoint);
+        // 创建Ks3Client实例
+        Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+        /**
+         * 需要用户在postData和unknowValueField中提供所有的除KSSAccessKeyId, signature, file, policy外的所有表单项。否则用生成的签名上传会返回403</br>
+         * 对于用户可以确定表单值的放在 postData中,对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)</br>
+         */
+        //Map<String, String> postData = new HashMap<String, String>();
+        // 如果使用js sdk上传的时候设置了ACL,请提供以下一行,且值要与SDK中一致,否则删除下面一行代码
+        //postData.put("acl","public-read");
+        // 提供js sdk中的key值
+        //postData.put("key","20150115/中文/${filename}");
+        // 设置无法确定的表单值
+        //List<String> unknowValueField = new ArrayList<String>();
+
+        // js sdk上传的时候会自动加上一个name的表单项,所以下面需要加上这样的代码。
+        unknowValueField.add("name");
+
+        // 如果计算签名时提供的key里不包含${filename}占位符,第二个参数传一个空字符串。
+        String postDataKey = postData.get("key");
+        if (StringUtils.isNotBlank(postDataKey)) {
+            if (postDataKey.indexOf("${filename}") == -1) {
+                return client.postObject(bucketName, "", postData, unknowValueField);
+            }
+        }
+        return client.postObject(bucketName, fileName, postData, unknowValueField);
+    }
+
+    @Override
+    public void destroy() throws Exception {
+        if (ossClient != null) {
+            ossClient.shutdown();
+        }
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+
+    public void setBucketName(String bucketName) {
+        this.bucketName = bucketName;
+    }
+
+    public static void main(String[] args) throws Exception {
+        AliyunOssStoragePlugin aliyunOssStorageService = new AliyunOssStoragePlugin();
+        aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
+        aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
+        aliyunOssStorageService.setBucketName("yooma-test");
+        aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
+        aliyunOssStorageService.afterPropertiesSet();
+
+        File file = new File("e:/var/2.jpg");
+        System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
+
+        System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
+
+        aliyunOssStorageService.destroy();
+    }
 }

+ 192 - 146
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/storage/provider/KS3StoragePlugin.java

@@ -2,8 +2,14 @@ package com.yonge.toolset.thirdparty.storage.provider;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 
+import com.alibaba.fastjson.JSON;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.util.IOUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -27,150 +33,190 @@ import com.yonge.toolset.thirdparty.storage.StoragePluginContext;
 @Component
 public class KS3StoragePlugin implements StoragePlugin, InitializingBean, DisposableBean {
 
-	public final static String PLUGIN_NAME = "Ksyun";
-
-	@Value("${storage.oss.endpoint:ks3-cn-beijing.ksyun.com}")
-	private String endpoint;
-
-	@Value("${storage.oss.accessKeyId:AKLTtTeIbadpRG-pil4S0Q4m-Q}")
-	private String accessKeyId;
-
-	@Value("${storage.oss.accessKeySecret:OB1HmNOfDNW95wHoxMkP6IPFZXormk2ngA800TkvKAw7ozhiJGRqrMnnV8ZrAU3WRQ==}")
-	private String accessKeySecret;
-
-	@Value("${storage.oss.bucketName:daya}")
-	private String bucketName;
-
-	private Ks3 client;
-
-	public String getName() {
-		return PLUGIN_NAME;
-	}
-
-	@Override
-	public void afterPropertiesSet() throws Exception {
-		Ks3ClientConfig config = new Ks3ClientConfig();
-		config.setEndpoint(endpoint);// 如果使用自定义域名,设置endpoint为自定义域名,同时设置domainMode为true
-		/**
-		 * true:表示以自定义域名访问 
-		 * false:表示以KS3的外网域名或内网域名访问
-		 * 默认为false
-		 */
-		config.setDomainMode(false);
-		config.setProtocol(PROTOCOL.http);
-
-		/**
-		 * true表示以   endpoint/{bucket}/{key}的方式访问
-		 * false表示以  {bucket}.endpoint/{key}的方式访问
-		 * 如果domainMode设置为true,pathStyleAccess可忽略设置
-		 */
-		config.setPathStyleAccess(false);
-		HttpClientConfig hconfig = new HttpClientConfig();
-		// 在HttpClientConfig中可以设置httpclient的相关属性,比如代理,超时,重试等。
-		config.setHttpClientConfig(hconfig);
-		client = new Ks3Client(accessKeyId, accessKeySecret, config);
-
-		StoragePluginContext.addStoragePlugin(this);
-	}
-
-	@Override
-	public String uploadFile(String folderName, File file) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-
-		PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
-
-		// 上传一个公开文件
-		request.setCannedAcl(CannedAccessControlList.PublicRead);
-
-		client.putObject(request);
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
-		if (!file.exists()) {
-			throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
-		}
-
-		if (folderName.endsWith("/")) {
-			folderName = folderName.substring(0, folderName.length() - 1);
-		}
-
-		PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
-
-		// 上传一个公开文件
-		request.setCannedAcl(CannedAccessControlList.PublicRead);
-		
-		Thread thread = new Thread(new Runnable() {
-			
-			@Override
-			public void run() {
-				client.putObject(request);
-				if(delLocalFile){
-					FileUtils.deleteQuietly(file);
-				}
-			}
-		});
-		thread.start();
-
-		return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
-	}
-
-	@Override
-	public byte[] getFile(String folderName, String fileName) throws IOException {
-		GetObjectRequest request = new GetObjectRequest(bucketName, folderName + "/" + fileName);
-		GetObjectResult result = client.getObject(request);
-
-		Ks3Object object = result.getObject();
-		try {
-			return IOUtils.toByteArray(object.getObjectContent());
-		} finally {
-			if (object != null) {
-				object.close();
-			}
-		}
-	}
-
-	@Override
-	public void destroy() throws Exception {
-	}
-
-	public void setEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-	}
-
-	public void setAccessKeyId(String accessKeyId) {
-		this.accessKeyId = accessKeyId;
-	}
-
-	public void setAccessKeySecret(String accessKeySecret) {
-		this.accessKeySecret = accessKeySecret;
-	}
-
-	public void setBucketName(String bucketName) {
-		this.bucketName = bucketName;
-	}
-
-	public static void main(String[] args) throws Exception {
-		KS3StoragePlugin aliyunOssStorageService = new KS3StoragePlugin();
-		aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
-		aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
-		aliyunOssStorageService.setBucketName("yooma-test");
-		aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
-		aliyunOssStorageService.afterPropertiesSet();
-
-		File file = new File("e:/var/2.jpg");
-		System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
-
-		System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
-
-		aliyunOssStorageService.destroy();
-	}
+    public final static String PLUGIN_NAME = "Ksyun";
+
+    @Value("${storage.oss.endpoint:ks3-cn-beijing.ksyun.com}")
+    private String endpoint;
+
+    @Value("${storage.oss.accessKeyId:AKLTtTeIbadpRG-pil4S0Q4m-Q}")
+    private String accessKeyId;
+
+    @Value("${storage.oss.accessKeySecret:OB1HmNOfDNW95wHoxMkP6IPFZXormk2ngA800TkvKAw7ozhiJGRqrMnnV8ZrAU3WRQ==}")
+    private String accessKeySecret;
+
+    @Value("${storage.oss.bucketName:daya}")
+    private String bucketName;
+
+    private Ks3 client;
+
+    public String getName() {
+        return PLUGIN_NAME;
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        Ks3ClientConfig config = new Ks3ClientConfig();
+        config.setEndpoint(endpoint);// 如果使用自定义域名,设置endpoint为自定义域名,同时设置domainMode为true
+        /**
+         * true:表示以自定义域名访问
+         * false:表示以KS3的外网域名或内网域名访问
+         * 默认为false
+         */
+        config.setDomainMode(false);
+        config.setProtocol(PROTOCOL.http);
+
+        /**
+         * true表示以   endpoint/{bucket}/{key}的方式访问
+         * false表示以  {bucket}.endpoint/{key}的方式访问
+         * 如果domainMode设置为true,pathStyleAccess可忽略设置
+         */
+        config.setPathStyleAccess(false);
+        HttpClientConfig hconfig = new HttpClientConfig();
+        // 在HttpClientConfig中可以设置httpclient的相关属性,比如代理,超时,重试等。
+        config.setHttpClientConfig(hconfig);
+        client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+        StoragePluginContext.addStoragePlugin(this);
+    }
+
+    @Override
+    public String uploadFile(String folderName, File file) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
+
+        // 上传一个公开文件
+        request.setCannedAcl(CannedAccessControlList.PublicRead);
+
+        client.putObject(request);
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public String asyncUploadFile(String folderName, File file, boolean delLocalFile) {
+        if (!file.exists()) {
+            throw new ThirdpartyException("需要上传的文件[{}]不存在", file.getAbsolutePath());
+        }
+
+        if (folderName.endsWith("/")) {
+            folderName = folderName.substring(0, folderName.length() - 1);
+        }
+
+        PutObjectRequest request = new PutObjectRequest(bucketName, folderName + "/" + file.getName(), file);
+
+        // 上传一个公开文件
+        request.setCannedAcl(CannedAccessControlList.PublicRead);
+
+        Thread thread = new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                client.putObject(request);
+                if (delLocalFile) {
+                    FileUtils.deleteQuietly(file);
+                }
+            }
+        });
+        thread.start();
+
+        return "https://" + bucketName + "." + endpoint + "/" + folderName + "/" + file.getName();
+    }
+
+    @Override
+    public byte[] getFile(String folderName, String fileName) throws IOException {
+        GetObjectRequest request = new GetObjectRequest(bucketName, folderName + "/" + fileName);
+        GetObjectResult result = client.getObject(request);
+
+        Ks3Object object = result.getObject();
+        try {
+            return IOUtils.toByteArray(object.getObjectContent());
+        } finally {
+            if (object != null) {
+                object.close();
+            }
+        }
+    }
+
+    @Override
+    public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+        //要上传的文件名称,不包含路径信息
+        String fileName = uploadSign.getFileName();
+        //可以确定值得表单项
+        Map<String, String> postData = uploadSign.getPostData();
+        //无法确定值得表单项
+        List<String> unknowValueField = uploadSign.getUnknowValueField();
+
+        Ks3ClientConfig config = new Ks3ClientConfig();
+        // 设置域名
+        config.setEndpoint(endpoint);
+        // 创建Ks3Client实例
+        Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+        /**
+         * 需要用户在postData和unknowValueField中提供所有的除KSSAccessKeyId, signature, file, policy外的所有表单项。否则用生成的签名上传会返回403</br>
+         * 对于用户可以确定表单值的放在 postData中,对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)</br>
+         */
+        //Map<String, String> postData = new HashMap<String, String>();
+        // 如果使用js sdk上传的时候设置了ACL,请提供以下一行,且值要与SDK中一致,否则删除下面一行代码
+        //postData.put("acl","public-read");
+        // 提供js sdk中的key值
+        //postData.put("key","20150115/中文/${filename}");
+        // 设置无法确定的表单值
+        //List<String> unknowValueField = new ArrayList<String>();
+
+        // js sdk上传的时候会自动加上一个name的表单项,所以下面需要加上这样的代码。
+        unknowValueField.add("name");
+
+        // 如果计算签名时提供的key里不包含${filename}占位符,第二个参数传一个空字符串。
+        String postDataKey = postData.get("key");
+        if (StringUtils.isNotBlank(postDataKey)) {
+            if (postDataKey.indexOf("${filename}") == -1) {
+                return client.postObject(bucketName, "", postData, unknowValueField);
+            }
+        }
+        return client.postObject(bucketName, fileName, postData, unknowValueField);
+    }
+
+    @Override
+    public void destroy() throws Exception {
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+
+    public void setBucketName(String bucketName) {
+        this.bucketName = bucketName;
+    }
+
+    public static void main(String[] args) throws Exception {
+        KS3StoragePlugin aliyunOssStorageService = new KS3StoragePlugin();
+        aliyunOssStorageService.setAccessKeyId("LTAIwZW9XqrfsZ4r");
+        aliyunOssStorageService.setAccessKeySecret("5uDsNZmHMxcnxav8w9byII4zcPpu5G");
+        aliyunOssStorageService.setBucketName("yooma-test");
+        aliyunOssStorageService.setEndpoint("oss-cn-beijing.aliyuncs.com");
+        aliyunOssStorageService.afterPropertiesSet();
+
+        File file = new File("e:/var/2.jpg");
+        System.out.println(aliyunOssStorageService.uploadFile("aaa", file));
+
+        System.err.println("***********" + aliyunOssStorageService.getFile("aaa", file.getName()).length);
+
+        aliyunOssStorageService.destroy();
+    }
 }