欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

用于定制軟件應(yīng)用的方法和系統(tǒng)的制作方法

文檔序號:6465771閱讀:206來源:國知局
專利名稱:用于定制軟件應(yīng)用的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及軟件應(yīng)用定制(software application customization)。更具^本地, 本發(fā)明涉及輔助用戶在用于定制軟件應(yīng)用的用戶接口中快速地定位定制選項 的方法和系統(tǒng)。
背景技術(shù)
當(dāng)前,計算機(jī)已經(jīng)變成辦公室中的標(biāo)準(zhǔn)設(shè)備。軟件銷售商已發(fā)現(xiàn)通過增 強(qiáng)軟件可用性來提高用戶生產(chǎn)率日益重要。增強(qiáng)軟件可用性的一個重要方面 是給予用戶更靈活的定制選項,以使應(yīng)用可以根據(jù)用戶的具體需求而進(jìn)行配置。
在已知技術(shù)中,可以通過集中式定制用戶接口定制軟件應(yīng)用(例如企業(yè) 應(yīng)用)。圖1是集中式定制用戶接口的例子。如圖所示,用戶接口 100包括包 含大量定制類別101和大量定制條目102的定制樹。定制類別101可以包含 一個或更多個其他的定制類別101和/或一個或更多個定制條目102。如果一 個定制類別被包含在另 一 個定制類別內(nèi),則被包含的定制類別也可以叫做子 類別。每一個定制條目102均與取值范圍(value range)相關(guān)聯(lián),在所述取值 范圍內(nèi)可以指定用于定制軟件應(yīng)用行為的值。
因此,集中式定制用戶接口在一個地方組織所有的定制條目。如果用戶 了解定制條目,則用戶可以通過在包含定位條目的類別和子類別間導(dǎo)航快速 地定位定制條目。但是這要求用戶全面理解軟件應(yīng)用所提供的功能及其與定 制條目的關(guān)系。缺乏經(jīng)驗(yàn)的用戶可能花費(fèi)許多時間來探究定制樹以便找到正 確的定制條目。對于i者如企業(yè)資源^L劃(enterprise resource planning, ERP) 和客戶關(guān)系管理(Customer Relationship Management, CRM)的企業(yè)軟件應(yīng) 用,定制選項更為復(fù)雜。周此輔助缺乏經(jīng)驗(yàn)的用戶快速地定位用于定制軟件 應(yīng)用的定制選項的技術(shù)令人期待。

發(fā)明內(nèi)容
一種提供了用于定制軟件應(yīng)用的方法和系統(tǒng)的技術(shù)。所述方法包括執(zhí)行 待定制軟件應(yīng)用的功能。所述方法還包括響應(yīng)于執(zhí)行軟件應(yīng)用的功能,輸出 指示如何在軟件應(yīng)用的定制用戶接口中定位與該功能相關(guān)聯(lián)的定制條目的信息。
根據(jù)下面的附圖以及詳細(xì)描述,本發(fā)明的其他方面將艮清晰。


