<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    williamraym

    DotNet版的ExtJS單用戶(hù)Blog系統(tǒng)源碼解析

     
    在講解源碼之前,這里先簡(jiǎn)單說(shuō)說(shuō)系統(tǒng)運(yùn)行的幾個(gè)事項(xiàng)。雖然下載的壓縮包中已經(jīng)包含了簡(jiǎn)單的說(shuō)明,但有一個(gè)重點(diǎn)沒(méi)有強(qiáng)調(diào),也就是雖然這個(gè)系統(tǒng)會(huì)在啟動(dòng)的時(shí)候自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),但他是不能自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)的,因此在啟動(dòng)之前需要自己手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù),比如VifirBlog。
    數(shù)據(jù)庫(kù)的配置是在Web.config文件中,在啟動(dòng)應(yīng)用程序時(shí),需要修改Web.config文件中的數(shù)據(jù)庫(kù)配置,把用戶(hù)名及密碼根據(jù)你的情況進(jìn)行修改,數(shù)據(jù)庫(kù)的配置內(nèi)容如下:
     
    <databaseSettings>
        
    <add key="db.datasource" value="(local);Integrated Security=true"/>
        
    <add key="db.user" value="sa"/>
        
    <add key="db.password" value="sa"/>
        
    <add key="db.database" value="vifirblog"/>
        
    <add key="db.generateDdl" value="true"/>
     
    </databaseSettings>
     
    <appSettings>
    db.datasource表示數(shù)據(jù)源,默認(rèn)是SQL Server的,當(dāng)然你可以選擇使用MySQL、Oracle等各種數(shù)據(jù)源,其中db.user表示用戶(hù)名,db.password表示密碼,db.database表示數(shù)據(jù)庫(kù)名,db.generateDdl表示是否讓程序啟動(dòng)的時(shí)候自動(dòng)生成表系統(tǒng)所需要的表結(jié)構(gòu)。db.generateDdl默認(rèn)為true,第一次運(yùn)行成功后會(huì)自動(dòng)建表結(jié)構(gòu),然后請(qǐng)手動(dòng)修改成false這樣下次再啟動(dòng)就不會(huì)再建表結(jié)構(gòu)了。
    壓縮后的文件結(jié)構(gòu)是一個(gè)VS項(xiàng)目文件,如下圖所示:
     
     
     如果你機(jī)器上安裝了VS2005(SP1)以上的版本,那么理論上應(yīng)該可以直接雙擊Vifir.Web.sln這個(gè)文件來(lái)實(shí)現(xiàn)在VS中打開(kāi)項(xiàng)目(如果裝的VS版本打不開(kāi)的話(huà),那么你就得好好想辦法了,因?yàn)楸救瞬皇歉?Net的,所以不太清楚為什么,也許其中原因你們比我都專(zhuān)業(yè)),如下圖所示:
     
    項(xiàng)目打開(kāi)后,大家可以直接打開(kāi)Web.config文件,重點(diǎn)看看databaseSettings一節(jié)的配置,確認(rèn)沒(méi)問(wèn)題后,可以直接點(diǎn)擊上面的運(yùn)行按鈕來(lái)運(yùn)行項(xiàng)目。
     
    啟動(dòng)后即可進(jìn)行Blog后臺(tái)管理頁(yè)面的登錄頁(yè)面,演示系統(tǒng)的用戶(hù)名及密碼均為admin,直接輸入后按登錄即可進(jìn)入系統(tǒng)。如下圖所示:
     
     
     進(jìn)入后可以先進(jìn)入日志目錄管理,程序主區(qū)域會(huì)出現(xiàn)一個(gè)還算漂亮的可編輯表格,可以點(diǎn)擊上面的按鈕添加日志分類(lèi)等,并在右邊的表格中直接編輯各表格薦的內(nèi)容。如下圖所示:
     
     
     
    到這里,這個(gè).Net版的程序就算成功跑起來(lái)了。至于系統(tǒng)其它的功能,你就得慢慢體驗(yàn)了,其實(shí)也就是三四天做出來(lái)的一個(gè)小東西,大家可以簡(jiǎn)單看看即可,用Ext做的更多實(shí)用功能(像在線聊天、在線課堂等),可以直接到http://www.vifir.com/my.html中進(jìn)行實(shí)地體驗(yàn)。下面我們重點(diǎn)對(duì)本項(xiàng)目的代碼作簡(jiǎn)單的解析。
     
     
    由于這里主要演示的是ExtJS與.Net結(jié)合應(yīng)用,因此一個(gè)核心就是ExtJS部分,打開(kāi)manage/Default.aspx中的源代碼,可以得到如下的內(nèi)容:
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Vifir.Web.manage.Default" %>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" type="text/css" href="../plugins/extjs/ext-2.0/resources/css/ext-all.css" />

    <style type="text/css">
    a
    { text-decoration:none; color:#000033 }
    .link
    {
    font-weight
    :bold;
    padding
    :6px 0 0 -2px;
    line-height
    :25px;
    }

    </style>
    <title>Blog后臺(tái)管理</title>
    </head>
    <body style="font-size:12px">
      
    <div id="loading-mask" style=""></div>
      
    <div id="loading">
        
    <div style="text-align:center;padding-top:25%"><img src="../images/extanim32.gif" width="32" height="32" style="margin-right:8px;" align="absmiddle"/>Loading......</div>
      
    </div>
    <script type="text/javascript" src="../plugins/extjs/ext-2.0/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="../plugins/extjs/ext-2.0/ext-all.js"></script>
    <script type="text/javascript" src="manage.js"></script>
    <script type="text/javascript" src="core.js"></script>
    <script type="text/javascript" src="topic.js"></script>
    <script type="text/javascript" src="album.js"></script>
    </body>
    </html>
     
    其對(duì)應(yīng)的Default.aspx.cs文件內(nèi)容如下:
    namespace Vifir.Web.manage
    {
        
    public partial class Default : System.Web.UI.Page
        
    {
            
    protected void Page_Load(object sender, EventArgs e)
            
    {
                
    if (!UserContext.isAdmin())//如果沒(méi)有登錄
                {
                    Response.Redirect(
    "login.html");//跳轉(zhuǎn)到登錄頁(yè)面
                }

            }

        }

    }

     
     
    在manage/Default.aspx中,我們沒(méi)有引入任何特殊的服務(wù)器端控件,基本上就是普通的html,注意包含了很多的js文件。其中../plugins/extjs/ext-2.0/adapter/ext/ext-base.js及../plugins/extjs/ext-2.0/ext-all.js是Ext的庫(kù)文,而manage.js、core.js、topic.js、album.js等是我們本系統(tǒng)中編寫(xiě)的ExtJS應(yīng)用文件,那些艷麗的界面都是直接在這些js文件中調(diào)用ExtJS的組件生成的。對(duì)于不熟悉Ext的朋友們來(lái)說(shuō),我推薦直接通過(guò)《ExtJS實(shí)用開(kāi)發(fā)指南》來(lái)進(jìn)行一個(gè)系統(tǒng)的學(xué)習(xí)、并且可以把《指南》作為日常的參考書(shū)籍。而對(duì)于熟悉Ext并且希望進(jìn)一步提升的朋友們來(lái)說(shuō),我建議你直接看《Wlr單用戶(hù)Blog系統(tǒng)源碼詳細(xì)開(kāi)發(fā)文檔》,該文檔中包含了對(duì)我們這里用到的manage.js、core.js、topic.js、album.js等文件作了較為詳盡的講解及分析。
     
    由于這里是一個(gè)基于DotNet平臺(tái)的應(yīng)用,因此我們重點(diǎn)來(lái)看看后臺(tái)管理部分。后臺(tái)管理的程序在manage目錄中,包含Album.aspx、AlbumCategory.aspx、Topic.aspx、TopicCategory.aspx、Blog.aspx、Link.aspx、User.aspx、Comment.aspx等等。經(jīng)常搞Asp.Net開(kāi)發(fā)的朋友一定會(huì)迫不急待的點(diǎn)開(kāi)這些擴(kuò)展名為.aspx的文件想看過(guò)究竟,看看這些文件是如何與客戶(hù)端交付、使用了哪些控件、如何產(chǎn)生JSON、如何訪問(wèn)數(shù)據(jù)庫(kù)、SQL語(yǔ)句如何寫(xiě)等。但我想點(diǎn)開(kāi)后你一定會(huì)有所失望了,因?yàn)辄c(diǎn)開(kāi)這些文件后你會(huì)發(fā)現(xiàn)里面幾乎什么東西都沒(méi)有。比如Topic.aspx文件中只包含下面一句大家平時(shí)瞟都不會(huì)瞟一眼的代碼:
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Topic.aspx.cs" Inherits="manage_Topic" %>
     
    當(dāng)然,你一定猜到我們一定把處理這些內(nèi)容的東西都放下面的Topic.aspx.cs文件中了,恭喜你,完全正確!我們重點(diǎn)應(yīng)該是看aspx下面的C#類(lèi)文件,比如Topic.aspx.cs,如下圖所示:
     
     
           由于每一個(gè)模塊要實(shí)現(xiàn)的功能本來(lái)就是相似的,使得這些代碼都是模板化的,所以你打開(kāi)其它的Link.aspx.cs、User.aspx.cs、TopicCategory.aspx.cs都會(huì)看到類(lèi)似的內(nèi)容,只要搞懂一個(gè),其它的舉一反三自然就都懂了。而且在實(shí)際開(kāi)發(fā)中,這些代碼還真不需要用手來(lái)寫(xiě)(那么用什么呢?當(dāng)然是用機(jī)器人了,簡(jiǎn)單寫(xiě)一個(gè)代碼生成工具,替換一下名稱(chēng)就給你搞定了!)。因此,下面我們來(lái)重點(diǎn)看看Topic.aspx.cs的源代碼,其全部?jī)?nèi)容如下:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using Vifir.Model.Service;
    using Vifir.Core;
    using Vifir.Model.Domain;
    using Vifir.Web.Code;
    public partial class manage_Topic : BaseAction
    {
        
    private ITopicService service;   
        
    private ITopicCategoryService categoryService;
     
        
    public ITopicService Service
        
    {
            
    set { service = value; }
        }

        
    public ITopicCategoryService CategoryService
        
    {  
            
    set { categoryService = value; }
        }


        
    public void List()
        
    {
            QueryObject qo 
    = new QueryObject();
            ToPo(qo);
            
    string categoryId = Request.Params["categoryId"];
            
    if (categoryId != null && !"".Equals(categoryId))
            
    {
                qo.addQuery(
    "obj.Category.id"long.Parse(categoryId), "=");
            }

            IPageList pageList 
    = service.getTopicBy(qo);
            jsonResult 
    = pageList;
        }


        
    public void Remove()
        
    {
            
    long id = long.Parse(Request.Params["id"]);
            service.delTopic(id);
            jsonResult 
    = true;
        }


        
    public void Save()
        
    {
           Topic obj 
    = new Topic();
           ToPo(obj);
           
    string CategoryId = Request.Params["CategoryId"];
           
    if (CategoryId != null && !"".Equals(CategoryId))
           
    {
             TopicCategory c 
    = this.categoryService.getTopicCategory(long.Parse(CategoryId));
             obj.Category 
    = c;
           }

           
    if (!HasError())
           service.addTopic(obj);
           extFormResult 
    = true;
        }


        
    public void Update()
        
    {
            
    long id = long.Parse(Request.Params["id"]);
            Topic obj 
    = service.getTopic(id);
            ToPo(obj);
            
    string CategoryId = Request.Params["CategoryId"];
            
    if (CategoryId != null && !"".Equals(CategoryId))
            
    {
                TopicCategory c 
    = this.categoryService.getTopicCategory(long.Parse(CategoryId));
                obj.Category 
    = c;
            }

            
    if (!HasError())
                service.updateTopic(id, obj);
            extFormResult 
    = true;
        }

    }

     
     
    Topic.aspx用來(lái)實(shí)現(xiàn)日志的添加、修改、刪除、分頁(yè)查詢(xún)、排序等一系列的功能,我們可以理解為日志管理模塊。
           前面的一大堆using我想不用多說(shuō),你應(yīng)該知道就是引入需要用到的包package(或命名空間),其中的System.XX的我想你是見(jiàn)多了,不會(huì)有什么疑問(wèn),而Vifir.XX是本系統(tǒng)的域模型、業(yè)務(wù)邏輯層接口等,另外還包含Vifir的核心類(lèi)庫(kù),你直接像System.XX里面的東西一樣在該用的時(shí)候使用是了。(備注:Vifir.Model是本系統(tǒng)的后臺(tái)業(yè)務(wù)邏輯,如果你是Vifir的VIP用戶(hù),則應(yīng)該還能夠直接下載他的源代碼,我也會(huì)在后面的文章中對(duì)Vifir.Model中的源碼進(jìn)行具體的分析,Vifir.Core是Vifir提供的一個(gè)簡(jiǎn)單Ajax、Ext支持及企業(yè)應(yīng)用快速開(kāi)發(fā)的開(kāi)發(fā)庫(kù),不是開(kāi)源項(xiàng)目,但可以免費(fèi)使用,所以想看他源代碼的就只有加入到Vifir團(tuán)隊(duì)中才有可能了。當(dāng)然,看不到也沒(méi)關(guān)系,想想我們雖然沒(méi)看到System.XX里面的一句代碼,還不是照樣屁顛屁顛地用著!)。
          
    下面我們來(lái)看看類(lèi)的聲明,代碼如下: 
    class manage_Topic : BaseAction
    直接繼承自BaseAction,而不是傳統(tǒng)的System.Web.UI.PageBaseAction.csCode目錄,直接打開(kāi)可以看到下面的代碼:
    public abstract class BaseAction : Vifir.Core.Web.AbstractCmdPage
        
    {
            
    protected new void Page_Load(object sender, EventArgs e)
            
    {
                
    if (!UserContext.isAdmin())
                
    {
                    Response.Redirect(
    "login.html"); 
                 }

                
    else
                
    {
                    
    base.Page_Load(sender, e);
                }

            }

        }

      
     
    從代碼中我們可以看出,該類(lèi)繼承自Vifir.Core.Web.AbstractCmdPage,AbstractCmdPage類(lèi)是從EasyJF開(kāi)源團(tuán)隊(duì)的EasyJWeb這個(gè)開(kāi)源MVC框架中借鑒來(lái)類(lèi),用于在Vifir提供用于開(kāi)發(fā)ExtJS的底層開(kāi)發(fā)庫(kù),包含了命令處理、JSON數(shù)據(jù)處理、Ext表單交互及VO轉(zhuǎn)換成PO等實(shí)用方法。如果你對(duì)這些內(nèi)容感興趣,那么歡迎你直接下載EasyJWeb(官方網(wǎng)址: http://www.easyjf.com/easyjweb/index.html)的源代碼來(lái)看看即可(其實(shí)雖然研究DotNet沒(méi)多久,但發(fā)現(xiàn).Net的很多東西、特別是設(shè)計(jì)思想,有不少是得益于Java領(lǐng)域、特別是開(kāi)源領(lǐng)域的貢獻(xiàn)),因此也勸廣大的DotNe用戶(hù)有空時(shí)了關(guān)注一下Java,他也許能讓你走在前面。
     BaseAction中包含了Page_Load方法的公共實(shí)現(xiàn),用來(lái)實(shí)現(xiàn)用戶(hù)登錄檢查的功能,這里通過(guò)調(diào)用業(yè)務(wù)邏輯層的UserContext.isAdmin()來(lái)判斷是否登錄,如果沒(méi)有登錄則把頁(yè)面導(dǎo)向login.html。如果登錄,則直接調(diào)用父類(lèi)(也就是AbstractCmdPage)中的Page_Load方法來(lái)處理用戶(hù)的請(qǐng)求。
          
     回到Topic.aspx.cs,繼續(xù)往下看,我們可以看到service及categoryService字段及屬性的聲明,在定義Service及CategoryService屬性的時(shí)候只設(shè)置了set方法,因?yàn)樵撃K中的屬性基本上,也不可能給其它程序使用,所以不需要設(shè)置get。
     下面來(lái)看List方法,該方法的簽名為public void List(),是一個(gè)普通的方法而已,當(dāng)用戶(hù)在地址欄中輸入Topic.aspx?cmd=List的時(shí)候,會(huì)調(diào)用該方法中的內(nèi)容執(zhí)行。該方法實(shí)現(xiàn)的功能是調(diào)用業(yè)務(wù)邏輯層提供的業(yè)務(wù)方法getTopicBy,來(lái)獲得日志信息。getTopicBy方法需要一個(gè)參數(shù),即類(lèi)型為IQueryObject的對(duì)象,該對(duì)象中包含了分頁(yè)及排序的一些相關(guān)信息。IQueryObject的一個(gè)默認(rèn)實(shí)現(xiàn)的QueryObject,我們直接調(diào)用即可。下面是List方法中的代碼及注解:
     public void List()
        
    {
    QueryObject qo 
    = new QueryObject();//創(chuàng)建一個(gè)分頁(yè)查詢(xún)對(duì)象
    ToPo(qo);//把前臺(tái)傳來(lái)參數(shù),如分頁(yè)信息以對(duì)象中
    string categoryId = Request.Params["categoryId"];//得到前臺(tái)傳來(lái)的categoryId參數(shù)
    if (categoryId != null && !"".Equals(categoryId))
    {
      qo.addQuery(
    "obj.Category.id"long.Parse(categoryId), "=");//指定只查詢(xún)某一個(gè)分類(lèi)中的日志信息
    }

    IPageList pageList 
    = service.getTopicBy(qo);//調(diào)用業(yè)務(wù)邏輯層的getTopicBy方法來(lái)查詢(xún)?nèi)罩荆摲椒ǚ祷氐氖且粋€(gè)包含了數(shù)據(jù)分頁(yè)及內(nèi)容的IPageList對(duì)象。
    jsonResult = pageList;//把返回的結(jié)構(gòu)保存到j(luò)sonResult中,并作為JSON數(shù)據(jù)輸出。
        }

     
    整個(gè)方法的代碼如果把處理日志分類(lèi)的部分去掉的話(huà),就會(huì)顯得更加簡(jiǎn)潔了,Web層的東西嘛,就是要追求越簡(jiǎn)潔越好,最好什么都沒(méi)有才好維護(hù)。不需要專(zhuān)門(mén)處理JSON輸出,也不需要根據(jù)不同的數(shù)據(jù)庫(kù)寫(xiě)一句SQL語(yǔ)句,更不需要計(jì)算頁(yè)碼多少、處理排序字段等等,一切交給Vifir提供的類(lèi)庫(kù)來(lái)處理就OK了。
          
    List方法的代碼看完了,我們接下來(lái)看看Remove方法,該方法就是簡(jiǎn)單地根據(jù)前臺(tái)傳進(jìn)來(lái)的參數(shù)id,調(diào)用業(yè)務(wù)邏輯層的delTopic方法來(lái)刪除指定日志,代碼及注解如下:
     public void Remove()
        
    {
            
    long id = long.Parse(Request.Params["id"]);//獲得前臺(tái)傳來(lái)參數(shù)id并轉(zhuǎn)換成long
            service.delTopic(id);//調(diào)用業(yè)務(wù)層的delTopic方法刪除指定日志 
            extFormResult = true;//指定返回ExtJS表單能識(shí)別的數(shù)據(jù)
        }
     
    然后下面是SaveUpdate方法的源代碼,他們都是用來(lái)保存數(shù)據(jù),Save是用來(lái)保存新增加的日志,而Update用來(lái)保存修改的日志。跟前面的方法一樣,這些方法都是簡(jiǎn)單的調(diào)用業(yè)務(wù)邏輯層指定方法來(lái)實(shí)現(xiàn)日志的保存、修改等功能。下面我們來(lái)看看Save方法的源碼及注解:
    public void Save()
        
    {
           Topic obj 
    = new Topic();//新建一個(gè)Topic對(duì)象
           ToPo(obj);//把表單中傳的內(nèi)容保存到對(duì)象obj中,比如表單的title字段值或保存到obj的Title屬性中,content或Content字段值會(huì)保存到obj的Content屬性中,有多少保存多少。
           string CategoryId = Request.Params["CategoryId"];//得到日志分類(lèi)ID
           if (CategoryId != null && !"".Equals(CategoryId))
           
    {
             TopicCategory c 
    = this.categoryService.getTopicCategory(long.Parse(CategoryId));//調(diào)用業(yè)務(wù)邏輯方法得到指定分類(lèi)id對(duì)應(yīng)的TopicCategory對(duì)象
             obj.Category = c;//設(shè)置Topic對(duì)象的Category值,也就是設(shè)置日志分類(lèi)
           }

           
    if (!HasError())//如果沒(méi)有錯(cuò)誤
           service.addTopic(obj);//調(diào)用業(yè)務(wù)層的addTopic方法來(lái)實(shí)現(xiàn)添加日志
           extFormResult = true;//設(shè)置extFormResult的值為true,返回ExtJS表單Action能識(shí)別的JSON數(shù)據(jù)
    }

    如果你一直搞.Net,或者你不知道什么是IOC,那么你一定會(huì)疑惑,在上面的代碼中ITopicService只是一個(gè)接口,也就是service只是一個(gè)接口,而且我們?cè)诖a中沒(méi)給其設(shè)置過(guò)值,他的實(shí)現(xiàn)類(lèi)具體是什么等。那么請(qǐng)你打開(kāi)bin目錄中的Web.xml這個(gè)文件,這是一個(gè)Spring.NET的配置文件,在該配置文件中可以配置各個(gè)類(lèi)及業(yè)務(wù)組件之間的依賴(lài)關(guān)注,并給相關(guān)類(lèi)注入依賴(lài)的對(duì)象。比如配置Topic.aspx.cs類(lèi)的配置信息如下:
    <object type="manage/Topic.aspx">
        
    <property name="Service" ref="topicService" />
        
    <property name="CategoryService" ref="topicCategoryService" />
      
    </object>
     
     
    他使得在創(chuàng)建Topic.aspx對(duì)應(yīng)的類(lèi)實(shí)例時(shí),會(huì)自動(dòng)從容器找到名為topicService及topicCategoryService的組件,并注入到Service及CategoryService兩個(gè)屬性中。
     
    關(guān)于IOC及Spring.NET,請(qǐng)直接訪問(wèn)Spring.NET的官方網(wǎng)站www.springframework.net
     
    當(dāng)然,本示例還引入了一些前沿的后臺(tái)技術(shù),比如泛型DAO、ORM等。有興趣的朋友們可以通過(guò)vifir.com進(jìn)一步深入了解。
     

    posted on 2008-04-16 09:41 WilliamRaym 閱讀(1872) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2008年4月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(6)

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲AV无码久久久久网站蜜桃| 88av免费观看入口在线| 亚洲一级毛片免观看| 在线亚洲精品自拍| 在线观看免费成人| 最近2022中文字幕免费视频| 一区二区三区在线免费观看视频| 亚洲第一区二区快射影院| 亚洲国产日韩一区高清在线| 精品亚洲一区二区三区在线播放| 色吊丝最新永久免费观看网站| **一级毛片免费完整视| 91免费福利视频| 日韩成人毛片高清视频免费看| 亚洲精品蜜夜内射| 亚洲精品综合久久中文字幕| 亚洲精品~无码抽插| 亚洲人成无码网WWW| 国产成人综合久久精品免费| 欧美最猛性xxxxx免费| 成年黄网站色大免费全看| 一级毛片免费观看不卡视频| 中文字幕视频免费在线观看| 一级午夜a毛片免费视频| 美女免费视频一区二区| 亚洲国产精品无码久久98| 在线观看亚洲AV日韩A∨| 久久久久se色偷偷亚洲精品av| 亚洲视频一区网站| 久久精品国产亚洲AV大全| 亚洲精品高清久久| 亚洲欧洲日产国产综合网| 亚洲AV无码一区东京热| 亚洲AV天天做在线观看| 亚洲AV无码一区二区乱孑伦AS | 亚洲大成色www永久网站| 久久久久亚洲AV综合波多野结衣 | 亚洲国产精品久久久久秋霞小 | 国产精品免费福利久久| 国产羞羞的视频在线观看免费| a级毛片免费完整视频|