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

IDEA工程右鍵菜單,自動(dòng)生成 ORM碼

開(kāi)發(fā) 前端
在建設(shè)一個(gè)好的產(chǎn)品功能時(shí),盡可能要學(xué)學(xué)那些已經(jīng)非常的優(yōu)秀的產(chǎn)品,IDEA、GitHub、Mysql等等,在IDEA提供了滿(mǎn)足用戶(hù)擴(kuò)展功能的插件開(kāi)發(fā),而不是你說(shuō)一個(gè)東西我沒(méi)有,你就自己造。共建會(huì)讓這個(gè)東西變得更加優(yōu)秀!

[[439202]]

本文轉(zhuǎn)載自微信公眾號(hào)「bugstack蟲(chóng)洞棧」,作者小傅哥。轉(zhuǎn)載本文請(qǐng)聯(lián)系bugstack蟲(chóng)洞棧公眾號(hào)。

一、前言

都能用,都能湊活用!

一個(gè)東西好幾套,為了晉升都來(lái)搞。拿了成績(jī)就要跑,后面兄弟再重造!

幾年前,大家并不是這樣,那時(shí)候還有很多東西可以創(chuàng)新,亂世出英雄總能在一個(gè)方向深耕并做出一款款好用的產(chǎn)品功能、框架服務(wù)、技術(shù)組件等。但后來(lái)好像這樣的情況開(kāi)始減少了,取而代之的是重復(fù)、復(fù)刻、照搬,換個(gè)新的皮膚、換個(gè)新的樣式、換個(gè)新的名字,就是取巧的新東西了。

有時(shí)候公司或者組織也像家,但家里的東西一般是破了補(bǔ)補(bǔ)、壞了修修,實(shí)在不行就換個(gè),但沒(méi)有誰(shuí)的家里衛(wèi)生間一個(gè)馬桶、廚房一個(gè)馬桶、客廳一個(gè)馬桶、臥室一個(gè)馬桶的,雖然你的新馬桶可以自動(dòng)噴水。

所以,在建設(shè)一個(gè)好的產(chǎn)品功能時(shí),盡可能要學(xué)學(xué)那些已經(jīng)非常的優(yōu)秀的產(chǎn)品,IDEA、GitHub、Mysql等等,在IDEA提供了滿(mǎn)足用戶(hù)擴(kuò)展功能的插件開(kāi)發(fā),而不是你說(shuō)一個(gè)東西我沒(méi)有,你就自己造。共建會(huì)讓這個(gè)東西變得更加優(yōu)秀!

二、需求目的

在上一章節(jié)中我們通過(guò)擴(kuò)展創(chuàng)建工程向?qū)В砑游覀冃枰獎(jiǎng)?chuàng)建DDD工程腳手架的步驟,最終提供一個(gè)DDD開(kāi)發(fā)框架。那么在這個(gè)DDD工程開(kāi)發(fā)框架中,還缺少一部分基于數(shù)據(jù)庫(kù)表信息自動(dòng)生成對(duì)應(yīng)PO、DAO、Mapper文件的功能。

那么本章節(jié)我們就來(lái)在工程中擴(kuò)展這部分內(nèi)容,實(shí)際操作的效果就是我們可以在工程上通過(guò)鼠標(biāo)右鍵的方式,喚出添加ORM代碼塊的窗體,通過(guò)選擇庫(kù)表的方式,使用 freemarker 自動(dòng)生成代碼。

在生成的代碼塊中需要完成對(duì)所需要包的引入,同時(shí)會(huì)使用到 lombok 注解的方式替代PO對(duì)象中的get、set方法,以減少代碼量邏輯的創(chuàng)建。

三、案例開(kāi)發(fā)

