Ionic2入門(mén)教程 實(shí)現(xiàn)TodoList App-1 初識(shí)Ionic2

Ionic是一個(gè)基于Angular2的開(kāi)發(fā)手機(jī)web app的框架唆铐,它包含了一整套手機(jī)端的樣式組件哲戚,和一系列的功能服務(wù)組件。樣式包括像按鈕或链、表單惫恼、列表、header等都有提供澳盐。服務(wù)組件的話祈纯,包括tab、slider叼耙、側(cè)邊欄腕窥、模態(tài)窗口等也有很多,基本上能滿足大部分手機(jī)web應(yīng)用的開(kāi)發(fā)需求筛婉。
需要說(shuō)明的是簇爆,Ionic的版本也跟隨Angular的版本,Ionic1是基于Angular1的爽撒,Ionic2是基于Angular2的入蛆。而Ionic提供了一個(gè)命令行的工具ionic-cli,他同時(shí)支持Ionic1和2的版本硕勿,只是通過(guò)選項(xiàng)來(lái)幫助創(chuàng)建不同版本項(xiàng)目腳手架哨毁。
同時(shí),我們開(kāi)發(fā)手機(jī)web應(yīng)用的時(shí)候源武,經(jīng)常會(huì)結(jié)合Cordova來(lái)將它打包成手機(jī)應(yīng)用扼褪。對(duì)于這一點(diǎn),ionic也提供了ionic-native來(lái)更方便的使用ng-cordova的插件粱栖。
總之话浇,ionic提供了一整套完整的手機(jī)app開(kāi)發(fā)的解決方案,從創(chuàng)建項(xiàng)目闹究、開(kāi)發(fā)幔崖、測(cè)試、打包、生成app甚至簽名和提交app store都提供了完整的工具岖瑰。(要使用它的云編譯功能叛买,需要上傳開(kāi)發(fā)者賬號(hào)的證書(shū),國(guó)內(nèi)用戶一般為了安全都不會(huì)這么用蹋订。)在這個(gè)教程里面率挣,我們就來(lái)看看用如何用ionic來(lái)創(chuàng)建一個(gè)最簡(jiǎn)單的手機(jī)web應(yīng)用,我們還是實(shí)現(xiàn)一個(gè)Todolist的例子露戒,大家也可以結(jié)合著之前的教程Angular2入門(mén)教程-2 實(shí)現(xiàn)TodoList App 椒功,來(lái)看看ionic2和Angular2在使用上的區(qū)別。
在教程的第一部分智什,我們先介紹Ionic2动漾,包括安裝、創(chuàng)建項(xiàng)目荠锭,以及了解一下用Ionic2命令行工具創(chuàng)建的項(xiàng)目結(jié)構(gòu)和各個(gè)部分的代碼旱眯。
Ionic在github上的地址是 https://github.com/driftyco/ionic,網(wǎng)站http://ionicframework.com证九。官方網(wǎng)站上的文檔也比較全删豺,大部分組件都有示例代碼和效果展示。組件文檔可以查看:http://ionicframework.com/docs/components/#overview 愧怜,各個(gè)組件的api文檔可以查看:http://ionicframework.com/docs/api/呀页。

安裝Ionic命令行工具
首先我們需要安裝Ionic命令行工具,使用npm安裝:
npm install -g ionic

因?yàn)槲覀冞@個(gè)實(shí)例是只創(chuàng)建web應(yīng)用拥坛,不打包成手機(jī)app蓬蝶,如果你需要打包,或使用cordova插件猜惋,還需要安裝cordova
丸氛。安裝完成后,可以通過(guò)ionic help
來(lái)查看各個(gè)提供的功能著摔。ionic命令行工具除了提供創(chuàng)建項(xiàng)目雪位、打包web應(yīng)用(底層使用的是webpack來(lái)編譯、minify和打包代碼)等功能以外梨撞,它還封裝了cordova
的功能,所以它也可以用來(lái)添加cordova
的插件香罐、平臺(tái)卧波、打包手機(jī)app等。
我當(dāng)前的版本是2.2.1庇茫。如果你之前安裝過(guò)之前的版本港粱,請(qǐng)先更新。雖然2.x版本開(kāi)始就支持Angular2,但是查坪,新版本總是會(huì)修復(fù)一些bug寸宏,或者完善編譯、打包的一些功能和選項(xiàng)偿曙。

