醫藥銷售管理系統軟件說明書_第1頁
醫藥銷售管理系統軟件說明書_第2頁
醫藥銷售管理系統軟件說明書_第3頁
醫藥銷售管理系統軟件說明書_第4頁
醫藥銷售管理系統軟件說明書_第5頁
已閱讀5頁,還剩28頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、醫藥銷售管理系統1 系統分析31.1 開發背景31.2 需求分析32 系統設計32.1 系統目標32.2 系統功能結構42.3 系統流程圖43 軟件架構63.1 邏輯分層結構設計63.2 系統文件夾組織結構73.3 實體對象設計73.4 定義ActionForm83.5 持久層結構設計83.6 業務層結構設計103.7 頁面結構設計114 配置文件114.1 配置web.xml114.2 配置struts-config.xml124.3 配置hibernate.cfg.xml125 實體及映射125.1 藥品實體映射125.2 藥品類別實體映射135.3 銷售明細實體映射135.4 用戶實體映

2、射146 公共類設計146.1 Hibernate過濾器146.2 SupperDao類166.3 BaseAction類176.4 DeleteAction類186.5 字符串工具類187 國際化187.1 國際化資源文件187.2 國際化實現198 系統登陸模塊198.1 查詢用戶198.2 登陸請求198.3 登錄頁面199 藥品類別信息管理209.1 藥品類別持久層設計209.2 藥品類別的添加219.2.1 類別添加、修改請求處理219.2.2 類別添加頁面219.3 分頁查看類別信息219.3.1 查詢與刪除請求處理229.3.2 類別信息列表頁面229.4 類別的修改與刪除229

3、.5 藥品類別統計229.5.1 JFreeChat工具類239.5.2 Action請求239.5.3 顯示報表2310 藥品信息管理2310.1 藥品對象持久層設計2410.2 藥品信息的添加與修改2410.2.1 藥品添加的請求處理2410.2.2 藥品添加頁面2510.3 分頁查看所有藥品2510.4 查看藥品詳細信息2510.5 模糊查詢藥品2610.5.1 藥品模糊查詢請求處理2610.5.2 藥品模糊查詢頁面2610.6 高級查詢2710.7 查看庫存2710.8 藥品批量刪除2710.8.1 批量刪除請求處理2810.8.2 映射JSP頁面中的按鈕2811 購買藥品2811.1

4、 選購藥品2811.2 結賬2912 銷售管理2912.1 明細信息查詢2912.2 銷售排行統計3013 進貨/需求管理3014 系統管理3114.1 添加管理員3114.2 修改密碼3214.3 系統初始化3215 運行項目321 系統分析隨著計計算機技術的不斷發展,應用軟件迅速普及,大到廠礦校企,小到圖書、餐飲、醫藥管理等,隨處都可看到它的身影。在以往依靠人工為主的醫藥銷售管理方面,計算機和計算機系統逐步唱起了主角,憑借省時、省力、低誤差等優點,從根本上改變了醫藥管理的傳統模式,節省了物理資源,提高了工作效率。1.1 開發背景XX醫藥抄手坐落于XX小區內,多年來本著經濟、實惠、高質量服務

5、的宗旨,贏得了小區百姓的信賴,藥品供應量非常大。面對龐大的信息量,經常出現統計失誤、藥量供應不足的情況,醫藥超市經理決定使用一套合理、有效、使用的管理系統,對醫藥超市進行統一的管理。筆者受醫藥超市經理委托,開發一個醫藥銷售管理系統,其宗旨是實現醫藥超市管理的系統化、規范化、實用化,對藥品進行統一管理。1.2 需求分析在日常醫藥管理中,面對眾多的藥品和眾多不同需求的顧客,每天都會產生大量的數據信息。以傳統的手工方式來處理這些信息,操作比較繁瑣,且效率低下。此時,一套合理、有效、實用的醫藥銷售管理系統就顯得十分必要。利用其提供的藥品查詢、統計功能,可以進行高效的管理,更好地為顧客服務。筆者通過對醫

6、藥超市的實地考察,從經營者和消費者的角度出發,以高效管理、快速滿足消費者為原則,要求本系統具有以下特點。 具有良好的系統性能、友好的用戶界面。 較高的處理效率,便于用戶使用。 采用成熟的技術開發,全系統具有較高的技術水平和較長的生命周期。 對銷售信息進行統計排行 盡可能地簡化藥品管理員的重復工作,提高工作效率。2 系統設計2.1 系統目標根據醫藥超市的管理要求,指定醫藥銷售管理系統目標如下。 靈活的人機交互界面,操作簡單方便、界面簡潔美觀。 系統提供中、英文語言,實現國際化 藥品分類管理,并提供類別統計功能。 實現各種查詢,如多條件查詢、模糊查詢等。 提供創建管理員賬戶及修改口令功能。 可對系

