vfd-cloud
一个基于SpringBoot的云存储网盘项目,适合练手学习SpringBoot,用到的技术栈列到了下面。支持用户的注册登陆及修改密码,利用邮箱进行验证。支持文件上传下载以及分享和删除。支持文件夹的创建分享及删除。
- 用户的注册登陆及修改密码,采用邮箱进行验证
- 文件上传下载以及分享和删除
- 文件的分类查找
- 文件夹的创建分享及删除
- 用户登录时记住我功能,以及注销功能
- 文件分享后查看所有分享链接,以及链接的状态,并可以随时取消某个链接的分享或者全部取消
分享链接界面
预览分享的文件
保存分享的文件
回收站界面
一、核心技术栈
后端
- SpringBoot2
- MyBatis
- Redis
- RabbitMQ
- MySQL
前端
- Html5+Css+JavaScript
- JQuery
- Bootstrap
- Thymeleaf
二、项目计划
- 账户信息管理模块
- 文件上传下载删除模块
- 文件夹管理模块
- 文件的加密解密处理模块
- 文件分享模块
- 回收站与文件恢复模块
- 管理员对用户的管理模块
- 文件检索模块
- 等等其他模块(以后增加)
1. 账户信息管理模块
mysql> desc user_login;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| email | varchar(50) | NO | UNI | NULL | |
| password | varchar(50) | NO | | NULL | |
| name | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
用户账户的注册、登陆以及修改密码采用邮箱验证,注册过程中向邮箱发送验证码,并将验证码存入redis,设置一定时间的有效期,在有效期内注册即视为注册成功。修改密码过程中,将一段用作验证的UUID存入redis,设置有效期,向邮箱发送一个修改密码的链接,验证如果链接中的UUID有效且匹配该邮箱则提供修改密码的接口。
使用消息队列来做异步提高效率。注册和修改密码过程中都涉及了两个过程:将验证信息存入redis、给用户邮箱发送邮件。将这个两个任务交给消息队列做异步,然后给用户返回信息。
2. 文件上传下载删除模块
mysql> desc file;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| len | int(11) | NO | | NULL | |
| pid | int(11) | NO | PRI | NULL | |
| location | varchar(50) | NO | | NULL | |
| type | int(11) | NO | | NULL | |
| time | datetime | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
文件的管理使用mysql来存储信息,后面计划加入非关系型数据库来存储某些信息。每个文件都有一个id的属性,表示它的父目录的id,这样就类似一个链表,给出一个目录的id,就可以通过select * from file where fid = ${id}
获取到此文件夹下的所有文件目录。另外文件的数据表中还有文件id、名字、大小、上传时间、存放地址等等信息。
上传文件的时候用ajax发起异步请求,使用回调函数可以获取到上传的字节数和总字节数,这样就可以监控上传的进度。文件上传结束后只需要异步刷新当前文件夹的内容就可以实时呈现出效果。
下载文件的时候通过设置响应头中添加Content-Lenght
,就可以下载的时候让浏览器获取到文件下载的进度。
删除文件的时候为了保证效率,即不让用户等待太久,只要数据库中删除记录就返回删除成功。然后用异步任务去真正删除磁盘上的文件,这样用户可以保证很快得到反馈。另外设置定时任务定时检查数据库和磁盘中文件的对应,如果有孤立的文件(即数据库中没有记录的文件)就将其删除。
3. 文件夹管理模块
用类似链表的结果表示文件和文件夹的所属关系,每个文件都有一个父目录id的属性,表示的是它所在文件夹的id,这样就可以通过一个文件夹的id找到它目录之下所有的文件和文件夹。
对于新建文件夹的逻辑和上传文件类似,不过少了文件传输的过程,只需要在数据库中添加相应的记录即可。
删除文件夹的时候要注意递归删除这个文件夹下的所有内容,当用户发起删除请求时,在数据库中删除此文件夹的记录。而它的子目录子文件都有异步任务完成,这样可以保证效率,而同时为了正确性,可以添加定时任务,去定时检查数据库和磁盘的对应关系,以及是否有孤立的目录(孤立目录是指找不到父目录的文件或者文件夹),如果有就将其删除。
4. 文件加密模块
采用国密sm4算法进行对文件的加解密处理,上传文件时将文件上传到服务器以密文形式存储起来,就可以不用担心文件内容泄漏问题。而下载的时候需要将文件的明文形式下载回本地,将文件解密到一个临时生成的文件夹,将解密后的文件存储在其中,当下载完成的时候在将解密后的密文用异步任务删除即可。
5. 文件分享模块
分享文件时候生成一段随机的UUID
,根据设置的分享的有限期,将此随机的UUID
存入redis中,并设置好过期时间,用useraccount:share:UUID
作为key,将分享文件的信息以及其子文件的信息作为value,以json的形式存入redis中,当有人要获取分享的文件时就根据json拿到所有需要获取的文件信息,只需要在数据库添加相应记录就可以,对于存在的路径问题,提供了重命名
和覆盖
两种选择。
6、回收站模块
可以将文件先暂时存入回收站中(并不是真正的删除),这个功能的实现思路和分享文件有些类似,也是将要加入回收站的文件的信息从mysql
数据库中删除,但并不真正删除磁盘上的文件,然后将此信息存入到redis
中并设置过期时间,这样就可以在有效期内根据redis
中的信息将其又恢复到mysql
中。可以在默认的有限期内将其恢复回原来的位置,但是这其中也存在了路径冲突的问题,给出了重命名
和覆盖
两种选择。
7. 文件检索模块
计划给文件添加tag,然后根据tag、文件名等等信息进行检索
三、写在最后
项目只完成了初步的基本功能,欢迎大家访问项目仓库,如果喜欢,希望能点一个star!!!大家一起进步!后续会按照计划开发剩余模块。