前端開(kāi)發(fā)規(guī)范

一、編程規(guī)范

(一)命名規(guī)范

1.1.1 項(xiàng)目命名

全部采用小寫(xiě)方式, 以中劃線分隔贡歧。

正例:mall-management-system

反例:mall_management-system / mallManagementSystem

1.1.2 目錄命名

全部采用小寫(xiě)方式怨绣, 以中劃線分隔,有復(fù)數(shù)結(jié)構(gòu)時(shí)颗圣,要采用復(fù)數(shù)命名法喳钟, 縮寫(xiě)不用復(fù)數(shù)

正例: scripts / styles / components / images / utils / layouts / demo-styles / demo-scripts / img / doc

反例: script / style / demo_scripts / demoStyles / imgs / docs

【特殊】VUE 的項(xiàng)目中的 components 中的組件目錄,使用 kebab-case 命名

正例: head-search / page-loading / authorized / notice-icon

反例: HeadSearch / PageLoading

【特殊】VUE 的項(xiàng)目中的除 components 組件目錄外的所有目錄也使用 kebab-case 命名

正例: page-one / shopping-car / user-management

反例: ShoppingCar / UserManagement

1.1.3 JS在岂、CSS奔则、SCSS、HTML蔽午、PNG 文件命名

全部采用小寫(xiě)方式易茬, 以中劃線分隔

正例: render-dom.js / signup.css / index.html / company-logo.png

反例: renderDom.js / UserManagement.html

1.1.4 命名嚴(yán)謹(jǐn)性

代碼中的命名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式及老。 說(shuō)明:正確的英文拼寫(xiě)和語(yǔ)法可以讓閱讀者易于理解抽莱,避免歧義。注意骄恶,即使純拼音命名方式也要避免采用

正例:henan / luoyang / rmb 等國(guó)際通用的名稱食铐,可視同英文。

反例:DaZhePromotion [打折] / getPingfenByName() [評(píng)分] / int 某變量 = 3

杜絕完全不規(guī)范的縮寫(xiě)僧鲁,避免望文不知義:

反例:AbstractClass“縮寫(xiě)”命名成 AbsClass璃岳;condition“縮寫(xiě)”命名成 condi,此類隨意縮寫(xiě)嚴(yán)重降低了代碼的可閱讀性悔捶。

(二) CSS 規(guī)范

1.2.1 命名

類名使用小寫(xiě)字母铃慷,以中劃線分隔

id 采用駝峰式命名

scss 中的變量、函數(shù)蜕该、混合犁柜、placeholder 采用駝峰式命名

ID 和 class 的名稱總是使用可以反應(yīng)元素目的和用途的名稱,或其他通用的名稱堂淡,代替表象和晦澀難懂的名稱

不推薦:

.fw-800 {

? font-weight: 800;

}

.red {

? color: red;

}

推薦:

.heavy {

? font-weight: 800;

}

.important {

? color: red;

}

1.2.2 選擇器

1馋缅、css 選擇器中避免使用標(biāo)簽名從結(jié)構(gòu)、表現(xiàn)绢淀、行為分離的原則來(lái)看萤悴,應(yīng)該盡量避免 css 中出現(xiàn) HTML 標(biāo)簽,并且在 css 選擇器中出現(xiàn)標(biāo)簽名會(huì)存在潛在的問(wèn)題皆的。

2覆履、很多前端開(kāi)發(fā)人員寫(xiě)選擇器鏈的時(shí)候不使用 直接子選擇器(注:直接子選擇器和后代選擇器的區(qū)別)。有時(shí),這可能會(huì)導(dǎo)致疼痛的設(shè)計(jì)問(wèn)題并且有時(shí)候可能會(huì)很耗性能硝全。然而栖雾,在任何情況下,這是一個(gè)非常不好的做法伟众。如果你不寫(xiě)很通用的析藕,需要匹配到 DOM 末端的選擇器, 你應(yīng)該總是考慮直接子選擇器凳厢。

不推薦:

.content .title {

? font-size: 2rem;

}

推薦:

.content > .title {

? font-size: 2rem;

}

1.2.3 省略0后面的單位

不推薦:

div{

? padding-bottom: 0px;

? margin: 0em;

}

推薦:

