<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      解讀ASP.NET 5 & MVC6系列(2):初識項目

      2015-05-14 09:08  湯姆大叔  閱讀(37672)  評論(30)    收藏  舉報

      初識項目

      打開VS2015,創(chuàng)建Web項目,選擇ASP.NET Web Application,在彈出的窗口里選擇ASP.NET 5 Website模板創(chuàng)建項目,圖示如下:

      我們可以看到,此時Web Forms\MVC\Web API復(fù)選框都選擇不了,原有是因為在ASP.NET 5中做了大量更改,移除了Web Forms功能,將MVC、Web API、Web Pages這些功能合在了一起,所以自然就不需要這些復(fù)選框了。另外由于是CTP版,所以目前還沒有提供單元測試項目的創(chuàng)建。

      新創(chuàng)建的項目在VS的解決方案目錄結(jié)構(gòu)和實際文件夾的目錄結(jié)構(gòu)分別如下:

      注意:上圖是在VS 預(yù)覽版中的截圖,在新版的RC版本中,默認的客戶端構(gòu)建工具變成了gulp(即配置文件是gulpfile.js),而非原來的grunt了。

      兩個圖的差異非常大,我們來一一分析一下這些差異。

      項目結(jié)構(gòu)差異

      通過圖示,我們可以看到,在根目錄中,不僅項目文件從從csproj變成了xproj,還少了很多之前的文件(如web.config),但也多了很多不同的文件以及文件夾,我們先列出這些不同的文件盒文件夾,再來一一講解這些內(nèi)容。

      文件/文件夾 功能描述
      config.json 程序的配置文件,類似于web.config。
      project.json 該項目的主要配置,主要是負責程序集、項目部署等方面。部分功能類似于之前的package.config。
      package.json npm的配置文件,npm是基于Nodejs的包管理器。
      bower.json Bower管理器的配置文件,Bower是專門用于管理前端項目的包管理器。
      gulpfile.js 是gulp的配置文件,gulp是基于Nodejs的Javascript任務(wù)管理器,在ASP.NET5中主要是用于管理NPM和Bower中的內(nèi)容。
      Stratup.cs 程序啟動入口,類似于Global.asax。
      Project_Readme.html 項目說明文件,沒啥用。
      wwwroot 靜態(tài)資源文件(如css、圖片、js)的存放目錄。
      Dependencies Bower和NPM的依賴管理包。
      References 程序集引用,和以前的類似,但現(xiàn)在有了版本之分(如ASP.NET 5.0和ASP.NET Core 5.0)。

      project.json

      project.json是項目的核心配置文件,示例如下:

      {
          "webroot": "wwwroot",
          "version": "1.0.0-*",
          "dependencies": {
              "Microsoft.AspNet.Diagnostics": "1.0.0-beta4",
              "Microsoft.AspNet.Mvc": "6.0.0-beta4",
              "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta4",
              "Microsoft.AspNet.Server.IIS": "1.0.0-beta4",
              "Microsoft.AspNet.Server.WebListener": "1.0.0-beta4",
              "Microsoft.AspNet.StaticFiles": "1.0.0-beta4",
              "Microsoft.AspNet.Tooling.Razor": "1.0.0-beta4",
              "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta4",
              "Microsoft.Framework.CodeGenerators.Mvc": "1.0.0-beta4",
              "Microsoft.Framework.Logging": "1.0.0-beta4",
              "Microsoft.Framework.Logging.Console": "1.0.0-beta4",
              "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta4",
              "Microsoft.Framework.ConfigurationModel.UserSecrets": "1.0.0-beta4"
          },
          "commands": {
              "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000",
              "gen": "Microsoft.Framework.CodeGeneration"
          },
          "frameworks": {
              "dnx451": { },
              "dnxcore50": { }
          },
          "exclude": [
              "wwwroot",
              "node_modules",
              "bower_components"
          ],
          "publishExclude": [
              "node_modules",
              "bower_components",
              "**.xproj",
              "**.user",
              "**.vspscc"
          ],
          "scripts": {
              "postrestore": [ "npm install", "bower install" ],
              "prepare": [ "gulp copy" ]
          }
      }
      

      由于該文件的詳細參數(shù)非常多,具體詳細內(nèi)容請參考http://go.microsoft.com/fwlink/?LinkID=517074 ,在這里我們主要講解如下3個類型的內(nèi)容。

      webroot

      webroot是指定該web項目的靜態(tài)文件存放地址,目前是用于在發(fā)布的時候講該目錄中的內(nèi)部發(fā)布的正確的位置(詳細內(nèi)容可以在部署發(fā)布章節(jié)中找到)。注意BookStore解決方案中帶有地球圖標的wwwroot目錄是真實的文件夾路徑,我們可以對其進行修改,比如將其修改為wwwroot1,那么相應(yīng)的webroot的值也應(yīng)該修改為wwwroot1,因為gulpfile.js里代碼要通過project.webroot來使用該目錄,以便能夠?qū)ower管理的前端庫都復(fù)制到正確的目錄。

      程序集管理

      在解決方案的References節(jié)點點,我們看到有兩個分類,分別是:DNX 4.5.1和DNX Core 5.0,其中DNX Core 5.0就是我們所說的云優(yōu)化版(即可以在其它操作系統(tǒng)下部署的跨平臺版),而DNX 4.5.1則是和之前版本一樣的全功能版,這兩個版本的程序集是通過dependencies節(jié)點進行管理的。

      在一級dependencies節(jié)點,主要是定義該項目的通用程序集引用以及版本,而不同的版本的程序集則在framworks下的各版本下的dependencies節(jié)點進行維護,比如:

      "frameworks": {
          "dnx451": {
              "dependencies": {"log4net": "2.0.3"} /* 只在全功能版中引入log4net程序集*/
      
          },
          "dnxcore50": { }
      }
      

      上述兩種類型的程序集在維護的時候,都有智能提示(包括程序集名稱以及版本號),在當定義完自己要用的程序集并保持之后,系統(tǒng)會自動從Nuget上下載所需要的程序集,你也可以通過右鍵References選擇Restore Packages來更新所有的程序集引用。同時你依然可以通過右鍵References的形式通過Nuget來管理這些程序集。

      腳本事件

      新版的VS2015允許我們在build解決方案之前、之后、過程;下載程序集之前、之后;更新程序集之前、之后自定義一些基于Nodejs的自定義事件來執(zhí)行。該事件在project.json中的定義節(jié)點是scripts,示例如下:

      "scripts": {
          "postrestore": [ "npm install" ],  // 在更新所有的程序集之前執(zhí)行npm install事件
          "prepare": [ "gulp copy" ]
          // 在打開解決方案之前,執(zhí)行g(shù)ulp任務(wù),調(diào)用bower的install方法。
      }
      

      具體的事件名稱如下:

      時機 描述
      prebuild 構(gòu)建之前執(zhí)行
      postbuild 構(gòu)建之后執(zhí)行
      prepack packing之前執(zhí)行
      postpack packing之后執(zhí)行
      prerestore restoring packages之前執(zhí)行
      postrestore restoring packages之后執(zhí)行

      package.json

      package.jsonNPM管理器的配置文件,由于在VS2015默認就深度集成了Nodejs,而NPM又是Nodejs的默認包管理器,所以所有基于Nodejs的包都要在這里進行配置。該配置文件的默認配置如下:

      {
          "name": "ASP.NET",
          "version": "0.0.0",
          "devDependencies": {
              "gulp": "3.8.11",//gulp任務(wù)管理器
              "rimraf": "2.2.8" // 遞歸刪除文件的nodejs包
          }
      }
      

      上述代碼中的rimraf是一個遞歸刪除文件的nodejs包,我們也可以引用其他插件,像project.json文件中管理程序集一樣,在package.json文件中來管理前端程序的各種包,例如jquery,bootstrap等等,比如我們要安裝一個express包,只需要在json文件中添加一個express字符串鍵,并選擇器版本就可以了,系統(tǒng)會自動下載該NPM包并顯示在解決方案的Dependencies->NPM節(jié)點下。

      注意:已經(jīng)安裝的包不能自動移除(即不能通過在JSON中移除配置),需要右鍵執(zhí)行該包,并手工卸載。

      bower.json

      所有的前端包都配置子bower.json文件中,比如你需要的jquery、bootstrap、angular等等,其管理方式與project.json里的程序集和package.json里的npm包一樣,都是通過在dependencies節(jié)點下聲明包的名稱和版本來實現(xiàn)的。

      我們可以在此聲明一個angular包,保存以后就可以看到在解決方案Dependencie->Bower節(jié)點下該angular已經(jīng)自動下載好了,編譯項目,就可以看到在wwroot/lib也可以看到angular文件夾以及相應(yīng)的文件了。

      在bower.json還有一個exportsOverride節(jié)點非常重要,他擴展了原來bower的前端文件copy機制,默認情況下bower只會復(fù)制main節(jié)點定義的文件。但有時候我們要復(fù)制的文件可能不止這些,所以grunt-bower-task插件就擴展了該功能,定義了這個exportsOverride節(jié)點,其使用規(guī)則如下:

      1. 如果Bower包定義了main文件節(jié)點,就將其復(fù)制到wwwroot/lib下。
      2. 如果Bower包定義了的main節(jié)點為空,則將整個包的目錄都復(fù)制到wwwroot/lib下。
      3. 如果定義了exportsOverride節(jié)點,則只會把該節(jié)點指定的文件復(fù)制到wwwroot/lib下。

      注意,exportsOverride節(jié)點中定義的key/value,其中key表示要文件復(fù)制目標(即wwwroot/lib下)對應(yīng)包名下的子目錄,value表示源文件目錄或文件。例如:

      "bootstrap": {
          "js": "dist/js/*.*", //將dist/js/下的所有文件,復(fù)制到wwwroot/lib/bootstrap/js目錄下
          "css": "dist/css/*.*",
          "fonts": "dist/fonts/*.*"
      },
      "jquery": {
          "": "jquery.{js,min.js,min.map}" // 將jquery.js,jquery.min.js,jquery.min.map文件復(fù)制到wwwroot/lib/jquery目錄下
      },
      

      注意:和NPM類似,bower.json里的配置的包,不能自動移除,需要從Bower里卸載該包,并將相關(guān)的文件從wwwroot/lib中移除。

      gulpfile.js

      gulpfile.js是gulp任務(wù)管理器的配置文件,默認情況下,該配置文件會把wwwroot/lib目錄下的所有文件清除(clean任務(wù)),然后重新從bower_components目錄中復(fù)制一份(copy任務(wù))。

      該文件配置的修改會影響到VS里的Task Runner Explorer的顯示,如下圖所示:

      以默認配置為例,該配置文件在Task目錄下注冊了兩個任務(wù),分別是clean和copy,并默認在VS解決方案清除編譯以后重新執(zhí)行clean任務(wù),但我們也可以給該任務(wù)綁定任何一個執(zhí)行時間點,我們可以右鍵該任務(wù)->綁定->在構(gòu)建之前,然后在點擊面板左邊的刷新按鈕,這時候該綁定內(nèi)容就會同步保存在gulpfile.js的第一行,代碼如下:

      /// <binding BeforeBuild='copy' Clean='clean' />
      

      此時,刪除wwwroot/lib目錄下所有的文件,然后重新編譯BookStore項目,就會自動在wwwroot/lib目錄下生成所有需要的文件,即將Bower.json里定義的各種包按照配置需求復(fù)制到該目錄下。

      clean任務(wù)

      clean任務(wù)的主要作用,是在編譯之前或清理解決方案是,將lib目錄下的前端文件全部刪除,以便重新copy新的文件。具體分析如下:

      var gulp = require("gulp"), // 引用gulp
        rimraf = require("rimraf"),// 引用rimraf
        fs = require("fs");  //引用文件系統(tǒng)
      
      eval("var project = " + fs.readFileSync("./project.json"));  //讀取project.json配置文件
      
      var paths = {
        bower: "./bower_components/",
        lib: "./" + project.webroot + "/lib/"
      };
      
      gulp.task("clean", function (cb) {  //注冊clean任務(wù)
        rimraf(paths.lib, cb);  // 遞歸刪除lib目錄下的所有文件
      });
      

      copy任務(wù)

      copy任務(wù)則很簡單,將bower_components目錄下符合條件的文件復(fù)制lib目錄下,分析如下:

      gulp.task("copy", ["clean"], function () {  // 注冊copy任務(wù)
        var bower = { // 目錄對應(yīng)關(guān)系
          "bootstrap": "bootstrap/dist/**/*.{js,map,css,ttf,svg,woff,eot}",
          "bootstrap-touch-carousel": "bootstrap-touch-carousel/dist/**/*.{js,css}",
          "hammer.js": "hammer.js/hammer*.{js,map}",
          "jquery": "jquery/jquery*.{js,map}",
          "jquery-validation": "jquery-validation/jquery.validate.js",
          "jquery-validation-unobtrusive": "jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"
        }
      
        for (var destinationDir in bower) {
          gulp.src(paths.bower + bower[destinationDir])  // 讀取源目錄
            .pipe(gulp.dest(paths.lib + destinationDir));  //復(fù)制到目標文件夾
        }
      });
      

      Grunt任務(wù)

      VS2015中,雖然默認支持的是Gulp構(gòu)建工具,但其實還支持Grunt構(gòu)建工具,使用方式和Gulp類似,要使用Grunt,也需要引用類似的依賴包,示例如下:

      {
          "version": "0.0.0",
          "name": "",
          "devDependencies": {
              "grunt": "0.4.5", //grunt任務(wù)管理器
              "grunt-bower-task": "0.4.0" // 基于grunt的bower管理插件
          }
      }
      

      上述代碼中的grunt-bower-task是一個基于gruntbower管理插件,用于自動執(zhí)行bowerinstall命令來安裝Bower包。

      注意:已經(jīng)安裝的包不能自動移除(即不能通過在JSON中移除配置),需要右鍵執(zhí)行該包,并手工卸載。

      gruntfile.js是grunt任務(wù)管理器的配置文件,要使用grunt,就需要創(chuàng)建gruntfile.js文件,默認情況下,該配置文件只配置了grunt-bower-task插件的任務(wù)執(zhí)行,該插件會讀取bower.json配置信息,將相關(guān)的包通過bower:install命令都安裝到指定的目錄下(默認是通過targetDir設(shè)置的wwwroot/lib目錄。

      該文件配置的修改會影響到VS里的Task Runner Explorer的顯示,如下圖所示:

      以默認配置為例,該配置文件注冊了一個名為default的任務(wù)在該面板里(Alias Tasks列表中)顯示,該任務(wù)也是Grunt的默認任務(wù)名稱,但并沒有定義該任務(wù)在什么時候執(zhí)行,所以這時候我們可以給該任務(wù)綁定一個執(zhí)行時間點,我們可以右鍵該任務(wù)->綁定->在構(gòu)建之前,然后在點擊面板左邊的刷新按鈕,這時候該綁定內(nèi)容就會同步保存在gruntfile.js的第一行,代碼如下:

      /// <binding BeforeBuild='default' />
      

      此時,刪除wwwroot/lib目錄下所有的文件,然后重新編譯BookStore項目,就會自動在wwwroot/lib目錄下生成所有需要的文件,即將Bower.json里定義的各種包按照配置需求復(fù)制到該目錄下。而Tasks中的任務(wù),則是從grunt.loadNpmTasks里加載的包里分析出來的任務(wù),如bower。
      我們再來練習一個例子,假設(shè)我們編譯之前要對wwwroot/css/目錄下的site.css文件進行壓縮(壓縮成site.min.css),我們則可以安裝如下方式進行操作:

      首先,在package.json里定義一個可以壓縮CSS代碼的grunt插件:

      {
        "version": "0.0.0",
        "name": "",
        "devDependencies": {
          "grunt": "0.4.5",
          "grunt-bower-task": "0.4.0",
          "grunt-contrib-cssmin": "0.12.2"  /*新的插件*/
        }
      }
      

      然后在grunt.initConfig下的bower同級節(jié)點下面,添加如下內(nèi)容:

      /*壓縮css*/
      cssmin: {
          target: {
              options: {
                  sourceMap: true,
              },
              files: {
                  /*輸出文件路徑:原始文件路徑*/
                  'wwwroot/css/site.min.css': 'wwwroot/css/site.css'
              }
          }
      }
      

      最后再注冊此插件,代碼如下:

      grunt.loadNpmTasks('grunt-contrib-cssmin'); /*壓縮css*/
      

      這樣,你就可以在Task Runner Explorer面板中看到cssmin任務(wù),然后運行它了,當然你也可以將該任務(wù)和default任務(wù)一起添加到編譯構(gòu)建之前進行執(zhí)行。代碼如下:

      /// <binding BeforeBuild='default, cssmin' />
      

      另外,在給一些例子,一個是用于js壓縮,一個是用于less編譯,代碼如下:

      /*package.json*/
      "grunt-contrib-uglify": "0.9.1",
      "grunt-contrib-less": "1.0.1"
      
      /*gruntfile.js*/
      /*壓縮js*/
      uglify: {
          target: {
              options: {
                  sourceMap: true,
              },
              files: {
                  'wwwroot/Scripts/site.min.js': 'wwwroot/Scripts/site.js'
              }
          }
      },
      /*編譯less*/
      less: {
          //開發(fā)版(無壓縮)
          development: {
              options: {
                  sourceMap: true
              },
              files: {
                  'wwwroot/Styles/site.css': 'wwwroot/Lesses/site.less'
              }
          },
          //生產(chǎn)版(壓縮)
          production: {
              options: {
                  compress: true
              },
              files: {
                  'wwwroot/Styles/site.min.css': 'wwwroot/Lesses/site.less'
              }
          }
      }
      /*...*/
      grunt.loadNpmTasks('grunt-contrib-uglify');  /*壓縮js*/
      grunt.loadNpmTasks('grunt-contrib-less');   /*編譯less*/
      

      建議:不要在多個時期都綁定同一種任務(wù)。
      推薦:grunt還有一個插件用于監(jiān)控文件的修改,比如兼容css文件的修改,一旦修改了就調(diào)用css的壓縮命令,詳情請參考grunt-contrib-watch插件。

      config.json

      config.json就是以前的web.config,但是沒有web.config擁有各種類型的配置那么強大,其中各種功能的配置都以代碼的形式轉(zhuǎn)移到Startup.cs文件中了;另外一部分信息配置內(nèi)容,則放在config.json文件中以json的格式進行保存。

      注意,該文件的信息默認并沒有自動加載,而是需要自己手工加載該配置信息,代碼如下:

      //Startup.cs類的構(gòu)造函數(shù)中
      Configuration = new Configuration()
                      .AddJsonFile("config.json")
                      .AddEnvironmentVariables();
      

      通過Configuration實例加載該配置文件,保存在Configuration屬性中,以便可以在其它地方進行使用,而使用時候的key值,則是按照層級來定義的,以如下默認內(nèi)容來說:

      {
          "AppSettings": {
              "SiteTitle": "WebDemo01"
          }
      }
      

      要獲取鏈接字符串,則需要使用如下key值:

      var connString = Configuration.Get("AppSettings:SiteTitle");
      

      使用起來,沒有web.config方便了,但是為了兼容其它操作系統(tǒng),只能這樣了。

      注意:在ASP.NET5中,配置信息不僅支持json格式,還支持ini、xml等格式,具體詳細請參考后續(xù)的配置信息管理章節(jié)。

      Startup.cs

      Startup.cs是整個程序的啟動入口,類似于Global.asax,和Global.asax文件一樣,起到全局配置信息的作用。我們來分析一下該文件的幾個重要作用。

      首先在構(gòu)造函數(shù)中初始化基礎(chǔ)配置信息(關(guān)于詳細的配置信息內(nèi)容請參考配置信息管理章節(jié)),注意這里的初始化后的配置信息綁定到一個Configuration屬性上了,以便另外兩個方法在后期進行使用,如果你要在其它類中進行使用,則需要將該實例保存到其它地方(如靜態(tài)變量)。

      ConfigureServices方法是依賴注入的核心,在方法的傳入?yún)?shù)services中,首先保存了默認依賴注入里定義的類型定義,然后我們在這個方法里,可以繼續(xù)注冊依賴注入的類型定義,關(guān)于依賴注入的詳細內(nèi)容,可以閱讀依賴注入章節(jié)。

      同時一些重要的功能需要開啟的話,也需要在這里開啟,比如添加Mvc模塊,就需要使用如下調(diào)用語句:

      services.AddMvc();
      

      原因是因為,在新版的ASP.NET 5中,除了最基礎(chǔ)的模塊以外,絕大部分模塊都是純組件化的,這里稱為Middleware,而組件在使用的時候首先需要先添加該模塊才能使用。再比如,添加EF模塊的話,需要調(diào)用

      services.AddEntityFramework()方法。
      

      而另外一個Configure方法,顧名思義是對各種Middleware組件進行配置的地方,一般來說,配置模塊的方法都是調(diào)用類似app.UseXXX()這樣的方法,如使用靜態(tài)文件處理流程,則調(diào)用如下語句即可:

      app.UseStaticFiles();
      

      如果要使用Mvc的功能,則需要使用app.UseMvc方法,在調(diào)用這些方法時,可以配置并傳入響應(yīng)的參數(shù)。

      注意,ConfigureServices里用到的services.AddXXX()類型的方法和Configure方法里用到的app.UseXXX()類型的方法都是擴展方法,AddXXX()方法是在IServiceCollection接口上進行擴展的,而UseXXX()方法則是在IApplicationBuilder接口上擴展的。

      關(guān)于該文件中提到的依賴注入、以及Configure方法中的3個類型的參數(shù):IApplicationBuilder、IHostingEnvironment、ILoggerFactory;我們會在后續(xù)的章節(jié)中進行詳細講解。

      其它

      通過查看,可以發(fā)現(xiàn),Views目錄下的web.config也被移除了,在RC版中,要統(tǒng)一引用命名空間,需要在 _ViewStart.cshtml 或者 _GlobalImport.cshtml 文件中,后續(xù)章節(jié)我們會講到。

      我們不用做任何修改,F(xiàn)5運行項目即可運行,由于默認使用的是IIS Express,所以會自動打開新網(wǎng)站首頁。如果不是IIS Express,請閱讀后續(xù)的編譯與部署章節(jié)。

      關(guān)于上述json配置文件的scheme介紹

      關(guān)于上述配置文件(含global.json、project.json、config.json、package.json、bower.json)的scheme定義,以及js參數(shù)配置的定義,請訪問http://schemastore.org/json/進行查看。

      推薦資料:

      1. beiyuu.com/grunt-in-action/
      2. http://www.it165.net/pro/html/201503/35652.html

      同步與推薦

      本文已同步至目錄索引:解讀ASP.NET 5 & MVC6系列

      主站蜘蛛池模板: 亚洲一区二区av高清| 中文字幕成熟丰满人妻| 国产精品无码专区| 看全色黄大黄大色免费久久| 天天干天天日| 成人午夜大片免费看爽爽爽| 国产午夜精品一区二区三| 又爽又黄又无遮掩的免费视频| 报价| av亚洲在线一区二区| 久久毛片少妇高潮| 久久午夜无码鲁丝片午夜精品| 国产成人精品永久免费视频| 亚洲爽爆av一区二区| 免青青草免费观看视频在线| 日韩精品区一区二区三vr| 亚洲第一福利网站在线观看| 韩国无码AV片午夜福利| 国产伦精品一区二区三区| 东京热一区二区三区在线| 美日韩精品一区二区三区| 国产99视频精品免费视频6| 九九在线精品国产| 大屁股国产白浆一二区| 污污网站18禁在线永久免费观看| 亚洲av日韩在线资源| 蜜桃成人无码区免费视频网站| 亚洲一区二区三区啪啪| 国产午夜福利精品视频| 人成午夜免费视频无码| 九九热在线精品视频免费| 亚洲第一无码AV无码专区| 亚洲AV无码秘?蜜桃蘑菇| 亚洲无人区一区二区三区| 狠狠色狠狠色综合日日不卡| 真实单亲乱l仑对白视频| 好吊视频一区二区三区在线| 国产日韩精品视频无码| 亚洲国产精品综合久久网络| 国模在线视频一区二区三区| 野花香视频在线观看免费高清版 |