yangdamao 2 年 前
コミット
54ee49f75e
18 ファイル変更660 行追加85 行削除
  1. 99 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  2. 42 20
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java
  3. 2 2
      zhongzheng-admin/src/main/resources/application.yml
  4. 41 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java
  5. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  6. 4 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java
  7. 14 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileAddBo.java
  8. 1 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsAddBo.java
  9. 4 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsEditBo.java
  10. 9 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseFile.java
  11. 4 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseHandouts.java
  12. 6 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseFileService.java
  13. 9 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java
  14. 118 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseFileServiceImpl.java
  15. 293 22
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java
  16. 8 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseFileVo.java
  17. 4 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseHandoutsVo.java
  18. 1 0
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseHandoutsMapper.xml

+ 99 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -14,7 +14,9 @@ import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUploadUtils;
@@ -24,6 +26,9 @@ import com.zhongzheng.framework.config.ServerConfig;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.modules.activity.vo.ActivityGoodsPriceVo;
 import com.zhongzheng.modules.base.bo.ConfigQueryBo;
+import com.zhongzheng.modules.course.domain.CourseFile;
+import com.zhongzheng.modules.course.service.ICourseFileService;
+import com.zhongzheng.modules.course.service.ICourseHandoutsService;
 import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsQueryBo;
 import com.zhongzheng.modules.distribution.bo.DistributionCashWithdrawalPayBo;
 import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
