Browse Source

资料库

zhijiezhao 2 years ago
parent
commit
a6b867f11d

+ 6 - 0
pom.xml

@@ -41,6 +41,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <!--缩略图-->
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.8</version>
+        </dependency>
         <!-- oss获取token -->
         <dependency>
             <groupId>com.aliyun</groupId>

+ 1 - 0
src/main/java/com/caimei/AdminApplication.java

@@ -9,6 +9,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.EnableMBeanExport;
 import org.springframework.context.annotation.Import;
 import org.springframework.jmx.support.RegistrationPolicy;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 import javax.servlet.MultipartConfigElement;
 

+ 33 - 0
src/main/java/com/caimei/config/TaskPoolConfig.java

@@ -0,0 +1,33 @@
+package com.caimei.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/11/12
+ */
+@Configuration
+@EnableAsync
+public class TaskPoolConfig {
+    @Bean("taskExecutor")
+    public Executor taskExecutor(){
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(10);
+        executor.setMaxPoolSize(20);
+        executor.setQueueCapacity(200);
+        executor.setKeepAliveSeconds(60);
+        executor.setThreadNamePrefix("asyncTask-");
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        executor.setAwaitTerminationSeconds(60);
+        return executor;
+    }
+}

+ 5 - 3
src/main/java/com/caimei/controller/admin/data/ArticleApi.java

@@ -60,7 +60,8 @@ public class ArticleApi {
     }
 
     @ApiOperation("添加/编辑文章")
