增加总存储空间限制

This commit is contained in:
马超 2021-05-30 16:48:04 +08:00
parent d95e3df011
commit 4006e4cdd8
11 changed files with 157 additions and 74 deletions

4
.gitignore vendored
View File

@ -1,5 +1,5 @@
/.idea /.idea
/release /release
/*.log /*.log
/file-common/target /target
/file-office/target /file-web.iml

View File

@ -0,0 +1,9 @@
package com.qiwenshare.file.api;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qiwenshare.file.domain.StorageBean;
public interface IStorageService extends IService<StorageBean> {
public Long getTotalStorageSize(Long userId);
boolean checkStorage(Long userId, Long fileSize);
}

View File

@ -72,14 +72,9 @@ public class FileController {
@MyLog(operation = "创建文件", module = CURRENT_MODULE) @MyLog(operation = "创建文件", module = CURRENT_MODULE)
@ResponseBody @ResponseBody
public RestResult<String> createFile(@RequestBody CreateFileDTO createFileDto, @RequestHeader("token") String token) { public RestResult<String> createFile(@RequestBody CreateFileDTO createFileDto, @RequestHeader("token") String token) {
if (!operationCheck(token).getSuccess()){
return operationCheck(token);
}
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) {
throw new NotLoginException();
}
List<UserFile> userFiles = userFileService.selectUserFileByNameAndPath(createFileDto.getFileName(), createFileDto.getFilePath(), sessionUserBean.getUserId()); List<UserFile> userFiles = userFileService.selectUserFileByNameAndPath(createFileDto.getFileName(), createFileDto.getFilePath(), sessionUserBean.getUserId());
if (userFiles != null && !userFiles.isEmpty()) { if (userFiles != null && !userFiles.isEmpty()) {
return RestResult.fail().message("同名文件已存在"); return RestResult.fail().message("同名文件已存在");
@ -144,9 +139,7 @@ public class FileController {
@MyLog(operation = "文件重命名", module = CURRENT_MODULE) @MyLog(operation = "文件重命名", module = CURRENT_MODULE)
@ResponseBody @ResponseBody
public RestResult<String> renameFile(@RequestBody RenameFileDTO renameFileDto, @RequestHeader("token") String token) { public RestResult<String> renameFile(@RequestBody RenameFileDTO renameFileDto, @RequestHeader("token") String token) {
if (!operationCheck(token).getSuccess()){
return operationCheck(token);
}
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) { if (sessionUserBean == null) {
throw new NotLoginException(); throw new NotLoginException();
@ -254,9 +247,6 @@ public class FileController {
@ResponseBody @ResponseBody
public RestResult<String> deleteImageByIds(@RequestBody BatchDeleteFileDTO batchDeleteFileDto, @RequestHeader("token") String token) { public RestResult<String> deleteImageByIds(@RequestBody BatchDeleteFileDTO batchDeleteFileDto, @RequestHeader("token") String token) {
if (!operationCheck(token).getSuccess()) {
return operationCheck(token);
}
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) { if (sessionUserBean == null) {
throw new NotLoginException(); throw new NotLoginException();
@ -279,10 +269,6 @@ public class FileController {
@ResponseBody @ResponseBody
public RestResult deleteFile(@RequestBody DeleteFileDTO deleteFileDto, @RequestHeader("token") String token) { public RestResult deleteFile(@RequestBody DeleteFileDTO deleteFileDto, @RequestHeader("token") String token) {
if (!operationCheck(token).getSuccess()){
return operationCheck(token);
}
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) { if (sessionUserBean == null) {
throw new NotLoginException(); throw new NotLoginException();
@ -300,9 +286,6 @@ public class FileController {
@ResponseBody @ResponseBody
public RestResult<String> unzipFile(@RequestBody UnzipFileDTO unzipFileDto, @RequestHeader("token") String token) { public RestResult<String> unzipFile(@RequestBody UnzipFileDTO unzipFileDto, @RequestHeader("token") String token) {
if (!operationCheck(token).getSuccess()){
return operationCheck(token);
}
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) { if (sessionUserBean == null) {
throw new NotLoginException(); throw new NotLoginException();
@ -385,10 +368,6 @@ public class FileController {
@ResponseBody @ResponseBody
public RestResult<String> moveFile(@RequestBody MoveFileDTO moveFileDto, @RequestHeader("token") String token) { public RestResult<String> moveFile(@RequestBody MoveFileDTO moveFileDto, @RequestHeader("token") String token) {
if (!operationCheck(token).getSuccess()){
return operationCheck(token);
}
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) { if (sessionUserBean == null) {
throw new NotLoginException(); throw new NotLoginException();
@ -409,9 +388,6 @@ public class FileController {
@ResponseBody @ResponseBody
public RestResult<String> batchMoveFile(@RequestBody BatchMoveFileDTO batchMoveFileDto, @RequestHeader("token") String token) { public RestResult<String> batchMoveFile(@RequestBody BatchMoveFileDTO batchMoveFileDto, @RequestHeader("token") String token) {
if (!operationCheck(token).getSuccess()) {
return operationCheck(token);
}
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) { if (sessionUserBean == null) {
throw new NotLoginException(); throw new NotLoginException();
@ -429,18 +405,7 @@ public class FileController {
} }
public RestResult<String> operationCheck(String token){
RestResult<String> result = new RestResult<String>();
UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null){
result.setSuccess(false);
result.setMessage("未登录");
return result;
}
result.setSuccess(true);
return result;
}
@Operation(summary = "通过文件类型选择文件", description = "该接口可以实现文件格式分类查看", tags = {"file"}) @Operation(summary = "通过文件类型选择文件", description = "该接口可以实现文件格式分类查看", tags = {"file"})
@RequestMapping(value = "/selectfilebyfiletype", method = RequestMethod.GET) @RequestMapping(value = "/selectfilebyfiletype", method = RequestMethod.GET)

View File

@ -18,6 +18,7 @@ import com.qiwenshare.file.domain.UserFile;
import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.DownloadFileDTO;
import com.qiwenshare.file.dto.UploadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO;
import com.qiwenshare.file.dto.file.PreviewDTO; import com.qiwenshare.file.dto.file.PreviewDTO;
import com.qiwenshare.file.service.StorageService;
import com.qiwenshare.file.vo.file.UploadFileVo; import com.qiwenshare.file.vo.file.UploadFileVo;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -42,9 +43,6 @@ public class FiletransferController {
@Resource @Resource
IFiletransferService filetransferService; IFiletransferService filetransferService;
@Resource
FileController fileController;
@Resource @Resource
IFileService fileService; IFileService fileService;
@Resource @Resource
@ -53,6 +51,8 @@ public class FiletransferController {
IUserFileService userFileService; IUserFileService userFileService;
@Resource @Resource
FileDealComp fileDealComp; FileDealComp fileDealComp;
@Resource
StorageService storageService;
public static final String CURRENT_MODULE = "文件传输接口"; public static final String CURRENT_MODULE = "文件传输接口";
@Operation(summary = "极速上传", description = "校验文件MD5判断文件是否存在如果存在直接上传成功并返回skipUpload=true如果不存在返回skipUpload=false需要再次调用该接口的POST方法", tags = {"filetransfer"}) @Operation(summary = "极速上传", description = "校验文件MD5判断文件是否存在如果存在直接上传成功并返回skipUpload=true如果不存在返回skipUpload=false需要再次调用该接口的POST方法", tags = {"filetransfer"})
@ -62,14 +62,12 @@ public class FiletransferController {
public RestResult<UploadFileVo> uploadFileSpeed(UploadFileDTO uploadFileDto, @RequestHeader("token") String token) { public RestResult<UploadFileVo> uploadFileSpeed(UploadFileDTO uploadFileDto, @RequestHeader("token") String token) {
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean == null) {
throw new NotLoginException(); boolean isCheckSuccess = storageService.checkStorage(sessionUserBean.getUserId(), uploadFileDto.getTotalSize());
if (!isCheckSuccess) {
return RestResult.fail().message("存储空间不足");
} }
RestResult<String> operationCheckResult = fileController.operationCheck(token);
if (!operationCheckResult.getSuccess()){
return RestResult.fail().message("没权限,请联系管理员!");
}
UploadFileVo uploadFileVo = new UploadFileVo(); UploadFileVo uploadFileVo = new UploadFileVo();
Map<String, Object> param = new HashMap<String, Object>(); Map<String, Object> param = new HashMap<String, Object>();
param.put("identifier", uploadFileDto.getIdentifier()); param.put("identifier", uploadFileDto.getIdentifier());
@ -111,10 +109,6 @@ public class FiletransferController {
if (sessionUserBean == null) { if (sessionUserBean == null) {
throw new NotLoginException(); throw new NotLoginException();
} }
RestResult<String> operationCheckResult = fileController.operationCheck(token);
if (!operationCheckResult.getSuccess()){
return RestResult.fail().message("没权限,请联系管理员!");
}
filetransferService.uploadFile(request, uploadFileDto, sessionUserBean.getUserId()); filetransferService.uploadFile(request, uploadFileDto, sessionUserBean.getUserId());
@ -201,6 +195,8 @@ public class FiletransferController {
StorageBean storage = new StorageBean(); StorageBean storage = new StorageBean();
storage.setUserId(sessionUserBean.getUserId()); storage.setUserId(sessionUserBean.getUserId());
storage.setStorageSize(storageSize); storage.setStorageSize(storageSize);
Long totalStorageSize = storageService.getTotalStorageSize(sessionUserBean.getUserId());
storage.setTotalStorageSize(totalStorageSize * 1024);
return RestResult.success().data(storage); return RestResult.success().data(storage);
} }

View File

@ -28,6 +28,9 @@ public class StorageBean {
@Column(columnDefinition="bigint(20)") @Column(columnDefinition="bigint(20)")
private Long storageSize; private Long storageSize;
@Column(columnDefinition="bigint(20)")
private Long totalStorageSize;
public StorageBean() { public StorageBean() {
} }

View File

@ -0,0 +1,26 @@
package com.qiwenshare.file.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import javax.persistence.*;
@Data
@Table(name = "sysparam")
@Entity
@TableName("sysparam")
public class SysParam {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition="bigint(20)")
@TableId(type = IdType.AUTO)
private Long sysParamId;
@Column(columnDefinition="varchar(50)")
private String sysParamKey;
@Column(columnDefinition="varchar(50)")
private String sysParamValue;
@Column(columnDefinition="varchar(50)")
private String sysParamDesc;
}

View File

@ -32,12 +32,6 @@ public class UploadFileDTO {
@Schema(description = "文件名") @Schema(description = "文件名")
private String filename; private String filename;
/**
* 文件大小
*/
@Schema(description = "文件大小")
private Long fileSize;
@Schema(description = "切片数量") @Schema(description = "切片数量")
private int chunkNumber; private int chunkNumber;

