統(tǒng)一扣費(fèi)系統(tǒng)畢業(yè)設(shè)計說明書_第1頁
統(tǒng)一扣費(fèi)系統(tǒng)畢業(yè)設(shè)計說明書_第2頁
統(tǒng)一扣費(fèi)系統(tǒng)畢業(yè)設(shè)計說明書_第3頁
統(tǒng)一扣費(fèi)系統(tǒng)畢業(yè)設(shè)計說明書_第4頁
統(tǒng)一扣費(fèi)系統(tǒng)畢業(yè)設(shè)計說明書_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、中北大學(xué)2009屆畢業(yè)設(shè)計說明書1 引言1.1 背景與意義統(tǒng)一扣費(fèi)是指,由信譽(yù)好、規(guī)模大的第三方在線購物平臺為一些小網(wǎng)站或個人做代理,將他們的產(chǎn)品發(fā)布在自己站內(nèi),并為其實(shí)施代理扣費(fèi)的營銷模式1。這樣的第三方購物平臺從表面上看起來和普通的購物網(wǎng)站沒有多大區(qū)別,但本質(zhì)上它是在為別人銷售產(chǎn)品,它的盈利點(diǎn)不在于銷售產(chǎn)品的利潤,而在于它所代理的客戶的“代理費(fèi)”。自21世紀(jì)以來,我們進(jìn)入了一個信息化時代,互聯(lián)網(wǎng)在人們的生產(chǎn)生活中的作用越來越大。利用網(wǎng)絡(luò)作為載體從事營利性經(jīng)濟(jì)活動的大小企業(yè)與個人多如牛毛,大家無疑都看重了互聯(lián)網(wǎng)作為營銷陣地所具有的得天獨(dú)厚的優(yōu)勢。以網(wǎng)上銷售為例,商家沒有庫存壓力、經(jīng)營成本低、

2、經(jīng)營規(guī)模不受場地限制,與傳統(tǒng)營銷模式相比將會具有更強(qiáng)的競爭力2。但與此同時,互聯(lián)網(wǎng)的高度開放性使得潛在客戶的注意力難以集中到自己的站點(diǎn)上,只有那些擁有足夠資金來做廣告宣傳與推廣的商家才有可能搶占先機(jī),首先被人注意3。而對于剛剛起步的小企業(yè)或者在資金上無法與企業(yè)匹敵的個人來說,被瀏覽互聯(lián)網(wǎng)的用戶注意到的機(jī)會微乎其微。 在這樣的劣勢之下,將自己的產(chǎn)品和服務(wù)發(fā)布在一個公眾效益好的代理式的統(tǒng)一扣費(fèi)網(wǎng)站,將是一個比較好的解決方案。如果再考慮到網(wǎng)上購物的安全性的話,統(tǒng)一扣費(fèi)網(wǎng)站的營利空間將會更大。由于網(wǎng)上購物的特殊性,安全性一直是消費(fèi)者和企業(yè)都在顧慮和致力解決的問題。目前常見的解決方案就是在付款環(huán)節(jié)采用擔(dān)

3、保交易的方法,或者間接的利用銀行提供的安全認(rèn)證服務(wù)4。但目前國內(nèi)的第三方支付平臺往往是自己開發(fā)自己使用,如淘寶和支付寶,騰訊和財務(wù)通,擔(dān)保交易市場并不成熟。消費(fèi)者也總是愿意去大網(wǎng)站買東西,對小規(guī)模、信譽(yù)難以保證的小網(wǎng)站和個人網(wǎng)店不屑一顧5。這也正是統(tǒng)一扣費(fèi)網(wǎng)站的優(yōu)勢所在。它可以憑借自己的雄厚資金將第三方支付系統(tǒng)的服務(wù)集成進(jìn)來,消費(fèi)者自然就會消除購物安全和信譽(yù)方面的顧慮。統(tǒng)一扣費(fèi)系統(tǒng)是為自己的加盟商家發(fā)布商品的平臺,同時要吸引消費(fèi)者選購商品,其完善的功能、友好的交互界面、強(qiáng)大便捷的后臺管理等因素直接決定了整個營銷流程的成功與否。1.2 系統(tǒng)設(shè)計思想本系統(tǒng)采用目前業(yè)界做web項(xiàng)目時廣泛使用的mvc

4、架構(gòu)進(jìn)行設(shè)計,完全具有運(yùn)行平臺和操作系統(tǒng)無關(guān)性,能在不同種類的服務(wù)器上運(yùn)行。這樣的設(shè)計確保了系統(tǒng)運(yùn)行的穩(wěn)定性和高效性,及充分考慮到了功能的可擴(kuò)展性,為將來系統(tǒng)的進(jìn)一步更新升級鋪平了道路。表現(xiàn)層:客戶端采用html、javascript、css等技術(shù),實(shí)現(xiàn)客戶端良好的交互界面。服務(wù)器端采用jsp 和servlet 技術(shù),負(fù)責(zé)處理用戶的輸入和向用戶的輸出,并根據(jù)業(yè)務(wù)邏輯層反饋信息動態(tài)生成頁面內(nèi)容。控制層:當(dāng)客戶端發(fā)送一個*.do的請求時,由struts的核心控制器攔截,調(diào)用業(yè)務(wù)層方法,然后根據(jù)其執(zhí)行結(jié)果及具體參數(shù)轉(zhuǎn)到下一張頁面。業(yè)務(wù)邏輯層:商業(yè)邏輯層是服務(wù)器端表示層和數(shù)據(jù)層之間