7、統銷售信息進行統計分析。 系統運行穩定、安全可靠。2.2 系統功能結構醫藥銷售管理系統提供了四大功能,分別為“基本信息管理”、“進貨/需求管理”、“藥品管理”、“系統管理”,具體結構如圖1.1所示醫藥銷售管理系統基本信息管理進貨/需求管理藥品銷售管理系統管理藥品信息管理藥品類別管理庫存信息查看藥品需求管理藥品進貨管理銷售明細管理銷售排行統計銷售時間統計系統初始化管理員帳號管理圖1.1 醫藥銷售管理系統功能結構圖2.3 系統流程圖醫藥銷售管理系統流程如圖1.2所示。管理員登錄醫藥銷售管理系統管理員進貨/需求管理基本信息管理藥品銷售管理系統管理藥品信息管理刪除藥品藥品類別管理查詢藥品修改藥品添加藥

8、品修改類別查詢類別刪除類別添加類別修改需求查詢需求刪除需求添加需求銷售排行統計查詢銷售明細當日銷售明細庫存修改系統初始化查詢管理員密碼修改添加管理員類別統計圖1.2 醫藥銷售管理系統流程圖3 軟件架構在開發項目前,首先要對軟件的結構進行設計,也稱之為軟件架構。此過程是對軟件整體結構的設計,如軟件的邏輯分層結構、結構的實現、數據庫等,特別是在Java的大型項目中,還需要設計出程序中的包結構及接口等,非常復雜,需要程序員進行全面的考慮。對于醫藥銷售管理系統的整體涉及如下:3.1 邏輯分層結構設計醫藥銷售管理系統由4層結構組成,并遵循MVC結構進行設計。4層結構分別為表示層、業務邏輯層、持久層與數據

9、庫層,如圖1.3所示。醫藥銷售管理系統表示層(Struts框架)業務邏輯層(Struts框架)持久層(Hibernate框架)數據庫層(MySQL數據庫)圖1.3 邏輯分層其中,表示層與業務邏輯層均由Struts框架組成,表示層用于提供程序與用戶交互的界面,項目中主要通過JSP、ActionForm及Struts標簽庫進行展現;業務邏輯層用于處理程序中的各種業務邏輯,項目中通過Struts框架的中央控制器及Action對象對業務請求進行處理;持久層由Hibernate框架組成,負責應用程序與關系型數據庫之間的操作;數據庫層為應用程序所使用的數據庫,本實例中為MySQL數據庫。對于4層結構的具體

10、實現如圖1.4所示。醫藥銷售管理系統視圖JSP、ActionForm、Struts標簽控制器Action、struts-config.xml持久化Hibernate API、Hibernate.cfg.xmlMySQL數據圖1.4 邏輯分層實現3.2 系統文件夾組織結構規范系統的整體架構是一個項目開發的標準,特別是在團隊開發項目中,在編寫代碼之前,必須定制好項目的系統文件夾組織結構,以使程序條理清晰,利于后期的項目整合。在Java項目中可以將不同作用、功能相類似的文件放置于同一個包中,這樣既可以保證團隊開發的一致性,又可以將系統的整體結構規范化。創建完系統中可能用到的文件夾或Java包之后,在

11、開發時只需將所創建的類文件或資源文件保存到相應的文件夾即可。醫藥銷售管理系統的文件夾組織結構如圖1.5所示。圖1.5 醫藥銷售管理系統的文件夾組織結構3.3 實體對象設計在應用Hibernate框架的項目中,實體對象的確立是其中的關鍵。實體對象與數據庫中的數據表相對應,并通過O/R映射建立實體與數據庫的聯系,Hibernate完全通過操作實體來操作數據庫,所以首先要確定項目中的實體對象。在醫藥銷售管理系統中,實體對象及關系如圖1.6所示。圖1.6 醫藥銷售管理系統中的實體對象及其關系從圖1.6中可以看到,藥品實體對象為Medicine類,藥品類別實體對象為Category類,銷售明細實體為Se

12、llDetail類,操作用戶實體為User類,這4個實體對象為醫藥銷售管理系統的核心實體對象,它們所對應的映射文件均為“類名+hbm.xml”文件。其中,藥品信息與藥品類別為多對一關聯關系,一個類別中包含多個藥品對象;藥品信息與銷售明細為一對多關聯關系,多個銷售明細對應一個藥品對象;銷售明細與用戶之間為多對多的關聯關系,多個銷售明細信息對應多個操作用戶。3.4 定義ActionFormActionForm是簡單的JavaBean,主要用來保存用戶所輸入的表單數據,Action要獲取這些數據需要通過ActionForm對象進行傳遞。ActionForm對表單的數據進行了封裝,在JSP頁面與Act

13、ion對象中提供了交互訪問的方法。在使用過程中,可通過繼承org.apache.struts.action.ActionForm對象來創建需要的ActionForm對象,項目中所涉及到的ActionForm對象如圖1.7所示。圖1.7 項目中所涉及到的ActionForm對象3.5 持久層結構設計持久層結構通過Hibernate框架進行設計。由于Hibernate對不同對象的增、刪、改、查等操作具有一定的共性,如添加數據使用save()方法、刪除數據使用delete()方法等,項目中將這些具有共性的操作抽取出來,封裝成一個類,其他數據庫操作對象可繼承此類來擁有這些方法,從而減少程序中的多余代碼

