久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

springboot + mybatis + gradle项目构建过程

發(fā)布時(shí)間:2023/12/9 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot + mybatis + gradle项目构建过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.從Spring boot官網(wǎng)根據(jù)需求下載腳手架或者到GitHub上去搜索對(duì)應(yīng)的腳手架項(xiàng)目,D_iao ^0^

? 文件目錄如下(此處generatorConfig.xml 和 log4j2.xml文件請(qǐng)忽略,后續(xù)會(huì)講解)


?2.使用Mybatis代碼自動(dòng)構(gòu)建插件生成代碼

?? gradle 相關(guān)配置

// Mybatis 代碼自動(dòng)生成所引入的包 compile group: 'org.mybatis.generator', name: 'mybatis-generator-core', version: '1.3.3'// MyBatis代碼自動(dòng)生成插件工具 apply plugin: "com.arenagod.gradle.MybatisGenerator"configurations {mybatisGenerator }mybatisGenerator {verbose = true// 配置文件路徑configFile = 'src/main/resources/generatorConfig.xml' }

?? generatorConfig.xml配置詳解

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!--數(shù)據(jù)庫(kù)驅(qū)動(dòng)包路徑 --><classPathEntry<!--此驅(qū)動(dòng)包路徑可在項(xiàng)目的包庫(kù)中找到,復(fù)制過來即可-->location="C:\Users\pc\.gradle\caches\modules-2\files-2.1\mysql\mysql-connector-java\5.1.38\dbbd7cd309ce167ec8367de4e41c63c2c8593cc5\mysql-connector-java-5.1.38.jar"/><context id="mysql" targetRuntime="MyBatis3"><!--關(guān)閉注釋 --><commentGenerator><property name="suppressAllComments" value="true"/></commentGenerator><!--數(shù)據(jù)庫(kù)連接信息 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://127.0.0.1:3306/xxx" userId="root"password=""></jdbcConnection><!--生成的model 包路徑 ,其中rootClass為model的基類,配置之后他會(huì)自動(dòng)繼承該類作為基類,trimStrings會(huì)為model字串去空格--><javaModelGenerator targetPackage="com.springboot.mybatis.demo.model"targetProject="D:/self-code/spring-boot-mybatis/spring-boot-mybatis/src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/><property name="rootClass" value="com.springboot.mybatis.demo.model.common.BaseModel"/></javaModelGenerator><!--生成mapper xml文件路徑 --><sqlMapGenerator targetPackage="mapper"targetProject="D:/self-code/spring-boot-mybatis/spring-boot-mybatis/src/main/resources"><property name="enableSubPackages" value="true"/></sqlMapGenerator><!-- 生成的Mapper接口的路徑 --><javaClientGenerator type="XMLMAPPER"targetPackage="com.springboot.mybatis.demo.mapper" targetProject="D:/self-code/spring-boot-mybatis/spring-boot-mybatis/src/main/java"><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 對(duì)應(yīng)的表 這個(gè)是生成Mapper xml文件的基礎(chǔ),enableCountByExample如果為true則會(huì)在xml文件中生成樣例,過于累贅?biāo)圆灰?/span>--><table tableName="tb_user" domainObjectName="User"enableCountByExample="false"enableDeleteByExample="false"enableSelectByExample="false"enableUpdateByExample="false"></table></context></generatorConfiguration>

以上配置中注意targetProject路徑請(qǐng)?zhí)顚懡^對(duì)路徑,避免錯(cuò)誤,其中targetPackage是類所處的包路徑(確保包是存在的,否則無法生成),也就相當(dāng)于

?? 代碼生成

配置完成之后首先得在數(shù)據(jù)庫(kù)中新建對(duì)應(yīng)的表,然后確保數(shù)據(jù)庫(kù)能正常訪問,最后在終端執(zhí)行g(shù)radle mbGenerator或者點(diǎn)擊如下任務(wù)

成功之后它會(huì)生成model、mapper接口以及xml文件

?


?3.集成日志

? gradle 相關(guān)配置

compile group: 'org.springframework.boot', name: 'spring-boot-starter-log4j2', version: '1.4.0.RELEASE'// 排除沖突 configurations {mybatisGeneratorcompile.exclude module: 'spring-boot-starter-logging' }

當(dāng)沒有引入spring-boot-starter-log4j2包時(shí)會(huì)報(bào)錯(cuò):java.lang.IllegalStateException: Logback configuration error detected Logback 配置錯(cuò)誤聲明

原因參考鏈接;https://blog.csdn.net/blueheart20/article/details/78111350?locationNum=5&fps=1

解決方案:排除依賴 spring-boot-starter-logging

what???

排除依賴之后使用的時(shí)候又報(bào)錯(cuò):Failed to load class "org.slf4j.impl.StaticLoggerBinder" 加載slf4j.impl.StaticLoggerBinder類失敗

原因參考鏈接:https://blog.csdn.net/lwj_199011/article/details/51853110

解決方案:添加依賴 spring-boot-starter-log4j2 此包所依賴的包如下:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starters</artifactId><version>1.4.0.RELEASE</version></parent><artifactId>spring-boot-starter-log4j2</artifactId><name>Spring Boot Log4j 2 Starter</name><description>Starter for using Log4j2 for logging. An alternative tospring-boot-starter-logging</description><url>http://projects.spring.io/spring-boot/</url><organization><name>Pivotal Software, Inc.</name><url>http://www.spring.io</url></organization><properties><main.basedir>${basedir}/../..</main.basedir></properties><dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId></dependency></dependencies> </project>

它依賴了 log4j-slf4j-impl ,使用的是log4j2日志框架。

這里涉及到log4j、logback、log4j2以及slf4j相關(guān)概念,那么它們是啥關(guān)系呢?unbelievable...相關(guān)知識(shí)如下:

slf4j、log4j、logback、log4j2
日志接口(slf4j) slf4j是對(duì)所有日志框架制定的一種規(guī)范、標(biāo)準(zhǔn)、接口,并不是一個(gè)框架的具體的實(shí)現(xiàn),因?yàn)榻涌诓⒉荒塥?dú)立使用,需要和具體的日志框架實(shí)現(xiàn)配合使用(如log4j、logback)
日志實(shí)現(xiàn)(log4j、logback、log4j2) log4j是apache實(shí)現(xiàn)的一個(gè)開源日志組件 logback同樣是由log4j的作者設(shè)計(jì)完成的,擁有更好的特性,用來取代log4j的一個(gè)日志框架,是slf4j的原生實(shí)現(xiàn) Log4j2是log4j 1.x和logback的改進(jìn)版,據(jù)說采用了一些新技術(shù)(無鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解決了一些死鎖的bug,而且配置更加簡(jiǎn)單靈活,官網(wǎng)地址: http://logging.apache.org/log4j/2.x/manual/configuration.html 為什么需要日志接口,直接使用具體的實(shí)現(xiàn)不就行了嗎? 接口用于定制規(guī)范,可以有多個(gè)實(shí)現(xiàn),使用時(shí)是面向接口的(導(dǎo)入的包都是slf4j的包而不是具體某個(gè)日志框架中的包),即直接和接口交互,不直接使用實(shí)現(xiàn),所以可以任意的更換實(shí)現(xiàn)而不用更改代碼中的日志相關(guān)代碼。 比如:slf4j定義了一套日志接口,項(xiàng)目中使用的日志框架是logback,開發(fā)中調(diào)用的所有接口都是slf4j的,不直接使用logback,調(diào)用是 自己的工程調(diào)用slf4j的接口,slf4j的接口去調(diào)用logback的實(shí)現(xiàn),可以看到整個(gè)過程應(yīng)用程序并沒有直接使用logback,當(dāng)項(xiàng)目需要更換更加優(yōu)秀的日志框架時(shí)(如log4j2)只需要引入Log4j2的jar和Log4j2對(duì)應(yīng)的配置文件即可,完全不用更改Java代碼中的日志相關(guān)的代碼logger.info(“xxx”),也不用修改日志相關(guān)的類的導(dǎo)入的包(import org.slf4j.Logger; import org.slf4j.LoggerFactory;)
使用日志接口便于更換為其他日志框架,適配器作用 log4j、logback、log4j2都是一種日志具體實(shí)現(xiàn)框架,所以既可以單獨(dú)使用也可以結(jié)合slf4j一起搭配使用)

? 到此我們使用的是Log4j2日志框架,接下來是配置log4j(可以使用properties和xml兩種方式配置,這里使用xml形式;有關(guān)log4j詳細(xì)配置講解參考鏈接:https://blog.csdn.net/menghuanzhiming/article/details/77531977),具體配置詳解如下:

<?xml version="1.0" encoding="UTF-8"?> <!--日志級(jí)別以及優(yōu)先級(jí)排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,這個(gè)用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當(dāng)設(shè)置成trace時(shí),你會(huì)看到log4j2內(nèi)部各種詳細(xì)輸出--> <!--monitorInterval:Log4j能夠自動(dòng)檢測(cè)修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)--> <Configuration status="WARN"><!--定義一些屬性--><Properties><Property name="PID">????</Property><Property name="LOG_PATTERN">[%d{yyyy-MM-dd HH:mm:ss.SSS}] - ${sys:PID} --- %c{1}: %m%n</Property></Properties><!--輸出源,用于定義日志輸出的地方--><Appenders><!--輸出到控制臺(tái)--><Console name="Console" target="SYSTEM_OUT" follow="true"><PatternLayoutpattern="${LOG_PATTERN}"></PatternLayout></Console><!--文件會(huì)打印出所有信息,這個(gè)log每次運(yùn)行程序會(huì)自動(dòng)清空,由append屬性決定,適合臨時(shí)測(cè)試用--><!--append為TRUE表示消息增加到指定文件中,false表示消息覆蓋指定的文件內(nèi)容,默認(rèn)值是true--><!--<File name="File" fileName="logs/log.log" append="false">--><!--<PatternLayout>--><!--<pattern>[%-5p] %d %c - %m%n</pattern>--><!--</PatternLayout>--><!--</File>--><!--這個(gè)會(huì)打印出所有的信息,每次大小超過size,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔 --><RollingFile name="RollingAllFile" fileName="logs/all/all.log"filePattern="logs/all/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz"><PatternLayoutpattern="${LOG_PATTERN}" /><Policies><!--以下兩個(gè)屬性結(jié)合filePattern使用,完成周期性的log文件封存工作--><!--TimeBasedTriggeringPolicy 基于時(shí)間的觸發(fā)策略,以下是它的兩個(gè)參數(shù):1.interval,integer型,指定兩次封存動(dòng)作之間的時(shí)間間隔。單位:以日志的命名精度來確定單位,比如yyyy-MM-dd-HH 單位為小時(shí),yyyy-MM-dd-HH-mm 單位為分鐘2.modulate,boolean型,說明是否對(duì)封存時(shí)間進(jìn)行調(diào)制。若modulate=true,則封存時(shí)間將以0點(diǎn)為邊界進(jìn)行偏移計(jì)算。比如,modulate=true,interval=4hours,那么假設(shè)上次封存日志的時(shí)間為03:00,則下次封存日志的時(shí)間為04:00,之后的封存時(shí)間依次為08:00,12:00,16:00--><!--<TimeBasedTriggeringPolicy/>--><!--SizeBasedTriggeringPolicy 基于日志文件大小的觸發(fā)策略,以下配置解釋為:當(dāng)單個(gè)文件達(dá)到20M后,會(huì)自動(dòng)將以前的內(nèi)容,先創(chuàng)建類似 2014-09(年-月)的目錄,然后按 "xxx-年-月-日-序號(hào)"命名,打成壓縮包--><SizeBasedTriggeringPolicy size="200 MB"/></Policies></RollingFile><!-- 添加過濾器ThresholdFilter,可以有選擇的輸出某個(gè)級(jí)別及以上的類別 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否則直接拒絕 --><RollingFile name="RollingErrorFile" fileName="logs/error/error.log"filePattern="logs/error/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.log.gz"><ThresholdFilter level="ERROR"/><PatternLayoutpattern="${LOG_PATTERN}" /><Policies><!--<TimeBasedTriggeringPolicy/>--><SizeBasedTriggeringPolicy size="200 MB"/></Policies></RollingFile><RollingFile name="RollingWarnFile" fileName="logs/warn/warn.log"filePattern="logs/warn/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.log.gz"><Filters><ThresholdFilter level="WARN"/><ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/></Filters><PatternLayoutpattern="${LOG_PATTERN}" /><Policies><!--<TimeBasedTriggeringPolicy/>--><SizeBasedTriggeringPolicy size="200 MB"/></Policies></RollingFile></Appenders><!--然后定義Loggers,只有定義了Logger并引入的Appender,Appender才會(huì)生效--><Loggers><Logger name="org.hibernate.validator.internal.util.Version" level="WARN"/><Logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/><Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/><Logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/><Logger name="org.springframework" level="INFO" /><Logger name="com.springboot.mybatis.demo" level="DEBUG"/><!--以上的logger會(huì)繼承Root,也就是說他們默認(rèn)會(huì)輸出到Root下定義的符合條件的Appender中,若不想讓它繼承可以設(shè)置 additivity="false"并可以在Logger中設(shè)置 <AppenderRef ref="Console"/> 指定輸出到Console--><Root level="INFO"><AppenderRef ref="Console" /><AppenderRef ref="RollingAllFile"/><AppenderRef ref="RollingErrorFile"/><AppenderRef ref="RollingWarnFile"/></Root></Loggers> </Configuration>

到此我們就算是把日志集成進(jìn)去了,可以在終端看到各種log,very exciting!!!

log4j還可以發(fā)送郵件

添加依賴:

compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.0.0.RELEASE'

修改log4j配置:

在appender中添加如下:<!-- subject: 郵件主題 to: 接收人,多個(gè)以逗號(hào)隔開 from: 發(fā)送人 replyTo: 發(fā)送賬號(hào) smtp: QQ查看鏈接https://service.mail.qq.com/cgi-bin/help?subtype=1&no=167&id=28 smtpDebug: 開啟詳細(xì)日志 smtpPassword: 授權(quán)碼,參看https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256 smtpUsername: 用戶名--><SMTP name="Mail" subject="Error Log" to="xxx.com" from="xxx@qq.com" replyTo="xxx@qq.com"smtpProtocol="smtp" smtpHost="smtp.qq.com" smtpPort="587" bufferSize="50" smtpDebug="false"smtpPassword="授權(quán)碼" smtpUsername="xxx.com"></SMTP>在root里添加上面的appender讓其生效 <AppenderRef ref="Mail" level="error"/>

?搞定!


?4.集成MybatisProvider

? Why ?

? ? 有了它我們可以通過注解的方式結(jié)合動(dòng)態(tài)SQL實(shí)現(xiàn)基本的增刪改查操作,而不需要再在xml中寫那么多重復(fù)繁瑣的SQL了

? Come on?↓

  First: 定義一個(gè)Mapper接口并實(shí)現(xiàn)基本操作,如下:

package com.springboot.mybatis.demo.mapper.common;import com.springboot.mybatis.demo.mapper.common.provider.AutoSqlProvider; import com.springboot.mybatis.demo.mapper.common.provider.MethodProvider; import com.springboot.mybatis.demo.model.common.BaseModel; import org.apache.ibatis.annotations.DeleteProvider; import org.apache.ibatis.annotations.InsertProvider; import org.apache.ibatis.annotations.SelectProvider; import org.apache.ibatis.annotations.UpdateProvider;import java.io.Serializable; import java.util.List;public interface BaseMapper<T extends BaseModel, Id extends Serializable> {@InsertProvider(type = AutoSqlProvider.class, method = MethodProvider.SAVE)int save(T entity);@DeleteProvider(type = AutoSqlProvider.class, method = MethodProvider.DELETE_BY_ID)int deleteById(Id id);@UpdateProvider(type = AutoSqlProvider.class, method = MethodProvider.UPDATE_BY_ID)int updateById(Id id);@SelectProvider(type = AutoSqlProvider.class, method = MethodProvider.FIND_ALL)List<T> findAll(T entity);@SelectProvider(type = AutoSqlProvider.class, method = MethodProvider.FIND_BY_ID)T findById(T entity);@SelectProvider(type = AutoSqlProvider.class, method = MethodProvider.FIND_AUTO_BY_PAGE)List<T> findAutoByPage(T entity); }

