計(jì)算機(jī)專業(yè)-優(yōu)秀畢業(yè)設(shè)計(jì)-OA辦公自動(dòng)化系統(tǒng)_第1頁(yè)
計(jì)算機(jī)專業(yè)-優(yōu)秀畢業(yè)設(shè)計(jì)-OA辦公自動(dòng)化系統(tǒng)_第2頁(yè)
計(jì)算機(jī)專業(yè)-優(yōu)秀畢業(yè)設(shè)計(jì)-OA辦公自動(dòng)化系統(tǒng)_第3頁(yè)
計(jì)算機(jī)專業(yè)-優(yōu)秀畢業(yè)設(shè)計(jì)-OA辦公自動(dòng)化系統(tǒng)_第4頁(yè)
計(jì)算機(jī)專業(yè)-優(yōu)秀畢業(yè)設(shè)計(jì)-OA辦公自動(dòng)化系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

北京理工大學(xué)珠海學(xué)院2010屆本科生畢業(yè)論文Ⅱ2010屆本科生畢業(yè)論文ⅠOA辦公自動(dòng)化系統(tǒng)摘要傳統(tǒng)的辦公模式主要以紙介質(zhì)為主,在信息革命的浪潮中,顯然已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足高效率、快節(jié)奏的現(xiàn)代工作和生活的需要。如何實(shí)現(xiàn)信息處理的自動(dòng)化和辦公的無紙化逐步得到了人們的重視。Internet/Intranet的迅猛發(fā)展,為信息的交流和共享,團(tuán)隊(duì)的協(xié)同運(yùn)作提供了技術(shù)的保證,同時(shí)也預(yù)示著網(wǎng)絡(luò)化辦公時(shí)代來臨。利用網(wǎng)絡(luò)通訊基礎(chǔ)及先進(jìn)的網(wǎng)絡(luò)應(yīng)用平臺(tái),建設(shè)一個(gè)安全、可靠、開放、高效的信息網(wǎng)絡(luò)和辦公自動(dòng)化、信息管理電子化系統(tǒng),為管理部門提供現(xiàn)代化的日常辦公條件及豐富的綜合信息服務(wù),提高辦公效率和管理水平,實(shí)現(xiàn)企業(yè)各部門日常業(yè)務(wù)工作的規(guī)范化、電子化、標(biāo)準(zhǔn)化,增強(qiáng)檔案的可管理性,實(shí)現(xiàn)信息的在線查詢、借閱,最終實(shí)現(xiàn)“無紙”辦公。辦公自動(dòng)化還是一個(gè)企業(yè)與整個(gè)世界聯(lián)系的渠道,企業(yè)的Intranet網(wǎng)絡(luò)可以和Internet相聯(lián)。一方面,企業(yè)的員工可以在Internet上查找有關(guān)的技術(shù)資料、市場(chǎng)行情,與現(xiàn)有或潛在的客戶、合作伙伴聯(lián)系;另一方面,其他企業(yè)可以通過Internet訪問你對(duì)外發(fā)布的企業(yè)信息,如企業(yè)介紹、生產(chǎn)經(jīng)營(yíng)業(yè)績(jī)、業(yè)務(wù)范圍、產(chǎn)品/服務(wù)等信息。從而起到宣傳介紹的作用。隨著辦公自動(dòng)化的推廣,越來越多的企業(yè)將通過自己的Intranet網(wǎng)絡(luò)聯(lián)接到Internet上,所以這種網(wǎng)上交流的潛力將非常巨大。關(guān)鍵詞:OAMyEclipseTomcatJ2EEOn-lineBusinessEnterpriseTransactstheAutomationABSTRACTThisvolumeisdividedintosixtotally,introducingtheon-linebusinessenterprisetotransactthedevelopmentbackgroundoftheautomationfirst,theOAsaysall,developpingthetoolandtechniqueresearches.Issystemanalysisandthesystemdesignsthattransactstoautomatethissystemtothenetbusinessenterprisethenextinorder,includethemainfunction,carryoutthetarget,thesystemstructurediagram,thebusinessflowchart,thedatabasedesign,thedocumentconfiguringsetc..Thentransactedtherealizationoftheautomationfunctiontodotothewholeon-linebusinessenterprisetoelaboratedetailedly,includetocarryoutthetarget,carryingouttheprocess,thecodeanalysiswait.MakeuseoftheDreamweaveradequatelytocompletethecreationthatthewholeon-linebusinessenterprisetransactstheautomation,makethissystemfunctionmoreperfect,thepageenrichesthebeautymore.KeywordsTheASPon-linebusinessenterprisetransactstheautomationⅣⅢ目錄摘要 引言傳統(tǒng)的辦公模式主要以紙介質(zhì)為主,在信息革命的浪潮中,顯然已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足高效率、快節(jié)奏的現(xiàn)代工作和生活的需要。如何實(shí)現(xiàn)信息處理的自動(dòng)化和辦公的無紙化逐步得到了人們的重視。Internet/Intranet的迅猛發(fā)展,為信息的交流和共享,團(tuán)隊(duì)的協(xié)同運(yùn)作提供了技術(shù)的保證,同時(shí)也預(yù)示著網(wǎng)絡(luò)化辦公時(shí)代來臨。利用網(wǎng)絡(luò)通訊基礎(chǔ)及先進(jìn)的網(wǎng)絡(luò)應(yīng)用平臺(tái),建設(shè)一個(gè)安全、可靠、開放、高效的信息網(wǎng)絡(luò)和辦公自動(dòng)化、信息管理電子化系統(tǒng),為管理部門提供現(xiàn)代化的日常辦公條件及豐富的綜合信息服務(wù),提高辦公效率和管理水平,實(shí)現(xiàn)企業(yè)各部門日常業(yè)務(wù)工作的規(guī)范化、電子化、標(biāo)準(zhǔn)化,增強(qiáng)檔案的可管理性,實(shí)現(xiàn)信息的在線查詢、借閱,最終實(shí)現(xiàn)“無紙”辦公?!盁o紙”辦公不僅比較環(huán)保,節(jié)省了紙張的“浪費(fèi)”,而且能夠縮短辦公人員的辦公時(shí)間,對(duì)于提高企業(yè)效率上有一定幫助。所以企業(yè)引進(jìn)辦公自動(dòng)化系統(tǒng)有一定必要性。傳統(tǒng)JSP+JAVABEAN技術(shù)基本可以完成辦公自動(dòng)化系統(tǒng),但開發(fā)難度,開發(fā)周期等都比較大,它適合于開發(fā)難度比較低而且需求比較明確的系統(tǒng)。本系統(tǒng)采用Struts,Hibernate,Spring來開發(fā),工作流方面采用JBPM技術(shù),大大降低開發(fā)難度和開發(fā)周期,對(duì)于系統(tǒng)可擴(kuò)展性和可維護(hù)性有很大程度的提高。對(duì)于系統(tǒng)權(quán)限方面,市面上存在一些比較簡(jiǎn)單的權(quán)限設(shè)計(jì)方案,雖然從根本上能實(shí)現(xiàn)權(quán)限的授權(quán)和驗(yàn)證,但不利如權(quán)限模塊的可擴(kuò)展性?;蛘叽嬖谶^于復(fù)雜,但無用的設(shè)計(jì),不利于系統(tǒng)的可理解性,也不利于維護(hù)。所以本系統(tǒng)從對(duì)RBAC模型的理解上擴(kuò)展,形成一套擴(kuò)展性和維護(hù)性相對(duì)較好的模型,既能滿足大部分國(guó)內(nèi)市場(chǎng)的需求,也能很好的完成權(quán)限的授權(quán)和驗(yàn)證。2辦公自動(dòng)化系統(tǒng)需求分析2.1系統(tǒng)功能模塊序號(hào)功能名稱功能需求標(biāo)識(shí)優(yōu)先級(jí)簡(jiǎn)要描述個(gè)人辦公我的辦公桌高打開個(gè)人辦公桌,在個(gè)人辦公桌上,是到達(dá)各種管理功能的快捷鏈接我的便簽低隨手記錄的信息我的任務(wù)低任務(wù)管理通信錄低個(gè)人通信錄公文管理公文維護(hù)高各種類型的公文管理、審批公文等歸檔處理高對(duì)已完成流轉(zhuǎn)的公文進(jìn)行歸檔公共信息信息管理中進(jìn)行新聞、通知、期刊、知識(shí)和規(guī)章制度的發(fā)布和管理,使企業(yè)的信息和知識(shí)快速傳播和轉(zhuǎn)移。行政辦公會(huì)議管理中管理會(huì)議室的占用情況資產(chǎn)管理低管理企業(yè)的資產(chǎn)信息用品管理低管理企業(yè)用品的申請(qǐng)車輛管理低企業(yè)車輛的管理圖書管理低圖書的借出管理消息管理收件箱中接收的所有消息發(fā)件箱中發(fā)送的所有消息垃圾箱中已刪除的消息聊天記錄中跟某個(gè)用戶的聊天記錄工作流程流程管理高如何定義企業(yè)的流程(可以靈活定義各種流程)表單定義高如何針對(duì)不同的流程定義表單組織管理機(jī)構(gòu)管理高公司組織架構(gòu)管理人員管理高公司人員管理權(quán)限管理模塊管理高系統(tǒng)所有模塊的管理角色管理高系統(tǒng)的角色定義、給角色分配權(quán)限等用戶管理高系統(tǒng)帳號(hào)的分配、給用戶分配角色、給用戶分配權(quán)限等系統(tǒng)管理密碼修改低代碼定義低系統(tǒng)初始化低人事檔案人員履歷低轉(zhuǎn)正申請(qǐng)低離職申請(qǐng)低員工考勤低辦公自動(dòng)化系統(tǒng)需求還是比較多的,在分析需求后劃分系統(tǒng)模塊,根據(jù)模塊的特點(diǎn)和所用技術(shù)劃分出優(yōu)先級(jí)并制定開發(fā)計(jì)劃,從優(yōu)先級(jí)比較高的模塊開始著手開發(fā)。這樣從難到易的開發(fā)模式由利于節(jié)省開發(fā)成本,和縮短開發(fā)迭代的周期。本系統(tǒng)將只實(shí)現(xiàn)優(yōu)先級(jí)為高的需求。在工作流模塊中,流程管理里將實(shí)現(xiàn)流程的添加,更新和刪除,通過結(jié)合JBPM使得流程管理功能更加強(qiáng)大;然后表單定義描述的是對(duì)動(dòng)態(tài)表單的實(shí)現(xiàn),每個(gè)流程可以對(duì)應(yīng)不同的表單,這完全是用戶自定義的。在組織管理模塊中,機(jī)構(gòu)管理將實(shí)現(xiàn)機(jī)構(gòu)的增,刪,改,查操作,鑒于機(jī)構(gòu)有層次關(guān)系,機(jī)構(gòu)的顯示將會(huì)采用樹形結(jié)構(gòu)顯示。在權(quán)限管理模塊中,分別提供模塊,角色和用戶的增,刪,改,查操作,用戶定義好模塊之后,在角色管理里,能夠按照不同的角色分別相應(yīng)的模塊增,刪,改,查操作,為了滿足更大的一部分需求,本系統(tǒng)除了可以為角色授權(quán)之外,還可以給用戶單獨(dú)授權(quán),在用戶管理里,顯示所有用戶,并能為之授權(quán)。最后在公文管理模塊中,用戶可以創(chuàng)建公文并綁定到某一工作流里,通過對(duì)工作流的觸發(fā),把公文提交到下一流程,最終實(shí)現(xiàn)“無紙“辦公的目的。3系統(tǒng)總體設(shè)計(jì)3.1系統(tǒng)架構(gòu)設(shè)計(jì)J2EE技術(shù)發(fā)展到今天,已有很多成熟的技術(shù)和思想,在技術(shù)和思想上兩者可謂相輔相成,互相影響,缺一不可。技術(shù)和思想的不斷革命為J2EE系統(tǒng)的開發(fā)注入不少動(dòng)力,并且不斷帶來變化。從以前的純JSP開發(fā)到JSP+JAVABEAN,再到MVC技術(shù)的普及等等,都帶來革命性的影響。到了現(xiàn)在,J2EE各項(xiàng)技術(shù)和思想上的不斷革新,程序員們陸續(xù)提倡要回歸軟件本身,回歸軟件的核心,即為用戶解決領(lǐng)域相關(guān)問題的能力,其他的一些特性,盡管他們也許是必需的,但也是用來支持這個(gè)核心目的的。解決領(lǐng)域相關(guān)問題要求我們更加關(guān)注領(lǐng)域?qū)ο竽P偷慕?,而解決來自領(lǐng)域方面的問題的軟件本分通常只占整個(gè)軟件系統(tǒng)的一小部分,這于它的重要性相比是不成正比的。為了應(yīng)用優(yōu)秀的領(lǐng)域建模技術(shù),我們需要把領(lǐng)域?qū)ο蟾到y(tǒng)的其他功能分離出去,才能避免另領(lǐng)域概念雨其他跟軟件技術(shù)相關(guān)的概念混淆或者在龐大的系統(tǒng)中失去對(duì)領(lǐng)域的把握。這種成熟的領(lǐng)域分離技術(shù)早已出現(xiàn),它為我們打下良好的基礎(chǔ)系統(tǒng)架構(gòu)分層。傳統(tǒng)三層架構(gòu)早已在J2EE項(xiàng)目中得到廣泛應(yīng)用,它主要分為:表現(xiàn)層,業(yè)務(wù)邏輯層和持久化層。將一個(gè)復(fù)雜的程序進(jìn)行層次劃分。為每一層進(jìn)行設(shè)計(jì),每層都是高內(nèi)聚的而且只依賴于它的下層,每層具體職責(zé)為:表現(xiàn)層負(fù)責(zé)向用戶顯示信息,并解析用戶命令。定義軟件可以完成的工作,并指揮下層操作領(lǐng)域?qū)ο髞斫鉀Q問題。業(yè)務(wù)邏輯層該層對(duì)業(yè)務(wù)影響深遠(yuǎn),他包含業(yè)務(wù)規(guī)則或者知識(shí),完成系統(tǒng)主要功能需求,操作領(lǐng)域?qū)ο蠡ハ嗪献鹘鉀Q問題持久化層為上層提供通用技術(shù)能力,把領(lǐng)域?qū)ο蟪志没4娴綌?shù)據(jù)庫(kù)中,為下次訪問該對(duì)象提供條件各層分工合作,層于層之間做到低耦合,每層間的類做到高內(nèi)聚,使系統(tǒng)可維護(hù)性和擴(kuò)展性得到巨大的提升。3.2本系統(tǒng)架構(gòu)設(shè)計(jì)及系統(tǒng)技術(shù)介紹本系統(tǒng)采用JAVA語(yǔ)言進(jìn)行開發(fā),面向?qū)ο筇匦詾橄到y(tǒng)的可維護(hù)性和可擴(kuò)展性提供了根本的支持,而且JAVA開放源代碼特性,使其迅速發(fā)展,涌現(xiàn)大量成熟技術(shù)支持,尤其在JAVAEE領(lǐng)域,更可謂前無古人。JAVAEE包含13種技術(shù),當(dāng)然現(xiàn)在可能已經(jīng)不止,當(dāng)今JAVAEE領(lǐng)域里更多的是使用Struts,Hibernate,Spring的架構(gòu)方式,現(xiàn)在分別介紹一下這三種技術(shù),然后就這三種技術(shù)可以解決的問題作陳述,再而討論本系統(tǒng)采用這三種技術(shù)的必要性。3.3StrutsStruts作為一個(gè)開放原代碼的應(yīng)用框架,在最近幾年得到了飛速的發(fā)展,在JSPWeb應(yīng)用開發(fā)中應(yīng)用得非常廣泛,有的文獻(xiàn)上說它已經(jīng)成為JSPWeb應(yīng)用框架的事實(shí)上的標(biāo)準(zhǔn)。Struts是一個(gè)實(shí)現(xiàn)了Model2的MVC框架,要介紹Struts的話,就要從JSPWeb應(yīng)用的兩種基本的結(jié)構(gòu)模式:Model1和Model2說起,