14、,如圖1.8所示。圖1.8 持久層結構SupperDao類為所有數據庫操作對象的父類,在此類中定義了對數據庫進行操作的常用方法,具體方法及說明如表1.1所示。表1.1 SupperDao方法及說明方法說明save()用于保存一個對象saveOrUpdate()用于保存或更新一個對象delete(Object obj)用于刪除一個對象,入口參數為Object類型findByHQL()通過HQL語句查詢數據,入口參數為String類型的HQL語句deleteByHQL()通過HQL語句刪除數據,入口參數為String類型的HQL語句uniqueResult()單值檢索數據,入口參數hql為HQL查

15、詢語句、where為查詢條件findPaging()分頁查詢數據,入口參數hql為HQL查詢語句、offset為結果集的起始位置、length為返回結果集的條目數、where為查詢條件這些方法均為數據庫操作的常用方法,所以將其封裝在單獨的一個類中,對于各個對象的數據庫相關操作,可通過繼承此類來獲取這些常用方法。其子類對象有CategoryDao類、MedicineDao類、SellDao類、UserDao類,其功能分別介紹如下。CategoryDao類:藥品類別數據庫操作對象,用于封裝與藥品類別相關的數據庫操作方法。MedicineDao類:藥品信息數據庫操作對象,用于封裝與藥品信息相關的數據

16、庫操作方法。SellDao類:藥品銷售數據庫操作對象,用于封裝與藥品銷售相關的數據庫操作方法。UserDao類:用戶數據庫操作對象,用于封裝與管理員及系統相關的數據庫操作方法。3.6 業務層結構設計業務層結構主要通過Struts框架進行設計,由Struts的中央控制器對各種操作請求進行控制,并通過相應的Action對其進行業務處理,項目中所用到的Action對象及關系如圖1.9所示。圖1.9 Action對象及關系Action、DispatchAction與LookUpDispatchAction為Struts封裝的Action對象,具有不同的特點及作用,項目中通過繼承這幾個對象實現對不同業務

17、請求的處理。除這3個對象外,圖1.9中其余的Action對象均為自定義的Action對象。在這些自定義的Action對象中,LanguageAction與LoginAction用于處理國際化語言及用戶登錄操作。由于二者不涉及過多的業務邏輯,它們都直接繼承于Action對象。BaseAction對象與DeleteAction對象為重要的Action對象,二者都繼承了DispatchAction對象。項目中封裝這兩個對象的目的在于簡化程序中的業務邏輯、提高程序的安全性。在這兩個對象中均對用戶登錄身份做出了嚴格的驗證,其子類對象通過繼承不必再考慮用戶登錄的安全問題,而更專注于業務邏輯,同時通過繼承還

18、可以減少程序的代碼量。其中BaseAction對象的子類及作用如表1.2所示。表1.2 BaseAction對象的子類及其作用子類作用SellAction封裝藥品銷售的相關操作,處理封裝藥品銷售請求SystemAction封裝系統相關操作,處理系統級的請求CategoryAction封裝藥品類別相關操作,處理藥品類別相關操作MedicineAction封裝藥品信息相關操作,處理封裝藥品信息的相關請求RequireAction封裝藥品需求及庫存相關操作,處理藥品需求相關請求DeleteAction對象繼承了LookUpDispatchAction對象,此類通過重寫getKeyMethodMap(

19、)方法對數據進行批量刪除操作,其子類對象及其作用如表1.3所示。表1.3 DeleteAction對象的子類及其作用子類作用DeleteMedicineAction封裝藥品信息刪除操作,用于批量刪除藥品信息DeleteReqMedAction封裝藥品需求信息刪除操作,用于批量刪除藥品需求信息3.7 頁面結構設計醫藥銷售管理系統的頁面結構采用框架進行設計,通過HTML語言中的<frameset>標簽及<frame>標簽將頁面分成3個部分,分別為頁面頭部、頁面導航及內容頁面,如圖1.10所示。圖1.10 頁面布局此種布局方式將每一個頁面單獨置于一個框架之中,其中“頁面頭部”

20、和“頁面導航”在登錄之后是固定不變的,對于用戶的操作將在“內容頁面”顯示結果。使用這種方式的有點在于:(1)避免了JSP頁面中大量引用<include>動作標簽。(2)避免瀏覽器反復加載“頁面頭部”及“頁面導航”等同樣的內容,加快瀏覽器速度。4 配置文件在編寫代碼之前,需要做一些準備工作,如項目環境的搭建、項目所涉及到的第三方類庫的支持、web.xml的配置等。在醫藥銷售管理系統中,主要涉及到Struts框架、Hibernate框架及JFreeChart組件的應用,因此在項目開發之前,需要添加其類庫支持。4.1 配置web.xmlweb.xml文件是Web項目的配置文件,在醫藥銷售

