《電子技術應用》
您所在的位置:首頁 > 通信與網(wǎng)絡 > 設計應用 > 基于XML和工作流的構件化軟件框架研究
基于XML和工作流的構件化軟件框架研究
來源:電子技術應用2011年第4期
房 莉,陳湘平,程 敏,涂文婕
空軍雷達學院 預警監(jiān)視情報系,湖北 武漢430019
摘要: 基于XML技術,采用構件化設計方式,搭建了構件組裝和運行框架,并研究了基于工作流控制方式的構件動態(tài)調度策略。用戶可以在構件組裝框架下集成應用系統(tǒng),并實現(xiàn)相應的業(yè)務功能。
中圖分類號: TP311.5
文獻標識碼: A
文章編號: 0258-7998(2011)04-0040-05
Research on frame of component-based software based on workflow and XML
Fang Li,Chen Xiangping,Cheng Min,Tu Wenjie
Department of Early Warning Surveillance Intelligence, Air Force Radar Academy, Wuhan 430019,China
Abstract: This paper built an assembling frame and a running frame for components based on XML, and studied components dynamic scheduling method. Application system can be assembled under the component assembling frame and then run under the running frame. The frame implemented components assembling like receptacle, and components can be assembled to sub modules, and then to function modules, and then to application system.
Key words : XML;workflow;component;interface testing


    現(xiàn)有的軟件系統(tǒng)多采用傳統(tǒng)開發(fā)方法且只針對某個具體應用開發(fā),軟件與設備及軟件內部各模塊間耦合緊密,軟件可復用性低、可擴展性差。
    基于構件的軟件開發(fā)方法[1],其思想是使軟件能夠像硬件那樣,通過各部分的動態(tài)組裝完成整個應用系統(tǒng)的功能。基于構件的軟件工程CBSE(Component Based Software Engineering)逐漸成為軟件開發(fā)的主流模式[2],已成為近幾年學術界和產(chǎn)業(yè)界共同關注和研究的熱點。
1 構件模型
    相對于傳統(tǒng)對象而言,構件將抽象程度提到一個更高的層次,整個構件隱藏了具體的實現(xiàn),只用接口提供服務。這樣,構件可以將底層的多個邏輯組合成高層次上的粒度更大的新構件,甚至直接封裝到一個系統(tǒng)中,使模塊的重用從代碼級、對象級、架構級到系統(tǒng)級都可能實現(xiàn)[3-5]。
1.1 構件模型
    為了在后期使用構件時能夠快速檢索到需要的構件,必須對構件進行分類。構件可以使用多種分類方法。本系統(tǒng)先將構件分為原子構件Ca和復合構件Cc兩大類,原子構件是不能再分的構件,復合構件是由原子構件或復合構件組成的構件。
    原子構件可表示為Ca=(IDa,Na,Ta,Ia,Oa,Ma,Da),其中,IDa為原子構件唯一標識;Na為原子構件名稱;Ta為原子構件類型集合(包括子類型集合),父類型和子類型用樹形結構表示;Ia為原子構件輸入接口集合(包括各接口的名稱、參數(shù)、參數(shù)類型);Oa為原子構件輸出接口集合(包括各接口的名稱、參數(shù)、參數(shù)類型);Ma為原子構件消息集合;Da為原子構件描述信息(包括構件存儲路徑、索引關鍵字、功能描述、編寫語言、作者、制作日期、版本)。
    復合構件可表示為Cc=(IDc,Nc,Tc,Ic,Oc,Mc,Dc,IDas,Ras),其中,IDc為復合構件唯一標識;Nc為復合構件名稱;Tc為復合構件類型集合(包括子類型集合),父類型和子類用樹形結構表示;Ic為復合構件輸入接口指針集合,該指針指向組成復合構件的原子構件對應輸入接口;Oc為復合構件輸出接口指針集合,該指針指向組成復合構件的原子構件對應輸出接口;Mc為復合構件消息集合;Dc為復合構件描述信息(包括構件存儲路徑、索引關鍵字、功能描述、編寫語言、作者、制作日期、版本);IDas為組成復合構件的原子構件IDa集合;Ras為組成復合構件的原子構件的連接關系。
    原子構件和復合構件又可以根據(jù)功能劃分為界面構件、通信構件、數(shù)據(jù)庫構件、業(yè)務構件等。其中,每一類構件又可細分為很多子類。構件粒度越小,復用度越高,構件耦合度越低,但構件庫中構件的數(shù)量也會隨著粒度的變小而劇增,這會給構件的檢索帶來不便。因此,應根據(jù)具體需求,把握好構件的粒度。可參考式(1)[6]:
 
