久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

SpringBoot3+Vue3智能課程學(xué)習(xí)系統(tǒng):核心表設(shè)計(jì)與進(jìn)度上報(bào)

SpringBoot3+Vue3智能課程學(xué)習(xí)系統(tǒng):核心表設(shè)計(jì)與進(jìn)度上報(bào) 如果你準(zhǔn)備做一個(gè)“智能課程學(xué)習(xí)系統(tǒng)”的項(xiàng)目無(wú)論是用于畢業(yè)設(shè)計(jì)、課程設(shè)計(jì)還是作為 Java 全棧能力的練手作品我的第一個(gè)建議是不要急著寫(xiě)代碼先把業(yè)務(wù)閉環(huán)想清楚。很多類(lèi)似項(xiàng)目最后“看起來(lái)都做完了”但數(shù)據(jù)庫(kù)一打開(kāi)就露餡課程表是課程表用戶表是用戶表中間沒(méi)有任何一條數(shù)據(jù)能回答“這個(gè)用戶到底學(xué)了多少、學(xué)到了哪里”。這樣的系統(tǒng)跑起來(lái)之后除了能在頁(yè)面上增刪改查既談不上學(xué)習(xí)管理也做不了個(gè)性化推薦最后只剩一個(gè)空殼。本文采用 SpringBoot3 Vue3 MySQL 的組合圍繞一套課程學(xué)習(xí)系統(tǒng)最常見(jiàn)的核心鏈路來(lái)展開(kāi)用戶登錄學(xué)習(xí)、章節(jié)進(jìn)度上報(bào)、課程進(jìn)度統(tǒng)計(jì)、基于標(biāo)簽的課程推薦、后臺(tái)課程維護(hù)。文章會(huì)給出可直接復(fù)制的數(shù)據(jù)庫(kù)腳本、后端接口、前端聯(lián)調(diào)代碼也會(huì)把新手最容易踩的幾個(gè)坑單獨(dú)拿出來(lái)講清楚。閱讀完本文你至少能獲得三樣?xùn)|西一套結(jié)構(gòu)清晰的數(shù)據(jù)庫(kù)表設(shè)計(jì)一套能處理學(xué)習(xí)進(jìn)度的 Spring Boot 3 后端接口一段真正能跑通聯(lián)調(diào)的 Vue3 前端代碼。1. 這類(lèi)項(xiàng)目最常見(jiàn)的失敗點(diǎn)把 CRUD 當(dāng)成全部幾乎所有初學(xué)者做的管理類(lèi)項(xiàng)目到最后都會(huì)變成 “CRUD 四件套”新增、刪除、修改、查詢。課程學(xué)習(xí)系統(tǒng)如果只做到這一步那它和“商品管理系統(tǒng)”沒(méi)有本質(zhì)區(qū)別也無(wú)法在答辯或面試中體現(xiàn)出你的建模能力。真正的學(xué)習(xí)類(lèi)系統(tǒng)和普通管理系統(tǒng)的差異在于你需要持續(xù)記錄用戶的行為狀態(tài)并根據(jù)狀態(tài)產(chǎn)生新的業(yè)務(wù)判斷。以“學(xué)習(xí)進(jìn)度”為例它不是一個(gè)簡(jiǎn)單字段而是一連串問(wèn)題用戶打開(kāi)了一個(gè)章節(jié)學(xué)到了第幾秒這個(gè)章節(jié)有沒(méi)有學(xué)完怎么定義“學(xué)完”一個(gè)課程有多個(gè)章節(jié)課程整體進(jìn)度怎么聚合計(jì)算用戶上次學(xué)到一半下次打開(kāi)課程是否應(yīng)該繼續(xù)這些問(wèn)題看似基礎(chǔ)但如果一開(kāi)始不設(shè)計(jì)好后面全都要返工。更常見(jiàn)的問(wèn)題是權(quán)限缺失。很多項(xiàng)目把管理員功能和普通用戶功能放在一起任何人知道接口地址就能刪除課程、改學(xué)習(xí)記錄。這在單機(jī)演示時(shí)沒(méi)問(wèn)題但一旦寫(xiě)到簡(jiǎn)歷上面試官大概率會(huì)追問(wèn)你怎么保證一個(gè)用戶不能修改別人的學(xué)習(xí)記錄所以這個(gè)系統(tǒng)的設(shè)計(jì)重點(diǎn)不在前端特效也不在框架選擇而在于把課程內(nèi)容與學(xué)習(xí)記錄之間的關(guān)系表設(shè)計(jì)正確把進(jìn)度上報(bào)接口做成可靠且冪等把推薦功能建立在真實(shí)學(xué)習(xí)行為之上而不是單純寫(xiě)死。只有先建立這個(gè)判斷下面所有代碼才有意義。2. 技術(shù)選型與系統(tǒng)邊界為什么是 SpringBoot3 Vue3 MySQL現(xiàn)在的 Java 全棧項(xiàng)目很多會(huì)直接上微服務(wù)或者把 Redis、MQ、ES 全部塞進(jìn)來(lái)。但針對(duì)課程學(xué)習(xí)系統(tǒng)這種業(yè)務(wù)盲目引入分布式組件只會(huì)讓維護(hù)成本遠(yuǎn)超收益。合理的做法是先用單體架構(gòu)把業(yè)務(wù)跑通再根據(jù)真實(shí)瓶頸引入中間件。這套系統(tǒng)的技術(shù)選型定位如下技術(shù)組件作用選擇理由Spring Boot 3后端基礎(chǔ)框架快速構(gòu)建 REST API內(nèi)置依賴管理和自動(dòng)裝配Vue 3 Vite前端開(kāi)發(fā)框架組合式 API 更適合復(fù)雜頁(yè)面交互開(kāi)發(fā)體驗(yàn)好MySQL 8.x關(guān)系型數(shù)據(jù)庫(kù)課程、用戶、學(xué)習(xí)記錄之間存在明確關(guān)系適合用 MySQL 存儲(chǔ)MyBatis-PlusORM 框架減少單表 CRUD 代碼專(zhuān)注業(yè)務(wù)邏輯Maven項(xiàng)目管理工具Java 項(xiàng)目最常見(jiàn)的依賴管理方式在 Spring Boot 3 中需要注意一個(gè)關(guān)鍵點(diǎn)它基于 Jakarta EE 9因此原來(lái) Spring Boot 2 中使用的javax.servlet、javax.validation等包名在 Spring Boot 3 中已經(jīng)變?yōu)閖akarta.servlet、jakarta.validation。如果你搜索資料時(shí)看到大量老代碼第一件要做的事就是檢查包名否則即使照抄也一樣編譯失敗。系統(tǒng)功能邊界建議控制在以下模塊模塊功能說(shuō)明用戶模塊登錄、注冊(cè)、個(gè)人信息維護(hù)后續(xù)可擴(kuò)展 Token 鑒權(quán)課程模塊課程列表、課程詳情、課程章節(jié)展示學(xué)習(xí)模塊學(xué)習(xí)進(jìn)度上報(bào)、課程總進(jìn)度計(jì)算、繼續(xù)學(xué)習(xí)定位收藏模塊用戶收藏感興趣的課程標(biāo)簽與推薦模塊維護(hù)課程標(biāo)簽根據(jù)用戶學(xué)習(xí)歷史推薦同標(biāo)簽課程管理后臺(tái)課程上下架、章節(jié)管理、標(biāo)簽維護(hù)接下來(lái)分三步實(shí)現(xiàn)先設(shè)計(jì) MySQL 表結(jié)構(gòu)再寫(xiě) Spring Boot 3 后端最后寫(xiě) Vue3 前端頁(yè)面。3. MySQL 數(shù)據(jù)庫(kù)設(shè)計(jì)用學(xué)習(xí)記錄連接用戶與課程數(shù)據(jù)庫(kù)是整個(gè)系統(tǒng)最值得認(rèn)真投入的部分。表結(jié)構(gòu)如果設(shè)計(jì)錯(cuò)后續(xù)代碼怎么寫(xiě)都別扭。3.1 核心表結(jié)構(gòu)總覽本系統(tǒng)至少需要以下核心表表名說(shuō)明sys_user系統(tǒng)用戶表course課程表course_chapter課程章節(jié)表learning_record學(xué)習(xí)進(jìn)度記錄表course_favorite課程收藏表tag標(biāo)簽表course_tag課程標(biāo)簽關(guān)聯(lián)表其中最關(guān)鍵的是learning_record表。它負(fù)責(zé)記錄“哪個(gè)用戶在哪個(gè)課程的哪個(gè)章節(jié)學(xué)到了第幾秒”。3.2 建表 SQL 示例下面的 SQL 可以直接在 MySQL 8.x 中執(zhí)行。先創(chuàng)建數(shù)據(jù)庫(kù)然后創(chuàng)建各張表。CREATE DATABASE IF NOT EXISTS smart_course DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE smart_course; CREATE TABLE IF NOT EXISTS sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 用戶ID, username VARCHAR(50) NOT NULL COMMENT 登錄賬號(hào), password VARCHAR(100) NOT NULL COMMENT 密碼生產(chǎn)環(huán)境必須加密存儲(chǔ), nickname VARCHAR(50) DEFAULT COMMENT 昵稱, avatar VARCHAR(255) DEFAULT COMMENT 頭像地址, status TINYINT DEFAULT 1 COMMENT 狀態(tài)1正常 0禁用, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時(shí)間, UNIQUE KEY uk_username (username) ) ENGINE InnoDB COMMENT 系統(tǒng)用戶表; CREATE TABLE IF NOT EXISTS course ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 課程ID, title VARCHAR(100) NOT NULL COMMENT 課程標(biāo)題, subtitle VARCHAR(200) DEFAULT COMMENT 副標(biāo)題, cover_url VARCHAR(255) DEFAULT COMMENT 封面圖, price DECIMAL(10, 2) DEFAULT 0.00 COMMENT 課程價(jià)格, original_price DECIMAL(10, 2) DEFAULT 0.00 COMMENT 原價(jià)用于展示劃線價(jià), difficulty TINYINT DEFAULT 1 COMMENT 難度1入門(mén) 2進(jìn)階 3高級(jí), status TINYINT DEFAULT 0 COMMENT 狀態(tài)0未上架 1已上架, view_count INT DEFAULT 0 COMMENT 瀏覽量, deleted TINYINT DEFAULT 0 COMMENT 邏輯刪除0未刪除 1已刪除, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時(shí)間, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新時(shí)間 ) ENGINE InnoDB COMMENT 課程表; CREATE TABLE IF NOT EXISTS course_chapter ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 章節(jié)ID, course_id BIGINT NOT NULL COMMENT 所屬課程ID, chapter_no INT NOT NULL COMMENT 章節(jié)序號(hào)從1開(kāi)始, title VARCHAR(150) NOT NULL COMMENT 章節(jié)標(biāo)題, video_url VARCHAR(255) DEFAULT COMMENT 視頻地址, duration_seconds INT DEFAULT 0 COMMENT 章節(jié)視頻時(shí)長(zhǎng)單位秒, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時(shí)間, UNIQUE KEY uk_course_no (course_id, chapter_no) ) ENGINE InnoDB COMMENT 課程章節(jié)表; CREATE TABLE IF NOT EXISTS learning_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 記錄ID, user_id BIGINT NOT NULL COMMENT 用戶ID, course_id BIGINT NOT NULL COMMENT 課程ID, chapter_id BIGINT NOT NULL COMMENT 章節(jié)ID, progress_seconds INT DEFAULT 0 COMMENT 已學(xué)習(xí)到的秒數(shù), duration_seconds INT DEFAULT 0 COMMENT 章節(jié)總時(shí)長(zhǎng)冗余存儲(chǔ)方便統(tǒng)計(jì), finished TINYINT DEFAULT 0 COMMENT 本章節(jié)是否學(xué)完0未完成 1完成, last_learn_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 最后學(xué)習(xí)時(shí)間, UNIQUE KEY uk_user_chapter (user_id, chapter_id), KEY idx_user_course (user_id, course_id) ) ENGINE InnoDB COMMENT 學(xué)習(xí)進(jìn)度記錄表; CREATE TABLE IF NOT EXISTS course_favorite ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 收藏ID, user_id BIGINT NOT NULL COMMENT 用戶ID, course_id BIGINT NOT NULL COMMENT 課程ID, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 收藏時(shí)間, UNIQUE KEY uk_user_course (user_id, course_id) ) ENGINE InnoDB COMMENT 課程收藏表; CREATE TABLE IF NOT EXISTS tag ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 標(biāo)簽ID, tag_name VARCHAR(30) NOT NULL COMMENT 標(biāo)簽名, UNIQUE KEY uk_tag_name (tag_name) ) ENGINE InnoDB COMMENT 課程標(biāo)簽表; CREATE TABLE IF NOT EXISTS course_tag ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 關(guān)聯(lián)ID, course_id BIGINT NOT NULL COMMENT 課程ID, tag_id BIGINT NOT NULL COMMENT 標(biāo)簽ID, UNIQUE KEY uk_course_tag (course_id, tag_id), KEY idx_tag_id (tag_id) ) ENGINE InnoDB COMMENT 課程標(biāo)簽關(guān)聯(lián)表;3.3 表結(jié)構(gòu)設(shè)計(jì)的關(guān)鍵點(diǎn)這里真正容易踩坑的地方是learning_record表的唯一索引。一個(gè)用戶反復(fù)學(xué)習(xí)同一個(gè)章節(jié)不應(yīng)該在表中產(chǎn)生多條歷史記錄。使用UNIQUE KEY uk_user_chapter (user_id, chapter_id)之后每次上報(bào)進(jìn)度時(shí)業(yè)務(wù)層只需要處理“插入”或“更新”兩種可能數(shù)據(jù)不會(huì)無(wú)限膨脹。course_chapter表中course_id chapter_no也設(shè)置了唯一索引目的是避免同一個(gè)課程出現(xiàn)兩個(gè)第 3 章。還有一個(gè)很實(shí)用的設(shè)計(jì)是course.deleted字段。在管理后臺(tái)“刪除課程”時(shí)不建議使用物理刪除因?yàn)闅v史學(xué)習(xí)記錄可能還引用該課程。采用邏輯刪除字段之后數(shù)據(jù)仍然保留但業(yè)務(wù)查詢會(huì)自動(dòng)排除MyBatis-Plus 通過(guò)TableLogic注解即可支持。4. SpringBoot3 后端工程搭建4.1 創(chuàng)建工程與引入依賴后端工程可以通過(guò) IDEA 的 Spring Initializr 創(chuàng)建也可以直接手工創(chuàng)建 Maven 工程。核心依賴如下示例版本請(qǐng)以你實(shí)際初始化出的版本為準(zhǔn)parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.5/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-spring-boot3-starter/artifactId version3.5.7/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies這里需要特別提醒MyBatis-Plus 在 Spring Boot 3 下不能再使用老的mybatis-plus-boot-starter必須使用mybatis-plus-spring-boot3-starter否則會(huì)出現(xiàn)自動(dòng)配置不生效的問(wèn)題。4.2 配置文件src/main/resources/application.yml內(nèi)容如下server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/smart_course?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: root password: your_password mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: banner: false數(shù)據(jù)庫(kù)密碼請(qǐng)?zhí)鎿Q成你本機(jī)的 MySQL 密碼。allowPublicKeyRetrievaltrue是 MySQL 8 連接時(shí)經(jīng)常需要配置的參數(shù)否則可能報(bào)Public Key Retrieval is not allowed錯(cuò)誤。4.3 統(tǒng)一返回結(jié)構(gòu)與異常處理后端接口如果格式不統(tǒng)一前端在 axios 攔截器里就非常難處理。建議從第一步就定義統(tǒng)一響應(yīng)結(jié)構(gòu)。package com.example.smartcourse.common; import lombok.Data; Data public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(0); result.setMessage(success); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }再定義一個(gè)業(yè)務(wù)異常類(lèi)用于處理“參數(shù)不合法、數(shù)據(jù)不存在”等業(yè)務(wù)錯(cuò)誤。package com.example.smartcourse.common; public class BizException extends RuntimeException { public BizException(String message) { super(message); } }最后寫(xiě)一個(gè)全局異常處理器把異常轉(zhuǎn)換為統(tǒng)一結(jié)構(gòu)避免把堆棧直接拋給前端。package com.example.smartcourse.common; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; Slf4j RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(BizException.class) public ResultVoid handleBizException(BizException e) { return Result.error(e.getMessage()); } ExceptionHandler(Exception.class) public ResultVoid handleException(Exception e) { log.error(系統(tǒng)異常, e); return Result.error(系統(tǒng)繁忙請(qǐng)稍后重試); } }統(tǒng)一返回結(jié)果之后前端只需要判斷code是否為 0不用每個(gè)接口單獨(dú)解析不同的字段結(jié)構(gòu)。5. 核心業(yè)務(wù)實(shí)現(xiàn)學(xué)習(xí)進(jìn)度上報(bào)與課程進(jìn)度統(tǒng)計(jì)學(xué)習(xí)進(jìn)度是整套系統(tǒng)的核心。下面以“用戶學(xué)習(xí)某個(gè)章節(jié)后上報(bào)當(dāng)前播放秒數(shù)”為例寫(xiě)完整實(shí)現(xiàn)。5.1 實(shí)體類(lèi)先創(chuàng)建Course實(shí)體對(duì)應(yīng)課程表。package com.example.smartcourse.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; Data TableName(course) public class Course { TableId(type IdType.AUTO) private Long id; private String title; private String subtitle; private String coverUrl; private BigDecimal price; private BigDecimal originalPrice; private Integer difficulty; private Integer status; private Integer viewCount; TableLogic private Integer deleted; private LocalDateTime createTime; private LocalDateTime updateTime; }再創(chuàng)建LearningRecord實(shí)體。package com.example.smartcourse.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDateTime; Data TableName(learning_record) public class LearningRecord { TableId(type IdType.AUTO) private Long id; private Long userId; private Long courseId; private Long chapterId; private Integer progressSeconds; private Integer durationSeconds; private Boolean finished; private LocalDateTime lastLearnTime; }5.2 MapperMapper 層繼承 MyBatis-Plus 的BaseMapper基礎(chǔ)單表方法會(huì)自動(dòng)生成。package com.example.smartcourse.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.smartcourse.entity.LearningRecord; import org.apache.ibatis.annotations.Mapper; Mapper public interface LearningRecordMapper extends BaseMapperLearningRecord { }課程 Mapper 類(lèi)似但后面做推薦查詢時(shí)會(huì)額外增加一個(gè)自定義方法。package com.example.smartcourse.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.smartcourse.entity.Course; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; Mapper public interface CourseMapper extends BaseMapperCourse { Select( SELECT c.* FROM course c WHERE c.status 1 AND c.deleted 0 AND c.id NOT IN ( SELECT course_id FROM learning_record WHERE user_id #{userId} ) AND c.id IN ( SELECT DISTINCT ct.course_id FROM course_tag ct WHERE ct.tag_id IN ( SELECT DISTINCT ct2.tag_id FROM course_tag ct2 JOIN learning_record lr ON lr.course_id ct2.course_id WHERE lr.user_id #{userId} ) ) ORDER BY ( SELECT COUNT(1) FROM course_tag ct3 WHERE ct3.course_id c.id AND ct3.tag_id IN ( SELECT DISTINCT ct2.tag_id FROM course_tag ct2 JOIN learning_record lr ON lr.course_id ct2.course_id WHERE lr.user_id #{userId} ) ) DESC, c.view_count DESC LIMIT #{limit} ) ListCourse recommendByUser(Param(userId) Long userId, Param(limit) int limit); }5.3 Service 層實(shí)現(xiàn)冪等進(jìn)度上報(bào)提交進(jìn)度請(qǐng)求時(shí)前端會(huì)傳用戶 ID、課程 ID、章節(jié) ID、當(dāng)前播放秒數(shù)、章節(jié)總時(shí)長(zhǎng)。Service 層要做的事很簡(jiǎn)單有記錄就更新沒(méi)有記錄就插入。但這里要加一個(gè)判斷如果新的進(jìn)度比舊進(jìn)度小說(shuō)明可能是一次遲到的舊請(qǐng)求不應(yīng)該把它覆蓋成更小的值。package com.example.smartcourse.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.smartcourse.common.BizException; import com.example.smartcourse.dto.ProgressSubmitRequest; import com.example.smartcourse.entity.CourseChapter; import com.example.smartcourse.entity.LearningRecord; import com.example.smartcourse.mapper.CourseChapterMapper; import com.example.smartcourse.mapper.LearningRecordMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; Service RequiredArgsConstructor public class LearningRecordService { private static final double FINISH_RATIO 0.9; private final LearningRecordMapper learningRecordMapper; private final CourseChapterMapper courseChapterMapper; Transactional(rollbackFor Exception.class) public LearningRecord submitProgress(ProgressSubmitRequest request) { if (request.getProgressSeconds() request.getDurationSeconds()) { throw new BizException(學(xué)習(xí)進(jìn)度不能超過(guò)章節(jié)總時(shí)長(zhǎng)); } LearningRecord record learningRecordMapper.selectOne( new LambdaQueryWrapperLearningRecord() .eq(LearningRecord::getUserId, request.getUserId()) .eq(LearningRecord::getChapterId, request.getChapterId()) ); boolean finished request.getProgressSeconds() request.getDurationSeconds() * FINISH_RATIO; if (record null) { record new LearningRecord(); record.setUserId(request.getUserId()); record.setCourseId(request.getCourseId()); record.setChapterId(request.getChapterId()); record.setProgressSeconds(request.getProgressSeconds()); record.setDurationSeconds(request.getDurationSeconds()); record.setFinished(finished); learningRecordMapper.insert(record); } else { if (request.getProgressSeconds() record.getProgressSeconds()) { record.setProgressSeconds(request.getProgressSeconds()); record.setDurationSeconds(request.getDurationSeconds()); if (!Boolean.TRUE.equals(record.getFinished()) finished) { record.setFinished(true); } learningRecordMapper.updateById(record); } } return record; } public double getCourseProgress(Long userId, Long courseId) { Long totalChapters courseChapterMapper.selectCount( new LambdaQueryWrapperCourseChapter() .eq(CourseChapter::getCourseId, courseId) ); if (totalChapters null || totalChapters 0) { return 0D; } Long finishedChapters learningRecordMapper.selectCount( new LambdaQueryWrapperLearningRecord() .eq(LearningRecord::getUserId, userId) .eq(LearningRecord::getCourseId, courseId) .eq(LearningRecord::getFinished, true) ); return BigDecimal.valueOf(finishedChapters) .multiply(BigDecimal.valueOf(100)) .divide(BigDecimal.valueOf(totalChapters), 1, RoundingMode.HALF_UP) .doubleValue(); } }這里定義FINISH_RATIO 0.9意思是用戶的播放進(jìn)度達(dá)到章節(jié)總時(shí)長(zhǎng)的 90%就認(rèn)為該章節(jié)學(xué)完。這個(gè)閾值可以根據(jù)業(yè)務(wù)需要調(diào)整也可以改成“必須看到最后一秒才算學(xué)完”。LearningRecord.finished使用Boolean類(lèi)型當(dāng)已經(jīng)完成時(shí)不會(huì)因?yàn)楹罄m(xù)一次較小進(jìn)度的上報(bào)而變回未完成這是防止?fàn)顟B(tài)回退的關(guān)鍵。5.4 DTO 與 Controller創(chuàng)建ProgressSubmitRequest作為參數(shù)接收對(duì)象并做參數(shù)校驗(yàn)。package com.example.smartcourse.dto; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import lombok.Data; Data public class ProgressSubmitRequest { NotNull(message 用戶ID不能為空) private Long userId; NotNull(message 課程ID不能為空) private Long courseId; NotNull(message 章節(jié)ID不能為空) private Long chapterId; NotNull(message 播放進(jìn)度不能為空) Min(value 0, message 播放進(jìn)度不能小于0) private Integer progressSeconds; NotNull(message 章節(jié)總時(shí)長(zhǎng)不能為空) Min(value 1, message 章節(jié)總時(shí)長(zhǎng)必須大于0) private Integer durationSeconds; }Controller 提供兩個(gè)接口一個(gè)是上報(bào)進(jìn)度一個(gè)是查詢課程總進(jìn)度。package com.example.smartcourse.controller; import com.example.smartcourse.common.Result; import com.example.smartcourse.dto.ProgressSubmitRequest; import com.example.smartcourse.entity.LearningRecord; import com.example.smartcourse.service.LearningRecordService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/api/learning) RequiredArgsConstructor public class LearningRecordController { private final LearningRecordService learningRecordService; PostMapping(/progress) public ResultLearningRecord submitProgress(RequestBody Valid ProgressSubmitRequest request) { return Result.success(learningRecordService.submitProgress(request)); } GetMapping(/course-progress) public ResultDouble getCourseProgress(RequestParam Long userId, RequestParam Long courseId) { return Result.success(learningRecordService.getCourseProgress(userId, courseId)); } }啟動(dòng)類(lèi)需要增加MapperScan注解否則 Mapper 不會(huì)自動(dòng)掃描。package com.example.smartcourse; import org.mybatis.spring.annotation.M
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
操一对老熟妇爽上天视频| 丁香五月激情网| 精品人妻中文字幕高清| 国产91精品在线免费| 国产呦精品系列在线观看| 久久久久亚洲Aⅴ无码| 人妻美腿丝袜日韩| 九月伊人中文字幕| 鸥美插入视频| 夜夜嗨AV蜜臀av| 激情小说图片亚洲首页| 五月丁香黄色网| 黄片免费视频2019| 囯产操逼片| 欧美日韩国产在线| 久草精品国产蜜臀 | 亚洲欧美综合| 日本αv| 免费一级特黄特色大片在线观看看| 综合操逼| 4141514逼喷水三级片| 国产后入清纯| 国产肏逼网站| 啊v视频在线观看| 久久久久久中文版| 中文字幕熟女人妻丝袜| 偷窥自拍亚洲色图| 江都AV在线| 偷拍 精品 另类 四区| 久久精品国产亚洲AV嘿嘿| 91狠狠狠| 国产久久久久影院老熟女| 国产Av超碰| www欧美91| 99999精品成人| 日韩操呦呦影院在线观看| 青娱乐国产剧情av一区| 无码聚合| 亚洲人人夜夜澡人人爽| 你懂的在线观看区国产| 久jiu久神马影院| 青青操在线视频| 亚洲成人久久美女| 日本不卡免费二区| 极品白嫩美女白浆成人福利在线看| 宗合情欲网| 国产在线视频午夜精华在| 啊啊啊啊一区| 麻豆三极片| 人人妻人人操人人乐| 欧美成人一级麻豆| 亚洲欧美中日韩| 自拍偷拍第26| 97丝袜亚洲在线播放| 午夜精品久久久久久久久久久久久 | 狼人久草| 99re6久热只有精品6在线直播| 99久热| 美国精品国产精品| 日韩AV片| 中国探花熟女| 精品毛片av一区二区| 精品国产污一区二区三区| 志村玲子视频一区二区| 超碰97日韩| 国产一二三福利视频网| 96一区二区| 精品国产污一区二区三区| 99久久婷婷丁香| 97视频在| 东北丰满熟女国产一区| 欧美色老汉| 白丝1区2区3区| 乱伦av麻豆| 九久久精| 人妻五十路在线| 97干在线看| 五月丁香社区婷婷日韩欧美精品影院| 人妻久久| 干b网| 亚洲官网在线| 综合日本女人伊人| 精品v日韩欧美国产| 国产婷婷综合在线观看| 加勒比av网| 亚洲综合图色在线| 国产老熟女| 精久久久| 探花精品视频| 人人做天天爱| 日韩一级二级三级| 婷婷五月天成人网| 天天色图| 亚洲图片 91| 亚洲精品黑丝| http://qxhbdz.com| 东京成人一区| www.色婷婷| 日韩在线观看AV| 91视频综合| 人人 操人人 操人人| 26uuu久久| 色亚洲欧美| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 精品一区二区三区国产 | 人人搡人人肉久久精品| 一区二区精品更新提醒| 欧美狠狠操| 亚熟hd视频在线| 我中文字幕6区| 自拍啪啪视频| 96久久久| 日本高清_区二区三区 | 日韩人妻播放| 色九九综合| 超碰 97国产熟女| 亚洲系列第一页| 日本美女性生活久久久久久久| 亚洲精品中文字幕一区在线视频| 欧美性爱91| 熟女视频久久| 青青草视频导航官网| 91是天天| 中文字幕啊啊啊在线观看视频| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 花野真衣| 超碰 av 女人天堂| 色悠久久久av| 97国产超碰| 亚洲av无线观看| 国内精品999| 97超碰人操| 搡老熟女免费视频| 九九性爱网| 欧美 牲| 亚洲在饯| 丁香六月激情综合| 一本色道久久综合熟妇| 精品欧美不卡在线播放| 激情综合五月丁香| 夜夜免费视频| 日本 色 导航| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 日本中文熟女视频| 久久激情婷婷| 97天天弄| 久久骚少妇| 97欧美超碰| 欧美熟妇精品黑人巨大一二三区| 99爱爱| 国产精品视频播放| 六月激情婷婷| 91在线精品一区二区三区| 青娱乐国产精品| 色欧美天天| 一区二区三区精品久久| 色综合超碰超| 久久无码电影| 东京男人天堂| 日韩精品99999| 91天堂| 国产人妻精品久久久一区二区三区 | 久久婷婷在线观看视频| 偷拍综合网| 清清草影| 日韩中文字幕二区| 天天视频黄| 超碰97最新人妻| 色色色天美视频| a啊啊啊啊啊啊啊啊一区二区| 中文字幕二区日韩天堂| 精品国产av一区二区三区四区入口| 素人美腿视频网站| 日韩熟女乱伦中出| 国产视频一区二区在线| 91亚洲电影| 国产51色综合久久免费| 色嗨嗨在线| 亚洲 国产 精品一区| 精品免费视频国产一区| 日影院久久婷婷夜夜网| 91在线精品一区二区三区| 天天操人人操狠狠插| 成人精品在线| 静品嫩模一区二区| 国产传媒日韩欧美| 91模特在线观看| 熟啊v色欧美热| 五月天久久久| 亚洲欧美在线观看免费| 亚洲欧美色图片| 伊人9| 久久中出在线| 色哟哟-国产专区| 色综合天天| 亚洲午夜免费狠狠干| 中日韩欧美精品无码AⅤ一区二区| 毛片久久| 懂色aV一区二区天美传媒| 国产丁香精品露脸视频| 91激情综合| 欧美在线55555| 刺激精品视频| 亚洲色图美腿丝袜| jiujiujiujingpin| 亚洲国产精品成人久久蜜臀| 呻吟 欧美 日本 中出| 最新国内自拍av免费| 国产日逼视频| 色五月激情网| 夜夜操av亚洲一区二区| 射丝袜高跟鞋99| 亚洲人妻中文高清| 青青草操逼逼视频| 97色色婷婷| 2017超碰| 日韩精品亚洲一二三| 亚洲第二页| 一区二区三区不卡视频| 天堂无码| 日韩亚洲国产视频| 激情色色| 国产精品高潮久久AV| 熟女高潮合集-永久久久-成人AV | 熟女露脸激情自拍视频| 国产2.3.4区| 午夜操一操| 国产日韩区| 淮穴色AV| 老鸭窝日丰县女人| 91被操| 亚洲成人福利电影免费| 色蜜AV| 美女网站黄页| 熟妇人妻精品一区二区视频色欲| 日韩无码黄色片| 国产乱色国产精品免费视| 免费人成毛片乱码| 欧美日韩久久精品爱爱| 亚洲欧洲精品视频发布| 青操影院| 涩涩这里只有精品视频| 欧美成人免费在线观看| 2017超碰| 97综合国产| 午夜啊啊啊| 天美传媒精品一区二区| 国产情侣自拍在线播放| 熟女精品一区二区在线观看| 一级一性爱免费视频| 我爱大香蕉| 婷婷丁香人妻 | 美女91网址 | av网站免费线看| 国色天香av| av网站在线看| 久久女人一区二区三区| 啊啊啊水好多| 大香樵伊人网| 91春色| 久久一区无码| a片久久久久久久久久久久 | 欧美日韩性爱视屏免费看了| 亚洲人妻AV| 欧美熟妇精品黑人巨大一二三区| 神马久久久久久久久| 97视频620| 极品色社| 日本岛国黄色网址| 久久99干一本高清| 精品国产a∨一区天美传媒| 深夜激情 | 日本99一区二区| 日本欧美国内在线| 不卡一区二区日本视频| 丰满人妻-区二区三区| 青娱乐999| 中文字幕视频2区| 五月天婷婷久久| 婷婷99狠狠躁天天躁| TS人妖另类精品视频系列| 欧美,日韩,中文,另类| 亭亭丁香激情| 日韩免费一级性爱视频| 综合网色| 国产日韩精品suv| 色偷偷超碰亚洲| 婷婷在线精品| 亚洲自拍天堂| 国产精品福利视频| 久久久久久中文| 中文字幕一二三| 无码人妻精品一区二区三区九九| 亚洲精品中文字幕一区在线视频 | 亚洲一区二区中文字幕| 欧美曰韩国产精品| 另类图片五月| 久久性爱城| 黄色网址在线免费观看| 91搞逼视频| 99久久亚洲精品无码毛片潘甜甜| 欧美视频一区二区三区| 久久99草| 天欧美在线| 国模精品一区二区三区苹果色戒| 久久久一热在线播放| 国产精品不卡一区二区电影| 成人日本精品九区| 96久久久久久久| 蜜臀Av一区二区三区| 亚洲少妇视频| 91亚洲欧美| 青青草原香蕉日本Ap| 欧美精品日韩久久久九| 日本免费二区三区| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 另类天堂| 嗯嗯啊啊啊好爽| 欧美熟妇色| 欧美日韩亚洲天堂| 国产福利合集| 飘花国产午夜精品不卡| 99e久久国产精品| 影音先锋乱伦资源| 人人爱人人操人人性| www.yw尤物| 熟女一区二区| www.男人天堂| 91网站18禁| 成年人黄色小视频网站| 免费a在线播放v| 伊人97色天使| 精品制服美女中文一区二区三区| 一二三四区电影| a片 xxxx受爽视频| 日本五区不卡| 91精品丝袜在线观看| 亚欧视频在线| 亚洲国产一级黄色视频| 午夜精品久久久99热蜜桃的功能特点| 国内毛片热久久思思热| 性色乱AV一区二区| 啪啪啪亚欧美视频| 午夜美女诱惑电源网| 欧美加勒比| 久久久九九| 日本国产高清色www视频在线| 欧美日韩黄片精品在线| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲情欲| 99色在线观看| 超碰在线综合97| 囯戸精品高潮呻吟旡码| 欧美综合站| 大香蕉中文网| 91人妻Pr| 久久久久久免费电影| 成全在线观看免费观看| 国产日本熟女顶级一区二区三区视频| 国产精品午夜精品| 在线人人人人人人精品超| 国产乱码精品久久久久久| 99久久久久久亚洲精品不卡| 亚洲高潮少妇| 日本一区不卡| 美女露胸露屁股| 秋霞Av理论一级在线| 五月丁香综合| dy888午夜老子影视达达兔| 日本有码久久| 青青草日韩无码| 国产精品视频麻豆入口| 国产又色又爽又舒服的三级视频| 人妻夜夜爽天天爽麻豆三区网站 | 日韩中文字幕在线视频观看| 蜜臀va69| 九九九成人| 超碰97欧美在线| 国产呦精品系列在线观看| 五月丁香六月| 99色色网| 久草福利在线资源站| 国产91 丝袜在线播放00-百度| 免费啪啪啪网站18岁| 理论久久婷婷网8| 亚洲最大的综合性av| 蜜区区视频79 | 色99色| 亚洲色天| 97超碰久| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 欧美顶级黄色大片免费| 国产日本顶级一区二区三区| 国产视频三区四区| 日韩在线一区高清在线| 日日夜夜骑| 国产乱码精品久久久久久| 在线精品福利免费播放| 色婷婷淫色网| 久久久影院| 天天色播亚洲综合网站| 亚洲九九九九| 欧美伦乱爱| 夜色综合| 18精品一区| 欧美激情久操网| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲国产综合久久天堂| 99热亚洲| 日本岛国黄色网址| 69丨亚洲丨精品丨入口免费播放| 91香蕉视频在线观看免费| 久久久久亚洲三级电影| 激情五月天丁香社区| 囯产精品久久久久久久久久梁医生 | av东京热男人的天堂| 成人天天爽| 自拍六区| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 五月天精品| 婷婷激情四射| 亚洲图片激情综合另类| 午夜男女爽爽爽在线视频| 国产女生在线| 超碰98综合网| 天天夜夜rb| 伊人专区一区二区三区| 玖玖色综合| 久久e6只有精品| 女上位精品在线| 欧美97在线欧| 日韩不卡a级视频专区| 色女网日韩| 麻豆精品三区视频| 啊啊啊操死我| 欧美系列在线一区二区| 大香伊人在线一区| 欧美97超碰| 国产黄色 A 片免费看| 91九久| 亚洲在钱| 午夜视频久久久久一区| 综合网欧美在线| 亚洲视频小说| 欧美色www亚洲国产阿娇要播| 中日韩熟女| 天天弄欧美| 九热久| 国产99久久99热这里只有精品15 | 日本不卡码黄色| 午夜啊啊| 大香蕉AV在线| 囯产精品强| 国产精品久久久久久久AV大片| 丁香婷婷色五月| 亚洲精品黑丝| 1禁看欧美黄片免费看| 久久久啊啊| 91中文字幕制服丝袜免费视频| 九九精品99| wwe 天天干.com| 亚洲开心网| 黄片不用下载在线观看| 久操| 啪啪资源网| 中文字幕人妻色偷偷久久皮| 伊人网青青| 精品久久久九九九孕妇| 思思热国产高清| 中文字幕一区av| 色综合大香蕉| 口爆综合网| 亚洲精品国产拍免费91在线| 韩国黄色片精品久久久| 久操免费视频| 91超级碰碰碰| 精…码一二三区| 99在线免费观看| 2020中文字幕在线观看| 国产欧美日韩在线观看麻豆传媒公司 | 日韩综合97p| 欧美99热| 九九九九九九视频免费| 夜夜狼人妻| 午夜啪| 一区| 91人妻最真实刺激绿帽| 五月开心久久AV官网| AV污污污污| 亚洲 中文 欧美 日韩 在线| 九九九九久久久| 天天综合网日韩| 亚州色站 日韩电影| 黄色视频60分钟| 男人的天堂在线| 国产高清无码一区二区三区四区皇冠| 日韩在线电影| 亚洲一区二区三区麻豆传媒| 韩国黄片aaaa| 久夜视频| 粉嫩AV一区夜夜嗨| www.色婷婷.com| 婷婷色综合欧美日韩| 欧美午夜色妇色鬼| 国产一区二区视频在线播放| 91亚洲黄色网| 天堂精品小草| 亚洲午夜AV| 久久午夜鲁丝片| 成人开心网在线视频| 色丁香五月婷婷| 内射小黄片| 加勒比aⅴ| 日本人妻一区二区| 亚洲五月婷| a片久久久久久久久久久久 | 狠狠爱大香蕉| 日韩欧美中文字| 99色色网| 韩国一级AAA| 亚洲精品久久久久久久蜜桃臀| 国产91精品久久久久久久网曝门| 狠狠干婷婷| 操逼天美3区| 東南亚性呦成人伦理资源在线视频 | 九九九九亚洲| 香港日本韩国人妇99www.wccm20| 99热| 五月天激情影院| 久久精品 六十路 熟女 欧美| 欧美色97| 精品国产网站| 久草大| 日韩精品1区2区中文字幕| 91色欧美| 青青草色AV| 91丝袜美腿片| 久久仑合| 欧美色66| 大香蕉99热| 丁香五月影院| 日本在线激情一区二区三区| 热99这里有精品综合久久| 新91视频.cmp| 啊啊啊啊,啊啊好多水| 美女主播色欲91抠b在线播放| AV天天在线观看| 狠狠色综合网| 久久久国产成人一区二区三区在线| 成人97人人超碰人人| 综合久久97| 欧美性夜| 欧美少妇色图| 欧美劲爆第一页| 亚洲成人ab| 国产sv美女内射| 五月天AV资源| 大逼色网站| 亚洲美女高潮喷水视频| 91成人久久| 天天大干大香蕉| 国产91专区| 中文一区二区| 人妻娇喘 激情视频| 亚洲欧美精品久| 91天天c| 人妻免费观看| 干妹子| 亚州,欧美在线| 欧美激情精品久久久久久| 欧美三四五区| 91综合站| 国产成人亚洲精品无码最新在线| 黄色AV免费| 国产隔壁老王影院在线| AV无码久久久精品| 激情综合五月丁香| 熟女丰满人妻一区| 性爱动态120秒| wwe 天天干.com| 97bbn| 超碰在线1234区| 综合亚洲网| 色吧5亚洲| 91精品久久久久五月天精品| 韩国成人精品久久久免费看| 婷婷五月天激情网| 操操啪| 天天弄欧美| 亚洲欧美另类少妇精品| 日本青青草在线| 久久一二三四不卡| 我爱操| 91啪啪| 国产精品嫩草影院午夜两性| 国产一区在线观看无码AV| 超碰成人最新最好看| 欧美中出1| 久久久网站| 青青青青草av在线观看| yazhouzaixian| 亚洲天堂资源在线| 亚洲精品白浆高清久久久久久| 国产自产自拍| 狠狠狠狠狠狠| 久久久熟妇熟女国产| 男人的天堂久久狠| 久久精品28| 色在线综合| 国产9 9在线 | 亚洲| 操逼www.| 97久久久久久久精| 乱久久久| 少妇久久久久久久久| 久久久久久一日韩字幕无码| 午夜高清成人在线视频| 精品久久視頻在线| 97在线青| 精品无码一区二区三区| 91天天综合在线观看| 国产精品白丝| 无码免费精品高清| 夜夜操av亚洲一区二区| av一区二区三区不卡| a一区二区三区乱码在线| 操逼网免费无码视频| 久久精品一区| 97AV在线观看| 91强奸乱轮| 美女毛片999| 欧美91精品国产自产| 国产成人免费观看在线视频| 日韩一级二级在线| 美女91AV| 成人性爱高清视频免费看| av在线人气| 2020中文字幕在线观看| 美女尤物人人操| 综合激情97 | 中文字幕第9页萱萱影音先锋| 337p大胆噜噜噜噜噜91Av| 天天情欲宗合网| 丰满人妻无码一区二区三区 | 八戒无码国产午夜福利| 亚洲乱色视频一区、二区在线| 青青伊人加勒比海| 国产理论视频在线播放| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 宅男影院久久久,99| 一区二区三区四区免费视频| 熟妇国产免费一区| 素人一区二区三区日韩| 久久111| 亚洲精品国产精品成人| 欧美淫穴| 97色伦97色伦国产欧美| 一道本东京热加勒比一区二区三区| 精品国产乱码久久久久久久| 大香蕉黄色一区| 久操电影网| 99精品久久久久久久婷婷蜜桃| 夜夜国自区| 91操操| 日本黄色XXX| 日韩成人性爱电影在线播放| 美女91网址| 五月丁香综合网| 欧美日韩欧美| 欧美熟妇人体| 在线视频免费播放一区| 青青青草原| 日韩草久视频| 一区二区三区亚洲| 91精品国产乱码| 综合婷婷| 八戒无码国产午夜福利| 色哟哟av网址| 日本超碰在线国产一区| 国产午夜福利专区综合| 夜草欧美| 激情五月激情综合网| 中文字幕人妻资源在线| 97爱爱影院| 亚洲偷拍自拍在线视频| 大香蕉综合网| 99热色这里只有精品| 久久婷婷电影网| 国产精品国产| 极品丝袜无码| 日韩操逼HD| 欧美97超碰| 亚洲自拍欧美色综合| 国产三级电影免费观看| 97国产精品| 亚洲国内精品成人不卡| 91丨九色丨国产打屁股| 国产精品原创巨作?v网站| 夜夜嗨一区二区三区三州加勒比 | 久久伊人影院| 97就爱干| 日本免费不卡二区| 最新日产中文在线麻豆| 秋霞一集毛片观看| 亚洲色图欧美色18直播在线| 91女人的网站| 91日本在线观看| 久久久久久人妻一区精品色欧美| 国产深喉| 男人天堂 天天射| 91人妻丝袜无码| 久久精品欧美一区二区三区不卡| 99re超碰| 伊人宅男大香蕉| 天天摸天天舔天天操| 九色 人妻 大香蕉| 婷婷五月av| 国产aⅴ无码片毛片一级网站| 91黄站| 精品久久久一本一道| 欧美日韩黄色片一区二区三区四区人与兽做爱| 亚洲国产成人精品久久久国产成人一区二区三.| 啊啊啊啊操死我| 午夜亚洲| 2019午夜福利视频| 蜜桃一区二区三区| 欧美婷婷久久| 一牛影视久久久一区二区三区| 日本黄 R色 成 人网站| 亚洲天堂7777| 亚洲国产精品无码AV在线| 欧美色网| 成人久久久| 伊人久久AV诱惑悠悠| 941超碰| 豆1无夜无码| 自拍偷拍第26| 91人妻人人澡人人爽人人精品| 青青在线视频免费| 久久男人| 国产9l 大屁股| 亚洲自拍青操视频| 欧美手机在线综合| 激情内射| 午夜九九| 青青草依人大香蕉| 色九久| 91老熟女视频| 欧美色图20p| 97爱爱| 一起草三级AV电影在线观看| 夜夜爽夜夜爽| 国模无码人体一区二区三| 日本人妻丰满熟妇久久久久久| 97爱综合| 国产91av在线播放| 国产曰批免费观看久久久| 五月色网| 色色色综合网| 日本免费不卡二区| 天天日天天舔东京热| 国产精品午夜成人福利| 人妻内射一区二区在线视频| 久久久精品中文字幕麻豆| 四虎884| 大香蕉日韩| 麻豆国产精品午夜视频| 午夜福利av电影在线| 日本免费一级AAA大片器| 国产91精品福利在线| 免费视频a级毛片免费视频| 国产真实野战在线视频| 99精品久久| 91视频观看网站| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 欧美日韩性感| 欧美页片| 精久久久| 日韩性爱啪啪视频| 午夜电影在线观看无码专区| 色九月婷婷| 国产精品久久久久久夜夜夜| 97精品97久久| 香蕉视频欧美一卡二卡| 老司机深夜18禁污污网站| 亚洲色图殴美色图激情乱伦| 97超碰美国| 校园春色中文字幕AV| 国产日本顶级一区二区三区| 浓厚中出中文字幕在线| 亚洲国产午夜真人一级片中文字幕精品黄网站| 制服乱伦| 天天日天天操VV| 啊啊啊啊好疼| 26UUU欧美激情一区二区| 亚洲精品国产精品乱码不99| 抽查国产福利主播| 青草精品视频一日本久久久久网站| 97欧美超碰| 香蕉人人操tv| 青娱乐蜜桃臀AV色婷| 999精品女人| 福利视频一区二区微拍| 精品免费1| 欧美三四五区| 久久AV无码AV| 少妇滛荡视频| 久久草视频污视频| 乱伦熟女论坛| 日本99久久| 日本熟妇精品九九| 亚洲欧洲av影音| 又黄又爽在线观看视频| 四虎在线观看网站| 亚洲国产精品99久久久| 一色网男人的天堂| 东京热大香焦| 尤物网址| 国产成人主播| 人妻干天天| 一区二区偷拍拍视频| 日韩综合第八区国产精品| 涩涩这里只有精品视频| 91最新综合| 肥佬影院91| 丁香五月大香蕉| 加勒比综合在线| 人妻偷拍一区二区三区| 精品一区96| 久久国产成人精品国产成人亚洲| 可以免费观看的AV| 国产又大又粗又长视频| 成人免费福利在线观看| 伊人在线大香蕉视频久久| 91丨豆花丨熟女| 乱理日韩中文| 91色人妻| 淫骚熟女一区二区三区| 99re9| 人人色人人射人人妻| 欧美色网| 影音综合网| 思思久热在线精品66| 青青青国产| 日欧操屄| 激情视频一二三| 日韩操逼性鲍| 日产123区精品免费观看| 日韩 欧美 另类 人妻| 91丝袜在线视频| av一区二区三区四区| 亚洲欧美日产国产91毛片| 日韩精品免费高清视频在线| 麻豆黄色五月天| 久久精品国产亚洲妲己影视| 伊人久久久日韩一区| 亚洲精品xxx| 伊人少妇久久久| 六月丁香啪啪| 日韩成人高清一区二区| 欧美熟妇操操视频| 一区二区三区成人高清视频| 99热国产| 2020视频1区2区3区| 丝袜人妻av一区二区| 人妻无码后入| 亚洲一本大道中文字幕无码在线| 2017,超碰| 亚洲熟女综合| 久久91精品国产9丨久久分亭 | 在线岛| 亚洲精品1区| 日韩不卡a级视频专区| 久久久人妻| 好看的久久不射无码影视影院| 国产强奸乱伦欧美| 精品久久艹| 人妻天堂综合网| 欧美1区二区三区公司| av东京热男人的天堂| 爱射综合| 亚洲图片日本AⅤ欧美在线| 国产精品大屁股999| 亚洲无码99| 日本1区2区不卡视频| 97精品国产精品免费观看| 国产动漫操逼视频| 国产精品久久久啊| 欧美偷偷网| 中文字幕在在线观看网站| 久久一级无码精品毛片6| 国产三级中文字幕粉嫩| 欧美日本久久精品一区| 日本理论在线| 91美女国产在线| 少妇毛片久久| 亚洲综合色网| 蜜乳性色无码专日粉嫩骚逼AV| 亚洲乱熟女一区二区| 国产成人亚洲精品自产在线 | 91国内外在线| 色婷婷九月| 激情抓乳插进去啪啪啪日韩| 亚洲色电影在线| 91黑丝操| 亚洲图片 91| 无码精品一区二区三区潘金莲| 久久精品久| 综合少妇网| 亭亭丁香激情| 亚洲精品亚洲人成人网| 中文字幕国产| 伊人一级免费黄片| 先锋女优在线观看视频| 劲爆欧美人妖三区91| 婷婷五月天久久精品视频一区二区三区 | 影音先锋国产精品| 日本操逼视频导航| 国产精品点击进入在线影院| 精品人妻丰满熟妇一区二区三| 久久久久国产| 操逼精品视频| 天天天肏屄欧美| 国产这里只有精品| 超碰人人超在线观看| 人妻一区视频| 日韩精品免费高清视频在线| 麻豆国产视频精品观看| 91青青| 欧美91网站| av午夜玫瑰| 夜夜狼人妻| JULIA人妻风俗店中出电影| 夜色五月天| 看日韩美女二区三区免费操逼视频| 中国一区二区亚洲人妻| 玖玖资源综合在线视频| 亚洲日韩美女中文字幕乱| 操逼日批| 中国一级操逼视频| 精品视频免费在线一区| 久久亚洲欧美中文字幕国语| 17c在线成人免费A片观看| 欧美日韩另类在线播放| 俺去啦俺来也久久综合 | 国产精品欧美激在线| 五月婷婷hd| 动漫片子网站3黄| 欧美大香蕉97| 精品一国2| 久久成人网站| 欧美A√综合网| 黄久在线| 欧美热图99| 色香综合| 84YTCOM性无码| 国产无码精品成人| 国产黄片精品在线| 久久性爱大全| 裸体美女免费看网站青草| 99久久9| 麻豆久久久久久久久丝袜 | 在线亚洲丝袜视频网站| 天天搞欧美| 少妇蹲下露出大唇5| 欧美v日韩v亚洲v最新在线| 日韩成人性日韩成人性爱视频在线免费观看 | 欧美色一二三| 色哟哟精品1精品2| 欧美色图91| 亚洲AV成人无码一二三久久| 成人日韩3| 日本网色| 欧美少妇一区二区三区| 青青伊人加勒比海| 亚洲另类色综合网站| 久久夜夜| 太久视频| 国产亚洲 中文欧美久久| 日本一区三级韩国| 草蕉影视亚洲无码| 久肏视频字幕| 偷拍 欧美 日韩| 黄aaaaaaaaaaaaaaaaaa色网站| 亚洲激情在线| 亚洲淫乱骚妇AV| 久久亚洲一区二区色婷婷| 天天视频黄| 日韩人妻一区二区精品| www.四虎在线| 美国三级日本三级久久99| 亚洲国产综合视频| 嫩草影院性色| 大香蕉色十月| 狠狠爱夜夜干| 国产精品黑人一区二区三区| 日韩性爱网址| 四虎免费看黄| 欧美综合色,www| 亚洲日韩天堂| 日本色色色视频| 国产原创精品| 加勒比伊人综合| 久久精品店| 久久久久久亚洲Av无码精| 在线中文字幕极品av| 91人妻爽爽人人做人人澡| 欧美日韩国产中文精品字幕自在自线,| 高跟伊人julia ann| 亚洲九九视频| 亚洲色人阁| 亚洲成人一区二区精品| 五月丁香激情啪啪| 婷婷美人网| 丰满人妻一区二区三区| 国产强奸超碰AV| 欧美亚洲影视| 国语少妇精| 熟女人妇一区二区三区| 欧美国产视频| 蜜臀无码视频在线观看| www.狠狠| 久久97视频| 日韩av影片在线观看| 欧美狠狠操| 探花视频免费观看国产专区| 99热综合| AV女资源| 99自拍视频| 亚洲日本天堂| 一级特级aaaa毛片免费观看| 成人热久久精品| 超碰免费人妻人人| 一区二区三区四区五区高清无码永久视频 | 五月丁香黄色网| www.97在线| 国产精品96| 日韩有码免费视频| 九九自拍伦理| 日韩人妻一区二区| 日本人体九九九九九九| 亚洲色图欧美色18直播在线| 亚洲精品aa久久伊人| 97干日韩| 一级一性爱免费视频| 久久色激情一区二区三区| 日韩肏逼视频| 春色校园综合网| 国产和美国毛片| 日韩丰满熟妇| 欧美综合网站999| 色婷婷综合网| 97超碰日韩| 免费看美国人人爽,人人操| 97国产精品| 亚洲另类色图片| 三级日韩一区二区三区| 91殴美大片| 色嗨嗨在线| 啊啊啊好疼| 91丨九色丨东北熟女| 午夜精品久久久久久久久久久久久 | 亚洲色图久久成人| 2025年A片视频精品| 男人的天堂VA在线| 中文操嬖片。| 亚洲综合色在线| 五月综合久久| 被窝影院午夜看片无码| 亚洲日韩乱码中文无码蜜桃臀网站| 黄色AAAAAAAAAAA大片| 99啪啪| 国内精品久久久久影院亚洲| 骚女天天综合网| 东北女人| 婷婷亚洲色| 被窝影院午夜看片无码| 99国内熟女露脸视频| 九九性视频| 五月丁香六月综合缴清无码| 亚州色阁| 夜夜一区二区| 亚洲精品一区二区日本| 久湿久久 | 中美日韩毛片| 色一色综合网| 青娱乐淫乱1314| 精品二区三四区五电影 | 亚洲男人在线观看天堂| 男人天堂久久精品| A级国产欧美激情在线| 道久久五香丁月婷婷激情综合| 国产又色又爽又舒服的三级视频| 色综合一区二区三区| 精品美女久久一二三| 国产精品美女久久久久AⅤ国产馆| 日本黄色天堂| 麻豆AV一区二区| 国产综合操逼高清| 国产高清午夜成人在线观看| 韩国毛片一区二区三区| 亚州色图第三区| 男人a天堂手机在线版| 搡老女人老91二区| 97se综合| 久久亚洲不卡一区二区三区| 波多野结衣之双飞调教在线播放| 美女网站黄页| 96AV久久久| 思思热在线观看| 91在线超高颜值国产| 东京热男人的天堂| 亚洲精品国产熟女久久久| 激情文学欧美| 凹凸视频特色日本特黄| 成人麻豆av电影网站| 国产一区二区二区按摩精品啪视频| 亚洲久久东京热一二三四五区视频| 欧美超碰9798| 99天堂网| 91动漫操逼视频| 亚洲 自拍偷拍 欧美| 亚洲精品久久久久久久蜜桃臀| 级品肉射| 国产原创精品| 岛国免费黄色网址| 国产粉嫩蜜臀av一区二区三区| 超碰97国产欧美| 福利大香蕉| AV天堂丝袜| 97中文超碰| 嗯嗯啊在线视频| 99精品久久| 人、人、摸,人、人、草| 亚洲精品国产熟女久久久久久| 国产97av| 国内毛片四区| 天堂精品| 久久精品无码不卡| 亚州欧美综合| 久久久免费视频18| 97超碰天天| 少妇人妻精品| 9热9热综合网| 免费看污网址| 97香蕉人人乳| 国产青视频| 久草婷婷| 啊啊啊啊啊啊啊好爽不要| 久草综合京东| www.操| 久久伊人网视频一区二区三区| 嗯嗯啊啊亚欧精品| 精品无码一区二区| 成人在线视频二区| 91黑丝少妇| 大香伊人在线一区| 91n美女视频| 嫩草伊人久久精品|