解析當前藥品進銷存儲管理系統(tǒng)_第1頁
解析當前藥品進銷存儲管理系統(tǒng)_第2頁
解析當前藥品進銷存儲管理系統(tǒng)_第3頁
解析當前藥品進銷存儲管理系統(tǒng)_第4頁
解析當前藥品進銷存儲管理系統(tǒng)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

解析當前藥品進銷存儲管理系統(tǒng)

關(guān)鍵詞:藥品進銷

進銷存儲

管理系統(tǒng)

1

引言

面向?qū)ο缶幊蹋∣OP)具有多方面的吸引力。對管理人員,它實現(xiàn)了更快和更廉價的開發(fā)與維護過程。對分析與設(shè)計人員,建模處理變得更加簡單,能生成清晰、易于維護的設(shè)計方案。對程序員,對象模型顯得如此高雅和淺顯。此外,面向?qū)ο蠊ぞ咭约皫斓木薮笸κ咕幊坛蔀橐豁椄谷擞鋹偟娜蝿?wù)。每個人都可從中獲益,至少表面如此。Java便是實現(xiàn)面向?qū)ο缶幊痰囊环N優(yōu)秀的語言。同人類任何語言一樣,Java為我們提供了一種表達思想的方式。如操作得當,同其他方式相比,隨著問題變得愈大和愈復(fù)雜,這種表達方式的方便性和靈活性會顯露無遺[1]。Java

吸取了C++面向?qū)ο蟮母拍?將數(shù)據(jù)封裝于類中,利用類的優(yōu)點,實現(xiàn)了程序的簡潔性和便于維護性。類的封裝性,繼承性等有關(guān)對象的特性,使程序代碼只需一次編譯,然后通過上述特性反復(fù)利用。程序員只需把主要精力用在類和接口的設(shè)計和應(yīng)用上。

MVC模式作為現(xiàn)在軟件行業(yè)最為流行的一種設(shè)計模式,一旦和Java相結(jié)合,所產(chǎn)生的作用是無庸質(zhì)疑的。面向?qū)ο蟮母拍罱Y(jié)合結(jié)構(gòu)清晰的模型-視圖-控制器三層結(jié)構(gòu),使得軟件設(shè)計人員的思想得到進一步的解放,MVC模式的一個更大的優(yōu)點在于清晰的結(jié)構(gòu)能使得軟件開發(fā)完成之后的維護和拓展變的更加輕松。MVC的優(yōu)點表現(xiàn)在以下幾個方面:(1)可以為一個模型在運行時同時建立和使用多個視圖。變化-傳播機制可以確保所有相關(guān)的視圖及時得到模型數(shù)據(jù)變化,從而使所有關(guān)聯(lián)的視圖和控制器做到行為同步。(2)視圖與控制器的可接插性,允許更換視圖和控制器對象,而且可以根據(jù)需求動態(tài)的打開或關(guān)閉、甚至在運行期間進行對象替換。(3)模型的可移植性。因為模型是獨立于視圖的,所以可以把一個模型獨立地移植到新的平臺工作。需要做的只是在新平臺上對視圖和控制器進行新的修改。(4)潛在的框架結(jié)構(gòu)。可以基于此模型建立應(yīng)用程序框架,不僅僅是用在設(shè)計界面的設(shè)計中。

本文介紹了基于Java的MVC模式的網(wǎng)上日志備忘系統(tǒng)的設(shè)計與實現(xiàn),主要包括系統(tǒng)需求分析和系統(tǒng)的功能設(shè)計、數(shù)據(jù)庫設(shè)計以及主要的Java類的設(shè)計和相關(guān)的XML文件的配置。本系統(tǒng)主要基于Java和MVC模式,采用struts框架實現(xiàn)主要功能模塊的設(shè)計,采用Mysql數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)結(jié)構(gòu)設(shè)計。重點闡述了用戶登錄模塊、用戶日志管理模塊和后臺管理模塊的設(shè)計。

2

基礎(chǔ)知識

2.1

JAVA程序語言

Java是一種簡單的、面向?qū)ο蟮?、分布式的、可解釋的、鍵壯的、安全的、結(jié)構(gòu)中立的、可移植的、性能優(yōu)異的、多線程的、動態(tài)的語言。Java的開發(fā)環(huán)境有不同的版本,如sun公司的Java

Developers

Kit,簡稱

JDK。后來微軟公司推出了支持Java規(guī)范的Microsoft

Visual

J++

Java開發(fā)環(huán)境,簡稱

VJ++?,F(xiàn)在流行的開發(fā)平臺有Eclipse和JBuilder等。主要具有平臺無關(guān)性、安全性、面向?qū)ο蟆⒎植际?、健壯性等特點[1][2]。

2.2

MVC設(shè)計模式

MVC英文即Model-View-Controller,即把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層。