其中AutoSqlProvider是提供sql的類,MethodProvider是定義好我們使用MybatisProvider需要實(shí)現(xiàn)的基本持久層方法,這兩個(gè)方法具體實(shí)現(xiàn)如下:

package com.springboot.mybatis.demo.mapper.common.provider;import com.google.common.base.CaseFormat; import com.springboot.mybatis.demo.mapper.common.provider.model.MybatisTable; import com.springboot.mybatis.demo.mapper.common.provider.utils.ProviderUtils; import org.apache.ibatis.jdbc.SQL; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.lang.reflect.Field; import java.util.List;public class AutoSqlProvider {private static Logger logger = LoggerFactory.getLogger(AutoSqlProvider.class);public String findAll(Object obj) {MybatisTable mybatisTable = ProviderUtils.getMybatisTable(obj);List<Field> fields = mybatisTable.getMybatisColumnList();SQL sql = new SQL();fields.forEach(field -> sql.SELECT(CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName())));sql.FROM(mybatisTable.getName());logger.info(sql.toString());return sql.toString();}public String save(Object obj) {
     ...
return null;}public String deleteById(String id) {
     ...
return null;}public String findById(Object obj) {
...
return null;}public String updateById(Object obj) {
...
return null;}public String findAutoByPage(Object obj) {return null;}} package com.springboot.mybatis.demo.mapper.common.provider;public class MethodProvider {public static final String SAVE = "save";public static final String DELETE_BY_ID = "deleteById";public static final String UPDATE_BY_ID = "updateById";public static final String FIND_ALL = "findAll";public static final String FIND_BY_ID = "findById";public static final String FIND_AUTO_BY_PAGE = "findAutoByPage"; }

注意:

1.如果你在BaseMapper中定義了某個(gè)方法一定要在SqlProvider類中去實(shí)現(xiàn)該方法,否則將報(bào)找不到該方法的錯(cuò)誤

2.在動(dòng)態(tài)拼接SQL的時(shí)候遇到一個(gè)問題:即使開啟了駝峰命名轉(zhuǎn)換,在拼接的時(shí)候依然需要手動(dòng)將表屬性轉(zhuǎn)換,否則不會(huì)自動(dòng)轉(zhuǎn)換

3.在SqlProvider中的SQL log可以去除,因?yàn)樵诩扇罩镜臅r(shí)候已經(jīng)配置好了

4.ProviderUtils是通過反射的方式拿到表的一些基本屬性:表名,表屬性

?? 到這里MybatisProvider的基礎(chǔ)配置已經(jīng)準(zhǔn)備好,接下去就是讓每一個(gè)mapper接口去繼承我們這個(gè)基礎(chǔ)Mapper,這樣所有的基礎(chǔ)增刪改查都由BaseMapper負(fù)責(zé),如下:

package com.springboot.mybatis.demo.mapper;import com.springboot.mybatis.demo.mapper.common.BaseMapper; import com.springboot.mybatis.demo.model.User;import java.util.List;public interface UserMapper extends BaseMapper<User,String> {}

這樣UserMapper就不需要再關(guān)注那些基礎(chǔ)的操作了,wonderful !!!


?5. 整合JSP過程

? 引入核心包

compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.0.0.RELEASE' // 注意此處一定要是compile或者缺省,不能使用providedRuntime否則jsp無法渲染 compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.6'

providedRuntime group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version: '2.0.2.RELEASE' // 此行代碼是用于解決內(nèi)置tomcat和外部tomcat沖突問題,若僅使用內(nèi)置tomcat則無需此行代碼

這是兩個(gè)基本的包,其中spring-boot-starter-web會(huì)引入tomcat也就是我們常說的SpringBoot內(nèi)置的tomcat,而tomcat-embed-jasper是解析jsp的包,如果這個(gè)包沒有引入或是有問題則無法渲染jsp頁(yè)面

? 修改Application啟動(dòng)類

@EnableTransactionManagement @SpringBootApplication public class Application extends SpringBootServletInitializer { @Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {setRegisterErrorPageFilter(false);return application.sources(Application.class);}public static void main(String[] args) throws Exception {SpringApplication.run(Application.class, args);} }

注意:啟動(dòng)類必須繼承SpringBootServletInitializer 類并重寫configure方法

? 創(chuàng)建jsp頁(yè)面(目錄詳情如下)

? 接下來就是配置如何去獲取jsp頁(yè)面了,有兩中選擇

一:通過在application.properties文件中配置

spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp

然后創(chuàng)建controller(注意:在Spring 2.0之后如果要返回jsp頁(yè)面必須使用@Controller而不能使用@RestController)

@Controller // spring 2.0 如果要返回jsp頁(yè)面必須使用Controller而不能使用RestController public class IndexController {@GetMapping("/")public String index() {return "index";} }

二:通過配置文件實(shí)現(xiàn),這樣的話直接請(qǐng)求 http:localhost:8080/就能直接獲取到index.jsp頁(yè)面,省去了controller代碼的書寫

@Configuration @EnableWebMvc public class WebMvcConfig implements WebMvcConfigurer {// /static (or /public or /resources or /META-INF/resources@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");}
  // 此方法如果不重寫的話將無法找到index.jsp資源@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();} }

?6.集成Shiro認(rèn)證和授權(quán)以及Session

? shiro核心

認(rèn)證、授權(quán)、會(huì)話管理、緩存、加密

? 集成認(rèn)證過程

(1)引包(注:包是按需引用的,以下只是個(gè)人構(gòu)建時(shí)候引用的,僅供參考↓)

// shirocompile group: 'org.apache.shiro', name: 'shiro-core', version: '1.3.2' // 必引包,shiro核心包c(diǎn)ompile group: 'org.apache.shiro', name: 'shiro-web', version: '1.3.2' // 與web整合的包c(diǎn)ompile group: 'org.apache.shiro', name: 'shiro-spring', version: '1.3.2' // 與spring整合的包c(diǎn)ompile group: 'org.apache.shiro', name: 'shiro-ehcache', version: '1.3.2' // shiro緩存

(2)shiro配置文件

@Configuration public class ShiroConfig {@Bean(name = "shiroFilter")public ShiroFilterFactoryBean shiroFilterFactoryBean() {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();//攔截器MapMap<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();//配置不會(huì)被攔截的路徑filterChainDefinitionMap.put("/static/**", "anon");//配置退出filterChainDefinitionMap.put("/logout", "logout");
     //配置需要認(rèn)證才能訪問的路徑filterChainDefinitionMap.put("/**", "authc");
     //配置需要認(rèn)證和admin角色才能訪問的路徑
     filterChainDefinitionMap.put("user/**","authc,roles[admin]") //注意roles中的角色可以為多個(gè)且時(shí)and的關(guān)系,即要擁有所有角色才能訪問,如果要or關(guān)系可自行寫filter
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
//配置登陸路徑shiroFilterFactoryBean.setLoginUrl("/login");//配置登陸成功后跳轉(zhuǎn)的路徑shiroFilterFactoryBean.setSuccessUrl("/index");//登陸失敗跳回登陸界面shiroFilterFactoryBean.setUnauthorizedUrl("/login");shiroFilterFactoryBean.setSecurityManager(securityManager());return shiroFilterFactoryBean;}@Beanpublic ShiroRealmOne shiroRealmOne() {ShiroRealmOne realm = new ShiroRealmOne(); // 此處是自定義shiro規(guī)則return realm;}@Bean(name = "securityManager")public DefaultWebSecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(shiroRealmOne());
     securityManager.setCacheManager(ehCacheManager());
     securityManager.setSessionManager(sessionManager());
return securityManager;}

@Bean(name = "ehCacheManager") // 將用戶信息緩存起來
public EhCacheManager ehCacheManager() {
return new EhCacheManager();
}

