File Space——一個java structs2.0的小慄子(DIY)

来源:http://www.cnblogs.com/husky/archive/2017/01/22/6340318.html
-Advertisement-
Play Games

使用structs2開發的一個java項目小慄子,請勿用作不合適的地方!!! ...


1 概述

File Space系統適用於團體,主要提供的是團隊文件分享以及個人文件的存儲管理服務。分為個人文件存儲管理平臺和團隊文件共用平臺。

個人文件存儲平臺主要為個人提供相關的文件分類存儲服務:該部分在用戶登錄後,可以選擇添加新的文件,創建新的分類,修改原有的文件,查看相關的文件,以及對個人信息的管理等。

    團隊space主要是將個人部分添加的資料進行共用性的展示。

    個人用戶可以瀏覽團隊共用的內容,然後在已登錄的情況下,可以將瀏覽到的自己喜歡的資料添加到自己的收藏。

項目針對半封閉的團隊管理方式,因此用戶添加方式採用管理員添加方式。

詳細的系統功能請看下圖(圖1-1)所示:

 

圖:1-1

2 需求分析 

 

2.1 系統需求概述

 

當今的時代推崇共用,工作團隊中也需要共用。此系統為團隊提供文件方面共用,通過為用戶提供一個文件的存儲管理平臺,吸引用戶進行文件上傳,然後對上傳的文件進行共用。

 

2.2 用例分析

 

該系統包括普通用戶以及管理員兩種活動者,此外,可以有游客,但是游客只能查看共用的概要信息。系統中,管理員用戶是繼承自普通用戶,在普通用戶的基礎上多了對系統用戶的管理功能。普通用戶主要有系統的登陸登出,對於個人信息的管理,對於個人文件的管理,對於文件分類的管理以及對於收藏的管理,此外,下載文件功能單獨列出,是基於用戶既可以下載自己的文件,也可以下載共用區的文件。詳細的用例情況請參考(圖2-1)。

 

圖:2-1

 

3 系統設計

 

3.1 技術路線

 

整體使用基於Model-View-Controller MVC)模型的Struts2 web應用框架,使用JSP作為視圖顯示,實現前後端的分離,數據存儲採用JDBC進行持久化存儲。系統選用MYSQL資料庫來存儲數據,使用Tomcat7.0作為系統伺服器。在頁面表示方面綜合應用了HTML5標準,JQuery等增加頁面效果。此外,系統採用Tomcat自帶的Tomcat JDBC Pool 增加數據訪問的性能。

 

3.2 系統總體架構設計

 

總體基於MVC模式的B/S web系統,考慮擴展方便設計了4層架構:頁面表示層(JSP)、請求處理轉發層(Action)、業務邏輯層(Service)和持久化存儲層(DAO)。

下圖(圖:3-1)是大部分B/S系統的架構圖。

 

圖:3-1

3.3 資料庫設計

資料庫根據系統的需要設計了用戶表、文件表、文件類型表、收藏表,各個表中標示了實體的基本的必要屬性,圖中連線標示外鍵關係。用戶與文件、文件類型、收藏都是1對多的關係,文件與收藏也是1對多的關係,同一個文件可以被不同的用戶進行收藏,但每個用戶只能單獨收藏。此外,文件表與類型表是多對1的關係。圖3-2中的連線標示外鍵關係。

 

圖:3-2

 

3.4 系統詳細設計 

 

A.頁面佈局結構如下圖3-3:

 

圖:3-3

B.單頁面內的操作採用調用Jquery方法,傳遞JSON數據的方式進行局部刷新。

C.進入首頁需要執行action獲取相關的文件數據,採用先進入一個頁面,在該頁面直接進行調用的方式實現。

D.密碼使用MD5進行加密

E.使用攔截器在執行相關Action前進行登錄狀態的攔截。

F.使用資料庫連接池提高系統性能。

G.使用存儲過程,封裝資料庫操作。

H.使用Log4j記錄DAO層的操作以及出錯處理。

I.具體的Action方法實現邏輯參考功能實現。

 

 

4 系統實現

 

4.1 分頁功能的實現

分頁功能針對系統中顯示的數據的數據非常多的時候採用的技術,目的是為了讓系統按照頁碼展示相對應的數據記錄,減少數據傳遞的數量,增加頁面訪問速度,提高用戶體驗。

分頁實現採用定義分頁類(圖:4-1),然後需要使用分頁的方法填寫分頁類的屬性值,完成分頁。

 

 

 

圖:4-1 圖:4-2

 

分頁類定義了5個屬性:當前頁(currPage)、每一頁顯示的記錄數目(ItemOfPage)、

總共的記錄條數(totalItem)、總共的頁數(totalPage)、對應頁面的記錄集合(items)。