21、管理系統中,此文件需要配置Struts框架、JFreeChart組件和過濾器等信息。4.2 配置struts-config.xmlStruts框架實現了MVC模式,web.xml和struts-config.xml文件是其兩個重要的配置文件,其中web.xml文件實現了Struts的初始化加載,而struts-config.xml是它的核心配置文件。Struts-config.xml所做的工作比較多,包括ActionForm對象的定義、用戶請求和Action之間的映射、異常處理等重要的配置。其中<form-beans>標簽用于注冊實例中所涉及到的ActionForm對象,<g

22、lobal-forwards>標簽用于設置全局跳轉,<action-mappings>標簽配置用戶請求Action對象的映射。4.3 配置hibernate.cfg.xmlHibernate.cfg.xml文件是Hibernate的配置文件,在項目中,此文件配置了數據庫的方言、數據庫鏈接信息、自動建表屬性和打印SQL語句等屬性。5 實體及映射Hibernate是一個ORM產品,它完全可以操作對象的方式進行數據庫操作,其實體對象與數據表之間通過映射文件建立映射關系。因此,在醫藥銷售管理系統中需要建立實體對象與數據表之間的映射。5.1 藥品實體映射藥品實體對象的持久化類為Medi

23、cine類,此類封裝了藥品相關屬性提供相應的getXX()和setXXX()方法。藥品對象與藥品類別對象為多對一關聯關系,所以在Medicine類中加入了藥品類別屬性category,其關聯關系通過映射文件Medicine.hbm.xml進行映射。映射文件Medicine.hbm.xml將實體對象Medicine映射為tb_medicine表,主鍵的生成策略采用自動生成方式。此映射文件中,對于數據表的部分字段還通過not-null、length、unique等屬性映射字段的屬性,其中not-null用于映射字段的非空屬性、length用于映射字段的長度、unique用于映射字段是否唯一。映射后

24、的數據表如圖1.11所示。圖1.11 tb_medicine表5.2 藥品類別實體映射藥品類別實體用于封裝藥品類別屬性信息,其持久化類為Category類,與藥品對象存在一對多關聯關系。藥品對象與藥品類別對象為多對一關聯關系,但從藥品類別一端來看,藥品類別對象與藥品對象又是一對多的關系,所以程序中采用了多對一雙向關聯進行映射。藥品類別實體對象的映射文件為Category.hbm.xml。Category類所映射的數據表為tb_category,其中<ser>標簽用于映射藥品類別實體與藥品實體間的一對多關聯關系,此種映射方式將在藥品數據表中添加categoryId字段。映射后的數據表

25、tb_category如圖1.12所示。圖1.12 tb_categoy表5.3 銷售明細實體映射銷售明細用于描述藥品銷售時的具體情況,如銷售時間、銷售人員、銷售數量等。這些信息十分重要,需要記錄到數據庫中,實例中將其封裝為SellDetail類。為了方便查看銷售明細的總額信息,在SellDetail類中加入了sellTotal()屬性,此屬性并不進行數據表的映射,它只有一個與之對應的get()方法,在此方法中通過單價與數量的運算對sellTotal進行賦值,并將其返回。銷售明細實體的映射文件為SellDetail.hbm.xml,此映射文件中映射了兩個多對一關聯關系,分別為與藥品對象的多對一

26、關系及操作用戶間的多對一關系。銷售明細實體映射的數據表為tb_selldetail。在映射文件SellDetail.hbm.xml中,通過兩個<many-to-one>標簽分別映射與藥品對象及操作用戶的多對一關聯關系,并配置了級聯操作類型為save-update。映射后的數據表結構如圖1.13所示。圖1.13 tb_selldetail表5.4 用戶實體映射在醫藥銷售管理系統中,用戶實體用于封裝管理員的基本信息,如登錄的用戶名、密碼等屬性,其類名為User。User類中屬性相對較少,其映射過程也相對簡單。其映射文件為User.hbm.xml。用戶實體所映射的數據表為tb_user,

27、其結構如圖1.14所示。圖1.14 tb_user表6 公共類設計在Java程序開發中,如果一個功能反復被調用,則可將該功能抽取出來封裝為一個類作為公共類,在需要此功能的地方通過此類進行實現。公共類實質是代碼的重用的一種方式,在面向對象的開發模式中經常使用它來簡化程序中的代碼,提高程序的可讀性。下面是醫藥銷售管理系統找那個的公共類設計。6.1 Hibernate過濾器在沒有使用Spring管理Hibernate的情況下,對Hibernate的管理仍然存在一定的難度,特別是在J2EE開發中,線程安全、SessionFactory對象、Session對象、Hibernate緩存及延遲加載等是程序設

28、計中的難題,管理不當將會對程序造成極為嚴重的影響。在醫藥銷售管理系統中,將SessionFactory對象、Session對象置于過濾器中,由過濾器對其進行管理,從而解決了這些問題。在Web項目中,以普通方式使用Hibernate將無法解決Hibernate延遲加載,如圖1.15所示。當有一個業務請求查詢數據時,首先要開啟Session對象,然后Hibernate對數據進行查詢。在關閉Session對象,最后通過JSP頁面來顯示數據。在這一過程中,如果查詢數據時使用了延遲加載,當JSP頁面顯示數據信息時,Hibernate將拋出異常信息,因為此時Session對象已經關閉,Hibernate不

