99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜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
返回資訊列表
六月婷婷五月丁香| 日本人妻伦在线中文字幕| 99在线视频播放| 99热这里只有精品青草| 激情五月天影院| 色婷久久| 婷婷激情视频| 九九热内射| 六月婷婷中文字幕| 九九色精品| 婷婷激情五月天在线| 91天天操天天干天天射| 操操操AV| 五月丁香婷婷激情澎湃四射| 天天日日天天| 亚洲Va成人| 久9热在线免费观看| 99精品在线| 五月天综合视频网| 欧美激情综合色丁香婷婷五月天| 色五月久久成人婷婷| 婷婷久久影院| 综合爱久久| 亚洲视频在线观看| 疯狂做受XXXX高潮A片| 婷婷五月花| a v色婷婷| 性色婷婷| 丁香婷婷五月六月久久| 五月丁香色婷婷久久| 五月丁香综合色婷婷| 思思热视频在线| 成人网址在线观看| 99热这里都是精品| 日本久久精品18| 天天综合天综合| 人人澡天天色天天做| 色综合香蕉| 五月丁香久久久| 99.色| 97啪啪| 欧美天天搞| 大香蕉太香蕉视频97| 强辱丰满人妻HD中文字幕| 欧美婷婷五月丁香| 色婷婷五月天| 欧美情色电影一区二区| 碰人人97| 亚洲视频国产一区| 色六月婷婷| 五月色丁香婷婷综合| 97色 五月天丁香| av九九| 久久99网| 极品人妻VIDEOSSS人妻| 1024成人免费看| 色婷婷8| 成熟妇人A片免费看网站| 岛国av网站| 婷婷五月天堂| 丁香六月激情| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 99热在线精品观看| 五月丁香啪啪| 五月丁香六月婷| 久久丁香五月| 国产欧美精品AAAAAA片| 五月色婷婷夜色| 97男人天堂| www.99.色| 天天色凹凸| 色99久草在线| 96精品久久久久久久久| 久久久er热| 亚洲婷婷开心五月| 99热精品在线播放| 久久婷婷成人| 激情AV网| 五月丁香激情怕怕| 五月丁香WWW| 有码人妻久久| 婷婷五月深爱五月| 91超碰人人操| 成人国产欧美大片一区| 国产色视频网站2| 9热在线视频| 亚洲午夜一区二区| 色婷婷五月天激情在线播放| 99在热线免费视频| 爱射综合| 99热在线看| 成人综合视频在线| 日日干夜夜撸夜夜骑| 都市激情小说婷婷| 亚洲欧美婷婷五月色综合| 欧美一级色| 99自拍视频| 最近中文字幕2019视频1| 久久精品凹凸分类| 欧美日韩91| 26UUU精品一区二区c〇m| 欧美成人精品老美女噜噜噜| 婷婷五月天av网| 五月色欧洲| 婷婷五月天啪啪| 色情五月婷| 婷婷午夜| 香蕉狠狠爱视频| 国产精品噜噜在线视频| 色色丁香婷婷综合| AV片在线观看| 七七九九色色| 影音先锋一区| 色综合婷婷99| 五月婷婷开心爱| 中文在线视频久1| 91婷婷色 | 26uuu亚洲| 丁香色色色| 国产乱人偷精品人妻A片| 色婷婷啪啪综合网| 色色综合日韩| 国产无套精品一区二区| 久久婷婷亚洲无码一起| 色五月丁香五月婷婷五月成人网| 日产精品一线二线三线芒果| 激情久久肏屄视频| 5月婷婷激情在线| 丁香五月狠狠在线观看| 操操自拍| 在线日韩av| 日本色色网| 五月天综合激情网| www久久久久久久久久久| 欧美人人女女精品综合五月天| 人人干天天舔| 色婷丁香| 99九无网码| www狠狠| 婷婷五月天成人| 中文字幕成人版| 色婷婷电影| 亚洲无码99| 麻豆AV一区二区三区| 久久与婷婷| 激情小说婷婷五月| 人人操9| 色婷婷在线综合色播网| 亚洲午夜AV| 欧美啪啪9| 日撸夜撸日操| 九月停停| 五月激情婷婷在线| 91在线观看www| 色国产五月| 九九热中文| 停停六月 综合| 激情综合网婷婷久久| 99这里有精品视频| 婷婷综合五月| 亚洲综合色色| 久久久思思热| 婷婷五月天av| 色月视频| 大香蕉220| 激情久久四色| 另类少妇人与禽zOZZ0性伦| 人妻AV在线观看| 天天摸天天舔| www久久艹| 婷婷国产成人| 成人av在线网站| 色综合久久五月天| 色综合久久中文| 午夜丁香婷婷| 91精品久久久久久久久久久久| 久久机热/这里只有精品| 九九久久9 9在线观看| 深爱婷婷色| 久久怡红院| 久久婷婷五月国产色综合激情| 91操操| 99精品久久| 九久9精品| 激情综合区| 色噜噜狠狠色综合网| 丁香五月婷婷Av| 性色天| 操人精品| 伊人久久五月天| 69久久99精品久久久久| 可以看的AV| 久久五月天合网| 国产又粗又大又爽又黄| 99er久久| 四虎成人精品永久免费AV九九| 丁香五月综合婷婷| 日本五月丁香| 影音先锋91男人资源在线播放| 激情图片五月天| 婷婷色基地在线看 | 开心 五月 综合| 丁香在线视频| 色五月丁香在线| 亚洲黄网在线| 97碰久久| 婷婷综合网站| WWW.婷婷五月天.COM| 另类图片天天影视在线观看| 婷婷丁香五月天综合网| 啪啪啪丁香五月| 五月丁香六月婷婷姐| 九九九九九九综合| 亚洲中文字幕av| 天天干天天 亚洲| 玖玖婷婷五月天毛片| 人妻久久久久久久 | 香蕉久久六月| 亚洲亚洲人成综合网络| 夜夜撸日日操| 激情五月天激情网| 人人综合91网| 精品国产乱码久久久久夜深人妻| 婷婷 色 丁香 夜| 亚洲成人免费电影| 在线免费观看激情视频| 99热这里有精力| renrencaoni| 婷婷六月激情综合| 天天插综合网| 婷香五月激情视频| 精品视频99看在线视频| www,色婷婷| 九九AV| 丁香激情综合| av 一区三区四区| 超极99精品| 久久久大香蕉| se99视频| 中出内射的人妻视频| 9l视频自拍九色9l视频在线观看| 青草青草视频2免费观看| 操骚货在线| 天天日天天狠狠操| 亚洲色图五月丁香| 四色五月婷婷| 亚洲精品久久久久久久久久吃药| 中文字幕人妻在线| 丁香五月激情视频| 激情婷婷人妻| 欧美日综合| 青吴乐视频| 丁香五月六月综合激情| 啪啪 综合网| 婷婷综合成人五月天| 中文字幕综合| 日韩 mm 不卡| 国产在线网址1| 九九色精品| 91免费看片| 天天色官网| 婷婷五月天成人五月天| 97人妻碰碰碰久久香蕉| 五月婷免费视频| 免费视频WWW在线观看网站| 丁香六月婷婷五月婷婷| 六月丁香社区| 天天摸天天高潮天天爽| 色婷婷色五月丁香| 综合xx网| 亚洲色婷婷色| 精品99这里有| 色色色色色热| 久久激情视频99| 婷婷色中文| 黄色av高清| 国产精品99久久久久久久女警| 任你爽免费视频| 婷婷五月花丁香| 天天综合五月| 婷婷五月俺要去| 日日干五月天婷婷| 精品视频这里只有精品| 色色综合色视频| 99re热99| www.超碰在线| 久久精彩免费视频精彩免费视频| 丁香五月性| 丁香久久综合| 99无码视频| 天天久综合网永久入口17v| 视频久久9| 色青五月天| www.1024久久| 99热全是精品| 国产精品色婷婷久久久精品| 26uuu偷拍亚洲欧洲综合| 亚洲国产黄色电影| 久久综合五月婷婷| 日本女人久久| 婷婷五月天影院| 亚洲啪啪啪啪| 五月天激情综合网站| 99综合| 色色色色色热| 五月婷婷久久综合| 另类综合婷婷五月天欧美视频| 极品五月天| 热99视频| 亚洲狠狠干| 99这里只有| 婷婷爱五月天| 国产在线中文字幕| 狠狠色色| 日本久久久97| 97久久五月丁香婷婷| 丁香五月最新网址| 丁香五月天导航| 99色色爰| 婷婷五月综合激情小说| 久久婷婷五月天蜜桃| 久久精品这里只有精品免费首页| 大香蕉伊人爱在线| 狠狠干无码| 人人操av| 精品国产AV色一区二区深夜久久 | 99成人网一区| 亚洲成人电影aaaa| 天天日本夜夜谢| 99激情在线| 看片视频在线免费日产在线看| 97色婷| 中文字幕日本最新乱码视频| 丁香五月婷婷天堂大香蕉| 激情五月色婷婷| 91色久| 天天日日天天| 99色网站| 亚洲操人| 日韩五月婷婷| 99色在线| 五月激情丁香| 丁香六月婷婷久久综合| 九月丁香八月婷婷加勒比| www.99久久久久99| 丁香五月天色综合| 欧州色色| 99热这里| 九九大香蕉黄色影院| 久久色五月| 天天婷婷色六月| 92久久| 少妇大叫太大太粗太爽了A片| 极品五月天| 中文字幕在线不卡| 99re最新地址| 六月天婷婷| 强奸幻女毛片| 色亚洲中文| 亚洲激情五月| 香蕉网婷婷| 9有码中文| 激情5月婷婷狠狠干| 五月天婷婷在线观看| 亚洲天堂久久| 人人草碰| 精品人妻久久久| 97色啪| 国产69久久久欧美黑人A片| 高清国产AV| 婷婷丁香高潮了| 99这里只有精品视频| 丁香婷婷色五月激情综合| 婷婷丁香精品视频在线观看| 亚洲性图一区二区三区| 另类A片| 天堂美国久久| 色色色视频| 美欧成人视频| 综合色视频| 婷婷舔| 97人人干人人操| 免费91久久精品| 超碰碰碰碰| 人人干av| 丁香花五月天社区| 欧美成人精品一区二区 | 狠狠色丁香久久婷婷综合五月| 日本在线视频播放91| 一本色道久久88加勒比| 婷婷6月综合网| 爱婷婷都市激情| 91男人操女人视频| 五月色情婷婷开心五月色情| 狠狠穞A片一區二區三區| 碰碰人人漕| 五月婷婷乱| 色综合色色| 久久综合色五月| 狠狠久综合| 婷婷五月天伊人| 狠狠狠狠狠狠色| 欧美黄色韩日网| 六月婷婷色色网| 安息电影在线观看完整版| 色丁香婷婷| 欧美毛卡| 开心婷婷丁香五月| 色站9/| 丁香九月婷婷色| 国产亚洲精品AAAAAAA片| 婷婷四月 成人 狠狠干| 思思热在线视频精品| 六月婷婷色综合| 五月婷精品| 在线观看亚洲视频影院| 亚洲黄色精品| 99色在线观看| 久久激情网| 男人的天堂999| 玖玖精品视频| 7EzOBIhNq85TO| 丁香九月综合| 色一情一乱一伦一区二区三区| 激情q青青草在线婷婷| 婷婷丁香六月| 五月色欧洲| 乱乱av| 日韩色情亚洲五月天婷婷| 操人妻AV| 玖玖资源在线视频| 九九热99视频在线| 天天日综合| 欧美群妇大交乱婬网| 婷婷五月天AV| 天天天天天操| ou洲色吧| 天天久久狠狠色综合| 97久久久久| 五月开心激情| 99九九视屏| 色操综合| 自拍偷窥99热| 激情五月网站| 視频福利乱色| 六月色婷婷| 天天色伊人| 亚洲婷婷性爱| 丁香五月婷婷五月天| 九热视频在线精品15| 九九人人操| 99热在这里只有免费精品| 国产AV一区二区三区日韩| 99热成人在线| 日韩无码专区| 亚洲成人无码专区| 六月婷婷综合激情| 亚洲性爱干干| www.刺激色网站www.| 亚洲无码播放| www.婷婷,com| 全高清无码视頻| 五月丁香色五月| 99久久超级| 六月婷婷开心| 五月婷婷激情四季| 五月天怕怕| 亚洲色99| 色综合色色色| 狠狠干五月丁香| 97成人在线视频精品| AV电影在线播放| 5月丁香六月婷婷| 91凹凸在线| EEUSS鲁片一区二区三区| 99久久久国产精品免费蜜乳tv| 日本婷久久| 国产XXXX搡XXXXX搡麻豆| 婷婷狠狠操| 思思视频这里是精品| 玖玖综合玖玖| 人妻熟人中文字幕一区二区| 色欲av伊人久久大香线蕉影院| 狠狠操狠狠狠| 九九综合视频在线观看| 99re免费在线视频| 色色五月天 亚洲| 婷婷亚洲色| 婷婷五月丁香网| 日本99视频| 亚洲成片在线观看| 丁香六月天婷婷色| 婷婷五月天网| 色五月在线观看| 六月丁香婷婷五月| 久久五月丁香激情综合| 99在线观看| 99在线爽| 男女啪啪视频久 9| 国产在线aaa片一区二区99| 91婷婷在线| 婷婷综合色播网| 亚洲日本激情| 337p大胆噜噜噜噜噜91Av| 久久婷五月综合| 激情婷婷丁香色情五月天| 婷婷99视频精品| 9色天堂| 欧洲色区| 久久久久9| 激情99热| 91视频一起草| 日本久久精品18| 深爱婷婷丁香五月激情| 国产精品蜜臀99| 天天搞夜夜叫| 婷婷丁香视频在线观看免费| 91viP在线看| 激情熟女网| 国产av网| 亚洲AV无码电影| 免费无码毛片一区二区A片| 久久九九99| 五月婷婷亚洲| AV在线大香蕉| 色欲av伊人久久大香线蕉影院| 色99视频| 综合色影院| www激情com| 牛牛碰免费| 激情五月激情综合网一级丸片 | 夜夜综合色| 高清无码中文字幕aVDV| WWW.桔色成人.COM| 激情五月天婷婷视频| 97色五月天| 亚州激情网站无码| 五月激情精品视频| 五月天小说激情| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 五月激情精品视频| 99热青青草原| 欧美性爱5月天天天看| 色婷婷色五月丁香| 丁香五月欧美色综合| 婷婷五月天综合中文| 亚洲久久婷婷| 99热.com| 日91高清无玛| 丁香色色网| 五月丁香综合啪啪| 超碰99在线观看| 99热超碰在线| 丁香五月天天久久综合小说| 极品五月天| 91人人爽人人操| 久久中国毛毛片爱久久| 97色97干| 五月天国产成人| 丁香婷婷免费| 手机免费福利视频| 久99视频在线观看| 婷婷九月色| 丁香婷婷五月份| www.韩日视频| 91一起艹| 精品色色网| 激情五月,色播五月| 成人一级片| 丁香六月婷婷综合| 色综合五月婷婷狠狠干| 五月婷婷丁香网| 任你搞网站| 色噜噜狠狠色综无码久久合欧美| 91re色综合视频| 婷婷的色色五月天| 五月天婷综合网站| 九九热经典视频在线观看| 中文成人在线| 亚洲综合另类| 91亚洲天堂| 色狠狠五月天| www,婷婷| 深爱开心激情| 婷婷久久欧美| 天天操夜夜爽天天操| 亚洲一区先锋影音| 亚洲熟女色| 五月天婷婷激情| 久久婷婷五月综合色天| 精热在线综合网| 激情婷婷五月天日本系列 | 丁香五月天.com| 综合色五月| 香蕉视频性爱BB做爱| 91人人网| 狠狠狠狠狠操| 亚洲天堂热| 99丁香五月| 五月天综合激情网| 五月天成人在线| 久久网日本| 久久婷婷一级片| 色五月婷婷中文字幕在线观看 | 婷婷五月天狠狠搞干| 丁香六月天| 国产亚洲色婷婷久久99精品91| 日韩欧美成人网| 亚洲色情久久| 九九精品亚洲| 婷婷色影音天| 国产中文亚洲欧美日韩性交| 婷婷五月激情网| 日本强伦片中文字幕免费看| 国产成人网址| 99热精品在线| 亚洲黄网在线| 先锋资源996| 色婷婷综合久久久久| 久久丁香网| tingting五月天亚洲| 99国产精品久久久久久久久久久| 伊人喵咪a V| 26uuu.| 日本久久婷| 老师把我爽高潮了免费A片| 五月天激情网址| 97人人操人人爽| www久久久久| 亚洲色vA| BBWCUCKOLD精品熟妇| 丁香五月天激情| 色五月 五月婷婷| 99riAV成人在线视频| 久久99热免费| 免费视频无码| 亭亭五月丁香综合欧美| 丁香五月欧美激情| 99热丁香五月| 日本狠狠色| 色色色色色九九九九九| 先锋男人99资源| 大香蕉人妻| 超碰免费在线| 热99在线| 99热永久在线观看| 欧美一级色| 秋霞免费三级片| 激情五月天色色网| 婷婷五月天久久| 综合久久影院| 婷婷五月花| 97人人干人人操| 五月婷精品| 九月丁香婷婷综合| 激情色色| 丁香五月天视频| 99热欧美在线观看| 国产成人+综合亚洲+天堂| 无码se| 五月婷婷激情| 爱草视频在线观看| 亚洲激情四射色| 99爱视频免费看| 国产特黄色精品一区二区三区精品无广告| 开心五月天激情网站| 99精品网址| 色情五月综合婷婷| 亚洲免费观看高清完整版AV线| 色播五月婷婷| 秋霞成人毛片一级A片| 91狠狠色| 色色影院aaaav| 亚洲欧洲中文日韩久久AV乱码| 激情丁香五月激情婷婷| 婷色综合| 丁香五月激情综合| 激情婷婷五月天。| 欧美成人精品A片免费一区99| 五月天色五月天| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 激情婷婷啪啪| 色综合偷拍| 婷婷激情人妻| 丁香六月色香蕉视频| 无码人妻精品一区二区蜜桃色欲| 26UUU在线观看| 婷婷五月欧美| 五月丁香999| 国产精品五月丁香| 五月婷婷先锋| 伊人久久大香线蕉av最新| 五月色综合网欧美网| 狠狠精品干练久久久无码中文字幕 | 激情床戏| 色六月丁香婷婷狠狠干| 久久丁香婷婷色情综合| 狠狠爱婷婷丁香| 色五月丁香六月资源站| 狠狠婷婷日韩| 久久久激情视频| 99亚洲综合| 午夜丁香久久久久久| 9九色首页| 色色色视频免费无码 | 另类激情五月| 久久久婷丁香五月天激情综合| 婷婷久久大香蕉| 夜夜综合色| 91热爆在线| 婷婷狠狠干| 九色91国产| 思思久久96热在精品国产,| 无码一级片| 综合五月婷婷| 亚洲最大激情无码| 五月天 综合 在线| 婷婷丁香成人五月天| 99色色网| 婷婷玖玖五月天| 一个色的综合| 中文字幕人妻在线| 大香蕉视频婷婷| 婷婷伊人| 婷婷亚洲五月| 五月天婷婷色小说| 99热91| 夜色.cnm| 色五月情| 亚洲99热| 五月丁香成人网| 婷婷丁香一月| 97久久久| 蜜臀99久久精品久久久久| 亚洲成av人影院| 天天射美女| 可以看的AV网站| 99热在线免费观看精品| 中文字幕av久久爽一区| 免费观看日韩成人av| 91狠狠色丁香婷婷综合久久| 亚洲视频五区| 丁香六月激情国产| 六月丁香激情婷婷| 五月激情丁香六月狠狠干| 秋霞日本免费毛片A片| 久久久91精品| 久久99国产综合精品免费| 亚洲激情av| 可以免费观看的AV| www,99热| 六月天丁婷婷| 婷婷深爱五月亚洲综合| 婷婷激情五月| 综合久久综合| 夜夜爱伊人| 日韩激情网站| 超级碰碰一区| 思思干精品| av在线播放网站| 五月天成人综合| 色婷婷视频在线| 欧美日本国产欧美日本韩国99| 熟女激情五月天 | 欧美狠狠色| 亚洲成人黄色网| 激情五月天小说视频| www.99热视频在线观看| 激情综合婷婷五月| 99国产小视频2013| 性五月激情| 婷婷久久综合久| 99久久网站| 91成人品| 亚洲精品成人| 成人 在线 日韩| 99在线精品视频| 91九色无码日韩| 亚洲网站999| 五月婷激情影院| 婷婷五月天黄色网址| 91疯狂操操操操| 久久天堂| 99色干| 激情丁香社区| 99re99在线看| 第二色AⅤ| 夜夜天天久久婷婷| renrencaoav| 99re这里只有精品首页| 久久婷婷婷婷伊人| 婷婷五月天综合中文| 2025年最新亚洲在线欧美| 九九机热| 熟女激情五月天 | 五月丁香激情深爱婷婷| 狠色色狠网| 五月丁香婷婷六月| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 激情久久综合网| 思思热在线播放| 日本色综合| 色色色色色色色色五月先| 色婷婷九月| 天天综合色| 国产精品久久久久久久久久| 97久久综合网| 五月婷免费视频| 婷婷六月啪啪| 久久激情综合| 五月天俺去也| 五月99久久| 五月天婷婷在线播放| 亚洲精品久久久无码| 婷婷福利影院| 婷婷激情人妻| 婷婷久久欧美| 狠狠五月天激情| 色色色综合| 99热这里有精品| 激情久久伊人| 操操自拍| 月婷婷亚洲| www.狠狠艹| 丁香婷婷基地| 亚洲乱码日产精品BD| 久草五月婷| 99er这里只有精品视频| 婷婷综合网站| av久热| 久久艹 五月天| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 亚洲五月天激情| WwW色婷婷| 久青操| 五月丁香婷婷婷婷综合网| 丁香五月婷婷基地| 国产精品美女久久久久AV超清| 婷婷五月丁香性爱| www。五月天激情| 六月丁香成人网| 婷婷五月天堂| 欧美婷婷综合| 天天综合激情| 五月婷婷激情综合av| 九九Av| 影音先锋91资源站| 色综合色综合色综合高潮| 夜夜躁爽日日| 欧美性色A片免费免费观看的| 射久久丁香五月| 青草视频在线蜜臀| 日本啪啪网| 91大操| 久操b网| 日日操夜夜撸| 成人无码精品1区2区3区免费看| 丁香五月开心亚洲| 五月丁香婷婷婷婷综合网| 亚洲AV网址| 岛囯综合激情网| 亚洲激情丁香五月天色| 婷婷成人五月天成人文学| 亚洲熟妇AV乱码在线观看| 超碰com| 色色色国产| 五月色综合| 超碰成人在线观看| 激情五月天小说| 精品一二三区久久AAA片| 另类激情四射| 五月婷婷丁香瑟瑟视频| 久久久久久人妻| 日本啪啪天堂| 五月天综合视频| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 97影院一级片| 成人开心五月天| 日韩综合成人| 五月激情婷婷图片基地| 五月天综合激情网| 五月花激情网| 亚洲经典小视频| 午夜天堂一区人妻| 这里只有精品视频视频在线观看| 丝袜激情网| 婷婷色五月天色色| 久久婷婷五月综合色丁香| 性做久久久久久久免费看| 婷婷丁香社区网| 丁香五月婷婷啪| 婷婷玖玖五月天| 五月天伊人网| 爱iii做iiii日日| 婷婷丁香五月天狠狠| 国产乱子轮XXX农村| 婷婷五月天激情四射五月天激情| 激情综合网五月婷婷| 大香蕉欧美在线| 色婷婷成人| 黄色aa观看aaguochan| 这里只有精品视频在线看| 九九9久九9国产视频| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 久久精典| 在线中文av| 五月丁香激情婷婷| 99九九玖玖| av激情在线| 综合图片色色| 視频福利乱色| 丁香五婷婷| 丁香婷婷91在线观看视频| 五月婷婷婷丁香播| 91人人操| 99久在线观看| 超碰大香蕉网| 思思热99热| 99在线精品视频免费| 99热这里只有精品55| 激情综合播播| 激情婷婷五月天| 综合在线丁香五月| 另类丁香五月天区图| 午夜婷婷六月天| 丁香五月天社区婷婷| 久久金品黃色| 182TV亚洲| 婷婷九九| 狠狠色婷婷7| 色欲一区二区三区精品A片| 男人综合网| 激情五月天。| 丁香五月天资源网| 日韩操逼大片| 五月天色区| 激情综合五月.....| 九久久婷婷| 天天天久久人人人合| 99视频网址| 激情綜合W W W,激情五月天| 五月丁香婷婷AV天堂| 久777| 99色在线| 久久九九综合| 八戒青柠影视剧在线观看| 激情五月www| 99WWW免费视频| 久热这里只有| 综合综合网| 六月丁香天堂| 久久三级视频| 天天干天天操天天干天天操天天干天天操 | 人人爱摸视频| 99综合视频| 中文字幕乱码亚洲精品一区| 天天草天天摸| 五月丁香久久| 色九四色| 五月天婷婷免费| 热的国产,热的综合,热的有码| 久久久精品婷婷五月天| 69久久99精品久久久久婷婷| 狠狠草天天草| 色综合9| 五月大香蕉| 天天综合图片| 狠狠综合区| 深爱婷婷网| 亚洲欧州色情在线观看| 91人妻人人操人人爽| 色婷婷五月天| 婷婷性福五月天| 深爱五月激情综合| 色吊丝av中文字幕| 噜噜噜久久| 婷婷开心激情| 久久99激情| 婷婷中文字幕在线| 狠狠干,狠狠操| 婷婷五月综合网| 成人色站,在线视频,看片-SS1AV| 久久五月天激情婷婷| 婷婷五月天小说| 26uuu精品一区二区| 亚洲综合新99视频| 婷婷丁香五月91| 99精品国产在热久久| 伊人久久大香蕉网| 丁香五月六月激情| 五月婷丁香| 综合日本婷婷| 少妇AB又爽又紧无码网站 | 影音先锋 婷婷| 婷婷五月天久久久| www.久操| 国产人妻人伦精品一区二区| 婷婷综合97| 丁香婷婷久久综合在线| 五月婷婷在线短视频| 91久久免费| 综合色图婷婷| 丁香成人五月天| 四月婷婷丁香五月| 亚洲综合色丁香五月天| 啪啪91| 玖玖精品婷婷| 99久久欧美| 欧洲色色| 丁香九月婷| 五月丁香婷婷综合网| 激情婷婷五月黑人| 四月婷婷五月色综合| 综合激情肏逼网| 五月婷婷碰碰| 成人片黄网站色大片免费毛片| 色综合九九| 丁香五月婷婷基地| 丁香五月婷婷激情中文| 天天插天天很| 26uuu欧美日韩| 五月丁香啪啪综合网| Y11111111111少妇电影院| av国产精品| 五月丁香婷婷综合网| 色欲婷婷五月天| 色婷婷电影网| 婷婷亚洲欧美丁香五月| 五月丁香亭亭天天舔| 色人五月婷婷| 99热精品10| 丁香五月天导航| 色综合久久天天综合网| 91激情五月开心| 都市激情亚洲| 激情久久综合网| 97干在线免费| 丁香五月狠狠在线观看| 99人妻碰碰久久久禁片| 亚洲综合五月天婷婷丁香| 丁香五月成人网| 99视频内射三四| 久久婷婷色| 婷婷精品免费久久| 日本久热| 超碰成人在线观看| 久操热线| 99久久久| 99久热| www.夜夜操| 五月天综合网| 香蕉AV福利精品导航| 国产日比| AA片在线观看视频在线播放| 亚洲精品V天堂中文字幕| 精品夜夜澡人妻无码AV| 精品人妻伦九区久久AAA片| 极品少妇XXXX精品少妇偷拍| 婷婷97狠狠成人网站| 午夜成人片400| 三人荫蒂添的好舒服A片| 91紱請| www.com久久久久久久久久久久久久久久久| 日本无码专区| 97超级碰人人| 婷婷五月乱交换| 久久码久久无清| 99热网址| 五月丁香大相交| 夜夜骑夜夜撸| 色99网| 丁香网站| 可以免费看的av网站| 日韩欧美成人网| 国产美女视频久| 99热国产精品| 人妻丰满精品一区二区A片| 777精品成人a v久久| 人人操超碰| 久久六月婷婷| 人妻22p| 久热只有精品| 国产成人AV| 日本熟女啪啪| 中日韩狠狠色| 日韩黄黄| 五月天欧美 另类小说| www.av骚货| 综合婷婷五月天| 色婷婷亚洲| 狠狠综合| 日操夜操天天操不卡| 中文字幕成人影视| 深爱五月月天| 99re这里有精品手机在线| www,天天干| 亚洲中文字幕网| 99热久久这里只有精品| 亚洲视频久久| 久久99网站| 婷婷五月天激情亚洲小说| 直接看的AV| 综合五月婷婷| 秋霞少妇AV网站| 冬月かえでAV无码播放| 欧美色婷婷| 婷婷伊人久久综合| 婷婷情色五月天| 噼里啪啦完整版中文在线观看| 丁香五月天堂亚洲社区| 五月天婷婷网站888| 六月丁香婷婷网| 99色在线| 丁香五月激情综合| 色一情一乱一乱一区9| 欧美狠狠一在草| 免费不卡狠操美女视频网| 丁香五月天激情视频| 97luluse| 人妻AV在线| 人人操人人爱丁香五月| 色婷网| 婷婷五月激情基地| 色综合色综合网| 天天爽天天干天天| 99免费| 9久热在线精品| 精品国产人人爱人人| 色色色热热热| 国产做A爰片毛片A片美国| 久久激情五月网| 开心五月婷婷在线视频免费观看| 五月天综合网| 香蕉AV777XXX色综合一区| 欧日韩成人| 久久人妻高清中文| 激情五月天视频| 久久婷婷六月综合综合| 婷婷五日b| 欧洲不卡视频| 97成人视频| 九热在线这里有精品6| 五月天婷婷综合网| 婷婷综合中文| 26UUU一区二区| 久热99热| 伊人在线大香蕉网| 这里只精品| 色综合久久天天综合网| 丁香婷婷婷婷十二月在线观看视频| 99免费成人网| 日韩精品999| 69精品无码一区二区三区| 人妻熟妇六区| 99精品视频免费观看| 91打屁股视频网站| 思思精品热在线| 亚洲精品又粗又大又爽A片| 色婷婷欧美| 色5月丁香婷婷| 大鸡巴伊人网| 日本熟女内射| 色色丁香婷婷综合| 夜夜干天天干| 久草婷婷网 | 国产性爱一级| 天天色综网| 91se精品国产| 亚洲天堂亚洲色色色| 亚洲综合九九| 婷婷六月视频| 激情综合网五月天| 五月丁香婷久久| 五月四色色| 极品少妇高潮啪啪AV无码| 五月婷婷在线丁香| 九月丁香亭亭| 亚洲性爱电影| 九九热精品视频在线观看| 高清av在线国产| 丁香五月婷婷天| 亚洲精品又粗又大又爽A片 | www.激情在线| 99精彩视频| 国产日产成人亚洲欧美国产VA| 99热这里只有精品1025| 亚州操逼网| 亚洲五月婷婷| 中日韩狠狠色| www.色婷婷| 九月色婷婷综合| 五月婷婷色播| 一区三区视频有限公司| 夜夜干夜夜操| 亚洲精品444久久久久久| 无码网站视频| 亚洲视频在线网| 丁香五月婷婷色情综合| 色丁香五月婷婷综合久久| 第四色首页| 婷婷基地成人五月天| 色色色色色色色色网站| 成年视频免费观看| www.婷婷,com| yellow视频在线观看91| 亚洲不卡| 中文网AV| CHINESE熟女老女人HD视频| 婷婷五月激情丁香激情| 尤物一区二区| 五月丁香六月婷婷手机无线| 成人国产网| 天天舔天天操| 91九色视频在线观看| 色色狼人综合| 亚洲激情AV| 欧美在线| 极品五月天| 亚洲AV电影美洲AV电影| 精品久久这里热66| 色婷婷大香蕉| 丰满人妻一区二区三区| 伊人天天色| 99国产97在线,| 偷偷操99| 操碰97| 99ER热精品视频| 午夜婷婷六月天| 《久久综合九色综合97婷婷| 97热这里精品在线视频| 激情五月天黄色小说| 中文字幕有多少字| 思思精品热在线| 久操干| 99热伊人| 五月草影视| 日韩99视频| 丁香六月婷婷| 五月花综合视频| 伊久久婷婷| 在线观看国产高清视频免费网站 | 五月天婷婷xxx| ..真实国产乱子伦对白在线_欧 | 丁香色五月AV在线| 婷婷伊人网| 婷五月天在线草| 亚洲色区17| 91丨九色丨大屁股| 深爱丁香激情| 国产综合婷婷| 嫩草AV久久伊人妇女超级A| 成年人看Va免费视频| 色五月激情五月天| 熟女五月天久久综合| 伊人大香蕉综合在线| 丁香五月婷婷色| 天天爽综合| AV在线免费播放| 亚洲视频在线网站| 久超超碰| 五月天自拍视频| 任我鲁这里有精品视频| 精品成人无码A片观看香草视频| 五月天色综合| 五月丁香成人| 国产综合色婷婷精品久久|