欧美成人午夜精品久久久,国产?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
返回資訊列表
六月亚洲婷婷6月中文字幕| 六月丁香久久| 97亚洲视频在线| 丁香色情五月综合激情| 国产99视频永久免费| 色婷婷影视| 日韩久热| 99热综合| 久久九九大香蕉电院| 久久精品一区二区三区四区| 99性爱视频网站| 激情影院69| 日本 @ va 免费| 琪琪狠狠干| 成人视频婷婷| 91久久久久久久久18| 亚洲九九夜夜| 久久机热这里只有| 97成人在线视频精品| 26uuu国产| 亚洲碰碰碰| 91热在线| 68热超碰在线| 五月婷婷综合网| 久久精品99久久| 五月婷婷丁香综合| 激情黄色五月天| 少妇水多A片太爽了| mmm1717.6dbm人人爱人人操| 9色天堂| 色色网站在线| 另类激情五月天。| 欧美97超碰| 激情网五月天| 欧美色播综合在线观看| 人妻熟女一区二区AV| AV国产有码| 六月色 亚洲| 色九月婷婷丁香| 五月天婷婷色五月天| 大香蕉久久| 五月婷婷在线观看| 97干在线视频| 99操网站| www.狠狠| 五月丁香欧美综合| www国产亚洲色婷婷com| 色噜噜狠狠色综| 五月婷婷色欲| 成人丁香五月| 天天做天天爱天天做| 91嫩草久久| 天天干夜晚夜操| 色丁香婷婷美女视频网站| 五月丁香人妻| 婷婷的五月天另类视频| 久久婷婷综合五月天| 五月丁香另类网| 六月丁香六月婷婷欧美| 伊人久久丁香五月91| 9久热在线视频精品| 无码九九| 小色小蛇伊人婷婷色香五月| 国产成人99久久亚洲综合精品| 色婷婷婷综合五月天| 日韩成人中文| www九九| 欧爱综合视频| 99精品热| 国产性爱一级| 婷婷六月成人| 国产精产国品一二三在观看| 婷婷色五月色| 五月婷人妻| 九九超日本| 99热这里只有精品青草| 日本操逼九九九九58日本操逼| 婷婷五月天综合网| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 婷婷久久综合久| 人五月天婷婷喷水| 无码少妇高潮喷水A片免费| 九九久热| 欧美性色五月天| 99视频自拍| 色婷婷色丁香色欲av| 激情欧美五月丁香| 人妻内射视频| 五月天色视频| 丁香五月冃欧美| 91婷婷在线| 第四色色六月色综合| 狠狠综合网| 综合网五月| 99热每日| 久在线88综合| 国产国产乱老熟女视频网站97| 欧美天堂久久| 九九热免费视频| SS丁香五月婷婷| 丁香五月婷婷久久综合激情网 | 色播色丁香五月| 国产精品国产成人国产三级| 一本色道久久综合狠狠躁小说| 丁香五月在线观看| 婷婷婷婷婷开心无码播放| 激情五月天开心网丁香无码| 六月色婷婷欧美| 久9热在线视频| 色五月婷婷丁香凹凸| 嫩草极品| 色.五月综合网| 97自拍视频在线| 99热国产精品| 色婷婷久久综合| 五月天网站免费欧美| 五月综合激情视频| 狠狠色综合五月| 丁香桃色综合网| 久久精品爱爱| ri电影在线| 九九激情综合| 久久中文人妻系列| 亚洲色五月天是什么| 婷婷五月天成人网| 噜噜狠狠| 婷婷伊人激情婷婷| 99性感视频| 丁香五月第九色| 思思久久99热只有频精品66| 激情五月婷婷| 丁香色五月天| 婷综合| 丁香婷婷五月色成人网站| 婷婷五月天视频亚洲| 日本五月婷| 婷婷五月天成人网站| 五月婷婷 六月丁香| 2025最新亚洲激情在线| 99国产小视频免费观看| 午夜九九电影| 五月婷婷开心综合| 五月好婷婷| 丁香五月婷婷亚洲另类| 丁香婷婷中文字幕| 六月天婷婷| 月婷婷婷婷五月| 午夜激情五月天| 激情婷婷色五月| 在线18av | 国产毛多水多女人A片| 超级碰碰碰碰视频| 2025年最新亚洲在线欧美| 99热.com| 操操碰| 色色色综合色| 人人九色| 激情五月丁香五月| 超碰AAAAAAV| 亚洲激情高潮| 五月天色婷婷综合| 色爱亚洲| 色和综合网| 月丁香久久久| 大香蕉五月天| 伊人色欲五月天| 色XX综合网| 五月激情在线| 色婷五月| 国产综合久久久777777| 五月总合激情网| 色五月婷婷成人视频| 五月婷婷九| 九九精品视频在线观看| 天天色图| 欧美大片免费观看| 婷婷丁香91| 欧美内射AA| 成人婷婷深爱综合网| 久久久人妻门| 九九黄色网| 疯狂做受XXXX高潮A片| 99@久久@99精品视频| 色五月大香蕉婷婷| 亚洲视频丁香网va| 99热亚洲精品| 丁香五月天欧美| 天天干夜夜谢| 国产看真人毛片爱做A片| 潘金莲AAAAAAAAAA| 91狠狠综合久久| 五月婷婷色播网| 尔尔AV一区| 丁香五月电影| 婷婷色色欧美| 天天爱天天做天天爽| 九九热视| 日本不卡一区二区三区| 任你日视频| caopeng97日韩| 超碰高清在线| 中文字幕日产A片在线看| 久久五月天丁香| 97人人干| 六月婷婷啪啪| 色色丁香婷婷五月天| 亚洲熟女色| 5月婷婷综合| 丁香5月婷婷| 综合色播| 操久久精| 天天高潮夜夜爽| 亚州操人在线视频| 啪啪夜久久| 丁香五月天殴美激情| 色99在线观看| 色97啪啪| 久色国产| 天堂无码人妻精品AV一区| 人人摸人人澡人人| 亚洲精品影视| 久操人| 婷婷综合五月激情| 艹B高清无码| 婷婷久久伊人| 99色久| 噜噜综合网| 99九九玖玖| 亚洲综合色成丁香五月色| 激情九月婷婷| 97超碰在线免费观看| 五月亭亭六月天| 人妻激情久久| 最新精品视频99| 色五月综合网| 综激情网| 五月婷中文字幕| 在线不卡AC| 综合综合色色| 开心激情站| AV无码免费| 天天爽,夜夜爽| 精品久久久91久久影视网| 亚洲色综合| 久久人妻乱| 女人高潮内射99精品| 狠狠色噜噜狠狠| 精品乱码视频| 91大神操美女| 奇米网大香蕉| 激情五月天com| 97超级碰| 毛片毛片毛片毛片| 91日本在线免费| 综合色99| 九九这里有精品| 丁香五月婷婷啪啪啪| 色婷婷小说网| 五月丁香啪。| 欧美五月婷婷| 丁香六月色婷婷| 色情五月天丁香社区| 久久少妇视频| 亚洲无码九九九| 精品无码99| 色婷婷呢狠禁久禁| 五月激情偷拍婷婷| 丁香五月中文字幕| 色五月激情综合网| 婷婷伊人网| 九九99九九99偷拍视频免费看| 婷香五月激情视频| 天天干天天操天天射| 开心网五月色婷婷| 亚洲色婷婷五月天| 亚洲精品视频在线播放| 99婷婷| 丁香六月色婷婷| 91精品久久久久久综合五月天| 97资源碰碰| AV在线免费播放| 99热青青草| 97久久人人| 丁香五月影院| 五婷婷六月合| 熟妇国产| 伊人www22综合色| 1024手机在线观看看片_日韩精品| 51国精产品自偷自偷综合| 996黄色片| 久狠日av| 伊人久久大香线蕉综合网站| 九月激情网| 五月天日日操夜夜操| 婷婷五月天av| 五月花亭亭| 色色色色色日韩午夜激情| 五月婷婷婷| 色婷婷五月天成人网| 五月丁香激情综合| 婷婷丁香午夜综合影视| 色 噜噜 九月 婷婷| 天天日天天插| 熟女人妻一区二区三区免费看| 五月天欧美 另类小说| 666555。COm毛片| www.色五月.com| 大香蕉人人人| 亚洲成人在线播放| 天天操天天曰| WWW·天天操·视频?| 2025超碰| 五月天婷婷伊人| 久久精品色| 国产午夜精品一区二区三区四区 | 亚洲乱码成人| 久久久久视剧HD| 丁香激情四射| 天天舔天天插天天干| 岛国资源站| 日韩啪啪视频| 六月亭亭久久综合激情| 欧美六月| 日本三级第一页| 丁香五月天社区| 亚洲va欧美| 综合久久激情久久| 五月婷婷丁香综合| 思思久久青草热| 婷婷五月综合网| AA片在线观看视频在线播放| 99久久婷婷五月综合| 3pAV| 99人人操人人爱久久久| 婷婷丁香六月天| 色色A| 夜夜骑日日操| 国产免费av在线| 日本欧美成人片AAAA| 五月色影院| 久久永久网址| 色婷亚洲五月丁香| 激情内射人妻1区2区3区| 婷婷五月天在线观看| 成人小说 五月天 婷婷| 色色99| 婷婷五月天激情五月天深爱五月天| 大香蕉精品视频| 99热亚洲只有色| 丁香九月婷婷综合| 色色AV色色色东莞| 婷婷天天综合| 天天插天天狠| 九九re精品视频在线观看| 日本少妇裸体做爰高潮片| 亚欧州精品视频| 五月丁香久久久| 色色操| 9 9 9色色| 婷婷D区| 久久这里都是精品| 香蕉人在线香蕉人在线 | 成人婷婷五月天| www.色婷婷.com| 丁香五月花影院| 人妻久久久久久久| 日本色视| 99这里都是精品6| 色婷婷五月天激情久久| 欧美日韩99| 丁香色影院| 91|疯狂丨高潮丨对白| 99re这里| 九九99九九99偷拍视频免费看| 日韩十国产极品久久| 久久成人性爱| 丁香婷婷五月天校园春色| 九九人人自拍| 婷婷激情五月天小说| caop视频| 日逼影音先锋男人AV资源站| 国产又黄又爽又色的免费| 亚洲综合色色| 夜夜 操无码| 色综合另类| 久久久人妻门| 婷婷五月天日本无码| 婷婷五月 丁香六月| 殴美日比视频| 影音先锋色婷婷| 色婷婷五月天成人网| 丁香五月天婷婷大香蕉| 欲色人妻| 天天肏天天舔AV| 97爱艹婷婷开心丁香激情综合| 99热亚洲| 欧类av怡春院| 丁香色婷婷色手机免费在线| 夜丁香综合| 26uuuavcom| 色六月丁香婷婷狠狠干| ji'qing'luan'ren'lun| 能看的av片| 天天色伊人| 日本婷婷综合精品| 激情综合网激情五月欧美| 色婷婷欧美在线| 欧美成人无码一区二区三区| 99热精品网| 亚洲精99| 婷婷一本和五月丁香| 青青草搞屄视频网站| 色丁香五月婷婷婷| 婷婷久久五月天亚洲欧美国产日韩在线观看| 婷婷五月美女直播| 中文字幕av在线| 婷婷五月丁香综合| 少妇丁香婷婷| 五月天无码视屏播放| site:wpjngj.com| 天天上天天爽| 色色亚卅| 99爱视频在线观看| 九九综合精品| 天天爽天天| 欧美情色一区| 一级无码作爱片| 激情五月婷婷啪啪| 日韩欧美颜射| 开心五月丁香综合久久| 5月丁香六月婷婷| 99这里是精品| 激情性爱五月| 色色色色网| 色优久久| 日本婷婷色| 亚洲视频无| 国产精品色婷婷久久久精品| 91丨九色丨白浆| 99国产小视频2013| 色婷婷狠狠久久综合五月| 色很久综合| 色v综合网| 激情丁香五月天综合| 乱女乱妇熟女熟妇综合网站| 婷婷五月天综合色| 超碰com| 久久久人妻| 玩熟女五十AV一二三区| 久久婷婷五月综合啪| 综合色播| 激情五月天www| 大香蕉久热| 人人播| 91久女| 久碰婷婷视频| 五月丁香婷婷激情久久| 99热这里只有精品55| 日本人妻A片成人免费看片| 久久怡红院| 久久天堂色| 婷婷色播婷婷| 丁香五月欧美色综合| 五月天啪啪| 99日本黄站| 大战熟女丰满人妻AV| 丁香六月天婷婷| 婷婷久热| 色色 亚洲| 婷婷五月天黄色| 无码少妇高潮喷水A片免费| 九九综合五月欧美| 秋霞学生妹一二级| 国产美女视频久| 伊人婷婷五月天| 婷婷六久久| 五月丁香| 婷婷五月天网| 色色网站毛片| 日本三级黄色大片| 综合激情站| 91chinese在线| 亚洲精品网址| 婷婷激情综合网| 成人 视频免费观看网站| 四LLL少妇BBBB槡BBBB| AV在线免费播放| 激情五月天综合网| 99毛片| 久久99热精品a片在线观看| 激情五月六月| 欧美顶级少妇做爰HD| 综合99久久| 五月丁香无码| 疯狂做受XXXX高潮A片动画| 久久9热| 丁香色五月婷婷91桃色| 国产精品美女| 色碰碰| 五月婷婷影| 五月综合激情婷婷六月色窝| 狠狠久久婷五月| 天天操综合网站| 中文激情网| 丁香久久五月婷综合| 5月丁香六月婷婷| 激情综合婷婷| www.91色| 亚洲黄色精品| 97碰在线免费观看| 伊人五月成人| 亚洲六月色| 九九蜜臀精品| 97热这里精品在线视频| 激情五月天色婷婷综合| 色五月婷婷激情| 色五月激情五月| 亚洲1区| 99热精品在这里| 超碰成人影视| 色五月综合婷婷| 久久婷五月| 玖玖色综合| 天天操婷婷| 亚洲成人AV在线| 噜噜久| 国产毛片操B| 色欲香综合网| 中文成人在线| 伊人在线婷婷草| 日韩操人| 亚洲 精品 综合 精品| 精品国产va久久久久| 久操大| pom538精品视频| 色色色色色色网站| 婷婷五月天你懂的| www.com五月天| 五月天激情国产综合婷婷婷| 男人天堂99| 精品久久久999| 婷婷六月视频| 婷婷欧美综合| 五月丁香六月婷| 丁香色五月 97干| 超碰在线精品| 久久婷婷五月| 五月天丁香啪啪综合| 五月天激情国产综合婷婷婷| 丁香五月天色综合| 亚洲成片在线观看| 99色嘟嘟精品网站| 色婷五月天| 婷婷天天日婷婷| 亚洲中文字幕AV| 五月婷久久| 色色五月天婷婷| XX色综合| 综合色天天| 国产AV国片偷人妻麻豆| 天天干天天干天天干天天干天天干天天| 天天爱天天操| 天天狠狠色综合| 国产色色小草视频| 能看的AV| 色啪影院| 欧美色五月| 伊人狠狠狠综合| 久久久精品免费啪啪国| 狠狠插狠狠操| 国产激情AV| 天天爱天天操| 九九热在线视频,| 狼人伊人天堂| 五月婷婷色激情| 久久国产AV| 亚洲人妻电影| 亚洲精品网站色视频| 久久精品国产一区二区三区四区| 婷婷六月天亚州| 婷婷色五月天色色| 99色在线视频| 99re热久久| 91窝窝| 99热日韩| 爱的综合网| ww超碰在线| 久久久www| 狠狠狠狠免费| 久久婷婷东京热大香樵| 婷婷伊人网| www.五月婷婷久久.com| 天天色99| 欧洲电影在线观看免费版英语版| 五月婷婷开心五月| 色婷婷手机在线| 91919191919久久成人视频| 久久er99| 色色五月天激情| 大香蕉久久视频久久视频| 99精品在线观看视频| 好好干Av| 碰超在线九色| 久久这里只有精品热在99| 天天操天爱综合| www,色婷婷| 内射人妻视频国内| 97热精品| 色情免费视频播放| Av九九| 久久婷婷九月国产精品| 婷婷涩五月| sewuyue第四色| 五月天激情网址| 国产精品第一国产精品| 另类 在线| 五月天激情小说电影| 亚洲色图日韩网址| 大地9中文在线观看免费高清| 综合图片色色| 婷婷六月天精品| 五月丁香六月成人| 97碰碰草| 丁香六月婷婷久久综合| 亚洲无码99| 婷婷丁香五月天小说| 色九亚洲| 国产毛片精品一区二区色欲黄A片| 一区视频网站| 99色免费观看全部| 91热er| 久久香蕉福利| 69人人操人人爽| 99热久久这里只有精品| 亚洲成人av在线| 这里只有精品免费视频在线观看| 色之综合网| 婷婷网影院| 91大操| 成人日韩欧美| 色五月琪琪| 五月天亭亭俺也| 色色色色热热| 久久伊人婷婷| 欧美色偷拍| 在线综合亚洲欧美65| www.99在线| 五月丁香色色| 五月丁香婷婷深深爱| 色五月丁香在线| 亚洲视频在线观看99| 99久在线精品| 激情啪啪五月| 久激情| 欧洲综合一区| 色色网站毛片| 免费无码毛片一区二区A片| 色综合婷婷| 色欲色香伊人| 六月丁香影院| 五月丁香成人版| 888精品福利地址| 91人人操.COM| 色欲久久久久久综合网综合网| 色婷婷中文| 欧美槡BBBB槡BBB少妇| 99热欧美| 播播网色播播| 亚洲精品国产精品乱码不99| 天天操,天天插| 无码九九| 色色五月丁香婷婷| 99日本黄站| 国产综合视频婷婷| 婷婷伊人久久| 色射影院| 99久视频| 色婷婷基地在线| 激情综合网丁香| AV九九| 啪啪一区| 亚洲成人网无码| 久久婷婷五月综合97色一本| 九九99在线免费在线观看视频| 色婷婷亚洲| www.无码com| 97操碰人人| 亚洲超级碰| 91丁香| www.婷婷,com| 亚洲成人av在线| 欧美人人操| 婷婷久久网| 色婷婷五月天激情| 婷婷五月天伊人在线| 免费的日逼视频| 4399成人黄A片| 五月婷婷六月丁香免费| 欧美激情 日韩无码 婷婷 五月天| 五月婷色色| 99热在线观看免费中文| 79精品在线视频| 色播播之激情五月婷婷| 五月天婷婷激情春色小说| 99爱免费视频| 天天综合精品| WWW.99热| 国产激情av| 午夜丁香婷婷| 亚洲精品久久久久久久久久吃药| av高清无码| 99久久久精品| 超碰93在线观看| www.色婷婷| 人人人人人人人人人草| 婷婷五月激情在线| 天天摸天天舔| 久久婷婷六月综合| 91久久1118| 99在线精品观看99| 婷婷五月天综合亚洲| 五月色丁香婷婷综合| 九九色播五月丁香| av 一区三区四区| 这里只有国产精品在线| 久久婷婷五月| 婷婷五月综合网| 91夫妻视频| 婷婷性爱视频在线| 国产伦理精品高清在线观看网站一区二区 | 国外亚洲成AV人片在线观看| av一区二区电影免费在线观看| 久久久久久久久久久-久五月天婷婷| 久久思思热| 丁香五月婷婷综合啪啪| 婷婷娌伦网| 激情文学 综合 色| 国内精品玖玖| 中文字幕不卡+婷婷五月| 五月天综合网| 冬月かえでAV无码播放| 99热成人永久免费| 午夜五月天| 99久久激情视频| 天天日天天操心| 伊人成综合五月婷婷| 91Chinese在线| wwwxxx五月婷婷小说| 色五月综合| 天天色播| 午夜丁香六月婷| 欧美va视频不用播放器的va视频网| 性色视频| 五月激情小说| 怡红院91a√| 都市激情五月婷婷综合| 综合图区激情| WWW.婷婷| 51XX嘿嘿午夜无码| 五月婷婷狠天天色综合| 热99在线精品| 丁香五月五月婷婷欧美大香蕉| WWW,五月| 五月婷婷丁香色播网| 9999久久久久| 色婷婷玖玖影院| www99热| WWW,婷婷,COM| 欧美色五月| www.五月天色色色| 五月激情基地| 天天做天天爽| 九月激情综合婷婷| 亚洲男人的天堂婷婷色五月| 激情五月开心五月在线视频| 99re视频精品| 欧美交换配乱吟粗大25P| 小色小蛇伊人婷婷色香五月| 亚洲久久婷婷| 色婷婷五月综合| 狠狠久久婷婷| 天天干天天操天天上| 久久久18| 超碰人人99| 色噜噜在线| 五月天激情国产综合婷婷婷| 国产真实乱对白精彩| 超碰爱爱爱| 激情五月婷在线精品| 婷婷五月天色色| 91丨九色丨熟女丰满| 色五狠狠| 熟女色色一区二区| 九九99视频精品| 色色色99| 婷婷操超碰| 可以看的AV| 大香蕉丁香婷婷| 一本久久亚洲五月婷婷| 日本色五月| 色欲色天天香综合| 婷婷久月| 五月天丁香成人社| 五月丁香六月综合激情网| 天天噜日日噜综合无码| 97干在线看| 日韩AAA| 九九热视频这里只有精品| 五月天婷婷社区久久综合| 亚洲欧美999| 狠狠久久婷五月综合色| 激情五月婷婷色综合| 99热综合| 五月丁香六月婷婷精品| 99在线精品观看99| 欧美色99| 激情五月天天狠狠久久| 5五月综合网亚洲| 五月婷婷无码| 97色色色色色| 99.N在线视频| 天天爽天天干| 东京热五月婷婷| 99热国产这里只有| 色色婷婷五月| 五月天色播网| 一点色成人网| 狠狠色丁香婷婷基地| 丰满老熟妇BBBBB搡BBB| 五月婷婷综合网在线播放| 日韩成人综合网| 激情久久四色| 中文字幕 码精品视频网站| 九九视频免费| 婷婷丁香五月亚洲17cao| 爱射综合| 1024人妻| 思思久久96热在精品国产,| ..真实国产乱子伦对白在线_欧| 啪啪啪啪五月天| 香蕉97碰碰碰欧美| 五月色丁香激情| 久草婷| 人人操av| 久久狠婷婷| 第一区久久网站| 婷婷五月天成人网| 伊人婷婷91| 激情五月天啪啪| 激情综合九月| 久久性爱视频| ss99热| 97超碰9久热婷婷热| 五月天涩涩| 探花搜索结果 - 黄上黄| 狠狠插狠狠操| 欧美大香蕉视频| 99re思思热久久| 亚洲激情图文小说| 欧美综合五月天婷婷tin| 丁香六月亭亭久久综合| 嫩草视频观看| 综合激情五月丁香| 77799热| 色婷婷AV在线观看| 婷婷五月综合色拍| 亚洲色色色色色| 免看黄大片AA | 五月婷婷六月丁香综合| 久久伦乱| 久久婷婷五月天| 97婷婷丁香五月| 激情婷婷视频在线| 久久久18| 色婷激情网| 888久久久| 九九久久网| 99热欧| 天天色综网| 五月天综合网| 精品一二三区视频立| 超碰cap| 在线观看免费狠狠色丁香香综合| www.激情五月天。com| 色一情一乱一乱一区91Av| 婷婷丁香综合成人| 久久婷丁香五月| 丰满女老板BD高清A片| 婷婷丁香五月高清| 丁香六月综合激情| 99噜噜噜在线播放| 99成人在线观看| 色五月之第四色| 五月婷久久综合| 欧美激情VA永久在线播放| www.六月丁香看AV| 九九热中文| 日韩二区搞逼插逼毛片| 夜夜久久综合网| 激情综合五月色在线| 丁香婷婷综合影院| 91精品久久久久久77777| 五月婷婷精品视频| 婷婷97碰碰| 欧美综合激情| 久久色婷婷| 五月天婷婷高清无码| 色噜噜狠狠色综合成人网| 国产又色又爽又黄又免费| 五月天伊人久久久久| 激情五月婷婷| 五他月天啪啪啪| 狠狠操狠狠插| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 在线观看av网站| 无码激情精品色婷婷久久久久| 2017人人操| 不卡的AV网站| 久久婷五月| 丁香色五月婷婷| 一夜福利不卡| 思思99久久| 五月天另类小说久久小说网| 天天搞天天爽| 66色在线日韩| 一本久久亚洲五月婷婷| 9久国产| 国内精品免费一区二区2009| 26uuu亚洲| 婷婷六月天| 亚洲AV成人无码久久精品老人法拉利| 99re最新地址视频| 大香蕉大香蕉在线影院| 久久se 综合网| 人人摸人人摸| 看全色黄大色大片| 99热精品少| 伊人狠狠丁香婷婷综合尤物| 热久免费视频9| AA片在线观看视频在线播放| 婷婷五月天丁香| 欧美成人精品A片免费一区99| 五月婷婷伊人久久| 六月丁婷婷| 色停停香蕉视频| 婷婷九色| 在线播放成人| 一级片操逼视频| 久久综合激情| 狠狠色综合网站久久久久| 天天日 天天草| 操逼棍操逼| 亚洲综合色丁香五月天| 五月婷婷 欧美| 丁香九月婷| 伊人五月天久久| 五月激情综合婷婷| 中国女人内射6XXXXX| 色噜噜狠狠色综无码久久合欧美| 色婷| 日本久久人人| 丁香色婷婷| 五月天综合图片| 综合图区激情| 天天日天天操天天干| 天干干夜夜操| aaaaaa片| 色色五月婷婷久久| 99热九九在线| 99re免费视频| 综合日本婷婷| 99草在线免费观看视频| 婷婷五月丁香基| 亚洲视频在线观看| AA片在线观看视频在线播放| 日日干夜夜干| 天天爽夜夜操| 丁香六月婷婷| 九九色影院| 成人精品一区日本无码网| www狠狠| 五月花婷婷| 99热在线播放| 涩涩五月天| 亚洲欧洲另类| 五月天激情国产综合婷婷婷| 99精品成人无码A片观看金桔| 色综合久| 午夜成人片400| 国精产品一区一区三区免费视频 | 五月婷综合激情| 亚洲精品第一国产综合亚AV| 日韩不卡123| 久久综合图片| 久久码久久无清| 人人操超碰| 五月丁香综合网| 久久综合香蕉国产国产蜜臀AV| 极品少妇婷婷五月| 午夜日日| 夫妻超碰在线| 99热在线资源| 婷婷六月色开| 热九九在线| 春色激情第四色| 亚洲综合婷婷| 99综合色| 超碰a女人的天堂| 丁香五月婷婷大香蕉| 欧美日韩999| 97久久视频| 九九99久久精品| av婷婷丁香| 丁香五月婷婷亚洲另类| 99热偷拍| 五月丁香| www.日日夜夜| 九九热只有精品| 五月丁香婷婷婷激情爱爱| 99操碰| 极品人妻VIDEOSSS人妻| 色九月综合| 五月99久久| 久久这里只有精品久久| 精品无码色| 丁香婷婷六月天| 日本久久爱| 日韩av在线电影| 久久婷婷伊人| 免费色婷婷| 天天视频精品9| 91要啪| 影音先锋女人av鲁色资源网小说免费| 亚洲一区二区无码蜜乳av| 久久久久人妻精品| 亚洲色在线观看| 色播播五月天| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 中文字幕AV网址| 激情深爱婷婷网| 色情五月停停丁香| 99色干| 影音先锋高清无码资源网| www.刺激色网站www.| 五月天社区| 婷婷成人小说综合| 中文久久婷婷| 亚洲精品国产成人AV在线| 熟惀91九色在线| 色香久久| 婷久看人爽| 天天骑天天操| 一本色道久久综合狠狠躁小说| 日韩一级淫乱片一区二区三区| 婷婷亚州综合| 99久久九九| 激情五月天www| 成人网址在线观看| EEUSS鲁片一区二区三区| 综合色网站| 天天色伊人| 国产精品爽爽久久久久久| 色999亚洲人成色| 欧美A级成人婬片免费看理论| 亚洲最大在线| 开心激情久久久久久久| 久久与婷婷| 色婷婷网大全在线| 五月婷婷狠狠干| 丁香五月欧美激情| 另类激情中文| 国产亚洲色婷婷久久99精品9j| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 99狠狠| 六月色色婷婷| 另类小说五月天| 婷婷日本在线| 色色网站在线免费观看视频| 99热99精品| 五月婷婷久久大片| 99re热精品在线视频| 激情都市五月天| 婷婷伊人网| 九九综合网色全集 | 久草婷婷在线| 婷婷五月天堂网| 99热色精品| 九九九激情综合| 26UUU欧美激情一区二区| 色婷婷丁香五月色综合网| AAA久久| 久久婷婷的综合色丁香五月| 69婷婷丁香午夜| 天天精品视频免费观看| 苗黎美女四级成人版一级二级毛片| 五月天丁香网| 色色色热| 婷久久久| 婷色成人| 99热在线播放| 99热免费精品| 婷婷色五月在线视频| 99视频在线观看地址| 日本精品在线噜噜噜| 天堂中文国产| 天啪色| 第四色26uuu| 99网| 人人97碰| 亚州操操| 色综合久久综合| 亚洲va欧美va国产综合久久久| 亚洲日韩一页精品发布| 97碰碰视频在线观看免费| 久久色情综合免费网站| 亚洲宗合激情| 99色视| 丁香五月综合| 碰碰女| 五月天激情久久| 久久丁香婷婷色情综合| 五月丁香AV、伊人业余、性色熟妇| 丁香五月六月综合激情| 婷婷伊人五月天| 先锋av性爱成人电影| 五月大香蕉| j久久性爱视频| 成人丁香五月| 久久九九玖玖| 99亚洲视频| 国产精品色婷婷久久久精品| 色激情五月| 大香蕉久久久久久久久| 综合一本道| 丰满老熟妇BBBBB搡BBB| 99热日韩这里只有精品| 很很干天天干| AV操逼网| 精品人人操| 99黄色在线视频精品熟女| 九九热99熟女| 中文字幕丰满人妻无码专区| 亚洲综合色色色| 天天久久婷婷| 天天摸色吧天天摸色吧| 97超喷视频在线观看| 激情五月婷婷丁香综合网| 综合五月激情| 婷婷色丁香六月| 婷综合六月| 月婷婷婷婷五月| 97超级操操| 色色色色色色色色色色色色色97| 韩国19 主播内部福利vip免费播放| 五月丁香六月婷婷激情视频在线观看免费| 中文字幕成人日韩| 国产成人av在线播放| 97色色色| 九九视频免费| 婷婷五月天小说| 日韩人妻无码一区二区| 免费看欧美成人A片无码| 欧美综合婷婷网| 另类五月激情| 丁香五月六月激情久久| 亚洲午夜成人av电影网| 天天撸天天干天天插| 亚洲天堂有码| 99综合网| 婷婷永久在线| 日韩成人精品中文字幕| 亚洲色婷婷| 激情综合五月| 久久婷婷在线| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 国产91在线视频| 爱婷婷都市激情| 五月丁香色色网| 五月婷婷无码| 人人操超踫| 婷婷五月丁香激情图片 | 免费V片在线| 久久精品夜色噜噜亚洲a∨| 色综合久久天天综合网| 欧美性爱五月天| 婷婷五月丁香狠狠| 91聚色综合网| 人人摸人人干| 大香蕉520| 成人做爰高潮A片免费视频| 五月花婷婷丁香| 国产午夜精品一区二区| 干一干xxxx| 婷婷五月激情六月丁香 | 激情五月综合网| 色婷婷激情五月天在线观看| 大香蕉欧美在线| 99热这里只有精品22| 六月丁香五月激情婷婷| 国产免费一区二区三州老师F1F1……| 97碰免费视频在线| 午夜丁香六月婷| av婷婷丁香| 五月丁香 啪啪| 婷婷五月天777| 婷婷色五月91啪啪| 成人视频婷婷| 91婷婷在线| 日韩乱轮AV| 国产精品国产| 97色色色视屏| 婷婷久久图片| 五月天婷婷综合网| 99热99免费| 黄网在线观看免费| 亚洲亚洲人成综合网络| 色色网站| 9.1综合网| 97碰 在线视频观看| 99久久性爱| 五月综合六月丁| 久99久精品视频| www.9操| 大香蕉伊人99| 亚洲性爱99在线| 激情五月色婷婷| 国产午夜伦鲁鲁| 九九综合伊人| 五月婷婷欲色| 91操熟女| 久久五月天激情| 黄色成人网站在线播放| 桔色成人官方网站| 激情性爱五月| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 亚州精品色情在线观看| 日韩无码人妻一区二区| 天天插天天射| 影音先锋91资源站| 色视五月天婷婷| 99re热99| 丁香五月激情综合久久| 婷婷五月天色播| 五月婷婷色| 99黄色| 婷婷五月色播网| 国产99久9在线+|+传媒| 激情五月影院| 五月天播播中文字幕 | 欧美大片免费播放器| ww久久| 五月天综合婷婷| 五月天播播综合| 色情五月婷婷| 久久99久久久久久久噜噜| 国产真实乱了老女人视频| 日韩久久视频| 99色视频在线| 精品99只有。| 丁香五月婷婷啪| 全高清无码视頻| 亚洲妇女熟BBW| 91丨九色丨东北熟女| 欧美日韩aaa| 丁香九月婷婷色| 欧美美女国产日韩一区二区久 |