29、能再對數據進行操作。開啟Session查詢數據(Lazy)關閉SessionJSP頁面業務請求圖1.15 普通方式通過過濾器管理Hibernate的Session對象則可以避免此問題,其實現過程如圖1.16所示。業務請求Init()方法初始化SessionFactorydoFilter()過濾處理業務處理destroy()方法銷毀SessionFactoryJSP頁面SessinFactory關閉SessionResponseResponseRequestRequest圖1.16 Hibernate過濾器在Web容器啟動時,過濾器被初始化,它將執行init()方法,在后續的操作中不會再次被執行

30、;而當容器關閉時,過濾器將執行destroy()方法。這兩個方法恰好符合SessionFactory對象的生命周期,在運行期間只執行一次操作,可用于實例化及銷毀SessionFactory對象。對于Session對象的關閉操作,可以在業務邏輯處理結束后、response請求轉發大View層之前進行。實例將其封裝在HibernateFilter類中,此類繼承了Filter類,它是一個過濾器。為了保證線程的安全性,實例中將Session對象存放與ThreadLocal對象中,當用到一個Session對象時,首先從ThreadLocal中獲取,在無法獲取的情況下才會開啟一個新的Session對象。同

31、時,為了保證Session對象能在resopnse請求轉發到View層之前被關閉,實例采取了tryfinally語句對Session對象進行關閉。6.2 SupperDao類SupperDao類為項目中所有數據庫操作類的父類,此類封裝了數據庫操作的常用方法。在此類中,由于Hibernate對數據的操作都需要用到Session接口,類中定義了一個protected類型的Session對象,為其子類提供了方便。save()方法及savaOrUpdate()方法都用于保存一個對象,其入口參數均為Object類型。其中saveOrUpdate()方法比save()方法更智能一些,可以根據實體對象中的標

32、識值來判斷保存還是更新操作。SupperDao類中使用這兩個方法對實體對象進行保存及更新操作。刪除操作的方法為delete(),入口參數為Object類型,此方法通過Session接口的delete()方法進行實現。SupperDao類為項目中所有數據庫操作類的父類,在設計時應當考慮全面。Hibernate的HQL查詢語言提供了更為靈活的查詢方式,在這個超類之中應該加入HQL的操作方法,其中findByHQL()方法用于根據指定的HQL查詢語句查詢結果集,deleteByHQL()方法用于根據指定的HQL查詢語句進行刪除操作。Hibernate單值檢索在查詢后返回單個對象,當返回的結果包含多條

33、數據時,Hibernate將拋出異常。此種操作可用于查詢單條數據,如聚合函數count()等。在SupperDao類中,單值檢索的方法為uniqueResult()。此方法的入口參數為HQL查詢語句及查詢條件,其中查詢條件為Object數組類型,用于裝載查詢語句中的參數。例如HQL語句“from Medicine m where m.id=?”,此時即可通過參數where對其進行動態賦值。分頁查詢在程序開發中經常用到,不但方便查看,還可以減少結果集的返回數量,提高數據訪問效率。使用Hibernate的分頁查詢方法極為簡單,只需要傳入幾個參數即可,但在SupperDao類中對其進行了擴展,加入了

34、HQL語句的動態賦值,其方法名為findPaging()。此方法入口參數有4個,其中參數hql為HQL查詢語句,它允許傳入參數中帶有占位符“?”的HQL語句;參數offset為查詢結果集對象的起始位置;參數length為查詢結果的偏移量,也是返回數據的條目數;參數where為查詢條件,屬于Object數組類型,用于裝載HQL語句中的參數。通過上述這幾個參數基本可以滿足項目中所有的分頁查詢,當然遇到特殊情況時,可以通過子類對象重寫此方法。6.3 BaseAction類BaseAction類是業務層,有一個超類對象,它繼承了Struts的DispatchAction類,同時還為子類對象提供公用方法

35、。此類首先定義了3個protected類型的變量,分別用于設置每頁的記錄數、本地語言信息及國際化消息資源。Struts的DispatchAction類繼承了Action類,此類處理請求時首先要執行execute()方法,然后通過控制器再轉發到相應的方法進行業務處理。根據這一分析,可以在execute()方法中對用戶的身份作出驗證,其實現過程如圖1.17所示。業務請求一業務請求三業務請求二業務請求四業務處理二業務處理三業務處理一業務處理四Execute()方法驗證用戶身份錯誤處理驗證失敗驗證成功驗證成功圖1.17 用戶身份驗證如果對系統中涉及到的Action均編寫一個驗證方法,則程序代碼的重復性

