ASP.NET5MVC6項(xiàng)目怎么創(chuàng)建

這篇文章主要講解了“ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建”吧!

創(chuàng)新互聯(lián)建站不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對(duì)營(yíng)銷、技術(shù)、服務(wù)都有自己獨(dú)特見(jiàn)解,公司采取“創(chuàng)意+綜合+營(yíng)銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時(shí),也能得到同行業(yè)的專業(yè)認(rèn)可,能夠?yàn)樾袠I(yè)創(chuàng)新發(fā)展助力。未來(lái)將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級(jí),滿足企業(yè)一站式全網(wǎng)營(yíng)銷推廣需求,讓再小的品牌網(wǎng)站制作也能產(chǎn)生價(jià)值!

初識(shí)項(xiàng)目

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

ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建

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

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

ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建

ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建

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

兩個(gè)圖的差異非常大,我們來(lái)一一分析一下這些差異。

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

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

ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建

project.json

project.json是項(xiàng)目的核心配置文件,示例如下:

{ "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" ] } }

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

webroot

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

程序集管理

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

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

"frameworks": {

"dnx451": {

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

},

"dnxcore50": { }

}

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

腳本事件

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

"scripts": {

"postrestore": [ "npm install" ],  // 在更新所有的程序集之前執(zhí)行npm install事件

"prepare": [ "gulp copy" ]

// 在打開(kāi)解決方案之前,執(zhí)行g(shù)ulp任務(wù),調(diào)用bower的install方法。

}

具體的事件名稱如下:

ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建

package.json

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

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

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

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

bower.json

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

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

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

如果Bower包定義了main文件節(jié)點(diǎn),就將其復(fù)制到wwwroot/lib下。

如果Bower包定義了的main節(jié)點(diǎn)為空,則將整個(gè)包的目錄都復(fù)制到wwwroot/lib下。

如果定義了exportsOverride節(jié)點(diǎn),則只會(huì)把該節(jié)點(diǎn)指定的文件復(fù)制到wwwroot/lib下。

注意,exportsOverride節(jié)點(diǎn)中定義的key/value,其中key表示要文件復(fù)制目標(biāo)(即wwwroot/lib下)對(duì)應(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里的配置的包,不能自動(dòng)移除,需要從Bower里卸載該包,并將相關(guān)的文件從wwwroot/lib中移除。

gulpfile.js

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

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

ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建

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

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

此時(shí),刪除wwwroot/lib目錄下所有的文件,然后重新編譯BookStore項(xiàng)目,就會(huì)自動(dòng)在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) { //注冊(cè)clean任務(wù) rimraf(paths.lib, cb); // 遞歸刪除lib目錄下的所有文件 });

copy任務(wù)

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

gulp.task("copy", ["clean"], function () { // 注冊(cè)copy任務(wù) var bower = { // 目錄對(duì)應(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ù)制到目標(biāo)文件夾 } });

Grunt任務(wù)

VS2015中,雖然默認(rèn)支持的是Gulp構(gòu)建工具,但其實(shí)還支持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是一個(gè)基于grunt的bower管理插件,用于自動(dòng)執(zhí)行bower的install命令來(lái)安裝Bower包。

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

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

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

ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建

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

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

此時(shí),刪除wwwroot/lib目錄下所有的文件,然后重新編譯BookStore項(xiàng)目,就會(huì)自動(dòng)在wwwroot/lib目錄下生成所有需要的文件,即將Bower.json里定義的各種包按照配置需求復(fù)制到該目錄下。而Tasks中的任務(wù),則是從grunt.loadNpmTasks里加載的包里分析出來(lái)的任務(wù),如bower。

我們?cè)賮?lái)練習(xí)一個(gè)例子,假設(shè)我們編譯之前要對(duì)wwwroot/css/目錄下的site.css文件進(jìn)行壓縮(壓縮成site.min.css),我們則可以安裝如下方式進(jìn)行操作:

首先,在package.json里定義一個(gè)可以壓縮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同級(jí)節(jié)點(diǎn)下面,添加如下內(nèi)容:

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

***再注冊(cè)此插件,代碼如下:

grunt.loadNpmTasks('grunt-contrib-cssmin'); /*壓縮css*/  這樣,你就可以在Task Runner Explorer面板中看到cssmin任務(wù),然后運(yùn)行它了,當(dāng)然你也可以將該任務(wù)和default任務(wù)一起添加到編譯構(gòu)建之前進(jìn)行執(zhí)行。代碼如下:  /// <binding BeforeBuild='default, cssmin' />

另外,在給一些例子,一個(gè)是用于js壓縮,一個(gè)是用于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: { //開(kāi)發(fā)版(無(wú)壓縮) 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*/

建議:不要在多個(gè)時(shí)期都綁定同一種任務(wù)。

推薦:grunt還有一個(gè)插件用于監(jiān)控文件的修改,比如兼容css文件的修改,一旦修改了就調(diào)用css的壓縮命令,詳情請(qǐng)參考grunt-contrib-watch插件。

config.json

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

注意,該文件的信息默認(rèn)并沒(méi)有自動(dòng)加載,而是需要自己手工加載該配置信息,代碼如下:

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

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

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

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

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

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

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

Startup.cs

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

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

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

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

services.AddMvc();

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

services.AddEntityFramework()方法。

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

app.UseStaticFiles();

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

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

關(guān)于該文件中提到的依賴注入、以及Configure方法中的3個(gè)類型的參數(shù):IApplicationBuilder、IHostingEnvironment、ILoggerFactory。

感謝各位的閱讀,以上就是“ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)ASP.NET5 MVC6項(xiàng)目怎么創(chuàng)建這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:ASP.NET5MVC6項(xiàng)目怎么創(chuàng)建
分享路徑:http://muchs.cn/article12/ighcgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站設(shè)計(jì)公司建站公司、網(wǎng)站維護(hù)自適應(yīng)網(wǎng)站、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)