-    @ApiImplicitParam(name = "params", value = "articleId:文章id;articleTitle:文章标题;articleImage:文章图片;articleContent:文章内容;parentId:父级文件夹id;articleType:文章类型1自主2第三方", required = true)
+    @ApiImplicitParam(name = "params", value = "articleId:文章id;articleTitle:文章标题;articleImage:文章图片;articleContent:文章内容;" +
+            "parentId:父级文件夹id;articleType:文章类型1自主2第三方;articleLink:文章链接", required = true)
     @PostMapping("/save")
     public ResponseJson saveArticle(@CurrentUser SysUser sysUser, @RequestBody String params) {
         if (null == sysUser) {
@@ -76,8 +77,9 @@ public class ArticleApi {
         String articleContent = paramsMap.getString("articleContent");
         Integer parentId = paramsMap.getInteger("parentId");
         Integer sort = paramsMap.getInteger("sort");
-        Integer articleType=paramsMap.getInteger("articleType");
-        return articleService.saveArticle(articleId, authUserId, articleTitle, articleImage, articleContent, sort, parentId,articleType);
+        Integer articleType = paramsMap.getInteger("articleType");
+        String articleLink = paramsMap.getString("articleLink");
+        return articleService.saveArticle(articleId, authUserId, articleTitle, articleImage, articleContent, sort, parentId, articleType, articleLink);
     }
 
     @ApiOperation("文章回显数据")

+ 42 - 7
src/main/java/com/caimei/controller/admin/auth/DatabaseApi.java → src/main/java/com/caimei/controller/admin/data/DatabaseApi.java

@@ -1,4 +1,4 @@
-package com.caimei.controller.admin.auth;
+package com.caimei.controller.admin.data;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.annotation.CurrentUser;
@@ -47,6 +47,22 @@ public class DatabaseApi {
         return databaseService.getFileById(fileId, authUserId);
     }
 
+    @ApiOperation("获取文件详情")
+    @ApiImplicitParam(name = "fileId", required = true, value = "文件Id")
+    @GetMapping("/file/detail")
+    public ResponseJson<FileTreeVo> getFileDetail(@CurrentUser SysUser sysUser, Integer fileId) {
+        if (null == sysUser) {
+            return ResponseJson.error("用户信息异常", null);
+        }
+        // 获取供应商用户id
+        Integer userIdentity = sysUser.getUserIdentity();
+        Integer authUserId = 2 == userIdentity ? sysUser.getId() : 3 == userIdentity ? sysUser.getParentId() : null;
+        if (null == authUserId) {
+            return ResponseJson.error("供应商用户id不能为空", null);
+        }
+        return databaseService.getFileDetail(fileId, authUserId);
+    }
+
     @ApiOperation("面包屑")
     @ApiImplicitParam(name = "fileId", required = true, value = "当前文件夹Id")
     @GetMapping("/path/crumbs")
@@ -106,16 +122,16 @@ public class DatabaseApi {
             @ApiImplicitParam(name = "parentId", required = true, value = "目标文件夹Id")
     })
     @PostMapping("/move/package")
-    public ResponseJson movePackage(@RequestBody String param ) {
+    public ResponseJson movePackage(@RequestBody String param) {
         JSONObject jsonObject = JSONObject.parseObject(param);
-        Integer fileId = jsonObject.getInteger("fileId");
-        Integer parentId=jsonObject.getInteger("parentId");
+        String fileId = jsonObject.getString("fileId");
+        Integer parentId = jsonObject.getInteger("parentId");
         return databaseService.movePackage(fileId, parentId);
     }
 
     @ApiOperation("文件夹目录")
     @GetMapping("/file/tree")
-    public ResponseJson<FileTreeVo> getPackageTree(@CurrentUser SysUser sysUser){
+    public ResponseJson<FileTreeVo> getPackageTree(@CurrentUser SysUser sysUser) {
         if (null == sysUser) {
             return ResponseJson.error("用户信息异常", null);
         }
@@ -147,6 +163,24 @@ public class DatabaseApi {
         return databaseService.downLoadZip(fileId, fileName, authUserId, response);
     }
 
+    @ApiOperation("勾选文件下载")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fileId", required = true, value = "勾选文件Id,逗号分隔")
+    })
+    @GetMapping("/path/chose/zip")
+    public ResponseJson downLoadChoseZip(@CurrentUser SysUser sysUser, String fileId, HttpServletResponse response) {
+        if (null == sysUser) {
+            return ResponseJson.error("用户信息异常", null);
+        }
+        // 获取供应商用户id
+        Integer userIdentity = sysUser.getUserIdentity();
+        Integer authUserId = 2 == userIdentity ? sysUser.getId() : 3 == userIdentity ? sysUser.getParentId() : null;
+        if (null == authUserId) {
+            return ResponseJson.error("供应商用户id不能为空", null);
+        }
+        return databaseService.downLoadChoseZip(fileId, authUserId, response);
+    }
+
     @ApiOperation("删除文件")
     @ApiImplicitParam(name = "fileId", required = true, value = "当前文件Id")
     @PostMapping("/delete/file")
@@ -157,7 +191,7 @@ public class DatabaseApi {
     }
 
     @ApiOperation("上传结果")
-    @ApiImplicitParam(name = "params", required = true, value = "fileName:文件原名;ossName:阿里云文件名:ossUrl:阿里云文件url;fileSize:文件大小;parentId:父级文件夹id")
+    @ApiImplicitParam(name = "params", required = true, value = "fileName:文件原名;ossName:阿里云文件名:ossUrl:阿里云文件url;fileSize:文件大小;parentId:父级文件夹id;mime:文件application")
     @PostMapping("/oss/upload/result")
     public ResponseJson getOssUploadResult(@CurrentUser SysUser sysUser, @RequestBody String params) {
         if (null == sysUser) {
@@ -175,7 +209,8 @@ public class DatabaseApi {
         String ossUrl = parseObject.getString("ossUrl");
         String fileSize = parseObject.getString("fileSize");
         Integer parentId = parseObject.getInteger("parentId");
-        return databaseService.getOssUploadResult(authUserId, fileName, ossName, ossUrl, fileSize, parentId);
+        String mime = parseObject.getString("mime");
+        return databaseService.getOssUploadResult(authUserId, fileName, ossName, ossUrl, fileSize, parentId,mime);
     }
 
     @ApiOperation("获取阿里云token")

+ 47 - 0
src/main/java/com/caimei/controller/noToken/WxDatabaseApi.java

@@ -0,0 +1,47 @@
+package com.caimei.controller.noToken;
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.vo.FileTreeVo;
+import com.caimei.service.data.DatabaseService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "前端资料库Api")
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/notoken/path")
+public class WxDatabaseApi {
+
+    private final DatabaseService databaseService;
+
+    @ApiOperation("获取当前路径下文件")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fileId", required = true, value = "文件Id"),
+            @ApiImplicitParam(name = "authUserId", required = true, value = "供应商用户id")
+    })
+    @GetMapping("/file")
+    public ResponseJson<List<FileTreeVo>> getFileById(Integer fileId, Integer authUserId) {
+        return databaseService.getFileById(fileId, authUserId);
+    }
+
+    @ApiOperation("面包屑")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fileId", required = true, value = "当前文件夹Id"),
+            @ApiImplicitParam(name = "authUserId", required = true, value = "供应商用户id")
+    })
+    @GetMapping("/crumbs")
+    public ResponseJson<FileTreeVo> getCrumbs(Integer fileId, Integer authUserId) {
+        return databaseService.getCrumbs(fileId, authUserId);
+    }
+
+}