@@ -71,11 +76,17 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 /**
  * 通用请求处理
@@ -123,6 +134,10 @@ public class CommonController extends BaseController
     private  IDistributionSellerService iDistributionSellerService;
     @Autowired
     private  IDistributionActivityGoodsService iDistributionActivityGoodsService;
+    @Autowired
+    private ICourseHandoutsService iCourseHandoutsService;
+    @Autowired
+    private ICourseFileService iCourseFileService;
     /**
      * 通用下载请求
      *
@@ -180,6 +195,90 @@ public class CommonController extends BaseController
         }
     }
 
+
+    /**
+     * 通用上传请求
+     */
+    @PostMapping("/common/decompression")
+    public AjaxResult uploadDecompression(MultipartFile file) throws Exception {
+        String destDirPath = "D:/workpro/saas_entrepot/zhongzheng-admin/src/main/resources/cesz";
+        ZipInputStream zipIn = new ZipInputStream(file.getInputStream(),Charset.forName("GBK"));
+        ZipEntry entry = zipIn.getNextEntry();
+        while (entry != null) {
+            String entryName = entry.getName();
+            String filePath = destDirPath + File.separator + entryName;
+            if (entry.isDirectory()) {
+                File dir = new File(filePath);
+                dir.mkdirs();
+            } else {
+                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
+                byte[] bytesIn = new byte[4096];
+                int read = 0;
+                while ((read = zipIn.read(bytesIn)) != -1) {
+                    bos.write(bytesIn, 0, read);
+                }
+                bos.close();
+            }
+            zipIn.closeEntry();
+            entry = zipIn.getNextEntry();
+        }
+        zipIn.close();
+        //处理讲义文件
+        getFileNames(new File(destDirPath),0L,999L);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 得到文件名称
+     *
+     * @param file      文件
+     * @param parentId 父ID
+     * @return {@link List}<{@link String}>
+     */
+    private void getFileNames(File file,Long parentId,Long handoutsId) {
+        File[] files = file.listFiles();
+        for (File f : files) {
+            if (f.isDirectory()) {
+                //文件夹
+                CourseFile courseFile = new CourseFile();
+                courseFile.setUrlName(f.getName());
+                courseFile.setStatus(1);
+                courseFile.setSort(1);
+                courseFile.setCreateTime(DateUtils.getNowTime());
+                courseFile.setUpdateTime(DateUtils.getNowTime());
+                courseFile.setHandoutsId(handoutsId);
+                courseFile.setType(2);//文件夹
+                courseFile.setParentId(parentId);
+                iCourseFileService.save(courseFile);
+                getFileNames(f, courseFile.getFileId(),handoutsId);
+            } else {
+                try {
+                    //文件
+                    CourseFile courseFile = new CourseFile();
+                    //上传oss
+                    // 上传文件路径
+                    String filePath = RuoYiConfig.getUploadPath();
+                    String fileName = FileUploadUtils.upload(filePath, FileUtils.getMultipartFile(f));
+                    String url = serverConfig.getUrl() + fileName;
+                    courseFile.setUrlName(f.getName());
+                    courseFile.setUrl(url);
+                    courseFile.setStatus(1);
+                    courseFile.setSort(1);
+                    courseFile.setCreateTime(DateUtils.getNowTime());
+                    courseFile.setUpdateTime(DateUtils.getNowTime());
+                    courseFile.setHandoutsId(handoutsId);
+                    courseFile.setType(1);//文件
+                    courseFile.setParentId(parentId);
+                    iCourseFileService.save(courseFile);
+                }catch (Exception e){
+                    e.printStackTrace();
+                    throw new CustomException("上传文件失败");
+                }
+            }
+        }
+    }
+
+
     /**
      * 本地资源通用下载
      */

+ 42 - 20
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java

@@ -1,32 +1,27 @@
 package com.zhongzheng.controller.course;
 
-import java.util.List;
-import java.util.Arrays;
-
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
-import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
-import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsAddBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsEditBo;
+import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
+import com.zhongzheng.modules.course.service.ICourseFileService;
 import com.zhongzheng.modules.course.service.ICourseHandoutsService;
-import com.zhongzheng.common.utils.poi.ExcelUtil;
-import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 /**
  * 讲义列Controller
@@ -42,6 +37,8 @@ public class CourseHandoutsController extends BaseController {
 
     private final ICourseHandoutsService iCourseHandoutsService;
 
+    private final ICourseFileService iCourseFileService;
+
     /**
      * 查询讲义列列表
      */
@@ -88,17 +85,42 @@ public class CourseHandoutsController extends BaseController {
         return toAjax(iCourseHandoutsService.insertByAddBo(bo) ? 1 : 0);
     }
 
+    /**
+     * 新增讲义列
+     */
+    @ApiOperation("新增讲义列")
+    @PostMapping("/save")
+    public AjaxResult<Void> addHandouts(MultipartFile[] files, String param) {
+
+        if (ObjectUtils.isNull(param) || ObjectUtils.isNull(files)){
+            return toAjax(0);
+        }
+        CourseHandoutsAddBo bo = JSONObject.parseObject(param, CourseHandoutsAddBo.class);
+        return toAjax(iCourseFileService.addHandouts(files,bo) ? 1 : 0);
+    }
+
     /**
      * 修改讲义列
      */
     @ApiOperation("修改讲义列")
-    @PreAuthorize("@ss.hasPermi('course:handouts:edit')")
-    @Log(title = "讲义列", businessType = BusinessType.UPDATE)
     @PostMapping("edit")
     public AjaxResult<Void> edit(@RequestBody CourseHandoutsEditBo bo) {
         return toAjax(iCourseHandoutsService.updateByEditBo(bo) ? 1 : 0);
     }
 
+    /**
+     * 修改讲义列
+     */
+    @ApiOperation("修改讲义列")
+    @PostMapping("edit/handouts")
+    public AjaxResult<Void> editHandouts(MultipartFile[] files, String param) {
+        if (ObjectUtils.isNull(param)){
+            return toAjax(0);
+        }
+        CourseHandoutsEditBo bo = JSONObject.parseObject(param, CourseHandoutsEditBo.class);
+        return toAjax(iCourseFileService.editHandouts(files,bo) ? 1 : 0);
+    }
+
     /**
      * 删除讲义列
      */

+ 2 - 2
zhongzheng-admin/src/main/resources/application.yml

@@ -76,9 +76,9 @@ spring:
   servlet:
      multipart:
        # 单个文件大小
-       max-file-size:  10MB
+       max-file-size:  1024MB
        # 设置总上传的文件大小
-       max-request-size:  20MB
+       max-request-size:  1024MB
   # 服务模块
   devtools:
     restart:

+ 41 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java

@@ -3,12 +3,20 @@ package com.zhongzheng.common.utils.file;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import com.zhongzheng.common.config.RuoYiConfig;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.io.IOUtils;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.UUID;
 
 /**
@@ -215,4 +223,37 @@ public class FileUtils extends org.apache.commons.io.FileUtils
         }
         return downloadPath;
     }
+
+    public static void deleteDirectoryStream(Path path) {
+        try {
+            Files.delete(path);
+            System.out.printf("删除文件成功:%s%n",path.toString());
+        } catch (IOException e) {
+            System.err.printf("无法删除的路径 %s%n%s", path, e);
+        }
+    }
+    
+    /**
+     * File转MultipartFile
+     * @author change
+     * @date 2023/4/10 11:09
+     * @param file 
+     * @return org.springframework.web.multipart.MultipartFile
+     */
+    public static MultipartFile getMultipartFile(File file) {
+        FileItem item = new DiskFileItemFactory().createItem("file"
+                , MediaType.MULTIPART_FORM_DATA_VALUE
+                , true
+                , file.getName());
+        try (InputStream input = new FileInputStream(file);
+             OutputStream os = item.getOutputStream()) {
+            // 流转移
+            IOUtils.copy(input, os);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new IllegalArgumentException("Invalid file: " + e, e);
+        }
+
+        return new CommonsMultipartFile(item);
+    }
 }

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -134,6 +134,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/profile/**").anonymous()
                 .antMatchers("/common/jzs/**").anonymous()
                 .antMatchers("/common/rollback/period").anonymous()
+                .antMatchers("/common/decompression").anonymous()
                 .antMatchers("/common/get/goods").anonymous()
                 .antMatchers("/common/get/goods/studyUrl").anonymous()
                 .antMatchers("/common/create/tenant/admin").anonymous()

+ 4 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java

@@ -16,7 +16,6 @@ import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.system.bo.*;
-import com.zhongzheng.modules.system.domain.SysConfig;
 import com.zhongzheng.modules.system.domain.SysRoleMenu;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.mapper.SysRoleMenuMapper;
@@ -284,6 +283,10 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
 //        Long newTenantId = createTenantId();
         Long newTenantId = bo.getTenantId();
         sysTenant.setTenantId(newTenantId);
+        sysTenant.setHostH5("");
+        sysTenant.setHostPc("");
+        sysTenant.setHostLive("");
+        sysTenant.setHostH5Seller("");
         if (!save(sysTenant)){
             throw new CustomException("创建企业失败");
         }

+ 14 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseFileAddBo.java

@@ -2,10 +2,9 @@ package com.zhongzheng.modules.course.bo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import java.util.Date;
 
+import java.util.List;
 
 
 /**
@@ -18,6 +17,9 @@ import java.util.Date;
 @ApiModel("文件添加对象")
 public class CourseFileAddBo {
 
+    /** $pkColumn.columnComment */
+    @ApiModelProperty("$pkColumn.columnComment")
+    private Long fileId;
     /** 地址 */
     @ApiModelProperty("地址")
     private String url;