View File

@ -0,0 +1,10 @@
package com.qiwenshare.file.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiwenshare.file.domain.SysParam;
public interface SysParamMapper extends BaseMapper<SysParam> {
}

View File

@ -88,8 +88,6 @@ public class FiletransferService implements IFiletransferService {
if (uploadFile.getSuccess() == 1){ if (uploadFile.getSuccess() == 1){
fileBean.setFileUrl(uploadFile.getUrl()); fileBean.setFileUrl(uploadFile.getUrl());
fileBean.setFileSize(uploadFile.getFileSize()); fileBean.setFileSize(uploadFile.getFileSize());
//fileBean.setUploadTime(DateUtil.getCurrentTime());
// fileBean.setIsOSS(uploadFile.getIsOSS());
fileBean.setStorageType(uploadFile.getStorageType()); fileBean.setStorageType(uploadFile.getStorageType());
fileBean.setPointCount(1); fileBean.setPointCount(1);
fileMapper.insert(fileBean); fileMapper.insert(fileBean);
@ -105,19 +103,6 @@ public class FiletransferService implements IFiletransferService {
userFileMapper.insert(userFile); userFileMapper.insert(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId()); fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
synchronized (FiletransferService.class) {
StorageBean storageBean = selectStorageBean(new StorageBean(userId));
if (storageBean == null) {
StorageBean storage = new StorageBean(userId);
storage.setStorageSize(fileBean.getFileSize());
insertStorageBean(storage);
} else {
storageBean.setStorageSize(storageBean.getStorageSize() + uploadFile.getFileSize());
updateStorageBean(storageBean);
}
}
} }
} }