1.2 基于構件的軟件開發(fā)過程
    面向構件的軟件開發(fā)過程如圖1所示。具體描述如下:

    (1)總體設計者對業(yè)務系統(tǒng)進行需求分析后得到功能需求和框架需求。
    (2)構件分析者根據(jù)功能需求進行構件需求分析后得到構件需求;同時框架實現(xiàn)者根據(jù)框架需求對系統(tǒng)框架進行實現(xiàn)。
    (3)構件實現(xiàn)者根據(jù)構件需求對構件進行實現(xiàn),并經(jīng)過嚴格測試和修改后得到合格的構件。
    (4)構件庫管理者可以將新制作的構件注冊入庫,為了能快速檢索到構件,構件入庫時必須對其信息進行精確全面的描述。本文使用XML描述構件信息,并使用XML Schema對構件描述文檔進行合法性檢驗,只有描述合法的構件才可以入庫,從而確保構件描述信息的一致性和完整性。構件庫管理者可以對構件庫中的構件進行刪除、注銷、檢索等操作。
    (5)構件組裝者根據(jù)具體需要從構件庫中檢索需要的構件,并在系統(tǒng)框架下進行組裝后形成應用系統(tǒng),構件組裝者還負責對應用系統(tǒng)的測試與維護。
    (6)應用系統(tǒng)交付用戶使用并提出修改意見與建議,構件組裝者再根據(jù)用戶需求進行修改。
2 基于構件的軟件框架
    面向構件的軟件開發(fā)過程中,構件組裝和運行需要特殊的環(huán)境,這種特殊的運行環(huán)境稱為框架。一個框架由一些規(guī)則、建議和習慣組成,它們從構件的角度定義了一個系統(tǒng)結構,并定義了系統(tǒng)的各組成部分之間是如何通信和實現(xiàn)互操作的。因此,設計框架時,必須自己定義構件及框架的規(guī)范,使用者只有遵循這些規(guī)范,才能將構件集成到框架中。本系統(tǒng)框架包括構件組裝框架和構件運行框架兩部分,這兩個框架由系統(tǒng)框架管理器管理,以確保系統(tǒng)在某一時刻,只能處于其中一個框架下。系統(tǒng)處于構件組裝框架時,可實現(xiàn)構件組裝、功能模塊組裝、應用系統(tǒng)集成、應用系統(tǒng)修改、應用系統(tǒng)功能擴展等功能。系統(tǒng)處于運行框架時,能夠完成相應的業(yè)務處理功能,但不能對其進行配置。基于構件的軟件框架結構如圖2所示。
2.1 構件組裝框架
     傳統(tǒng)的構件組裝大多使用代碼方式調用構件接口,此方式比較復雜。本框架提供一種圖形化的構件組裝界面,開發(fā)者可以輕松高效地集成新的應用系統(tǒng)或對已有系統(tǒng)進行擴展。
    如圖2所示,構件組裝框架主要包括構件制作工具、構件測試工具、構件庫管理工具、構件組裝工具、模塊管理工具、模塊組裝工具。其中,制作工具、構件測試工具只提供簡單的構件制作和測試功能,構件實現(xiàn)者可以選擇市場上其他工具進行構件制作及測試;構件庫管理工具具有構件注冊、注銷、刪除、檢索等功能,模塊管理工具具有模塊注冊、修改、刪除、檢索等功能,這兩個工具實現(xiàn)起來相對簡單;構件組裝和模塊組裝時生成對應的XML配置文檔,通過這些XML配置文檔將構件粘合成應用系統(tǒng)。本文使用的XML配置文檔主要包括:(1)構件描述文檔:對構件信息進行描述,以便使用構件時能方便獲取構件信息;(2)構件適配文檔:對構件接口連接關系進行描述;(3)模塊適配文檔:對模塊之間以及構件和模塊之間連接關系的描述;(4)菜單適配文檔:將菜單與對應業(yè)務模塊綁定,以便用戶點擊對應的菜單時,觸發(fā)該功能模塊運行。組裝時,通過這些XML配置文檔,將構件組裝成子模塊、功能模塊直至整個綜合測試系統(tǒng),需要時查找模型中相應的標簽位置并靈活插入,這樣在對系統(tǒng)修改時,只需要修改相應的構件,其他部分不受影響。此方法支持系統(tǒng)的快速開發(fā)和修改,具有較高的靈活性和較好的可擴展性,達到了令人滿意的伸縮性。


    在組裝時,構件組裝者根據(jù)應用系統(tǒng)的需求檢索相關構件,如果構件庫中無此構件,則必須制作相關構件并放入構件庫中,再將檢索到的構件通過構件組裝工具進行組裝。為了不使應用系統(tǒng)在組裝過程中太復雜,先將構件組裝成業(yè)務構件,再將業(yè)務構件組裝成功能模塊,最后將功能模塊組裝成應用系統(tǒng)。