視圖(View)代表用戶交互界面,對于Web應(yīng)用來說,可以概括為HTML界面,但有可能為XHTML、XML和Applet[3]。隨著應(yīng)用的復(fù)雜性和規(guī)模性,界面的處理也變得具有挑戰(zhàn)性。一個應(yīng)用可能有很多不同的視圖,MVC設(shè)計模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。比如一個訂單的視圖只接受來自模型的數(shù)據(jù)并顯示給用戶,以及將用戶界面的輸入數(shù)據(jù)和請求傳遞給控制和模型。

模型(Model):就是業(yè)務(wù)流程、狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定。業(yè)務(wù)流程的處理過程對其它層來說是黑箱操作,模型接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計可以說是MVC最主要的核心。MVC設(shè)計模式告訴我們,把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要,這也是判斷開發(fā)人員是否優(yōu)秀的設(shè)計依據(jù)。抽象與具體不能隔得太遠,也不能太近。MVC并沒有提供模型的設(shè)計方法,而只告訴你應(yīng)該組織管理這些模型,以便于模型的重構(gòu)和提高重用性。我們可以用對象編程來做比喻,MVC定義了一個頂級類,告訴它的子類你只能做這些,但沒法限制你能做這些。這點對編程的開發(fā)人員非常重要。

業(yè)務(wù)模型還有一個很重要的模型那就是數(shù)據(jù)模型。數(shù)據(jù)模型主要指實體對象的數(shù)據(jù)保存(持續(xù)化)。比如將一張訂單保存到數(shù)據(jù)庫,從數(shù)據(jù)庫獲取訂單。我們可以將這個模型單獨列出,所有有關(guān)數(shù)據(jù)庫的操作只限制在該模型中。

控制層(Controller)可以理解為從用戶接收請求,

將模型與視圖匹配在一起,共同完成用戶的請求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個分發(fā)器,選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求。控制層并不做任何的數(shù)據(jù)處理。例如,用戶點擊一個連接,控制層接受請求后,

并不處理業(yè)務(wù)信息,它只把用戶的信息傳遞給模型,告訴模型做什么,選擇符合要求的視圖返回給用戶。因此,一個模型可能對應(yīng)多個視圖,一個視圖可能對應(yīng)多個模型。

2.3

JSP(JAVA

SERVER

PAGE)

基于文本的WEB組件,在HTML代碼中嵌入JAVA代碼來實現(xiàn)動態(tài)內(nèi)容的輸出的一項技術(shù)。

1)利于將創(chuàng)建內(nèi)容和表示內(nèi)容的代碼分離開來;

2)標簽技術(shù)更容易使人理解和使用,組件重用;

3)動態(tài)內(nèi)容與靜態(tài)內(nèi)容的分離;

4)本質(zhì)上還是servlet,在服務(wù)器端被轉(zhuǎn)換成servlet;

5)適合多層WEB應(yīng)用開發(fā)體系結(jié)構(gòu)

。

2.4

Struts框架

Struts是采用Java

Servlet/JavaServer

Pages技術(shù),開發(fā)Web應(yīng)用程序的開放源碼的framework。采用Struts能開發(fā)出基于MVC(Model-View-Controller)設(shè)計模式的應(yīng)用構(gòu)架[4]。

Struts有如下的主要功能:包含一個controller

servlet,能將用戶的請求發(fā)送到相應(yīng)的Action對象[5]。JSP

tag庫,并且在controller

servlet中提供關(guān)聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應(yīng)用。提供了一系列實用對象:XML處理、通過Java

reflection

APIs自動處理JavaBeans屬性、國際化的提示和消息[6]。

Struts優(yōu)點:

1)集中式的、基于XML的配置方式,避免了Java硬編碼;

2)提供了Form

bean的方式封裝用戶請求的參數(shù),使其在請求階段方便使用;

3)自定義了很多有用的標簽,如Bean

tags可以方便操作Bean中的內(nèi)容;[1]

[2]

[3]

[4]

[5]

[6]

下一頁

HTML

tags

可以讓你輕松初始化表單域等內(nèi)容;

4)增加了表單驗證功能。

3

系統(tǒng)設(shè)計

3.1需求分析

本系統(tǒng)的用戶可分為管理員,注冊用戶和普通用戶(即未注冊用戶)三類??紤]到系統(tǒng)的安全性,本系統(tǒng)共分成兩個界面:一個界面用于注冊登錄,主要進行基本資料的修改、日志分類和日志內(nèi)容的管理以及查詢等,進入方式為主頁默認顯示;另外一個界面用于后臺管理員登錄,主要負責(zé)審核用戶權(quán)限、系統(tǒng)新聞維護、公告維護等。

從總體上看,系統(tǒng)主要需要實現(xiàn)了下列功能:

對管理員來說,包括用戶管理、新聞維護、公告維護。

l