5、的紐帶,它以jdbc 訪問數(shù)據(jù)層,并將數(shù)據(jù)封裝成java bean 傳遞給服務(wù)器端表示層。商業(yè)邏輯層用于處理商務(wù)邏輯和計算,并實(shí)現(xiàn)安全、事務(wù)、日志等功能。  數(shù)據(jù)持久層:使用hibernate實(shí)現(xiàn)數(shù)據(jù)庫層實(shí)際的數(shù)據(jù)存儲和檢索,并保證數(shù)據(jù)完整性和安全性。 其中業(yè)務(wù)邏輯層和數(shù)據(jù)持久層可以合起來稱為模型層,這樣總體上整個系統(tǒng)就形成了mvc的三層結(jié)構(gòu)6。采用mvc結(jié)構(gòu)的優(yōu)點(diǎn)是各邏輯層既相互獨(dú)立又緊密聯(lián)系任何一層的改動都不會影響到其它邏輯層的工作,同時系統(tǒng)采用面向?qū)ο蟮哪K化設(shè)計和開放式j(luò)2ee 系統(tǒng)結(jié)構(gòu),因此具有高度的可擴(kuò)展升級性、集成性(與

6、第三方)、可移植性(運(yùn)行平臺,數(shù)據(jù)庫)、可配置性(工作流程系統(tǒng)參數(shù))、可維護(hù)性(運(yùn)行故障時易于調(diào)試和維護(hù))7。2 應(yīng)用技術(shù)及開發(fā)平臺介紹2.1 技術(shù)介紹下面對開發(fā)web項(xiàng)目時常用的技術(shù)及設(shè)計方法做一些簡要介紹: 2.1.1 b/s軟件體系結(jié)構(gòu)b/s結(jié)構(gòu)(browser/server,瀏覽器/服務(wù)器模式)統(tǒng)一了客戶端,將系統(tǒng)功能實(shí)現(xiàn)的核心部分集中到服務(wù)器上,簡化了系統(tǒng)的開發(fā)、維護(hù)和使用8。b/s結(jié)構(gòu)與c/s結(jié)構(gòu)相比,主要特點(diǎn)有:維護(hù)和升級方式簡單,軟件系統(tǒng)的改進(jìn)和升級只需要針對服務(wù)器進(jìn)行,大量節(jié)省人力、物力、時間和費(fèi)用;使用b/s架構(gòu)的應(yīng)用軟件的客戶端,只需安裝瀏覽器即可,無需關(guān)心服務(wù)器使用什么

7、樣的系統(tǒng)或數(shù)據(jù)庫,這就使得成本降低,配置可以更加靈活9。2.1.2 javaee和 web項(xiàng)目開發(fā)的相關(guān)技術(shù)servlet是java語言用于開發(fā)b/s結(jié)構(gòu)應(yīng)用程序的基本技術(shù),可使程序的業(yè)務(wù)邏輯和顯示邏輯都放在服務(wù)器端運(yùn)行10。servlet可在特定服務(wù)器環(huán)境下接受客戶端(瀏覽器)請求,對其處理后把響應(yīng)結(jié)果重新發(fā)送給客戶端。jsp(javaserver pages)是由sun microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)11。jsp將網(wǎng)頁邏輯與網(wǎng)頁設(shè)計和顯示分離,支持可重用的基于組件的設(shè)計,使基于web的應(yīng)用程序的開發(fā)變得迅速和容易。它具有如下優(yōu)勢:一次編寫,到處

8、運(yùn)行;跨平臺支持;強(qiáng)大的可伸縮性;多樣化和功能強(qiáng)大的開發(fā)工具支持。struts是一個為開發(fā)基于模型(model)視圖(view)控制器(controller)(mvc)模式的應(yīng)用架構(gòu)的開源框架,是利用java servlet和jsp構(gòu)建web應(yīng)用的一項(xiàng)非常有用的技術(shù)12。由于struts能充分滿足應(yīng)用開發(fā)的需求,簡單易用,敏捷迅速,因而吸引了眾多的開發(fā)人員的關(guān)注。2.1.3 mvc設(shè)計模式mvc模式是”model-view-controller”的縮寫,中文翻譯為"模式-視圖-控制器"13。mvc應(yīng)用程序總是由這三個部分組成:event(事件)導(dǎo)致controller改變m