+ 7 - 19
src/main/java/com/caimei/controller/wechat/WxDataApi.java

@@ -1,8 +1,10 @@
 package com.caimei.controller.wechat;
 
 import com.alibaba.fastjson.JSONObject;
+import com.caimei.annotation.CurrentUser;
 import com.caimei.aop.IpSave;
 import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysUser;
 import com.caimei.model.vo.*;
 import com.caimei.service.auth.*;
 import com.caimei.service.data.DatabaseService;
@@ -52,25 +54,11 @@ public class WxDataApi {
         return articleService.getWxArticleList(authUserId, articleTitle, pageNum, pageSize);
     }
 
-    @ApiOperation("获取当前路径下文件")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "fileId", required = true, value = "文件Id"),
-            @ApiImplicitParam(name = "authUserId", required = true, value = "供应商用户id")
-    })
-    @GetMapping("/path/file")
-    public ResponseJson<List<FileTreeVo>> getFileById(Integer fileId, Integer authUserId) {
-        return databaseService.getFileById(fileId, authUserId);
-    }
-
-
-    @ApiOperation("面包屑")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "fileId", required = true, value = "当前文件夹Id"),
-            @ApiImplicitParam(name = "authUserId", required = true, value = "供应商用户id")
-    })
-    @GetMapping("/path/crumbs")
-    public ResponseJson<FileTreeVo> getCrumbs(Integer fileId, Integer authUserId) {
-        return databaseService.getCrumbs(fileId, authUserId);
+    @ApiOperation("获取文件详情")
+    @ApiImplicitParam(name = "fileId", required = true, value = "文件Id")
+    @GetMapping("/file/detail")
+    public ResponseJson<FileTreeVo> getFileDetail(Integer authUserId, Integer fileId) {
+        return databaseService.getFileDetail(fileId, authUserId);
     }
 
     @ApiOperation("下载文件夹")

+ 4 - 0
src/main/java/com/caimei/mapper/cmMapper/FileMapper.java

@@ -72,4 +72,8 @@ public interface FileMapper {
     FileTreeVo findFile(@Param("fileId")Integer fileId,@Param("authUserId") Integer authUserId,@Param("packageType")Integer packageType);
 
     void deleteFileTreeById(Integer fileId);
+
+    String findShopPrefix(Integer authUserId);
+
+    void insertImgUrl(FileTreeVo fileTreeVo);
 }

+ 4 - 0
src/main/java/com/caimei/model/po/ArticlePo.java

@@ -78,4 +78,8 @@ public class ArticlePo {
      * 文章类型1自主2第三方
      */
     private Integer articleType;
+    /**
+     * 第三方文章链接
+     */
+    private String articleLink;
 }

+ 6 - 0
src/main/java/com/caimei/model/vo/ArticleFormVo.java

@@ -32,4 +32,10 @@ public class ArticleFormVo {
 
     @ApiModelProperty("排序值")
     private Integer sort;
+
+    @ApiModelProperty("文章类型")
+    private Integer articleType;
+
+    @ApiModelProperty("文章链接")
+    private String articleLink;
 }

+ 12 - 0
src/main/java/com/caimei/model/vo/FileTreeVo.java

@@ -60,4 +60,16 @@ public class FileTreeVo implements Serializable {
      * 0是文件夹,1不是
      */
     private Integer packageType;
+    /**
+     * 文件扩展类型
+     */
+    private String mime;
+    /**
+     * 文章Id
+     */
+    private Integer articleId;
+    /**
+     * 缩略图url
+     */
+    private String screenshot;
 }

+ 139 - 0
src/main/java/com/caimei/service/async/AsyncService.java

@@ -0,0 +1,139 @@
+package com.caimei.service.async;
+
+import com.caimei.config.FastDfsClient;
+import com.caimei.mapper.cmMapper.FileMapper;
+import com.caimei.model.po.ArticlePo;
+import com.caimei.model.vo.FileTreeVo;
+import com.caimei.utils.FileZipUtils;
+import com.caimei.utils.OSSUtils;
+import lombok.extern.slf4j.Slf4j;
+import net.coobird.thumbnailator.Thumbnails;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
+
+import javax.annotation.Resource;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.UUID;
+
+/**
+ * @author zzj
+ */
+@Slf4j
+@Component
+public class AsyncService {
+
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    @Value("${caimei.zplmapi}")
+    private String zplmapi;
+
+    @Resource
+    private FileMapper fileMapper;
+
+    @Value("${caimei.imageDomain}")
+    private String imageDomain;
+
+    @Resource
+    private FastDfsClient client;
+
+    @Async("taskExecutor")
+    public void saveArticleImage(boolean insertFlag, ArticlePo article, Integer parentId) {
+        if (insertFlag) {
+            //保存文章相关属性
+            FileTreeVo fileTreeVo = new FileTreeVo();
+            fileTreeVo.setPackageType(1);
+            fileTreeVo.setMime("text/plain");
+            fileTreeVo.setFileName(article.getTitle());
+            fileTreeVo.setFileType("article");
+            fileTreeVo.setParentId(parentId);
+            fileTreeVo.setAuthUserId(article.getAuthUserId());
+            fileTreeVo.setArticleId(article.getId());
+            UUID uuid = UUID.randomUUID();
+            fileTreeVo.setOssName(uuid + ".txt");
+            //http://192.168.2.92:8888/:authUserId/:prefix/docs/article-detail?fileId=fileId
+            String prefix = fileMapper.findShopPrefix(article.getAuthUserId());
+            prefix = null == prefix ? "app" : prefix;
+            String path = "/" + article.getAuthUserId() + "/" + prefix + "/docs/article-detail?articleId=" + article.getId();
+            if ("dev".equals(active)) {
+                path = "http://192.168.2.92:8888" + path;
+            } else {
+                path = zplmapi + path;
+            }
+            fileTreeVo.setOssUrl(path);
+            fileMapper.insertNewFile(fileTreeVo);
+            //创建txt文件保存链接上传到阿里云
+            String delPath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/" + uuid;
+            String filePath = delPath + "/";
+            if ("dev".equals(active)) {
+                delPath = "D:\\caimei-workSpace\\file\\" + uuid;
+                filePath = delPath + "\\";
+            }
+            File file = writeTxt(filePath, path);
+            OSSUtils.ossUpload(fileTreeVo.getOssName(), file, "text/plain", null);
+            File fileDir = new File(delPath);
+            Boolean aBoolean = FileZipUtils.deleteFile(fileDir);
+            log.info("临时txt删除------------>" + aBoolean);
+        }
+    }
+
+    private File writeTxt(String filePath, String content) {
+        File fileDir = new File(filePath);
+        boolean mkdirs = fileDir.mkdirs();
+        Assert.isTrue(mkdirs, "文件夹创建失败");
+        FileWriter fw = null;
+        File file = new File(filePath + "1.txt");
+        try {
+            if (!file.exists()) {
+                file.createNewFile();
+            }
+            fw = new FileWriter(filePath + "1.txt");
+            BufferedWriter bw = new BufferedWriter(fw);
+            bw.write(content);
+            bw.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                fw.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return file;
+    }
+
+    public void insertScreenshot(FileTreeVo fileTreeVo) {
+        UUID uuid = UUID.randomUUID();
+        String delPath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/" + uuid;
+        String filePath = delPath + "/" + fileTreeVo.getFileName();
+        String newImage = delPath + "/";
+        String imgUrl = "";
+        if ("dev".equals(active)) {
+            delPath = "D:\\caimei-workSpace\\file\\" + uuid;
+            filePath = delPath + "\\" + fileTreeVo.getFileName();
+            newImage = delPath + "\\";
+        }
+        File fileDir = new File(delPath);
+        boolean mkdirs = fileDir.mkdirs();
+        Assert.isTrue(mkdirs, "文件夹创建失败");
+
+        OSSUtils.downFileByFilePath("authFile/", fileTreeVo.getOssName(), filePath);
+        try {
+            Thumbnails.of(filePath).size(64, 64).toFile(newImage + "newImages." + fileTreeVo.getFileType());
+            imgUrl = imageDomain + "/" + client.uploadFile(newImage + "newImages." + fileTreeVo.getFileType());
+        } catch (IOException e) {
+            log.error("压缩图失败:" + e);
+        }
+        fileTreeVo.setScreenshot(imgUrl);
+        fileMapper.insertImgUrl(fileTreeVo);
+//        FileZipUtils.deleteFile(fileDir);
+    }
+}

+ 1 - 1
src/main/java/com/caimei/service/auth/ArticleService.java

@@ -40,7 +40,7 @@ public interface ArticleService {
      * @param parentId       父级文件夹id
      * @return ResponseJson
      */
-    ResponseJson saveArticle(Integer articleId, Integer authUserId, String articleTitle, String articleImage, String articleContent, Integer sort, Integer parentId,Integer articleType);
+    ResponseJson saveArticle(Integer articleId, Integer authUserId, String articleTitle, String articleImage, String articleContent, Integer sort, Integer parentId,Integer articleType,String articleLink);
 
     /**
      * 更新文章状态

+ 22 - 6
src/main/java/com/caimei/service/auth/impl/ArticleServiceImpl.java

@@ -2,17 +2,22 @@ package com.caimei.service.auth.impl;
 
 import com.caimei.mapper.cmMapper.ArticleMapper;
 import com.caimei.mapper.cmMapper.AuthMapper;
+import com.caimei.mapper.cmMapper.FileMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.ArticlePo;
 import com.caimei.model.po.SysUser;
 import com.caimei.model.vo.ArticleFormVo;
 import com.caimei.model.vo.ArticleListVo;
+import com.caimei.model.vo.FileTreeVo;
 import com.caimei.model.vo.WxArticleListVo;
+import com.caimei.service.async.AsyncService;
 import com.caimei.service.auth.ArticleService;
+import com.caimei.utils.OSSUtils;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -35,6 +40,9 @@ public class ArticleServiceImpl implements ArticleService {
     @Resource
     private AuthMapper authMapper;
 
+    @Resource
+    private AsyncService asyncService;
+
     @Override
     public ResponseJson<PageInfo<ArticleListVo>> getArticleList(Integer listType, Integer authUserId, String articleTitle, Integer auditStatus, Integer status, Integer pageNum, Integer pageSize) {
         listType = null == listType ? 1 : listType;
@@ -45,7 +53,7 @@ public class ArticleServiceImpl implements ArticleService {
     }
 
     @Override
-    public ResponseJson saveArticle(Integer articleId, Integer authUserId, String articleTitle, String articleImage, String articleContent, Integer sort, Integer parentId,Integer articleType) {
+    public ResponseJson saveArticle(Integer articleId, Integer authUserId, String articleTitle, String articleImage, String articleContent, Integer sort, Integer parentId, Integer articleType, String articleLink) {
         if (null == articleId && null == authUserId) {
             return ResponseJson.error("参数异常,请输入供应商用户id");
         }
@@ -55,12 +63,18 @@ public class ArticleServiceImpl implements ArticleService {
         if (StringUtils.isEmpty(articleImage)) {
             return ResponseJson.error("参数异常,请输入文章图片");
         }
-        if (StringUtils.isEmpty(articleContent)) {
+        if (null == articleType) {
+            return ResponseJson.error("参数异常,请选择文章类型");
+        }
+        if (1 == articleType && StringUtils.isEmpty(articleContent)) {
             return ResponseJson.error("参数异常,请输入文章内容");
         }
-        if (null == sort) {
-            return ResponseJson.error("排序值不能为空");
+        if (2 == articleType && StringUtils.isBlank(articleLink)) {
+            return ResponseJson.error("参数异常,请输入文章链接");
         }
+//        if (null == sort) {
+//            return ResponseJson.error("排序值不能为空");
+//        }
         boolean insertFlag = null == articleId;
         ArticleFormVo dbArticle = null;
         if (!insertFlag) {
@@ -73,7 +87,9 @@ public class ArticleServiceImpl implements ArticleService {
         article.setTitle(articleTitle);
         article.setImage(articleImage);
         article.setContent(articleContent);
-        article.setSort(sort);
+        article.setArticleLink(articleLink);
+        article.setArticleType(articleType);
+//        article.setSort(sort);
         // 供应商保存,直接上线;机构保存,需要供应商审核通过后才上线
         if (null != dbArticle && 1 != dbArticle.getAuditStatus()) {
             // 被驳回的数据,编辑后变为待审核状态
@@ -93,12 +109,12 @@ public class ArticleServiceImpl implements ArticleService {
             // 插入文章
             articleMapper.insertArticle(article);
             log.info("返回id------------》" + article.getId());
-//            articleMapper.inertDatabaseLink(article.getId(),articleTitle,sys )
         } else {
             article.setId(articleId);
             // 更新文章
             articleMapper.updateArticleByArticleId(article);
         }
+        asyncService.saveArticleImage(insertFlag, article, parentId);
         return ResponseJson.success("保存文章成功");
     }
 

+ 6 - 2
src/main/java/com/caimei/service/data/DatabaseService.java

@@ -21,15 +21,19 @@ public interface DatabaseService {
 
     ResponseJson<HashMap<String, String>> ossTokenGet();
 
-    ResponseJson getOssUploadResult(Integer authUserId,String fileName, String ossName, String ossUrl, String fileSize,Integer parentId);
+    ResponseJson getOssUploadResult(Integer authUserId,String fileName, String ossName, String ossUrl, String fileSize,Integer parentId,String mime);
 
     ResponseJson updatePackage(Integer fileId, String packageName, Integer packageType);
 
-    ResponseJson movePackage(Integer fileId, Integer parentId);
+    ResponseJson movePackage(String fileId, Integer parentId);
 
     ResponseJson deleteFiles(String fileId);
 
     ResponseJson<FileTreeVo> getCrumbs(Integer fileId, Integer authUserId);
 
     ResponseJson<FileTreeVo> getPackageTree(Integer authUserId);
+
+    ResponseJson downLoadChoseZip(String fileId, Integer authUserId, HttpServletResponse response);
+
+    ResponseJson<FileTreeVo> getFileDetail(Integer fileId, Integer authUserId);
 }

+ 107 - 8
src/main/java/com/caimei/service/data/impl/DatabaseServiceImpl.java

@@ -6,6 +6,7 @@ import com.aliyuncs.profile.DefaultProfile;
 import com.caimei.mapper.cmMapper.FileMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.FileTreeVo;
+import com.caimei.service.async.AsyncService;
 import com.caimei.service.data.DatabaseService;
 import com.caimei.utils.FileZipUtils;
 import com.caimei.utils.OSSUtils;
@@ -21,6 +22,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
@@ -39,6 +41,9 @@ public class DatabaseServiceImpl implements DatabaseService {
     @Value("${spring.profiles.active}")
     private String active;
 
+    @Resource
+    private AsyncService asyncService;
+
     @Override
     public ResponseJson<List<FileTreeVo>> getFileById(Integer fileId, Integer authUserId) {
         List<FileTreeVo> fileTree = fileMapper.findFileTree(fileId, authUserId, null);
@@ -82,7 +87,7 @@ public class DatabaseServiceImpl implements DatabaseService {
                 // 设置下载文件的mineType,告诉浏览器下载文件类型
                 //            int i = fileName.lastIndexOf(".");
                 //            String substring = fileName.substring(i + 1, filePath.length());
-                //            response.setContentType(substring);
+                response.setContentType("application/zip");
                 // 设置一个响应头,无论是否被浏览器解析,都下载
                 response.setHeader("Content-disposition", "attachment; filename=" + fileName);
                 byte[] bytes = new byte[1024];
@@ -118,7 +123,7 @@ public class DatabaseServiceImpl implements DatabaseService {
     }
 
     @Override
-    public ResponseJson getOssUploadResult(Integer authUserId, String fileName, String ossName, String ossUrl, String fileSize, Integer parentId) {
+    public ResponseJson getOssUploadResult(Integer authUserId, String fileName, String ossName, String ossUrl, String fileSize, Integer parentId, String mime) {
         FileTreeVo fileTreeVo = new FileTreeVo();
         fileTreeVo.setFileName(fileName);
         fileTreeVo.setOssName(ossName);
@@ -130,7 +135,12 @@ public class DatabaseServiceImpl implements DatabaseService {
         fileTreeVo.setFileSize(fileSize);
         fileTreeVo.setPackageType(1);
         fileTreeVo.setAuthUserId(authUserId);
+        fileTreeVo.setMime(mime);
         fileMapper.insertNewFile(fileTreeVo);
+        if(mime.contains("image")){
+            //图片保存缩略图
+            asyncService.insertScreenshot(fileTreeVo);
+        }
         return ResponseJson.success();
     }
 
@@ -145,11 +155,21 @@ public class DatabaseServiceImpl implements DatabaseService {
     }
 
     @Override
-    public ResponseJson movePackage(Integer fileId, Integer parentId) {
-        FileTreeVo fileTreeVo = new FileTreeVo();
-        fileTreeVo.setId(fileId);
-        fileTreeVo.setParentId(parentId);
-        fileMapper.updateFile(fileTreeVo);
+    public ResponseJson movePackage(String fileId, Integer parentId) {
+        if (fileId.contains(",")) {
+            String[] split = fileId.split(",");
+            for (String s : split) {
+                FileTreeVo fileTreeVo = new FileTreeVo();
+                fileTreeVo.setId(Integer.valueOf(s));
+                fileTreeVo.setParentId(parentId);
+                fileMapper.updateFile(fileTreeVo);
+            }
+        } else {
+            FileTreeVo fileTreeVo = new FileTreeVo();
+            fileTreeVo.setId(Integer.valueOf(fileId));
+            fileTreeVo.setParentId(parentId);
+            fileMapper.updateFile(fileTreeVo);
+        }
         return ResponseJson.success();
     }
 
@@ -204,6 +224,85 @@ public class DatabaseServiceImpl implements DatabaseService {
         return ResponseJson.success(fileTreeVo);
     }
 
+    @Override
+    public ResponseJson downLoadChoseZip(String fileId, Integer authUserId, HttpServletResponse response) {
+        if (fileId.contains(",")) {
+            String[] split = fileId.split(",");
+            ArrayList<FileTreeVo> fileTreeVos = new ArrayList<>();
+            for (String s : split) {
+                FileTreeVo file = fileMapper.findFile(Integer.valueOf(s), authUserId, null);
+                fileTreeVos.add(file);
+            }
+            //有package则在服务器固定路径new file.mkdir
+            UUID uuid = UUID.randomUUID();
+            String filePath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/" + uuid;
+            String zipPath = filePath;
+            if ("dev".equals(active)) {
+                filePath = "D:\\caimei-workSpace\\file\\" + uuid;
+                zipPath = filePath;
+            }
+            boolean mkdirs = new File(filePath).mkdirs();
+            Assert.isTrue(mkdirs, "文件夹创建失败");
+
+            for (FileTreeVo fileTreeVo : fileTreeVos) {
+                if (1 == fileTreeVo.getPackageType()) {
+                    //普通文件直接下载到临时文件夹uuid下
+                    String fileName = "";
+                    if ("dev".equals(active)) {
+                        fileName = zipPath + "\\" + fileTreeVo.getFileName();
+                    } else {
+                        fileName = zipPath + "/" + fileTreeVo.getFileName();
+                    }
+                    OSSUtils.downFileByFilePath("authFile/", fileTreeVo.getOssName(), fileName);
+                } else {
+                    //文件夹在uuid文件夹下创建自己包名的文件夹
+                    String param = fileTreeVo.getId() + "," + authUserId;
+                    String myPath = "";
+                    myPath = filePath + "/" + fileTreeVo.getFileName();
+                    if ("dev".equals(active)) {
+                        myPath = filePath + "\\" + fileTreeVo.getFileName();
+                    }
+                    recursion(param, myPath);
+                }
+            }
+
+            //压缩
+            FileZipUtils.compress(zipPath, "", true);
+            String s = zipPath + ".zip";
+            String fileName = uuid + ".zip";
+            File file = new File(s);
+            try {
+                if (file.exists()) {
+                    FileInputStream fileInputStream = new FileInputStream(file);
+                    ServletOutputStream outputStream = response.getOutputStream();
+                    // 设置下载文件的mineType,告诉浏览器下载文件类型
+//                                int i = fileName.lastIndexOf(".");
+//                                String substring = fileName.substring(i + 1, filePath.length());
+                    response.setContentType("application/zip");
+                    // 设置一个响应头,无论是否被浏览器解析,都下载
+                    response.setHeader("Content-disposition", "attachment; filename=" + fileName);
+                    byte[] bytes = new byte[1024];
+                    int len;
+                    while ((len = fileInputStream.read(bytes)) != -1) {
+                        outputStream.write(bytes, 0, len);
+                    }
+                    fileInputStream.close();
+                    outputStream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            FileZipUtils.deleteFile(new File(zipPath));
+        }
+        return ResponseJson.error("请勾选多个文件");
+    }
+
+    @Override
+    public ResponseJson<FileTreeVo> getFileDetail(Integer fileId, Integer authUserId) {
+        FileTreeVo file = fileMapper.findFile(fileId, authUserId, null);
+        return ResponseJson.success(file);
+    }
+
     private void PackageTree(FileTreeVo fileTreeVo) {
         if (null == fileTreeVo) {
             return;
@@ -217,7 +316,7 @@ public class DatabaseServiceImpl implements DatabaseService {
 
 
     private FileTreeVo getCrumbsParent(FileTreeVo file, Integer authUserId) {
-        if (null != file && 0 == file.getParentId()) {
+        if (null == file || 0 == file.getParentId()) {
             return file;
         }
         FileTreeVo fil = fileMapper.findFile(file.getParentId(), authUserId, null);

+ 1 - 1
src/main/resources/config/dev/application-dev.yml

@@ -69,7 +69,7 @@ swagger:
 # 新旧www服务域名
 caimei:
   oldapi: http://192.168.2.81:8009
-  zplmapi: http://192.168.2.68:8012
+  zplmapi: http://192.168.2.67:8012
   zpapi: https://192.168.2.81:8009
   #图片服务器
   imageDomain: http://192.168.2.100

+ 32 - 11
src/main/resources/mapper/ArticleMapper.xml

@@ -1,21 +1,40 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei.mapper.cmMapper.ArticleMapper">
-    <insert id="insertArticle" useGeneratedKeys="true" keyColumn="id">
+    <insert id="insertArticle" keyProperty="id" keyColumn="id" useGeneratedKeys="true">
         insert into cm_brand_article(authUserId, title, image, content, auditStatus, status, createTime, auditBy,
-                                     auditTime, checkFlag, sort, articleType)
+                                     auditTime, checkFlag, sort, articleType, articleLink)
         values (#{authUserId}, #{title}, #{image}, #{content}, #{auditStatus}, #{status}, #{createTime}, #{auditBy},
-                #{auditTime}, #{checkFlag}, #{sort}, #{articleType})
+                #{auditTime}, #{checkFlag}, #{sort}, #{articleType}, #{articleLink})
     </insert>
     <update id="updateArticleByArticleId">
         update cm_brand_article
-        set title       = #{title},
-            image       = #{image},
-            content     = #{content},
-            status      = #{status},
-            auditStatus = #{auditStatus},
-            sort        = #{sort},
-            articleType = #{articleType}
+        <set>
+            <if test="null != title and ''!=title">
+                title = #{title},
+            </if>
+            <if test="null != image and ''!=image">
+                image = #{image},
+            </if>
+            <if test="null != content and ''!=content">
+                content = #{content},
+            </if>
+            <if test="null != status">
+                status = #{status},
+            </if>
+            <if test="null != auditStatus">
+                auditStatus = #{auditStatus},
+            </if>
+            <if test="null != sort">
+                sort = #{sort},
+            </if>
+            <if test="null != articleType">
+                articleType = #{articleType},
+            </if>
+            <if test="null != articleLink and ''!=articleLink">
+                articleLink = #{articleLink},
+            </if>
+        </set>
         where id = #{id}
     </update>
     <update id="updateArticleStatusByArticleId">
@@ -79,7 +98,9 @@
                content as articleContent,
                createTime,
                auditStatus,
-               sort
+               sort,
+               articleType,
+               articleLink
         from cm_brand_article
         where id = #{articleId}
     </select>

+ 22 - 5
src/main/resources/mapper/FileMapper.xml

@@ -16,11 +16,17 @@
         insert into cm_tree_file(parentId, fileType, fileName, saveTime, packageType, authUserId)
         values (#{fileId}, 'package', #{packageName}, now(), 0, #{authUserId})
     </insert>
-    <insert id="insertNewFile">
+    <insert id="insertNewFile" keyColumn="id" keyProperty="id" parameterType="com.caimei.model.vo.FileTreeVo"
+            useGeneratedKeys="true">
         insert into cm_tree_file(parentId, fileType, saveTime, ossUrl, fileName, ossName, fileSize, packageType,
-                                 authUserId)
+                                 authUserId, mime, articleId)
         values (#{parentId}, #{fileType}, now(), #{ossUrl}, #{fileName}, #{ossName}, #{fileSize}, #{packageType},
-                #{authUserId})
+                #{authUserId}, #{mime}, #{articleId})
+    </insert>
+    <insert id="insertImgUrl">
+        update cm_tree_file
+        set screenshot = #{screenshot}
+        where id = #{id}
     </insert>
     <update id="updateFileByFileId">
         update cm_brand_file
@@ -221,7 +227,10 @@
         fileSize,
         saveTime,
         packageType,
-        authUserId
+        authUserId,
+        mime,
+        articleId,
+        screenshot
         from cm_tree_file
         where parentId = #{fileId}
         <if test="null != authUserId">
@@ -263,7 +272,10 @@
         fileSize,
         saveTime,
         packageType,
-        authUserId
+        authUserId,
+        mime,
+        articleId,
+        screenshot
         from cm_tree_file
         where id = #{fileId}
         <if test="null != authUserId">
@@ -273,4 +285,9 @@
             and packageType =#{packageType}
         </if>
     </select>
+    <select id="findShopPrefix" resultType="java.lang.String">
+        select prefix
+        from cm_brand_auth_user
+        where authUserId = #{authUserId}
+    </select>
 </mapper>