用戶管理:管理員可以通過進入用戶管理模塊對用戶進行相關(guān)的操作。首先從查詢頁面輸入查詢條件,結(jié)果在查詢模塊下方分頁顯示,管理員可以在查詢結(jié)果中對用戶進行相關(guān)操作。主要包括用戶信息的瀏覽,注冊用戶的權(quán)限的審批和停用,用戶的刪除。

l

新聞維護:管理員可以對前臺首頁的本站新聞進行維護,包括新聞的添加,修改和刪除。

l

公告維護:管理員對首頁公告進行更新。

對用戶來說,包括用戶注冊、用戶登陸、瀏覽新聞和共享文章,以及登陸后日志分類維護,日志內(nèi)容維護等。

l

用戶注冊:非注冊用戶要取得系統(tǒng)的使用權(quán)必須先進行用戶注冊。用戶通過進入注冊對自己的基本信息進行填寫,提交后經(jīng)過管理員審核完成,正式獲得系統(tǒng)的使用權(quán)。

l

用戶登陸:注冊完成并且經(jīng)過審核的用戶須登陸后才能進入日志維護頁面。該模塊實現(xiàn)了用戶的登陸和錯誤驗證。

l

瀏覽新聞和共享文章:普通用戶(包括注冊和非注冊用戶)進入首頁都能對新聞和注冊用戶發(fā)布的公開權(quán)限的文章進行瀏覽,通過點擊標題能夠查看詳細內(nèi)容。

l

日志分類維護:此模塊主要對日志分類進行維護。如果是第一次進入系統(tǒng),寫日志之前必須先添加日志分類。本模塊主要實現(xiàn)了分類的即時添加和刪除。

l

日志內(nèi)容維護:注冊用戶登陸后在日志維護主頁面點擊分類,頁面顯示出此分類下的所有日志,在日志標題右邊能對發(fā)布日志進行刪除和修改,點擊日志標題能瀏覽日志全文,在日志顯示模塊上方點擊發(fā)布日志,進入日志發(fā)布頁面。

需求分析用例圖如圖

3-1。

圖3-1

需求分析用例圖

3.2

功能劃分

3.2.1

前臺功能模塊劃分

3.2.2

后臺功能模塊劃分

3.3

數(shù)據(jù)庫設(shè)計

3.3.1

數(shù)據(jù)庫需求分析

根據(jù)系統(tǒng)的需求,主要數(shù)據(jù)項和數(shù)據(jù)結(jié)構(gòu)如下。

l

管理員信息,包括的數(shù)據(jù)項有:用戶名、口令等。

l

用戶信息,包括的數(shù)據(jù)項有:用戶名、密碼、真實姓名、性別、聯(lián)系方式、E-mail地址、電話、用戶簡介等。

l

日志信息,包括的數(shù)據(jù)項有:日志編號、標題、內(nèi)容、發(fā)布時間、更新時間、發(fā)布人、所屬分類等。

l

日志類別信息,包括的數(shù)據(jù)項有:類別編號、類別名、創(chuàng)建用戶名。

l

新聞信息,包括的數(shù)據(jù)項有:新聞編號、標題、內(nèi)容、更新時間、轉(zhuǎn)載地址等。

l

公告信息,包括的數(shù)據(jù)項有:公告編號、標題、內(nèi)容、更新時間等。

為了從多方面來保障用戶個人信息和日志信息的安全性、可信性,本系統(tǒng)還應(yīng)該建立一套機制,這套機制至少應(yīng)該包括用戶和后臺管理的賬號的安全機制、后臺數(shù)據(jù)庫的安全機制、用戶使用過程的控制和驗證機制。

3.3.2

數(shù)據(jù)庫物理設(shè)計

本系統(tǒng)數(shù)據(jù)庫主要使用POWERDESIGNER進行邏輯設(shè)計和物理設(shè)計。該軟件能很直觀將實體之間的關(guān)系清晰的表述出來。數(shù)據(jù)庫的物理設(shè)計如圖

3-4。

圖3-4

數(shù)據(jù)庫的物理設(shè)計

3.3.3

數(shù)據(jù)庫邏輯設(shè)計

由于本系統(tǒng)是為網(wǎng)上日志備忘系統(tǒng)而設(shè)計的,因此數(shù)據(jù)庫名稱定為diary。根據(jù)需求分析設(shè)計了如下圖所示的數(shù)據(jù)庫結(jié)構(gòu)圖3-5。具體的用戶數(shù)據(jù)表詳細信息見附錄一。

圖3-5

數(shù)據(jù)庫結(jié)構(gòu)

3.4

系統(tǒng)結(jié)構(gòu)

因為本系統(tǒng)的實現(xiàn)主要是基于Java的MVC設(shè)計模式,所以整個軟件在架構(gòu)被分成了三部分,也就是MVC中的三個表現(xiàn)層:模型層,控制層和視圖層。下面分別就這三個表現(xiàn)層對系統(tǒng)結(jié)構(gòu)進行說明。