Model1結(jié)構(gòu)如圖1所示:mode11是一個(gè)以JSP文件為中心的模式,在這種模式中JSP頁(yè)面不僅負(fù)責(zé)表現(xiàn)邏輯,也負(fù)責(zé)控制邏輯。專業(yè)書籍上稱之為邏輯耦合在頁(yè)面中,這種處理方式,對(duì)一些規(guī)模很小的項(xiàng)目如:一個(gè)簡(jiǎn)單的留言簿,也沒什么太大的壞處,實(shí)際上,人們開始接觸一些對(duì)自己來說是新的東西的時(shí)候,比如,用JSP訪問數(shù)據(jù)庫(kù)時(shí),往往喜歡別人能提供一個(gè)包含這一切的單個(gè)JSP頁(yè)面,因?yàn)檫@樣在一個(gè)頁(yè)面上他就可以把握全局,便于理解。但是,用Model1模式開發(fā)大型時(shí),程序流向由一些互相能夠感知的頁(yè)面決定,當(dāng)頁(yè)面很多時(shí)要清楚地把握其流向?qū)⑹呛軓?fù)雜的事情,當(dāng)您修改一頁(yè)時(shí)可能會(huì)影響相關(guān)的很多頁(yè)面,大有牽一發(fā)而動(dòng)全身的感覺,使得程序的修改與維護(hù)變得異常困難;還有一個(gè)問題就是程序邏輯開發(fā)與頁(yè)面設(shè)計(jì)糾纏在一起,既不便于分工合作也不利于代碼的重用,這樣的程序其健壯性和可伸縮性都不好。