2.1.1 構件組裝
    構件組裝工具的核心是解決構件適配問題。大多數(shù)情況下,使用不同語言制作的構件都需要做某種方式的修改以便與其他構件相匹配,這個過程稱為構件適配,適配方法有白盒法、黑盒法和灰盒法。文獻[7]對三種方法的技術、特點和實現(xiàn)的難易程度進行了分析,結論是采用灰盒法既可以實現(xiàn)構件組裝的靈活性,又不至于使適配技術過于復雜。本文在對各種灰盒法的適配技術進行比較后,采用基于連接器的適配技術。此方法將構件功能的實現(xiàn)與其交互作用的實現(xiàn)相分離,從而增加構件組裝的可配置性,在現(xiàn)有技術條件下,它是實現(xiàn)構件動態(tài)組裝的有效途徑之一。
    構件連接器可以表示為CL=(IDcl,Ncl,Rcls),其中,IDcl為連接器唯一標識;Ncl為連接器名稱;Rcls為連接關系集合,包含有多個接口連接關系,每個連接關系Rcl可表示為Rcl=(IDsc,IDdc,DTc,Dc,MSc),其中,IDsc表示源構件唯一標識,IDdc表示目標構件唯一標識,DTc表示數(shù)據(jù)類型,Dc為數(shù)據(jù)的值,MSc表示消息。
2.1.2 模塊組裝
    通過模塊組裝工具可以將業(yè)務模塊組裝成功能模塊。本文使用類似連接器的方法設計模塊連接器。
    模塊連接器可以表示為:ML=(IDml,Nml,Rmls),其中,IDml為模塊連接器唯一標識;Nml為模塊連接器名稱;Rmls為連接關系集合,包含有多個模塊接口連接關系,每個連接關系Rml可表示為Rml=(IDsm,IDdm,DTm,Dm,MSm),其中,IDsm表示源模塊唯一標識,IDdm表示目標模塊唯一標識,DTm表示數(shù)據(jù)類型,Dm為數(shù)據(jù)的值,MSm表示消息。
    模塊連接器信息用XML適配文檔進行描述,其XML schema源碼如下:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XML
Schema">
<xsd:element name=" IDml " type="xsd:string"/>
<xsd:element name=" Nml ">
<xsd:complexType>
<xsd:sequence maxOccurs="unbounded">
   <xsd:element name="Rml"type="xsd:string" maxOccurs=
"unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
2.1.3 菜單配置
    菜單描述工具的主要功能是將菜單與對應功能的模塊進行綁定,生成菜單適配文檔。本系統(tǒng)菜單嵌套最多為三級,菜單適配文檔可表示為FL=(IDm,IDf1,IDf2,IDf3),其中IDm表示功能模塊ID,IDfi為第i級菜單ID,i=1,2,3。其源碼可參考前文給出的模塊適配文檔XML schema源碼。
2.2 構件運行框架
    構件運行框架主要包括:構件調度器、構件實例化工具以及各種XML配置文檔解析器。其中,配置文檔解析器的功能是解析對應的XML配置文檔,其實現(xiàn)相對簡單,在此不作介紹。下面重點介紹構件調度器和構件實例化工具。
