免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
91狠狠色色丁香婷婷综合久久| 亚洲五月婷| 人操人人| 亚洲精品久久久无码| 97人人搞| 无毒黄色网址| 如何安全看伊人婷婷| 五月婷婷偷拍| 天天爽天天| 美女va| 69久久久| 久草婷妨| 午夜AV网| 亚洲第一成人无码A片| 这里只精品| 天天干天天操天天射| 国产亚洲精品久久一区二区三区| 怡红院 久久| 久久色午夜在线导航| 99A片| 第二色AⅤ| 亚洲婷婷婷| 国产69久久久欧美黑人A片| 国产午夜精品一区二区三区四区| VA婷婷| 4438全国最大视频成人网站在线观看| av婷婷丁香| 丁香五月色| 色停停五月,在线观看| 超碰伊人碰婷婷五月| 五月丁香综合影院| 大香蕉九九| 婷婷婷五月香蕉| 亚洲亚洲人成综合网络| 操逼六区| 99在线热| 九九无码| 色综合久久久久| 六月婷婷综合激情| WWW.桔色成人.COM| 五月丁香六月婷婷激情视频在线观看免费| 99视频这里只有精品10| 美女婷婷六月色| 9有码中文| 麻豆精品| 9l视频自拍9l九色9l成人| 思思热在线播放| 五月色丁香激情| 激情五婷精品网在线观看网址| 老美AA片| 五月天丁香欧美激情| 久久五月丁香| 久久久久亚洲AV综合| 丁香在线视频| 丁香六月啪| 超碰在线视屏| 少妇被躁爽到高潮无码文 | 国产精品久久久海的味道| 亚洲色综合| 激情国产综合| 久热超碰| 深爱开心激情网| 丁香狠狠| 日日爱激情| 色小说五月天| 色五月婷婷丁香五月| 亚洲色色香蕉| 中文字幕在线观看视频www| 久久在线人妻| 久久玖玖综合| 91一起操| 一起操 91N.com| 色婷婷影音| 日本在线wwww| www.99热日韩.com| 深夜激情网| 五月天天爽| 色五月丁香五月| 99九九视频| 午夜大香蕉| 天天爽天天爽| 大香蕉伊在| 久热AA| 婷婷五月综合婷婷| 激情五月婷婷五月丁香五月开心五月| 大香网伊人久久综合| 五月婷婷日| 亚洲综合九九| 色婷婷性爱| 日韩啪| 激情另类综合| 五月婷婷深深爱| www超碰| 无码人妻少妇色欲AV一区二区 | 婷婷丁香五月视频| 丁香六月激情综合| 青柠影视免费高清电视剧| 120分钟婬片免费看| 五月天婷综合| 色色色五月天婷婷| 久鲁鲁色网| 日屌日日操日日色| 欧美性生交XXXXX无码小说| 97人人射| 久热九九| 激情视频综合| 午夜福利成人AV91| 久久这里有精品99| 天天插天天爽| 夜夜资源站| 内射丰满人妻| 91碰碰| 色色婷婷婷丁香五月天| 婷婷综合亚洲| 丁香五月在线观看| 国产精品男人AV不卡| 日本久久九| www.久久久.com| 99视频精品8 | 99久热| 中国女人做爰A片| 偷拍99在线视频观看| 色天使色综合| 五月婷婷丁香五月婷婷| 色色婷婷丁香五月天| 最新va在线播放| 天天天天干| 欧美日韩国产一区| 欧美五月婷婷| 97婷婷丁香五月综合| 六月婷婷最新网址| 丁香六月婷婷综合欧美| 开心深爱激情网| 亚洲图色五月天| 熟女婷婷网站一婷婷五月一丁香婷婷一婷婷激情网 | 久99热在线观看| oVV4WIB3vFi8D| 成人网站免费在线播放| 97caop| 久久婷婷网| 99久热这里只有精品| www.黄色片-久久成人国产精品在线播放-999AV | 4399在线观看免费高清黄色视频| 91干| 99精品热| 精品久热69| 中文字幕婷婷五月天在线观看| 激情五月综合| 亚洲 视频 导航 一区| 亚洲五月天综合色| 久久五月综合| 第六色在线| 丁香六月天| 久久性爱视频| 99九九久久| 久久久五月天| 国产精品18久久久| 亚州性爱99| 亚洲色无码A片一区二区麻豆| 去色色五月天| 久热人妻| 女人天堂av| 亚洲色啪| 五月花激情| 色婷婷五月影视| 欧美视频五区| 99精品在线观看| 色五月婷婷婷婷婷婷婷婷婷婷| 99色在线| 六月婷婷五月天| 久操干| 欧洲色色| 亚洲天堂爱爱| 香蕉久久国产AV一区二区| 国产毛片欧美毛片久久久| 色五月综合97| 六月撸婷婷| 黄色五月婷| 丁香激情五月天| 色情五月天。| 日本99视频| 天天舔天天摸天天射| 久艹大香蕉| www.久久久久久| 秋霞AV淫| 婷婷五月激情基地| 六月婷婷最新网址| 色婷婷五月在线| 蜜桃婷婷五月| 九九偷拍网| 99啪啪视频| 亚洲精99| 97性视频| 日本综合九九| 亚洲色五月天| 草综合14| 热这里只有精| 久久综合影院| 影音先锋五月婷婷| 99这里都是精品6| 婷婷伊人激情婷婷| 婷婷五月综合网| 久久亚洲激情五码| 色情婷婷五月天| 五月婷婷啪| 51精品国自产在线| www.五月天色色.com| 狠狠狠狠狠狠草| 一级二级色大片| 激情五月激情综合俺也去婷婷小说| 九九热99免费视频| 五月天成人网婷婷| 综合大香蕉| 久久婷婷啪啪视频| 天天天综合网| 五月天婷婷色播在线网| 久久99免费视频网站| 婷婷五月天亚洲丁香| 狠狠婷婷色| 激情五月丁香亭亭| 国产色五月婷婷| 六月丁香综合| 婷婷激情五月视频| 超碰国产一区| 情欲禁地| 久久色情| 久久99精品久久只有精品| 欧美一级色| 色婷婷精| 丁香久久在线| 国产精品久久久久久妇女6080| 99国产小视频免费观看| 免费V片在线| 亚洲情欲| 久久久久9| 五月婷婷AV| 青青草搞屄视频网站| 色五月情| 777精品久无码人妻蜜桃| 亚洲婷婷丁香五月视频| 欧美日韩成人在线网站| 五月花婷婷| 久热91精品| 五月丁香无码| 天天狠狠色综合| 激情五月婷黄版| 色综合色色色色| 少妇水多A片太爽了| 日韩视频99| 色播五月丁香综合| 激情婷婷五月天网址| 99视频| 96丁香六月婷婷蜜桃综合久久| 五月天婷婷丁香视频| 超级碰人人操人人干| 色狠狠综合网| 在线日韩视频| 色五月综合| 99热久| 久久婷婷五月综合激情国产| 亚洲久久婷婷丁香五月天| 婷婷干六月综合旧址| 久久激情视频| 成人片在线播放| 夜夜骑夜夜撸| 久久久GOGO无码啪啪艺术| 天天插天天插天天插天天插| 婷婷五六月丁香| 黄页免费一级视频懂色| 中文字幕丰满孑伦无码专区| 国产操碰| 五月丁香六月激情| 极品人妻VIDEOSSS人妻| 99热官网| 国产免费性爱| 9久久网| 97碰碰在线观看视频| 婷婷久草| 四色五月婷婷| 丁香五月激情啪| www.91色| 五月天停停基地| 操日挥操日日| 久9热在线视频| www.久久久久| 3p九色在线| 大香蕉视频99| 午夜色婷婷| 99久久66| 五月婷婷五月天激情网| 天天干天天射色综合| anquye伊人| 五月丁香六月婷婷综合网| 中文字幕成人| 六月狠狠综合| 人人摸人人| 精品夜夜澡人妻无码AV| 国外亚洲成AV人片在线观看| 丁香五月婷婷色五月| 大香蕉五月天婷婷丁香91| 欧美碰碰| 丁香五月 综合| 五月天色婷婷小说| 亚洲婷婷91丁香| 激情第四色| 97色 五月天丁香| 色五月自偷自拍婷婷婷婷| 综合色视频| 玖玖色资源| 天天射影| 欧美色色色色色色| 香蕉影院色| 九九热99视频在线| 五月婷婷九月婷婷九月婷婷| www.99热这里只有精品| 九九视屏| 欧美色必爱| 人人妻人人澡| 99热在线只有精品| 久久久久久久11111111111| 日本人妻伦在线中文字幕| 搡BBBB搡BBB搡五十| 亚洲精品V天堂中文字幕| 99精彩视频网站在线| BBWCUCKOLD精品熟妇| 日韩人妻AV在线| 香蕉国产2013| 日韩啊啊啊| 八戒青柠影视剧在线观看| 疯狂做受XXXX高潮A片| 五月丁香在线| 色五月激情视频在线综合| peg 2区三区四区的| 欧美一区二区三区不卡影视| 日婷婷久久开心| 成人精品视频99在线观看免费| 另类五月激情| 99久久成人| 97人人射| 综合激情在线| 色综合九九| 色婷婷成人| 婷婷五月天免费视频在线观看| 99re这里只有精品视频了| 99在线精品免费视频| 直接看的AV| 99热99色| 天天操婷婷| 开心婷婷丁香五月| 亚洲四色五月| 激情综合激情综合| 日韩啪图| 天天日综合| 亚洲日本三级片| 综合狠狠干| 思思热视频在线| 99久久久久久| 中文字幕黄色片| 国产午夜精品一区二区| 人人爽人人爽人人爽人人爽| 久久久99免费视频| www.色综合.com| 久久 天天| 久热爱大香蕉在线蜜臀悦色 | 婷婷五月综合视频免费播放| 久久ww| 91婷婷色五月| 丁香色婷婷| 亚洲最大在线| 99网| 婷婷在线操| 激情网五月天| 激情网开心网| 秋霞网在线免费基地五月婷婷丁香| 五月停亭六月,六月停亭的英语| 99精品7| 婷婷在线中文字幕| 激情深爱五月| 中文字幕在线不卡| 少妇人妻人伦A片| 亚洲综合干| 中文字幕乱码亚洲精品一区| 色色热99| 99九九这里有免费视频| 日韩av干| 久久国产AV| 久久精品系列| WWW.五月天9999| 粉嫩AV久久一区二区三区| 亚洲秘 无码一区二区三区妃光/1| 激情五月天开心网丁香无码| 丁香六月婷婷久久综合| www久| 在线播放成人网站| 五月婷婷综合精品| 亚洲午夜av| 婷婷中文字幕| 丁香五月天在线观看| 99精品偷自拍| 五月丁香婷婷深深爱| 人妻视频一区而且二区| 成人婷婷五月| 97人人妻人人艹| 综合久久99| 色呦呦免费观看| 日本人人超碰| 五月婷网| 五月丁香婷婷三级| 九九99免费视频| 国产婷婷色综合AV蜜臀AV| 99爱视频精品| 久久狠婷婷| 人人操AV| 激情五月天开心| 五月天天丁香婷婷在线中| 这里只有精品视频99| 操九色| 婷婷五月天成人网| 大香蕉久热| 天天在线久久综合 | 婷婷金品综合视频| 99热这里只有精品2| 亚洲天堂玖玖| 亚洲激情综合| 色婷婷97| 妻久久人久久| 久热中文字幕在线线观看| 激情婷婷丁香五月| 五月婷婷激情网| 日本五月天一页| 丁香五月色情| a九九热www| 影音先锋美国A| 日本色图综合| EEUSS鲁片一区二区三区| 婷婷五月色色| 婷婷色色宗合网| 色综合久久888| 亚洲激情综合| 久狠日av| 人妻自慰高清合集| 天天插天天| 99久久精彩视频。| 91vip在线观看| 九九Y精品热播| 另类少妇人与禽zOZZ0性伦| 色吧五月婷婷六月丁香| 99热只有精品在线| www.com在线操视频免费观看| 亚洲热综合| 热99久久这里只有精品| 91色色色18| 亚洲欧洲小视频9| 丁香五月天成人| 婷婷丁香六月| 久草婷婷| 色九区| 婷婷六月色开| 中文字幕在线免费观看视频| 婷婷五月天成人综合网| 亚洲网视屏| 9 1在线视频| 五月久久| 六月丁香婷婷色狠狠久久| 99免费在线视频| 综合色色网| 五月丁香激情婷婷| 五月婷婷啪啪| 婷婷操逼| 成人av在线网| 97色综合| 亚洲综合成人网站| 欧美日韩成人在线网站| 国产性av| 日本不卡一区二区三区| 五月天综合久久| 免费啪啪亚州视频| 五月色综合| 丁香久久| 五月丁香综合| 亚洲激情四射色| www,婷婷,com| aaaa.黄| 五月天婷婷色情| 99久久久久久www| 五月久久婷婷| 成人小说 五月天 婷婷| 婷婷丁香五另类网站| 免费V片在线| 91操在线观看| 99久热| caobi四区| 另类激情五月| 日本丁香五月| 在线综合网| 婷婷五月天网| 2021日韩无码| 天天操夜夜爽天天操| 99色日本| 夜夜涩涩涩| 五月婷综合性中心| 五月丁香啪啪| 成人电影一区| 爆乳熟女-区二区三区| 成人无码精品1区2区3区免费看| 五月丁香六月在线| 综合网精品99| 中文激情网| 色婷婷五月天激情综合| 国产精品久久久60086| 干婷婷五月天| 天天日天天插| 亚洲V国产V欧美V久久久久久| 五月丁香激情综合| www狠狠爱com| 久久久久婷婷五月热综合| 九九激情综合| 综合色激情| 啊v视频在线观看| 国产又色又爽又黄又免费| 九九热在线精品视频| 色五月av| 草草影院爱爱| 亭亭五月激情亚洲在线| 狠狠激情五月天| 热九九精品| 无人区码一码二码三码医生系列| 综合色图婷婷| 華人性愛AV在線| 五月婷婷六月综合| 欧美性生交XXXXX无码小说| 亚洲精品久久久无码| 狠狠精品干练久久久无码中文字幕 | 久久色大香蕉| 97人人射| 狠狠干夜夜干| 色综合综合综合| 色五月天丁香| 六月丁香好婷婷| 热久久91| 久久婷婷夜| 婷婷之六月丁香| 色色a| 久久婷婷五月综合啪| 婷婷欧美综合| 五月婷婷六月丁香五月| 五月丁香婷婷综合| 色五月天激情| 九色91视频| 任你搞在线观看视频| 婷婷五月色综合| 日本97在线观看| 狠狠干2007| 婷婷婷婷婷婷婷五月丁香| 这里有精品| 亚洲网站999| 五月情色天| 99精品丁香五月| 日韩无码一区二区三区四区| 亚洲九九九九| 亚洲亚洲人成综合网络| xxxx五月天色色| 国产成人va在线| 日本三级大片| 欧美五月丁香啪啪响视频| 99热骚货| 操碰色一区就去操| 先锋资源996| 婷婷成人综合五月| 国产又色又爽又黄又免费| 超碰中文字幕在线| 这里只有精品在线视频在线观看| 天天做天天爱| ri电影在线| 夜夜爽天天爽| 5月丁香婷婷| 日本九九九九| 中文无码精品一区二区三区| www.久久久.com| www.色综合.com| 91丨九色丨熟女丰满| 最近免费中文字幕大全高清大全1| 九九99偷拍视频| 色激情综合狠狠婷婷| 人妻精品一区二区三区| 婷婷影院A成人| 婷婷久久六月费| 亚洲日比视频| www.99热在线| 伊人99热| 中国女人做爰A片| 深爱开心五月天| 色色色五月天婷婷| 天天操比比| 天堂色婷婷| 久久婷婷综合五月天| 伊人热婷婷| 欧美五月婷婷| 久久与婷婷| www.99色在线| 91人人操.COM| 天干干夜夜操| 婷婷影院欧美| 精品色| 五月色婷婷AV| 影音先锋 一区| 亚洲操操| 五月婷婷福利| 综合激情在线| 91久久精品国产91性色TV| 久久久精品99亚洲综合| www.久久久久| 骚货艹网站视频| 色婷婷天堂| 亚洲久热| 五月婷婷导航| 五月婷婷熟女| aaa久久| 双性美人被调教到喷水A片| 天天操夜夜夜夜爽| 五月丁香六月婷婷综合| 偷拍91九色| 丁香狠狠| 五月天天综合| 婷婷综合丁香| 九九视频这里只有精品| 婷婷五月天中文字幕.| 91久久久久久久| 天天天摸夜夜夜玩| 久热这里只有国产| 久久视频婷婷| 激情五月天天| 天天干天天操天天拍| 亚洲综合在线伊人婷| www久| 婷婷婷婷婷婷婷婷| 先锋资源996| 99九九99九九九视频精彩| 九九aV| 欧美色爱五月天| 深爱五月激情综合| 大香蕉99热| 热久久婷婷| 亚洲日韩一页精品发布| 久久精品亚洲热| 五月丁婷香| 97资源碰碰在线| 亚洲狠9| 欧美色频| 粉嫩av蜜桃av蜜臀av| 无码九九| 99黄色性生活| 日本九九视频| 色色影院黄大片| 日韩精品一区二区三区,四区,五区视频| 99日韩| 天天日天天操心| 婷婷草| 色天天综合成人网| 99色视频在线观看| 色婷婷丁香五月天在线视频| 六月婷婷AV| 丁香六月成人| 1024亚洲无码| 婷婷伊人五月天| 一本道在线电影| 夜夜爽天天爽| 欧美精品18| 婷婷色在线观看| 99久久玖玖| 天天爱天天狠天天透| 国产99美少妇| 激情美女五月天| 五月大香蕉| 九九久久五月天| 婷婷激情九月| 色五月成人| 日本精品99| 成片免费播放| 丁香六月婷婷五月天| 丁香伊人五月色婷婷五十路| 亚洲操人| 色99在线| 五月婷A V在线| 色噜噜丁香| 天天揷综合网| 日韩成人无码片| 色爱综合五月| www.91在线观看| 久9视频| 99国产小视频2013| 色吧五月婷婷六月丁香| www.丁香五月| www久久五月com| 婷婷五月俺要去| 丁香婷婷啪啪啪| 日韩99色99| 婷婷五月天伊人| 天天夜夜爽| 婷婷五月天国产| 五月丁香欧美综合| 五月婷在线| 欧美五月停| 九九精品系列| 成人在线视频网| 琪琪理论片| 影音先锋人妻出差| 91日日日| 超碰91在线| 丁香五月激情久久麻豆| 思思久久99热只有频精品66| 五月天激情图片| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 大香蕉九九| 综合久久99| 五月丁香另类网| 午夜九九九九九九九九九九九九九| 性爱激情久久| 婷婷黄色| 久久机只有这里精品| 综合网激情五月天| 五月狠狠| 黄桃AV无码免费一区二区三区| 久久色情| 久久婷婷丁香五月宗合| 密乳Va| 丁香五月图片| 五月激情六月丁香| 天天色粽合合合合合合合| 啊v视频在线观看| 日日操夜夜操中国无码| 51XX嘿嘿午夜无码| 高清无码 一区 二区 三区| 九九成人高清视频| 伊人深爱综合| 婷婷五月色播| 日本九九网| 天天色综合色| av色婷婷| 色婷婷丁香AV综合| 久久这里只有精品07 | 欧美内射AA| 亭亭五月色男人| 99久久网站| 99热 在线播放| 96性爱视频| 婷婷五月天激情网| 五月丁香久久色| 婷婷五月天色综合翘| 日日肏夜夜干| 99婷婷| 国产免费一区二区三区三州老师F1F1.CC | 色丁香在线视频| 色欲婷婷五月天| 狠狠色丁香久久综合婷婷亚洲成人福利| 色情五月天小说| 婷婷五月天在线观看| 97操操操| 大香蕉狼人久久| 五月婷婷丁香在线| 人碰人人人玩91| 少妇激情五月婷婷| 亚洲中文字幕av| 色婷婷狠| 亚洲99在线| 久久久久久18| 久久人妻视步| 久草婷妨| 五月WWW| AA片在线观看视频在线播放| 97操| 丁香五月婷婷色| 激情五月黄色| 婷婷综合网伊人| 国产成人精品123区免费视频 | 五月网激情| 国产激情久久久| 99riAV国产精品视频| 五月色丁香国产在线视频| 日日噜噜夜夜狠狠久久丁香五月| 亚洲精品视频在线播放| 色婷婷综合丁香五月天| 亚洲色色图片| 99婷婷| 99在线观看视频免费| 五月天婷婷影院影院观看| 婷婷久久色| 婷婷综合激情| 精品色色| 久久五月网| http:色情日本com| 九六五月天婷婷| 六月婷婷综合网2| 久久久精品人妻录| 人妻六月天| 狠狠色噜噜狠狠狠888| 草了bav视频在线观看| 激情五月天啪啪| 久大香蕉| 五月天综合网| 婷婷五月色| 亚州日本欧州韩美高青高潮一| 婷婷天天日婷婷| 色综合爽| 国产视频色色色色色色色| 色欲天天综合网| www久| 九九九午夜影院成人| 激情小说五月天| 欧美天天五月丁香免费观看| 亚洲天堂热| 激情五月深爱五月| 色色色香蕉五月婷| 99综合| 五月丁香婷婷久久| 丁香五月婷婷基地| 欧美激情综合色综合| 成人五月丁香花| 五月天激情久久| 丁香五月天啪啪| 国产午夜成人免费看片无遮挡| 永久的网站AAAA | 激情五月天小说视频| 色情综合网| 久久66精品| 大香蕉久久视频久久视频| 狠狠另类视频| 丁香激情五月天| 丁香五月另类色婷婷麻豆| 欧美日韩五月婷婷| 婷婷操逼| 99九九视频| 色婷婷五月综合| 亚洲成AV人片在线观看| 999热成人在线综合网| 五月婷A V在线| 99欧州偷拍视频| 五月社区婷婷激情| 日韩操逼大片| 美女久久天堂| 婷婷开心激情| 狠狠草狠狠草| 5月婷婷6月丁香aV| 久久性刺激| 婷婷五月丁香综合亚洲| 日本操逼九九九九58日本操逼| 99干免费视频| 中文av网| 激情五月综合亚洲另类| 91操片| 99热草草| 亚洲成人在线播放| 激情图片婷婷| 天天色天天舔天天爱天天爽 | 在线免费观看激情视频| 亚洲99手机免费看视频 | 亚洲国产色色| 深爱五月激情网| 97碰碰在线观看视频| 色综合色五月| www.99热视频| 五月丁香五月天现场视频| 激情五月最新网址| 午夜天堂一区人妻| 婷婷五月色播放| 色婷婷小说网| 丁香婷婷中文字幕| 成人必爱视| 99热国产| 开心五月婷婷婷美女| 婷婷五月色天| 熟女激情网| 久久美女五月天| 午夜无码精品色综合久久| 婷婷五月a| 精品99*| 中字幕视频在线永久在线观看免费| 婷婷伊人五月| 久久五月丁香综合17C| 成人AV综合在线| 2050人人操免费工开爱| 99热新网址| 可以免费观看的AV| 色婷婷丁香五月综合| 色色激情网| 噜噜操操| 人伦30P| 五月婷婷婷综合网| 激情国产综合| 91日综合欧美| 婷婷影院欧美| 久草五月婷| 激情婷| bukadeavzaixian| 色五月色情| 久久九九囯产| 欧美人人超级碰| 国产综合久久久777777| 成人国产欧美大片一区| 夜色综合网| 99在线热视频| 高清不卡一区| 丁香午夜天| 99性爱视频| 国产肥白大熟妇BBBB视频| 五月婷婷综合在线| 久久五月激情| 久久婷婷综合五月天| 美女五月狠狠| 99riAV国产精品视频| 丁香六月视频免费观看| 久热这里只有精品性色AV| 99伊人婷婷在线| 好色婷婷| 超碰成人在线观看| 五月婷婷六月丁香| 九月婷婷综合八月丁香在线观看| 激情四射婷婷| 色婷婷综合网| 五月天开心色情网| 婷婷丁香色情| 98色花堂98t.R| 97色色综合| 欧美丰满熟妇BBB久久久| 丁香五月婷婷影院| 欧美在线| 大鸡巴伊人网| 99操免费视频| 噜噜色五月| 天天肏天天爽夜夜爽| 久久五月网| 综合激情网激情五月。| 天天综合网亚洲综合网| 婷婷深爱色五月| 激情五月天电影| 亚洲成人综合在线| 五月婷视频| 久久综合最新网址| 色哟哟精品| 五月天婷婷激情干干| 丁香激惜男女| 五月婷婷激情综合网 | 久久无意婷婷| 婷婷六月丁香激情| 激情五月婷婷综合色播小说| 中出内射的人妻视频| 99热99热在线观看| 伊人久久五月天综合| 亭亭五月色男人| 人人操AV| 成人无码髙潮喷水A片| 这里有精品| 九九激情视频| 99久久99热| 婷婷五月天狠狠色| 香蕉久久国产AV一区二区| 欧美美女视频| 色五月天丁香婷婷色| 人人操操| 久久婷婷操| 亚洲综合1024| 亚洲xx在线| 7月婷婷六月丁香| 色狠久| 这里只有精品视频在线| 五月婷婷六月激情| 久久九网| 五月婷婷色播视频| 思思久久精品| 成人做爰A片免费看视频| 久久久久97| 国产五月丁香在线| 欧美日韩成人在线观看| 久久伊人大香蕉| 婷综合六月| 天天肏天天插| 婷婷色五月天在线观看| 久久久久久久人妻| 久久多色| 开心激情婷婷| 亚洲天堂色| 丁香五月第九色| 91丨九色丨东北熟女| 大地9中文在线观看免费高清| 丁香五月天天久久综合小说| 日韩五月婷婷| anquye五月| 国产在线aaa片一区二区99| 99热99日天天干| 五月天婷婷青青| 天天爽天天干| AAA久久久| 91久久电影| 色开心五月丁香| 这里只有精品9| 久久AAAA片一区二区| 71在线精品视频一区| 99er这里只有精品视频| 青青草原99热| 亚洲黄色网址| 五月激情婷婷色| 国产精品18久久久| wuyuedingxiang99| 婷婷五月激情图片| 超碰AV在线| 丁香婷婷性爱| www.91操| 91一起操| 1024日韩| 婷婷五月天久久久| 综合亚洲六月婷婷在线| 丁香六月五月婷婷| 欧美A A A A A| 99热99热99热99热| 五月婷婷性爱网| 国产精品久久7777777精品无码| 久久停停超碰| 日夜操B| 色色99| 99热最新精品| 五月婷婷五月天| 日本色婷婷综合| 成人无码精品1区2区3区免费看| 婷婷丁香五月天影院 | 婷婷激情六月中文| 视频色色色色色色| 日本在线wwww| 91人碰| AV在线中文| 天天日天天干天天操| 18久久| 色哟哟www| www98日本小时间到了| 激情婷婷啪啪| 久久精品夜色噜噜亚洲a∨| 色 五月婷婷基地| www色哟哟| 五月婷婷五月天| 99在线69| 国产毛片欧美毛片久久久| 久99久视频| 色婷五月天| 欧美激情五月| 六月激情婷婷综合| 五月婷六月| 五月丁香六月婷婷免费视频| 97久久久| 婷婷五月天另类网站| 亚洲V国产V欧美V久久久久久| 色综天天综合| 成人龟情网丁香五月| 女人天堂av| 草久私拍| 欧美激情综合| 精品成人无码A片观看香草视频| www超碰| 色婷婷六月天在线| 综合色网站| 成AV人片一区二区三区久久| 激情五月婷黄版| 玖玖九九超碰| 五月婷婷久久综合| 天天色色婷婷| 香焦网五月天| 国产乱妇无乱码大黄AA片| 都市激情五月婷婷综合| 八戒青柠影视剧在线观看| 梁铮版《蜘蛛女侠》在线| 中文字幕在线日亚州9| 好好干Av| 熟妇内谢69XXXXXA片| 五月综合婷婷开心网| 九九综合九九| 婷婷五月天论坛| 激情黄色小说色五月| 大香蕉综合网| 婷婷丁香在线播放| 国产成人网址| 艹色18p| 日韩成人电影AV| 99热首页| 色狠狠伊人久久五月丁香| 久久视频在线视频| 亚洲无码11| 五月丁香久久久| 91欧美| 涩 五月 婷婷 狠狠| 67194中文字幕| 密乳视频| 五月天无码| 免费成人中文字幕| 99欧美| 婷婷色网站| 午夜丁香婷婷| 亚洲99视频| 六月丁香花婷婷| 大香蕉操操| 欧美A片在线视频免费观看| 天天影院色| 天天草天天日| 亚洲色色图片| 在线99热| 黄色激情久久| 欧美123区免| 五月丁香婷婷五月色| 99热国产免费| 日夜夜久久| 天天摸日日舔狠狠添婷婷婷| 五月情涩综合婷婷| 亚洲天堂婷婷| 夫妇交换刺激做爰| 五月丁香六月激情欧美综合| 久色中文| 五月天五月色婷婷综合| 天天视频精品9| 中日韩美欧成人一区二区精品在线| 五月六月丁香激情| 色综合色色色色色| 五月丁香网中文字幕| 欧美人人女女精品综合五月天| 五月丁香六月情| 亚洲综合久| 日韩在线视频网站| 91人操人人人操人| 六月激情网| 少妇综合网| 色色色色热| 婷婷丁香18| 亚洲va欧美va天堂v国产综合| 色婷婷五月天激情| 婷婷久久久| 色噜噜狠狠色综合日日| 激情婷婷。| 狠狠色噜噜色狠狠狠综合色 | 99re久热只有精品6在线直播| 一级无码作爱片| 人人操碰| 青草青草久9视频在线视频| 五月激情啪啪| 亚洲无码色| 在线观看免费视频| 免费看欧美成人A片无码| 婷婷天堂综合| 天天干天天干天天干天天干天| 中文字幕色色| 欧美国产一区二区三区| 丁香婷婷激情五月色| 一起草无码| 在线网黄| 五月天亚洲图片婷婷| 九九99男女视频在线观看| 国产片XXXXA片国语对白| 婷婷的久久网站| 欧美99| 99精品久久| 久在线88综合| 亚洲视频在线网| 99手机在线精品视频| 97自拍视频网| 九九精品热播| 99ri精品视频在线观看| 另类视屏| 人人操99| 婷婷丁香水多多视频| 四月婷婷五月色综合| 丁香婷婷色九月| 婷婷丁香六月综合激情站| 爆乳熟女一区二区三区爆乳| 亚洲视频一区| 五月天婷婷婷| 任你日热视频| 婷婷天堂视频| 丁香五月天在线视频| 亚洲九区| www.久久66| 天天爱天天狠天天透| 另类激情中文| XX色综合| 五月激情综合网婷婷| 久久99热网| 九九www| 九九热这里只有精品23| 色五月婷婷中文字幕| 成人版视频在线观看| 亚洲视频国产一区| 日韩一区二区在线播放| 99热无码精品| 国产精品人人妻人人爽| 婷婷五月六月| 综合色播| 午夜激情四射影院| 午夜丁香婷婷| 婷婷激情五月天小说校园| 婷婷五月天亚洲综合| 久久人妻人人槡| 99精品自拍视频| 激情五月天天| 九九99免费视频| 综合网五月天123| 五月婷婷丁香综合| 99热99这里只有精品| 人人色AV| 伊人婷婷大香蕉| 五月丁香久久久| 婷婷五月天av| 久久99激情丁香婷婷小说网| 色综合色色色| 八戒青柠影视剧在线观看| 国产精品涩涩涩视频网站 | 2022人人操人人看| 色五月天中文字幕| 五月婷婷激情日本| 96自拍视频九色在线观看| 久久丁香综合精品综合| 亚洲av无码影院| 亚洲精品乱码久久久久久综合| 色五月视频无码播放| 五月天婷婷在线播放免费| 色婷婷六月| 久草婷婷在线| 欧美va精品va老师va| 久久 这里只有精品1| 久久丁香久久| 丰满少妇乱A片无码| 人人操婷婷| 色噜噜,噜噜色| 丁香五月天堂| 婷婷中文字幕网| 这里只有精彩视| 免费观看18视频网站| 久久久全国免费视频| 97热久久五月婷婷| 99色最新在线视频网站| 丁香六月激情| 任你搞在线观看视频| 久久久中文| 狼人婷婷综合| 热婷婷久| 99热这里只有精品最新地址获取| 六月婷婷综合激情| 久久99日本精品视频免费观看| caop在线| 182TV大香蕉| 99精品偷拍视频| 天天摸夜夜夜| 伊人爱爱日本| 久久婷婷五月综合色播| 天天爱综合网| 51精品国自产在线| 五月天婷婷自拍图片在线观看| 国产无套精品一区二区| 99re8在这里只有精品| 色婷婷色丁香色欲av| 五月婷婷色色色| 综合99久久天天综合| 99久久国产宗和精品1上映| 大香蕉人在线65| 五月婷婷婷婷婷婷艺术| 成人网站在线观看视频| 91免费啪视频| 五月天基地| 91操黄| 欧美VA在线| 婷婷性爱视频在线| 欧美乱码国产一级A片| 人操综合|