GradyBooch等人在UML用戶指南一書中,強(qiáng)調(diào)建模的重要性時(shí),打了一個(gè)制作狗窩、私人住宅、和大廈的形象比喻來說明人們處理不同規(guī)模的事物時(shí)應(yīng)該采用的合理方法一樣,人們對(duì)不同規(guī)模的應(yīng)用程序也應(yīng)該采用不同的模式。

為了克服Model1的缺陷,人們引入了Model2,如下圖所示:它引入了"控制器"這個(gè)概念,控制器一般由servlet來?yè)?dān)任,客戶端的請(qǐng)求不再直接送給一個(gè)處理業(yè)務(wù)邏輯的JSP頁(yè)面,而是送給這個(gè)控制器,再由控制器根據(jù)具體的請(qǐng)求調(diào)用不同的事務(wù)邏輯,并將處理結(jié)果返回到合適的頁(yè)面。因此,這個(gè)servlet控制器為應(yīng)用程序提供了一個(gè)進(jìn)行前-后端處理的中樞。一方面為輸入數(shù)據(jù)的驗(yàn)證、身份認(rèn)證、日志及實(shí)現(xiàn)國(guó)際化編程提供了一個(gè)合適的切入點(diǎn);另一方面也提供了將業(yè)務(wù)邏輯從JSP文件剝離的可能。業(yè)務(wù)邏輯從JSP頁(yè)面分離后,JSP文件蛻變成一個(gè)單純完成顯示任務(wù)的東西,這就是常說的View。而獨(dú)立出來的事務(wù)邏輯變成人們常說的Model,再加上控制器Control本身,就構(gòu)成了MVC模式。實(shí)踐證明,MVC模式為大型程序的開發(fā)及維護(hù)提供了巨大的便利。

其實(shí),MVC開始并不是為Web應(yīng)用程序提出的模式,傳統(tǒng)的MVC要求M將其狀態(tài)變化通報(bào)給V,但由于Web瀏覽器工作在典型的拉模式而非推模式,很難做到這一點(diǎn)。因此有些人又將用于Web應(yīng)用的MVC稱之為MVC2。正如上面所提到的MVC是一種模式,當(dāng)然可以有各種不同的具體實(shí)現(xiàn),包括您自己就可以實(shí)現(xiàn)一個(gè)體現(xiàn)MVC思想的程序框架,Struts就是一種具體實(shí)現(xiàn)MVC2的程序框架。它的大致結(jié)構(gòu)如下圖所示:上圖基本勾勒出了一個(gè)基于Struts的應(yīng)用程序的結(jié)構(gòu),從左到右,分別是其表示層(view)、控制層(controller)、和模型層(Model)。其表示層使用Struts標(biāo)簽庫(kù)構(gòu)建。來自客戶的所有需要通過框架的請(qǐng)求統(tǒng)一由叫ActionServlet的servlet接收(ActionServletStruts已經(jīng)為我們寫好了,只要您應(yīng)用沒有什么特別的要求,它基本上都能滿足您的要求),根據(jù)接收的請(qǐng)求參數(shù)和Struts配置(struts-config.xml)中ActionMapping,將請(qǐng)求送給合適的Action去處理,解決由誰做的問題,它們共同構(gòu)成Struts的控制器。Action則是Struts應(yīng)用中真正干活的組件,開發(fā)人員一般都要在這里耗費(fèi)大量的時(shí)間,它解決的是做什么的問題,它通過調(diào)用需要的業(yè)務(wù)組件(模型)來完成應(yīng)用的業(yè)務(wù),業(yè)務(wù)組件解決的是如何做的問題,并將執(zhí)行的結(jié)果返回一個(gè)代表所需的描繪響應(yīng)的JSP(或Action)的ActionForward對(duì)象給ActionServlet以將響應(yīng)呈現(xiàn)給客戶。

過程如圖四所示:3.4ORM對(duì)象-關(guān)系映射就是Java應(yīng)用中的對(duì)象到關(guān)系數(shù)據(jù)庫(kù)中的表的自動(dòng)的(和透明的)持久化,使用元數(shù)據(jù)(metadata)描述對(duì)象與數(shù)據(jù)庫(kù)間的映射。本質(zhì)上,ORM的工作是將數(shù)據(jù)從一種表示(雙向)轉(zhuǎn)換為另一種。3.5Hibernatehibernate是一個(gè)基于orm的開源框架,也是一個(gè)輕量級(jí)框架,它是在JDBC之上提供一層薄薄的封裝,在提供完全透明的持久化機(jī)制的同時(shí)又提供盡可能多的靈活性。架構(gòu)圖如下:1hibernate是一個(gè)對(duì)象/關(guān)系映射的框架,有了hibernate可以使我們不再關(guān)心數(shù)據(jù)庫(kù)的底層結(jié)構(gòu)只需要專心我們的對(duì)象是實(shí)現(xiàn)了完全面向?qū)ο蟮木幊獭?/p>

2透明持久化,進(jìn)行持久化的對(duì)象是單線程的而且對(duì)象的生命周期很短,當(dāng)對(duì)象被hibernate持久化的時(shí)候

對(duì)象沒有太過依賴于hibernate并沒有實(shí)現(xiàn)某個(gè)接口或者那個(gè)框架它們只是和session進(jìn)行關(guān)聯(lián)hibernate提供很好的session管理的方式,當(dāng)對(duì)象持久化的操作完成后session就會(huì)自動(dòng)的關(guān)閉這樣對(duì)象又能夠被任何的其他層使用。

3框架的特性,框架是一個(gè)輕量級(jí)的框架沒有入侵性

4hibernate的緩存機(jī)制

hibernate提供了一級(jí)緩存session二級(jí)緩存sessionFactory

5hibernate是jdbc的輕量級(jí)的對(duì)象封裝。是可以獨(dú)立的對(duì)象持久層框架??梢杂迷谌魏蝚dbc可以使用的場(chǎng)合,比如說java程序的數(shù)據(jù)庫(kù)的訪問,web程序的數(shù)據(jù)庫(kù)的訪問。它是指和jdbc有關(guān)系和運(yùn)用hibernate的程序關(guān)可以這樣說只要是能夠使用jdbc鏈接數(shù)據(jù)庫(kù)的程序都能夠使用hibernate進(jìn)行數(shù)據(jù)庫(kù)的鏈接,它和服務(wù)器或者程序也不存在兼容性。

6內(nèi)存消耗問題在開發(fā)小項(xiàng)目關(guān)系單一的話那么eb的效率最高。

jdbc次之

hibernate也許是最低的

但是對(duì)于大的項(xiàng)目關(guān)系非常復(fù)雜的來說hibernate的處理速度非常驚人,jdbc次之,eb幾乎根本就不能夠?qū)崿F(xiàn)。

hibernate的缺點(diǎn)

7hibernate適合各種數(shù)據(jù)庫(kù)從一對(duì)一到多對(duì)多關(guān)系操作方便。3.6IOC(DI)分離關(guān)注(SeparationofConcerns:SOC)是Ioc模式和AOP產(chǎn)生最原始動(dòng)力,通過功能分解可得到關(guān)注點(diǎn),這些關(guān)注可以是組件Components,方面Aspects或服務(wù)Services。Ioc英文為InversionofControl,即反轉(zhuǎn)模式,這里有著名的好萊塢理論:你呆著別動(dòng),到時(shí)我會(huì)找你。后被MartinFowler改名為DependencyInjection依賴注射,也就是將類之間的關(guān)系通過第三方進(jìn)行注射,不需要類自己去解決調(diào)用關(guān)系。其實(shí)Ioc模式也是解決調(diào)用者和被調(diào)用者之間的一種關(guān)系,由于被調(diào)用者名稱寫入了調(diào)用者的代碼中,這產(chǎn)生了一個(gè)接口實(shí)現(xiàn)的原罪:彼此聯(lián)系,調(diào)用者和被調(diào)用者有緊密聯(lián)系,在UML中是用依賴Dependency表示。但是這種依賴在分離關(guān)注的思維下是不可忍耐的,必須切割,實(shí)現(xiàn)調(diào)用者和被調(diào)用者解耦,新的Ioc模式DependencyInjection模式由此產(chǎn)生了,DependencyInjection模式是依賴注射的意思,也就是將依賴先剝離,然后在適當(dāng)時(shí)候再注射進(jìn)入。3.7AOPAOP是OOP的延續(xù),是AspectOrientedProgramming的縮寫,意思是面向方面編程。AOP實(shí)際是GoF設(shè)計(jì)模式的延續(xù),設(shè)計(jì)模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標(biāo)的一種實(shí)現(xiàn)。方面(Aspect):對(duì)橫向分布在多個(gè)對(duì)象中的關(guān)注點(diǎn)所做的模塊化。在企業(yè)應(yīng)用中,事務(wù)管理就是一個(gè)典型的橫切關(guān)注點(diǎn)。Spring.NET將方面實(shí)現(xiàn)為Advisor或攔截器(interceptor)。(按:Advisor是通知和切入點(diǎn)的組合,攔截器實(shí)際就是指通知,注意在本文檔中,一般會(huì)把環(huán)繞通知稱為攔截器,而將其它類型的通知稱為通知,這是因?yàn)榄h(huán)繞通知實(shí)現(xiàn)的是AopAlliance.Intercept.IMethodInterceptor接口,而其它通知類型實(shí)現(xiàn)的都是Spring.Aop命名空間下的通知接口。)