9、odel或view,或者同時改變兩者。只要controller改變了models的數(shù)據(jù)或者屬性,所有依賴的view都會自動更新。類似的,只要controller改變了view,view會從潛在的model中獲取數(shù)據(jù)來刷新自己14。2.1.4 spring技術(shù)spring是一個開源框架,被認(rèn)為是最有前途的開源框架之一14。它是由rod johnson創(chuàng)建的,她的誕生是為了簡化企業(yè)級系統(tǒng)的開發(fā),spring是一種輕量級的容器,并且是非入侵式的,用spring開發(fā)的系統(tǒng)中的類不需要依賴spring中的類,不需要容器支持(當(dāng)然spring本身是一個容器),而且spring的大小和運(yùn)行開支都很

10、微量。一般來說,如果系統(tǒng)不需要分布計算或者聲明式事務(wù)支持那么spring是一個更好的選擇。spring的核心就是兩個概念,反向控制(ioc),面向切面編程(aop)15。ioc:ioc的全稱是inversion of control,中文翻譯反向控制或者逆向控制。這里的反向是相對ejb來講的。ejb使用jndi來查找需要的對象,是主動的,而spring是把依賴的對象注入給相應(yīng)的類,是被動的,所以稱之為“反向”。aop:aop全稱是aspect-oriented programming,中文翻譯是面向方面的編程或者面向切面的編程,現(xiàn)在的系統(tǒng)往往強(qiáng)調(diào)減小模塊之間的耦合

11、度,aop技術(shù)就是用來幫助實(shí)現(xiàn)這一目標(biāo)的。2.1.5 hibernate技術(shù)hibernate是一個免費(fèi)的開源java包,它使得與關(guān)系數(shù)據(jù)庫打交道變得十分輕松16。運(yùn)行時,hibernate讀取映射文檔,然后動態(tài)構(gòu)建java類,以便管理數(shù)據(jù)庫與java之間的轉(zhuǎn)換。在hibernate中有一個簡單而直觀的api,用于對數(shù)據(jù)庫所表示的對象執(zhí)行查詢。要修改這些對象,(一般情況下)只需在程序中與它們進(jìn)行交互,然后告訴hibernate保存修改即可。類似地,創(chuàng)建新對象也很簡單;只需以常規(guī)方式創(chuàng)建它們,然后告訴hibernate有關(guān)它們的信息,這樣就能在數(shù)據(jù)庫中保存它們。2.2 開發(fā)平臺開發(fā)環(huán)境:wind

12、ows xp操作系統(tǒng),jdk 6.0,javaee 5.0,tomcat 6.0服務(wù)器,oracle 10g數(shù)據(jù)庫ide:myeclipse 6.5(集成了許多優(yōu)秀的插件,使編碼更便捷,web項(xiàng)目更易于管理)其他開發(fā)工具:sqlplus, rational rose, plsqldev等2.3 運(yùn)行環(huán)境瀏覽器:mozilla fixfox(使用其他瀏覽器可能會發(fā)生錯誤)web服務(wù)器:tomcat 6.0數(shù)據(jù)庫:oracle 10g3 需求分析3.1 設(shè)計目標(biāo)3.1.1 業(yè)務(wù)需求統(tǒng)一扣費(fèi)系統(tǒng)的主要客戶群其實(shí)不是在本網(wǎng)站購物的普通用戶,而是提供產(chǎn)品的加盟商家,所以該系統(tǒng)的產(chǎn)品應(yīng)該有一個標(biāo)識,可以標(biāo)

13、志其來自哪個客戶站點(diǎn)或個人網(wǎng)店,并可以對其進(jìn)行管理。其次要實(shí)現(xiàn)在線購物的功能,使得用戶可以在網(wǎng)站內(nèi)反復(fù)挑選、斟酌要買的商品,并可以設(shè)置商品數(shù)量、支付渠道、付款方式、送貨方式等信息。確認(rèn)購買后可以查看提交過的訂單內(nèi)容和當(dāng)前狀態(tài)。然后要能夠?qū)徫镏猩婕暗降膶?shí)體進(jìn)行方便而完善的管理,如對產(chǎn)品、用戶、訂單等實(shí)體進(jìn)行增刪改查等。3.1.2 基本要求使系統(tǒng)界面友好,易于操作。把業(yè)務(wù)邏輯盡量封裝起來,不要讓用戶參與過多不必要的邏輯判斷。程序簡潔,可讀性強(qiáng),結(jié)構(gòu)合理。盡量降低層與層之間的耦合,使代碼依賴性降低,可移植性和通用性增強(qiáng)。3.2 功能模塊3.2.1 系統(tǒng)邊界對需求進(jìn)行進(jìn)一步分析,可以初步確定本系統(tǒng)的

