久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

springboot整合freemarker代碼自動生成器

瀏覽:2日期:2023-03-09 10:45:01
目錄手擼一個代碼自動生成器!!技術架構開發步驟:一、創建工程二、數據庫連接操作三、加載數據表信息創建配置接口Controller四、代碼生成五、測試手擼一個代碼自動生成器!!

實現功能:MyBatis 逆向工程

技術架構

頁面是用 Vue ,element-ui開發;網絡請求是 Axios。服務端是 Spring Boot頁面模版是 Freemarker:

springboot整合freemarker代碼自動生成器

開發步驟:一、創建工程

springboot整合freemarker代碼自動生成器

二、數據庫連接操作

1.所需包結構

springboot整合freemarker代碼自動生成器

2.在model包中創建Db類

作用:用于接受前端傳來數據庫連接相關的值(username,password,url)

package com.example.generate_code.model;/** * @author: 王澤 */public class Db { private String username; private String password; private String url; public String getUsername() {return username; } public void setUsername(String username) {this.username = username; } public String getPassword() {return password; } public void setPassword(String password) {this.password = password; } public String getUrl() {return url; } public void setUrl(String url) {this.url = url; }}

3.在model中創建RespBean類

自定義響應類,返回數據更方便

package com.example.generate_code.model;/** * @author: 王澤 */public class RespBean { private Integer status; private String msg; private Object obj; public static RespBean ok(String msg,Object obj) {return new RespBean(200, msg, obj); } public static RespBean ok(String msg) {return new RespBean(200, msg, null); } public static RespBean error(String msg,Object obj) {return new RespBean(500, msg, obj); } public static RespBean error(String msg) {return new RespBean(500, msg, null); } private RespBean() { } private RespBean(Integer status, String msg, Object obj) {this.status = status;this.msg = msg;this.obj = obj; } public Integer getStatus() {return status; } public void setStatus(Integer status) {this.status = status; } public String getMsg() {return msg; } public void setMsg(String msg) {this.msg = msg; } public Object getObj() {return obj; } public void setObj(Object obj) {this.obj = obj; }}

4.在Utils中創建DBUtils

JDBC連接工具類

public class DbUtils { private static Connection connection; public static Connection getConnection() {return connection; } public static Connection initDb(Db db) {if (connection == null) { try {Class.forName('com.mysql.cj.jdbc.Driver');connection = DriverManager.getConnection(db.getUrl(), db.getUsername(), db.getPassword()); } catch (ClassNotFoundException | SQLException e) {e.printStackTrace(); }}return connection; }}

5.寫一個連接接口DbController

連接數據庫

@RestControllerpublic class DbController { @PostMapping('/connect') public RespBean connect(@RequestBody Db db) {Connection con = DBUtils.initDb(db);if (con != null) { return RespBean.ok('數據庫連接成功');}return RespBean.error('數據庫連接失敗'); }}

6.創建index頁面

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>代碼生成工具</title> <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script> <!-- 引入樣式 --> <link rel='stylesheet' > <!-- 引入組件庫 --> <script src='https://unpkg.com/element-ui/lib/index.js'></script> <script src='https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'></script></head><body><div id='app'> <table><tr> <td><el-tag size='mini'>數據庫用戶名:</el-tag> </td> <td><el-input size='mini' v-model='db.username'></el-input> </td></tr><tr> <td><el-tag size='mini'>數據庫密碼:</el-tag> </td> <td><el-input size='mini' v-model='db.password'></el-input> </td></tr><tr> <td><el-tag size='mini'>數據庫連接地址:</el-tag> </td> <td><el-input size='mini' v-model='db.url'> <template slot='prepend'>jdbc:mysql://</template> <template slot='append'>?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai </template></el-input> </td></tr> </table> <div style='display: flex'><el-button type='primary' size='mini' @click='connect' :disabled='!connectBtnEnabled'>連接數據庫</el-button><div style='color: #ff018d;font-weight: bold'>[{{msg}}]</div><el-input v-model='packageName' size='mini' style='width: 300px'></el-input><el-button type='primary' size='mini' @click='config'>配置</el-button> </div></div><script> new Vue({el: '#app',data: function () { return {packageName: ’’,msg: ’數據庫未連接’,connectBtnEnabled: true,db: { username: 'root', password: '123456', url: 'localhost:3306/'} }},methods: { connect() {let _this = this;this.db.url = 'jdbc:mysql://' + this.db.url + '?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai';axios.post(’/connect’, this.db) .then(function (response) {_this.msg = response.data.msg;_this.db = { username: 'root', password: '123456', url: 'localhost:3306/'}_this.connectBtnEnabled = false; }) .catch(function (error) {console.log(error); }); }} })</script></body></html>

springboot整合freemarker代碼自動生成器

三、加載數據表信息

1.服務器端編寫

ColumnClass 用來描述表中的每一列