  @Bean(name = "shiroCachingSessionDAO") // shiroSession
  public SessionDAO shiroCachingSessionDAO() {
  EnterpriseCacheSessionDAO sessionDao = new EnterpriseCacheSessionDAO();
  sessionDao.setSessionIdGenerator(new JavaUuidSessionIdGenerator()); // SessionId生成器
  sessionDao.setCacheManager(ehCacheManager()); // 緩存
   return sessionDao;
  }
  @Bean(name = "sessionManager")
  public DefaultWebSessionManager sessionManager() {
  DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
  defaultWebSessionManager.setGlobalSessionTimeout(1000 * 60);
  defaultWebSessionManager.setSessionDAO(shiroCachingSessionDAO());
  return defaultWebSessionManager;
  }
}

自定義realm,繼承了AuthorizationInfo實(shí)現(xiàn)簡(jiǎn)單的登陸驗(yàn)證

package com.springboot.mybatis.demo.config.realm;import com.springboot.mybatis.demo.model.Permission; import com.springboot.mybatis.demo.model.Role; import com.springboot.mybatis.demo.model.User; import com.springboot.mybatis.demo.service.PermissionService; import com.springboot.mybatis.demo.service.RoleService; import com.springboot.mybatis.demo.service.UserService; import com.springboot.mybatis.demo.service.impl.PermissionServiceImpl; import com.springboot.mybatis.demo.service.impl.RoleServiceImpl; import com.springboot.mybatis.demo.service.impl.UserServiceImpl; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.session.Session; import org.apache.shiro.subject.PrincipalCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired;import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors;public class ShiroRealmOne extends AuthorizingRealm {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate UserService userServiceImpl;@Autowiredprivate RoleService roleServiceImpl;@Autowiredprivate PermissionService permissionServiceImpl;//授權(quán)(這里對(duì)授權(quán)不做講解,可忽略) @Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {logger.info("doGetAuthorizationInfo+" + principalCollection.toString());User user = userServiceImpl.findByUserName((String) principalCollection.getPrimaryPrincipal());List<Role> roleList = roleServiceImpl.findByUserId(user.getId());List<Permission> permissionList = roleList != null && !roleList.isEmpty() ? permissionServiceImpl.findByRoleIds(roleList.stream().map(Role::getId).collect(Collectors.toList())) : new ArrayList<>(); SecurityUtils.getSubject().getSession().setAttribute(String.valueOf(user.getId()), SecurityUtils.getSubject().getPrincipals());SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();//賦予角色for (Role role : roleList) {simpleAuthorizationInfo.addRole(role.getRolName());}//賦予權(quán)限for (Permission permission : permissionList) { simpleAuthorizationInfo.addStringPermission(permission.getPrmName());}return simpleAuthorizationInfo;}// 認(rèn)證@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {logger.info("doGetAuthenticationInfo +" + authenticationToken.toString());UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;String userName = token.getUsername();logger.info(userName + token.getPassword());User user = userServiceImpl.findByUserName(token.getUsername());if (user != null) {Session session = SecurityUtils.getSubject().getSession();session.setAttribute("user", user);return new SimpleAuthenticationInfo(userName, user.getUsrPassword(), getName());} else {return null;}} }

到此shrio認(rèn)證簡(jiǎn)單配置就配置好了,接下來就是驗(yàn)證了

控制器

package com.springboot.mybatis.demo.controller;import com.springboot.mybatis.demo.common.utils.SelfStringUtils; import com.springboot.mybatis.demo.controller.common.BaseController; import com.springboot.mybatis.demo.model.User; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping;@Controller public class IndexController extends BaseController{@PostMapping("login")public String login(User user, Model model) {if (user == null || SelfStringUtils.isEmpty(user.getUsrName()) || SelfStringUtils.isEmpty(user.getUsrPassword()) ) {model.addAttribute("warn","請(qǐng)?zhí)顚懲暾脩裘兔艽a!");return "login";}Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(user.getUsrName(), user.getUsrPassword());token.setRememberMe(true);try {subject.login(token);} catch (AuthenticationException e) {model.addAttribute("error","用戶名或密碼錯(cuò)誤,請(qǐng)重新登陸!");return "login";}return "index";}@GetMapping("login")public String index() {return "login";}}

login jsp:

<%--Created by IntelliJ IDEA.User: AdministratorDate: 2018/7/29Time: 14:34To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>登陸</title> </head> <body><form action="login" method="POST">User Name: <input type="text" name="usrName"><br />User Password: <input type="text" name="usrPassword" /><input type="submit" value="Submit" /></form><span style="color: #b3b20a;">${warn}</span><span style="color:#b3130f;">${error}</span> </body> </html>

index jsp:

<%--Created by IntelliJ IDEA.User: pcDate: 2018/7/23Time: 14:02To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><h1>Welcome to here!</h1> </body> </html>

正常情況分析:

1.未登錄時(shí)訪問非login接口直接跳回login頁(yè)面

2.登陸失敗返回賬戶或密碼錯(cuò)誤

3.未填寫完整賬戶和密碼返回請(qǐng)?zhí)顚懲暾~戶和密碼

4.登陸成功跳轉(zhuǎn)到index頁(yè)面,如果不是admin角色則不能訪問user/**的路徑,其他可以正常訪問


?7.Docker 部署此項(xiàng)目

(1)基礎(chǔ)方式部署

? 構(gòu)建Dockerfile

FROM docker.io/williamyeh/java8VOLUME /tmpVOLUME /opt/workspace#COPY /build/libs/spring-boot-mybatis-1.0-SNAPSHOT.war /opt/workspace/app.jarEXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]

創(chuàng)建工作目錄掛載點(diǎn),則可以將工作目錄掛載到host機(jī)上,然而也可以直接將jar包拷貝到容器中去,二者擇其一即可。本人較喜歡前者。

?? 在Dockerfile文件目錄下,執(zhí)行? docker build -t 鏡像名:tag .? 構(gòu)建鏡像

?? 因?yàn)榇隧?xiàng)目用到了Mysql,所以還得構(gòu)建一個(gè)Mysql容器,運(yùn)行命令:docker run --name mysql -v /home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7;

? 運(yùn)行剛才構(gòu)建的項(xiàng)目鏡像:docker run --name myproject -v /home/vagrant/workspace/:/opt/workspace --link mysql:mysql -p 8080:8080 -d 鏡像名字;掛載的目錄 /home/vagrant/workspace 根據(jù)自己的目錄而定

?? 訪問8080端口測(cè)試

(2)使用docker-compose工具管理單機(jī)部署(前提:安裝好docker-compose工具)

? 構(gòu)建docker-compose.yml文件(此處除了有mysql外還加了個(gè)redis)

version: '3'
services:
??? db:
??????? image: docker.io/mysql:5.7
??????? command: --default-authentication-plugin=mysql_native_password
??????? container_name: db
??????? volumes:
??????????? - /home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/mysql/data:/var/lib/mysql
??????????? - /home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/mysql/logs:/var/log/mysql
??????? environment:
??????????? MYSQL_ROOT_PASSWORD: root
??????????? MYSQL_USER: 'test'
??????????? MYSQL_PASS: 'test'
??????? restart:
??????????? always
??????? networks:
??????????? - default
??? redis:
??????? image: docker.io/redis
??????? container_name: redis
??????? command: redis-server /usr/local/etc/redis/redis.conf
??????? volumes:
??????????? - /home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/redis/data:/data
??????????? - /home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/redis/redis.conf:/usr/local/etc/redis/redis.conf
??????? networks:
??????????? - default
??? spring-boot:
??????? build:
??????????? context: ./enjoy-dir/workspace
??????????? dockerfile: Dockerfile
??????? image:
??????????? spring-boot:1.0-SNAPSHOT
??????? depends_on:
??????????? - db
??????????? - redis
??????? links:
??????????? - db:mysql
??????????? - redis:redis
??????? ports:
??????????? - "8080:8080"
??????? volumes:
??????????? - /home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/workspace:/opt/workspace
??????? networks:
??????????? - default
networks:
??? default:
??????? driver: bridge

注意:其中的掛載目錄依自己情況而定;redis密碼可以在redis.conf文件中配置,其詳細(xì)配置參見:https://woodenrobot.me/2018/09/03/%E4%BD%BF%E7%94%A8-docker-compose-%E5%9C%A8-Docker-%E4%B8%AD%E5%90%AF%E5%8A%A8%E5%B8%A6%E5%AF%86%E7%A0%81%E7%9A%84-Redis/

? 在docker-compose.yml文件目錄下執(zhí)行:docker-compose up;在此過程中遇到的問題:mysql無法連接 -> 原因:root用戶外部無法使用,于是進(jìn)入mysql中開放root用戶,具體參見:https://www.cnblogs.com/goxcheer/p/8797377.html

? 訪問 8080 端口測(cè)試

(3)使用docker swarm多機(jī)分布式部署

? 構(gòu)建compose文件基于compose 3.0,其詳細(xì)配置參見官方網(wǎng)頁(yè),

version: '3' services:db:image: docker.io/mysql:5.7command: --default-authentication-plugin=mysql_native_password // 密碼加密機(jī)制volumes:- "/home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/mysql/data:/var/lib/mysql"- "/home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/mysql/logs:/var/log/mysql"environment:MYSQL_ROOT_PASSWORD: 'root'MYSQL_USER: 'test'MYSQL_PASS: 'test'restart: // 開機(jī)啟動(dòng)alwaysnetworks: // mysql 數(shù)據(jù)庫(kù)容器連到 mynet overlay 網(wǎng)絡(luò),只要連到該網(wǎng)絡(luò)的容器均可以通過別名 mysql 連接數(shù)據(jù)庫(kù)mynet:aliases:- mysqlports: - "3306:3306"deploy: // 使用 swarm 部署需要配置一下replicas: 1 // stack 啟動(dòng)時(shí)默認(rèn)開啟多少個(gè)服務(wù)restart_policy: // 重新構(gòu)建策略condition: on-failureplacement: // 部署節(jié)點(diǎn)constraints: [node.role == worker]redis:image: docker.io/rediscommand: redis-server /usr/local/etc/redis/redis.confvolumes:- "/home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/redis/data:/data"- "/home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/redis/redis.conf:/usr/local/etc/redis/redis.conf"networks:mynet:aliases:- redisports: - "6379:6379"deploy: replicas: 1restart_policy: condition: on-failureplacement: constraints: [node.role == worker]spring-boot:build:context: ./enjoy-dir/workspacedockerfile: Dockerfileimage:spring-boot:1.0-SNAPSHOTdepends_on:- db- redisports: - "8080:8080"volumes: - "/home/vagrant/docker-compose/spring-boot-compose/enjoy-dir/workspace:/opt/workspace"networks:mynet:aliases:- spring-bootdeploy: replicas: 1 restart_policy: condition: on-failureplacement: constraints: [node.role == worker] networks:mynet:

? compose 構(gòu)建好了則執(zhí)行 docker stack deploy -c [ compose文件路徑 ]? [ stack名字 ];如下:

執(zhí)行完成之后可以在 manager 節(jié)點(diǎn)通過命令 docker service ls 查看 service,如下:

?以及查看 service 狀態(tài):

? 通過 Protainer 工具可視化管理 Swarm;首先在任一臺(tái)機(jī)器上安裝 Protainer , 安裝詳解參見:http://www.pangxieke.com/linux/use-protainer-manage-docker.html

安裝完成之后則可以進(jìn)去輕松橫向擴(kuò)展自己的容器也就是service了,自由設(shè)置 scale...

?

總結(jié):由 docker 基礎(chǔ)命令創(chuàng)建容器在容器數(shù)目不多的情況下很實(shí)用,但是容器多了怎么辦 -> 用 docker-compose 將容器進(jìn)行分組管理,這樣大大提升效率,一個(gè)命令即可啟用和關(guān)閉多個(gè)容器。但是在單機(jī)下實(shí)用 docke-compose 確實(shí)能應(yīng)付得過來,但是多機(jī)怎么辦 -> 用 docker swarm, 是的有了docker swarm 無論多少臺(tái)機(jī)器,再也不用一個(gè)機(jī)器一個(gè)機(jī)器去部署,docker swarm 會(huì)自動(dòng)幫我們把容器部署到資源足夠的機(jī)器上去,這樣一個(gè)高效率的分布式部署就變得 so easy...


?8.讀寫分離

?采用讀寫分離來降低單個(gè)數(shù)據(jù)庫(kù)的壓力,提高訪問速度

(1)配置數(shù)據(jù)庫(kù)(將原來的數(shù)據(jù)庫(kù)配置改成下面的,這里只配置 master 和 slave1 兩個(gè)數(shù)據(jù)庫(kù))

#----------------------------------------- 數(shù)據(jù)庫(kù)連接(單數(shù)據(jù)庫(kù))----------------------------------------
#spring.datasource.url:=jdbc:mysql://localhost:3306/liuzj?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
#spring.datasource.username=root
#spring.datasource.password=
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#----------------------------------------- 數(shù)據(jù)庫(kù)連接(單數(shù)據(jù)庫(kù))---------------------------------------- #----------------------------------------- 數(shù)據(jù)庫(kù)連接(讀寫分離)---------------------------------------- # master(寫) spring.datasource.master.url=jdbc:mysql://192.168.10.16:3306/test spring.datasource.master.username=root spring.datasource.master.password=123456 spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver # slave1(讀) spring.datasource.slave1.url=jdbc:mysql://192.168.10.17:3306/test spring.datasource.slave1.username=test spring.datasource.slave1.password=123456 spring.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver #----------------------------------------- 數(shù)據(jù)庫(kù)連接(讀寫分離)----------------------------------------

?(2)修改初始化 dataSource(將原來的?dataSource?替換成下面的)

// ----------------------------------- 單數(shù)據(jù)源 start----------------------------------------// @Bean // @ConfigurationProperties(prefix = "spring.datasource") // public DataSource dataSource() { // DruidDataSource druidDataSource = new DruidDataSource(); // // 數(shù)據(jù)源最大連接數(shù) // druidDataSource.setMaxActive(Application.DEFAULT_DATASOURCE_MAX_ACTIVE); // // 數(shù)據(jù)源最小連接數(shù) // druidDataSource.setMinIdle(Application.DEFAULT_DATASOURCE_MIN_IDLE); // // 配置獲取連接等待超時(shí)的時(shí)間 // druidDataSource.setMaxWait(Application.DEFAULT_DATASOURCE_MAX_WAIT); // return druidDataSource; // }// ----------------------------------- 單數(shù)據(jù)源 end----------------------------------------// ----------------------------------- 多數(shù)據(jù)源(讀寫分離)start----------------------------------------@Bean@ConfigurationProperties("spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties("spring.datasource.slave1")public DataSource slave1DataSource() {return DataSourceBuilder.create().build();}@Beanpublic DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,@Qualifier("slave1DataSource") DataSource slave1DataSource) {Map<Object, Object> targetDataSources = new HashMap<>(2);targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource);MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);myRoutingDataSource.setTargetDataSources(targetDataSources);return myRoutingDataSource;}@ResourceMyRoutingDataSource myRoutingDataSource;// ----------------------------------- 多數(shù)據(jù)源(讀寫分離)end----------------------------------------

(3)使用 AOP 動(dòng)態(tài)切換數(shù)據(jù)源(當(dāng)然也可以采用 mycat,具體配置自行查閱資料)

/*** @author admin* @date 2019-02-27*/ @Aspect @Component public class DataSourceAspect {@Pointcut("!@annotation(com.springboot.mybatis.demo.config.annotation.Master) " +"&& (execution(* com.springboot.mybatis.demo.service..*.select*(..)) " +"|| execution(* com.springboot.mybatis.demo.service..*.get*(..))" +"|| execution(* com.springboot.mybatis.demo.service..*.find*(..)))")public void readPointcut() {}@Pointcut("@annotation(com.springboot.mybatis.demo.config.annotation.Master) " +"|| execution(* com.springboot.mybatis.demo.service..*.insert*(..)) " +"|| execution(* com.springboot.mybatis.demo.service..*.add*(..)) " +"|| execution(* com.springboot.mybatis.demo.service..*.update*(..)) " +"|| execution(* com.springboot.mybatis.demo.service..*.edit*(..)) " +"|| execution(* com.springboot.mybatis.demo.service..*.delete*(..)) " +"|| execution(* com.springboot.mybatis.demo.service..*.remove*(..))")public void writePointcut() {}@Before("readPointcut()")public void read() {DBContextHolder.slave();}@Before("writePointcut()")public void write() {DBContextHolder.master();}/*** 另一種寫法:if...else... 判斷哪些需要讀從數(shù)據(jù)庫(kù),其余的走主數(shù)據(jù)庫(kù)*/ // @Before("execution(* com.springboot.mybatis.demo.service.impl.*.*(..))") // public void before(JoinPoint jp) { // String methodName = jp.getSignature().getName(); // // if (StringUtils.startsWithAny(methodName, "get", "select", "find")) { // DBContextHolder.slave(); // }else { // DBContextHolder.master(); // } // } }

(4)以上只是主要配置及步驟,像?DBContextHolder 等類此處沒有貼出,詳細(xì)參看 github

?

總結(jié):參看資料:https://www.cnblogs.com/cjsblog/p/9712457.html


?9. 集成 Quartz 分布式定時(shí)任務(wù)

 ?? 幾個(gè)經(jīng)典的定時(shí)任務(wù)比較:

  

? ? ?Spring 自帶定時(shí)器Scheduled是單應(yīng)用服務(wù)上的,不支持分布式環(huán)境。如果要支持分布式需要任務(wù)調(diào)度控制插件spring-scheduling-cluster的配合,其原理是對(duì)任務(wù)加鎖實(shí)現(xiàn)控制,支持能實(shí)現(xiàn)分布鎖的中間件。

(1)初始化數(shù)據(jù)庫(kù)腳本(可自行到官網(wǎng)下載)

drop table if exists qrtz_fired_triggers; drop table if exists qrtz_paused_trigger_grps; drop table if exists qrtz_scheduler_state; drop table if exists qrtz_locks; drop table if exists qrtz_simple_triggers; drop table if exists qrtz_simprop_triggers; drop table if exists qrtz_cron_triggers; drop table if exists qrtz_blob_triggers; drop table if exists qrtz_triggers; drop table if exists qrtz_job_details; drop table if exists qrtz_calendars;create table qrtz_job_details(sched_name varchar(120) not null,job_name varchar(120) not null,job_group varchar(120) not null,description varchar(250) null,job_class_name varchar(250) not null,is_durable varchar(1) not null,is_nonconcurrent varchar(1) not null,is_update_data varchar(1) not null,requests_recovery varchar(1) not null,job_data blob null,primary key (sched_name,job_name,job_group) );create table qrtz_triggers(sched_name varchar(120) not null,trigger_name varchar(120) not null,trigger_group varchar(120) not null,job_name varchar(120) not null,job_group varchar(120) not null,description varchar(250) null,next_fire_time bigint(13) null,prev_fire_time bigint(13) null,priority integer null,trigger_state varchar(16) not null,trigger_type varchar(8) not null,start_time bigint(13) not null,end_time bigint(13) null,calendar_name varchar(200) null,misfire_instr smallint(2) null,job_data blob null,primary key (sched_name,trigger_name,trigger_group),foreign key (sched_name,job_name,job_group)references qrtz_job_details(sched_name,job_name,job_group) );create table qrtz_simple_triggers(sched_name varchar(120) not null,trigger_name varchar(120) not null,trigger_group varchar(120) not null,repeat_count bigint(7) not null,repeat_interval bigint(12) not null,times_triggered bigint(10) not null,primary key (sched_name,trigger_name,trigger_group),foreign key (sched_name,trigger_name,trigger_group)references qrtz_triggers(sched_name,trigger_name,trigger_group) );create table qrtz_cron_triggers(sched_name varchar(120) not null,trigger_name varchar(120) not null,trigger_group varchar(120) not null,cron_expression varchar(200) not null,time_zone_id varchar(80),primary key (sched_name,trigger_name,trigger_group),foreign key (sched_name,trigger_name,trigger_group)references qrtz_triggers(sched_name,trigger_name,trigger_group) );create table qrtz_simprop_triggers(sched_name varchar(120) not null,trigger_name varchar(120) not null,trigger_group varchar(120) not null,str_prop_1 varchar(512) null,str_prop_2 varchar(512) null,str_prop_3 varchar(512) null,int_prop_1 int null,int_prop_2 int null,long_prop_1 bigint null,long_prop_2 bigint null,dec_prop_1 numeric(13,4) null,dec_prop_2 numeric(13,4) null,bool_prop_1 varchar(1) null,bool_prop_2 varchar(1) null,primary key (sched_name,trigger_name,trigger_group),foreign key (sched_name,trigger_name,trigger_group)references qrtz_triggers(sched_name,trigger_name,trigger_group) );create table qrtz_blob_triggers(sched_name varchar(120) not null,trigger_name varchar(120) not null,trigger_group varchar(120) not null,blob_data blob null,primary key (sched_name,trigger_name,trigger_group),foreign key (sched_name,trigger_name,trigger_group)references qrtz_triggers(sched_name,trigger_name,trigger_group) );create table qrtz_calendars(sched_name varchar(120) not null,calendar_name varchar(120) not null,calendar blob not null,primary key (sched_name,calendar_name) );create table qrtz_paused_trigger_grps(sched_name varchar(120) not null,trigger_group varchar(120) not null,primary key (sched_name,trigger_group) );create table qrtz_fired_triggers(sched_name varchar(120) not null,entry_id varchar(95) not null,trigger_name varchar(120) not null,trigger_group varchar(120) not null,instance_name varchar(200) not null,fired_time bigint(13) not null,sched_time bigint(13) not null,priority integer not null,state varchar(16) not null,job_name varchar(200) null,job_group varchar(200) null,is_nonconcurrent varchar(1) null,requests_recovery varchar(1) null,primary key (sched_name,entry_id) );create table qrtz_scheduler_state(sched_name varchar(120) not null,instance_name varchar(120) not null,last_checkin_time bigint(13) not null,checkin_interval bigint(13) not null,primary key (sched_name,instance_name) );create table qrtz_locks(sched_name varchar(120) not null,lock_name varchar(40) not null,primary key (sched_name,lock_name) );

(2)創(chuàng)建并配置好 Quartz 配置文件

# --------------------------------------- quartz --------------------------------------- # 主要分為scheduler、threadPool、jobStore、plugin等部分 org.quartz.scheduler.instanceName=DefaultQuartzScheduler org.quartz.scheduler.rmi.export=false org.quartz.scheduler.rmi.proxy=false org.quartz.scheduler.wrapJobExecutionInUserTransaction=false # 實(shí)例化ThreadPool時(shí),使用的線程類為SimpleThreadPool org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool # threadCount和threadPriority將以setter的形式注入ThreadPool實(shí)例 # 并發(fā)個(gè)數(shù) org.quartz.threadPool.threadCount=5 # 優(yōu)先級(jí) org.quartz.threadPool.threadPriority=5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true org.quartz.jobStore.misfireThreshold=5000 # 默認(rèn)存儲(chǔ)在內(nèi)存中 #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore #持久化 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.tablePrefix=QRTZ_ org.quartz.jobStore.dataSource=qzDS org.quartz.dataSource.qzDS.driver=com.mysql.jdbc.Driver org.quartz.dataSource.qzDS.URL=jdbc:mysql://192.168.10.16:3306/test?useUnicode=true&characterEncoding=UTF-8 org.quartz.dataSource.qzDS.user=root org.quartz.dataSource.qzDS.password=123456 org.quartz.dataSource.qzDS.maxConnections=10 # --------------------------------------- quartz -----------------------------------------

(3)初始化 Quartz 的初始Bean

@Configuration public class QuartzConfig {/*** 實(shí)例化SchedulerFactoryBean對(duì)象** @return SchedulerFactoryBean* @throws IOException 異常*/@Bean(name = "schedulerFactory")public SchedulerFactoryBean schedulerFactoryBean() throws IOException {SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();factoryBean.setQuartzProperties(quartzProperties());return factoryBean;}/*** 加載配置文件** @return Properties* @throws IOException 異常*/@Beanpublic Properties quartzProperties() throws IOException {PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));//在quartz.properties中的屬性被讀取并注入后再初始化對(duì)象 propertiesFactoryBean.afterPropertiesSet();return propertiesFactoryBean.getObject();}/*** quartz初始化監(jiān)聽器** @return QuartzInitializerListener*/@Beanpublic QuartzInitializerListener executorListener() {return new QuartzInitializerListener();}/*** 通過SchedulerFactoryBean獲取Scheduler的實(shí)例** @return Scheduler* @throws IOException 異常*/@Bean(name = "Scheduler")public Scheduler scheduler() throws IOException {return schedulerFactoryBean().getScheduler();}}

(3)創(chuàng)建 Quartz 的 service 對(duì) job進(jìn)行一些基礎(chǔ)操作,實(shí)現(xiàn)動(dòng)態(tài)調(diào)度 job

/*** @author admin* @date 2019-02-28*/ public interface QuartzJobService {/*** 添加任務(wù)** @param scheduler Scheduler的實(shí)例* @param jobClassName 任務(wù)類名稱* @param jobGroupName 任務(wù)群組名稱* @param cronExpression cron表達(dá)式* @throws Exception*/void addJob(Scheduler scheduler, String jobClassName, String jobGroupName, String cronExpression) throws Exception;/*** 暫停任務(wù)** @param scheduler Scheduler的實(shí)例* @param jobClassName 任務(wù)類名稱* @param jobGroupName 任務(wù)群組名稱* @throws Exception*/void pauseJob(Scheduler scheduler, String jobClassName, String jobGroupName) throws Exception;/*** 繼續(xù)任務(wù)** @param scheduler Scheduler的實(shí)例* @param jobClassName 任務(wù)類名稱* @param jobGroupName 任務(wù)群組名稱* @throws Exception*/void resumeJob(Scheduler scheduler, String jobClassName, String jobGroupName) throws Exception;/*** 重新執(zhí)行任務(wù)** @param scheduler Scheduler的實(shí)例* @param jobClassName 任務(wù)類名稱* @param jobGroupName 任務(wù)群組名稱* @param cronExpression cron表達(dá)式* @throws Exception*/void rescheduleJob(Scheduler scheduler, String jobClassName, String jobGroupName, String cronExpression) throws Exception;/*** 刪除任務(wù)** @param jobClassName* @param jobGroupName* @throws Exception*/void deleteJob(Scheduler scheduler, String jobClassName, String jobGroupName) throws Exception;/*** 獲取所有任務(wù),使用前端分頁(yè)** @return List*/List<QuartzJob> findList();} /*** @author admin* @date 2019-02-28* @see QuartzJobService*/ @Service public class QuartzJobServiceImpl implements QuartzJobService {@Autowiredprivate QuartzJobMapper quartzJobMapper;@Overridepublic void addJob(Scheduler scheduler, String jobClassName, String jobGroupName, String cronExpression) throws Exception {jobClassName = "com.springboot.mybatis.demo.job." + jobClassName;// 啟動(dòng)調(diào)度器 scheduler.start();//構(gòu)建job信息JobDetail jobDetail = JobBuilder.newJob(QuartzJobUtils.getClass(jobClassName).getClass()).withIdentity(jobClassName, jobGroupName).build();//表達(dá)式調(diào)度構(gòu)建器(即任務(wù)執(zhí)行的時(shí)間)CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule(cronExpression);//按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName).withSchedule(builder).build();// 配置scheduler相關(guān)參數(shù) scheduler.scheduleJob(jobDetail, trigger);}@Overridepublic void pauseJob(Scheduler scheduler, String jobClassName, String jobGroupName) throws Exception {jobClassName = "com.springboot.mybatis.demo.job." + jobClassName;scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName));}@Overridepublic void resumeJob(Scheduler scheduler, String jobClassName, String jobGroupName) throws Exception {jobClassName = "com.springboot.mybatis.demo.job." + jobClassName;scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName));}@Overridepublic void rescheduleJob(Scheduler scheduler, String jobClassName, String jobGroupName, String cronExpression) throws Exception {jobClassName = "com.springboot.mybatis.demo.job." + jobClassName;TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName);CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule(cronExpression);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);// 按新的cronExpression表達(dá)式重新構(gòu)建triggertrigger = trigger.getTriggerBuilder().withIdentity(jobClassName, jobGroupName).withSchedule(builder).build();// 按新的trigger重新設(shè)置job執(zhí)行 scheduler.rescheduleJob(triggerKey, trigger);}@Overridepublic void deleteJob(Scheduler scheduler, String jobClassName, String jobGroupName) throws Exception {jobClassName = "com.springboot.mybatis.demo.job." + jobClassName;scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));}@Overridepublic List<QuartzJob> findList() {return quartzJobMapper.findList();} }

(4)創(chuàng)建 job

/*** @author admin* @date 2019-02-28* @see BaseJob*/ public class HelloJob implements BaseJob {private final Logger logger = LoggerFactory.getLogger(getClass());@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {logger.info("hello, I'm quartz job - HelloJob");} }

(5)然后就可以對(duì) job 進(jìn)行測(cè)試(測(cè)試添加、暫停、重啟等操作)

?總結(jié):

  ??以上只展示集成的主要步驟,詳細(xì)可參看 github。

  ??在分布式情況下,quartz 會(huì)將任務(wù)分布在不同的機(jī)器上執(zhí)行,可以將項(xiàng)目打成jar包,開啟兩個(gè)終端模擬分布式查看 job 的執(zhí)行情況,會(huì)發(fā)現(xiàn) HelloJob 會(huì)在兩個(gè)機(jī)器上交替執(zhí)行。

  ? 以上集成過程參看資料:https://zhuanlan.zhihu.com/p/38546754


?10. 自動(dòng)分表

(1)概述:

一般來說,分表都是根據(jù)最高頻查詢的字段進(jìn)行拆分的。但是考慮到很多功能是需要全局查詢,所以在這種情況下,是無法避免全局查詢的。 對(duì)于經(jīng)常需要全局查詢的部分?jǐn)?shù)據(jù),可以單獨(dú)做個(gè)冗余表,這部分就不要分表了。 對(duì)于不經(jīng)常的全局查詢,就只能 union 了。但是通常情況下這種查詢響應(yīng)時(shí)間都很久。所以就需要在功能上做一定的限制。比如查詢間隔之類的,防止數(shù)據(jù)庫(kù)長(zhǎng)時(shí)間無響應(yīng)。或者把數(shù)據(jù)同步到只讀從庫(kù)上,在從庫(kù)上進(jìn)行搜索。不影響主庫(kù)運(yùn)行。

(2)分表準(zhǔn)備

???? 分表可配置化(啟用分表,對(duì)哪張表進(jìn)行分表以及分表策略)

???? 如何進(jìn)行動(dòng)態(tài)分表

(3)實(shí)踐

???? ?首先定義自己的配置類

import com.beust.jcommander.internal.Lists; import com.springboot.mybatis.demo.common.constant.Constant; import com.springboot.mybatis.demo.common.utils.SelfStringUtils;import java.util.Arrays; import java.util.List; import java.util.Map;/*** 獲取數(shù)據(jù)源配置信息** @author lzj* @date 2019-04-09*/ public class DatasourceConfig {private Master master;private Slave1 slave1;private SubTable subTable;public SubTable getSubTable() {return subTable;}public void setSubTable(SubTable subTable) {this.subTable = subTable;}public Master getMaster() {return master;}public void setMaster(Master master) {this.master = master;}public Slave1 getSlave1() {return slave1;}public void setSlave1(Slave1 slave1) {this.slave1 = slave1;}public static class Master {private String jdbcUrl;private String username;private String password;private String driverClassName;public String getJdbcUrl() {return jdbcUrl;}public void setJdbcUrl(String jdbcUrl) {this.jdbcUrl = jdbcUrl;}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 getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}}public static class Slave1 {private String jdbcUrl;private String username;private String password;private String driverClassName;public String getJdbcUrl() {return jdbcUrl;}public void setJdbcUrl(String jdbcUrl) {this.jdbcUrl = jdbcUrl;}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 getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}}public static class SubTable{private boolean enable;private String schemaRoot;private String schemas;private String strategy;public String getStrategy() {return strategy;}public void setStrategy(String strategy) {this.strategy = strategy;}public boolean isEnable() {return enable;}public void setEnable(boolean enable) {this.enable = enable;}public String getSchemaRoot() {return schemaRoot;}public void setSchemaRoot(String schemaRoot) {this.schemaRoot = schemaRoot;}public List<String> getSchemas() {if (SelfStringUtils.isNotEmpty(this.schemas)) {return Arrays.asList(this.schemas.split(Constant.Symbol.COMMA));}return Lists.newArrayList();}public void setSchemas(String schemas) {this.schemas = schemas;}} }