14、邊界,即對客戶站點(diǎn)來說,它是源點(diǎn)(產(chǎn)品來自客戶站點(diǎn)),而像銀行這樣的系統(tǒng)則相當(dāng)于匯點(diǎn),用戶訂單中有關(guān)費(fèi)用的信息最終要發(fā)送到銀行(本系統(tǒng)中的支付渠道)進(jìn)行處理。對這兩個實(shí)體,在系統(tǒng)設(shè)計時可以維護(hù)它們的引用,使得系統(tǒng)內(nèi)部實(shí)體與外部實(shí)體能夠更加合理的關(guān)聯(lián)起來。3.2.2 功能模塊從以上的需求分析來看,除核心業(yè)務(wù)外,系統(tǒng)的功能可以劃分為后臺管理和自服務(wù)兩大部分。普通用戶進(jìn)入自己的賬戶后可以進(jìn)行的操作就屬于自服務(wù),如查看、修改個人信息,查看自己提交過的歷史訂單等。而后臺管理是為系統(tǒng)管理員提供的一個平臺,用來管理系統(tǒng)的主要業(yè)務(wù)模塊。當(dāng)實(shí)體確定以后,后臺管理的對象將會更加明確。下圖3.1顯示了本系統(tǒng)的邊界及

15、功能模塊:圖3.1 系統(tǒng)邊界及功能模塊3.3 系統(tǒng)用例用例圖可以幫助我們進(jìn)一步確定系統(tǒng)到底要實(shí)現(xiàn)什么功能。用例圖由角色(actor)和用例(usecase)組成,每個用例代表一個功能,一個用例可以有多個子用例,角色就是這些功能的使用者,角色可以是人,也可以是調(diào)用本系統(tǒng)的其他系統(tǒng)17。從以上的功能模塊分析來看,系統(tǒng)中至少有兩個角色:普通用戶和系統(tǒng)管理員,普通用戶是核心業(yè)務(wù)(購買)和自服務(wù)的使用者,管理員是后臺管理的使用者。具體的角色用例關(guān)系如圖3.2、圖3.3所示:圖3.2 普通用戶用例圖圖3.3 系統(tǒng)管理員用例圖4 系統(tǒng)設(shè)計4.1 系統(tǒng)結(jié)構(gòu)本系統(tǒng)從軟件設(shè)計角度可劃分為數(shù)據(jù)持久層、業(yè)務(wù)邏輯層、控

16、制層和表現(xiàn)層,即所謂的mvc結(jié)構(gòu)。之所以要把程序分成多層,無非是要使代碼更易于維護(hù)和管理,同時增強(qiáng)可擴(kuò)展性。良好的程序結(jié)構(gòu)設(shè)計首先應(yīng)該符合開閉原則,即對代碼的增加“開”,對修改和刪除“閉”。其次要降低代碼的冗余,提高通用性,即符合被稱作“dont repeat yourself”的原則。4.2 實(shí)體模型從需求分析階段的分析可以確定業(yè)務(wù)對象模型,也就實(shí)體模型,實(shí)體是指程序中那些與數(shù)據(jù)庫表有對應(yīng)關(guān)系的類。由于數(shù)據(jù)庫設(shè)計是有嚴(yán)格規(guī)定的,所以與之對應(yīng)的實(shí)體的屬性也應(yīng)是有依據(jù)的。經(jīng)過系統(tǒng)用例和時序流程的分析,現(xiàn)在已經(jīng)可以確定本系統(tǒng)中涉及到的類及實(shí)體:用戶user,訂單order,訂單項(xiàng)item,支付渠道

17、paychannel,產(chǎn)品product,客戶站點(diǎn)(貨源)clientsite,產(chǎn)品類型producttype,管理員admin。類圖及類間關(guān)系如圖4.1:圖4.1 系統(tǒng)類圖用戶、產(chǎn)品和訂單是基本實(shí)體,要進(jìn)行購物就必須有這些可供操作的對象存在。產(chǎn)品類型、支付渠道、客戶站點(diǎn)則是以上的基本實(shí)體要引用的輔助性實(shí)體。圖5中每個類都列出了其主要屬性,它們都有一個共同屬性id,用來和數(shù)據(jù)庫表的主鍵id對應(yīng)。圖中的虛線箭頭表示關(guān)聯(lián)關(guān)系,如order指向user,表示order與user關(guān)聯(lián),某個訂單必定屬于某個用戶。圖中的關(guān)聯(lián)關(guān)系都為一對多關(guān)系。在實(shí)際運(yùn)用中一對多關(guān)系經(jīng)常出現(xiàn),有時甚至?xí)岩粋€多對多關(guān)系拆分

18、成兩個一對多關(guān)系。如本系統(tǒng)中的order和product就是多對多關(guān)系,這是很顯然的。但是為了數(shù)據(jù)庫設(shè)計和編碼簡單,就另引入一個實(shí)體item。4.3 數(shù)據(jù)庫設(shè)計數(shù)據(jù)庫設(shè)計在一個信息管理系統(tǒng)中的地位非常重要,良好的設(shè)計可以提供數(shù)據(jù)存取效率、簡化數(shù)據(jù)管段應(yīng)設(shè)計數(shù)據(jù)庫的理和維護(hù),并使數(shù)據(jù)庫保持安全和完整。數(shù)據(jù)庫設(shè)計幾乎貫穿了軟件設(shè)計的整個過程。在需求分析階段應(yīng)該分析客戶的業(yè)務(wù)和數(shù)據(jù)處理需求,概要設(shè)計階e-r模型圖,確認(rèn)需求信息的正確和完整。詳細(xì)設(shè)計階段應(yīng)將e-r圖轉(zhuǎn)換為多張表,進(jìn)行邏輯設(shè)計,并應(yīng)用數(shù)據(jù)庫設(shè)計的三大范式進(jìn)行審核。代碼編寫階段應(yīng)選擇具體數(shù)據(jù)庫進(jìn)行物理實(shí)現(xiàn),并編寫代碼實(shí)現(xiàn)前端應(yīng)用。4.3.

