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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

第13章 Kotlin 集成 SpringBoot 服务端开发(1)

發布時間:2025/6/15 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第13章 Kotlin 集成 SpringBoot 服务端开发(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第13章 Kotlin 集成 SpringBoot 服務端開發

本章介紹Kotlin服務端開發的相關內容。首先,我們簡單介紹一下Spring Boot服務端開發框架,快速給出一個 Restful Hello World的示例。然后,我們講下 Kotlin 集成 Spring Boot 進行服務端開發的步驟,最后給出一個完整的 Web 應用開發實例。

13.1 SpringBoot 快速開始 Restful Hello World

Spring Boot 大大簡化了使用 Spring 框架過程中的各種繁瑣的配置, 另外可以更加方便的整合常用的工具鏈 (比如 Redis, Email, kafka, ElasticSearch, MyBatis, JPA) 等, 而缺點是集成度較高(事物都是兩面性的),使用過程中不太容易了解底層,遇到問題了解決曲線比較陡峭。本節我們介紹怎樣快速開始SpringBoot服務端開發。

13.1.1 Spring Initializr

工欲善其事必先利其器。我們使用 https://start.spring.io/ 可以直接自動生成 SpringBoot項目腳手架。如下圖

start.spring.io

點擊“Switch to the full version ” , 可以看到腳手架支持的工具鏈。

如果 https://start.spring.io/ 網絡連不上,我們也可以自己搭建本地的 Spring Initializr服務。步驟如下

  • Git clone 源碼到本機 https://github.com/spring-io/initializr
  • 源碼根目錄執行 $ ./mvnw clean install
  • 到initializr-service子項目目錄下 cd initializr-service, 執行 ../mvnw spring-boot:run
  • 即可看到啟動日志

    ...... s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) i.s.i.service.InitializrService : Started InitializrService in 15.192 seconds (JVM running for 15.882)

    此時,我們本機瀏覽器訪問 http://127.0.0.1:8080/ ,即可看到腳手架initializr頁面。

    13.1.2 創建SpringBoot項目

    我們使用本地搭建的腳手架initializr, 頁面上表單選項如下

    使用spring initializr創建SpringBoot項目

    首先 ,我們選擇生成的是一個使用Gradle 構建的Kotlin項目,SpringBoot的版本號我們選擇2.0.0(SNAPSHOT) 。

    在 Spring Boot Starters 和 dependencies 選項中,我們選擇 Web starter, 這個啟動器里面包含了基本夠用的Spring Web開發需要的東西:Tomcat 和 Spring MVC。

    其余的項目元數據(Project Metadata)的配置(Bill Of Materials),我們可以從上面的圖中看到。然后,點擊“Generate Project” ,會自動下載一個項目的zip壓縮包。解壓導入IDEA中

    導入IDEA

    因為我們使用的是Gradle構建項目,所以需要配置一下Gradle環境,這里我們使用的是Local gradle distribution , 選擇對應的本地的 gradle 軟件包目錄。

    工程文件目錄樹

    我們將得到如下一個樣板工程,工程文件目錄樹如下

    kotlin-with-springboot$ tree . ├── build │ └── kotlin-build │ └── version.txt ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── kotlin-with-springboot.iml └── src├── main│ ├── java│ ├── kotlin│ │ └── com│ │ └── easy│ │ └── kotlin│ │ └── kotlinwithspringboot│ │ └── KotlinWithSpringbootApplication.kt│ └── resources│ ├── application.properties│ ├── static│ └── templates└── test├── java├── kotlin│ └── com│ └── easy│ └── kotlin│ └── kotlinwithspringboot│ └── KotlinWithSpringbootApplicationTests.kt└── resources23 directories, 10 files

    其中,src/main/kotlin 是Kotlin源碼放置目錄。src/main/resources目錄下面放置工程資源文件。application.properties 是工程全局的配置文件,static文件夾下面放置靜態資源文件,templates目錄下面放置視圖模板文件。

    build.gradle 配置文件

    我們使用 Gradle 來構建項目。其中 build.gradle 配置文件類似 Maven中的pom.xml 配置文件。我們使用 Spring Initializr 自動生成的樣板項目的默認配置如下

    buildscript {ext {kotlinVersion = '1.1.51'springBootVersion = '2.0.0.BUILD-SNAPSHOT'}repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" }}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")} }apply plugin: 'kotlin' apply plugin: 'kotlin-spring' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management'group = 'com.easy.kotlin' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 compileKotlin {kotlinOptions.jvmTarget = "1.8" } compileTestKotlin {kotlinOptions.jvmTarget = "1.8" }repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" } }dependencies {compile('org.springframework.boot:spring-boot-starter-web')compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")testCompile('org.springframework.boot:spring-boot-starter-test') }

    其中,

    spring-boot-gradle-plugin 是SpringBoot 集成 Gradle 的插件;
    kotlin-gradle-plugin 是 Kotlin 集成Gradle的插件;
    kotlin-allopen 是 Kotlin 集成 Spring 框架,把類全部設置為 open 的插件。因為Kotlin 的所有類及其成員默認情況下都是 final 的,也就是說你想要繼承一個類,就要不斷得寫各種 open。而使用Java寫的 Spring 框架中大量使用了繼承和覆寫,這個時候使用 kotlin-allopen 插件結合 kotlin-spring 插件,可以自動把 Spring 相關的所有注解的類設置為 open 。

    spring-boot-starter-web 就是SpringBoot中提供的使用Spring框架進行Web應用開發的啟動器。

    kotlin-stdlib-jre8 是Kotlin使用Java 8 的庫,kotlin-reflect 是 Kotlin 的反射庫。

    項目的整體依賴如下圖所示

    項目的整體依賴

    我們可以看出,spring-boot-starter-web 中已經引入了我們所需要的 json 、tomcat 、validator 、webmvc (其中引入了Spring框架的核心web、context、aop、beans、expressions、core)等框架。

    SpringBoot項目的入口類 KotlinWithSpringbootApplication

    自動生成的 SpringBoot項目的入口類 KotlinWithSpringbootApplication如下

    package com.easy.kotlin.kotlinwithspringbootimport org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication@SpringBootApplication class KotlinWithSpringbootApplicationfun main(args: Array<String>) {SpringApplication.run(KotlinWithSpringbootApplication::class.java, *args) }

    其中,@SpringBootApplication注解是3個注解的組合,分別是@SpringBootConfiguration (背后使用的又是 @Configuration ),@EnableAutoConfiguration,@ComponentScan。由于這些注解一般都是一起使用,Spring Boot提供了這個@SpringBootApplication 統一的注解。這個注解的定義源碼如下

    @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class} ), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication {... }

    main 函數中的 KotlinWithSpringbootApplication::class.java 是一個使用反射獲取KotlinWithSpringbootApplication類的Java Class引用。這也正是我們在依賴中引入 kotlin-reflect 包的用途所在。

    寫 Hello World 控制器

    下面我們來實現一個簡單的Hello World 控制器 。 首先新建 HelloWorldController Kotlin 類,代碼實現如下

    package com.easy.kotlin.kotlinwithspringbootimport org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.ResponseBody@Controller class HelloWorldController {@RequestMapping("/")@ResponseBodyfun home(): String {return "Hello World!"}}

    啟動運行

    系統默認端口號是8080,我們在application.properties 中添加一行服務端口號的配置

    server.port=8000

    然后,直接啟動入口類 KotlinWithSpringbootApplication , 可以看到啟動日志

    ...o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8000 (http) .e.k.k.KotlinWithSpringbootApplicationKt : Started KotlinWithSpringbootApplicationKt in 7.944 seconds (JVM running for 9.049)

    也可以點擊IDEA的Gradle工具欄里面的 Tasks - application - bootRun 執行

    Gradle工具欄 Tasks - application - bootRun

    啟動完畢后,我們直接在瀏覽器中打開 http://127.0.0.1:8000/ , 可以看到輸出了 Hello World!

    Hello World!

    本節項目源碼:https://github.com/EasySpringBoot/kotlin-with-springboot

    13.2 綜合實戰:一個圖片爬蟲的Web應用實例

    上面我們已經看到了使用Kotlin 集成 SpringBoot開發的基本步驟。本節我們給出一個使用MySQL數據庫、 Spring Data JPA ORM框架、Freemarker模板引擎的完整Web項目的實例。

    13.2.1 系統技術棧

    本節介紹使用Kotlin 集成 SpringBoot 開發一個完整的圖片爬蟲Web應用,基本功能如下

    • 定時抓取圖片搜索API的根據關鍵字搜索返回的圖片json信息,解析入庫
    • Web頁面分頁展示圖片列表,支持收藏、刪除等功能
    • 列表支持根據圖片分類進行模糊搜索

    涉及的主要技術棧如下

    • 編程語言:Kotlin
    • 數據庫層: MySQL、mysql-jdbc-driver 、JPA
    • 企業級開發框架:Spring Boot、 Spring MVC
    • 視圖層模板引擎: Freemarker
    • 前端框架: jQuery 、 Bootstrap 、Bootstrap-table
    • 工程構建工具:Gradle

    13.2.2 準備工作

    使用 Spring Initializr 創建項目

    如下圖配置項目基本信息和依賴

    使用 Spring Initializr 創建項目

    自動生成項目源碼工程,導入IDEA中,等待構建完畢,我們將得到下面的工程目錄

    picture-crawler$ tree . ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── picture-crawler.iml └── src├── main│ ├── java│ ├── kotlin│ │ └── com│ │ └── easy│ │ └── kotlin│ │ └── picturecrawler│ │ └── PictureCrawlerApplication.kt│ └── resources│ ├── application.properties│ ├── static│ └── templates└── test├── java├── kotlin│ └── com│ └── easy│ └── kotlin│ └── picturecrawler│ └── PictureCrawlerApplicationTests.kt└── resources21 directories, 9 files

    自動生成的 build.gradle 文件如下

    buildscript {ext {kotlinVersion = '1.1.51'springBootVersion = '2.0.0.BUILD-SNAPSHOT'}repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" }}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")} }apply plugin: 'kotlin' apply plugin: 'kotlin-spring' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management'group = 'com.easy.kotlin' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 compileKotlin {kotlinOptions.jvmTarget = "1.8" } compileTestKotlin {kotlinOptions.jvmTarget = "1.8" }repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" } }dependencies {compile('org.springframework.boot:spring-boot-starter-freemarker')compile('org.springframework.boot:spring-boot-starter-data-jpa')compile('org.springframework.boot:spring-boot-starter-quartz')compile('org.springframework.boot:spring-boot-starter-web')compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")runtime('mysql:mysql-connector-java')testCompile('org.springframework.boot:spring-boot-starter-test') }

    我們可以看到在 build.gradle 中新增了spring-boot-starter-freemarker 、 mybatis-spring-boot-starter 、 spring-boot-starter-quartz 、mysql-connector-java 等依賴。在這些starter中已經封裝了這個工具鏈所需要的依賴庫。整個項目的依賴如下圖所示

    整個項目的依賴

    目前我們的工程已經具備了連接MySQL數據庫、解析Freemarker 的 .ftl 模板文件等的能力了。但是,此時如果啟動會報錯

    BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]

    創建 dataSource Bean失敗。因為,我們還沒有配置任何數據庫連接信息。下面我們來配置數據源 dataSource 。

    13.2.3 配置數據源

    Spring Boot 的數據源配置在 application.properties 中是以 spring.datasource 為前綴。例如,新建一個 wotu 庫

    CREATE SCHEMA `wotu` DEFAULT CHARACTER SET utf8 ;

    我們配置數據庫的連接url 、用戶名 、 密碼信息如下

    spring.datasource.url=jdbc:mysql://localhost:3306/wotu?zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&characterSetResults=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=rootspring.datasource.testWhileIdle=true spring.datasource.validationQuery=SELECT 1

    然后,再次啟動應用,我們可以發現啟動成功。

    13.2.4 數據庫表結構設計

    下面我們從數據庫層開始構建我們的應用。首先我們先設計數據庫的表結構如下

    CREATE TABLE `picture` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`category` varchar(255) DEFAULT NULL,`deleted_date` datetime DEFAULT NULL,`gmt_created` datetime DEFAULT NULL,`gmt_modified` datetime DEFAULT NULL,`is_deleted` int(11) NOT NULL,`url` varchar(500) NOT NULL,`version` int(11) NOT NULL,`is_favorite` int(11) NOT NULL,PRIMARY KEY (`id`,`url`),KEY `url` (`id`,`url`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    因為我們使用的是 JPA,只需要寫好實體類代碼,啟動應用即可自動創建表結構到 MySQL 數據庫中。實體類代碼如下

    package com.easy.kotlin.picturecrawler.entityimport java.util.* import javax.persistence.*@Entity class Image {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)var id: Long = -1@Versionvar version: Int = 0var category: String = ""var isFavorite: Int = 0var url: String = ""var gmtCreated: Date = Date()var gmtModified: Date = Date()var isDeleted: Int = 0 //1 Yes 0 Novar deletedDate: Date = Date()override fun toString(): String {return "Image(id=$id, version=$version, category='$category', isFavorite=$isFavorite, url='$url', gmtCreated=$gmtCreated, gmtModified=$gmtModified, isDeleted=$isDeleted, deletedDate=$deletedDate)"} }

    ddl-auto 配置

    我們再配置一下 JPA 的一些行為

    spring.jpa.database=MYSQL spring.jpa.show-sql=true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto=update # Naming strategy spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

    其中 spring.jpa.hibernate.ddl-auto 的值有:create、create-drop、update、validate、none,如下表分別作簡單說面

    值說明
    create每次加載hibernate會自動創建表,以后啟動會覆蓋之前的表,所以這個值基本不用,嚴重會導致的數據的丟失。
    create-drop每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除,下一次啟動會重新創建。
    update加載hibernate時根據實體類model創建數據庫表,這是表名的依據是@Entity注解的值或者@Table注解的值,sessionFactory關閉表不會刪除,且下一次啟動會根據實體model更新結構或者有新的實體類會創建新的表。
    validate啟動時驗證表的結構,不會創建表
    none啟動時不做任何操作

    所以,在開發項目的過程中,我們通常會選用 update 選項。

    再次啟動應用,啟動完畢后我們可以看到數據庫中已經自動創建了 image 表

    image 表結構

    標注索引

    為了更高的性能,我們建立類別 category 字段和 url 索引。其中 url 是唯一索引

    ALTER TABLE `sotu`.`image`ADD INDEX `idx_category` (`category` ASC),ADD UNIQUE INDEX `uk_url` (`url` ASC);

    而實際上,我們不需要去手工寫上面的 SQL 然后再去數據庫中執行。我們只需要寫下面的實體類

    package com.easy.kotlin.picturecrawler.entityimport java.util.* import javax.persistence.*@Entity @Table(indexes = arrayOf(Index(name = "idx_url", unique = true, columnList = "url"),Index(name = "idx_category", unique = false, columnList = "category"))) class Image {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)var id: Long = -1@Versionvar version: Int = 0@Column(length = 255, unique = true, nullable = false)var category: String = ""var isFavorite: Int = 0@Column(length = 255, unique = true, nullable = false)var url: String = ""var gmtCreated: Date = Date()var gmtModified: Date = Date()var isDeleted: Int = 0 //1 Yes 0 Novar deletedDate: Date = Date()override fun toString(): String {return "Image(id=$id, version=$version, category='$category', isFavorite=$isFavorite, url='$url', gmtCreated=$gmtCreated, gmtModified=$gmtModified, isDeleted=$isDeleted, deletedDate=$deletedDate)"} }

    我們在@Table 注解里指定為 url、category 建立索引, 以及設定 url 唯一性約束 unique = true

    @Table(indexes = arrayOf(Index(name = "idx_url", unique = true, columnList = "url"),Index(name = "idx_category", unique = false, columnList = "category")))

    啟動應用的時候,JPA 會去解析我們的注解生成對應的 SQL,并且自動去執行相應的 SQL。例如字段url 的唯一索引約束,我們可以在啟動日志中看到如下的輸出

    Hibernate: alter table image drop index idx_url Hibernate: alter table image add constraint idx_url unique (url)

    其中,Index 是@Index 注解,當做參數使用的時候不需要加@ 。

    我們再舉個例子。實體類代碼如下

    package com.easy.kotlin.picturecrawler.entityimport java.util.* import javax.persistence.*@Entity @Table(indexes = arrayOf(Index(name = "idx_key_word", columnList = "keyWord", unique = true))) class SearchKeyWord {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)var id: Long = -1@Column(length = 50, unique = true, nullable = false)var keyWord: String = ""var gmtCreated: Date = Date()var gmtModified: Date = Date()var isDeleted: Int = 0 //1 Yes 0 Novar deletedDate: Date = Date() }

    重啟應用,我們可以看到Hibernate 日志

    Hibernate: create table search_key_word (id bigint not null auto_increment, deleted_date datetime, gmt_created datetime, gmt_modified datetime, is_deleted integer not null, key_word varchar(50) not null, primary key (id)) engine=MyISAM Hibernate: alter table search_key_word drop index UK_lvmjkr0dkesio7a33ejre5c26 Hibernate: alter table search_key_word add constraint UK_lvmjkr0dkesio7a33ejre5c26 unique (key_word)

    自動生成的表結構如下

    自動生成的 search_key_word 表結構

    其中,@Column(length = 50, unique = true, nullable = false) 這一句指定了keyWord 字段的長度是50,有唯一約束,不可空。對應生成的數據庫表字段 key_word 信息:Type 是 varchar(50) , Null 是 NO, Key 是唯一鍵 UNI 。

    主鍵自動生成策略

    我們使用@Id 注解來標注主鍵字段

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long = -1

    其中的 @GeneratedValue(strategy = GenerationType.IDENTITY) 注解,我們重點介紹一下。這里的GenerationType是主鍵 ID 的生成規則。JPA提供的四種標準用法為 TABLE、SEQUENCE、IDENTITY、AUTO

    GenerationType說明
    TABLE使用一個特定的數據庫表格來保存主鍵。
    SEQUENCE根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。
    IDENTITY主鍵由數據庫自動生成(主要是自動增長型)
    AUTO主鍵由程序控制。

    我們設計源碼目錄如下

    ├── src │ ├── main │ │ ├── java │ │ ├── kotlin │ │ │ └── com │ │ │ └── easy │ │ │ └── kotlin │ │ │ └── picturecrawler │ │ │ ├── PictureCrawlerApplication.kt │ │ │ ├── controller │ │ │ ├── dao │ │ │ ├── entity │ │ │ ├── job │ │ │ └── service ...

    其中,controller 放置 Controller 控制器代碼;
    entity 放置對應到數據庫表的實體類代碼;
    dao 層放置數據訪問層邏輯代碼;
    service 層放置業務邏輯實現代碼;
    job 層放置定時任務代碼。

    13.2.5 JSON 數據解析

    我們的圖片搜索 API 返回的數據結構是 JSON 格式的,內容示例如下

    {"queryEnc": "%E7%BE%8E%E5%A5%B3","queryExt": "美女","listNum": 3900,"displayNum": 415337,"gsm": "5a","bdFmtDispNum": "約415,000","bdSearchTime": "","isNeedAsyncRequest": 1,"bdIsClustered": "1","data": [{"adType": "0","hasAspData": "0","thumbURL": "http://img5.imgtn.bdimg.com/it/u=2817128514,340025963&fm=27&gp=0.jpg","middleURL": "http://img5.imgtn.bdimg.com/it/u=2817128514,340025963&fm=27&gp=0.jpg","largeTnImageUrl": "","hasLarge": 0,..."currentIndex": "","width": 800,"height": 958,"type": "jpg","is_gif": 0,..."bdImgnewsDate": "1970-01-01 08:00","fromPageTitle": "","fromPageTitleEnc": "性感美女",... }

    我們只需要取出其中的thumbURL 和 fromPageTitleEnc 兩個字段的值。我們使用 fastjson 來解析這個 json 字符串

    try {val obj = JSON.parse(jsonstr) as Map<*, *>val dataArray = obj.get("data") as JSONArraydataArray.forEach {val category = (it as Map<*, *>).get("fromPageTitleEnc") as Stringval url = it.get("thumbURL") as Stringif (passFilter(url)) {val imageResult = ImageCategoryAndUrl(category = category, url = url)imageResultList.add(imageResult)}}} catch (ex: Exception) {}fun passFilter(imgUrl: String): Boolean {return imgUrl.endsWith(".jpg")&& !imgUrl.contains("baidu.com/")&& !imgUrl.contains("126.net")&& !imgUrl.contains("pconline.com")&& !imgUrl.contains("nipic.com")&& !imgUrl.contains("zol.com") }

    其中的ImageCategoryAndUrl 對象是我們定義的數據轉換對象

    data class ImageCategoryAndUrl(val category: String, val url: String)

    搜索圖片的 Rest API Builder 類如下

    object ImageSearchApiBuilder {fun build(word: String, page: Int): String {return "http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&fp=result&word=${word}&pn=${30 * page}&rn=30"} }

    我們來寫個單元測試

    package com.easy.kotlin.picturecrawlerimport com.easy.kotlin.picturecrawler.api.ImageSearchApiBuilder import com.easy.kotlin.picturecrawler.service.JsonResultProcessor import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4@RunWith(JUnit4::class) class JsonResultProcessorTest {@Testfun testJsonResultProcessor() {val list = JsonResultProcessor.getImageCategoryAndUrlList(ImageSearchApiBuilder.build("美女", 1))println(list)} }

    輸出

    [ImageCategoryAndUrl(category=性感美女寫真集, url=http://img1.imgtn.bdimg.com/it/u=3772875022,724775083&fm=27&gp=0.jpg), ImageCategoryAndUrl(category=美女寫真 性感美女_美女寫真 性感美女_美女寫真 性感美女, url=http://img0.imgtn.bdimg.com/it/u=3312193685,1215837845&fm=11&gp=0.jpg), ImageCategoryAndUrl(category=...

    13.2.6 數據入庫邏輯實現

    現在我們已經有了數據的表結構,實體類代碼; 同時也已經有個業務源數據了。現在我們要做的是把爬到的圖片信息存儲到數據庫中。同時,重復的 url 信息我們不去重復存儲。

    新建一個實現 PagingAndSortingRepository<Image, Long> 的 ImageRepository 接口

    interface ImageRepository : PagingAndSortingRepository<Image, Long>

    只要上面的一行代碼,我們就可以直接使用ImageRepository 的 CRUD 方法了。因為 JPA 框架會幫我們自動生成這些方法。這個PagingAndSortingRepository 是帶分頁功能的。它繼承了CrudRepository 接口

    @NoRepositoryBean public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {Iterable<T> findAll(Sort sort);Page<T> findAll(Pageable pageable); }

    而在接口 CrudRepository 中定義了我們能夠直接使用的 CRUD 方法

    @NoRepositoryBean public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S entity);<S extends T> Iterable<S> saveAll(Iterable<S> entities);Optional<T> findById(ID id);boolean existsById(ID id);Iterable<T> findAll();Iterable<T> findAllById(Iterable<ID> ids);long count();void deleteById(ID id);void delete(T entity);void deleteAll(Iterable<? extends T> entities);void deleteAll(); }

    我們入庫就直接使用save(S entity) 方法。但是為了保證重復的 url 不保存,需要寫個函數來判斷當前 url 是否在數據庫中存在。我們直接使用 select count() 語句來判斷即可, 當且僅當 select count() 出來的值等于 0 (表明數據庫中不存在此 url ),才進行入庫動作。在ImageRepository 接口中直接聲明函數即可,代碼如下

    @Query("select count(*) from #{#entityName} a where a.url = :url")fun countByUrl(@Param("url") url: String): Int

    入庫邏輯代碼如下

    if (imageRepository.countByUrl(url) == 0) {val Image = Image()Image.category = categoryImage.url = urlimageRepository.save(Image) }

    13.2.7 定時調度任務執行

    為了簡單起見,我們直接使用 Spring 自帶的scheduling 包下面的@Schedules 注解來實現任務的定時執行。需要注意的是,要在 SpringBoot 的啟動類上面添加注解

    @SpringBootApplication @EnableScheduling class PictureCrawlerApplication

    我們的定時任務代碼如下

    package com.easy.kotlin.picturecrawler.jobimport com.easy.kotlin.picturecrawler.service.CrawImageService import org.springframework.beans.factory.annotation.Autowired import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.util.*@Component class ImageCrawlerJob {@Autowired lateinit var CrawImagesService: CrawImageService@Scheduled(cron = "0 */5 * * * ?")fun job() {println("開始執行定時任務: ${Date()}")CrawImagesService.doCrawJob()} }

    其中,@Scheduled(cron = "0 */5 * * * ?") 表示每隔5分鐘執行一次圖片的抓取。

    然后,我們重新啟動應用,就會看到每隔5分鐘,我們的定時任務會去跑一次。

    到目前為止,我們的原始數據已經入庫。下面,我們將要進行控制器層代碼和視圖展示層模板引擎的代碼的開發。最后是前端頁面展示部分的開發。

    13.2.8 控制器層開發

    下面我們實現一個分頁查詢接口 http://127.0.0.1:8000/sotuJson?page=10&size=3 ,返回的數據是 json 格式

    {"content": [{"id": 5981,"version": 0,"category": "南非,動物世界,非洲地區旅游景點,風景名勝","url": "http://img0.imgtn.bdimg.com/it/u=2871771810,3599000038&fm=27&gp=0.jpg","gmtCreated": 1508858697000,"gmtModified": 1508858697000,"deletedDate": 1508858697000},...{"id": 5979,"version": 0,"category": "亞洲,藍色,明亮,商務,特寫,地球,環境,地球形,光,地圖,材料","url": "http://img3.imgtn.bdimg.com/it/u=241353052,3712599419&fm=200&gp=0.jpg","gmtCreated": 1508858696000,"gmtModified": 1508858696000,"deletedDate": 1508858696000}],"pageable": {"sort": {"sorted": true,"unsorted": false},"offset": 30,"pageSize": 3,"pageNumber": 10,"paged": true,"unpaged": false},"last": false,"totalPages": 2004,"totalElements": 6011,"size": 3,"numberOfElements": 3,"sort": {"sorted": true,"unsorted": false},"number": 10,"first": false }

    實現 findAll 函數

    在 Spring Data JPA 中提供了基本的CRUD操作、分頁查詢、排序等。我們先來實現 ImageRepository 接口中的 findAll 函數

    @Query("SELECT a from #{#entityName} a where a.isDeleted=0 order by a.id desc") override fun findAll(pageable: Pageable): Page<Image>

    @Query 注解與 #{#entityName}

    其中 @Query 是JPA中的查詢注解。JPA中可以執行兩種方式的查詢,一種是使用JPQL,一種是使用Native SQL。其中JPQL是基于 Entity 對象(@Entity 注解標注的對象)的查詢,可以消除不同數據庫SQL語句的差異;本地SQL是基于傳統的SQL查詢,是對JPQL查詢的補充。

    這里的 JPQL 我們使用#{#entityName} 代替本來實體的名稱,而Spring Data JPA 會自動根據 Image 實體上對應的 @Entity(name = "Image") 或者是默認的@Entity,來自動將實體名稱填入HQL 語句中。

    實體類 Image 使用@Entity注解后,Spring Data JPA 的 EntityManager 會將實體類 Image 納入管理。默認的 #{#entityName} 的值就是 Image ,如果指定其中的@Entity(name = "Image") name 的值,那么 #{#entityName} 就是指定的值。

    在 JPQL 語句中

    SELECT a from #{#entityName} a where a.isDeleted=0 order by a.id desc

    我們就可以像訪問Kotlin 類屬性一樣來訪問字段值。注意到,我們這里的a.isDeleted 是屬性名稱。

    Pageable 參數

    SpringData JPA 的 PagingAndSortingRepository接口已經提供了對分頁的支持,查詢的時候我們只需要傳入一個 Pageable 類型的實現類。這個Pageable接口定義如下

    package org.springframework.data.domain; import java.util.Optional; import org.springframework.util.Assert;public interface Pageable {static Pageable unpaged() {return Unpaged.INSTANCE;}default boolean isPaged() {return true;}default boolean isUnpaged() {return !isPaged();}int getPageNumber();int getPageSize();long getOffset();Sort getSort();default Sort getSortOr(Sort sort) {Assert.notNull(sort, "Fallback Sort must not be null!");return getSort().isSorted() ? getSort() : sort;}Pageable next();Pageable previousOrFirst();Pageable first();boolean hasPrevious();default Optional<Pageable> toOptional() {return isUnpaged() ? Optional.empty() : Optional.of(this);} }

    springData包中的 PageRequest類已經實現了Pageable接口,我們可以像下面這樣直接使用

    val sort = Sort(Sort.Direction.DESC, "id") val pageable = PageRequest.of(page, size, sort)

    其中,Direction 是 Sort 類中定義的注解

    public static enum Direction {ASC, DESC; }

    Sort 類的構造函數簽名是

    public Sort(Direction direction, String... properties) {this(direction, properties == null ? new ArrayList<>() : Arrays.asList(properties)); }

    我們這里Sort(Sort.Direction.DESC, "id")傳入的是根據 id 進行降序排序。

    Page<T> 返回類型

    findAll 函數的返回類型是 Page<Image> , 這里的 Page 類型是 Spring Data JPA 的分頁結果的返回對象,Page 繼承了 Slice 。這兩個接口的定義如下

    public interface Page<T> extends Slice<T> {static <T> Page<T> empty() {return empty(Pageable.unpaged());}static <T> Page<T> empty(Pageable pageable) {return new PageImpl<>(Collections.emptyList(), pageable, 0);}int getTotalPages();long getTotalElements();<U> Page<U> map(Function<? super T, ? extends U> converter); }public interface Slice<T> extends Streamable<T> {int getNumber();int getSize();int getNumberOfElements();List<T> getContent();boolean hasContent();Sort getSort();boolean isFirst();boolean isLast();boolean hasNext();boolean hasPrevious();default Pageable getPageable() {return PageRequest.of(getNumber(), getSize(), getSort());}Pageable nextPageable();Pageable previousPageable();<U> Slice<U> map(Function<? super T, ? extends U> converter); }

    這個分頁對象的數據結構信息足夠我們在前端實現分頁的交互頁面時使用。

    我們來實現分頁查詢所有 image 表記錄的REST API 接口。在 controller 包路徑下面新建 ImageController 類, 類上使用 @Controller注解。

    package com.easy.kotlin.picturecrawler.controllerimport com.easy.kotlin.picturecrawler.dao.ImageRepository import com.easy.kotlin.picturecrawler.entity.Image import org.springframework.beans.factory.annotation.Autowired import org.springframework.data.domain.Page import org.springframework.data.domain.PageRequest import org.springframework.data.domain.Sort import org.springframework.stereotype.Controller import org.springframework.ui.Model import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMethod import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.ResponseBody import org.springframework.web.servlet.ModelAndView import javax.servlet.http.HttpServletRequest@Controller class ImageController {@Autowiredlateinit var imageRepository: ImageRepository@RequestMapping(value = "sotuJson", method = arrayOf(RequestMethod.GET))@ResponseBodyfun sotuJson(@RequestParam(value = "page", defaultValue = "0") page: Int,@RequestParam(value = "size", defaultValue = "10") size: Int): Page<Image> {return getPageResult(page, size)}private fun getPageResult(page: Int, size: Int): Page<Image> {val sort = Sort(Sort.Direction.DESC, "id")val pageable = PageRequest.of(page, size, sort)return imageRepository.findAll(pageable)}... }

    其中

    @Autowired lateinit var imageRepository: ImageRepository

    這里使用 lateinit 關鍵字來修飾我們需要裝配的 Bean ,表示 imageRepository 延遲初始化。

    從上面的代碼可以看出,Kotlin 使用Spring MVC非常自然,跟使用原生 Java 代碼幾乎一樣順暢。有個稍微明顯的區別是 method = arrayOf(RequestMethod.GET) , 這里Kotlin 數組聲明的語法是使用 arrayOf() , 而這個在 Java 中只需要使用花括號 { } 括起來即可。

    重新運行應用,瀏覽器訪問 http://127.0.0.1:8000/sotuJson?page=10&size=3 ,我們將看到分頁對象 Page 的 JSON 字符串格式的輸出結果。

    模糊搜索分頁接口實現

    下面我們來實現根據 category 字段的值進行模糊搜索的接口,并同時支持分頁。代碼如下

    @Query("SELECT a from #{#entityName} a where a.isDeleted=0 and a.category like %:searchText% order by a.id desc") fun search(@Param("searchText") searchText: String, pageable: Pageable): Page<Image>

    其中 @Param("searchText") searchText: String 是搜索關鍵字參數 @Param 注解指定了JPQL 中的參數名 searchText ,對應到 JPQL 中的參數占位符寫作 :searchText ,我們注意到這里的模糊查詢的語法是

    like %:searchText%

    對應的 Controller 中的方法是

    @RequestMapping(value = "sotuSearchJson", method = arrayOf(RequestMethod.GET)) @ResponseBody fun sotuSearchJson(@RequestParam(value = "page", defaultValue = "0") page: Int, @RequestParam(value = "size", defaultValue = "10") size: Int, @RequestParam(value = "searchText", defaultValue = "") searchText: String): Page<Image> {return getPageResult(page, size, searchText) }private fun getPageResult(page: Int, size: Int, searchText: String): Page<Image> {val sort = Sort(Sort.Direction.DESC, "id")val pageable = PageRequest.of(page, size, sort)if (searchText == "") {return imageRepository.findAll(pageable)} else {return imageRepository.search(searchText, pageable)} }

    這里需要注意的是 PageRequest.of(page,size,sort) page 取值默認是從0開始 。

    重新運行應用,瀏覽器訪問 http://127.0.0.1:8000/sotuSearchJson?page=10&size=3&searchText=秋天 ,我們可以看到輸出

    {"content": [{"id": 17443,"version": 0,"category": "初秋岱廟","url": "http://img0.imgtn.bdimg.com/it/u=64076324,3274882882&fm=27&gp=0.jpg","gmtCreated": 1508924545000,"gmtModified": 1508924545000,"deletedDate": 1508924545000},{"id": 17280,"version": 0,"category": "初秋落葉信紙.doc","url": "http://img5.imgtn.bdimg.com/it/u=256290403,1153099708&fm=27&gp=0.jpg","gmtCreated": 1508924528000,"gmtModified": 1508924528000,"deletedDate": 1508924528000},{"id": 17130,"version": 0,"category": "初秋的小花圖片 12張 (天堂圖片網)","url": "http://img3.imgtn.bdimg.com/it/u=1333940222,533390017&fm=11&gp=0.jpg","gmtCreated": 1508924510000,"gmtModified": 1508924510000,"deletedDate": 1508924510000}],"pageable": {"sort": {"sorted": true,"unsorted": false},"offset": 30,"pageSize": 3,"pageNumber": 10,"paged": true,"unpaged": false},"last": false,"totalElements": 148,"totalPages": 50,"size": 3,"number": 10,"numberOfElements": 3,"sort": {"sorted": true,"unsorted": false},"first": false }

    13.2.9 展示層模板引擎代碼

    后端的數據接口我們已經開發完畢,下面我們來把這些數據展示到前端頁面上。

    我們使用的視圖層模板引擎是 Freemarker , 在 SpringBoot 中使用Freemarker,只需要加入 spring-boot-starter-freemarker 。其中,使用默認的配置目錄 src/main/resources/templates , 模板文件以 .ftl 為后綴。

    我們將前端依賴的外部庫靜態資源文件全部放到 src/main/resources/static/bower_components 文件夾下 。我們主要使用的是jquery.js 、bootstrap.js ,另外使用后端的分頁接口實現前端分頁的功能我們使用 bootstrap-table.js 庫來實現。前端模板文件以及 js 源碼文件的目錄結構如下圖所示

    前端模板文件以及 js 源碼文件的目錄結構

    head.ftl

    head.ftl 文件是公共文件頭部分,代碼如下

    <!DOCTYPE html> <html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><title>搜圖</title><link href="bower_components/bootstrap/dist/css/bootstrap-theme.css" rel="stylesheet"><link href="bower_components/bootstrap-table/src/bootstrap-table.css" rel="stylesheet"><link href="bower_components/bootstrap/dist/css/bootstrap.css" rel="stylesheet"><link href="bower_components/pnotify/src/pnotify.css" rel="stylesheet"><link href="app.css" rel="stylesheet"> </head> <body>

    foot.ftl

    foot.ftl 是頁面公共底部。代碼如下

    <script src="bower_components/jquery/dist/jquery.js"></script> <script src="bower_components/bootstrap/dist/js/bootstrap.js"></script> <script src="bower_components/bootstrap-table/src/bootstrap-table.js"></script> <script src="bower_components/bootstrap-table/src/locale/bootstrap-table-zh-CN.js"></script> <script src="bower_components/pnotify/src/pnotify.js"></script> <script src="app.js"></script> </body> </html>

    nav.ftl

    nav.ftl 是導航欄部分的代碼,使用標準的 Bootstrap 樣式庫來實現

    <nav class="navbar navbar-default" role="navigation"><div class="container-fluid"><div class="navbar-header"><a class="navbar-brand" href="#">搜圖</a></div><div><ul class="nav navbar-nav"><li class='<#if requestURI=="/sotu_view">active</#if>'><a href="sotu_view">美圖列表</a></li><li class='<#if requestURI=="/sotu_favorite_view">active</#if>'><a href="sotu_favorite_view">精選收藏</a><li class='<#if requestURI=="/search_keyword_view">active</#if>'><a href="search_keyword_view">搜索關鍵字</a></li><li class=""><a href="doCrawJob" target="_blank">執行抓取</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Kotlin <b class="caret"></b></a><ul class="dropdown-menu"><li><a href="http://www.jianshu.com/nb/12976878" target="_blank">Kotlin 極簡教程</a></li><li><a href="http://www.jianshu.com/nb/17117730" target="_blank">Kotlin 項目實戰開發</a></li><li><a href="#">SpringBoot</a></li><li><a href="#">Java</a></li><li class="divider"></li><li><a href="#">Scala</a></li><li class="divider"></li><li><a href="#">Groovy</a></li></ul></li><li class="nav-item"><a class="nav-link" href="#">關于</a></li></ul></div></div> </nav>

    其中這地方的代碼是實現 Tab 切換的時候,active 狀態跟隨的交互

    <li class='<#if requestURI=="/sotu_view">active</#if>'><a href="sotu_view">美圖列表</a></li><li class='<#if requestURI=="/sotu_favorite_view">active</#if>'><a href="sotu_favorite_view">精選收藏</a><li class='<#if requestURI=="/search_keyword_view">active</#if>'><a href="search_keyword_view">搜索關鍵字</a></li>

    requestURI 是后端的 Controller 獲取當前請求傳給前端頁面的

    @RequestMapping(value = *arrayOf("/", "sotu_view"), method = arrayOf(RequestMethod.GET)) fun sotuView(model: Model, request: HttpServletRequest): ModelAndView {model.addAttribute("requestURI", request.requestURI)return ModelAndView("sotu_view") }

    圖片列表頁面

    新建 sotu_view.ftl 為圖片列表頁面

    <#include 'common/head.ftl'> <#include 'common/nav.ftl'> <table id="sotu_table"></table> <#include 'common/foot.ftl'> <script src="sotu_table.js"></script>

    對應的 ModelAndView 控制器代碼是

    @RequestMapping(value = *arrayOf("/", "sotu_view"), method = arrayOf(RequestMethod.GET)) fun sotuView(model: Model, request: HttpServletRequest): ModelAndView {model.addAttribute("requestURI", request.requestURI)return ModelAndView("sotu_view") }

    表格后端分頁實現

    新建 sotu_table.js , 我們在這里寫表格后端分頁實現的前端 js 代碼。主要是使用 bootstrap-table.js 中的 bootstrapTable 函數來完成

    $.fn.bootstrapTable = function (option)

    sotu_table.js 的代碼如下

    $(function () {$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN'])var searchText = $('.search').find('input').val()var columns = []columns.push({title: '分類',field: 'category',align: 'center',valign: 'middle',width: '5%',formatter: function (value, row, index) {return value}}, {title: '美圖',field: 'url',align: 'center',valign: 'middle',formatter: function (value, row, index) {return "![](" + value + ")"}}, {title: ' 操作',field: 'id',align: 'center',width: '5%',formatter: function (value, row, index) {var html = ""html += "<div onclick='addFavorite(" + value + ")' name='addFavorite' id='addFavorite" + value + "' class='btn btn-default'>收藏</div><p>"html += "<div onclick='deleteById(" + value + ")' name='delete' id='delete" + value + "' class='btn btn-default'>刪除</div>"return html}})$('#sotu_table').bootstrapTable({url: 'sotuSearchJson',sidePagination: "server",queryParamsType: 'page,size',contentType: "application/x-www-form-urlencoded",method: 'get',striped: false, //是否顯示行間隔色buttonsAlign: 'right',smartDisplay: true,cache: false, //是否使用緩存,默認為true,所以一般情況下需要設置一下這個屬性(*)pagination: true, //是否顯示分頁(*)paginationLoop: true,paginationHAlign: 'right', //right, leftpaginationVAlign: 'bottom', //bottom, top, bothpaginationDetailHAlign: 'left', //right, leftpaginationPreText: ' 上一頁',paginationNextText: '下一頁',search: true,searchText: searchText,searchTimeOut: 500,searchAlign: 'right',searchOnEnterKey: false,trimOnSearch: true,sortable: true, //是否啟用排序sortOrder: "desc", //排序方式sortName: "id",pageNumber: 1, //初始化加載第一頁,默認第一頁pageSize: 10, //每頁的記錄行數(*)pageList: [8, 16, 32, 64, 128], // 可選的每頁數據totalField: 'totalElements', // 所有記錄 countdataField: 'content', //后端 json 對應的表格List數據的 keycolumns: columns,queryParams: function (params) {return {size: params.pageSize,page: params.pageNumber - 1,sortName: params.sortName,sortOrder: params.sortOrder,searchText: params.searchText}},classes: 'table table-responsive full-width',})$(document).on('keydown', function (event) {// 鍵盤翻頁事件var e = event || window.event || arguments.callee.caller.arguments[0];if (e && e.keyCode == 38 || e && e.keyCode == 37) {//上,左// 上一頁$('.page-pre').click()}if (e && e.keyCode == 40 || e && e.keyCode == 39) {//下,右// 下一頁$('.page-next').click()}})var keyWord = getKeyWord()$('.search').find('input').val(keyWord)})function getKeyWord() {var url = decodeURI(location.href)var indexOfKeyWord = url.indexOf('?keyWord=')if (indexOfKeyWord != -1) {var start = indexOfKeyWord + '?keyWord='.lengthreturn url.substring(start)} else {return ""} }

    其中 url: 'sotuSearchJson' 后端的查詢接口實現代碼是

    @RequestMapping(value = "sotuSearchJson", method = arrayOf(RequestMethod.GET)) @ResponseBody fun sotuSearchJson(@RequestParam(value = "page", defaultValue = "0") page: Int, @RequestParam(value = "size", defaultValue = "10") size: Int, @RequestParam(value = "searchText", defaultValue = "") searchText: String): Page<Image> {return getPageResult(page, size, searchText) }private fun getPageResult(page: Int, size: Int, searchText: String): Page<Image> {val sort = Sort(Sort.Direction.DESC, "id")// 注意:PageRequest.of(page,size,sort) page 默認是從0開始val pageable = PageRequest.of(page, size, sort)if (searchText == "") {return imageRepository.findAll(pageable)} else {return imageRepository.search(searchText, pageable)} }

    其中,
    dataField: 'content' 對應的是 Page<Image> 中的 content 屬性的值;

    totalField: 'totalElements' 對應的是 Page<Image> 中 totalElements屬性的值。

    columns: columns 是對應到 content List 中的每個元素的對象屬性。例如

    var columns = []columns.push({title: '分類',field: 'category',align: 'center',valign: 'middle',width: '5%',formatter: function (value, row, index) {return value},... }

    里面的field: 'category' 對應的就是Image 實體類的category 屬性名稱。然后,我們在formatter: function (value, row, index) 函數中處理改單元格顯示的樣式 html 。

    重新啟動運行應用,我們將看到分頁以及模糊搜索的效果

    模糊搜索的效果 分頁的效果

    提示:Bootstrap-table完整的配置項在 bootstrap-table.js 源碼 (https://github.com/wenzhixin/bootstrap-table)中的BootstrapTable.DEFAULTS 這行代碼中

    BootstrapTable.DEFAULTS = {classes: 'table table-hover',sortClass: undefined,locale: undefined,height: undefined,undefinedText: '-',sortName: undefined,sortOrder: 'asc',sortStable: false,rememberOrder: false,striped: false,columns: [[]],data: [],totalField: 'total',dataField: 'rows',method: 'get',url: undefined,ajax: undefined,cache: true,contentType: 'application/json',dataType: 'json',ajaxOptions: {},queryParams: function (params) {return params;},queryParamsType: 'limit', // undefinedresponseHandler: function (res) {return res;},pagination: false,onlyInfoPagination: false,paginationLoop: true,sidePagination: 'client', // client or servertotalRows: 0, // server side need to setpageNumber: 1,pageSize: 10,pageList: [10, 25, 50, 100],paginationHAlign: 'right', //right, leftpaginationVAlign: 'bottom', //bottom, top, bothpaginationDetailHAlign: 'left', //right, leftpaginationPreText: '?',paginationNextText: '?',search: false,searchOnEnterKey: false,strictSearch: false,searchAlign: 'right',selectItemName: 'btSelectItem',showHeader: true,... }

    收藏、刪除功能

    下面我們來實現收藏圖片和刪除圖片功能。后端接口實現邏輯如下

    @Modifying @Transactional @Query("update #{#entityName} a set a.isFavorite=1,a.gmtModified=now() where a.id=:id") fun addFavorite(@Param("id") id: Long)@Modifying @Transactional @Query("update #{#entityName} a set a.isDeleted=1 where a.id=:id") fun delete(@Param("id") id: Long)

    我們用 isFavorite=1來表示該圖片是被收藏的,isDeleted=1 表示該圖片被刪除。需要注意的是 JPA 中 update、delete 操作需要在對應的函數上面添加@Modifying 和 @Transactional 注解。

    控制層的 http 接口代碼如下

    @RequestMapping(value = "addFavorite", method = arrayOf(RequestMethod.POST)) @ResponseBody fun addFavorite(@RequestParam(value = "id") id: Long): Boolean {imageRepository.addFavorite(id)return true }@RequestMapping(value = "delete", method = arrayOf(RequestMethod.POST)) @ResponseBody fun delete(@RequestParam(value = "id") id: Long): Boolean {imageRepository.delete(id)return true }

    前端 js 代碼如下

    function addFavorite(id) {$.ajax({url: 'addFavorite',data: {id: id},dataType: 'json',type: 'post',success: function (resp) {// alert(JSON.stringify(resp))new PNotify({title: '收藏操作',styling: 'bootstrap3',text: JSON.stringify(resp),type: 'success',delay: 500,});},error: function (msg) {// alert(JSON.stringify(msg))new PNotify({title: '收藏操作',styling: 'bootstrap3',text: JSON.stringify(msg),type: 'error',delay: 500,});}}) }function deleteById(id) {$.ajax({url: 'delete',data: {id: id},dataType: 'json',type: 'post',success: function (resp) {// alert(JSON.stringify(resp))$('#sotu_favorite_table').bootstrapTable('refresh')$('#sotu_table').bootstrapTable('refresh')new PNotify({title: '刪除操作',styling: 'bootstrap3',text: JSON.stringify(resp),type: 'info',delay: 500,});},error: function (msg) {// alert(JSON.stringify(msg))new PNotify({title: '刪除操作',styling: 'bootstrap3',text: JSON.stringify(msg),type: 'error',delay: 500,});}}) }

    對應的表格中的前端按鈕組件代碼在 sotu_table.js 中,關鍵片段如下

    {title: ' 操作',field: 'id',align: 'center',width: '5%',formatter: function (value, row, index) {var html = ""html += "<div onclick='addFavorite(" + value + ")' name='addFavorite' id='addFavorite" + value + "' class='btn btn-default'>收藏</div><p>"html += "<div onclick='deleteById(" + value + ")' name='delete' id='delete" + value + "' class='btn btn-default'>刪除</div>"return html}}

    點擊圖片下載功能

    在 sotu_table.js 中,我們實現點擊圖片自動觸發下載圖片到本地的功能。代碼如下

    {title: '美圖',field: 'url',align: 'center',valign: 'middle',formatter: function (value, row, index) {return "![](" + value + ")"}}

    其中,downloadImage 函數實現如下

    function downloadImage(src) {var $a = $("<a></a>").attr("href", src).attr("download", "sotu.png");$a[0].click(); }

    總結

    以上是生活随笔為你收集整理的第13章 Kotlin 集成 SpringBoot 服务端开发(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    网友自拍区视频精品 | 国内少妇偷人精品视频免费 | 少妇高潮喷潮久久久影院 | 性色欲网站人妻丰满中文久久不卡 | 亚洲日韩乱码中文无码蜜桃臀网站 | 久久久久人妻一区精品色欧美 | 伊人久久大香线蕉亚洲 | a国产一区二区免费入口 | 欧美老妇与禽交 | 日韩av激情在线观看 | 又紧又大又爽精品一区二区 | 日韩亚洲欧美中文高清在线 | 亚洲成a人片在线观看无码 | 色综合久久久无码网中文 | 奇米影视7777久久精品人人爽 | 中文字幕+乱码+中文字幕一区 | 香蕉久久久久久av成人 | 亚洲人成人无码网www国产 | 性欧美牲交xxxxx视频 | 亚洲国产精品美女久久久久 | 在线亚洲高清揄拍自拍一品区 | 亚洲va欧美va天堂v国产综合 | 亚洲色大成网站www | 欧美性黑人极品hd | 亚洲爆乳精品无码一区二区三区 | 老子影院午夜伦不卡 | 性欧美牲交在线视频 | 欧美国产日韩久久mv | 亚洲国产精品无码久久久久高潮 | www国产亚洲精品久久网站 | 暴力强奷在线播放无码 | 人人澡人人妻人人爽人人蜜桃 | √8天堂资源地址中文在线 | 东京热男人av天堂 | 夜夜躁日日躁狠狠久久av | 亚洲人成影院在线无码按摩店 | 国产亚洲精品久久久闺蜜 | 国产在线aaa片一区二区99 | 日韩成人一区二区三区在线观看 | 无码任你躁久久久久久久 | 福利一区二区三区视频在线观看 | 波多野结衣av一区二区全免费观看 | 98国产精品综合一区二区三区 | 久久人人爽人人人人片 | 国产精品资源一区二区 | 免费观看激色视频网站 | 国产精品无码一区二区桃花视频 | 丰满少妇女裸体bbw | 国产精品高潮呻吟av久久 | 日本又色又爽又黄的a片18禁 | 天天躁日日躁狠狠躁免费麻豆 | 欧美精品在线观看 | 国产亲子乱弄免费视频 | 澳门永久av免费网站 | 熟妇人妻无码xxx视频 | 国产明星裸体无码xxxx视频 | 亚洲国产综合无码一区 | 人妻少妇被猛烈进入中文字幕 | 亚洲国产日韩a在线播放 | 国产香蕉尹人综合在线观看 | a片免费视频在线观看 | 色窝窝无码一区二区三区色欲 | 在教室伦流澡到高潮hnp视频 | 日本爽爽爽爽爽爽在线观看免 | 小泽玛莉亚一区二区视频在线 | 一本精品99久久精品77 | 国产另类ts人妖一区二区 | 国产精品美女久久久久av爽李琼 | 国产亚洲精品久久久久久久久动漫 | 免费观看黄网站 | 天天躁日日躁狠狠躁免费麻豆 | 午夜无码人妻av大片色欲 | 人妻少妇精品无码专区动漫 | 国产精品久久福利网站 | 国产成人精品一区二区在线小狼 | 无码一区二区三区在线观看 | 成人无码视频在线观看网站 | 亚洲大尺度无码无码专区 | 欧美野外疯狂做受xxxx高潮 | а天堂中文在线官网 | 噜噜噜亚洲色成人网站 | 亚洲精品中文字幕 | 国产精品igao视频网 | 蜜臀aⅴ国产精品久久久国产老师 | 成人欧美一区二区三区 | 丁香花在线影院观看在线播放 | 色综合久久久无码网中文 | 巨爆乳无码视频在线观看 | 我要看www免费看插插视频 | 国产精品久久国产三级国 | 高潮毛片无遮挡高清免费视频 | 国产成人综合在线女婷五月99播放 | 性啪啪chinese东北女人 | 成熟妇人a片免费看网站 | 窝窝午夜理论片影院 | 蜜臀av无码人妻精品 | aa片在线观看视频在线播放 | 国产精品国产三级国产专播 | 国产三级久久久精品麻豆三级 | 中文字幕av伊人av无码av | 中文字幕人妻丝袜二区 | 俄罗斯老熟妇色xxxx | 欧美日韩在线亚洲综合国产人 | 国产精品亚洲а∨无码播放麻豆 | 久久综合狠狠综合久久综合88 | 十八禁视频网站在线观看 | 久久国产精品精品国产色婷婷 | 97久久精品无码一区二区 | 国产精品亚洲五月天高清 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品高潮呻吟av久久4虎 | 在线观看国产午夜福利片 | 亚洲精品国产精品乱码不卡 | а√资源新版在线天堂 | 国产后入清纯学生妹 | 伊人久久大香线蕉午夜 | 女人被爽到呻吟gif动态图视看 | 日本成熟视频免费视频 | 曰韩少妇内射免费播放 | 香港三级日本三级妇三级 | 久久 国产 尿 小便 嘘嘘 | 人妻熟女一区 | 久久亚洲中文字幕无码 | 天天综合网天天综合色 | 国产精品成人av在线观看 | 日本免费一区二区三区最新 | 国内老熟妇对白xxxxhd | 欧美老妇交乱视频在线观看 | 久久国语露脸国产精品电影 | 中文字幕日产无线码一区 | 亚洲精品美女久久久久久久 | 国产极品美女高潮无套在线观看 | 国内揄拍国内精品少妇国语 | 天下第一社区视频www日本 | 成人精品天堂一区二区三区 | 老司机亚洲精品影院 | 一区二区三区高清视频一 | 久久99精品国产麻豆蜜芽 | 成 人影片 免费观看 | 国产 精品 自在自线 | 国产深夜福利视频在线 | 日本护士毛茸茸高潮 | 装睡被陌生人摸出水好爽 | 国产精品久久久久7777 | 亚洲国产精品久久人人爱 | 无码任你躁久久久久久久 | 亚洲成av人片在线观看无码不卡 | 麻豆av传媒蜜桃天美传媒 | 精品国产aⅴ无码一区二区 | 成人女人看片免费视频放人 | 亚洲精品国产精品乱码不卡 | 国产精品久久久午夜夜伦鲁鲁 | 欧美性黑人极品hd | 国产va免费精品观看 | 又黄又爽又色的视频 | 欧美日本免费一区二区三区 | 丁香花在线影院观看在线播放 | 亚洲中文字幕无码一久久区 | 色偷偷人人澡人人爽人人模 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产亚洲精品久久久久久久久动漫 | 精品人妻人人做人人爽夜夜爽 | 熟妇人妻无乱码中文字幕 | 亚洲日韩中文字幕在线播放 | 国产小呦泬泬99精品 | 樱花草在线播放免费中文 | 精品一区二区三区波多野结衣 | 亚洲精品成a人在线观看 | 欧美日韩色另类综合 | 动漫av网站免费观看 | 又色又爽又黄的美女裸体网站 | 欧美放荡的少妇 | 亚洲欧美精品伊人久久 | 久久 国产 尿 小便 嘘嘘 | 欧美高清在线精品一区 | 亚洲a无码综合a国产av中文 | 少妇无套内谢久久久久 | 精品无人国产偷自产在线 | 露脸叫床粗话东北少妇 | 男女超爽视频免费播放 | 中文字幕无码乱人伦 | 亚洲精品成人福利网站 | 丰满肥臀大屁股熟妇激情视频 | 精品无码成人片一区二区98 | 丰满少妇熟乱xxxxx视频 | aⅴ亚洲 日韩 色 图网站 播放 | 天干天干啦夜天干天2017 | 搡女人真爽免费视频大全 | 国产人妻久久精品二区三区老狼 | 人人妻在人人 | 日本精品少妇一区二区三区 | 国产精品欧美成人 | 99久久人妻精品免费一区 | 日本熟妇人妻xxxxx人hd | 国产av一区二区三区最新精品 | 免费网站看v片在线18禁无码 | 亚洲熟妇色xxxxx亚洲 | 99re在线播放 | 久久精品国产一区二区三区肥胖 | 日本在线高清不卡免费播放 | 亚洲男人av天堂午夜在 | 男人的天堂av网站 | 狠狠色噜噜狠狠狠7777奇米 | 无码午夜成人1000部免费视频 | 性做久久久久久久久 | 99久久婷婷国产综合精品青草免费 | 东京热男人av天堂 | 精品一区二区三区无码免费视频 | 欧美xxxxx精品 | 精品国产一区二区三区av 性色 | 大肉大捧一进一出视频出来呀 | 国产小呦泬泬99精品 | 久久精品99久久香蕉国产色戒 | 丰满人妻精品国产99aⅴ | www一区二区www免费 | 永久免费观看国产裸体美女 | 国内精品人妻无码久久久影院 | 撕开奶罩揉吮奶头视频 | 99er热精品视频 | 久久精品国产大片免费观看 | 无码国内精品人妻少妇 | 欧美激情综合亚洲一二区 | 狠狠噜狠狠狠狠丁香五月 | 国产人妻久久精品二区三区老狼 | 亚洲综合伊人久久大杳蕉 | 亚洲人成影院在线观看 | 曰韩少妇内射免费播放 | 欧美猛少妇色xxxxx | 亚洲精品一区二区三区大桥未久 | 人人爽人人爽人人片av亚洲 | 免费中文字幕日韩欧美 | 久久成人a毛片免费观看网站 | 中文字幕精品av一区二区五区 | 色老头在线一区二区三区 | 国精产品一品二品国精品69xx | 国产成人久久精品流白浆 | 亚洲国产成人av在线观看 | www国产亚洲精品久久久日本 | 精品偷拍一区二区三区在线看 | 老熟妇乱子伦牲交视频 | 日韩精品无码一本二本三本色 | 熟女体下毛毛黑森林 | 欧美日韩视频无码一区二区三 | 中文字幕精品av一区二区五区 | 300部国产真实乱 | 300部国产真实乱 | 又粗又大又硬又长又爽 | 无码帝国www无码专区色综合 | 亚洲а∨天堂久久精品2021 | 超碰97人人做人人爱少妇 | 熟妇激情内射com | 97久久国产亚洲精品超碰热 | 夜夜夜高潮夜夜爽夜夜爰爰 | 少妇性l交大片欧洲热妇乱xxx | 日日鲁鲁鲁夜夜爽爽狠狠 | 内射后入在线观看一区 | 久久精品人妻少妇一区二区三区 | 久久亚洲精品中文字幕无男同 | 亚洲国产精品久久久天堂 | 国产精品理论片在线观看 | 正在播放东北夫妻内射 | 国产极品美女高潮无套在线观看 | 人人澡人人妻人人爽人人蜜桃 | 欧美第一黄网免费网站 | 国产亲子乱弄免费视频 | 国产乱人伦偷精品视频 | 久久精品成人欧美大片 | 亚洲色在线无码国产精品不卡 | 国产精品无码一区二区三区不卡 | 亚欧洲精品在线视频免费观看 | 国产69精品久久久久app下载 | 欧美性猛交xxxx富婆 | 呦交小u女精品视频 | 亚洲午夜福利在线观看 | 夜先锋av资源网站 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久精品中文字幕一区 | 夜夜躁日日躁狠狠久久av | 鲁一鲁av2019在线 | 天堂无码人妻精品一区二区三区 | 成人精品一区二区三区中文字幕 | 日本精品少妇一区二区三区 | 国精产品一区二区三区 | 成人无码精品1区2区3区免费看 | 天天爽夜夜爽夜夜爽 | 综合激情五月综合激情五月激情1 | 久久熟妇人妻午夜寂寞影院 | 亚洲综合精品香蕉久久网 | 亚洲 欧美 激情 小说 另类 | 日本欧美一区二区三区乱码 | 天天燥日日燥 | 国产综合色产在线精品 | 精品国产麻豆免费人成网站 | 一本无码人妻在中文字幕免费 | 亚洲乱码日产精品bd | 男人的天堂av网站 | 国产手机在线αⅴ片无码观看 | 小鲜肉自慰网站xnxx | 国产亚洲人成a在线v网站 | 日韩精品无码一本二本三本色 | 久久国产精品萌白酱免费 | 欧美精品在线观看 | 任你躁国产自任一区二区三区 | 精品国产青草久久久久福利 | 国产人妻精品一区二区三区 | 97se亚洲精品一区 | 亚洲中文字幕在线无码一区二区 | 久久www免费人成人片 | 国产无套内射久久久国产 | 性啪啪chinese东北女人 | 日韩欧美中文字幕公布 | 女人被男人爽到呻吟的视频 | 人妻与老人中文字幕 | 亚洲成av人片天堂网无码】 | 无码任你躁久久久久久久 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲综合伊人久久大杳蕉 | 熟妇人妻激情偷爽文 | 18禁止看的免费污网站 | 久久综合香蕉国产蜜臀av | 亚洲中文字幕在线无码一区二区 | 给我免费的视频在线观看 | 牛和人交xxxx欧美 | 国产精品久久久久影院嫩草 | 99久久人妻精品免费一区 | 思思久久99热只有频精品66 | 四虎影视成人永久免费观看视频 | 中文字幕人成乱码熟女app | 99视频精品全部免费免费观看 | 人妻无码αv中文字幕久久琪琪布 | 久久久精品国产sm最大网站 | 欧美日韩在线亚洲综合国产人 | 欧美乱妇无乱码大黄a片 | 综合网日日天干夜夜久久 | 少妇激情av一区二区 | 一本久道久久综合婷婷五月 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲 欧美 激情 小说 另类 | 内射后入在线观看一区 | 亚洲大尺度无码无码专区 | 国产亚洲精品久久久久久久久动漫 | 亚洲自偷自偷在线制服 | 图片区 小说区 区 亚洲五月 | a片免费视频在线观看 | 精品国产一区二区三区四区在线看 | 天天拍夜夜添久久精品大 | 亚洲综合无码一区二区三区 | 5858s亚洲色大成网站www | 欧洲极品少妇 | 午夜福利不卡在线视频 | 国产亚洲美女精品久久久2020 | 成人免费视频视频在线观看 免费 | 久久久久免费精品国产 | aa片在线观看视频在线播放 | 人妻无码αv中文字幕久久琪琪布 | 老司机亚洲精品影院 | 亚洲啪av永久无码精品放毛片 | 亚洲国产综合无码一区 | 一本久道久久综合婷婷五月 | 亚洲国产午夜精品理论片 | 欧美激情综合亚洲一二区 | 中文精品久久久久人妻不卡 | 精品熟女少妇av免费观看 | 樱花草在线播放免费中文 | 国产人成高清在线视频99最全资源 | 婷婷六月久久综合丁香 | 亚洲国产综合无码一区 | 国产va免费精品观看 | 中文字幕无码av激情不卡 | 亚洲人成网站免费播放 | 中文字幕无码av波多野吉衣 | 亚洲精品一区二区三区在线 | 国产精品久久精品三级 | 午夜精品一区二区三区在线观看 | 精品人人妻人人澡人人爽人人 | 西西人体www44rt大胆高清 | aⅴ亚洲 日韩 色 图网站 播放 | 精品久久久久久人妻无码中文字幕 | 久久国产劲爆∧v内射 | 成人免费视频在线观看 | √8天堂资源地址中文在线 | 亚洲中文字幕无码一久久区 | 久久精品丝袜高跟鞋 | 国内精品久久毛片一区二区 | 欧美真人作爱免费视频 | 国产热a欧美热a在线视频 | 色 综合 欧美 亚洲 国产 | 蜜臀av无码人妻精品 | 天堂а√在线中文在线 | 成熟女人特级毛片www免费 | 国产精品内射视频免费 | 97夜夜澡人人爽人人喊中国片 | 日产精品99久久久久久 | 精品国产一区二区三区四区 | 免费无码的av片在线观看 | 国产九九九九九九九a片 | 妺妺窝人体色www在线小说 | 熟妇人妻中文av无码 | 精品久久8x国产免费观看 | 老司机亚洲精品影院 | 亚洲欧洲日本综合aⅴ在线 | 97se亚洲精品一区 | 国产亚洲美女精品久久久2020 | 中文精品无码中文字幕无码专区 | 性色av无码免费一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 国产又爽又黄又刺激的视频 | 亚洲国产日韩a在线播放 | 美女张开腿让人桶 | 中文字幕无码免费久久99 | 亚洲国产成人av在线观看 | 色婷婷欧美在线播放内射 | 乌克兰少妇性做爰 | 水蜜桃亚洲一二三四在线 | 无码精品国产va在线观看dvd | 欧美性猛交内射兽交老熟妇 | 激情内射日本一区二区三区 | 巨爆乳无码视频在线观看 | 国产在线精品一区二区三区直播 | 内射巨臀欧美在线视频 | 曰韩无码二三区中文字幕 | 99久久精品日本一区二区免费 | 亚洲自偷自偷在线制服 | 人人妻人人澡人人爽欧美一区九九 | 中文字幕av无码一区二区三区电影 | 国产成人综合色在线观看网站 | 麻豆国产丝袜白领秘书在线观看 | 人人澡人人妻人人爽人人蜜桃 | 国产午夜无码精品免费看 | 国产超级va在线观看视频 | 精品 日韩 国产 欧美 视频 | 真人与拘做受免费视频 | 少妇的肉体aa片免费 | 乱人伦人妻中文字幕无码久久网 | 性欧美熟妇videofreesex | 精品国偷自产在线 | 又粗又大又硬毛片免费看 | 无码国产色欲xxxxx视频 | 高潮毛片无遮挡高清免费视频 | 国产亚洲欧美在线专区 | 人妻少妇精品无码专区动漫 | 伊人久久婷婷五月综合97色 | 精品国产青草久久久久福利 | 亚无码乱人伦一区二区 | 欧美熟妇另类久久久久久不卡 | 67194成是人免费无码 | 国产精品人人爽人人做我的可爱 | 欧美亚洲日韩国产人成在线播放 | 十八禁视频网站在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 精品无码成人片一区二区98 | 亚洲成a人片在线观看无码3d | 国产色xx群视频射精 | 午夜丰满少妇性开放视频 | 日本护士xxxxhd少妇 | 伦伦影院午夜理论片 | 一二三四社区在线中文视频 | 欧洲欧美人成视频在线 | 亚洲欧洲中文日韩av乱码 | www国产精品内射老师 | 国内揄拍国内精品少妇国语 | 在教室伦流澡到高潮hnp视频 | 中文字幕 亚洲精品 第1页 | 福利一区二区三区视频在线观看 | 思思久久99热只有频精品66 | 日韩精品无码一区二区中文字幕 | 精品一区二区三区波多野结衣 | www一区二区www免费 | 内射爽无广熟女亚洲 | 日本一本二本三区免费 | 国产亚洲精品久久久闺蜜 | 日韩精品无码一本二本三本色 | 亚洲精品综合一区二区三区在线 | 激情内射日本一区二区三区 | 人妻中文无码久热丝袜 | 全球成人中文在线 | 国产亚洲视频中文字幕97精品 | 国产亚洲精品久久久久久久久动漫 | 久久久久久久人妻无码中文字幕爆 | 成人av无码一区二区三区 | 无套内射视频囯产 | 亚洲精品一区国产 | 亚洲国产精品无码久久久久高潮 | 日韩人妻无码中文字幕视频 | 日本大乳高潮视频在线观看 | 精品无码一区二区三区爱欲 | 麻豆人妻少妇精品无码专区 | 4hu四虎永久在线观看 | 精品人妻人人做人人爽 | 亚洲国产精品毛片av不卡在线 | 欧美兽交xxxx×视频 | 欧美刺激性大交 | 久在线观看福利视频 | 久久久久久九九精品久 | 无码一区二区三区在线 | 成人无码精品一区二区三区 | 欧美野外疯狂做受xxxx高潮 | 日日干夜夜干 | 色综合久久网 | 国产亚洲精品久久久ai换 | 成人三级无码视频在线观看 | 色欲久久久天天天综合网精品 | 丰满肥臀大屁股熟妇激情视频 | 久久精品一区二区三区四区 | 日韩少妇白浆无码系列 | 中文字幕色婷婷在线视频 | а√天堂www在线天堂小说 | 未满小14洗澡无码视频网站 | 欧美日韩一区二区免费视频 | 国产精品手机免费 | 亚洲色成人中文字幕网站 | 女人被爽到呻吟gif动态图视看 | 少妇太爽了在线观看 | 国产在线aaa片一区二区99 | 精品久久久久久亚洲精品 | 国产乡下妇女做爰 | 黑人玩弄人妻中文在线 | 日日摸夜夜摸狠狠摸婷婷 | 国産精品久久久久久久 | 人妻少妇被猛烈进入中文字幕 | 四十如虎的丰满熟妇啪啪 | 人妻少妇精品无码专区二区 | 亚洲精品久久久久久久久久久 | 亚洲欧美日韩成人高清在线一区 | 波多野结衣乳巨码无在线观看 | 青青青手机频在线观看 | 日韩欧美中文字幕在线三区 | 免费观看又污又黄的网站 | 国产无遮挡吃胸膜奶免费看 | 男女下面进入的视频免费午夜 | 在线精品亚洲一区二区 | 狠狠躁日日躁夜夜躁2020 | 久久久久久国产精品无码下载 | 国产 浪潮av性色四虎 | 初尝人妻少妇中文字幕 | 国产高清av在线播放 | 十八禁真人啪啪免费网站 | 亚洲精品中文字幕久久久久 | 午夜精品一区二区三区在线观看 | 久久综合给久久狠狠97色 | 欧美午夜特黄aaaaaa片 | 波多野结衣aⅴ在线 | 免费国产黄网站在线观看 | 国产精品久久福利网站 | 欧美丰满熟妇xxxx | 妺妺窝人体色www在线小说 | 欧美成人高清在线播放 | 欧美老妇与禽交 | 久精品国产欧美亚洲色aⅴ大片 | 久久精品女人天堂av免费观看 | 亚洲国产精品久久久久久 | 精品成人av一区二区三区 | 中文字幕无码免费久久99 | a国产一区二区免费入口 | 婷婷色婷婷开心五月四房播播 | 一本一道久久综合久久 | 国产精品无码一区二区桃花视频 | 亚洲成a人片在线观看日本 | 波多野结衣av在线观看 | 巨爆乳无码视频在线观看 | 99久久99久久免费精品蜜桃 | 亚洲综合另类小说色区 | 久久久www成人免费毛片 | 自拍偷自拍亚洲精品被多人伦好爽 | 日本一区二区更新不卡 | 亚洲欧美色中文字幕在线 | 一区二区三区高清视频一 | av无码不卡在线观看免费 | 国产精品亚洲专区无码不卡 | 亚洲爆乳大丰满无码专区 | 人人爽人人澡人人人妻 | 99久久99久久免费精品蜜桃 | 国产精品久久精品三级 | 亚洲中文字幕乱码av波多ji | 无套内谢老熟女 | 午夜肉伦伦影院 | 免费乱码人妻系列无码专区 | 色欲av亚洲一区无码少妇 | 国产精品毛片一区二区 | 国产一区二区三区影院 | 暴力强奷在线播放无码 | 特级做a爰片毛片免费69 | 小鲜肉自慰网站xnxx | 欧美丰满熟妇xxxx性ppx人交 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 2020最新国产自产精品 | 最近中文2019字幕第二页 | 久久www免费人成人片 | 九九综合va免费看 | 波多野结衣av一区二区全免费观看 | 亚洲精品国产a久久久久久 | 亚洲精品一区二区三区四区五区 | 性做久久久久久久免费看 | 亚洲综合精品香蕉久久网 | 国产美女极度色诱视频www | 欧美成人高清在线播放 | 中文字幕无码免费久久99 | 国产乱子伦视频在线播放 | 少妇久久久久久人妻无码 | 国产国产精品人在线视 | 学生妹亚洲一区二区 | 色欲av亚洲一区无码少妇 | 四虎永久在线精品免费网址 | 国产真实乱对白精彩久久 | 成年美女黄网站色大免费全看 | 无码福利日韩神码福利片 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲 另类 在线 欧美 制服 | 久久熟妇人妻午夜寂寞影院 | 亚洲区小说区激情区图片区 | 麻豆蜜桃av蜜臀av色欲av | 18无码粉嫩小泬无套在线观看 | 亚洲中文字幕无码中字 | 久久午夜无码鲁丝片秋霞 | 天天拍夜夜添久久精品大 | 少妇高潮一区二区三区99 | 激情内射日本一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 成人综合网亚洲伊人 | 久久这里只有精品视频9 | 成人aaa片一区国产精品 | 精品无人国产偷自产在线 | 综合网日日天干夜夜久久 | 国产农村乱对白刺激视频 | 日韩精品久久久肉伦网站 | 国产av无码专区亚洲a∨毛片 | 人人妻人人澡人人爽人人精品浪潮 | 性色欲情网站iwww九文堂 | 精品乱码久久久久久久 | 一本大道伊人av久久综合 | 久久精品国产日本波多野结衣 | 欧美日韩在线亚洲综合国产人 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 偷窥村妇洗澡毛毛多 | 中文字幕人妻无码一区二区三区 | 日本护士毛茸茸高潮 | 日日躁夜夜躁狠狠躁 | 极品尤物被啪到呻吟喷水 | 成人无码精品一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 婷婷色婷婷开心五月四房播播 | 亚洲色欲久久久综合网东京热 | 亚洲日本va午夜在线电影 | 成人aaa片一区国产精品 | 真人与拘做受免费视频一 | 又紧又大又爽精品一区二区 | 又紧又大又爽精品一区二区 | 精品无码成人片一区二区98 | 人人澡人人妻人人爽人人蜜桃 | 午夜免费福利小电影 | 精品久久8x国产免费观看 | 欧美丰满老熟妇xxxxx性 | 国产舌乚八伦偷品w中 | 久久熟妇人妻午夜寂寞影院 | 牲欲强的熟妇农村老妇女 | 综合网日日天干夜夜久久 | 国产精品久久久久久亚洲影视内衣 | 影音先锋中文字幕无码 | 3d动漫精品啪啪一区二区中 | 久久国产精品萌白酱免费 | 无码乱肉视频免费大全合集 | 纯爱无遮挡h肉动漫在线播放 | 人人爽人人澡人人人妻 | 日本熟妇浓毛 | 亚拍精品一区二区三区探花 | 中文字幕乱码亚洲无线三区 | 人人澡人人妻人人爽人人蜜桃 | 99在线 | 亚洲 | 2019午夜福利不卡片在线 | 免费看少妇作爱视频 | 成 人影片 免费观看 | 亚洲中文字幕在线无码一区二区 | 国产肉丝袜在线观看 | 亚洲啪av永久无码精品放毛片 | 色综合久久88色综合天天 | 又湿又紧又大又爽a视频国产 | 蜜桃视频插满18在线观看 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 18无码粉嫩小泬无套在线观看 | 亚洲人亚洲人成电影网站色 | 国产电影无码午夜在线播放 | 欧美国产亚洲日韩在线二区 | 国产熟妇另类久久久久 | 久久综合久久自在自线精品自 | 强辱丰满人妻hd中文字幕 | 国产精品久久久久久亚洲毛片 | 欧美大屁股xxxxhd黑色 | 国产成人综合在线女婷五月99播放 | 成人无码精品1区2区3区免费看 | 日韩精品成人一区二区三区 | 国产日产欧产精品精品app | 伊人色综合久久天天小片 | 熟妇女人妻丰满少妇中文字幕 | 一本久道久久综合婷婷五月 | 中文字幕日韩精品一区二区三区 | 又粗又大又硬又长又爽 | 色一情一乱一伦 | 国产成人无码a区在线观看视频app | 色妞www精品免费视频 | 国产精品亚洲а∨无码播放麻豆 | 亚洲日韩av一区二区三区中文 | 色一情一乱一伦 | 噜噜噜亚洲色成人网站 | 日本熟妇乱子伦xxxx | 国产乡下妇女做爰 | 久久久久久国产精品无码下载 | 国产亚洲精品精品国产亚洲综合 | 婷婷六月久久综合丁香 | 色欲av亚洲一区无码少妇 | 图片区 小说区 区 亚洲五月 | 图片小说视频一区二区 | 国产农村乱对白刺激视频 | 又紧又大又爽精品一区二区 | 亚洲精品综合五月久久小说 | 欧美黑人巨大xxxxx | 亚洲精品国产精品乱码不卡 | 亚洲精品成人av在线 | 国产两女互慰高潮视频在线观看 | 正在播放东北夫妻内射 | 国产在线一区二区三区四区五区 | 国产特级毛片aaaaaa高潮流水 | 亚洲成av人在线观看网址 | 偷窥日本少妇撒尿chinese | 亚洲熟妇色xxxxx欧美老妇 | 2019午夜福利不卡片在线 | 伊在人天堂亚洲香蕉精品区 | 国产人妻精品午夜福利免费 | 国产精品鲁鲁鲁 | 久久99久久99精品中文字幕 | 亚洲综合在线一区二区三区 | 亚洲色无码一区二区三区 | 鲁鲁鲁爽爽爽在线视频观看 | 无码乱肉视频免费大全合集 | 风流少妇按摩来高潮 | 国产乱人偷精品人妻a片 | 国产香蕉尹人视频在线 | 亚洲成a人片在线观看无码3d | 亚洲精品一区二区三区在线 | 欧美国产日韩久久mv | 极品尤物被啪到呻吟喷水 | 中文字幕+乱码+中文字幕一区 | 久久精品国产99精品亚洲 | 又大又硬又黄的免费视频 | 久久久av男人的天堂 | 少妇人妻偷人精品无码视频 | 欧美真人作爱免费视频 | 国产精品多人p群无码 | 成熟女人特级毛片www免费 | 99久久久无码国产精品免费 | 无码午夜成人1000部免费视频 | 国语自产偷拍精品视频偷 | 天天躁夜夜躁狠狠是什么心态 | 九月婷婷人人澡人人添人人爽 | 日本熟妇人妻xxxxx人hd | 亚洲欧美色中文字幕在线 | 国产精品人妻一区二区三区四 | 久久久成人毛片无码 | 国产一精品一av一免费 | 亚洲国产一区二区三区在线观看 | 久久精品无码一区二区三区 | 国产艳妇av在线观看果冻传媒 | 日韩av激情在线观看 | 成人免费视频一区二区 | 在线观看国产午夜福利片 | 中文字幕无码日韩专区 | 欧美老熟妇乱xxxxx | 国产福利视频一区二区 | 久久亚洲中文字幕精品一区 | 国产精品久久久久久无码 | 欧美成人午夜精品久久久 | 国产精品久久久av久久久 | 中文亚洲成a人片在线观看 | 中文字幕av无码一区二区三区电影 | 精品国偷自产在线 | 久久精品人人做人人综合试看 | 伊人久久大香线蕉午夜 | 色婷婷香蕉在线一区二区 | 日本爽爽爽爽爽爽在线观看免 | 最近中文2019字幕第二页 | 国产xxx69麻豆国语对白 | 亚洲日韩av片在线观看 | 99久久人妻精品免费一区 | 亚洲国产精品一区二区第一页 | 人妻插b视频一区二区三区 | 色婷婷久久一区二区三区麻豆 | 狠狠色噜噜狠狠狠狠7777米奇 | 在线播放亚洲第一字幕 | 999久久久国产精品消防器材 | 亚洲成在人网站无码天堂 | 夫妻免费无码v看片 | 日韩精品成人一区二区三区 | 97色伦图片97综合影院 | 天天做天天爱天天爽综合网 | 中文无码成人免费视频在线观看 | 欧美 丝袜 自拍 制服 另类 | 奇米影视7777久久精品人人爽 | 丰满护士巨好爽好大乳 | 亚洲精品国偷拍自产在线麻豆 | 国产精品办公室沙发 | 狠狠色噜噜狠狠狠7777奇米 | 国产精品va在线播放 | 亚洲自偷自拍另类第1页 | 伊人色综合久久天天小片 | 亚洲日韩精品欧美一区二区 | 精品国产一区二区三区四区在线看 | 国产成人综合色在线观看网站 | 亚洲精品一区二区三区大桥未久 | 亚洲综合久久一区二区 | 在线欧美精品一区二区三区 | 欧美日韩亚洲国产精品 | 97夜夜澡人人双人人人喊 | 国产精品多人p群无码 | 久久亚洲精品成人无码 | 少妇久久久久久人妻无码 | 久久久久久av无码免费看大片 | 国产免费无码一区二区视频 | 天天躁夜夜躁狠狠是什么心态 | 超碰97人人做人人爱少妇 | 国产乱人伦av在线无码 | аⅴ资源天堂资源库在线 | 亚洲欧美色中文字幕在线 | 色综合久久88色综合天天 | 4hu四虎永久在线观看 | 成人精品视频一区二区三区尤物 | 久久国产精品萌白酱免费 | 亚洲国产精品久久久久久 | 亚洲精品www久久久 | 男人的天堂av网站 | 中文字幕无码日韩欧毛 | 乱人伦中文视频在线观看 | 一本久久伊人热热精品中文字幕 | 超碰97人人射妻 | 国产偷国产偷精品高清尤物 | 亚洲 欧美 激情 小说 另类 | 日日麻批免费40分钟无码 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲熟女一区二区三区 | 成人精品视频一区二区三区尤物 | 国产口爆吞精在线视频 | 成人免费无码大片a毛片 | 精品欧洲av无码一区二区三区 | 300部国产真实乱 | 欧洲美熟女乱又伦 | 亚洲欧洲中文日韩av乱码 | 无码乱肉视频免费大全合集 | 一区二区三区乱码在线 | 欧洲 | 国产黄在线观看免费观看不卡 | 国产亲子乱弄免费视频 | 5858s亚洲色大成网站www | 国产区女主播在线观看 | 国产手机在线αⅴ片无码观看 | 国产成人无码午夜视频在线观看 | 国产97人人超碰caoprom | 色五月五月丁香亚洲综合网 | 国产av人人夜夜澡人人爽麻豆 | 亚洲日本va中文字幕 | 精品国产麻豆免费人成网站 | 99国产精品白浆在线观看免费 | 大地资源网第二页免费观看 | 久久国产自偷自偷免费一区调 | 亚洲精品久久久久avwww潮水 | 亚洲日韩一区二区 | 中国大陆精品视频xxxx | 国产精品亚洲а∨无码播放麻豆 | аⅴ资源天堂资源库在线 | 午夜肉伦伦影院 | 国产成人一区二区三区在线观看 | 欧美老人巨大xxxx做受 | 亚洲区小说区激情区图片区 | 国产猛烈高潮尖叫视频免费 | 国产av一区二区精品久久凹凸 | 强开小婷嫩苞又嫩又紧视频 | 在教室伦流澡到高潮hnp视频 | 国产人妻大战黑人第1集 | 人妻少妇精品视频专区 | 日韩欧美成人免费观看 | а√资源新版在线天堂 | aⅴ亚洲 日韩 色 图网站 播放 | 日产精品99久久久久久 | 日韩精品无码一本二本三本色 | 又粗又大又硬又长又爽 | 国产97在线 | 亚洲 | 一本色道久久综合亚洲精品不卡 | 久久国产精品精品国产色婷婷 | 丰腴饱满的极品熟妇 | 波多野结衣av在线观看 | 日韩 欧美 动漫 国产 制服 | 国产手机在线αⅴ片无码观看 | 无码午夜成人1000部免费视频 | 精品无码av一区二区三区 | 中文字幕av日韩精品一区二区 | 夫妻免费无码v看片 | 亚洲中文字幕在线观看 | 人妻中文无码久热丝袜 | 精品 日韩 国产 欧美 视频 | 国产精品久久久久影院嫩草 | 中文字幕无码乱人伦 | 欧美xxxxx精品 | 色婷婷香蕉在线一区二区 | 日本熟妇大屁股人妻 | 欧美成人高清在线播放 | 久久久婷婷五月亚洲97号色 | 国产精品爱久久久久久久 | 国产美女精品一区二区三区 | 免费观看又污又黄的网站 | 国产高潮视频在线观看 | 免费无码av一区二区 | 人人爽人人澡人人人妻 | 性做久久久久久久久 | 人妻插b视频一区二区三区 | 成人免费视频一区二区 | 日产国产精品亚洲系列 | 乱人伦人妻中文字幕无码久久网 | 中国女人内谢69xxxx | 国产亚洲精品久久久久久大师 | 国产精品久久久av久久久 | 内射白嫩少妇超碰 | 国产莉萝无码av在线播放 | 久久人人爽人人爽人人片av高清 | 欧美日本免费一区二区三区 | 内射爽无广熟女亚洲 | 亚欧洲精品在线视频免费观看 | 国产乱人偷精品人妻a片 | 久久精品国产大片免费观看 | 台湾无码一区二区 | 亚洲色www成人永久网址 | 亚洲 日韩 欧美 成人 在线观看 | 国产精品无码一区二区桃花视频 | 国产精品久久久久久亚洲毛片 | 亚洲日本一区二区三区在线 | 性开放的女人aaa片 | 国内老熟妇对白xxxxhd | 无码帝国www无码专区色综合 | 日韩人妻少妇一区二区三区 | 又大又紧又粉嫩18p少妇 | 蜜臀av在线播放 久久综合激激的五月天 | 精品国产一区二区三区四区在线看 | 成年美女黄网站色大免费视频 | 亚洲精品久久久久中文第一幕 | 国产精品人妻一区二区三区四 | 久久综合给久久狠狠97色 | 性史性农村dvd毛片 | 色综合久久久久综合一本到桃花网 | 国产精品无码永久免费888 | 欧美日韩视频无码一区二区三 | 亚洲日本va中文字幕 | 波多野结衣 黑人 | 日本精品久久久久中文字幕 | 我要看www免费看插插视频 | 中文字幕 亚洲精品 第1页 | 亚洲国产成人av在线观看 | 大地资源中文第3页 | 2019nv天堂香蕉在线观看 | 日本欧美一区二区三区乱码 | 啦啦啦www在线观看免费视频 | 日本熟妇人妻xxxxx人hd | 在线观看国产午夜福利片 | 亚洲成a人片在线观看日本 | 国产综合色产在线精品 | 亚洲人成人无码网www国产 | 男人的天堂av网站 | 亚欧洲精品在线视频免费观看 | 纯爱无遮挡h肉动漫在线播放 | 亚洲色成人中文字幕网站 | 精品国产福利一区二区 | 成人免费视频视频在线观看 免费 | 亚洲中文字幕乱码av波多ji | 亚洲精品久久久久中文第一幕 | 精品无码av一区二区三区 | 亚洲精品午夜国产va久久成人 | 亚洲综合精品香蕉久久网 | 最新版天堂资源中文官网 | 天下第一社区视频www日本 | 精品国产一区av天美传媒 | 欧美国产亚洲日韩在线二区 | 亚洲日本va午夜在线电影 | 色婷婷香蕉在线一区二区 | 大地资源中文第3页 | 少妇人妻av毛片在线看 | 纯爱无遮挡h肉动漫在线播放 | 亚洲成色在线综合网站 | 波多野结衣av在线观看 | 在线观看国产午夜福利片 | 日韩av无码一区二区三区不卡 | 精品国产青草久久久久福利 | 无码国内精品人妻少妇 | 国产精品爱久久久久久久 | 性欧美熟妇videofreesex | 成年美女黄网站色大免费全看 | 欧美国产亚洲日韩在线二区 | 欧美人与禽猛交狂配 | 成人动漫在线观看 | 久久久久99精品国产片 | 午夜精品久久久内射近拍高清 | 成 人 网 站国产免费观看 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲色欲色欲欲www在线 | 中文精品无码中文字幕无码专区 | 无码国内精品人妻少妇 | 国产乡下妇女做爰 | 日本va欧美va欧美va精品 | 久久久久久亚洲精品a片成人 | 久久久久国色av免费观看性色 | 97精品人妻一区二区三区香蕉 | 成人综合网亚洲伊人 | 国产激情精品一区二区三区 | 色欲人妻aaaaaaa无码 | 欧美人与善在线com | 日韩视频 中文字幕 视频一区 | 无套内谢的新婚少妇国语播放 | 中文字幕无码免费久久9一区9 | 人妻尝试又大又粗久久 | 男人和女人高潮免费网站 | 中文字幕人成乱码熟女app | 国产超级va在线观看视频 | 精品久久综合1区2区3区激情 | 亚洲 欧美 激情 小说 另类 | 亚洲国产精品一区二区美利坚 | 亚洲男女内射在线播放 | 2020久久香蕉国产线看观看 | 九九久久精品国产免费看小说 | 鲁鲁鲁爽爽爽在线视频观看 | 国产综合久久久久鬼色 | 日日天干夜夜狠狠爱 | 亚洲一区二区三区播放 | 丰满少妇高潮惨叫视频 | 色综合久久久久综合一本到桃花网 | 亚洲一区二区观看播放 | 奇米影视888欧美在线观看 | 久久久婷婷五月亚洲97号色 | 激情五月综合色婷婷一区二区 | 亚洲无人区一区二区三区 | 亚洲国产精品美女久久久久 | 人人超人人超碰超国产 | 成人欧美一区二区三区黑人免费 | 无码人妻久久一区二区三区不卡 | 久久精品国产大片免费观看 | 亚洲午夜福利在线观看 | 男人的天堂2018无码 | 国产艳妇av在线观看果冻传媒 | 激情爆乳一区二区三区 | 国产69精品久久久久app下载 | 亚洲成av人影院在线观看 | 国内精品久久毛片一区二区 | 综合激情五月综合激情五月激情1 | 小泽玛莉亚一区二区视频在线 | 国产乱子伦视频在线播放 | 成人动漫在线观看 | 国产亚洲精品久久久久久 | 久久天天躁夜夜躁狠狠 | 久久久久久亚洲精品a片成人 | 亚洲色在线无码国产精品不卡 | 亚洲国产av美女网站 | 国产办公室秘书无码精品99 | 中文字幕日韩精品一区二区三区 | 国产欧美精品一区二区三区 | 国产无套粉嫩白浆在线 | аⅴ资源天堂资源库在线 | 97精品国产97久久久久久免费 | 亚洲国产欧美在线成人 | 网友自拍区视频精品 | 无套内谢的新婚少妇国语播放 | 国产成人精品一区二区在线小狼 | 亚洲人成影院在线观看 | 亚洲 a v无 码免 费 成 人 a v | 成人无码精品一区二区三区 | 老司机亚洲精品影院 | 国产激情无码一区二区app | 亚洲天堂2017无码 | 亚洲男女内射在线播放 | 亚洲の无码国产の无码步美 | 亚洲熟妇色xxxxx亚洲 | 亚洲 另类 在线 欧美 制服 | 久久久久国色av免费观看性色 | 人人澡人摸人人添 | 亚洲一区二区三区无码久久 | 亚洲第一网站男人都懂 | 亚洲理论电影在线观看 | 久久精品国产一区二区三区肥胖 | 午夜福利试看120秒体验区 | 亚洲综合无码一区二区三区 | 国产亚洲精品久久久久久大师 | 国产情侣作爱视频免费观看 | 国産精品久久久久久久 | 性生交片免费无码看人 | 亚洲色偷偷男人的天堂 | 久久久久成人片免费观看蜜芽 | 伊人久久大香线焦av综合影院 | 亚洲色欲色欲天天天www | 亚洲精品成人福利网站 | 国产又爽又黄又刺激的视频 | 俺去俺来也在线www色官网 | 乌克兰少妇xxxx做受 | 国产又爽又黄又刺激的视频 | 久久久中文字幕日本无吗 | 又大又黄又粗又爽的免费视频 | 欧美激情一区二区三区成人 | 男女猛烈xx00免费视频试看 | 少妇被粗大的猛进出69影院 | 国产精品99爱免费视频 | 人妻天天爽夜夜爽一区二区 | 少妇性l交大片欧洲热妇乱xxx | 东京无码熟妇人妻av在线网址 | 美女毛片一区二区三区四区 | 久久久久av无码免费网 | 亚洲国产欧美国产综合一区 | 日本精品人妻无码77777 天堂一区人妻无码 | 少妇高潮一区二区三区99 | 动漫av网站免费观看 | 精品午夜福利在线观看 | 成人亚洲精品久久久久软件 | 人人妻人人澡人人爽人人精品 | 强开小婷嫩苞又嫩又紧视频 | 精品无码成人片一区二区98 | 青青草原综合久久大伊人精品 | 成在人线av无码免观看麻豆 | 国内少妇偷人精品视频 | 999久久久国产精品消防器材 | 欧美 日韩 亚洲 在线 | 377p欧洲日本亚洲大胆 | 又粗又大又硬又长又爽 | 亚洲 欧美 激情 小说 另类 | 亚洲va欧美va天堂v国产综合 | 亚洲人成网站在线播放942 | 久久久久久久女国产乱让韩 | 日本护士xxxxhd少妇 | 久久久久久av无码免费看大片 | 高清不卡一区二区三区 | 国产激情无码一区二区app | 亚洲爆乳精品无码一区二区三区 | 麻豆成人精品国产免费 | 国产成人无码a区在线观看视频app | 妺妺窝人体色www婷婷 | 久久亚洲精品中文字幕无男同 | 色窝窝无码一区二区三区色欲 | 动漫av网站免费观看 | 中文字幕日韩精品一区二区三区 | 中文字幕乱码人妻无码久久 | 免费乱码人妻系列无码专区 | 99国产欧美久久久精品 | 免费网站看v片在线18禁无码 | 又粗又大又硬毛片免费看 | 人妻无码久久精品人妻 | 18黄暴禁片在线观看 | 久久这里只有精品视频9 | 国产美女精品一区二区三区 | 国产热a欧美热a在线视频 | 久久亚洲日韩精品一区二区三区 | 日韩人妻无码中文字幕视频 | 成人无码影片精品久久久 | 精品国精品国产自在久国产87 | 欧美第一黄网免费网站 | 无码午夜成人1000部免费视频 | 欧美日韩视频无码一区二区三 | 亚洲国产精品美女久久久久 | 18禁黄网站男男禁片免费观看 | 中文字幕 人妻熟女 | 亚欧洲精品在线视频免费观看 | 98国产精品综合一区二区三区 | 夫妻免费无码v看片 | 久久这里只有精品视频9 | 伊在人天堂亚洲香蕉精品区 | 久久久久久久人妻无码中文字幕爆 | 国产亚洲精品久久久ai换 | 疯狂三人交性欧美 | 亚洲男人av香蕉爽爽爽爽 | 国产猛烈高潮尖叫视频免费 | 性开放的女人aaa片 | 国色天香社区在线视频 | 国内揄拍国内精品少妇国语 | 精品国产一区二区三区四区 | 免费国产成人高清在线观看网站 | 少妇人妻大乳在线视频 | av小次郎收藏 | 国产三级精品三级男人的天堂 | 欧美日韩综合一区二区三区 | 国产精品人妻一区二区三区四 | 激情人妻另类人妻伦 | 欧美日韩一区二区三区自拍 | 天下第一社区视频www日本 | 天堂а√在线中文在线 | 性欧美疯狂xxxxbbbb | 激情内射亚州一区二区三区爱妻 | 300部国产真实乱 | 131美女爱做视频 | 国产区女主播在线观看 | 欧美老人巨大xxxx做受 | 性做久久久久久久免费看 | 国产精品18久久久久久麻辣 | 亚洲s码欧洲m码国产av | 国产激情无码一区二区app | 成人动漫在线观看 | 成人aaa片一区国产精品 | 无码人中文字幕 | 国产婷婷色一区二区三区在线 | 熟女俱乐部五十路六十路av | 无码人妻精品一区二区三区下载 | 亚洲日韩精品欧美一区二区 | 久久亚洲中文字幕无码 | 久久精品中文字幕一区 | 日本在线高清不卡免费播放 | 丰满人妻被黑人猛烈进入 | 亚洲色无码一区二区三区 | 精品国产av色一区二区深夜久久 | 宝宝好涨水快流出来免费视频 | 亚洲综合无码一区二区三区 | 无套内谢的新婚少妇国语播放 | 爽爽影院免费观看 | 成人av无码一区二区三区 | 国产婷婷色一区二区三区在线 | 51国偷自产一区二区三区 | 国产乱码精品一品二品 | 欧美 日韩 人妻 高清 中文 | 永久黄网站色视频免费直播 | 一区二区传媒有限公司 | 窝窝午夜理论片影院 | 一本久久a久久精品亚洲 | 又大又黄又粗又爽的免费视频 | 中国女人内谢69xxxx | 强开小婷嫩苞又嫩又紧视频 | 国产精品久久久久无码av色戒 | 性生交大片免费看l | 国产精品久久久久无码av色戒 | 日本一本二本三区免费 | 国产av久久久久精东av | 一本久久a久久精品vr综合 | 国产亚洲视频中文字幕97精品 | 国产精品久久久久久久9999 | 久久亚洲a片com人成 | 亚洲欧洲日本综合aⅴ在线 | 国产在线一区二区三区四区五区 | 国产成人无码av一区二区 | 日产国产精品亚洲系列 | 蜜臀aⅴ国产精品久久久国产老师 | 欧美三级不卡在线观看 | 乱中年女人伦av三区 | 女人被男人躁得好爽免费视频 | 女人被男人爽到呻吟的视频 | 欧美日韩在线亚洲综合国产人 | 国产猛烈高潮尖叫视频免费 | 欧美激情内射喷水高潮 | 国模大胆一区二区三区 | 久青草影院在线观看国产 | 内射白嫩少妇超碰 | 久久99精品国产麻豆蜜芽 | 国产人成高清在线视频99最全资源 | 在线播放无码字幕亚洲 | 无码人妻黑人中文字幕 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 日韩精品无码一区二区中文字幕 | 国产情侣作爱视频免费观看 | 欧美丰满熟妇xxxx性ppx人交 | 丝袜人妻一区二区三区 | 午夜精品一区二区三区在线观看 | 国产免费观看黄av片 | 久久综合激激的五月天 | 国产精品无码永久免费888 | 好男人www社区 | 亚洲爆乳无码专区 | 在线天堂新版最新版在线8 | 久久久久久亚洲精品a片成人 | 成年美女黄网站色大免费全看 | 日本www一道久久久免费榴莲 | 精品亚洲成av人在线观看 | 精品水蜜桃久久久久久久 | 少妇愉情理伦片bd | 人妻人人添人妻人人爱 | 久久久成人毛片无码 | 日产精品高潮呻吟av久久 | 熟女少妇人妻中文字幕 | 丰满妇女强制高潮18xxxx | 久久zyz资源站无码中文动漫 | 亚洲一区二区三区偷拍女厕 | 麻豆md0077饥渴少妇 | 奇米影视7777久久精品人人爽 | 大地资源中文第3页 | 久久精品国产99久久6动漫 | 国产香蕉尹人视频在线 | 性做久久久久久久久 | 国产三级精品三级男人的天堂 | 国产午夜无码精品免费看 | 精品日本一区二区三区在线观看 | 亚洲日韩av一区二区三区四区 | 帮老师解开蕾丝奶罩吸乳网站 | 色婷婷香蕉在线一区二区 | 天海翼激烈高潮到腰振不止 | 亚洲自偷自拍另类第1页 | 夜精品a片一区二区三区无码白浆 | 欧洲熟妇精品视频 | 中文字幕人成乱码熟女app | 西西人体www44rt大胆高清 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 无码乱肉视频免费大全合集 | 久久99久久99精品中文字幕 | 国产免费久久精品国产传媒 | 亚洲综合无码一区二区三区 | 久久国内精品自在自线 | 国产精品无套呻吟在线 | 欧美放荡的少妇 | 亚洲精品一区二区三区在线 | 色综合视频一区二区三区 | 狂野欧美激情性xxxx | 亚洲色大成网站www国产 | 欧美日韩久久久精品a片 | 久久久精品人妻久久影视 | 午夜熟女插插xx免费视频 | 色综合天天综合狠狠爱 | 东京一本一道一二三区 | 日韩av无码一区二区三区不卡 | 亚洲伊人久久精品影院 | 国产精品无套呻吟在线 | 亚洲熟妇自偷自拍另类 | 久久精品国产日本波多野结衣 | 亚洲gv猛男gv无码男同 | 成人试看120秒体验区 | 欧美激情内射喷水高潮 | 亚洲色欲色欲欲www在线 | 日本精品人妻无码免费大全 | 亚洲人成网站在线播放942 | 亚洲午夜无码久久 | 国产成人无码av在线影院 | 日日碰狠狠躁久久躁蜜桃 | 久久国产精品萌白酱免费 | 中文字幕av无码一区二区三区电影 | 精品欧洲av无码一区二区三区 | 在线 国产 欧美 亚洲 天堂 | 国产亲子乱弄免费视频 | 无码人妻精品一区二区三区下载 | 西西人体www44rt大胆高清 | 欧洲美熟女乱又伦 | 无码人妻精品一区二区三区下载 | 亚洲国产高清在线观看视频 | 欧美性生交xxxxx久久久 | 曰韩少妇内射免费播放 | 巨爆乳无码视频在线观看 | 国产成人无码区免费内射一片色欲 | 亚洲人成影院在线无码按摩店 | 无码人妻丰满熟妇区五十路百度 | 亚洲人成网站免费播放 | 性欧美疯狂xxxxbbbb | 久久国产36精品色熟妇 | 国产亚洲人成在线播放 | 成人无码影片精品久久久 | 性色欲网站人妻丰满中文久久不卡 | 精品人妻中文字幕有码在线 | 草草网站影院白丝内射 | 国产99久久精品一区二区 | 国产精品无码成人午夜电影 | 老熟女乱子伦 | 在线亚洲高清揄拍自拍一品区 | 人妻插b视频一区二区三区 | 国产午夜无码视频在线观看 | 无码中文字幕色专区 | 国产精品久久国产三级国 | 欧美刺激性大交 | 少妇无码一区二区二三区 | 性生交片免费无码看人 | 牲欲强的熟妇农村老妇女 | 国产99久久精品一区二区 | 网友自拍区视频精品 | 熟女少妇在线视频播放 | 欧美黑人乱大交 | 日韩成人一区二区三区在线观看 | 99视频精品全部免费免费观看 | aⅴ亚洲 日韩 色 图网站 播放 | 成人欧美一区二区三区黑人 | 免费国产黄网站在线观看 | 亚洲人成人无码网www国产 | 久久综合色之久久综合 | 色一情一乱一伦一视频免费看 | 国产av一区二区精品久久凹凸 | 久久99精品久久久久久动态图 | 无码国内精品人妻少妇 | 日韩av无码一区二区三区不卡 | 国产色视频一区二区三区 | 无码精品人妻一区二区三区av | 影音先锋中文字幕无码 | 欧美日韩亚洲国产精品 | 国产精品久久久久7777 | 亚洲国产欧美在线成人 | 人人妻人人藻人人爽欧美一区 | 人妻少妇精品久久 | 国产农村妇女高潮大叫 | 色一情一乱一伦一视频免费看 | 玩弄人妻少妇500系列视频 | 大胆欧美熟妇xx | 国产av一区二区精品久久凹凸 | 国产精品亚洲一区二区三区喷水 | 女人和拘做爰正片视频 | 久久亚洲精品成人无码 | 两性色午夜免费视频 | 荫蒂被男人添的好舒服爽免费视频 | 国产乱人伦av在线无码 | 亚洲精品欧美二区三区中文字幕 | 无码任你躁久久久久久久 | 人人爽人人澡人人人妻 | 国产精品自产拍在线观看 | 波多野结衣乳巨码无在线观看 | 丰满护士巨好爽好大乳 | 亚洲国产精品无码一区二区三区 | 国语自产偷拍精品视频偷 | 人妻少妇精品久久 | 国产精品亚洲五月天高清 | 综合激情五月综合激情五月激情1 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲熟熟妇xxxx | 欧美一区二区三区视频在线观看 | 午夜精品一区二区三区的区别 | 国内少妇偷人精品视频免费 | 精品国产精品久久一区免费式 | 久久久久久国产精品无码下载 | 99久久婷婷国产综合精品青草免费 | 国产精品无码久久av | 两性色午夜视频免费播放 | 久久综合九色综合97网 | 国产无遮挡吃胸膜奶免费看 | 欧美成人家庭影院 | 丰满诱人的人妻3 | 人妻互换免费中文字幕 | 日本爽爽爽爽爽爽在线观看免 | 亚洲午夜福利在线观看 | 一本色道婷婷久久欧美 | 一本久久伊人热热精品中文字幕 | 强辱丰满人妻hd中文字幕 | 精品国产一区二区三区四区在线看 | 又粗又大又硬又长又爽 | 中文精品久久久久人妻不卡 | 欧美成人高清在线播放 | 鲁鲁鲁爽爽爽在线视频观看 | 天海翼激烈高潮到腰振不止 | 国产精品亚洲专区无码不卡 | 国产精品久久久久久亚洲影视内衣 | 久久久国产精品无码免费专区 | 中文字幕乱码中文乱码51精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 福利一区二区三区视频在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧美精品在线观看 | 成人欧美一区二区三区 | 亚洲欧洲中文日韩av乱码 | 久久www免费人成人片 | 亚洲色在线无码国产精品不卡 | 性欧美疯狂xxxxbbbb | 久久综合给久久狠狠97色 | 欧美丰满少妇xxxx性 | 一二三四社区在线中文视频 | 蜜桃av抽搐高潮一区二区 | 亚洲人亚洲人成电影网站色 | 国产午夜无码视频在线观看 | 99久久人妻精品免费一区 | 日韩精品无码一区二区中文字幕 | 扒开双腿吃奶呻吟做受视频 | 熟妇激情内射com | 国产成人无码av一区二区 | 国语自产偷拍精品视频偷 | 国产乡下妇女做爰 | 亚洲人成网站在线播放942 | 欧美精品一区二区精品久久 | 精品人妻人人做人人爽夜夜爽 | 亚洲日本一区二区三区在线 | 一二三四社区在线中文视频 | 欧美 日韩 亚洲 在线 | 丰满人妻翻云覆雨呻吟视频 | 久激情内射婷内射蜜桃人妖 | 国产乱码精品一品二品 | 久久久精品人妻久久影视 | 午夜精品久久久内射近拍高清 | 欧美精品在线观看 | 午夜丰满少妇性开放视频 | 久久久成人毛片无码 | 色婷婷av一区二区三区之红樱桃 | 爱做久久久久久 | 少妇无套内谢久久久久 | 日本一区二区更新不卡 | 色噜噜亚洲男人的天堂 | 97精品人妻一区二区三区香蕉 | 色欲久久久天天天综合网精品 | 好屌草这里只有精品 | 久久久精品456亚洲影院 | 国产超碰人人爽人人做人人添 | 无码一区二区三区在线 | 在线观看免费人成视频 | 欧美真人作爱免费视频 | 亚洲国产欧美日韩精品一区二区三区 | 狠狠噜狠狠狠狠丁香五月 | 少妇高潮一区二区三区99 | 欧美乱妇无乱码大黄a片 | 无码国产激情在线观看 | 性欧美牲交xxxxx视频 | 给我免费的视频在线观看 | 野狼第一精品社区 | 精品亚洲成av人在线观看 | 无套内谢老熟女 | 日韩精品无码免费一区二区三区 | 国产精品欧美成人 | 国内精品人妻无码久久久影院蜜桃 | 国产舌乚八伦偷品w中 | 青青青手机频在线观看 | 久久zyz资源站无码中文动漫 | 国产av久久久久精东av | 熟妇人妻无码xxx视频 | 人妻与老人中文字幕 | 日韩人妻系列无码专区 | 欧美丰满熟妇xxxx性ppx人交 | 国产高清av在线播放 | 中文字幕无码日韩欧毛 | 亚洲人成网站色7799 | 久久人人97超碰a片精品 | 亚洲成在人网站无码天堂 | 丰满妇女强制高潮18xxxx | 无码国产乱人伦偷精品视频 | 国产艳妇av在线观看果冻传媒 | 亚洲中文字幕在线无码一区二区 | 国产精品无码mv在线观看 | 中文字幕色婷婷在线视频 | 亚洲精品鲁一鲁一区二区三区 | 西西人体www44rt大胆高清 | 国产精品人人爽人人做我的可爱 | 久久久国产精品无码免费专区 | 国产一区二区三区精品视频 | а天堂中文在线官网 | 狠狠色色综合网站 | 久久精品人人做人人综合试看 | 兔费看少妇性l交大片免费 | 久久人人爽人人人人片 | 丝袜足控一区二区三区 | 欧美性猛交xxxx富婆 | 性欧美熟妇videofreesex | 精品水蜜桃久久久久久久 | 少妇无套内谢久久久久 | 巨爆乳无码视频在线观看 | 国产做国产爱免费视频 | 精品久久久久久人妻无码中文字幕 | 日本一区二区三区免费播放 | 国产区女主播在线观看 | 国产黄在线观看免费观看不卡 | 女人被爽到呻吟gif动态图视看 | 国产xxx69麻豆国语对白 | 久久熟妇人妻午夜寂寞影院 | 中文字幕 人妻熟女 | 欧美乱妇无乱码大黄a片 | a在线亚洲男人的天堂 | 成人欧美一区二区三区 | 亚洲の无码国产の无码影院 | 最近的中文字幕在线看视频 | 中文字幕中文有码在线 | 风流少妇按摩来高潮 | 欧洲极品少妇 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲乱码国产乱码精品精 | 中文字幕乱码人妻无码久久 | 国内精品一区二区三区不卡 | 少妇厨房愉情理9仑片视频 | 特级做a爰片毛片免费69 | 久久aⅴ免费观看 | 女人被男人爽到呻吟的视频 | 亚洲国产精品一区二区美利坚 | 中文字幕av无码一区二区三区电影 | 精品少妇爆乳无码av无码专区 | 又粗又大又硬又长又爽 | 亚洲一区二区三区国产精华液 | 乱人伦人妻中文字幕无码 | 国产精品久久国产三级国 | 成人一在线视频日韩国产 | 国产人妻精品一区二区三区不卡 | 无遮挡国产高潮视频免费观看 | 熟妇女人妻丰满少妇中文字幕 | 麻豆国产97在线 | 欧洲 | 亚洲色大成网站www国产 | 夜夜影院未满十八勿进 | 免费无码av一区二区 | 久久99精品国产.久久久久 | 爱做久久久久久 | 国产精品久久久久久无码 | 婷婷五月综合缴情在线视频 | 国产人妻大战黑人第1集 | 国产精品欧美成人 | 嫩b人妻精品一区二区三区 | 内射白嫩少妇超碰 | 欧美性猛交内射兽交老熟妇 | 国产成人人人97超碰超爽8 | 97se亚洲精品一区 | 国产精品鲁鲁鲁 | 男人和女人高潮免费网站 | 性色av无码免费一区二区三区 | 中文字幕无线码免费人妻 | 亚洲中文字幕无码中文字在线 | 红桃av一区二区三区在线无码av | 婷婷综合久久中文字幕蜜桃三电影 | 少妇性l交大片 | 自拍偷自拍亚洲精品被多人伦好爽 | 麻豆人妻少妇精品无码专区 | 国产成人综合在线女婷五月99播放 | 免费无码肉片在线观看 | 99久久精品日本一区二区免费 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 女人被男人爽到呻吟的视频 | 亚洲无人区午夜福利码高清完整版 | 正在播放东北夫妻内射 | 亚洲а∨天堂久久精品2021 | 国产亚洲精品久久久久久久 | 色综合久久88色综合天天 | 人人妻人人澡人人爽精品欧美 | 人人爽人人澡人人人妻 | 小sao货水好多真紧h无码视频 | 国产成人精品视频ⅴa片软件竹菊 | 色一情一乱一伦一视频免费看 | 欧美精品免费观看二区 | 夜先锋av资源网站 | 日韩欧美中文字幕公布 | 性生交片免费无码看人 | 在线欧美精品一区二区三区 | 国产午夜福利亚洲第一 | 久精品国产欧美亚洲色aⅴ大片 | 午夜丰满少妇性开放视频 | 欧美兽交xxxx×视频 | 亚洲aⅴ无码成人网站国产app | 免费网站看v片在线18禁无码 | aa片在线观看视频在线播放 | 久久人人爽人人爽人人片ⅴ | 性欧美熟妇videofreesex | 亚洲国产精品久久久久久 | 国产成人久久精品流白浆 | 2020最新国产自产精品 | 欧洲熟妇精品视频 | 国产精品久久国产精品99 | 亚洲爆乳精品无码一区二区三区 | 国产成人无码一二三区视频 | 天天躁夜夜躁狠狠是什么心态 | 88国产精品欧美一区二区三区 | 2019nv天堂香蕉在线观看 | 精品亚洲成av人在线观看 | 国产人成高清在线视频99最全资源 | 奇米影视7777久久精品人人爽 | 天堂а√在线中文在线 | 色诱久久久久综合网ywww | 任你躁国产自任一区二区三区 | 成人无码视频免费播放 | 成人精品一区二区三区中文字幕 | 人妻天天爽夜夜爽一区二区 | 久久aⅴ免费观看 | 欧美性生交xxxxx久久久 | 欧美人与牲动交xxxx | 九九综合va免费看 | 色五月丁香五月综合五月 | 成人女人看片免费视频放人 | 国产精品久久精品三级 | 国产亚洲欧美日韩亚洲中文色 | 成人片黄网站色大片免费观看 | 国产精品人人妻人人爽 | 国产精品人人妻人人爽 | 国产精品99久久精品爆乳 | 熟女俱乐部五十路六十路av | 国产黑色丝袜在线播放 | 亚洲а∨天堂久久精品2021 | 亚洲国产精品无码久久久久高潮 | 最近免费中文字幕中文高清百度 | 久久99精品久久久久久动态图 | 久久无码专区国产精品s | 人妻中文无码久热丝袜 | 久久精品99久久香蕉国产色戒 | 欧美国产亚洲日韩在线二区 | 色一情一乱一伦一视频免费看 | 强辱丰满人妻hd中文字幕 | 大乳丰满人妻中文字幕日本 | 国产成人亚洲综合无码 | 丁香花在线影院观看在线播放 | 国内精品久久久久久中文字幕 | 亚洲人成人无码网www国产 | 国精品人妻无码一区二区三区蜜柚 | 在教室伦流澡到高潮hnp视频 | 久久精品国产99精品亚洲 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 少妇高潮一区二区三区99 | 国产色xx群视频射精 | 亚洲一区二区三区播放 |