因?yàn)榇隧?xiàng)目是配置了多數(shù)據(jù)源,所以分為master以及slave兩個(gè)數(shù)據(jù)源配置,再加上分表配置

#-------------------自動(dòng)分表配置----------------- spring.datasource.sub-table.enable = true spring.datasource.sub-table.schema-root = classpath*:sub/ spring.datasource.sub-table.schemas = smg_user spring.datasource.sub-table.strategy = each_day #-------------------自動(dòng)分表配置-----------------

以上配置是寫在application.properties配置文件中的。然后在將我們定義的配置類DataSourceConfig類交給IOC容器管理,即:

  @Bean@ConfigurationProperties(prefix = "spring.datasource")public DatasourceConfig datasourceConfig(){return new DatasourceConfig();}

這樣我們便可以通過自定義的配置類拿到相關(guān)的配置

? ??? 然后通過AOP切入mapper方法層,每次調(diào)用mapper方法時(shí)判斷該執(zhí)行sql的相關(guān)實(shí)體類是否需要分表

@Aspect @Component public class BaseMapperAspect {private final static Logger logger = LoggerFactory.getLogger(BaseMapperAspect.class);// @Autowired // DataSourceProperties dataSourceProperties;// @Autowired // private DataSource dataSource; @Autowiredprivate DatasourceConfig datasourceConfig;@AutowiredSubTableUtilsFactory subTableUtilsFactory;@Autowiredprivate DBService dbService;@ResourceMyRoutingDataSource myRoutingDataSource;@Pointcut("execution(* com.springboot.mybatis.demo.mapper.common.BaseMapper.*(..))")public void getMybatisTableEntity() {}/*** 獲取runtime class* @param joinPoint target* @throws ClassNotFoundException 異常*/@Before("getMybatisTableEntity()")public void setThreadLocalMap(JoinPoint joinPoint) throws ClassNotFoundException {...// 自動(dòng)分表MybatisTable mybatisTable = MybatisTableUtils.getMybatisTable(Class.forName(actualTypeArguments[0].getTypeName()));Assert.isTrue(mybatisTable != null, "Null of the MybatisTable");String oldTableName = mybatisTable.getName();if (datasourceConfig.getSubTable().isEnable() && datasourceConfig.getSubTable().getSchemas().contains(oldTableName)) {ThreadLocalUtils.setSubTableName(subTableUtilsFactory.getSubTableUtil(datasourceConfig.getSubTable().getStrategy()).getTableName(oldTableName));// 判斷是否需要分表 dbService.autoSubTable(ThreadLocalUtils.getSubTableName(),oldTableName,datasourceConfig.getSubTable().getSchemaRoot());}else {
      ThreadLocalUtils.setSubTableName(oldTableName);
     } }

如果需要分表則會(huì)通過配置的策略獲取表名,然后判斷數(shù)據(jù)庫(kù)是否有該表,如果沒有則自動(dòng)創(chuàng)建,否則跳過

? ???? ?創(chuàng)建對(duì)應(yīng)分表后,則是對(duì)sql進(jìn)行攔截修改,這里是定義mybatis攔截器攔截sql,如果該sql對(duì)應(yīng)的實(shí)體類需要分表,則修改sql的表名,即定位到對(duì)應(yīng)表進(jìn)行操作

/*** 動(dòng)態(tài)定位表** @author liuzj* @date 2019-04-15*/ @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class,Integer.class})}) public class SubTableSqlHandler implements Interceptor {Logger logger = LoggerFactory.getLogger(SubTableSqlHandler.class);@Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler handler = (StatementHandler)invocation.getTarget();BoundSql boundSql = handler.getBoundSql();String sql = boundSql.getSql();// 修改 sqlif (SelfStringUtils.isNotEmpty(sql)) {MybatisTable mybatisTable = MybatisTableUtils.getMybatisTable(ThreadLocalUtils.get());Assert.isTrue(mybatisTable != null, "Null of the MybatisTable");Field sqlField = boundSql.getClass().getDeclaredField("sql");sqlField.setAccessible(true);sqlField.set(boundSql,sql.replaceAll(mybatisTable.getName(),ThreadLocalUtils.getSubTableName()));}return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {} }

以上是此項(xiàng)目動(dòng)態(tài)分表的基本思路,詳細(xì)代碼參見GitHub

?

未完!待續(xù)。。。如有不妥之處,請(qǐng)?zhí)峤ㄗh和意見,謝謝

轉(zhuǎn)載于:https://www.cnblogs.com/lzj123/p/9277021.html

總結(jié)

以上是生活随笔為你收集整理的springboot + mybatis + gradle项目构建过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

