国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Vue3+TS+Node打造個人博客(后端架構(gòu))

共 10606字,需瀏覽 22分鐘

 ·

2022-03-17 07:23

點(diǎn)擊上方卡片“前端司南”關(guān)注我您的關(guān)注意義重大
285b4f9a42df797c8b5e332aad4d5edb.webp原創(chuàng)@前端司南

本項(xiàng)目代碼已開源,具體見:

前端工程:vue3-ts-blog-frontend[1]

后端工程:express-blog-backend[2]

數(shù)據(jù)庫初始化腳本:關(guān)注公眾號前端司南,回復(fù)關(guān)鍵字“博客數(shù)據(jù)庫腳本”,即可獲取。

Express[3] 是基于 Node.js 平臺,快速、開放、極簡的 Web 開發(fā)框架。目前已經(jīng)更新到 5.x 版本。

我的博客后端其實(shí)開發(fā)得比較早,19年年底基本上已經(jīng)完成了主體功能的開發(fā),當(dāng)時用的是 Express 4.x 版本。

6bba21c76312c2ca07efb551f00d27fc.webp

在使用 Express 搭建后端服務(wù)時,主要關(guān)注的幾個點(diǎn)是:

  • 路由中間件和控制器
  • SQL處理
  • 響應(yīng)返回體數(shù)據(jù)結(jié)構(gòu)
  • 錯誤碼
  • Web安全
  • 環(huán)境變量/配置
路由和控制器

路由基本上是按模塊或功能去劃分的。

首先是按模塊去劃分一級路由,各個模塊的子功能相當(dāng)于是用二級路由處理。

簡單舉個例子,/article路由開頭的是文章模塊,/article/add用于新增文章功能。

控制器的概念其實(shí)是從其他語言中借鑒而來的,Express 并沒有明確說什么是控制器,但在我看來,路由中間件的處理模塊/函數(shù)就是控制器的概念。

下面是本項(xiàng)目使用到的一些控制器。

ab14e244de2739f28a3d2762626fcf67.webp
const?BaseController?=?require('../controllers/base');
const?ValidatorController?=?require('../controllers/validator');
const?UserController?=?require('../controllers/user');
const?BannerController?=?require('../controllers/banner');
const?ArticleController?=?require('../controllers/article');
const?TagController?=?require('../controllers/tag');
const?CategoryController?=?require('../controllers/category');
const?CommentController?=?require('../controllers/comment');
const?ReplyController?=?require('../controllers/reply');

module.exports?=?function(app)?{
?app.use(BaseController);
?app.use('/validator',?ValidatorController);
?app.use('/user',?UserController);
?app.use('/banner',?BannerController);
?app.use('/article',?ArticleController);
?app.use('/tag',?TagController);
?app.use('/category',?CategoryController);
?app.use('/comment',?CommentController);
?app.use('/reply',?ReplyController);
};

BaseController

其中,BaseController是用作第一道關(guān)卡,對所有的請求做一個基本的校驗(yàn)和攔截。

其實(shí)主要是對一些敏感接口(比如后臺維護(hù)類的)做一個權(quán)限校驗(yàn)。

權(quán)限控制這塊,我設(shè)計(jì)得還是比較簡單粗暴的,因?yàn)槲以跀?shù)據(jù)庫表中目前只預(yù)留了一個用戶Tusi,關(guān)聯(lián)的角色也是唯一用到的admin。畢竟目前還沒考慮開放用戶注冊這類的能力,有一個管理用戶基本上也夠用了。

所以我的設(shè)計(jì)是:只要在我登錄成功后的有效期內(nèi),就有權(quán)限操作敏感接口,否則就無權(quán)操作!

BaseController大體工作流程如下:

5cdcdda45d510ea69e5b0eb87d97a464.webp

BaseController的主體代碼結(jié)構(gòu)大概如下:

router.use(function(req,?res,?next)?{
????//?authMap?維護(hù)了敏感接口列表
????const?authority?=?authMap.get(req.path);
????//?首先檢查是不是敏感接口
????if?(authority)?{
????????//?需要檢驗(yàn)身份的接口
????????if?(req.cookies.token)?{
????????????//?取到?token?去做校驗(yàn)
????????????dbUtils.getConnection(function?(connection)?{
????????????????req.connection?=?connection;
?????????????????//?這里會直接查庫驗(yàn)明身份
????????????????connection.query(indexSQL.GetCurrentUser,?[req.cookies.token],?function?(error,?results,?fileds)?{
??????????????????//?身份校驗(yàn)通過,才繼續(xù),否則返回錯誤碼
????????????????})
????????????})
????????}?else?{
????????????return?res.send({
????????????????...errcode.AUTH.UNAUTHORIZED
????????????});
????????}
????}?else?{
????????//?不是敏感接口,不校驗(yàn)身份
????????if?(req.method?==?'OPTIONS')?{
????????????//?OPTIONS?類型請求不能去連數(shù)據(jù)庫,否則會導(dǎo)致數(shù)據(jù)庫連接過多崩了
????????????next();
????????}?else?{
????????????//?從mysql連接池取得connection
????????????dbUtils.getConnection(function?(connection)?{
????????????????req.connection?=?connection;
????????????????next();
????????????},?function?(err)?{
????????????????return?res.send({
????????????????????...errcode.DB.CONNECT_EXCEPTION
????????????????});
????????????})
????????}
????}
}

如注釋所述,BaseController主要是針對敏感接口做一個身份檢查,防止系統(tǒng)數(shù)據(jù)被一些不懷好意的 HTTP 請求給黑了。

20220218更新

按照上面的邏輯實(shí)現(xiàn)功能并上線后,服務(wù)運(yùn)行一段時間(可能是3~5天)后,能觀察到服務(wù)請求會變成無法正常響應(yīng)的狀態(tài)。

d16626d43317079eb3c43a64cf3375ed.webp

其實(shí)我能感覺到可能是mysql連接池未合理釋放導(dǎo)致的。

但是由于我一開始采取的方案是:在BaseControllerreq掛載connection,并在具體的業(yè)務(wù)控制器執(zhí)行完sql查詢語句后再自行釋放connection,這個基本使用過程我在后面一節(jié)也說到了。

如果要完全改掉這種調(diào)用方式,代碼改動還是挺大的,所以我一直拖著沒改,發(fā)現(xiàn)問題了就通過 PM2 重啟服務(wù)也能接著用。最近還是咬咬牙全部重構(gòu)了,具體見refactor: 重構(gòu)sql調(diào)用部分[4]。

d668a1036acfa9320caee7a772343622.webp

業(yè)務(wù)Controller

前端會分模塊,后端自然也會。業(yè)務(wù)模塊會有很多,比如文章,分類,標(biāo)簽,等等。這些都可以分成不同的Controller處理。

業(yè)務(wù)Controller的大體結(jié)構(gòu)如下,一個子路由就對應(yīng)一個功能:

/**
?*?@param?{Number}?count?查詢數(shù)量
?*?@description?根據(jù)傳入的count獲取閱讀排行top?N的文章
?*/

router.get('/top_read',?function?(req,?res,?next)?{
??//?業(yè)務(wù)代碼
}

/**
?*?@param?{Number}?pageNo?頁碼數(shù)
?*?@param?{Number}?pageSize?一頁數(shù)量
?*?@description?分頁查詢文章
?*/

router.get('/page',?function?(req,?res,?next)?{
??//?業(yè)務(wù)代碼
}

/**
?*?@param?{Number}?id?當(dāng)前文章的id
?*?@description?查詢上一篇和下一篇文章的id
?*/

router.get('/neighbors',?function?(req,?res,?next)?{
??//?業(yè)務(wù)代碼
}
SQL處理

SQL 這塊,我沒有直接用 ORM 工具。因?yàn)槲矣X得自己的 SQL 基礎(chǔ)并不是很好,還需要自己多寫 SQL 語句練習(xí)一下,所以我只用了一個mysql的庫。

523dca06a71d5581d4836955af4c69fa.webp

安裝mysql依賴:

npm?install?--save?mysql

簡單使用時,可以直接創(chuàng)建連接,然后執(zhí)行 SQL 語句:

var?mysql??????=?require('mysql');
var?connection?=?mysql.createConnection({
??host?????:?'localhost',
??user?????:?'me',
??password?:?'secret',
??database?:?'my_db'
});
?
connection.connect();
?
connection.query('SELECT?1?+?1?AS?solution',?function?(error,?results,?fields)?{
??if?(error)?throw?error;
??console.log('The?solution?is:?',?results[0].solution);
});
?
connection.end();

實(shí)際上,更推薦使用連接池,可以避免重復(fù)向 MySQL 申請連接,實(shí)現(xiàn)了連接的重用,在響應(yīng)速度上也會更快!

var?mysql?=?require('mysql');
var?pool??=?mysql.createPool(...);
?
pool.getConnection(function(err,?connection)?{
??if?(err)?throw?err;?//?not?connected!
?
??//?Use?the?connection
??connection.query('SELECT?something?FROM?sometable',?function?(error,?results,?fields)?{
????//?When?done?with?the?connection,?release?it.
????connection.release();
?
????//?Handle?error?after?the?release.
????if?(error)?throw?error;
?
????//?Don't?use?the?connection?here,?it?has?been?returned?to?the?pool.
??});
});

實(shí)際操作時,我是在BaseController中執(zhí)行了pool.getConnection,然后把connection對象掛載到req對象上,后續(xù)的路由中間件就可以直接從req對象中取得connection,可以少嵌套一層回調(diào),也避免了每處業(yè)務(wù)代碼都寫這部分重復(fù)的getConnection代碼。

BaseController的關(guān)鍵代碼:

//?從mysql連接池取得connection
dbService.getConnection(function?(connection)?{
??req.connection?=?connection;
??next();
},?function?(err)?{
??return?res.send({
????...errcode.DB.CONNECT_EXCEPTION
??});
})

業(yè)務(wù)處直接從req獲取到connection對象:

router.get('/page',?function?(req,?res,?next)?{
??const?connection?=?req.connection;
??const?pageNo?=?Number(req.query.pageNo?||?1);
??const?pageSize?=?Number(req.query.pageSize?||?10);
??connection.query(indexSQL.GetPagedArticle,?[(pageNo?-?1)?*?pageSize,?pageSize],?function?(error,?results,?fileds)?{
????connection.release();
????//?其他業(yè)務(wù)代碼
??})

SQL 語句主要是以字符串的形式編寫,通過?作為一個參數(shù)槽位,接收一些動態(tài)的值。

比如一個邏輯刪除的語句,我們會這樣寫:

//?邏輯刪除/恢復(fù)
UpdateArticleDeleted:?'UPDATE?article?SET?deleted?=???WHERE?id?=??',

第一個?是留給字段deleted的值,第二個?便是傳具體的id值。

而參數(shù)傳值是通過connection.query的第二個參數(shù)攜帶的。

注意,這個參數(shù)是一個數(shù)組,數(shù)組中的值會按照從左到右的順序依次替換掉 SQL 字符串中的?,變成一個真實(shí)的可執(zhí)行的 SQL 語句。

connection.query(indexSQL.UpdateArticleDeleted,?[params.deleted,?params.id],?function?(error,?results,?fileds)?{})

connection.query執(zhí)行回調(diào)后切記調(diào)用connection.release釋放連接。

另外要注意的一個就是 MySQL 的事務(wù)處理。對事務(wù)而言,初步要關(guān)注的是這三個 API!具體的使用場景我在后面的具體應(yīng)用會再提到,這里就不展開了!

//?開始事務(wù),對應(yīng)?MySQL?begin?語句
connection.beginTransaction();

//?事務(wù)提交,對應(yīng)?MySQL?commit?語句
connection.commit();

//?事務(wù)回滾,對應(yīng)?MySQL?rollback?語句
connection.rollback();

20220218更新

為了保留在這個項(xiàng)目中我使用mysql思路的一個轉(zhuǎn)變過程,前面的 mysql 調(diào)用過程,我還是按照最初的想法展開介紹的,關(guān)鍵的也就是這么幾點(diǎn)。

  1. BaseController 統(tǒng)一獲取 mysql pool 的 connection 對象,并掛載到 req 對象上,供后面的業(yè)務(wù)使用。
  2. 業(yè)務(wù) Controller 與 mysql 交互時,只需要從 req 對象中取得 connection,通過 connection.query 去執(zhí)行 sql 語句。
  3. 業(yè)務(wù) Controller 執(zhí)行完 sql 語句后,主動 release 釋放掉 connection。
  4. 事務(wù)場景中,事務(wù)處理完畢后,統(tǒng)一 release 釋放掉 connection,而不是每個 query 都自行釋放 connection。

這樣的設(shè)計(jì),雖然省去了在具體業(yè)務(wù) Controller 執(zhí)行getConnection(少一層回調(diào)寫法),但是在connection.release()的把控上還存在漏洞,一旦業(yè)務(wù)調(diào)用方忘記調(diào)用release(),就有可能造成服務(wù)不可用。而且有的業(yè)務(wù)不需要與 mysql 交互,也必須要記得 release(),雖然可以用一些配置字段去規(guī)避,也并不能從根本上解決問題!

所以我的修改方案是:

  1. 總體的原則是高內(nèi)聚,低耦合
  2. 封裝 mysql 的查詢過程,把 getConnection, query, release 等幾個關(guān)鍵行為都放在封裝的代碼中控制,對外只暴露一些封裝好的方法,這樣就不用擔(dān)心調(diào)用方忘記某些關(guān)鍵操作(比如release())。
  3. 關(guān)鍵 API Promise 化,這樣在一些復(fù)雜的異步過程中可以做到事半功倍,特別是涉及事務(wù)處理的時候!

核心代碼見db.js[5]

響應(yīng)返回體

響應(yīng)返回體的數(shù)據(jù)結(jié)構(gòu)是需要前后端進(jìn)行約定的,只有約定好規(guī)范,雙方才能緊密有序地配合起來。通常來說,會涉及到錯誤碼,信息,數(shù)據(jù)等字段。

其中錯誤碼code,信息message兩個字段應(yīng)該是通用的。數(shù)據(jù)部分data則隨業(yè)務(wù)的需要,可能會有多種情況,比如數(shù)組結(jié)構(gòu),對象結(jié)構(gòu),或者是普通數(shù)據(jù)類型。

{
??code:?"0",
??message:?"查詢成功",
??data:?{
????id:?1,
????name:?'xxx'
??}
}
錯誤碼

錯誤碼是后端規(guī)范中必不可少的部分。錯誤碼的設(shè)計(jì)是為了快速定位問題,也為一些業(yè)務(wù)監(jiān)控系統(tǒng)提供了分析和統(tǒng)計(jì)依據(jù)。

每個程序員會有自己的一些編碼風(fēng)格,在錯誤碼這塊,我是通過語義化的屬性名去定位到錯誤碼的。通常,一個錯誤碼會配對一條錯誤信息,也就是下面的msg字段。

module.exports?=?{
??DB:?{
????CONNECT_EXCEPTION:?{
??????code:?"-1",
??????msg:?"數(shù)據(jù)庫連接異常"
????}
??},
??AUTH:?{
????UNAUTHORIZED:?{
??????code:?"000001",
??????msg:?"對不起,您還未獲得授權(quán)"
????},
????AUTHORIZE_EXPIRED:?{
??????code:?"000002",
??????msg:?"授權(quán)已過期"
????},
????FORBIDDEN:?{
??????code:?"000003",
??????msg:?"抱歉,您沒有權(quán)限訪問該內(nèi)容"
????}
??},
}

錯誤碼的設(shè)計(jì)還有一個好處,就是方便做映射。

什么意思呢?后端返回錯誤碼-1,并且通過msg字段告訴前端錯誤信息是數(shù)據(jù)庫連接異常。但是,前端到底要不要反饋用戶這么直接粗暴的信息呢?我想,有時候是不需要的,而是通過一條委婉的提示來安撫一下用戶情緒

比如,

62e7da22b652aec1ddd7d68fe92208c1.webp

所以,有了錯誤碼,前端就可以收放自如,在錯誤提示上有更多發(fā)揮的余地,而不是直白地把后端反饋的錯誤信息直接暴露給用戶。

簡單的一個映射可以是:

//?ERR_MSG
{
??"-1":?"系統(tǒng)開了個小差,請稍后重試!",
}

那么message的展示邏輯就可以是:

message.error(ERR_MSG[res.code])
Web安全

主要是考慮幾個方面,XSS,CSRF,響應(yīng)頭。

XSS,指的是 Cross-Site-Scripting 跨站腳本攻擊。出現(xiàn) XSS 漏洞的主要場景是用戶輸入,比如評論,富文本等信息,如果不加以校驗(yàn),就可能會被植入惡意代碼,造成數(shù)據(jù)和財產(chǎn)損失!

針對 XSS 的校驗(yàn)不能光靠客戶端,服務(wù)端也必須進(jìn)行校驗(yàn)。我這里用的是[email protected]

npm?install?--save?xss

xss默認(rèn)會處理掉常見的 XSS 風(fēng)險,使用起來也非常簡單。比如,在新增評論的接口處,我們可以對參數(shù)這樣處理:

const?xss?=?require("xss");
router.post('/add',?function?(req,?res,?next)?{
??const?params?=?Object.assign(req.body,?{
????create_time:?new?Date(),
??});
??//?XSS防護(hù)
??if?(params.content)?{
????params.content?=?xss(params.content)
??}
}

雖然我目前還沒有用富文本承載評論內(nèi)容,但是還是先預(yù)備一下,萬一哪天想用富文本了呢!

至于 CSRF(跨站請求偽造)攻擊,常見的漏洞來源就是基于 Cookie 的身份驗(yàn)證,因?yàn)?Cookie 會在發(fā) HTTP 請求的時候自動帶上,這樣一來攻擊者就有了可乘之機(jī),通過腳本注入,或者一些引誘點(diǎn)擊,讓你不知不覺就上了套,發(fā)出了意料之外的請求。

不過,瀏覽器也是在不斷完善 Cookie 安全這塊,比如 Chrome 80 版本默認(rèn)啟用的 SameSite=Lax,也防范了很多 CSRF 的攻擊場景。

為了安全起見,在 Set-Cookie 時,最好帶上這些屬性。

Set-Cookie:?token=74afes7a8;?HttpOnly;?Secure;?SameSite=Lax;

為了防止 CSRF 攻擊,還可以采用 csrf-token 方式,或者采用 JWT 認(rèn)證,共同點(diǎn)都是避開基于 Cookie 的身份/口令認(rèn)證方式。

另外,設(shè)置一些必要的響應(yīng)頭對于 Web 安全也至關(guān)重要!

Express 推薦我們直接用上helmet。

Helmet 通過設(shè)置各種 HTTP 請求頭,提升 Express 應(yīng)用的安全性。它不是 Web 安全的銀彈,但的確有所幫助!

安裝helmet

npm?install?--save?helmet

使用起來也很簡單,因?yàn)樗褪且粋€中間件。

app.use(helmet());
292179f4f54ed6ef00d59ad29c6a9ea4.webp環(huán)境變量/配置

由于后端配置文件中一般會出現(xiàn)一些私密性的配置,比如數(shù)據(jù)庫配置,服務(wù)器配置,這些都不適合在開源項(xiàng)目中直接出現(xiàn)。所以,在本項(xiàng)目[6]中,我只給出了example示例,大家按照說明給出自己的配置文件即可。

  • 通用配置:config/env.example.js
  • 開發(fā)環(huán)境配置:config/dev.env.example.js
  • 生產(chǎn)環(huán)境配置:config/prod.env.example.js
  • PM2 deploy 配置:deploy.config.example.js

數(shù)據(jù)庫、郵箱配置,以及其他的參數(shù)配置,建議是給開發(fā)環(huán)境和生產(chǎn)環(huán)境單獨(dú)配置,避免本地開發(fā)時直接影響到生產(chǎn)環(huán)境。

所以,我們需要設(shè)置環(huán)境標(biāo)識,并且根據(jù)環(huán)境標(biāo)識來引用對應(yīng)的參數(shù)配置。

環(huán)境標(biāo)識我們都不陌生了,它就是process.env.NODE_ENV。由于項(xiàng)目中用到了pm2,所以我是通過pm2來配置NODE_ENV的。

env:?{
??NODE_ENV:?"development",
??PORT:?8002,
},
env_production:?{
??NODE_ENV:?'production',
??PORT:?8002,
},

所以,我們只要根據(jù)NODE_ENV來判斷開發(fā)環(huán)境或生產(chǎn)環(huán)境,然后加載對應(yīng)的參數(shù)配置即可。邏輯非常簡單!

//?配置入口文件,根據(jù)環(huán)境標(biāo)識導(dǎo)出配置
const?baseEnv?=?require("./env")
const?devEnv?=?require("./dev.env")
const?prodEnv?=?require("./prod.env")

module.exports?=?process.env.NODE_ENV?===?'production'???{
??...baseEnv,
??...prodEnv
}?:?{
??...baseEnv,
??...devEnv
}
小結(jié)

本文是Vue3+TS+Node打造個人博客(后端架構(gòu)篇),從一個不太專業(yè)的視角來切入后端,主要介紹了我在為博客系統(tǒng)設(shè)計(jì)后端時的一些主要思路,諸多細(xì)節(jié)不便展開,可以打開源碼[7]了解。

有了這次全棧開發(fā)的經(jīng)驗(yàn),大大提高了我對前后端全鏈路的理解程度,這之后和后端開發(fā)們聊天也更有話題可聊了,有時候還能幫后端捋捋思路、一起排查下問題??傊浅D嗡梗?/p>

但是,要把后端做完善還有很多的路要走,看看 Java 那么多中間件就知道了,道阻且長,行則將至,加油吧!

b8176890d1e0cf44d8e8870db77f661b.webp系列文章

Vue3+TS+Node打造個人博客系列文章入口可點(diǎn)擊下方鏈接,持續(xù)更新,歡迎閱讀!點(diǎn)贊關(guān)注不迷路!??

  • Vue3+TS+Node打造個人博客(總覽篇)[8]

參考

[1]

vue3-ts-blog-frontend: https://github.com/cumt-robin/vue3-ts-blog-frontend

[2]

express-blog-backend: https://github.com/cumt-robin/express-blog-backend

[3]

Express: https://www.expressjs.com.cn/

[4]

refactor: 重構(gòu)sql調(diào)用部分: https://github.com/cumt-robin/express-blog-backend/commit/41628e98b2e1f2fee14289fdb8d13fe1bc0501e3

[5]

db.js: https://github.com/cumt-robin/express-blog-backend/blob/main/utils/db.js

[6]

本項(xiàng)目: https://github.com/cumt-robin/express-blog-backend

[7]

源碼: https://github.com/cumt-robin/express-blog-backend

[8]

Vue3+TS+Node打造個人博客(總覽篇): https://juejin.cn/post/7066966456638013477


END


e46f6f7706c40cdfc50dd7a82319dfe0.webp


如果覺得這篇文章還不錯點(diǎn)擊下面卡片關(guān)注我來個【分享、點(diǎn)贊、在看】三連支持一下吧845731df59d92a47fc8223ea2aa84d81.webp



???“分享、點(diǎn)贊、在看” 支持一波?1d426d33ed44f2b099c9806c90fc233c.webp?

瀏覽 63
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 大鸡巴久久| 北条麻妃青青久久| a4yy午夜福利| 内射午夜福利在线免费观看视频| 青青青国产在线| 国产精品911| 日本黄色片| 中文资源在线a| 久久九九国产| 老女人操逼网| 狠狠欧美| 77777免费观看电视剧推荐爱的教育| 人操人人人操| 超碰人人在线观看| 欧美成人视频| 青青色综合| 国产乱子伦一区二区三精品| 一级a一级a爱片兔兔软件| 色色婷婷五月| 最新版本日本亚洲色| 91精品视频网| 97人妻人人澡| 亚洲国产综合AV在线| 无码免费一区| 久久系列观看完整指南| 人人看人人摸人人搞| 中文无码在线| 人人爽人人操人人| 亚洲AV无码国产精品| 国产秘精品区二区三区日本| 亚洲,制服,综合,中文| 五月天丁香婷婷视频| 青娱乐国产视频| 2016av天堂网| 色妞视频| 日本人妻中出| 天天草天天干| 久久精品国产亚洲AV麻豆痴男| 东京热91| 在线免费观看黄色视频| 天天日天天操天天摸天天干天日射天天插| 欧洲激情网| 少妇厨房愉情理伦BD在线观| 久久久久成人片免费观看蜜芽| 亚洲jiZZjiZZ日本少妇| 天堂操逼| 黄片网站入口| 91人妻无码成人精品一区二区| 蜜桃av无码| 亚洲中文字幕网站| 国产欧美在线免费观看| 成人在线超碰| 日本wwwwww| 午夜免费视频1000| 亚洲人人18XXX—20HD| 亚洲精品中文字幕无码| 99热激情在线| 一级a片免费看| 国产av播放| 免费在线观看黄| 就要干就要操| 木下凛凛子AV888AV在线观看 | 热久久最新| 日韩欧美在线免费观看| 69av网站| 欧美精品一区二区三区使用方法 | 青青免费视频| 日韩免费网站| 你懂得视频| 一本道无码在线观看| 各种BBwBBwBBwBBw| 一区二区在线不卡| 午夜成人鲁丝片午夜精品| 婷婷视频网站| 亚洲久草| 婷婷五月天色综合| 中文字幕综合网| 国产乱子伦-区二区三区熟睡91 | 蜜桃网站| 粉嫩小泬BBBBBB免费看| 国产精品欧美综合在线| 99黄色| 在线观看免费人成视频| 欧洲成人在线| 性福利导航| 黑人粗暴偷拍一区二区| 免费在线观看无码| 国产一级黄色| 精品无码一区二区Av蜜桃| 日本操逼视频| 日本色天堂| 国产ts在线| 少妇人妻AV| 国产成人精品一区二区| 中文字幕一区二区三区在线观看| 日本色色色| 91人妻人人爽人人澡| 欧美激情视频在线| 亚洲AV中文无码| 日本家庭乱伦视频| 强开小嫩苞一区二区电影| 久热在线资源福利站| 91精品国产偷窥一区二区| 親子亂子倫XXXX| 国产精品1区2区| 欧美日韩中文在线观看| 日韩欧美在线免费观看| 日本在线不卡一区| 日本免费一级片| 无码视频在线看| 亚洲免费观看A∨中文| 500部大龄熟乱4K视频| 国产3级片| 午夜成人无码视频| 国产在线不卡| 超碰人人人| 无码免费婬AV片在线观看| 午夜亚洲精品| 9118禁| 国产麻豆精品成人免费视频| 精品中文在线视频| 四川BBB搡BBB搡多人乱| 亚洲精品无码在线播放| 国产乱婬AAAA片视频| 国产精品porn| 动漫3D成人H无码国漫| 国产亚洲久一区二区| www中文字幕| 超碰天天射| 中文字幕一区二区三区精华液| 中文字幕免费在线观看视频| 奶大丰满一乱一视频一区二区三区在 | 嫩草视频在线观看免费网站| 黄色在线视频观看| 亚洲精品系列| 不雅一级| 日本黄色三级视频| 男女日逼网站| 少妇精品久久久久久久久久 | 欧美一区二区三区成人片下载| 免费黄色小视频在线观看| 黄色免费在线观看视频| 无码成人精品| 免费看无码一级A片放24小时| 88在线无码精品秘入口九色| 韩日无码人妻| 欧美日韩性爱视频| 99精品99| 日韩无码91| 国产精品999| 操逼网站大全| 黄色操屄视频| 成人自拍在线| 特级西西WWW无码| av免费在线播放| 人人插人人射| 久久久久黄| 乱轮少妇| 加勒比无码在线播放| 色资源在线观看| 国产人妻一区二区三区欧美毛片| 最近中文字幕| 欧美中文字幕| 制服.丝袜.亚洲.中文.豆花| 婷婷激情五月| 一级理论片| 丁香五月激情啪啪啪| 涩涩视频成人| 人妻无码HEYZO少妇精品| 无码中文av| 久久久久无码精品国产91福利 | 91丨国产丨精品丨丝袜| 99热这里只有精品999| 插综合网| 九九精品视频在线观看| 天天插天天拍| 久久精品视频播放| 国产精品久久久| 国产乱子伦一区二区三精品| 男女啪啪免费视频| 成人免费乱码大片a毛片蜜芽| 麻豆一区视频| 操逼在线观看| 亚洲日韩中文无码| 久久久久久毛片| 成人在线中文| 中文无码人妻少妇| 免费黄色网址啊不卡| 日本爱爱网址| 99热激情在线| 怡红院在线观看| 亚洲AV自拍| 日韩婷婷| 中文字幕亚洲在线观看| 韩国精品一区二区三区| 午夜亚洲福利| 无码五月天| 大香蕉电影网站| 综合成人在线| 亚洲五月婷婷| 黄片伊人| 人人摸人人干人人操| 午夜电影无码| 欧美亚洲三级| 色婷婷7777| 久久草成人网| 搡BBBB搡BBB搡我瞎了| 久久国产片| 欧美肥臀| 天天日天天操天天摸天天干天日射天天插| 小黄片免费看| 欧美黄片在线免费看| 日韩美在线视频| 日日摸日日碰| 天天射天天爽| 免费成人大片| 麻豆911| 成人午夜在线视频| 大肉大捧一进一出免费阅读| 女同一区二区三区| 欧美五月婷婷| 亚洲激情AV| 久久午夜无码鲁丝片午夜精| 嫩小槡BBBB槡BBBB槡漫画| 成人激情视频网| 精品日韩一区二区三区| 国产一区二区免费| 免费十无码| 自拍视频国产| 国产美女在线播放| 黄色视频免费在线观看网站 | 久久大香蕉| 中文字幕色| 岛国AV在线| 自拍偷拍第一页| 午夜免费视频1000| 免费看成人片| 中文字幕乱码中文乱码91| 国产精品永久久久久久久久久 | 午夜精品久久久| 安微妇搡BBBB搡BBBB| 日本久久精品18| 成人丁香| 中文字幕国产精品| 安徽妇搡BBBB搡BBBB袄爱直播 | 岛国无码AV在线观看| 91av一区二区| 九九re精品视频在线观看| 国产无遮挡又黄又爽又色视频软件 | AAA一区二区三区| 在线观看免费视频无码| 午夜精东影业果冻传媒| 伊人大香蕉网| 女人的天堂AV在线观看| 中出欧美亚洲| 最新日韩在线| 91人妻无码精品| 久久亚洲AV无码午夜麻豆| 丁香六月婷| 国产一区二区在线播放| 操逼视频一级| 久久久久99精品成人片三人毛片 | 在线中文无码| 国产美女精品| A片视频网站| 国产精视频| 无码精品ThePorn| 色天堂色天使| 国产精品久久777777| 韩国GOGOGO高清| 好吊一区二区| 欧美天天性| 人妻中文字幕av| 69国产精品视频免费观看| 天堂网在线播放| 国产在线毛片| 狠狠操狠狠撸| 久久不卡视频| 天堂网在线视频| 亚洲综合一二三区| 国产精品无| 中文字幕高清无码在线| 女人AV天堂| 五月AV| 亚洲精品国产成人| 欧美黄片一区二区| 91精品国产综合久久久蜜臀主演| 无码人妻一区| 久久久国产探花视频| 亚洲欧美成人片| 噜噜噜在线视频| 看毛片网址| 国产群交| 成人免费无码激情AV片| 粉嫩小泬BBBBBB免费看| 中文字幕免费在线视频| 狠狠久久| 久久久久亚洲AV成人片| 欧美精品久久久久久久久| 亚洲视频网站在线观看| 婷婷网址| 欧美视频综合| 成人免费视频在线| 亚洲人妻在线观看| 性欧美成人18| 综合色五月| 亚洲午夜免费视频| 天天日天天舔| 无码日韩成人| 大香蕉在8线| 激情综合婷婷| 成人AV在线电影| 久操久干| 亚洲成人精品视频| A片在线免费观看| 97人人爽人人爽人人爽| 网站毛片| 一级欧美一级日韩| 激情五月天在线视频| 欧美口爆视频| 嫩草人人精品免费| 成人黃色A片免费看| 一级黄色电影免费观看| 欧美手机在线| aⅴ免费观看| 欧美一区二区三区不卡| 久久机热| 中文字幕精品一级A片| 久久韩国| 国产成人电影免费在线观看| 日韩人妻在线播放| 午夜无码人妻AV| 韩国成人无码视频| 影音先锋国产av| 黄色片视频网站| 人人澡av| 伊人一区二区三区| 抽插视频欧美| 亚洲精品一区二区三区四区五区六区 | 99久在线精品99re8| 婷婷久久五月天| 在线观看国产一级片| 乱子伦国产精品视频| 全部视频午夜寂寞| 欧美亚洲国产日韩| 波多野结衣无码视频在线观看| 操逼网视频| 色五月婷婷基地| 九九毛片| 夜色88V精品国产亚洲| 日韩免费无码| 91视频电影| 久久区| 可以免费观看的AV| 国产一级片在线| 亚洲三级视频| 夜夜撸日日| 色接久久| 亚洲国产另类无码| 欧美三级片网址| 免费无码婬片AAAAA片| 少妇bbw搡bbbb搡bbbb| 久久久无码精品亚洲日韩男男| 国产精品无码在线播放| 国产操逼片| 青青草逼视频| 大香蕉777| 成人先锋影音| 五月激情视频| 日韩高清欧美| 麻豆操逼| 学生妹一级片内射视频| 色五月丁香婷婷| 小草一区| 1024在线视频| 特级西西人体444www高清| 青青草无码成人天堂免费| 黄色片AA| 亚洲AV成人片无码网站网蜜柚| 国产香蕉AV| 北条麻妃人妻中文无码| 亚洲成人在线视频免费观看| 亚洲无码精品在线| 一级片黄色电影| 很很干在线视频| 欧美69| 成人免看一级a一片A片| 日韩性网| 97国产超碰| 国产黄色片在线免费观看| 安徽妇搡BBB搡BBBB户外老太太| 成人片网站在线观看| 国产精品国产精品国产专区不卡| 麻豆视频在线播放| 四川少扫搡BBw搡BBBB| 亚洲伊人影院| 国产黄色免费看| 国产成人亚洲综合AV婷婷| 午夜福利不卡视频| 黄色电影网站在线观看| 麻妃无码| 精品少妇人妻| 欧美日屄视频| 欧美日韩一区二区三区| 一级操逼毛片| 成人国产AV网站| 怡红院视频| 黄色免费AV| 天天色视频| 日本黄色录像| 欧美A片在线免费观看| 一区二区三区免费在线观看| 日韩成人无码片| 在线免费观看AV片| 人妖黃色一級A片| 影音先锋男人资源站| 久久大香蕉精品| 神马Aⅴ| 欧美日韩在线电影| 丁香婷婷在线| 久操久操| 网站毛片| 亚洲婷婷精品国产成人| 国产精品免费在线| 成人精品电影| 九九成人免费视频| 美女毛片视频| 欧美男人的天堂| 精品网站| 免费看操逼| 在线观看网址你懂的| 天天草天天日| 亚洲成人黄色| 69国产成人综合久久精品欧美| 成人久久久| 五月婷婷六月色| 一级a一级a爰片免费免免中国A片| 久久久久久高清毛片一级| 高清无码小视频| 91人妻人人操人人爽| 青青草成人在线观看| 午夜三级视频| 大香蕉伊在线观看| 亚州高清无码视频| 久草大香蕉在线| 麻豆三级片| 国产一级片在线播放| 色黄网站在线观看| 成人国产AV网站| 玉米地一级婬片A片| 91丝袜一区在线观看| 免费av中文字幕| 久久草成人网| 啊啊啊网站| 日韩一级免费看| 无码欧美精品一区二区| 午夜操逼| 五月天国产精品| 黄网在线播放| 午夜性爱网址| 国产精品HongKong麻豆| 日韩在线视频网站| 色五月婷婷基地| 91av一区二区三区| 免费AV观看| 免费观看无码| 久久九九国产| 午夜黄色大片| 国产香蕉AV| 国产欧美在线不卡| 狼人香蕉网| 亚洲女同在线| 五月天青青草超碰免费公开在线观看| 日本黄色三级| 在线中出| 欧美v在线| 日韩免费成人| 刘玥精品国产一区二区三区 | 色综合999| 黄色搞逼视频| 色94色.欧美.setu| 日韩视频免费在线观看| 四川少扫搡BBBBB搡B| 天天天天天天天天操| 操碰在线观看| 少妇熟女视频一区二区三区| 欧美熟妇精品一级A片视色| 成年女人免费视频| 国产九九热视频| 日韩无码视频播放| 久久嫩草精品| 韩国AV三级| 中文字幕不卡+婷婷五月| 翔田千里一区二区三区| 色情一级AA片免费观看| 一级黄色生活片| 中文字幕成人免费视频| 亚洲v欧美v| A片网| 強姦婬片A片AAA毛片Mⅴ| 国产精品视频免费看| 亚洲性爱在线播放| 亚洲午夜电影| 美女网站视频黄| 无码在线播放观看| 91麻豆天美传媒在线| 国产精品免费久久影院| 日本人妻视频| 精品在线免费观看| 激情综合婷婷| 免费看成人片| 搡中国东北老女人视频| 影音先锋女人av噜噜色| 欧一美一婬一伦一区二区三区黑人-亚 | 伊人五月天激情| 99无码| 日韩天天| 亚洲国产成人91精品| 午夜视频免费| 成人综合在线观看| 操b视频在线播放| 熟女人妻人妻の视频| 免费AV资源在线观看| 国产美女久久久| av在线资源网站| 国产精品天天AVJ精麻传媒| 国产黄色视频在线| www.日韩精品| 国产成人视频在线| 日韩电影免费在线观看中文字幕| 亚洲中文字幕免费| 欧美污网站| 日本A级毛片| 伊人福利导航| 午夜av在线观看| 五月婷中文字幕| 欧美丰满老熟妇XXXXX性| 亚洲AV无码一区东京热久久| 国产乱子伦-区二区三区四区| 黄色一级视频网站| 自拍视频网| 亚洲无码91| 中文字字幕在线中文| 丁香五月天社区| 精品一区二区三区在线观看 | 亚洲人人18XXX—20HD| 91久久人澡人妻人人澡人人爽| 无码视频一二三区| 亚洲砖区免费| 欧美成人网址在线观看| 在线播放一区二区三区| 日韩小视频+国产| 18成人网站在线观看| 翔田千里中文字幕无码| 一本色道久久无码人妻精品69| 久久精品导航| 国产熟女一区| 开心色情| 亚洲乱码在线观看| 国产毛片网| 日批网站在线观看| 久久久国产91桃色一区二区三区| 92无码| 人人艹人人摸| 国产精品大香蕉| 亚洲高清无码电影| 免费黄色大片网站| 一级a一级a爱片兔兔软件| 少妇BBBB| 婷婷五月天电影网| 久久精品久久久久久久| 91av久久| 国产女人18毛片水真多1| 丁香花小说完整视频免费观看| 无码AV在线观看| 全国最大成人网站| 亚洲18禁| 大地8免费高清视频观看大全 | 无码av无码AV| 久久亚洲中文| 日日夜夜天天综合| 伊人大香在线| 青青草成人电影| 欧美性猛交XXXX乱大交| 中文字幕在线观看免费高清电影| 亚洲日韩国产AV无码无码精品| 成人午夜免费视频| 最新版本日本亚洲色| 五月天婷婷在线播放视频免费观看| 精品人妻无码一区二区三区| 香蕉午夜视频| 国产成人精品一区二| 欧美一级A片免费看| 黄色小视频免费看| 国产精品999| 麻豆毛片| 波多野结衣AV在线观看| 国产又猛又黄又爽| 日本综合久久| 在线黄色网| 暗呦罗莉精品一区二区| 免费观看黄色一级片| 男人V天堂| 黄片99| 亚洲黄色精品| 欧美性爱超碰| 天天做天天爱夜夜爽| 国产成人精品无码| 无码精品电影| 四川少妇搡bbbbb搡多人| 欧美日韩性爰视频| 黄色电影AV| 成人无码日韩精品| 99热中文| 亚洲无码影院| 日韩无码黄色电影| 欧美国产性爱| 成人免费在线观看| 97精品人妻| 国产又粗又猛又黄又爽无遮挡| 久久久久a| A片在线观看免费| 大香蕉中文| 青青草手机视频在线| 日本一区免费观看| 国产综合网站| 91麻豆精品国产91久久久熟女 | 一级A片黄色| 俺去俺来也在线www色情网| 91在线无精精品秘白丝| 69无码| 无码三级在线播放| 神马午夜福利影院| 日本无码电影| 国产无遮挡又黄又爽在线观看| 韩国gogogo高清在线完整版| 国产乱伦对白| 亚洲无码高清在线观看| 老妇bbw| 精品国产重口乱子伦| 欧美国产日韩在线| XXXX操| 2025国产在线| 亚洲精品97久久中文字幕| 2025四虎在线视频观看| 欧美被操| 天天综合网久久综合网| 久久无码电影| 国产91在线看| 国产欧美一区二区三区视频在线观看 | 国产人人操| 9l蝌蚪PORNY中文| 精品国产成人a在线观看| 中文字幕无码av| 91麻豆成人精品国产| 久久久久久无码| 国产成人午夜| 亚洲欧洲精品成人久久曰影片| 中文字幕手机在线视频| 91站街农村熟女露脸| 国产一级在线免费观看| 最新无码在线| 日韩在线一区二区| 一级无码免费| A级片在线观看| 88海外华人免费一区| 国产成人精品久久| 男人的天堂2019| 免费啪啪视频| 思思在线视频| 亚洲91视频| 操熟女视频| 久久成人精品视频| 欧美操逼大全| 人人澡人人澡人人| 狠狠躁夜夜躁人人爽人妻| 中文字幕av久久爽爽| 成人无码网站| www.av在线播放| 成人做爰100片免费观看视频| 亚洲国产高清在线观看视频| aaa三级片| 91乱子伦国产乱子伦| 日韩操逼AV| 色婷婷色99国产综合精品| 国产精品探花熟女AV| 最近中文字幕在线中文字幕7| 大香蕉国产视频| 欧美乱伦内射| 亚洲a在线观看| 欧美第一视频| 亚洲色情在线观看| av色图| 国产精品成人99一区无码| 操逼第二页| 俺去草| 91麻豆精品国产91久久久久久久久| yw在线播放| 国产AV高清| 日日射天天干| 日本中文字幕在线| 亚洲精选一区二区三区| 色色网站| 久热视频在线| 中文字幕乱码亚洲中文在线| 成年人国产| 中文字幕AV在线| 蜜桃AV无码一区二区三区| 久久国产大奶| 看黄片com| 日韩AAA在线| 99视频精品全部免费看| 夜夜嗨av无码一区二区三区| 国产又爽又黄免费网站在线| 激情一级片| 97精品人人妻人人| 一级黄色av| 亚洲永久视频| 日韩V欧美| AV三级片在线观看| 午夜亚洲AⅤ无码高潮片苍井空| 久久国产精品网站| 日韩成人免费在线| av女人天堂| 一区二区三区四区五区| 逼特逼视频| 天天操天天射天天日| 精品国产免费观看久久久_久久天天| 日本中文字幕免费| 日韩高清无码免费看| 国产精品乱子伦视频一区二区| 国内自拍2025| 日韩高清毛片| 国产一级特黄大片| 亚洲高清在线视频| 中文字幕黄色片| 欧美日韩操逼片| 琪琪色在线观看| 国产精品2| 国产欧美日韩在线| 日本狠狠干| 欧美h| 无码91| 男人天堂视频在线| 黄色视频在线观看18| 久久五月视频| 久久精品性爱| 在线中文字幕视频| 欧美在线中文| 九九九九九九国产| 久久国产精品久久| 69人人| 亚洲精品欧美久久婷婷| 爱操逼综合网| 69自拍视频| 久久一做爱| 日本中文字幕在线播放| 99久久亚洲精品日本无码| 操逼在线观看| 无码日韩视频| 在线观看中文字幕网站| 日韩城人网站| 超碰在线观看免费| 亚洲精品白浆高清久久久久久| 亚洲高清视频在线观看| 亚洲免费观看高清完整版在线| 黄色网页免费观看| 欧美熟女18| 无套免费视频欧美| 成年视频在线观看| 青青草原av| 九一久久| a级片在线观看| 色天堂视频在线观看| 国产一区二区AV| 国产成人精品麻豆| 日本三级片无码| 色网在线观看| 国产日韩在线视频| 青青草逼视频| 黄色A一级| 色综合99| 男人天堂视频网| 久天堂| 精品亚洲一区二区三区| 欧美精产国品一二三产品在哪买 | 免费黄片在线看| 夜色福利在线| 综合色色婷婷| 狠狠操狠狠色| 免费在线观看黄色视频网站| 欧美精品18| 亚洲av大全| 一级操逼黄色视频| av免费播放| 中文字幕在线免费播放| 丁香婷婷五月基地| 日本不卡一区二区三区四区| 国产无码毛片| 爱操逼综合网| 亚洲色婷婷五月天| www.大香蕉伊人| 手机看片福利一区二区| 欧美日韩黄色| 91精品国产91久久久久久久久久| 黄色在线播放| 久草视频新| 黄色天堂天天看| 欧美精品黄片| 夜色福利视频| 中文字幕在线观看视频免费| 成人三级片网| 中文字幕亚洲观看| 亚洲国产精品成人综合色五月 | 欧美精品在线免费| 爽好紧别夹喷水欧美| 五十路av| 精品黑人| 黄色三级电影| 亚洲第一成年人网站| 成人在线视频一区| 老妇性BBWBBWBBWBBW| 91蜜桃视频| 一区二区三区在线免费观看| 激情无码一区二区| 久久免费播放视频| 日韩一区二区三区四区久久久精品有吗 | 日韩香蕉视频| 欧美一级免费A片| 极品在线视频| 亚洲无码中文人妻| a片在线免费观看| 国产乱子伦一区二区三精品| 欧美三级片在线视频| 欧美AⅤ在线| 日本视频免费| 中文字幕性爱电影| 西西444WWW无码视频软件功能介绍| 日本高清色清di免费观看| 日本无码嫩草一区二区| 天天色av| 夜夜高潮夜夜爽| A片在线观看免费| 污网站免费观看| 亚洲成人精品一区二区| 一区二区三区无码精品| 色99在线| 久碰人妻人妻人妻| 98无码人妻精品一区二区三区| 免费看日韩视频| 性色网站| 国产操屄视频| 91麻豆成人| 国产激情无码视频| 午夜精品18视频国产17c| 国产灬性灬淫灬欲水灬| 国产棈品久久久久久久久久九秃| 精品无码视频在线观看| 丁香激情五月少妇| 大炕上公让我高潮了六次| 亚洲色图1| www,色婷婷| 91欧美精品成人综合在线观看| 色v在线| 一区二区三区国产精品| 中日韩精品A片中文字幕| 俺也来俺也去WWW色| 亚洲性爱一区二区三区| 91麻豆天美传媒在线| 西西444大胆无码视频| 超碰乱伦| 亚洲日韩中文字幕在线观看| 殴美老妇BBBBBBBBB| 91精品久久久久| 国产午夜福利视频| 亚洲精品秘一区二区三区蜜桃久| 国产久久这里只有精品视频| 中文字幕成人网| 日产久久视频| 色五月激情五月| 亚洲成人黄色| 另类AV| 插进去综合图| 亚洲免费在线婷婷| 亚洲丁香五月激情| 亚洲日韩中文无码| 午夜成人黄色电影| 午夜爽爽视频| 亚洲男女内射| 成人无码影院日韩,成人年…| 欧亚一区二区| 色播国产成人AV| 欧美后门菊门交3p、| 高清无码免费不卡| 美女极度色诱图片www视频| 高潮AV在线观看| 国产一卡二卡在线| 久久国产精品久久| 五月天最新网址| 午夜精品秘一区二区三区|