package org.jeecg.modules.desk.controller;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import io.swagger.annotations.Api;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.shiro.SecurityUtils;
|
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.aspect.annotation.AutoLog;
|
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.system.base.controller.JeecgController;
|
import org.jeecg.common.system.query.QueryGenerator;
|
import org.jeecg.common.system.vo.LoginUser;
|
import org.jeecg.common.util.CommonUtils;
|
import org.jeecg.common.util.DateUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.modules.desk.entity.DeskFile;
|
import org.jeecg.modules.desk.service.IDeskFileService;
|
import org.jeecg.modules.desk.vo.DeskFileTree;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.FileCopyUtils;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
import org.springframework.web.servlet.HandlerMapping;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.*;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
|
@Slf4j
|
@Api(tags = "我的桌面")
|
@RestController
|
@RequestMapping("/desk/file")
|
public class DeskFileController extends JeecgController<DeskFile, IDeskFileService> {
|
@Autowired
|
private IDeskFileService deskFileService;
|
@Value(value = "${jeecg.path.upload}")
|
private String uploadpath;
|
|
/**
|
* 本地:local minio:minio 阿里:alioss
|
*/
|
@Value(value = "${jeecg.uploadType}")
|
private String uploadType;
|
|
private static int FOLDER_TYPE_2 = 2; //文件类型 1-文件 2-文件夹
|
private static String DESKTOP_FOLDER_TAG = "desk";//桌面文件标记
|
private static String DESKTOP_FOLDER_ALL_TAG = "all";//通用文件夹标记,所有人可查询此文件夹
|
|
//加载桌面文件夹
|
@RequestMapping(value = "/desktop", method = RequestMethod.GET)
|
public Result<IPage<DeskFile>> desktop(DeskFile deskFile, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
@RequestParam(name = "pageSize", defaultValue = "1000") Integer pageSize, HttpServletRequest req) {
|
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
String username = sysUser.getUsername();
|
Result<IPage<DeskFile>> result = new Result<IPage<DeskFile>>();
|
|
QueryWrapper<DeskFile> queryWrapper = QueryGenerator.initQueryWrapper(deskFile, req.getParameterMap());
|
//查询类型为2的数据(1-文件 2-文件夹)
|
queryWrapper.lambda().eq(DeskFile::getType, FOLDER_TYPE_2);
|
//查询tag为desk的数据(desk-桌面文件夹标记)
|
queryWrapper.lambda().and(i -> i.eq(DeskFile::getTag, DESKTOP_FOLDER_TAG));
|
|
//查询登录用户的数据
|
queryWrapper.lambda().and(i -> i.eq(DeskFile::getCreateBy, username).or().eq(DeskFile::getCreateBy,DESKTOP_FOLDER_ALL_TAG) );
|
//只查询未删除数据
|
queryWrapper.lambda().and(i -> i.isNull(true,DeskFile::getDel).or().eq(DeskFile::getDel,0));
|
|
Page<DeskFile> page = new Page<DeskFile>(pageNo, pageSize);
|
IPage<DeskFile> pageList = deskFileService.page(page, queryWrapper);
|
result.setSuccess(true);
|
result.setResult(pageList);
|
return result;
|
}
|
|
|
//通用查询
|
@RequestMapping(value = "/list", method = RequestMethod.GET)
|
public Result<IPage<DeskFile>> queryPageList(DeskFile deskFile, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
@RequestParam(name = "pageSize", defaultValue = "100") Integer pageSize, HttpServletRequest req) {
|
Result<IPage<DeskFile>> result = new Result<IPage<DeskFile>>();
|
if (deskFile.getPid().isEmpty()) {
|
return result.error500("上级目录不能为空!");
|
}
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
String username = sysUser.getUsername();
|
|
QueryWrapper<DeskFile> queryWrapper = QueryGenerator.initQueryWrapper(deskFile, req.getParameterMap());
|
//查询登录用户的数据
|
queryWrapper.lambda().eq(DeskFile::getCreateBy, username);
|
//只查询未删除数据
|
queryWrapper.lambda().isNull(true, DeskFile::getDel).or().eq(DeskFile::getDel, 0);
|
Page<DeskFile> page = new Page<DeskFile>(pageNo, pageSize);
|
IPage<DeskFile> pageList = deskFileService.page(page, queryWrapper);
|
//递归查询pid
|
String pid = deskFile.getPid();
|
List<Map<String, Object>> res = new ArrayList<>();
|
getParent(res, pid);
|
result.setSuccess(true);
|
result.setResult(pageList);
|
result.setResultExt(res);
|
return result;
|
}
|
|
//查询最近100条数据
|
@RequestMapping(value = "/recent", method = RequestMethod.GET)
|
public Result<IPage<DeskFile>> recent(DeskFile deskFile, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
@RequestParam(name = "pageSize", defaultValue = "100") Integer pageSize, HttpServletRequest req) {
|
Result<IPage<DeskFile>> result = new Result<IPage<DeskFile>>();
|
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
String username = sysUser.getUsername();
|
|
QueryWrapper<DeskFile> queryWrapper = QueryGenerator.initQueryWrapper(deskFile, req.getParameterMap());
|
//查询登录用户的数据
|
queryWrapper.lambda().eq(DeskFile::getCreateBy, username);
|
queryWrapper.lambda().eq(DeskFile::getType, 1);
|
//只查询未删除数据
|
queryWrapper.lambda().isNull(true, DeskFile::getDel).or().eq(DeskFile::getDel, 0);
|
Page<DeskFile> page = new Page<DeskFile>(pageNo, pageSize);
|
IPage<DeskFile> pageList = deskFileService.page(page, queryWrapper);
|
result.setSuccess(true);
|
result.setResult(pageList);
|
|
return result;
|
}
|
|
private void getParent(List<Map<String, Object>> res, String pid) {
|
Map<String, Object> map = new HashMap<>();
|
DeskFile byId = deskFileService.getById(pid);
|
if (byId != null) {
|
map.put("id", byId.getId());
|
map.put("name", byId.getName());
|
res.add(map);
|
getParent(res, byId.getPid());
|
}
|
}
|
|
@RequestMapping(value = "/add", method = RequestMethod.POST)
|
@AutoLog(value = "添加文件")
|
@Transactional
|
public Result<DeskFile> add(@RequestBody DeskFile deskFile, HttpServletRequest request) {
|
Result<DeskFile> result = new Result<DeskFile>();
|
|
|
// 添加先查询是否有同名文件 TODO
|
QueryWrapper<DeskFile> queryWrapper = new QueryWrapper<>();
|
if (deskFile.getPid() != null) {
|
queryWrapper.lambda().eq(DeskFile::getPid, deskFile.getPid());
|
}
|
//添加桌面文件夹
|
if (deskFile.getTag() != null) {
|
queryWrapper.lambda().eq(DeskFile::getTag, deskFile.getTag());
|
}
|
queryWrapper.lambda().like(DeskFile::getName, deskFile.getName());
|
List<DeskFile> list = deskFileService.list(queryWrapper);
|
if (list != null && list.size() > 0) {
|
// result.error500("文件名已存在");
|
// return result;
|
deskFile.setName(deskFile.getName() + "(" + list.size() + ")");
|
}
|
|
//特殊处理批量文件添加(添加文件)
|
if (deskFile.getType() == 1) {
|
String filelist = deskFile.getFileList();
|
if (filelist != null && !StringUtils.isEmpty(filelist)) {
|
String[] split = filelist.split(",");
|
for (int i = 0; i < split.length; i++) {
|
String filePath = split[i];
|
DeskFile desk = new DeskFile();
|
desk.setFileName(filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()));
|
desk.setFilePath(filePath);
|
desk.setPid(deskFile.getPid());
|
desk.setType(deskFile.getType());
|
desk.setFileType(filePath.substring(filePath.lastIndexOf(".") + 1));
|
//截取名称
|
String name = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.indexOf("_"));
|
QueryWrapper<DeskFile> wrapper = new QueryWrapper<>();
|
if (deskFile.getPid() != null) {
|
wrapper.lambda().eq(DeskFile::getPid, desk.getPid());
|
}
|
wrapper.lambda().like(DeskFile::getName, name);
|
List<DeskFile> res = deskFileService.list(wrapper);
|
if (res != null && res.size() > 0) {
|
//文件名重复
|
desk.setName(name + "(" + res.size() + ")");
|
} else {
|
//文件名不重复
|
desk.setName(name);
|
}
|
desk.setUpdateTime(new Date());
|
deskFileService.save(desk);
|
}
|
}
|
//(添加文件夹)
|
} else if (deskFile.getType() == 2) {
|
deskFile.setFileType("文件夹");
|
deskFile.setUpdateTime(new Date());
|
deskFileService.save(deskFile);
|
}
|
|
result.success("添加成功!");
|
result.setResult(deskFile);
|
return result;
|
}
|
|
|
@RequestMapping(value = "/edit", method = RequestMethod.PUT)
|
public Result<DeskFile> edit(@RequestBody DeskFile deskFile) {
|
Result<DeskFile> result = new Result<DeskFile>();
|
|
//先查询是否有同名文件 TODO
|
QueryWrapper<DeskFile> queryWrapper = new QueryWrapper<>();
|
if (deskFile.getPid() != null) {
|
queryWrapper.lambda().eq(DeskFile::getPid, deskFile.getPid());
|
}
|
queryWrapper.lambda().eq(DeskFile::getName, deskFile.getName());
|
queryWrapper.lambda().ne(DeskFile::getId, deskFile.getId());
|
List<DeskFile> list = deskFileService.list(queryWrapper);
|
if (list != null && list.size() > 0) {
|
result.error500("文件名已存在");
|
return result;
|
}
|
deskFileService.updateById(deskFile);
|
result.success("修改成功!");
|
result.setResult(deskFile);
|
return result;
|
}
|
|
|
@RequestMapping(value = "/queryTreeList", method = RequestMethod.GET)
|
public Result<List<DeskFileTree>> queryTreeList(DeskFile deskFile) {
|
|
Result<List<DeskFileTree>> result = new Result<List<DeskFileTree>>();
|
|
QueryWrapper<DeskFile> queryWrapper = new QueryWrapper<>();
|
queryWrapper.lambda().eq(DeskFile::getType, FOLDER_TYPE_2);
|
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
String username = sysUser.getUsername();
|
|
//查询登录用户的数据
|
queryWrapper.lambda().eq(DeskFile::getCreateBy, username);
|
|
List<DeskFile> list = deskFileService.list(queryWrapper);
|
List<DeskFileTree> trees = new ArrayList<>();
|
getTreeList(trees, list, null);
|
//传入用户名为最上级目录
|
getTreePath(trees, null, username);
|
result.setSuccess(true);
|
result.setResult(trees);
|
return result;
|
}
|
|
|
private void getTreeList(List<DeskFileTree> treeList, List<DeskFile> metaList, DeskFileTree temp) {
|
for (DeskFile desk : metaList) {
|
String tempPid = desk.getPid();
|
DeskFileTree tree = new DeskFileTree(desk);
|
if (temp == null && oConvertUtils.isEmpty(tempPid)) {
|
treeList.add(tree);
|
getTreeList(treeList, metaList, tree);
|
} else if (temp != null && tempPid != null && tempPid.equals(temp.getId())) {
|
temp.getChildren().add(tree);
|
getTreeList(treeList, metaList, tree);
|
}
|
|
}
|
}
|
|
//获取路径
|
public void getTreePath(List<DeskFileTree> treeList, DeskFileTree temp, String userPath) {
|
for (DeskFileTree desk : treeList) {
|
String path = desk.getPath();
|
String pid = desk.getPid();
|
if (temp != null && temp.getPid() != null && pid.equals(temp.getId())) {
|
path = temp.getPath() + '/' + path;
|
} else {
|
path = desk.getPath();
|
}
|
//加入用户名为主路径
|
desk.setPath(userPath + "/" + path);
|
if (desk.getChildren().size() < 1) {
|
} else {
|
getTreePath(desk.getChildren(), desk, userPath);
|
}
|
}
|
}
|
|
@AutoLog(value = "删除-虚拟桌面文件")
|
@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
|
@Transactional
|
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
String username = sysUser.getUsername();
|
|
DeskFile byId = deskFileService.getById(id);
|
if(byId.getName().equals("最近上传") || byId.getName().equals(username)){
|
return Result.error("此文件夹不可删除");
|
}
|
deskFileService.removeById(byId);
|
//递归删除文件夹下文件
|
delSub(byId.getId());
|
|
|
return Result.ok("删除成功");
|
}
|
|
public void delSub(String pid) {
|
QueryWrapper<DeskFile> queryWrapper = new QueryWrapper<>();
|
queryWrapper.lambda().eq(DeskFile::getPid, pid);
|
List<DeskFile> list = deskFileService.list(queryWrapper);
|
if (list.size() > 0) {
|
deskFileService.remove(queryWrapper);
|
for (int i = 0; i < list.size(); i++) {
|
delSub(list.get(i).getId());
|
}
|
}
|
|
}
|
|
/****上传部分start****/
|
|
//由于需要直接上传功能,需要新增一个自定义上传接口
|
@PostMapping(value = "/upload")
|
public Result<?> upload(HttpServletRequest request, HttpServletResponse response) {
|
Result<?> result = new Result<>();
|
String savePath = "";
|
String bizPath = request.getParameter("biz");
|
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
|
MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象
|
//update-begin-author:lvdandan date:20200928 for:修改JEditor编辑器本地上传
|
savePath = this.uploadLocal(file, bizPath);
|
//update-begin-author:lvdandan date:20200928 for:修改JEditor编辑器本地上传
|
|
if (oConvertUtils.isNotEmpty(savePath)) {
|
result.setMessage(savePath);
|
result.setSuccess(true);
|
} else {
|
result.setMessage("上传失败!");
|
result.setSuccess(false);
|
}
|
return result;
|
}
|
|
/**
|
* 本地文件上传
|
*
|
* @param mf 文件
|
* @param bizPath 自定义路径
|
* @return
|
*/
|
private String uploadLocal(MultipartFile mf, String bizPath) {
|
try {
|
String ctxPath = uploadpath;
|
String fileName = null;
|
File file = new File(ctxPath + File.separator + bizPath + File.separator);
|
if (!file.exists()) {
|
file.mkdirs();// 创建文件根目录
|
}
|
String orgName = mf.getOriginalFilename();// 获取文件名
|
orgName = CommonUtils.getFileName(orgName);
|
if (orgName.indexOf(".") != -1) {
|
fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + DateUtils.date2Str(new SimpleDateFormat("yyyyMMddHHmmss")) + orgName.substring(orgName.lastIndexOf("."));
|
} else {
|
fileName = orgName + "_" + System.currentTimeMillis();
|
}
|
String savePath = file.getPath() + File.separator + fileName;
|
File savefile = new File(savePath);
|
FileCopyUtils.copy(mf.getBytes(), savefile);
|
String dbpath = null;
|
if (oConvertUtils.isNotEmpty(bizPath)) {
|
dbpath = bizPath + File.separator + fileName;
|
} else {
|
dbpath = fileName;
|
}
|
if (dbpath.contains("\\")) {
|
dbpath = dbpath.replace("\\", "/");
|
}
|
return dbpath;
|
} catch (IOException e) {
|
log.error(e.getMessage(), e);
|
}
|
return "";
|
}
|
|
/****上传部分end****/
|
|
|
@GetMapping(value = "/static/**")
|
public void view(HttpServletRequest request, HttpServletResponse response) {
|
// ISO-8859-1 ==> UTF-8 进行编码转换
|
String imgPath = extractPathFromPattern(request);
|
if(oConvertUtils.isEmpty(imgPath) || imgPath=="null"){
|
return;
|
}
|
// 其余处理略
|
InputStream inputStream = null;
|
OutputStream outputStream = null;
|
try {
|
imgPath = imgPath.replace("..", "").replace("../","");
|
if (imgPath.endsWith(",")) {
|
imgPath = imgPath.substring(0, imgPath.length() - 1);
|
}
|
String filePath = uploadpath + File.separator + imgPath;
|
File file = new File(filePath);
|
if(!file.exists()){
|
response.setStatus(404);
|
throw new RuntimeException("文件["+imgPath+"]不存在..");
|
}
|
response.setContentType("application/force-download");// 设置强制下载不打开
|
response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1"));
|
inputStream = new BufferedInputStream(new FileInputStream(filePath));
|
outputStream = response.getOutputStream();
|
byte[] buf = new byte[1024];
|
int len;
|
while ((len = inputStream.read(buf)) > 0) {
|
outputStream.write(buf, 0, len);
|
}
|
response.flushBuffer();
|
} catch (IOException e) {
|
log.error("预览文件失败" + e.getMessage());
|
response.setStatus(404);
|
e.printStackTrace();
|
} finally {
|
if (inputStream != null) {
|
try {
|
inputStream.close();
|
} catch (IOException e) {
|
log.error(e.getMessage(), e);
|
}
|
}
|
if (outputStream != null) {
|
try {
|
outputStream.close();
|
} catch (IOException e) {
|
log.error(e.getMessage(), e);
|
}
|
}
|
}
|
|
}
|
/**
|
* 把指定URL后的字符串全部截断当成参数
|
* 这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题
|
* @param request
|
* @return
|
*/
|
private static String extractPathFromPattern(final HttpServletRequest request) {
|
String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
|
String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);
|
}
|
|
}
|