1. 工程結(jié)構(gòu)

  1. guide-idea-plugin-orm 
  2. ├── .gradle 
  3. └── src 
  4.     ├── main 
  5.     │   └── java 
  6.     │    └── cn.bugstack.guide.idea.plugin  
  7.     │        ├── action 
  8.     │        │   └── CodeGenerateAction.java       
  9.     │        ├── domain 
  10.     │        │   ├── model.vo  
  11.     │        │   │   ├── CodeGenContextVO.java        
  12.     │        │   │   └── ORMConfigVO.java        
  13.     │        │   └── service    
  14.     │        │     ├── impl      
  15.     │        │     │   └── ProjectGeneratorImpl.java   
  16.     │        │     ├── AbstractProjectGenerator.java      
  17.     │        │     ├── GeneratorConfig.java       
  18.     │        │     └── IProjectGenerator.java       
  19.     │        ├── infrastructure 
  20.     │        │   ├── data     
  21.     │        │   │   ├── DataSetting.java        
  22.     │        │   │   └── DataState.java       
  23.     │        │   ├── po     
  24.     │        │   │   ├── Base.java     
  25.     │        │   │   ├── Column.java  
  26.     │        │   │   ├── Dao.java  
  27.     │        │   │   ├── Field.java  
  28.     │        │   │   ├── Model.java      
  29.     │        │   │   └── Table.java        
  30.     │        │   └── utils  
  31.     │        │       ├── DBHelper.java      
  32.     │        │       └── JavaType.java       
  33.     │        ├── module   
  34.     │        │   └── FileChooserComponent.java          
  35.     │        └── ui 
  36.     │            ├── ORMSettingsUI.java   
  37.     │            └── ORMSettingsUI.form 
  38.     ├── resources 
  39.     │   ├── META-INF 
  40.     │   │   └── plugin.xml  
  41.     │   └── template 
  42.     │       ├── dao.ftl 
  43.     │       ├── mapper.ftl 
  44.     │       └── model.ftl 
  45.     ├── build.gradle   
  46.     └── gradle.properties 

在此 IDEA 插件工程中,主要分為5塊區(qū)域:

  • action:用于提供菜單欄,這個(gè)菜單的位置在 plugin.xml 中配置,我們把它配置到工程鼠標(biāo)右鍵出現(xiàn)的列表上。這樣可以更加方便的讓我們選取工程,以及在這個(gè)工程下添加生成的代碼片段
  • domain:領(lǐng)域服務(wù)層,其實(shí)你直接寫(xiě)一個(gè)Service包也是可以的,只不過(guò)最近作者小傅哥更喜歡使用DDD的思想和結(jié)構(gòu)來(lái)創(chuàng)建代碼實(shí)現(xiàn)功能邏輯。
  • infrastructure:基礎(chǔ)層,提供數(shù)據(jù)在工程下的存放,每一個(gè)工程右鍵都有自己的配置存儲(chǔ)默認(rèn)信息,方便下次打開(kāi)的時(shí)候可以讀取到這部分內(nèi)容。同時(shí)這一層還提供了用于處理數(shù)據(jù)庫(kù)操作的類(lèi),因?yàn)槲覀冃枰獜臄?shù)據(jù)庫(kù)中讀取出表的信息、字段、注釋?zhuān)糜趧?chuàng)建PO、DAO、Mapper使用。
  • module:模塊層,這里提供了一個(gè)用于選擇文件路徑的組件,可以讓我們?cè)诠こ躺鲜髽?biāo)右鍵后出來(lái)的窗體中,點(diǎn)擊模塊選擇對(duì)應(yīng)的要生成代碼的位置路徑。
  • ui:提供配置面板,也就是我們?cè)诖a工程上鼠標(biāo)右鍵彈出來(lái)的面板,這個(gè)面板配置后用于生成ORM代碼。

2. 拖拽Swing面板

ORMSettingsUI:咱們先把用于創(chuàng)建代碼配置的面板創(chuàng)建出來(lái),有了畫(huà)面,就好進(jìn)入了。

  • 面板包括生成 PO、DAO、XML 的代碼路徑,以及配置數(shù)據(jù)庫(kù)和選擇表的內(nèi)容。
  • 操作過(guò)程就是在你配置好了這些基本信息后,就可以選擇查詢(xún)表名,并選擇好你要給哪幾個(gè)表生成對(duì)應(yīng)的ORM代碼了。

3. 配置鼠標(biāo)右鍵彈窗

首先我們需要?jiǎng)?chuàng)建一個(gè) Action 實(shí)現(xiàn)類(lèi),通過(guò) New -> Plugin DevKit -> Action