首先是視圖層。視圖層簡單的理解就是用戶的操作界面和程序在處理完用戶提交的請求之后返回給用戶的結(jié)果顯示界面。本系統(tǒng)的視圖層主要是用JSP頁面來實現(xiàn)的。JSP是JAVA的一個網(wǎng)絡(luò)應(yīng)用組件,它通過動態(tài)JSP代碼和HTML語句的相互嵌套,經(jīng)服務(wù)器編譯之后在瀏覽器上顯示處理結(jié)果[7][8]。本系統(tǒng)的JSP頁面可分為兩類:完整的JSP頁面和功能單一的JSP代碼段。完整的JSP頁面基本上規(guī)劃好了整個頁面的顯示格局,具有獨立顯示結(jié)果的功能;而功能單一的JSP代碼段是為了保證代碼的清晰性和可重用性而獨立出來的只具有單一功能的代碼段,它不能被獨立顯示出來,而只能通過在完整的JSP頁面中使用JSP動作語句INCLUDE使之成為JSP頁面的一個功能塊[9]。本系統(tǒng)的JSP頁面都放在webcontent文件夾下,

并且根據(jù)各自功能而命名,如日記修改JSP文件叫editDiary.jsp、分類編輯JSP文件叫editKind.jsp。

其次是控制層。由于主要使用Struts框架來實現(xiàn)MVC模式的設(shè)計,控制層主要是在webcontent下WEB-INF文件夾中的web.xml和struts-config.xml(見附錄)來實現(xiàn)整個系統(tǒng)的邏輯跳轉(zhuǎn)(具體內(nèi)容見附錄)。當然在這之前必須把struts的外部jar包放到web-inf下的lib文件夾中,這樣在寫java類時直接繼承struts的相關(guān)類便可實現(xiàn)商業(yè)邏輯了。

再次是模型層。一個好的項目必然有一個好的軟件結(jié)構(gòu),在建立JAVA類之前,根據(jù)項目不同的功能先建立各自的類包很關(guān)鍵,這樣能使在開發(fā)的時候不會因為找不到相關(guān)的類而暈頭轉(zhuǎn)向[10]。本系統(tǒng)一共建立了6個包,分別是my.bean,my.dao,my.action,my.form,my.util,my.base。下面分別對各個包里面類的作用進行簡單的介紹。

My.bean:主要是存放Javabean類,主要包括和數(shù)據(jù)庫中數(shù)據(jù)表的字段相對應(yīng)的屬性和賦值取值方法。為數(shù)據(jù)操作對象對數(shù)據(jù)進行操作時提供盛放數(shù)據(jù)的容器。

My.dao:數(shù)據(jù)操作對象包。沒個類中都對應(yīng)相關(guān)數(shù)據(jù)表的所有數(shù)據(jù)增刪查改操作方法。

My.action:嚴格來說這個包里的類應(yīng)該屬于控制層。和struts-config.xml文件聯(lián)合作用。該包的類全部繼承自struts包中的Action類。通過復(fù)寫execute()方法來實現(xiàn)業(yè)務(wù)邏輯。

My.form:表單類,所有從頁面提交的表單,通過struts-config.xml文件關(guān)聯(lián)后都能和此包中的類進行自動匹配。本包中類的結(jié)果類似于bean,只不過所有屬性都是和表單中的參數(shù)名對應(yīng)的。在創(chuàng)建相應(yīng)的賦值取值方法之外,如果表單需要驗證的話,必須復(fù)寫父類的validate()方法實現(xiàn)表單的驗證。

My.util:實用工具類。輔助類包,主要放一些重復(fù)使用次數(shù)較多的類文件。如數(shù)據(jù)庫連接類Conn。

My.base:基本類。里上一頁

[1]

[2]

[3]

[4]

[5]

[6]

下一頁

面存放和struts驗證機制和國際化相關(guān)聯(lián)的properties文件和用來解決頁面顯示亂碼問題的過濾器CharacterEncodingFilter類文件。(struts-config.xml和web.xml文件見附錄三)

系統(tǒng)需要的Mysql數(shù)據(jù)庫驅(qū)動類和struts外部包放在WebContent目錄下的WEB-INF中的lib文件夾下。

源程序的文件結(jié)構(gòu)視圖如圖3-6。

圖3-6

源程序的文件結(jié)構(gòu)視圖

4

主要功能模塊概述

4.1

用戶注冊模塊

4.1.1

流程分析

如果用戶要使用為系統(tǒng)提供的日志功能,那么在使用之前必須先注冊。注冊方式很簡單在首頁登陸模塊內(nèi)點擊進入注冊頁面。頁面中的用戶信息用戶名和密碼為必填項。若此兩項信息未正確填寫將返回到注冊頁面并且顯示錯誤信息。執(zhí)行入庫操作之前先查詢用戶名是否已經(jīng)存在,若已存在則返回注冊頁面顯示錯誤提示。為保障系統(tǒng)的安全性,用戶在注冊成功之后,需等待管理員審批。在審批通過之后方能成為正式用戶,使用該系統(tǒng)相關(guān)功能。用戶注冊過程活動圖如圖4-1。