div{

? padding-bottom: 0;

? margin: 0;

}

(三) js 規(guī)范

1账胧、條件判斷和循環(huán)最多三層

條件判斷能使用三目運(yùn)算符和邏輯運(yùn)算符解決的,就不要使用條件判斷先紫,但是謹(jǐn)記不要寫(xiě)太長(zhǎng)的三目運(yùn)算符治泥。如果超過(guò) 3 層請(qǐng)抽成函數(shù),并寫(xiě)清楚注釋泡孩。

2车摄、this 的轉(zhuǎn)換命名

對(duì)上下文 this 的引用只能使用'self'來(lái)命名

3、undefined 判斷

永遠(yuǎn)不要直接使用 undefined 進(jìn)行變量判斷仑鸥;使用 typeof 和字符串'undefined'對(duì)變量進(jìn)行判斷吮播。

正例:

if (typeof person === 'undefined') {

? ? ...

}

反例:

if (person === undefined) {

? ? ...

}


二、Vue 項(xiàng)目規(guī)范

(一) Vue 編碼基礎(chǔ)

vue 項(xiàng)目規(guī)范以 Vue 官方規(guī)范 (?https://cn.vuejs.org/v2/style-guide/?) 中的 A 規(guī)范為基礎(chǔ)眼俊,在其上面進(jìn)行項(xiàng)目開(kāi)發(fā)意狠,故所有代碼均遵守該規(guī)范。

請(qǐng)仔仔細(xì)細(xì)閱讀 Vue 官方規(guī)范疮胖,切記环戈,此為第一步。

2.1.1澎灸、 組件名為多個(gè)單詞院塞。

組件名應(yīng)該始終是多個(gè)單詞組成(大于等于 2),且命名規(guī)范為KebabCase格式性昭。

這樣做可以避免跟現(xiàn)有的以及未來(lái)的 HTML 元素相沖突拦止,因?yàn)樗械?HTML 元素名稱都是單個(gè)單詞的。

正例:

export default {

? name: 'TodoItem'

? // ...

};

反例:

export default {

? name: 'Todo',

? // ...

}

export default {

? name: 'todo-item',

? // ...

}

2.1.2糜颠、組件文件名為 pascal-case 格式

正例:

components/

|- my-component.vue

反例:

components/

|- myComponent.vue

|- MyComponent.vue

2.1.3汹族、基礎(chǔ)組件文件名為 base 開(kāi)頭,使用完整單詞而不是縮寫(xiě)其兴。

正例:

components/

|- base-button.vue

|- base-table.vue

|- base-icon.vue

反例:

components/

|- MyButton.vue

|- VueTable.vue

|- Icon.vue

2.1.4顶瞒、和父組件緊密耦合的子組件應(yīng)該以父組件名作為前綴命名

正例:

components/

|- todo-list.vue

|- todo-list-item.vue

|- todo-list-item-button.vue

|- user-profile-options.vue (完整單詞)

反例:

components/

|- TodoList.vue

|- TodoItem.vue

|- TodoButton.vue

|- UProfOpts.vue (使用了縮寫(xiě))

2.1.5、在 Template 模版中使用組件元旬,應(yīng)使用 PascalCase 模式榴徐,并且使用自閉合組件守问。

正例:

<!-- 在單文件組件、字符串模板和 JSX 中 -->

<MyComponent />

<Row><table :column="data"/></Row>

反例:

<my-component /> <row><table :column="data"/></row>

2.1.6箕速、組件的 data 必須是一個(gè)函數(shù)

當(dāng)在組件中使用 data 屬性的時(shí)候 (除了 new Vue 外的任何地方)酪碘,它的值必須是返回一個(gè)對(duì)象的函數(shù)朋譬。 因?yàn)槿绻苯邮且粋€(gè)對(duì)象的話盐茎,子組件之間的屬性值會(huì)互相影響。

正例:

export default {

? data () {

? ? return {

? ? ? name: 'jack'

? ? }

? }

}

反例:

export default {

? data: {

? ? name: 'jack'

? }

}

2.1.7徙赢、 Prop 定義應(yīng)該盡量詳細(xì)

·?必須使用 camelCase 駝峰命名

·?必須指定類型

·?必須加上注釋字柠,表明其含義

