精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何搭建合適的Web框架?

開發 后端
之前在Web開發框架推導一文中我們一步步的搭建了一個開發框架。在當時的情況下,還算滿足需求。但是隨著項目的逐漸完善,需求變更的頻度逐漸變得比新增需求的頻度高,原來框架的弊端越來越明顯,所以需要對框架進行升級改進。

 [[278571]]

之前在Web開發框架推導一文中我們一步步的搭建了一個開發框架。

如何搭建合適的Web框架?

在當時的情況下,還算滿足需求。但是隨著項目的逐漸完善,需求變更的頻度逐漸變得比新增需求的頻度高,原來框架的弊端越來越明顯,所以需要對框架進行升級改進。

我們先來看原來框架的問題,然后基于這些問題,來對框架進行改進。

原框架的問題

  • 代碼生成問題
  • 參數傳遞問題
  • Service層問題
  • 測試依賴問題
  • Mapper.xml的問題

代碼生成問題

在原框架中,我們基于各種約束,編寫了一個代碼生成組件,通過這個組件,我們可以針對選中的表來生成Controller,Service,Model,Mapper等一系列的類,也就是說,只要建完表,就可以直接生成一套CRUD,直接就可以啟動并測試。這在項目初期看起來很美,但是在需求變動時,還是有很多的局限性。

首先,生成的代碼邏輯是固化的。如果稍微有些調整,就需要調整生成代碼的組件,然后重新打包,上傳到jar倉庫,項目修改組件版本,再進行代碼生成,整個流程過于繁瑣。

其次,為了方便代碼的生成,其實是做了不少妥協的:

  • 為了方便在修改表字段以后,能夠重新生成,很多類都抽象了一個基類用于操作Model字段。這些基類不能夠手動修改,因為每次生成都會覆蓋。這實際導致了類的數量的增多。
  • 生成的CRUD固化了,不能手動調整。如果生成的CRUD不滿足需求,不能直接在代碼上修改。只能拷貝一份進行修改,因為再次生成時會覆蓋。這導致了代碼的冗余。
  • Param和Result委托了Model,這在Model發生改變時,能在編譯期就能知道對應字段的調整。但是也引入了不少問題,我們在「參數傳遞問題」一節單獨討論。

參數傳遞問題

當初為了便于代碼的生成,決定Param和Result都繼承Model,這導致了如下的一些問題:

  • 使得Param和Result都依賴了Model。但是Param和Result是視圖層模型,而Model是持久層模型,兩者的進化度并不是一致的。但是現在的繼承關系導致了在默認情況下視圖層模型的進化需要和持久層同步,當然你也可以手動調整Param和Result,但是這又導致了代碼生成的優勢沒有了。
  • Param和Result通過委托的方式來設置字段,也就是說,它們實際是沒有字段的,通過getter和setter將值設置到了Model中。這就沒法使用lombok來簡化getter和setter,使得Param和Result代碼行數較多
  • 同時,對于swagger來說,有些注解需要基于字段,導致某些功能無法實現(例如:ModelAttribute),只能基于額外手段來處理(例如:需要通過ApiImplicitParams來實現字段文檔)。
  • CRUD都是基于同一個Param和Result,導致前端的接口會顯示很多無用的字段,加大前端理解接口的難度

Service層問題