圖4-1

用戶注冊過程

涉及該模塊文件分別為:register.jsp、

RegisterAction.java以及UserDAO.java。

4.1.2

文件設(shè)計

register.jsp文件:

按照下述內(nèi)容設(shè)計register.jsp文件。

表單名:form1。

表單執(zhí)行程序:register.jsp。

表單數(shù)據(jù)傳輸方法:post。

表單的要素如附錄一表1所示。

在structs-config.xml中actionMappings中配置如下:

<action

input="/register.jsp"

name="RegisterForm"

path="/register"

type="my.action.RegisterAction"

validate="true">

<forward

name="register.ok"

path="/index.jsp"/>

<forward

name="register.error"

path="/register.jsp"/>

</action>

//帶表單驗證類的action,input參數(shù)為表單證錯誤返回的頁面,name是接受頁面參數(shù)的表單類,path為頁面請求到服務(wù)器的路徑,type為處理請求的action類的路徑,forward為驗證成功與否的轉(zhuǎn)發(fā)路徑。

RegisterAction.java代碼如下:

package

my.action;

public

class

RegisterAction

extends

Action

{

public

ActionForward

execute(ActionMapping

mapping,

ActionForm

form,

HttpServletRequest

request,

HttpServletResponse

response)

{

UserBean

user

=

new

UserB

ean();

//聲明JavaBean

RegisterForm

rform

=

(RegisterForm)

form;

//從表單類中接過已驗證過的表單信息

user.setUsername(rform.getUsername());

user.setPassword(rform.getPassword());

user.setSex(rform.getSex());

user.setBorntime(rform.getYear()

+

"-"

+

rform.getMonth()

+

"-"

+

rform.getDay());

user.setEmail(rform.getEmail());

user.setIntroduce(rform.getIntroduce());

user.setRealname(rform.getRealname());

user.setTelNumber(rform.getTelNumber());

user.setStatus("0");

//賦值Bean中所有屬性

UserBean

database=new

UserDAO().findOne(user.getUsername());

//注冊之前檢查用戶名是否已經(jīng)存在,若存在則生成錯誤信息,反饋到注冊頁面

if(database!=null){

request.setAttribute("login.error",

"對不起,您的用戶名已經(jīng)被人使用,請重新輸入!");

return

mapping.findForward("register.error");

}

//所有驗證完成,將用戶信息入庫,成功則將成功信息反饋到首頁

int

n

=

new

UserDAO().insertUser(user);

if

(n

==

0)

{

return

mapping.findForward("register.error");

}

else

{

request.setAttribute("login.error",

"注冊成功,請等待審核!!");

return

mapping.findForward("register.ok");

}

}

}

4.2

用戶登陸模塊

4.2.1

用戶登陸流程分析

用戶在正確注冊之后,在后臺經(jīng)管理員審批,正式獲得日志系統(tǒng)的使用權(quán)限。在首頁輸入用戶名和密碼登陸系統(tǒng)。若用戶名和密碼有誤,將返回登陸頁,并顯示錯誤提示。用戶名和密碼無誤則成功登入系統(tǒng)。后臺系統(tǒng)中管理員登陸模塊與該模塊實現(xiàn)類似,本文不再敘述。用戶登陸過程活動圖如下圖4-2。

圖4-2

用戶活動過程

4.2.2

用戶登陸模塊文件設(shè)計

用戶登陸模塊主要有三個文件。負責(zé)視圖層的login.jsp和負責(zé)控制層的LoginAction.java和負責(zé)模型層的UserDAO.java和UserBean.java。

在structs-config.xml中actionMappings中配置如下:

<action

input="/index.jsp"

name="LoginForm"

path="/login"

type="my.action.LoginAction"

validate="true">

<forward

name="login.ok"

path="/user_index.jsp"/>

<forward

name="login.error"

path="/index.jsp"/>

</action>

其中模塊商業(yè)邏輯的主要部分LoginAction.java的代碼如下:

package

my.action;

public

class

LoginAction

extends

Action