其中當前頁需要傳遞的前臺數據,如果前臺沒有傳遞當前需要獲取的是第幾頁則預設為第一頁;每一頁顯示的記錄數目採用的預設顯示10條的方式,用戶無法修改;總共的記錄條數需要讀取資料庫中的數目,採用分頁的需要首先在DAO層定義讀取資料庫所有數據數目的方法,然後在service層進行調用,然後填寫到Pager對象中;總共的頁數需要通過總共的記錄條數以及每頁顯示的條數進行計算,然後將結果填入;最後根據該Pager對象的屬性獲取相應的資料庫記錄填寫到Items列表中,傳遞到前臺進行顯示。

計算總共頁數的方法:

totalItem%pager.getItemOfPage()==0?(totalItem/pager.getItemOfPage()):(totalItem/pager.getItemOfPage()+1)

 

4.2 日誌功能的實現

日誌採用Log4j的方式,首先導入如圖(圖4-2)的日誌包,然後配置log4j.properties文件(圖4-3)。然後在需要添加日誌的頁面通過log4j包中的方法獲取日誌對象,填寫相應的日誌信息。

private static Logger logger = Logger.getLogger(UserDaoImpl.class);

 

 

圖:4-3

4.3 MD5加密(密碼)的實現

首先定義加密類MD5以及加密的靜態方法toMD5(),然後在需要加密的地方通過MD5調用靜態方法進行加密。

toMD5()方法採用網上的博客教程,實現如下:

 1 public final static String toMD5(String s) {
 2 
 3 char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};       
 4 
 5 try {
 6 
 7     byte[] btInput = s.getBytes();
 8 
 9     // 獲得MD5摘要演算法的 MessageDigest 對象
10 
11     MessageDigest mdInst = MessageDigest.getInstance("MD5");
12 
13     // 使用指定的位元組更新摘要
14 
15     mdInst.update(btInput);
16 
17     // 獲得密文
18 
19     byte[] md = mdInst.digest();
20 
21     // 把密文轉換成十六進位的字元串形式
22 
23     int j = md.length;
24 
25     char str[] = new char[j * 2];
26 
27     int k = 0;
28 
29     for (int i = 0; i < j; i++) {
30 
31         byte byte0 = md[i];
32 
33         str[k++] = hexDigits[byte0 >>> 4 & 0xf];
34 
35         str[k++] = hexDigits[byte0 & 0xf];
36 
37     }
38 
39     return new String(str);
40 
41 } catch (Exception e) {
42 
43     e.printStackTrace();
44 
45     return null;
46 
47 }
48 
49 }
View Code

4.4 登錄許可權控制的實現

系統的許可權控制是通過攔截器實現。

首先定義該攔截器,在執行相關的Action前進行攔截,該攔截器的實現通過繼承

MethodFilterInterceptor並重寫doIntercept方法實現。

關鍵代碼如下:

 1 HttpServletRequest request = ServletActionContext.getRequest();
 2 
 3 User user = (User) request.getSession(false).getAttribute("user");
 4 
 5 if(user == null){
 6 
 7 //logger.info("用戶沒有登錄!");
 8 
 9 return "re";
10 
11 } else {
12 
13 //logger.info("用戶登錄成功!");
14 
15 return invoker.invoke();
16 
17 }
View Code

 

4.5 資料庫連接池的實現

資料庫連接池能夠有效的提高訪問資料庫的速度,因此採用。

該項目使用Tomcat7.0 自帶的Tomcat JDBC Pool,通過在項目中添加context.xml中配置數據源,然後通過獲取context中的數據源獲取資料庫的連接。

 

4.6 文件上傳功能的實現

文件上傳前臺使用類型為fileinput,因為中文文件名在下載時出現問題,難以傳輸,因此在這裡限制上傳的文件名必須是英文名。

後臺上傳實現直接就通過

ServletActionContext.getServletContext().getRealPath("/upload");

獲取文件上傳的地址(項目下麵的upload文件夾),然後將文件通過文件的輸入輸出流寫入到伺服器。

最後將文件的相關的存儲信息寫入到資料庫,以便下載。

 

4.7 文件下載功能的實現

首先根據前臺傳遞過來的文件的id值,獲取該文件的相關信息,然後定義一個文件輸出流以及相關的gettersetter方法,確定fileName以及contentType,最後配置輸出的result

<result name="download" type="stream">

<param name="inputName">fileDown</param>

<param name="contentDisposition">attachment;filename="${fileFileName}"</param>

<param name="contentType">fileContentType;charset=utf-8</param>

</result>

 

4.8 查看文件列表功能的實現

文件列表分為區分用戶與不區分用戶的列表兩種,分別對應首頁的共用的文件展示與個人文件的展示,首頁的文件展示因為文件數量巨大,因此採用的是分頁的方式進行展示,個人文件裡面的文件列表因為每一次展示都需要涉及文件的分類,因此數量不是很大,沒有採用分頁。

首頁文件的共用展示,採用的分頁方式過程請參考分頁的實現 

個人文件的展示通過session裡面的用戶對象以及前臺傳過來的文件類型的id值獲取相關的文件對象列表進行實現。

 

4.9 資料庫設計(用戶區分,文件級聯刪除,存儲過程)

資料庫的具體設計見系統設計中的資料庫設計