創(chuàng)建項(xiàng)目和運(yùn)行
接下來(lái)使用下面的命令創(chuàng)建一個(gè)應(yīng)用:
ionic start ionic2-todolist blank --v2 --no-cordova

其中ionic start
就是根據(jù)項(xiàng)目腳手架創(chuàng)建一個(gè)項(xiàng)目, ionic2-todolist
是我們的app的名字氮凝,blank
的腳手架的模板,我們使用blank來(lái)從頭創(chuàng)建一個(gè)應(yīng)用望忆。ionic2提供了幾個(gè)模板罩阵,有sidemenu
, tabs
, blank
, complex-list
等启摄,可以通過(guò)ionic start -l
查看可用的模板稿壁。當(dāng)然你也可以在github上找其他開(kāi)發(fā)者提供的模板或腳手架,可以直接下載下來(lái)來(lái)使用歉备。--v2
指的是我們要?jiǎng)?chuàng)建ionic2的版本傅是。--no-cordova
是說(shuō)不使用cordova,因?yàn)檫@個(gè)例子里我們不打包手機(jī)app蕾羊。創(chuàng)建創(chuàng)建完以后喧笔,它會(huì)自動(dòng)調(diào)用npm install
安裝依賴包,根據(jù)你的網(wǎng)絡(luò)情況肚豺,可能很慢甚至有些無(wú)法下載溃斋,請(qǐng)自行想辦法解決。
然后吸申,進(jìn)入新建的目錄梗劫,運(yùn)行:
ionic serve

它會(huì)編譯ts文件,打包截碴、使用監(jiān)聽(tīng)方式啟動(dòng)測(cè)試服務(wù)器運(yùn)行梳侨,如果修改了文件,會(huì)自動(dòng)編譯然后刷新頁(yè)面日丹。
項(xiàng)目結(jié)構(gòu)
ionic是基于Angular2的走哺,所以它的項(xiàng)目結(jié)構(gòu)跟Angular2類似,目錄結(jié)構(gòu)如下:
├── ionic.config.json #ionic的配置文件├── package.json├── resources # 打包app使用的icon圖標(biāo)和加載頁(yè)圖片│ ├── android # 生成的android平臺(tái)的各個(gè)尺寸的圖標(biāo)和加載頁(yè)圖片│ ├── icon.png # 應(yīng)用圖標(biāo)│ ├── ios # 生成的ios平臺(tái)的各個(gè)尺寸的圖標(biāo)和加載頁(yè)圖片│ └── splash.png # 加載頁(yè)圖片├── src # 頁(yè)面源文件│ ├── app│ ├── assets│ ├── declarations.d.ts│ ├── index.html│ ├── manifest.json│ ├── pages│ ├── service-worker.js│ └── theme├── tsconfig.json├── tslint.json└── www # 編譯后的文件夾, Cordova默認(rèn)用www路徑并打開(kāi)里面的index.html ├── manifest.json └── service-worker.js

在上面的目錄結(jié)構(gòu)中哲虾,對(duì)于部分ionic用到的文件丙躏,在它的文件后面作了簡(jiǎn)要的說(shuō)明,下一節(jié)再詳細(xì)說(shuō)明每個(gè)部分的用途的配置方式束凑。
項(xiàng)目環(huán)境相關(guān)文件說(shuō)明
首先晒旅,package.json
就不用說(shuō)了,每個(gè)基于node平臺(tái)的項(xiàng)目都有一個(gè)這樣的文件汪诉,里面定義了項(xiàng)目的基本信息废恋,還有開(kāi)發(fā)和運(yùn)行需要用到的庫(kù)谈秫。
ionic.config.json
這個(gè)ionic項(xiàng)目的基本配置文件,不管你是創(chuàng)建一個(gè)單純的web應(yīng)用鱼鼓,還是想要封裝成cordova的混合app拟烫,都會(huì)有一個(gè)這樣的文件。里面的內(nèi)容也很簡(jiǎn)單迄本,我們最常用到的可能就是代理設(shè)置:
{ "name": "TodoList系統(tǒng)", "app_id": "", "v2": true, "typescript": true, "proxies": [ { "path": "/api", "proxyUrl": "http://service.mydomain.com/api" } ]}