{

public

ActionForward

execute(ActionMapping

mapping,

ActionForm

form,

HttpServletRequest

request,

HttpServletResponse

response)

{

LoginForm

userform=(LoginForm)form;

//獲取頁面表單信息

UserBean

bean=null;

bean=new

UserDAO().finduser(userform.getUsername(),

userform.getPassword());

//將用戶從登陸頁面輸入的用戶名和密碼與user表中用戶名與密碼核對,若不一致,生成錯誤信息,返回到登陸頁面

if(bean==null){

request.setAttribute("login.error",

"您還沒有注冊,請先注冊!");

return

mapping.findForward("login.error");

}else{

String

status=bean.getStatus();

if(status.equals("0")){

request.setAttribute("login.error",

"抱歉,您的帳戶正在審批中,暫時無法登陸!");

//若用戶名和密碼一致,再次核對用戶審批狀態(tài),未審批完成,生成提示信息并返回首頁

return

mapping.findForward("login.error");

}

List

kind=new

KindDAO().findKind(userform.getUsername());

List

diary=new

DiaryDAO().findDiaryByUser(bean.getUsername());

request.setAttribute("diary",

diary);

request.getSession().setAttribute("kind",

kind);

request.getSession().setAttribute("user",

bean);

return

mapping.findForward("login.ok");

}

}

}

4.3

日志管理模塊

4.3.1

日志管理功能模塊圖

4.3.2

設(shè)計思想及特點

注冊用戶登陸后進入日志管理頁面能對日志進行相關(guān)操作。具體來說,若用戶是第一次登陸,在添加日志之前系統(tǒng)會提示用戶先添加日志分類,所有日志均建立在分類之下的。在分類添加完成之后,用戶就能進入日志維護頁面對日志進行添加,刪除,修改操作了。值得注意的是在刪除分類時,用戶在刪除類別的同時,也把該類別下的所有日志刪除了。添加日志時用戶能夠通過設(shè)置日志狀態(tài)是否公開來決定是否讓日志被他人瀏覽,這樣能將優(yōu)秀的文章進行相互交流。

下面主要給出添加日志的活動圖和文件設(shè)計:

活動圖如下圖4-4。

圖4-4

添加日志活動圖

在structs-config.xml中actionMappings中配上一頁

[1]

[2]

[3]

[4]

[5]

[6]

下一頁

置如下:

<action

input="/addDiary.jsp"

name="AddDiaryForm"

path="/addDiary"

type="my.action.AddDiaryAction"

validate="true">

<forward

name="addDiary.ok"

path="/user_index.jsp"/>

<forward

name="addDiary.error"

path="/addDiary.jsp"/>

</action

>

控制器層主要文件AddDiaryAction.java源代碼如下:

package

my.action;

public

class

AddDiaryAction

extends

Action

{

public

ActionForward

execute(ActionMapping

mapping,

ActionForm

form,

HttpServletRequest

request,

HttpServletResponse

response)

{

HttpSession

session=request.getSession();

UserBean

user=(UserBean)session.getAttribute("user");

if(user==null){轉(zhuǎn)載于范文中國網(wǎng)

。

return

mapping.findForward("tohome.do");

}//驗證用戶是否已經(jīng)登陸,若沒登陸則為非法登入,返回首頁

AddDiaryForm

aform=(AddDiaryForm)form;

DiaryBean

diary=new

DiaryBean();

diary.setDiaryTitle(aform.getTitle());

diary.setContent(aform.getContent());

diary.setKindID(aform.getKind());

diary.setUserID(user.getUsername());

diary.setIsOpen(aform.getIsopen());

if(aform.getIsopen().equals("0")){

diary.setStatus("2");

}else{

diary.setStatus("0");

}

//接表單信息,并封裝到j(luò)vabean中

int

n=new

DiaryDAO().addDiary(diary);

//調(diào)用數(shù)據(jù)操作對象的add方法,將信息入庫,成功則返回到成功頁面

if(n!=0){

List

list=new

DiaryDAO().findDiary(diary.getKindID());

request.setAttribute("diary",

list);

return

mapping.findForward("addDiary.ok");

}else{

return

mapping.findForward("addDiary.error");

}

}

}

4.4

后臺用戶管理模塊

4.4.1

主要功能概述

該模塊主要是由查詢和顯示兩個子模塊組合而成。管理能通過在查詢模塊輸入用戶名、性別、聯(lián)系方式、真實姓名之后選擇操作進行查詢,在顯示模塊能根據(jù)用戶選擇的查詢方式和操作顯示不同的結(jié)果。管理員能在顯示頁面對用戶進行相應(yīng)操作。

選擇“停用”后頁面顯示結(jié)果如下圖4-5。

圖4-5

選擇“停用”后頁面顯示結(jié)果

4.4.2

查詢與分頁

在此模塊中最為關(guān)鍵的就是查詢與分頁功能的實現(xiàn)。本系統(tǒng)在設(shè)計時將此過程分兩步來實現(xiàn)的。第一步用SearchUserAction.java來處理查詢要求;首先接受頁面查詢參數(shù)生成查詢所有記錄的SQL語句,然后運用JAVA的String類的相關(guān)方法將SQL語句字符串進行處理,等到查詢總記錄數(shù)目的CountSQL語句,再次通過得到的記錄總數(shù)和每頁應(yīng)該顯示記錄條數(shù)計算得到顯示總頁數(shù),然后將SQL語句和頁數(shù)傳給第二步。第二步ShowUserAction.java負責(zé)顯示個分頁內(nèi)容。通過接受第一步所傳過來的SQL語句和總頁數(shù)生成新的光查該頁記錄數(shù)的SQL語句,再一次從數(shù)據(jù)庫中查詢出具體記錄并傳到j(luò)sp頁面將結(jié)果顯示出來。