36、太高,不能體現出面向對象的設計模式,所以需將其單獨封裝在BaseAction類中,此類通過重寫Action類的execute()方法對用戶身份進行驗證。由于分頁查詢的應用比較多,所以在業務層將其封裝在BaseAction類中,通過getPage()方法進行實現,子類對象可以通過繼承來獲取此方法。getPage()方法返回一個Map集合對象,該集合用于裝載結果集及分頁條。其中,結果集對象為一頁中的所有數據集合,它是一個List對象;分頁條為分頁查詢后在JSP頁面所顯示的分頁信息,如記錄數、頁碼、上一頁、下一頁的超鏈接等,它是一個String類型的字符串。 getPage()方法的入口參數有四個,

37、其中參數hql為分頁查詢的HQL語句,此語句不可以包括select子句,它從from子句開始,可以傳入帶有占位符的HQL,但需要通過查詢條件參數where傳遞占位符的值,當HQL語句沒有參數時,where參數可以設置為null;參數recPerPage為每一頁的記錄數;currPage為當前的頁碼;action為分頁所請求的Action地址。getPage()方法提供這些參數的目的在于提高程序代碼的重用性,因為在醫藥銷售管理系統中,通過這些參數,getPage()方法已滿足所有的分頁查詢,用到分頁查詢的地方都調用了此方法。此外,在其他項目中此方法的重用價值也是非常高的。分頁查詢在業務層的實現比

38、較繁瑣,因為在分頁條中要考慮到國際化的實現,所以在分頁條中所有文字信息均通過MessageResources對象讀取國際化資源文件來獲取。MessageResources對象是Struts中的對象,此對象根據Locale信息讀取相應的國際化消息資源文件。6.4 DeleteAction類公共類DeleteAction主要用于對項目中LookupDispatchAction的請求進行處理。它繼承了LookupDispatchAction類,重寫了execute()方法對用戶的身份作出驗證,當用戶身份驗證失敗時將進行錯誤處理;同時,此類還重寫了LookupDispatchAction類中的getK

39、eyMethodMap()方法,添加了兩個按鈕對象的key。6.5 字符串工具類在一個Web項目中,字符串是經常被操作的對象。為了簡化程序的代碼及提高程序的可讀性,對于經常用到的字符串處理方法,可以封裝一個字符串工具類對其進行操作。例如JSP頁面的多選框,它提交的參數值為數組類型,在數據庫的操作過程中需要將其轉換為字符串類型;在超鏈接中,如果加入中文參數將不能被瀏覽器解析,需要對其進行一定的處理才可以使用。類似于這種操作在程序中使用的非常頻繁,將其封裝為一個公共類無疑是一種較好的解決方案。在醫藥銷售管理系統中,封裝了一個名為StringUtil的字符串工具類,用于對字符的特殊處理。此類中均為靜

40、態方法。在HQL語句中,如果刪除多個對象可以使用where id in(1,2,3)的方式進行刪除。arr2Str()方法用于將數組轉換為字符串,可以將JSP表單傳遞id值轉換為此種方式;encodeURL()方法可對字符串進行URL編碼,主要用于對含有中文的超鏈接進行處理;encodeZh()方法用于對字符串中的中文亂碼進行處理。7 國際化國際化是Struts的一項強大功能,它以不同國家的語言構建本地化的頁面,方便不同國家、不同語言的用戶瀏覽訪問。在醫藥銷售管理系統中,分別構建了中文和英文兩種語言環境,根據使用者瀏覽器的默認語言環境呈現不同的語言顯示方式。7.1 國際化資源文件醫藥銷售管理系

41、統對所有涉及到語言信息的地方均進行了國際化設置,包括JSP頁面文字信息及JS腳本提示信息等。主要包含3個國際化資源文件,其中屬性文件為MessageRperties為默認的資源文件,實例中將其設置為中文;屬性文件MessageResources_en_US.properties為英文國際化資源文件;MessageResources_zh_CN.properties為中文國際化資源文件。在編寫屬性文件時應該注意,屬性文件以Unicode編碼,在處理中文時應該對其進行轉碼。Java提供了將中文轉換為Unicode編碼格式的工具,在命令窗口中直接輸入“native2ascii

42、”,再輸入中文,然后按回車鍵,將輸出中文對應的Unicode碼。7.2 國際化實現實例中除了對用戶瀏覽器語言的自動匹配外,還為使用者提供了中文和英文的語言鏈接,用戶在使用過程中可對語言進行自動切換。此請求由LanguageAction類進行處理。本地語言信息存放在Session會話中的Globals.LOCALE_KEY值中,它是Struts的默認配置,可以通過Strtus的API幫助文檔和源碼得到。對于中、英文兩種請求,實例中分別創建了中、英文所對應的Locale對象,并將其設置到Globals.LOCALE_KEY值中,實現了語言的自動切換。8 系統登陸模塊系統登錄是一個用戶身份驗證的過程

43、,只有登錄成功的用戶才可以對系統進行操作,否則不能對系統進行管理維護。形象地說,它就是系統的一道安全門。8.1 查詢用戶創建名為UserDao的類,封裝對用戶及系統級的數據操作。在此類中編寫login()方法,用于根據用戶名及密碼查詢用戶對象。在用戶登錄的過程中,需要判斷數據庫用戶對象是否存在,當用戶提交登錄信息時,調用此方法可返回查詢后的用戶對象,如果查詢不到將返回null值。8.2 登陸請求用戶登錄請求由LoginAction類進行處理,此類繼承了Action對象,它重寫execute()方法對用戶登錄請求進行驗證。UserForm對象為用戶ActionForm對象,Struts自動將JS