設(shè)置了proxies
以后硕淑,我們的服務(wù)端就不需要考慮跨域訪問(wèn)的問(wèn)題。當(dāng)然岸梨,如果你的服務(wù)器端不允許跨域訪問(wèn)喜颁,在你部署你的應(yīng)用的時(shí)候,也需要相應(yīng)的配置曹阔,例如在nginx中設(shè)置反向代理半开。
config.xml
如果你在創(chuàng)建項(xiàng)目的時(shí)候,沒(méi)有使用--no-cordova
赃份,也就是說(shuō)寂拆,你的項(xiàng)目啟用了cordova,并且打算封裝成混合手機(jī)app抓韩,那就會(huì)有這個(gè)文件纠永。這個(gè)文件的內(nèi)容大致如下:
... <name>TodoList系統(tǒng)</name> <description>hunt tickets on-site management system.</description> <author email="mavlarn@test.com" >mavlarn@獵票</author> <content src="index.html"/> <access origin=""/> <allow-navigation href="http://ionic.local/"/> <allow-intent href="http:///"/> <platform name="ios"> <allow-intent href="itms:"/> <allow-intent href="itms-apps:"/> </platform> <preference name="webviewbounce" value="false"/> ...... <preference name="SplashShowOnlyFirstTime" value="false"/> <plugin name="ionic-plugin-keyboard" spec="~2.2.1"/> <plugin name="cordova-plugin-splashscreen" spec="~4.0.1"/></widget>

其中,name
就是你的app將來(lái)打包成app的時(shí)候的應(yīng)用的顯示名谒拴。plugin是使用的cordovas插件尝江。里面還有一些其他配置,請(qǐng)參考cordova的文檔英上。
tslint.json炭序、tsconfig.json
這是用tslint做代碼檢查的配置。
resources
里面有2個(gè)文件苍日,icon.png和splash.png惭聂,分別的打包的應(yīng)用的顯示名稱和加載頁(yè)的圖片。你只要加了這兩個(gè)文件相恃,運(yùn)行ionic resources
就可以生成各個(gè)尺寸的圖標(biāo)文件和圖片辜纲。它會(huì)根據(jù)你設(shè)置的平臺(tái),生成各個(gè)平臺(tái)的圖標(biāo)和文件的各個(gè)尺寸的文件拦耐。
plugins
這里面存在的你添加的cordova插件耕腾。
platforms
里面存放平臺(tái)相關(guān)的文件,每次編譯app的時(shí)候杀糯,就會(huì)根據(jù)添加的平臺(tái)幽邓,在這里面生成編譯文件和打包的文件。
hooks
這里面存放的是hook文件火脉,也就是鉤子。我們可以編寫(xiě)腳本,來(lái)定義在每次執(zhí)行某些任務(wù)的時(shí)候被調(diào)用的任務(wù)倦挂。也可以定義某個(gè)插件相關(guān)的腳本畸颅。例如,如果你加了某一個(gè)微信的插件方援,這個(gè)插件可能有一個(gè)鉤子没炒,幫助你在每次添加完這個(gè)插件的時(shí)候,運(yùn)行一些任務(wù)犯戏,來(lái)進(jìn)行一些項(xiàng)目的配置送火,例如微信的appId等。
如果你只是想開(kāi)發(fā)一個(gè)web應(yīng)用先匪,上面這些基本都不會(huì)管种吸,有些文件甚至都不會(huì)生成。而我們開(kāi)發(fā)具體的業(yè)務(wù)需要的呀非,就是src下面的文件坚俗。
業(yè)務(wù)相關(guān)文件說(shuō)明
index.html
src下面有幾個(gè)文件,index.html當(dāng)然就是打開(kāi)的首頁(yè)了岸裙。這個(gè)首頁(yè)里面的內(nèi)容(main.js, polyfills.js等)會(huì)在編譯后生成猖败。
menifest.json
這個(gè)文件是在index.html使用,用來(lái)設(shè)置網(wǎng)頁(yè)的很多屬性降允,包括網(wǎng)站的圖標(biāo)(favicon.ico)恩闻,搜索引擎的參數(shù),應(yīng)用名等剧董〈鄙校可以參考:https://developer.mozilla.org/en-US/Add-ons/WebExtensions/manifest.json。
theme/variables.scss
ionic有設(shè)計(jì)良好的手機(jī)端的組件送滞,也提供了幾個(gè)默認(rèn)顏色侠草,我們可以通過(guò)修改這個(gè)文件,修改幾個(gè)默認(rèn)顏色犁嗅,也可以設(shè)置很多組件的顏色等屬性边涕。
assets
這里面就是存放應(yīng)用中用到的各種圖片等資源文件。
app
這里面有幾個(gè)文件:
main.tsapp.module.tsapp.component.tsapp.htmlapp.scss