該過程活動圖如圖4-6。

圖4-6

過程活動圖

在structs-config.xml中actionMappings中配置如下:

<action

path="/searchUser"

type="my.action.SearchUserAction">

<forward

name="search.ok"

path="/showUser.do?page=1"/>

</action>

<action

path="/showUser"

type="my.action.ShowUserAction">

<forward

name="show.ok"

path="/edit_user.jsp"/>

</action>

SearchUserAction.java源代碼:

package

my.action;

public

class

SearchUserAction

extends

Action

{

public

ActionForward

execute(ActionMapping

mapping,

ActionForm

form,

HttpServletRequest

request,

HttpServletResponse

response)

{

HttpSession

session=request.getSession();

AdminBean

admin=(AdminBean)session.getAttribute("admin");

if(admin==null){

return

mapping.findForward("tohome.do");

}

//管理員登陸驗證,若為非法登陸,則返回首頁

String

sql

=

this.createSql(request,

response);

//生成分頁之前的sql語句

String

countSql

=

this.getCountSql(sql);

//生成統(tǒng)計所有記錄數(shù)的sql語句

int

total

=

new

UserDAO().getUserNum(countSql);

//調(diào)用數(shù)據(jù)操作對象,統(tǒng)計所有記錄數(shù)

int

pageNumber

=

1;

int

perPageNumber

=

7;

pageNumber

=

this.getPageNumber(total,

perPageNumber);

//調(diào)用統(tǒng)計頁數(shù)方法,獲得總頁數(shù)

request.getSession().setAttribute("u.pageNumber",

pageNumber);

request.getSession().setAttribute("u.perPageNumber",

perPageNumber);

request.getSession().setAttribute("u.sql",

sql);

return

mapping.findForward("search.ok");

}

//將所有分頁信息放入session對象,并分發(fā)至顯示處理類

//生成統(tǒng)計記錄數(shù)的sql語句的方法

private

String

getCountSql(String

sql)

{

String

temp

=

sql.substring(sql.indexOf("from")

-

1);

temp

=

"select

count(*)

"

+

temp;

return

temp;

}

//生成頁數(shù)

private

int

getPageNumber(int

total,

int

numPerPage)

{

int

pageNumber

=

0;

if

(total

%

numPerPage

==

0)

{

pageNumber

=

total

/

numPerPage;

}

else

{

pageNumber

=

(total

/

numPerPage)

+

1;

}

return

pageNumber;}

}

ShowUserAction.java的源代碼:

package

my.action;

public

class

ShowUserAction

extends

Action

{

public

ActionForward

execute(ActionMapping

mapping,

ActionForm

form,

HttpServletRequest

request,

HttpServletResponse

response)

{

HttpSession

session=request.getSession();

AdminBean

admin=(AdminBean)session.getAttribute("admin");

if(admin==null){

return

mapping.findForward("tohome.do");

}

//登陸驗證

List

list=new

ArrayList();

Integer

page=Integer.parseInt(request.getParameter("page"));

session.setAttribute("u.flag",

"1");

Integer

pageNumber=(Integer)session.getAttribute("u.pageNumber");

Integer

perPageNumber=(Integer)session.getAttribute("u.perPageNumber");

//從session中取出分頁信息

if(pageNumber!=0){

if(page<1||page>pageNumber){

return

mapping.findForward("tohome.do");

}

//驗證當前頁是否非法,若是,返回首頁

String

sql=(String)session.getAttribute("u.sql");

if(sql!=null){

sql+="

limit

"+((1)*perPageNumber+1)+","+perPageNumber;

}

//拼接sql語句得到顯示當前頁的sql

list=new

UserDAO().finduser(sql);

}

else{

if(page!=1){

return

mapping.findForward("tohome.do");

}

}

if(list!=null||list.size()>0){

request.setAttribute("list",

list);

return

mapping.findForward("show.ok");

}else{

return

mapping.findForward("show.error");

}

//若list長度大于0則分發(fā)至顯示頁面,否則生成錯誤信息返回

}

}

5

系統(tǒng)測試

系統(tǒng)在投入使用之前必須進行嚴格的測試,測試的內(nèi)容包括功能測上一頁

[1]

[2]

[3]

[4]

[5]

[6]

下一頁

試、性能測試、可用性測試、客戶端兼容性測試、安全測試等。測試完成后要上交測試報告,我們可以根據(jù)測試報告及時發(fā)現(xiàn)問題并提出解決方案,便于系統(tǒng)的維護與升級。

