vfd-cloud——一個適合練習上手的雲存儲網盤springboot項目(開發中)


vfd-cloud

         

​ 一個基於SpringBoot的雲存儲網盤項目,適合練手學習SpringBoot,用到的技術棧列到了下面。支持用戶的注冊登陸及修改密碼,利用郵箱進行驗證。支持文件上傳下載以及分享和刪除。支持文件夾的創建分享及刪除。

  • 用戶的注冊登陸及修改密碼,采用郵箱進行驗證
  • 文件上傳下載以及分享和刪除
  • 文件的分類查找
  • 文件夾的創建分享及刪除
  • 用戶登錄時記住我功能,以及注銷功能
  • 文件分享后查看所有分享鏈接,以及鏈接的狀態,並可以隨時取消某個鏈接的分享或者全部取消

分享鏈接界面

預覽分享的文件

保存分享的文件

回收站界面

一、核心技術棧

后端

  • SpringBoot2
  • MyBatis
  • Redis
  • RabbitMQ
  • MySQL

前端

  • Html5+Css+JavaScript
  • JQuery
  • Bootstrap
  • Thymeleaf

二、項目計划

  • [x] 賬戶信息管理模塊
  • [x] 文件上傳下載刪除模塊
  • [x] 文件夾管理模塊
  • [x] 文件的加密解密處理模塊
  • [x] 文件分享模塊
  • [x] 回收站與文件恢復模塊
  • [ ] 管理員對用戶的管理模塊
  • [ ] 文件檢索模塊
  • [ ] 等等其他模塊(以后增加)

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!!!大家一起進步!后續會按照計划開發剩余模塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM