基于java的论坛管理系统设计(含源文件)
歡迎添加微信互相交流學習哦!
項目源碼:https://gitee.com/oklongmm/biye
摘 要:當今社會正處在網絡時代,信息化大潮席卷全球,網絡正以前所未有的速度在我國普及開來。論壇以其獨特的優勢在信息化的過程中占有重要的一席。論壇的存在使得地球村的概念離我們越來越近,使得人與人之間的溝通、交流變得格外的容易。特別是在IT領域,只有有了很好的交流,技術才會得到進步。因此,掌握如何設計并開發一個論壇也顯得格外的重要而且意義深遠。
論壇采用B/S體系結構,其功能是讓用戶自由地發表自己的帖子和回復其他用戶的帖子。論壇包括用戶模塊、帖子模塊、后臺管理模塊。論壇在Struts+Hibernate+Spring框架的基礎上,用JSP語言進行開發,使用的數據庫是MySQL,開發工具為MyEclipse10。本論壇界面簡潔,具有可擴展性和可維護性。
關鍵詞:BBS,S.S.H(Struts,Hibernate,Spring),JAVA,MySQL,JSP
?
Design and implementation of BBS based on SSH framework
Abstract:Society nowadays just be placed in the network for ages, the information-based big tide rolls up the word, the network is making widely available to open in the our country with the unprecedented speed. Forum with its unique advantages in the process of information occupies the important a seats. Forum makes the existence of the concept of global village closer and closer, making communication between people, communication becomes particularly easy. Especially in the IT field, only a very good exchange, technology will be progress. Therefore, mastering how to design and develop a forum is particularly important, and far-reaching.
This forum uses the B/S system structure, its function is to let users to freely express own posts and respond to other users posts. The forum includes user module, the posts module, background management module. The forum is a based on Struts, Hibernate and Spring, develops with JSP, the use of the database is MySQL, development tools for MyEclipse10. This forum interface is simple and it has scalability and maintainability.
Keywords:BBS, SSH(Struts , Hibernate ,Spring) , JAVA , SQL ,JSP
?
目 ?錄
摘 要?? ?I
Abstract?? ?II
第 1 章 緒論?? ?1
1.1研究背景?? ?1
1.2研究目的?? ?1
1.3研究方法?? ?2
第 2 章 系統分析?? ?3
2.1技術分析?? ?3
2.1.1 開發語言綜述?? ?3
2.1.2 S.S.H框架的優點?? ?3
2.1.3 系統層次設計?? ?5
2.2需求分析?? ?6
2.2.1功能需求?? ?6
2.2.2性能需求?? ?7
2.2.3系統開發運行環境?? ?7
第 3 章 系統設計?? ?8
3.1 概要設計?? ?8
3.1.1功能模塊設計?? ?8
3.1.2系統界面設計?? ?9
3.2 數據庫設計?? ?10
3.2.1概念模型設計(E-R圖)?? ?10
3.2.2數據庫表及關系建立?? ?11
3.2.3詳細數據庫結構設計?? ?11
第 4 章 系統實現?? ?15
4.1 系統框架實現?? ?15
4.1.1底層數據庫的建立?? ?15
4.1.2持久化層的建立(Hibernate)?? ?16
4.1.3業務邏輯層的建立?? ?16
4.1.4表示層的建立?? ?16
4.2 系統功能模塊實現?? ?17
4.2.1用戶模塊實現?? ?17
4.2.2帖子模塊實現?? ?21
4.2.3后臺管理模塊實現?? ?23
第 5 章 系統測試?? ?24
5.1 測試概述?? ?24
5.1.1軟件測試的目的?? ?24
5.1.2軟件測試的任務?? ?24
5.1.3測試環境?? ?24
5.2 單元測試?? ?25
5.3 集成測試?? ?26
5.4 功能測試?? ?26
第 6 章 總結?? ?28
參考文獻?? ?29
致 ?謝?? ?30
?
第 1 章 緒論
1.1研究背景
1978年在美國芝加哥開發出一套基于8080芯片的CBBS/Chicago (Computerized Bulletin Board System/Chicago),此乃最早的一套BBS系統。之后隨著蘋果機的問世,開發出基于蘋果機的Bulletin Board System和大眾信息系統Peoples Message System兩種BBS系統。1981年IBM個人計算機誕生時,并沒有自己的BBS系統。直到1982年,Buss Lane 才用Basic語言為IBM個人計算機編寫了一個原型程序。其后經過幾番增修,終于在1983年通過Capital PC User Group的Communication Special Interest Group會員的努力,改寫出了個人計算機系統的BBS。經Thomas Mach整理后,終于完成了個人計算機的第1版BBS系統——RBBS-PC。這套BBS系統的最大特色是其源程序全部公開,有利于日后的修改和維護,因此后來在開發其他的BBS系統時都以此為框架,所以RBBS-PC贏得了BBS鼻祖的美稱。
大約是從1991年開始,國內開始了第一個BBS論壇。經過長時間的發展,直到1995年,隨著計算機及其外設的大幅降價,BBS論壇才逐漸被人們所認識。1996年更是以驚人的速度發展起來。國內的BBS論壇,大多數還是大型綜合性BBS論壇。隨著計算機的普及,特別是寬帶的普及,BBS的活動將會進一步高漲。但是,隨之而來對專注于領域方面的BBS將會慢慢增加需求。盡管BBS論壇的數量在不斷增長,但BBS的發展過程,也出現了一些問題。由于國內使用的BBS架站軟件,都是從國外引進的,因此沒有必要的中文說明。雖然一些熱心的站長翻譯了一些資料,但是僅靠這些是遠遠不夠的。而國內自己開發的BBS基本上都是處于最原始的JSP MODEL1模式,這種模式是控制層與表示層合二為一,雖然開發簡單,但是擁有很差的擴展性,可維護性,這樣極大地限制了BBS站點的擴展。于是在這種情況下,本文提出了基于MVC模式的SSH框架的BBS論壇。本論壇的優點在于它具有強大的可擴展性和可維護性,適合網民創建自己的中小型BBS論壇。
1.2研究目的
進入二十一世紀,計算機技術迅速向著網絡化、集成化方向發展。傳統的單機版應用軟件正在逐漸退出舞臺,取而代之的是支持網絡、支持多種數據信息(多媒體)的新一代網絡版應用軟件,而目前網絡版軟件中似乎存在著兩種不同的趨勢,一種是稱為客戶端——服務器的C/S結構,這類軟件具有結構嚴謹,運行效率高,服務器端壓力小,安全性好等優點,被廣泛運用于局域網中。而另一種,也是本畢業設計所采用的,是稱為瀏覽器——服務器的B/S結構,它的特點是在客戶端直接采用了功能強大的瀏覽器軟件作為界面,其優點在于軟件開發效率高,客戶端不受操作平臺的限制、也不受地域的限制,網絡傳輸量少,既適用于局域網,又適用于Internet,而且投資小、見效快,用戶可以不必進行服務器方面的投資,而是去租用,甚至是免費使用ISP的服務器資源,因而受到越來越多中小型單位的青睞。
隨著Internet技術的不斷發展,以及用戶群爆炸性地增長,網絡不再僅僅是信息的被動獲取來源,更成為人們探討問題、交換觀點的場所,其中,網上論壇扮演了極其重要的角色,隨著時間的推移,論壇站點中積存了豐富的信息資源,不但有各類技術資料和新聞文檔,還包含著用戶的判斷和評論,論壇站點己成為Web信息庫的重要組成部分,自網上論壇誕生20多年以來,隨著Web技術的發展,己經由原來簡單的電子公告板系統發展為功能豐富的網上論壇和虛擬社區模式。各種論壇隨著網絡迅速發展,幾乎充實著生活工作的每一個方面,無論是商界、政界,還是娛樂界,都有各種論壇。互聯網正在融入我們的生活,網絡提供給我們的不只是一個獲取信息的來源,而且還是一個可以相互交流的空間,網上論壇正是一種供人們進行交流的網絡空間, 影響和改變著我們的生活。為了方便信息交流,在結合java和ssh技術之下開發了這個快捷、界面友好的交流系統,實現了一個功能相對齊全的論壇系統,網友可以自由地提出問題以及幫助他人解決問題,或者交流經驗。
1.3研究方法
論壇在Struts+Spring+Hibernate 擴展Structs框架的基礎上,用今天主流的網站開發技術jsp語言進行開發。論壇將采用B/S體系結構,人們通過瀏覽器就可以訪問網站的主頁。在這論壇可以自由地發表自己的觀點和對論壇主題發表意見,我們還可以對網友的問題進行及時的解決,獲取對自己有用的知識。本網站按照軟件項目開發的流程進行開發,對于網站開發的可行性分析、需求分析、概要設計、詳細設計以及對網站的測試與維護都有詳細的論述和實現過程。
?
第 2 章 系統分析
2.1技術分析
2.1.1 開發語言綜述
本系統是基于面向對象思想的JAVA語言中J2EE平臺進行編寫,J2EE平臺具有以下優點。
1.簡化結構:J2EE平臺支持簡化的、基于組件開發模型,遵循J2EE標準的所有服務器都支持該模型。J2EE標準還允許客戶訂購與J2EE兼容的第三方的現成組件,把其部署到異構環境中,節省了由自己制訂整個方案所需的費用。
2. 提高開發效率:由于組件技術的使用,可以按照開發人員的技能對應用程序開發進行分工,并行開發,提供整體開發效率。例如:圖形設計師創建JSP模板,商業邏輯由該領域的專家完成,JSP頁面由Java工程師完成,應用程序的裝配和部署由團隊中其他的成員完成,其中許多工作可以同時進行,有助于加速應用程序的開發。
3.易于維護:基于組件的設計簡化了應用程序的維護。由于組件可以被獨立地更新和替代,通過更新應用程序中特定的組件,新的功能可以被很容易地增加。
4.可伸縮性:基于J2EE平臺的應用程序可被部署到各種操作系統上,例如,可被部署到高端UNIX或其他的大型機系統上。J2EE領域的供應商提供了更為廣泛的負載平衡策略,能消除系統中的瓶頸,允許多臺服務器集成部署,實現可高度伸縮的系統,滿足未來商業應用的需要。
2.1.2 S.S.H框架的優點
S.S.H框架是J2EE應用中Struts+Spring+Hibernate三大免費開源框架的結合使用, 它可以看成工具,也是中間件。它是用來提高我們的開發效率,提高我們軟件產品的可維護性、可擴展性乃至敏捷性的。它有很多優秀的設計理念及模式應用。比如,Struts屬于MVC框架,關鍵是要了解MVC的概念及大致原理;Hibernate屬于ORM系統,屬于持久層的解決方案,同樣需要對ORM的概念及原理有一個總體的了解;Spring屬于應用程序框架,其核心是IOC容器以及AOP,Spring中還集成了很多適用東西,比如對JDBC的封裝、自己的MVC、對動態語言的簡潔訪問等。
S.S.H由以下3個框架構成:
1.Struts框架
Struts 是Apache軟件基金會(ASF)贊助的一個開源項目。它通過采用Servlet/JSP技術,實現了基于Java EE Web應用的MVC設計模式的應用框架,是MVC經典設計模式中的一個經典產品。其基本構成如圖2.1所示。
?
圖2.1 Struts框架工作流程
2.Spring框架
Spring是一個開源框架,Spring 是于2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring框架由以下7個部分組成。
?
圖2.2 Spring框架構成
3.Hibernate框架
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲地使用面向對象編程思想來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。
?
圖2.3 Hibernate框架
2.1.3 系統層次設計
系統根據S.S.H框架的特點,決定使用四層結構,這樣做的優點是
1、可以分層開發,訪問數據庫與業務邏輯實現能夠分開。
2、提高代碼的復用
表示層
業務邏輯層
持久化層
數據庫層
圖2.4 BBS系統的分層結構
?
2.2需求分析
2.2.1功能需求
對于訪問論壇的用戶,可分為注冊會員和普通用戶,這兩種用戶有著不同的權限,比如普通用戶只能發普通帖,回帖,而注冊會員除此之外,還可以發含有圖片,附件的帖,并且可以對自己的注冊資料進行修改等等。
以下為用戶角色劃分:
1.普通用戶(游客):普通用戶以游客身份登錄本系統,只具有發普通帖,回帖的功能。
2.注冊用戶:具備普通用戶所有的能力。并且注冊用戶可以發含有圖片、附件的帖,可以登錄,修改個人信息。
3.管理員:登錄以后可以對論壇系統進行管理,包括用戶管理、帖子管理、論壇信息管理。
本系統是一套網上交流的BBS軟件,根據用戶的需要和實際的管理條件,應由用戶功能模塊,帖子功能模塊和后臺管理模塊等幾個模塊所構成,用戶可以對一些數據進行查找和修改,并且注冊的用戶可以對帖子進行特定的操作,而管理員可以對用戶和帖子進行相關的管理。
鑒于本系統的性質,系統應該實現以下功能。
1.?? ?用戶功能模塊
1)用戶的登錄:用戶輸入登錄信息,如用戶名、密碼,以注冊會員的身份進入論壇;
2)用戶的注冊:主要是指除管理員以外的用戶角色(一般為游客),在網上在線填寫一些會員的注冊信息。注冊后即可成為論壇的注冊會員;
3)用戶資料的修改:注冊會員登錄成功后,可以修改自己的注冊信息,如密碼或者其它的內容等。
2.?? ?帖子功能模塊
1)帖子的發表:游客或者登陸成功的注冊用戶可以選擇自己感興趣的版塊,發表自己的帖子;
2)帖子的回復:游客或者登陸成功的注冊用戶可以查看感興趣的帖子并且進行回復。
3.?? ?后臺管理模塊
3)用戶的管理:管理員登錄成功后,可以查看論壇的所有注冊用戶的信息并且進行必要的修改;
4)帖子的管理:管理員登錄成功后,可以查看論壇的所有版塊的所有帖子并且進行必要的管理,如刪除帖子、帖子加精、帖子置頂;
5)論壇信息的管理:管理員登錄成功后,可以查看論壇所有信息,并且可對論壇基本信息,如公告,版塊等進行管理。
2.2.2性能需求
1.?? ?響應時間:50個用戶同時在線時響應時間不超過3秒。
2.?? ?易用性:符合一般人的操作習慣,出現問題時,能夠提示。
3.?? ?可修改性:能夠根據需求,增加或減少模塊。
2.2.3系統開發運行環境
開發環境: Windows 7 ?Tomcat7.0 ?JDK1.6
硬件實現: CoreP7350@2.0GHz ?4G內存 80G硬盤
開發語言: ?Java
數 據 庫: ?MySQL5.5
開發工具: ?MyEclipse10?
預期成果: 一個可擴展的基于MVC模式的 BBS論壇
?
第 3 章 系統設計
3.1 概要設計
根據需求分析的結果,對系統進行詳細的概要設計。
3.1.1功能模塊設計
繪制出的用例圖,將本系統分為三個大的模塊,它們分別是會員資料模塊,帖子資料模塊和后臺管理模塊。本系統的功能層次圖如圖3.1所示。
圖3.1系統功能層次圖
如圖3.1,BBS系統實現了如下的功能。
1.用戶模塊:此模塊用來實現用戶的登陸注冊和會員資料的修改。
1).用戶登陸模塊:用戶可以通過此模塊對論壇進行登陸,登陸后便可以使用所有的會員功能,比如上傳圖片和附件等等。
2).用戶注冊模塊:沒有帳號的用戶,可以通過此模塊添加用戶信息,添加成功后便可登陸論壇,使用會員功能。
3).資料修改模塊:已注冊的用戶在登陸后,可以通過此模塊,對會員的基本資料,聯系方式,密碼,頭像等資料進行修改。
2.帖子模塊:
1).發表帖子模塊:用戶可以在相應的版區中,發表自己的主題,發表成功后,其他用戶便可以在相應的版區中看到這篇帖子,并可以對其進行回復等操作。
2).回復帖子模塊:用戶在發表完主題后,用戶便可查看相關內容,并可以對已發表的帖子進行回復。
3.后臺管理:
1).帖子管理模塊:帖子管理模塊是管理員對帖子管理的平臺,如果管理員查看到帖子有不適宜發表的內容時,可以對帖子選擇刪除或者鎖定等操作,如果看到優秀的帖子,還可以將帖子進行置頂,加精。
圖3.2帖子管理模塊功能層次圖
2).用戶管理模塊:管理員可以通過此模塊,對用戶進行管理,對一些不法的用戶可以修改或者刪除資料。
3).論壇管理模塊:管理員對論壇的添加,創建,刪除等功能都是在此模塊里進行處理。
3.1.2系統界面設計
對于系統來說,用戶界面設計將非常重要,因為一個交互良好的界面能夠加深瀏覽者的印象。設計的實現可以分為兩個部分。第一部分為站點的規劃及草圖的繪制,這一部分可以在紙上完成。第二部分為網頁的制作,這一過程是在計算機上完成的。
設計首頁的第一步是設計版面布局。我們可以將網頁看作傳統的報刊雜志來編輯,這里面有文字、圖像乃至動畫,我們要做的工作就是以最適合的方式將圖片和文字排放在頁面的不同位置。 除了要有一臺配置不錯的計算機外,軟件也是必需的。不能簡單地說一個軟件的好壞,只要是設計者使用起來覺得方便而且能得心應手的,就可以稱為好軟件。當然,它應該能滿足設計者的要求。常用的軟件是Macromedia的Dreamweaver以及Adobe的Photoshop。
設計是有原則的,無論使用何種手法對畫面中的元素進行組合,都一定要遵循五個大的原則:統一、連貫、分割、對比及和諧。
統一是指設計作品的整體性,一致性。設計作品的整體效果是至關重要的,在設計中切勿將各組成部分孤立分散,那樣會使畫面呈現出一種枝蔓紛雜的凌亂效果。
連貫是指要注意頁面的相互關系。設計中應利用各組成部分在內容上的內在聯系和表現形式上的相互呼應,并注意整個頁面設計風格的一致性,實現視覺上和心理上的連貫,使整個頁面設計的各個部分極為融洽,猶如一氣呵成。
分割是指將頁面分成若干小塊,小塊之間有視覺上的不同,這樣可以使觀者一目了然。在信息量很多時為使觀者能夠看清楚,就要注意到將畫面進行有效的分割。分割不僅是表現形式的需要。換個角度來講,分割也可以被視為對于頁面內容的一種分類歸納。
對比是指通過矛盾和沖突,使設計更加富有生氣。對比手法很多,例如:多與少、曲與直、強與弱、長與短、粗與細、疏與密、虛與實、主與次、黑與白、動與靜、美與丑、聚與散等等。在使用對比的時候應慎重,對比過強容易破壞美感,影響統一。
和諧是指整個頁面符合美的法則,渾然一體。如果一件設計作品僅僅是色彩、形狀、線條等的隨意混合,那么作品將不但沒有“生命感”,而且也根本無法實現視覺設計的傳達功能。和諧不僅要看結構形式,而且要看作品所形成的視覺效果能否與人的視覺感受形成一種溝通,產生心靈的共鳴。這是設計能否成功的關鍵。
3.2 數據庫設計
數據庫設計是指對于一個給定的應用環境,構造最優的數據庫模式,建立數據庫及其應用系統,使之能夠有效地存儲數據,滿足各種用戶的應用需求(信息要求和處理要求)。
數據庫和設計概述
1.數據庫是信息系統的核心和基礎,把信息系統中大量的數據按一定的模型組織起來,提供存儲、維護、檢索數據的功能,使信息系統可以方便、及時、準確地從數據庫中獲得所需的信息。
2.數據庫是信息系統的各個部分能否緊密地結合在一起以及如何結合的關鍵所在。
3.數據庫設計是信息系統開發和建設的重要組成部分。
3.2.1概念模型設計(E-R圖)
數據模型是是數據特征的抽象,從抽象層次上描述了系統的靜態特征、動態行為和約束條件,為數據庫系統的信息表與操作提供一個抽象的框架。描述了數據結構、數據操作及數據約束。?
E-R圖概念化地構建實體間關系的模型,這使得它們區別于數據庫模型圖。E-R圖的理念是:項目所有參與者能理解E-R圖。E-R圖由不同實體類型、關系、特性和類型構成。實體是諸如用戶的實際對象,有時更抽象,但必須有業務意義。特性用于描述實體,關系用于實體之間。
1.實體:現實世界中的事物;
2.屬性:事物的特性;
3.聯系:現實世界中事物間的關系。實體集的關系有一對一、一對多、多對多的聯系。
本系統的ER圖。
?
圖3.4 系統E-R圖
3.2.2數據庫表及關系建立
根據以上這些步驟就可以創建一個數據庫,依次建立下列表結構。
1.?? ?用戶基本信息表
2.?? ?用戶詳細信息表
3.?? ?論壇帖子表
4.?? ?論壇回復表
5.?? ?論壇版區表
表與表之間的關系如下:
1.用戶基本信息表和用戶詳細信息表是一對一的關系,一個用戶對應一個詳細信息表。
2.用戶基本信息表和論壇帖子表是一對多的關系,一個用戶可以發表多篇帖子。
3.用戶基本信息表和論壇回復表是一對多的關系,一個用戶可以回復多篇帖子。
4.論壇回復表和論壇帖子表是一對多的關系,一篇帖子后面可以跟多篇回復。
5.論壇版區表和論壇帖子表是一對多的關系,在一個版區中可以含有多篇帖子。
3.2.3詳細數據庫結構設計
1、用戶基本信息表
用戶基本信息表中存放的是用戶登陸時所需要或者記錄用戶的基本信息,包含比如登陸名、密碼、最后登陸時間等。用戶基本信息表的建立主要是記錄用戶最常用的一些信息。
表3.1用戶基本信息表
字段名?? ?數據類型?? ?為空?? ?說明
id?? ?int(11)?? ?否?? ?主鍵
userName?? ?varchar(20)?? ?否?? ?用戶名(唯一)
nickName?? ?varchar(60)?? ?否?? ?昵稱
passwd?? ?varchar(40)?? ?否?? ?密碼
email?? ?varchar(255)?? ?否?? ?Email
question?? ?varchar(255)?? ?否?? ?問題
answer?? ?varchar(255)?? ?否?? ?答案
regTime?? ?datetime?? ?否?? ?注冊時間
loginTime?? ?datetime?? ?否?? ?登錄時間
loginIP?? ?varchar(20)?? ?否?? ?登錄IP
coin?? ?int(11)?? ??? ?財富值
2、用戶詳細信息表
用戶詳細信息表中存放的是用戶的身高,體重,聯系方式等詳細資料,建立此表的目的是把一些用戶不經常用到的詳細信息,單獨存放到一張表中,可以節約系統的資源。
表3.2 用戶詳細信息表
字段名?? ?數據類型?? ?為空?? ?說明
id?? ?int(11)?? ?否?? ?主鍵(外鍵-userInfo.id)
height?? ?varchar(255)?? ??? ?身高
weight?? ?varchar(255)?? ??? ?體重
interest?? ?varchar(255)?? ??? ?興趣
graduate?? ?varchar(255)?? ??? ?畢業院校
favourPerple?? ?varchar(255)?? ??? ?偶像
favourArt?? ?varchar(255)?? ??? ?喜愛的藝術
favourMusic?? ?varchar(255)?? ??? ?喜愛的音樂
favourPlace?? ?varchar(255)?? ??? ?喜愛的地方
favourMovie?? ?varchar(255)?? ??? ?喜愛的電影
favourBook?? ?varchar(255)?? ??? ?喜愛的書
qqNo?? ?varchar(255)?? ??? ?qq號
sex?? ?int(1)?? ??? ?性別
3、論壇帖子表
論壇帖子表存放的是用戶所發表的主題帖信息。
表3.3 論壇帖子表
字段名?? ?數據類型?? ?為空?? ?說明
id?? ?int(11)?? ?否?? ?主鍵
boardid?? ?int(11)?? ?否?? ?版區ID(外鍵-board.id)
reNum?? ?int(11)?? ??? ?回復數量
userID?? ?int(11)?? ??? ?用戶ID
userName?? ?varchar(20)?? ??? ?用戶名
nickName?? ?varchar(60)?? ??? ?昵稱
title?? ?varchar(150)?? ??? ?標題
detail?? ?text?? ??? ?內容
click?? ?int(11)?? ??? ?點擊數
postTime?? ?datetime?? ??? ?發表時間
lastTime?? ?datetime?? ??? ?最后回復時間
delSig?? ?int(1)?? ??? ?刪除標記
4、論壇回復表
論壇回復表存放的是用戶回復主題的回復信息。
表3.4 論壇回復表
字段名?? ?數據類型?? ?為空?? ?說明
id?? ?int(11)?? ?否?? ?主鍵
pid?? ?int(11)?? ?否?? ?父級ID
userID?? ?int(11)?? ??? ?用戶ID
userName?? ?varchar(20)?? ??? ?用戶名
nickName?? ?varchar(60)?? ??? ?昵稱
context?? ?text?? ??? ?內容
postTime?? ?datetime?? ??? ?發表時間
delSig?? ?int(1)?? ??? ?刪除標記
5、論壇版區表
論壇版區表是存放的是論壇中版塊信息。
表3.5 論壇版區表
字段名?? ?數據類型?? ?為空?? ?說明
id?? ?int(11)?? ?否?? ?主鍵
pid?? ?int(11)?? ?否?? ?父級ID
boardName?? ?varchar(60)?? ?否?? ?版區名稱
explains?? ?text?? ??? ?版區說明
mainPostNum?? ?int(11)?? ??? ?主題數量
postNum?? ?int(11)?? ??? ?回復數量
?
第 4 章 系統實現
4.1 系統框架實現
在系統的整體設計中,我們采取了三層結構。這樣結構的優點是靈活,移植和可維護性比較高。每個層在處理程序上都應該有一項明確的責任,而不應該在功能上與其它層混合,并且每個層要與其它層分開的。
?
圖4.1 S.S.H框架的結合使用
4.1.1底層數據庫的建立
在前期的數據庫選用中,本系統選取了適合中小型網站的MySQL數據庫,而在數據庫的設計中,本文已經確立了表結構。根據這些就可以創建一個數據庫,在數據庫創建并連接好后,就可以創建表、修改表和刪除表,創建、修改、和刪除主鍵、外鍵等等。選中“spring”數據庫,“use spring;”并使用“create table <表名>”sql語句,依次創建以下表結構。
表4.1表結構
userInfo?? ?用戶基本信息表
userDetail?? ?用戶詳細信息表
boardTag?? ?論壇版區表
board?? ?論壇版塊表
forum?? ?帖子表
reply?? ?回復表
?
4.1.2持久化層的建立(Hibernate)
本論壇利用了DAO設計模式結合Hibernate框架來創建數據持久化層。DAO(Data Access Object)模式稱為數據訪問對象模式,其本質是向外部提供一個訪問數據源的統一接口,對外隱藏操作數據源的實現細節,而DAO的實現使用的是Hibernate。首先,在spring的配置文件bean.xml中配置dataSource、sessionFactory、transactionManager,然后編寫entity層中的實體類。在實體類中,需要加上無參的空實現的構造器,還有getter和setter方法。Hibernate通過注解來映射(OR)對象。注解比以往使用xml文檔實現的映射文件更加便捷,只需在實體類中標記“@entity”、“@Id”等,便可聲明Hibernate中持久化類的屬性與數據庫對應表之間字段的映射關系。接著是DAO接口的定義。DAO接口中定義了特定持久化類所對應的抽象業務邏輯方法。最后是DAO接口的實現類。該類利用HibernateAPI實現DAO接口所定義的抽象方法。這樣的設計的有利于當改用其他的持久化機制或持久化中間件時(例如,出現了更好地ORM框架),由于DAO向上層調用者提供的接口不會變化,只需創建新的DAO實現類而無需更改應用中的業務邏輯代碼。
4.1.3業務邏輯層的建立
本系統的業務邏輯是交由Struts中的Action進行判斷的,比如判斷登陸的業務邏輯時,會建立一個LoginAction類來進行邏輯判斷,而一些關聯的映射,本系統是寫在Struts的struts.xml中。
從編碼的視角來看,這層是最容易被忽視的一層。 我們往往在持久層周圍看到這些業務處理的代碼,這其實是不正確的,因為它導致了程序代碼的緊密偶合,這樣一來,隨著時間推移這些代碼很難維護。針對這一問題,本系統可以使用Spring框架來解決,利用Spring框架中的“依賴注射”(“控制反轉”)把程序中所涉及到包含業務邏輯和Dao的Objects,例如transaction management handler(事物管理控制)、Object Factoris(對象工廠)、service objects(服務組件)都放在Spring的容器中,通過Spring來管理。這種方式讓你的對象從創建中釋放了出來,降低了偶合度。
4.1.4表示層的建立
在表示層上,主要是基于JSP和AJAX異步傳輸技術來進行建立,最后通過Struts框架的struts.xml文件進行關聯映射.具體的頁面設計,會在后面的章節中進行介紹。
4.2 系統功能模塊實現
4.2.1用戶模塊實現
在用戶模塊的設計中,首先完成的是業務邏輯層的相應action類的編寫,之后在通過具體的需要,編寫相應的數據庫訪問DAO。在一切結束之后,從DAO和業務邏輯類中抽象出接口,通過Spring的IOC對接口進行對象注入。
在模塊的設計過程中,遇到的難點是在注冊時使用的AJAX異步傳輸,來判斷用戶名是否可以被注冊。AJAX技術是一個基于Javascript腳本語言的技術,目前對這種技術的使用還不是很多,但通過反復的調試,逐漸的掌握了AJAX的要點。
其主要代碼如下:
function changeStyle(elementID, toStyle, showText) {
?? ?document.getElementById(elementID).className = toStyle;
?? ?document.getElementById(elementID).innerText = showText;
}
function checkUserName() {
?? ?var username = $('userName').value;
?? ?if (username == "" || username == null) {
?? ??? ?$('usernameMsg').innerHTML = "<font color='red'>不能為空!</font>";
?? ?} else if (!username.match(/^\w+$/)) {
?? ??? ?$('usernameMsg').innerHTML = "<font color='red'>用戶名只能由英文、數字和下劃線組成!</font>";
?? ?} else if (username.length<3||username.length>12) {
?? ??? ?$('usernameMsg').innerHTML = "<font color='red'>長度要在3到12個字符內!</font>";
?? ?} else {
?? ??? ?$('usernameMsg').innerHTML = "<font color='blue'>ok.</font>";
?? ?}
?? ?$('usernameMsg').className = "msg1";
}
function checkNickName() {
?? ?var nickname = $('nickName').value;
?? ?if (nickname == "" || nickname == null) {
?? ??? ?$('nicknameMsg').innerHTML = "<font color='red'>請輸入昵稱.</font>";
?? ?} else {
?? ??? ?$('nicknameMsg').innerHTML = "<font color='blue'>ok.</font>";
?? ?}
?? ?$('nicknameMsg').className = "msg1";
}
function checkEmail() {
?? ?var email = $('email').value;
?? ?if (email == "" || email == null) {
?? ??? ?$('emailMsg').innerHTML = "<font color='red'>請輸入email.</font>";
?? ?} else if (!email.match(/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/)) {
?? ??? ?$('emailMsg').innerHTML = "<font color='red'>請輸入正確的email.</font>";
?? ?} else {
?? ??? ?$('emailMsg').innerHTML = "<font color='blue'>ok.</font>";
?? ?}
?? ?$('emailMsg').className = "msg1";
}
function checkPassword() {
?? ?var passwd = $('passwd').value;
?? ?if (passwd == "" || passwd == null) {
?? ??? ?$('passwdMsg').innerHTML = "<font color='red'>請輸入密碼.</font>";
?? ?} else if (passwd.length < 6) {
?? ??? ?$('passwdMsg').innerHTML = "<font color='red'>密碼不能少于6個字符</font>";
?? ?} else if (passwd.length > 20) {
?? ??? ?$('passwdMsg').innerHTML = "<font color='red'>密碼不能大于20個字符</font>";
?? ?} else {
?? ??? ?$('passwdMsg').innerHTML = "<font color='blue'>ok.</font>";
?? ?}
?? ?$('passwdMsg').className = "msg1";
}
function checkRePassword() {
?? ?if ($('rePasswd').value != $('passwd').value) {
?? ??? ?$('passwdreMsg').innerHTML = "<font color='red'>不一致</font>";
?? ?} else {
?? ??? ?$('passwdreMsg').innerHTML = "<font color='blue'>ok.</font>";
?? ?}
?? ?$('passwdreMsg').className = "msg1";
}
function checkQuestion() {
?? ?if ($('question').value == "" || $('question').value == null) {
?? ??? ?$('questionMsg').innerHTML = "<font color='red'>請輸入問題.</font>";
?? ?} else {
?? ??? ?$('questionMsg').innerHTML = "<font color='blue'>ok.</font>";
?? ?}
?? ?$('questionMsg').className = "msg1";
}
function checkAnswer() {
?? ?if ($('answer').value == "" || $('answer').value == null) {
?? ??? ?$('answerMsg').innerHTML = "<font color='red'>請回答.</font>";
?? ?} else {
?? ??? ?$('answerMsg').innerHTML = "<font color='blue'>ok.</font>";
?? ?}
?? ?$('answerMsg').className = "msg1";
}
function checkUserNameAction() {
?? ?if ($('userName').value == "" || $('userName').length == 0) {
?? ??? ?alert("請填寫用戶名!");
?? ??? ?return;
?? ?}
?? ?$('checkUserNameMsg').className = "msg2";
?? ?$('checkUserNameMsg').innerHTML = "檢測中,請等待...";
?? ?if (typeof XMLHttpRequest != "undefined") {
?? ??? ?var sUrl = "checkUsername.action?userName="+$('userName').value;
?? ??? ?var oRequest = new XMLHttpRequest();
?? ??? ?oRequest.onreadystatechange = function() {
?? ??? ??? ?if (oRequest.readyState == 4) {
?? ??? ??? ??? ?var result = eval('(' + oRequest.responseText + ')');
?? ??? ??? ??? ?$('checkUserNameMsg').innerHTML="<font color='blue'>"+ result.checkedMessage + "</font>";
?? ??? ??? ?}
?? ??? ?};
?? ??? ?$('checkUserNameMsg').className = "msg1";
?? ??? ?oRequest.open('POST', sUrl);
?? ??? ?oRequest.send(null);
?? ?}
}
圖4.2 ?AJAX技術在本系統中的應用
當用戶登錄時,會有“自動登錄”的選項,其實現是在登錄時,檢測是否勾選“自動登錄”,若勾選了,會往瀏覽器發送cookie,以保留登錄信息,下次訪問時就不用再輸入用戶名和密碼就可以自動登錄了。
發送cookie代碼如下:
if (checkAuto != null && "auto".equals(this.getCheckAuto()[0])) {
?? ?Cookie cookie = new Cookie("forumCookie", this.getUsername());
?? ?cookie.setMaxAge(60 * 60 * 24 * 7);
?? ?this.getResponse().addCookie(cookie);
} else {
?? ?Cookie cookie = new Cookie("forumCookie", "forum");
?? ?this.getResponse().addCookie(cookie);
}
接收cookie代碼(攔截器)如下:
public String intercept(ActionInvocation invocation) throws Exception {
?? ??? ?ActionContext ac = invocation.getInvocationContext();
?? ??? ?HttpServletRequest request = (HttpServletRequest) ac
?? ??? ??? ??? ?.get(ServletActionContext.HTTP_REQUEST);
?? ??? ?Cookie[] cookies = request.getCookies();
?? ??? ?if (cookies != null) {
?? ??? ??? ?for (Cookie cookie : cookies) {
?? ??? ??? ??? ?if ("forumCookie".equals(cookie.getName())) {
?? ??? ??? ??? ??? ?String value = cookie.getValue();
?? ??? ??? ??? ??? ?if (!"forum".equals(value)) {
?? ??? ??? ??? ??? ??? ?Map<String, Object> session = ac.getSession();
?? ??? ??? ??? ??? ??? ?if (session.get("userInfo") == null) {
?? ??? ??? ??? ??? ??? ??? ?UserInfo userInfo = new UserInfo();
?? ??? ??? ??? ??? ??? ??? ?userInfo.setUserName(value);
?? ??? ??? ??? ??? ??? ??? ?session.put("userInfo", userInfo);
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return invocation.invoke();
?? ?}
圖4.3 cookie的應用
當用戶登錄成功后,用戶可以選擇進入到個人中心,來管理個人信息。個人中心分為用戶的操作框和具體信息顯示框兩部分。用戶可以選擇修改簽名、編輯頭像、更改個人信息等操作。
?
圖4.4個人中心
?
4.2.2帖子模塊實現
帖子模塊的完成流程和用戶模塊類似,都是先根據JSP網頁,建立相應的Action邏輯判斷類,之后建立和帖子有關的數據庫訪問DAO,最后抽象出接口進行依賴注入。編寫帖子模塊首先遇到的難點是分頁功能的實現,當打開某個論壇時,如果論壇中的帖子數量不能在一頁中顯示出來,那么怎樣進行處理。在一些參考學習后,本系統最后編寫了一個分頁類,來解決這個難題。Pages.java、PageList.java位于com.oyj.forum.service.web包下,其中的屬性有:
表4.2 ?Pages類的屬性
Pages.java
int page?? ?頁號
long totalNum?? ?記錄總數
int perPageNum?? ?每頁顯示記錄數
int allPage?? ?總頁數
int cpage?? ?當前頁
int spage?? ?起始記錄數
表4.3 PageList類的屬性
PageList.java
List<E> objectList?? ?記錄列表
Pages pages?? ?分頁信息
圖4.5分頁的實現
當用戶進入某版塊時,就會顯示出分頁信息,并且把相關的帖子發列表送給用戶。當我們每次查看某個帖子,或回復某個帖子時,回復數量、點擊數量都會進行自增。進入帖子后,系統會根據文章發表時間的順序,將帖子和相關的回復顯示出來。
?
圖4.6查看帖子
4.2.3后臺管理模塊實現
后臺管理模塊是管理員對論壇進行管理的平臺。管理員可以在此模塊中主要完成對帖子和用戶的管理,管理員可以通過用戶的ID和用戶名對其進行搜索,從而實現管理。
?
圖4.7 管理員對用戶進行管理
此外管理員還可以進行添加,修改論壇信息。
?
圖4.8管理員對版區進行管理
?
第 5 章 系統測試
5.1 測試概述
5.1.1軟件測試的目的
軟件測試是軟件開發過程中的一個重要組成部分,其目的就是對軟件產品(包括階段性成果)進行驗證和確認的活動過程,盡快盡早地發現在軟件產品中所存在的各種問題。
軟件測試是由“驗證(verification)”和“有效性確認(validation)”活動構成的整體:
??? ?“驗證”是檢驗軟件是否已正確地實現了產品規格書所定義的系統功能和特性。驗證過程提供證據表明軟件相關產品與所有生命周期活動的要求(如正確性、完整性、一致性、準確性等)相一致。相當于以軟件產品設計規格說明書為標準進行軟件測試的活動。
??? ?“有效性確認”是確認所開發的軟件是否滿足用戶真正需求的活動。一切從客戶出發,理解客戶的需求,對軟件需求定義、設計的懷疑,發現需求定義和產品設計中的問題。這主要通過各種軟件評審活動來實現,包括讓客戶參加評審、測試活動。
5.1.2軟件測試的任務
1.?? ?尋找Bug;
2.?? ?避免軟件開發過程中的缺陷;
3.?? ?衡量軟件的品質;
4.?? ?關注用戶的需求。
總的目標是:確保軟件的質量。
5.1.3測試環境
測試環境是在windows版本的Tomcat7.0下進行的。
5.2 單元測試
單元測試是在編碼階段,針對每個程序單元而進行的測試,其測試的對象是程序系統中的最小單元——類、函數、模塊或組件等。單元測試主要使用白盒測試方法,從程序的內部結構出發設計測試用例,檢查程序模塊或組件已實現的功能與定義的功能是否一致,以及編碼中是否存在錯誤。白盒測試使用了junit工具,結合Spring的事務管理,可以在不對數據庫產生任何影響下,安全地進行白盒測試,并且測試時可以使用Spring的容器,省去了創建對象的操作。
以下為UserInfoDAOimpl.java的部分測試代碼。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/beans.xml" })
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class UserInfoDAOimplTest {
?? ?@Autowired
?? ?private UserInfoDAO userInfoDAO;
?? ?@Test
?? ?public void saveUserInfoTest() {
?? ??? ?UserInfo userInfo = new UserInfo();
?? ??? ?userInfo.setUserName("kevin");
?? ??? ?userInfo.setPasswd("123");
?? ??? ?userInfo.setNickName("歐文");
?? ??? ?userInfo.setQuestion("你是誰");
?? ??? ?userInfo.setAnswer("我是我");
?? ??? ?userInfoDAO.saveUserInfo(userInfo);
?? ?}
?? ?@Test
?? ?public void findUserInfoByIdTest() {
?? ??? ?UserInfo userInfo = userInfoDAO.findUserInfoById(1);
?? ??? ?System.out.println(userInfo.getNickName());
?? ?}
}
以下為BoardDAOimplTest.java的部分測試代碼。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/beans.xml" })
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class BoardDAOimplTest {
?? ?
?? ?@Autowired
?? ?private BoardDAO boardDAO;
?? ?@Test
?? ?public void testSaveBoard() {
?? ??? ?Board board = new Board();
?? ??? ?boardDAO.saveBoard(board);
?? ?}
?? ?@Test
?? ?public void testGetBoardByID() {
?? ??? ?Board board = boardDAO.getBoardByID(1);
?? ??? ?System.out.println(board.getBoardName());
?? ??? ?System.out.println("boardTag="+board.getBoardTag().getTagName());
?? ?}
?? ?@Test
?? ?public void testFindBoardsAll() {
?? ??? ?List<Board> list = boardDAO.findBoardsAll();
?? ??? ?Iterator<Board> boards = list.iterator();
?? ??? ?while(boards.hasNext()){
?? ??? ??? ?System.out.println(boards.next().getBoardName());
?? ??? ?}
?? ?}
5.3 集成測試
集成測試,也稱組裝測試、聯合測試、子系統測試,在單元測試的基礎上,按照設計要求不斷進行集成而進行的相應測試,目的是發現單元之間的接口問題,如接口參數類型不匹配、接口數據在傳輸中丟失、數據誤差不斷積累等問題。
選擇什么樣的方式把單元組裝起來形成一個可運行的系統,直接影響到測試成本,測試計劃、測試用例的設計、測試工具的選擇等。本論壇采用漸增式集成。首先對某兩、三個單元進行測試,然后將這些單元逐步組裝成較大的系統。在組裝的過程中,一邊連接一邊測試,以發現連接過程中產生的問題,最后完成所有單元的集成,構造為一個完整的論壇。
5.4 功能測試
功能測試應該在集成測試完成之后進行,而且是針對應用系統進行測試。功能測試是基于產品功能說明書、用戶角度來對各項功能進行驗證,以確認每個功能是否都能正常使用。在測試時,不考慮程序內部結構和實現方式,只檢查程序功能是否按照需求規格說明書的規定正常使用,程序是否能適當地接收輸入數據而產生正確的輸出信息,并且保持外部信息(如數據庫或文件)的完整性。功能測試包括用戶界面、各種操作、不同的數據輸入輸出和存儲等的測試。
表5.1登陸測試用例
測試用例描述?? ?操作過程及數據?? ?預期結果
按不同的輸入格式輸入個人信息,進行注冊。?? ?進入注冊界面,按提示的輸入格式輸入個人信息,進行注冊。?? ?注冊成功,顯示注冊成功。居民信息保存到數據庫。
用戶名有重名的?? ?進入注冊界面,用戶名輸入,其它按提示的輸入格式輸入個人信息,進行注冊。?? ?注冊失敗,不能注冊。
郵箱按郵箱有效地址輸入,其它按規定輸入,進行注冊。?? ?進入注冊界面,輸入例如:abcd.com其它按提示的輸入格式輸入個人信息,進行注冊。?? ?注冊失敗,不能注冊。
輸入為空時,進行注冊。?? ?進入注冊界面,輸入為空,進行注冊。?? ?無法注冊
表5.2發貼測試用例
測試用例描述?? ?操作過程及數據?? ?預期結果
按要求輸入帖子的相關信息?? ?進入發貼界面,輸入帖子內容,標題,內容,再提交。?? ?發貼成功,跳轉到帖子界面。
沒輸入標題?? ?進入發貼界面,沒輸入標題,再提交?? ?發貼失敗。
輸入為空?? ?進入發貼界面,輸入為空,再提交。?? ?無法發貼。
?
第 6 章 總結
經過努力,已經基本完成了BBS系統的開發和設計。完成了用戶模塊、帖子模塊和后臺管理模塊的開發,并基本實現了前期所制定的功能。
BBS系統在不斷的設計更改過程中,逐漸的成熟。在編碼階段,參考了一些設計模式,在業務邏輯代碼和數據庫連接DAO中抽象出了若干接口,并對其進行了對象的依賴注入,大大的減少了模塊之間的耦合,使系統具有很高的靈活性和可維護性,這是BBS系統最大的優點。
系統的另一個優點就是JQuery和AJAX異步傳輸技術的結合使用,既減輕了服務器的負擔,也加快了用戶的訪問效率。
當然BBS系統也存在很多不足的地方,比如用戶的權限判斷過于簡單,安全性低,希望在今后的學習中,逐步的進行改進。
通過這次的設計,加深了對S.S.H框架,以及AJAX的一些理解。對于軟件工程方面的設計思想也有了更深一步的理解,只有在不斷的實踐于學習中,才會得到最豐厚的回報。
?
參考文獻
[1]馬賽斯扎克.實用軟件工程[M].北京:機械工業出版社,2007,391-420.
[2]劉易斯.數據庫與事務處理[M].北京:機械工業出版社,2005,10-35.
[3]Dave Crane.Ajax in Action[M].北京:人民郵電出版社,2006,289-338.
[4]孫衛琴.精通struts[M].北京:電子工業出版社,2004,50-70.
[5]孫衛琴.精通hibernate[M].北京:電子工業出版社,2005,100-120.
[6]林信良.spring2.0技術手冊[M].北京:電子工業出版社,2006,50-100.
[7]佚名.MySQL數據庫下的JSP分頁查詢模塊源碼[EB/OL].http://developer.51cto.com/art/200907/132916.htm.
[8](美)MartyHall.Servlet與JSP核心編程[M].北京:清華大學出版社,2009,54-56.
[9]馮燕奎,趙德奎.JSP實用案例教程[M].北京:清華大學出版社,2004,70-100.
[10](美)Jim Arlow.UML2.0 and the Unified Process[M].北京:機械工業出版社,2006,30-40.
[11]徐建波,周新蓮.Web設計原理于編程技術[M].北京:中南大學出版社,2005,185-193.
[12]孫鑫編.Java Web開發詳解[M].北京:電子工業出版社,2006,189-274.
[13]林上杰,林康司.JSP2.0技術手冊[M].北京:電子工業出版社,2004,3-6.
[14]薩師煊,王珊.數據庫系統概論(第三版)[M].北京:高等教育出版社,1998.
[15]蔡劍,景楠.Java Web應用開發:J2EE和Tomcat[M].北京:清華大學出版社,2004.
[16]朱少民.軟件測試方法和技術[M].北京:清華大學出版社,2010.
?
總結
以上是生活随笔為你收集整理的基于java的论坛管理系统设计(含源文件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U盘FAT32格式如何转换成NTFS格式
- 下一篇: 联想万全服务器机箱电源开关 型号,DPS