1. 程式人生 > >SSM專案實踐:實現簡易網盤系統(思路+參考原始碼)

SSM專案實踐:實現簡易網盤系統(思路+參考原始碼)

一、專案主要功能

1、類似於百度雲,使用者可以在網盤中新建多層資料夾,並可以上傳檔案、下載檔案、刪除檔案、刪除資料夾(裡面所有檔案也會隨之刪除)
2、提供檔案分類功能,可根據字尾名將檔案分成視訊、圖片、音樂等。
3、使用者可以分享檔案,分享的檔案可以在分享區中看到並下載。

結構:

這裡寫圖片描述

效果:

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

二、資料表設計

這裡採用MySQL資料庫
為了實現功能,我們需要三個資料表:記錄使用者資訊、資料夾資訊和檔案資訊的資料表
user_inf表
這裡寫圖片描述
其中,status用於記錄使用者是否為新註冊使用者

dir_inf表
這裡寫圖片描述
parent_dir用於記錄父資料夾id,如果該資料夾在根目錄則為null。
dir_user_id記錄該資料夾的上傳使用者,該列為外來鍵列,與user_inf的user_id列相關聯。
dir_path用於記錄資料夾絕對路徑,主要為了方便進行檔案下載。

file_inf表
這裡寫圖片描述
file_status記錄該檔案是否公開。
file_dir_id記錄該檔案的所屬資料夾id,該列為外來鍵列,與dir_inf表的dir_id列相關聯。
file_upload_user_id記錄該檔案上傳使用者id,為外來鍵列,與user_inf表的user_id列相關聯。

三、專案關鍵點分析:

1、類的設定

主要分為三個型別:控制器類,實體類和系統工具類

(1)控制器類

包含檢視控制器類(負責管理主要URL並返回WEB-INF中的JSP檢視檔案)、檔案管理器類(主要作用為對網盤資料的各種操作)、登入和註冊類(不再贅述)

(2)實體類

實體類對應上述三個表:User類、CloudFile類、Folder類,每個類應建立對應的Mapper介面和XML檔案。

(3)工具類

MyBatisUtil類:使用靜態初始化塊讀取mybatis-config.xml配置檔案,並提供一個返回SqlSessionFactory的靜態方法,避免每次需要呼叫資料庫時重複讀取xml配置檔案(也可採用Spring的單例模式)
其他工具類:記錄使用者檔案存放根目錄的字串,獲取系統時間的靜態方法、對包含特殊字元的SQL語句處理的靜態方法等等。

2、使用者註冊與登入

新使用者在註冊後,往user_inf表插入資料,並將status狀態設為新註冊狀態。第一次登入時伺服器在存放使用者檔案的目錄新建一個資料夾,並命名為該使用者的使用者名稱。登入時需將使用者物件存入session中。

3、使用者檔案存放路徑:

可以在Tomcat根目錄或者其他路徑新建一個資料夾命名為UserData,UserData中每個資料夾對應一個使用者,資料夾名為使用者的username,使用者自己新建的資料夾和上傳的檔案全部儲存在該資料夾中。

4、檔案管理JSP頁面:

在檢視控制器中,首先需要獲取session中的user物件,根據該user物件查找出根目錄的id,通過該id值查詢根目錄下的資料夾和檔案,封裝成List並存入request中,通過迴圈標籤體迴圈打印出表格,並且將下面所有的功能對應的URL引入到表格中,引數由EL表示式獲取。使用者進入一個子資料夾後需要記錄父資料夾id並存入request中,以便使用者可以退回上一級目錄。

5、使用者新建資料夾:

定義一個專門用來新建資料夾的URL,該URL需要兩個引數:資料夾名和父資料夾id,資料夾名由使用者自己填寫,父資料夾id由JSP頁面獲取request屬性並將其隱藏在表單中。前臺頁面及後臺需要檢查使用者是否輸入了資料夾名以及資料夾名是否合法。
後臺處理過程:
(1)根據父資料夾id在資料庫查詢對應的父資料夾資訊並封裝成物件。
(2)新建一個資料夾物件,設定該物件的父資料夾屬性、使用者屬性等
(3)獲取父資料夾物件中的絕對路徑屬性,通過File類的mkdirs()方法新建資料夾
(4)將新資料夾物件插入到資料庫中

6、上傳檔案(支援同時選擇多個檔案):

前臺JSP頁面建立一個表單,表單元素為檔案上傳框並支援多檔案選擇、父資料夾ID由JSP頁面獲取request屬性設定並隱藏在表單中。後臺採用MultipartFile[]來接收檔案。
後臺處理過程:
(1)檢查使用者是否選擇了檔案
(2)根據父資料夾id在資料庫查詢對應的父資料夾資訊並封裝成物件。
(3)遍歷MultipartFile[]陣列,新建一個檔案物件,通過MultipartFile介面提供的getOriginalFilename等方法設定該檔案物件屬性並插入到檔案資料表中
(4)通過父資料夾物件獲取絕對路徑,通過MultipartFile介面提供的transferTo方法在伺服器建立該檔案。
刪除檔案和上傳檔案類似,此處不再贅述

7、刪除資料夾

這個地方難點在於如果包含多層子資料夾和子檔案該如何刪除,我的思路是可以採用SQL的模糊查詢來完成:因為資料表中存有絕對路徑,所以在查詢一個資料夾中所有的子資料夾可以通過like ‘${path}%’來完成,然後通過查找出的子資料夾id查詢其中的檔案,刪除即可。對於實際儲存在伺服器上的資料夾而言,需要用到遞迴刪除,關於遞迴刪除可以參考這篇部落格:https://www.cnblogs.com/zhenyu-go/p/5554979.html
後臺只需接收一個引數:需要刪除的資料夾的id。
具體流程:
(1)根據目標資料夾id查詢並封裝成該資料夾物件
(2)先通過該資料夾id查找出該資料夾下的檔案並刪除(不包含子資料夾中的檔案)
(3)通過該資料夾的絕對路徑模糊查詢出所有子資料夾的List
(4)遍歷該list,一一根據該list元素中資料夾的id刪除資料夾和其中的檔案
(5)將目標資料夾刪除
(6)遞迴刪除實際資料夾(不能通過File類的delete直接刪除)

8、檔案分享和檔案分類

檔案分享:通過檔案id將status設為公開狀態,在檔案分享JSP頁面迴圈打印出所有檔案即可。這個地方比較簡單
檔案分類可通過檔案字尾名查找出來。

四、本示例參考原始碼:

程式碼寫得可能有些亂,敬請各位看官諒解,如果有更好的思路或建議歡迎留言。
如果需要執行的話可能裡面有很多配置要改,放出程式碼只是提供一個思路:
連結: https://pan.baidu.com/s/1RipG9h6YY4OxM5JIB_kr3w 密碼: t1gb