前言:

        本项目非原创,我也只是作为一名初学者跟着成熟的up主一起敲代码而已。视频来源于:

Springboot项目实战 easypan 仿百度网盘 计算机毕业设计 简历项目 项目经验(后端)_哔哩哔哩_bilibiliSpringboot项目实战 easypan 仿百度网盘 计算机毕业设计 简历项目 项目经验(后端)共计28条视频,包括:项目简介、项目架构、环境配置等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1qV4y1d7zY

在哔哩哔哩闲逛看到这个项目,感觉还不错,于是想要学习一下这个项目怎么写。项目日记也会同步更新。(本人不分享本项目源码,支持项目付费) 

本项目大量采用了先前项目中已经写好的代码,而且UP主讲的也很快。因此不适合新手作为自己的第一个项目。 

目录

前言:

今日完结任务:

1.完成管理员部分的全部接口 

2.完成外端分享接口

3.完成对回收站文件的优化:

总结:


今日完结任务:

1.完成管理员部分的全部接口 

这部分其实没什么可以讲的,全都是CURD。管理员的权限主要有以下:

  • 设置用户可使用空间大小。
  • 设置所有的用户状态
  • 查询所有的文件
  • 查询所有的用户
  • 删除指定用户的指定文件
  • 下载任意文件

在这里我就不写这部分的代码了。

2.完成外端分享接口

用户的外端分享其实和我们的用户下载接口的基本逻辑一样。但需要注意的是:这里的外端分享一共要实现三个大功能:

  • 允许所有用户直接通过分享链接进行下载
  • 允许非当前文件分享的所有用户保存当前文件到自己的云盘中

要实现以下功能,我们需要写的核心接口有:

1.创建分享文件接口:

这个接口的核心功能就是:当用户选择分享哪一个文件的时候,这个接口就需要快速的存储这些信息。

这就就是创建一个Fileshare类,用来存储当前用户分享的文件。这里的code就是校验码,是由前端自己进行生成的。

我们在接口层构建完这个类之后,就需要把这个类交给serve层进行插入,再插入之前,我们还要根据用户要求构造过期时间,之后再进行插入。

 当我们构造好待分享的文件之后,下一步就是构造分享链接

2.构造分享链接:

这里我们沿用之前文件下载的思路,还是构造一个code来存储文件id和文件名称。到时候按照用户的需求保存到云盘或者下载。所以这里其实调用的是我们之前写过的方法:

调用的createDownLoadUrl方法是我们之前写的,因此这里就不重复展示了。

当我们的构造分享链接构造好时候,我们从这个链接点击进去,应该是先让我们展示分享的文件基本信息校验验证码,我们来看一看前端界面

因此我们接下来一共要写两个接口:

3.根据shareid查询分享文件简要信息 

接口层:调用了内部方法:getshareInfoCommon方法。 

内部类方法:根据shareid读取关键信息。

4.校验验证码:

 这个逻辑也很简单,其实就是接收用户输入的code,将其与我们之前存储在fileshare表中的对应shareid的code进行比较就可以。

当校验验证码通过之后,说明用户目前操作合法,那么我们就给用户提供两个选择:

  • 保存文件到自己的云盘
  • 直接下载当前文件 

5.1 保存文件到自己的云盘 

其实就是查找文件,拷贝地址给当前用户。唯一比较烦的就是:如果有层级关系,要拷贝层级关系。

我们看一看serve层,整层逻辑分为三部分:

  • 保存文件到自己的云盘
  • 如果有命名冲突就重命名
  • 更新当前用户云盘空间

第一二部分: 

第三部分:

到这里其实整个外端分享接口就已经写完了。还有一些其他的接口我没有在这里面写,都是一些 检查性的接口。比如检查分享是否过期用户取消分享当前文件之类的接口,没有什么讲的价值。

3.完成对回收站文件的优化:

当文件进入回收站之后,每隔三分钟我们就会对回收站中的已经过期的文件进行一次删除。这里的逻辑也很简单,其实就是构造一个查询条件:查询出所有标记为“已回收”的文件。之后根据用户分类构造出一个Map。直接传入Mapper层做删除就可以

这里我们不要每检测到一个废弃文件就进行删除,而是进行批量删除。这样也是有一定的好处的。

  1. 性能优化: 批量删除可以减少数据库的交互次数,从而减少了系统开销,提高了删除操作的执行效率。这对于大量数据的删除操作尤其重要,可以显著减少删除操作的时间。

  2. 减少日志记录: 在数据库执行删除操作时,会生成相应的事务日志或者 redo 日志。批量删除可以减少生成的日志数量,降低了系统的存储压力,同时也减少了数据库的负载。

  3. 减少锁竞争: 在数据库中,执行删除操作时会对相应的记录进行加锁,防止其他事务对其进行修改。批量删除可以减少对表的锁定时间,减少了锁竞争,提高了数据库的并发性能。

  4. 事务控制: 批量删除可以更好地控制事务的边界,将多个删除操作组合在一个事务中执行,确保了数据的一致性和完整性。

所以在这个项目中,他对文件的删除只是从数据库层面进行删除,并没有从服务器上进行物理删除。

其实我们可以在文件数据库中新增一个引用计数器。每当有一个用户存储这个文件的时候,引用计数器就加1,用户删除这个文件的话,引用计数器就减一。

最后写一个定时任务检查数据库中引用计数器为0的文件 ,定期对这些文件进行删除就好了

总结:

        收获很多,写到这里其实这个项目就写完了。我后续会加深对这个项目的理解,把他作为我暑假找实习的时候的主力项目。后续我探究的点主要是:

分片上传下的进度丢失问题

用户下载限速问题

废弃文件删除优化问题

对大文件上传除过分片之外其他的策略

学的越多感觉自己知道的越少,这个项目真的很好,其中的各种代码设计思想也值得我学习,给罗老师点个赞。也推荐大家去哔哩哔哩看这位老师的课。


如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