package cn.xiaosm.cloud.core.service.impl;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.xiaosm.cloud.common.exception.CanShowException;
import cn.xiaosm.cloud.common.exception.ResourceException;
import cn.xiaosm.cloud.common.util.FileUtil;
import cn.xiaosm.cloud.core.config.EditableType;
import cn.xiaosm.cloud.core.config.security.SecurityUtils;
import cn.xiaosm.cloud.core.entity.Bucket;
import cn.xiaosm.cloud.core.entity.Resource;
import cn.xiaosm.cloud.core.entity.dto.ResourceDTO;
import cn.xiaosm.cloud.core.entity.dto.ResourceParentDTO;
import cn.xiaosm.cloud.core.entity.dto.UploadDTO;
import cn.xiaosm.cloud.core.mapper.ResourceMapper;
import cn.xiaosm.cloud.core.service.ChunkService;
import cn.xiaosm.cloud.core.service.ResourceService;
import cn.xiaosm.cloud.core.storage.FileStorageUtil;
import cn.xiaosm.cloud.core.storage.UploadConfig;
import cn.xiaosm.cloud.core.util.download.DlTaskInfo;
import cn.xiaosm.cloud.core.util.download.DownloadService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Young
* @create 2022/3/24
* @since 1.0.0
*/
@Slf4j
@Service
public class ResourceServiceImpl extends ServiceImpl<ResourceMapper, Resource> implements ResourceService {
/**
* 文件名不可用字符
*/
public final static String ILLEGAL_CHAR = "\\/:*\"<>|";
private final static Long ROOT_ID = 0L;
@Autowired
LocalBucketServiceImpl bucketService;
@Autowired
ChunkService chunkService;
@Autowired
ResourceMapper resourceMapper;
@Autowired
DownloadService downloadService;
/**
* 通过 id 获取当前登录用户的资源
*/
@Override
public Resource getByCurrentUser(Long id) {
return resourceMapper.selectByIdAndUser(id, SecurityUtils.getLoginUserId());
}
@Override
public List<Resource> getByCurrentUser(String ids) {
return resourceMapper.selectByIdsAndUser(ids, SecurityUtils.getLoginUserId());
}
@Override
public List<Resource> listByIds(String ids) {
return resourceMapper.selectByIdsAndUser(ids, null);
}
@Override
public List<Resource> list(ResourceDTO resource) {
// 查询当前仓库
Bucket bucket = bucketService.getBucket(resource.getBucketName());
// 后续的接口不需要再使用 userId 来查询,因为在上面的仓库查询中使用过 userId 筛选过了
List<Resource> resources = new ArrayList<>();
if (resource.getParentId() != null && resource.getParentId() > 0) { // 如果有父级 id,则根据父级 id 查询
QueryWrapper<Resource> wrapper = new QueryWrapper<>();
wrapper.select("id").eq("id", resource.getParentId())
.eq("user_id", SecurityUtils.getLoginUserId());
Resource db = resourceMapper.selectOne(wrapper);
// 判断当前用户是否拥有 parentId 的资源
Assert.notNull(db, "目录不存在");
resources = resourceMapper.listByParentId(resource.getParentId());
} else if (StrUtil.isBlank(resource.getPath()) || "/".equals(resource.getPath())) { // 检索根目录文件
// 获取当前仓库根目录下所有文件
resources = resourceMapper.listRoot(0, bucket.getId());
} else if (StrUtil.isNotBlank(resource.getPath())) { // 检索指定目录下的文件
Long parentId = getIdByPath(bucket.getId(), resource.getPath());
resources = resourceMapper.listByParentId(parentId);
}
// 根据类型过滤
if (StrUtil.isNotBlank(resource.getType())) {
resources = resources.stream().filter(el -> resource.getType().equals(el.getType())).collect(Collectors.toList());
}
resources.sort((el1, el2) -> {
// 如果文件同类型,则按照文件首字母排序
if (el1.isDir() == el2.isDir()) return el1.getName().compareToIgnoreCase(el2.getName());
// 文件夹在前,文件在后
return el1.isDir() ? -1 : 1;
});
return resources;
}
private Long getIdByPath(Integer bucketId, String fullPath) {
if (fullPath.length() == 0 || "/".equals(fullPath)) return ROOT_ID;
// 暂时先使用java循环来找进入文件夹叭
String[] dirs = fullPath.split("/");
Long parentId = ROOT_ID;
for (String dir : dirs) {
if ("".equals(dir)) continue;
parentId = resourceMapper.selectIdByBucketAndNameAndDir(bucketId, parentId, dir);
if (null == parentId) throw new ResourceException(dir + "-目录不存在");
}
return parentId;
}
@Override
public Long create(ResourceDTO resource) {
// 校验文件名
if (!checkName(resource.getName())) throw new ResourceException("文件名不能包含:" + ILLEGAL_CHAR);
// 查询当前仓库
Bucket bucket = bucketService.getBucket(resource.getBucketName());
// 获取父级菜单
Long parentId = getIdByPath(bucket.getId(), resource.getPath());
if (null == parentId) throw new ResourceException(resource.getPath() + "目录不存在");
// 校验名字是否重复
Resource exist = resourceMapper.selectOne(new QueryWrapper<Resource>().eq("parent_id", parentId).eq("name", resource.getName()).select("id"));
// 当文件名重复时
if (!(null == exist || null == exist.getId())) {
throw new ResourceException("文件名重复");
}
Resource db = new Resource(bucket);
db.setName(resource.getName());
db.setParentId(parentId);
// 处理文件或目录
String path = suffixPath();
String fileName = null;
if (resource.isDir()) {
db.setType("dir");
} else {
String uuid = IdUtil.simpleUUID();
// 本地文件名格式:uuid.[fileType]
String fileType = FileUtil.extName(resource.getName());
if (StrUtil.isBlank(fileType)) {
fileName = uuid;
db.setType("txt");
} else {
fileName = uuid + "." + fileType;
db.setType(fileType);
}
db.setPath(path + "/" + fileName);
db.setSize(0L);
// 因为刚开始创建的是空文件,所以不计算hash,使用 uuid
db.setHash(uuid);
}
try {
// 数据库中创建数据后创建文件
if (resourceMapper.insert(db) == 1) {
// 创建文件
if (!db.isDir()) {
FileStorageUtil.of(new byte[1]).setPath(path).setFilename(fileName).upload();
}
log.info("文件创建成功");
}
} catch (Exception e) {
e.printStackTrace();
log.error("文件创建失败");
throw new ResourceException("文件【" + resource.getName() + "】创建失败");
}
return db.getId();
}
@Override
public boolean saveContent(ResourceDTO dto) {
// 获取数据库中的数据
QueryWrapper<Resource> wrapper = ne
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
私有云存储网盘 预览地址 [https://cloud.xiaosm.cn](https://cloud.xiaosm.cn),选择游客登陆,密码xiaoyang 介绍 本项目是一人云盘存储系统,为解决部分用户在上传文件或下载文件时受到第三方平台的限速、或需要文件私有化、有文件在线预览需求等 支持文件上传、下载、在线预览、编辑、分享等功能 本项目在[**RBAC权限系统**](https://github.com/MieMieDeYi/YAdmin)上进行开发 项目使用前后端分离的方式进行开发,使用JWT技术进行token下发和管理 项目主要技术框架 * 前端:TypeScript、Vue3、axios、Naive UI、Element UI Plus * 后端:Springboot、Spring-Security、JWT、Mybatis-plus * 持久层:Mysql8、Redis、ElasticSearch 项目特点 * 使用jdk17和ts,主流的技术栈,方便学习和开发 * 精准的权限控制系统,多角色、多权限分
资源推荐
资源详情
资源评论
收起资源包目录
基于Springboot开发的网盘存储系统.课程设计 (332个子文件)
mvnw.cmd 7KB
lombok.config 64B
index.0f23b876.css 161KB
style-admin.css 1KB
style.css 1KB
style.css 1KB
ui.css 528B
ui.css 528B
FilePath.dae3d7a8.css 280B
Preview-m.ef460a5c.css 201B
Login-m.744d2f4c.css 101B
YPopup.f2eabb99.css 83B
Home.ae3e365a.css 72B
404.de7b93e5.css 68B
ant.css 67B
.env.development 330B
.gitignore 265B
home.html 19KB
role.html 17KB
menu.html 17KB
user.html 15KB
index.html 5KB
login.html 5KB
script.html 5KB
index.html 4KB
aside.html 3KB
filetype.html 3KB
OperatorBar.html 2KB
header.html 1KB
menuIItem.html 1KB
index.html 1010B
style.html 525B
public.html 481B
config.html 307B
footer.html 223B
favicon.ico 4KB
favicon.ico 4KB
ResourceServiceImpl.java 27KB
DownloadService.java 11KB
ChunkServiceImpl.java 10KB
UserServiceImpl.java 10KB
MenuServiceImpl.java 9KB
SchedulerService.java 8KB
ShareServiceImpl.java 7KB
AdminUserController.java 7KB
PreviewController.java 7KB
QQController.java 7KB
ResourceController.java 7KB
UserDetailsServiceImpl.java 7KB
SecurityAdapter.java 6KB
DefaultTokenService.java 6KB
Range.java 5KB
ShareController.java 5KB
WebMvcConfig.java 5KB
RoleController.java 4KB
TaskServiceImpl.java 4KB
LoginController.java 4KB
LogAspect.java 4KB
DownloadUtil.java 4KB
UploadController.java 4KB
MenuController.java 4KB
AdminController.java 4KB
RespUtils.java 4KB
UserMapper.java 4KB
MailUtils.java 3KB
MailConfig.java 3KB
DefaultJWTAuthenticationFilter.java 3KB
GlobalExceptionHandler.java 3KB
ExcelController.java 3KB
RoleServiceImpl.java 3KB
MybatisPlusConfig.java 3KB
User.java 3KB
TaskController.java 3KB
Resource.java 3KB
RouterController.java 3KB
UploadConfig.java 3KB
MyHandlerMethodArgumentResolver.java 2KB
AdminPropsController.java 2KB
TokenService.java 2KB
MailController.java 2KB
RedisConfig.java 2KB
LoginUser.java 2KB
MenuMapper.java 2KB
AuthenticationEntryPointImpl.java 2KB
ResourceMapper.java 2KB
LogoutSuccessHandlerImpl.java 2KB
SecurityConfig.java 2KB
JacksonConfig.java 2KB
BaseEntity.java 2KB
DefaultSessionAuthenticationFilter.java 2KB
FileStorageService.java 2KB
SpringContextUtils.java 2KB
RoleMapper.java 2KB
LocalBucketServiceImpl.java 2KB
LogController.java 2KB
Menu.java 2KB
CacheUtils.java 2KB
UserDTO.java 2KB
LogInterceptor.java 2KB
LogServiceImpl.java 2KB
共 332 条
- 1
- 2
- 3
- 4
资源评论
- Redice.2024-09-21感谢大佬分享的资源给了我灵感,果断支持!感谢分享~
程序员奇奇
- 粉丝: 3w+
- 资源: 297
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功