連接點(diǎn)(Joinpoint):程序執(zhí)行過程中的一個(gè)點(diǎn),例如對(duì)某個(gè)方法的調(diào)用或者某個(gè)特定異常的拋出都可以稱為連接點(diǎn)。

通知(Advice):AOP框架在某個(gè)連接點(diǎn)所采取的行為。通知有多種類型,包括“環(huán)繞”通知,“前置”通知和“異?!蓖ㄖ?,后文將對(duì)通知類型進(jìn)行討論。包括Spring.NET在內(nèi)的很多AOP框架都把通知建模為攔截器(interceptor),并且會(huì)維護(hù)一個(gè)"包圍"在連接點(diǎn)周圍的攔截器鏈。

切入點(diǎn)(Pointcut):指通知的應(yīng)用條件,用于確定某個(gè)通知要被應(yīng)用到哪些連接點(diǎn)上。AOP框架應(yīng)允許讓開發(fā)人員指定切入點(diǎn),例如,可以使用正則表達(dá)式來指定一個(gè)切入點(diǎn)。

引入(Introduction):向目標(biāo)對(duì)象添加方法或字段的行為。Spring.NET允許為任何目標(biāo)對(duì)象引入新的接口。例如,可以利用引入讓任何對(duì)象在運(yùn)行期實(shí)現(xiàn)IAuditable接口,以簡(jiǎn)化對(duì)象狀態(tài)變化的跟蹤過程。(按:也稱為mixin,混入)

目標(biāo)對(duì)象(Targetobject):指包含連接點(diǎn)的對(duì)象。也稱為被通知或被代理對(duì)象。(按:“被通知對(duì)象”實(shí)際是“被應(yīng)用了通知的對(duì)象”,在譯文中,將advisedobject或proxiedobject統(tǒng)稱為目標(biāo)對(duì)象,這樣更為統(tǒng)一)

AOP代理(AOPproxy):由AOP框架在將通知應(yīng)用于目標(biāo)對(duì)象后創(chuàng)建的對(duì)象。在Spring.NET中,AOP代理是使用IL代碼在運(yùn)行時(shí)創(chuàng)建的動(dòng)態(tài)代理。

