欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

Java在線音樂播放系統(tǒng)實(shí)戰(zhàn):從流式播放到接口設(shè)計(jì)全解析

Java在線音樂播放系統(tǒng)實(shí)戰(zhàn):從流式播放到接口設(shè)計(jì)全解析 寫這篇東西之前我先說個(gè)背景。很多人在學(xué)校、公司內(nèi)部或者接私活的時(shí)候碰到過類似的需求——做一個(gè)“基于Java的在線音樂播放系統(tǒng)”。看起來是個(gè)老掉牙的題目網(wǎng)上相關(guān)的項(xiàng)目源碼也一抓一大把但真正自己動(dòng)手做一遍或者在原有代碼上改一改就會(huì)發(fā)現(xiàn)這里面坑不少音頻文件怎么存、播放進(jìn)度怎么續(xù)傳、歌單和歌曲的關(guān)系怎么不寫成一團(tuán)亂麻、多端訪問時(shí)接口怎么設(shè)計(jì)才不打架。這篇文章不打算講那些網(wǎng)上抄來抄去的理論而是拆一個(gè)我實(shí)際帶過的項(xiàng)目基于 Java 的在線音樂播放系統(tǒng)從需求分析、表結(jié)構(gòu)設(shè)計(jì)、后端接口實(shí)現(xiàn)到前端播放器對接再到上線前容易踩的坑一條線捋下來。適合的人群就是兩類一是馬上要做相關(guān)課程設(shè)計(jì)或者畢業(yè)設(shè)計(jì)的同學(xué)二是在公司里要做內(nèi)部音樂點(diǎn)播、語音素材管理等相似系統(tǒng)的后端工程師。廢話不多說直接進(jìn)入正題。1. 動(dòng)手前先想清楚在線音樂系統(tǒng)到底在解決什么問題很多人在寫這種系統(tǒng)的時(shí)候第一步就是建 Spring Boot 項(xiàng)目然后開始寫增刪改查。這在我看來是順序錯(cuò)了。開發(fā)這種業(yè)務(wù)系統(tǒng)最先應(yīng)該花時(shí)間想清楚的是三個(gè)前提問題而不是先寫代碼。1.1 “在線播放”和“文件下載”是兩碼事我見過很多半成品系統(tǒng)所謂的在線播放其實(shí)是把音頻文件直接塞到前端audio標(biāo)簽的 src 里然后讓瀏覽器自己下載完再播。這樣實(shí)現(xiàn)極其簡單但體驗(yàn)和后期問題都很大大文件加載慢、刷新就從頭開始、帶寬浪費(fèi)、無法做權(quán)限控制。真正的在線播放本質(zhì)上是一個(gè)“流式Streaming讀取”過程??蛻舳讼蚍?wù)端發(fā)一個(gè)請求服務(wù)端從磁盤里讀文件按字節(jié)一點(diǎn)一點(diǎn)吐給客戶端。這時(shí)候 HTTP 協(xié)議里有一個(gè)很關(guān)鍵的東西叫Range 請求頭HTTP Range Header。簡單說就是瀏覽器會(huì)告訴服務(wù)器“我不需要整個(gè)文件我只要從第 N 個(gè)字節(jié)到第 M 個(gè)字節(jié)的這段數(shù)據(jù)”。服務(wù)端如果能正確處理這種請求就能實(shí)現(xiàn)拖動(dòng)進(jìn)度條播放、快進(jìn)快退、斷點(diǎn)續(xù)傳而不是傻傻地每次從零開始傳。所以剛開始做的時(shí)候我就把系統(tǒng)的核心定位成能正確處理 Range 請求的音頻流接口。這一條確定下來后面整個(gè)接口設(shè)計(jì)都會(huì)不一樣。1.2 管理端和播放端要分離開這個(gè)系統(tǒng)的使用方看起來很簡單用戶登錄、搜歌、聽歌。但實(shí)際落地的時(shí)候一定會(huì)有“誰把歌傳上來的”這個(gè)問題。我參與的這個(gè)項(xiàng)目里最初沒人管上傳這回事結(jié)果導(dǎo)致所有歌曲都得靠程序員往數(shù)據(jù)庫里手工插數(shù)據(jù)一次插幾十條效率低不說還很容易出現(xiàn)封面路徑寫錯(cuò)、時(shí)長寫錯(cuò)這些問題。所以在設(shè)計(jì)上從一開始就要明確兩個(gè)角色管理員負(fù)責(zé)維護(hù)曲庫上傳音頻、填寫歌曲信息、管理歌手和專輯普通用戶只負(fù)責(zé)聽瀏覽、搜索、創(chuàng)建自己的歌單。這個(gè)區(qū)分不是界面上的花架子它直接決定了接口的權(quán)限分配比如上傳接口必須鑒權(quán)刪除操作必須限定角色普通用戶的接口則最多做登錄校驗(yàn)不應(yīng)該動(dòng)不動(dòng)就 403。1.3 版權(quán)和存儲(chǔ)策略不能抄網(wǎng)上的思路網(wǎng)上下載的一些源碼很多直接把歌曲文件塞到項(xiàng)目根目錄的 static 文件夾里然后數(shù)據(jù)庫存一個(gè) /static/music/xxx.mp3 了事。這在演示階段沒問題但對稍微正式一點(diǎn)的項(xiàng)目就是隱患項(xiàng)目重新打包部署時(shí)static 目錄可能被覆蓋文件說沒就沒靜態(tài)資源如果被 Nginx 直接映射出去任何人都能拼 URL 下載完全繞過了權(quán)限校驗(yàn)幾百首歌塞進(jìn) jar/war 包里包變得巨大啟動(dòng)都慢。正確的做法是把音頻文件和代碼徹底分開文件放到獨(dú)立的本地目錄或者對象存儲(chǔ)里數(shù)據(jù)庫只保存邏輯路徑通過接口動(dòng)態(tài)輸出。這一點(diǎn)我會(huì)在第 5 節(jié)專門展開講。2. 技術(shù)選型不是越新越好而是越順手越好做 Java 后端的人對技術(shù)棧通常都有一些偏好但在這個(gè)項(xiàng)目上我最終采用的是非?!皠?wù)實(shí)”的一套組合沒有刻意追新Spring Boot 2.7 MyBatis-Plus MySQL 8.0 Redis可選 Vue 3 Element Plus。2.1 后端為什么用 Spring Boot 而不是 Spring Cloud音樂播放系統(tǒng)本質(zhì)上是一個(gè)單體的中小型應(yīng)用沒必要上微服務(wù)那一套。Spring Boot 自帶內(nèi)嵌 Tomcat打包成一個(gè) jar 就能跑開發(fā)調(diào)試都簡單。用 Spring Cloud 反而會(huì)把 Nacos 注冊中心、配置中心等概念引進(jìn)來徒增部署復(fù)雜度。持久層框架我用的是 MyBatis-Plus。很多人糾結(jié)到底用 MyBatis 還是 Spring Data JPA我的看法是這個(gè)系統(tǒng)涉及比較多的多表關(guān)聯(lián)查詢歌單里查歌曲、歌曲關(guān)聯(lián)歌手MyBatis 的 SQL 寫起來可控性更強(qiáng)而 MyBatis-Plus 又把單表 CRUD 給封裝掉了不用寫一堆重復(fù)的 BaseMapper 方法。查歌單的時(shí)候稍微加一點(diǎn)注解或 XML 就能完成關(guān)聯(lián)查詢效率很高。2.2 前端是 SPA 還是服務(wù)端渲染前端我試過兩條路一條是 Thymeleaf 服務(wù)端渲染另一條是前后端分離的 Vue 單頁應(yīng)用。第一條路實(shí)現(xiàn)起來很快但播放器做交互的時(shí)候很難受頁面一刷新狀態(tài)就沒了。第二條路一開始要多寫一點(diǎn)接口對接代碼但播放列表、音量、播放模式這些狀態(tài)都放在瀏覽器內(nèi)存里體驗(yàn)好得多。如果你要在一個(gè)月內(nèi)交項(xiàng)目我不建議前后端完全分離因?yàn)檫€要配 Nginx 或者處理跨域。折中一點(diǎn)的做法是后端只提供 RESTful API前端用 Vue Vite 單獨(dú)開發(fā)調(diào)試的時(shí)候用開發(fā)代理比如 Vite 的 server.proxy把 /api 轉(zhuǎn)發(fā)到后端 8080 端口部署時(shí)再統(tǒng)一放到同一個(gè)域的路徑下這樣既不難受又能講清楚架構(gòu)。2.3 項(xiàng)目包結(jié)構(gòu)設(shè)計(jì)我實(shí)際開發(fā)的包結(jié)構(gòu)大概長這樣src/main/java/com/example/music ├── MusicApplication.java ├── config │ ├── WebConfig.java // 跨域、攔截器配置 │ └── MybatisPlusConfig.java // 分頁插件 ├── controller │ ├── UserController.java │ ├── SongController.java │ ├── SongListController.java │ └── StreamController.java // 音頻流播放接口 ├── service │ ├── UserService.java │ ├── SongService.java │ ├── SongListService.java │ └── OssFileService.java // 本地文件存儲(chǔ)服務(wù) ├── mapper ├── entity ├── dto └── common ├── Result.java └── BizException.java這套結(jié)構(gòu)不算復(fù)雜但把配置、控制層、業(yè)務(wù)層、持久層、通用類都分開了。項(xiàng)目到后期加了定時(shí)統(tǒng)計(jì)功能也只是在 service 下面加一個(gè) StatisticService不影響原有代碼。3. 數(shù)據(jù)庫設(shè)計(jì)表結(jié)構(gòu)決定后面少改多少需求這個(gè)系統(tǒng)的表設(shè)計(jì)是我花時(shí)間最多的地方。我見過很多爛設(shè)計(jì)比如“歌單里直接存一串歌曲 ID”查一次歌單要把字符串拆開來再查幾十遍。這里把邏輯完整理一遍。3.1 核心表與關(guān)系整個(gè)系統(tǒng)一共有 6 張核心表user 用戶表 singer 歌手表 song 歌曲表 song_list 歌單表 list_song 歌單-歌曲關(guān)聯(lián)表 upload_record 上傳記錄表可選關(guān)系是這樣的一個(gè)歌手可以有多首歌一對多一首歌可以出現(xiàn)在多個(gè)歌單里一個(gè)歌單也能包含多首歌所以歌單和歌曲是多對多必須用中間表 list_song 連接用戶可以創(chuàng)建多個(gè)歌單用戶和歌單是一對多。3.2 關(guān)鍵表結(jié)構(gòu)腳本下面給出一段我實(shí)際使用的核心 SQL雖然不能覆蓋所有字段但最能說明設(shè)計(jì)意圖的是 song 表和 list_song 表。CREATE TABLE song ( id bigint NOT NULL AUTO_INCREMENT, singer_id bigint DEFAULT NULL COMMENT 歌手ID, name varchar(128) NOT NULL COMMENT 歌曲名稱, cover_url varchar(512) DEFAULT NULL COMMENT 封面圖相對路徑, file_url varchar(512) NOT NULL COMMENT 音頻文件相對路徑, duration int DEFAULT NULL COMMENT 音頻時(shí)長秒, play_count int DEFAULT 0 COMMENT 播放次數(shù), status tinyint DEFAULT 1 COMMENT 1-上架 0-下架, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_singer_id (singer_id), KEY idx_name (name) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE list_song ( id bigint NOT NULL AUTO_INCREMENT, song_list_id bigint NOT NULL, song_id bigint NOT NULL, sort_order int DEFAULT 0, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_list_song (song_list_id, song_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;這里有兩個(gè)容易被忽略的設(shè)計(jì)點(diǎn)。第一song 表里單獨(dú)存了singer_id為什么不直接在 song 表里冗余一個(gè)歌手名字段因?yàn)楦枋中畔⒁院髸?huì)擴(kuò)展地區(qū)、簡介、頭像如果冗余字段以后同步更新會(huì)非常麻煩。歌手表穩(wěn)定下來之后查詢時(shí) JOIN 一下成本很低。第二list_song 表沒有用復(fù)合主鍵而是單獨(dú)弄了一個(gè)自增 id同時(shí)加了聯(lián)合唯一索引uk_list_song。這樣做的目的是避免以后出現(xiàn)“同一首歌在同一個(gè)歌單里被重復(fù)添加”的情況程序里做判斷容易漏數(shù)據(jù)庫層面直接擋住更穩(wěn)。3.3 duration 字段的重要性很多初學(xué)者做歌曲管理的時(shí)候根本不存音頻時(shí)長。這在前端展示時(shí)問題不大但做播放列表進(jìn)度條和“最近播放”功能時(shí)會(huì)發(fā)現(xiàn)沒有時(shí)長就很難展示。獲取時(shí)長并不是 Java 代碼直接能讀出來的我當(dāng)時(shí)的方案是上傳完音頻之后調(diào)用 FFmpeg 的命令行工具去探測文件時(shí)長。命令大概是ffprobe -v error -show_entries formatduration -of defaultnoprint_wrappers1:nokey1 /path/to/audio.mp3Java 這邊用 ProcessBuilder 去執(zhí)行這個(gè)命令把輸出解析成 int 秒數(shù)存到 duration 字段里。你也可以用現(xiàn)成的庫比如 jaudiotagger但碰到某些特殊編碼的音頻FFmpeg 明顯更穩(wěn)。這條經(jīng)驗(yàn)在后來處理一大批用戶上傳的錄音文件時(shí)幫了大忙。3.4 搜索查詢的索引設(shè)計(jì)用戶搜歌都是按歌名模糊搜SQL 基本長這樣SELECT * FROM song WHERE name LIKE CONCAT(%, #{keyword}, %) LIMIT 20;這種寫法在數(shù)據(jù)量小的時(shí)候沒問題但數(shù)據(jù)庫里如果有了幾萬首歌全表掃描就會(huì)變慢。我們當(dāng)時(shí)的處理是把 name 字段加了索引并且配合 MySQL 的覆蓋索引優(yōu)化查詢再往后數(shù)據(jù)量大了更專業(yè)的做法是接入 Elasticsearch但對大多數(shù)場景來說加索引已經(jīng)足夠。不要一上來就整個(gè) ES那是過度設(shè)計(jì)。4. 后端核心接口登錄、播放、歌單管理的實(shí)現(xiàn)邏輯這部分是系統(tǒng)的主干。我會(huì)挑幾個(gè)最關(guān)鍵的接口講重點(diǎn)不是說把所有代碼貼出來而是講接口的設(shè)計(jì)邏輯和邊界處理。4.1 登錄用 JWT 還是 Session考慮到這個(gè)系統(tǒng)可能有 H5 端和管理端兩個(gè)前端同時(shí)訪問用的技術(shù)棧還不一樣我選了 JWT 而不是傳統(tǒng) Session。原因很簡單Session 依賴瀏覽器 Cookie在 App 端、小程序端對接時(shí)要處理 Cookie 同步很麻煩JWT 就是一個(gè)字符串前端登錄后存到 localStorage 里每次請求放在請求頭 Authorization 里就行。JWT 的問題也同樣明顯服務(wù)端不好主動(dòng)把某個(gè) token 作廢。所以我做了一套小方案用戶登錄信息會(huì)緩存到 Rediskey 是用戶 IDvalue 是當(dāng)前 token。修改密碼或者被封禁時(shí)直接刪掉 Redis 中對應(yīng) key。這個(gè)設(shè)計(jì)簡便宜實(shí)現(xiàn)也把 JWT 最大的痛點(diǎn)解決掉了。登錄請求的核心邏輯大致是public ResultString login(LoginDTO dto) { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.eq(User::getUsername, dto.getUsername()); User user userMapper.selectOne(wrapper); if (user null || !PasswordUtil.matches(dto.getPassword(), user.getPassword())) { throw new BizException(用戶名或密碼錯(cuò)誤); } String token JwtUtil.createToken(user.getId(), user.getRole()); redisTemplate.opsForValue().set(login:token: user.getId(), token, Duration.ofDays(7)); return Result.success(token); }密碼不是明文存儲(chǔ)的而是用 BCrypt 加密。審核代碼的時(shí)候要認(rèn)真檢查有沒有人為了省事把密碼明文落庫這是紅線。4.2 流播放接口的實(shí)現(xiàn)這是整個(gè)系統(tǒng)最核心的接口我建議單獨(dú)用一個(gè) Controller 來管。實(shí)現(xiàn)流程是這樣的前端把歌曲 id 傳給后端或者直接傳一個(gè)帶簽名 token 的 URL后端根據(jù) id 查庫拿到 fileUrl后端把本地文件包裝成org.springframework.core.io.Resource通過ResponseEntity返回關(guān)鍵是處理 Range 請求頭。如果你只返回文件不處理 Range瀏覽器確實(shí)也能播但進(jìn)度條拖動(dòng)會(huì)非常遲鈍。處理 Range 的代碼我直接給出要點(diǎn)public ResponseEntityResource stream(PathVariable Long id, RequestHeader(value Range, required false) String range) { Song song songService.getById(id); File file ossFileService.getFile(song.getFileUrl()); long fileLength file.length(); long start 0; long end fileLength - 1; if (range ! null range.startsWith(bytes)) { String[] parts range.replace(bytes, ).split(-); start Long.parseLong(parts[0]); if (parts.length 1 !parts[1].isEmpty()) { end Long.parseLong(parts[1]); } } long contentLength end - start 1; InputStreamResource resource new InputStreamResource(new FileInputStream(file), start, contentLength); return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT) .header(HttpHeaders.CONTENT_TYPE, audio/mpeg) .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(contentLength)) .header(HttpHeaders.CONTENT_RANGE, bytes start - end / fileLength) .body(resource); }這段邏輯其實(shí)并不復(fù)雜關(guān)鍵是你知道有這個(gè)機(jī)制、去實(shí)現(xiàn)它。不處理 Range音頻播放“在線感”會(huì)差一大截。4.3 歌單和歌曲的關(guān)聯(lián)操作歌單接口最容易出問題的是添加歌曲時(shí)的雙重校驗(yàn)。場景是這樣的用戶把一首歌添加到歌單 A如果歌單里已經(jīng)有了這首歌應(yīng)該提示“已存在”而不是再插一條重復(fù)數(shù)據(jù)。程序上當(dāng)然可以先查一次 list_song 表再?zèng)Q定插不插但如果兩個(gè)請求并發(fā)過來還是會(huì)插進(jìn)去兩條。所以我除了加數(shù)據(jù)庫唯一索引之外插入時(shí)還用了一條 SQL 直接擋INSERT INTO list_song(song_list_id, song_id, sort_order) SELECT #{songListId}, #{songId}, #{sortOrder} FROM dual WHERE NOT EXISTS ( SELECT 1 FROM list_song WHERE song_list_id #{songListId} AND song_id #{songId} );這條語句成功插入返回 1重復(fù)插入返回 0代碼里判斷一下返回結(jié)果就知道有沒有插成功。這種做法比“先查再插”要穩(wěn)得多也省一次數(shù)據(jù)庫往返。4.4 播放次數(shù)的統(tǒng)計(jì)播放次數(shù)不能每一次用戶點(diǎn)擊都去 UPDATE 一次會(huì)有并發(fā)寫問題。我當(dāng)時(shí)的做法是前端每次點(diǎn)擊播放時(shí)調(diào)一個(gè)異步接口后端只把“歌曲ID 時(shí)間戳”扔進(jìn)一個(gè)內(nèi)存隊(duì)列再寫一個(gè)定時(shí)任務(wù)每隔 30 秒把隊(duì)列里的數(shù)據(jù)聚合一次批量 UPDATE song 表的 play_count 字段。這樣數(shù)據(jù)庫的壓力很小代碼也只多了一個(gè)類而已。如果想要更精確這個(gè)數(shù)據(jù)還可以落到 Redis 里定期持久化但對校內(nèi)部系統(tǒng)來說批處理足夠。5. 音頻文件的存儲(chǔ)與安全設(shè)計(jì)這節(jié)單獨(dú)拿出來講是因?yàn)槲矣X得很多網(wǎng)上的項(xiàng)目在文件這一塊處理得太隨意了。5.1 存儲(chǔ)目錄規(guī)劃我在服務(wù)器上規(guī)劃了這樣的目錄/data/music-platform/ ├── uploads/ │ ├── covers/ # 封面圖片 │ └── audio/ # 音頻文件 └── backup/數(shù)據(jù)庫里的 file_url 字段只存相對路徑比如/uploads/audio/20240715_163000_4821.mp3。為什么不存絕對路徑因?yàn)椴渴瓠h(huán)境的 IP、域名、端口都可能變服務(wù)端只拿相對路徑去拼接移動(dòng)環(huán)境時(shí)只改一個(gè)配置項(xiàng)就夠了。文件名生成用“日期_時(shí)間戳_隨機(jī)數(shù)”的方式。為什么不直接用原文件名用戶上傳的文件名很容易出現(xiàn)中文、空格、特殊字符直接落盤后 URL 編碼各種問題都會(huì)冒出來改成系統(tǒng)生成的名字一勞永逸。原始名稱可以存到數(shù)據(jù)庫的 remark 字段里。5.2 不能直接暴露靜態(tài)目錄靜態(tài)資源控制器是這么配的Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/static/**) .addResourceLocations(file:/data/music-platform/uploads/); }這樣配置以后前端用img src/static/covers/xxx.jpg就能直接展示封面圖開發(fā)時(shí)很方便。但是注意音頻文件千萬不要這么暴露。原因我在開頭就說了一旦暴露任何人都可以繞過鑒權(quán)直接下載整個(gè)音頻系統(tǒng)的登錄機(jī)制等于形同虛設(shè)。音頻必須走第 4.2 節(jié)的 stream 接口并且接口里要判斷用戶是否登錄。更細(xì)一步可以生成一個(gè)帶過期時(shí)間的簽名 URL比如/api/stream/123?tokenxxxexpire1720000000過期就失效防住那種把播放鏈接抓出去外傳的場景。對于學(xué)生項(xiàng)目或者內(nèi)部系統(tǒng)做到判斷登錄這一層已足夠簽名 URL 屬于加分項(xiàng)。5.3 上傳文件的大小限制Spring Boot 默認(rèn)的上傳文件大小是 1MB一個(gè)音頻動(dòng)輒幾十 MB不配置就直接被拒了。這個(gè)坑我見過好幾個(gè)人踩。配置在 application.yml 里spring: servlet: multipart: max-file-size: 50MB max-request-size: 60MB另外單次上傳一個(gè)大文件如果體積超過 100MB還需要考慮分片上傳這已經(jīng)超出本文范圍。一般處理 50MB 以下的音頻直接 MultipartFile 上傳完全夠用。6. 前端播放器的對接細(xì)節(jié)前端我用的是 Vue 3。播放器本身是 HTML5 的audio標(biāo)簽但要做成一個(gè)能正常工作的在線播放器需要處理很多細(xì)節(jié)。6.1 播放列表是什么數(shù)據(jù)結(jié)構(gòu)播放器內(nèi)部維護(hù)一個(gè)播放隊(duì)列這個(gè)隊(duì)列其實(shí)就是一個(gè)歌曲數(shù)組。用戶的歌單可能包含幾十首歌切歌的時(shí)候不能每次都去找歌單接口所以前端是先把整個(gè)歌單的歌曲拉下來存到播放器 store 里再根據(jù)當(dāng)前歌曲 id 計(jì)算下一首。具體邏輯是這樣的store 里的 playList 存放所有歌曲對象playIndex 記錄當(dāng)前下標(biāo)點(diǎn)擊列表中的歌曲時(shí)重新設(shè)置 playList 和 playIndex播放結(jié)束后根據(jù)播放模式列表循環(huán)、單曲循環(huán)、隨機(jī)播放計(jì)算下一個(gè) index。function playSong(song, index) { store.playList [...currentSongList]; store.playIndex index; audioElement.src getStreamUrl(song.id); audioElement.play(); }6.2 獲取歌詞和封面歌詞和封面這種信息如果每次都從接口拉會(huì)拖慢頁面。我的建議是歌單列表接口里就冗余返回歌曲的基礎(chǔ)信息封面 URL、歌手名、時(shí)長點(diǎn)擊播放時(shí)再去拉音頻流地址。音頻流地址確實(shí)每次都要重新拼因?yàn)閹Я藭r(shí)間戳參數(shù)可以防止瀏覽器和 Nginx 緩存住舊的鏈接。一個(gè)很有意思的細(xì)節(jié)是音頻文件的流播放接口不能用普通的 axios 去請求然后拿 blob 播放那樣內(nèi)存會(huì)爆。應(yīng)該直接賦給audio.src讓瀏覽器原生去處理流式加載。很多第一次做播放器的人會(huì)在這一步卡半天實(shí)際上就是沒搞明白audio.src和 axios 的區(qū)別。6.3 播放進(jìn)度條需要 source 支持 range如果后端的流接口沒有實(shí)現(xiàn) Range 處理前端拖動(dòng)進(jìn)度條后會(huì)聽到聲音但是進(jìn)度條會(huì)拉回原位置點(diǎn)擊暫停再播放又從頭開始體驗(yàn)非常差。這不是前端代碼的問題而是后端流接口不支持隨機(jī)讀。我調(diào)試的時(shí)候踩過這個(gè)坑后來補(bǔ)上 Range 處理后一切正常。所以前后端聯(lián)調(diào)時(shí)要在瀏覽器 Network 面板里檢查 Response Headers 里有沒有Content-Range有就說明后端處理對了。7. 部署與性能調(diào)優(yōu)從能跑到能扛一個(gè)系統(tǒng)從能在本地跑到部署在服務(wù)器上讓別人用中間還隔著不少事。7.1 用 Nginx 做動(dòng)靜分離雖然系統(tǒng)是一個(gè) Spring Boot 的 jar 包但在生產(chǎn)環(huán)境我建議前面再掛一個(gè) Nginx。Nginx 負(fù)責(zé)三件事監(jiān)聽 80/443 端口把 /api 下的請求反向代理到內(nèi)網(wǎng)的 8080直接服務(wù) /static 下的封面圖片減輕 Tomcat 的壓力配置 Gzip 壓縮讓 JSON 響應(yīng)更小。Nginx 里音頻的流播放請求不建議開太大的 proxy_buffer否則邊下邊播時(shí)候內(nèi)存占用會(huì)比較詭異。實(shí)測下來保持默認(rèn)值即可。7.2 大并發(fā)下的熱點(diǎn)緩存“熱歌排行榜”對應(yīng)的 SQL 很簡單SELECT * FROM song ORDER BY play_count DESC LIMIT 10;真到幾十萬播放量的時(shí)候每次首頁打開都去執(zhí)行這條 SQL數(shù)據(jù)庫壓力會(huì)很大。我把它做了 Redis 緩存key 是 hot_songs緩存時(shí)間 5 分鐘。播放次數(shù)異步更新后緩存最多落后 5 分鐘對排行榜這種非實(shí)時(shí)數(shù)據(jù)來說完全能接受。實(shí)現(xiàn)上用Cacheable或者手動(dòng) redisTemplate 都行關(guān)鍵是想清楚這個(gè)數(shù)據(jù)允許“最終一致”不需要強(qiáng)一致。7.3 音頻資源防泄露部署完成后我還做了一件事給音頻流接口加了一層 referer 校驗(yàn)。不是嚴(yán)格的安全手段但對于內(nèi)部系統(tǒng)足夠當(dāng)請求的 Referer 域不是自己系統(tǒng)的域名時(shí)直接返回 403。這個(gè)在 Nginx 里一個(gè)配置就能實(shí)現(xiàn)location /api/stream/ { valid_referers example.com; if ($invalid_referer) { return 403; } proxy_pass http://127.0.0.1:8080; }加上這個(gè)以后別人把播放鏈接貼在其它網(wǎng)站上基本是打開就 403。這招成本極低效果卻很好。7.4 常見運(yùn)行期報(bào)錯(cuò)我在部署階段遇到過幾個(gè)高頻報(bào)錯(cuò)直接列出來上傳文件時(shí) 413通常不是 Java 的問題而是 Nginx 的client_max_body_size默認(rèn)只有 1M需要在 http 或 server 塊里加client_max_body_size 60m;??缬驁?bào)錯(cuò)開發(fā)環(huán)境前端在 5173 端口后端在 8080必須配置 CORS。生產(chǎn)環(huán)境用 Nginx 同域代理后跨域問題自然消失。中文文件名導(dǎo)致 404如果把前端傳入的中文路徑直接拼 URL容易有問題最好統(tǒng)一格式化為 URL 編碼或者干脆按前面說的避免存中文文件名。數(shù)據(jù)庫時(shí)區(qū)報(bào)錯(cuò)連接 MySQL 時(shí)如果 serverTimezone 沒配啟動(dòng)時(shí)會(huì)報(bào)時(shí)間相關(guān)的異常直接serverTimezoneAsia/Shanghai即可。8. 最后再分享幾個(gè)小經(jīng)驗(yàn)這節(jié)算是我的一點(diǎn)點(diǎn)總結(jié)吧想到哪寫到哪。第一樹形結(jié)構(gòu)不要硬造。歌單和歌曲本來就是個(gè)標(biāo)準(zhǔn)的多對多模型中間表是繞不開的。早期我圖省事用逗號分隔歌曲 id后來加排序功能時(shí)被自己坑慘了只好重構(gòu)。數(shù)據(jù)庫的規(guī)范性是在為未來的擴(kuò)展能力買單不要圖當(dāng)前幾行代碼簡單。第二文件路徑能相對就不要絕對。凡是所有用戶數(shù)據(jù)相關(guān)的資源路徑都存相對路徑部署時(shí)統(tǒng)一拼接 base path換服務(wù)器不至于把數(shù)據(jù)庫里的幾百條數(shù)據(jù)改一遍。第三如果你只有一周時(shí)間最優(yōu)先要做的是把“播放”這一條鏈路跑通而不是在歌單管理上糾結(jié)太多。所謂“跑通”就是從數(shù)據(jù)庫查到歌曲、流式接口輸出 Range 響應(yīng)、前端點(diǎn)一下能正常播放、能拖進(jìn)度條。這一條鏈路通了這個(gè)項(xiàng)目的核心價(jià)值已經(jīng)交付了大半剩下的是錦上添花。第四遇到問題先看瀏覽器 Network 面板再看后端日志。很多音頻播放不了的問題其實(shí)就是 Response Header 里少了某個(gè)字段或者 MP3 文件本身是壞的。先前后端各自定位能少走很多彎路。這些經(jīng)驗(yàn)是我在實(shí)際項(xiàng)目里一個(gè)個(gè)踩出來的希望能讓準(zhǔn)備做類似系統(tǒng)的人少折騰幾個(gè)晚上。如果你也在做 Java 音樂系統(tǒng)歡迎按著這篇文章的思路先把數(shù)據(jù)庫和流接口搭起來再繼續(xù)往細(xì)節(jié)深挖。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本久久人| 日日干夜夜撸夜夜骑| 97干在线| www,8050,午夜三级| 男女啪啪做爰高潮无遮挡| 99性爱无码| 狠狠色婷婷7777久综合| 色五月天 丁香| 99干日本| 涩涩涩.com| 色婷久九| 大香蕉天堂色| 久久婷婷七月丁香| 亚洲妇女熟BBW| 色婷婷六月天| 丁香五月天资源网| 婷婷色五月在线视频| 丁香五月天导航| 色99超碰| 97碰成超视频免费视频| 五月丁香婷婷欧美色图视频五月丁香777电影 | 婷婷99视频在线| 久久婷婷啪啪视频| 婷婷综合精品| 91热99| 亚洲久热无码| 99久久成人| 五月天婷婷丁香| 丁香五月五月婷婷| 婷婷日日天天| 成人精品99| 激情五月综合免费| 五月激情久久综合| 五月婷在线视频免费播放| 丁香五月婷婷深爱综合激情| 久久久com| 亚洲秘 无码一区二区三区妃光/1| 日本欧美成人片AAAA| 色色色婷婷五月天| 成人丁香五月| 中文字幕精品无码一区二区| 丁香五月天成人| 九九久久综合| 操操操B| 99在线精品免费视频| 99自拍网| 婷婷五月成人| 成人做爰A片免费看视频| 另类图片色五月| 五月婷婷影院| 九热...av| 亚洲精品色| 日韩aaa| 婷婷干五月综合在线播放| 久久99热免费| 亚洲热久久| 思思精品热在线| 在热视频精品| 狠狠爱婷婷爱| 五月丁香六月婷| 99热这里只有精品4| 色五月成人| 五月叮香啪| 色色色色色色色色综合网| 97视频久久| www.91色| 久久艹网| 亚洲综合视频天天精品| av在线色五月丁香婷区久| 五月亭亭激情综合| 五月天播播中文字幕 | 五月丁香婷婷开心| 玖玖婷婷五月天| 91色久| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 在线99热| 99热一本久道| 婷婷国产综合| 99er热精品视频| 久久六月综合| 操91| 国产成人va在线| 成人色色视频| 中文字幕成人| 久色五月天| 久久天天天| 久久久久久丁香五月| 夜夜爽天天干| 无码激情AAAAA片-区区| 五月天丁香久久| 久久婷婷精品| 情久久综合五月天| 精品夜夜澡人妻无码AV| 久久婷婷热| 亚洲色色在线| 九九人人精品| 特黄三级又爽又粗又大| 国产精产国品一二三在观看| 日本毛片内射| 成人婷婷深爱综合网| 播五月开心婷婷欧美综合| 婷婷午夜激情| 婷婷之玖玖| 成人看片网站| 99毛片| 天天日天天插| 久久综合激情| 中文av网站| 婷婷五月天在线观看| 婷婷综合在线网| 五月激情啪啪| 人人操91| 欧美丁香五月| 婷婷激情丁香六月| yazhoujiqingav| 女婷久久| 久久日九九| 青青操avbb| 五月天亚洲综合网| 99精品综合| 丁香色色网| 五月天精品综合| 久热9| 99热综合网| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 五月丁香大香蕉| 海外网站专业操老外| 五月丁香视频在线观看| 五月开心网| 色老久久| 久久激情天堂| 国产超碰人人| 超碰99热精品| 91人操| 日本欧美国产| 任你干aa| 99久久玖玖| 全部老头和老太XXXXX| 99热亚洲精品| A片一曲| 青青草婷婷久久| 中文字幕久久一区二区三区| 一本婷婷丁香久久| 亚洲色视频| 美女久久天堂| 中文字幕色色| 色色综合激情| 天天激情站| 五月婷婷色综图片| 99色婷婷| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 六月丁香深深爱| 色色色综合色| 激情图片婷婷| 九月婷婷综合在线| 午夜九九九九九九九九九九九九九| 葵花AV在线| 五月综合缴情网| 色呦呦在线| 人人操人av| 97一区二区| 天天爽夜夜爽夜爽精品| 丁香五月成人丝袜| 超碰在线人人| 六月婷婷影院| 亚洲熟女乱色综合亚洲网站| 精品久久久人妻| 男人综合网| 色婷婷19| 色婷婷黄色网络| 9精品在线| 色激情五月| 五月综合在线| 99热99色| 国产日韩欧美| 久久99美女精彩视频| 图片区 小说区 区 亚洲五月| 丁香六月av| 国产亚洲精品久久久久久豆腐| 天天日综合网射| www色婷婷| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 五月天色婷婷成人| 色香久久| 五月激情偷拍| 色婷青青| 青青草五月天| 激情婷婷五月亚洲| 超碰精品国产首页| 99热在线中文字幕| 国产又色又爽又黄又免费| 久久久婷丁香五月| 婷婷久久图片| 婷婷操逼| 天天激情| 午夜激情婷婷| 91Chinese在线| 开心深爱激情网| 色色网站免费在线视频| 成人免费黄色短视频| 日日肏夜夜干| 亚洲在线综合| 精品国产一区二区三区四区阿崩| 99热免费观看| 婷婷五月天激情在线观看| 超喷97免费在线视频| 天天舔天天摸天天透| 超碰中文字幕在线| 丁香五月天堂| 九九婷婷五月天| 99视频35精品视频在线观看| 爱久久小说下载网| 99ri国产精品| 欧美婷婷综合| 久久五月婷婷电影| 色综合久久综合| www.婷婷| 五月丁香狠狠爱| 狠狠色综合网站| 久久99久久99精品免视看婷婷| 久久婷婷一级片| 啪啪啪大香蕉| 久久色婷婷| 六月丁香婷婷在线波多| 久久婷婷五月综合激情国产| 久久永久网址| 色情综合网| 狠狠色丁香久久婷婷综合五月| 99热这里只有精品8| 久久久精品AV| 热久国产| 色碰碰视频| 国产精品热搜丁香五月婷婷| 五月天婷婷丁香视频| 久久艹99| 久大香蕉| 天堂久久婷婷| 婷婷九月激情| 人人97碰| 综合色图区| 另类国产区| 婷婷激情久久| www.wuyuetian啪啪| 婷色五月| 4399啪啪视频| 欧美婷婷色| 天天做天天爽| 激情玖玖sh| 色一情一乱一乱一区91Av| 激情国产五月| 九九综合九九| 人人摸人人| 精品99爱免费视频在线观看| 免费国产VA国产免费| 婷婷五月天午夜激情影院| 色一情一乱一伦一区二区三区| 九九热re99re6在线精品| 伊人成人宗合网| 男人天堂99| 五月婷婷久久爱| 色色婷| 综合一区二区三区| 五月亭亭狠狠| 99爱在线视频观看| 99久久免费精品| 色欲操| 婷婷五月AV| 六月婷婷日| 99视频在线观看地址| 色五月六月| 五月丁香色六月激情干大屄| 日韩AV色色色| 五月丁香六月香综合激情| 欧美搡BBBBB摔BBBBB| 99在线精品观看99| 色狠狠综合| 丁香六月激情综合| 久久国产色| 丁香婷婷色情社区成人小说| 婷婷五月色网| 精品51XX| 99精在线| 五月天婷婷丁香基地在线观看| 婷婷射图五月天| 色九亚洲| 大香蕉九九| 九九热精品| CHINESE熟女老女人HD视频| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 婷婷人人操| 67194中文在线| 成 人片 黄 色 大 片| 玖玖无码中文| 丁香色色网| 美女五月天| 人人人舔人人人操人人人摸人人人97| 日本va欧美va国产激情| 色99视频| 97sese婷婷| 丁香五月最新网址| 五月婷免费视频久久久| 丁香五月激情在线| 97色色综合| aaaaaa片| 色婷婷综合五月| 婷婷免费视频| 色婷婷88| 五月开心播播网| 香蕉色色网| av在线激情| 成人综合网站| 亚洲成人影视在线| 综合久久五月| 丁香五月停停基地| 91操片| 婷婷综合五月| 婷婷5月天激情综合| 婷婷五月成年人| 99国产小视频2013| 狠狠色婷婷丁香六月| 婷婷五月婷婷五月| 五月丁香色婷婷| 激情综合五月开心狠狠| 九九热视频99| 被男人添B超爽视频| 久操欧美在线观看97| 激情文学综合婷婷五月天丁香花| 亚洲av另类在线观看| 欧美日韩精品一区二区三区钱| 超碰人人在线观看| 超碰在线免费| 婷婷五月天伦理| 丁香五月亚洲天堂| 99九九综合久久九九| 五月丁香色情| 蜜桃人妻无码AV天堂三区| 亚洲精品又粗又大又爽A片| 四川BBB搡BBB爽爽视频| 99热一本| 五月丁香激情综合网| 91丨九色丨丰满人妖| 丁香色情五月天| 日韩黄色中文字幕| 天综合日日夜综合7799| 六月婷婷综合| 色婷婷五月丁香在线观看| 丁香婷婷在线| 婷婷五月无码| 91丁香婷婷综合久久欧美| 婷婷丁香社区| 亚洲性受XXXX五月丁香| 天天爽,夜夜爽| 色色五月天网站| 噼里啪啦在线观看免费完整版视频| 蜜臀久久99精品久久久久久酒店| 色噜久| 色欲天天综合网| 呦呦v线| 丁香五月婷婷色情综合| 97成人超碰免| 九九热在线观看6| 成人在线不卡| 狠狠大香婷婷爱| se色99| 婷婷激情社区| 91人久| 久久婷中文字幕| 五月天五月色婷婷综合| 深爱综合网| 青草五月天| 人妻五月天激情开心网| 五月天婷婷青青| 婷婷五月天在线观看| 色色婷婷五月天| 97丁香视频| 热无码A∨| 激情五月天啪啪| 四川女人毛多水多A片| 97欧美在线| 婷婷五月天AV激情| 欧美色五月| 91视频久久久| 婷婷五月图片小说视频| 亚州美女| 少妇高潮呻吟A片免费看软件| 成人版视频在线观看| 五月天婷婷久久综合| 色综合大香蕉| 97久操视频| 六月米奇色综合| 亚洲激情网| 亚洲激情五月| 五月天色裸体视频| 99在线精品免费视频| 99国产99| 婷婷五月天成人综合网| 麻豆WWWCOM内射软件| 五月婷婷人人人操| 免费亚洲婷婷五月| 免费人人操| 婷婷五月天首页| 综合五月婷婷| 六月婷婷天天操夜夜爽视频| 伊人在线视频| 成人在线观看一区| 天天摸色吧天天摸色吧| 天天日日| 五月婷婷伊人在线| 国内精品免费一区二区2009| 色狠狠六月| 色色色色网| 91九色欧美| 五月婷婷视频ab| 少妇人妻丰满做爰XXX| 六月丁香婷婷视频综合在线观看| 丝袜大香蕉| 日本九九视频| 久久五月婷| 色欲五月婷婷| 综合另类视频| 99久在线精品| 99视频精品视频| 99精品热| 五月婷婷激情四季| 国产偷人爽久久久久久老妇APP| 91操人视频| 这里只有精品2| 婷婷伊人久久| 夜夜爽天天爽| 久久五月丁香婷婷| 97香蕉久久超级碰碰高清版 | 色99日韩| 亚洲亚洲人成综合网络| 欧美性丁香色色五月天干干| 好吊丝aV| 99久热| www.主妇. com| www.五月天| 色色色视频| 久操大香蕉| 天天综合激情| 九月丁香婷婷| 99精品无码网站| 色综合激情图区| 久久一热| 五月丁香激情婷婷| 色婷婷激情| 丁香五月婷婷六月婷| 国产乱人偷精品人妻A片| 成人AV在线网站| 一起操最新网址| 五月丁香免费看| 婷婷综合九月| 开心五月网 | 思思精品热在线| 99噜噜噜| 丁香五月香蕉| 夜夜爽天天日| 色99热| 欧美经典片免费观看大全| 第六色在线| 热久91| 色欲久久久久久综合网综合网| www.五月婷婷.com| 亚洲无AV在线中文字幕| 久久九九热视频| 亚洲AV网站| 丁香婷婷久久| 97在线天堂| 97干在线观看视频| 六月婷伊人| 99热97美女| 婷婷射图| 丁香六月天色婷婷| 亚洲一区二区无遮挡A片| 九九色婷婷| 中文字幕丰满乱孑伦无码专区| 欧美性爱五月天| 五月丁香六月婷婷a v| 丁香五月激情欧美| 日日夜夜干| 丁香五月a| 婷婷开心深爱五月天| AA片在线观看视频在线播放| 亚洲旡码| 色婷婷狠狠久久综合五月 | 开心五月婷婷| 九九在线免费观看| 玖玖综合网| 三日本无码| 日韩成人AV在线| 综合六月激情婷婷| 婷婷91| 99在线一区| 五月婷婷天| 开心五月天激情| 久9热视频在线观看| 不卡的AV网站| 思思热在线视频精品| 色丁香影院| 婷婷丁香五月天婷婷| 超碰操网| 色五月视频,小说| 激情五月天色网站| 中文av在线观看| 99热热热99精品丁香| 女人天堂久久| 婷婷五月天中文字幕| 婷婷丁香五月av| 欧美乱码国产一级A片| 91|疯狂丨高潮丨对白| 超碰91在线| 色吧五月婷婷| ss99热| AV色五月婷婷| 大香蕉久久久久| av一区免费看| 男同色五月开心五月激情五月| 色婷婷香蕉| 色吧五月婷婷| 伊人激情影院| 色五月综合| 丁香婷在线| 九九综合久久丁香婷婷,开心激情综合网| 欧美日韩国产一区二区| 色香欲综合| 日韩欧洲亚洲| 色哟哟www| 天天狠狠干| 婷婷六月开心网| 婷婷九月激情| 第四色色六月色综合| 婷婷亚洲影院| 亚洲AV人人操| 九九国产视频| 欧美一级色| 丁香五月婷婷亚洲综合精品| 99九九热视频| 97在线/亚洲| 欧美操逼天堂| 97碰人人操| 99久久婷婷综合| 丁香久久久| 亚洲十月婷婷综合| 五月四色婷婷| 色色色免费视频| 天天影视色综合网| 日韩在线五月天婷婷| 色五月婷激情| 亚洲色网络| 久久精品只有这| 久色五月| 五月天国产婷婷精品视频在线| 六月丁AV| 婷婷五月成人| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 五月婷婷免费在线观看视频| 五月综合视频| 免费黄色片子| AV成人在线播放| 99在线视频喷水| 综合激情综合啪啪| 丁香六月激情综合| 欧美日韩91| 9久久久久| 色 噜噜 九月 婷婷| 久久五月天激情视频| 五月丁香婷婷综合网| 丁香 久久| 激情五月综合网最新| 丁香五月影院| 五月综合777| 狠狠操狠狠操| 婷婷五月天国产精品| 欧美超级视频97| 五月天激情网址| 狠狠色噜噜色狠狠狠综合久久成人波 | 人人做人人看人人摸| 亚洲精品又粗又大又爽A片| 日韩无码专区| 欧美黄色AA片哗啦啦啦| 丁香 婷婷 激情 综合 五月| 五月丁香六月婷综合成人综合 | 亚洲精品无码一区二区| 五月开心网| 国内精品99| 丁香五月黄色| eeuus五月婷| 人人做人人看人人摸| 99视频在线观看网址| 91天天操天天干天天射| 97成人丁香| 国产精品操| 琪琪秋霞| 97香蕉久久超级碰碰高清版 | 五月丁香花开综合网| 成人视频一区| 超碰操日| 婷婷丁香社区网| 思思精品热在线| 日本人妻A片成人免费看片| 性做爰A片免费视频A片直播 | 成人免费120分钟啪啪| 玖玖玖婷婷婷| 第2色五月婷| 丁香五月婷婷网| 色五月婷婷色| 丁香五月123| 五月亭亭激情综合| 人人干99| 成人国产欧美大片一区| 97色色婷婷| 伊人热在线大香蕉| 99自拍视频在线| 99热这里只有精品最新网址| 激情色色色| 天天综合网~91| 91九色首页| 欧美日韓成人亚洲精品另类| 久久婷婷综合基地| 综合在线观看99| 激情四射五月天| 激情小说婷婷| 久久大国产香蕉| 91viP在线看| 五月激情婷婷六月丁香| 久久婷五月| 婷香狠狠爱五月| 五月丁香六月婷婷不卡免费无码| 婷婷色导航| 亚洲天堂碰碰婷婷| 亚洲成人电影aaaa| 9久久精品| 婷婷丁香五另类网站| 开心网五月色婷婷| 久久婷婷老| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 亚洲婷婷免费| 婷婷狠狠干| 五婷婷六月合| 久久久久这里只有精品| 久久五月激情综合| 波多野结衣AV无码Porn| 另类亚洲电影| 五月丁香六月停停| 91九色最新视频| 婷婷五月天成人五月天| 成人五月天丁香婷| 狠狠九九婷婷韩| 国产综合网在线| 狠狠ri| 在线VA视频| 久色激情| 开心婷婷中文字慕| 亚洲愉拍99热成人精品| 大香蕉久热| 五月色亚洲| 夜色爱爱亚洲| 婷婷五月深深爱| 五月婷婷久久大片| 99久久成人| 欧美内射AAAAAAXXXXX| AA片在线观看视频在线播放| 亚洲激情 久久| 99这里只有精品|v| 丁香五月影视| 久久草大香蕉| 99久久亚洲精品视频| 日韩AV片| 婷婷色婷婷亚洲成人| 97人人操人人| 狠狠久久婷五月| 人妻AV在线| 亚洲1区| 97中文在线| 一本色道久久88加勒比—| 丁香婷婷六月| 黄色99热| 久久小视频| 日本3级片一区2区| 噜噜五月天综合| 伊人热婷婷| 亚洲激情97五月天| 激情啪啪五月| 婷婷香五月天| 天天草天天爱| 五月色情婷婷| 色色色五月婷| 99啪啪视频| 亚洲精品久久久久AV无码| 五月丁香999| 国产精品久久久久9999小说| 真实亲子乱子伦高清在线观看| 五月天丁香啪啪啪啪| 九九热最新| 少妇激情基地| 国产午夜精品一区二区三区四区| 欧美亚洲婷婷五月| 26uuu丁香婷婷五月| 亚洲综合色色色| 六月丁香婷婷尤物| 免费啪啪亚州视频| 亚洲天堂久久| www色综合| 综合大香蕉| 99热色精品| 99国产这里只有精品| 99热色精品| 天天操夜夜啊| 日韩av在线播放综合网| 色婷婷六月| 亚洲俩性性爱图片久久第六页| av在线婷婷| www.色色五月天.com| 丁香五月婷婷88在线| 一区中文字幕电影| 五月丁香婷婷综合网| 99无吗| 亚洲操逼网| 爱超碰性| 亚洲成人网站在线观看| 亚洲色色色色| 九热...av| www.ywav| 五月婷色| 五月婷婷啪啪啪啪| 亚洲精99| 99人妻碰碰碰久久久久视| 99久久99久久综合| 天天干夜晚夜操| 噜噜综合网| 综合久久十| 欧美大肥婆大肥BBBBB| 色噜噜狠狠色综无码久久合欧美| 人人澡天天色天天做| 色五月色五天色情网址| 色色操| 4399在线日本A片| 毛片新网地| 婷婷丁香五月综合| 色播五月综合网| 国产欧美日韩综合精品一区二区| 丁香五月最新地址| 丁香六月欧美| 六月婷婷网站| 色色色777| 久久网日本| 激情五月天情色| 欧美大片| www.99热| 91九色中文字幕女在线观看| 青青草原99热| 五月婷婷无码专区| www,五月天com| 日本3级片一区2区| 婷婷丁香大香蕉| 亚洲成av人影院| 狠狠干五月天| 五月丁香色| 五月婷婷人人人操| 色爽九九| 手机在线视频观看9| 欧美性生交XXXXX无码小说| 噜噜视频| www.婷婷五月天.com| 夜夜爱网站| 丁香六月激情国产| www,五月天激情| 日韩99视频| wWW九九在线播放| 最熟少妇乱码| 激情网 久久| 青青草国产亚洲精品久久| 91精品91久久久中77777| 婷婷成人综合| 亚洲成人高清在线| 五月丁香色综合| 欧美这里只有精品| 超碰1999| 99久久综合网| 婷婷五月天第四色| 五月天激情中文字幕| 激情综合另类| 五月天五月色| 凹凸探花电影| 丁香狠狠| 丁香婷婷六月天| 色综合色综合色综合高潮| .操區COm| 国产99热在线看| 狠狠色丁香| 超碰91在线| 九九精品片一| 天天操天天日天天爱| 丁香成人五月天| 国产亚洲色婷婷99精品| 六月激情婷婷色| 色婷婷av在线| 色婷婷五月天激情| 五月天婷婷久久日| 青青操avbb| 五月在在观看| 玖久精品视频9| 五月成人天| 五月开心激情| 丁香五月天论坛| 野战毛片三一3| 久久五月天色婷婷| 91丨九色丨东北熟女| 久久婷婷五月天| 91狠狠色丁香婷婷综合久久精品| 伊人婷婷大香蕉在线| 丁香五月激情图片婷婷| 色五月大| 丁香五月婷婷基地| 欧美激情五月天| 丁香五月大香蕉在线99| www.九月婷婷丁香.com| 任我肏视频精品| 国产精品人妻在线网址| 91人操| 久久丁香五月综合六月激情红杏视频| 美女亚洲五月丁香| 婷婷成人小说综合| 激情99在线视频| 久草热在线视频| 啪啪小说五月天| 色色色婷婷五月| 久久九九国产精品怡红院| 婷婷五月天综合亚洲| 丁香熟女乱| 人妻中文字幕网| 日韩天堂久久| 九九色精品| 九九视频这里只有精彩| 五月丁香色综合| 密黄站| 日本综合久久| 欧美va在线| 一区二区传媒视频| 天天噜噜| SESE无码AV| 五月婷婷在线短视频| www久久久久久久久久久| 五月婷婷综合视频| 99aese| 大香蕉免费9| 激情婷婷五月丁香啪啪啪| 亚洲婷婷五月| 毛片新网地| 久久丁香五月| 国产操B| 97碰碰人人| 99久久er| 五月婷婷在线丁香| 99热加勒比| 成人αV视频免费观看| 五月婷婷激情四月| 九九热只有这里精品| 久碰久| 97午夜一区二区| 五月天色社区| 91视频一起草| 呦呦视频无码播放| 色婷婷狠狠| 亚洲色五月| 人人爽天天爽| 天天拍夜夜撸| 丁香婷婷六月婷婷六月婷婷六月婷婷 | 久9热视频| 99久久婷婷国产综合精品电影| 老司机伊人| 婷婷综合激情| 婷婷丁香五月天在线| 日韩 中文 欧美| 国产精品第一国产精品| 日日操夜夜爽| 五月婷av| 丁香五月婷婷亚洲另类| 天堂美国久久| 五月婷婷六月丁香| 五月天激情啪啪| 久久99精品久久久久久三级| 大地资源色婷婷视频在线| 99秘 在线| 开心激情色婷婷五月天| 99ri视频在线观看| 狠狠操狠狠操| 超碰碰碰碰| 91碰超| 九九热中文| 99啪啪网| 97色在线视频| 人人97碰| 色噜噜97视频在线观看| 婷婷综合五月| 99色热视频在线| 亚洲人妻Av| 六月丁丁香| www激情| 99爱在线精品视频免费观看| 色宗合久久五月婷婷| 思思热在线视频99| www.热99热| 激情五月开心五月丁香五月| 这里只有精9| PORNY九色9l自拍视频成人| 亚州综合色| 亚洲午夜Av| 婷婷中文在线| 丁香婷婷久久 | 性色婷婷| 99日本黄站| 色综合伊人网| 五月香婷婷| 亚洲色图欧美色图日本视频| 亚洲欧洲中文日韩久久AV乱码| 西西4r午夜剧场| 99综合视频一体| 激情综合网激情五月天| 新激情婷婷| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 色哟哟精品| 中文激情网| 26uuuavcom| 热99这里只有精品视频| 色婷婷久久| 99熟女| 色综合色色| 色九月丁香婷婷蜜桃在线观看| 色五月激情综合网站| 99久在线观看| 日韩成人av在线| 五月天激情中文字幕| 五月丁香啪啪伦理电影| 亚洲中文乱字字幕线在永久| 丁香成人色情五月天| 天天日天天干天天操| 免费精品99| 99视频这里有精品| 五月天色欧美| 九九99精品| 狠色狠色狠色狠色狠色网| 丁香五月乱中文字幕| 五月天激情在线视频| 99视频这里有精品| 五月天激情综合| 97色 五月天丁香| 69久久99精品久久久久婷婷| 99在线观看亚洲| 99热精品6| 婷婷五月天成人网| 久热精品免费视频4| 一本久道综合99| 丁香五月色播中文在线播放| 日韩精品二三区| 婷婷激情四射| 去色色五月天| 涩涩五| 五月婷婷五月天| 亚洲亚洲人成综合网络| 超碰在线94| 97碰人人操| 婷婷五月天 偷拍| 丁香六月久久| Av狠狠色丁香婷| 超碰九九热| 五月天婷婷伊人| www.99热视频| 丁香五月婷婷啪啪视频| 综合色色网| 五月亭亭网成人在线视频| 色播播五月天| 爆乳熟妇一区二区三区爆乳照片| 成人短视频在线| 26uuu欧美宗合| 青草视频在线播放| 久99热在线观看| 婷婷 月 丁香| 亚洲人妻av| 色吧婷婷| 五月天久久综合婷婷丁香| 人人爱操| 久七香蕉| 这里精品| 中文字幕乱码亚洲精品一区| 女性自慰系列第五页| 五月天婷婷影院影院观看| 超碰日韩成人| 五月激情五月丁香| 五月丁香六月在线| 99国产在线精品视频| 成人五月丁香社区| 色久丁香五| 毛片九九九九九九九九18| 婷婷五月69| www99在线观看视频| 免费看成人747474九号视频在线观看| 亚洲婷婷丁香五月视频| 少妇熟女视频一区二区三区| 中美月韩免费A片| 激情五月婷婷| 激情婷婷五月综合| 五月丁香六月停停| 99国产精品久久久久久久久久久 | 狠狠搞综合色| 搡BBBB搡BBB搡五十| 婷婷五月天最新综合你懂的| 天天综合久久| 丁香五月天天| 五月丁香婷婷六月| 草榴视频黄色网| 五月第四色| 欧美十二区| 女人天堂 AV| 色色婷婷综合| 五月激激网w'w'w| 99热网站| 久久婷网| 婷婷香蕉| 色性综合| 五月激情婷婷在线| 狠狠色综合网| 欧洲色色| 色综合色婷婷色伊人| 五月婷婷综合网| VA国产在线综合网站| 成人αV视频免费观看| 美女主播野战视步页| 中文字幕丰满孑伦无码专区| 丁香五月天色综合| 久草婷婷网| 婷婷涩五月天综合| 天天肏天天肏| 色婷婷丁香五月色综合网| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品 | 五月天婷婷综合| 国产欧美婷婷| 激情五月天天| 伊人久久五月天综合| 午夜激情久久| 天堂网啪啪| 人妻性爱av网站| 欧美色色色| 99成人免费热视频| 午夜福利8055| 91蜜桃婷婷狠狠久久综合9色| 色色综合色视频| 婷婷丁香六月| 99人人操人人摸| 91久久综合亚洲噜噜成人在线| 色5月婷婷色| 五月综合婷婷网| 五月久久丁香| 草综合14| 久久综合激情| 无码成人播放器| 亚洲成人黄色网| 九九激情综合| 日本韩国视频在线观看社区免费的9| 99re热在线视频| 色综合区| 99热免费| 婷婷五月天在线观看| 婷婷人人操| 五月天久久综合婷婷丁香| 六月婷婷久久| 亚洲天天| 妻久久人久久| 亚洲第一第二网站| 久久999久久999久久999久久| 激情五月丁香婷婷| 综合激情在线| 婷婷午夜天| 99热这里只有精品1| 日日操夜夜撸| 91.www综合| 伊人久久丁香狠狠婷婷综合香蕉 | 九九色综合九九色| 天天爱天天操| 亚洲综合五月天婷婷丁香| 一区二区成人电影免费播放| 婷婷综合仓库中文| 色婷综合| 强壮的公次次弄得我高潮A片日本 | 婷婷导航| 五月色综合| 久久综合激情| 五月天婷婷激情在线色图| 色狠狠综合| 成人免费120分钟啪啪| 成 人片 黄 色 大 片| 久久中文网| 丁香亚洲色综合| 国产操B| 波多野结衣成人作品在线| 色婷婷五月色| 久久机热这里只有精品免费视频| 婷婷大美在线| 999影院成人在线影院| 亚洲成人av在线| 五月丁香色婷婷| 欧美精品狠狠色丁香婷婷| 91在线精品一区二区| 亚洲精品成人片在线播| 五月婷婷|欧美| 综合五月草| 日韩AV色色色| 国产美女视频久| 六月丁香网| www.99视频| 四季8848精品成人免费网站| 日韩成人综合| 狠狠色综合图片| 色情五月婷| 婷婷久久久久久久| 骚五月婷婷| 玖玖资源部在线播放| 五月丁香六月婷婷开心网| 久久五月婷| 久久国产一区二区三区| 亚洲免费av在线| 伊人青草成人| 天天色,天天日,天天做| 亚洲精品成人| 婷婷色综合网日韩国产| 91色逼| 九九免费在线视频| 色婷婷丁香五月天| www,色中色| 亚洲操逼网| 激情综合网婷婷五夜| 亚洲秘 无码一区二区三区妃光/1| 五月丁香六月激情综合网| 一级性爱视频| 色婷婷影视| 婷婷五月激情在线| 《战争与艾拉》完整版| 五月丁香六月婷婷姐| 色色色欧美| 国产操肏网站| 亭亭五月激情亚洲在线| 九九婷婷综合| 丁香五月婷婷操逼| WWW色五月天| 狠狠操天天干| 国产av天天插天天操天天爽| 久色网址| 激情影院丁香五月| 激情六月婷婷| 二级黄色毛片| 五月婷婷二月丁香| 日本va欧美va国产激情| 国产免费一区二区三区三州老师F1F1.CC| 六月伊人婷婷| 伊人www22综合色| 日韩黄在免| 九九無碼| 丁香五月人妻| 国产99久久久国产精品免费看| 五月大香蕉| 亚洲色网址| 香蕉久久国产AV一区二区| 丁香六月婷婷综情欧美| 婷婷五月在线观看| 99国产在线精品视频| 4399成人黄A片| 超碰二区| 色婷婷亚洲综合av| 婷婷五月天 偷拍| 丁香五月天之婷婷影院| 日本丁香久在线| 综合久久婷婷五月丁香| 色吊操色妞| 五月丁香在线精品| 五月色综合| 激情婷婷综合网| 婷婷丁香五月欧美人| 一本大道熟女人妻中文字幕在线| 日韩精品VIP| 99色视频在线观看| 农村熟妇高潮精品A片| 五月天久久久| 久久狠狠干| 丁香婷婷色色| 草综合14| 九九碰九九爱97超碰| 91久久| 五月亭亭网成人在线视频| 91人人爱| 国产26uuu视频| 99性爱| 天天综合亚洲综合网天天αⅴ| 国产26uuu| 8050一级网| 丁香五月婷婷激情中文| www.韩日视频| 久久这里有精品在线观看| 国产毛多水多女人A片| 久久婷婷六月| www.色五月| 免费色色色| www久| 婷婷五六日| 日本乱子人伦在线视频| 少妇AB又爽又紧无码网站| 亚洲激情亚洲激情| 丁香大香蕉| 亚洲网站999| 久久婷婷久久| 综合久| 六月丁香网| 亚洲日本激情| 少妇大叫太大太粗太爽了A片| 色婷婷丁香AV综合| 色五月婷婷在线| 婷婷免费精品视频| 99热最新| 丁香六月成人网| 九九爱激情| 天天干天天操| 综合色吧| 色九亚洲| 日韩九区| 欧美成人精品A片免费一区99| 五月激情精品视频| 99亚洲精品综合在线| 一级操逼内射在线视频| 9 1 A v久久久| 中文AV在线播放| 狠狠色综合网| 五月婷婷六月天| 国产成人va在线| 丁香婷婷久久综合在线| 久久久大香蕉| AV伊人青草丁香六月| 九九无码| 噜噜网免费视频| 五月丁香啪。| 原琪琪色影院| 欧洲亚洲免费视频9| 三级片AAA久久久AAA久久久AAA | 性小说五月天| 久久电影五月天丁香电影| 欧美日韩AAAAA| 人人操人人妻| www,久久久| 丁香五月婷婷姐| 九九九九九九九九九九九九九国产精品| 日本五月天网站| 国产91视频| 五月丁香亭亭激情操逼网| www.日韩国产| 五月天六月丁香| 99国产99| 欧美色五月| 丁香5月啪啪| 91色在线| AV九九| 玖玖精品视频99| 亚洲视频国产一区| 久久伦乱| 热的国产,热的综合,热的有码| 激情综合婷婷久久| 婷婷五月无码| 色五月综合在线|