@@ -39,4 +41,14 @@ public class CourseFileAddBo {
     /** 排序 */
     @ApiModelProperty("排序")
     private Integer sort;
+
+    private Long parentId;
+
+    @ApiModelProperty("类型:1文件 2文件夹")
+    private Integer type;
+
+    private List<CourseFileAddBo> children;
+
+    @ApiModelProperty("新增文件名称(全名称)")
+    private String addFileName;
 }

+ 1 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsAddBo.java

@@ -1,13 +1,9 @@
 package com.zhongzheng.modules.course.bo;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.zhongzheng.modules.course.domain.CourseFile;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import java.util.Date;
+
 import java.util.List;
 
 

+ 4 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsEditBo.java

@@ -1,12 +1,9 @@
 package com.zhongzheng.modules.course.bo;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import java.util.Date;
+
 import java.util.List;
 
 
@@ -56,4 +53,7 @@ public class CourseHandoutsEditBo {
     private List<CourseHandoutsBusinessAddBo> courseHandoutsBusinessAddBos;
     @ApiModelProperty("文件列表")
     private List<CourseFileAddBo> fileList;
+
+    @ApiModelProperty("新增文件名称")
+    private List<String> addFileNames;
 }

+ 9 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseFile.java

@@ -1,13 +1,14 @@
 package com.zhongzheng.modules.course.domain;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+
 import java.io.Serializable;
-import java.util.Date;
-import java.math.BigDecimal;
-import com.zhongzheng.common.annotation.Excel;
 
 /**
  * 文件对象 course_file
@@ -42,4 +43,8 @@ private static final long serialVersionUID=1L;
     private Long handoutsId;
     /** 排序 */
     private Integer sort;
+    /** 父ID */
+    private Long parentId;
+    /** 类型:1文件 2文件夹 */
+    private Integer type;
 }

+ 4 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseHandouts.java

@@ -2,18 +2,13 @@ package com.zhongzheng.modules.course.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.zhongzheng.modules.course.vo.CourseFileVo;
-import com.zhongzheng.modules.course.vo.CourseHandoutsBusinessVo;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+
 import java.io.Serializable;
-import java.util.Date;
-import java.math.BigDecimal;
 import java.util.List;
 
-import com.zhongzheng.common.annotation.Excel;
-
 /**
  * 讲义列对象 course_handouts
  *
@@ -54,6 +49,9 @@ private static final long serialVersionUID=1L;
     /** 0不可下载 1下载 */
     private Integer canDownload;
 
+    /** 修改状态:1正常 0修改中 */
+    private Integer updateStatus;
+
     private Long tenantId;
     @TableField(exist = false)
     private Long oId;

+ 6 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseFileService.java

@@ -1,11 +1,10 @@
 package com.zhongzheng.modules.course.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhongzheng.modules.course.bo.CourseFileAddBo;
-import com.zhongzheng.modules.course.bo.CourseFileEditBo;
-import com.zhongzheng.modules.course.bo.CourseFileQueryBo;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CourseFile;
 import com.zhongzheng.modules.course.vo.CourseFileVo;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
 import java.util.List;