44、P頁面表單信息封裝在此對象中,所以可以直接獲取ActionForm對象中的屬性信息。LoginAction類通過UserForm中的用戶名和密碼屬性,調用UserDao對象中的login()方法對用戶信息進行查詢,當數據庫中存在與之匹配的數據,則登錄成功,否則登錄失敗。8.3 登錄頁面在Web文件夾的根目錄中創建login.jsp文件,即系統中的用戶登錄頁面,在其中放置用戶登錄的表單。在此頁面中,首先通過<logic:notEmpty>標簽判斷是否存在error值,如果存在即表示用戶登錄發生錯誤,將在登錄頁面顯示錯誤信息。Login.jsp頁面運行結果如圖1.21所示。圖1.21

45、系統登錄頁面9 藥品類別信息管理藥品超市經營的藥品眾多,為方便產看、統計,需要對其進行分類。藥品類別信息管理模塊主要是對藥品類別信息進行統一管理,其中包括對藥品類別的添加、查看、統計等操作。9.1 藥品類別持久層設計CategoryDao類是藥品類別的數據庫操作類,它繼承了SupperDao類,提供對藥品類別的數據庫操作方法。其中loadCategory()方法用于查詢指定id的藥品類別信息,其入口參數為int型藥品id。在添加藥品信息時,需要添加與之對應的類別信息,所以還需要提供一個查詢所有藥品類別信息的方法findAllCategory()。為方便藥品類別數據的統計,實例中對藥品類別中藥品

46、的數量進行統計的操作被定義在findCategoryAndCount(),由HQL語句的內連接查詢進行實現。findCategoryAndCount()方法中的hql屬性為內連接查詢語句,可對藥品數量按藥品類別進行分組統計,查詢后返回其結果集對象。9.2 藥品類別的添加藥品類別的添加是指將藥品類別信息寫入數據庫,實現過程如下。9.2.1 類別添加、修改請求處理實例中將藥品類別的相關請求封裝在CategoryAction類中,此類繼承了BaseAction對象,所以在對類別信息進行處理時,不必考慮用戶是否登錄的安全問題。此類中處理添加類別信息請求的方法為add(),由于CategoryActio

47、n類是一個DispatchAction對象,所以當請求的參數為add時,將由此方法進行處理。此方法調用了CategoryDao對象的saveOrUpdate()方法,所以藥品類別信息的添加與修改操作均可通過此方法進行實現;當傳遞的CategoryForm對象含有id值時,則進行修改操作。9.2.2 類別添加頁面類別添加頁面即category_add.jsp文件,此頁面中主要放置了類別添加的表單。此頁面中使用Struts的<html:hidden>標簽設置藥品類別的id屬性值,如果此屬性不為空,則意味著操作為修改操作。類別添加頁面運行結果如圖1.22所示。圖1.22 類別添加頁面9.

48、3 分頁查看類別信息在添加藥品信息后,系統將跳轉到類別信息列表頁面。在此頁面中將對類別信息進行分頁顯示,此外還提供了藥品類別修改與刪除的超鏈接,如圖1.23所示。圖1.23 類別信息列表頁面9.3.1 查詢與刪除請求處理在CategoryAction類中,藥品類別信息的分頁查詢方法為paging(),由于此類繼承于BaseAction類,所以調用其父類中的getPage()方法就可以實現。它將返回結果集與分頁條對象。在此方法中,currPage屬性為請求的頁碼;action對象為JSP頁面請求的action地址;hql為查詢語句,由于它不含有占位符參數,所以getPage()方法的條件參數設置

49、為null.9.3.2 類別信息列表頁面category_list.jsp是類別信息列表頁面,在此頁面中使用Struts的標簽對藥品類別信息進行迭代輸出。在程序開發過程中,應盡量減少程序中bug。例如,category_list.jsp頁面中,在輸出request對象中的屬性時,首先使用<logic:present>標簽判斷其屬性是否存在。Category_list.jsp頁面中的“修改”與“刪除”超鏈接使用Struts的<html:link>標簽進行設置,此標簽的功能十分強大,它可以設置超鏈接中的參數。實例中使用的paramName屬性用于設置所迭代的對象,param

50、Id屬性用于設置參數的名稱,paramProperty屬性用于設置參數值,href屬性用于指定鏈接地址。9.4 類別的修改與刪除在CategoryAction類中,類別的修改與刪除相對簡單一些,其中處理刪除類別請求的方法為delete(),可根據指定的藥品類別id刪除藥品類別對象。處理修改類別信息請求的方法為edit(),此方法通過類別id加載藥品類別對象將類別信息保存到CategoryForm對象中,最后轉發到編輯頁面。此方法在加載類別信息后,會將頁面轉到類別添加頁面,因為類別添加請求處理的方法調用了Hibernate的saveOrUpdate()方法,所以會對其進行自動更新。9.5 藥品類

