3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    国产成人av免费观看 | 国产精华av午夜在线观看 | 无码毛片视频一区二区本码 | 日韩人妻无码中文字幕视频 | 日本一区二区三区免费播放 | 国产精品毛片一区二区 | 九月婷婷人人澡人人添人人爽 | 又大又黄又粗又爽的免费视频 | 亚洲 另类 在线 欧美 制服 | 国产无遮挡又黄又爽又色 | 亚洲成在人网站无码天堂 | 国产美女精品一区二区三区 | 久久久精品456亚洲影院 | 少妇人妻偷人精品无码视频 | 日本精品少妇一区二区三区 | 亚洲成a人片在线观看无码3d | 一本色道久久综合亚洲精品不卡 | 一本精品99久久精品77 | 欧美精品免费观看二区 | 在线视频网站www色 | 日本精品人妻无码免费大全 | 丰满少妇女裸体bbw | 久久亚洲中文字幕精品一区 | 又大又黄又粗又爽的免费视频 | 亚洲人成人无码网www国产 | 亚洲人交乣女bbw | 精品夜夜澡人妻无码av蜜桃 | 亚洲欧美日韩成人高清在线一区 | 免费看男女做好爽好硬视频 | 亚洲国产成人av在线观看 | 精品一区二区三区无码免费视频 | 中文无码精品a∨在线观看不卡 | 色婷婷久久一区二区三区麻豆 | 最新国产乱人伦偷精品免费网站 | 131美女爱做视频 | 亲嘴扒胸摸屁股激烈网站 | 色综合久久中文娱乐网 | 99久久精品无码一区二区毛片 | 乌克兰少妇xxxx做受 | 日本精品人妻无码免费大全 | 亚洲大尺度无码无码专区 | 无码吃奶揉捏奶头高潮视频 | 少妇无套内谢久久久久 | 日韩人妻少妇一区二区三区 | 国内少妇偷人精品视频 | 无码纯肉视频在线观看 | 粗大的内捧猛烈进出视频 | 天天拍夜夜添久久精品大 | 国产午夜无码视频在线观看 | 欧美亚洲日韩国产人成在线播放 | 久久久久久av无码免费看大片 | 性色欲情网站iwww九文堂 | 日本精品久久久久中文字幕 | 精品国偷自产在线 | 国产偷抇久久精品a片69 | 亚洲国产精品一区二区美利坚 | 激情内射日本一区二区三区 | 亚洲精品中文字幕久久久久 | 日欧一片内射va在线影院 | 亚洲色偷偷男人的天堂 | 亚洲中文字幕va福利 | 国产一精品一av一免费 | 日韩av无码中文无码电影 | 麻豆人妻少妇精品无码专区 | 一本久道高清无码视频 | 国产尤物精品视频 | 啦啦啦www在线观看免费视频 | 国产精品久久久久9999小说 | 久久久久久国产精品无码下载 | 东京热一精品无码av | 久久综合狠狠综合久久综合88 | 乱码午夜-极国产极内射 | 国产精品高潮呻吟av久久 | 亚洲大尺度无码无码专区 | 亚洲日本在线电影 | 亚洲国产高清在线观看视频 | 久久国语露脸国产精品电影 | 国产精品久久国产三级国 | 亚洲经典千人经典日产 | 国内综合精品午夜久久资源 | 久久久国产一区二区三区 | 超碰97人人做人人爱少妇 | 亚洲综合精品香蕉久久网 | 在线看片无码永久免费视频 | 亚洲色成人中文字幕网站 | 亚洲精品久久久久avwww潮水 | 东京一本一道一二三区 | 亚洲国产精品一区二区美利坚 | 天堂а√在线地址中文在线 | 高清国产亚洲精品自在久久 | 久久久国产精品无码免费专区 | 天天拍夜夜添久久精品大 | 日本乱人伦片中文三区 | 欧美第一黄网免费网站 | 最近的中文字幕在线看视频 | 美女扒开屁股让男人桶 | 日本大香伊一区二区三区 | 欧美日本精品一区二区三区 | 欧洲欧美人成视频在线 | 精品夜夜澡人妻无码av蜜桃 | 亚洲中文无码av永久不收费 | 国产精品18久久久久久麻辣 | 婷婷丁香五月天综合东京热 | 欧美怡红院免费全部视频 | 精品水蜜桃久久久久久久 | 亚洲狠狠色丁香婷婷综合 | 精品久久久无码人妻字幂 | 国产亲子乱弄免费视频 | 在线а√天堂中文官网 | 偷窥日本少妇撒尿chinese | 国产午夜福利100集发布 | 国产精品无码一区二区桃花视频 | 欧美人与牲动交xxxx | 国产激情艳情在线看视频 | 久久国产精品偷任你爽任你 | 亚洲日韩一区二区 | 人妻体内射精一区二区三四 | 久久久久人妻一区精品色欧美 | 亚洲欧美日韩国产精品一区二区 | 国产三级精品三级男人的天堂 | 午夜精品久久久久久久 | 午夜精品一区二区三区在线观看 | 在线播放免费人成毛片乱码 | 在线天堂新版最新版在线8 | 久久国产自偷自偷免费一区调 | 欧美xxxx黑人又粗又长 | 白嫩日本少妇做爰 | 天天av天天av天天透 | 国产亚洲欧美日韩亚洲中文色 | 漂亮人妻洗澡被公强 日日躁 | 牲欲强的熟妇农村老妇女视频 | 久久精品人人做人人综合 | 无码成人精品区在线观看 | 水蜜桃亚洲一二三四在线 | 天海翼激烈高潮到腰振不止 | 国产成人精品必看 | 欧美大屁股xxxxhd黑色 | 日韩精品一区二区av在线 | 亚洲男女内射在线播放 | 荫蒂被男人添的好舒服爽免费视频 | 无码av最新清无码专区吞精 | 亚洲国产精品久久久天堂 | 波多野结衣高清一区二区三区 | 国产农村妇女高潮大叫 | 精品无人区无码乱码毛片国产 | 婷婷五月综合激情中文字幕 | 欧美一区二区三区 | 国产午夜无码视频在线观看 | 欧美激情综合亚洲一二区 | 成人三级无码视频在线观看 | 午夜嘿嘿嘿影院 | 日韩欧美群交p片內射中文 | 又粗又大又硬又长又爽 | 老熟妇乱子伦牲交视频 | 国产超碰人人爽人人做人人添 | 国产精品高潮呻吟av久久4虎 | 国产亚洲精品精品国产亚洲综合 | 天堂亚洲2017在线观看 | 国产香蕉97碰碰久久人人 | 久久久久人妻一区精品色欧美 | 亚洲理论电影在线观看 | 国产精品99爱免费视频 | 亚洲乱码中文字幕在线 | 久久久国产一区二区三区 | 一个人看的视频www在线 | 人人超人人超碰超国产 | 久久伊人色av天堂九九小黄鸭 | 蜜臀aⅴ国产精品久久久国产老师 | 人妻有码中文字幕在线 | 欧美大屁股xxxxhd黑色 | 亚洲精品一区二区三区四区五区 | 大色综合色综合网站 | 狂野欧美性猛xxxx乱大交 | 98国产精品综合一区二区三区 | 99久久99久久免费精品蜜桃 | 国产精品亚洲专区无码不卡 | 欧美老妇与禽交 | 丰满少妇熟乱xxxxx视频 | 日韩成人一区二区三区在线观看 | 人妻少妇精品视频专区 | 久久精品国产99精品亚洲 | 精品人妻av区 | 久久人人爽人人爽人人片av高清 | 国产熟妇高潮叫床视频播放 | 国产一区二区三区日韩精品 | 国产尤物精品视频 | 中文精品无码中文字幕无码专区 | 亚洲色在线无码国产精品不卡 | 日日摸夜夜摸狠狠摸婷婷 | 婷婷色婷婷开心五月四房播播 | 女人被爽到呻吟gif动态图视看 | 97无码免费人妻超级碰碰夜夜 | 国产精品自产拍在线观看 | 东北女人啪啪对白 | 国产精品怡红院永久免费 | 大地资源网第二页免费观看 | 亚洲国产欧美日韩精品一区二区三区 | 欧美精品一区二区精品久久 | 国产舌乚八伦偷品w中 | 亚洲狠狠色丁香婷婷综合 | 精品水蜜桃久久久久久久 | 最近免费中文字幕中文高清百度 | 免费观看的无遮挡av | 成人精品视频一区二区三区尤物 | 亚洲综合精品香蕉久久网 | 欧美阿v高清资源不卡在线播放 | 午夜熟女插插xx免费视频 | 亚洲中文字幕乱码av波多ji | 亚洲熟妇色xxxxx欧美老妇y | 久久精品国产一区二区三区肥胖 | 亚洲精品国产精品乱码不卡 | 免费人成网站视频在线观看 | 东京热无码av男人的天堂 | 欧美日韩一区二区三区自拍 | 国产人妻人伦精品1国产丝袜 | 成年美女黄网站色大免费视频 | 奇米影视7777久久精品人人爽 | 亚洲午夜福利在线观看 | 麻豆精品国产精华精华液好用吗 | 国产精华av午夜在线观看 | 兔费看少妇性l交大片免费 | 夜夜影院未满十八勿进 | 欧美怡红院免费全部视频 | 国产亚av手机在线观看 | 一本久久a久久精品亚洲 | 一本久久伊人热热精品中文字幕 | 国产av久久久久精东av | 亚洲国产日韩a在线播放 | 巨爆乳无码视频在线观看 | 国内精品人妻无码久久久影院 | 精品无码国产一区二区三区av | 色欲综合久久中文字幕网 | 乱中年女人伦av三区 | 初尝人妻少妇中文字幕 | 国产精品亚洲五月天高清 | 成人无码视频在线观看网站 | 日韩精品无码免费一区二区三区 | 精品少妇爆乳无码av无码专区 | aⅴ亚洲 日韩 色 图网站 播放 | 国产色精品久久人妻 | √天堂资源地址中文在线 | 国产无遮挡又黄又爽免费视频 | 国产精品亚洲一区二区三区喷水 | 中文字幕av伊人av无码av | 国产精品嫩草久久久久 | 久久国产精品精品国产色婷婷 | 欧美熟妇另类久久久久久不卡 | 无码国内精品人妻少妇 | 欧美成人免费全部网站 | 麻豆成人精品国产免费 | 成人性做爰aaa片免费看不忠 | 青青草原综合久久大伊人精品 | 欧洲熟妇色 欧美 | 国产熟女一区二区三区四区五区 | 成 人 网 站国产免费观看 | 亚洲乱码日产精品bd | 精品无码一区二区三区爱欲 | 一本色道久久综合狠狠躁 | 亚洲乱亚洲乱妇50p | 在线播放免费人成毛片乱码 | 国产suv精品一区二区五 | 日本护士毛茸茸高潮 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 久久久久免费看成人影片 | 国产手机在线αⅴ片无码观看 | 一个人免费观看的www视频 | 男女下面进入的视频免费午夜 | 国色天香社区在线视频 | 久久99精品久久久久婷婷 | 麻豆国产人妻欲求不满 | 影音先锋中文字幕无码 | 国产午夜无码视频在线观看 | 樱花草在线播放免费中文 | 久久人人爽人人爽人人片ⅴ | 女高中生第一次破苞av | 亚洲成a人片在线观看无码 | 学生妹亚洲一区二区 | 久久久久免费看成人影片 | 亚洲人亚洲人成电影网站色 | 日韩在线不卡免费视频一区 | 人人妻人人澡人人爽精品欧美 | 亚洲精品鲁一鲁一区二区三区 | 中国女人内谢69xxxxxa片 | 日日碰狠狠躁久久躁蜜桃 | 成人欧美一区二区三区黑人免费 | 天天摸天天碰天天添 | 国产无遮挡吃胸膜奶免费看 | 激情五月综合色婷婷一区二区 | 日本大香伊一区二区三区 | 久久人人爽人人爽人人片ⅴ | 无码国模国产在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲欧美综合区丁香五月小说 | 国产精品亚洲lv粉色 | 青草视频在线播放 | 午夜精品久久久久久久久 | 日韩精品一区二区av在线 | 一区二区三区高清视频一 | 欧美黑人巨大xxxxx | 131美女爱做视频 | 国产超碰人人爽人人做人人添 | 人妻无码αv中文字幕久久琪琪布 | 97久久精品无码一区二区 | 亚洲 高清 成人 动漫 | 丁香花在线影院观看在线播放 | 亚洲日本在线电影 | 中文字幕人成乱码熟女app | 久久久久久九九精品久 | 国产综合在线观看 | 成人性做爰aaa片免费看 | 任你躁国产自任一区二区三区 | 人妻中文无码久热丝袜 | 九九在线中文字幕无码 | 人人妻人人藻人人爽欧美一区 | 日本熟妇乱子伦xxxx | 两性色午夜免费视频 | 国产精品人妻一区二区三区四 | 亚洲日本va午夜在线电影 | 亚洲一区二区三区播放 | 天天av天天av天天透 | 精品国产一区二区三区四区 | 清纯唯美经典一区二区 | 欧美zoozzooz性欧美 | 亚洲熟妇色xxxxx欧美老妇y | 久久久久久久久888 | 亚洲成a人片在线观看无码3d | 久久成人a毛片免费观看网站 | 亚洲啪av永久无码精品放毛片 | √天堂中文官网8在线 | 国产两女互慰高潮视频在线观看 | 日产国产精品亚洲系列 | 国产精品美女久久久久av爽李琼 | 牲欲强的熟妇农村老妇女 | 波多野结衣一区二区三区av免费 | 牲交欧美兽交欧美 | 久久97精品久久久久久久不卡 | 天堂无码人妻精品一区二区三区 | 无码av免费一区二区三区试看 | 无码一区二区三区在线 | 性色欲网站人妻丰满中文久久不卡 | 精品欧洲av无码一区二区三区 | 成人毛片一区二区 | 久9re热视频这里只有精品 | 亚洲综合精品香蕉久久网 | 强辱丰满人妻hd中文字幕 | 中文字幕 亚洲精品 第1页 | 性欧美牲交在线视频 | 欧美丰满老熟妇xxxxx性 | 2019nv天堂香蕉在线观看 | 精品成人av一区二区三区 | 97精品人妻一区二区三区香蕉 | 久久久久亚洲精品中文字幕 | 一个人看的www免费视频在线观看 | 亚洲阿v天堂在线 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 人妻有码中文字幕在线 | 亚洲日韩av一区二区三区四区 | 熟女少妇在线视频播放 | 国产精品久久久久久久影院 | 久久99精品久久久久久 | 双乳奶水饱满少妇呻吟 | 国产色精品久久人妻 | 狠狠色色综合网站 | 福利一区二区三区视频在线观看 | 人人爽人人澡人人人妻 | 日日麻批免费40分钟无码 | 亚洲精品无码国产 | 国产乱人伦av在线无码 | 无人区乱码一区二区三区 | 欧美乱妇无乱码大黄a片 | 亚洲一区二区三区无码久久 | 成 人影片 免费观看 | 国产精品高潮呻吟av久久4虎 | 美女毛片一区二区三区四区 | 午夜性刺激在线视频免费 | 永久黄网站色视频免费直播 | 2020久久超碰国产精品最新 | 国产亚洲精品久久久闺蜜 | 天天av天天av天天透 | 伊人久久大香线焦av综合影院 | 超碰97人人射妻 | 国产精品福利视频导航 | 国产在线精品一区二区三区直播 | 中文字幕精品av一区二区五区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产精品美女久久久 | 一本久久a久久精品vr综合 | 亚洲色大成网站www国产 | 日韩精品成人一区二区三区 | 国产97人人超碰caoprom | 亚洲男人av天堂午夜在 | 曰韩无码二三区中文字幕 | 亚洲一区二区三区偷拍女厕 | 精品夜夜澡人妻无码av蜜桃 | 亚洲精品一区二区三区在线 | 人人妻人人藻人人爽欧美一区 | 美女毛片一区二区三区四区 | 精品久久久久久亚洲精品 | 国产精品久久久av久久久 | 扒开双腿吃奶呻吟做受视频 | 精品无码一区二区三区的天堂 | a片在线免费观看 | 牲欲强的熟妇农村老妇女视频 | 美女黄网站人色视频免费国产 | 国产人成高清在线视频99最全资源 | 亚洲精品国产a久久久久久 | 偷窥日本少妇撒尿chinese | 国产卡一卡二卡三 | 人人妻人人澡人人爽人人精品浪潮 | 久久97精品久久久久久久不卡 | 国产无遮挡又黄又爽免费视频 | √8天堂资源地址中文在线 | 人人妻人人澡人人爽人人精品 | 国产美女精品一区二区三区 | 三上悠亚人妻中文字幕在线 | 性色欲网站人妻丰满中文久久不卡 | 国产精品久久久 | 亚洲经典千人经典日产 | 熟女体下毛毛黑森林 | 波多野结衣一区二区三区av免费 | 亚洲国产欧美国产综合一区 | 日本精品少妇一区二区三区 | 亚洲色偷偷偷综合网 | 亚洲精品成人av在线 | 色诱久久久久综合网ywww | 久久视频在线观看精品 | 无码国模国产在线观看 | 蜜臀aⅴ国产精品久久久国产老师 | 久久精品国产一区二区三区肥胖 | 欧美 日韩 人妻 高清 中文 | 国产精品国产三级国产专播 | 国产在线精品一区二区三区直播 | 国产高潮视频在线观看 | 精品国产一区二区三区四区在线看 | 偷窥日本少妇撒尿chinese | 免费无码的av片在线观看 | av在线亚洲欧洲日产一区二区 | 精品无码一区二区三区的天堂 | 麻豆国产人妻欲求不满 | 熟妇女人妻丰满少妇中文字幕 | 1000部啪啪未满十八勿入下载 | 久久亚洲a片com人成 | 国产特级毛片aaaaaa高潮流水 | 国产特级毛片aaaaaaa高清 | 麻豆国产丝袜白领秘书在线观看 | 内射爽无广熟女亚洲 | 暴力强奷在线播放无码 | 久久久精品456亚洲影院 | 欧美高清在线精品一区 | 久久精品国产一区二区三区 | 男女下面进入的视频免费午夜 | 中文字幕无码免费久久9一区9 | 国产精品手机免费 | 免费观看激色视频网站 | 美女黄网站人色视频免费国产 | 色综合久久久久综合一本到桃花网 | 精品厕所偷拍各类美女tp嘘嘘 | 欧洲精品码一区二区三区免费看 | 亚洲人成影院在线观看 | 欧美丰满熟妇xxxx | 成人三级无码视频在线观看 | 免费人成在线观看网站 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲日韩乱码中文无码蜜桃臀网站 | 午夜精品久久久内射近拍高清 | 野外少妇愉情中文字幕 | 亚洲日本在线电影 | 人妻体内射精一区二区三四 | 爆乳一区二区三区无码 | 色爱情人网站 | 亚洲人交乣女bbw | 免费乱码人妻系列无码专区 | 无码人妻精品一区二区三区下载 | 中文字幕日韩精品一区二区三区 | 中文精品无码中文字幕无码专区 | 无码福利日韩神码福利片 | 色综合久久88色综合天天 | 国产精品对白交换视频 | 丰满少妇熟乱xxxxx视频 | 中文字幕人成乱码熟女app | 久久99国产综合精品 | 无码任你躁久久久久久久 | 久久久婷婷五月亚洲97号色 | 亚洲日韩av一区二区三区四区 | 日产国产精品亚洲系列 | 99久久精品无码一区二区毛片 | 在线亚洲高清揄拍自拍一品区 | 日韩欧美群交p片內射中文 | 日韩成人一区二区三区在线观看 | 无码帝国www无码专区色综合 | 99国产精品白浆在线观看免费 | 国产综合在线观看 | 亚洲综合精品香蕉久久网 | 精品无码一区二区三区的天堂 | 娇妻被黑人粗大高潮白浆 | 97精品人妻一区二区三区香蕉 | 久久精品无码一区二区三区 | 在线成人www免费观看视频 | 成 人影片 免费观看 | 日本熟妇人妻xxxxx人hd | 亚洲成色在线综合网站 | 国产女主播喷水视频在线观看 | 日日天日日夜日日摸 | 久久精品国产一区二区三区肥胖 | 国产亚洲精品久久久久久久久动漫 | 我要看www免费看插插视频 | 久久亚洲中文字幕无码 | 55夜色66夜色国产精品视频 | 欧美成人午夜精品久久久 | 青青久在线视频免费观看 | 亚洲精品欧美二区三区中文字幕 | 精品人妻av区 | 激情亚洲一区国产精品 | а天堂中文在线官网 | 免费网站看v片在线18禁无码 | 国产精品毛片一区二区 | 国产成人精品三级麻豆 | 国内揄拍国内精品人妻 | 99久久人妻精品免费二区 | 亚洲第一无码av无码专区 | 久精品国产欧美亚洲色aⅴ大片 | 欧美成人午夜精品久久久 | 欧美黑人性暴力猛交喷水 | 曰韩无码二三区中文字幕 | 国产一区二区三区精品视频 | 国产精品无码成人午夜电影 | 老太婆性杂交欧美肥老太 | 色噜噜亚洲男人的天堂 | 国产乱人无码伦av在线a | 国产艳妇av在线观看果冻传媒 | 乱人伦人妻中文字幕无码久久网 | 麻花豆传媒剧国产免费mv在线 | 久久久久久久人妻无码中文字幕爆 | 亚洲日韩中文字幕在线播放 | 欧美人与动性行为视频 | 精品成在人线av无码免费看 | v一区无码内射国产 | 女人被爽到呻吟gif动态图视看 | 18无码粉嫩小泬无套在线观看 | 在线播放亚洲第一字幕 | 亚洲精品国产第一综合99久久 | 精品久久久中文字幕人妻 | 欧美 日韩 亚洲 在线 | 四十如虎的丰满熟妇啪啪 | 熟妇人妻无码xxx视频 | av在线亚洲欧洲日产一区二区 | 一区二区三区乱码在线 | 欧洲 | 啦啦啦www在线观看免费视频 | 亚无码乱人伦一区二区 | 精品国产一区二区三区四区 | 久久国语露脸国产精品电影 | 色噜噜亚洲男人的天堂 | 丁香啪啪综合成人亚洲 | 九月婷婷人人澡人人添人人爽 | 亚洲国产精品毛片av不卡在线 | 中文无码成人免费视频在线观看 | 日韩人妻无码一区二区三区久久99 | 免费人成网站视频在线观看 | 午夜成人1000部免费视频 | 国产成人综合在线女婷五月99播放 | 兔费看少妇性l交大片免费 | 俺去俺来也www色官网 | 红桃av一区二区三区在线无码av | 欧美日本精品一区二区三区 | 亚洲欧美综合区丁香五月小说 | 亚洲色在线无码国产精品不卡 | 国产人妻大战黑人第1集 | 日本在线高清不卡免费播放 | 国产无遮挡吃胸膜奶免费看 | 99国产精品白浆在线观看免费 | 日本欧美一区二区三区乱码 | 亚洲精品久久久久久久久久久 | 天天躁夜夜躁狠狠是什么心态 | 久久伊人色av天堂九九小黄鸭 | 亚洲熟妇自偷自拍另类 | 欧美日韩视频无码一区二区三 | 亚洲国产精品无码一区二区三区 | 久久精品无码一区二区三区 | 天堂亚洲免费视频 | 中文字幕无码免费久久99 | 色偷偷人人澡人人爽人人模 | 99精品国产综合久久久久五月天 | 精品熟女少妇av免费观看 | 久久久久久亚洲精品a片成人 | 2020久久香蕉国产线看观看 | 人人爽人人澡人人人妻 | 国产精品久久福利网站 | av香港经典三级级 在线 | 国产精品自产拍在线观看 | 无套内谢的新婚少妇国语播放 | 狠狠色噜噜狠狠狠7777奇米 | 精品成人av一区二区三区 | 色综合久久久久综合一本到桃花网 | 久久久国产精品无码免费专区 | 水蜜桃色314在线观看 | 亚洲の无码国产の无码影院 | 久久亚洲中文字幕精品一区 | 久久精品99久久香蕉国产色戒 | 在线a亚洲视频播放在线观看 | 性色欲网站人妻丰满中文久久不卡 | 欧美激情内射喷水高潮 | 伊人久久大香线蕉亚洲 | 伊人久久大香线蕉亚洲 | 性欧美大战久久久久久久 | 特黄特色大片免费播放器图片 | 精品熟女少妇av免费观看 | 国产熟妇高潮叫床视频播放 | 国产日产欧产精品精品app | 性生交大片免费看l | 日韩无码专区 | 色五月五月丁香亚洲综合网 | 99国产欧美久久久精品 | 无码任你躁久久久久久久 | 亚洲の无码国产の无码步美 | 久久人人爽人人人人片 | 无码人妻黑人中文字幕 | 日韩精品乱码av一区二区 | 99久久久国产精品无码免费 | 精品无码av一区二区三区 | 无码国产色欲xxxxx视频 | 又湿又紧又大又爽a视频国产 | 免费乱码人妻系列无码专区 | 鲁大师影院在线观看 | 一本无码人妻在中文字幕免费 | 成人无码视频免费播放 | 99久久久无码国产精品免费 | 中文无码精品a∨在线观看不卡 | 国产va免费精品观看 | 蜜桃视频插满18在线观看 | 无套内谢老熟女 | 久久精品国产日本波多野结衣 | 中文字幕人妻丝袜二区 | 女人和拘做爰正片视频 | 欧美阿v高清资源不卡在线播放 | 中文精品久久久久人妻不卡 | 精品国产青草久久久久福利 | 亚洲日韩一区二区三区 | 亚洲一区二区三区 | 日本一卡二卡不卡视频查询 | 男人和女人高潮免费网站 | 国产热a欧美热a在线视频 | 久久国产36精品色熟妇 | 丰满肥臀大屁股熟妇激情视频 | 亚洲综合无码久久精品综合 | 国产精品国产三级国产专播 | 精品亚洲成av人在线观看 | 国产精品丝袜黑色高跟鞋 | aⅴ在线视频男人的天堂 | 国产精品视频免费播放 | 久久久精品人妻久久影视 | 中文毛片无遮挡高清免费 | 性开放的女人aaa片 | 国内精品久久毛片一区二区 | 国产婷婷色一区二区三区在线 | 俺去俺来也www色官网 | 狂野欧美性猛xxxx乱大交 | 午夜精品久久久久久久 | 中文字幕亚洲情99在线 | 精品国产福利一区二区 | 欧美色就是色 | 国产精品a成v人在线播放 | 亚洲精品综合一区二区三区在线 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 成人欧美一区二区三区黑人免费 | 亚洲精品www久久久 | 国产人妖乱国产精品人妖 | 女人被男人爽到呻吟的视频 | 日韩av激情在线观看 | 亚洲色大成网站www | 久久久精品成人免费观看 | 中文字幕乱码人妻无码久久 | 亚洲午夜久久久影院 | 国产成人无码av片在线观看不卡 | 俺去俺来也www色官网 | 久久99热只有频精品8 | 亚洲精品午夜国产va久久成人 | 亚洲欧洲日本无在线码 | 精品久久久久香蕉网 | 国产两女互慰高潮视频在线观看 | 日本高清一区免费中文视频 | 国产美女极度色诱视频www | 少妇人妻大乳在线视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 大肉大捧一进一出视频出来呀 | 精品熟女少妇av免费观看 | 国产精品美女久久久久av爽李琼 | 成人无码精品1区2区3区免费看 | 色综合视频一区二区三区 | 一二三四社区在线中文视频 | 成人免费视频视频在线观看 免费 | 国产特级毛片aaaaaa高潮流水 | 欧美性生交活xxxxxdddd | 少妇久久久久久人妻无码 | 兔费看少妇性l交大片免费 | 美女极度色诱视频国产 | 国产av一区二区三区最新精品 | 亚洲一区二区三区无码久久 | 日韩精品无码一本二本三本色 | 色窝窝无码一区二区三区色欲 | 一区二区三区高清视频一 | 久久综合狠狠综合久久综合88 | 亚洲欧美国产精品久久 | 99精品视频在线观看免费 | 中文字幕无码视频专区 | 中文亚洲成a人片在线观看 | 在教室伦流澡到高潮hnp视频 | 高清国产亚洲精品自在久久 | 成人试看120秒体验区 | 欧美freesex黑人又粗又大 | 亚洲精品鲁一鲁一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 国产成人无码午夜视频在线观看 | 中文无码成人免费视频在线观看 | 国产精品.xx视频.xxtv | 国产亚洲欧美在线专区 | 4hu四虎永久在线观看 | 国产小呦泬泬99精品 | 麻豆国产人妻欲求不满 | 国产又爽又黄又刺激的视频 | 国产舌乚八伦偷品w中 | 扒开双腿吃奶呻吟做受视频 | 男女性色大片免费网站 | 丝袜 中出 制服 人妻 美腿 | 亚洲热妇无码av在线播放 | 亚洲精品中文字幕乱码 | 嫩b人妻精品一区二区三区 | 国产无遮挡又黄又爽又色 | 少妇高潮喷潮久久久影院 | 日韩 欧美 动漫 国产 制服 | 午夜嘿嘿嘿影院 | 亚洲一区二区三区国产精华液 | 5858s亚洲色大成网站www | 强奷人妻日本中文字幕 | 国产精品美女久久久久av爽李琼 | 99久久精品国产一区二区蜜芽 | 亚洲自偷精品视频自拍 | 日日麻批免费40分钟无码 | 亚洲成av人影院在线观看 | 少女韩国电视剧在线观看完整 | 中文字幕人成乱码熟女app | 国产午夜亚洲精品不卡 | 精品少妇爆乳无码av无码专区 | 牲欲强的熟妇农村老妇女视频 | 国语精品一区二区三区 | 国产成人一区二区三区在线观看 | 国产乱人偷精品人妻a片 | 漂亮人妻洗澡被公强 日日躁 | 亚无码乱人伦一区二区 | 色欲综合久久中文字幕网 | 亚洲国产日韩a在线播放 | 麻豆精品国产精华精华液好用吗 | 成人动漫在线观看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产国产精品人在线视 | 麻豆精品国产精华精华液好用吗 | 精品无码一区二区三区爱欲 | а天堂中文在线官网 | 亚洲精品成人福利网站 | 国产精品高潮呻吟av久久 | 日韩精品无码一本二本三本色 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产深夜福利视频在线 | 精品久久久久久亚洲精品 | 久在线观看福利视频 | 性欧美牲交在线视频 | 波多野结衣一区二区三区av免费 | 人人妻人人澡人人爽人人精品 | 理论片87福利理论电影 | 黑人大群体交免费视频 | 国产美女精品一区二区三区 | 久久久久99精品国产片 | 国产九九九九九九九a片 | 国产亚洲日韩欧美另类第八页 | 捆绑白丝粉色jk震动捧喷白浆 | 色情久久久av熟女人妻网站 | 中文字幕精品av一区二区五区 | 国产成人综合美国十次 | 在线观看欧美一区二区三区 | 成人欧美一区二区三区 | 国产精品久免费的黄网站 | 国产激情无码一区二区app | 国产精品无码一区二区三区不卡 | 激情综合激情五月俺也去 | 中文字幕人妻无码一区二区三区 | 成人无码精品1区2区3区免费看 | 无码免费一区二区三区 | 午夜精品一区二区三区在线观看 | 亚洲综合无码一区二区三区 | 亚洲一区二区三区国产精华液 | 久久精品中文字幕一区 | 亚洲va中文字幕无码久久不卡 | 亚洲 另类 在线 欧美 制服 | 一本大道久久东京热无码av | 成人免费视频一区二区 | 99麻豆久久久国产精品免费 | 久久aⅴ免费观看 | 亚洲精品中文字幕 | 久久精品国产日本波多野结衣 | 国产成人综合色在线观看网站 | 精品国产av色一区二区深夜久久 | 女人和拘做爰正片视频 | 正在播放东北夫妻内射 | 国产成人无码午夜视频在线观看 | 无码国产激情在线观看 | 亚洲天堂2017无码中文 | 激情综合激情五月俺也去 | 国产av久久久久精东av | 天天燥日日燥 | 又湿又紧又大又爽a视频国产 | 亚洲精品成人福利网站 | 日韩人妻无码一区二区三区久久99 | 中文字幕乱码亚洲无线三区 | 久久精品一区二区三区四区 | 欧美丰满熟妇xxxx | 国产成人精品视频ⅴa片软件竹菊 | 国产人妻大战黑人第1集 | 大肉大捧一进一出好爽视频 | 欧美刺激性大交 | 98国产精品综合一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 暴力强奷在线播放无码 | 四虎国产精品免费久久 | 亚洲s色大片在线观看 | 午夜精品一区二区三区在线观看 | 久久精品国产大片免费观看 | 好爽又高潮了毛片免费下载 | 天堂无码人妻精品一区二区三区 | 久久精品99久久香蕉国产色戒 | 精品国产一区二区三区四区 | 国产精品-区区久久久狼 | 奇米影视7777久久精品人人爽 | 天天做天天爱天天爽综合网 | 国产农村妇女高潮大叫 | 国产麻豆精品精东影业av网站 | 国产香蕉尹人综合在线观看 | 亚洲码国产精品高潮在线 | 国产精品va在线播放 | 漂亮人妻洗澡被公强 日日躁 | 国产av剧情md精品麻豆 | 亚洲综合无码久久精品综合 | 亚洲综合伊人久久大杳蕉 | 亚洲高清偷拍一区二区三区 | 色欲综合久久中文字幕网 | 少妇愉情理伦片bd | 国产精品无码mv在线观看 | 免费人成网站视频在线观看 | 大地资源中文第3页 | 中文字幕日产无线码一区 | 国产性生交xxxxx无码 | 久久久久久亚洲精品a片成人 | 亚洲色大成网站www国产 | 东京热无码av男人的天堂 | 中文字幕无码乱人伦 | 男女性色大片免费网站 | 曰本女人与公拘交酡免费视频 | 免费国产成人高清在线观看网站 | 国产艳妇av在线观看果冻传媒 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产偷国产偷精品高清尤物 | 在线成人www免费观看视频 | 国产在热线精品视频 | 丝袜美腿亚洲一区二区 | 国产av一区二区三区最新精品 | 国产精品久久久久影院嫩草 | 日日碰狠狠丁香久燥 | 无码人妻久久一区二区三区不卡 | 亲嘴扒胸摸屁股激烈网站 | 久久精品国产99精品亚洲 | 亚洲色欲色欲天天天www | 性做久久久久久久久 | 精品无人区无码乱码毛片国产 | 亚洲人成网站在线播放942 | 未满成年国产在线观看 | 亚洲午夜福利在线观看 | 又大又紧又粉嫩18p少妇 | 伊在人天堂亚洲香蕉精品区 | 撕开奶罩揉吮奶头视频 | 国产一区二区三区四区五区加勒比 | 国产精品igao视频网 | 无码播放一区二区三区 | 欧美一区二区三区 | 亚洲成在人网站无码天堂 | 奇米影视7777久久精品 | 亚洲国产精品美女久久久久 | 又粗又大又硬毛片免费看 | 欧美人与牲动交xxxx | 国产免费久久久久久无码 | 激情综合激情五月俺也去 | 夜先锋av资源网站 | 国产三级精品三级男人的天堂 | 国产电影无码午夜在线播放 | 欧美午夜特黄aaaaaa片 | 国产女主播喷水视频在线观看 | 人妻体内射精一区二区三四 | 久久久久久a亚洲欧洲av冫 | 好屌草这里只有精品 | 国产三级精品三级男人的天堂 | 中文字幕乱码人妻无码久久 | 久久久av男人的天堂 | 亚洲欧美日韩成人高清在线一区 | 自拍偷自拍亚洲精品10p | 女高中生第一次破苞av | 2020久久超碰国产精品最新 | 欧美放荡的少妇 | 国产人妻久久精品二区三区老狼 | 暴力强奷在线播放无码 | 中文字幕av无码一区二区三区电影 | 久久精品人人做人人综合试看 | 性色av无码免费一区二区三区 | 精品一区二区三区波多野结衣 | 日本熟妇人妻xxxxx人hd | 国产精品二区一区二区aⅴ污介绍 | 日日摸天天摸爽爽狠狠97 | 蜜桃视频插满18在线观看 | 狠狠色欧美亚洲狠狠色www | 日韩精品a片一区二区三区妖精 | 亚洲の无码国产の无码步美 | 狠狠色噜噜狠狠狠7777奇米 | 亚欧洲精品在线视频免费观看 | 强辱丰满人妻hd中文字幕 | 国产片av国语在线观看 | 99精品无人区乱码1区2区3区 | 无码av免费一区二区三区试看 | 极品尤物被啪到呻吟喷水 | 国産精品久久久久久久 | 中文字幕+乱码+中文字幕一区 | 免费国产黄网站在线观看 | 国产av一区二区三区最新精品 | 一个人免费观看的www视频 | 国产女主播喷水视频在线观看 | 国产精华av午夜在线观看 | 国产成人一区二区三区别 | 日日摸日日碰夜夜爽av | 无套内射视频囯产 | 97久久精品无码一区二区 | 精品偷拍一区二区三区在线看 | 人妻少妇精品无码专区二区 | 亚洲の无码国产の无码步美 | 国产精品无码一区二区桃花视频 | 亚洲s码欧洲m码国产av | 2020久久超碰国产精品最新 | 在线视频网站www色 | 国产精品久久久一区二区三区 | 亚洲精品国产第一综合99久久 | 国产精品第一国产精品 | 亚洲七七久久桃花影院 | 伊人久久大香线焦av综合影院 | 亚洲日韩精品欧美一区二区 | 人妻少妇精品久久 | 亚洲乱码国产乱码精品精 | 少妇人妻偷人精品无码视频 | 精品亚洲成av人在线观看 | 天天综合网天天综合色 | 国产办公室秘书无码精品99 | 国内老熟妇对白xxxxhd | 亚洲国产精品无码久久久久高潮 | 一二三四社区在线中文视频 | 欧美精品国产综合久久 | 精品久久久中文字幕人妻 | 日欧一片内射va在线影院 | 欧美成人午夜精品久久久 | 麻豆果冻传媒2021精品传媒一区下载 | 又湿又紧又大又爽a视频国产 | 久久久国产一区二区三区 | 欧洲vodafone精品性 | 俺去俺来也在线www色官网 | 四虎影视成人永久免费观看视频 | 性欧美熟妇videofreesex | 九九综合va免费看 | 国产av剧情md精品麻豆 | 99国产欧美久久久精品 | 国产精品永久免费视频 | 亚洲精品成人福利网站 | 欧美性色19p | 无码av免费一区二区三区试看 | 久久久无码中文字幕久... | 国产黄在线观看免费观看不卡 | 18黄暴禁片在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 色婷婷av一区二区三区之红樱桃 | 国产成人av免费观看 | 欧美黑人乱大交 | 99久久婷婷国产综合精品青草免费 | 人妻少妇精品久久 | 日产精品99久久久久久 | 欧美人与禽zoz0性伦交 | 欧美35页视频在线观看 | 色一情一乱一伦一视频免费看 | 日韩精品乱码av一区二区 | 激情内射日本一区二区三区 | 成 人影片 免费观看 | 爽爽影院免费观看 | 国产成人无码午夜视频在线观看 | 丝袜美腿亚洲一区二区 | 麻豆蜜桃av蜜臀av色欲av | 97人妻精品一区二区三区 | 国产乱人伦偷精品视频 | 午夜福利电影 | 天天av天天av天天透 | 97夜夜澡人人双人人人喊 | 高清国产亚洲精品自在久久 | 久久99久久99精品中文字幕 | 奇米影视888欧美在线观看 | 亚洲国产精品无码一区二区三区 | 成人精品一区二区三区中文字幕 | 免费人成在线视频无码 | 日本乱人伦片中文三区 | 亚洲а∨天堂久久精品2021 | 无码人妻黑人中文字幕 | 无码帝国www无码专区色综合 | 性色av无码免费一区二区三区 | 国产一区二区三区日韩精品 | 国产激情无码一区二区 | 偷窥日本少妇撒尿chinese | 欧美熟妇另类久久久久久不卡 | 无码av最新清无码专区吞精 | 黑人巨大精品欧美一区二区 | 全黄性性激高免费视频 | 久久精品国产一区二区三区 | 国产莉萝无码av在线播放 | 国产人妻久久精品二区三区老狼 | 午夜成人1000部免费视频 | 久久国产自偷自偷免费一区调 | 国产一区二区三区日韩精品 | 日韩精品无码一区二区中文字幕 | 国产乱人无码伦av在线a | 少妇高潮喷潮久久久影院 | 欧美喷潮久久久xxxxx | 无码精品人妻一区二区三区av | 日日噜噜噜噜夜夜爽亚洲精品 | 日日干夜夜干 | 亚洲精品一区三区三区在线观看 | 国产莉萝无码av在线播放 | 又大又硬又爽免费视频 | 97色伦图片97综合影院 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品偷拍一区二区三区在线看 | 人人爽人人澡人人人妻 | 无码国产乱人伦偷精品视频 | 亚洲色无码一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 国产亚洲欧美在线专区 | 欧美日韩人成综合在线播放 | 综合网日日天干夜夜久久 | 国产精品无码永久免费888 | 未满小14洗澡无码视频网站 | 精品久久久无码人妻字幂 | 丰满少妇熟乱xxxxx视频 | 精品久久久中文字幕人妻 | 日韩人妻无码一区二区三区久久99 | 亚洲精品午夜国产va久久成人 | 丰满诱人的人妻3 | 无码国产乱人伦偷精品视频 | 欧美 日韩 亚洲 在线 | 国产精品va在线观看无码 | 亚洲自偷自偷在线制服 | 荫蒂被男人添的好舒服爽免费视频 | 曰韩无码二三区中文字幕 | 精品无码国产一区二区三区av | 成人亚洲精品久久久久 | 老司机亚洲精品影院无码 | 内射爽无广熟女亚洲 | 激情国产av做激情国产爱 | 中文字幕av无码一区二区三区电影 | 色婷婷综合中文久久一本 | 国产成人无码av在线影院 | 午夜精品久久久久久久 | 伊人久久大香线蕉亚洲 | 少妇愉情理伦片bd | 久久久无码中文字幕久... | 成人精品一区二区三区中文字幕 | 久久这里只有精品视频9 | 亚洲成av人在线观看网址 | 国产精品福利视频导航 | 欧美性猛交xxxx富婆 | 牛和人交xxxx欧美 | 日本xxxx色视频在线观看免费 | 亚洲第一网站男人都懂 | 高中生自慰www网站 | 亚洲日本一区二区三区在线 | 日本丰满护士爆乳xxxx | 中文字幕av伊人av无码av | 亚洲自偷自拍另类第1页 | 高清无码午夜福利视频 | 国模大胆一区二区三区 | 精品欧美一区二区三区久久久 | 日本熟妇乱子伦xxxx | 成年美女黄网站色大免费全看 | 国产av无码专区亚洲awww | 妺妺窝人体色www婷婷 | 无码人中文字幕 | 久久久久久亚洲精品a片成人 | 97久久国产亚洲精品超碰热 | 国产麻豆精品精东影业av网站 | 偷窥村妇洗澡毛毛多 | 少妇无码吹潮 | 日韩亚洲欧美中文高清在线 | 日韩成人一区二区三区在线观看 | 日本精品少妇一区二区三区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | av无码久久久久不卡免费网站 | 欧洲精品码一区二区三区免费看 | 在线a亚洲视频播放在线观看 | 中文字幕无码热在线视频 | 久久国产自偷自偷免费一区调 | 亚洲色欲色欲欲www在线 | 国产乱人偷精品人妻a片 | 4hu四虎永久在线观看 | 欧美老熟妇乱xxxxx | 精品乱码久久久久久久 | 一区二区三区乱码在线 | 欧洲 | 日韩精品无码一区二区中文字幕 | 国产精品久免费的黄网站 | 蜜桃av抽搐高潮一区二区 | 国产成人亚洲综合无码 | 久久精品中文字幕一区 | 少妇无码av无码专区在线观看 | 久久精品丝袜高跟鞋 | 婷婷综合久久中文字幕蜜桃三电影 | 人妻体内射精一区二区三四 | 成人免费视频视频在线观看 免费 | 人妻人人添人妻人人爱 | 国产成人无码a区在线观看视频app | 又黄又爽又色的视频 | 国产激情无码一区二区 | 丝袜美腿亚洲一区二区 | 亚洲区欧美区综合区自拍区 | 国产精品久久精品三级 | 18无码粉嫩小泬无套在线观看 | 日本乱人伦片中文三区 | 日韩视频 中文字幕 视频一区 | 在线播放亚洲第一字幕 | 亚洲熟妇色xxxxx欧美老妇 | 久久无码中文字幕免费影院蜜桃 | 日韩少妇内射免费播放 | yw尤物av无码国产在线观看 | 国产xxx69麻豆国语对白 | 99精品无人区乱码1区2区3区 | 精品无码国产一区二区三区av | 亚洲精品国产品国语在线观看 | 疯狂三人交性欧美 | 亚洲精品中文字幕乱码 | 色综合视频一区二区三区 | 色 综合 欧美 亚洲 国产 | 成人试看120秒体验区 | 精品偷自拍另类在线观看 | 影音先锋中文字幕无码 | 荡女精品导航 | 久久精品国产一区二区三区 | 国产精品人人妻人人爽 | 精品久久久久香蕉网 | 欧美精品一区二区精品久久 | 欧美变态另类xxxx | 国产成人无码区免费内射一片色欲 | 国产熟女一区二区三区四区五区 | 久久熟妇人妻午夜寂寞影院 | 天堂久久天堂av色综合 | 东京热无码av男人的天堂 | 水蜜桃av无码 | 亚洲精品国产a久久久久久 | 麻豆md0077饥渴少妇 | 内射爽无广熟女亚洲 | 中文无码精品a∨在线观看不卡 | 大色综合色综合网站 | 成人片黄网站色大片免费观看 | 亚洲aⅴ无码成人网站国产app | 97夜夜澡人人爽人人喊中国片 | 精品国产av色一区二区深夜久久 | 欧美成人家庭影院 | 黑人巨大精品欧美一区二区 | 欧美乱妇无乱码大黄a片 | 青青草原综合久久大伊人精品 | 麻豆人妻少妇精品无码专区 | 曰本女人与公拘交酡免费视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产精品美女久久久久av爽李琼 | 人人妻人人澡人人爽人人精品 | 秋霞特色aa大片 | 成人免费视频视频在线观看 免费 | 国产精品人人妻人人爽 | 成人片黄网站色大片免费观看 | 欧美猛少妇色xxxxx | 中文字幕无码免费久久99 | 亚洲一区二区三区四区 | 99久久久国产精品无码免费 | 久久亚洲中文字幕无码 | 青青草原综合久久大伊人精品 | 无码国内精品人妻少妇 | 激情五月综合色婷婷一区二区 | 俺去俺来也在线www色官网 | 国产成人精品无码播放 | 青青久在线视频免费观看 | 老太婆性杂交欧美肥老太 | 蜜桃视频插满18在线观看 | 俄罗斯老熟妇色xxxx | 美女毛片一区二区三区四区 | 色婷婷香蕉在线一区二区 | 亚洲精品一区二区三区婷婷月 | 国产特级毛片aaaaaa高潮流水 | 久久久国产精品无码免费专区 | 亚洲成a人一区二区三区 | 亚洲欧美综合区丁香五月小说 | 久久99精品国产麻豆蜜芽 | 蜜桃无码一区二区三区 | 黑人粗大猛烈进出高潮视频 | 人妻尝试又大又粗久久 | 综合激情五月综合激情五月激情1 | 亚洲日韩av一区二区三区中文 | 国产精品-区区久久久狼 | 国产乱人伦av在线无码 | 67194成是人免费无码 | 国产成人一区二区三区在线观看 | 国产乱人无码伦av在线a | 日韩精品成人一区二区三区 | 日本www一道久久久免费榴莲 | а√天堂www在线天堂小说 | 欧美第一黄网免费网站 | 乱人伦中文视频在线观看 | 日韩人妻无码一区二区三区久久99 | 国产一区二区三区四区五区加勒比 | 亚洲精品成人av在线 | 亚洲精品中文字幕久久久久 | 国产极品视觉盛宴 | 小鲜肉自慰网站xnxx | 岛国片人妻三上悠亚 | 白嫩日本少妇做爰 | 老子影院午夜精品无码 | 国产成人无码av一区二区 | 少妇无套内谢久久久久 | 国产精品国产三级国产专播 | 久久精品人人做人人综合 | 99久久精品无码一区二区毛片 | 水蜜桃色314在线观看 | 亚洲人成人无码网www国产 | 成人片黄网站色大片免费观看 | 国产综合在线观看 | 免费观看激色视频网站 | 98国产精品综合一区二区三区 | 国产综合久久久久鬼色 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲一区二区三区香蕉 | 国产疯狂伦交大片 | 无码国模国产在线观看 | 精品 日韩 国产 欧美 视频 | 熟妇人妻无乱码中文字幕 | 国产莉萝无码av在线播放 | 国内少妇偷人精品视频免费 | 日本精品人妻无码77777 天堂一区人妻无码 | 久久综合九色综合欧美狠狠 | 国产精品久久久久久久9999 | 亚洲精品久久久久avwww潮水 | 亚洲国产精品一区二区第一页 | 中文字幕无码av波多野吉衣 | 妺妺窝人体色www在线小说 | 无码国内精品人妻少妇 | 久久99精品国产麻豆 | 国内揄拍国内精品人妻 | 夜夜夜高潮夜夜爽夜夜爰爰 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲精品午夜无码电影网 | 97精品人妻一区二区三区香蕉 | 成人欧美一区二区三区黑人免费 | 娇妻被黑人粗大高潮白浆 | 性生交大片免费看女人按摩摩 | 性欧美videos高清精品 | 免费播放一区二区三区 | 国产麻豆精品精东影业av网站 | 中文字幕日韩精品一区二区三区 | 综合人妻久久一区二区精品 | 国内精品久久毛片一区二区 | 欧美日韩人成综合在线播放 | 久久国内精品自在自线 | 成人精品天堂一区二区三区 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲欧美日韩国产精品一区二区 | 日本精品人妻无码免费大全 | 中文字幕无码日韩欧毛 | 国产精品美女久久久网av | 久久综合给合久久狠狠狠97色 | 黑人粗大猛烈进出高潮视频 | 性生交大片免费看l | 亚洲午夜久久久影院 | 又粗又大又硬毛片免费看 | 国产激情无码一区二区 | 午夜福利一区二区三区在线观看 | 无码纯肉视频在线观看 | 日本丰满熟妇videos | 狠狠色欧美亚洲狠狠色www | 亚洲爆乳精品无码一区二区三区 | 久久久成人毛片无码 | 日本在线高清不卡免费播放 | 久久精品国产大片免费观看 | av人摸人人人澡人人超碰下载 | 欧美激情一区二区三区成人 | 亚洲天堂2017无码中文 | 久久精品丝袜高跟鞋 | 精品国产成人一区二区三区 | 亚洲阿v天堂在线 | 欧美老妇交乱视频在线观看 | 国产高潮视频在线观看 | 欧美黑人性暴力猛交喷水 | 久久综合久久自在自线精品自 | 老熟妇仑乱视频一区二区 | 无码人妻久久一区二区三区不卡 | 久久久www成人免费毛片 | 帮老师解开蕾丝奶罩吸乳网站 | 领导边摸边吃奶边做爽在线观看 | 99riav国产精品视频 | 亚洲一区二区三区国产精华液 | 一本大道伊人av久久综合 | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧美自拍另类欧美综合图片区 | 清纯唯美经典一区二区 | 一本久道久久综合婷婷五月 | 性史性农村dvd毛片 | 国产香蕉尹人视频在线 | 亚洲精品午夜无码电影网 | 亚洲gv猛男gv无码男同 | 蜜桃视频插满18在线观看 | 国产精华av午夜在线观看 | 人人妻人人澡人人爽欧美精品 | 日本va欧美va欧美va精品 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产xxx69麻豆国语对白 | 强开小婷嫩苞又嫩又紧视频 | 欧美日韩久久久精品a片 | 亚洲欧美日韩综合久久久 | 欧美自拍另类欧美综合图片区 | 亚洲精品国产精品乱码视色 | 国产办公室秘书无码精品99 | 永久免费观看国产裸体美女 | 日本高清一区免费中文视频 | 俺去俺来也www色官网 | 伊人久久婷婷五月综合97色 | 亚洲色欲色欲欲www在线 | 一二三四在线观看免费视频 | 午夜精品久久久内射近拍高清 | 国产suv精品一区二区五 | 欧美丰满熟妇xxxx | 无套内谢的新婚少妇国语播放 | 午夜福利一区二区三区在线观看 | 成人一在线视频日韩国产 | 中文无码伦av中文字幕 | 亚洲精品鲁一鲁一区二区三区 | 久久精品国产一区二区三区肥胖 | 欧洲欧美人成视频在线 | 精品日本一区二区三区在线观看 | 国产午夜福利100集发布 | 亚洲国产精华液网站w | 久久久久亚洲精品中文字幕 | 97精品国产97久久久久久免费 | 又黄又爽又色的视频 | 免费国产成人高清在线观看网站 | 国产精品亚洲五月天高清 | 特级做a爰片毛片免费69 | 人妻人人添人妻人人爱 | 中文字幕无线码免费人妻 | 国产热a欧美热a在线视频 | 无码乱肉视频免费大全合集 | 99精品无人区乱码1区2区3区 | 亚洲综合伊人久久大杳蕉 | 久久精品国产一区二区三区 | 四虎国产精品一区二区 | 99久久婷婷国产综合精品青草免费 | 中文字幕日韩精品一区二区三区 | 97人妻精品一区二区三区 | 国产精品18久久久久久麻辣 | 最新版天堂资源中文官网 | 野外少妇愉情中文字幕 | 日本免费一区二区三区最新 | 成 人 网 站国产免费观看 | 精品国产一区二区三区av 性色 | 一本久道高清无码视频 | 天天摸天天透天天添 | 亚洲爆乳大丰满无码专区 | 欧美性生交xxxxx久久久 | 欧洲熟妇精品视频 | 亚洲精品成人福利网站 | 性做久久久久久久久 | 国产成人无码专区 | 人妻少妇精品无码专区动漫 | 国产后入清纯学生妹 | av香港经典三级级 在线 | 亚洲aⅴ无码成人网站国产app | 国产亚洲精品久久久ai换 | 亚洲综合无码久久精品综合 | 久久99精品久久久久婷婷 | 欧美国产日韩亚洲中文 | 好男人www社区 | 婷婷丁香六月激情综合啪 | 亚洲阿v天堂在线 | 伊人色综合久久天天小片 | 人人妻人人澡人人爽欧美一区九九 | 无码av免费一区二区三区试看 | 欧美午夜特黄aaaaaa片 | 人妻插b视频一区二区三区 | 精品久久久无码人妻字幂 | 日韩 欧美 动漫 国产 制服 | 国产精品亚洲专区无码不卡 | 131美女爱做视频 | 日韩欧美群交p片內射中文 | 亚洲成a人片在线观看无码3d | 骚片av蜜桃精品一区 | 国内精品久久毛片一区二区 | 性欧美牲交在线视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 夜夜高潮次次欢爽av女 | 亚洲国产午夜精品理论片 | 三上悠亚人妻中文字幕在线 | 欧美亚洲日韩国产人成在线播放 | 国产美女极度色诱视频www | 5858s亚洲色大成网站www | 久久www免费人成人片 | 蜜臀aⅴ国产精品久久久国产老师 | 成人免费视频一区二区 | 亚洲 a v无 码免 费 成 人 a v | 在线天堂新版最新版在线8 | a在线亚洲男人的天堂 | 国产午夜亚洲精品不卡 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 久久天天躁夜夜躁狠狠 | 无套内谢的新婚少妇国语播放 | 波多野结衣 黑人 | 亚洲欧美日韩国产精品一区二区 | 国产精品永久免费视频 | 亚拍精品一区二区三区探花 | 中文精品无码中文字幕无码专区 | а√资源新版在线天堂 | 性史性农村dvd毛片 | 男女下面进入的视频免费午夜 | 色一情一乱一伦一区二区三欧美 | 天天综合网天天综合色 | 无码国内精品人妻少妇 | 人妻尝试又大又粗久久 | 激情爆乳一区二区三区 | 国产成人综合色在线观看网站 | 无码播放一区二区三区 | 精品人妻中文字幕有码在线 | 欧美精品国产综合久久 | 最近的中文字幕在线看视频 | 最新国产乱人伦偷精品免费网站 | 波多野结衣 黑人 | 免费男性肉肉影院 | 7777奇米四色成人眼影 | 久久99精品久久久久久动态图 | 日本精品人妻无码免费大全 | 乱人伦人妻中文字幕无码久久网 | 曰本女人与公拘交酡免费视频 | 国产在线一区二区三区四区五区 | 99在线 | 亚洲 | 国产精品无码久久av | 国产av无码专区亚洲a∨毛片 | 国产艳妇av在线观看果冻传媒 | 国产办公室秘书无码精品99 | 国产精品久久久久久久影院 | 高潮毛片无遮挡高清免费视频 | 99麻豆久久久国产精品免费 | 伊人色综合久久天天小片 | 国产精品成人av在线观看 | 狠狠亚洲超碰狼人久久 | 国产午夜手机精彩视频 | 久久视频在线观看精品 | 国产尤物精品视频 | 亚洲男人av香蕉爽爽爽爽 | 午夜成人1000部免费视频 | 国产人妻久久精品二区三区老狼 | 日本大乳高潮视频在线观看 | 国产色xx群视频射精 | 丰满肥臀大屁股熟妇激情视频 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲国产成人av在线观看 | 亚洲色在线无码国产精品不卡 | 久久精品99久久香蕉国产色戒 | 亚洲 高清 成人 动漫 | 精品久久综合1区2区3区激情 | 亚洲欧洲日本无在线码 | 亚洲成色在线综合网站 | 国产乡下妇女做爰 | 亚洲成a人片在线观看日本 | 精品欧洲av无码一区二区三区 | 国产乱人无码伦av在线a | 亚洲经典千人经典日产 | 兔费看少妇性l交大片免费 | 成熟女人特级毛片www免费 | 97久久国产亚洲精品超碰热 | 久久久精品国产sm最大网站 | 中文字幕无码热在线视频 | 无码人妻丰满熟妇区毛片18 | 国产精品国产自线拍免费软件 | 亚洲精品久久久久久久久久久 | 国产另类ts人妖一区二区 | 欧美日韩一区二区免费视频 | 日本www一道久久久免费榴莲 | 99久久久无码国产精品免费 | 精品无人区无码乱码毛片国产 | 伊在人天堂亚洲香蕉精品区 | 在线精品亚洲一区二区 | 精品国产一区二区三区四区在线看 | 精品一区二区三区无码免费视频 | 亚洲一区av无码专区在线观看 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文字幕亚洲情99在线 | 丰满肥臀大屁股熟妇激情视频 | 永久免费精品精品永久-夜色 | 乱人伦人妻中文字幕无码久久网 | 国产色xx群视频射精 | 国产精华av午夜在线观看 | 亚洲精品久久久久avwww潮水 | 自拍偷自拍亚洲精品10p | 女人被爽到呻吟gif动态图视看 | 午夜无码区在线观看 | 野狼第一精品社区 | av香港经典三级级 在线 | 老熟女重囗味hdxx69 | 秋霞成人午夜鲁丝一区二区三区 | 成 人 网 站国产免费观看 | 久久成人a毛片免费观看网站 | 大色综合色综合网站 | 鲁鲁鲁爽爽爽在线视频观看 | 扒开双腿疯狂进出爽爽爽视频 | 麻豆人妻少妇精品无码专区 | 免费播放一区二区三区 | 精品久久久无码中文字幕 | 成人免费视频视频在线观看 免费 | 中文字幕无码日韩专区 | 色综合久久中文娱乐网 | 国产舌乚八伦偷品w中 | 真人与拘做受免费视频 | а天堂中文在线官网 | ass日本丰满熟妇pics | 久久亚洲日韩精品一区二区三区 | 四虎4hu永久免费 | 夜夜躁日日躁狠狠久久av | 亚洲成熟女人毛毛耸耸多 | 永久免费观看国产裸体美女 | 国产suv精品一区二区五 | 久久99精品久久久久婷婷 | 国产婷婷色一区二区三区在线 | 精品国产麻豆免费人成网站 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品视频免费播放 | 成人欧美一区二区三区黑人 | 日韩 欧美 动漫 国产 制服 | 国产国产精品人在线视 | 桃花色综合影院 | 男人的天堂2018无码 | 国产亚洲精品久久久久久大师 | 狠狠色噜噜狠狠狠7777奇米 | 天天做天天爱天天爽综合网 | 午夜精品久久久久久久 | 精品国产一区av天美传媒 | 国产精品久久久久久亚洲影视内衣 | 99国产欧美久久久精品 | 亚洲成av人影院在线观看 | 亚洲精品美女久久久久久久 | 欧美日韩一区二区免费视频 | 最新国产麻豆aⅴ精品无码 | 久久无码专区国产精品s | 国产色精品久久人妻 | 国产精品国产三级国产专播 | 亚洲精品一区二区三区在线 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品高潮呻吟av久久 | 成人欧美一区二区三区黑人 | 亚洲熟女一区二区三区 | 麻豆md0077饥渴少妇 | 漂亮人妻洗澡被公强 日日躁 | 六十路熟妇乱子伦 | 97精品国产97久久久久久免费 | 亚洲精品一区二区三区在线 | 国内老熟妇对白xxxxhd | 久久精品中文闷骚内射 | 性生交大片免费看女人按摩摩 | 日韩人妻系列无码专区 | 色老头在线一区二区三区 | 7777奇米四色成人眼影 | 亚洲成色www久久网站 | 久久久精品欧美一区二区免费 | 在线看片无码永久免费视频 | 亚洲熟妇色xxxxx亚洲 | 中文字幕乱码亚洲无线三区 | 日韩无码专区 | 亚洲日韩av一区二区三区中文 | 波多野结衣av在线观看 | 色 综合 欧美 亚洲 国产 | 中文字幕无码乱人伦 | 久久国语露脸国产精品电影 | 人妻aⅴ无码一区二区三区 | 天下第一社区视频www日本 | 欧美激情综合亚洲一二区 | 国产亚洲精品久久久久久大师 | 国产乱人无码伦av在线a | 天天做天天爱天天爽综合网 | 日本丰满护士爆乳xxxx | 国产凸凹视频一区二区 | 国产精品国产自线拍免费软件 | 国产熟妇高潮叫床视频播放 | 亚洲国产av精品一区二区蜜芽 | 精品国产av色一区二区深夜久久 | 国产成人久久精品流白浆 | 免费人成在线视频无码 | 精品欧洲av无码一区二区三区 | a片免费视频在线观看 | 国产精品高潮呻吟av久久4虎 | www国产亚洲精品久久久日本 | 日本大香伊一区二区三区 | 亚洲中文字幕乱码av波多ji | 性色欲情网站iwww九文堂 | 国产午夜精品一区二区三区嫩草 | 奇米影视7777久久精品人人爽 | 无码av免费一区二区三区试看 | 大地资源网第二页免费观看 | 国产精品久久久久久久影院 | 男女超爽视频免费播放 | 亚洲а∨天堂久久精品2021 | 国产猛烈高潮尖叫视频免费 | 成人影院yy111111在线观看 | 熟女少妇在线视频播放 | 久久久精品欧美一区二区免费 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品第一区揄拍无码 | 波多野结衣高清一区二区三区 | 午夜精品久久久内射近拍高清 | 精品一区二区三区波多野结衣 | 国产乱人伦偷精品视频 | 国产精品.xx视频.xxtv | 国产精品久久久一区二区三区 | 色窝窝无码一区二区三区色欲 | 18禁黄网站男男禁片免费观看 | 无码帝国www无码专区色综合 | 人妻天天爽夜夜爽一区二区 | 久久无码中文字幕免费影院蜜桃 | 午夜性刺激在线视频免费 | 免费乱码人妻系列无码专区 | 丰满岳乱妇在线观看中字无码 | 日韩人妻少妇一区二区三区 | 久久午夜无码鲁丝片午夜精品 | 色欲综合久久中文字幕网 | 欧美日韩视频无码一区二区三 | 娇妻被黑人粗大高潮白浆 | 日本在线高清不卡免费播放 | 人妻aⅴ无码一区二区三区 | 狠狠综合久久久久综合网 | 熟妇人妻无码xxx视频 | 国产国产精品人在线视 | 中文字幕亚洲情99在线 | 无码人妻丰满熟妇区五十路百度 | 久久99精品久久久久久动态图 | 亚洲日韩一区二区三区 | 麻豆国产人妻欲求不满 | 男女下面进入的视频免费午夜 | 成人无码精品1区2区3区免费看 | 网友自拍区视频精品 | 无遮无挡爽爽免费视频 | 亚洲人成人无码网www国产 | 亚洲日韩av片在线观看 | 人妻少妇精品无码专区动漫 | 久久国产劲爆∧v内射 | 亚洲一区av无码专区在线观看 | 久久天天躁夜夜躁狠狠 | 国产手机在线αⅴ片无码观看 | 日日摸日日碰夜夜爽av | 亚洲 日韩 欧美 成人 在线观看 | 国产色在线 | 国产 | 樱花草在线播放免费中文 | 伊人久久大香线蕉av一区二区 | 精品久久久中文字幕人妻 | 男女下面进入的视频免费午夜 | 丰满人妻被黑人猛烈进入 | 大色综合色综合网站 | 欧美成人家庭影院 | 久久久久久久人妻无码中文字幕爆 | 国产精品igao视频网 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 色欲av亚洲一区无码少妇 |