@@ -49,4 +48,8 @@ public interface ICourseFileService extends IService<CourseFile> {
 	 * @return
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+	boolean editHandouts(MultipartFile[] files, CourseHandoutsEditBo bo);
+
+    boolean addHandouts(MultipartFile[] files, CourseHandoutsAddBo bo);
 }

+ 9 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java

@@ -1,11 +1,12 @@
 package com.zhongzheng.modules.course.service;
 
-import com.zhongzheng.modules.course.domain.CourseHandouts;
-import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
-import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.course.bo.CourseHandoutsAddBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsEditBo;
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
+import com.zhongzheng.modules.course.domain.CourseHandouts;
+import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
 import java.util.List;
@@ -53,4 +54,8 @@ public interface ICourseHandoutsService extends IService<CourseHandouts> {
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     CourseHandouts getHandoutsByTenant(String encoder, Long newTenantId);
+
+	boolean addHandouts(MultipartFile[] files,CourseHandoutsAddBo bo);
+
+	boolean updateHandouts(MultipartFile[] files, CourseHandoutsEditBo bo);
 }

+ 118 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseFileServiceImpl.java

@@ -2,23 +2,42 @@ package com.zhongzheng.modules.course.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.modules.course.bo.CourseFileAddBo;
-import com.zhongzheng.modules.course.bo.CourseFileEditBo;
-import com.zhongzheng.modules.course.bo.CourseFileQueryBo;
+import com.zhongzheng.common.utils.file.FileUtils;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CourseFile;
+import com.zhongzheng.modules.course.domain.CourseHandouts;
 import com.zhongzheng.modules.course.mapper.CourseFileMapper;
 import com.zhongzheng.modules.course.service.ICourseFileService;