51、別統計為了方便查看、管理藥品統計信息,實例中使用了報表組件JFreeChat對藥品分類進行統計。其實現過程如下:9.5.1 JFreeChat工具類創建名為ChartUtil的類,用于生成制圖對象JFreeChat。其中categoryChart()方法用于生成藥品類別統計的餅形圖對象,其入口參數為裝載結果集的List集合對象。此方法中,通過傳遞的List集合對象生成DefaultPieDataset數據集合,然后使用制圖工廠ChartFactory創建餅形圖JFreeChart對象,并將其返回。9.5.2 Action請求藥品類別統計請求由CategoryAction類的findCatego

52、ryAndCound ()方法進行處理,此方法首先通過CategoryDao對象統計藥品類別信息,獲取結果集對象后,通過ChartUtil類的categoryChart()方法生成制圖對象,最后將生成的圖片路徑放置到request中。9.5.3 顯示報表藥品類別統計信息通過category_graph.jsp頁面進行顯示,此頁面通過<bean:write>標簽獲取所生成圖片的路徑。為避免空指針錯誤,category_graph.jsp頁面使用<logic:notEmpty>標簽判斷生成的圖片路徑是否存在,其運行結果如圖1.24所示。圖1.24 category_grap

53、h.jsp頁面10 藥品信息管理藥品信息管理主要是對藥品基本信息的維護,其中包括對藥品信息的添加、刪除、修改、查詢等操作。10.1 藥品對象持久層設計MedicineDao類是藥品對象的數據庫操作類,它繼承了SupperDao類,此類主要包含3個方法,分別為loadMedicine()、loadMedicineCategory()、findMedicineByMedNo()。其中,loadMedicine()方法與findMedicineByMedNo()方法用于根據藥品id及藥品編碼查詢藥品信息;loadMedicineAndCategory()方法用于查詢藥品信息與藥品類別信息。loadM

54、edicineAndCategory()方法使用內連接對藥品信息表與藥品類別表進行聯合查詢,可以減少SQL語句的數量。藥品實體與藥品類別實體存在多對一的關聯關系,當同時查看藥品信息與藥品類別信息時,Hibernate將發出兩條SQL語句,分別為查詢藥品信息的SQL語句與查詢藥品類別的SQL語句,所以實例中采用內連接將藥品信息與藥品類別信息一次加載出來,減少了SQL語句,提高了數據庫的性能。10.2 藥品信息的添加與修改藥品編碼是藥品對象的一個標識,當添加一個藥品信息時,需要判斷此藥品是否已經在數據庫中存在,如果存在則只需更新藥品的數量即可,其添加流程如圖1.25所示。添加藥品保存到數據庫更新藥

55、品數量判斷是否存在不存在存在圖1.25 藥品添加流程10.2.1 藥品添加的請求處理藥品管理的Action類為MedicineAction,它繼承于BaseAction類,是一個DispatchAction對象。此類的findMedicineByMedNo()方法用于根據藥品編碼查詢藥品信息是否存在,當所添加的藥品編碼存在時,將跳轉到藥品更新頁面,否則跳轉到藥品添加頁面。MedicineAction類的add()方法用于添加或修改藥品信息。此方法所做的工作比較多,包含了判斷藥品信息是否存在、圖片上傳、保存藥品以及更新藥品等操作。此方法調用了MedicineDao類中的saveOrUpdate(

56、)方法,因此適用于藥品對象的添加與修改操作。其中上傳文件的命名采用日期時間格式,為防止重復實例中加入時間毫秒;上傳文件保存在Web目錄的upload文件夾中。10.2.2 藥品添加頁面藥品添加有3個頁面,其中med_add.jsp頁面提供輸入藥品編號的表單;當添加的藥品信息在數據庫中不存在時,將通過med_save.jsp錄入藥品的詳細信息;當所添加的藥品信息存在與數據庫中時,經通過med_update.jsp頁面更新藥品數量,如圖1.26所示。圖1.26 更新藥品數量10.3 分頁查看所有藥品在添加藥品信息后,請求轉發到查看所有藥品信息,對所有藥品信息進行分頁顯示。此操作通過Medicine

57、Action類的paging()方法進行處理。此方法通過調用MedicineAction類繼承的getPage()方法進行分頁查詢,在查詢后分別將結果集與分頁條放置到request中,并轉發到med_list.jsp頁面進行顯示,如圖1.27所示。圖1.27 med_list.jsp頁面10.4 查看藥品詳細信息在藥品列表中提供了查看藥品詳細的超鏈接,此鏈接作用于藥品名稱上,單擊此鏈接將進入藥品查看請求中,該請求由MedicineAction類view()方法進行處理。在view()方法中,首先通過傳遞的藥品id值查詢藥品對象,然后將查詢到藥品信息放置于request對象中,轉發到med_view

溫馨提示

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

評論

0/150

提交評論