這幾個(gè)文件褂微,從名字就能看出來(lái)功蜓,跟Angular2項(xiàng)目中的幾個(gè)入口文件類似。其中main.ts就是入口文件宠蚂,它用下面的方式初始化我們的app模塊:
platformBrowserDynamic().bootstrapModule(AppModule);

app.module.ts里面就是定義的app模塊式撼,app.component.ts定義的就是應(yīng)用的根組件,這里跟Angular2不一樣的地方是求厕,需要用ionic的方式來(lái)加載根組件:
declarations: [ MyApp, HomePage ], imports: [ IonicModule.forRoot(MyApp) ], bootstrap: [IonicApp], entryComponents: [ MyApp, HomePage ],

在引入根組件的時(shí)候著隆,需要用IonicModule.forRoot(MyApp)
來(lái)引入扰楼,在bootstrap
里面就不是直接初始化MyApp
,而是IonicApp
美浦。同時(shí)弦赖,對(duì)于Ionic2里面的所有的組件(簡(jiǎn)單來(lái)說(shuō)就是需要顯示在頁(yè)面上的組件),需要加入到entryComponents
的列表里浦辨。
除了上面說(shuō)的以為蹬竖,其他的配置,像declarations
流酬,providers
币厕,配置方式跟運(yùn)行機(jī)制跟Angular2是一樣的蔬咬。
ionicons
Ionic還提供了一套設(shè)計(jì)非常好的圖標(biāo)庫(kù)端礼,ionicons帽撑。地址是 http://ionicframework.com/docs/ionicons/ 兄春。Ionic的很多組件也都用到了一些圖標(biāo)爹凹,例如后退佩伤、關(guān)閉等圖標(biāo)弯屈。這些圖標(biāo)是在ionic的css里面以字體的方式加載的匀们,所以惭载,你應(yīng)該在項(xiàng)目中盡量使用這些圖標(biāo)旱函。
@ionic/app-scripts
最后需要說(shuō)明的就是ionic-app-scripts,它在package.json文件中作為devDependencies加入描滔,里面有很多幫助我們編譯棒妨、運(yùn)行項(xiàng)目的腳本。除了創(chuàng)建是項(xiàng)目里面自帶的build, clean含长,還有很多其他的腳本可以允許券腔。例如下面的內(nèi)容:
"scripts": { "clean": "ionic-app-scripts clean", "build": "ionic-app-scripts build", "min": "ionic-app-scripts minify", "ionic:build": "ionic-app-scripts build", "ionic:serve": "ionic-app-scripts serve" },

當(dāng)我們運(yùn)行ionic serve
時(shí),實(shí)際上就是運(yùn)行的是npm run ionic:serve
拘泞,也就是對(duì)應(yīng)的ionic-app-scripts serve
這個(gè)命令纷纫。當(dāng)我運(yùn)行npm run min
時(shí),運(yùn)行的是ionic-app-scripts minify
陪腌。一般情況下辱魁,你運(yùn)行build
就會(huì)執(zhí)行項(xiàng)目的編譯(將TypeScript文件編譯成js),然后把所有的js文件打包成main.js
诗鸭,以及把所有的css合并成一個(gè)main.css
染簇。但是,這樣生成的文件比較大强岸,也沒(méi)有做代碼混淆锻弓,你可以在運(yùn)行build
以后,再運(yùn)行min
,來(lái)進(jìn)行代碼的壓縮蝌箍、混淆等青灼。運(yùn)行完minify以后暴心,main.js文件可以從原先的6.5M左右,減少到不到1.6M杂拨。在進(jìn)行g(shù)zip壓縮的話酷勺,基本上下載所有的文件是550K左右。已經(jīng)基本可以滿足手機(jī)端下載文件大小的需要扳躬。
完整的文檔可以查看GitHub的地址
熟悉Angular2的架構(gòu)的可能知道Angular2的編譯可以使用Tree Shaking技術(shù)進(jìn)一步減少文件的大小,ionic-app-scripts也提供了rollup
的參數(shù)來(lái)實(shí)現(xiàn)Tree Shaking甚亭,具體方法請(qǐng)參考官方文檔贷币。