+import com.zhongzheng.modules.course.service.ICourseHandoutsService;
 import com.zhongzheng.modules.course.vo.CourseFileVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.github.pagehelper.Page;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 /**
  * 文件Service业务层处理
@@ -29,6 +48,9 @@ import java.util.stream.Collectors;
 @Service
 public class CourseFileServiceImpl extends ServiceImpl<CourseFileMapper, CourseFile> implements ICourseFileService {
 
+    @Autowired
+    private ICourseHandoutsService iCourseHandoutsService;
+
     @Override
     public CourseFileVo queryById(Long fileId){
         CourseFile db = this.baseMapper.selectById(fileId);
@@ -100,4 +122,92 @@ public class CourseFileServiceImpl extends ServiceImpl<CourseFileMapper, CourseF
         }
         return this.removeByIds(ids);
     }
+
+    @Override
+    public boolean editHandouts(MultipartFile[] files,  CourseHandoutsEditBo bo) {
+        iCourseHandoutsService.update(new LambdaUpdateWrapper<CourseHandouts>().set(CourseHandouts::getUpdateStatus,0).eq(CourseHandouts::getHandoutsId,bo.getHandoutsId()));
+        //解压压缩包
+        List<MultipartFile> collect = Arrays.stream(files).filter(x -> x.getOriginalFilename().contains(".zip")).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(collect)){
+            decompressingFiles(collect);
+        }
+        iCourseHandoutsService.updateHandouts(files,bo);
+        //删除本地资源
+        String zhiyuan = System.getProperty("user.dir");
+        Path path = Paths.get(zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan");
+        try (Stream<Path> walk = Files.walk(path)) {
+            walk.sorted(Comparator.reverseOrder())
+                    .forEach(FileUtils::deleteDirectoryStream);
+        }catch (IOException e) {
+            log.error("讲义删除本地资源失败:"+DateUtils.getNowTime());
+        }
+        return true;
+    }
+
+
+    @Override
+    public boolean addHandouts(MultipartFile[] files, CourseHandoutsAddBo bo) {
+        //解压压缩包
+        List<MultipartFile> collect = Arrays.stream(files).filter(x -> x.getOriginalFilename().contains(".zip")).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(collect)){
+            decompressingFiles(collect);
+        }
+        iCourseHandoutsService.addHandouts(files,bo);
+        //删除本地资源
+        String zhiyuan = System.getProperty("user.dir");
+        Path path = Paths.get(zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan");
+        try (Stream<Path> walk = Files.walk(path)) {
+            walk.sorted(Comparator.reverseOrder())
+                    .forEach(FileUtils::deleteDirectoryStream);
+        }catch (IOException e) {
+            log.error("讲义删除本地资源失败:"+DateUtils.getNowTime());
+        }
+        return true;
+    }
+
+    private void decompressingFiles(List<MultipartFile> files){
+        String zhiyuan = System.getProperty("user.dir");
+        files.forEach(file -> {
+            try {
+                String destDirPath = zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan";
+                String substring = file.getOriginalFilename().substring(0, file.getOriginalFilename().indexOf("."));
+                File dirw = new File(destDirPath+"/"+substring);
+                if (!dirw.exists()){
+                    dirw.mkdirs();
+                }
+                ZipInputStream zipIn = new ZipInputStream(file.getInputStream(), Charset.forName("GBK"));
+                ZipEntry entry = zipIn.getNextEntry();
+                while (entry != null) {
+                    String entryName = entry.getName();
+                    String filePath = destDirPath + File.separator + entryName;
+                    if (entry.isDirectory()) {
+                        File dir = new File(filePath);
+                        if (!dir.exists()){
+                            dir.mkdirs();
+                        }
+                    } else {
+                        if (!entryName.contains("/")){
+                            //根目录
+                            filePath = dirw + File.separator + entryName;
+                        }
+                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
+                        byte[] bytesIn = new byte[4096];
+                        int read = 0;
+                        while ((read = zipIn.read(bytesIn)) != -1) {
+                            bos.write(bytesIn, 0, read);
+                        }
+                        bos.close();
+                    }
+                    zipIn.closeEntry();
+                    entry = zipIn.getNextEntry();
+                }
+                zipIn.close();
+
+            }catch (IOException e) {
+                e.printStackTrace();
+                throw new CustomException("解压压缩文件错误!");
+            }
+        });
+
+    }
 }

+ 293 - 22
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java

@@ -4,12 +4,15 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.modules.alioss.bo.OssRequest;
+import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CourseFile;
 import com.zhongzheng.modules.course.domain.CourseHandouts;
@@ -18,14 +21,27 @@ import com.zhongzheng.modules.course.mapper.CourseHandoutsMapper;
 import com.zhongzheng.modules.course.service.ICourseFileService;
 import com.zhongzheng.modules.course.service.ICourseHandoutsBusinessService;
 import com.zhongzheng.modules.course.service.ICourseHandoutsService;
+import com.zhongzheng.modules.course.vo.CourseFileVo;
 import com.zhongzheng.modules.course.vo.CourseHandoutsBusinessVo;
 import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.io.IOUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -47,12 +63,14 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
     private IGoodsService iGoodsService;
     @Autowired
     private ICourseFileService iCourseFileService;
+    @Autowired
+    private OssService ossService;
 
 
     @Override
-    public CourseHandoutsVo queryById(Long handoutsId){
+    public CourseHandoutsVo queryById(Long handoutsId) {
         CourseHandouts db = this.baseMapper.selectById(handoutsId);
-        if (Validator.isEmpty(db)){
+        if (Validator.isEmpty(db)) {
             throw new CustomException("查无数据");
         }
         //获得讲义业务层
@@ -62,13 +80,36 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
 
         CourseFileQueryBo queryBo = new CourseFileQueryBo();
         queryBo.setHandoutsId(courseHandoutsVo.getHandoutsId());
-        courseHandoutsVo.setFileList(iCourseFileService.queryList(queryBo));
+        List<CourseFileVo> courseFileVos = iCourseFileService.queryList(queryBo);
+        if (CollectionUtils.isEmpty(courseFileVos)){
+            return courseHandoutsVo;
+        }
+        List<CourseFileVo> fileVos = courseFileVos.stream().filter(item -> item.getParentId() == 0L).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(fileVos)){
+            fileVos.forEach(file -> {
+                assembleFile(file,courseFileVos);
+            });
+            courseHandoutsVo.setFileList(fileVos);
+        }
         return courseHandoutsVo;
     }
 
+    private void assembleFile(CourseFileVo parent,List<CourseFileVo> childs){
+        if (CollectionUtils.isEmpty(childs)){
+            return;
+        }
+        List<CourseFileVo> collect = childs.stream().filter(x -> x.getParentId().equals(parent.getFileId())).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(collect)){
+            return;
+        }
+        parent.setChildren(collect);
+        collect.forEach(item -> {
+            assembleFile(item,childs);
+        });
+    }
+
     @Override
     public List<CourseHandoutsVo> queryList(CourseHandoutsQueryBo bo) {
-
         return entity2Vo(baseMapper.queryList(bo));
     }
 
@@ -78,19 +119,19 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
     }
 
     /**
-    * 实体类转化成视图对象
-    *
-    * @param collection 实体类集合
-    * @return
-    */
+     * 实体类转化成视图对象
+     *
+     * @param collection 实体类集合
+     * @return
+     */
     private List<CourseHandoutsVo> entity2Vo(Collection<CourseHandouts> collection) {
         List<CourseHandoutsVo> voList = collection.stream()
                 .map(any -> BeanUtil.toBean(any, CourseHandoutsVo.class))
                 .collect(Collectors.toList());
         if (collection instanceof Page) {
-            Page<CourseHandouts> page = (Page<CourseHandouts>)collection;
+            Page<CourseHandouts> page = (Page<CourseHandouts>) collection;
             Page<CourseHandoutsVo> pageVo = new Page<>();
-            BeanUtil.copyProperties(page,pageVo);
+            BeanUtil.copyProperties(page, pageVo);
             pageVo.addAll(voList);
             voList = pageVo;
         }
@@ -143,7 +184,7 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         validEntityBeforeSave(update);
         update.setUpdateTime(DateUtils.getNowTime());
         LambdaQueryWrapper<CourseHandoutsBusiness> lqw = Wrappers.lambdaQuery();
-        lqw.eq(CourseHandoutsBusiness::getHandoutsId,bo.getHandoutsId());
+        lqw.eq(CourseHandoutsBusiness::getHandoutsId, bo.getHandoutsId());
         courseHandoutsBusinessService.remove(lqw);
         //添加讲义绑定的业务层次
         if (!CollectionUtils.isEmpty(bo.getCourseHandoutsBusinessAddBos())) {
@@ -176,23 +217,22 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
     }
 
 
-
     /**
      * 保存前的数据校验
      *
      * @param entity 实体类数据
      */
-    private void validEntityBeforeSave(CourseHandouts entity){
+    private void validEntityBeforeSave(CourseHandouts entity) {
         //TODO 做一些数据校验,如唯一约束
-        if(Validator.isNotEmpty(entity.getHandoutsId())){
-            if(entity.getStatus()==0){
-                CourseHandouts courseHandouts =this.baseMapper.selectById(entity.getHandoutsId());
-                if(courseHandouts.getStatus()==1){
+        if (Validator.isNotEmpty(entity.getHandoutsId())) {
+            if (entity.getStatus() == 0) {
+                CourseHandouts courseHandouts = this.baseMapper.selectById(entity.getHandoutsId());
+                if (courseHandouts.getStatus() == 1) {
                     //从发布改为未发布
                     LambdaQueryWrapper<Goods> lqw = Wrappers.lambdaQuery();
-                    lqw.eq( Goods::getHandoutsId, entity.getHandoutsId());
+                    lqw.eq(Goods::getHandoutsId, entity.getHandoutsId());
                     Goods goods = iGoodsService.getOne(lqw.last("limit 1"));
-                    if(Validator.isNotEmpty(goods)){
+                    if (Validator.isNotEmpty(goods)) {
                         throw new CustomException("该讲义已被关联,禁止改为未发布");
                     }
 
@@ -203,7 +243,7 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
 
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return this.removeByIds(ids);
@@ -211,6 +251,237 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
 
     @Override
     public CourseHandouts getHandoutsByTenant(String encoder, Long newTenantId) {
-        return baseMapper.getHandoutsByTenant(encoder,newTenantId);
+        return baseMapper.getHandoutsByTenant(encoder, newTenantId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addHandouts(MultipartFile[] files, CourseHandoutsAddBo bo) {
+        CourseHandouts add = BeanUtil.toBean(bo, CourseHandouts.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        add.setEncoder(ServletUtils.getEncoded("JYLB"));
+        boolean save = this.save(add);
+        //添加讲义绑定的业务层次
+        for (CourseHandoutsBusinessAddBo courseHandoutsBusinessAddBo : bo.getCourseHandoutsBusinessAddBos()) {
+            CourseHandoutsBusiness addBusiness = BeanUtil.toBean(courseHandoutsBusinessAddBo, CourseHandoutsBusiness.class);
+            addBusiness.setHandoutsId(add.getHandoutsId());
+            addBusiness.setCreateTime(DateUtils.getNowTime());
+            addBusiness.setUpdateTime(DateUtils.getNowTime());
+            courseHandoutsBusinessService.save(addBusiness);
+        }
+        for (MultipartFile multipartFile : files) {
+            if (multipartFile.getOriginalFilename().contains(".zip")) {
+                try {
+                    matchingFile(multipartFile.getOriginalFilename(),add.getHandoutsId(),0L);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    throw new CustomException("解压/上传zip包失败");
+                }
+            }else {
+                try {
+                    //文件
+                    CourseFile courseFile = new CourseFile();
+                    //上传oss
+                    String ossPath = ossService.uploadInputStream(multipartFile.getInputStream(), 17);
+                    courseFile.setUrlName(multipartFile.getOriginalFilename());
+                    courseFile.setUrl(ossPath);
+                    courseFile.setStatus(1);
+                    courseFile.setSort(1);
+                    courseFile.setCreateTime(DateUtils.getNowTime());
+                    courseFile.setUpdateTime(DateUtils.getNowTime());
+                    courseFile.setHandoutsId(add.getHandoutsId());
+                    courseFile.setType(1);//文件
+                    courseFile.setParentId(0L);
+                    iCourseFileService.save(courseFile);
+                }catch (Exception e){
+                    e.printStackTrace();
+                    throw new CustomException("上传文件失败");
+                }
+            }
+        }
+        return true;
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateHandouts(MultipartFile[] files, CourseHandoutsEditBo bo) {
+        CourseHandouts update = BeanUtil.toBean(bo, CourseHandouts.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        LambdaQueryWrapper<CourseHandoutsBusiness> lqw = Wrappers.lambdaQuery();
+        lqw.eq(CourseHandoutsBusiness::getHandoutsId, bo.getHandoutsId());
+        courseHandoutsBusinessService.remove(lqw);
+        //添加讲义绑定的业务层次
+        if (!CollectionUtils.isEmpty(bo.getCourseHandoutsBusinessAddBos())) {
+            for (CourseHandoutsBusinessAddBo courseHandoutsBusinessAddBo : bo.getCourseHandoutsBusinessAddBos()) {
+                CourseHandoutsBusiness addBusiness = BeanUtil.toBean(courseHandoutsBusinessAddBo, CourseHandoutsBusiness.class);
+                addBusiness.setHandoutsId(bo.getHandoutsId());
+                addBusiness.setCreateTime(DateUtils.getNowTime());
+                addBusiness.setUpdateTime(DateUtils.getNowTime());
+                courseHandoutsBusinessService.save(addBusiness);
+            }
+        }
+        //删除原有的关联重新绑定
+        iCourseFileService.remove(new LambdaQueryWrapper<CourseFile>().eq(CourseFile::getHandoutsId, update.getHandoutsId()));
+        if (!CollectionUtils.isEmpty(bo.getFileList())){
+            handleFile(bo.getFileList(),update.getHandoutsId(),files,0L);
+        }
+        //修改完成
+        update.setUpdateStatus(1);
+        return this.updateById(update);
+    }
+
+
+    private void handleFile(List<CourseFileAddBo> fileList,Long handoutsId,MultipartFile[] files,Long parentId){
+        fileList.forEach(bo -> {
+            Long fileId = 0L;
+            if (ObjectUtils.isNull(bo.getFileId())){
+                //新增讲义
+                fileId = handleAddFile(files,bo.getUrlName(),parentId,handoutsId);
+            }else {
+                bo.setFileId(null);
+                bo.setParentId(parentId);
+                bo.setHandoutsId(handoutsId);
+                CourseFile courseFile = BeanUtil.toBean(bo, CourseFile.class);
+                courseFile.setCreateTime(DateUtils.getNowTime());
+                courseFile.setUpdateTime(DateUtils.getNowTime());
+                iCourseFileService.save(courseFile);
+                fileId = courseFile.getFileId();
+            }
+            if (!CollectionUtils.isEmpty(bo.getChildren())){
+                handleFile(bo.getChildren(),handoutsId,files,fileId);
+            }
+        });
+    }
+
+    private Long handleAddFile(MultipartFile[] files, String addFileName, Long fileId, Long handoutsId) {
+        //新增文件资源
+        MultipartFile multipartFile = Arrays.stream(files).filter(item -> item.getOriginalFilename().equals(addFileName)).findFirst().orElse(null);
+        if (ObjectUtils.isNotNull(multipartFile)){
+            if (multipartFile.getOriginalFilename().contains(".zip")) {
+                try {
+                    return matchingFile(addFileName,handoutsId,fileId);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    throw new CustomException("解压/上传zip包失败");
+                }
+            }else {
+                try {
+                    //文件
+                    CourseFile file = new CourseFile();
+
+                    //上传阿里云
+                    OssRequest ossRequest = new OssRequest();
+                    ossRequest.setFile(multipartFile);
+                    ossRequest.setImageStatus(17);
+                    String upload = ossService.upload(ossRequest);
+//                    String ossPath = ossService.uploadInputStream(multipartFile.getInputStream(), 17);
+                    file.setUrlName(multipartFile.getOriginalFilename());
+                    file.setUrl(upload);
+                    file.setStatus(1);
+                    file.setSort(1);
+                    file.setCreateTime(DateUtils.getNowTime());
+                    file.setUpdateTime(DateUtils.getNowTime());
+                    file.setHandoutsId(handoutsId);
+                    file.setType(1);//文件
+                    file.setParentId(fileId);
+                    iCourseFileService.save(file);
+                    return file.getFileId();
+                }catch (Exception e){
+                    e.printStackTrace();
+                    throw new CustomException("上传文件失败");
+                }
+            }
+        }
+        return 0L;
+    }
+
+    private Long matchingFile(String addFileName, Long handoutsId, Long fileId) throws Exception {
+        String zhiyuan = System.getProperty("user.dir");
+        String destDirPath = zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan";
+        String substring = addFileName.substring(0, addFileName.indexOf("."));
+        String path =  destDirPath+"/"+ substring;
+        //文件夹
+        CourseFile courseFile = new CourseFile();
+        courseFile.setUrlName(substring);
+        courseFile.setStatus(1);
+        courseFile.setSort(1);
+        courseFile.setCreateTime(DateUtils.getNowTime());
+        courseFile.setUpdateTime(DateUtils.getNowTime());
+        courseFile.setHandoutsId(handoutsId);
+        courseFile.setType(2);//文件夹
+        courseFile.setParentId(fileId);
+        iCourseFileService.save(courseFile);
+        //处理讲义文件
+        getFileNames(new File(path), courseFile.getFileId(), handoutsId);
+        return courseFile.getFileId();
+    }
+
+
+    /**
+     * 得到文件名称
+     *
+     * @param file     文件
+     * @param parentId 父ID
+     * @return {@link List}<{@link String}>
+     */
+    private void getFileNames(File file, Long parentId, Long handoutsId) throws Exception {
+        File[] files = file.listFiles();
+        for (File f : files) {
+            if (f.isDirectory()) {
+                //文件夹
+                CourseFile courseFile = new CourseFile();
+                courseFile.setUrlName(f.getName());
+                courseFile.setStatus(1);
+                courseFile.setSort(1);
+                courseFile.setCreateTime(DateUtils.getNowTime());
+                courseFile.setUpdateTime(DateUtils.getNowTime());
+                courseFile.setHandoutsId(handoutsId);
+                courseFile.setType(2);//文件夹
+                courseFile.setParentId(parentId);
+                iCourseFileService.save(courseFile);
+                getFileNames(f, courseFile.getFileId(), handoutsId);
+            } else {
+                //文件
+                CourseFile courseFile = new CourseFile();
+                //上传阿里云
+                OssRequest ossRequest = new OssRequest();
+                ossRequest.setFile(getMultipartFile(f));
+                ossRequest.setImageStatus(17);
+                String upload = ossService.upload(ossRequest);
+//                //上传oss
+//                String ossPath = ossService.uploadInputStream(new FileInputStream(f), 17);
+                courseFile.setUrlName(f.getName());
+                courseFile.setUrl(upload);
+                courseFile.setStatus(1);
+                courseFile.setSort(1);
+                courseFile.setCreateTime(DateUtils.getNowTime());
+                courseFile.setUpdateTime(DateUtils.getNowTime());
+                courseFile.setHandoutsId(handoutsId);
+                courseFile.setType(1);//文件
+                courseFile.setParentId(parentId);
+                iCourseFileService.save(courseFile);
+            }
+        }
     }
+
+    public static MultipartFile getMultipartFile(File file) {
+        FileItem item = new DiskFileItemFactory().createItem("file"
+                , MediaType.MULTIPART_FORM_DATA_VALUE
+                , true
+                , file.getName());
+        try (InputStream input = new FileInputStream(file);
+             OutputStream os = item.getOutputStream()) {
+            // 流转移
+            IOUtils.copy(input, os);
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Invalid file: " + e, e);
+        }
+
+        return new CommonsMultipartFile(item);
+    }
+
 }

+ 8 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseFileVo.java

@@ -1,12 +1,11 @@
 package com.zhongzheng.modules.course.vo;
 
 import com.zhongzheng.common.annotation.Excel;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import java.util.Date;
 
+import java.util.List;
 
 
 /**
@@ -44,4 +43,11 @@ public class CourseFileVo {
 	@Excel(name = "排序")
 	@ApiModelProperty("排序")
 	private Integer sort;
+
+	@ApiModelProperty("类型:1文件 2文件夹")
+	private Integer type;
+
+	private Long parentId;
+
+	private List<CourseFileVo> children;
 }

+ 4 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseHandoutsVo.java

@@ -1,11 +1,10 @@
 package com.zhongzheng.modules.course.vo;
 
 import com.zhongzheng.common.annotation.Excel;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import java.util.Date;
+
 import java.util.List;
 
 
@@ -55,6 +54,9 @@ public class CourseHandoutsVo {
 	@ApiModelProperty("0不可下载 1下载")
 	private Integer canDownload;
 
+	@ApiModelProperty("修改状态:1正常 0修改中")
+	private Integer updateStatus;
+
 	/** 地址 */
 	@Excel(name = "地址")
 	@ApiModelProperty("地址")

+ 1 - 0
zhongzheng-system/src/main/resources/mapper/modules/course/CourseHandoutsMapper.xml

@@ -11,6 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="handoutsUrl" column="handouts_url"/>
         <result property="encoder" column="encoder"/>
         <result property="canDownload" column="can_download"/>
+        <result property="updateStatus" column="update_status"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.course.domain.CourseHandoutsBusiness" id="CourseHandoutsBusinessResult">