2.2.1 基于工作流控制的構件調度模型
    構件調度是一個動態(tài)過程,調度之前難以知道構件運行所需要的全部信息,因此很難一次性建立構件調度模型。即使建立了模型,隨著構件調度的執(zhí)行,各種因素發(fā)生變化,也會使模型不能反應信息的動態(tài)變化而導致構件調度失敗。
    工作流技術[7,8]最初被廣泛應用于解決企業(yè)的項目調度問題,現(xiàn)已逐漸擴展到許多領域。工作流技術可以全面描述過程的信息,在運行時能夠動態(tài)監(jiān)視業(yè)務過程的執(zhí)行情況,因此可得到過程執(zhí)行的實時信息,如:過程執(zhí)行、資源利用、時間計劃情況等,并能根據(jù)這些信息生成新的調度方案。因此,工作流技術可以應用于解決構件調度問題。
    本文提出一種基于工作流技術的構件調度模型,模塊包括:過程控制模型、公共資源服務模型、消息處理模型、工作流數(shù)據(jù)模型。各模型之間的調用關系如圖3所示。

    過程控制模型是構件調度模型的核心和骨架,定義應用系統(tǒng)所有構件的處理流程,描述構件調度問題的約束,包括模塊之間以及組成模塊的構件之間的邏輯關系、詳細描述(執(zhí)行所需的信息、資源)等。這些信息可以在構件調度過程中通過各種XML配置文檔解析器解析對應的XML配置文檔獲取。利用這些信息可以預測并找出工作流所管理的全部過程實例之間存在的資源沖突情況。通過把產(chǎn)生資源沖突的過程實例按照一定的規(guī)則抽取出來就可以得到項目調度的動態(tài)模型。由于過程實例的執(zhí)行情況不斷變化,如某些過程實例執(zhí)行結束、某些實例被終止、某些活動被掛起、某些異常出現(xiàn)等,因此按照一定的周期動態(tài)地從這些過程實例中所得到的過程模型也會隨之不斷更新,得到&ldquo;最新&rdquo;的調度模型,這解決了調度模型不能反映信息動態(tài)變化的問題。
    公共資源服務模型定義構件調度過程中需要的公共服務資源,如數(shù)據(jù)庫服務、打印服務等。
    消息處理模型定義構件調度過程中的事件屬性,它是一個構件向另一個構件發(fā)出的某種通知。
    工作流數(shù)據(jù)模型定義了與構件調度模型執(zhí)行密切相關的數(shù)據(jù)。從某種意義上講,它確定構件執(zhí)行過程狀態(tài)轉換的條件。
2.2.2 構件實例化
    構件是動態(tài)調用的,即應用系統(tǒng)運行前構件都沒有實例化,只有在執(zhí)行過程中調用時才實例化。可以借助反射機制實現(xiàn)構件動態(tài)實例化。本文的構件實例化工具是在.NET平臺下用C#語言實現(xiàn),其關鍵代碼如下:
private void CreateInstanceAndInvoke()
{
    ParseXML();//解析相關XML文檔
    SourceComXMLPath=COMSchedule();//構件調度器
    Assembly curAssm=Assembly.LoadFile(SourceComXMLPath);
    Type[] types=curAssm.GetTypes();
    if (isInterface)
    {
        foreach (Type type in types)
        {
            MethodInfo[] methodInfos=type.GetMethods();
            foreach (MethodInfo methodInfo in methodInfos)
            {
                ParameterInfo[] paras=
methodInfo.GetParameters();
                object[] objSourceParas=
new object[paras.Length];
                object[] objTargetParas;
                if (methodInfo.Name==strSourceComInter-
faceName)
                {
objTargetParas=methodInfo.Invoke(curAssm.CreateInstance
(type.FullName),
out objSourceParas);
                    InvokeTarget();//調用目標構件的接口
                }
            }
        }
    }
    else
    {
        &hellip;&hellip;
    }
    &hellip;
}
3 應用實例
    本文設計的基于工作流控制的構件化軟件框架已經(jīng)在某型設備接口測試系統(tǒng)中得到應用。某型設備有多種待測接口,下面以其A/D接口測試為例說明本系統(tǒng)的有效性。
    圖4為對某型設備A/D、D/A接口構件劃分結果圖。構件通過構件連接器組裝成業(yè)務模塊,業(yè)務模塊通過模塊連接器組裝成功能模塊。組裝后的某型設備接口測試系統(tǒng)對A/D接口測試結果如圖5所示。測試中,A/D接口的通道13測試誤差大于設定誤差的最大值,未通過測試;其他接口各通道的測試誤差均小于其最大誤差要求,通過測試。

    實踐應用證明,該軟件框架可以實現(xiàn)基于構件的應用系統(tǒng)的插座式組裝,使其能從原子構件集成子模塊、功能模塊直至整個應用系統(tǒng)。此方法支持系統(tǒng)的快速開發(fā)和修改,具有較高的靈活性和較好的可擴展性,達到了令人滿意的伸縮性。
    針對目前大多數(shù)軟件模塊間耦合緊密、軟件可復用性低、可擴展性差等問題。將XML、工作流和構件技術相結合,設計了圖形化方式構件組裝框架和構件運行框架。用戶可以在構件組裝框架下集成應用系統(tǒng),在構件運行框架下運行組裝的系統(tǒng)可以實現(xiàn)相應的業(yè)務功能。實踐證明,該軟件框架可以實現(xiàn)基于構件的應用系統(tǒng)的插座式組裝,使其能從原子構件集成子模塊、功能模塊直至整個應用系統(tǒng)。此方法支持系統(tǒng)的快速開發(fā)和修改,具有較高的靈活性和較好的可擴展性,避免了軟件的重復開發(fā),節(jié)省了大量費用,達到了令人滿意的伸縮性效果。