有關(guān)項(xiàng)目的結(jié)構(gòu)和配置,差不多就是這些亏狰,雖然說(shuō)役纹,即使你不知道這些是干嘛的,也能直接開(kāi)始著手開(kāi)發(fā)應(yīng)用暇唾。但是促脉,那就像閉著眼睛跑步,隨便一個(gè)小坑就能讓你跌倒策州。何況瘸味,很多人所謂的坑,實(shí)際上也只是他自己不會(huì)用或者用得不對(duì)够挂。所以旁仿,開(kāi)始Angular和Ionic的應(yīng)用,還是需要對(duì)node, npm, webpack等有一定的了解孽糖,然后對(duì)項(xiàng)目中的各種配置有一些了解枯冈,才能在之后的開(kāi)發(fā)中比較順利的進(jìn)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末办悟,一起剝皮案震驚了整個(gè)濱河市尘奏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌病蛉,老刑警劉巖炫加,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铡恕,居然都是意外死亡琢感,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)探熔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驹针,“玉大人,你說(shuō)我怎么就攤上這事诀艰〖砩” “怎么了饮六?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)苛蒲。 經(jīng)常有香客問(wèn)我卤橄,道長(zhǎng),這世上最難降的妖魔是什么臂外? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任窟扑,我火速辦了婚禮,結(jié)果婚禮上漏健,老公的妹妹穿的比我還像新娘嚎货。我一直安慰自己,他們只是感情好蔫浆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布殖属。 她就那樣靜靜地躺著,像睡著了一般瓦盛。 火紅的嫁衣襯著肌膚如雪洗显。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天原环,我揣著相機(jī)與錄音挠唆,去河邊找鬼。 笑死扮念,一個(gè)胖子當(dāng)著我的面吹牛损搬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柜与,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巧勤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了弄匕?” 一聲冷哼從身側(cè)響起颅悉,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迁匠,沒(méi)想到半個(gè)月后剩瓶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡城丧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年延曙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亡哄。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枝缔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愿卸,我是刑警寧澤灵临,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站趴荸,受9級(jí)特大地震影響儒溉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜发钝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一顿涣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酝豪,春花似錦园骆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锄码。三九已至夺英,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滋捶,已是汗流浹背痛悯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留重窟,地道東北人载萌。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巡扇,于是被迫代替她去往敵國(guó)和親扭仁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 基于ionic2的跨平臺(tái)項(xiàng)目(iOS) 一厅翔、技術(shù)背景 為了開(kāi)發(fā)html5乖坠,除了最新使用React Native等之...
    慶華_8f67閱讀 1,402評(píng)論 1 3
  • 0 開(kāi)始之前 通過(guò)本教程之前,您應(yīng)該至少了解一些基本的Ionic 2概念。您還必須已經(jīng)安裝了Ionic 2 在您的...
    孫亖閱讀 1,653評(píng)論 2 10
  • 又一個(gè)周一刀闷,分手一周了熊泵。你一定過(guò)的很好。每天早上醒來(lái)都像做了噩夢(mèng)一樣甸昏,原以為全世界只有你不會(huì)傷我顽分,沒(méi)想到傷我最深的...
    sponge_四胖子閱讀 230評(píng)論 0 1
  • 覺(jué)察日記101-19 今天和家人分享對(duì)守住中心重要性的理解,感受到這兩天是我成長(zhǎng)的一個(gè)節(jié)點(diǎn)施蜜,守住中心開(kāi)始進(jìn)入我的骨...
    我和榕樹(shù)閱讀 111評(píng)論 0 0
  • 從進(jìn)大學(xué)開(kāi)始卒蘸,就不可抑制的和別人比——報(bào)考失誤雖然很喜歡現(xiàn)在的專業(yè)但是也不得不接受不是重點(diǎn)大學(xué)的事實(shí),學(xué)號(hào)001不...
    不帶七月閱讀 297評(píng)論 0 0