19、1 數(shù)據(jù)庫概念設(shè)計用戶的需求具體體現(xiàn)在各種信息的提供、保存、更新和查詢,這就要求數(shù)據(jù)庫結(jié)構(gòu)能充分滿足各種信息的輸出和輸入。本系統(tǒng)涉及到了眾多實(shí)體,對這些實(shí)體的增刪改查分布到了用戶和管理員的各個用例中。將e-r圖轉(zhuǎn)換為關(guān)系模型實(shí)際上就是要將實(shí)體、實(shí)體的屬性和實(shí)體之間的聯(lián)系轉(zhuǎn)化為關(guān)系模式,這種轉(zhuǎn)換一般遵循如下原則18:一個實(shí)體型轉(zhuǎn)換為一個關(guān)系模式。實(shí)體的屬性就是關(guān)系的屬性。實(shí)體的碼就是關(guān)系的碼。一個m:n聯(lián)系轉(zhuǎn)換為一個關(guān)系模式。與該聯(lián)系相連的各實(shí)體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性。而關(guān)系的碼為各實(shí)體碼的組合。一個1:n聯(lián)系可以轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,也可以與n端對應(yīng)的關(guān)系模式合并。如果轉(zhuǎn)

20、換為一個獨(dú)立的關(guān)系模式,則與該聯(lián)系相連的各實(shí)體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性,而關(guān)系的碼為n端實(shí)體的碼。一個1:1聯(lián)系可以轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,也可以與任意一端對應(yīng)的關(guān)系模式合并。三個或三個以上實(shí)體間的一個多元聯(lián)系轉(zhuǎn)換為一個關(guān)系模式。與該多元聯(lián)系相連的各實(shí)體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性。而關(guān)系的碼為各實(shí)體碼的組合。同一實(shí)體集的實(shí)體間的聯(lián)系,即自聯(lián)系,也可按上述1:1、1:n和m:n三種情況分別處理。具有相同碼的關(guān)系模式可合并。為了進(jìn)一步提高數(shù)據(jù)庫應(yīng)用系統(tǒng)的性能,通常以規(guī)范化理論為指導(dǎo),還應(yīng)該適當(dāng)?shù)匦薷?、調(diào)整數(shù)據(jù)模型的結(jié)構(gòu),這就是數(shù)據(jù)模型的優(yōu)化。確定數(shù)據(jù)依賴。消除冗余的

21、聯(lián)系。確定各關(guān)系模式分別屬于第幾范式。確定是否要對它們進(jìn)行合并或分解。一般來說將關(guān)系分解為3nf的標(biāo)準(zhǔn),即表內(nèi)的每一個值都只能被表達(dá)一次;表內(nèi)的每一行都應(yīng)該被唯一的標(biāo)識(有唯一鍵)。表內(nèi)不應(yīng)該存儲依賴于其他鍵的非鍵信息。根據(jù)以上規(guī)則,訂單和產(chǎn)品本為m:n 關(guān)系,而在關(guān)系數(shù)據(jù)庫中無法直接表現(xiàn)多對多關(guān)系,通常的做法是另建一張表,成為外鍵表,用來維護(hù)兩個外鍵列,分別指向訂單和產(chǎn)品,這兩列聯(lián)合唯一。但這張表通常是不對應(yīng)實(shí)體的,只是在表中還含有其他屬性時,外鍵表才會對應(yīng)程序中的實(shí)體。這里的item就是這樣的中間性的實(shí)體。4.3.2 數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計此階段應(yīng)收集基本數(shù)據(jù)、數(shù)據(jù)結(jié)構(gòu)以及數(shù)據(jù)處理的流程,組成

22、一份詳盡的數(shù)據(jù)字典,為后面的具體設(shè)計打下基礎(chǔ)。經(jīng)過對整個購物流程、產(chǎn)品入庫、訂單提交中數(shù)據(jù)流動做分析,確定了在各個階段需要的數(shù)據(jù)類型,其中有很多是表示狀態(tài)或日期的。最終設(shè)計的表的詳細(xì)信息如下(以下數(shù)據(jù)類型可能只在oracle中有效):表4.1 sc_user表列名字段類型長度是否為空說明idusernamerealnamepasswordaddresscellphonefindquefindkeyintegervarchar2varchar2varchar2varchar2varchar2varchar2varchar23230301535154040not nullnot null主鍵唯一約

