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
返回資訊列表
草综合14| 免费看欧美成人A片无码| 六月丁香啪啪| 国自产拍偷拍精品啪啪一区二区| 狠狠五月丁香色婷| 久久五月婷综合| 色999;丁香五月| 成人片黄网站色大片免费毛片| 免費亭亭成人| 婷婷五月天成人视频| 五月天在线视频尤物视频在线看| 九九热狼人| 五月天色婷婷基地| 欧美图片丁香五月天| 九九 激情 网| 中文久久久人妻| 日本99视频| 五月综合777| 成人免费黄色短视频| 激情综合女人网五月播播| 伊人婷婷五月天| 热的国产,热的综合,热的有码| 熟妇内谢69XXXXXA片| 人妻尝试久久久久久久久久久久| 综合www色| 天堂A∨在线| 狠狠搞五月天| 色色综合网。| AV中文在线| 婷婷激情五月天激情在线| 中国丰满熟女A片免费观| 丁香五月深爱五月婷婷| 成人在线日韩欧美| 九九热AV| 亚洲男女激情| 综合xx网| 伊人大香蕉在线视频| 丁香蜜臀黄色婷婷五月天| 综合激情五月丁香| 婷婷五月精品中文字幕| 婷婷性爱网| 99色婷婷| 婷婷五月天成人网| 深爱网深爱综合网| 激情综合色婷婷啪啪六月天| 26uuu欧美| 丁香五月天天高清在线| 99精品国产在热久久| 久久精品99国产精品日本| 99免费视频在线观看爱| 婷婷伊人| 97AV人人插人人操| 欧美电影在线播放| 久久久99久久| 五月婷在线视频免费看| 婷婷丁香六月影视| 五月 成人 婷婷| 中文字幕在线免费看线人| 99热国产这里只有精品| 五月天开心婷婷久久| 婷婷婷五月香蕉| 久久狠狠干| 婷婷激情五月综合在线视频| 99热18| 六月婷婷毛片| 人人操AV| 丁香婷婷五月| 热久久视频99| 婷婷激情五月天7| 五月开心啪啪| 五月丁香六月激情| AA丁香综合激情| 襙比视频| 婷婷五月丁香综合亚洲| 最新日韩久热免费视频看看| 五月激香蕉网| 少妇被下春药玩弄A片| 狠狠色狠狠操| www.俺去也com| 97人人操人人爽| 97偷拍对白视频| 99热都是精品| YJLZZJLZZ亚洲乱熟无码| 五月天电影网| 婷婷伊人綜合中文字幕小说| 五月丁香色婷婷色| 婷婷丁香91| 久久一级AV| 久久久91| 丁香九月综合| 婷婷六月色开 | 99久精品| AV网址大全在| 久久久五月天婷婷| 色五月丁香com| 丁香六月激情| 丁香五月区| 久久人妻伊人| 婷婷干五月综合在线播放| 人人色婷婷五月天| 激情q青青草在线婷婷| www、丁香五月天| 禁欲电影完整版在线播放| av在线激情| 欧美日韩aaaa| 夜夜骑天天玩天天日| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 五月婷六月| 天天爱天天狠天天透| 色色婷婷综合网| 99re热精品视频国| 99热无码精品| 五月丁香在线国产| 毛片新网地| 婷婷五月丁香高清无码| 开心婷婷五月花| 99噜噜噜在线播放| 夜夜躁狠狠| 啪啪啪综合网| 色色色色热热| 五月婷婷亚洲天堂激情在线| 久久久er热| 五月天激情国产综合婷婷婷就去爱| 综合色影院| 99久久色| 婷婷激情视频| 亚洲成人另类| 久久久中文| 色婷婷免费观看| 午夜婷婷久久 | 国产毛片精品一区二区色欲黄A片| 99愛国产| 色综合九九| 婷婷五月综合社区在线| 俺去婷婷 丁香| 大香蕉在线观看9| 伊人喵咪a V| 五月婷婷丁香日韩在线| 亚洲国产网站| 丁香五月手机在线| 九九热这里只有精品556| 婷婷五月天色色| 亚洲黄色影视| 极品 少妇 内射| 日本色婷婷久久99精品91| 婷婷激情丁香五月天综合| 99欧美| 激情文学久久| sewuyue第四色| yazhouzonghesese| 五月天婷婷激情综合| 天天在线XXX| 丁香五月影视| A片试看120分钟做受视频红杏| 国产亚洲精品久久久久久郑州 | 婷婷五月天精品| 成片免费观看视频大全| 丁香五月狠狠在线观看| 五月天狠狠色| 丁香五月天信号| 99极品视频| 综合五月天天天天天五月| 男女久久婷婷五月天| 六月丁香婷婷五月| 久久婷婷亚洲| 成人视频网| 婷婷色五月91啪啪| 九九热99视频在线| 婷婷综合五月激情| 婷婷久久综合| 内射爽无广熟女亚洲| 天天插操| 99日本精品视频热| 夜夜操天天爽| 久久大香蕉| 99色在线| 成人资源在线| 国产Va视频| 五月丁香六月婷婷亚洲综合| 狠狠狠狠狠狠狠狠| 91 久热| 啪啪操超碰| 蜜臀丁香黄色婷婷五月天| 激情婷婷综合| 91碰超| 五月天激情影院| 福利视频在线播放| 婷婷涩涩五月天| 伍月婷丁香婷| 婷婷五月天AV在线| 黄色中文字目| 色婷婷狠狠| 色天天综合成人网| 婷婷六月色| 极品人妻VIDEOSSS人妻| 91久久精品无码一区二区三区| 九九热九九热精品| 色碰碰| 国产精品人成A片一区二区| 激情五月天第四色| 26UUU欧美激情一区二区| 五月天久久91| 99人妻碰碰久久久禁片| 五月天大香蕉| 99热在线看片| 色色色色色九九九九九| 5月婷婷6月丁香aV| 精品久热| 婷婷丁香五月激情密臀av| 久热这里只有精品在线观看| 五月婷婷狠狠干| 丁香激情综合| 狠狠88综合久久久久噜噜噜| 操久久网| 天色综合网| 甈吧vv| 色五月综合在线| 68热超碰在线| 人人亚洲| 久久婷婷热| 99在线视频操999| www.久久99| 九九热最新地址| 99色视频| 久久er免费视频| 久久久性爱视频| 五月婷婷六月色| 玖玖在线视| 日日做夜夜爱| 九九九九精品精| 婷婷久久久久| 天天综合五月天| 亚洲宗合激情| 婷婷六月丁香色| 超碰在线免费| 琪琪色热色色| 婷婷色综合| 五月美女婷婷风骚| 丰满人妻一区三区三区| 熟女人妻一区二区三区免费看| 九九 激情 网| 丁香久久久| 丁香五月天堂亚洲社区| 九色色| 夜夜谢天天干| www.超碰| 国产亚洲99久久精品| 毛v一区二区视频| 婷婷五月天亚洲精品| 五月丁香婷婷色| 亚洲操精品| 丁香五月开心五月激情| 91热在线观看视频| 综合久久五月天| 精品久9| 亚洲另类婷婷五月综合| 日本一級黃色一級片| 色色色视频免费无码| 色爱亚洲| 九九家庭影院| 99精品偷自拍| 丁香五月六月激情| 九热av| 激情五月天色爱| 五月第四色| 婷婷中文字幕欧美| 婷婷丁香五月亚洲| 婷婷五月色情| 久久六月天| 婷婷激情性爱| 色色射| 日本久久99| 99啪啪视频| 超碰成人在线观看| 狠狠草在线观看| 综合婷婷久久| 99操视频| 俺去也在线官网| 色婷青青| 亚洲丁香五月天视频| 9婷婷内射| 五月天综合色| 99热都是精品| 专区无日本视频高清8| 日本天堂网站99| www,五月天激情| 丁香六月综合| 97碰| 色五月天中文字幕| 国产女生爱爱AA| 人人干人人操人人摸| 亚洲视频1区| 综合成人小说婷婷| 五月婷婷AV| 五月婷激情| 美妞av| 成人做爰黄A片免费看直播室男男| 九九热99精品| 五月激情射| 久久久www| 大香蕉综合在线| 久热免费| 久久色区| 亚洲欧美在线观看| 久久伊人五月天| pom538精品视频| 婷婷久久久| 日韩砖区| 丁香五月-激情综合| 五月婷婷欧美激情| 婷婷操超碰| 色婷婷综合久久久久| WWW.天天日| 中文字幕无码人妻少妇免费视频 | 超碰资源在线| 丁香香五月激情免费视频| 人妻熟人中文字幕一区二区 | 人妻在线中文字幕久久| 9视频1在线| 亚洲操逼网| 99热香港| 久久视频婷婷| 国产一区二区三区影院| 这里只有精品视频在线| 婷婷九月激情| 激情久久 婷婷| 天天色宗合| 99色丁香婷婷综合网| 91久久国产综合久久| AAA久久| 丁香五月在线观看综合| 久久人人九九| 欧美五月婷婷综合| 天天干天天干天天操| 婷婷五月激情欧美大胆视频| 99热网址| 丁香六月成人| 婷婷欧美| 亚洲网站999| 九九九精品视频免费观看| 超碰在线50| 日本99在线| 五月丁香六月久久| 五月天大香蕉AV| 99热最新| 激情综合99| 五月花成人网| AV在线资源| 日B日潘金莲BB| 亚洲AV网站| 色婷婷裸体色性在线| 激情久久久| 91re色综合视频| 色婷婷久久| 婷婷干五月综合在线播放| 五月婷丁香花| 五月天激情四射网站| 国产精产国品一二三在观看| 五月婷婷综合网| 五月天激情AV| 激情亚洲色图片丁香综合| 91色逼| 97大香蕉五月天| 久久大香蕉| 狠狠干天天日| 丁香五月婷婷激情视频播放| 婷婷丁香色五月天久久88| 先锋资源91| 免费碰碰视频久| 日日操夜夜撸| 免费黄色视频网址| 97热在线精品| 五月婷婷五月色| 天天草天天日| 婷婷五月天激情偷拍| 国产ava| 九色porny在线观看激情四射| 婷婷五月天av| 九九热最新| 中文字幕AV在线播放| 天天色天天爱天天爱天天爱y| 五月久久噜噜| 激情五月婷婷欧美极品| Se.婷婷五月天| 色色色婷婷| 五月天婷婷激情六月久久| 色偷偷AV亚洲男人的天堂| 色五月成人| 中文字幕 中文字幕明步| 五月成人网天天| 色婷婷六月激情| 欧美极品999| 99ri久久| 丁香五月婷婷超碰在线| 九热精品| www超碰| 久久99婷婷| 久久大香蕉同僚| 亚洲V国产V欧美V久久久久久| 色五月婷婷五月天| 婷婷五月天影院| 久久a热| 色播综合| 色色网站| 色五月丁香五月| 色情五月综合婷婷| 大香蕉99| 色五月在线播放| 九九热99热| 午夜丁香| 色情五月丁香| 欧美日韩中文国产一区发布| 久久精品A片777777| 99在线精品免费视频| 国产精品色| 婷婷丁香六月天| 久久久中文| 激情五月婷婷| 99ri视频| 午夜伊人大香蕉| 五月桃花网综合| 黄色网址五月婷婷| 激情丁香五月综合| 丁香五月婷婷偷拍| 就是色婷婷五月亚洲色| 婷婷五月天Av| www,av好吊操| 久久婷婷人人| 五月天色不卡| 五月婷A V在线| yirenjiqingshiping| 日本人妻久久| 婷婷九月激情| 中文字幕日韩无码制服诱或| 99视频只有这里精品| 欧美黄色韩日网| 五月丁香六月色| 久久久8| 99精品网| 开心婷婷五月综合| 超碰色色综合| 丁香色啪综合| 99久在线精品99re8热| 九九re精品视频在线观看| 久久九九99| 99噜噜噜在线播放| 伊人婷婷五月天av| 操97免费超级视频| 久久精品国产一区二区三区四区| 国产九月婷婷| 丁香婷婷性爱| 天天操天天谢| 丁香五月天色婷婷| 久久99热这里只有精品| 一本色道久久综合狠狠躁一二三| 九九狠狠干| 五月激情五月丁香| 色小说五月天| 激情五月婷| 婷婷五月色综合香五月| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 激情五月天综合网| 日韩AV中文字幕在线| 丁香五月首页| 婷婷五月天第四色| 99精品热视频| 色播jjjj| 狠色综合网| 婷婷五月天成人综合网| 日本九九九九| 四色五月婷婷| 狠狠操.com| 密桃激情五月天综合网| A久久| av五月丁香| 色综合中文| 婷婷五月天亚洲精品| 97色97干| 人妻视频一区而且二区| 1024国产| 色爱亚洲| 亚洲字幕AV一区二区三区四区| 国产精品色婷婷久久久精品| 日本成人噜噜噜噜噜| 大香线蕉伊人| 2050人人操免费工开爱| 五月丁香网视频| 五月婷婷丁香在线| 国产亚洲精品AAAAAAA片| 国产亚洲色婷婷久久99精品9j| 久久视屏这里只有久久| WWW.桔色成人.COM| 99久久喉9| 久久五月激情综合| 五月丁香另类图片| 丰满人妻妇伦又伦精品国产| av中文在线| 国产成人亚洲综合A∨婷婷| 五月丁香在线| 日韩无码成人电影| 丁香婷婷激情六月五月开心| 七月丁香五月婷婷在线| 成人天天爽| 色婷婷六月| 午夜不卡久久精品无码免费| 韩国情人在线电视剧免费观看高清版全集 | 91要啪| 啪啪九九色| 天天爽日日搞| 色综合五月| 在线观看亚洲视频影院| 婷婷香五月天| 国产亚洲99久久精品熟| 五月情四婷婷| 欧美成人va| 99视频在线播放大全| 五月停停激情网| 国产精品日本一区二区在线播放| 成人五月天综合网| 天天日天天插天天操| 玖玖精品资源| 香蕉久久国产AV一区二区| 久久性爱视频| 九九婷婷综合| 超碰色婷婷| 四月婷婷丁香五月| 丁香婷婷综合色五月激情国产基地| 色综合爱综合| 国产精品涩涩涩视频网站| 亚洲网视屏| 日韩超碰在线| 五月天丁香久久| 99精品视频网| 97热久久五月婷婷| 日本99色| AA久久| 激情婷婷丁香| 91在线97视频| 亚洲色情在线| 密视AV综合在线| 亚洲成人在线五月天| 99热亚洲| 激情五月六月丁香| 中文在线成人| 色色丁香五月| 五月婷婷天堂| 超碰99热| 久久五月视频| 日日想日日夜日日操| 精品一二三区久久AAA片| 色色色色五月天| 99色干| 久久网日本| 一本久道综合色婷婷五月| 色色免费网站| 婷婷在线视频| 婷婷丁香六月影视| 曰韩五月丁香色婷婷无码| 99这里只有精品在线观看| 九九99久久精品| 国产va在线视频| 国产特级毛片AAAAAAA高清| 天天骑日日爽| 精品亚洲国产成AV人片传媒| 久久久精久人妻| 99ree6| 色六月视频| 爱iii做iiii日日| 色欲一二三| 9福利性视频欧美| 9色视频在线| 久久久妻人人人| 精品久久99码| 色青青视频| 91人人爱| 国产欧洲欧洲精品久久| 色色激情网| 色色国产| 麻豆五月丁香婷婷| 99色五月| 免费观看的AV| 亚洲成人九九九| 91一起操| 丁香五月丁香伊人| www.久久久久久久久久久| 五月丁香婷婷色色色| 如何安全看伊人婷婷| 国产精品扒开腿做爽爽爽A片唱戏| 五月激情网络| 97人妻碰碰碰久久香蕉| 久热9| 国产成人AV人人爽人人澡Va| 九月色婷婷婷| 色欲午夜无码久久久久久张津瑜| 超碰97干| 99热啪啪| 婷婷情爱五月天6| 99热这里是精品| 精品香蕉99久久久久网站| 成人丁香婷婷| 亚洲 综合中文| 五月丁香综合精品欧美| 色玖玖爱| 丁香久色| 婷婷中文字幕网| 九九热最新视频| 天天五月香欧美| 成人国产欧美大片一区| 婷婷色操| 亚洲色小说在线综合| 久re热视频| 狠狠色丁香| 99热欧| 青青草Avb在线| 五月天激情网图片| 99国产小视频| 欧美天天爽| 99干在线| 少妇AB又爽又紧无码网站| 国产色五月| 久久九色| 99小视频在线观看| 香蕉久久国产AV一区二区| 激情综合五| 天天摸天天爽| 超碰一区二区| 亚洲操操操| 国产美女视频久| 六月丁香婷婷网| 久超超碰| 亚洲天堂青草| 国产乱人偷精品人妻A片| 久9视频免费播放| 亚州日本欧州韩美高青高潮一| 婷婷五月乱交换| 亚洲激情综合| 人人妻人人澡| 色婷婷五月综合色婷婷| 中文成人在线| 日韩成人精品中文字幕| 五月天综合视频网| 成人婷婷色五月天| 丁香五月婷婷五月| 中文字幕综合色| 亚洲妇女熟BBW| 粉嫩av懂色av蜜臀av熟妇| 丁香五月综合在线观看| 99re这里只有精品免费| 九九操操| 铁牛TV人妻| 婷婷五月另类网站| 99五月香婷婷丁香在线视频| 91日本在线| 国产在这里只有精品| 激情五月com| 丁香五月婷婷婷婷欧美综合| 激情性爱五月天| 99精品九九| 亚洲字幕AV一区二区三区四区 | 激情伊人五月天| 五月丁香亚洲综合网| 六月婷婷深深爱| 九九aV| 丁香五月婷婷www..com| 超碰婷婷五月| 九九婷婷激情综合网| 精品一区二区三区四区五区六区| 91色涩| 在线观看婷婷5月| 婷婷五月天黄色小说| 亚洲人妻一区二区| 玖操97| 亚洲精品色色| 九月激情网| 丁香婷婷浪潮AV久久综合| 成人午夜视频精品一区| 六月丁香五月婷婷| 色综合色色| 天天综合网91| 99热99在线| 国产成人av在线| 五月婷婷六月丁香综合| 欧美丁香五月97色| 91超级碰| 超碰高清在线| 丁香五月婷婷AV| 色99在线视频| 五月丁香天堂网| 丁香五月综合激情啪啪| 美女五月狠狠| 丁香五月亚洲激情婷婷射| 丁香五月天AV在线| 色综合天堂| 亚洲综合婷婷| 激情五月婷黄版| 人人干天天舔| WWW五月天| 开心丁五月| 五月熟妇婷婷久久| 狠狠88综合久久久久噜噜噜| 久久A热| 婷婷综合网站| 五月天四色房丁香亭亭| 日本系列_4页_777FP| 91黄址| 97久久草草超级碰碰碰| 五月丁香婷草| 日本色天堂| 女高怪谈在线观看| 五月天伊人网| 天天五月天综合网址| 新激情五月天天在线网| 黄色AV日韩| 婷婷色导航| 99热最新国内| 色五月婷婷91| 亚洲综合九九| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 殴美97色| 五月天丁香网站| ay2区| 五月婷婷九| 五月婷婷成人| 日本人妻A片成人免费看片| 丁香五月性| 亚洲激情av| 91夫妻网站九色| 大香蕉伊在| 97在线精品| 狠狠草婷婷| 亚洲成人人人操| 中文字幕在线资源| 成人免费120分钟啪啪| 日韩AV在线电影| 狠狠人妻色综合| 欧美婷婷五月激情| 婷婷激情图片| 五月丁香久久| 99热在线看| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 99视频91| 欧美综合激情五月丁香| 天天操婷婷| 香蕉综合网| 六月丁香五月激情亚洲AV| 五月丁香狠狠| 色婷视频| 大香蕉丁香婷婷| 大香蕉九九热| 色婷婷狠狠爱| 另类五月激情| 99re久久| 高清国产AV| 激情的五月婷婷蜜桃| 色综合色色色| 99re6在线视频精品免费| 狠狠久久婷婷| 日本ww亚洲| 天天综合插插| 丁香月六月| 欧洲色色| 任你草| www.操.com| 丁香五月六月婷婷综合激情| 99视频精品视频| 91天天操天天干天天射| 亚洲超级碰| 91猫咪国产在线播放| 亚洲精品V天堂中文字幕| 亚洲日韩久久婷婷伊人| 97婷婷丁香五月| 大香蕉五月天婷婷| 夜夜人妻五月天| 婷婷射图五月天| 五月婷综合性中心| 夜夜操天天干| 热久久这里只有三级视频| 开心五月激情站| 婷婷色影院| www热久久yy9| 久热播这里只有精品| 欧美人与性动交CCOO| 五月天婷婷基地综合网| 激情五月深爱婷婷| 第四色在线观看| 狠狠色婷婷| 丁香五月中文字幕色播| 国av网| 五月婷婷丁香五月亚洲色| 97精品欧美91久久久久久久| 狠狠情色| 五月天色官网| 婷婷色六月| 久久婷婷五月丁香网| 亚洲色热| 五月久久| 色婷婷视频在线| 91干婷婷| 偷拍视频五月天| 色色色综合| 超碰在线91| 99热在线观看精品| 狼人狠狠操| 91丁香五月| 99超碰人人| 丁香五月婷婷香| 丁香六月综合| 99热这里只有精品一区| 亚洲成人影视在线| 日本久久久97| 开心激情久久久久久久| 大香蕉220| 五月婷婷这里都是精品| 少妇大叫太大太粗太爽了A片| 99er这里只有精品视频| 可以看的av| 丁香婷婷人妻| 可以直接看的av| 九九色热| 婷婷激情九月| 久久精品99| 久久九九综合| AV伊人青草丁香六月| 久久婷婷伊人| 婷婷永久在线| 大香蕉九九| 中海油常州环保涂料有限公司| 久久五月婷| 色婷婷五月综合| 99久久6| 久久这里只有精彩| 久久色情| 婷婷五月天亚洲色| 国产黄色在线| AV天堂婷婷五月天| 天天肏在线视频| 99视频精品全部免费 在线| 国产日产亚系列精品版优势| 六月丁香五月激情网| 97操碰98| 婷婷va| 久久精品63| 五月天天天色| 天天综合插插| 五月婷婷av在线| 久久色五月天激情小说| www一起操在线观看| 丁香婷婷性久久| 色婷婷av在线| 免费视频无码| 亚洲丁香五月美女| 伊综合蕉| 五月天播播中文字幕| 色色丁香五月天| 婷婷五月天基地| 精品99网站| 色五月激情综合网站| 五月婷婷色播| 性色欲情 网站| 婷婷的五月天另类视频| 婷婷天天日婷婷| 丁香五月91| 丁香网站| 五月婷亚洲精品| 综合色五月| 超碰99热| 色婷婷综合五月| 欧美婷婷丁香五月| 欧美日韩999| 九九爱看亚洲| 亚洲一级AV在线免费播放| 欧洲一区二区| 26uuu美女三级视频| 成人精品免费在线观看| 男女免费视频999| 亚洲综合婷婷五月| 无码免费人妻A片AAA毛片西瓜| 色丁香在线视频| 激情五月天福利| 久久综合爱| 亚洲中文乱字字幕线在永久| 99热全是精品| 色情综合网| 国产成人99久久亚洲综合精品| 97精品欧美91久久久久久久| 欧美成人AAA片一区国产精品| 少妇综合网| 都市激情久久| 欧美三级级99久久| 六月丁香啪啪啪| 激情深爱综合网| 99精品在线观看| 丁香五月婷婷久久久| 97人人草| 国精产品久久| www.色99| 成人片黄网站色大片免费毛片| 五月婷婷69| 成人操呦av| 婷婷欧美激情| 九九色色| 青青草tp| 天天干天天射综合网| 丁香六月婷婷久久综合| 九九这里有精品| 色综合久久88色综合天天人守婷| 五月亭大香蕉| 深夜婷婷 丁香| 五月婷婷六月天| 伊人五月丁香| 好好干Av| 99久久97久久欧美综合网| 欧美电影在线播放| 97婷婷狠狠| 婷婷五月天综合色| 婷婷五月在线综合| 大伊香蕉玖玖爱| 新激情婷婷| 婷婷六月综合激情| 色五月大| www久热com| 秋霞学生妹一二级| 99色热视频| 中文字幕无码成人电影| www.minyis.com【JT】实力收量可预付QQ2101460746 | 色七七九九| 1级欧美日韩| 六月婷婷综合| 亚洲天天| 五月婷婷福利| 99热自拍| 亚洲激情综| 琪琪色五月婷婷老师| www.夜夜操.com| 亚洲精品色| 色丁香影院| a色色色色色| 人人操人人操919999| 五月天精品| 五月色婷婷综合| 婷婷五月天AV在线| 婷婷婷婷婷婷婷婷| 天天擼久久擼在线| ji'qing'luan'ren'lun| 国产三级片91| 六月婷婷视频| 中文字幕婷婷在线| 婷婷五月,综合伊人| 少妇高潮呻吟A片免费看软件| 亚洲五月婷婷| 大香蕉久艹| 国产精品色色| 5月丁香啪啪啪| 久久久久99精品成人片| 这里只精品| 婷婷丁香五月天哟啪| 先锋资源91| 六月色婷婷综合影视| 爱操天堂| 五月天久久色| 99国产精品久久久久久久久久久| 婷婷综合久久| 91色色色18| 日本婷久久| 色五月婷婷婷婷| 天天狠狠色| 99热欧美在线观看| 六月婷婷无码| 国产精品视频免费看| 久久九九婷婷| 色婷婷综合丁香五月天| 丁香婷婷老司机久操| 91精品刘玥| 丁香五月激情久久麻豆| 色狠狠婷婷| 久99久视频精品| 97婷婷五月丁香| 99热超碰人| 色婷婷播放| 色综合99色| 日本操B片| 9精品一区| 久xxxx| 色爱爱综合网| 亚洲123区高清入口| 97偷拍对白视频| 狠狠色丁香久久综合婷婷亚洲成人福利| 69热91天堂| 26uuu成人网| 密视AV综合在线| 色播综合| 深爱激情四射| 五月激情久久综合| 26uuu欧美亚洲日韩| 深爱五月天 开心网| 五月天久久www| 午夜激情五月天| 九九AV在线| www,8050,午夜三级| 97天堂| 欧美色狠婷久| AV五月丁香| 国产一级婬片毛片| 丁香五月天天高清在线| 天天干 夜夜爽| 中文久久婷婷| 99精在线| 五月天婷综合| 另类激情中文| 日本人妻伦在线中文字幕| 久久婷婷五月天丁香| 操操操91| 五月丁香啪啪啪啪| 欧美WW在线网| 久色网址| 色插综合网| 夜丁香五月婷婷| 天天噜| 狠狠草在线观看| AV成人在线网站| 天天综合色99| 激情综合无码| 日韩黄黄| 伊人五月综合网| 日韩无码专区| 风流少妇A片一区二区蜜桃| 丁香五月很很肏| 99热最新精品| 狠狠狠人妻| 五月五婷婷| 欧美人妻一区二区| 亚洲深喉aV| 狠狠色婷婷7777久综合| 六月丁香激情综合网| 五月婷婷伊人久久| 五月丁香 啪啪| 色五月琪琪| 99久久国产宗和精品1上映| 超碰在线观看成人视| 欧美操人| 日日做夜夜爱| 九九99精品视频| 色婷婷小说| 亚洲色综久久五月| 天天搽天天射| 丁香六月成人| 色五月天在线观看| 四虎99热在线观看网站| 综合网色| 日本va网站| 婷婷六月综合基地| 97人人干| 欧美啪啪五月天| 丁香五月天堂| SS丁香五月婷婷| 亚洲天堂久久| 婷婷五月天亚洲综合网| 九九日本视频| http://www.sd-xiangsu.com/| 五月丁香综合啪啪| 婷婷久久欧美| 欧洲永久精品| 99久久极情精品一区| 婷婷社区五月天| 天天狠狠综合精区| AAA久久久| 五月天婷a| 久久婷婷热| 大香蕉视频99| 高清无码.com| 婷婷五月天亚洲五码| 欧类av怡春院| 97操操操| 操日挥操日日| 天天综合色| 91色噜噜狠狠狠狠色综合| 天天插轮理| 五月丁香999| 丁香网五月天| 色婷婷狠狠18禁| 开心五月网 | 91re色综合视频| 深爱婷婷基地| 久久综合影院 | 久综合网| aaa久久| 五月开行婷婷色五月| 无码人妻少妇色欲AV一区二区| 久久综合55| 开心五月激情| 中美日韩成人在线| 天天色凹凸| 色大综合| 成人在线视频网| 五月丁香久久呀| 99视频只有这里精品| 日日爽夜夜爽| 99热99美国在线观看| 色婷五月天激情| 极品人妻VIDEOSSS人妻| 91九九| 九九無妻| 97luluse| 五月丁香六月情婷婷久久| 人妻videos人妻高清| 亚洲中文av| WWW,五月| 五月天亭亭俺也| 狠狠婷婷综合| 99久久成人| 99热91| 9色在线视频| 天天爽天天日| 琪琪色网址| 婷婷深爱五月丁香网| 久9视频| 婷婷六月丁香在线| 五月天婷婷色综合| 99精品视频偷拍| 人人干99| 中文字幕丰满乱孑伦无码专区 | 亚洲AV成人无码电影| 日本成人噜噜| 99riAV成人在线视频| 囯产精品一品二区三区| 伊人无码高清| 丁香五月婷婷动漫视频| www.五月天婷婷| 日韩成人AV在线| 99日韩| 日韩狠狠色| 久操大香蕉| www99精品| 婷婷欧美综合| 超级碰91| 五月天婷婷成人| 丁香五月成人| 婷婷午夜激情| 色色五月天丁香婷婷| 99视频日韩| 五月五婷婷| 青青草婷婷久久| 天天日夜夜曹| 久久一品区| 91丨九色丨熟女丰满| 欧美三级视频下载| 裸体美女丁香五月天。| 亚洲午夜一区二区| 五月天激情四射网站| 久热一本| 婷婷综合五月天| 日日夜夜狠狠婷婷色| 色99视频| 五月婷婷综合热| 日本久久精品| 激情综合网激情五月欧美| 日本视频不卡123区| 丁香五月天激情综合网| 国产av第一专区| 五月婷婷影| 狠狠久久婷婷| 丁香色五月 97干| 五月丁香综合激情| 涩五月婷婷| 另类综合国产| 久久六月综合| 久9久9久9久9久9久9| 亚洲精品网站色视频| 亚洲综合五月天| www,婷婷五月天,com| 激情丁香久久| 色综合久久88色综合天天看| 99精品国产在热久久| 成人电影一区| 五月丁香色色综合| Blackedraw视频一区二区| 丁香五月婷婷激情中文| 99热全是精品| 直接看的AV| 第六色在线| 91在线看片| 久99综合婷婷| 婷婷,五月天,丁香,第一| 中文字幕在线免费看线人| 综合五月天完整| 色娸娸综合网| 色五月亚洲| 人人操Av| 色婷婷AV在线观看| 亚洲天堂啪啪| 色之综合网| 九九在线91| 色欲天天综合| 五月六月丁香婷婷在线观看| 97操碰在线97| 六月婷婷av| 一本久久亚洲五月婷婷| 新男人天堂人妻| 91啪啪网| 国产va在线视频| 色99婷婷五月天| 中文字幕在线日亚州9| www狠狠| 亚洲无线视频| 日韩成人中文| 久久久婷婷| 天天激情站| 色综合久久天天综合网| 香蕉久久国产AV一区二区| 五月天丁香久久综合 | 开心五月色婷婷综合开心网| 国产精品丝| 婷婷丁香五月天欧美| AV免费在线网站| 亚洲人妻AV| 久热精品视频| 亚洲小视频免费观看| 欧美日韩成人综合9| 久久婷婷五月天懂色| 亚洲色综久久五月| 午夜爱插插| 国产一级黄色影片,| 亚洲五月花| 婷婷综合色播网| 久久婷婷激情五月天一区二区| 婷婷五月天性爱视频| 婷婷色基地| 国产成人VA| 九九这里是免费的视频5| 天堂成人A片永久免费网站| 久久999久久999久久999久久| 先锋男人99资源| 五月天婷婷爱| 五月天色色无码| 俺去也五月天婷婷| 激情五月天无人视频在线| 五月天丁香成人社| 欧美在线ee日韩| 噜噜视频| 久久婷婷五月综合啪| 97色伦另类图片小说视频| 第五婷婷伊人丁香色| 欧美精品狠狠色丁香婷婷| 99色免费观看全部| 一级黄色尤物综合视频手机在线观看| 99这里只有精品国产| 色欧美日| 欧美69久成人做爰视频| 亚洲人妻av| 99色综合| 日本va网站| 婷婷操逼| 九月av| 色婷婷丁香五月| 五月天激情网站| 99热这里只有免费精品| www.91有码.com| 大香蕉手机视频| 久久狠狠干| 久久99久久久| 色欲天天综合网| 婷婷五月激情欧美| 六月激情久久| 久久黄色片| 日韩按摩二区| 五月天 综合 在线|