package com.example.generate_code.model;/** * @author: 王澤 */public class ColumnClass { private String propertyName; //對應java屬性的名字 private String columnName; //數據庫中的名字 private String type;//字段類型 private String remark; //備注 private Boolean isPrimary; //字段是不是一個主鍵 @Override public String toString() {return 'ColumnClass{' +'propertyName=’' + propertyName + ’’’ +', columnName=’' + columnName + ’’’ +', type=’' + type + ’’’ +', remark=’' + remark + ’’’ +', isPrimary=' + isPrimary +’}’; } public String getPropertyName() {return propertyName; } public void setPropertyName(String propertyName) {this.propertyName = propertyName; } public String getColumnName() {return columnName; } public void setColumnName(String columnName) {this.columnName = columnName; } public String getType() {return type; } public void setType(String type) {this.type = type; } public String getRemark() {return remark; } public void setRemark(String remark) {this.remark = remark; } public Boolean getPrimary() {return isPrimary; } public void setPrimary(Boolean primary) {isPrimary = primary; }}

描述一個具體的表的信息 TableClass

package com.example.generate_code.model;import java.util.List;/** * @author: 王澤 */public class TableClass { private String tableName; //表名 ,以下是生成的名字 private String modelName; private String serviceName; private String mapperName; private String controllerName; private String packageName; private List<ColumnClass> columns; // 字段 @Override public String toString() {return 'TableClass{' +'tableName=’' + tableName + ’’’ +', modelName=’' + modelName + ’’’ +', serviceName=’' + serviceName + ’’’ +', mapperName=’' + mapperName + ’’’ +', controllerName=’' + controllerName + ’’’ +', packageName=’' + packageName + ’’’ +', columns=' + columns +’}’; } public String getTableName() {return tableName; } public void setTableName(String tableName) {this.tableName = tableName; } public String getModelName() {return modelName; } public void setModelName(String modelName) {this.modelName = modelName; } public String getServiceName() {return serviceName; } public void setServiceName(String serviceName) {this.serviceName = serviceName; } public String getMapperName() {return mapperName; } public void setMapperName(String mapperName) {this.mapperName = mapperName; } public String getControllerName() {return controllerName; } public void setControllerName(String controllerName) {this.controllerName = controllerName; } public String getPackageName() {return packageName; } public void setPackageName(String packageName) {this.packageName = packageName; } public List<ColumnClass> getColumns() {return columns; } public void setColumns(List<ColumnClass> columns) {this.columns = columns; }}創建配置接口Controller

用map來接受前端傳來的數據

用到了谷歌提供的工具包guava,需要導入依賴

@PostMapping('/config') public RespBean config(@RequestBody Map<String, String> map) {String packageName = map.get('packageName');try { Connection connection = DBUtils.getConnection(); DatabaseMetaData metaData = connection.getMetaData(); ResultSet tables = metaData.getTables(connection.getCatalog(), null, null, null); List<TableClass> tableClassList = new ArrayList<>(); while (tables.next()) {TableClass tableClass = new TableClass();tableClass.setPackageName(packageName);String table_name = tables.getString('TABLE_NAME');String modelName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, table_name);tableClass.setTableName(table_name);tableClass.setModelName(modelName);tableClass.setControllerName(modelName + 'Controller');tableClass.setMapperName(modelName + 'Mapper');tableClass.setServiceName(modelName+'Service');tableClassList.add(tableClass); } return RespBean.ok('數據庫信息讀取成功', tableClassList);} catch (Exception e) { e.printStackTrace();}return RespBean.error('數據庫信息讀取失敗'); }

<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1-jre</version></dependency>

2.完善index頁面

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>代碼生成工具</title> <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script> <!-- 引入樣式 --> <link rel='stylesheet' > <!-- 引入組件庫 --> <script src='https://unpkg.com/element-ui/lib/index.js'></script> <script src='https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'></script></head><body><div id='app'> <table><tr> <td><el-tag size='mini'>數據庫用戶名:</el-tag> </td> <td><el-input size='mini' v-model='db.username'></el-input> </td></tr><tr> <td><el-tag size='mini'>數據庫密碼:</el-tag> </td> <td><el-input size='mini' v-model='db.password'></el-input> </td></tr><tr> <td><el-tag size='mini'>數據庫連接地址:</el-tag> </td> <td><el-input size='mini' v-model='db.url'> <template slot='prepend'>jdbc:mysql://</template> <template slot='append'>?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai </template></el-input> </td></tr> </table> <div style='display: flex'><el-button type='primary' size='mini' @click='connect' :disabled='!connectBtnEnabled'>連接數據庫</el-button><div style='color: #ff018d;font-weight: bold'>[{{msg}}]</div><el-input v-model='packageName' size='mini' style='width: 300px'></el-input><el-button type='primary' size='mini' @click='config'>配置</el-button> </div> <el-table :data='tableData' stripe border style='width: 100%'><el-table-columnprop='tableName'label='表名稱'width='180'></el-table-column><el-table-columnlabel='實體類名稱'width='180'> <template slot-scope='scope'><el-input v-model='scope.row.modelName'></el-input> </template></el-table-column><el-table-columnlabel='Mapper名稱'> <template slot-scope='scope'><el-input v-model='scope.row.mapperName'></el-input> </template></el-table-column><el-table-columnlabel='Service名稱'> <template slot-scope='scope'><el-input v-model='scope.row.serviceName'></el-input> </template></el-table-column><el-table-columnlabel='Controller名稱'> <template slot-scope='scope'><el-input v-model='scope.row.controllerName'></el-input> </template></el-table-column> </el-table> <div><el-button @click='generateCode' type='success'>生成代碼</el-button><div style='color: #ff0114;font-weight: bold'>*{{result}}*</div><div>{{codePath}}</div> </div></div><script> new Vue({el: '#app',data: function () { return {tableData: [],packageName: ’com.wangze.test’,msg: ’數據庫未連接’,connectBtnEnabled: true,db: { username: 'root', password: '123456', url: 'localhost:3306/'} }},methods: { generateCode() {let _this = this;axios.post(’/generateCode’, this.tableData) .then(function (response) {_this.result = response.data.msg;_this.codePath = response.data.obj; }) .catch(function (error) { }); }, config() {let _this = this;axios.post(’/config’, {packageName: this.packageName}) .then(function (response) {_this.msg = response.data.msg;_this.tableData = response.data.obj; }) .catch(function (error) {console.log(error); }); }, connect() {let _this = this;this.db.url = 'jdbc:mysql://' + this.db.url + '?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai';axios.post(’/connect’, this.db) .then(function (response) {_this.msg = response.data.msg;_this.db = { username: 'root', password: '123456', url: 'localhost:3306/'}_this.connectBtnEnabled = false; }) .catch(function (error) {console.log(error); }); }} })</script></body></html>

springboot整合freemarker代碼自動生成器

四、代碼生成

1.創建模板 Model.java.ftl

package ${packageName}.model;import java.util.Date;public class ${modelName}{ <#if columns??><#list columns as column> <#if column.type=’VARCHAR’||column.type=’TEXT’||column.type=’CHAR’>/*** ${column.remark}*/private String ${column.propertyName?uncap_first}; </#if> <#if column.type=’INT’>/*** ${column.remark}*/private Integer ${column.propertyName?uncap_first}; </#if> <#if column.type=’DATETIME’>/*** ${column.remark}*/private Date ${column.propertyName?uncap_first}; </#if> <#if column.type=’BIGINT’>/*** ${column.remark}*/private Long ${column.propertyName?uncap_first}; </#if> <#if column.type=’DOUBLE’>/*** ${column.remark}*/private Double ${column.propertyName?uncap_first}; </#if> <#if column.type=’BIT’>/*** ${column.remark}*/private Boolean ${column.propertyName?uncap_first}; </#if></#list> </#if> <#if columns??><#list columns as column> <#if column.type=’VARCHAR’||column.type=’TEXT’||column.type=’CHAR’>public String get${column.propertyName}(){ return ${column.propertyName?uncap_first};}public void set${column.propertyName}(String ${column.propertyName?uncap_first}){ this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};} </#if> <#if column.type=’INT’>public Integer get${column.propertyName}(){return ${column.propertyName?uncap_first};}public void set${column.propertyName}(Integer ${column.propertyName?uncap_first}){this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};} </#if> <#if column.type=’DATETIME’>public Date get${column.propertyName}(){return ${column.propertyName?uncap_first};}public void set${column.propertyName}(Date ${column.propertyName?uncap_first}){this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};} </#if> <#if column.type=’BIGINT’>public Long get${column.propertyName}(){return ${column.propertyName?uncap_first};}public void set${column.propertyName}(Long ${column.propertyName?uncap_first}){this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};} </#if> <#if column.type=’DOUBLE’>public Double get${column.propertyName}(){return ${column.propertyName?uncap_first};}public void set${column.propertyName}(Double ${column.propertyName?uncap_first}){this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};} </#if> <#if column.type=’BIT’>public Boolean get${column.propertyName}(){return ${column.propertyName?uncap_first};}public void set${column.propertyName}(Boolean ${column.propertyName?uncap_first}){this.${column.propertyName?uncap_first}=${column.propertyName?uncap_first};} </#if></#list> </#if>}

Service.java.ftl

package ${packageName}.service;import ${packageName}.model.${modelName};import ${packageName}.mapper.${mapperName};import org.springframework.stereotype.Service;import org.springframework.beans.factory.annotation.Autowired;import java.util.List;@Servicepublic class ${serviceName}{ @Autowired ${mapperName} ${mapperName?uncap_first}; public List<${modelName}> getAll${modelName}s(){return ${mapperName?uncap_first}.getAll${modelName}s(); }}

Controller.java.ftl

package ${packageName}.controller;import ${packageName}.model.${modelName};import ${packageName}.service.${serviceName};import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.bind.annotation.GetMapping;import java.util.List;@RestControllerpublic class ${controllerName}{ @Autowired ${serviceName} ${serviceName?uncap_first}; @GetMapping('/${modelName?lower_case}s') public List<${modelName}> getAll${modelName}s(){return ${serviceName?uncap_first}.getAll${modelName}s(); }}

Mapper.java.ftl

package ${packageName}.mapper;import ${packageName}.model.${modelName};import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapperpublic interface ${mapperName}{ List<${modelName}> getAll${modelName}s();}

Mapper.xml.ftl

<!DOCTYPE mapperPUBLIC '-//mybatis.org//DTD Mapper 3.0//EN''http://mybatis.org/dtd/mybatis-3-mapper.dtd'><mapper namespace='${packageName}.mapper.${mapperName}'> <resultMap type='${packageName}.model.${modelName}'><#list columns as column> <<#if column.primary??>id<#else>result</#if> column='${column.columnName}' property='${column.propertyName?uncap_first}' jdbcType='<#if column.type=’INT’>INTEGER<#elseif column.type=’DATETIME’>TIMESTAMP<#elseif column.type=’TEXT’>VARCHAR<#else>${column.type}</#if>' /></#list> </resultMap> <select resultMap='BaseResultMap'>select * from ${tableName}; </select></mapper>

2.代碼生成Controller

package com.example.generate_code.controller;import com.example.generate_code.model.RespBean;import com.example.generate_code.model.TableClass;import com.example.generate_code.service.GenerateCodeService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;import java.util.List;@RestControllerpublic class GenerateCodeController { @Autowired GenerateCodeService generateCodeService; @PostMapping('/generateCode') public RespBean generateCode(@RequestBody List<TableClass> tableClassList, HttpServletRequest req) {return generateCodeService.generateCode(tableClassList, req.getServletContext().getRealPath('/')); }}

3.編寫service

package com.example.generate_code.service;import com.example.generate_code.model.ColumnClass;import com.example.generate_code.model.RespBean;import com.example.generate_code.model.TableClass;import com.example.generate_code.utils.DBUtils;import com.google.common.base.CaseFormat;import freemarker.cache.ClassTemplateLoader;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;import org.springframework.stereotype.Service;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;@Servicepublic class GenerateCodeService { Configuration cfg = null; {cfg = new Configuration(Configuration.VERSION_2_3_30);cfg.setTemplateLoader(new ClassTemplateLoader(GenerateCodeService.class, '/templates'));cfg.setDefaultEncoding('UTF-8'); } public RespBean generateCode(List<TableClass> tableClassList, String realPath) {try { Template modelTemplate = cfg.getTemplate('Model.java.ftl'); Template mapperJavaTemplate = cfg.getTemplate('Mapper.java.ftl'); Template mapperXmlTemplate = cfg.getTemplate('Mapper.xml.ftl'); Template serviceTemplate = cfg.getTemplate('Service.java.ftl'); Template controllerTemplate = cfg.getTemplate('Controller.java.ftl'); Connection connection = DBUtils.getConnection(); DatabaseMetaData metaData = connection.getMetaData(); for (TableClass tableClass : tableClassList) {ResultSet columns = metaData.getColumns(connection.getCatalog(), null, tableClass.getTableName(), null);ResultSet primaryKeys = metaData.getPrimaryKeys(connection.getCatalog(), null, tableClass.getTableName());List<ColumnClass> columnClassList = new ArrayList<>();while (columns.next()) { String column_name = columns.getString('COLUMN_NAME'); String type_name = columns.getString('TYPE_NAME'); String remarks = columns.getString('REMARKS'); ColumnClass columnClass = new ColumnClass(); columnClass.setRemark(remarks); columnClass.setColumnName(column_name); columnClass.setType(type_name); columnClass.setPropertyName(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, column_name)); primaryKeys.first(); while (primaryKeys.next()) {String pkName = primaryKeys.getString('COLUMN_NAME');if (column_name.equals(pkName)) { columnClass.setPrimary(true);} } columnClassList.add(columnClass);}tableClass.setColumns(columnClassList);String path = realPath + '/' + tableClass.getPackageName().replace('.', '/');generate(modelTemplate, tableClass, path + '/model/');generate(mapperJavaTemplate, tableClass, path + '/mapper/');generate(mapperXmlTemplate, tableClass, path + '/mapper/');generate(serviceTemplate, tableClass, path + '/service/');generate(controllerTemplate, tableClass, path + '/controller/'); } return RespBean.ok('代碼已生成', realPath);} catch (Exception e) { e.printStackTrace();}return RespBean.error('代碼生成失敗'); } private void generate(Template template, TableClass tableClass, String path) throws IOException, TemplateException {File folder = new File(path);if (!folder.exists()) { folder.mkdirs();}String fileName = path + '/' + tableClass.getModelName() + template.getName().replace('.ftl', '').replace('Model', '');FileOutputStream fos = new FileOutputStream(fileName);OutputStreamWriter out = new OutputStreamWriter(fos);template.process(tableClass,out);fos.close();out.close(); }}五、測試

springboot整合freemarker代碼自動生成器

springboot整合freemarker代碼自動生成器

這時候已經找到了,我們來驗證一下效果!

springboot整合freemarker代碼自動生成器

修改寫配置

spring.datasource.name=rootspring.datasource.password=123456spring.datasource.url=jdbc:mysql://localhost:3306/boot_crm?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

pom.xml

<resources> <resource><directory>src/main/java</directory><includes> <include>**/*.xml</include></includes> </resource> <resource><directory>src/main/resources</directory> </resource></resources>

導入生成的代碼

springboot整合freemarker代碼自動生成器

運行測試

一個基本的mybatis逆向工程就完成了!

最后附上項目源代碼:Gitee

到此這篇關于springboot整合freemarker代碼自動生成器的文章就介紹到這了,更多相關springboot 代碼自動生成器內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 日韩视频免费在线 | 在线小视频 | 国产99久久 | 久久亚洲一区二区 | 成年人免费在线视频 | 亚洲国产一区二区三区在线观看 | 亚洲男人天堂2023 | 国产精品成人在线观看 | 日韩精品在线观看一区 | 精品三级三级三级三级三级 | 欧美日韩在线精品 | 亚洲一一在线 | 日本在线免费 | 大胸av | 国产成人综合av | 天天干狠狠干 | 久久久天天 | 亚洲大尺度视频 | 精品九九久久 | 国产超碰人人爽人人做人人爱 | 日韩一区二区在线观看 | 中国1级黄色片 | 亚洲人人舔人人 | 久久久久久国产精品mv | 亚洲www啪成人一区二区 | 亚洲视频中文字幕 | 亚洲精品久久久久久久久久久 | 日韩久草 | 欧美日韩视频网站 | 夜本色| 国产婷婷在线观看 | 欧美性一区 | 亚洲三区电影 | 韩国精品在线 | 亚洲精品大片 | 中文字幕一区二区三区乱码图片 | 亚洲精品视频一区二区三区 | 欧美成人一区二区 | 亚洲一区二区视频在线播放 | 日本免费在线视频 | www.久久久.com| 久久一区二区精品 | 91免费观看 | 中文字幕日韩欧美 | 亚洲免费在线播放 | 亚洲成人在线观看视频 | 国产日韩欧美 | 久久免费视频观看 | 欧美日韩一区二区在线观看 | www.嫩草| 美日韩一区二区 | 中文字幕在线一区 | 国产99久| 色偷偷888欧美精品久久久 | 黄色片免费在线观看视频 | 亚洲精品日韩综合观看成人91 | 韩日一区| 亚洲午夜精品片久久www慈禧 | 毛片视频播放 | 九九99九九| 国产精品九九九 | 日本亚洲精品一区二区三区 | 黄色电影天堂 | 久久日本视频 | 国产韩国精品一区二区三区 | 久久久av一区| 久久成人在线 | 91大神xh98hx在线播放 | 日本a网 | 国产精品一区二区三区免费 | 欧美视频免费在线 | 毛片激情永久免费 | 中文字幕日韩欧美一区二区三区 | 成人1区| 国产91富婆养生按摩会所 | av电影中文字幕在线观看 | 色橹橹欧美在线观看视频高清 | 日韩视频中文字幕 | 激情在线观看视频 | 亚洲一区二区在线 | 久久久性色精品国产免费观看 | 91免费版在线看 | 国产日韩欧美 | 久久久久久国产精品 | 福利精品视频 | 国产一区二区精品在线观看 | 亚洲成人高清 | 国产精品1页 | 国内自拍视频在线观看 | 欧美一区久久 | 国产精品毛片一区二区 | 久久成人午夜 | 一区二区三区在线观看视频 | 欧美性www | 日韩电影三级 | 久久久久黄 | 狠狠综合久久 | 水卜樱一区二区av | 精品视频一区二区三区 | 一区二区三区在线播放视频 | 丁香婷婷久久久综合精品国产 | 一区二区三区日韩 | 中文字幕视频在线 | 日本精品一区二区三区视频 | 无码日韩精品一区二区免费 | 亚洲一区免费视频 | 日韩中文字幕一区二区高清99 | 九九精品视频在线 | 免费成人av网 | 欧美男人的天堂 | 黄色高清视频 | 久久精品a级毛片 | 日韩精品一区在线视频 | 午夜精品久久久久久久99黑人 | 色综合久 | 免费不卡视频 | 亚洲精品视频免费 | 国产精品色在线网站 | 国产不卡免费视频 | 欧美在线不卡 | 日韩污视频在线观看 | 美国一级黄色片 | 大象视频成人在线观看 | 91精品久久久久久久久中文字幕 | 亚洲美乳中文字幕 | 成人欧美一区二区三区视频xxx | 91精品一区二区三区久久久久久 | 亚洲国产精品一区二区久久 | 日韩和的一区二在线 | 黄色片网站| 国产亚洲精品久久久闺蜜 | 亚洲免费视频在线 | aaaaaaa片毛片免费观看 | 国产欧美一区二区三区在线看 | 欧美在线播放一区二区三区 | 操操日 | 久久综合九色综合欧美狠狠 | 欧美日韩在线看 | 日韩精品久久久 | 色婷婷久久久swag精品 | 国产成人精品免费 | 在线中文字幕av | 国产第一页在线播放 | 99资源| 国产亚洲一区二区三区在线观看 | 成人爽a毛片一区二区免费 亚洲自拍偷拍精品 | 色九九 | 国产一区二区精品在线 | 欧美夜夜骑 | 久久综合99re88久久爱 | 国产精品一区二区久久 | 自拍偷拍精品 | 日韩视频中文字幕 | 羞羞的视频在线 | 精品亚洲永久免费精品 | 久久久毛片| 欧美精品三区 | 求av网址| 国产精品一二三区 | 亚洲在线免费观看 | 国产一区二区三区免费看 | 一区二区三区在线 | 欧 | 免费av一区二区三区 | 久久久一区二区 | 国产高清视频在线 | 中文字幕亚洲欧美日韩在线不卡 | 99久久精品免费 | 黄色高清视频在线观看 | 日韩欧美在线播放 | 久久成人国产视频 | 日韩在线视频中文字幕 | 999久久久久久久久 国产欧美在线观看 | 国产一区在线观看视频 | 一级在线观看视频 | 欧美日韩亚洲一区二区 | 国产综合久久 | 自拍小电影 | 国产精品久久久久久久久久久久冷 | 夜夜操av| 国产欧美综合一区二区三区 | 偷拍自拍网站 | 日日操夜夜操免费视频 | 日韩视频在线视频 | 久久一| 国产精品久久久久影院色老大 | 欧美日韩综合在线 | 六月丁香啪啪 | 国产三级精品三级 | 成人水多啪啪片 | 久久精品免费一区二区三区 | 国产精品久久久久久吹潮 | 国产精品久久久久婷婷二区次 | 久久高清| 欧美一区二区三区在线视频 | 久久国产高清 | 亚洲精品视频在线播放 | 久久手机在线视频 | 欧美性一区二区三区 | 一级高清视频 | 999国内精品永久免费视频 | 日韩免费一区 | 久久草视频 | 国产偷国产偷精品高清尤物 | 国产女人爽到高潮免费视频 | 亚洲成人免费电影 | 日韩欧美在线一区二区 | 狠狠操一区二区三区 | 日本在线播放 | 亚洲精品成人在线 | 三区免费视频 | 国产精品久久久久一区二区三区共 | 久草视频在线播放 | 日韩欧美二区 | 五月婷婷狠狠爱 | 色偷偷888欧美精品久久久 | 国产精品国产精品国产专区不卡 | 久久亚洲精品国产精品紫薇 | 亚洲精品成人悠悠色影视 | 国产亚洲精品久久久久久久 | 日韩在线亚洲 | 国产精品1区2区3区 欧美 中文字幕 | 日韩理伦片在线观看视频播放 | 天天干,夜夜操 | 久久亚洲国产精品 | 日韩日韩日韩日韩日韩日韩日韩 | 午夜精品视频 | 国产一区亚洲二区三区 | 精品九九九 | 欧美日韩高清在线一区 | 精品无码久久久久国产 | 久久久久久综合 | 欧洲精品久久久 | 91精品国产高清久久久久久久久 | 国产日产精品一区二区三区四区 | 久久亚| 大象一区 | 天天色天天看 | 免费黄色小视频 | 久久永久视频 | 欧美日韩在线一区 | 久久av在线| 免费中文字幕 | 日韩av成人 | 久久综合久久综合久久 | 久久久久久久久99精品 | 成人免费视频网站在线观看 | 国产成人精品午夜视频免费 | 日韩在线一区二区三区 | 一区二区三区四区视频 | 成人av影片在线观看 | 成人亚洲欧美 | 日日夜夜天天 | 男女全黄一级一级高潮免费看 | 欧美一级在线观看视频 | 免费黄色av | 国产精品视频一区二区三区不卡 | 一区二区免费播放 | 毛片网 | 欧美日韩精品久久久久 | 一二三区不卡视频 | 精品国产一区二区在线 | 国产成人一区二区 | 午夜视频在线免费观看 | 91九色视频国产 | 嫩草网站在线观看 | 欧美激情小视频 | 亚洲一区二区免费看 | 欧美日韩视频 | 免费毛片网 | 亚洲免费网 | 欧美国产日韩在线 | 国产精品免费在线 | 日日久| 国产婷婷精品av在线 | 国产精品一区二区av | 欧美xxxx在线 | 久久天堂电影 | 一区二区视频 | 精品在线看 | 国产一区二区欧美 | 欧美在线小视频 | 日韩欧美视频 | 成人在线免费视频 | 亚洲伊人久久网 | 一级特黄| 欧美国产日韩一区 | 在线观看成人 | 一区日韩 | 国内久久精品 | 久久久久亚洲av毛片大全 | 色久在线 | 国产成人精品免费 | 国产一区视频网站 | 国产成人在线网站 | 国产在线一区二区三区 | 日韩91视频 | 日本涩涩网站 | 欧美日韩一区二区视频在线观看 | 黄色一级片看看 | 中文字幕高清av | 粉嫩国产精品一区二区在线观看 | 高清一区二区 | 亚洲欧洲精品在线 | 日韩欧美一区二区视频 | 欧美日韩高清在线一区 | 男人天堂av网| 精品国产一区二区三区久久久 | 黄色高清视频 | 国产免费一区二区三区 | 视频精品一区 | 黄色一级视频 | 国产精品视频网 | 国产精品久久久久久久久久ktv | 精品视频免费在线 | 亚洲午夜精品一区二区三区他趣 | 欧美精品成人一区二区三区四区 | 午夜成人在线视频 | 亚洲毛片网站 | 欧美精品一二三 | 成人av播放 | 亚洲一区二区免费在线观看 | 天天干夜夜骑 | 精品影院| 亚洲视频中文字幕 | 伊人国产在线 | 久久久久久久 | 亚洲啊v在线| 黄片毛片一级 | 一级片网| 天天干天天添 | 亚洲福利小视频 | 亚洲欧美激情视频 | 黄色国产在线看 | 日韩在线中文字幕视频 | 亚洲精品一区二区三区在线看 | 日韩有码在线观看 | 欧美在线观看黄 | 亚洲欧洲日本国产 | 国产精品美女久久久久久免费 | 极品久久 | 成人欧美一区二区三区黑人孕妇 | 久在线| 99精品免费视频 | 欧美日韩视频一区二区 | 免费av一区二区三区 | 一区二区国产精品 | 欧洲亚洲精品久久久久 | 一级欧美| 国产精品国产a级 | 天天干天天爽 | 国产日韩欧美一二三区 | 国产一极毛片 | 欧美成人精品一区二区三区 | 久草.com | 免费视频爱爱太爽了 | 亚洲精选免费视频 | 日本一区二区三区免费观看 | 国内精品视频一区二区三区八戒 | 2020国产在线 | 在线看国产 | 2012中文版免费观看 | 99久久日韩精品视频免费在线观看 | 超碰在线看 | 可以免费看黄视频的网站 | 精品国产31久久久久久 | 91久久精品国产亚洲a∨麻豆 | 999精品在线| a久久久| 青青久久久 | 日韩在线永久免费播放 | 亚洲欧美高清 | 亚洲一区二区三区免费视频 | 91亚洲狠狠婷婷综合久久久 | 一区视频在线 | 国产视频精品自拍 | 久久二区三区 | 久久久2o19精品 | jav成人av免费播放 | 99精品久久久国产一区二区三 | 好姑娘影视在线观看高清 | 欧美不卡一区二区三区 | 亚洲成年人网站在线观看 | 亚洲一区二区三区高清 | 欧美成年黄网站色视频 | 精品久久中文字幕 | 日韩av高清在线 | 久久精品99 | 国产在线网 | 午夜色电影 | 男女羞羞网站 | 亚洲免费视频大全 | 欧美精品1区 | 日韩三及片 | 亚洲一区视频在线播放 | 91在线观看网站 | 亚洲第一免费视频网站 | 亚洲视频一区二区三区四区 | 玖玖玖视频 | 女同理伦片在线观看禁男之园 | 在线不卡一区 | 四虎永久在线观看 | 蜜桃视频麻豆女神沈芯语免费观看 | 2020国产在线 | 欧美成人一区二区三区片免费 | 老牛嫩草一区二区三区眼镜 | 国产亚洲欧美精品永久 | av网站观看 | 精品国产黄色片 | 狠狠伊人 | 国产视频成人 | 国产精品久热 | 一级毛片网 | 国产精品亚洲第一 | 91精品国产综合久久福利软件 | 日本视频一区二区三区 | 黄色小视频在线观看 | yiren22综合网成人 | 色婷婷av一区二区三区大白胸 | 成人久久久久久久 | 人妖天堂狠狠ts人妖天堂狠狠 | 免费观看亚洲 | 99视频在线| 九九热免费看 | 国产精品美女久久久久久久网站 | 成人一区视频 | 人人爽在线观看 | 亚洲a网 | 久久这里有精品视频 | 欧洲一区二区三区 | 国产偷国产偷精品高清尤物 | 太子妃好紧皇上好爽h | 成人无遮挡毛片免费看 | 97精品视频在线 | 激情网站免费观看 | 日本色道视频 | aaa级片| 午夜精品久久久久久久久 | www久久99 | 国产一二在线 | 国产激情午夜 | 国精产品一区二区三区黑人免费看 | 亚洲精品久久久久国产 | 国产精品a一区二区三区网址 | 欧美一区二区 | 在线91| 国家aaa的一级看片 操操操夜夜操 | 成年人性视频 | 精品国产不卡一区二区三区 | 日韩中文字幕一区 | 久久在线播放 | 欧美人体一区二区三区 | 久久不射电影网 | 国产精品毛片久久久久久 | 一区二区日韩 | 欧美一区二区三区精品 | 91影院| 日本理论片好看理论片 | 99pao成人国产永久免费视频 | 国产另类ts人妖一区二区 | 性欧美久久久 | aaaaaa毛片| 91免费视频观看 | 91免费在线视频 | 欧美成人激情视频 | 日韩欧美二区 | 亚洲97| 日本福利网站 | 日一日干一干 | 欧美极品视频 | 精品国产91 | 国产精品美女av | 成人av播放| 亚洲人免费视频 | 成人午夜精品久久久久久久蜜臀 | 国产高潮在线观看 | 国产精品成人3p一区二区三区 | 欧美日韩在线一区二区 | 欧美日韩精品一区二区三区在线观看 | 久久综合一区二区 | 久久久久久久久久毛片 | 狠狠搞狠狠干 | 成人免费毛片高清视频 | 亚洲一区二区免费在线观看 | 精品国产乱码久久久久久1区2区 | 成人超碰在线 | 中文字幕一二三区 | 日韩精品成人 | 91久久久www播放日本观看 | 久久精av| 中文字幕99| 国产亚洲精品美女久久久久久久久久 | 色婷婷在线视频 | 亚洲一区二区三区在线 | 日韩久久午夜一级啪啪 | 日韩国产 | 最新日韩视频 | 黄在线看v | 成人亚洲精品 | 国产精品自产av一区二区三区 | 久久视频免费 | 黄色毛片在线看 | 成人一区二区三区 | 亚洲精品视频在线观看免费 | 狠狠操综合网 | 爱啪导航一精品导航站 | 欧美成人一区二区三区片免费 | 国产高清免费视频 | 日本人做爰大片免费观看一老师 | 国产精品国产成人国产三级 | 亚洲精品色 | 国产精品乱码一区二区三区 | 99热69 | 精品久久中文字幕 | 第一色在线 | 久久精品高清 | 日韩在线不卡 | 在线观看国产高清视频 | 中文字幕 在线观看 | 91成人免费看 | 男女深夜视频 | 精品一区二区三区视频 | 亚洲小视频网站 | 一区二区三区免费在线观看 | 日韩视频一区 | 亚洲精品一区在线观看 | 欧美午夜精品久久久久久浪潮 | 成人久久久精品国产乱码一区二区 | 亚洲福利 | 精品国产一区二区三区不卡蜜臂 | 日韩成人在线免费视频 | 三a毛片| 国产精品视频播放 | 成人影视网| 国产精品久久久久久福利一牛影视 | 亚洲 欧美日韩 国产 中文 | 毛片a片 | 亚洲网站色 | 国产精品日日夜夜 | 精品欧美乱码久久久久久 | 亚洲综合色自拍一区 | 日韩中文在线观看 | 国内精品视频一区二区三区 | 操人网 | 国产三级精品在线 | 欧美日韩视频第一页 | 久久精品国产免费 | 99国产精品99久久久久久 | 国产中文在线 | 福利网址| 成人免费一区二区三区视频软件 | 久久久综合视频 | 久久久高清 | 综合二区| 蜜桃av一区二区三区 | 成人精品在线 | 91精品国产综合久久久久久丝袜 | 在线视频亚洲 | 欧美另类一二三四 | 午夜av毛片| 国产精品久久久久久久久久三级 | 欧美日韩视频在线观看免费 | 精品一区二区三区四区 | 亚洲成人av | 久久久久久久一区 | 亚洲精品18 | 国产精品久久久久久久福利院 | 高清国产一区二区三区 | 国产成人在线视频 | 免费一级 国产 | 欧洲亚洲精品久久久久 | 欧美一区二区三区精品 | 天天干天天操天天爽 | 亚洲欧洲一区二区 | 91中文字幕在线观看 | 噜噜噜噜噜在线视频 | 91精品国产91久久久久久吃药 | 成人午夜视频在线 | 精品国产91乱码一区二区三区 | 性欧美大战久久久久久久免费观看 | 6080yy午夜一二三区久久 | 天天操综| 午夜男人网 | 国产成人久久 | 国产男女视频在线观看 | 国产精品美女视频一区二区三区 | 一区二区三区国产 | 亚洲网站在线观看 | 国产在线观看91一区二区三区 | 精品欧美一区二区三区久久久 | 午夜三级在线 | 蜜臀91精品国产高清在线观看 | 中文字幕乱码亚洲精品一区 | 中文字幕在线观看视频一区 | yy6080久久伦理一区二区 | 国产在线精品视频 | 很黄很污的网站 | 亚洲青涩在线 | 国产女爽123视频.cno | 国产噜噜噜噜噜久久久久久久久 | 色婷婷网 | 欧美一级视频在线观看 | 在线亚洲一区二区 | 日本精品二区 | 精品成人av| 日韩超级大片免费看国产国产播放器 | 久久国产精品影视 | 亚洲视频中文字幕 | 欧美综合一区二区三区 | 黄色网亚洲 | √8天堂资源地址中文在线 成人欧美一区二区三区白人 | 91九色视频在线 | 中文字幕亚洲精品 | 色婷婷综合网 | 日韩在线字幕 | 精品视频在线免费观看 |