23、束(無)(無)(無)(無)密碼找回問題密碼找回答案表4.2 sc_order表列名字段類型長度是否為空說明idstatuscostmadedateu_idpc_idintegervarchar2numberdateintegerinteger3213232not nullnot null主鍵約束:y 或 n(無)(無)外鍵,用戶外鍵,支付渠道表4.3 sc_paychannel表列名字段類型長度是否為空說明idnameexchange_limitdescrintegervarchar2number(12,2)date322030not null主鍵(無)交易限額(無)表4.4 sc_item表

24、列名字段類型長度是否為空說明idcountcosto_idp_idintegerintegernumberintegerinteger32203032not null主鍵產(chǎn)品數(shù)量本項(xiàng)小計外鍵,訂單外鍵,產(chǎn)品表4.5 sc_product表列名字段類型長度是否為空說明idnamepricedescriptionclient_priceimg_pathclient_product_idclient_producttype_idt_idcs_idintegervarchar2number(12,2)varchar2number(12,2)varchar2integerintegerintegerin

25、teger321002563220not null主鍵(無)(無)(無)(無)(無)(無)(無)外鍵,產(chǎn)品類型外鍵,客戶站點(diǎn)表4.6 sc_clientsite表列名字段類型長度是否為空說明idnameurlenterdatekeywordclassintegervarchar2varchar2datevarchar2integer3240254032not null主鍵(無)客戶站點(diǎn)網(wǎng)址錄入系統(tǒng)日期關(guān)鍵字,描述級別表4.7 sc_producttype表列名字段類型長度是否為空說明idnameintegervarchar23215not null主鍵(無)表4.8 sc_admin表列名字段

26、類型長度是否為空說明idusernamepasswordroleintegervarchar2varchar2varchar232301515not nullnot nullnot null主鍵(無)(無)角色下圖4.2展示了各個實(shí)體所對應(yīng)的表及其關(guān)系:圖4.2 表及表間關(guān)系設(shè)計邏輯結(jié)構(gòu)應(yīng)該選擇最適于描述與表達(dá)相應(yīng)概念結(jié)構(gòu)的數(shù)據(jù)模型,然后選擇最合適的dbms。本系統(tǒng)功能類似于大型的網(wǎng)上購物商城,如果業(yè)務(wù)擴(kuò)展,對數(shù)據(jù)庫的存取量和頻率將會成倍提高,所以一開始就使用一流的數(shù)據(jù)庫將有利于之后的發(fā)展。本系統(tǒng)擬采用oracle數(shù)據(jù)庫10g。4.3.3 數(shù)據(jù)庫實(shí)施該階段應(yīng)使用dbms提供的語言(如sql/p

27、l),根據(jù)邏輯設(shè)計和物理設(shè)計的結(jié)果建立數(shù)據(jù)庫,組織數(shù)據(jù)入庫。數(shù)據(jù)庫操作有很多方便的軟件可以使用,如sqlplus、plsqldev、powerdesigner等,可以方便的建表、插入數(shù)據(jù)等,甚至是生成大量的測試數(shù)據(jù),供排序、分頁等程序測試使用。 首先在oracle中創(chuàng)建用戶,sql語句如下:create user javauser identified by 123456default tablespace userstemorary tablespace temp;在oracle中創(chuàng)建用戶需要指定默認(rèn)表空間和臨時表空間,這是oracle獨(dú)有的,目的是把該用戶下創(chuàng)建的表分離在不同的空間中,防止