曰韩无码二三区中文字幕 | 久久zyz资源站无码中文动漫 | 亚洲 激情 小说 另类 欧美 | 欧美35页视频在线观看 | 亚洲色偷偷偷综合网 | 熟妇人妻无码xxx视频 | 特级做a爰片毛片免费69 | 久久精品国产一区二区三区肥胖 | 又色又爽又黄的美女裸体网站 | 亚洲天堂2017无码 | 麻豆国产丝袜白领秘书在线观看 | 极品尤物被啪到呻吟喷水 | 久久综合给合久久狠狠狠97色 | 天天做天天爱天天爽综合网 | 天天躁日日躁狠狠躁免费麻豆 | 国产午夜无码视频在线观看 | 无码人妻av免费一区二区三区 | 午夜精品久久久内射近拍高清 | 欧美猛少妇色xxxxx | 国产精品二区一区二区aⅴ污介绍 | 久久99精品久久久久久动态图 | 狠狠色欧美亚洲狠狠色www | 欧美激情内射喷水高潮 | 国产xxx69麻豆国语对白 | 国产九九九九九九九a片 | 久久精品国产大片免费观看 | 亚洲中文字幕无码中文字在线 | 亚洲成av人在线观看网址 | 亚洲精品国偷拍自产在线麻豆 | 疯狂三人交性欧美 | 无码毛片视频一区二区本码 | 久久久精品欧美一区二区免费 | 中文字幕无码免费久久9一区9 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲精品成a人在线观看 | 亚洲阿v天堂在线 | 国产suv精品一区二区五 | 成人女人看片免费视频放人 | 日韩欧美中文字幕公布 | 欧美熟妇另类久久久久久多毛 | 人人爽人人爽人人片av亚洲 | 亚洲狠狠色丁香婷婷综合 | 曰韩无码二三区中文字幕 | 久久人人爽人人爽人人片ⅴ | 婷婷丁香六月激情综合啪 | 中文字幕av日韩精品一区二区 | 青青久在线视频免费观看 | 亚洲精品成a人在线观看 | 欧美色就是色 | 少妇性俱乐部纵欲狂欢电影 | 丝袜 中出 制服 人妻 美腿 | 成人无码精品1区2区3区免费看 | 欧美肥老太牲交大战 | 久久zyz资源站无码中文动漫 | 色婷婷久久一区二区三区麻豆 | 亚洲男人av香蕉爽爽爽爽 | 日本va欧美va欧美va精品 | 国产精品久久久久久无码 | 亚洲中文字幕成人无码 | 久久精品中文字幕一区 | 国产乱子伦视频在线播放 | 清纯唯美经典一区二区 | 99re在线播放 | 少妇邻居内射在线 | 特黄特色大片免费播放器图片 | 国产成人午夜福利在线播放 | 国产精品.xx视频.xxtv | 装睡被陌生人摸出水好爽 | 国产精品久久精品三级 | 中文字幕乱码中文乱码51精品 | 麻花豆传媒剧国产免费mv在线 | 亚洲人交乣女bbw | 国产人妻精品一区二区三区不卡 | 国产精品久久久久久无码 | 欧美人与禽zoz0性伦交 | 红桃av一区二区三区在线无码av | 无码成人精品区在线观看 | 久久综合九色综合97网 | 永久免费观看美女裸体的网站 | 久久综合久久自在自线精品自 | 中文毛片无遮挡高清免费 | 99久久人妻精品免费一区 | 强奷人妻日本中文字幕 | 在线а√天堂中文官网 | 国产免费无码一区二区视频 | 无码精品人妻一区二区三区av | 女人和拘做爰正片视频 | 国产免费无码一区二区视频 | 亚洲欧洲日本综合aⅴ在线 | 日本饥渴人妻欲求不满 | 亚洲熟熟妇xxxx | 无套内谢的新婚少妇国语播放 | 国产精品怡红院永久免费 | 欧美日韩亚洲国产精品 | 国产精品人人妻人人爽 | 亚洲色www成人永久网址 | 伊人久久婷婷五月综合97色 | 无码免费一区二区三区 | 欧美人妻一区二区三区 | 久久99精品久久久久久 | 高中生自慰www网站 | 亚洲男女内射在线播放 | 日本一卡2卡3卡四卡精品网站 | 熟女体下毛毛黑森林 | 高清国产亚洲精品自在久久 | 国产猛烈高潮尖叫视频免费 | 在线欧美精品一区二区三区 | 亚洲性无码av中文字幕 | 久久zyz资源站无码中文动漫 | 麻豆蜜桃av蜜臀av色欲av | 精品国产乱码久久久久乱码 | 亚洲中文字幕在线无码一区二区 | 日韩欧美群交p片內射中文 | 老子影院午夜精品无码 | 国产亲子乱弄免费视频 | 在线精品亚洲一区二区 | 人妻少妇被猛烈进入中文字幕 | 黑人玩弄人妻中文在线 | 激情综合激情五月俺也去 | 亚洲欧美日韩成人高清在线一区 | 国产精品沙发午睡系列 | 亚洲国精产品一二二线 | 亚洲理论电影在线观看 | www国产亚洲精品久久久日本 | 正在播放东北夫妻内射 | 亚洲一区二区三区在线观看网站 | 天天爽夜夜爽夜夜爽 | 捆绑白丝粉色jk震动捧喷白浆 | 无码纯肉视频在线观看 | 爽爽影院免费观看 | 欧洲极品少妇 | 午夜丰满少妇性开放视频 | 亚洲精品一区国产 | 国产成人午夜福利在线播放 | 亚洲 高清 成人 动漫 | 美女扒开屁股让男人桶 | 亚洲大尺度无码无码专区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 四十如虎的丰满熟妇啪啪 | 亚洲熟妇色xxxxx欧美老妇y | 无码人妻av免费一区二区三区 | 国产精品a成v人在线播放 | а√资源新版在线天堂 | 亚洲а∨天堂久久精品2021 | 久久久久亚洲精品中文字幕 | 国产精品怡红院永久免费 | 人妻无码久久精品人妻 | 国产精品视频免费播放 | а天堂中文在线官网 | 美女张开腿让人桶 | 岛国片人妻三上悠亚 | 欧美丰满老熟妇xxxxx性 | 亚洲国产一区二区三区在线观看 | 少妇被黑人到高潮喷出白浆 | 中文字幕中文有码在线 | 亚洲欧美国产精品久久 | 日日噜噜噜噜夜夜爽亚洲精品 | 成人性做爰aaa片免费看不忠 | 少妇一晚三次一区二区三区 | 97久久精品无码一区二区 | 九一九色国产 | 高中生自慰www网站 | 欧美大屁股xxxxhd黑色 | 久久国产精品精品国产色婷婷 | 男人的天堂av网站 | 国产va免费精品观看 | 亚洲成av人影院在线观看 | 丰满少妇人妻久久久久久 | 18黄暴禁片在线观看 | 少妇被黑人到高潮喷出白浆 | av无码不卡在线观看免费 | 亚洲成色www久久网站 | 国产精品怡红院永久免费 | 国产麻豆精品精东影业av网站 | 久久精品国产99久久6动漫 | 久久综合给久久狠狠97色 | 亚洲精品国产a久久久久久 | 亚洲色偷偷偷综合网 | 中文字幕+乱码+中文字幕一区 | 久久久久免费精品国产 | 中国大陆精品视频xxxx | 97夜夜澡人人双人人人喊 | 国产精品久久久av久久久 | 免费人成在线观看网站 | 一本久道久久综合婷婷五月 | 国产乱人伦av在线无码 | 又大又紧又粉嫩18p少妇 | 中文字幕av日韩精品一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲aⅴ无码成人网站国产app | 亚洲一区二区三区香蕉 | 日本高清一区免费中文视频 | 玩弄人妻少妇500系列视频 | 少妇无码吹潮 | 国产精品亚洲一区二区三区喷水 | 精品一区二区三区无码免费视频 | 国产人成高清在线视频99最全资源 | 亚洲精品国产品国语在线观看 | 亚洲一区av无码专区在线观看 | 国产精品18久久久久久麻辣 | 色综合久久中文娱乐网 | 久久久国产一区二区三区 | 欧美黑人巨大xxxxx | 久久久久国色av免费观看性色 | 久久精品国产一区二区三区 | 99久久无码一区人妻 | 国产色精品久久人妻 | 蜜臀av无码人妻精品 | 精品国产一区二区三区四区在线看 | 无码国产色欲xxxxx视频 | 亚洲人成网站免费播放 | 亚洲七七久久桃花影院 | 丝袜足控一区二区三区 | 麻豆蜜桃av蜜臀av色欲av | 精品人妻人人做人人爽夜夜爽 | 成人无码视频在线观看网站 | 久久久精品成人免费观看 | 成熟女人特级毛片www免费 | 久久无码中文字幕免费影院蜜桃 | 亚洲精品久久久久久一区二区 | 东京无码熟妇人妻av在线网址 | 亚洲一区二区三区四区 | 亚洲一区二区三区偷拍女厕 | 亚洲一区av无码专区在线观看 | 激情亚洲一区国产精品 | 欧美日本免费一区二区三区 | 在线天堂新版最新版在线8 | 欧美阿v高清资源不卡在线播放 | 女人被男人爽到呻吟的视频 | 日本一本二本三区免费 | 亚洲中文字幕在线无码一区二区 | 99国产欧美久久久精品 | 国产成人精品三级麻豆 | 精品国产一区二区三区av 性色 | 无码午夜成人1000部免费视频 | 国产成人综合在线女婷五月99播放 | 亚洲色成人中文字幕网站 | 无码一区二区三区在线观看 | 久久精品国产亚洲精品 | 一本大道久久东京热无码av | 亚洲精品国产a久久久久久 | 国产三级精品三级男人的天堂 | 精品国产福利一区二区 | 少妇无码一区二区二三区 | 日本大香伊一区二区三区 | 国产特级毛片aaaaaaa高清 | 真人与拘做受免费视频 | 精品国产麻豆免费人成网站 | 国产精品99久久精品爆乳 | 欧美zoozzooz性欧美 | 精品亚洲成av人在线观看 | 亚洲色在线无码国产精品不卡 | 国内揄拍国内精品人妻 | 夫妻免费无码v看片 | 国产亚av手机在线观看 | 国精产品一品二品国精品69xx | 女人和拘做爰正片视频 | 亚洲 高清 成人 动漫 | 亚洲 高清 成人 动漫 | 亚洲精品综合五月久久小说 | 免费无码午夜福利片69 | 7777奇米四色成人眼影 | 国内精品一区二区三区不卡 | 无套内谢老熟女 | 日韩亚洲欧美精品综合 | 欧美国产亚洲日韩在线二区 | 色情久久久av熟女人妻网站 | 久久精品国产精品国产精品污 | 红桃av一区二区三区在线无码av | 国产精品高潮呻吟av久久 | 九月婷婷人人澡人人添人人爽 | 兔费看少妇性l交大片免费 | 日韩人妻系列无码专区 | 亚洲国产成人av在线观看 | 欧美日本免费一区二区三区 | 国产成人无码av一区二区 | 99久久婷婷国产综合精品青草免费 | 98国产精品综合一区二区三区 | 欧美色就是色 | 久久精品人妻少妇一区二区三区 | 国产午夜视频在线观看 | 三上悠亚人妻中文字幕在线 | 99久久99久久免费精品蜜桃 | 亚洲色成人中文字幕网站 | 又大又黄又粗又爽的免费视频 | 国产sm调教视频在线观看 | 少妇无码av无码专区在线观看 | 人人爽人人澡人人人妻 | 免费人成网站视频在线观看 | 国产精品美女久久久网av | 兔费看少妇性l交大片免费 | 天海翼激烈高潮到腰振不止 | 亚洲综合无码久久精品综合 | 国产69精品久久久久app下载 | 狂野欧美性猛交免费视频 | 亚洲精品久久久久久久久久久 | 亚洲一区二区三区无码久久 | 国产成人无码午夜视频在线观看 | 国产口爆吞精在线视频 | av在线亚洲欧洲日产一区二区 | 国产内射爽爽大片视频社区在线 | 99久久婷婷国产综合精品青草免费 | 午夜福利电影 | 久久久久av无码免费网 | 狠狠色噜噜狠狠狠狠7777米奇 | 日本一本二本三区免费 | 亚洲无人区午夜福利码高清完整版 | 中文字幕人妻无码一区二区三区 | 国产精品成人av在线观看 | 国产精品多人p群无码 | 亚洲综合另类小说色区 | 色综合久久中文娱乐网 | 成人精品一区二区三区中文字幕 | 亚洲精品中文字幕乱码 | 国产av剧情md精品麻豆 | 亚洲欧美日韩综合久久久 | 大屁股大乳丰满人妻 | 欧美精品一区二区精品久久 | 精品一区二区三区无码免费视频 | 狂野欧美性猛交免费视频 | 夜夜影院未满十八勿进 | 日本www一道久久久免费榴莲 | 亚洲a无码综合a国产av中文 | 国产内射爽爽大片视频社区在线 | 97人妻精品一区二区三区 | 中文精品久久久久人妻不卡 | 呦交小u女精品视频 | 少妇人妻av毛片在线看 | 熟女少妇人妻中文字幕 | 亚洲一区二区三区四区 | 精品国偷自产在线 | 一个人免费观看的www视频 | 久久五月精品中文字幕 | 人人妻人人澡人人爽精品欧美 | 女人和拘做爰正片视频 | 亚洲中文字幕在线观看 | 中文字幕中文有码在线 | 三上悠亚人妻中文字幕在线 | 亚洲人成网站色7799 | 日本免费一区二区三区最新 | 丰满少妇高潮惨叫视频 | 日本一区二区三区免费高清 | 成人精品视频一区二区三区尤物 | 麻花豆传媒剧国产免费mv在线 | 国产精品久久久久7777 | 荫蒂被男人添的好舒服爽免费视频 | 成人免费视频视频在线观看 免费 | 久久99精品国产.久久久久 | 亚洲码国产精品高潮在线 | 精品无码成人片一区二区98 | 久久精品女人天堂av免费观看 | 天天拍夜夜添久久精品大 | 国产精品亚洲а∨无码播放麻豆 | 99er热精品视频 | 国产日产欧产精品精品app | 国产黄在线观看免费观看不卡 | 人人妻人人藻人人爽欧美一区 | 国产乱子伦视频在线播放 | 欧美老妇与禽交 | 日韩视频 中文字幕 视频一区 | 国产成人精品视频ⅴa片软件竹菊 | 久久综合狠狠综合久久综合88 | 免费无码av一区二区 | 超碰97人人射妻 | 小sao货水好多真紧h无码视频 | 亚洲乱码国产乱码精品精 | 性欧美熟妇videofreesex | 国产无遮挡吃胸膜奶免费看 | 少妇无码一区二区二三区 | 国产精品办公室沙发 | 内射后入在线观看一区 | 久久综合色之久久综合 | 无码一区二区三区在线观看 | 婷婷丁香五月天综合东京热 | 成人aaa片一区国产精品 | 99久久久国产精品无码免费 | 国产福利视频一区二区 | 国产日产欧产精品精品app | 3d动漫精品啪啪一区二区中 | 日韩亚洲欧美中文高清在线 | 亚洲欧洲日本综合aⅴ在线 | 亚洲精品国产第一综合99久久 | 午夜时刻免费入口 | 亚洲精品综合一区二区三区在线 | 国产在线精品一区二区三区直播 | 亚洲精品成人av在线 | 在线观看国产午夜福利片 | 思思久久99热只有频精品66 | 欧美老人巨大xxxx做受 | 少妇被粗大的猛进出69影院 | 超碰97人人做人人爱少妇 | 网友自拍区视频精品 | 亚洲熟妇色xxxxx欧美老妇y | 一本色道久久综合亚洲精品不卡 | 免费无码肉片在线观看 | 女人被爽到呻吟gif动态图视看 | 国产舌乚八伦偷品w中 | 欧美怡红院免费全部视频 | 成人av无码一区二区三区 | 樱花草在线社区www | 精品一区二区三区无码免费视频 | 国产亚洲精品久久久久久 | 在线观看国产午夜福利片 | 久久精品国产精品国产精品污 | 无码av岛国片在线播放 | 久久aⅴ免费观看 | 亚洲阿v天堂在线 | 国产av无码专区亚洲awww | 色妞www精品免费视频 | 女人高潮内射99精品 | 东京无码熟妇人妻av在线网址 | 日韩精品乱码av一区二区 | 正在播放老肥熟妇露脸 | 天天爽夜夜爽夜夜爽 | 久久亚洲精品成人无码 | 久久zyz资源站无码中文动漫 | 成人一在线视频日韩国产 | 亚洲精品一区二区三区在线 | 免费观看又污又黄的网站 | 亚洲a无码综合a国产av中文 | 无码纯肉视频在线观看 | 国产亚洲精品精品国产亚洲综合 | 亚洲国产日韩a在线播放 | 丰满少妇弄高潮了www | 高清无码午夜福利视频 | 人人妻人人澡人人爽人人精品浪潮 | 国产乡下妇女做爰 | 成人精品视频一区二区三区尤物 | 在线欧美精品一区二区三区 | 西西人体www44rt大胆高清 | 国产9 9在线 | 中文 | 男人和女人高潮免费网站 | 夜夜夜高潮夜夜爽夜夜爰爰 | 日本精品久久久久中文字幕 | 无码人妻丰满熟妇区毛片18 | 丰满人妻翻云覆雨呻吟视频 | 天天拍夜夜添久久精品大 | 欧美丰满少妇xxxx性 | 兔费看少妇性l交大片免费 | 亚洲日本一区二区三区在线 | 亚洲欧美国产精品专区久久 | 国产成人一区二区三区在线观看 | 波多野结衣高清一区二区三区 | 成人欧美一区二区三区黑人 | 久久亚洲a片com人成 | 狠狠色噜噜狠狠狠狠7777米奇 | 露脸叫床粗话东北少妇 | 97se亚洲精品一区 | 精品人妻av区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 少妇高潮一区二区三区99 | 欧美高清在线精品一区 | 国产精品久久久久无码av色戒 | 日产国产精品亚洲系列 | 国产精品a成v人在线播放 | 夜先锋av资源网站 | 色狠狠av一区二区三区 | 国产黑色丝袜在线播放 | 国产精品18久久久久久麻辣 | 久久人人爽人人爽人人片av高清 | 日本饥渴人妻欲求不满 | 国产成人一区二区三区在线观看 | 久久久久久久久888 | 国产在线精品一区二区三区直播 | 亚洲综合精品香蕉久久网 | 欧美熟妇另类久久久久久多毛 | 亚洲综合无码久久精品综合 | 欧美老妇与禽交 | 性色av无码免费一区二区三区 | 国产精品亚洲综合色区韩国 | 一个人免费观看的www视频 | 国产精品第一国产精品 | 午夜性刺激在线视频免费 | 亚洲а∨天堂久久精品2021 | 亚洲欧美中文字幕5发布 | 成人无码精品一区二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 中文字幕+乱码+中文字幕一区 | 少妇的肉体aa片免费 | 在线a亚洲视频播放在线观看 | 亚洲色成人中文字幕网站 | 国产两女互慰高潮视频在线观看 | 国产精品鲁鲁鲁 | 扒开双腿疯狂进出爽爽爽视频 | 午夜不卡av免费 一本久久a久久精品vr综合 | 色欲久久久天天天综合网精品 | 红桃av一区二区三区在线无码av | 国产精品va在线播放 | 久久精品国产亚洲精品 | 免费观看激色视频网站 | 亚洲一区二区三区无码久久 | 色五月五月丁香亚洲综合网 | 久久国产精品偷任你爽任你 | 国产无遮挡又黄又爽又色 | 中文字幕 亚洲精品 第1页 | 国产亚洲人成在线播放 | 成人免费视频在线观看 | 久久无码专区国产精品s | 综合网日日天干夜夜久久 | 色五月五月丁香亚洲综合网 | 成人亚洲精品久久久久软件 | 日本熟妇人妻xxxxx人hd | 婷婷五月综合激情中文字幕 | 国产三级精品三级男人的天堂 | 一本无码人妻在中文字幕免费 | 乌克兰少妇xxxx做受 | a国产一区二区免费入口 | 国产av久久久久精东av | 精品国产精品久久一区免费式 | 日本精品人妻无码免费大全 | av无码不卡在线观看免费 | 国産精品久久久久久久 | 亚洲精品成人福利网站 | 天天躁夜夜躁狠狠是什么心态 | 国产乱人伦av在线无码 | 婷婷丁香五月天综合东京热 | 国产av一区二区精品久久凹凸 | 国产成人无码av一区二区 | 亚洲一区二区三区香蕉 | 国产人妻精品一区二区三区不卡 | 亚拍精品一区二区三区探花 | 久久国产自偷自偷免费一区调 | 亚洲欧美综合区丁香五月小说 | 无码av岛国片在线播放 | 久久久久久久人妻无码中文字幕爆 | 色综合久久中文娱乐网 | 精品国产一区二区三区四区 | 欧美熟妇另类久久久久久不卡 | 无码中文字幕色专区 | 一本久道久久综合狠狠爱 | 久久精品国产99久久6动漫 | 日韩精品无码一区二区中文字幕 | 国产人妻精品一区二区三区不卡 | 欧美freesex黑人又粗又大 | 粗大的内捧猛烈进出视频 | 爽爽影院免费观看 | 亚洲高清偷拍一区二区三区 | 国产精品va在线观看无码 | 2020最新国产自产精品 | 97精品人妻一区二区三区香蕉 | 成人无码视频在线观看网站 | 人妻天天爽夜夜爽一区二区 | 国产亚洲人成a在线v网站 | 久久无码中文字幕免费影院蜜桃 | 久久久久国色av免费观看性色 | 中国女人内谢69xxxxxa片 | 久久亚洲国产成人精品性色 | 人人超人人超碰超国产 | 奇米影视7777久久精品 | 波多野结衣 黑人 | 精品久久久久香蕉网 | 日日躁夜夜躁狠狠躁 | 久久综合激激的五月天 | 成人欧美一区二区三区黑人 | 国产精品久久久一区二区三区 | 国产精品对白交换视频 | 丰满人妻被黑人猛烈进入 | 国产精品a成v人在线播放 | 一本久久a久久精品亚洲 | 国产精品欧美成人 | 欧美精品在线观看 | 亚洲中文无码av永久不收费 | 无码人妻丰满熟妇区五十路百度 | 无码人妻少妇伦在线电影 | 老司机亚洲精品影院 | 国产成人精品三级麻豆 | 欧美一区二区三区视频在线观看 | 麻花豆传媒剧国产免费mv在线 | 少妇高潮一区二区三区99 | 夜精品a片一区二区三区无码白浆 | 熟妇人妻中文av无码 | 一区二区三区乱码在线 | 欧洲 | 俄罗斯老熟妇色xxxx | 国产偷抇久久精品a片69 | 夜夜影院未满十八勿进 | 亚洲成a人片在线观看无码3d | 亚洲国产高清在线观看视频 | 亚无码乱人伦一区二区 | 在教室伦流澡到高潮hnp视频 | 亚洲精品午夜国产va久久成人 | 久精品国产欧美亚洲色aⅴ大片 | 国内揄拍国内精品少妇国语 | 四虎国产精品一区二区 | 国产av一区二区三区最新精品 | 成人欧美一区二区三区黑人免费 | 99久久亚洲精品无码毛片 | 在线看片无码永久免费视频 | 国产日产欧产精品精品app | 又大又黄又粗又爽的免费视频 | 亚洲爆乳精品无码一区二区三区 | 欧洲极品少妇 | 欧美喷潮久久久xxxxx | 成熟人妻av无码专区 | 中文字幕无码视频专区 | 国产av一区二区精品久久凹凸 | 3d动漫精品啪啪一区二区中 | 熟妇人妻中文av无码 | 国产一区二区三区四区五区加勒比 | 亚洲人亚洲人成电影网站色 | 少妇高潮一区二区三区99 | 亚洲色www成人永久网址 | 国产亚洲欧美在线专区 | 无码人妻少妇伦在线电影 | 亚洲gv猛男gv无码男同 | 亚洲性无码av中文字幕 | 5858s亚洲色大成网站www | 在线观看国产一区二区三区 | 日本高清一区免费中文视频 | 国产真实乱对白精彩久久 | 亚洲精品午夜国产va久久成人 | 国产色xx群视频射精 | 国产熟妇另类久久久久 | 亚洲色偷偷男人的天堂 | 一个人看的www免费视频在线观看 | 一本一道久久综合久久 | 欧美日本免费一区二区三区 | 亚洲区欧美区综合区自拍区 | 人妻与老人中文字幕 | 日本精品少妇一区二区三区 | 免费无码av一区二区 | 中文字幕 人妻熟女 | 少妇邻居内射在线 | 免费看少妇作爱视频 | 日本精品久久久久中文字幕 | 国产又爽又黄又刺激的视频 | 中文精品久久久久人妻不卡 | 思思久久99热只有频精品66 | 色欲综合久久中文字幕网 | 九九热爱视频精品 | 亚洲国产精华液网站w | 强开小婷嫩苞又嫩又紧视频 | 在线a亚洲视频播放在线观看 | 成在人线av无码免观看麻豆 | 亚洲午夜无码久久 | 国产精品成人av在线观看 | 一本精品99久久精品77 | 久久综合九色综合97网 | 亚洲 a v无 码免 费 成 人 a v | 婷婷六月久久综合丁香 | 99久久亚洲精品无码毛片 | 捆绑白丝粉色jk震动捧喷白浆 | 日本丰满熟妇videos | 天海翼激烈高潮到腰振不止 | 97夜夜澡人人爽人人喊中国片 | 国内精品九九久久久精品 | 精品无人区无码乱码毛片国产 | 亚洲七七久久桃花影院 | 中文字幕无码免费久久99 | 久久99精品国产.久久久久 | 欧美zoozzooz性欧美 | 在线观看国产午夜福利片 | 纯爱无遮挡h肉动漫在线播放 | 久久99精品国产麻豆 | 亚洲无人区一区二区三区 | 色婷婷欧美在线播放内射 | 永久免费观看美女裸体的网站 | 青青草原综合久久大伊人精品 | 日韩av激情在线观看 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 大地资源中文第3页 | 国产成人无码av片在线观看不卡 | 特级做a爰片毛片免费69 | 久久精品国产日本波多野结衣 | 99久久99久久免费精品蜜桃 | 亚洲人亚洲人成电影网站色 | 亚洲精品中文字幕乱码 | 女高中生第一次破苞av | 国产在线无码精品电影网 | 亚洲中文字幕久久无码 | 人妻无码αv中文字幕久久琪琪布 | 白嫩日本少妇做爰 | 久久久精品人妻久久影视 | 4hu四虎永久在线观看 | 无码午夜成人1000部免费视频 | 鲁鲁鲁爽爽爽在线视频观看 | 又湿又紧又大又爽a视频国产 | 未满小14洗澡无码视频网站 | 精品久久久无码人妻字幂 | 国产精品亚洲一区二区三区喷水 | 欧美 日韩 亚洲 在线 | 麻豆md0077饥渴少妇 | 国内揄拍国内精品少妇国语 | 久久午夜无码鲁丝片 | 国产偷国产偷精品高清尤物 | 亚洲成色在线综合网站 | 欧洲精品码一区二区三区免费看 | 亚洲综合无码久久精品综合 | 亚洲成a人片在线观看无码3d | 黑人巨大精品欧美一区二区 | 欧洲熟妇色 欧美 | 丁香啪啪综合成人亚洲 | 在线精品国产一区二区三区 | 精品成在人线av无码免费看 | 粉嫩少妇内射浓精videos | 中文字幕日产无线码一区 | 国内揄拍国内精品人妻 | 国产成人久久精品流白浆 | 免费国产成人高清在线观看网站 | 欧美日韩一区二区三区自拍 | 国模大胆一区二区三区 | 成 人 免费观看网站 | 丰满人妻翻云覆雨呻吟视频 | 日韩精品久久久肉伦网站 | 免费观看黄网站 | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕人妻无码一夲道 | 2020久久香蕉国产线看观看 | 亚洲国产午夜精品理论片 | 成人欧美一区二区三区黑人免费 | 色偷偷人人澡人人爽人人模 | 亚洲日韩一区二区三区 | 欧美国产亚洲日韩在线二区 | 人人妻在人人 | 国产办公室秘书无码精品99 | 98国产精品综合一区二区三区 | 成年美女黄网站色大免费全看 | 中文字幕+乱码+中文字幕一区 | 97无码免费人妻超级碰碰夜夜 | 日韩成人一区二区三区在线观看 | 老子影院午夜精品无码 | 国産精品久久久久久久 | 亚洲男女内射在线播放 | 丰满岳乱妇在线观看中字无码 | 国产av无码专区亚洲awww | 3d动漫精品啪啪一区二区中 | 国产99久久精品一区二区 | 色诱久久久久综合网ywww | 精品亚洲韩国一区二区三区 | 18黄暴禁片在线观看 | 丰满护士巨好爽好大乳 | 国内精品九九久久久精品 | 成人无码精品1区2区3区免费看 | 国产精品无码久久av | 97久久精品无码一区二区 | 国产成人无码av片在线观看不卡 | 巨爆乳无码视频在线观看 | 国内精品一区二区三区不卡 | 高清无码午夜福利视频 | 亚洲成av人影院在线观看 | 亚洲精品成人福利网站 | 四虎永久在线精品免费网址 | 久久综合九色综合欧美狠狠 | 午夜无码人妻av大片色欲 | 福利一区二区三区视频在线观看 | 131美女爱做视频 | 国语精品一区二区三区 | 美女张开腿让人桶 | 亚洲呦女专区 | 精品国精品国产自在久国产87 | 成人免费无码大片a毛片 | 国内精品久久久久久中文字幕 | 婷婷五月综合激情中文字幕 | 成 人 网 站国产免费观看 | 夜精品a片一区二区三区无码白浆 | 亚洲国产高清在线观看视频 | a在线观看免费网站大全 | 中文字幕无码热在线视频 | 国产亚洲美女精品久久久2020 | 成人性做爰aaa片免费看不忠 | 丰满少妇熟乱xxxxx视频 | 国产综合久久久久鬼色 | 国产极品美女高潮无套在线观看 | 国产成人人人97超碰超爽8 | 扒开双腿吃奶呻吟做受视频 | 天天躁日日躁狠狠躁免费麻豆 | 久久www免费人成人片 | 国产亚洲精品久久久久久国模美 | 亚洲a无码综合a国产av中文 | 丰满人妻翻云覆雨呻吟视频 | 国产成人精品三级麻豆 | 4hu四虎永久在线观看 | 亚洲欧美国产精品久久 | 骚片av蜜桃精品一区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国语精品一区二区三区 | 久久国产精品精品国产色婷婷 | 中文字幕无码热在线视频 | 成人免费视频在线观看 | 国产超碰人人爽人人做人人添 | 九九热爱视频精品 | 国产亚洲视频中文字幕97精品 | 欧美黑人巨大xxxxx | 日日天干夜夜狠狠爱 | 特黄特色大片免费播放器图片 | 久久人妻内射无码一区三区 | 久久久久久亚洲精品a片成人 | 爱做久久久久久 | 377p欧洲日本亚洲大胆 | 精品国产福利一区二区 | 红桃av一区二区三区在线无码av | 久久久精品成人免费观看 | 人妻体内射精一区二区三四 | yw尤物av无码国产在线观看 | v一区无码内射国产 | 中文毛片无遮挡高清免费 | 撕开奶罩揉吮奶头视频 | 思思久久99热只有频精品66 | 在线看片无码永久免费视频 | 四虎4hu永久免费 | 在线观看欧美一区二区三区 | 久久久久久久久888 | 人妻少妇精品无码专区二区 | 人人妻人人澡人人爽精品欧美 | 又大又硬又黄的免费视频 | 日韩人妻无码一区二区三区久久99 | 少妇无码av无码专区在线观看 | 亚洲va中文字幕无码久久不卡 | 亚洲爆乳精品无码一区二区三区 | 九九在线中文字幕无码 | 亚洲国产精品无码一区二区三区 | 国产在热线精品视频 | aa片在线观看视频在线播放 | 久青草影院在线观看国产 | 大地资源网第二页免费观看 | 精品成在人线av无码免费看 | 国产精品久久久久7777 | www国产亚洲精品久久久日本 | www国产亚洲精品久久网站 | 久久无码中文字幕免费影院蜜桃 | 亚洲欧洲无卡二区视頻 | 一二三四社区在线中文视频 | 鲁鲁鲁爽爽爽在线视频观看 | 少妇太爽了在线观看 | 成人一区二区免费视频 | 免费人成网站视频在线观看 | 无码人妻精品一区二区三区不卡 | 色综合久久88色综合天天 | 久久久婷婷五月亚洲97号色 | 欧美国产日韩久久mv | 一二三四在线观看免费视频 | 99久久精品午夜一区二区 | 精品国产乱码久久久久乱码 | 2020最新国产自产精品 | 亚洲色www成人永久网址 | 精品人人妻人人澡人人爽人人 | 在线精品亚洲一区二区 | 欧美性生交xxxxx久久久 | 色综合久久中文娱乐网 | 欧美成人高清在线播放 | 国产精品亚洲lv粉色 | 亚洲综合另类小说色区 | 午夜福利试看120秒体验区 | 国产精品视频免费播放 | 中文精品无码中文字幕无码专区 | 国产熟妇高潮叫床视频播放 | 男女性色大片免费网站 | 国产精品毛片一区二区 | 最近免费中文字幕中文高清百度 | 人妻少妇被猛烈进入中文字幕 | 亚洲人成影院在线无码按摩店 | 丰满少妇人妻久久久久久 | 国产超碰人人爽人人做人人添 | 伊人色综合久久天天小片 | 少妇太爽了在线观看 | 亚洲色大成网站www国产 | 荫蒂被男人添的好舒服爽免费视频 | 国产特级毛片aaaaaa高潮流水 | 亚洲无人区午夜福利码高清完整版 | 免费人成在线视频无码 | 亚洲人成网站免费播放 | 精品 日韩 国产 欧美 视频 | 性色av无码免费一区二区三区 | 内射爽无广熟女亚洲 | 亚洲第一无码av无码专区 | 呦交小u女精品视频 | 久9re热视频这里只有精品 | 人妻中文无码久热丝袜 | 久久久亚洲欧洲日产国码αv | 亚洲人成影院在线观看 | 特级做a爰片毛片免费69 | 激情亚洲一区国产精品 | 久久人人爽人人人人片 | 久久精品国产日本波多野结衣 | 亚洲s色大片在线观看 | 999久久久国产精品消防器材 | 无码帝国www无码专区色综合 | 国产成人人人97超碰超爽8 | 欧美人与善在线com | 2020久久香蕉国产线看观看 | 欧美精品国产综合久久 | 欧美人与动性行为视频 | 一本加勒比波多野结衣 | 无码任你躁久久久久久久 | 国产精品内射视频免费 | 丰满人妻被黑人猛烈进入 | 精品国产一区二区三区四区 | 欧美三级a做爰在线观看 | 青草青草久热国产精品 | 国产激情综合五月久久 | 午夜福利电影 | 天堂一区人妻无码 | 中文字幕无码日韩欧毛 | 一区二区传媒有限公司 | 国产精品国产三级国产专播 | 中文字幕无码av激情不卡 | 亚洲另类伦春色综合小说 | 国产人妻大战黑人第1集 | 欧洲vodafone精品性 | 国产精品久久久午夜夜伦鲁鲁 | 国产精品久久精品三级 | 丰满人妻翻云覆雨呻吟视频 | 久久久中文字幕日本无吗 | 国内老熟妇对白xxxxhd | 熟妇人妻无乱码中文字幕 | 国产午夜无码视频在线观看 | 黑人巨大精品欧美黑寡妇 | 亚洲精品午夜无码电影网 | 97久久国产亚洲精品超碰热 | 全球成人中文在线 | 亚洲高清偷拍一区二区三区 | 欧美国产日产一区二区 | 色婷婷久久一区二区三区麻豆 | 性史性农村dvd毛片 | 东京热一精品无码av | 国产成人精品一区二区在线小狼 | 一个人看的视频www在线 | 精品国产乱码久久久久乱码 | 精品偷拍一区二区三区在线看 | 日本大乳高潮视频在线观看 | 成熟妇人a片免费看网站 | 东北女人啪啪对白 | 国产熟妇另类久久久久 | 亚洲日本在线电影 | 午夜福利电影 | 久久久久久久久蜜桃 | 国产人妻人伦精品 | 久久无码中文字幕免费影院蜜桃 | 日本精品久久久久中文字幕 | 国产无遮挡吃胸膜奶免费看 | 国产精品久久国产精品99 | 76少妇精品导航 | 激情内射亚州一区二区三区爱妻 | 大色综合色综合网站 | 麻花豆传媒剧国产免费mv在线 | 亚洲区小说区激情区图片区 | 国产精品第一区揄拍无码 | yw尤物av无码国产在线观看 | 99久久久国产精品无码免费 | 久久久国产一区二区三区 | 亚洲色大成网站www国产 | 国产欧美亚洲精品a | 成人欧美一区二区三区 | 精品国产青草久久久久福利 | 天天拍夜夜添久久精品大 | 亚洲色大成网站www国产 | 久久久久av无码免费网 | 少妇被黑人到高潮喷出白浆 | 亚洲一区二区三区在线观看网站 | 波多野结衣一区二区三区av免费 | 天堂久久天堂av色综合 | 黑人巨大精品欧美黑寡妇 | 国产亚洲视频中文字幕97精品 | 精品久久久中文字幕人妻 | 国产婷婷色一区二区三区在线 | 精品人妻人人做人人爽 | 成人av无码一区二区三区 | 国产成人人人97超碰超爽8 | 小泽玛莉亚一区二区视频在线 | 亚洲国产精品久久人人爱 | 国产亚洲精品久久久久久国模美 | 久久久精品成人免费观看 | 午夜福利不卡在线视频 | 人妻与老人中文字幕 | 国产亚洲精品久久久ai换 | 欧美丰满熟妇xxxx性ppx人交 | 久久国产精品萌白酱免费 | 未满小14洗澡无码视频网站 | 亚洲成a人片在线观看无码3d | 亚洲中文字幕无码中文字在线 | 嫩b人妻精品一区二区三区 | 狠狠综合久久久久综合网 | 老司机亚洲精品影院无码 | 曰韩无码二三区中文字幕 | 国产无遮挡吃胸膜奶免费看 | 黑人粗大猛烈进出高潮视频 | 久久午夜无码鲁丝片秋霞 | 亚洲精品午夜国产va久久成人 | 国产精品爱久久久久久久 | 亚洲呦女专区 | 国产无遮挡吃胸膜奶免费看 | 国产suv精品一区二区五 | 久久久国产精品无码免费专区 | 小泽玛莉亚一区二区视频在线 | 99久久精品日本一区二区免费 | 亚洲日韩一区二区三区 | 无码人妻黑人中文字幕 | 国产成人无码av片在线观看不卡 | 国产成人午夜福利在线播放 | 欧美国产亚洲日韩在线二区 | 特大黑人娇小亚洲女 | 日韩精品a片一区二区三区妖精 | 在线欧美精品一区二区三区 | 最新国产麻豆aⅴ精品无码 | 精品日本一区二区三区在线观看 | 白嫩日本少妇做爰 | 国产香蕉尹人视频在线 | 久久国产精品二国产精品 | 亚洲国产精品一区二区美利坚 | 日韩欧美中文字幕公布 | 好爽又高潮了毛片免费下载 | 亚洲日韩一区二区 | 国产精品高潮呻吟av久久4虎 | 久久久精品欧美一区二区免费 | 久久久久久久女国产乱让韩 | 国产精品内射视频免费 | 亚洲の无码国产の无码影院 | 久久久婷婷五月亚洲97号色 | 久久久久久久女国产乱让韩 | 国产一区二区三区日韩精品 | 娇妻被黑人粗大高潮白浆 | 欧美兽交xxxx×视频 | 亚洲综合精品香蕉久久网 | 少妇邻居内射在线 | 国产精品视频免费播放 | 国产无套粉嫩白浆在线 | 日产国产精品亚洲系列 | 内射欧美老妇wbb | 76少妇精品导航 | 免费观看激色视频网站 | 中文字幕人成乱码熟女app | 最新国产乱人伦偷精品免费网站 | 国产内射爽爽大片视频社区在线 | 亚洲成色在线综合网站 | 男女下面进入的视频免费午夜 | 装睡被陌生人摸出水好爽 | 少妇激情av一区二区 | 久久无码专区国产精品s | 成人欧美一区二区三区黑人 | 国产性生大片免费观看性 | 日韩 欧美 动漫 国产 制服 | 国产后入清纯学生妹 | 国产亚洲tv在线观看 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 免费无码肉片在线观看 | 最新国产乱人伦偷精品免费网站 | 亚洲日韩av一区二区三区四区 | 小泽玛莉亚一区二区视频在线 | 亚欧洲精品在线视频免费观看 | 精品成在人线av无码免费看 | 蜜桃无码一区二区三区 | 久久精品人人做人人综合 | 亚洲综合在线一区二区三区 | 国产偷国产偷精品高清尤物 | а√资源新版在线天堂 | 亚洲人成网站免费播放 | 大地资源中文第3页 | 亚洲国产欧美日韩精品一区二区三区 | 免费播放一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 久热国产vs视频在线观看 | 精品日本一区二区三区在线观看 | 伊在人天堂亚洲香蕉精品区 | 国产人妖乱国产精品人妖 | 无人区乱码一区二区三区 | 2019nv天堂香蕉在线观看 | 欧美三级不卡在线观看 | 亚洲区欧美区综合区自拍区 | 捆绑白丝粉色jk震动捧喷白浆 | 性生交片免费无码看人 | 强伦人妻一区二区三区视频18 | 欧美老人巨大xxxx做受 | 97久久超碰中文字幕 | 在线欧美精品一区二区三区 | 日韩欧美成人免费观看 | 人妻少妇被猛烈进入中文字幕 | 无码av免费一区二区三区试看 | 中文字幕+乱码+中文字幕一区 | 蜜臀aⅴ国产精品久久久国产老师 | 中文字幕无码av波多野吉衣 | 亚洲另类伦春色综合小说 | 亚洲欧美综合区丁香五月小说 | 无码人妻丰满熟妇区毛片18 | 久久国产精品萌白酱免费 | 大色综合色综合网站 | 在线观看免费人成视频 | 国产免费观看黄av片 | 国产精品办公室沙发 | 亚洲欧美日韩综合久久久 | 国产在热线精品视频 | 国产精品第一区揄拍无码 | 亚洲日本va中文字幕 | 午夜福利电影 | 自拍偷自拍亚洲精品被多人伦好爽 | 精品无码av一区二区三区 | 亚洲大尺度无码无码专区 | 久久久久久a亚洲欧洲av冫 | 亚洲男人av天堂午夜在 | 亚洲日韩一区二区 | 伊人久久大香线焦av综合影院 | 人人超人人超碰超国产 | 久久亚洲精品中文字幕无男同 | 午夜免费福利小电影 | 无码一区二区三区在线观看 | 国产成人午夜福利在线播放 | 免费无码一区二区三区蜜桃大 | 少妇被粗大的猛进出69影院 | 亚洲午夜久久久影院 | 国产特级毛片aaaaaaa高清 | 麻豆md0077饥渴少妇 | 无码乱肉视频免费大全合集 | 国精产品一品二品国精品69xx | 亚洲一区二区三区播放 | 亚洲成av人片在线观看无码不卡 | 日日碰狠狠躁久久躁蜜桃 | 精品夜夜澡人妻无码av蜜桃 | v一区无码内射国产 | 麻豆成人精品国产免费 | 日日天日日夜日日摸 | 亚洲中文字幕无码中字 | 一本色道久久综合亚洲精品不卡 | 精品国产青草久久久久福利 | 丝袜人妻一区二区三区 | 久久久久久九九精品久 | 国产av无码专区亚洲awww | 无码人妻精品一区二区三区不卡 | 国产午夜手机精彩视频 | 亚洲日本一区二区三区在线 | 国产香蕉尹人视频在线 | 亚洲男人av天堂午夜在 | 老太婆性杂交欧美肥老太 | 国产精华av午夜在线观看 | 丝袜美腿亚洲一区二区 | 久久伊人色av天堂九九小黄鸭 | 国产精品-区区久久久狼 | 性生交片免费无码看人 | 国产精品久久久av久久久 | 久久久无码中文字幕久... | 中文字幕 亚洲精品 第1页 | 少妇无码吹潮 | 无码帝国www无码专区色综合 | 大肉大捧一进一出视频出来呀 | 欧美日韩一区二区三区自拍 | 精品熟女少妇av免费观看 | 亚洲 欧美 激情 小说 另类 | 久青草影院在线观看国产 | 亚洲色无码一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 欧美国产日产一区二区 | 水蜜桃色314在线观看 | 国产亚洲美女精品久久久2020 | 国产亚洲视频中文字幕97精品 | 日日鲁鲁鲁夜夜爽爽狠狠 | 伊人久久大香线焦av综合影院 | 无码纯肉视频在线观看 | 亚洲色偷偷男人的天堂 | 色一情一乱一伦一区二区三欧美 | 国产在线一区二区三区四区五区 | 成人精品天堂一区二区三区 | 真人与拘做受免费视频一 | 久久久久免费精品国产 | 一本久道久久综合婷婷五月 | 大地资源中文第3页 | 成人女人看片免费视频放人 | 亚洲伊人久久精品影院 | 久久精品国产精品国产精品污 | 国产成人人人97超碰超爽8 | 亚洲自偷自偷在线制服 | 人人爽人人澡人人人妻 | 久久综合给久久狠狠97色 | 无码福利日韩神码福利片 | 亚洲人交乣女bbw | 国产做国产爱免费视频 | 青青青爽视频在线观看 | 无遮挡国产高潮视频免费观看 | 性生交片免费无码看人 | 性做久久久久久久免费看 | 一本精品99久久精品77 | 国产精品自产拍在线观看 | 少妇邻居内射在线 | 在线a亚洲视频播放在线观看 | 人妻少妇精品视频专区 | 久久久久久久人妻无码中文字幕爆 | 久久久国产精品无码免费专区 | 日日碰狠狠丁香久燥 | 久久人人爽人人爽人人片av高清 | 国产超级va在线观看视频 | 蜜桃视频插满18在线观看 | 国产9 9在线 | 中文 | 亚洲人成网站免费播放 | 特级做a爰片毛片免费69 | 99精品国产综合久久久久五月天 | 性色欲网站人妻丰满中文久久不卡 | 97久久精品无码一区二区 | 成人亚洲精品久久久久软件 | 日韩精品成人一区二区三区 | аⅴ资源天堂资源库在线 | 老太婆性杂交欧美肥老太 | 欧美人与牲动交xxxx | 成人欧美一区二区三区黑人 | 国产亚洲精品久久久久久久久动漫 | 日韩少妇白浆无码系列 | 国产福利视频一区二区 | 人妻少妇精品视频专区 | 国产精品久久久一区二区三区 | 欧美日韩综合一区二区三区 | 免费观看又污又黄的网站 | 性色av无码免费一区二区三区 | 久久人人爽人人爽人人片ⅴ | 欧美一区二区三区视频在线观看 | 久久精品国产一区二区三区 | 欧洲精品码一区二区三区免费看 | 永久黄网站色视频免费直播 | 少妇一晚三次一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 牲欲强的熟妇农村老妇女 | 中文字幕亚洲情99在线 | 一本久久伊人热热精品中文字幕 | 色综合久久久久综合一本到桃花网 | 中文字幕 亚洲精品 第1页 | 国产无遮挡吃胸膜奶免费看 | 亚洲精品午夜国产va久久成人 | 日本丰满护士爆乳xxxx | 乱人伦人妻中文字幕无码久久网 | 成年美女黄网站色大免费全看 | 色偷偷人人澡人人爽人人模 | 1000部夫妻午夜免费 | 亚洲国产精品一区二区美利坚 | 国产又爽又猛又粗的视频a片 | 午夜精品久久久久久久 | 日本va欧美va欧美va精品 | 婷婷五月综合缴情在线视频 | 亚洲成a人一区二区三区 | 亚洲精品无码国产 | 亚洲国产精品无码一区二区三区 | 一本久道久久综合婷婷五月 | 丰满岳乱妇在线观看中字无码 | 久久亚洲日韩精品一区二区三区 | 国产色xx群视频射精 | 无遮挡国产高潮视频免费观看 | 国产香蕉尹人视频在线 | 白嫩日本少妇做爰 | 国产无遮挡又黄又爽免费视频 | 亚洲天堂2017无码中文 | 中文字幕乱码人妻无码久久 | 中文字幕av日韩精品一区二区 | 成人免费无码大片a毛片 | 亚洲自偷自拍另类第1页 | 亚洲精品成人av在线 | 久久精品国产99久久6动漫 | 免费人成网站视频在线观看 | 国产精品资源一区二区 | 成 人 网 站国产免费观看 | 久久亚洲国产成人精品性色 | 国产99久久精品一区二区 | 蜜桃视频韩日免费播放 | 丰满少妇人妻久久久久久 | 亚洲a无码综合a国产av中文 | 亚洲一区二区三区香蕉 | 亚洲欧美日韩成人高清在线一区 | 亚洲日本va午夜在线电影 | 野狼第一精品社区 | 亚洲精品国产精品乱码不卡 | 欧美老人巨大xxxx做受 | 日韩av无码中文无码电影 | 国内精品人妻无码久久久影院蜜桃 | 日日碰狠狠躁久久躁蜜桃 | 性色av无码免费一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 中国大陆精品视频xxxx | 欧美怡红院免费全部视频 | 午夜性刺激在线视频免费 | 亚洲热妇无码av在线播放 | 99精品国产综合久久久久五月天 | 国产真人无遮挡作爱免费视频 | 国产无遮挡吃胸膜奶免费看 | 欧美老妇与禽交 | 丰满人妻一区二区三区免费视频 | 久久综合给合久久狠狠狠97色 | 国产成人午夜福利在线播放 | 老熟妇乱子伦牲交视频 | 熟女俱乐部五十路六十路av | 老子影院午夜精品无码 | 亚洲精品综合五月久久小说 | 精品无码一区二区三区的天堂 | 亚洲精品久久久久中文第一幕 | 97久久国产亚洲精品超碰热 | 亚洲国产欧美国产综合一区 | 在线成人www免费观看视频 | 麻豆蜜桃av蜜臀av色欲av | 成人一区二区免费视频 | 亚洲一区二区三区在线观看网站 | 亚洲精品国偷拍自产在线麻豆 | 成 人 网 站国产免费观看 | 丰满人妻精品国产99aⅴ | 免费播放一区二区三区 | 成 人 网 站国产免费观看 | 高清无码午夜福利视频 | 特黄特色大片免费播放器图片 | 中文字幕日韩精品一区二区三区 | 精品国产精品久久一区免费式 | 色婷婷欧美在线播放内射 | 丝袜人妻一区二区三区 | 国产精品理论片在线观看 | 国产真实乱对白精彩久久 | 国产精品视频免费播放 | 日本精品人妻无码77777 天堂一区人妻无码 | 中国女人内谢69xxxxxa片 | 99精品久久毛片a片 | 欧美人与物videos另类 | 爆乳一区二区三区无码 | 性史性农村dvd毛片 | 成人精品视频一区二区 | 红桃av一区二区三区在线无码av | 台湾无码一区二区 | 日产国产精品亚洲系列 | 黑人巨大精品欧美一区二区 | 日本熟妇乱子伦xxxx | 免费无码肉片在线观看 | 人人澡人摸人人添 | 国产精品无码mv在线观看 | 97久久精品无码一区二区 | 欧美 日韩 人妻 高清 中文 | 在线观看欧美一区二区三区 | 国产精品高潮呻吟av久久 | 亚洲娇小与黑人巨大交 | 又湿又紧又大又爽a视频国产 | 中文字幕人妻无码一夲道 | 暴力强奷在线播放无码 | 久久久久亚洲精品男人的天堂 | 日本精品少妇一区二区三区 | 夫妻免费无码v看片 | 性色欲网站人妻丰满中文久久不卡 | 国产真人无遮挡作爱免费视频 | 97久久国产亚洲精品超碰热 | 精品欧美一区二区三区久久久 | 亚洲国产成人a精品不卡在线 | 无码人妻黑人中文字幕 | 狂野欧美激情性xxxx | 国产无遮挡又黄又爽免费视频 | 久久久久se色偷偷亚洲精品av | yw尤物av无码国产在线观看 | 熟女少妇在线视频播放 | 青青青手机频在线观看 | 伊在人天堂亚洲香蕉精品区 | 国产精品无码一区二区桃花视频 | 国模大胆一区二区三区 | 啦啦啦www在线观看免费视频 | 成人亚洲精品久久久久软件 | 人妻天天爽夜夜爽一区二区 | 午夜熟女插插xx免费视频 | 亚洲啪av永久无码精品放毛片 | 欧洲熟妇精品视频 | 蜜桃视频插满18在线观看 | 丰满少妇女裸体bbw | 成人欧美一区二区三区黑人免费 | 久久精品国产99久久6动漫 | 久久久国产一区二区三区 | 蜜臀av无码人妻精品 | 欧美老人巨大xxxx做受 | 成人一在线视频日韩国产 | 欧美刺激性大交 | 亚洲综合在线一区二区三区 | 撕开奶罩揉吮奶头视频 | 玩弄人妻少妇500系列视频 | 成人无码精品1区2区3区免费看 | 激情综合激情五月俺也去 | 国产精品嫩草久久久久 | 亚洲最大成人网站 | 国产精品久久久久9999小说 | 亚洲综合无码一区二区三区 | 极品嫩模高潮叫床 | 欧美日韩色另类综合 | 在线а√天堂中文官网 | 国产免费久久精品国产传媒 | 人人澡人人透人人爽 | 爆乳一区二区三区无码 | 国产午夜精品一区二区三区嫩草 | 在线播放亚洲第一字幕 | 真人与拘做受免费视频 | 久久综合给久久狠狠97色 | 国产特级毛片aaaaaaa高清 | 精品国产一区av天美传媒 | 熟妇激情内射com | 国产69精品久久久久app下载 | 偷窥日本少妇撒尿chinese | 久久综合给久久狠狠97色 | 久久久久99精品成人片 | 最近的中文字幕在线看视频 | 在线观看国产午夜福利片 | 成人精品视频一区二区 | 国产午夜无码视频在线观看 | 欧美刺激性大交 | 无套内谢的新婚少妇国语播放 | 亚洲中文字幕va福利 | 精品国产一区二区三区av 性色 | 日韩人妻少妇一区二区三区 | 99国产精品白浆在线观看免费 | 97资源共享在线视频 | 亚洲七七久久桃花影院 | 18黄暴禁片在线观看 | 亚洲综合在线一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 中文字幕无码免费久久9一区9 | 亚洲精品无码国产 | 国产熟妇另类久久久久 | 黑人巨大精品欧美一区二区 | 丝袜足控一区二区三区 | 国内揄拍国内精品人妻 | 亚洲精品综合一区二区三区在线 | 丰满人妻精品国产99aⅴ | 麻豆国产丝袜白领秘书在线观看 | 丝袜美腿亚洲一区二区 | 欧美喷潮久久久xxxxx | 一本久久伊人热热精品中文字幕 | 亚洲色欲久久久综合网东京热 | 婷婷五月综合激情中文字幕 | 天堂久久天堂av色综合 | 丰满岳乱妇在线观看中字无码 | 日本高清一区免费中文视频 | 国产亚洲日韩欧美另类第八页 | 男人的天堂av网站 | 亚洲综合伊人久久大杳蕉 | 亚洲一区二区三区无码久久 | 综合人妻久久一区二区精品 | 日韩欧美中文字幕在线三区 | 国产精品.xx视频.xxtv | 四虎4hu永久免费 | 疯狂三人交性欧美 | 国产精品沙发午睡系列 | 亚洲欧美综合区丁香五月小说 | 成年女人永久免费看片 | 国产精品自产拍在线观看 | 一本色道久久综合亚洲精品不卡 | 久久久久se色偷偷亚洲精品av | 色欲综合久久中文字幕网 | 国产乱子伦视频在线播放 | 无码免费一区二区三区 | 中文亚洲成a人片在线观看 | 波多野结衣乳巨码无在线观看 | 国产亚洲欧美日韩亚洲中文色 | 欧美老人巨大xxxx做受 | 亚洲国产精品久久久天堂 | 欧美日本日韩 | 无人区乱码一区二区三区 | 水蜜桃色314在线观看 | 巨爆乳无码视频在线观看 | 国产成人无码av在线影院 | 九九热爱视频精品 | 女人高潮内射99精品 | 国产精品久久久久久无码 | 亚洲精品一区国产 | 国产一区二区三区四区五区加勒比 | 三上悠亚人妻中文字幕在线 | 成人无码精品1区2区3区免费看 | 免费看少妇作爱视频 | 欧美精品无码一区二区三区 | 色综合视频一区二区三区 | 色偷偷人人澡人人爽人人模 | 一本色道久久综合亚洲精品不卡 | 亚洲欧美国产精品专区久久 | 欧美精品无码一区二区三区 | 高潮喷水的毛片 | 老司机亚洲精品影院 | 精品 日韩 国产 欧美 视频 | 免费无码一区二区三区蜜桃大 | 在线观看国产午夜福利片 | 无码福利日韩神码福利片 | 亚洲爆乳精品无码一区二区三区 | 国产激情无码一区二区 | 欧美精品无码一区二区三区 | 国精产品一品二品国精品69xx | 日韩精品久久久肉伦网站 | 欧美日韩人成综合在线播放 | 国产人妖乱国产精品人妖 | 亚洲中文字幕无码中字 | 国产成人精品一区二区在线小狼 | 久久五月精品中文字幕 | 高潮毛片无遮挡高清免费 | 国产做国产爱免费视频 | 精品偷自拍另类在线观看 | 狠狠色丁香久久婷婷综合五月 | 亚洲日韩中文字幕在线播放 | 精品国产成人一区二区三区 | 又大又黄又粗又爽的免费视频 | 国产人妻人伦精品 | 国产激情综合五月久久 | 任你躁在线精品免费 | 无码任你躁久久久久久久 | 亚洲欧美日韩综合久久久 | 国产无套内射久久久国产 | 宝宝好涨水快流出来免费视频 | 大肉大捧一进一出视频出来呀 | 蜜桃视频插满18在线观看 | 国产亚洲精品久久久久久国模美 | 鲁大师影院在线观看 | 国产一区二区三区四区五区加勒比 | 无码成人精品区在线观看 | 精品成人av一区二区三区 | 伊人久久大香线蕉av一区二区 | 国产综合久久久久鬼色 | www国产亚洲精品久久久日本 | 国语自产偷拍精品视频偷 | 亚洲熟妇色xxxxx欧美老妇y | 国产内射爽爽大片视频社区在线 | 天堂亚洲免费视频 | 曰韩无码二三区中文字幕 | 久久久久99精品成人片 | 久久久久亚洲精品男人的天堂 | 男女作爱免费网站 | 日韩精品无码免费一区二区三区 | 久久综合狠狠综合久久综合88 | 久久国内精品自在自线 | 一个人免费观看的www视频 | 久久99热只有频精品8 | 亚无码乱人伦一区二区 | 久久99精品国产.久久久久 | 亚洲中文字幕在线无码一区二区 | 亚洲中文无码av永久不收费 | 久久久久久久久888 | 精品无人国产偷自产在线 | 国产色视频一区二区三区 | 欧美自拍另类欧美综合图片区 | 人妻少妇精品无码专区二区 | 午夜男女很黄的视频 | 美女黄网站人色视频免费国产 | 成人性做爰aaa片免费看不忠 | 97精品国产97久久久久久免费 | 国产精品二区一区二区aⅴ污介绍 | 老司机亚洲精品影院无码 | 精品偷自拍另类在线观看 | 亚洲大尺度无码无码专区 | 我要看www免费看插插视频 | 日韩精品成人一区二区三区 | 亚洲欧洲日本综合aⅴ在线 | 久久久精品人妻久久影视 | 精品无码国产一区二区三区av | 国产亚洲视频中文字幕97精品 | 麻豆国产人妻欲求不满谁演的 | 蜜桃视频插满18在线观看 | 日日干夜夜干 | 午夜成人1000部免费视频 | 日本护士毛茸茸高潮 | 国产无遮挡吃胸膜奶免费看 | 激情综合激情五月俺也去 | 麻豆精品国产精华精华液好用吗 | 天天做天天爱天天爽综合网 | 午夜精品一区二区三区的区别 | 色情久久久av熟女人妻网站 | 成 人 免费观看网站 | 少妇太爽了在线观看 | 国产一区二区三区四区五区加勒比 | 亚洲精品一区二区三区大桥未久 | 亚洲精品一区二区三区四区五区 | 欧美精品国产综合久久 | 免费无码肉片在线观看 | 无码福利日韩神码福利片 | 国产精品资源一区二区 | 自拍偷自拍亚洲精品被多人伦好爽 | 3d动漫精品啪啪一区二区中 | 久久综合色之久久综合 | 久久精品99久久香蕉国产色戒 | 老司机亚洲精品影院无码 | 国产一区二区三区影院 | 无码av最新清无码专区吞精 | 久久久久99精品国产片 | 国产黑色丝袜在线播放 | 亚洲一区二区三区香蕉 | 露脸叫床粗话东北少妇 | 欧美国产亚洲日韩在线二区 | 人妻有码中文字幕在线 | 国产情侣作爱视频免费观看 | 国精产品一品二品国精品69xx | 久久国产精品偷任你爽任你 | 中文字幕无码日韩欧毛 | 无码人妻出轨黑人中文字幕 | 欧美亚洲日韩国产人成在线播放 | 国产亚洲精品久久久ai换 | 欧美日韩综合一区二区三区 | 人妻熟女一区 | 少妇无套内谢久久久久 | 久久午夜无码鲁丝片秋霞 | аⅴ资源天堂资源库在线 | 草草网站影院白丝内射 | 色狠狠av一区二区三区 | 人人爽人人爽人人片av亚洲 | 麻豆国产丝袜白领秘书在线观看 | 亚洲中文无码av永久不收费 | 日日天干夜夜狠狠爱 | 黑森林福利视频导航 | 日日麻批免费40分钟无码 | 国产在线一区二区三区四区五区 | 中文字幕无线码免费人妻 | 久久国产精品精品国产色婷婷 | 久久久精品欧美一区二区免费 | 无码乱肉视频免费大全合集 | 红桃av一区二区三区在线无码av | 免费无码午夜福利片69 | 亚洲精品国产品国语在线观看 | 日韩精品无码一区二区中文字幕 | 内射白嫩少妇超碰 | 真人与拘做受免费视频 | 又大又硬又黄的免费视频 | 欧美freesex黑人又粗又大 | 大肉大捧一进一出视频出来呀 | 国产真人无遮挡作爱免费视频 | 无码精品国产va在线观看dvd | a在线亚洲男人的天堂 | 色欲人妻aaaaaaa无码 | 久青草影院在线观看国产 | 久久久久国色av免费观看性色 | 婷婷色婷婷开心五月四房播播 | 久久人人爽人人爽人人片av高清 | 九九在线中文字幕无码 | 久久精品视频在线看15 | 波多野结衣aⅴ在线 | 成人欧美一区二区三区黑人免费 | 玩弄中年熟妇正在播放 | 国产精品人人妻人人爽 | 樱花草在线播放免费中文 | 18禁黄网站男男禁片免费观看 | 中国女人内谢69xxxx | √8天堂资源地址中文在线 | 精品久久久中文字幕人妻 | 国产福利视频一区二区 | 狠狠cao日日穞夜夜穞av | 亚洲爆乳大丰满无码专区 | 无码av岛国片在线播放 | 免费人成在线视频无码 | 麻豆人妻少妇精品无码专区 | 国产人成高清在线视频99最全资源 | 少妇性l交大片欧洲热妇乱xxx | 久久无码人妻影院 | 红桃av一区二区三区在线无码av | 曰韩少妇内射免费播放 | 激情内射日本一区二区三区 | 国产亚洲精品久久久ai换 | 亚洲 另类 在线 欧美 制服 | 亚洲成av人片天堂网无码】 | 久久99精品久久久久久动态图 | 亚洲精品国偷拍自产在线麻豆 | 蜜臀aⅴ国产精品久久久国产老师 | 日韩人妻无码中文字幕视频 | 中文字幕亚洲情99在线 | 欧美熟妇另类久久久久久不卡 | 中文字幕无码视频专区 | 国产一区二区不卡老阿姨 | 丝袜 中出 制服 人妻 美腿 | 久久久久久国产精品无码下载 | 乱人伦人妻中文字幕无码久久网 | av香港经典三级级 在线 | 日韩在线不卡免费视频一区 | 一本色道久久综合亚洲精品不卡 | 欧美激情一区二区三区成人 | 熟女少妇在线视频播放 | 国精产品一品二品国精品69xx | 国产真实夫妇视频 | 高清不卡一区二区三区 | 精品欧美一区二区三区久久久 | 欧美国产日产一区二区 | 日本免费一区二区三区最新 | 内射欧美老妇wbb | 亚洲日韩一区二区三区 | 国产97人人超碰caoprom | 欧美日韩在线亚洲综合国产人 | 亚洲日韩av一区二区三区中文 | 国产成人精品优优av | 亚洲乱码日产精品bd | 国产欧美精品一区二区三区 | 欧美日韩一区二区综合 | 中文字幕乱妇无码av在线 | 97夜夜澡人人爽人人喊中国片 | 强开小婷嫩苞又嫩又紧视频 | 亚洲色无码一区二区三区 | 久久精品国产日本波多野结衣 | 成年美女黄网站色大免费全看 | 女高中生第一次破苞av | 2019午夜福利不卡片在线 | 国产超碰人人爽人人做人人添 | 98国产精品综合一区二区三区 | 久久精品人人做人人综合 | 无码人妻黑人中文字幕 | 在线精品国产一区二区三区 | 欧美性色19p | 性啪啪chinese东北女人 | 人妻插b视频一区二区三区 |