Service層有如下問題:

  • Service層的職責過重,包括了事務處理、參數設置、業務邏輯
  • 導致Service中的代碼是面條代碼,不利于業務邏輯的理解
  • 同時事務注解是直接加在類上的,Spring的默認事務機制會導致類似如下代碼的邏輯調用不會拋出期望的異常
  1. // PostService 
  2. public String savePost(Post post) { 
  3.  postRepository.save(post); 
  4.  for(PostDiscuss discuss : post.getDiscuss()) { 
  5.  // 這里是抓不到RuntimeException異常的,會是一個TransactionRollBack的異常 
  6.  discussService.save(discuss); 
  7.  } 
  8. // discussService 
  9. public String savePost(PostDiscuss discuss) {  
  10.  throw new RuntimeException("保存失敗"); 

測試依賴問題

核心的業務邏輯在Service中,測試還是需要依賴于Spring,當項目越來越大時,啟動項目的時間越來越長,可能要1分鐘甚至更長。這就導致單元測試效率越來越低。

Mapper.xml的問題

在面試的時候,我經常會問下面的一些問題:

  • Java里面接口的作用是什么?
  • Service、DAO為什么要編寫接口,再去實現這個接口?
  • 接口和實現在相同的模塊下,反正都要重新打包的。多寫個接口不是多寫了好幾行代碼嗎?
  • 和上面類似的問題,Mybatis里面,聲稱將sql獨立到了Mapper.xml文件中,使得可以不需要編譯直接修改sql。但Mapper.xml都是和Class放在一起的,改了還是需要重新打包,而且Mybatis是不能動態加載Mapper.xml的,那把sql獨立到XML里,到底有什么優勢?

對于最后一個問題,我的答案是,對于大部分項目來說,沒什么優勢!項目易不易于部署、擴展,不在于你使用的框架,而在于你的設計。

就以Mapper.xml來說,Mybatis將sql與代碼分離了,但是你在項目里還是將Mapper.xml和代碼放在同一個模塊下,那這個優勢就沒有了。既然沒有這個優勢,我們還有必要單獨寫Mapper.xml文件嗎?我的選擇是,那就不寫了,直接使用Mybatis提供的注解。

同時為了解決Service層對DAO層(這里也就是對Mybatis)的強依賴,對框架進行了一些改進,解耦Service和DAO層。具體見下面的改進方案。

框架改進方案

為了解決上面這些問題,對框架進行了如下調整:

  • 分離Param、Result和Model
  • 替換代碼生成
  • 獨立業務邏輯
  • Model層優化

分離Param、Result和Model

上面已經提到了Param、Result和Model強耦合會有很多問題,所以這里就將Param、Result和Model分離開。每個都是獨立的Bean,這就解決了上面幾個問題。但是引入了兩個新問題:

  • 首先,很明顯的,增加了手動編碼的量。當一個表修改了字段,需要修改三個類甚至更多的類
  • 其次,增加了數據傳遞之間的代碼。即Param傳遞到Model,需要對字段賦值。如果一個字段一個字段的設值,會增加很多無聊的代碼。而使用反射的話會對性能有一些影響

那如何解決這兩個問題呢?首先,純手擼肯定是不可能的。需要提供一些自動化手段。

對于賦值來說,Spring提供了BeanUtils來簡化處理,雖然是基于反射來設值的,但是對于現階段來說,這點性能損耗還是沒什么影響的。但是,BeanUtils對于不同類型的屬性不能進行拷貝,假設我有一個Domain對象Book,里面有個字段Author,現在我要賦值給BookResult,其中有個字段AuthorResult,此時BeanUtils是無法賦值的。所以我編寫了一個基于Gson的工具類來處理,性能測試10000次的屬性拷貝BeanUtils需要500多毫秒,基于Gson的工具類只需要300毫秒左右。

對于表字段的生成,如果使用的是IDEA的話,IDE默認提供了一個腳本,可以從表來生成POJO!我們可以使用這個腳本來生成Model,然后將字段拷貝到Param和Result中,來簡化字段的編寫。我對這個腳本進行了修改,以符合項目需求。主要增加了lombok的支持,新增了類注釋和字段注釋。

替換代碼生成

對于上面代碼生成組件的問題,我調整了代碼生成的方式。不再基于組件來生成,而是基于IDEA本身的FileTemplate、LiveTemplate以及Scripted Extensions來進行生成。雖然這樣的方式,不能夠一次性生成多個文件,但是由于生成邏輯基本是一次性的,所以影響不是很大。在初次生成代碼時,代碼生成組件的效率是高于FileTemplate、LiveTemplate以及Scripted Extensions的組合,但是后期調整的靈活性,明顯是FileTemplate、LiveTemplate以及Scripted Extensions的組合要高于代碼生成組件的:

  • 首先,當文件結構調整時,只需要修改FileTemplate,并將配置文件導出給項目組成員即可。
  • 同樣的,當LiveTemplate調整時,也只需要修改對應的LiveTemplate,并將配置文件導出給項目組成員即可。
  • 其次,想生成哪個文件,只要針對這個文件生成即可
  • 第三,通過FileTemplate生成完整的文件后,可以通過LiveTemplate快速的進行模塊化的編碼
  • 最后,FileTemplate可以設置為項目級別,即每個項目可以有獨立的FileTemplate

具體的操作流程,在下面演示。

獨立業務邏輯

針對Service和測試的問題,將原來的Controller、Service和Model三層,拆分為四層:

  • Controller負責前端數據的接收和返回,以及統一異常處理
  • Service負責事務以及Domain層邏輯的組裝。這里就不會出現事務嵌套問題,也就不會導致抓不到期望的異常的問題
  • Domain負責業務邏輯
  • Model負責數據持久

這樣Service的職責減輕了,同時不再有事務嵌套的問題。

Model層優化

上面提到,框架中最終放棄了Mapper.xml,轉而使用Mybatis的注解來實現持久化操作。改用注解,規避了XML代碼的編寫,但是并沒有解決框架對Mybatis的強依賴。所以這里在Domain中新增了Repository接口層,此層用于定義Domain的持久化操作,而Model層中對Repository進行實現,這里的實現就是Mybatis實現。這樣做有兩個好處:

  • 依賴倒置:原來是Domain依賴Model層,而現在是Model層依賴Domain層,這樣當我要把Mybatis替換掉時,Domain完全無感知。
  • 獨立測試:因為現在Domain不依賴于其它任何層,所以可以脫離數據庫和容器來進行測試。使得測試的效率不會隨著項目的開發而越來越低
如何搭建合適的Web框架?

框架改進細節

現在已經知道了,如何對框架進行改進,我們現在就開始著手進行改造。其實主要的改造是對代碼生成方式的改造,也就是編寫FileTemplate、LiveTemplate和ScriptedExtensions。下面對這三個功能進行簡單的說明,先說ScriptedExtensions。

Scripted Extensions

先來解釋一下,什么是Scripted Extensions。我們都知道,現在的IDE都是插件式的,也就是說,我們可以通過開發商提供的插件開發包來開發插件,擴展現有的IDE功能。但是編寫插件需要特定的開發環境,如果是一個很簡單的功能,還要費勁去搭開發環境,挺麻煩的。所以IDEA提供了Scripted Extensions,可以理解為一個簡化版的插件,就是可以通過腳本來擴展IDE功能。

IDEA提供了Database功能,可以連接數據庫進行相關操作。當你連接了數據庫,在表上右擊時,可以看到Scripted Extensions這個選項,里面有一個功能是可以基于表來生成POJO的groovy腳本。

但是功能比較low:

  • 包名是寫死的:com.sample
  • 沒有生成table注釋
  • 沒有基于lombok來簡化getter和setter

不過好在,我們能基于這個腳本來自行修改,在剛才的Scripted Extensions菜單里,有個Go to Scripts Directory選項,點擊后,可以進入腳本目錄。

如何搭建合適的Web框架?

直接對這個groovy文件Ctrl+c,Ctrl-v,復制一份,重命名一下,基于這個腳本進行修改即可。具體怎么修改,按照自己的需求來,里面主要就是根據表信息對String的拼接而已。

FileTemplate

FileTemplate是IDEA提供的生成文件的模板,你在點擊菜單的File->New...以后,出現的各種文件,都是基于FileTemplate來實現的。我們自定義的Controller、Service、Domain等類,都可以通過FileTemplate來簡化創建。

具體使用方式為,按下Ctrl-Alt-S呼出設置菜單,點擊Editor->File And Code Template,在里面新增Template即可。

如何搭建合適的Web框架?

幾點說明:

  • 下面的描述中列出了默認的一些參數以及作用
  • 你也可以自定義變量,自定義的變量如果沒有賦值,在創建時會有輸入框提示輸入內容
  • 模板是基于Velocity的,所以如果你熟悉 Velocity,那就可以直接上手
  • Enable Live Template選項是在FileTemplate激活LiveTemplate變量,不過需要使用#[[]]#包裹。但是對于創建Java,這個功能有bug,并不能定位到需要的位置,所以暫時沒使用

創建完成后,就可以在New菜單中看到這個模板了。

LiveTemplate

LiveTemplate實際就是CodeSnippet。創建方式和FileTemplate類似。按下Ctrl-Alt-S呼出設置菜單,點擊Editor->Live Template,在里面新增Template即可。

如何搭建合適的Web框架?

幾點說明:

  • 這里的變量是使用$$包裹
  • 每個變量就是一個占位符,在使用tab展開后,可以手動輸入值
  • 右下角的Edit variables,用于對變量賦值,IDEA提供了一些方法、也可以設置默認值
  • 下面的change鏈接,可以選擇LiveTemplate生效的位置,比如只在Java類聲明處生效

編碼流程

創建了上面的幾個模板后,編碼流程如下:

  • 在表上右擊,通過Scripted Extensions來生成Model
  • 通過FileTemplate來快速生成Controller、Service、Domain等類
  • 通過LiveTemplate來快速編寫代碼

總結

本文通過對原框架問題的梳理及解決,來對框架進行升級改造,以適應項目的發展和推進。

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2013-09-11 19:07:27

IT安全框架信息安全COBIT

2009-11-12 16:17:13

.NET

2010-12-13 09:21:00

2018-07-25 15:43:27

機器學習框架開發

2019-07-19 15:51:11

框架選型分布式

2016-11-02 13:33:43

2016-10-11 12:45:50

PythonWeb服務器

2016-08-22 20:37:10

PythonWeb服務器

2016-08-10 16:28:00

WebURLHTTP

2009-07-06 15:19:13

webwork ser

2012-02-08 13:49:53

Node.js

2019-03-11 15:48:13

企業存儲數據

2013-07-23 09:07:57

BYOD策略步驟

2010-09-14 10:02:39

獲取Squid

2009-06-14 21:41:23

Java Web框架

2023-09-01 07:21:11

2018-05-30 15:33:00

打包工具Web

2009-05-12 09:54:09

JavaRestCoC

2017-09-12 08:22:59

DCIM軟件數據中心

2009-02-23 10:31:36

點贊
收藏

51CTO技術棧公眾號

国产亚洲人成a在线v网站| 性感美女视频一二三| 亚洲国产精品久久久天堂| 日韩一区二区免费高清| 免费看一级大黄情大片| 91视频在线观看| 粉嫩av一区二区三区在线播放| 欧美性在线观看| 国产午夜精品理论片在线| 一区二区中文字幕在线观看| 色综合久久中文综合久久牛| 2021狠狠干| 免费一级在线观看| 国产精品一区二区在线观看不卡 | 日本乱理伦在线| 久久久久88色偷偷免费| 亚洲最大av在线| 波多野结衣在线观看视频| 午夜天堂精品久久久久| 国产亚洲精品一区二区| 秘密基地免费观看完整版中文| 最新欧美电影| 午夜私人影院久久久久| 中日韩在线视频| 伦理片一区二区三区| 国产福利一区二区三区视频在线| 国产成人精品亚洲精品| 精品在线视频免费| 99热在线成人| 中文国产亚洲喷潮| v8888av| 中文字幕一区二区三区四区久久| 欧美伊人久久大香线蕉综合69| 国产精品又粗又长| 亚洲电影视频在线| 亚洲日本va午夜在线影院| 亚洲精品高清视频| 国产乱子伦三级在线播放| 成年人国产精品| 波多野结衣精品久久| 国产又粗又猛视频免费| 性xx色xx综合久久久xx| 午夜精品国产精品大乳美女| 欧美日韩在线视频免费播放| 99精品视频精品精品视频| 国产一区二区三区四区福利| 人妻大战黑人白浆狂泄| 欧美美女在线直播| 日韩黄在线观看| 无码精品一区二区三区在线播放| 8848成人影院| 日韩一区二区免费在线电影| 午夜影院免费版| 精品一区视频| 日韩亚洲欧美一区二区三区| 亚洲一区二区图片| 午夜视频一区二区在线观看| 欧美一区二区三区在线看 | 国产一区二区久久| 成人久久一区二区| 国产精品女人久久久| 久久精品国产精品亚洲精品| 国产日韩欧美自拍| 国产一区二区在线视频观看| 精彩视频一区二区| 91在线观看免费网站| av在线亚洲天堂| 国产成人免费在线视频| 丁香五月网久久综合| 欧美 中文字幕| 91视频免费播放| 欧美一区二区高清在线观看| av在线三区| 亚洲私人影院在线观看| 日本久久久网站| 亚洲欧美se| 欧美日韩精品一区二区三区蜜桃| 999久久久精品视频| 日韩精品一区二区三区中文字幕 | 国产高清成人久久| 久久最新网址| 久久躁狠狠躁夜夜爽| 日本aⅴ在线观看| 亚洲人成在线影院| 国产精品爱啪在线线免费观看| 伊人网站在线观看| 国产精品资源在线看| 91av一区二区三区| 男人的天堂在线| 亚洲色图欧美在线| 国产乱子伦农村叉叉叉| 成人午夜亚洲| 亚洲аv电影天堂网| 一区二区伦理片| 欧美激情成人在线| 日韩av免费在线| 99久久精品国产成人一区二区| 99精品欧美一区二区三区综合在线| 日韩欧美99| 青春草视频在线观看| 色欧美88888久久久久久影院| 成人av毛片在线观看| 国产精品天天看天天狠| 中文国产成人精品久久一| 久久久久久天堂| 热久久国产精品| 国产精品手机在线| av网页在线| 精品久久久久久久久久久久| 一级做a免费视频| 日韩激情毛片| 久久99精品国产99久久6尤物| 99re国产在线| 成人av综合在线| 黄色免费高清视频| 欧美特大特白屁股xxxx| 欧美成人a视频| 网站永久看片免费| 久久精品中文| 久久久久久九九| 日本aa在线| 91精品婷婷国产综合久久性色| 在哪里可以看毛片| 国产精品一卡| 国产免费一区二区三区| 爆操欧美美女| 欧美高清视频在线高清观看mv色露露十八 | 国产精品一区专区| 正在播放一区二区三区| 777午夜精品电影免费看| 亚洲精品suv精品一区二区| 欧美做爰爽爽爽爽爽爽| 久久精品国产**网站演员| 久久综合中文色婷婷| 福利小视频在线| 精品久久人人做人人爱| 色婷婷在线视频观看| 免费看欧美女人艹b| 欧美亚洲一级二级| 亚洲综合电影| 国产网站欧美日韩免费精品在线观看| 国产性猛交普通话对白| 国产精品一级黄| 第九区2中文字幕| 美国十次综合久久| 欧美精品一区二区三区国产精品| 国产www免费观看| 一区二区成人在线| 在线成人精品视频| 欧美国产先锋| 肥熟一91porny丨九色丨| 天堂av中文在线| 亚洲成人黄色在线| 日韩 欧美 综合| 91美女视频网站| 女人另类性混交zo| 国产在视频线精品视频www666| 国产激情综合五月久久| 欧洲成人av| 欧美影院精品一区| 精品国产视频在线观看| 国产麻豆一精品一av一免费| 男人天堂手机在线视频| 欧美美女黄色| 国产精品偷伦免费视频观看的| 欧美激情视频在线播放| 日韩一区二区高清| 久艹视频在线观看| 99麻豆久久久国产精品免费优播| 男人天堂网视频| jvid福利在线一区二区| 91精品久久久久久久久中文字幕 | 一级特黄大欧美久久久| 在线免费看黄色片| 久久性色av| 丰满女人性猛交| 国内自拍欧美| 国产精品久久久久av| 米奇777四色精品人人爽| 日韩欧美中文字幕一区| 日韩美女一级片| 国产欧美日本一区二区三区| 一级黄色片在线免费观看| 亚洲性图久久| 神马影院一区二区| 99久久人爽人人添人人澡| 欧美综合第一页| 国产美女在线观看| 亚洲国产日韩欧美综合久久| 无码人妻av免费一区二区三区 | 成人三级伦理片| 激情综合网俺也去| 亚洲色图欧美| 欧美理论一区二区| 欧洲一区在线| 国产成人综合亚洲| 日本片在线观看| 色老头一区二区三区| 国产91免费在线观看| 欧美性xxxxx极品少妇| 久久香蕉精品视频| 国产精品嫩草99a| a级一a一级在线观看| 老司机精品视频一区二区三区| 黄网站欧美内射| 91精品在线观看国产| 欧美日产一区二区三区在线观看| 精品国产亚洲一区二区三区| 国产91精品网站| 第四色日韩影片| 久久伊人免费视频| 91在线播放网站| 亚洲热线99精品视频| 男人天堂一区二区| 欧美一区二区三区精品| 国产偷人爽久久久久久老妇app| 亚洲成人福利片| 极品久久久久久| 中文字幕欧美一| 欧美激情 一区| 久久人人超碰精品| 中国极品少妇videossexhd| 国精产品一区一区三区mba桃花 | 国产经典欧美精品| 国产一伦一伦一伦| 日日噜噜夜夜狠狠视频欧美人 | 成人av观看| 久久免费视频网| 色呦呦呦在线观看| 久久亚洲成人精品| 黄色免费在线观看网站| 在线播放亚洲激情| 国产成人天天5g影院在线观看| 日韩国产高清视频在线| 手机看片国产1024| 亚洲第一国产精品| 亚洲爱爱综合网| 欧美成人video| 亚洲精品久久久久久无码色欲四季| 91精品国产一区二区人妖| 中文字幕在线网址| 欧美日韩在线观看一区二区| 成人免费一区二区三区| 91国偷自产一区二区开放时间| 日本a级c片免费看三区| 欧美体内谢she精2性欧美| 国产手机在线视频| 姬川优奈aav一区二区| 日本在线观看中文字幕| 亚洲国产成人av网| 亚洲一区欧美在线| 欧美视频在线观看免费网址| 欧美一二三区视频| 一本久道中文字幕精品亚洲嫩| 国产91精品一区| 色老头久久综合| 中文字幕在线2019| 777奇米四色成人影色区| 99热这里只有精品1| 日韩女优av电影在线观看| www香蕉视频| 亚洲福利视频二区| 日韩a在线观看| 国产一区二区三区直播精品电影 | 欧美大秀在线观看| 精灵使的剑舞无删减版在线观看| 久久久久久久久久久久久久久久久久av| 蜜臀av在线播放| 欧美最猛性xxxxx免费| 午夜无码国产理论在线| 国产综合久久久久| 91综合精品国产丝袜长腿久久| 国产在线播放一区二区| 美女少妇全过程你懂的久久| 视频在线99re| 国产精品豆花视频| 毛片一区二区三区四区| 美腿丝袜亚洲三区| av在线天堂网| 久久久影院官网| 性欧美疯狂猛交69hd| 午夜精品aaa| 中文字幕在线播放不卡| 欧美白人最猛性xxxxx69交| 日韩精品视频在线观看一区二区三区| 中文日韩在线视频| 激情图片在线观看高清国产| 日韩美女视频免费看| 国产精品久久久久久久久久辛辛| 精品不卡在线| 欧美电影一区| 缅甸午夜性猛交xxxx| 麻豆91在线看| 亚洲精品中文字幕在线播放| 国产精品欧美综合在线| 日本一二三区不卡| 欧美日本不卡视频| 先锋av资源站| 久久国产精品视频| 三级成人在线| 精品高清视频| 欧美激情1区| 国产三级国产精品国产专区50| 成人午夜视频在线观看| jizzjizz日本少妇| 午夜精品成人在线| 精品人妻少妇嫩草av无码专区 | 久久www免费人成精品| 久久大综合网| 久热免费在线观看| 成人教育av在线| 国产精品国产精品88| 在线一区二区视频| 欧日韩在线视频| 久久成人国产精品| www.久久.com| 欧美大香线蕉线伊人久久国产精品 | 潘金莲一级淫片aaaaa免费看| 午夜亚洲福利在线老司机| 久久综合桃花网| 国产精品私人影院| 在线观看 亚洲| 亚洲激情视频在线| 欧美大胆的人体xxxx| 成人在线小视频| 日本精品黄色| 三级在线视频观看| 久久久精品免费网站| 日产欧产va高清| 亚洲国产高清福利视频| 色呦呦在线播放| av一本久道久久波多野结衣| 国产高清久久| 天堂av在线8| 国产精品久久久久一区二区三区共| 中文字幕免费观看| 亚洲欧美日韩国产中文专区| 少妇视频在线观看| 久中文字幕一区| 一区二区精品| 精品人妻一区二区三区香蕉| 午夜视频一区二区| 天堂中文在线看| 7777精品视频| 蜜臀久久99精品久久一区二区| 中文字幕无码精品亚洲35| www.一区二区| 西西44rtwww国产精品| 亚洲精品成人久久久| 日韩伦理福利| 日本欧洲国产一区二区| 日韩激情中文字幕| 香蕉久久久久久久| 欧美高清视频不卡网| 黄色视屏免费在线观看| 亚洲最大的av网站| 伊人精品在线| 日本免费福利视频| 日本二三区不卡| 日本高清视频在线观看| 92看片淫黄大片欧美看国产片| 一区二区在线| 国产精品久久久久久久无码| 午夜精品福利视频网站| 美女欧美视频在线观看免费 | av动漫在线观看| 久久精品亚洲麻豆av一区二区| 国产成人av免费| 久久久999精品免费| 亚洲精品一区在线| 国产免费一区二区三区视频| 久久久不卡影院| 国产美女三级无套内谢| 欧美国产日韩在线| 综合亚洲自拍| 天天干天天爽天天射| 一区二区三区在线观看动漫| 无码精品在线观看| 国产精品老牛影院在线观看| 亚洲男女av一区二区| 国产精品一区二区在线免费观看| 欧美性猛交xxxx富婆| 老司机午夜在线视频| 国产日韩精品久久| 蜜桃在线一区二区三区| 久久久久亚洲av成人片| 亚洲女人天堂成人av在线| 97色婷婷成人综合在线观看| 亚洲人成无码网站久久99热国产 | 美女网站视频一区| 中国黄色录像片| 久久综合九色欧美综合狠狠| 亚洲一区中文字幕永久在线| 91国内精品久久| 99视频精品全国免费| 国产麻豆天美果冻无码视频 | 无码任你躁久久久久久老妇| 一本色道久久综合精品竹菊| av电影高清在线观看| 免费亚洲精品视频|