28、重名,類似于java中用包名來保證每個包中的類名不重復(fù),而不同包內(nèi)可以出現(xiàn)重復(fù)類。 然后基于上文對表的設(shè)計,可使用類似下面列出的sql語句建表:create table sc_order(id integer constraint sc_order_id_pk primary key,status varchar2(1) constraint sc_order_status_nn not null constraint sc_order_status_ck check(status in('n','y'),cost number ,made_date date,

29、u_id integer constraint sc_order_uid_fk references sc_user(id),pc_id integer constraint sc_order_cid_fk references sc_paychannel(id);create sequence sc_order_seq start with 3010001;本系統(tǒng)將使用oracle提供的序列sequence來為表生成主鍵,所以每張表對應(yīng)一個sequece。另外由于多個表之間有相互參照關(guān)系,所以建表時應(yīng)注意先建父表(被引用的表),再建子表。 最后可以使用類似下面的sql語句在數(shù)據(jù)庫中插入測試數(shù)

30、據(jù):insert into sc_producttype values(sc_producttype_seq.nextval,'書籍雜志');insert into sc_producttype values(sc_producttype_seq.nextval,'電子產(chǎn)品');insert into sc_producttype values(sc_producttype_seq.nextval,'生活用品');commit;其中主鍵是用序列的下一個值來賦值的。最后不要忘了用commit命令提交事務(wù),表示把剛才用dml語句插入的數(shù)據(jù)真正的寫到數(shù)

31、據(jù)庫中。5 系統(tǒng)實(shí)現(xiàn)及功能介紹本章首先介紹系統(tǒng)實(shí)現(xiàn)的技術(shù)細(xì)節(jié)和運(yùn)行原理,所謂“知其所以然”,同時作為一個說明文檔,使日后對系統(tǒng)作維護(hù)和功能擴(kuò)展時能很快理清思路。接著會介紹一下系統(tǒng)的業(yè)務(wù)功能及使用方法、注意事項(xiàng)等,為系統(tǒng)的使用者做一個初步指導(dǎo)。5.1 hibernate實(shí)現(xiàn)數(shù)據(jù)持久層上文已經(jīng)詳細(xì)陳述了本系統(tǒng)中的實(shí)體及數(shù)據(jù)庫表,數(shù)據(jù)持久層的主要功能就是完成orm(object-relation mapping),即將程序中的對象插入、更新為某張表的一條記錄,或把數(shù)據(jù)庫中的記錄查詢出來、組裝成對象。本系統(tǒng)在數(shù)據(jù)持久層采用hibernate技術(shù),在配置文件可定義對象與表的映射關(guān)系,如對象名-表名、對象

32、id-主鍵id、普通業(yè)務(wù)屬性名-列名、關(guān)系屬性-外鍵列,以及級聯(lián)方式、主鍵生成策略等信息。一般要為每個實(shí)體做一份配置。下面是一份配置文件示例:文件order.hbm.xml :<hibernate-mapping package="com.den.agentshopping.entity"><class name="order" table="sc_order"><id name="id"><generator class="sequence">&

33、lt;param name="sequence">sc_order_seq</param></generator></id> <property name="status" type="string" column="status"></property><property name="cost" type="double" column="cost"></property

34、><property name="madedate" type="date" column="made_date"></property><many-to-one name="user" class="user" column="u_id" cascade="save-update"></many-to-one><set name="items" cascade="a

35、ll" inverse="true"><key column="o_id"></key><one-to-many class="item"/></set><many-to-one name="paychannel" class="paychannel" column="pc_id" cascade="save-update"></many-to-one></cla

36、ss></hibernate-mapping>文件item.htm.xml :<hibernate-mapping package="com.den.agentshopping.entity"><class name="item" table="sc_item"><id name="id"><generator class="sequence"><param name="sequence">sc_i

37、tem_seq</param></generator></id> <property name="count" type="integer" column="count"></property><property name="cost" type="double" column="cost"></property><many-to-one name="order" c

38、lass="order" column="o_id" cascade="save-update"></many-to-one><many-to-one name="product" class="product" column="p_id" cascade="save-update"></many-to-one></class>從以上配置文件中可以看出,order 和 item是一對多關(guān)系,外鍵在ite

39、m表中,外鍵列為o_id。另外主鍵都是由sequence生成的。如果項(xiàng)目中只用hibernate,沒有與spring整合,那么hibernate將在hibernate.cfg.xml中配置數(shù)據(jù)源,然后用類似下面的代碼段得到session:sessionfactory factory= new configuration().configure().buildsessionfactory();session session=factory.opensession();接著就可以進(jìn)行增刪改查操作了。這里不屬于這種情況,這一點(diǎn)會在spring與hibernate整合部分再做介紹。5.2 struts

40、實(shí)現(xiàn)mvc流程調(diào)度5.2.1 struts實(shí)現(xiàn)mvc基本原理本系統(tǒng)的主體結(jié)構(gòu)是mvc,struts就是一款優(yōu)秀的mvc框架。struts1.2的工作原理如下:struts的前端控制器actionservlet會負(fù)責(zé)截取客戶端格式*.do的請求,并把請求參數(shù)封裝到actionform中,然后根據(jù)*代表的內(nèi)容把請求分發(fā)到相應(yīng)的action,去執(zhí)行其excute()方法,執(zhí)行完畢后根據(jù)配置返回到mapping.findforward(“”);的實(shí)參指定的頁面。這就是由struts調(diào)度的一次請求的完整過程。圖5.1為struts經(jīng)典實(shí)現(xiàn)的時序圖:圖5.1 struts 流程調(diào)度時序圖之所以稱strut

41、s為mvc框架,是因?yàn)閺恼w上看,struts在程序中充當(dāng)?shù)氖强刂破鞯慕巧菏紫冉哟齰iew層的請求,分析后分發(fā)到相應(yīng)的action,也稱后端控制器,在action中繼續(xù)調(diào)用model層的業(yè)務(wù)方法,最后根據(jù)返回結(jié)果轉(zhuǎn)到相應(yīng)頁面,回到了view層。要想使用struts,我們要做的就是:繼承action,實(shí)現(xiàn)自己的業(yè)務(wù)調(diào)用,然后做一些配置即可。struts對業(yè)務(wù)代碼的侵入性較弱,可以稱作是一個優(yōu)秀的框架,尤其是不久前做了版本更新后。5.2.2 在程序中運(yùn)用struts要使用struts構(gòu)建程序的框架,首先應(yīng)該把struts相關(guān)的jar包放到tomcat的lib目錄下,并在項(xiàng)目的classpath下

42、配好struts的編譯時依賴。下面以產(chǎn)品product為例說明接下來要做的幾步配置或編碼:在web.xml 中配置struts前端控制器(actionservlet)<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.actionservlet</servlet-class> <init-param><param-name>config</param-name><param-

