亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
国产小u女在线观看| av天堂电影网| 亚洲激情视频| Julia在线播放亚洲久久| 欧美在线视频播放| 97任你吞精| 亚洲综合在线第一页| 99视频内射三四| 日韩射图| 男人兔费天堂| 日韩乱伦AⅤ| 欧美色图成人网一区二区 | 日本免费一级AAA大片器| 国产欧美日韩女同性恋ww喷水精品| 美欧色综合| 四虎永久在线精品免费网址| 国产精品露脸在线观看| 加勒比五月天| 九九热九九| 午夜超碰| 熟妇色99| 色五月婷婷网| 国产精品不卡一区二区三区av| 97精品久久久久中文字幕| 蜜乳成人AV| 色玖玖| 亚洲吊色| 亚洲精品官网在线观看| 一区二区三区 丝袜 高跟 美腿| 91久久国产精品| 欧美系列在线一区二区| 60秒不遮不挡| 99热超碰在线| 国内亚洲精彩视频在线| 国产精品人妻熟女aⅴ| 92人人操人人| 97碰碰日本乱偷人妻中文的| 少妇大屁屁| 欧美 色 亚洲| 屁屁影院一区二区三区国产| 五月婷在线| 精品一二三区女同| 国产精品日本无码A片| 亚洲在线网站| 东京热一区二区中文字幕| 国产一级做a爰大片免费久久| 国产精品白领在线观看| 精品亚洲天堂| 东北操逼| 日韩电影在线观看网址| 亚洲宅男天堂| 精品超碰国产| 自拍第一页| 国产高清成人传媒影视| 干超碰碰熟女| 中文字幕av一区二区三区人妻少妇 | 日韩中文字幕人妻视频| 91精品人妻| 人妻天堂综合网| 91啪啪视频| 嗯啊啊啊轻点视频 | 91九九| 久久99国产综合精品女同| 欧美一区91大爱| 五月天色图| 日日骚精品视频| 久久亚洲熟妇在线视频| 久久99精品视频| 色与欲影视天天看综合网| 欧美亚洲另类在线蜜桃| 9丨久久九九九| 久久婷婷色综合一区二区三区| 极品粉嫩一区二区| 亚洲综合成人网| 青青国产精品在线| 日本高清免费一本视频在线观看| 日韩射图| 自拍视频大全亚洲专媒视频/一区二区三区 | 国产精品一二三区福利| 日本三级网页| 欧美色图97| 日韩美一区| 最新中文字幕精品在线| 国产97在线视频| 97精品综合久久网| 欧美性,亚州色| 26uuu国产免费观看| 超碰精品日韩欧美国产| 亚洲欧美日韩偷拍色图| 午夜视频久久久| 啊啊啊啊嗯嗯嗯用力好爽| 脫衣舞一区二区三区| 91在线观看,天天综合| 成人黄页| 国模精品一区二区三区苹果色戒| 婷婷丁香激情| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 另类图片综合| 狠色婷婷久久一区二区三区_| 97色色色综合网站| 国产污视频麻豆传媒一区二区 | 亚洲无吗在线视频| 亚州精品人妻一二三区| 亚洲AO在线| 久久婷婷视频| 婷婷综合| 精品久久99| 狠狠色婷婷| 国产一区二区av综合| 人人妻人人玩人人澡人人爽| 少妇天堂| 大香蕉伊人75| 超碰97欧美| 成人在线午夜视频一区| 亚洲日韩97| 久久综合av| 视频二区熟女人妻| 俺也射| 久射吧| 97国产精品久久久久 | 中美日韩毛片| 欧美日韩插逼视频| 婷婷色色五月天福利| 超碰在线一区二区三区| 超碰九区| 黑人猛交| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 麻豆区99999| 北京美女一区二区| 天天干天天插| 强奸乱伦大香蕉网| 无码天天操| 强奸乱伦大香蕉| 日日夜夜精品| 久久精品色欧美aⅴ一区二区| 国产精品午夜高潮呻吟久久av| 亚洲性爱免费电影| 亚洲成?V人片在线观看福利| 精品国产91内射久久| 综合av影片| 大香蕉一区二区在线观看.| 91看黄片| 欧美精品自慰系列寂寞少妇| 99啪啪| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 日韩中文字幕国产| 六月丁香啪啪| 深爱五月天| 人妻熟妇久草在线| 国产精品女同| 中文字幕日韩精品久久| 色五月天AV| 久久久国产精品亚洲精品| 欧美熟女丝袜| 玖玖无码超碰| 欧美夜夜草视频| 欧美日本中字另类在线| 蜜臀少妇一区二区| av亚洲天堂资源网站| 品亲网欧美品亲网| AV色女综合| av毛片aaaaa免费看| 国产成人 综合亚洲 天堂| 精品人妻一区二区视频| 精品无码久久久| 91中文精品日韩欧美在线| 亭亭在线资源| 欧美国产精品久久九九| 日韩激情啪啪| 偷拍超碰| 综合网天天| 家庭乱伦国产| 精品四五区| 热的中文 热的有码 热的国产| 午夜在线播放| 精品超碰国产| 黑人与人妻| 午夜爽爽爽| 成在线人在线观看视频| 国产AV人人 夜夜人人澡| 九九九只有精品| 日韩丨制服丨中文|在线| 欧美亚洲宗合色性图| 94色色电影网| 日韩精品中文字幕二区| 麻豆成人av| 丁香五六月啪啪| 六月激情婷婷| 亚洲第一二区另类图| 青操影院| 日韩电影天堂视频一区二区| 一起草三级AV电影在线观看| 校园春色之综合网| 99999国产| 丝袜剧情| 黑人与人妻| 精品午夜福利导航| 最新欧洲欧美日本激情网站| 97色欧洲| 色爱三区| 天天大干大香蕉| 久久无码一区二区二三区性色| 三级三久久线久久99久目本WW| 日韩av三四区| 啪啪啪综合网| 婷婷国产精品九区| 五月丁香六月综合缴清无码| 蜜臀AV一区二区三区激情综合| 激情综合 婷婷五月 红杏| 国产一级特黄大片处女| 欧美色997| 亚洲性综合| 亚州国产成人精品女人久久| 国产精品干干干| 91美女视频在线| 秋霞网无码| 按摩中文字幕| 久久这里只精品免费福利| 欧美黄页在线| 黄色免费一级在线毛片| 天天亚洲综合| AV色图| 婷婷超| 欧美91网站| 91啪9色| 九九英色视频| 极品内射| 97热视频在线观看| 操逼操逼视频操逼| 成人片视频| 美女的肌被草喷水视频| 伊人嫩草| 蜜桃精品一区二区三区ww| 深喉吞精| 九九人妻| 欧美激情激情xxxx欧美专区| 两性综合网| 插入逼91| 久久精品99久久久久久| 超碰97玖玖爱| 午夜福利视频在线一区| 就去色综合| 九九九九久久久| 欧美高清18A片| 97AV在线观看| sss视频华人在线| 五月丁香六月综合缴清无码| 日韩精品熟妇| 草莓精品视频在线免费观看| 中国乱伦一区二区| 偷拍视频青青草在线视频| 国产精品交换一区二区| 国产无码精品成人| 欧美后入式| 亚洲精品视频在线| 国产高清视频无码在线| 国内一级精品| 国产乱弄免费在线视频。| 综合色99| 中文字幕99999| 精品人妻中文字幕4399| 蜜桃久久久久久久久久久久| 久久九九99| 老熟女乱伦片| 97久久国产亚洲精品超碰热| 四虎AV无码| 婷婷色色五月天| 亚洲丝袜天堂| 久久老子无码午夜伦不卡| 亚洲无码精品AV久久久| 狠狠躁久久躁| 大香蕉欧美日韩| 丁香六月婷婷久久综合| www.伪伪| 日本操逼视频免费| 天天射天天色成人| 人人妻人人爽一区二区三区| 国产av尤物| 国产强上视频在线观看| 天天爽天天爽| 国产精品国产| 中文字幕aⅴ在线视频| 好看的91视频| 欧美丝袜91| 国产老熟女| AVE乱伦| 传媒免费一区二区三区| 在线国产福利网址导航| 蜜臀久久久99久久久久 | 日韩av无码网站| 99色婷婷中文字幕乱色| 色在线综合| 九九九九九九亚洲| 亚洲国产中文字幕| 欧美日韩国产色图在线| 久久精品国产AV一区二区三区| 亚洲精品国产拍免费91在线| 99久久久| 超碰国产精品无码| 操死我干死我| 欧美色视频在线| 亚洲色交| 97视频免费播放| 国产天天看| 色五月激情网| 在线一道啪| 人人操人人色网| 亚州欧美色图| 国产69精品久久久久99尤物| 黄色十八禁| 婷婷五月天社区| 久久视频,这里只有精品| 91美女在线看| 一区二区三区成人| 嫩草黄页| 久草加勒比一区在线| 97天天综合网| 天天看综合网| 国产精品一区二区麻豆| 免费啊啊啊| 亚洲精品久久久久久| 九九综合久久中文字幕| 国产精品不卡一区二区三区av| 婷婷人妻激情| 黑人精品欧美一区二区蜜桃| 国产情色第一第二页在线观看| 久久久熟妇熟女国产| 久久天天性久久伊人| 久久麻豆一区二区| 亚洲激情AV| 久久人妻办公室视频| www.99在线| 三上制服丝AV| 久久久国产护士丝袜美腿一| 亚洲影视综合| 欧美激情总合网| 亚洲古典另类欧美在线| 精品夜夜澡人妻无码| 97中文超碰| 中日韩久久人妻一区二区| 日日夜夜模| 操久久久久| 亚洲色图亚洲| 午夜精品久久久久久久99蜜桃一| 最新欧洲欧美日本激情网站| 精品超碰中文在线| 1000午夜黄色| 亚洲综合999| 中文字幕乱码人妻二区三区| 日韩欧美字幕亚洲一区二区| 大奶啊啊好爽| 97久久超碰日韩精品| 天天干人人看综合| 岛国艾薇凹凸视频天堂| 九九热精品在线| 国产av色网| 91在线视频国产网站| 日本东京热加勒比久久| 欧美 亚洲 偷拍自拍| 99精品在线| 久久精品老司| 亚洲中文sv| 中文字幕美女91| 无码丰满熟妇一区二区浪潮AV| 久久免费精品视频免一| 国产精品情侣啪啪| 肥佬影院91| 青青草九九九九九| 欧美日韩亚洲天堂网| 综合夜夜| 台湾佬激情综合| 国产91 丝袜在线播放| 少妇高潮九九九九| 欧美亚洲高清晰| 亚洲无码视频免费在线观看网址!| 欧美三级免费伊人| 91国产操逼视频| 亚洲色图大香| 国产精品久久久久久久久久久久久久| 日韩成人色图| 美女性91| 亚洲日本韩国极品一区二区| 婷婷人妻激情| 物业黑人 AV一区| 欧美一区二区情色| 特级丰满少妇一级AAAA爱毛片| 91美女视频| 一区二区三区激情在线观看| 91九九九小逼| 九九热精品视频六| 操我啊啊啊啊啊| 亚洲欧美日韩制服另类| 一区二区三区四区色图| 亚洲无码?第一页| 一区二区三区四区色图| 中文熟女五十乱码在线| 男女激烈网站最新| 亚洲天堂日本| 日韩精品免费高清视频在线| 91成人在线| 操婢日韩| 欧美色日本| 97无码视频在线播放| 夂久色| 久久久久久久久9| 你懂得91| 91爱啪| 中国女人内射6XXXXX| 久久综合久色欧美综合狠狠| 久久精视频美日韩在线视频| 午夜经典| 久久婷婷一区二| 婷婷爽人人婷婷爽视频| 亚洲欧洲美腿丝袜| 久久久99免费| 天天干人妻| 国产久久av| 国产自产22区| 亚洲欧美国产其他二区| 玖玖蜜臀资源网| 日本综合色图| 神马久久午夜| 青青草黑寡妇男人天堂| 亚洲精品三区在线观看| 久日综合网| 丁香五月婷婷啪啪| 天天日天天干少妇日| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 秋霞蝌科网日本一区| 9长久久精品| 男人天堂黄片| 人妻天堂三区| 久久99精品视频| 久草免费福利在线播放| 日本国产亚洲一区在线观看| 亚洲成人黄色在线观看| 欧美超碰97| 中文字幕视频免费| 91美女高潮| 开心激情婷婷| WWW操逼| 中文熟女五十乱码在线| 天天插天天插| 青青伊人这里只有精品| 亚洲天天自拍| 亚洲美女 晚间男人天堂 | 青青操在线视频| 欧美九九99久久精品| 可以免费观看的日韩av毛片| 91女优在线观看 | 国产精品麻豆成人AV艾秋| 欧美综合第一页| 国产18精品亚洲精品| 人妻精品视频一区二区| 日本色色网| av资源在线播放天堂| 日韩AV片| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 日韩黄色av中文字幕| 欧美日韩222| 欧美成人一区二区三区在线播放| 亚洲精品97| 亚洲在钱| 啊操爽品善一区二区三区| 色爱三区| 人人操,操人人| 91bbb| 黄色片G G G| 亚射在线| 久久综合18p| 国产一区二区欧美日本| 伦伦成年午夜免费视频| 97干97色| 智利AV在线网| 9999亚洲精品| 日本丝袜美腿人妻九九| 99999国产| 久久久青青草| 大香蕉99999| 无码一区二区精品视频久久久春药| 国产懂色精品国产av| 日韩一级二级三级免费看完整版| 色香色欲天天综合网天天来吧| 国产日韩在线播放av| 99久草| 啊啊啊啊啊舒服| AV丝袜东京热| 91路www| 久久熟妇五十路一区| 高清不卡国产| 亚州操操穴网| 岛国小电影| 亚殴在线| 肥臀熟女福利视频一区二区| 歐美一級亂黃99在綫精品| 婷婷五月丁香五月| 99ri在线视频| 亚洲人妻一区二区三区| 国产九月婷婷| 亚洲美乱| 上床不卡网站| 激情自拍 校园春色| 天天天干977| 毛片一区二区| 亚洲国产一级中文综合久久天堂在线免费观看 | 一本一道vs波多野结衣| 国产强奸乱伦xd| 久久欲| 午夜一区二区三区国产| 欧美性爱中文字幕无线码| 国产精品欧美日韩久久| 成人性爱av.com| 亚洲成人av电影在线| 操逼视频亚洲| 自慰白浆在线观看| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 9999久久久久| 婷婷丁香五月激情啪啪| 国产剧情在线| 内射中国少妇高清视频免费视频| 狠狠爱夜夜| 嗯~啊~快点 死我视频免费看网站| 天天舔天天日天天射| 男人的天堂日韩| 九九热精品| 97超碰久久| 91丨国产丨白浆秘 洗澡动漫| 午夜亚洲国产理论秋霞| 黑人精品成人一区二区三区 | 91黑人狂躁丰满熟妇| 97免费在线| 大香蕉视频一二三区| www成人啪啪18秘 免费| 91亚洲不卡一区| 日韩不卡网操逼中文字幕日韩| 欧美色道啊| 97视频播放| 欧洲在线性爱视频| 青青草黑寡妇男人天堂| 久九干| 另类小色呦| 超碰在线人妻中文字幕| 九九九九九用不成了| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲精品性爱片| 97任你吞精| 天堂av2019| 精品一久久久| 97久久国产精品女不卡| 亚洲另类欧美精品| 717影院理论午夜伦八戒| 天天综合网国产| 射欧美综合| 超碰偷拍| 欧美高清18A片| 久久丁香五月婷婷| 欧美一二在线| 国产久久久久久| 素颜老阿姨乱情色| 亚州欧美一区| AV色五月天| 91色综合色| 屌妞视频久久久久久久久久久久| 中文字幕一区二区三区四五区| 成人乱人伦一区二区| 黄片直播三级黄片两女一男| 欧美日韩222| 欧美色蜜桃97| 国产又黄又粗又猛大片| 久操精品网| 亚洲偷91色| 欧美日韩另类激情图片| 亚洲av无码国产精品字幕| 天天91~综合入口| 久久网亚洲| 萌白酱自拍视频| 少妇天堂网络| 日韩兔费看黄片| 精品久久久久久亚洲| 黄站在线免费观看| 中文字幕中文字幕一区二区| 亚洲天堂人人妻| 国产又粗又大硬免费色网视频| 无码免费一区二区三区啪啪| 九区国产| 91欧美大片| 国产偷人伦激情在线观看| 亚洲一卡二卡在线免费| av天堂5| 天天天干977| 欧美最大综合网| 国产中文字幕在线点播| 久久侵犯人妻爽爽爽| 青青青艹在线视频| 正在播放国产精品一区| 欧美日韩黄色片一区二区三区四区人与兽做爱| 69一区二区| 激情丁香五月婷婷| 风韵犹存大大大大香蕉 | 91岛国动作片| 夜夜操狠狠操| 人妻熟女一区二区三区视频| 五月天婷婷色色| 人妻激情视频| 操比国产| 欧美78P| 蜜臀久久一区二区| 亚洲精品国产日韩无码AV永久免 | 骚货 中文字幕 av| 日本片日本片祼观看网站在线看中文版网页在线看 | 性爱1区| 欧美五区| 热热色中文无码| 综合网,亚洲,欧美| 激情综合网激情综合| 日韩欧美女优电影| 91天天| 欧美激情 日韩精品| 91东京热男人的天堂| 日韩午夜国产| 亚洲精品中文字幕一区在线视频 | 亚洲亚洲亚洲天堂天堂| 天天综合有色网| 欧美一级美片在线观看免费| 丰满人妻一区二区三区四区| 黄色高清无码无码破解免费暗网| 蜜色网色哟哟| 人妻精品一区一区三区蜜桃91| 日韩精品人妻中文字有码在线 | 蜜臀久久99精品久久久久久酒店| 国产最火爆久久国产网站网站| 国产精品久久久久久片| 欧美综合色站| 狠狠躁伊人中文字幕| 免费看黄视频亚洲网站| 国产少妇与亚洲av| 国产AV人人 夜夜人人澡| 清纯唯美激情| 久久草大香蕉| 欧美黑人168页欧美黑人167| 操高情无码| 伊人久久大香蕉线AV五月天| 人妻三级在线中文字幕| 五月丁香婷婷色| 九九热只有精品| 两性色网| 国产精品69久久久久久久| 免费精品人妻一区二区三| 超碰 另类 欧美| 豆花视频操逼网址| 极品内射| α√在线| 久久啊啊啊| 久久精精区一区二区一蜜桃一区二区| 一本色道久久综合亚洲二区三区| 黄色电影观看久久9| 美女丝袜激情小说| 久久久久久AV无码免费网站| 久久9免费视频| 日韩不卡毛片Av免费高清| 呻吟 欧美 日本 中出| 九九干| 久久九九热| 97操操| 精品无码欧美三级| 另类 综合 日韩 欧美 亚洲| 国产精品久久久| 欧美日韩大陆黑人少妇99| 久操com| 91在线观看,天天综合| 青青青操| 国产精品无码论坛| 99久久99久久免费精品蜜臀| 亚洲精品欧洲精品| 亚洲综合在线视频| 亚洲国产91精品一区二区久久| 久久9999| juliaann精品熟女一区| 亚洲第一无码播放立川理惠| 97超碰这里只有精品| 久久精品超碰| 欧美婷婷久久| 丝袜剧情| 亚洲成aⅴ人片不卡无码| 亚洲大色堂| 猛交交| www欧美性爱| 亚洲成人日韩小说| 91 偷| 亚洲日本大香蕉1| 69视频福利导航| 91xingse| 人妻激情另类| 欧美一区二区三区成人性生活| 国产精品福利资源在线尤物| 伊人嫩草| 日韩无码服务区| 中文字幕十五区| 欧美精品 - 91爱爱| 九九热九九热| 国产玖玖| 久都青青视频| 尻女朋友一夜| 黑丝少妇麻豆| 真实高潮91| www久久久| 国产乱伦性爱区| 欧美激情性久久久久久| 久久 精品| 高潮精品| 精品久久无码午夜福利| av亚欧| AV麻豆免费一区| 美女午夜福利免费视频| 日韩亚洲中文字幕在线| 精品一区二区国产日韩| 国产成人精品必看| 双插性欧美一二三区| 国产欧美日韩精品中文| 立川理惠无码一区二区| 日本欧美国内在线| 国产性爱欧美性爱在线 | 亚洲欧洲自拍图片专区满春格| 一级一性爱免费视频| 最新国内自拍av免费| 岛国黄色短视频| 9色在线| 久久精品免费| 欧美 亚洲精品首页| 亚洲中文字幕有码视频一区二区三区| 欧美日韩国产三级黄色| 日韩欧美天天爽爽爽天天爽爽| 久久久久久十| 神马久久久久久伦理片| 久久久久13| 欧美se亚洲| 欧美一品道| 男人的天堂com| 97免费视频在线观看| 久久精品亚洲婷婷| 欧美丝袜美女电影一二三四区| 嗯嗯嗯啊啊在线观看| 日韩无码服务区| 丁香婷婷激情五月天无毒不卡 | 天堂在线一区二区| 神马久久啊啊| 97欧美日韩综合| A级国产欧美激情在线| 久久精品国产亚洲AV片多多| 殴美,日韩国产伦精品| 四虎影视永久在线观看精品免费网站 | 日本人体九九九九九九| 亚洲加勒比久久日本道| 新精精品久久精品| 欧美极品美女aaaaaa级黄片| 大伊香蕉在线视频免费| 色啪网| 日本男人插女人的逼黄色| 九九九偷拍| 国产日逼视频| 婷婷亚洲天堂| 久久久久久免费电影| 婷婷去俺也去六月色| 天美传媒av 在线| 在线观看啊啊啊啊啊| 久久黄片国产一区二区| 99啪啪| 999色欧美中文字幕| 啊啊啊97视频| 日韩成年人性爱视频| 激情综合五月丁香| 猛猛干| 吻戏激情性巴克| 亚洲综合在线91| 91人妻Pr| 亚洲资源一区| 婷婷丁香六月天| 91精品久久久久久久久久| 99re国产精品视频| 成人在线午夜视频一区| 夜嗨影院| 极品人妻少妇综合| 91n处女在线观看| 乱伦一区二区三区‘| 久久久久久亚洲精品中文字幕人妻| 精品日韩| 日本大片日本一区二区免费高清 | 日少妇视频| 天天摸夜夜摸| 亚洲暴力强奸AV| 欧美亚洲影视| 久久精品美女一区| 综合色区偷拍| 成人日韩中文字幕| 国产人伦a片信息免费片| 99日视频在线免费| 成人AV素股で擦久久| 人妻干天天| 超碰97在线 欧美 国产| 国产成人 综合亚洲 天堂| 欧美性天天影院| 欧美一级三级| 国产1024在线播放| 91 丝袜在线观看| 91久久久久久| 神马麻豆福利院| 久久成人午夜狠狠| 麻豆伊人网| 久久极品一区二区| 国产亚州精品美女久久久免费| 国产农村妇女精品| 大香交| 91影视亚洲| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 水澄无码AV| 91在线超高颜值国产| WWW.加勒比人妻一区不卡.com| 色婷婷激情| 熟女视频久久| 大香蕉免费乱伦视频| 探花一区二区三| 99夜夜操| 日日骚av| 欧美最婬乱婬爆婬性视频 | 激情丁香五月| 婷婷丁香在线| 在线可观看的黄色网址| 人人摸.人人色| 97啪啪| 97超碰精品图片| 精品人妻一区二区三区视频| 激情终合网| 欧美色997| 午夜啊啊啊| 天天天天天天天天综合| 性爱欧美五月| 一二三四视频在线社区中文字幕| 国产吹潮女在线观看| 东北女人av| 99黄页网站| 蜜臀aV午夜一区二区三区| 日1区2区3区2020| 蜜臀网 一区| 91视频精品| 爱爱60秒免费视频| 丰满少妇一区二区三区专区| 男人网站婷婷| 天天欧美| 亚洲1区2区三区高清中文字幕| 丰满人妻一区二区三区在线| 欧美大色交| 亚洲天堂精品日韩电影| 亚洲另类小说卡通动漫| 99热婷婷| 久久久久久人妻| 大香伊人在线一区| 一本大道青青| 五月婷婷丁香六月丁香| 天天做天天爱天天高潮| 99热精品国产| 狠狠操使劲操| wwwss在线观看| 欧美大香蕉卡久久| 麻豆精品.欧美精品.日韩精品.| 18禁精品网站在线看| 内射黑人| 五月丁香六月综合缴清无码| 美女刺激久久国产欧美| 97欧美色| 伊人黄色视频免费观看| 天天日天天操VV| 久久国产成人精品国产成人亚洲| 美女被艹尤物视频| 99re6国产精品99re| 蜜乳AV免费观看| 高树玛利亚无码流出| 久久无码精品| www狠狠| 亚洲欧美国产精品久久久久久久| 影音先锋国产精品| 97精品久久久久中文字幕| 不卡中文字幕aⅴ在线| 少妇高潮99p| 日产操逼| 级品肉射| 3d成人精品一区二区| 在线视频一区二区传媒| 色狠狠一区二区三区香蕉| 国产h片在线观看视频| 久久视频,这里只有精品| 国产对白刺激视频| 九九这里只有精品| 亚洲中文字幕网| 欧美综合自拍亚洲综合图| 在线播放成人高清免费视频| 大香蕉在线视频重口味毛片在线| 蜜乳Av成人片网站| 人人噜夜夜操| 国产女人成人精品视频| 美女好片色日本| 天天操天天射青青草| 岛国片在线播放| 亚洲日韩狠狠撸视频| 日韩熟妇二区| 色妇综合网| 精品97精品97| 99999无码| 亚洲第一成人影院色播| 亚州综合色| 噜噜噜久久亚洲精品色情| 亚洲古典另类欧美在线| 九九九九AV| 97在线青| 中文高清一区二区的| 中文字幕性感少妇av| 国产一区二区成人av在线播放| 精品国产91内射久久| 欧美桃色网| 97人人爱人人做人人乐| 久久久草成人网站久久久草成人久久久草久久久 | 国产AB视频| 丝袜喷水在线| 中文字幕二区日韩天堂| 久久伊人大香蕉| 免费A V在线播放| 国产大陆天天艹| 被男人吃奶很爽的毛片| 欧美综合狠| 色诱avtt| 91黑丝在线播放| 成人性爱全视频观看| 国产精品网址| 五月丁香六月综合缴清无码| av亚欧| 八戒无码国产午夜福利| 成人无遮挡毛片免费看| 久久精品久久九九精品| 中文字幕高清精品一区| a片久久久久久久久久久久| 精品性爱| 97免费在线视频| 国产久久久久久| 亚洲色图欧美色图另类图片| 精品免费囯产一区二区三区| 天天射日日干| 久久性爱视频免费看| 精品欧美老熟女一二区| 强奸抽插av| 亚洲欧美色图片| 青娱乐二区免费| 欧美αv.com| 日本性爱不卡视频| 欧美大香蕉卡久久| 91久久久视| 欧美另类天堂| 国产丸一视频| 国产二区三区免费视频| 亚洲综合另类小说色区亚洲成av人片在www | 久草婷婷| 天天爽夜夜欢视| 久久精品一区一起草| 精品9999| 2017人人操,人人摸| 日本操逼视频不卡直接放| 亚洲国产麻豆一区二区三区| 亚洲精品亚洲人成人网| 粘花网06av视频| 久久成人网站| 色婷婷视频| 蜜色网色哟哟| 色777999综合| 最新av中文字幕高清| 啪啪啪综合网| 欧美与日韩97| 成人精品久久久午夜福利| 狠狠操狠狠插| 亚洲av资源| 久久五十路熟女人妻| 欧美日韩国产中文精品字幕自在自线,| 2000亚洲男人天堂| 国产捆绑一区| 亚洲一区二区三区久久 亚洲一区二区| 狠狠做深爱婷婷久久二区| 78精品| 偷窥自拍亚洲色图| 99国产精品| 九九精品热| 亚洲97精品| 91色鬼| 午夜a成v人电影| 加勒比综合九九99视频在线播放| 午夜福利国产欧美日韩夜夜| 一区二区 日韩 欧美 国产 传媒| 免费成人在线观看91| 日本人妻A片成人免费看片| 一本一道久久综合久久| 殴美大黄片| 精品国产乱码久久久久久久| 2025亚洲男人天堂| 丰满人妻aA一区二区三区| 人人澡综合涩| 性色生活片久久毛片婬片免费放女人一级毛片 | 久久久久免费少妇| 天天射天天操天天干天天吃2018| 日韩天堂av电影在线观看| 亚洲密乳AV| 亚洲天堂久| 懂色AV一区二区三区| 中文字幕高清精品一区| 亚洲一区二区 麻豆传媒| 综合欧美日本三级| 亚洲自拍97| 91国精产品| 国内精品999| 欧美麻豆成人同性GⅤ在线| 欧美亚洲厕所精品偷拍91| a在线视频免费观看| 国产自制av蜜乳| 97在线亚洲| 亚洲中文字幕妇伦久久| 丰满人妻一区二区三区免费 | 久久久久久九九九| 亚洲中文字幕久久无码精品| 簧片免费看视频| 嗯嗯嗯啊啊啊操的我好爽| 老司机免费视频在线91| 成人性爱全视频观看| 久久精品久久久久久久| 青青草无码视频| 一级性爱aaaa| 国产女同视频在线播放| 国产一区在线播放| 色哟哟AV| 99re在线精品78| 日本91白丝| 天天日日日射| 日本一区二区电影网站| 精品一区二区成人动漫| 日韩av一级黄片| 国产 热久久久久国产精品| chaopen97久久| 亚欧美色图| 加勒比性爱成人在线| 神马久久啊啊| 国产精品天干天干综合网麻豆 | 天天做天天爱天天爽| 五月色综合| 一二三四视频中文字幕在线看| 国产成人一级av88| 亚洲欧美精品福利在线| 99色婷婷| 国产精品视频播放| 人妻无码久久一区二区三区免费| 99999精品成人| 一级黄碟| 国产精品白丝AV| 我爱操| 火箭成精品视频884必出精品| 99久久国产精品免费高潮| 国产亚洲日韩欧| 美国一区二区免费视频| 久久9视频| 国产视频一区二区在线观看| 丝袜美女诱惑 91 视频| 久久黄黄黄| 国产黄色小视频网站| 亚洲无吗在线视频| 99热自拍| 伊人久久亚洲色欲综合网站| 加勒比海人人操超碰在线| 亚洲精品九九九| 91free福利| 嗯嗯,好大,好爽,好骚| 久久精品一区一起草| 欧美一区二区一级岛国大片| 婷婷五月天丁香花| 亚洲激情色片| 夜夜欢天天干| 激情综合二| 伊人色综合超碰| 精品999一区二区| 国产免a费看黄片在线| 97精品国产97久久久| 欧美洲精品一级| 日日不卡av| 亚洲AV无码国产精品久久久久| 欧美性区| 99精品无码| 亚洲精品一区二区三区在线播放| 久久亚洲天天做| 超碰2017| 欧美性区| 无码精品一区二区三区潘金莲| 精品97精品97| 亚洲激情综合另类男同| 超碰资源亚洲97| 久久成人精品| 亚洲蜜桃V妇女| 91精品在线播放| 色综合国产在线观看| 成人无码专区精品视频| 吖在线不卡一区二区国产剧情 | 欧美性爱视频免费一区一A| 亚洲视频一二区| 无码av永久免费专区网站| 日韩少妇在线视频| 亚洲成人精品在线一区| 欧美亚州综合图片| 精品无码久久久久久久杏吧| 亚洲精品819| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 9久9久| 人妻人人操| 蜜臀久久99精品久久久久久无删减| 啊啊啊用力在线观看| 97综合在线| 色色五月婷| 大香蕉中文在线| 六月丁香五月婷婷| 日韩成人性日韩成人性爱视频在线免费观看| 国产AV天美| 手机在线A片| 精品国产Av无码久久久伦古装| 亚洲国产精品久久久久婷婷老年| 久操视频在线| 亚洲成人ab| 后入式在线免费观看60秒| 91在线无码精品秘 软件| 亚洲资源站| 久久成人午夜狠狠| 男人亚洲91首页在线| 欧美在线永久天堂| av三级电影在线播放| 国产成人精品一区| 天天碰操中国年青熟妇| 五月婷婷六月丁香| 大香蕉啪啪网| 密乳视频在线| 淫荡网址| 熟女探花啪啪| 91丝袜视频在线观看| 国产乱弄免费在线视频。| 蜜臀少妇一区二区| www.狠狠操| AV网站高清无码在线观看| 色吊丝 日日骚 清纯唯美| 亚洲AV色图一区| 大干人妻| 青久操| 曰韩香蕉97| 九九九九九九九九九九九九九九九女| 老司机射| 探花激情视频| 欧美亚洲玖玖玖| 影音先锋日本乱伦| 2021国产成人精品久久| 色色毛片| 91亚洲色人| 草草网站影院白丝内射| 亚洲成人福利电影免费|