迄今為止,軟件質(zhì)量仍然主要靠軟件測試來驗證和確認,而且由于測試工作特別耗費資源,在軟件開發(fā)的總成本中,用在測試上的開銷要占30%到50%。在極端的情況下,例如在關(guān)系到人的生命安全的軟件中(如飛機控制或核反應(yīng)監(jiān)控等軟件),測試費用可能相當軟件生存周期所有其它階段費用總和的三到五倍。此外,據(jù)美國工業(yè)界的統(tǒng)計,對商品化的程序來說,測試在時間和費用兩方面的花費都要占整個軟件開發(fā)周期總開銷的50%左右。

但軟件測試并不是質(zhì)量保證的“安全網(wǎng)”。因此,我們應(yīng)該從兩個方面來保證和提高軟件質(zhì)量:首先,應(yīng)盡量在開發(fā)期間減少錯誤,通過軟件過程來建立軟件質(zhì)量;次之,應(yīng)通過分析和測試來發(fā)現(xiàn)和修復(fù)軟件產(chǎn)品中殘存的錯誤。

經(jīng)過初步測試,系統(tǒng)在服務(wù)器上運行正常,對于不同顯示分辨率下網(wǎng)頁也能夠正常顯示而且網(wǎng)頁的鏈接正確。系統(tǒng)各個基本功能都能順利實現(xiàn),沒有發(fā)現(xiàn)重大系統(tǒng)錯誤。但是由于時間短促和設(shè)計者能力有限,在日志和新聞顯示中效果不是很理想,另外頁面美工效果一般。各個功能的可擴展性,如能在日志添加相冊功能,在公開文章中加入留言功能等,還有待進一步實現(xiàn)。

附錄一:

1

register.jsp表單設(shè)計

表單要素說明

表單要素名稱

表單要素性質(zhì)

用戶名

Username

文本框(必填項)

密碼

Password

文本框(密碼域、必填項)

確認密碼

passconfirm

文本框(密碼域、必填項)

真實姓名

realname

文本框

出生年月

Year,month,day

下拉菜單

性別

sex

下拉菜單

聯(lián)系方式

telnumber

文本框

Email地址

email

文本框

提交按鈕

Submit2

按鈕(類型為submit)

重置按鈕

Reset2

按鈕(類型為reset)

2

用戶數(shù)據(jù)表結(jié)構(gòu)

(1)用戶表

表2

users

數(shù)據(jù)表結(jié)構(gòu)

字段名

字段類型

字段含義

主外鍵約束

Username

varchar

用戶名

主鍵

userpass

varchar

密碼

sex

char

性別

realname

varchar

真實姓名

borntime

varchar

出生年月

status

char

審批狀態(tài)

telnumber

varchar

聯(lián)系方式

email

varchar

郵箱地址

introduce

text

自我介紹

(2)管理員表:

表3

admin

數(shù)據(jù)表結(jié)構(gòu)

字段名

字段類型

字段含義

主外鍵約束

Admin_name

varchar

用戶名

主鍵

Admin_pass

varchar

密碼

(3)日志表:

表4

diary

數(shù)據(jù)表結(jié)構(gòu)

字段名

字段類型

字段含義

主外鍵約束

diaryID

integer

ID,自動編號

主鍵

Title

varchar

標題

kindID

integer

所屬類別

外鍵關(guān)聯(lián)表kind

Username

varchar

發(fā)布人

外鍵關(guān)聯(lián)users

Content

text

內(nèi)容

Createtime

datetime

創(chuàng)建時間

Updatetime

datetime

更新時間

Status

char

狀態(tài)

isopen

char

是否公開

(4)公告表:

表5

gonggao

數(shù)據(jù)表結(jié)構(gòu)

字段名

字段類型

字段含義

主外鍵約束

Id

integer

ID,自動編號

主鍵

Title

varchar

標題

Content

text

內(nèi)容

updatetime

datetime

更新時間

(5)日志類別表:

表6

kind

數(shù)據(jù)表結(jié)構(gòu)

字段名

字段類型

字段含義

主外鍵約束

Kindid

integer

ID,自動編號

主鍵

Kindname

varchar

類別名稱

Username

varchar

創(chuàng)建人

外鍵關(guān)聯(lián)users

(6)新聞表:

表7

news

數(shù)據(jù)表結(jié)構(gòu)

字段名

字段類型

字段含義

主外鍵約束

newsid

int

ID,自動編號

主鍵

Title

varchar

標題

Content

text

內(nèi)容

Createtime

datetime

更新時間

address

datetime

轉(zhuǎn)載地址

附錄二:

Web.xml文件

<?xml

version="1.0"

encoding="UTF-8"?>

<web-app

id="WebApp_ID"

version="2.4"

xmlns="/xml/ns/j2ee"

xmlns:xsi="/2001/XMLSchema-instance"

xsi:schemaLocation="/xml/ns/j2ee

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論