圖l是用于定制軟件應(yīng)用的集中式定制用戶接口的例子;
圖2A—圖2C根據(jù)本發(fā)明的某些實(shí)施例示出了定制系統(tǒng)的示范性體系結(jié)
構(gòu);
圖3A—圖3C根據(jù)本發(fā)明的某些實(shí)施例示出了定制系統(tǒng)的示范性體系結(jié)
構(gòu);
圖4A—圖4B是流程圖,根據(jù)本發(fā)明的某些實(shí)施例示出了定制軟件應(yīng)用 的過程;
圖5是流程圖,根據(jù)本發(fā)明的某些實(shí)施例示出了定制軟件應(yīng)用的過程; 圖6A—圖6G是偽碼,根據(jù)本發(fā)明的某些實(shí)施例示出了用來實(shí)施定制系 統(tǒng)的數(shù)據(jù)結(jié)構(gòu)的例子;和
圖7是可用于本發(fā)明的一個實(shí)施例的處理系統(tǒng)的高層框圖。
具4本實(shí)施方式
這里描述的是用于定制軟件應(yīng)用的方法和系統(tǒng)。在接下來的描述中給出 了許多具體細(xì)節(jié)。但是要理解,無需這些具體細(xì)節(jié)也可實(shí)踐這些實(shí)施例。例 如,可以使用公知的等效部件替代這里所描述的部件。在其他實(shí)例中,為了 不模糊對本描述的理解,未詳細(xì)地示出公知部件。
這里介紹的技術(shù)包括統(tǒng)一 定制系統(tǒng),該系統(tǒng)能夠支持同時定制多個軟件 應(yīng)用??梢元?dú)立于軟件應(yīng)用的開發(fā)來開發(fā)該軟件應(yīng)用的定制數(shù)據(jù)。然后,定 制數(shù)據(jù)被通過統(tǒng)一定制系統(tǒng)存儲在定制存儲器中。當(dāng)軟件應(yīng)用執(zhí)行時,該軟 件應(yīng)用通過統(tǒng)一 定制系統(tǒng)從存儲器檢索定制數(shù)據(jù)的值。統(tǒng)一 定制系統(tǒng)輸出檢 索到的定制數(shù)據(jù)以指示用戶的當(dāng)前工作上下文(working context),用戶可以 使用它在軟件應(yīng)用的定制用戶接口中定位用于定制在當(dāng)前工作上下文中執(zhí)行 的功能的定制選項。
這個解決方案幫助最終用戶,特別是缺乏經(jīng)驗(yàn)的或者是偶爾4吏用的用戶 快速并準(zhǔn)確地找到正確的定制條目以便針對期望的應(yīng)用行為進(jìn)行調(diào)整。該解
決方案的必要部分是運(yùn)行時定制評估(Runtime Customization Evaluation, RCE)機(jī)制。被組合在一起的定制條目確定了運(yùn)行時期間的應(yīng)用行為。應(yīng)用 程序評估定制條目的值以確定其行為。在RCE過程中,多個定制條目被評估, 并且評估過程被記錄?;谟涗浫罩?,用戶能夠很容易知道當(dāng)前工作上下文 中涉及到哪些定制條目,并通過直接導(dǎo)航到定制環(huán)境對其進(jìn)行調(diào)整。
由框架自動地寫定制評估日志。基于RTTI (Run Time Type Identification, 運(yùn)行時類型標(biāo)識)技術(shù)自動給予最終用戶行為確定的整個圖景。
圖2A是框圖,根據(jù)本發(fā)明的一個實(shí)施例示出了定制系統(tǒng)的體系結(jié)構(gòu)。 在如圖2A中所示的應(yīng)用定制的協(xié)作開發(fā)中,開發(fā)者被分類為3個角色1) 定制開發(fā)者,2)應(yīng)用開發(fā)者,和3)用戶接口 (user interface, UI)開發(fā)者。 每一個角色均有其具體關(guān)注焦點(diǎn)和要求。
參考圖2A,定制開發(fā)者負(fù)責(zé)實(shí)現(xiàn)作為定制實(shí)現(xiàn)204的一部分的定制信 息、數(shù)據(jù)存儲器和定制條目訪問的結(jié)構(gòu)。這些結(jié)構(gòu)專注于在特定存儲介質(zhì)中 存儲和檢索定制信息,所述存儲介質(zhì)可以是文件、數(shù)據(jù)庫或者Windows注冊 表。應(yīng)用開發(fā)者對獲取定制值感興趣。他們的程序作為運(yùn)行時單元202的一 部分,需要檢索特定定制條目的值,以便確定應(yīng)用行為。應(yīng)用開發(fā)者不太關(guān) 注定制信息的底層存儲介質(zhì)。用戶接口開發(fā)者負(fù)責(zé)開發(fā)定制UI。這個角色的 開發(fā)者實(shí)現(xiàn)定制UI的布局,作為配置UI 203的一部分。他們具有最精確的 在何處設(shè)置定制條目的知識。這些位置信息可以與目標(biāo)定制條目存儲在一起。
參考圖2A,根據(jù)一個實(shí)施例,系統(tǒng)200包括但不限于定制框架、應(yīng)用運(yùn) 行時單元202、應(yīng)用配置時單元203和定制實(shí)現(xiàn)單元204。單元202-204與框 架201交互作用。這三個部件(例如應(yīng)用運(yùn)行時單元202、應(yīng)用配置時單元 203和定制實(shí)現(xiàn)單元204)可以由定制開發(fā)者、應(yīng)用開發(fā)者和UI開發(fā)者使用 例如面向?qū)ο缶幊碳夹g(shù)分別和/或獨(dú)立地開發(fā)和維護(hù)。有兩種角色的最終用 戶 一般用戶205和定制用戶206。 一般用戶205使用軟件來完成其日常工 作。而定制用戶206則執(zhí)行定制。 一般用戶205與應(yīng)用運(yùn)行時單元202交互, 而定制用戶206則和配置UI單元203交互。注意,這兩個角色有時候可能是 同 一 用戶,因?yàn)樵?艮多情況下 一 般用戶必須親自完成定制。
定制用戶在調(diào)整定制條目時會涉及不同的部件,如圖2B所示。在運(yùn)行 時,如圖2C所示,應(yīng)用的用戶命令執(zhí)行過程受多個定制條目影響。在命令執(zhí) 行期間,從后端存儲器檢索這些條目的值。往回參考圖2B,定制UI信息被 與定制條目值存儲在一起。現(xiàn)在UI信息也被檢索。根據(jù)一個實(shí)施例,定制條 目和對應(yīng)的UI的信息被寫入日志。用戶從日志能夠很容易知道哪些定制條目 影響當(dāng)前應(yīng)用的行為以及在哪里調(diào)整這些條目。在一個實(shí)施例中,通過定制 框架201執(zhí)行對定制條目值的檢索。因此,所有的定制評估活動都^皮框架201 自動地記錄。此外,由定制框架201,而非應(yīng)用,負(fù)責(zé)日志寫入。所以應(yīng)用 開發(fā)者能夠?qū)W⒂趯?shí)現(xiàn)業(yè)務(wù)邏輯(business logic)。注意,圖2A到2C中所示 部件或操作中的一些或者全部可以由處理邏輯實(shí)現(xiàn)或者執(zhí)行,所述處理邏輯 可以包括軟件、硬件,或者二者的組合。
圖3A根據(jù)本發(fā)明的一個實(shí)施例示出了定制系統(tǒng)的示范性體系結(jié)構(gòu)。如 圖所示,企業(yè)應(yīng)用301 (例如ERP應(yīng)用、CRM應(yīng)用等)連"l妄到統(tǒng)一定制系統(tǒng) 305。統(tǒng)一定制系統(tǒng)305給不同應(yīng)用(包括企業(yè)應(yīng)用301)提供公共定制服務(wù)。 即統(tǒng)一定制系統(tǒng)305能夠同時處理來自不同應(yīng)用的定制請求。因此,統(tǒng)一定 制系統(tǒng)可被用于多個應(yīng)用(即使是同時地),而不是為每一個應(yīng)用開發(fā)專門的 定制模塊。統(tǒng)一定制系統(tǒng)305被耦合到位于本地或遠(yuǎn)程地定制存儲器306, 定制存儲器306存儲每一個應(yīng)用的定制數(shù)據(jù)。在一個實(shí)施例中,定制存儲器 306是統(tǒng)一定制系統(tǒng)305的一部分,并且包括數(shù)據(jù)庫、文件、操作系統(tǒng)注冊
表(例如1\^1^0 5@注冊表等)。
企業(yè)應(yīng)用301包括應(yīng)用用戶接口模塊302和應(yīng)用模塊303。應(yīng)用模塊303 提供一個或更多個功能(例如產(chǎn)生每月銷售報告、打印文檔、發(fā)送電子郵件, 等等。)可以根據(jù)這里介紹的技術(shù)對這些功能中的一些進(jìn)行定制。應(yīng)用用戶接 口模塊302從用戶接收請求,以執(zhí)行應(yīng)用模塊所提供的功能中的一個或更多 個。在一個實(shí)施例中,應(yīng)用用戶接口模塊302包括圖形用戶界面(GUI)。企 業(yè)應(yīng)用301還包括定制用戶接口模塊304。在一個實(shí)施例中,定制用戶接口 模塊304可以被實(shí)施為如圖1中所示的集中式定制用戶接口。如圖1所示, 定制用戶接口模塊304能夠提供包含多個定制類別101和多個定制條目102 的定制樹。如上面介紹的那樣,定制類別101可以包含一個或更多個其他的 定制類別101和/或一個或更多個定制條目102。每一個定制條目102均與取 值范圍相關(guān)聯(lián),在所述取值范圍內(nèi)可以指定值來定制企業(yè)應(yīng)用301的行為。
在一個實(shí)施例中,定制用戶接口模塊304接收用戶輸入,以改變定制條
目的值。當(dāng)接收到輸入時,定制用戶接口模塊304把定制請求發(fā)送到統(tǒng)一定 制系統(tǒng)305。在一個實(shí)施例中,定制請求包括定制條目標(biāo)識(ID)和要給該 條目設(shè)置的新值。可以通過消息或者調(diào)用統(tǒng)一定制系統(tǒng)305提供的應(yīng)用編程 接口 (application programming interface, API)把請求發(fā)送到統(tǒng)一定制系統(tǒng) 305。當(dāng)接收到請求時,統(tǒng)一定制系統(tǒng)305在定制存儲器306中搜索定制條目, 并把新值設(shè)置給該定制條目。下面進(jìn)一步說明該過程的細(xì)節(jié)。
注意,企業(yè)應(yīng)用301、統(tǒng)一定制系統(tǒng)305和定制存儲器306可以#:部署 在同一處理系統(tǒng)(例如服務(wù)器)上或者不同的處理系統(tǒng)上。不同的處理系統(tǒng) 可以運(yùn)行不同的操作系統(tǒng)。
此外,根據(jù)一個實(shí)施例,統(tǒng)一定制系統(tǒng)305包括日志單元307,用于在 運(yùn)行時期間把被定制條目的訪問信息輸出到日志308 ,從而允許用戶評估在 運(yùn)行時利用定制條目的過程。在一個實(shí)施例中,日志308存儲在臨時存儲區(qū) 域(例如圖7中所示的存儲器702)、文件或者數(shù)據(jù)庫中。
圖3B根據(jù)本發(fā)明的一個實(shí)施例示出了圖3A中所示定制存儲器的例子。 在一個實(shí)施例中,定制數(shù)據(jù)在定制存儲器306中被存儲為定制類別321、定 制條目322和取值范圍323。如前面討論的那樣,定制類別321可以包含一 個或更多個其他的定制類別321 (即子類別)和一個或更多個定制條目322。 每一個定制條目322均與取值范圍323相關(guān)聯(lián),取值范圍323指定了可為定 制條目設(shè)置的值的范圍。在一個實(shí)施例中,定制存儲器306是關(guān)系數(shù)據(jù)庫。 定制類別321、定制條目322和取值范圍323被存儲為表。在另一個實(shí)施例 中,定制存儲器306是對象數(shù)據(jù)庫(object database)。在存儲器306中定制類 別321、定制條目322和取值范圍323被存儲為對象。
可以在開發(fā)者開發(fā)定制用戶接口模塊304時開發(fā)定制數(shù)據(jù)。例如,當(dāng)開 發(fā)者設(shè)計定制用戶接口時,開發(fā)者根據(jù)例如業(yè)務(wù)要求確定需要什么樣的定制 類別和定制條目,以及每一個定制條目應(yīng)該具有什么樣的取值范圍。開發(fā)者 也可以給每一個定制條目分配缺省值。然后,定制數(shù)據(jù)可以被輸入到定制存 儲器306中。因此,統(tǒng)一定制系統(tǒng)提供的一個優(yōu)點(diǎn)是軟件應(yīng)用及其定制數(shù)據(jù) 的開發(fā)可以由不同的開發(fā)者無沖突地施行。
圖3C根據(jù)本發(fā)明的一個實(shí)施例示出了圖3A中所示統(tǒng)一定制系統(tǒng)的例 子。如圖所示,統(tǒng)一定制系統(tǒng)305包括定制數(shù)據(jù)設(shè)置模塊331。在一個實(shí)施 例中,應(yīng)用的定制數(shù)據(jù)由定制開發(fā)者創(chuàng)建,并被存儲在文檔(例如XML文 檔等)中。定制數(shù)據(jù)設(shè)置模塊331解析所述文檔并在定制存儲器306中創(chuàng)建 對應(yīng)的定制類別321、定制條目322和取值范圍323。而在另一個實(shí)施例中, 定制數(shù)據(jù)設(shè)置模塊331提供用戶接口 (未示出),定制用戶可以通過該用戶接 口手動輸入定制數(shù)據(jù)。
統(tǒng)一定制系統(tǒng)305還包括定制模塊初始化器332和定制控制器333。在 一個實(shí)施例中,定制模塊初始化器332接收來自例如企業(yè)應(yīng)用301的應(yīng)用的 連接請求(或初始化請求)。當(dāng)接收到請求時,定制模塊初始化器332創(chuàng)建定 制控制器333的實(shí)例,定制控制器333被分配用來處理來自應(yīng)用的定制請求。 因此,例如如果兩個應(yīng)用被連接到統(tǒng)一 定制系統(tǒng)305,則將創(chuàng)建兩個定制控 制器實(shí)例來分別為這兩個應(yīng)用服務(wù)。
在創(chuàng)建了定制控制器333的實(shí)例以后,定制用戶接口模塊304使用所創(chuàng) 建的定制控制器實(shí)例來檢索或者設(shè)置存儲在定制存儲器306中的條目值。例
如,定制條目可以是"是否自動創(chuàng)建每月銷售報告"。該條目的取值范圍是"是" 或"否"。如果用戶通過定制用戶接口模塊304選擇把該定制條目設(shè)置為"是", 則定制用戶接口模塊304將調(diào)用定制控制器實(shí)例來在定制存儲器306中搜索 該定制條目并把該定制條目的值設(shè)置為"是"。
圖4A是流程圖,根據(jù)本發(fā)明的一個實(shí)施例示出了執(zhí)行軟件應(yīng)用的功能 的過程。注意,如圖4A所示過程可以由處理邏輯執(zhí)行,所述處理邏輯可以 包括軟件、硬件或者二者的組合。如圖所示,左列中所示的框是應(yīng)用沖莫塊303 (圖3A中所示)的處理的一部分。右列中所示的框是定制控制器333 (圖 3C中所示)的處理的一部分。假設(shè)在應(yīng)用模塊303初始化期間,應(yīng)用模塊303 調(diào)用統(tǒng)一定制系統(tǒng)305的定制模塊初始化器332。定制模塊初始化器332創(chuàng) 建定制控制器333的實(shí)例并把該實(shí)例的句柄(handle)或者引用(reference) 返回到應(yīng)用模塊303。
在框401,應(yīng)用模塊303從應(yīng)用用戶接口模塊302接收命令。例如,該 命令可以是執(zhí)行應(yīng)用模塊303所提供的功能(例如發(fā)送電子郵件、打印文檔, 等等)的請求。在框402,應(yīng)用模塊303確定執(zhí)行該命令所需的定制條目。 在一個實(shí)施例中,這些定制條目的值影響到功能怎樣執(zhí)行。例如, 〃假設(shè)所述 功能是打印文檔,并且定制條目是"使用雙面打印",如果定制條目"使用雙 面打印"的值為"是",則文檔將被打印在紙的兩面上。因此,在框403,應(yīng) 用模塊303通過使用定制控制器333的實(shí)例的句柄或引用,發(fā)送請求420到
該實(shí)例以獲取第 一個被確定的定制條目的值。
在框404,定制控制器333的實(shí)例接收檢索第一個被確定的定制條目的 值的請求。在框405,定射控制器實(shí)例從定制存儲器306檢索該定制條目的 值以及關(guān)于如何在應(yīng)用的定制用戶接口中定位該定制條目的信息。在 一 個實(shí) 施例中,這些關(guān)于如何在應(yīng)用的定制用戶接口中定位該定制條目的信息是由 定制開發(fā)者創(chuàng)建的定制數(shù)據(jù)的一部分,并與定制條目 一起被定制數(shù)4居設(shè)置模 塊331存儲在定制存儲器306中。
在框406 ,定制控制器333的實(shí)例把如何在應(yīng)用的定制用戶接口中定位 定制條目的信息輸出到日志文件中。被輸出到日志文件的其他信息可以包括 定制條目的名稱、值和ID。在框407,實(shí)例把定制條目的值421發(fā)回應(yīng)用模塊。
在框408,應(yīng)用模塊303接收第一個被確定的定制條目的值。在框409, 應(yīng)用模塊303和定制控制器333的實(shí)例重復(fù)框403—408,直到從統(tǒng)一定制系 統(tǒng)305獲取了執(zhí)行命令所需的所有定制條目的值為止。
圖4B是流程圖,根椐i發(fā)明的一個實(shí)施例示出了設(shè)置定制條目以定制 軟件應(yīng)用的過程。注意,圖4B中所示的過程可以由處理邏輯執(zhí)行,所述處理 邏輯可以包括軟件、硬件或者二者的組合。如圖所示,左列中所示的框是定 制用戶接口模塊304 (圖3A中所示)的處理的一部分。右列中所示的框是定 制控制器333 (圖3C中所示)的處理的一部分。 -假設(shè)在應(yīng)用模塊303的初始 化期間,應(yīng)用模塊303調(diào)用統(tǒng)一定制系統(tǒng)305的定制模塊初始化器332。定 制模塊初始化器332創(chuàng)建定制控制器333的實(shí)例并把該實(shí)例的句柄或者引用 返回到應(yīng)用模塊303。
在框451,定制用戶接口模塊304接收設(shè)置定制條目值的請求。這可以 由通過用戶接口的用戶輸入觸發(fā)。例如,用戶可以選中復(fù)選框來選擇選項。 在框452,定制用戶接口模塊304把定制條目的ID和值460發(fā)送到定制控制 器333的實(shí)例。在框453,定制用戶接口模塊304等待來自用戶的另一個定 制輸入。在框454,定制控制器333的實(shí)例接收定制條目的ID和值。在455, 該實(shí)例通過接收到的ID搜索定制條目并設(shè)置值。
圖5是流程圖,根據(jù)本發(fā)明的實(shí)施例示出了定制軟件應(yīng)用的過程。注意, 如圖5中所示的過程可以由處理邏輯執(zhí)行,所述處理邏輯可以包括l欠件、石更 件或者二者的組合。假設(shè)用戶想定制軟件應(yīng)用的功能,但是不知道在集中式
定制用戶接口 (圖l中所示)中在哪兒找到定制條目來定制所述功能。
在框501,用戶運(yùn)行待定制的功能。如圖4A中所討論的那樣,統(tǒng)一定制 系統(tǒng)305在日志文件中輸出為運(yùn)行所述功能其值被檢索的定制條目(和如何 在用戶接口中定位它們的信息》。在框502,用戶檢查日志文件以便確定定制 條目和如何在用戶接口中定位它們的信息。
在框503,用戶可以根據(jù)所述信息在集中式用戶接口 (例如圖1中所示) 中導(dǎo)航到定制條目。在框504,用戶為定制條目設(shè)置新值以便定制所述功能。 因此,即使用戶不熟悉定制用戶接口并且不知道定制功能需要哪些定制條目, 通過使用上面介紹的方法和系統(tǒng),用戶也能夠快速地識別和定位這些定制條 目。也可以執(zhí)行其他的操作。
往回參考圖2A,定制開發(fā)者的工作區(qū)域在定制實(shí)現(xiàn)單元204中。定制開 發(fā)者專注于定制信息的結(jié)構(gòu)以及如何把數(shù)據(jù)存儲到具體存儲器類型/如何從 所述具體存儲器類型檢索數(shù)據(jù)。應(yīng)當(dāng)使用例如面向?qū)ο缶幊碳夹g(shù),^f吏如何顯
示定制數(shù)據(jù)以及如何評估定制條目的值對于定制開發(fā)者來說是透明的。定制 開發(fā)者所需要的是以標(biāo)準(zhǔn)化的方式表示結(jié)構(gòu)定制數(shù)據(jù)。
圖6A到圖6G是根據(jù)某些實(shí)施例的、代表上述技術(shù)的某些實(shí)施方案的例 子的偽碼。僅僅為了說明的目的,參考圖6A到圖6H,數(shù)據(jù)結(jié)構(gòu)由 CustomizationCategory (例如圖6B中所示)、CustomizaitonEntry (例如圖6C 中所示)和CustomizaitonValueRange (例如圖6D中所示)的接口表示。定制 開發(fā)者可自由地用其最方便的方法實(shí)現(xiàn)這些接口。在定制框架中, CustomizaitonController (例如圖6A中所示)自動地選4奪正確的實(shí)現(xiàn)并將其轉(zhuǎn) 發(fā)到應(yīng)用的運(yùn)行時單元和配置時單元。
例如,在銷售和配送管理系統(tǒng)中,用戶需要定制不同的部件,例如銷售 訂單處理、沖殳遞處理和運(yùn)輸處理部件。這里,"銷售和配送管理系統(tǒng)"、"銷售 訂單"、"投遞"、"運(yùn)輸"在面向?qū)ο缶幊汰h(huán)境中均被表示為對應(yīng)的定制類別 類,所述面向?qū)ο缶幊汰h(huán)境實(shí)現(xiàn)了如圖6B中所示的標(biāo)準(zhǔn)接口 CustomizationCategory 。后三個類別是第 一個的子類別。該實(shí)現(xiàn)如下面的代碼 所示。
public class SDManagementCategory implements CustomizationCategory{}; public class SalesOrderCategory implements CustomizationCategory{}; public class DeliveryCategory implements CustomizationCategory{}; public class TransportationCategory implements CustomizationCategory {};
定制類別SalesOrderCategory包含幾個定制條目,如圖6C中所示。它們 的其中之一是"Delivery Automatic Creation (投遞自動創(chuàng)建)",其確定在創(chuàng)建
銷售訂單后是否自動創(chuàng)建投遞文檔。
public class DeliveryAutomaticCreation implements CustomizationEntry {};
它具有由下列實(shí)現(xiàn)表示的取值范圍"true"(真)和"false" G叚)。
public class BooleanValueRange
implements Customization ValueRange {
不存在關(guān)于類別粒度和如何組織類別樹的固定規(guī)則。定制開發(fā)者根據(jù)上 下文和經(jīng)-瞼來定義它們。類別和條目的訪問由SDCustomizaitonController類 集中控制,該類基于如圖6A中所示的基類,并作為例子由下列偽碼示出。
public class SDCustomizationController implements CustomizationController {
參 考 圖 6A , 4十 只十 ArrayList<CustomizationCategory> SDCustomizaitonController.getAllCategories() , it 方 法 將 返 回 SDCustomizaitonController 控制下的所有定制類另'J對象,即 SDManagementCategory類的實(shí)例。
下面的方法
ArrayList<CustomizationCategory>
SDManagementCategory.getAUSubCategories();
返回三個只于象。它 <門是類 SalesOrderCategory 、 DeliveryCategory 、 禾口
TransportationCategory的實(shí)例。實(shí)現(xiàn)類^皮傳送到定制框架(framework)并由定 制框架處理。例如,下面的方法
public void SDCustomizationController.setCustomizaitonValue( CustomizationEntry entry, Object value, ArrayList<Object> conditions, CustomizaitonUIInfo ui—info);
把定制值和相關(guān)的定制UI信息寫入后端存儲器。它在UI開發(fā)者需要把來自 用戶接口的定制數(shù)據(jù)寫入永久存儲器時被UI開發(fā)者調(diào)用。參數(shù)"entry"(條 目)是定制條目的實(shí)例,"value"(值)是由用戶設(shè)置的條目值,"conditions" (條件)包含這種值的運(yùn)行時先決條件,參數(shù)ui—info描述了定制條目的UI 導(dǎo)航路徑。UI開發(fā)者準(zhǔn)確地知道在用戶接口中該定制條目位于何處,并把該 信息與定制條目綁定。
定制條目在運(yùn)行時期間由應(yīng)用開發(fā)者所寫的程序評估。例如,下面的方

public Object SDCustomizationController,getCustomizationValue(
Customizationentry entry, ArrayList<Object> conditions) throws NoSuchCustomizaitonEntryFoundException, NoAssociatedTransactionException;
被應(yīng)用開發(fā)者調(diào)用以便取得定制條目的當(dāng)前值。該條目被作為參數(shù)"entry"輸入。
應(yīng)用使用定制值確定應(yīng)用行為或者業(yè)務(wù)處理的流程。下面的方法 ArrayLis〖<CustomizationEntry> SalesOrderCategory.getAllEntries();
返回 SalesOrderCategory 的全部條目。它們中的 一 個是類 Delivery AutomaticCreation的實(shí)例。為了取得定制值的數(shù)據(jù)類型,下列方法祐:調(diào)用。
Class DeliveryAutomaticCreation.getType();
這個方法返回實(shí)例Boolean.Class。所以有效的數(shù)據(jù)類型是Boolean (布 爾型)。對于有效的取值范圍,開發(fā)者需要調(diào)用
CustomizaitonValueRange DeliveryAutomaticCreation.getValueRange();
這個方法返回類 BooleanValueRange 的實(shí)例。這石角定 了 Delivery AutomaticCreation的有效值是真還是假。如果該值為真,則在創(chuàng)建銷 售訂單以后自動地創(chuàng)建投遞命令。否則銷售訂單的創(chuàng)建將不觸發(fā)投遞的創(chuàng)建。 所有定制類別和條目的樹的內(nèi)容由定制開發(fā)者定義。定制開發(fā)者通過以 其自己的邏輯實(shí)現(xiàn)getAUSubCategories和getAl正ntries方法定義樹結(jié)構(gòu)。通過 實(shí)現(xiàn)CustomizationValueRange接口定義條目的可能值。通過接口 CustomizationController的setCustomization Value和getCustomization Value方 法的特定于存儲介質(zhì)的實(shí)現(xiàn)完成值設(shè)置和檢索。接口 CustomizationController
UI開發(fā)者通過CustomizatonAccessor耳又得CustomizationController的實(shí)
例。這個類是定制框架的一部分,并在圖2A的中央示出。在能夠執(zhí)行任何 定制活動之前,UI開發(fā)者調(diào)用方法
CustomizationController CustomizaitonAcces sor.
getCustomizationController(Properties properties)
以便取得CustomizationController的實(shí)例。輸入?yún)?shù)屬性指定應(yīng)該調(diào)用哪個定
制實(shí)現(xiàn)模塊。定制框架查找被指定的實(shí)現(xiàn)并把所產(chǎn)生的 CustomizationController實(shí)例返回給調(diào)用者。
當(dāng)用戶設(shè)置某個定制條目的值時,調(diào)用下面的方法
public void SDCustomizationController. setCustomizaitonValue(CustomizationEntry entry—name, Object value, ArrayList<Object> conditions, CustomizaitonUIInfo ui—info);
這個方法的調(diào)用由UI開發(fā)者編程。如前所述,UI開發(fā)者知道在用戶接 口中定制條目位于何處。所以UI開發(fā)者是負(fù)責(zé)將定位信息與定制條目綁定的 人。定位信息被表示為路徑信息,例如像"銷售和配送->銷售訂單處理->投 遞自動創(chuàng)建",如圖6G所示。
應(yīng)用開發(fā)者通過CustomizatonAccessor實(shí)侈'H匕CustomizationController, 并以牙口 UI開發(fā)者類4以的方式處理CustomizationCategory、 CustomizationEntry、 Customization ValueRange 。但是和UI開發(fā)者不同,應(yīng)用開發(fā)者不調(diào)用
setCustomizationValue方法,因?yàn)閼?yīng)用開發(fā)者不需要設(shè)置任何定制條目值。 大多數(shù)時候,應(yīng)用開發(fā)者調(diào)用方法
public Object SDCustomizationController.getCustomizationValue( CustomizationEntry entry, ArrayList<Object> conditions) throws NoSuchCustomizaitonEntryFoundException, NoAssociatedTransactionException;
以取得特定定制條目的當(dāng)前值。定制值將確定業(yè)務(wù)處理、應(yīng)用輸出或者其他 相關(guān)的應(yīng)用行為。下面的偽碼示出了定制條目值如何確定業(yè)務(wù)處理
if DeliveryAutomaticCreation is true
extract data from sales order, create delivery document;
else{
set delivery order to null;
可以在RCE事務(wù)的范圍內(nèi)執(zhí)行定制值評估,這是本解決方案的必要部 分。RCE事務(wù)(也叫做"RCE事務(wù)"或"事務(wù)")是包括一系列定制評估(定 制值檢索)的過程。在此過程中,應(yīng)用運(yùn)行時評估與當(dāng)前工作上下文相關(guān)的 特定定制條目。同時,那些值檢索活動被定制框架記錄在事務(wù)日志中。當(dāng)最 終用戶需要理解在當(dāng)前上下文中哪些定制條目影響應(yīng)用的^f亍為時,最終用戶 將對該日志感興趣。由于對應(yīng)的定制UI信息被與每一個定制條目存儲在一 起,因此UI信息也被包括在事務(wù)日志中。最終用戶將很容易導(dǎo)航到用于設(shè)置 定制條目的正確環(huán)境。
事務(wù)的粒度由應(yīng)用開發(fā)者根據(jù)要求和上下文決定。為了啟動RCE事務(wù),
應(yīng)用開發(fā)者調(diào)用方法
void CustomizaitonAccessor.beginTransaction(String name) throws AnotherTransactionStartedException;
這個方法激活所有定制評估活動都被記錄在其中的日志。圖6G示出了結(jié)果 日志的例子。
掌握了這樣的日志,用戶就能夠很容易地理解什么樣的定制條目導(dǎo)致當(dāng)
前應(yīng)用行為。當(dāng)事務(wù)完成時,調(diào)用方法
void CustomizaitonAccessor.endTransaction(String name) throws AnotherTransactionStartedException;
在定制框架停止寫日志信息后,方法
String CustomizaitonAccessor.getReport(boolean ui—info—included);
返回最近的RCE事務(wù)的日志。
參考圖6G,日志的最后四個記錄(從18:08:12開始)展示了業(yè)務(wù)處理確 定過程當(dāng)軟件用戶創(chuàng)建銷售訂單時,讀取值定制條目"DeliveryAutoCreation" (投遞自動創(chuàng)建)以便確定是否應(yīng)該產(chǎn)生后續(xù)的投遞。
例如,下列日志記錄 UIInfo = Transaction SPRO ->.,>Checkbox "Delivery Created Automatically"(自動創(chuàng)建投遞) 提供UI信息(例如到設(shè)置定制條目"DeliveryAutoCreation"的值的地方的路 徑)。如果軟件用戶想定制這個條目(例如對于任何銷售訂單),則用戶遵循 該路徑。 一個例子是該路徑是超級鏈接。它指向軟件用戶能夠設(shè)置定制條目 "DeliveryAutoCreation"的窗口 。以這種方式,定制環(huán)境^皮連接到當(dāng)前工作 上下文。即使用戶不熟悉整個定制信息結(jié)構(gòu),軟件用戶也能夠定制用戶的軟 件。
因此,利用上述技術(shù),應(yīng)用最終用戶無需對定制信息結(jié)構(gòu)的完整了解就 能夠很容易地在當(dāng)前上下文中找到定制條目。此外,日志信息顯示了影響應(yīng) 用行為和業(yè)務(wù)處理的定制條目。這幫助軟件最終用戶更好地理解所述應(yīng)用。 這為軟件銷售商提供了易于使用并且靈活的框架。此外,定制開發(fā)者、UI開 發(fā)者和應(yīng)用開發(fā)者能夠?qū)P挠谄渥约旱娜蝿?wù)。例如,定制條目的讀者不需要 知道該條目在物理上存儲于何處或者如何通過用戶接口設(shè)置它。實(shí)現(xiàn)了最終 用戶的輕松定制的日志被自動地并且準(zhǔn)確地產(chǎn)生。應(yīng)用開發(fā)者不需要了解日 志寫入。
圖7是其中可以實(shí)現(xiàn)上面介紹的技術(shù)的處理系統(tǒng)的高層框圖。例如,如 圖7中所示的系統(tǒng)可以被實(shí)現(xiàn)為圖2A中所示系統(tǒng)的一部分。沒有示出與本 發(fā)明并無密切關(guān)系的某些標(biāo)準(zhǔn)和公知的部件。處理系統(tǒng)包括一個或更多個耦
合到總線系統(tǒng)704的處理器701 。
圖7中的總線系統(tǒng)704是表示任何一個或更多個由適當(dāng)?shù)臉蚪悠?、適配 器和/或控制器連接的單獨(dú)物理總線和/或點(diǎn)到點(diǎn)連接的抽象。因此,總線系統(tǒng) 704可以包括例如系統(tǒng)總線、外圍設(shè)備互連(Peripheral Component Interconnect, PCI)總線的形式、超傳llr或工業(yè)標(biāo)準(zhǔn)4本系結(jié)構(gòu)(industry standard architecture , ISA)總線、小型計算才幾系統(tǒng)才妻口 (small computer system interface , SCSI)總線、通用串行總線(universal serial bus, USB)或電氣電子工程師 協(xié)會(Institute of Electrical and Electronics, IEEE)標(biāo)準(zhǔn)1394總線(有時祐:稱 為"火線"(FireWire))。
處理器701是處理系統(tǒng)的中央處理單元(CPU),因此控制處理系統(tǒng)的總 體操作。在某些實(shí)施例中,處理器701通過執(zhí)行存儲在存儲器702中的軟件 完成這個工作。處理器701可以是或者可以包括一個或更多個可編程通用或 專用微處理器、數(shù)字信號處理器(DSP)、可編程控制器、專用集成電路(ASIC)、 現(xiàn)場可編程門陣列(FPGA)、可編程邏輯器件(PLD),等等,或者這些器件 的組合。
處理系統(tǒng)也可以包括耦合到總線系統(tǒng)704的存儲器702。存儲器702表 示任意形式的隨機(jī)訪問存儲器(RAM)、只讀存儲器(ROM)、快閃存儲器或 者其組合。存儲器702至少存儲處理系統(tǒng)的操作系統(tǒng)703 。
海量存儲設(shè)備705、存儲器適配器706和網(wǎng)絡(luò)適配器707也通過總線系 統(tǒng)704連接到處理器701。海量存儲設(shè)備705可以是或者可以包括任何用于 以非易失方式存儲大量數(shù)據(jù)的常規(guī)介質(zhì),例如一個或更多個磁盤。存儲器適 配器706允許處理系統(tǒng)訪問外部存儲系統(tǒng)。網(wǎng)絡(luò)適配器707給處理系統(tǒng)提供 與遠(yuǎn)程設(shè)備通信的能力,并且可以是例如以太網(wǎng)適配器或者光纖通道適配器 (fiber channel adapter)。存儲器702和海量存儲設(shè)備705存儲軟件指令和/或 數(shù)據(jù),所述軟件指令和/或數(shù)據(jù)可以包括用來實(shí)現(xiàn)這里所介紹的技術(shù)的指令和 /或數(shù)據(jù)。
因此,已經(jīng)描述了用于定制軟件應(yīng)用的方法和系統(tǒng)。上面所述內(nèi)容的一 部分可以用例如專用邏輯電路的邏輯電路或者用微控制器或其他形式的執(zhí)行 程序代碼指令的處理核來實(shí)現(xiàn)。因此,這里上面的討論所教導(dǎo)的處理可以利 用例如機(jī)器可執(zhí)行指令的程序代碼執(zhí)行,所述指令導(dǎo)致執(zhí)行這些指令的機(jī)器 執(zhí)行某些功能。在這個上下文中,"機(jī)器"可以是把中間形式(或"抽象")
指令轉(zhuǎn)換為特定于處理器的指令的機(jī)器(例如像"虛擬機(jī)"(例如Java虛擬 機(jī))、解釋器、公共語言運(yùn)行時、高層語言虛擬機(jī)等等的抽象執(zhí)行環(huán)境),和/ 或置于半導(dǎo)體芯片上(例如用晶體管實(shí)現(xiàn)的"邏輯電路")被設(shè)計成執(zhí)行指令 的電子電路,例如通用處理器和/或?qū)S锰幚砥?。上面的討論所教?dǎo)的處理還 可以由(替代機(jī)器或者與機(jī)器相結(jié)合地)被設(shè)計成執(zhí)行這些處理(或其中一 部分)而無需執(zhí)行程序代碼的電子電路來執(zhí)行。
相信上面的討論所教導(dǎo)的處理也可以用各種軟件開發(fā)環(huán)境(例如微軟公 司的.NET、 Mono、 Java,甲骨文公司的Fusion,等等)所支持的各種面向?qū)?象或非面向?qū)ο笥嬎銠C(jī)編程語言(例如Java、 C#、 VB、 Python、 C、 C++、 J#、 APL、 Cobol、 ABAP、 Fortran、 Pascal、 Perl,等等)以源程序代碼來描 述。源程序代碼可以被轉(zhuǎn)換為抽象執(zhí)行環(huán)境(例如Java虛擬機(jī)、公共語言運(yùn) 行時、高層語言虛擬機(jī)、解釋器,等等)可理解的中間形式程序代碼(例如 Java byte code、孩i:軟Intermediate Languange,等等),或者轉(zhuǎn)換為更針對特定 處理器的更特定形式的程序代碼。
制造品(article of manufacture)可用來存儲程序代碼。存儲程序代碼的 制造品可以被具體實(shí)施為一個或更多個存儲器(例如一個或更多個快閃存儲 器、隨機(jī)訪問存儲器(靜態(tài)、動態(tài)或者其他)、光盤、CD-ROM、 DVD-ROM、 EPROM、 EEPROM、磁卡或光學(xué)卡,或者適于存儲電子指令的其他類型的機(jī) 器可讀介質(zhì)),但不限于此。程序代碼也可以通過具體實(shí)施在傳播介質(zhì)中的數(shù) 據(jù)信號(例如通過通信鏈路(例如網(wǎng)絡(luò)連接))從遠(yuǎn)程計算機(jī)(例如服務(wù)器) 下載到請求計算機(jī)(例如客戶端)。
如這里所使用的那樣,"邏輯"可以包括例如軟件、石更件和/或石更件和軟 件的組合。
盡管已經(jīng)參考具體的示范性實(shí)施例描述了本發(fā)明,但是將認(rèn)識到本發(fā)明 不局限于所描述的實(shí)施例,而是利用所附權(quán)利要求書的精神和范圍內(nèi)的修改 和變化也能夠?qū)嵺`本發(fā)明。因此,說明書和附圖應(yīng)被看作是說明性的而非限 制性的。
權(quán)利要求
1.一種用于定制軟件應(yīng)用的方法,所述方法包含響應(yīng)于執(zhí)行待通過統(tǒng)一定制接口定制的軟件應(yīng)用的功能,統(tǒng)一定制接口自動地記錄從軟件應(yīng)用的功能對定制條目的訪問;和統(tǒng)一定制接口在報告中輸出指示軟件應(yīng)用的功能如何訪問特定定制條目的信息,包括相對于軟件應(yīng)用訪問的其他定制條目標(biāo)識所述特定定制條目。
2. 如權(quán)利要求l所述的方法,其中,軟件應(yīng)用的定制用戶接口包括具有 根節(jié)點(diǎn)和多個其他節(jié)點(diǎn)的樹結(jié)構(gòu),^f艮節(jié)點(diǎn)和所述多個其他節(jié)點(diǎn)中的每一個代 表對應(yīng)的定制類別或?qū)?yīng)的定制條目。
3. 如權(quán)利要求2所述的方法,其中,所述信息包含從根節(jié)點(diǎn)導(dǎo)航到表示定制條目的節(jié)點(diǎn)的路徑。
4. 如權(quán)利要求l所述的方法,還包含給定制條目設(shè)置新值以便定制軟件 應(yīng)用的功能。
5. 如權(quán)利要求l所述的方法,其中,所述輸出指示如何在軟件應(yīng)用的定 制用戶接口中定位與功能相關(guān)聯(lián)的定制條目的信息發(fā)生在與軟件應(yīng)用分離的 統(tǒng)一定制系統(tǒng)中。
6. 如權(quán)利要求5所述的方法,其中,所述信息被輸出到日志中。
7. 如權(quán)利要求6所述的方法,其中,所述日志被保持在臨時存儲器、文 件和數(shù)據(jù)庫中的任何一個中。
8. 如權(quán)利要求l所述的方法,其中,如果為了執(zhí)行功能而檢索定制條目 的值,則所述定制條目被視為與該功能相關(guān)聯(lián)。
9. 一種定制系統(tǒng),包含存儲設(shè)備,用于存儲軟件應(yīng)用的定制數(shù)據(jù),該定制數(shù)據(jù)包括通過多個定 制類別組織的多個定制條目,每一 個定制條目均具有影響軟件應(yīng)用的對應(yīng)功 能的行為的值;和定制模塊,用于從存儲設(shè)備檢索定制條目的值,以用于執(zhí)行軟件應(yīng)用的 功能,并輸出將被用于在用戶接口中定位定制條目的信息,以用于給定制條 目設(shè)置新值。
10. 如權(quán)利要求9所述的定制系統(tǒng),其中,用戶接口包括具有根節(jié)點(diǎn)和 多個其他節(jié)點(diǎn)的樹結(jié)構(gòu),所述才艮節(jié)點(diǎn)和所述多個其他節(jié)點(diǎn)中的每 一 個代表對 應(yīng)的定制類別或?qū)?yīng)的定制條目。
11. 如權(quán)利要求10所述的定制系統(tǒng),其中,所述信息包含從根節(jié)點(diǎn)導(dǎo)航 到代表定制條目的節(jié)點(diǎn)的路徑。
12. 如權(quán)利要求9所述的定制系統(tǒng),其中,所述信息被輸出到日志中。
13. 如權(quán)利要求12所述的定制系統(tǒng),其中,所述日志被保持在文件、臨 時存儲器、和數(shù)據(jù)庫中的任何一個中。
14. 如權(quán)利要求9所述的定制系統(tǒng),還包含定制數(shù)據(jù)設(shè)置模塊,用于接 收定制數(shù)據(jù)和把定制數(shù)據(jù)存儲在存儲設(shè)備上。
15. —種具有指令的機(jī)器可讀介質(zhì),當(dāng)被執(zhí)行時,所述指令導(dǎo)致機(jī)器執(zhí) 行定制軟件應(yīng)用的處理,所述處理包含在統(tǒng)一定制系統(tǒng),從軟件應(yīng)用接收檢索定制條目的值的請求,為了執(zhí)行 軟件應(yīng)用的功能需要所述值;和在統(tǒng)一 定制系統(tǒng),輸出指示在軟件應(yīng)用的定制用戶接口中如何定位定制 條目的信息。
16. 如權(quán)利要求15所述的機(jī)器可讀介質(zhì),其中,軟件應(yīng)用的定制用戶接 口包括具有根節(jié)點(diǎn)和多個其他節(jié)點(diǎn)的樹結(jié)構(gòu),根節(jié)點(diǎn)和所述多個其他節(jié)點(diǎn)中 的每一個表示對應(yīng)的定制類別或?qū)?yīng)的定制條目。
17. 如權(quán)利要求16所述的機(jī)器可讀介質(zhì),其中,所述信息包含從根節(jié)點(diǎn) 導(dǎo)航到表示定制條目的節(jié)點(diǎn)的路徑。
18. 如權(quán)利要求15所述的機(jī)器可讀介質(zhì),其中,所述信息被輸出到曰志 中,并且其中,所述日志被保持在臨時存儲器、文件和數(shù)據(jù)庫中的任何一個 中。
19. 如權(quán)利要求15所述的機(jī)器可讀介質(zhì),其中,所述處理還包含在統(tǒng)一 定制系統(tǒng)處接收軟件應(yīng)用的定制數(shù)據(jù),并把定制數(shù)據(jù)存儲為多個定制類別、 多個定制條目和多個取值范圍。
20. 如權(quán)利要求19所述的機(jī)器可讀介質(zhì),其中,從統(tǒng)一定制系統(tǒng)的用戶接口接收定制數(shù)據(jù)。
全文摘要
這里介紹的技術(shù)包括統(tǒng)一定制系統(tǒng)和方法,其能夠支持同時定制多個軟件應(yīng)用??梢元?dú)立于軟件應(yīng)用的開發(fā)來開發(fā)該軟件應(yīng)用的定制數(shù)據(jù)。然后,定制數(shù)據(jù)被通過統(tǒng)一定制系統(tǒng)存儲在定制存儲器中。當(dāng)軟件應(yīng)用執(zhí)行時,該軟件應(yīng)用通過統(tǒng)一定制系統(tǒng)從存儲器檢索定制數(shù)據(jù)的值。統(tǒng)一定制系統(tǒng)輸出檢索到的、指示用戶當(dāng)前工作上下文(working context)的定制數(shù)據(jù),用戶可以使用所述數(shù)據(jù)在軟件應(yīng)用的定制用戶接口中定位用于定制在當(dāng)前工作上下文中執(zhí)行的功能的定制選項。
文檔編號G06F9/44GK101354645SQ20081013373
公開日2009年1月28日 申請日期2008年7月25日 優(yōu)先權(quán)日2007年7月25日
發(fā)明者肖友能, 劼 趙 申請人:Sap股份公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
林口县| 蓬安县| 中阳县| 德清县| 青冈县| 肇州县| 咸宁市| 获嘉县| 赤水市| 平顶山市| 图木舒克市| 紫金县| 金阳县| 余庆县| 马鞍山市| 离岛区| 神木县| 安塞县| 瓮安县| 石楼县| 旌德县| 习水县| 沙河市| 湖州市| 安陆市| 杭锦后旗| 梁平县| 连南| 友谊县| 定安县| 寿阳县| 东乡| 天等县| 习水县| 乌拉特后旗| 青岛市| 贵阳市| 盐池县| 舟山市| 沁源县| 兰州市|