參考文獻
[1] 楊芙清,王千祥,梅宏,等.基于復用的軟件生產(chǎn)技術[J].中國科學,2001,31(4):363-371.
[2] 任洪敏,錢樂秋.構件組裝及其形式化推導研究[JJ.軟件學報,2003,l4(6):1066-1074.
[3] 王強,何克清,李兵,等.基于MMF的互操作性軟構件庫管理模型的研究[J].計算機工程,2005,31(16):57-58.
[4] 吳信永,宋東,劉飛.基于構件技術的通用ATS框架設計[J].計算機測量與控制,2008,16(2):141-143.
[5] 王忠杰,徐曉飛,戰(zhàn)德臣.基于特征的構件模型及其規(guī)范化設計過程[J].軟件學報,2006,17(1):39-47.
[6] 徐瑋,保林,李昭原.企業(yè)信息系統(tǒng)業(yè)務構件研究[J]. 軟件學報,2003,14(7):1213-1220.
[7] 王志堅,費玉奎,婁淵清.軟件構件技術及其應用[M]. 北京:科學出版社,2005.
[8] 李偉平,范玉順.基于工作流的資源受限項目調度研 究[J].清華大學學報(自然科學版),2004,44(10):
1384-138.

此內容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲福利久久| 中国成人黄色视屏| 亚洲免费成人av| 在线色欧美三级视频| 国产日韩亚洲欧美精品| 国产精品ⅴa在线观看h| 欧美精品电影| 欧美黄色日本| 欧美mv日韩mv国产网站| 蜜臀av在线播放一区二区三区| 欧美在线首页| 久久av资源网| 久久se精品一区精品二区| 午夜精品美女久久久久av福利| 亚洲综合不卡| 亚洲欧美视频一区二区三区| 亚洲男人影院| 午夜视频在线观看一区二区三区| 亚洲视频在线二区| 亚洲一区二区三区免费视频| 亚洲一区二区伦理| 亚洲在线1234| 欧美亚洲免费高清在线观看| 性欧美video另类hd性玩具| 午夜国产一区| 久久精品国产一区二区三区| 久久久久国产精品厨房| 久久全球大尺度高清视频| 久久一本综合频道| 欧美高清视频免费观看| 欧美激情亚洲精品| 欧美色偷偷大香| 国产精品美女久久久免费| 国产日韩精品一区二区三区在线| 国产在线观看一区| 亚洲国产岛国毛片在线| 日韩亚洲视频在线| 亚洲性感激情| 欧美在线视频免费播放| 亚洲日本欧美天堂| 亚洲一二三四久久| 欧美在线免费视频| 另类天堂av| 欧美日韩小视频| 国产女人18毛片水18精品| 黄色在线一区| 亚洲美女91| 亚洲欧美日韩中文视频| 亚洲高清不卡在线观看| 99精品视频免费| 欧美一区二区日韩一区二区| 美女视频一区免费观看| 欧美视频第二页| 国产在线观看91精品一区| 亚洲七七久久综合桃花剧情介绍| 中日韩美女免费视频网址在线观看| 午夜日韩激情| 日韩一级网站| 欧美一区二区三区男人的天堂| 久久久久久一区| 欧美日韩一区二区国产| 国产日韩欧美a| 亚洲激情网站| 欧美一级一区| 亚洲婷婷在线| 免费观看日韩| 国产乱码精品一区二区三区不卡 | 欧美亚洲一区三区| 亚洲精品久久久久久一区二区| 亚洲婷婷在线| 老司机成人在线视频| 欧美三区美女| 伊人久久综合97精品| 亚洲伊人伊色伊影伊综合网 | 午夜在线成人av| 欧美韩日一区二区三区| 国产女主播一区二区三区| 亚洲精品色婷婷福利天堂| 久久精品91久久香蕉加勒比 | 国产精品乱码久久久久久| 亚洲国产二区| 欧美在线视频免费播放| 亚洲免费视频在线观看| 欧美成人中文字幕在线| 国产欧美一区二区精品性| 亚洲精品在线免费| 亚洲国产激情| 久久精品99无色码中文字幕 | 亚洲欧美成人在线| 欧美激情在线观看| 黑人巨大精品欧美黑白配亚洲| 亚洲午夜精品久久| 在线亚洲欧美专区二区| 蜜桃av一区二区三区| 国产在线精品自拍| 亚洲欧美一区二区精品久久久| 一区二区三区 在线观看视频 | 国产精品地址| 亚洲精品在线观看视频| 亚洲欧洲一区二区在线观看| 久久久91精品国产一区二区三区 | 亚洲欧美久久久| 亚洲一区二区在线免费观看| 欧美国产成人精品| 影音先锋另类| 亚洲大胆av| 久久婷婷国产综合国色天香| 国产亚洲精品美女| 亚洲欧美日韩天堂| 午夜老司机精品| 国产精品久线观看视频| 一本色道久久99精品综合| 亚洲精品小视频在线观看| 麻豆国产精品va在线观看不卡| 国产一区二区三区在线播放免费观看| 亚洲欧美日韩一区二区| 欧美一区二区性| 国产精品五区| 午夜精品免费| 久久国产精品黑丝| 国产日韩精品视频一区| 欧美亚洲免费| 久久婷婷av| 亚洲第一精品夜夜躁人人躁| 亚洲片国产一区一级在线观看| 免费看的黄色欧美网站| 亚洲第一网站免费视频| 最近看过的日韩成人| 欧美+亚洲+精品+三区| 亚洲激情成人在线| av成人激情| 欧美午夜电影在线观看| 中文国产成人精品| 西西人体一区二区| 国产日韩欧美日韩| 久久精品一级爱片| 欧美成人一品| 亚洲国产精品久久久久婷婷老年| 日韩视频免费在线| 欧美午夜片欧美片在线观看| 亚洲午夜小视频| 久久久久成人精品| 一区一区视频| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 久久av一区| 影音先锋亚洲一区| 亚洲美女诱惑| 国产精品久久福利| 欧美一区二区三区的| 麻豆亚洲精品| 日韩亚洲在线| 欧美在线免费观看视频| 影音先锋久久久| 一区二区三区免费看| 国产精品欧美精品| 久久精品国产v日韩v亚洲| 欧美高清一区二区| 亚洲系列中文字幕| 久久一区二区三区国产精品| 亚洲国产视频a| 亚洲图片激情小说| 国产一区二区三区四区hd| 日韩亚洲一区二区| 国产精品夜色7777狼人| 亚洲国产专区| 国产精品v欧美精品v日韩 | 久久午夜精品| 日韩午夜剧场| 久久国产精品99国产精| 亚洲欧洲在线观看| 欧美在线一级视频| 亚洲国产日韩一区二区| 午夜精品三级视频福利| 亚洲国产91色在线| 欧美一区二区三区成人| 亚洲第一页自拍| 亚洲欧美综合一区| 亚洲国产一成人久久精品| 亚洲欧美久久久| 亚洲成人原创| 午夜精品视频| 亚洲人成毛片在线播放女女| 欧美一区二区三区四区高清| 在线观看一区欧美| 午夜一级在线看亚洲| 亚洲国产成人av| 久久av免费一区| 日韩写真在线| 老司机精品导航| 亚洲一区二区三区视频| 免费久久99精品国产自在现线| 亚洲婷婷在线| 欧美高清视频在线播放| 午夜久久美女| 欧美日本一区二区视频在线观看| 久久激五月天综合精品| 国产精品美女久久福利网站| 亚洲免费成人| 精品动漫一区二区| 欧美一级电影久久|