用戶區分採用的是在用戶的屬性中添加判斷該用戶是否是管理員的欄位,根據該欄位的值進行判斷該用戶是管理員還是普通用戶。

文件刪除功能,項目中沒有提供單個文件的刪除功能。

在用戶刪除某個文件類型的時候,根據外鍵關係,級聯刪除這些文件信息,在管理員刪除該用戶時,該用戶下麵的文件也會被刪除。

 

項目的數據訪問都採用的是存儲過程。

採用Navicat直接在資料庫定義存儲過程,然後在DAO層中通過

prepareCall(“call XXX”);調用該存儲過程獲得數據。

 

4.10 麵包屑導航功能的實現

麵包屑導航的作用是告訴訪問者他們目前在網站中的位置以及如何返回,當網站中出現典型的單線3層以上的層次使用麵包屑導航可以有效的提高用戶的體驗。

本次項目中因為要實現文件分類的無限級別的分類,因此採用麵包屑導航。

項目中的頁面部分展示通過後臺傳遞的Map集合直接讀取顯示。

Map裡面存放的當前分類的所有的父類的id值(鍵)以及對應的類別名稱(值)。

因為考慮到需要按照一定的順序存放,Map採用的是LinkedHashMap

Map裡面鍵的集合裡面的值通過資料庫裡面定義的函數實現。

該函數通過傳遞的當前的類別的id值獲取該類別的所有的父類並且按照一定的順序,形成字元串輸出。

該函數如下:

 1 BEGIN
 2 
 3 DECLARE sParentList varchar(1000);
 4 
 5 DECLARE sParentTemp varchar(1000);
 6 
 7 SET sParentTemp =cast(rootId as CHAR);
 8 
 9 WHILE sParentTemp is not null DO
10 
11 IF (sParentList is not null) THEN
12 
13 SET sParentList = concat(sParentTemp,',',sParentList);
14 
15 ELSE
16 
17 SET sParentList = concat(sParentTemp);
18 
19 END IF;
20 
21 SELECT group_concat(parentid) INTO sParentTemp FROM tab_type where FIND_IN_SET(tid,sParentTemp)>0;
22 
23   END WHILE;
24 
25   RETURN sParentList;
26 
27 END
View Code

 

源碼地址:https://github.com/husky00/Java/tree/master/Java/FileSpace01

sql地址:http://files.cnblogs.com/files/husky/FileSpace.zip  用的mysql 資料庫,sql 使用navicat自動導出的!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 其實你已經知道了小程式的文件結構 上一節講到,小程式的頁面由三部分組成: 視圖(.wxml)、邏輯(.js)、樣式(.wxss)。 我們這次重新展開文件結構: 小程式用到的文件類型只有四種,正如你所看到的那樣。 可是我還是要展開說一下,但這裡就不做很細的分析了,直接說出結論: 根目錄的app.js、 ...
  • 16年年初跳槽到了一家做安全相關的公司,自從入職以來,就是解決各種難以想象難題,再也不能和小伙伴請教了,因為他們也覺得不可能嘛,每天都是沉浸在研究摸索和不確定中,最讓人難以接受的是研究了好幾天還是沒有結果,最快樂的是解決了一個小問題,總之2016就是個五味雜陳的一年。 剛來到這個公司是各種的問題擺在 ...
  • mybatis interceptor 處理查詢參數及查詢結果 ...
  • mysql執行sql可以通過設置mysql bin 日誌進行記錄查看,mysql bin日誌配置如下: log_bin:on log_bin_basename:bin文件路徑及名首碼(/var/log/mysql/mysql-bin) log_bin_index:bin文件index(/var/lo ...
  • 最近在看《Microsoft SQL Server2005技術內幕:T-SQL程式設計》 1、表變數的事務上下文中提到,表變數不受外部事務回滾影響。 舉個例子: DECLARE @TA TABLE(col INT);INSERT @TA VALUES(0);SELECT * FROM @TA;BEG ...
  • 首先明確PL/SQL主要作用作用: SQL語言適合管理關係型資料庫但是它無法滿足更複雜的數據處理,所以產生PLSQL。PLSQL用戶創建存儲過程、函數、觸發器、包及用戶自定義的函數。 特點: PLSQL具有高級語言所擁有的編程結構,使用PLSQL可以極大的提高資料庫編程的靈活性,PLSQL不是獨立存 ...
  • 一、MySQL的存儲引擎 完整的引擎說明還是看官方文檔:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 這裡介紹一些主要的引擎 1、InnoDB存儲引擎 InnoDB是MySQL的預設事務型引擎,它被設計用來處理大量的短期(sh ...
  • 本文地址 分享提綱: 1. 事情的背景 2. 解決辦法 3. 總結 1. 事情的背景 現在需要將2000條數據的name,從user表中查詢出來結果,sql 這樣寫 但是出來的查詢結果只有 1997條,說明有3條沒有結果,也有可能是有重覆的name,怎麼查詢出來是哪3個數據沒有結果或者是重覆的數據呢 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...