織入(Weaving):將方面進(jìn)行組裝,以創(chuàng)建一個(gè)目標(biāo)對(duì)象??椚肟梢栽诰幾g期完成(例如使用Gripper_Loom.NET編譯器),也可以在運(yùn)行時(shí)完成。Spring.NET在運(yùn)行時(shí)執(zhí)行織入。3.8SpingSpring是一個(gè)開源框架,它由RodJohnson創(chuàng)建。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。架構(gòu)圖如下:目的:解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性功能:使用基本的JavaBean代替EJB,并提供了更多的企業(yè)應(yīng)用功能范圍:任何Java應(yīng)用簡(jiǎn)單來說,Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對(duì)象不依賴于Spring的特定類??刂品崔D(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過被動(dòng)的方式傳遞進(jìn)來,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它。面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持。容器——Spring包含并管理應(yīng)用對(duì)象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量級(jí)的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。3.9SSH3.9.1Struts基本原理和解決問題ActionServlet是一個(gè)Servlet類,擴(kuò)展了javax.servlet.http.HttpServlet,實(shí)現(xiàn)了servlet的生命周期的方法(init(),doGet(),doPost(),destroy())之處,還添加了一個(gè)真正處理請(qǐng)求的方法process.,實(shí)際上控制器所執(zhí)行的控制邏輯包含在RequestProcessor類中,而不是ActionServlet類中。RequestProcessor類的process()方法從struts-config.xml文件中根據(jù)請(qǐng)求的URI查找匹配的<action>子元素,并根據(jù)<action>子元素的"name"屬性在該配置文件中查找匹配的<form-bean>子元素。確定下一步要用到的ActionFormBean.,取得FormBean的名稱后,process()方法將創(chuàng)建或檢索由<form-bean>元素的type屬性命名的ActionForm的一個(gè)實(shí)例。然后用再請(qǐng)求提交的值來填充數(shù)據(jù)。并調(diào)用ActionForm的validate()方法驗(yàn)證提交的值。最后process()方法才真正開始處理請(qǐng)求。它首先從<action>元素的type屬性獲得action類的名稱,然后調(diào)用Action類里的execute()方法。由execute()方法返回一個(gè)ActionForward對(duì)象,確定應(yīng)用程序的下一個(gè)視圖。由此可見,Struts為一個(gè)實(shí)現(xiàn)了MVC的框架,其靈活性相當(dāng)高,適合用于絕大多數(shù)JAVAEE應(yīng)用中,可以輕松解決頁(yè)面和控制之間的耦合,對(duì)營(yíng)造一個(gè)良好的系統(tǒng)架構(gòu)起著關(guān)鍵性的作用。3.9.2Hibernate解決問題現(xiàn)在關(guān)系數(shù)據(jù)庫(kù)技術(shù)發(fā)展已相當(dāng)成熟,不僅形成一套理論支持,更有很多成功的關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品,關(guān)系數(shù)據(jù)庫(kù)已經(jīng)成為工業(yè)開發(fā)上的首選。而JAVAEE應(yīng)用中,使用的JAVA是面向?qū)ο蟮恼Z(yǔ)言,其面向?qū)ο筇匦院完P(guān)系數(shù)據(jù)庫(kù)特性明顯截然不同,兩者雖有協(xié)調(diào)之處,當(dāng)總體顯現(xiàn)為不和諧,不協(xié)調(diào)。Hibernate的出現(xiàn)正為解決這一問題,其為一ORM產(chǎn)品,幫助程序員把對(duì)象于對(duì)象之間的關(guān)系“無型”地轉(zhuǎn)化為表于表之間的關(guān)系,完全屏蔽數(shù)據(jù)庫(kù)細(xì)節(jié)??傊?,采用hibernate開發(fā)系統(tǒng),對(duì)于使用面向?qū)ο笏枷腴_發(fā)的程序員來說,更來的自然和協(xié)調(diào)。3.9.3Spring解決問題Spring可以將簡(jiǎn)單的組件配置,組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你。所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測(cè)試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。3.10系統(tǒng)架構(gòu)綜上所述,SSH從架構(gòu)上很好體現(xiàn)系統(tǒng)架構(gòu),故該系統(tǒng)采用SSH技術(shù)進(jìn)行開發(fā)。由于該系統(tǒng)為辦公自動(dòng)化系統(tǒng),需要處理工作流問題,故搭檔JBPM進(jìn)行開發(fā)。系統(tǒng)架構(gòu)圖如下:本系統(tǒng)分為兩層,表現(xiàn)層和持久化層,上圖所示為了表述,把業(yè)務(wù)邏輯層和持久化層畫在一起。因?yàn)榧夹g(shù)上采用hibernate的原因,屏蔽了數(shù)據(jù)庫(kù)細(xì)節(jié),跨數(shù)據(jù)庫(kù)的特性,所以把業(yè)務(wù)邏輯層和持久化層結(jié)合為一層,簡(jiǎn)化系統(tǒng)結(jié)構(gòu),加快開發(fā)速度。4UML建模4.1系統(tǒng)用例圖公文管理用例圖:流程管理4.2系統(tǒng)順序圖1部署流程順序圖:2查看流程3查看待審公文列表4查看公文審批歷史5查看我的公文列表6查看以審公文列表7更新公文8審批公文9提交到流程10添加公文4.3系統(tǒng)活動(dòng)圖即時(shí)認(rèn)證活動(dòng)圖:授權(quán)過程活動(dòng)圖:5數(shù)據(jù)庫(kù)設(shè)計(jì)根據(jù)持久層用hibernate實(shí)現(xiàn)的原則,數(shù)據(jù)庫(kù)表設(shè)計(jì)準(zhǔn)從hibernate表映射原理。5.1Hibernate基本映射原理每一個(gè)類映射成一張表(沒有配置承繼),類中屬性映射成表字段。其他表屬性可個(gè)別配置,如字段類型,字段長(zhǎng)度,字段名稱,表類型等。5.2系統(tǒng)對(duì)象設(shè)計(jì)5.2.1權(quán)限模型基本對(duì)象設(shè)計(jì)RBAC模型簡(jiǎn)介RBAC(Role-BasedAccessControl-基于角色的訪問控制)模型是20世紀(jì)90年代研究出來的一種新模型,但從本質(zhì)上講,這種模型是對(duì)前面描述的訪問矩陣模型的擴(kuò)展。這種模型的基本概念是把許可權(quán)(Permission)與角色(Role)聯(lián)系在一起,用戶通過充當(dāng)合適角色的成員而獲得該角色的許可權(quán)。這種思想世紀(jì)上早在20世紀(jì)70年代的多用戶計(jì)算時(shí)期就被提出來了,但直到20世紀(jì)90年代中后期,RBAC才在研究團(tuán)體中得到一些重視。本章將重點(diǎn)介紹美國(guó)GeorgeMason大學(xué)的RBAC96模型。NIST(TheNationalInstituteofStandardsandTechnology,美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院)標(biāo)準(zhǔn)RBAC模型由4個(gè)部件模型組成,這4個(gè)部件模型分別是基本模型RBAC0(CoreRBAC)、角色分級(jí)模型RBAC1(HierarchalRBAC)、角色限制模型RBAC2(ConstraintRBAC)和統(tǒng)一模型RBAC3(CombinesRBAC)\o"【三皇冠】電腦雙搖桿雙震動(dòng)游戲手柄手感極佳超值底價(jià)"在Kasai系統(tǒng)中,角色之間沒有繼承關(guān)系,也沒有責(zé)任分離關(guān)系,因此基本上是按照RBAC0的方式的?;旧蠈?shí)現(xiàn)了用戶users(USERS)、角色roles(ROLES)、目標(biāo)objects(OBS)、操作operations(OPS)、許可權(quán)permissions(PRMS)五個(gè)基本數(shù)據(jù)元素。同時(shí)Kasai也引入了Group的概念。由于缺乏角色繼承關(guān)系,新建的角色沒有包含任何的資源可供使用,因此角色資源的添加也就變成了一項(xiàng)比較冗繁的工作。但總的來說對(duì)RBAC0模式下來說Kasai還是一款比較讓人滿意的權(quán)限系統(tǒng)。\o"【三皇冠】電腦雙搖桿雙震動(dòng)游戲手柄手感極佳超值底價(jià)"在開源RBAC中,除了Kasai值得稱道外,還有其他幾個(gè)項(xiàng)目也是很值得我們?nèi)リP(guān)注:RoleManager項(xiàng)目、RIWS(RbacImplementasWebServices)項(xiàng)目。在RIWS項(xiàng)目的開發(fā)計(jì)劃中,RIWS開發(fā)團(tuán)隊(duì)揚(yáng)言要實(shí)現(xiàn)RBAC0、RBAC1、RBAC2和RBAC3,所以如果有機(jī)會(huì)還是應(yīng)該去關(guān)注一下這個(gè)項(xiàng)目的進(jìn)展。RBAC0定義了能構(gòu)成一個(gè)RBAC控制系統(tǒng)的最小的元素集合RBAC0類圖:\o"Match's日韓情迷巴洛克OL格調(diào)純銀施華洛世奇水晶耳環(huán)"在RBAC之中,包含用戶users(USERS)、角色roles(ROLES)、目標(biāo)objects(OBS)、操作operations(OPS)、許可權(quán)permissions(PRMS)五個(gè)基本數(shù)據(jù)元素,權(quán)限被賦予角色,而不是用戶,當(dāng)一個(gè)角色被指定給一個(gè)用戶時(shí),此用戶就擁有了該角色所包含的權(quán)限。會(huì)話sessions是用戶與激活的角色集合之間的映射。RBAC0與傳統(tǒng)訪問控制的差別在于增加一層間接性帶來了靈活性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的擴(kuò)展\o"【三皇冠】電腦雙搖桿雙震動(dòng)游戲手柄手感極佳超值底價(jià)"RBAC1引入角色間的繼承關(guān)系RBAC1類圖:角色間的繼承關(guān)系可分為一般繼承關(guān)系和受限繼承關(guān)系。一般繼承關(guān)系僅要求角色繼承關(guān)系是一個(gè)絕對(duì)偏序關(guān)系,允許角色間的多繼承。而受限繼承關(guān)系則進(jìn)一步要求角色繼承關(guān)系是一個(gè)樹結(jié)構(gòu)。\o"【三皇冠】電腦雙搖桿雙震動(dòng)游戲手柄手感極佳超值底價(jià)"RBAC2模型中添加了責(zé)任分離關(guān)系RBAC2類圖:RBAC2的約束規(guī)定了權(quán)限被賦予角色時(shí),或角色被賦予用戶時(shí),以及當(dāng)用戶在某一時(shí)刻激活一個(gè)角色時(shí)所應(yīng)遵循的強(qiáng)制性規(guī)則。責(zé)任分離包括靜態(tài)責(zé)任分離和動(dòng)態(tài)責(zé)任分離。約束與用戶-角色-權(quán)限關(guān)系一起決定了RBAC2模型中用戶的訪問許可。\o"【三皇冠】電腦雙搖桿雙震動(dòng)游戲手柄手感極佳超值底價(jià)"RBAC3包含了RBAC1和RBAC2既提供了角色間的繼承關(guān)系,又提供了責(zé)任分離關(guān)系。建立角色定義表。定出當(dāng)前系統(tǒng)中角色。因?yàn)橛欣^承的問題,所以角色體現(xiàn)出的是一個(gè)樹形結(jié)構(gòu)。本系統(tǒng)權(quán)限設(shè)計(jì)類圖:Role跟User是多對(duì)多關(guān)系,根據(jù)模型設(shè)計(jì)原則,把多對(duì)多關(guān)系拆分成一對(duì)多關(guān)系,并抽象出UserRoles對(duì)象,該對(duì)象用以記錄Role和User之間的關(guān)系和其他不適合放到Role和User里的屬性,同理,Role和User跟Module是多對(duì)多關(guān)系,拆分成一對(duì)多關(guān)系,并抽象出ACL對(duì)象記錄他們之間的關(guān)系和屬性,ACL對(duì)象是權(quán)限模型的核心,記錄了權(quán)限模型中的主要數(shù)據(jù)。Module自己本身是樹狀結(jié)構(gòu),用以模擬有層次關(guān)系的模塊。5.2.1工作流模型基本對(duì)象設(shè)計(jì)公文和用戶是多對(duì)多關(guān)系,把多對(duì)多拆分為一對(duì)多,并抽象出審批歷史對(duì)象,用以記錄公文和用戶之間的信息。這里對(duì)應(yīng)不同的場(chǎng)景公文和用戶都屬于不對(duì)概念的對(duì)象,當(dāng)用戶創(chuàng)建公文的時(shí)候,用戶的身份為創(chuàng)建者,公文為被創(chuàng)建公文;當(dāng)用戶審批公文的時(shí)候,用戶為審批者,公文為被審批公文。流程和公文是一對(duì)一關(guān)系,用于創(chuàng)建流程的時(shí)候可以傳遞公文,表單和流程之間是一對(duì)一關(guān)系,表單里有多個(gè)表單域,所以表單和表單域之間是一對(duì)多關(guān)系,抽象出表單輸入形式,表單域類型和條目,用以記錄詳細(xì)表單域信息,表單域類型和表單輸入形式和表單域是一對(duì)多的關(guān)系,條目為表單域的組合對(duì)象。5.2.2組織機(jī)構(gòu)模型基本對(duì)象設(shè)計(jì)通過分析Orgnization屬于樹狀結(jié)構(gòu),以表現(xiàn)層次結(jié)構(gòu)。6系統(tǒng)詳細(xì)設(shè)計(jì)6.1表現(xiàn)層實(shí)現(xiàn)表現(xiàn)層采用Struts框架實(shí)現(xiàn),首先在web.xml里配置:<servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</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>用以接受所有以.do方式請(qǐng)求過來的request,轉(zhuǎn)向Struts來處理該request,通過用例圖分析,大概抽象出有哪些Action類,再分析所有頁(yè)面提交的參數(shù),抽象出所有Form類。通過在struts-config.xml把Action類和Form類配置上,用以納入Struts的處理。Form類的配置:<form-beans> <form-beanname="orgForm"type="com.zhbit.oa.web.forms.OrgActionForm"></form-bean> <form-beanname="personForm"type="com.bjsxt.oa.web.forms.PersonActionForm"></form-bean> <form-beanname="moduleForm"type="com.zhbit.oa.web.forms.ModuleActionForm"></form-bean> <form-beanname="roleForm"type="com.zhbit.oa.web.forms.RoleActionForm"></form-bean> <form-beanname="userForm"type="com.zhbit.oa.web.forms.UserActionForm"></form-bean> <form-beanname="aclForm"type="com.zhbit.oa.web.forms.AclActionForm"></form-bean> <form-beanname="workflowForm"type="com.zhbit.oa.web.forms.WorkflowActionForm"></form-bean> <form-beanname="documentForm"type="com.zhbit.oa.web.forms.DocumentActionForm"></form-bean> <form-beanname="flowFormForm"type="com.zhbit.oa.web.forms.FlowFormActionForm"></form-bean> <form-beanname="meetingRoomForm"type="com.zhbit.oa.web.forms.MeetingRoomActionForm"></form-bean> </form-beans>Action類的配置(一部分):<action path="/org" type="org.springframework.web.struts.DelegatingActionProxy" name="orgForm" scope="request" parameter="method" > <forwardname="index"path="/org/index.jsp"></forward> <forwardname="add_input"path="/org/add_input.jsp"/> <forwardname="select"path="/org/select.jsp"/> </action> <action path="/org_tree" type="org.springframework.web.struts.DelegatingActionProxy" name="orgForm" scope="request" parameter="method" > <forwardname="index"path="/org_tree/index.jsp"></forward> <forwardname="add_input"path="/org_tree/add_input.jsp"></forward> <forwardname="add_success"path="/org_tree/add_success.jsp"></forward> </action> 處理異常:通過配置全局配置來處理異常:<exception key="errors.detail" type="java.lang.Exception" path="/common/exception.jsp" scope="request" handler="com.bjsxt.oa.web.SystemExceptionHandler" ></exception>6.2業(yè)務(wù)邏輯層持久層實(shí)現(xiàn)6.2.1SSH整合基于hibernate的各個(gè)優(yōu)點(diǎn),加速開發(fā),跨數(shù)據(jù)庫(kù)等特點(diǎn),業(yè)務(wù)邏輯層和持久化層耦合成一層進(jìn)行開發(fā)。用Spring整合整個(gè)系統(tǒng)開發(fā)。首先配置web.xml:<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>用以初始化Spring容器,以便項(xiàng)目運(yùn)行時(shí)可以動(dòng)態(tài)注入對(duì)象。 在web.xml里配置路徑以便系統(tǒng)讀取Spring配置文件,如下:<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value></context-param>然后配置hibernate所需要的文件信息,跟住整個(gè)系統(tǒng)的領(lǐng)域模型,創(chuàng)建出系統(tǒng)所需要的對(duì)象,并創(chuàng)建出所對(duì)應(yīng)的*.hbm.xml文件。再配置hibernate.cfg.xml里的連接數(shù)據(jù)庫(kù)等的基本信息,如下:<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><propertyname="hibernate.connection.url">jdbc:mysql:///oa</property><propertyname="hibernate.connection.username">root</property><propertyname="hibernate.connection.password">root</property><propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><propertyname="hibernate.show_sql">true</property><propertyname="hibernate.hbm2ddl.auto">update</property>并把所有*.hbm.xml文件配置到hibernate.cfg.xml里,如下:<mappingresource="com/zhbit/oa/model/ACL.hbm.xml"/><mappingresource="com/zhbit/oa/model/ApproveInfo.hbm.xml"/><mappingresource="com/zhbit/oa/model/Document.hbm.xml"/><mappingresource="com/zhbit/oa/model/Module.hbm.xml"/><mappingresource="com/zhbit/oa/model/MeetingRoom.hbm.xml"/><mappingresource="com/zhbit/oa/model/MeetingRoomApply.hbm.xml"/><mappingresource="com/zhbit/oa/model/Organization.hbm.xml"/><mappingresource="com/zhbit/oa/model/Person.hbm.xml"/><mappingresource="com/zhbit/oa/model/Role.hbm.xml"/><mappingresource="com/zhbit/oa/model/User.hbm.xml"/><mappingresource="com/zhbit/oa/model/UsersRoles.hbm.xml"/><mappingresource="com/zhbit/oa/model/Workflow.hbm.xml"/><mappingresource="com/bjsxt/oa/model/FlowForm.hbm.xml"/><mappingresource="com/bjsxt/oa/model/FieldInput.hbm.xml"/><mappingresource="com/bjsxt/oa/model/FieldType.hbm.xml"/><mappingresource="com/bjsxt/oa/model/FormField.hbm.xml"/>配置log4j以便記錄日志信息,把perties放到classpath下。再配置上讀取hibernate信息:<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propertyname="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean> 6.2.2JBPM介紹jBPM,全稱是JavaBusinessProcessManagement,是一種基于J2EE的輕量級(jí)工作流管理系統(tǒng)。jBPM是公開源代碼項(xiàng)目,它使用要遵循ApacheLicense。jBPM在2004年10月18日,發(fā)布了2.0版本,并在同一天加入了JBoss,成為了JBoss企業(yè)中間件平臺(tái)的一個(gè)組成部分,它的名稱也改成JBossjBPM。隨著jBPM加入JBoss組織,jBPM也將進(jìn)入一個(gè)全新的發(fā)展時(shí)代,它的前景是十分光明的。