View File

@ -0,0 +1,92 @@
package com.qiwenshare.file.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qiwenshare.file.api.IShareService;
import com.qiwenshare.file.api.IStorageService;
import com.qiwenshare.file.domain.Share;
import com.qiwenshare.file.domain.StorageBean;
import com.qiwenshare.file.domain.SysParam;
import com.qiwenshare.file.dto.sharefile.ShareListDTO;
import com.qiwenshare.file.mapper.ShareMapper;
import com.qiwenshare.file.mapper.StorageMapper;
import com.qiwenshare.file.mapper.SysParamMapper;
import com.qiwenshare.file.mapper.UserFileMapper;
import com.qiwenshare.file.vo.share.ShareListVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Service
@Transactional(rollbackFor=Exception.class)
public class StorageService extends ServiceImpl<StorageMapper, StorageBean> implements IStorageService {
@Resource
StorageMapper storageMapper;
@Resource
SysParamMapper sysParamMapper;
@Resource
UserFileMapper userFileMapper;
public Long getTotalStorageSize(Long userId) {
LambdaQueryWrapper<StorageBean> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(StorageBean::getUserId, userId);
StorageBean storageBean = storageMapper.selectOne(lambdaQueryWrapper);
Long totalStorageSize = null;
if (storageBean == null || storageBean.getTotalStorageSize() == null) {
LambdaQueryWrapper<SysParam> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.eq(SysParam::getSysParamKey, "totalStorageSize");
SysParam sysParam = sysParamMapper.selectOne(lambdaQueryWrapper1);
totalStorageSize = Long.parseLong(sysParam.getSysParamValue());
storageBean = new StorageBean();
storageBean.setUserId(userId);
storageBean.setTotalStorageSize(totalStorageSize);
storageMapper.insert(storageBean);
} else {
totalStorageSize = storageBean.getTotalStorageSize();
}
if (totalStorageSize != null) {
totalStorageSize = totalStorageSize * 1024;
}
return totalStorageSize;
}
public boolean checkStorage(Long userId, Long fileSize) {
LambdaQueryWrapper<StorageBean> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(StorageBean::getUserId, userId);
StorageBean storageBean = storageMapper.selectOne(lambdaQueryWrapper);
Long totalStorageSize = null;
if (storageBean == null || storageBean.getTotalStorageSize() == null) {
LambdaQueryWrapper<SysParam> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.eq(SysParam::getSysParamKey, "totalStorageSize");
SysParam sysParam = sysParamMapper.selectOne(lambdaQueryWrapper1);
totalStorageSize = Long.parseLong(sysParam.getSysParamValue());
storageBean = new StorageBean();
storageBean.setUserId(userId);
storageBean.setTotalStorageSize(totalStorageSize);
storageMapper.insert(storageBean);
} else {
totalStorageSize = storageBean.getTotalStorageSize();
}
if (totalStorageSize != null) {
totalStorageSize = totalStorageSize * 1024;
}
Long storageSize = userFileMapper.selectStorageSizeByUserId(userId);
if (storageSize == null ){
storageSize = 0L;
}
if (storageSize + fileSize > totalStorageSize) {
return false;
}
return true;
}
}

View File

@ -7,3 +7,6 @@ delete from user_role where userId = 1 and roleId = 1;
insert into user_role (userId, roleId) values (1, 1); insert into user_role (userId, roleId) values (1, 1);
delete from role_permission where roleId = 1 and permissionId = 1; delete from role_permission where roleId = 1 and permissionId = 1;
insert into role_permission (roleId, permissionId) values (1, 1); insert into role_permission (roleId, permissionId) values (1, 1);
delete from sysparam where sysParamId = 1;
insert into sysparam (sysParamId, sysParamKey, sysParamValue, sysParamDesc) values (1, 'totalStorageSize', '1024', '总存储大小单位M');