From b4d5eabf328c8b208a4dff66e47d2b6ae7ddb15a Mon Sep 17 00:00:00 2001 From: xiezhijun <15270898033@163.com> Date: Fri, 5 Mar 2021 20:15:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/MyApplicationRunner.java | 4 +- .../custom/SysCustomerCaseController.java | 110 ++++- .../stdiet/common/utils/file/FileUtils.java | 56 ++- .../common/utils/oss/AliyunOSSUtils.java | 16 +- .../stdiet/custom/domain/SysCustomerCase.java | 12 +- .../custom/dto/request/FileRequest.java | 11 + .../mapper/SysCustomerCaseFileMapper.java | 26 ++ .../service/ISysCustomerCaseService.java | 8 + .../impl/SysCustomerCaseServiceImpl.java | 47 ++- .../custom/SysCustomerCaseFileMapper.xml | 47 ++- .../mapper/custom/SysCustomerCaseMapper.xml | 21 +- stdiet-ui/src/api/custom/customerCase.js | 84 ++++ .../components/Customer/SelectCustomer.vue | 174 ++++++++ .../components/FileDownload/MuchFileDown.vue | 73 ++++ .../src/components/FileUpload/DragUpload.vue | 126 ++++++ .../src/views/custom/customerCase/index.vue | 381 ++++++++++++++++++ 16 files changed, 1147 insertions(+), 49 deletions(-) create mode 100644 stdiet-custom/src/main/java/com/stdiet/custom/dto/request/FileRequest.java create mode 100644 stdiet-ui/src/api/custom/customerCase.js create mode 100644 stdiet-ui/src/components/Customer/SelectCustomer.vue create mode 100644 stdiet-ui/src/components/FileDownload/MuchFileDown.vue create mode 100644 stdiet-ui/src/components/FileUpload/DragUpload.vue create mode 100644 stdiet-ui/src/views/custom/customerCase/index.vue diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java index 5357b59f4..7e9353e07 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/MyApplicationRunner.java @@ -20,8 +20,8 @@ public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { - System.out.println("项目启动调用方法"); + /* System.out.println("项目启动调用方法"); String path = AliyunOSSUtils.uploadFileInputSteam(AliyunOSSConfig.casePrefix,"ceshi.png",new File("D:\\ceshi.png")); - System.out.println(path); + System.out.println(path);*/ } } diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java index 66937d2d5..47c95eb63 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java @@ -1,16 +1,30 @@ package com.stdiet.web.controller.custom; +import java.io.InputStream; +import java.net.URLEncoder; import java.util.List; + +import com.stdiet.common.config.AliyunOSSConfig; +import com.stdiet.common.config.RuoYiConfig; +import com.stdiet.common.constant.Constants; +import com.stdiet.common.exception.file.FileNameLengthLimitExceededException; +import com.stdiet.common.utils.StringUtils; +import com.stdiet.common.utils.file.FileUploadUtils; +import com.stdiet.common.utils.file.FileUtils; +import com.stdiet.common.utils.file.MimeTypeUtils; +import com.stdiet.common.utils.oss.AliyunOSSUtils; +import com.stdiet.custom.domain.SysCustomerCaseFile; +import com.stdiet.custom.dto.request.FileRequest; +import com.sun.deploy.net.HttpResponse; +import io.swagger.models.auth.In; +import org.aspectj.weaver.loadtime.Aj; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.StreamingHttpOutputMessage; 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 org.springframework.web.bind.annotation.*; import com.stdiet.common.annotation.Log; import com.stdiet.common.core.controller.BaseController; import com.stdiet.common.core.domain.AjaxResult; @@ -19,6 +33,10 @@ import com.stdiet.custom.domain.SysCustomerCase; import com.stdiet.custom.service.ISysCustomerCaseService; import com.stdiet.common.utils.poi.ExcelUtil; import com.stdiet.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * 客户案例管理Controller @@ -100,4 +118,80 @@ public class SysCustomerCaseController extends BaseController { return toAjax(sysCustomerCaseService.deleteSysCustomerCaseByIds(ids)); } + + /** + * 查询客户案例文件列表 + */ + @GetMapping("/getFileListByCaseId") + @PreAuthorize("@ss.hasPermi('custom:customerCase:list')") + public TableDataInfo getFileListByCaseId(@RequestParam("caseId")Long caseId) + { + List list = sysCustomerCaseService.getFileListByCaseId(caseId); + return getDataTable(list); + } + + /** + * 上传文件到OSS返回URL + */ + @PostMapping("/uploadCaseFile") + @PreAuthorize("@ss.hasPermi('custom:customerCase:list')") + public AjaxResult uploadCseFile(MultipartFile file) throws Exception { + try { + if(file == null){ + return AjaxResult.error("文件不存在"); + } + int fileNameLength = file.getOriginalFilename().length(); + if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + FileUploadUtils.assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + + String fileUrl = AliyunOSSUtils.uploadFileInputSteam(AliyunOSSConfig.casePrefix, file.getOriginalFilename(), file); + + AjaxResult ajax = null; + if(StringUtils.isNotEmpty(fileUrl)){ + ajax = AjaxResult.success(); + ajax.put("fileUrl", fileUrl); + ajax.put("fileName", file.getOriginalFilename()); + }else{ + ajax = AjaxResult.error("文件上传失败"); + } + return ajax; + } catch (Exception e) { + return AjaxResult.error("文件上传失败"); + } + } + + /** + * 下载案例文件 + * @param + * @return + */ + @PostMapping("/downCaseFile") + @PreAuthorize("@ss.hasPermi('custom:customerCase:list')") + public void downCaseFile(@RequestBody FileRequest fileRequest, HttpServletRequest request, HttpServletResponse response) { + /*try{ + InputStream fileStream = AliyunOSSUtils.downloadFile(fileRequest.getFileUrl()); + byte[] body = new byte[fileStream.available()]; + fileStream.read(body); + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attchement;filename=" + fileRequest.getFileName()); + HttpStatus statusCode = HttpStatus.OK; + ResponseEntity entity = new ResponseEntity(body, headers, statusCode); + return entity; + }catch (Exception e) { + e.printStackTrace(); + } + return null;*/ + try { + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + response.setHeader("Content-Disposition", + "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, fileRequest.getFileName())); + FileUtils.writeBytes(AliyunOSSUtils.downloadFile(fileRequest.getFileUrl()), response.getOutputStream()); + }catch (Exception e){ + e.printStackTrace(); + } + } } \ No newline at end of file diff --git a/stdiet-common/src/main/java/com/stdiet/common/utils/file/FileUtils.java b/stdiet-common/src/main/java/com/stdiet/common/utils/file/FileUtils.java index 3fb3479f8..c9a14466c 100644 --- a/stdiet-common/src/main/java/com/stdiet/common/utils/file/FileUtils.java +++ b/stdiet-common/src/main/java/com/stdiet/common/utils/file/FileUtils.java @@ -1,11 +1,6 @@ package com.stdiet.common.utils.file; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; @@ -74,6 +69,55 @@ public class FileUtils extends org.apache.commons.io.FileUtils } } + /** + * 输出指定文件的byte数组 + * + * @param inputStream 输入流 + * @param os 输出流 + * @return + */ + public static void writeBytes(InputStream inputStream, OutputStream os) throws IOException + { + try + { + byte[] b = new byte[1024]; + int length; + while ((length = inputStream.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + if (os != null) + { + try + { + os.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + if (inputStream != null) + { + try + { + inputStream.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + } + } + /** * 删除文件 * diff --git a/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java b/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java index c78611763..583042321 100644 --- a/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java +++ b/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java @@ -13,20 +13,10 @@ import java.io.IOException; import java.io.InputStream; import java.util.UUID; -public class AliyunOSSUtils { - - // 创建OSSClient实例 - private static OSS ossClient = null; +public class AliyunOSSUtils { ; public static OSS getOssClient() { - if (ossClient == null) { - synchronized (OSS.class) { - if (ossClient == null) { - ossClient = new OSSClientBuilder().build(AliyunOSSConfig.EndPoint, AliyunOSSConfig.AccessKeyID, AliyunOSSConfig.AccessKeySecret); - } - } - } - return ossClient; + return new OSSClientBuilder().build(AliyunOSSConfig.EndPoint, AliyunOSSConfig.AccessKeyID, AliyunOSSConfig.AccessKeySecret); } /** @@ -204,7 +194,7 @@ public class AliyunOSSUtils { * * @param fileURL 文件的url */ - public InputStream downloadFile(String fileURL) throws IOException { + public static InputStream downloadFile(String fileURL) throws IOException { //将url解析成objectName String objectName = getObjectName(fileURL); diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCase.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCase.java index a56bc8567..8fd166cc9 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCase.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCase.java @@ -23,13 +23,21 @@ public class SysCustomerCase extends BaseEntity private String name; /** 案例关键词 */ - @Excel(name = "案例关键词") + @Excel(name = "关键词") private String keyword; /** 案例所属客户ID */ - @Excel(name = "案例所属客户ID") private Long customerId; + @Excel(name = "所属客户") + private String customerName; + /** 删除标识 0未删除 1已删除,默认0 */ private Long delFlag; + + //案例文件名称数组 + private String[] caseFileName; + + //案例文件URL数组 + private String[] caseFileUrl; } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/dto/request/FileRequest.java b/stdiet-custom/src/main/java/com/stdiet/custom/dto/request/FileRequest.java new file mode 100644 index 000000000..a04825f30 --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/dto/request/FileRequest.java @@ -0,0 +1,11 @@ +package com.stdiet.custom.dto.request; + +import lombok.Data; + +@Data +public class FileRequest { + + private String fileUrl; + + private String fileName; +} diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerCaseFileMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerCaseFileMapper.java index 8d3294f6e..0a5fac733 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerCaseFileMapper.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysCustomerCaseFileMapper.java @@ -2,6 +2,7 @@ package com.stdiet.custom.mapper; import java.util.List; import com.stdiet.custom.domain.SysCustomerCaseFile; +import org.apache.ibatis.annotations.Param; /** * 客户案例对应文件管理Mapper接口 @@ -58,4 +59,29 @@ public interface SysCustomerCaseFileMapper * @return 结果 */ public int deleteSysCustomerCaseFileByIds(Long[] ids); + + /** + * 根据案例ID删除该案例下的所有文件记录 + * @param caseId + */ + int deleteSysCustomerCaseFileByCaseId(@Param("caseId")Long caseId); + + /** + * 根据案例ID批量删除该案例下的所有文件记录 + * @param caseIds + */ + int deleteSysCustomerCaseFileByCaseIds(Long[] caseIds); + + /** + * 批量插入案例文件记录 + * @param list + */ + int insertBatch(List list); + + /** + * 根据案例Id查询案例文件列表 + * @param caseId + * @return + */ + List selectSysCustomerCaseFileListByCaseId(@Param("caseId") Long caseId); } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerCaseService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerCaseService.java index 4e0661ba3..76dc9dc7e 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerCaseService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerCaseService.java @@ -2,6 +2,7 @@ package com.stdiet.custom.service; import java.util.List; import com.stdiet.custom.domain.SysCustomerCase; +import com.stdiet.custom.domain.SysCustomerCaseFile; /** * 客户案例管理Service接口 @@ -58,4 +59,11 @@ public interface ISysCustomerCaseService { */ public int deleteSysCustomerCaseById(Long id); + /** + * 根据案例ID获取对应文件列表 + * @param caseId + * @return + */ + List getFileListByCaseId(Long caseId); + } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerCaseServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerCaseServiceImpl.java index 03dc6e488..dc91d3e1d 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerCaseServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerCaseServiceImpl.java @@ -1,12 +1,16 @@ package com.stdiet.custom.service.impl; +import java.util.ArrayList; import java.util.List; import com.stdiet.common.utils.DateUtils; +import com.stdiet.custom.domain.SysCustomerCaseFile; +import com.stdiet.custom.mapper.SysCustomerCaseFileMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.stdiet.custom.mapper.SysCustomerCaseMapper; import com.stdiet.custom.domain.SysCustomerCase; import com.stdiet.custom.service.ISysCustomerCaseService; +import org.springframework.transaction.annotation.Transactional; /** * 客户案例管理Service业务层处理 @@ -15,11 +19,15 @@ import com.stdiet.custom.service.ISysCustomerCaseService; * @date 2021-03-04 */ @Service +@Transactional public class SysCustomerCaseServiceImpl implements ISysCustomerCaseService { @Autowired private SysCustomerCaseMapper sysCustomerCaseMapper; + @Autowired + private SysCustomerCaseFileMapper sysCustomerCaseFileMapper; + /** * 查询客户案例管理 * @@ -54,7 +62,23 @@ public class SysCustomerCaseServiceImpl implements ISysCustomerCaseService public int insertSysCustomerCase(SysCustomerCase sysCustomerCase) { sysCustomerCase.setCreateTime(DateUtils.getNowDate()); - return sysCustomerCaseMapper.insertSysCustomerCase(sysCustomerCase); + int rows = sysCustomerCaseMapper.insertSysCustomerCase(sysCustomerCase); + if(rows > 0){ + //批量添加文件对应列表 + SysCustomerCaseFile caseFile = null; + if(sysCustomerCase.getCaseFileUrl() != null && sysCustomerCase.getCaseFileUrl().length > 0){ + List caseFileList = new ArrayList<>(); + for (String url : sysCustomerCase.getCaseFileUrl()) { + caseFile = new SysCustomerCaseFile(); + caseFile.setCaseId(sysCustomerCase.getId()); + caseFile.setFileName(sysCustomerCase.getCaseFileName()[caseFileList.size()]); + caseFile.setFileUrl(url); + caseFileList.add(caseFile); + } + rows = sysCustomerCaseFileMapper.insertBatch(caseFileList); + } + } + return rows; } /** @@ -79,7 +103,11 @@ public class SysCustomerCaseServiceImpl implements ISysCustomerCaseService @Override public int deleteSysCustomerCaseByIds(Long[] ids) { - return sysCustomerCaseMapper.deleteSysCustomerCaseByIds(ids); + int rows = sysCustomerCaseMapper.deleteSysCustomerCaseByIds(ids); + if(rows > 0){ + rows = sysCustomerCaseFileMapper.deleteSysCustomerCaseFileByCaseIds(ids); + } + return rows; } /** @@ -91,6 +119,19 @@ public class SysCustomerCaseServiceImpl implements ISysCustomerCaseService @Override public int deleteSysCustomerCaseById(Long id) { - return sysCustomerCaseMapper.deleteSysCustomerCaseById(id); + int rows = sysCustomerCaseMapper.deleteSysCustomerCaseById(id); + if(rows > 0){ + rows = sysCustomerCaseFileMapper.deleteSysCustomerCaseFileByCaseId(id); + } + return rows; + } + + /** + * 根据案例ID获取对应文件列表 + * @param caseId + * @return + */ + public List getFileListByCaseId(Long caseId){ + return sysCustomerCaseFileMapper.selectSysCustomerCaseFileListByCaseId(caseId); } } \ No newline at end of file diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseFileMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseFileMapper.xml index 088b64a93..94c5b23a8 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseFileMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseFileMapper.xml @@ -21,14 +21,17 @@ + + + @@ -70,15 +73,39 @@ where id = #{id} - - delete from sys_customer_case_file where id = #{id} - + + update sys_customer_case_file set del_flag = 1 where id = #{id} + - - delete from sys_customer_case_file where id in + + update sys_customer_case_file set del_flag = 1 where id in #{id} - + + + + + update sys_customer_case_file set del_flag = 1 where case_id = #{caseId} + + + + + update sys_customer_case_file set del_flag = 1 where case_id in + + #{caseId} + + + + + + INSERT INTO sys_customer_case_file + (case_id, file_url, file_name) + VALUES + + (#{caseFile.caseId}, #{caseFile.fileUrl}, #{caseFile.fileName}) + + + \ No newline at end of file diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseMapper.xml index f23030552..8f1ce69c0 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysCustomerCaseMapper.xml @@ -15,20 +15,31 @@ + + - select id, name, keyword, remark, customer_id, create_time, create_by, update_time, update_by, del_flag from sys_customer_case + select id, name, keyword, remark, customer_id, create_time from sys_customer_case diff --git a/stdiet-ui/src/api/custom/customerCase.js b/stdiet-ui/src/api/custom/customerCase.js new file mode 100644 index 000000000..1d8c6358a --- /dev/null +++ b/stdiet-ui/src/api/custom/customerCase.js @@ -0,0 +1,84 @@ +import request from '@/utils/request' + +// 查询客户案例管理列表 +export function listCustomerCase(query) { + return request({ + url: '/custom/customerCase/list', + method: 'get', + params: query + }) +} + +// 查询客户案例管理详细 +export function getCustomerCase(id) { + return request({ + url: '/custom/customerCase/' + id, + method: 'get' + }) +} + +// 新增客户案例管理 +export function addCustomerCase(data) { + return request({ + url: '/custom/customerCase', + method: 'post', + data: data + }) +} + +// 修改客户案例管理 +export function updateCustomerCase(data) { + return request({ + url: '/custom/customerCase', + method: 'put', + data: data + }) +} + +// 删除客户案例管理 +export function delCustomerCase(id) { + return request({ + url: '/custom/customerCase/' + id, + method: 'delete' + }) +} + +// 导出客户案例管理 +export function exportCustomerCase(query) { + return request({ + url: '/custom/customerCase/export', + method: 'get', + params: query + }) +} + +// 根据案例ID查询对应文件列表 +export function getFileListByCaseId(caseId) { + return request({ + url: '/custom/customerCase/getFileListByCaseId', + method: 'get', + params: {"caseId": caseId} + }) +} + +// 上传案例文件 +export function uploadCseFile(data) { + return request({ + url: '/custom/customerCase/uploadCseFile', + method: 'post', + data: data + }) +} + +// 下载案例文件 +export function downCaseFile(data) { + return request({ + url: '/custom/customerCase/downCaseFile', + method: 'post', + data: data + }) +} + + + + diff --git a/stdiet-ui/src/components/Customer/SelectCustomer.vue b/stdiet-ui/src/components/Customer/SelectCustomer.vue new file mode 100644 index 000000000..27e1daba1 --- /dev/null +++ b/stdiet-ui/src/components/Customer/SelectCustomer.vue @@ -0,0 +1,174 @@ + + + diff --git a/stdiet-ui/src/components/FileDownload/MuchFileDown.vue b/stdiet-ui/src/components/FileDownload/MuchFileDown.vue new file mode 100644 index 000000000..f677b5a4f --- /dev/null +++ b/stdiet-ui/src/components/FileDownload/MuchFileDown.vue @@ -0,0 +1,73 @@ + + + diff --git a/stdiet-ui/src/components/FileUpload/DragUpload.vue b/stdiet-ui/src/components/FileUpload/DragUpload.vue new file mode 100644 index 000000000..6ce5494b8 --- /dev/null +++ b/stdiet-ui/src/components/FileUpload/DragUpload.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/stdiet-ui/src/views/custom/customerCase/index.vue b/stdiet-ui/src/views/custom/customerCase/index.vue new file mode 100644 index 000000000..05805f672 --- /dev/null +++ b/stdiet-ui/src/views/custom/customerCase/index.vue @@ -0,0 +1,381 @@ + + + From f1adbb041f8c56e66a75c9e49d775b9493825a79 Mon Sep 17 00:00:00 2001 From: xiezhijun <15270898033@163.com> Date: Sat, 6 Mar 2021 00:15:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../custom/SysCustomerCaseController.java | 57 +++++---------- .../common/utils/oss/AliyunOSSUtils.java | 72 +++++++++++++++++-- .../custom/domain/SysCustomerCaseFile.java | 2 + stdiet-ui/src/api/custom/customerCase.js | 8 +-- .../components/FileDownload/MuchFileDown.vue | 4 +- .../src/components/FileUpload/DragUpload.vue | 4 +- .../src/views/custom/customerCase/index.vue | 32 ++++++--- 7 files changed, 112 insertions(+), 67 deletions(-) diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java index 47c95eb63..7ac7dd7d4 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java @@ -1,13 +1,16 @@ package com.stdiet.web.controller.custom; import java.io.InputStream; +import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.List; import com.stdiet.common.config.AliyunOSSConfig; import com.stdiet.common.config.RuoYiConfig; import com.stdiet.common.constant.Constants; import com.stdiet.common.exception.file.FileNameLengthLimitExceededException; +import com.stdiet.common.utils.DateUtils; import com.stdiet.common.utils.StringUtils; import com.stdiet.common.utils.file.FileUploadUtils; import com.stdiet.common.utils.file.FileUtils; @@ -15,15 +18,9 @@ import com.stdiet.common.utils.file.MimeTypeUtils; import com.stdiet.common.utils.oss.AliyunOSSUtils; import com.stdiet.custom.domain.SysCustomerCaseFile; import com.stdiet.custom.dto.request.FileRequest; -import com.sun.deploy.net.HttpResponse; -import io.swagger.models.auth.In; -import org.aspectj.weaver.loadtime.Aj; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.StreamingHttpOutputMessage; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.unit.DataUnit; import org.springframework.web.bind.annotation.*; import com.stdiet.common.annotation.Log; import com.stdiet.common.core.controller.BaseController; @@ -37,6 +34,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.xml.crypto.Data; /** * 客户案例管理Controller @@ -127,6 +125,17 @@ public class SysCustomerCaseController extends BaseController public TableDataInfo getFileListByCaseId(@RequestParam("caseId")Long caseId) { List list = sysCustomerCaseService.getFileListByCaseId(caseId); + List fileUrl = new ArrayList<>(); + for (SysCustomerCaseFile caseFile : list) { + fileUrl.add(caseFile.getFileUrl()); + } + List downUrlList = AliyunOSSUtils.generatePresignedUrl(fileUrl); + if(downUrlList != null && downUrlList.size() > 0){ + int index = 0; + for (String downUrl : downUrlList) { + list.get(index).setDownUrl(downUrl); + } + } return getDataTable(list); } @@ -147,7 +156,7 @@ public class SysCustomerCaseController extends BaseController } FileUploadUtils.assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); - String fileUrl = AliyunOSSUtils.uploadFileInputSteam(AliyunOSSConfig.casePrefix, file.getOriginalFilename(), file); + String fileUrl = AliyunOSSUtils.uploadFileInputSteam(AliyunOSSConfig.casePrefix, DateUtils.getDate()+"/"+file.getOriginalFilename(), file); AjaxResult ajax = null; if(StringUtils.isNotEmpty(fileUrl)){ @@ -162,36 +171,4 @@ public class SysCustomerCaseController extends BaseController return AjaxResult.error("文件上传失败"); } } - - /** - * 下载案例文件 - * @param - * @return - */ - @PostMapping("/downCaseFile") - @PreAuthorize("@ss.hasPermi('custom:customerCase:list')") - public void downCaseFile(@RequestBody FileRequest fileRequest, HttpServletRequest request, HttpServletResponse response) { - /*try{ - InputStream fileStream = AliyunOSSUtils.downloadFile(fileRequest.getFileUrl()); - byte[] body = new byte[fileStream.available()]; - fileStream.read(body); - HttpHeaders headers = new HttpHeaders(); - headers.add("Content-Disposition", "attchement;filename=" + fileRequest.getFileName()); - HttpStatus statusCode = HttpStatus.OK; - ResponseEntity entity = new ResponseEntity(body, headers, statusCode); - return entity; - }catch (Exception e) { - e.printStackTrace(); - } - return null;*/ - try { - response.setCharacterEncoding("utf-8"); - response.setContentType("multipart/form-data"); - response.setHeader("Content-Disposition", - "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, fileRequest.getFileName())); - FileUtils.writeBytes(AliyunOSSUtils.downloadFile(fileRequest.getFileUrl()), response.getOutputStream()); - }catch (Exception e){ - e.printStackTrace(); - } - } } \ No newline at end of file diff --git a/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java b/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java index 583042321..0d063a081 100644 --- a/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java +++ b/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java @@ -3,17 +3,28 @@ package com.stdiet.common.utils.oss; import com.aliyun.oss.model.GetObjectRequest; import com.aliyun.oss.model.OSSObject; import com.stdiet.common.config.AliyunOSSConfig; +import com.stdiet.common.utils.file.FileUtils; import org.springframework.web.multipart.MultipartFile; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import java.util.UUID; -public class AliyunOSSUtils { ; +public class AliyunOSSUtils { + + //下载链接默认有效期 + private static final Long expire = 3600L * 1000 * 24; public static OSS getOssClient() { return new OSSClientBuilder().build(AliyunOSSConfig.EndPoint, AliyunOSSConfig.AccessKeyID, AliyunOSSConfig.AccessKeySecret); @@ -63,10 +74,10 @@ public class AliyunOSSUtils { ; //去尾 String tail = oranName.substring(cutPoint); //返回正确的带路径的图片名称 - return prefix + head + uuid + tail; + return prefix + head + uuid + "_" + tail; } //不存在 直接返回 - return prefix + uuid + oranName; + return prefix + uuid + "_" + oranName; } /** @@ -86,8 +97,8 @@ public class AliyunOSSUtils { ; String prefix = originalFilename.substring(0,cutPoint); //获取后缀名 String suffix = originalFilename.substring(cutPoint + 1); - //创建临时文件 - file = File.createTempFile(prefix, suffix); + //创建临时文件,prefix最少三位 + file = File.createTempFile((prefix != null && prefix.length() >= 3 ? prefix : prefix+"ab"), suffix); //multipartFile2file multipartFile.transferTo(file); //删除临时文件 @@ -194,7 +205,7 @@ public class AliyunOSSUtils { ; * * @param fileURL 文件的url */ - public static InputStream downloadFile(String fileURL) throws IOException { + public static void downloadFile(String fileURL, String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException { //将url解析成objectName String objectName = getObjectName(fileURL); @@ -207,10 +218,57 @@ public class AliyunOSSUtils { ; //获取流 InputStream streamData = ossObject.getObjectContent(); + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + response.setHeader("Content-Disposition", + "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, fileName)); + FileUtils.writeBytes(streamData , response.getOutputStream()); + + // 关闭OSSClient。 + ossClient.shutdown(); + } + + /** + * + * @param fileUrl + * @return + */ + public static String generatePresignedUrl(String fileUrl){ + // 创建OSSClient实例。 + OSS ossClient = getOssClient(); + + Date expiration = new Date(System.currentTimeMillis() + expire); + + String url = ossClient.generatePresignedUrl(AliyunOSSConfig.Buckets, getObjectName(fileUrl), expiration).toString(); + // 关闭OSSClient。 ossClient.shutdown(); - return streamData; + return url; + } + + /** + * + * @param fileUrl + * @return + */ + public static List generatePresignedUrl(List fileUrlList){ + List downUrlList = new ArrayList<>(); + + // 创建OSSClient实例。 + OSS ossClient = getOssClient(); + + Date expiration = new Date(System.currentTimeMillis() + expire); + + for (String fileUrl : fileUrlList) { + String url = ossClient.generatePresignedUrl(AliyunOSSConfig.Buckets, getObjectName(fileUrl), expiration).toString(); + downUrlList.add(url); + } + + // 关闭OSSClient。 + ossClient.shutdown(); + + return downUrlList; } /** diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java index d8d1e62b8..9e9fb675d 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java @@ -26,6 +26,8 @@ public class SysCustomerCaseFile extends BaseEntity @Excel(name = "文件路径") private String fileUrl; + private String downUrl; + /** 文件名字 */ @Excel(name = "文件名字") private String fileName; diff --git a/stdiet-ui/src/api/custom/customerCase.js b/stdiet-ui/src/api/custom/customerCase.js index 1d8c6358a..0f388c098 100644 --- a/stdiet-ui/src/api/custom/customerCase.js +++ b/stdiet-ui/src/api/custom/customerCase.js @@ -71,12 +71,8 @@ export function uploadCseFile(data) { } // 下载案例文件 -export function downCaseFile(data) { - return request({ - url: '/custom/customerCase/downCaseFile', - method: 'post', - data: data - }) +export function downCaseFile(downUrl) { + window.location.href = downUrl; } diff --git a/stdiet-ui/src/components/FileDownload/MuchFileDown.vue b/stdiet-ui/src/components/FileDownload/MuchFileDown.vue index f677b5a4f..7df657a4f 100644 --- a/stdiet-ui/src/components/FileDownload/MuchFileDown.vue +++ b/stdiet-ui/src/components/FileDownload/MuchFileDown.vue @@ -12,7 +12,7 @@ size="mini" type="text" icon="el-icon-download" - @click="" + @click="downloadFile(scope.row)" >下载 @@ -66,7 +66,7 @@ export default { this.fileList = []; }, downloadFile(file){ - downCaseFile(file); + downCaseFile(file.downUrl); } }, }; diff --git a/stdiet-ui/src/components/FileUpload/DragUpload.vue b/stdiet-ui/src/components/FileUpload/DragUpload.vue index 6ce5494b8..0caedacf4 100644 --- a/stdiet-ui/src/components/FileUpload/DragUpload.vue +++ b/stdiet-ui/src/components/FileUpload/DragUpload.vue @@ -17,7 +17,7 @@ :auto-upload="false">
将文件拖到此处,或点击上传
-
每个案例最多上传5个文件,且每个文件不超过50M
+
每个案例最多上传5个文件,且每个文件不超过10M