jBPM最大的特色就是它的商務(wù)邏輯定義沒有采用目前的一些規(guī)范,如WfMC′sXPDL,BPML,ebXML,BPEL4WS等,而是采用了它自己定義的JBossjBPMProcessdefinitionlanguage(jPdl)。jPdl認(rèn)為一個(gè)商務(wù)流程可以被看作是一個(gè)UML狀態(tài)圖。jPdl就是詳細(xì)定義了這個(gè)狀態(tài)圖的每個(gè)部分,如起始、結(jié)束狀態(tài),狀態(tài)之間的轉(zhuǎn)換等。

jBPM的另一個(gè)特色是它使用Hibernate來管理它的數(shù)據(jù)庫(kù)。Hibernate是目前Java領(lǐng)域最好的一種數(shù)據(jù)持久層解決方案。通過Hibernate,jBPM將數(shù)據(jù)的管理職能分離出去,自己專注于商務(wù)邏輯的處理。6.2.2工作流整合把JBPM所需要的.JAR包放到LIB目錄下,然后在hibernate.hbm.xml配置上JBPM所需要的所有持久化類,再把jbpm.cfg.xml放到classpath下,最后在Spring配置文件里把配置上:<beanid="jbpmConfiguration"class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean"> <propertyname="configuration"value="classpath:jbpm.cfg.xml"></property> </bean>6.2.3接口設(shè)計(jì)WorkflowManager設(shè)計(jì)如下:publicinterfaceWorkflowManager{ /** *部署流程定義 *@paramprocessDefinition *@paramprocessImage */ publicvoiddeployProcessDefinition(byte[]processDefinition,byte[]processImage); /** *查找特定流程定義信息 *@paramworkflowId流程標(biāo)識(shí)(ID) *@return */ publicWorkflowfindWorkflow(intworkflowId); /** *刪除流程定義 *@paramworkflowId流程標(biāo)識(shí)(ID) */ publicvoiddelWorkflow(intworkflowId); /** *查詢已有的所有流程定義信息 *@return列表的元素是:Workflow對(duì)象 */ publicListsearchAllWorkflows(); /** *添加流程實(shí)例 *@paramworkflowName流程名稱 *@paramdocumentId公文標(biāo)識(shí) *@return流程實(shí)例標(biāo)識(shí) */ publiclongaddProcessInstance(StringworkflowName,intdocumentId); /** *刪除流程實(shí)例 *@paramprocessInstanceId流程實(shí)例的標(biāo)識(shí) */ publicvoiddelProcessInstance(longprocessInstanceId); /** *查找流轉(zhuǎn)到某個(gè)用戶那里的所有公文 *@paramusername用戶帳號(hào) *@return公文的標(biāo)識(shí)列表,其元素是int類型 */ publicListsearchApprovingDocuments(Stringusername); /** *搜索下一步的流向,即下一步都可以走哪些路徑 *@paramusername用戶標(biāo)識(shí) *@paramprocessInstanceId流程實(shí)例標(biāo)識(shí) *@return流向的名稱列表 */ publicListsearchNextTransitions(Stringusername,longprocessInstanceId); /** *流向下一步 *@paramusername用戶帳號(hào) *@paramprocessInstanceId流程實(shí)例標(biāo)識(shí) *@paramtransitionName流向名稱 *@return返回狀態(tài)信息,因?yàn)楣牡牧鬓D(zhuǎn)將會(huì)觸發(fā)公文狀態(tài)的改變! */ publicStringflowToNextStep(Stringusername,longprocessInstanceId,StringtransitionName);}根據(jù)JPBM要求,部署流程之前需要流程定義文件,設(shè)計(jì)publicvoiddeployProcessDefinition(byte[]processDefinition,byte[]processImage);方法把流程定義文件和圖片存儲(chǔ)到數(shù)據(jù)庫(kù)里;有了流程定義文件之后,需要把流程實(shí)例記錄到數(shù)據(jù)里,設(shè)計(jì)publiclongaddProcessInstance(StringworkflowName,intdocumentId);方法,可以把流程實(shí)例添加到JBPM引擎里;流程開始之后需要觸發(fā)流程向下流動(dòng),設(shè)計(jì)publicListsearchNextTransitions(Stringusername,longprocessInstanceId);方法,可以下一步流程節(jié)點(diǎn)。 AclManager接口設(shè)計(jì):publicinterfaceAclManager{ /** *授權(quán) *@paramprincipalType主體類型 *@paramprincipalSn主體標(biāo)識(shí) *@paramresourceSn資源標(biāo)識(shí) *@parampermission權(quán)限:C/R/U/D *@paramyes是否允許,true表示允許;false表示不允許 */ publicvoidaddOrUpdatePermission( StringprincipalType, intprincipalSn, intresourceSn, intpermission, booleanyes ); /** *刪除授權(quán) *@paramprincipalType *@paramprincipalSn *@paramresourceSn */ publicvoiddelPermission( StringprincipalType, intprincipalSn, intresourceSn ); /** *添加或更新用戶的繼承特性 *@paramuserId用戶標(biāo)識(shí) *@paramresourceSn資源標(biāo)識(shí) *@paramyestrue表示繼承,false表示不繼承 */ publicvoidaddOrUpdateUserExtends(intuserId,intresourceSn,booleanyes); /** *判斷用戶對(duì)某模塊的某操作的授權(quán)(允許或不允許) *@paramuserId用戶標(biāo)識(shí) *@paramreourceSn資源標(biāo)識(shí)(id) *@parampermission權(quán)限(C/R/U/D) *@return允許(true)或不允許(false) */ publicbooleanhasPermission(intuserId,intreourceId,intpermission); /** *判斷用戶對(duì)某模塊的某操作的授權(quán)(允許或不允許) *@paramuserId用戶ID *@paramreourceSn資源唯一標(biāo)識(shí)(sn) *@parampermission權(quán)限(C/R/U/D) *@return允許(true)或不允許(false) */ publicbooleanhasPermissionByResourceSn(intuserId,StringreourceSn,intpermission); /** *搜索某個(gè)用戶擁有讀取權(quán)限的模塊列表(用于登錄,形成導(dǎo)航菜單的時(shí)候) *@paramuserId用戶標(biāo)識(shí) *@return模塊列表(即列表的元素是Module對(duì)象) */ publicListsearchModules(intuserId); /** *根據(jù)主體類型和主體標(biāo)識(shí)查找ACL記錄 *@paramprincipalType *@paramprincipalSn *@return */ publicListsearchAclRecord(StringprincipalType,intprincipalSn);}用戶在登錄系統(tǒng)時(shí),系統(tǒng)會(huì)根據(jù)他所擁有的權(quán)限生成他能所控制的模塊,設(shè)計(jì)publicListsearchModules(intuserId);方法,可以生成所有擁有讀取權(quán)限的模塊;即時(shí)認(rèn)證用于判斷用戶權(quán)限,設(shè)計(jì)publicbooleanhasPermission(intuserId,intreourceId,intpermission);方法,可以對(duì)用戶權(quán)限進(jìn)行判斷;設(shè)計(jì)publicvoidaddOrUpdatePermission( StringprincipalType, intprincipalSn, intresourceSn, intpermission, booleanyes );方法對(duì)用戶進(jìn)行授權(quán)操作;設(shè)計(jì)publicvoidaddOrUpdateUserExtends(intuserId,intresourceSn,booleanyes);方法用于對(duì)用戶角色承繼進(jìn)行操作。6.3界面設(shè)計(jì)6.3.1登錄界面6.3.2管理主界面系統(tǒng)管理員登陸可看到以下界面,其它人員登陸系統(tǒng),可看到的模塊,請(qǐng)參考模塊設(shè)置!6.3.3組織機(jī)構(gòu)組織機(jī)構(gòu)管理主要包括機(jī)構(gòu)管理和人員管理。機(jī)構(gòu)是一個(gè)樹型結(jié)構(gòu),可以完成添加、刪除操作。主界面要求:界面操作:點(diǎn)擊機(jī)構(gòu)管理進(jìn)入機(jī)構(gòu)管理主界面,在主界面上列出頂級(jí)機(jī)構(gòu),點(diǎn)擊某個(gè)機(jī)構(gòu)的名稱,可以查看這個(gè)結(jié)構(gòu)的詳細(xì)信息以及所有子機(jī)構(gòu)列表(在子機(jī)構(gòu)列表上,還可以點(diǎn)擊機(jī)構(gòu)名稱進(jìn)行進(jìn)一步的導(dǎo)航)。在列表界面上,可以點(diǎn)擊“返回”以便返回上一級(jí)機(jī)構(gòu)。機(jī)構(gòu)信息的瀏覽:如,點(diǎn)擊“北京分公司”,將可以列出此公司下面的所有部門:機(jī)構(gòu)信息的添加:點(diǎn)擊添加機(jī)構(gòu)信息按鈕,可以打開添加界面,在哪個(gè)機(jī)構(gòu)層級(jí)上點(diǎn)擊添加,就應(yīng)該在本層級(jí)上添加機(jī)構(gòu)!如在進(jìn)入“北京分公司”之后的頁(yè)面上點(diǎn)擊添加機(jī)構(gòu)信息:則添加成功之后其信息被添加到本頁(yè)面下面:機(jī)構(gòu)信息的刪除:點(diǎn)擊確定之后,才能刪除對(duì)應(yīng)的記錄,同時(shí)刷新一下本界面。人員管理:包括添加、刪除人員的信息人員管理主界面:人員管理的添加:點(diǎn)擊選擇,可以打開新的界面選擇所添加人員所屬的機(jī)構(gòu)人員管理的刪除:在刪除之前,跟機(jī)構(gòu)管理一樣,需要確認(rèn)一下再刪除,而且刪除之后,需要刷新一下主界面。6.3.4權(quán)限管理用戶(User)可以擁有多個(gè)角色(Role),角色可以被分配給多個(gè)用戶權(quán)限的意思就是對(duì)某個(gè)資源的某個(gè)操作,現(xiàn)在規(guī)定:所謂資源,即系統(tǒng)的模塊所謂操作,包括:增加、刪除、修改、查詢等操作權(quán)限管理系統(tǒng)的總體功能分為:授權(quán)與認(rèn)證授權(quán),指將權(quán)限授予角色或用戶如果用戶A擁有角色B、角色C,那么,缺省的情況下,用戶A將擁有被分配給角色A和角色C的所有權(quán)限(即默認(rèn)情況下,用戶A繼承其擁有的角色所具有的所有權(quán)限)如果用戶擁有多個(gè)角色,那么用戶的權(quán)限是這些角色權(quán)限的合集如果用戶擁有多個(gè)角色,而且角色之間的授權(quán)有沖突(比如對(duì)同一個(gè)資源的同一個(gè)操作,一個(gè)角色為“允許”,另外一個(gè)角色為“不允許”),將以優(yōu)先級(jí)別高的角色為準(zhǔn)(所謂優(yōu)先級(jí)別,也就是對(duì)于這個(gè)用戶所擁有的角色而言,是有順序的,同一個(gè)角色在不同的用戶那里可能擁有不同的優(yōu)先級(jí))除了可以對(duì)角色進(jìn)行授權(quán)外,也可以針對(duì)用戶進(jìn)行授權(quán),也就是說,將權(quán)限授予用戶。針對(duì)某個(gè)資源的所有操作,我們可以設(shè)置這些權(quán)限對(duì)用戶來說是“繼承”或“不繼承”繼承:意思是這些權(quán)限將使用其(即用戶)所擁有的角色的權(quán)限,而不使用其(即用戶)單獨(dú)設(shè)置的權(quán)限不繼承:意思是這些權(quán)限將使用其單獨(dú)設(shè)置的權(quán)限,而不使用其所擁有的角色的權(quán)限認(rèn)證,指用戶訪問資源的某些操作時(shí),根據(jù)授權(quán),判斷是否允許用戶的訪問在用戶訪問的時(shí)候,需要進(jìn)行即時(shí)的判斷(是否有權(quán)訪問)應(yīng)該提供查詢的功能,可以查詢某個(gè)用戶所擁有的所有權(quán)限總體上,可分為模塊管理、角色管理和用戶管理模塊:模塊管理:模塊管理主界面參考:因?yàn)槟K是一個(gè)樹狀結(jié)構(gòu)(本系統(tǒng)只支持兩級(jí)模塊的結(jié)構(gòu)),我們可以點(diǎn)擊其中一個(gè)模塊以便打開其子模塊來維護(hù),比如點(diǎn)擊“信件交流”:可以在這個(gè)界面上添加模塊信息以及刪除模塊信息角色管理:可以添加角色信息、刪除角色信息以及給角色授權(quán)給角色授權(quán),選中其中一個(gè)角色,可以打開角色授權(quán)界面:在這個(gè)界面上,按照兩級(jí)模塊的形式列出系統(tǒng)所有模塊,以及在這些模塊上面的CRUD(添加、讀取、更新、刪除)權(quán)限;所謂“啟用”,意思是本設(shè)置有效,否則設(shè)置無效!當(dāng)點(diǎn)擊選中其中某個(gè)模塊的某個(gè)權(quán)限時(shí),系統(tǒng)自動(dòng)添加此權(quán)限!【選中就開始生效,無需點(diǎn)擊提交按鈕】用戶管理:因?yàn)橛脩魧?shí)際上就是系統(tǒng)人員的帳號(hào),而且每個(gè)人只能擁有一個(gè)帳號(hào),所以用戶管理主界面,實(shí)際上就是系統(tǒng)所有人員的列表!【分配帳號(hào)】-給人員分配帳號(hào),如果已經(jīng)有帳號(hào),則提示無法繼續(xù)分配帳號(hào),如果想修改帳號(hào)的話,需要先刪除帳號(hào),再重新分配【刪除帳號(hào)】-提示是否刪除,如果確定,再發(fā)出刪除請(qǐng)求,在刪除成功之后,刷新界面。【分配角色】-給用戶分配角色,一個(gè)用戶可以擁有多個(gè)角色,點(diǎn)擊“分配角色”:在分配角色的界面上,點(diǎn)擊“給用戶分配角色”,可以選擇需要分配的角色,同時(shí)可以輸入其優(yōu)先級(jí):點(diǎn)擊“分配角色”按鈕,提交數(shù)據(jù),這時(shí)候,所選擇的角色,就會(huì)被賦予相應(yīng)的用戶:如果想要修改某個(gè)角色的優(yōu)先級(jí),可以選擇重新分配一次這個(gè)角色,同時(shí)給它指定另外一個(gè)優(yōu)先級(jí)即可:注意:用戶所擁有的角色列表,是按照優(yōu)先級(jí)大小倒序排列的,即優(yōu)先級(jí)最高的排前面?!居脩羰跈?quán)】-給用戶單獨(dú)授權(quán)在主界面上點(diǎn)擊“用戶授權(quán)”,打開的授權(quán)界面跟角色授權(quán)類似:但是,用戶授權(quán)多了一個(gè)“不繼承”選擇框,只有在選擇了這個(gè)框的前提下,給用戶的單獨(dú)授權(quán)設(shè)置才是有效的,否則它將使用其擁有的角色的權(quán)限!6.4公文管理6.4.1公文管理總共可分為公文管理以及公文歸檔文檔流轉(zhuǎn)事實(shí)上是對(duì)工作流以及工作流中的文檔進(jìn)行管理,對(duì)于大多數(shù)企業(yè)來說,核心的管理就是工作流和文檔的管理。一般的企業(yè)都會(huì)有很多流程,比如:請(qǐng)假流程報(bào)銷流程收文/發(fā)文流程收文:處理收到上級(jí)部門及其它部門的公文發(fā)文:上級(jí)及有關(guān)部門需協(xié)調(diào)和解決的問題進(jìn)行的一系列流程流程的本質(zhì),就是很多人在一起完成一件事情流程可能會(huì)經(jīng)過不同的中間環(huán)節(jié),在中間環(huán)節(jié)上,由相關(guān)人員進(jìn)行處理所有流程中間環(huán)節(jié)的處理過程,需要進(jìn)行記錄【公文管理】可分為公文維護(hù)與公文歸檔處理:在其主界面上,顯示由當(dāng)前登陸人員創(chuàng)建的所有公文。可以在我的公文、待審核公文、已審核公文之間切換:公文的添加:點(diǎn)擊其中一個(gè)公文形式(流程),打開此流程的公文添加界面:重要的一點(diǎn)是,可以選擇流程!這些流程都是通過設(shè)計(jì)器或編寫流程文件的方法創(chuàng)建的。添加完成后,公文管理主界面是:公文的刪除:用戶可以對(duì)公文執(zhí)行刪除操作公文的流轉(zhuǎn):可以點(diǎn)擊提交操作,將公文提交流程用戶只能對(duì)屬于自己的公文(自己創(chuàng)建的公文)進(jìn)行操作在公文進(jìn)入流程之后,不再允許用戶對(duì)公文執(zhí)行修改和刪除操作在公文流轉(zhuǎn)結(jié)束以后,用戶可以對(duì)公文設(shè)置成"歸檔"狀態(tài)用戶登錄系統(tǒng)之后,可以看到自己的待審批公文列表在我的公文視圖里,可以將這些公文進(jìn)行提交,即提交到流程。打開提交界面:選擇下一個(gè)步驟進(jìn)行提交操作,提交完成后,在公文主界面上,不能再次對(duì)公文執(zhí)行提交和刪除等操作:如果此時(shí)在流程中下一個(gè)節(jié)點(diǎn)的用戶登陸,便可以在“帶審批文檔”視圖中看到流到此人的文檔。下面是一個(gè)帶審核公文列表:執(zhí)行審批操作:點(diǎn)擊保存審核信息之后,可以執(zhí)行提交操作。當(dāng)然,也可以再次點(diǎn)擊審核操作,這時(shí)候,需要打開界面,更改審核意見!提交之后,根據(jù)相應(yīng)的選擇,公文將流到相應(yīng)的人員那里,依次下去,直到流程的結(jié)束!這就是公文管理主要過程!在公文管理主界面上,可以點(diǎn)擊“下載”,下載附件文檔,以便查看詳細(xì)內(nèi)容;或者點(diǎn)擊“查看審批歷史”,可以查看相關(guān)文檔的審批記錄。一旦文檔經(jīng)過審批并提交之后,在“待審批文檔”列表視圖中就會(huì)消失,但是在“已審批文檔”中,卻需要能夠找到這些已被審批過的文檔記錄!6.4.2工作流【流程管理】可以自定義流程(通過流程設(shè)計(jì)器)流程可以隨時(shí)作出修改流程管理的主界面如下所示:在主界面上,應(yīng)列出系統(tǒng)的所有流程,而且針對(duì)每個(gè)特定的流程,可以重新進(jìn)行上傳和發(fā)布。點(diǎn)擊流程名稱,應(yīng)能獲得關(guān)于此流程的詳細(xì)信息,如下所示:【查看流程圖片】【查看流程定義】7調(diào)試和測(cè)試7.1單元測(cè)試運(yùn)行單元測(cè)試工具對(duì)系統(tǒng)進(jìn)行最小模塊的測(cè)試,單元測(cè)試越早越好,盡早發(fā)現(xiàn)問題,然后解決問題,不要留到集成測(cè)試時(shí),BUG可能一大堆,不好解決。對(duì)組織結(jié)構(gòu)的單元測(cè)試:期望:通過創(chuàng)建組織機(jī)構(gòu)實(shí)例,關(guān)聯(lián)起機(jī)構(gòu)與機(jī)構(gòu)之間的關(guān)系,保存到數(shù)據(jù)庫(kù)后,下次查詢數(shù)據(jù)庫(kù)能查出某一機(jī)構(gòu)下的子機(jī)構(gòu)。代碼如下:publicclassOrgTest2extendsTestCase{ publicvoidtestSaveOrg(){ Sessionsession=HibernateUtils.getSession(); try{ session.beginTransaction(); Setset=newHashSet(); Organizationorg2=newOrganization(); org2.setName("org2"); session.save(org2); set.add(org2); Organizationorg3=newOrganization(

溫馨提示

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

評(píng)論

0/150

提交評(píng)論