亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

Spring Boot個(gè)人云盤系統(tǒng)實(shí)戰(zhàn):分片上傳、JWT與文件管理設(shè)計(jì)

Spring Boot個(gè)人云盤系統(tǒng)實(shí)戰(zhàn):分片上傳、JWT與文件管理設(shè)計(jì) 最近做了一套基于Spring Boot的網(wǎng)盤類管理系統(tǒng)核心功能就是個(gè)人云盤。像這種Spring Boot 前端JS的Title其實(shí)是很典型的Java Web練手項(xiàng)目網(wǎng)上也有各種各樣的教程但絕大多數(shù)都是跑通就完事真正像工程一樣考慮細(xì)節(jié)的很少。這篇文章就按我實(shí)際開(kāi)發(fā)這套個(gè)人云盤管理系統(tǒng)的經(jīng)驗(yàn)把這個(gè)題目的技術(shù)架構(gòu)、數(shù)據(jù)庫(kù)、核心功能、中間踩的坑從頭梳理一遍給想拿這個(gè)題目做畢業(yè)設(shè)計(jì)或者練手的同學(xué)一個(gè)可以直接照抄的參考。整個(gè)系統(tǒng)功能覆蓋得很完整用戶注冊(cè)登錄、文件上傳下載、文件夾管理、分享鏈接、回收站恢復(fù)、圖片和文本在線預(yù)覽。別看這些功能聽(tīng)起來(lái)簡(jiǎn)單真正做起來(lái)文件目錄層級(jí)、分片上傳、邏輯刪除、權(quán)限校驗(yàn)這些模塊單獨(dú)拎出來(lái)都能寫很多文章。所以我這里會(huì)把重點(diǎn)放在整體設(shè)計(jì)和最容易踩坑的實(shí)現(xiàn)細(xì)節(jié)上而不是貼幾百行代碼充數(shù)。1. 項(xiàng)目整體設(shè)計(jì)與技術(shù)選型思路1.1 核心需求拆解個(gè)人云盤聽(tīng)起來(lái)簡(jiǎn)單但真正拆開(kāi)需求以后會(huì)發(fā)現(xiàn)很多東西如果不提前理清楚開(kāi)發(fā)到后面很容易自己把自己繞暈。我把需求分成四塊。第一塊是用戶相關(guān)。登錄、注冊(cè)、退出、獲取當(dāng)前登錄用戶信息。這個(gè)系統(tǒng)定位是個(gè)人云盤所以權(quán)限模型不需要做多角色只要認(rèn)準(zhǔn)當(dāng)前登錄的用戶是誰(shuí)就行。所有文件數(shù)據(jù)都?xì)w屬于某個(gè)用戶IDA用戶看不到B用戶的文件。第二塊是文件管理。這是核心中的核心包括上傳文件、下載文件、新建文件夾、重命名、刪除、移動(dòng)、文件列表展示、回收站恢復(fù)。其中文件列表的樹(shù)形展示或者叫目錄結(jié)構(gòu)是很多新手容易卡住的地方。因?yàn)槲募到y(tǒng)是有層級(jí)關(guān)系的不是平鋪的列表。第三塊是分享功能。文件可以生成一個(gè)分享鏈接加上提取碼發(fā)給別人對(duì)方在瀏覽器里打開(kāi)鏈接輸入提取碼后能看到文件詳情或者直接下載文件。分享鏈接有過(guò)期時(shí)間過(guò)期后自動(dòng)失效。第四塊是其他輔助功能比如文件圖標(biāo)展示、圖片預(yù)覽、文本預(yù)覽、磁盤使用情況統(tǒng)計(jì)之類的。這屬于加分項(xiàng)但實(shí)際開(kāi)發(fā)時(shí)也要考慮進(jìn)去因?yàn)轫?yè)面展示的時(shí)候得根據(jù)文件類型做不同的標(biāo)識(shí)。需求拆解完以后最好不要急著寫代碼先設(shè)計(jì)一下數(shù)據(jù)表。數(shù)據(jù)表設(shè)計(jì)得好后面編碼會(huì)很順暢數(shù)據(jù)表設(shè)計(jì)得有問(wèn)題后面會(huì)不斷返工。所以我把數(shù)據(jù)庫(kù)設(shè)計(jì)放在開(kāi)發(fā)之前一步。1.2 為什么選Spring Boot 前端JS這個(gè)技術(shù)組合在畢業(yè)設(shè)計(jì)和各類實(shí)戰(zhàn)項(xiàng)目里出現(xiàn)頻率非常高。后端用Spring Boot核心原因在于它把Spring家族的配置簡(jiǎn)化到了不需要XML的程度內(nèi)嵌Tomcat容器一個(gè)main方法就能啟動(dòng)服務(wù)。相比傳統(tǒng)的SSHSpring Struts Hibernate或者SSMSpring Spring MVC MyBatis方案省去大量配置時(shí)間讓開(kāi)發(fā)者能把精力集中在業(yè)務(wù)邏輯上。另外Spring Boot有非常成熟的生態(tài)后面我們用到Web上傳、攔截器、配置文件多環(huán)境切換都有現(xiàn)成方案。前端選擇JavaScript方向具體我用了Vue框架加Element UI組件庫(kù)。Vue的寫法比原生JS更清晰數(shù)據(jù)驅(qū)動(dòng)視圖文件列表、上傳彈窗這些交互用組件化開(kāi)發(fā)會(huì)舒服很多。當(dāng)然如果說(shuō)題目里只寫了基于JS用原生JS照樣可以做只是開(kāi)發(fā)速度慢一些。我的建議是如果自己有Vue基礎(chǔ)就用Vue如果完全不會(huì)框架用原生JS配合jQuery也能完成只要確保和后端交互是標(biāo)準(zhǔn)HTTP接口即可。前后端分離以后開(kāi)發(fā)的時(shí)候啟動(dòng)兩個(gè)服務(wù)前端開(kāi)發(fā)服務(wù)器和后端Java進(jìn)程。遇到跨域問(wèn)題不要怕后面我會(huì)專門講CORS怎么配。重要的是不要在前端JS里寫死絕對(duì)路徑所有環(huán)境相關(guān)配置放到全局配置里統(tǒng)一管理。1.3 系統(tǒng)架構(gòu)設(shè)計(jì)整個(gè)系統(tǒng)的架構(gòu)并不復(fù)雜思路如下。前端頁(yè)面通過(guò)瀏覽器發(fā)起HTTP請(qǐng)求請(qǐng)求走到后端的Controller層。Controller負(fù)責(zé)接收參數(shù)、校驗(yàn)參數(shù)、調(diào)用Service再返回統(tǒng)一格式的JSON給前端。Service層處理具體業(yè)務(wù)邏輯比如文件上傳時(shí)判斷大小、生成存儲(chǔ)路徑、更新數(shù)據(jù)庫(kù)記錄。數(shù)據(jù)訪問(wèn)用MyBatis Plus內(nèi)置的BaseMapper常規(guī)的增刪改查不需要手寫SQL只有遞歸查詢目錄、多表統(tǒng)計(jì)這種特殊場(chǎng)景需要自定義XML。工程內(nèi)的包結(jié)構(gòu)大概是controller控制層service業(yè)務(wù)層mapper數(shù)據(jù)訪問(wèn)層entity數(shù)據(jù)庫(kù)實(shí)體dto前端出入?yún)⒎庋bconfig配置類utils工具類另外為了統(tǒng)一返回消息我寫了一個(gè)單獨(dú)的結(jié)果封裝類比如返回碼200表示成功500表示業(yè)務(wù)異常。所有Controller接口都返回這個(gè)封裝前端根據(jù)返回碼統(tǒng)一處理錯(cuò)誤提示這樣不需要每個(gè)接口單獨(dú)寫異常邏輯。提示前期架構(gòu)可以簡(jiǎn)單但結(jié)果封裝和異常處理務(wù)必要統(tǒng)一。前期偷懶只返回裸數(shù)據(jù)后期加了復(fù)雜頁(yè)面之后前端會(huì)被各種非標(biāo)準(zhǔn)返回搞得焦頭爛額。2. 數(shù)據(jù)庫(kù)設(shè)計(jì)與核心表結(jié)構(gòu)2.1 用戶表設(shè)計(jì)用戶表我用了這張結(jié)構(gòu)字段名id、username、password、nickname、avatar、create_time、status。id是自增主鍵。username要加唯一索引避免注冊(cè)時(shí)重名。password存BCrypt加密后的密文絕對(duì)禁止明文。avatar可以先存一個(gè)字符串路徑指向服務(wù)器上的頭像圖片鏈接也可以不做頭像功能完全省掉。status用于禁用賬戶1表示正常0表示禁用。注冊(cè)接口的邏輯很簡(jiǎn)單先檢查用戶名是否已存在存在則提示用戶名已被注冊(cè)不存在則用BCrypt工具類加密密碼寫入。登錄接口查詢用戶名和密碼匹配匹配成功生成JWT令牌返回給前端。這里要注意用戶密碼的密文長(zhǎng)度一般60位在數(shù)據(jù)庫(kù)里字段長(zhǎng)度不要建短了我遇到過(guò)有人把密碼字段設(shè)置成varchar(32)結(jié)果BCrypt密文根本存不下。2.2 文件信息表設(shè)計(jì)文件表是整個(gè)系統(tǒng)的核心字段比較多。我用的核心字段是id文件IDfile_name文件名file_size文件大小單位字節(jié)file_type文件類型比如image/png、application/pdffile_path存儲(chǔ)的相對(duì)路徑不含根目錄前綴user_id所屬用戶IDparent_id父目錄ID0表示根目錄folder_flag是否文件夾1是0否del_flag邏輯刪除標(biāo)記0正常1已刪除create_time創(chuàng)建時(shí)間update_time更新時(shí)間這里有一個(gè)關(guān)鍵點(diǎn)很多初學(xué)者喜歡把文件的實(shí)際存儲(chǔ)路徑直接存一個(gè)絕對(duì)路徑比如C:\server\data\user1\abc.txt。這個(gè)在本地跑沒(méi)問(wèn)題但是部署到服務(wù)器上服務(wù)器環(huán)境和本地不一致很可能路徑就失效了。正確做法是存相對(duì)路徑比如user/1/2025/03/abc.txt在啟動(dòng)配置里設(shè)置一個(gè)根目錄結(jié)合起來(lái)才是完整物理路徑。我做的系統(tǒng)就是上傳后先根據(jù)用戶ID生成一個(gè)目錄用戶ID然后把文件寫到根目錄下的用戶ID目錄里數(shù)據(jù)庫(kù)中只存用戶ID/文件名的相對(duì)路徑。第二個(gè)關(guān)鍵點(diǎn)是文件夾本身也要在文件表里占一條記錄。folder_flag1表示這條記錄是一個(gè)文件夾記錄沒(méi)有實(shí)際物理文件file_path可以為空但有parent_id用于確定歸屬。這樣文件夾樹(shù)和管理操作全都是同一張表不需要額外的目錄表。2.3 分享表設(shè)計(jì)分享功能只需要一張表。字段包括id分享IDshare_token隨機(jī)生成的短鏈接標(biāo)志用UUID去掉橫線的形式user_id分享者IDfile_id被分享的文件IDextract_code提取碼4到6位隨機(jī)數(shù)字expire_time過(guò)期時(shí)間status狀態(tài)1有效0失效每次生成分享時(shí)后端生成share_token和extract_code把文件ID和分享者ID寫進(jìn)去。其他用戶訪問(wèn)分享鏈接時(shí)后端通過(guò)share_token拿到分享記錄判斷是否過(guò)期。然后前端頁(yè)面上輸入提取碼比對(duì)成功后返回文件信息文件信息如果是文件夾則返回該文件夾下的文件列表如果是一個(gè)普通文件則可以直接觸發(fā)下載。這里要注意分享文件夾的場(chǎng)景在提取碼校驗(yàn)通過(guò)后訪問(wèn)文件夾下的子文件時(shí)還需要校驗(yàn)子文件的歸屬是否確實(shí)在這個(gè)分享文件夾下不然容易被越權(quán)訪問(wèn)。2.4 回收站與邏輯刪除設(shè)計(jì)回收站我不建議單獨(dú)建表原因很簡(jiǎn)單文件表已經(jīng)足夠承載這個(gè)邏輯了。在文件表里加一個(gè)del_flag字段刪除文件時(shí)只是把del_flag改成1同時(shí)更新時(shí)間置為當(dāng)前時(shí)間?;厥照卷?yè)面查詢時(shí)條件加上del_flag1就能把刪除過(guò)的文件撈出來(lái)。點(diǎn)擊恢復(fù)時(shí)把del_flag改回0同時(shí)可能需要檢查父ID是否還存在防止父目錄已經(jīng)被徹底刪除導(dǎo)致無(wú)法掛載。徹底刪除時(shí)才真正刪除數(shù)據(jù)庫(kù)記錄并調(diào)用文件工具類刪除物理文件。這個(gè)邏輯對(duì)比單獨(dú)建回收站表要清爽很多也便于后面加回收站保留天數(shù)這樣的擴(kuò)展需求。注意邏輯刪除容易出現(xiàn)的一個(gè)坑是查詢文件列表時(shí)忘了加del_flag0條件導(dǎo)致回收站里的文件出現(xiàn)在正常列表里。如果使用MyBatis Plus可以給文件表實(shí)體加TableLogic注解做全局邏輯刪除這樣內(nèi)置的selectList方法會(huì)自動(dòng)追加del_flag0條件省心很多。3. 核心功能模塊的實(shí)現(xiàn)細(xì)節(jié)3.1 用戶認(rèn)證與JWT權(quán)限控制登錄認(rèn)證這塊我選擇了JWT。原因是項(xiàng)目一旦前后端分離服務(wù)端如果還用Session就會(huì)面臨跨域共享Session、跨服務(wù)部署Session不一致的問(wèn)題。JWT的思路是登錄成功后把用戶ID和過(guò)期時(shí)間聲明進(jìn)一個(gè)加密的Token前端保存Token之后每個(gè)請(qǐng)求在Header里帶上。后端寫一個(gè)攔截器統(tǒng)一解析效率高也不需要額外的Redis存儲(chǔ)。JWT工具類我封裝了兩個(gè)方法一個(gè)是生成Token一個(gè)是解析Token。生成Token時(shí)把用戶ID作為claim放進(jìn)去同時(shí)設(shè)置過(guò)期時(shí)間為24小時(shí)。攔截器在每個(gè)請(qǐng)求里讀取Header的Authorization字段去掉Bearer前綴后解析。如果解析成功就把用戶ID放入ThreadLocal如果解析失敗則返回401錯(cuò)誤。登錄注冊(cè)等少數(shù)公開(kāi)接口需要放行。攔截器注冊(cè)的時(shí)候要特別注意放行順序。比如用Spring Boot的注冊(cè)方式攔截器對(duì)所有路徑生效需要在addPathPatterns時(shí)設(shè)置放行路徑列表。我在實(shí)際開(kāi)發(fā)中就把文件下載接口忘記放行結(jié)果前端跳轉(zhuǎn)瀏覽器的下載鏈接全部被攔截排查了很久才發(fā)現(xiàn)問(wèn)題是攔截器把所有下載請(qǐng)求攔截了不僅沒(méi)有返回文件流還返回了JSON錯(cuò)誤瀏覽器直接下載了一個(gè)json錯(cuò)誤文件。這個(gè)經(jīng)驗(yàn)值得記住。3.2 文件上傳與分片秒傳實(shí)現(xiàn)文件上傳是最容易出問(wèn)題的模塊。常規(guī)上傳后端接口就是接收MultipartFile參數(shù)獲取文件名和大小然后把文件寫到磁盤上再保存一條記錄到數(shù)據(jù)庫(kù)。但真實(shí)業(yè)務(wù)里大文件上傳如果不做處理用戶傳幾個(gè)GB的文件基本必失敗不是連接超時(shí)就是內(nèi)存溢出。我的方案是分片上傳。前端把文件切片每片大小5MB然后循環(huán)調(diào)用上傳接口上傳接口接收文件分片以及一個(gè)分片編號(hào)還有一個(gè)上傳ID用來(lái)標(biāo)識(shí)同一個(gè)文件的分片集合。每個(gè)分片作為臨時(shí)文件存到臨時(shí)目錄全部上傳完成后前端調(diào)用合并接口后端把所有分片按編號(hào)拼接成一個(gè)完整文件。這樣即使傳到一半網(wǎng)絡(luò)斷了也能重新上傳未完成的分片而不需要重頭再傳。這里核心代碼如下Controller接收分片時(shí)用到MultipartFile和RequestParamPostMapping(/upload/chunk) public Result uploadChunk(RequestParam(file) MultipartFile file, RequestParam(uploadId) String uploadId, RequestParam(chunkIndex) int chunkIndex) { String tempDir storageConfig.getRootPath() /tmp/ uploadId; File dir new File(tempDir); if (!dir.exists()) dir.mkdirs(); file.transferTo(new File(dir, String.valueOf(chunkIndex))); return Result.ok(); }秒傳功能就是另一個(gè)思路了。上傳前前端用JavaScript讀取文件的MD5值調(diào)用后端接口查詢?cè)撐募欠褚呀?jīng)存在于共用文件庫(kù)中。如果存在直接給當(dāng)前用戶生成一條文件記錄不再寫入實(shí)際文件。我做的個(gè)人云盤系統(tǒng)里沒(méi)有做全局去重庫(kù)但可以先在用戶自己的文件目錄里查詢?nèi)绻琈D5文件已存在則直接建立引用關(guān)系避免重復(fù)存儲(chǔ)。實(shí)際開(kāi)發(fā)時(shí)推薦加一個(gè)獨(dú)立的文件指紋表字段包括MD5、文件大小、物理路徑、被引用次數(shù)這樣才能支撐真正的秒傳。分片上傳的合并操作要小心不要把所有分片內(nèi)容一次性讀入內(nèi)存應(yīng)該用InputStream循環(huán)讀取每個(gè)分片文件然后按順序?qū)懭隣utputStream。合并完成之后再刪除臨時(shí)分片文件。這個(gè)過(guò)程中還要注意處理并發(fā)上傳同一個(gè)上傳ID的情況避免合并時(shí)文件被占用。3.3 文件下載與在線預(yù)覽文件下載接口的核心是返回文件流。我用了Spring的ResponseEntity 讀取文件為Resource設(shè)置Content-Type和Content-Disposition。這里的坑主要在中英文文件名。中文文件名如果直接放到Content-Disposition里不同瀏覽器展示效果不一樣最穩(wěn)妥的做法是用URLEncoder編碼然后前端或者瀏覽器會(huì)自動(dòng)解碼。另外自己拼接HTTP響應(yīng)頭時(shí)要注意header不能包含換行符否則會(huì)在安全掃描中被判為注入漏洞。在線預(yù)覽的話圖片和文本最簡(jiǎn)單。圖片直接通過(guò)接口返回原始二進(jìn)制前端用一個(gè)組件接收blob流來(lái)展示。文本文件讀取時(shí)要注意編碼UTF-8文件正常GBK文件會(huì)出現(xiàn)亂碼。我的處理方式是先通過(guò)工具讀取文件的前幾百個(gè)字節(jié)嘗試判斷編碼然后按對(duì)應(yīng)編碼讀取內(nèi)容再轉(zhuǎn)成UTF-8返回給前端。這樣預(yù)覽體驗(yàn)會(huì)好很多。PDF和Office文件預(yù)覽要復(fù)雜一些需要第三方組件轉(zhuǎn)碼或者使用在線預(yù)覽服務(wù)依賴環(huán)境我在畢設(shè)項(xiàng)目中就沒(méi)有做復(fù)雜的在線編輯只展示了圖片、文本、視頻音頻這幾種常見(jiàn)的。3.4 文件管理接口設(shè)計(jì)文件管理包括根目錄列表、進(jìn)入子目錄、新建文件夾、重命名、移動(dòng)文件、刪除文件。接口設(shè)計(jì)其實(shí)都圍繞文件表。根目錄列表就是查詢user_id當(dāng)前用戶ID AND parent_id0 AND del_flag0的所有文件。進(jìn)入子目錄就是查詢parent_id某個(gè)ID的文件列表。新建文件夾就插入一條folder_flag1的記錄。重命名很簡(jiǎn)單直接更新file_name字段。移動(dòng)文件就是修改parent_id。刪除文件則是邏輯刪除。文件夾的刪除是特殊的因?yàn)樗沁f歸結(jié)構(gòu)。后端刪除文件夾時(shí)不能只刪當(dāng)前記錄需要先把文件夾下所有子文件找出來(lái)。我的處理辦法是用一個(gè)遞歸方法先查詢當(dāng)前文件夾的所有直接子節(jié)點(diǎn)對(duì)每個(gè)子節(jié)點(diǎn)如果是文件夾則遞歸調(diào)用如果是文件則刪除當(dāng)前記錄最后再刪除當(dāng)前文件夾記錄。在邏輯刪除模式下也可以只刪除當(dāng)前文件夾記錄然后讓子文件的信息在文件夾樹(shù)中懸掛但這種狀態(tài)恢復(fù)時(shí)很容易出錯(cuò)還是老老實(shí)實(shí)遞歸處理。前端展示文件樹(shù)時(shí)我建議不要一次性把所有層級(jí)的文件夾全部查出來(lái)。可以按需加載點(diǎn)擊文件夾時(shí)請(qǐng)求一次子文件接口。這樣接口簡(jiǎn)單數(shù)據(jù)量也小。如果確實(shí)需要展示整棵樹(shù)那就后端遞歸組裝樹(shù)形JSON前端用Vue的遞歸組件渲染。3.5 分享鏈接生成與回收站邏輯分享鏈接我在實(shí)現(xiàn)時(shí)用了兩個(gè)隨機(jī)值。一個(gè)是share_token作為鏈接的唯一標(biāo)識(shí)直接放在URL里另一個(gè)是extract_code作為輸入提取碼用戶訪問(wèn)分享頁(yè)面時(shí)必須輸入。分享者可以選擇分享有效天數(shù)比如1天、7天、永久。對(duì)應(yīng)后端記錄過(guò)期時(shí)間。校驗(yàn)時(shí)先比對(duì)share_token是否存在然后比對(duì)提取碼最后判斷是否過(guò)期。分享鏈接的生成邏輯很簡(jiǎn)單核心就是創(chuàng)建一條分享記錄public Share createShare(Long userId, Long fileId, Integer expireDays) { Share share new Share(); share.setUserId(userId); share.setFileId(fileId); share.setShareToken(UUID.randomUUID().toString().replace(-, )); share.setExtractCode(RandomUtil.randomNumbers(4)); if (expireDays ! null expireDays 0) { share.setExpireTime(LocalDateTime.now().plusDays(expireDays)); } share.setStatus(1); shareMapper.insert(share); return share; }回收站邏輯我在文件表里用del_flag實(shí)現(xiàn)文件表里有一個(gè)delete_time字段方便定時(shí)清理超過(guò)保留期的記錄。回收站頁(yè)面復(fù)用文件列表接口只不過(guò)查詢條件換成了del_flag1并且按刪除時(shí)間倒序?;謴?fù)操作和刪除正好相反將del_flag重置為0。徹底刪除時(shí)后臺(tái)會(huì)同時(shí)調(diào)用物理文件刪除方法。如果文件在多個(gè)地方被引用比如秒傳引用物理文件刪除還需要處理引用計(jì)數(shù)不能直接刪否則可能導(dǎo)致其他用戶文件缺失。我的系統(tǒng)沒(méi)有做跨用戶引用所以沒(méi)有這個(gè)顧慮但做擴(kuò)展時(shí)要注意。4. 實(shí)操過(guò)程中的關(guān)鍵配置與調(diào)試4.1 核心依賴與配置文件這個(gè)項(xiàng)目的pom.xml里依賴不需要很多主要包括spring-boot-starter-web、spring-boot-starter-validation、mybatis-plus-boot-starter、mysql-connector-java、jjwt、hutool-all、lombok。hutool這個(gè)工具包幫了很大忙生成隨機(jī)數(shù)、計(jì)算文件MD5、日期工具都用它省下大量重復(fù)代碼。application.yml這里沒(méi)有特別難的東西但有幾個(gè)配置容易出錯(cuò)。第一個(gè)是數(shù)據(jù)源url數(shù)據(jù)庫(kù)名要和本地建的一致時(shí)區(qū)必須加serverTimezoneAsia/Shanghai否則JDBC連接會(huì)報(bào)時(shí)區(qū)異常。第二個(gè)是MyBatis Plus的mapper-locations配置如果XML文件沒(méi)放到默認(rèn)classpath下需要手動(dòng)指定。第三個(gè)是文件上傳大小我設(shè)置了max-file-size: 512MBmax-request-size: 1GB。第四個(gè)是自定義存儲(chǔ)路徑Spring Boot里使用ConfigurationProperties讀取比如cloud.storage.root-path: ./data。這里的相對(duì)路徑要小心啟動(dòng)時(shí)的工作目錄不同會(huì)指向不同位置建議部署時(shí)使用絕對(duì)路徑。我貼上最核心的配置片段可以直接改用自己的spring: servlet: multipart: max-file-size: 512MB max-request-size: 1GB datasource: url: jdbc:mysql://localhost:3306/cloud_disk?serverTimezoneAsia/Shanghai username: root password: 123456 mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl cloud: storage: root-path: ./data4.2 CORS跨域問(wèn)題前后端分離后跨域問(wèn)題基本是必踩的。如果前端項(xiàng)目跑在http://localhost:8080后端接口在http://localhost:8081這時(shí)候前端直接調(diào)后端接口瀏覽器就會(huì)因?yàn)榭缬驍r截。解決方式是在后端寫一個(gè)配置類實(shí)現(xiàn)WebMvcConfigurer在addCorsMappings方法里配置允許的源、方法、請(qǐng)求頭。我當(dāng)時(shí)的經(jīng)驗(yàn)是允許源可以直接用allowedOriginPatterns(*)開(kāi)發(fā)環(huán)境這么配最省事。allowedHeaders需要把Authorization放進(jìn)去否則帶了Token的請(qǐng)求會(huì)被瀏覽器預(yù)檢攔下來(lái)。配置類寫起來(lái)也不復(fù)雜直接貼出來(lái)Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }另外如果自己實(shí)現(xiàn)了攔截器跨域配置和攔截器之間還有順序問(wèn)題。前端的預(yù)檢請(qǐng)求是OPTIONS方法攔截器如果攔了OPTIONS請(qǐng)求就會(huì)導(dǎo)致預(yù)檢失敗。解決辦法是在攔截器里面判斷請(qǐng)求方法如果為OPTIONS則直接放行。4.3 上傳大小限制的完整配置Spring Boot對(duì)文件上傳的限制來(lái)自兩個(gè)地方。一是Spring MVC的配置spring.servlet.multipart.max-file-size和max-request-size默認(rèn)只有1MB和10MB不修改的話傳大文件馬上報(bào)FileSizeLimitExceededException。二是Tomcat服務(wù)器本身的連接器限制如果超過(guò)這個(gè)限制可能返回Connection reset前端看起來(lái)像是連接被服務(wù)器斷開(kāi)。我在做分片上傳時(shí)因?yàn)槊恳黄挥袔譓B主要是把分片大小調(diào)好整體上傳接口的max-file-size還不能設(shè)太小否則即使分片沒(méi)超過(guò)限制后端臨時(shí)文件處理也可能不被允許。綜合下來(lái)我直接把單文件上傳限制改成512MB請(qǐng)求總大小改成1GB基本能滿足大多數(shù)使用場(chǎng)景。這里補(bǔ)充一個(gè)容易忽略的知識(shí)點(diǎn)Spring Boot 2.x以上版本中如果使用了自定義的MultipartConfigElement配置類它的優(yōu)先級(jí)會(huì)覆蓋配置文件中的spring.servlet.multipart配置。我建議不要同時(shí)用兩種配置只保留yml配置就好否則出了問(wèn)題排查時(shí)會(huì)很困惑。4.4 日志配置與接口調(diào)試調(diào)試階段強(qiáng)烈建議把日志級(jí)別調(diào)到DEBUG至少在開(kāi)發(fā)環(huán)境要調(diào)。MyBatis Plus會(huì)在控制臺(tái)打印SQL日志你可以看到執(zhí)行的每條SQL對(duì)于排查數(shù)據(jù)有沒(méi)有查對(duì)很有幫助。另外可以開(kāi)啟Spring Boot的web日志查看請(qǐng)求和響應(yīng)的基本狀態(tài)。我習(xí)慣把項(xiàng)目里所有Controller接口的出入?yún)⒃贏OP里打一條日志打印請(qǐng)求地址、請(qǐng)求參數(shù)、耗時(shí)這個(gè)做法在聯(lián)調(diào)時(shí)省了無(wú)數(shù)口舌。前端調(diào)試我推薦用瀏覽器開(kāi)發(fā)者工具配合Postman。遇到上傳類接口異常先看請(qǐng)求體里file字段名稱和后端MultipartFile參數(shù)名是否一致不一致的話后端拿到的file就是null。遇到下載接口異常直接用Postman請(qǐng)求下載地址看返回的Content-Type和Content-Disposition是不是正確。如果返回的是JSON錯(cuò)誤則說(shuō)明請(qǐng)求被攔截器或者異常處理接管了。5. 常見(jiàn)問(wèn)題與避坑指南5.1 中文文件名亂碼問(wèn)題這個(gè)幾乎是所有網(wǎng)盤類項(xiàng)目都會(huì)碰上的問(wèn)題。表現(xiàn)是前端上傳中文文件后端保存到磁盤后文件名變成亂碼下載時(shí)設(shè)置的文件名也是亂碼。原因有兩層一是HTTP傳輸時(shí)編碼不是UTF-8二是Content-Disposition頭里不能直接放中文。解決辦法是前端在FormData里正常傳文件名后端獲取文件名后到輸出響應(yīng)時(shí)用URLEncoder.encode(fileName, UTF-8)重新編碼。如果保存到磁盤的文件名亂碼檢查一下服務(wù)器操作系統(tǒng)字符集和Tomcat的URIEncoding配置通常設(shè)成UTF-8就能解決。我寫下載接口的時(shí)候?qū)憫?yīng)頭做了一定處理關(guān)鍵在于文件名要編碼而不是直接拼接String encodedFileName URLEncoder.encode(fileName, UTF-8); response.setHeader(Content-Disposition, attachment; filename\ encodedFileName \);5.2 跨域配置正確但請(qǐng)求依然失敗遇到過(guò)一次很迷惑的問(wèn)題跨域配置看起來(lái)沒(méi)問(wèn)題但前端帶Authorization的請(qǐng)求依然失敗。后來(lái)發(fā)現(xiàn)是攔截器把OPTIONS預(yù)檢請(qǐng)求攔了。瀏覽器在發(fā)起復(fù)雜請(qǐng)求時(shí)會(huì)先發(fā)一個(gè)OPTIONS請(qǐng)求如果后端返回的不是成功響應(yīng)真實(shí)請(qǐng)求就不會(huì)發(fā)出。解決辦法很簡(jiǎn)單攔截器里對(duì)OPTIONS請(qǐng)求直接返回成功。這個(gè)坑我之前提過(guò)一次但值得再?gòu)?qiáng)調(diào)因?yàn)榕挪闀r(shí)很容易忽略攔截器的存在。5.3 文件路徑與部署環(huán)境不兼容本地寫的是絕對(duì)路徑比如某個(gè)盤符下的目錄部署到Linux服務(wù)器上直接找不到路徑。這是因?yàn)椴僮飨到y(tǒng)的路徑分隔符和磁盤掛載方式完全不同。規(guī)范做法是數(shù)據(jù)庫(kù)存相對(duì)路徑根目錄通過(guò)配置文件指定。我在制作這個(gè)系統(tǒng)時(shí)就把存儲(chǔ)根目錄放到配置文件里所有物理文件寫入時(shí)獲取根目錄再拼相對(duì)路徑這樣換機(jī)器只需要改一個(gè)配置項(xiàng)。另外在Java里拼接文件路徑時(shí)不要手寫斜杠統(tǒng)一用Paths.get或者File.separator否則在不同操作系統(tǒng)上會(huì)出現(xiàn)斜杠方向不一致的問(wèn)題。5.4 回收站恢復(fù)后文件夾結(jié)構(gòu)錯(cuò)亂恢復(fù)一個(gè)處于回收站的文件夾時(shí)如果原本的父目錄已經(jīng)被徹底刪除了會(huì)出現(xiàn)一條記錄指向一個(gè)不存在的父目錄。前端打開(kāi)這個(gè)文件夾就會(huì)查不到數(shù)據(jù)。解決辦法是恢復(fù)時(shí)先檢查父目錄是否存在如果不存在則把parent_id置為0也就是回到用戶根目錄。順帶還要檢查重命名沖突如果目標(biāo)位置已經(jīng)有同名文件恢復(fù)時(shí)自動(dòng)在文件名后面加一個(gè)后綴。5.5 文件流下載時(shí)無(wú)法終止連接下載大文件時(shí)如果用戶點(diǎn)擊了取消后端的輸出流可能還在寫入最終導(dǎo)致鏈路占用很久。如果并發(fā)下載的人多連接數(shù)會(huì)飆升。我給下載接口的ResponseEntity設(shè)置緩沖區(qū)并且前端取消時(shí)瀏覽器會(huì)關(guān)閉連接后端需要在寫入時(shí)處理IOException遇到異常就及時(shí)退出循環(huán)不要繼續(xù)寫。另外可以考慮用Servlet的異步輸出做高并發(fā)優(yōu)化但這個(gè)系統(tǒng)作為個(gè)人云盤并發(fā)量很小不用過(guò)度設(shè)計(jì)。這套個(gè)人云盤管理系統(tǒng)做下來(lái)我個(gè)人體感最難的其實(shí)不是寫代碼而是把文件操作的邏輯想清楚尤其是目錄層級(jí)、回收站、分享這些和“文件關(guān)系”相關(guān)的功能。一旦數(shù)據(jù)表設(shè)計(jì)合理后端的每個(gè)接口都很直白如果一開(kāi)始就草草建表后面補(bǔ)字段、改邏輯會(huì)非常痛苦。最后分享一個(gè)實(shí)用小技巧在開(kāi)發(fā)時(shí)可以提前在本地準(zhǔn)備一些不同類型的測(cè)試文件比如大文件、圖片、中文文件名、無(wú)擴(kuò)展名文件上傳下載和預(yù)覽每個(gè)環(huán)節(jié)都測(cè)一遍很多問(wèn)題是在這些邊界文件上會(huì)暴露出來(lái)。希望這篇文章能幫到準(zhǔn)備做類似項(xiàng)目的朋友。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩不卡毛片Av免费高清| 久综合国内精品自在自线| 一区二区三| 91原创在线观看| 亚洲密乳AV| 一牛一区二区三区久久| 夜夜影视四色| 无码精品久久久久久亚洲| 宅男91视频在线播放| 欧美亚洲一区二区久久久婷精品大包诱| 超碰精品日韩欧美国产| 久草线上视频免费看| 六十路日本| 久久综合九色综合欧洲98| 玖玖超碰熟| 神马久久久久眼| www.av在线视频| 狠狠爱夜夜干| 五月天伊人| 大香蕉五月天婷婷| 国产一区二区免费福利片| 国产一区二区在线看| 亚洲日韩青青草色月| 日本黄 R色 成 人网站| 91老熟妇| 日韩精品一区二区人人人| 国桃视频产巨乳精品一区二区在线| 91美女中出| 约操熟妇| 中文字幕一区二区韩| 婷婷久月| 国产精品美女在线一区| 91丨九色丨国产丨人妻在线| 东京热,男人的天堂| 综合欧美日韩在线| 蜜臀亚洲中文| 激情图片伦理国产一区二区日韩| 五月天婷婷欧美三区| 婷婷在线精品| 亚洲人在线成线成人| 国产精品国产拍高清AV| 日本亚洲熟女视频| 自慰白浆在线观看| 不卡啪啪视频| 中日高清无码操逼视频| 九九色逼| 天天操女人| 日韩无码专区| 99久久99九九99九九九| 羞答答AV中文字| 麻豆人妻少妇在线免费观看| 超碰爽人妻熟女Av| 97玖玖人妻| 97操97色| 综精品久久久aaaa| 五月婷婷hd| 久热色情精品| 吻戏激情性巴克| 色情综合| 欧美亚洲日韩人妻在线观看| 国产免费大片| 国产熟女自拍| 九九碰九九爱97超| 欧美在线永久天堂| 91无码中出人妻视频| 性爱av网站| 欧美|91色综合| 偷拍亚洲高清图片| 色老牛| 亚洲永久AV无码精品秋霞| 麻豆精品A片免费观看| 少妇诱惑视频| 东北操逼| 99re99| 日本操逼aaaaa| 亚洲一区操| 亚洲成人在线高清| 能直接看AV的网站| 97人妻免费中文字幕| 亚洲日韩美国人妻| 丁香六月婷婷久久综合| 午夜性| 青娱乐手机日韩在线视频| 操逼短片| 三级日本一区二区三区| aaaa少妇高潮大片| 亚洲欧美激情另类色图| 色五月激情AV在线| 97干在线| 婷婷丁香在线| 国产视频大全| 加勒比海色香蕉婷婷| 乱操乱伦AV| 亚洲 欧美日韩 另类| 国产精品69久久久久孕妇欧美| 青青草久草| 小日子操bb在线看| 97最新在线播放视频| 国产乱码久久| 中文字幕乱妇免费视频| 女人被男人桶爽视频网站| 秋霞视频一区二区 | 亚洲精品人体| 欧美视频一区二区在线| 丰满少妇一区二区三区专区| 97jingpin| 91综合网站| 婷婷亚洲五月***久久| 五月丁香成人网| 97中文天堂| 加勒比av网| 黄色电影在线播放综合网站| 麻豆国产av网| 亚洲欧美不卡线| 日韩黄色一区二区三区| 美女淫穴| 久久老子无码午夜伦不卡| 99久久无色码| 中文字幕在线免费观看2| 福利色色| 色九九九九九九| 无码人妻一区二区三区色欲aⅴ| 大香网伊人久久综合| 欧美伦乱爱| 久久免费少妇| 九色 人妻 大香蕉| 97干97色| 久久AV无码1区2区3区| 在线洲亚线| 99只有精品| 黑人美精品 A片| 青青草视频导航官网| 国产91亚洲精品一区二区三区| 久久HD| 亚洲偷拍欧美激情| 青青操综合网| 亚洲男人综合网| 国产精品成人福利在线| 国产AV人人 夜夜人人澡| 校园春色综合网| 97玖玖人妻| 午夜爽爽爽| 人妻熟女午夜精品在线| 92久久| 黑操B| 91网站18禁| 九九热免费国产视频婷婷伊人| 久久后入制服| 久久婷婷五月天| 亚洲女优有码无码高清| 狼天天狼天天大香蕉| 猛猛干| 99国产人成精品| 高清国产精品福利网站| 偷拍 精品 另类 四区| 天天操福利视频综合网站| 黄网色一区二区三区四区精品| 97 国产精品| 中文字幕在线日亚州9| 密臀国产在线| 人妻熟女av国产网站| 青青草久草| 91黑丝少妇| 久久精品午夜国产亚洲AV无码| 色五月第四色| 特级丰满少妇一级AAAA爱毛片| 国产99999久久精品| 成人免费看吃奶视频网站| 激情五月综合开心五月| 吉川爱美亚洲二区在线| av九九| 放黄片放3级黄片没穿衣服| 中文字幕视频一区视频二区| 欧美性性性| 麻豆天美制片厂网站视频| 久久免费99精品久久久久久| 91欧美情色| 国产九区| 色色国产| 国产女人和拘做爰视频 | 粉嫩国产精品久久粉嫩| 大香蕉一区二区在线观看.| 色97综合中文字幕| 少好三P| 偷窥自拍亚洲色图| 国产九九九九九九九九| 国产成年女黄特黄| 亚洲自拍小说| 欧亚久久偷拍视频| 丁香激情网| 日日噜噜夜夜狠狠视频无| 欧美性五月| 四虎影库国产精品免费| 日本精品第一视频在'| 人妻少妇精品久久久久久久| 国产9熟妇视频网站| 中文字幕少妇色 | 91久久精品蜜臀| 蜜乳Av成人片网站| 亚洲久久久久| 熟妇人妻精品一区二区| 日韩特一级久久| 欧美色图天堂网m| 五月丁香激情综合| 日本性爱少妇| 岛国片在线播放| 天天影视网综合少妇| 亚洲成人福利电影免费| 噜噜噜在线视频| 青春草莓视频在线观看网址| 欧美另类丝袜熟女| 清纯唯美亚洲另类| 亚洲吊色| 龙兴卡官方查询| 1024亚洲中文字幕久在线看片你懂的| 超碰av在线| 五十路三区在线| 综合激情97 | 久久肏大逼| www亚洲免费| 亚洲国产综合视频| 人妻第一页| 天天干人人乐| 偷拍视频青青草在线视频| 99亚洲人人| 美女诱惑1区2区| 九九无码| 啊啊啊不要啊啊受不了了视频在线| 五月婷在线| 久久久 国产精品| 国产精品免费视频人成| 思思99热| 国产精品。| 久草草一二三四区久久| 99re6在线视频播放免费精品| 久久精品无码专区| 亚洲精品久久久久毛片A片拉屎| 视频国产欧美在线播放| 91天堂网| A一区片| 久久精品午夜国产亚洲AV无码| 超碰免费97| 色吧5亚洲| 小说区 图片区色 综合区| 国产主播福利| 99久久婷婷丁香| 激情接吻视频久久久久久| 蜜乳性色无码专日粉嫩骚逼AV| 国产操偷| 色婷婷五月天| 欧美日动态视频| 久久久精品电影| 成人97人人超碰人人| 激情熟女12P| 制度丝袜99| 亚洲夜夜欢无码一区二区 | 国产在线精品偷| 婷婷月色| 天天综合网国产| 九九英色视频| 国产乱子伦一区二区三区免看| 色色色色色色色色综合| 98超碰日本| 欧美亚洲韩国视频十五区| 日韩操啪| 色老汉色| 精品视频一二三中文| 国产精品久久久久久无码红治院| 日韩丝袜人妻AV| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 久久偷拍人| 精品少妇99| 操逼逼中文字幕| 亚洲欧美九九| 亚洲男人天堂网| 伊人五月天| 歐美性天天| 欧美成人免费在线观看| 国产成人+综合亚洲+天堂| 中国小夫妻勾搭露脸淫荡对白 | 午夜免费视频1000| 丝袜高跟澳门91视频| 久久性爱视频免费看| 亚洲高清在线| 欧美黄色大香蕉一区二区| 久久久久久中文字幕中文字幕最新| 中文字幕精品三级久久久| www.yeyecao| 熟妇人妻一区二区三区| 色与欲影视| 97精品综合久久| 91美女视频。| 2020国产精品| 欧美成人贴图| 国产日韩欧美三级片| 91男人天堂网| 国产精品免费美女视频| 青青草影视蜜久久| 久热九九| 91丝袜美女视频| 久久综合五月天| 夜夜欧美| 99青草| 亚洲丝袜诱惑| 国内精品不卡无毒99999| 日韩欧美亚洲自拍偷拍| 久极品在线观看| 日本不卡二区| 久草资源欧美在线视频| 天天插夜夜操| 中文字幕一区二区三区四五区| 免费观看啪视频| 成人三级片一区二区三区视频| 五月激情小说| 色网色网色网色网色网色| 黄色乱论网站| 久操不卡视频| 超碰欧美| 97欧美久久久久久久| 色情综合| 十八岁啪啪视频免费看| 亚洲好色人妻| 情色日播放AV| 国产曰批免费观看久久久| 色麻豆AV| 91视频国品一二三区| WWW.操逼.COM| 97精品在线| 99精品久久| 免费观看成人www精品视频| 成人精品一区二区三区| 99综合免费视频| 伊人影院日本| 超碰这里有精品| 九九九九久久久| 大香蕉一区二区在线观看.| 青青草色插素人| 日产狠狠干| 人妻丰满熟妇一区二区三| 色九色久| 老司机深夜18禁污污网站| 亚洲网污污污污| 丝袜 亚洲 偷拍| 久操com| 久久内射| 热热色国产一二区AV| 欧美成人9797| 久久久久久AV无码免费网站| 欧美日韩*字幕一区| 激情四射婷婷六月天| 久久a久久| 国产美女mm131爽爽爽爽| 欧美天天弄| 91艹| 媚薬在线视频麻豆| 天天弄欧美| 五月婷婷色| 欧美成人性爱视频免费观看| 九九视频黄色片| 酒色综合网| 毛片麻豆91糖心精品毛情片| 91美女视频在线免费观看| 91原创在线观看| 久热无码| 五月丁香六月婷综合成人综合| 日韩综合无码色欲vv| 欧美少妇色图| 97精| 久久久蜜桃臀无码视频| 超碰色图| 色与欲影视天天看综合网| 蜜臀色乳| 久久久久久久久久久999| 欧美黑人性猛交91| 91婷婷伊人狠人| 久久精品国产精品亚洲艾通辽熟妇 | 草草草草视频| 国产精品视屏| 青青在线视频日韩欧美| 综合影院永久入口国产| 2021国产成人精品久久| 日韩一级久久毛片| 欧美性爱无码一区二区三区| 久久久久久亚洲Av无码精| 一起草高清无码| 少妇久久久久久久| 青青草国产欧美非洲黑人| 国产精品9999| 天美传媒精品一区二区| 女沟厕偷窥piss小便| 黄色视频高清无码网站| 日韩欧美性爱电影在线观看| 精品一区二区三区国产| 日韩性爱免费观看视频| 日日插夜夜| 国产又色又粗又黄又爽| 亚欧成人综合影院| 黄网色一区二区三区四区精品| www欧美性爱| 日本三级中国三级99人妇网站| www色婷婷| 丁香五月天堂网| 男人的天堂2010| 亚洲男人天堂网久久| 久久深夜无码| 五月开心久久AV官网| 变态另类专区| 成人午夜高潮av猛片| 日韩成人精品| 午夜福利视频在线一区| 这里有精品| 18精品一区| 欧美大片一区二区三区| 国产精品另类一区大香蕉| 中文字幕乱亚洲美女精品一区| 欧美牲| 亚洲无吗在线视频| 五月天婷婷色| 97精选久久| 精品久久97| 91露脸熟女专区| 久久久久久精品免费看A级| 久久九九精品一区二区| 亚洲综合网91| 日本色色视频网站| 五月天色五月| 在线观看午夜婷婷久久久久清性观看| 日韩有码专区| AV不卡在线| 天天爽爽爽爽| 欧美淫乱视频| 性暴力欧美猛交在线直播| 翔田千里av一区二区三区| 丰满人妻一区二区三区四 | 这里只有精品视频在线观看麻豆| 成人情色一区二区| 国产精品天干天干综合网麻豆| 日日不卡av| 色综合天天| 久久国产99精品72福利| 东京热伊久| 岛国A V在线免费看| av片在线观看免费播放| 日韩中文字幕2020| av网站在线看| 蜜桃久久综合视频| 超碰97极品9| 国产Av超碰| 九色 人妻 大香蕉| 97超碰9| 8050午夜少妇无码| 久操影视| 激情无码日韩| 精品人妻视频一区二区三区蜜桃视频| 丝袜美腿av女优在线| 白嫩国模丰满一二三区| 91欧美性| 无码操逼网| 佐山爱中文字幕| 色欲av国内精品久久久久久| 噜噜在线| 亚洲交性| 五月激情小说| 人人妻人人爱人人玩| 无码日韩网站| 超碰偷拍| 一本道综合色图| 欧美综色欧| 综合欧美日本三级| 青青草一本道福利视频| 午夜黄色免费在线观看| 亚洲日韩97| 熟妇操花| 4虎在线观看| 久久人妻四季| 超清福利精品视频在线| 夜夜高潮夜夜爽高清视频一 | 狠狠色噜噜狠狠狠狠狠色综合久久| 东北女人| 天堂俺去俺来也www久久婷婷| 亚洲综合113页| 92性色国产午夜福利在线661| 久久久久久久久久久97| 国产三级在线现体验区| 亚洲天天影视综合网| 免费1级a做爰片观看| 啊啊啊97视频| 日韩av在线免费网站| 舔舔啊| 欧美日韩成人| 99色网| 白丝jkav| 免费的黄片wwwwww| 欧美97色| 99色骚| 97人人模人人爽人人| 女生看匆91网站| 韩国一区二区精品亚洲| 26uuu成人影片| 亚洲视频二区| 精品色色| 夜夜操青青草| 老熟女综合网| 国产偷仑| 思思热在线视频精品| 亚洲婷婷丁香在线| 久久伦理视频久久大香蕉视频| 欧美v亚洲v日韩v最新在线二区| 中国91AV| 69久久久久久久久久久久久| 97干在线| 欧美少妇性爱网站| 99无码| 黄色AV免费| 久久久久久中文| 欧美中文字幕男人天堂久久精品 | 亚洲综合射| 免费看毛片操穴| 黄色在线网站| 亚洲最新Av| 亚洲高潮影院| 乱码人妻一区二区三区| 欧美有码激情视频一区二区三区| 久久久久亚洲av综合波多野制衣| 亚洲男人天堂2017| 操淫穴亚洲五月丁香 | 亚洲色图激情小说| 在线观看黄色电话| 日韩三A大片在线观看| 欧美综合天堂| 久久亚洲日韩国产欧| 图色综合网| 色99视频| 久久久久久欧美精品se一二三四| 国产操操日韩三级黄| 精品人妻一二三| 快播电影网日韩新片| 亚洲自拍欧美国产首页网曝| 97久久久久久久精| 欧美在线视频99| 91小视频| 欧美日韩精品一区二区三区高清| 午夜男女爽爽爽影院视频| 天天舔日美女视频| 我爱操| 蜜桃精品一区二区三区久在线| 亚洲男人的天堂一区二区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 快播久久人人aV| 91黑丝美女| www.yeyecao| 欧美一级专区免费大片| 99啪啪| 激情啪啪拍91| 人妻-91porn| 亚洲精品中文字幕一区在线视频| 国产真实野战在线视频| 日日碰狠狠添天天爽超| 婷婷影院入口| 日韩av在线播放不卡| 家庭乱伦网站国产| 无码精品蜜桃一区二区三区ww| 亚洲国产一区二区日韩专区| 在线岛| 久久久久亚洲?V片无码V| 另类TS人妖一区二区三区 | 人妻精品一区二区在线| 亚洲国产麻豆一区二区三区 | 激情文学亚洲| 国产久久天堂资源| 97色碰| jazzjazz国产精品麻豆| AV在线性爱| 无码精品久久久天天影视| 芊芊操逼视频无码| 国内自拍 日韩激情 99| 九九色色| 97se综合网| 麻豆 亚洲 97| 男人的天堂三级| 久热最新在线杭州| AV一起草在线| 久久AV无码网址| 欧美中出1| Julia在线播放亚洲久久| www鬼畜国产男人的天堂| 日韩激情视频| 日本高清视频在线观看黄已三辽| 99999亚洲| 一个人免费视频观看在线WWW| 樱花蜜乳av| 无码自拍SM| 无码一区二区三区四区五区六区七区八区九区十区视频 | 天天综合网入口~91| 啊啊啊啊啊啊啊在线| 999热日韩精品| 国产女大学生AV| 中文字幕一区二区韩| 99视频自拍| 婷婷激情一区二区三区俺也去| av线电影| 又粗又长又大国产不卡| 人摸人人操人| 日产国产精品中文久久婷婷| 骚逼自拍99| 国产老太乱伦一区| 国产精品久久伊人| 日韩传媒在线| 97K超碰在线| 性爱免费视频成人| 久久久999日本大片| 日韩不卡网操逼中文字幕日韩| 成人性交免费视频| 国产精品自拍欧美在线| 大香蕉十区| 97碰碰色| 人妻少妇av在线观看| 欧美五区| 激情小说亚洲| 五月天激情四射| 超碰97在线中文| 天天上日日上日韩精品| 色色色综合网| 一区二区三区四区五区久久久久久| 在线日韩精品一区二区三区| av九九| 久久风骚城市| 国产精品欧美日韩久久| 97人亚洲综合字幕| 黄片www视频免费| 久久女婷| 五月天婷婷社区| 玖玖爱免费观看视频| 97久久久精品| 久久黄片国产一区二区| 婷婷情色综合网| 久夜视频| 超碰人人乐97| 好吊色综合| 嗯嗯啊在线视频| 老司机香蕉| 天美麻花大全视频| 亚洲骚男同com| 中文字幕一区二区三区四五区| 久久精9| 天天综合网亚洲综合网| 97久久国产| 国产美女激情| 亚洲欧美999| 校园春色制服丝袜中文字亚洲| 久久久亚洲精品中文字幕人妻| www.av在线观看| 老色鬼成人精品视频下载大在线观看| 东北丰满熟女国产一区 | 男人的天堂 在线一区| 成人情色一区二区| 日本不卡在线二区三区| 婷婷五月天伊人| 欧美资源| 热久久91婷婷| 18禁在线视频| 久偷拍欧美日韩三区| 亚洲成人免费中文字幕| 天天干夜夜| 日韩无码服务区| 日本欧美亚洲高清在线看| 色呦呦、国产精品| 日本成人免费一区二区三区| 国产男女无套97| 翔田千里一区二区三区奶水| 啊嗯嗯啊好大好爽| 日本三级R| 玖玖综合网| 精品人妻一区二区免费蜜桃| 在线岛| 玖玖爱伊人玖玖爱| 人妻少妇久久久| 9国产超碰| 久久超碰av在线| 欧美视频在线第3页| 欧美性爱第一页久久| 99re在线精品78| 一起草AV| 26uuu性物| 春色91| 丝袜综合| 五毛骚逼极品美女怕怕| 日韩人妻一区二区精品| 思思热一热婷婷热一热| 色婷婷电影| 亚洲码在线中文在线观看| 亚州国产成人精品女人久久| 啪啪综合网| 久久黄片国产一区二区| 天干天干天干天天做| 黑丝少妇麻豆| 成人综合久久精品色婷婷| 欧美传媒| juliaann欧美丝袜办公室| 天天干天天日天天射黄色片| 久久98| 久久亚洲AV无码专区首页| 91制服丝袜中文字幕| 在线一区| 中文字幕乱码人妻一区二区三区,99精品| 这里只有精品视频在线观看麻豆| 老妇女91| 亚洲人精品久久久| 日韩电影天堂视频一区二区| 亚洲无套久久嗯嗯| 成人网站 免费观看| 家庭乱伦国产精品| 最新AV在线| 丝袜天堂网| www.高清无码诱惑一区.com| 亚洲图片 91| 柠檬AV导航| 亚洲精品天堂久久A∨51成人漫| 久久专区| 97色亚洲| 我想要 啊 啊 啊| 久久精品综合| 欧美日韩美女精品久草一区二区三区| 久久久久9999妇女| 人妻天天爽夜夜爽爽| 色区久久| 丁香六月啪啪| 五月婷丁香| JULIA一区二区三区在线播放| 一区二区三区黄色片a| 欧美日韩大香蕉| 久久久中文| 四虎免费在线观看| 天堂男人网| 春色综合网| 麻豆视频一区二区| 欧美日韩亚洲天堂| 97超碰欧美精品| 少妇天堂| 一区二区视频在看| 欧州91高潮| 国产真实子伦对白| 欧美18老人禁| 中文字幕日韩专区精品系列| 香伊人在线| 日本1区2区不卡视频| 亚洲日韩精品久久久久一区壹牛| 国产偷人伦激情在线观看| 大色综合| 岛国1区2区3区在线观看| 操国产逼| 日韩人妻播放| 能直接看AV的网站| 九九色热| 中文字幕在线观看AV| 亚洲伊人久久精品狠狠在线| yazhousetuoumei| 成人A片男人的天堂| 中文字幕综合人妻| 亚洲影视第一页| 美女91网| 人人模人人看| 久久社区一区二区三区| 国内自拍 日韩激情 99| 天天日天天插| av亚洲天堂资源网站| 九一综合网| 91高清欧美| 美女被啪到深处抽搐视频| 日本人妻中文字幕| 亚洲精品一区二区三区在线播放| 亚洲无码99| 色鬼在线综合| 爱丝福利| 超碰97人妻| 中文字幕日韩人妻视频一区二区三区| 五月天激情影院| 超碰亚洲97| 激情小说亚洲视频| 精品久9| 亚洲伊人a线观看视频| 色色色色网站| 91色黑人少妇| 久久精品成人| 国产黄色视频久久| 国产无套粉嫩白浆在| 怡红院视频在线| 啊啊啊好疼| 黄片免费日韩| 99久久综合网| 欧美伦乱爱| 玖玖久久久| 国产传媒操逼视频| 国产极品999| 亚洲图片视频小说| 夜夜操美女| 天天射影院| 青青草女人天天干| 欧州一区二区三区四区| 欧美在线干| 天天激色| 精品无码一区二区三区| 成人 日韩欧美一区| 91视频综合在线| 久久久性| 亚 欧 美 综合| 在线 欧美 亚洲| 一线黄色免费性爱片| 真实高潮91| 春色91| 中文字幕精品区先锋资源| 精品国产91久久久久久一区黄无| 97这里有精品| 婷婷伊人网| 热的中文 热的有码 热的国产| 国产粉嫩蜜臀av一区二区三区| 大香蕉五月天婷婷| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 韩国免费播放一级毛片| 亚洲人妻色图| 思思热在线cao| 亚洲A色| 亚洲国产精品久久AV| 日本三级大片| 久久香蕉国产线看观看亚洲女人| 91天堂色男人的天堂| 二三四区精品| 日韩久久.一级黄色片| 久久水蜜臀亚洲AV无码精品| 五月天婷婷在线看| 久久久久久久久久久人妻| 熟女人妻一区二区三区| 人妻久久久久久| 综合亚洲欧美| 蜜臀久久99精品久久久老,,| 超碰97丝袜| 狠狠干狠狠干| 97精| 嗯嗯啊啊操死我| AA级电影三区| 性欧美精| 欧美特大黄一级片片免费| 超碰在线综合97| 久久久97| 久久久久久久性爱| 久久综合日韩亚洲欧美| 麻豆国产精品午夜视频| 嗯嗯,好大,好爽,好骚 | 国产综合久久久鬼色| 免费看黄片现成| 91爱看| 无码日韩网站| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 欧美日本成人一区二区| 久久人人爽爽爽人久久久| 亚洲av综合伊人久久| 97超碰资源网| 综合久久中文字幕综合日韩精品| 夜夜夜夜久久久久| 久久国产99精品72福利| 久久精品国产99精品亚洲蜜...| 日韩美女高潮喷水视频| 日韩在线观看中文字幕视频| 亚洲天堂2020| 抽插爽| av资源在线观看少妇| 97超碰香蕉| 天天综合网1| 色播综合| 亚洲无码超碰免费| 久久久九| 欧美 日韩 国产传媒| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 婷婷五月天影院| 国产午夜福利专区综合| 青青草久久| 嗯啊啊啊轻点视频| 2019久久久久久久久福利| 美女t无毒不卡不卡| 黄色小说亚洲| 立川理惠无码一区二区| 日韩av无码网站| 91精品少妇搡搡搡| 91肏屄网| 久热婷婷| 久久精品毛片免费不卡| 九九亚洲| 欧美性Fer办公室秘书| 91久久精品国产| 国产精品久久久久久 百度| 97视频网站| 97在线观看免费| 亚欧中文字幕在线视频| 人妻av在线| 亚洲成人免费中文字幕| 亚洲天堂男人| 天天干夜夜鈤| 囯产精品强| 欧美一区二区三区大综合| 国产67194| 3028国产精品| 欧美日韩*字幕一区| 日本二三四区| 超碰综合97在线| 99精品热| 色噜噜国产在线| 婷婷五月天在线观看| 亚洲成?V人片在线观看福利| 天堂v无码免费视频| 亚洲高清色综合| 欧美特黄视频网站| 性爱AV天堂| 一区二区精品更新提醒| 97人肏| 婷婷亚洲天堂| 国产原创剧情在线丝袜 | 99精品在线| 色综合99999| 丰满搜索结果 -第18页- 久久高清无码| 欧美99| 色色婷婷五月天| 中文字幕一区日韩精| 久久久久久久国产a∨| 欧美亚洲一级在线观看| 久久久久久99AV无码免费网站| juliaann欧美丝袜办公室| 久久久久深夜无码| 大屁股熟女一区二区三区| 骚逼一区二区| 日韩欧亚中文在线| 国产成人天堂| 亚州熟妇精品| 91处女在线视频| 欲色啪| 嫩草 我啊~嗯~在线| 国产精品九九| 亚洲资源吧| 久久亚洲一区女同性恋中文字幕| 久久精品噜噜噜成人看免欧美大片| 蜜臀一二三区| 中文字幕熟女人妻丝袜丝| 婷婷探花久久精品一区| 极品人妻少妇综合| 久久精品国产亚洲av水密被窝| 97这里有精品| 国产精品操| 女性喷水高潮在线观看| www熟女乱伦com| 中文字幕精品一区欧美| 欧美综合娱乐久久| 精品国产www久久| 久久久久9999| 久久日韩毛| 欧美 传媒 麻豆 日韩 偷拍| 一区二区国产视频在线观看| 在线五区| 亚洲欧美碰碰| 98人妻精品一区二区色欲| 伊人久久综合影院精品久久久| 欧美一区二区福利在线| 欧美顶级黄色大片免费| 国产精品视频精品一二| 亚码激情| 欧美韩国你懂得在线| 欧美高潮| 国产伦精品| AV一区观看| 欧美性爱精品一区二区| 99国产精品人妻人伦| 成人一区二区三区四区| 男人的天堂三级| 蜜桃狠狠色伊人亚洲综合网站| 91成人高清在线观看| 日韩一区二区三区四区五区| 午夜精品一区二区三区三上悠亚| 欧美97在线观看| 国产乱不卡| 精品视频一区二区| blacked精品一区国产| 久热超碰| 中文字幕女同在线| 99精品人妻| 日韩欧美aⅴ综合网站发布| 久久婷婷五月综合| 欧美在线大香蕉| 久久超碰com| 日韩国产欧美伦理在线| 久久久一区二区三区四曲免费听| 欧美色日本| 熟妇女伦乱视频| 91艹B视频| 中文字幕在线观看网页| 暴力av在线| 成人av影院在线观看| 涩涩五月天| 日本一级不卡一二区| 美女天天干| 屌色在线97视频| 中文字幕免费看| 国产精品无码成人精品| 97天堂| 91精品少妇搡搡搡| 久久透逼视频| 国模限制级电影| 四虎AV在线播放| 凹凸视频在线观看伊人| 伊人久久国产免费观看视频| 精品人妻少妇| 国产av美女被艹的乱叫| 精品亚州18| 日本久久女同性恋视频| 久久久激情| 熟女熟妇一区二区三区视频| 密乳AV免费观看| 中文字幕乱碼在线| 天美精品原创av片国产| 丁香色婷婷| 人妻少妇无码| ?亚洲伊人伊成久久人综合网| 中文字幕久久精视频久久大全| 欧美少妇色图| 久久久一区二区三区四曲免费听| 亚洲激情深爱文学小说网站| 国产女人和拘做爰视频| 性色中出| 国产第12页| 91撸色网 玖玖网 欧美| 色香AV| 日本有码影片下载 | 久久一二三四五六七八九区区区| 色婷婷一区二区三区久久午夜成人不| 2017人人操,人人摸| 久超超碰| 强奸国产精品视频| 亚洲色图国产另类| 成人97人人超碰人人| 欧美无圣光在线| 成人无遮挡毛片免费看| 欧美色图片91| 韩国手机不卡无码三级视频| 性生活久久久久久久久久| 岛国片在线视频网站| 丝袜无码a片| 国产性爱在线视频一区二区| 夜草欧美| 久久久久久国产精品免费网站| 五十路人妻在线| 成人午夜视频免费播放| 易易A毛视频| 亚洲精品视频二区| 无码不卡亚洲成?人片| 超碰97玖玖爱| 日本无码1| 0755午夜福利视频| 精品国产少妇高潮视频| 久草精品国产99| 媚薬在线视频麻豆| 欧美日韩性爱操大逼| 日韩内| 欧美色偷拍| 国产精品毛片?v一区二区三区| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 亚洲成人美女无吗| 黑人在线91| 91欧美长吊| 亚洲精品第一| 久久精品无码专区| 日日干夜夜操视频h| 激情无码日韩| 欧美综合色图片| 精品久一区免费| 成人八戒网站| 后入式免费视频| 啊啊啊不要啊啊受不了了视频在线| 狠狠色噜噜狠狠狠狠狠色综合久久| 97中文综合| 欧洲乱码一区二区| 国产精品一级片在线看| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 日韩中文字幕视频在线观看| 国产精品剧情| 国产视频小说| 曰韩欧美国产传媒麻豆第一区| 国产精品美女久久久久AⅤ国产馆| 精品少妇高潮久久| 欧美一区二区三区大综合| 熟女视频久久| 日本操逼视频不卡直接放| 清纯唯美综合亚洲| 四虎免费看黄| 欧美亚洲综合色| 人妻日日干| jizz啪啪| 四虎影视精品| 亚州九九九精品视频| 久久国产99精品72福利| 日本人人操人人操| 极品欧美一区二区三区| 另类小说欧美激情校园春色| 伊人991| 中文字幕国产精品1区| 天天天天天天天天天天干美女| 一中国女人毛片水真多| 少妇大屁屁| 伊人久久亚洲色欲综合网站 | 日韩精品一二三四| 国产69精品久久久久99尤物| 67914在线精品观看| 日韩av不卡在线观看| AV一起草在线| 日韩一级二级三级免费看完整版| 白嫩91在线亚洲| 日本新免费二区三区| 欧美狠狠弄| 无码99| 五月婷婷综合网| 亚洲综合精品国产一区| 亚洲一曲日韩精品| 欧美人与动性人交a| 国产日韩久久| 97亚洲综合在线| 婷婷激情五月综合| 日本高清熟女久久一区| 97视频在| 亚洲综合性感在线| 久久久久久久久久久久久久久性生活视频| 欧美综合区| 操比国产| 一级性爱aaaa| 26uuu国产免费观看| 亚洲成人性爱在线观看| 做爱A级亚欧| 95自拍视频在线观看| 操www| 制度丝袜99| 激情抓乳插进去啪啪啪日韩| 综合伊人激情| 东京热视频网| 性暴力欧美猛交在线直播| 国产精品内射婷婷一级二| 国产午夜精品在线观看| 试看60秒 爽| 九九碰九九爱97超| 欧美成人性活片| 欧美日韩国产成人高清| 高清有码一区二区| 手机在线免费看的av| 成人小说另类在线| 91av一区二区在线观看| 一区二区三区亚洲| 伊人网综合在线视频| 国产1769在线| 日本久久精品| 国产超碰国产97| 性色高清在线| 天堂射| 久久精品综合| 啊啊啊爽爽| 国产兽交视频在线播放| 亚州一区二区成人片免费|