cn.bugstack.guide.idea.plugin.action.CodeGenerateAction

  1. /** 
  2.  * @author: 小傅哥,微信:fustack 
  3.  * @github: https://github.com/fuzhengwei 
  4.  * @Copyright: 公眾號(hào):bugstack蟲(chóng)洞棧 | 博客:https://bugstack.cn - 沉淀、分享、成長(zhǎng),讓自己和他人都能有所收獲! 
  5.  */ 
  6. public class CodeGenerateAction extends AnAction { 
  7.  
  8.     private IProjectGenerator projectGenerator = new ProjectGeneratorImpl(); 
  9.  
  10.     @Override 
  11.     public void actionPerformed(AnActionEvent e) { 
  12.         Project project = e.getRequiredData(CommonDataKeys.PROJECT); 
  13.         ShowSettingsUtil.getInstance().editConfigurable(project, new ORMSettingsUI(project, projectGenerator)); 
  14.     } 
  15.  
  • 這是一個(gè)右鍵菜單的入口,通過(guò)這個(gè)入口才能去打開(kāi)我們自己的UI窗體,這個(gè)UI窗體就是我們上面拖拽出來(lái)的配置面板,ORMSettingsUI
  • 接下來(lái)我們還需要把這個(gè) Action 配置到 plugin.xml 文件中,才能被右鍵菜單創(chuàng)建出來(lái)。開(kāi)發(fā)代碼的時(shí)候也是這樣一個(gè)流程,你總要從一個(gè)點(diǎn)開(kāi)始,有了抓手才好抓下去

plugin.xml 配置

  1. <actions> 
  2.     <!-- Add your actions here --> 
  3.     <action id="CodeGenerateAction" class="cn.bugstack.guide.idea.plugin.action.CodeGenerateAction" 
  4.             text="ORMCodeGenerate - 小傅哥" description="Code Generate ORM" icon="/icons/logo.png"
  5.         <add-to-group group-id="ProjectViewPopupMenu" anchor="last"/> 
  6.     </action
  7. </actions> 
  8. ea-plugin> 
  • 把我們的 Action 實(shí)現(xiàn)類(lèi)配置到 xml 中,同時(shí)你還要配置它應(yīng)該出現(xiàn)的位置,比如你需要把這個(gè)菜單添加到工程創(chuàng)建中 ProjectViewPopupMenu 以及位置信息 anchor="last"
  • 另外為了讓插件看上去更加高大上還美觀(guān)適合吹牛,那么還需要配置 icon,這個(gè)位置配置一個(gè)16*16的圖片,圖片可以從 iconfont 進(jìn)行下載。

4. 給窗體添加功能

這一步其實(shí)干的就是注入靈魂的事情,讓窗體活起來(lái)。給輸入框添加內(nèi)容、給按鈕添加事件、給確認(rèn)按鈕增加上生成創(chuàng)建ORM代碼塊的上下文。文章的描述盡可能會(huì)偏向于核心代碼的講解,詳情可以參考源碼

接下來(lái)這部分內(nèi)容會(huì)在 ORMSettingsUI 類(lèi)中反復(fù)摩擦,直到補(bǔ)全所有功能。

4.1 選擇框事件

  1. // 選擇PO生成目錄 
  2. this.poButton.addActionListener(e -> { 
  3.     FileChooserComponent component = FileChooserComponent.getInstance(project); 
  4.     VirtualFile baseDir = project.getBaseDir(); 
  5.     VirtualFile virtualFile = component.showFolderSelectionDialog("選擇PO生成目錄", baseDir, baseDir); 
  6.     if (null != virtualFile) { 
  7.         ORMSettingsUI.this.poPath.setText(virtualFile.getPath()); 
  8.     } 
  9. }); 

還記得我們提到的拖拽Swing面板嗎,那么這個(gè)添加事件的步驟就是給你的 PO 目錄添加一個(gè)事件,允許我們可以自己選擇出要把對(duì)應(yīng)PO的代碼生成到哪個(gè)目錄結(jié)構(gòu)下。

關(guān)于dao、xml都是類(lèi)似操作,這里就不在演示了。

4.2 數(shù)據(jù)表事件

  1. this.selectButton.addActionListener(e -> { 
  2.     try { 
  3.         DBHelper dbHelper = new DBHelper(this.host.getText(), Integer.parseInt(this.port.getText()), this.user.getText(), this.password.getText(), this.database.getText()); 
  4.         List<String> tableList = dbHelper.getAllTableName(this.database.getText()); 
  5.         String[] title = {"""表名"}; 
  6.         Object[][] data = new Object[tableList.size()][2]; 
  7.         for (int i = 0; i < tableList.size(); i++) { 
  8.             data[i][1] = tableList.get(i); 
  9.         } 
  10.         table1.setModel(new DefaultTableModel(data, title)); 
  11.         TableColumn tc = table1.getColumnModel().getColumn(0); 
  12.         tc.setCellEditor(new DefaultCellEditor(new JCheckBox())); 
  13.         tc.setCellEditor(table1.getDefaultEditor(Boolean.class)); 
  14.         tc.setCellRenderer(table1.getDefaultRenderer(Boolean.class)); 
  15.         tc.setMaxWidth(100); 
  16.     } catch (Exception exception) { 
  17.         Messages.showWarningDialog(project, "數(shù)據(jù)庫(kù)連接錯(cuò)誤,請(qǐng)檢查配置.""Warning"); 
  18.     } 
  19. }); 
  • 這一步操作核心流程就在于把你需要生成ORM的代碼的表給拉出來(lái),只要把表選擇上,才能根據(jù)表生成PO、DAO、Mapper,其實(shí)你用的其他一些自動(dòng)生成代碼框架也是這么干的。
  • 另外你的建表最好規(guī)范,比如有表注釋、有字段注釋、字段的設(shè)計(jì)遵守下劃線(xiàn)和小寫(xiě)字母,這樣會(huì)更加容易創(chuàng)建出好看的代碼。

4.3 組裝生成代碼上下文

當(dāng)我們點(diǎn)擊配置窗體的 OK 按鈕時(shí)候,要干啥,對(duì)嘍,我們要?jiǎng)?chuàng)建出代碼片段了,那么這個(gè)時(shí)候需要在重寫(xiě)的 apply 中完成此項(xiàng)操作。

  1. public void apply() { 
  2.     // 鏈接DB 
  3.     DBHelper dbHelper = new DBHelper(config.getHost(), Integer.parseInt(config.getPort()), config.getUser(), config.getPassword(), config.getDatabase()); 
  4.      
  5.     // 組裝代碼生產(chǎn)上下文 
  6.     CodeGenContextVO codeGenContext = new CodeGenContextVO(); 
  7.     codeGenContext.setModelPackage(config.getPoPath() + "/po/"); 
  8.     codeGenContext.setDaoPackage(config.getDaoPath() + "/dao/"); 
  9.     codeGenContext.setMapperDir(config.getXmlPath() + "/mapper/"); 
  10.     List<Table> tables = new ArrayList<>(); 
  11.     Set<String> tableNames = config.getTableNames(); 
  12.     for (String tableName : tableNames) { 
  13.         tables.add(dbHelper.getTable(tableName)); 
  14.     } 
  15.     codeGenContext.setTables(tables); 
  16.      
  17.     // 生成代碼 
  18.     projectGenerator.generation(project, codeGenContext); 
  • 在 apply 中的核心代碼主要就是使用 DBHelper 數(shù)據(jù)操作工具獲取到對(duì)應(yīng)的庫(kù)下鏈接信息,同時(shí)把選擇的號(hào)的表創(chuàng)建出用于生成代碼類(lèi)的參數(shù),比如;類(lèi)的名稱(chēng)、字段名稱(chēng)、注釋名稱(chēng)等。
  • 最后就是調(diào)用生成代碼的服務(wù)了,projectGenerator.generation(project, codeGenContext); 這一部分就是在我們領(lǐng)域服務(wù) domain 中實(shí)現(xiàn)的。

5. 代碼生成領(lǐng)域服務(wù)

用于創(chuàng)建PO、DAO、Mapper的代碼塊的代碼主要是這里實(shí)現(xiàn)的,核心在于提供了一個(gè)抽象類(lèi)以及對(duì)應(yīng)的實(shí)現(xiàn)類(lèi),因?yàn)樘幚泶a生成需要使用到 freemarker 所以就在抽象類(lèi)里包裝了下,這樣可以免去實(shí)現(xiàn)類(lèi)中還需要關(guān)心這部分邏輯。

ProjectGeneratorImpl 生成代碼

  1. @Override 
  2. protected void generateORM(Project project, CodeGenContextVO codeGenContext) { 
  3.     List<Table> tables = codeGenContext.getTables(); 
  4.     for (Table table : tables) { 
  5.         List<Column> columns = table.getColumns(); 
  6.         List<Field> fields = new ArrayList<>(); 
  7.         for (Column column : columns) { 
  8.             Field field = new Field(column.getComment(), JavaType.convertType(column.getType()), column.getName()); 
  9.             field.setId(column.isId()); 
  10.             fields.add(field); 
  11.         } 
  12.         // 生成PO 
  13.         Model model = new Model(table.getComment(), codeGenContext.getModelPackage() + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, table.getName()), table.getName(), fields); 
  14.         writeFile(project, codeGenContext.getModelPackage(), model.getSimpleName() + ".java""domain/orm/model.ftl", model); 
  15.          
  16.         // 生成DAO 
  17.         Dao dao = new Dao(table.getComment(), codeGenContext.getDaoPackage() + "I" + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, table.getName()) + "Dao", model); 
  18.         writeFile(project, codeGenContext.getDaoPackage(), dao.getSimpleName() + ".java""domain/orm/dao.ftl", dao); 
  19.          
  20.         // 生成Mapper 
  21.         writeFile(project, codeGenContext.getMapperDir(), dao.getModel().getSimpleName() + "Mapper.xml""domain/orm/mapper.ftl", dao); 
  22.     } 
  • 創(chuàng)建代碼的過(guò)程就比較簡(jiǎn)單了,通過(guò)循環(huán)提取出來(lái)的表信息,映射成對(duì)應(yīng)的類(lèi)和屬性以及注釋?zhuān)偈褂?resources 下的 ftl 文件創(chuàng)建出對(duì)應(yīng)的類(lèi)和xml配置文件就可以了。
  • 如果你還需要生成起來(lái)代碼片段或者創(chuàng)建調(diào)用一些常用的組件,也是可以通過(guò)這樣的方式進(jìn)行實(shí)現(xiàn)的。

四、測(cè)試驗(yàn)證

點(diǎn)擊 Plugin 啟動(dòng) IDEA 插件,之后在工程右鍵如下:

1. 鼠標(biāo)右鍵,選擇菜單

2. 配置頁(yè)面,配置信息

3. 自動(dòng)創(chuàng)建,生成代碼

好了,選擇代碼塊就這么嗖的創(chuàng)建了出來(lái),是不是非常方便,而且可以滿(mǎn)足你在任何時(shí)候的把新的庫(kù)表代碼補(bǔ)充進(jìn)來(lái),減少了手敲CRUD操作。

五、總結(jié)

本章節(jié)小傅哥帶著你又在 IDEA DDD 插件生成工程的結(jié)構(gòu)下,又完善了一步生成ORM代碼,當(dāng)然你也可以在創(chuàng)建工程向?qū)е刑砑由蒓RM代碼的步驟。而在工程下創(chuàng)建ORM的方式可以當(dāng)做是對(duì)腳手架工程的補(bǔ)充,滿(mǎn)足不同場(chǎng)景下的需求。

此外在 IDEA 插件開(kāi)發(fā)的系列內(nèi)容中我們是不斷的嘗試使用新的方式完善不同的功能點(diǎn),如果你需要開(kāi)發(fā)一個(gè)完整的插件那么可以結(jié)合這些功能一起來(lái)開(kāi)發(fā)你的需求。

插件開(kāi)發(fā)中還是有很多的內(nèi)容需要了解和學(xué)習(xí)的,同時(shí)也要注意一些代碼實(shí)現(xiàn)細(xì)節(jié),例如我們本章節(jié)中的數(shù)據(jù)保存是在一個(gè)什么維度,是IDEA開(kāi)發(fā)工具維度,還是在IDEA中的工程維度,這些是有區(qū)別。比如你的不同工程,是不需要保存同一份配置的

 

 

責(zé)任編輯:武曉燕 來(lái)源: bugstack蟲(chóng)洞棧
相關(guān)推薦

2011-02-23 09:29:29

Konqueror

2010-07-29 13:18:45

Flex右鍵菜單

2021-11-01 05:39:18

Windows 11操作系統(tǒng)微軟

2009-07-23 13:35:33

Ruby on Rai

2022-05-18 07:44:13

自定義菜單前端

2009-12-24 10:04:31

WPF右鍵菜單

2021-07-21 05:31:39

Windows 11操作系統(tǒng)微軟

2009-08-18 11:17:37

C#添加鼠標(biāo)右鍵

2011-04-21 15:22:27

ArcGIS Engi

2010-07-29 13:27:13

Flex右鍵菜單

2021-01-21 12:04:05

Windows 10UI界面微軟

2009-08-18 09:03:19

Windows 7磁盤(pán)碎片整理

2021-07-20 15:13:39

Windows 11操作系統(tǒng)微軟

2021-11-04 05:37:09

Windows 11操作系統(tǒng)微軟

2011-09-06 10:00:19

Vista右鍵菜單

2011-07-25 14:49:36

jQuery

2021-11-15 22:43:40

Windows 11操作系統(tǒng)微軟

2015-10-14 11:11:06

右鍵菜單build 10565Windows 10

2010-08-02 09:18:39

ASP.NET MVC

2021-11-03 12:37:23

微軟補(bǔ)丁Windows 11
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

av一级亚洲| 野外性满足hd| gogogogo高清视频在线| 国产成人免费视频网站| 91精品国产高清久久久久久91 | 欧美刺激午夜性久久久久久久| 日本中文字幕在线视频观看| 成人亚洲性情网站www在线观看| 久久99精品久久久久| 久久久最新网址| 人妻少妇无码精品视频区| 国产亚洲精aa在线看| 欧美日韩午夜剧场| 不卡中文字幕在线| 十九岁完整版在线观看好看云免费| 日韩电影在线免费| 久久久久久伊人| 国产精品夜夜夜爽阿娇| 麻豆一区二区| 91精品国产综合久久精品图片| 阿v天堂2017| 成人黄色网址| 国产精品素人视频| 久久久av水蜜桃| 精品国产av鲁一鲁一区| 日韩av电影免费观看高清完整版| 久久久久久国产精品美女| 懂色av蜜臀av粉嫩av永久| 午夜精品福利影院| 亚洲白虎美女被爆操| www.午夜av| 国产精品麻豆成人av电影艾秋| 午夜视频在线观看一区二区三区| 亚洲小视频在线播放| 香蕉视频免费在线播放| 久久久高清一区二区三区| 国产精品免费观看高清| 国产sm主人调教女m视频| 美女视频黄 久久| 国产精品成人免费电影| 国产中文字幕视频| 国产精品入口| 97超级碰在线看视频免费在线看| 久久久久久久久久久久国产| 综合久久一区| 欧美刺激性大交免费视频| 男女全黄做爰文章| 久久在线视频免费观看| 永久免费精品影视网站| 少妇av片在线观看| 日韩精品第一区| 国产一区二区三区在线观看视频| 久久av无码精品人妻系列试探| 日韩av黄色在线| 亚洲精品国产精品国自产在线| 人妻 日韩 欧美 综合 制服| 国产精品qvod| 亚洲黄色免费三级| 免费无码一区二区三区| 天堂av一区二区三区在线播放 | 在线免费精品视频| 欧美日韩在线观看不卡| 欧美视频在线视频精品| 欧美精品久久久久久久多人混战 | 在线观看亚洲国产| 奇米一区二区三区av| 国产精自产拍久久久久久| 国产又粗又猛又黄| 国产精品资源站在线| 国产富婆一区二区三区 | 中文字幕亚洲欧美一区二区三区 | 亚洲图片欧美视频| 国精产品一区一区三区视频| 超碰在线99| 91福利国产精品| 亚洲午夜精品一区| 97人人澡人人爽91综合色| 亚洲国产精品福利| 男人操女人动态图| 亚洲激情中文| 久久久久久久久久久久久久久久久久av | 国产福利成人在线| 一级做a爱片久久毛片| 国产成人免费在线观看不卡| 精品在线视频一区二区| 日本网站在线免费观看视频| 麻豆视频在线看| 午夜久久久影院| 成人在线看视频| 四虎视频在线精品免费网址| 日韩欧美精品三级| www.自拍偷拍| 久久久久av| 2019亚洲日韩新视频| 中文字幕乱码视频| 懂色av中文字幕一区二区三区| 久久综合九九| 久久黄色美女电影| 午夜电影一区二区| 一道本在线免费视频| 国产精品流白浆在线观看| 国产亚洲欧洲黄色| 免费在线一级片| 丝袜脚交一区二区| 99超碰麻豆| 欧美丰满熟妇bbb久久久| 久久狠狠久久| 日韩在线欧美在线| 日本中文字幕免费观看| 老司机免费视频一区二区三区| 成人动漫在线视频| av免费在线一区二区三区| 亚洲国产视频直播| 亚洲欧美国产中文| 综合国产视频| 久久久天堂国产精品女人| 在线观看免费黄色小视频| 91免费精品国自产拍在线不卡| 日本精品免费视频| 国产极品一区| 亚洲欧洲xxxx| 成人精品免费在线观看| 国产成人av一区二区三区在线观看| 日韩欧美99| 在线天堂资源| 亚洲精品在线免费播放| 最新一区二区三区| 麻豆传媒一区二区三区| 欧美不卡福利| 日韩激情电影免费看| 精品国产一区二区三区不卡| 国产老头老太做爰视频| 麻豆成人久久精品二区三区小说| 欧美精品二区三区四区免费看视频| 日韩精品亚洲人成在线观看| 69久久99精品久久久久婷婷| 91香蕉国产视频| 日产国产高清一区二区三区| 欧美日韩三区四区| 精品国产第一福利网站| 日韩黄色av网站| 91国产丝袜播放在线| 成人av在线资源网| 2018国产在线| 日韩母乳在线| 人人澡人人澡人人看欧美| 手机av免费在线观看| 亚洲第一搞黄网站| 日本少妇xxxx| 国产日韩高清一区二区三区在线| 国产乱码精品一区二区三区不卡| 色呦呦在线播放| 亚洲视频国产精品| 日韩av网站在线观看| 久久精品日韩精品| 91www在线| 日韩av网址在线观看| 日韩精品视频免费播放| 成人四虎影院| 亚洲人在线观看| 日韩精品一区二区亚洲av观看| 久久久精品国产99久久精品芒果 | 国产偷人妻精品一区| 亚洲精品影视| 日本成人黄色免费看| 成人国产精品| 欧美老女人在线视频| 免费观看黄色一级视频| 日韩欧美视频一区二区三区| x88av在线| 激情综合网最新| 人人妻人人澡人人爽欧美一区| 123成人网| 色吧影院999| 亚洲国产福利视频| 色呦呦日韩精品| 国产精品免费人成网站酒店| 丰满白嫩尤物一区二区| 春日野结衣av| 国产精品二区不卡| 国产亚洲精品久久飘花| 超薄肉色丝袜脚交一区二区| 久久成人18免费网站| 天堂а√在线8种子蜜桃视频| 91国偷自产一区二区三区观看 | 国自产拍偷拍福利精品免费一| 精品午夜一区二区三区| 狠狠久久伊人中文字幕| 国内成人精品一区| 自拍视频在线网| 亚洲大胆美女视频| 在线亚洲欧美日韩| 亚洲国产精品视频| 免费黄色在线网址| 成人免费高清在线| 视频在线观看免费高清| 亚洲另类自拍| 女人床在线观看| 欧美色图在线播放| 精品毛片久久久久久| 粉嫩av国产一区二区三区| 55夜色66夜色国产精品视频| 国产婷婷视频在线| 国产亚洲精品久久久久久| 亚洲精品久久久久久久久久| 欧美伊人久久大香线蕉综合69| 国产亚洲小视频| 国产精品第13页| 9.1成人看片免费版| 国产98色在线|日韩| 国产喷水theporn| 国产一级一区二区| 国产中文字幕乱人伦在线观看| 久久精品播放| 欧美二区三区| 久久精品色播| av资源站久久亚洲| 96视频在线观看欧美| 奇米成人av国产一区二区三区| 日本高清在线观看视频| 日韩在线资源网| 国产有码在线| 亚洲男人天堂久| 天堂网在线资源| 精品久久久久久久人人人人传媒 | 日韩黄色在线免费观看| 免费av一级片| 精品国产电影一区二区| 99热这里精品| 91精品免费观看| 91av久久久| 欧美日韩www| 中文字幕在线日亚洲9| 欧美影院精品一区| 色婷婷久久综合中文久久蜜桃av| 色av成人天堂桃色av| 国产成人无码av| 一本到一区二区三区| 69国产精品视频免费观看| 日韩欧美中文字幕在线观看 | 欧美日韩免费观看一区二区三区| 精人妻无码一区二区三区| 色综合天天天天做夜夜夜夜做| 国产污污视频在线观看| 欧美午夜精品久久久久久浪潮 | 欧美日韩精品久久久| 中文字幕一区二区人妻| 欧美色综合久久| 国产精品国产三级国产普通话对白| 欧美日韩一区二区三区在线| 亚洲系列在线观看| 欧美一区二区三区在线观看| 国产成人a人亚洲精品无码| 日韩欧美亚洲国产另类| 丰满岳乱妇国产精品一区| 精品国产乱码久久久久久夜甘婷婷| 国产福利视频导航| 亚洲电影免费观看高清| 少妇激情av一区二区| 国产一区二区三区在线看| 在线a免费看| 美日韩精品视频免费看| av不卡高清| 日韩免费观看视频| 日韩毛片网站| av日韩免费电影| 欧美激情影院| 特级西西444www大精品视频| 五月天久久久| 欧洲精品一区二区三区久久| 久久aⅴ乱码一区二区三区| av五月天在线| 国产精品资源网| 一本色道久久综合亚洲精品图片 | 久久精品一级片| 欧美色另类天堂2015| 亚洲天堂网在线视频| 精品欧美乱码久久久久久1区2区| 久久电影中文字幕| 不卡av电影在线观看| 久久久男人天堂| 国产日韩在线亚洲字幕中文| xxxxxhd亚洲人hd| 日韩av一级大片| 欧美精品一区二区三区久久久竹菊| 777久久久精品一区二区三区| 免费一级片91| 午夜免费福利影院| 国产喷白浆一区二区三区| 欧美毛片在线观看| 日本高清不卡一区| 蜜桃av噜噜一区二区三区麻豆| 亚洲人成电影网站色…| 在线免费观看的av| 国产精品高精视频免费| 国产日韩三级| 在线观看一区欧美| 麻豆精品91| aaa黄色大片| 中文字幕在线观看不卡视频| 免费在线观看黄网站| 欧美丰满一区二区免费视频| 日韩黄色影片| 久久久欧美一区二区| www.久久99| 日韩欧美一区二区视频在线播放| 激情另类综合| 爱豆国产剧免费观看大全剧苏畅| 91香蕉视频mp4| 欧美精品一区二区成人| 欧美日韩一区小说| 免费在线性爱视频| 国语自产精品视频在线看一大j8 | 91蜜桃网址入口| 久草视频免费在线播放| 欧美日韩国产色站一区二区三区| 欧美伦理影视网| 91国内在线视频| 亚洲视频国产精品| 在线观看18视频网站| 蜜臀av性久久久久蜜臀aⅴ | www.成人黄色| 国产精品色噜噜| 中文字幕高清在线免费播放| 亚洲国产精品免费| 国内老司机av在线| 7777奇米亚洲综合久久| 久久精品国内一区二区三区水蜜桃| 北条麻妃视频在线| 久久久久久久久久久久久久久99| 久久露脸国语精品国产91| 精品久久国产老人久久综合| av免费在线观看网站| 91精品久久久久久久久| 成人影院在线| 91精品无人成人www| 国产蜜臀av在线一区二区三区 | 日韩免费成人网| 性国产高清在线观看| 91免费在线观看网站| 欧美在线高清| 亚洲欧美日韩中文字幕在线观看| 亚洲免费三区一区二区| 国产片高清在线观看| 九九精品视频在线观看| 999久久久精品一区二区| 男人添女荫道口喷水视频| 成人激情视频网站| 亚州国产精品视频| 日韩成人在线观看| 日本免费一区二区三区四区| 秋霞久久久久久一区二区| 日本女优在线视频一区二区 | 亚洲成人免费电影| 无码精品人妻一区二区| 欧美自拍视频在线观看| 精品国产一区探花在线观看| 牛夜精品久久久久久久| 亚洲色图一区二区三区| 亚洲精品久久久久avwww潮水| 97福利一区二区| 国产一区二区三区电影在线观看| 国产视频手机在线播放| 1000精品久久久久久久久| 亚洲女同志亚洲女同女播放| 91av网站在线播放| 日本欧美视频| 日本少妇xxx| 欧美日韩一区二区免费在线观看| 黄色软件在线| 91久久久久久国产精品| 亚洲天堂偷拍| 制服 丝袜 综合 日韩 欧美| 欧美女孩性生活视频| 超碰中文在线| 无码免费一区二区三区免费播放| 极品美女销魂一区二区三区| 国产成人精品a视频一区| 国产一区二区精品丝袜| 国产一区二区三区精品在线观看| 亚洲 自拍 另类小说综合图区| 国产三级欧美三级日产三级99 | 久久免费激情视频| 日日骚久久av| 九色丨蝌蚪丨成人| 亚洲精品久久久久久宅男| 亚洲成人在线观看视频| 高清国产福利在线观看| 粉嫩av一区二区三区免费观看| 久久精品欧洲| 少妇影院在线观看| 国产亚洲精品一区二区| 6080成人| 狠狠干狠狠操视频| 黑人狂躁日本妞一区二区三区 | 97视频在线观看网站| 高清国产在线一区| 蜜桃视频第一区免费观看| 日韩欧美高清在线观看| 久久av中文字幕|