43、value>/web-inf/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>編寫程序繼承struts提供的act

44、ion和form類,form中要對每個屬性都提供get()和set()方法,action中按特定的方法簽名寫自己的具體實(shí)現(xiàn),本系統(tǒng)中大部分action都是繼承的mappingdispatchaction類(與經(jīng)典實(shí)現(xiàn)不同)。代碼節(jié)選如下:public class productform extends actionform/屬性名與product完全相同,數(shù)據(jù)類型出現(xiàn)基本類型、封裝類型和stringprivate integer id;private string name;private double price;private double clientprice;private stri

45、ng imgpath;private string description;private integer clientproductid;private integer clientproducttypeid;private integer producttypeid;private integer clientsiteid;public integer getid() return id;public void setid(integer id) this.id = id;public string getname() return name;public void setname(str

46、ing name) = name;public double getclientprice() return clientprice;public void setclientprice(double clientprice) this.clientprice = clientprice;/其他get()和set()方法不再列出public class productaction extends mappingdispatchactionprivate productbiz productbiz;/維護(hù)biz的引用,方便調(diào)用其方法private producttypebiz

47、 producttypebiz;private clientsitebiz clientsitebiz;public productbiz getproductbiz() return productbiz;public void setproductbiz(productbiz productbiz) ductbiz = productbiz;/其他get()和set()不再列出public actionforward addproduct(actionmapping mapping,actionform form,httpservletrequest request,htt

48、pservletresponse response)tryproductform pf=(productform)form;product p=new product();beanutils.copyproperties(p, pf);integer producttypeid=integer.parseint(request.getparameter("producttypeid");producttype pt=producttypebiz.getbyid(producttypeid);p.setproducttype(pt);integer clientsiteid=

49、integer.parseint(request.getparameter("clientsiteid");clientsite cs=clientsitebiz.getbyid(clientsiteid);p.setclientsite(cs);productbiz.save(p);request.setattribute("insertedproduct", p);system.out.println("-產(chǎn)品action "+p.getid()+" "+p.getname()+" "+p.

50、getproducttype().getname()+" "+p.getclientsite().getname();return mapping.findforward("ok");catch(exception e)e.printstacktrace();return mapping.findforward("error");public actionforward updateproduct(actionmapping mapping,actionform form,httpservletrequest request,http

51、servletresponse response)tryproductform pa=(productform)form;request.getparametermap();product product=new product();beanutils.copyproperties(product, pa);integer producttypeid=integer.parseint(request.getparameter("producttypeid");producttype pt=producttypebiz.getbyid(producttypeid);produ

52、ct.setproducttype(pt);integer clientsiteid=integer.parseint(request.getparameter("clientsiteid");clientsite cs=clientsitebiz.getbyid(clientsiteid);product.setclientsite(cs);productbiz.modify(product);request.setattribute("updatedproduct", product);return mapping.findforward("

53、;ok");catch(exception e)e.printstacktrace();return mapping.findforward("error");public actionforward deleteone(actionmapping mapping,actionform form,httpservletrequest request,httpservletresponse response)tryinteger pid=integer.parseint(request.getparameter("productid");prod

54、uct p=productbiz.getbyid(pid);productbiz.remove(p);request.setattribute("deletedproduct", p);return mapping.findforward("ok");catch(exception e)e.printstacktrace();return mapping.findforward("error");public actionforward queryproductsbytype(actionmapping mapping,actionf

55、orm form,httpservletrequest request,httpservletresponse response)tryinteger typeid=integer.parseint(request.getparameter("typeid");int pageindex=integer.parseint(request.getparameter("pageindex");page page=new page(pageindex);request.setattribute("page", page);list<p

56、roduct> products=productbiz.getbyproducttype(typeid,page);request.setattribute("productsbytype", products);producttype pt=producttypebiz.getbyid(typeid);request.setattribute("producttype", pt);return mapping.findforward("ok");catch(exception e)e.printstacktrace();ret

57、urn mapping.findforward("error");public actionforward queryallproducts(actionmapping mapping,actionform form,httpservletrequest request,httpservletresponse response)trystring strpi=request.getparameter("pageindex");page page=null;if(strpi=null)page=new page(1,7);elsepage=new page

58、(integer.parseint(strpi),7);list<product> allproducts=productbiz.getall(page);request.setattribute("allproducts", allproducts);request.setattribute("page", page);return mapping.findforward("ok");catch(exception e)e.printstacktrace();return mapping.findforward(&quo

59、t;error");在struts-config.xml 配置剛寫好的action、form。配置節(jié)選如下:<struts-config><!配置form -><form-beans><form-bean name="productform" type="com.den.agentshopping.form.productform"></form-bean><!其他form不再列出 -></form-beans><!全局頁面跳轉(zhuǎn)配置 -><global-forwards><forward name="ok" path="/user/ok.jsp"></forward><forward name="error" path="/user/error.jsp"></forward></global-forwards><action-mappings><!- 產(chǎn)品管理 actions -> <action path

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論