·?必須加上 required 或者 default,兩者二選其一

·?如果有業(yè)務(wù)需要狡赐,必須加上 validator 驗(yàn)證

正例:

props: {

? // 組件狀態(tài)窑业,用于控制組件的顏色

? status: {

? ? type: String,

? ? required: true,

? ? validator: function (value) {

? ? ? return [

? ? ? ? 'succ',

? ? ? ? 'info',

? ? ? ? 'error'

? ? ? ].indexOf(value) !== -1

? ? }

? },

? ? // 用戶級(jí)別,用于顯示皇冠個(gè)數(shù)

? userLevel:{

? ? ? type: String,

? ? ? required: true

? }

}

2.1.8枕屉、為組件樣式設(shè)置作用域

正例:

<template>

? <button class="btn btn-close">X</button>

</template>

<!-- 使用 `scoped` 特性 -->

<style scoped>

? .btn-close {

? ? background-color: red;

? }

</style>

反例:

<template>

? <button class="btn btn-close">X</button>

</template>

<!-- 沒(méi)有使用 `scoped` 特性 -->

<style>

? .btn-close {

? ? background-color: red;

? }

</style>

(二) Vue

2.2.1 基礎(chǔ)

vue 項(xiàng)目中的所有命名一定要與后端命名統(tǒng)一常柄。

比如權(quán)限:后端 privilege, 前端無(wú)論 router , store, api 等都必須使用 privielege 單詞!

2.2.2 使用 Vue-cli 腳手架

使用 vue-cli3 來(lái)初始化項(xiàng)目搀擂,項(xiàng)目名按照上面的命名規(guī)范西潘。

2.2.3 目錄說(shuō)明

目錄名按照上面的命名規(guī)范,其中 components 組件用大寫(xiě)駝峰哨颂,其余除 components 組件目錄外的所有目錄均使用 kebab-case 命名喷市。

src? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 源碼目錄

|-- api? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 所有api接口

|-- assets? ? ? ? ? ? ? ? ? ? ? ? ? 靜態(tài)資源,images, icons, styles等

|-- components? ? ? ? ? ? ? ? ? ? ? 公用組件

|-- config? ? ? ? ? ? ? ? ? ? ? ? ? 配置信息

|-- constants? ? ? ? ? ? ? ? ? ? ? ? 常量信息威恼,項(xiàng)目所有Enum, 全局常量等

|-- directives? ? ? ? ? ? ? ? ? ? ? 自定義指令

|-- filters? ? ? ? ? ? ? ? ? ? ? ? ? 過(guò)濾器品姓,全局工具

|-- datas? ? ? ? ? ? ? ? ? ? ? ? ? ? 模擬數(shù)據(jù),臨時(shí)存放

|-- lib? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 外部引用的插件存放及修改文件

|-- mock? ? ? ? ? ? ? ? ? ? ? ? ? ? 模擬接口箫措,臨時(shí)存放

|-- plugins? ? ? ? ? ? ? ? ? ? ? ? ? 插件腹备,全局使用

|-- router? ? ? ? ? ? ? ? ? ? ? ? ? 路由,統(tǒng)一管理

|-- store? ? ? ? ? ? ? ? ? ? ? ? ? ? vuex, 統(tǒng)一管理

|-- themes? ? ? ? ? ? ? ? ? ? ? ? ? 自定義樣式主題

|-- views? ? ? ? ? ? ? ? ? ? ? ? ? ? 視圖目錄

|? |-- role? ? ? ? ? ? ? ? ? ? ? ? ? ? role模塊名

|? |-- |-- role-list.vue? ? ? ? ? ? ? ? ? ? role列表頁(yè)面

|? |-- |-- role-add.vue? ? ? ? ? ? ? ? ? ? role新建頁(yè)面

|? |-- |-- role-update.vue? ? ? ? ? ? ? ? ? role更新頁(yè)面

|? |-- |-- index.less? ? ? ? ? ? ? ? ? ? ? role模塊樣式

|? |-- |-- components? ? ? ? ? ? ? ? ? ? ? role模塊通用組件文件夾

|? |-- employee? ? ? ? ? ? ? ? ? ? ? ? employee模塊

1斤蔓、api 目錄

·?文件植酥、變量命名要與后端保持一致。

·?此目錄對(duì)應(yīng)后端 API 接口附迷,按照后端一個(gè) controller 一個(gè) api js 文件惧互。若項(xiàng)目較大時(shí),可以按照業(yè)務(wù)劃分子目錄喇伯,并與后端保持一致喊儡。

·?api 中的方法名字要與后端 api url 盡量保持語(yǔ)義高度一致性。

·?對(duì)于 api 中的每個(gè)方法要添加注釋稻据,注釋與后端 swagger 文檔保持一致艾猜。

正例:

后端 url: EmployeeController.java

/employee/add

/employee/delete/{id}

/employee/update

前端: employee.js

? // 添加員工

? addEmployee: (data) => {

? ? return postAxios('/employee/add', data)

? },

? // 更新員工信息

? updateEmployee: (data) => {

? ? return postAxios('/employee/update', data)

? },

? ? // 刪除員工

? deleteEmployee: (employeeId) => {

? ? return postAxios('/employee/delete/' + employeeId)

? }

2买喧、 assets 目錄

assets 為靜態(tài)資源,里面存放 images, styles, icons 等靜態(tài)資源匆赃,靜態(tài)資源命名格式為 kebab-case

|assets

|-- icons

|-- images

|? |-- background-color.png

|? |-- upload-header.png

|-- styles

3淤毛、 components 目錄

此目錄應(yīng)按照組件進(jìn)行目錄劃分,目錄命名為 KebabCase算柳,組件命名規(guī)則也為 KebabCase

|components

|-- error-log

|? |-- index.vue

|? |-- index.less

|-- markdown-editor

|? |-- index.vue

|? |-- index.js

|-- kebab-case

4低淡、 constants 目錄

此目錄存放項(xiàng)目所有常量,如果常量在 vue 中使用瞬项,請(qǐng)使用 vue-enum 插件(https://www.npmjs.com/package/vue-enum)

目錄結(jié)構(gòu):

|constants

|-- index.js

|-- role.js

|-- employee.js

例子: employee.js

export const EMPLOYEE_STATUS = {

? NORMAL: {

? ? value: 1,

? ? desc: '正常'

? },

? DISABLED: {

? ? value: 1,

? ? desc: '禁用'

? },

? DELETED: {

? ? value: 2,

? ? desc: '已刪除'

? }

};

export const EMPLOYEE_ACCOUNT_TYPE = {

? QQ: {

? ? value: 1,

? ? desc: 'QQ登錄'

? },

? WECHAT: {

? ? value: 2,

? ? desc: '微信登錄'

? },

? DINGDING: {

? ? value: 3,

? ? desc: '釘釘?shù)卿?

? },

? USERNAME: {

? ? value: 4,

? ? desc: '用戶名密碼登錄'

? }

};

export default {

? EMPLOYEE_STATUS,

? EMPLOYEE_ACCOUNT_TYPE

};

5蔗蹋、router 與 store 目錄

這兩個(gè)目錄一定要將業(yè)務(wù)進(jìn)行拆分,不能放到一個(gè) js 文件里囱淋。

router 盡量按照 views 中的結(jié)構(gòu)保持一致

store 按照業(yè)務(wù)進(jìn)行拆分不同的 js 文件

6猪杭、 views 目錄

·?命名要與后端、router妥衣、api 等保持一致

·?components 中組件要使用 PascalCase 規(guī)則

|-- views? ? ? ? ? ? ? ? ? ? ? ? ? ? 視圖目錄

|? |-- role? ? ? ? ? ? ? ? ? ? ? ? ? ? role模塊名

|? |? |-- role-list.vue? ? ? ? ? ? ? ? ? ? role列表頁(yè)面

|? |? |-- role-add.vue? ? ? ? ? ? ? ? ? ? role新建頁(yè)面

|? |? |-- role-update.vue? ? ? ? ? ? ? ? ? role更新頁(yè)面

|? |? |-- index.less? ? ? ? ? ? ? ? ? ? ? role模塊樣式

|? |? |-- components? ? ? ? ? ? ? ? ? ? ? role模塊通用組件文件夾

|? |? |? |-- role-header.vue? ? ? ? ? ? ? ? ? ? ? ? role頭部組件

|? |? |? |-- role-modal.vue? ? ? ? ? ? ? ? ? ? ? ? role彈出框組件

|? |-- employee? ? ? ? ? ? ? ? ? ? ? ? employee模塊

|? |-- behavior-log? ? ? ? ? ? ? ? ? ? ? 行為日志log模塊

|? |-- code-generator? ? ? ? ? ? ? ? ? ? 代碼生成器模塊

2.2.4 注釋說(shuō)明

整理必須加注釋的地方

公共組件使用說(shuō)明

·?api 目錄的接口 js 文件必須加注釋

·?store 中的 state, mutation, action 等必須加注釋

·?vue 文件中的 template 必須加注釋皂吮,若文件較大添加 start end 注釋

·?vue 文件的 methods,每個(gè) method 必須添加注釋

·?vue 文件的 data, 非常見(jiàn)單詞要加注釋

注釋規(guī)范

代碼注釋在一個(gè)項(xiàng)目的后期維護(hù)中顯的尤為重要税手,所以我們要為每一個(gè)被復(fù)用的組件編寫(xiě)組件使用說(shuō)明蜂筹,為組件中每一個(gè)方法編寫(xiě)方法說(shuō)明

務(wù)必添加注釋列表

1、公共組件使用說(shuō)明

2冈止、各組件中重要函數(shù)或者類說(shuō)明

3狂票、復(fù)雜的業(yè)務(wù)邏輯處理說(shuō)明

4、特殊情況的代碼處理說(shuō)明,對(duì)于代碼中特殊用途的變量熙暴、存在臨界值闺属、函數(shù)中使用的 hack、使用了某種算法或思路等需要進(jìn)行注釋描述

5周霉、多重 if 判斷語(yǔ)句

6掂器、注釋塊必須以/(至少兩個(gè)星號(hào))開(kāi)頭/

7、單行注釋使用 //

單行注釋

注釋單獨(dú)一行俱箱,不要在代碼后的同一行內(nèi)加注釋国瓮。例如:

? bad

? var name =”abc”; // 姓名

? good

? // 姓名

? var name = “abc”;

多行注釋

組件使用說(shuō)明,和調(diào)用說(shuō)明

? ? ? /**

? ? ? * 組件名稱

? ? ? * @module 組件存放位置

? ? ? * @desc 組件描述

? ? ? * @author 組件作者

? ? ? * @date 2017年12月05日17:22:43

? ? ? * @param {Object} [title]? ? - 參數(shù)說(shuō)明

? ? ? * @param {String} [columns] - 參數(shù)說(shuō)明

? ? ? * @example 調(diào)用示例

? ? ? *? <hbTable :title="title" :columns="columns" :tableData="tableData"></hbTable>

? ? ? **/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狞谱,一起剝皮案震驚了整個(gè)濱河市乃摹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跟衅,老刑警劉巖孵睬,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異伶跷,居然都是意外死亡掰读,警方通過(guò)查閱死者的電腦和手機(jī)秘狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹈集,“玉大人烁试,你說(shuō)我怎么就攤上這事÷K粒” “怎么了减响?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)善榛。 經(jīng)常有香客問(wèn)我辩蛋,道長(zhǎng)呻畸,這世上最難降的妖魔是什么移盆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮伤为,結(jié)果婚禮上咒循,老公的妹妹穿的比我還像新娘。我一直安慰自己绞愚,他們只是感情好叙甸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著位衩,像睡著了一般裆蒸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糖驴,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天僚祷,我揣著相機(jī)與錄音,去河邊找鬼贮缕。 笑死辙谜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的感昼。 我是一名探鬼主播装哆,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼定嗓!你這毒婦竟也來(lái)了蜕琴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宵溅,失蹤者是張志新(化名)和其女友劉穎凌简,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體层玲,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡号醉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年反症,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔派。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铅碍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出线椰,到底是詐尸還是另有隱情胞谈,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布憨愉,位于F島的核電站烦绳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏配紫。R本人自食惡果不足惜径密,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躺孝。 院中可真熱鬧享扔,春花似錦、人聲如沸植袍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)于个。三九已至氛魁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厅篓,已是汗流浹背秀存。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贷笛,地道東北人应又。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乏苦,于是被迫代替她去往敵國(guó)和親株扛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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