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

ARTICLE DETAIL

資訊詳情

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

SpringBoot+Vue文物征集管理系統(tǒng):從需求到部署的完整實(shí)踐

SpringBoot+Vue文物征集管理系統(tǒng):從需求到部署的完整實(shí)踐 一個(gè)“文物征集管理系統(tǒng)”聽起來好像很小眾但放在畢設(shè)和課設(shè)的背景下這其實(shí)是一個(gè)非常經(jīng)典、非常聰明的選題。它表面上是一個(gè)面向“紅色革命文物”的業(yè)務(wù)管理系統(tǒng)實(shí)際上內(nèi)核是一個(gè)標(biāo)準(zhǔn)的信息管理平臺(tái)有用戶權(quán)限、有業(yè)務(wù)流程流轉(zhuǎn)、有文件上傳、有數(shù)據(jù)統(tǒng)計(jì)難度適中業(yè)務(wù)故事也好講。很多同學(xué)拿到類似的源碼要么只會(huì)對(duì)著教程跑起來要么不知道怎么在答辯時(shí)講清楚更別說萬一遇到問題如何排查。這篇文章我就以這套 SpringBoot Vue 的 MVC 模式管理系統(tǒng)為例從頭到尾拆一遍它解決什么問題、技術(shù)架構(gòu)怎么選、核心代碼怎么寫、數(shù)據(jù)庫怎么建、怎么從零跑起來以及我在實(shí)際調(diào)試中踩過的一些坑。先說結(jié)論這套東西你把它吃透了不只是完成一個(gè)畢設(shè)而是真正理解了企業(yè)級(jí)前后端分離開發(fā)的基本套路。1. 需求先想清楚再動(dòng)手這個(gè)系統(tǒng)到底要管什么很多同學(xué)拿到項(xiàng)目第一件事就是打開 IDEA 開始跑代碼其實(shí)這是比較低效的做法。先搞清楚業(yè)務(wù)再看代碼事半功倍。1.1 別被“文物征集”四個(gè)字勸退拆解核心業(yè)務(wù)紅色革命文物征集系統(tǒng)的核心業(yè)務(wù)說白了就是一件事把散落在民間的文物線索和實(shí)物征集信息系統(tǒng)化地管起來。傳統(tǒng)的線下流程是發(fā)布征集公告 - 群眾來電來信提供線索 - 工作人員登記紙質(zhì)信息 - 專家鑒定審核 - 入庫登記 - 建立臺(tái)賬。這個(gè)過程里問題很多紙質(zhì)表格容易丟、想查一條記錄翻半天檔案柜、審核進(jìn)度誰也不知道、統(tǒng)計(jì)本月征集了多少文物全靠人工數(shù)。而管理系統(tǒng)要做的就是把這條鏈路搬到線上。我建議你把整個(gè)系統(tǒng)抽象成一條“征集業(yè)務(wù)線”所有功能都圍繞這條線展開線索登記群眾或者征集員錄入文物基本信息名稱、年代、類別、來源、保存現(xiàn)狀、征集方式等。材料附件上傳文物照片、相關(guān)證明文件。審核流轉(zhuǎn)管理員或者專家對(duì)征集信息進(jìn)行審核可能通過、可能退回補(bǔ)充材料。入庫登記審核通過后文物正式進(jìn)入館藏臺(tái)賬生成唯一編號(hào)。統(tǒng)計(jì)展示按年代、類別、征集狀態(tài)等維度做統(tǒng)計(jì)讓管理者掌握征集進(jìn)度。理解了這條線你再看代碼里的實(shí)體類、數(shù)據(jù)庫表、接口設(shè)計(jì)就會(huì)覺得“原來如此”而不是“這是什么鬼”。1.2 功能模塊劃分與權(quán)限設(shè)計(jì)系統(tǒng)里不是所有人都能干所有事的這就是權(quán)限設(shè)計(jì)的由來。一個(gè)完整的征集管理系統(tǒng)至少要考慮三類角色系統(tǒng)管理員擁有全部權(quán)限包括用戶管理、數(shù)據(jù)字典維護(hù)、審核管理、統(tǒng)計(jì)查看。征集員/錄入員可以新增征集信息、錄入文物資料、維護(hù)自己創(chuàng)建的記錄。專家/審核員主要負(fù)責(zé)審核征集線索和文物信息給出審核意見。有些系統(tǒng)里還會(huì)把“普通社會(huì)公眾”角色放進(jìn)來用于在線提交征集線索這就是另一個(gè)典型的業(yè)務(wù)場景了。模塊和權(quán)限的合理劃分是你答辯時(shí)可以重點(diǎn)講的一個(gè)亮點(diǎn)。比如“為什么同一個(gè)登錄接口要返回不同的菜單權(quán)限”“為什么征集的文物信息要用狀態(tài)字段而不是直接刪除”這些都是體現(xiàn)你對(duì)系統(tǒng)思考深度的點(diǎn)。權(quán)限設(shè)計(jì)做得好這個(gè)系統(tǒng)的框架感就出來了后面加功能也只是在模塊里堆接口而已。2. 技術(shù)選型解析SpringBoot Vue MVC 這個(gè)組合為什么“穩(wěn)”選技術(shù)棧不要追求新奇要追求“能跑、好講、有問題能搜到答案”。SpringBoot Vue 這個(gè)組合可以說是當(dāng)下Java Web前后端分離項(xiàng)目的“標(biāo)準(zhǔn)答案”。2.1 后端SpringBoot 到底幫我們省了哪些事SpringBoot 是一個(gè)建立在 Spring 框架之上的快速開發(fā)腳手架。沒有它的時(shí)候你要配置 SpringMVC、配置 Tomcat、配置 MyBatis 的 SqlSessionFactory、寫一大堆 XML。有了 SpringBoot 之后很多配置都變成了“約定大于配置”你只需要引入依賴寫上application.yml就能快速啟動(dòng)一個(gè) Web 服務(wù)。在這套系統(tǒng)里SpringBoot 的核心作用有幾個(gè)內(nèi)嵌 Tomcat打包成 jar直接java -jar就能啟動(dòng)不用單獨(dú)裝 Tomcat 服務(wù)器。Starter 機(jī)制引入spring-boot-starter-web就完成了 Web 環(huán)境搭建引入mybatis-plus-boot-starter就有了數(shù)據(jù)庫操作能力。統(tǒng)一配置數(shù)據(jù)庫連接、文件上傳大小、端口號(hào)等都在application.yml里管理改配置不用重編譯。還有一個(gè)很實(shí)用的點(diǎn)是SpringBoot 項(xiàng)目現(xiàn)在幾乎都配套 MyBatis-Plus 使用。它幫你封裝了單表的增刪改查不需要寫基礎(chǔ)的 SQL。比如你要按 ID 查一條文物信息只需要CulturalRelic relic culturalRelicMapper.selectById(id);連 SQL 都不用寫。對(duì)于這類業(yè)務(wù)相對(duì)標(biāo)準(zhǔn)化的管理系統(tǒng)來說MyBatis-Plus 能減少大量低級(jí)重復(fù)勞動(dòng)你只需要把心思放在業(yè)務(wù)流程上。2.2 MVC 三層架構(gòu)在前后端分離項(xiàng)目里怎么落地項(xiàng)目標(biāo)題里有一個(gè)詞“MVC模式”這個(gè)是答辯的時(shí)候老師幾乎必問的。MVC 不是前后端分離時(shí)代的專用概念但它依然適用于這種架構(gòu)。我們來說清楚它在前后端分離里分別對(duì)應(yīng)什么。后端里的嚴(yán)格分層是這樣的Controller 層表現(xiàn)層只負(fù)責(zé)接收前端請求、解析參數(shù)、調(diào)用 Service、封裝返回結(jié)果。它不寫業(yè)務(wù)邏輯也不直接操作數(shù)據(jù)庫。一個(gè)干凈的 Controller 方法大概長這樣RestController RequestMapping(/api/relic) public class CulturalRelicController { Resource private CulturalRelicService relicService; PostMapping(/add) public Result add(RequestBody CulturalRelicDTO dto) { return Result.success(relicService.addRelic(dto)); } }Service 層業(yè)務(wù)邏輯層這是整個(gè)系統(tǒng)的核心負(fù)責(zé)處理業(yè)務(wù)流程、做事務(wù)控制、調(diào)用數(shù)據(jù)層接口。判斷狀態(tài)、校驗(yàn)參數(shù)、組織數(shù)據(jù)都在這一層完成。Mapper/DAO 層數(shù)據(jù)訪問層跟數(shù)據(jù)庫打交道。MyBatis-Plus 的 Mapper 接口繼承BaseMapperT后就自動(dòng)擁有單表的 CRUD 能力你需要關(guān)注的就是那些自定義的復(fù)雜 SQL 和分頁查詢。至于前端 Vue它本身是一個(gè) MVVM 框架Model-View-ViewModel但這里的“View”只負(fù)責(zé)渲染和交互并沒有承擔(dān)業(yè)務(wù)處理和數(shù)據(jù)庫操作的職責(zé)。所以整套系統(tǒng)的業(yè)務(wù)歸屬是清晰的Vue 管界面SpringBoot 的 Controller 管接口Service 管業(yè)務(wù)Mapper 管數(shù)據(jù)。這就是 MVC 思想在后端落地的方式。2.3 數(shù)據(jù)庫與中間件選型數(shù)據(jù)庫用的 MySQL 8.0這是目前最主流的選擇。跟這套系統(tǒng)配合你需要注意兩點(diǎn)驅(qū)動(dòng)選擇連接 URL 里建議寫成com.mysql.cj.jdbc.Driver這是 MySQL 8.x 的驅(qū)動(dòng)類老的com.mysql.jdbc.Driver在新版本下會(huì)報(bào)警告甚至報(bào)錯(cuò)。時(shí)區(qū)問題URL 后面一定要加serverTimezoneAsia/Shanghai否則數(shù)據(jù)庫連接很容易報(bào)時(shí)區(qū)錯(cuò)誤。這套系統(tǒng)里基本不需要 Redis、消息隊(duì)列這類中間件除非你想給它加分比如用 Redis 存登錄 token、用 RabbitMQ 做提交征集信息后的異步通知?;A(chǔ)版本MySQL 足夠。3. 數(shù)據(jù)庫設(shè)計(jì)核心表結(jié)構(gòu)這樣建才合理數(shù)據(jù)庫設(shè)計(jì)決定了整個(gè)系統(tǒng)代碼好不好寫。很多同學(xué)在建表的時(shí)候喜歡一股腦把所有字段堆在一張表里后面做狀態(tài)流轉(zhuǎn)就各種別扭。這里我直接把核心表拆給你看。3.1 文物征集表業(yè)務(wù)主表怎么設(shè)計(jì)這張表是整個(gè)系統(tǒng)的核心建議叫cultural_relic字段設(shè)計(jì)要有業(yè)務(wù)導(dǎo)向思維。注意名稱、類別、年代這種是很多查詢條件的來源必須單獨(dú)設(shè)計(jì)字段。字段名類型注釋idbigint主鍵IDrelic_namevarchar(100)文物名稱relic_categoryvarchar(50)文物類別文件/實(shí)物/照片/其他relic_eravarchar(50)所屬年代source_typevarchar(20)征集方式捐贈(zèng)/移交/購買/借展current_ownervarchar(50)當(dāng)前持有人contact_phonevarchar(20)聯(lián)系電話descriptiontext文物描述/歷史背景說明statustinyint狀態(tài)0草稿/1待審核/2審核通過/3已入庫/4已退回submitter_idbigint提交人IDcreate_timedatetime創(chuàng)建時(shí)間update_timedatetime更新時(shí)間這里有幾個(gè)很容易踩的坑一種是“所有字段都用 varchar ”比如描述文本也用 varchar(255)后面存超過 255 字就報(bào)錯(cuò)了。描述類字段用text日期用datetime金額用decimal該用什么類型就用什么答辯的時(shí)候被問到字段類型選擇這也是一個(gè)加分點(diǎn)。另一種是遺漏status狀態(tài)字段。沒有狀態(tài)字段你就無法區(qū)分一條記錄是“剛登記”還是“已經(jīng)入庫”審核流程的代碼根本寫不出來。狀態(tài)字段一定要預(yù)留而且建議用tinyint0 到 255 的取值空間足夠用十年。3.2 輔助表與狀態(tài)流轉(zhuǎn)除了主表至少還需要這幾張輔助表文物圖片表relic_image一張文物對(duì)應(yīng)多張圖片。字段就是id、relic_id、image_url、is_primary是否主圖。這就是一對(duì)多關(guān)系的標(biāo)準(zhǔn)建模方式前端展示圖片列表時(shí)直接WHERE relic_id ?查詢即可。審核記錄表audit_record記錄誰在什么時(shí)間審核了哪條文物意見是什么。字段包含id、relic_id、auditor_id、audit_status、audit_comment、audit_time。用戶表sys_user賬戶、密碼、姓名、角色、手機(jī)號(hào)、創(chuàng)建時(shí)間。這是數(shù)據(jù)庫層面必須有的“家底”。建好這幾張表整個(gè)系統(tǒng)的數(shù)據(jù)流轉(zhuǎn)就順理成章了。文物征集的狀態(tài)流轉(zhuǎn)建議用狀態(tài)機(jī)思想來控制而不是隨隨便便在代碼里賦值草稿(0) - 待審核(1) - 審核通過(2) - 已入庫(3) \- 已退回(4) - 修改后重新提交 - 待審核(1)這個(gè)流轉(zhuǎn)關(guān)系畫成圖貼在論文里也是很有說服力的。4. 后端核心功能實(shí)現(xiàn)細(xì)節(jié)4.1 文物征集登記接口DTO VO 分層不能省后端代碼的復(fù)雜度往往不是功能有多難而是代碼組織得好不好。比如一個(gè)“新增征集信息”的接口很多初學(xué)者會(huì)直接把實(shí)體類CulturalRelic作為接收參數(shù)PostMapping(/add) public Result add(RequestBody CulturalRelic relic) { ... }這在簡單場景下沒什么問題但在實(shí)際項(xiàng)目中前端傳來的字段和后端實(shí)體類的字段往往不是完全一致的。比如前端要傳一個(gè)“擬征集方式”而實(shí)體類里根本沒有這個(gè)字段或者前端會(huì)把“圖片列表”也一起傳過來你總不能指望實(shí)體類里包含一個(gè) List。更好的做法是給前端單獨(dú)定義一個(gè)接收對(duì)象 DTOData Transfer Object比如CulturalRelicDTOData public class CulturalRelicDTO { private String relicName; private String relicCategory; private String relicEra; private String sourceType; private String currentOwner; private String contactPhone; private String description; private ListString imageUrls; // 圖片地址列表 }然后在 Service 層把 DTO 轉(zhuǎn)換成實(shí)體類再保存到數(shù)據(jù)庫。同理接口返回給前端的數(shù)據(jù)最好也用 VOView Object包裝不要直接把數(shù)據(jù)庫實(shí)體暴露出去。這樣做的好處很明顯接口字段可控?cái)?shù)據(jù)庫表結(jié)構(gòu)調(diào)整不會(huì)影響前端聯(lián)調(diào)代碼也更規(guī)范。答辯時(shí)你可以說“這是為了接口層與持久層解耦”這個(gè)話一出來檔次就上去了。4.2 審核流程事務(wù)控制是關(guān)鍵“審核”是征集系統(tǒng)里最核心的業(yè)務(wù)操作。審核通過一條文物記錄意味著兩件事同時(shí)發(fā)生修改cultural_relic表的status為“審核通過”。往audit_record表插入一條審核記錄。這兩個(gè)操作必須同時(shí)成功或者同時(shí)失敗。如果你只改了主表狀態(tài)插入審核記錄時(shí)數(shù)據(jù)庫報(bào)錯(cuò)了那么就會(huì)出現(xiàn)“狀態(tài)已經(jīng)變了但沒有任何審核記錄”的數(shù)據(jù)不一致問題。解決辦法就是加事務(wù)Transactional(rollbackFor Exception.class) public Result audit(AuditDTO auditDTO) { // 1. 修改文物狀態(tài) CulturalRelic relic culturalRelicMapper.selectById(auditDTO.getRelicId()); relic.setStatus(auditDTO.getAuditStatus()); culturalRelicMapper.updateById(relic); // 2. 插入審核記錄 AuditRecord record new AuditRecord(); record.setRelicId(relic.getId()); record.setAuditorId(...); record.setAuditStatus(auditDTO.getAuditStatus()); record.setAuditComment(auditDTO.getAuditComment()); auditRecordMapper.insert(record); return Result.success(); }Transactional就是告訴 Spring這個(gè)方法里的所有數(shù)據(jù)庫操作要么都提交要么都回滾。這是 Java 后端開發(fā)者必須掌握的基礎(chǔ)知識(shí)點(diǎn)也是所有業(yè)務(wù)系統(tǒng)里保護(hù)數(shù)據(jù)一致性的常規(guī)手段。4.3 文件圖片上傳別把文件存進(jìn)數(shù)據(jù)庫文物征集系統(tǒng)里圖片上傳是必不可少的功能。這里有一個(gè)最常見的新手誤區(qū)想都不想就把圖片轉(zhuǎn)成 Base64 字符串存進(jìn)數(shù)據(jù)庫或者干脆把圖片的二進(jìn)制數(shù)據(jù)用blob類型存進(jìn)去。這個(gè)方案在畢設(shè)項(xiàng)目里能跑但一旦圖片多了數(shù)據(jù)庫體積會(huì)膨脹得非??鞌?shù)據(jù)庫備份和查詢性能都會(huì)受拖累。正確的常規(guī)做法是文件存磁盤數(shù)據(jù)庫只存文件路徑。在 SpringBoot 中上傳文件的 Controller 方法可以這樣寫PostMapping(/upload) public Result upload(RequestParam(file) MultipartFile file) { // 1. 生成唯一文件名防止重名覆蓋 String originalFilename file.getOriginalFilename(); // 例如 xxx.jpg String fileSuffix originalFilename.substring(originalFilename.lastIndexOf(.)); String newFileName UUID.randomUUID().toString().replace(-, ) fileSuffix; // 2. 指定存儲(chǔ)目錄注意目錄要先創(chuàng)建 String dirPath D:/upload/relic/; File dir new File(dirPath); if (!dir.exists()) { dir.mkdirs(); } // 3. 保存文件 file.transferTo(new File(dirPath newFileName)); // 4. 返回可訪問的 URL 地址 return Result.success(/files/relic/ newFileName); }這里要注意的是第 3 步的transferTo如果報(bào)錯(cuò)大概率是目錄沒有創(chuàng)建權(quán)限Linux 下尤為常見。文件存好之后還差一步讓 URL 能訪問到它。在 SpringBoot 里你需要配置一個(gè)靜態(tài)資源映射把/files/**路徑映射到磁盤目錄Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/files/**) .addResourceLocations(file:D:/upload/); } }這樣前端拿到/files/relic/xxx.jpg瀏覽器直接就能打開圖片。4.4 統(tǒng)計(jì)報(bào)表的 SQL 寫法統(tǒng)計(jì)分析模塊在畢設(shè)里很受老師青睞因?yàn)樗苤苯芋w現(xiàn)“數(shù)據(jù)是有價(jià)值的”。常用的統(tǒng)計(jì)有兩個(gè)維度一是按文物類別統(tǒng)計(jì)看看征集到的文物里文件類、實(shí)物類、照片類各占多少。SQL 其實(shí)非常簡單SELECT relic_category AS category, COUNT(*) AS count FROM cultural_relic WHERE status 3 GROUP BY relic_category;二是按年代統(tǒng)計(jì)比如解放戰(zhàn)爭時(shí)期、土地革命時(shí)期等同樣用 GROUP BY 就能完成。這種統(tǒng)計(jì)結(jié)果傳給前端之后配合 ECharts 畫餅圖、柱狀圖視覺效果非常好答辯的時(shí)候把圖一展示比空口說“系統(tǒng)很完善”有用得多。5. 前端 Vue 實(shí)現(xiàn)要點(diǎn)5.1 項(xiàng)目初始化與路由設(shè)計(jì)前端的工程化開發(fā)一定要從“創(chuàng)建一個(gè)標(biāo)準(zhǔn)項(xiàng)目”開始。Vue 官方推薦的腳手架是 Vite但很多老教程用的是 Vue CLI也就是 webpack 方案。這里我的建議是如果你選 Vue 2用 Vue CLInpm install -g vue/cli然后vue create 項(xiàng)目名。如果你選 Vue 3直接用 Vitenpm create vitelatest 項(xiàng)目名 -- --template vue。無論哪種生成的項(xiàng)目骨架都是標(biāo)準(zhǔn)的 src 結(jié)構(gòu)。路由設(shè)計(jì)上一個(gè)典型的管理系統(tǒng)包含這些頁面/login 登錄頁 /layout 主布局包含側(cè)邊欄和頂欄 ├── /dashboard 數(shù)據(jù)統(tǒng)計(jì)首頁 ├── /relic/list 文物征集列表 ├── /relic/add 新增征集信息 ├── /relic/detail/:id 文物詳情 ├── /audit/list 審核管理 └── /user/list 用戶管理管理員可見路由配置要配合權(quán)限來做。最簡單的做法是登錄時(shí)后端返回當(dāng)前用戶的角色前端根據(jù)角色動(dòng)態(tài)決定渲染哪些菜單和路由。比如“專家”角色就不顯示“用戶管理”菜單而“管理員”則全部可見。這個(gè)功能實(shí)現(xiàn)起來不難但非常能體現(xiàn)“系統(tǒng)的完整性”。5.2 列表頁與表單頁的實(shí)操要點(diǎn)列表展示是整個(gè)前端最常用的功能。我們可以用 Element UI 的el-table加上el-pagination來做分頁。關(guān)鍵點(diǎn)在于前端不要把后端返回的全量數(shù)據(jù)在內(nèi)存里做分頁應(yīng)該把當(dāng)前頁碼和第頁條數(shù)傳給后端由后端 SQL 分頁返回。頁面第一次加載時(shí)調(diào)用后端接口查詢第一頁數(shù)據(jù)this.loadData();async loadData() { const res await this.$http.get(/api/relic/list, { params: { pageNum: this.pageNum, pageSize: this.pageSize, relicName: this.searchForm.relicName, status: this.searchForm.status } }); this.tableData res.data.records; this.total res.data.total; }然后每次切換頁碼、修改搜索條件重新調(diào)用loadData()就行。這里有一個(gè)“經(jīng)典坑”很多同學(xué)在搜索時(shí)把搜索條件里的空字符串也傳給后端導(dǎo)致 SQL 里出現(xiàn)WHERE relic_name 的情況。穩(wěn)妥的做法是在后端接口里對(duì)空字符串做一次判斷或者用 MyBatis-Plus 的StringUtils.isNotBlank()配合 QueryWrapper 動(dòng)態(tài)拼接條件QueryWrapperCulturalRelic wrapper new QueryWrapper(); if (StringUtils.isNotBlank(relicName)) { wrapper.like(relic_name, relicName); }這樣搜索條件為空時(shí)就不會(huì)拼接 SQL避免了很多隱性問題。5.3 axios 封裝與攔截器前端拿不到數(shù)據(jù)、接口報(bào)錯(cuò)很多時(shí)候不是后端問題而是 axios 沒有封裝好。我建議項(xiàng)目一開始就封裝一個(gè)統(tǒng)一的請求模塊給所有接口設(shè)置一個(gè) baseURL同時(shí)配置請求攔截器和響應(yīng)攔截器import axios from axios; import { Message } from element-ui; import router from ../router; const request axios.create({ baseURL: /api, timeout: 10000 }); // 請求攔截器附加 token request.interceptors.request.use(config { const token localStorage.getItem(token); if (token) { config.headers[Authorization] token; } return config; }); // 響應(yīng)攔截器統(tǒng)一處理錯(cuò)誤 request.interceptors.response.use( response { const res response.data; if (res.code ! 200) { Message.error(res.message || 請求失敗); return Promise.reject(new Error(res.message)); } return res; }, error { Message.error(網(wǎng)絡(luò)異常請稍后重試); return Promise.reject(error); } ); export default request;有了這個(gè)封裝前端每個(gè)頁面調(diào)用接口時(shí)只需要關(guān)心業(yè)務(wù)數(shù)據(jù)不需要每個(gè)地方都寫錯(cuò)誤處理。尤其是登錄功能里“token 過期自動(dòng)跳轉(zhuǎn)登錄頁”的邏輯在響應(yīng)攔截器里統(tǒng)一寫一次就夠了。這個(gè)模塊如果寫好了整個(gè)前端工程質(zhì)量立刻提升一個(gè)檔次。6. 從源碼到跑起來環(huán)境準(zhǔn)備與部署啟動(dòng)拿到源碼之后很多同學(xué)卡在最開始的環(huán)境搭配上。這里給出一份經(jīng)過實(shí)測的版本組合能少走很多彎路。6.1 后端環(huán)境搭配與啟動(dòng)流程推薦這套組合JDK 1.8或者 JDK 11SpringBoot 2.x 都支持Maven 3.6MySQL 8.0SpringBoot 2.7.x不是 3.x3.x 基于 JDK17學(xué)生項(xiàng)目沒必要追新2.7 的資料最多遇到問題最好搜啟動(dòng)前要做的三件事第一在 MySQL 里創(chuàng)建數(shù)據(jù)庫并導(dǎo)入 SQL 文件。一般源碼包里會(huì)有一個(gè).sql文件用 Navicat 或者命令行執(zhí)行mysql -u root -p relic_system.sql執(zhí)行前看一眼 SQL 文件里的建庫語句如果沒有CREATE DATABASE那就要自己先在 Navicat 里新建一個(gè)數(shù)據(jù)庫再導(dǎo)入。第二修改application.yml里的數(shù)據(jù)庫連接配置。把你的數(shù)據(jù)庫名、用戶名、密碼改對(duì)spring: datasource: url: jdbc:mysql://localhost:3306/relic_system?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 username: root password: 你自己的密碼 driver-class-name: com.mysql.cj.jdbc.Driver這里特別強(qiáng)調(diào)useSSLfalse和serverTimezoneAsia/Shanghai。MySQL 8 默認(rèn)開啟了 SSL本地開發(fā)不需要不加這個(gè)參數(shù)可能報(bào)SSL connection error時(shí)區(qū)不配的話數(shù)據(jù)庫連接池初始化就可能直接報(bào)錯(cuò)。第三啟動(dòng)項(xiàng)目。在 IDEA 里打開項(xiàng)目等待 Maven 依賴下載完成找到主啟動(dòng)類右鍵 Run。如果看到類似Tomcat started on port(s): 8080的日志說明后端已經(jīng)起來了。6.2 前端環(huán)境配置與啟動(dòng)流程前端需要安裝 Node.js建議版本 14 或者 16。啟動(dòng)步驟npm install npm run servenpm install第一次執(zhí)行時(shí)可能很慢尤其是安裝 electron 那類跨平臺(tái)依賴。常規(guī)做法是改 registry 鏡像源npm config set registry https://registry.npmmirror.com然后再跑npm install速度會(huì)快很多。前端默認(rèn)端口是 8080后端的端口也是 8080就會(huì)沖突。處理方法有兩個(gè)推薦改前端的 devServer 端口比如改成 8081然后配置代理轉(zhuǎn)發(fā)到 8080。Vue CLI 項(xiàng)目在vue.config.js里配置代理module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } };或者直接改后端端口為 8080 之外的端口如 9090。就算只用一套系統(tǒng)前端 8081 代理到后端 9090 也是可以的。順帶一提前端發(fā)請求時(shí)用/api/relic/list這種以/api開頭的相對(duì)路徑代理會(huì)幫它轉(zhuǎn)發(fā)到后端就不會(huì)有跨域問題了。如果你的前端直接寫http://localhost:8080/api/relic/list全路徑請求那必須讓后端開啟跨域CrossOrigin否則瀏覽器會(huì)攔截響應(yīng)。7. 常見問題與排查技巧實(shí)錄這部分內(nèi)容真的是你在實(shí)際開發(fā)和學(xué)習(xí)過程中大概率會(huì)遇到的比看一百遍教程都有用。我把這套系統(tǒng)里高頻故障整理成速查表。癥狀常見原因解決辦法后端啟動(dòng)時(shí)數(shù)據(jù)庫報(bào) SSL 連接錯(cuò)誤連接 URL 缺少useSSLfalse在application.yml的 url 里加上useSSLfalse時(shí)區(qū)報(bào)錯(cuò)The server time zone value連接 URL 缺少serverTimezone加上serverTimezoneAsia/Shanghai前端請求后端接口 404代理沒配好或請求路徑不對(duì)檢查vue.config.js的 proxy 配置路徑是否以/api開頭接口 405 錯(cuò)誤請求方式不匹配檢查是 POST 還是 GET前后端保持一致請求 401/無權(quán)限沒帶 token或 token 過期看前端請求攔截器有沒有附加 token后端是否校驗(yàn)圖片上傳后訪問 404靜態(tài)資源映射沒配置在 WebMvcConfig 里配置/files/**映射到磁盤目錄前端頁面白屏控制臺(tái)報(bào)錯(cuò)路由或組件引入路徑不對(duì)檢查路由配置和 import 路徑有些源碼里的路徑直接用絕對(duì)路徑需要改成相對(duì)路徑npm install非常慢默認(rèn)源在國外用registry.npmmirror.com鏡像MyBatis-Plus 分頁查詢返回 total 是 0少了分頁插件配置檢查是否配置了MybatisPlusInterceptor且添加了PaginationInnerInterceptor數(shù)據(jù)庫導(dǎo)入 SQL 報(bào)錯(cuò)SQL 文件編碼不是 UTF-8用 Navicat 導(dǎo)入時(shí)選擇 UTF-8 編碼或在命令行執(zhí)行時(shí)指定--default-character-setutf87.1 排查問題的通用方法論光有速查表還不夠我給你一個(gè)通用的排查思路這個(gè)方法比任何具體答案都管用。很多同學(xué)遇到報(bào)錯(cuò)的第一反應(yīng)就是把報(bào)錯(cuò)信息復(fù)制粘貼到百度這本身沒錯(cuò)但效率太低了。正確順序是第一步看控制臺(tái)最底部的 Caused by 信息。Java 的報(bào)錯(cuò)信息往往很長真正的原因藏在最下面。比如你在 IDEA 的紅色報(bào)錯(cuò)信息里往上翻幾頁找到Caused by: java.sql.SQLException: Access denied for user rootlocalhost (using password: YES)這時(shí)候就直接知道是數(shù)據(jù)庫賬號(hào)密碼不對(duì)而不是被上面的什么 NullPointerException 帶偏。第二步確認(rèn)錯(cuò)誤屬于哪個(gè)層級(jí)。是數(shù)據(jù)庫連接失敗還是 SQL 拼寫錯(cuò)誤還是業(yè)務(wù)代碼空指針還是前端網(wǎng)絡(luò)請求失敗層級(jí)判斷準(zhǔn)確查找范圍縮小一半。第三步斷點(diǎn)調(diào)試。不要覺得斷點(diǎn)調(diào)試很難。在 IDEA 里打個(gè)斷點(diǎn)用調(diào)試模式啟動(dòng)一步步看代碼執(zhí)行到哪一步出錯(cuò)、某個(gè)變量的值是什么十次里有八次能直接揪出問題。這比盲猜變量值高效得多。第四步保留原始日志。排查問題之前先復(fù)制完整的日志片段再去查。很多問題單看報(bào)錯(cuò)標(biāo)題判斷不出來但結(jié)合完整的異常堆棧很容易定位。問別人問題的時(shí)候也一定要把完整日志貼出來而不是只說“報(bào)錯(cuò)了”。7.2 跨域問題關(guān)鍵是不重蹈覆轍我單獨(dú)把跨域拎出來說因?yàn)檫@個(gè)是前后端分離項(xiàng)目里最容易困擾新人的問題。瀏覽器有一個(gè)同源策略A 網(wǎng)站的 JavaScript 代碼默認(rèn)無法直接訪問 B 網(wǎng)站的接口。如果前端跑在http://localhost:8081后端跑在http://localhost:8080端口不同就算域名相同也算跨域。最省事的方案就是上面說的代理轉(zhuǎn)發(fā)。前端的所有請求路徑都寫成相對(duì)路徑以/api開頭由 Vite 或 webpack-dev-server 代理轉(zhuǎn)發(fā)到后端。這樣瀏覽器看到的請求就是同源的都在 8081跨域問題不存在。如果確實(shí)不走代理要后端開跨域你可以在 SpringBoot 里寫一個(gè)全局的跨域配置比在每個(gè) Controller 上加CrossOrigin注解更干凈Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(http://localhost:8081) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true); } }需要提醒的是allowedOrigins寫死前端地址如果是線上部署用 nginx 反代這句通常卻是不需要的有些情況下反而會(huì)導(dǎo)致登錄的 cookie 帶不上。8. 二開擴(kuò)展讓這個(gè)系統(tǒng)從“能交”變成“出彩”基礎(chǔ)功能跑通只是第一步如果想在答辯時(shí)拿高分或者自己在技術(shù)上真的有收獲一定要嘗試做一兩個(gè)擴(kuò)展功能。我給你幾個(gè)方向難度從低到高。第一個(gè)方向是接入 JWT 做無狀態(tài)登錄?,F(xiàn)在很多管理系統(tǒng)的登錄方案還是基于 Session 的但前后端分離環(huán)境下更通用的是 JWT。原理是用戶登錄成功后后端生成一個(gè)帶簽名的 token 返回給前端前端把 token 存在 localStorage 里之后每次請求在請求頭帶上這個(gè) token。后端用攔截器校驗(yàn) token 是否有效、是否是當(dāng)前用戶。這個(gè)機(jī)制不復(fù)雜但做完之后你對(duì)“登錄態(tài)”的理解會(huì)通透很多。第二個(gè)方向是引入對(duì)象存儲(chǔ)服務(wù)。我上面文章里寫的圖片上傳是存本地磁盤這在教學(xué)項(xiàng)目里足夠。但如果你想讓項(xiàng)目更接近生產(chǎn)環(huán)境可以考慮把文件上傳到云端的對(duì)象存儲(chǔ)服務(wù)比如 MinIO。MinIO 是開源的對(duì)象存儲(chǔ)方案可以部署在你自己的服務(wù)器上文檔也比較友好。SpringBoot 整合 MinIO 有對(duì)應(yīng)的 SDK接口兩三行代碼就能實(shí)現(xiàn)上傳。這個(gè)改造既解決了“文件存在服務(wù)器本地”的擴(kuò)容難題也讓你提前接觸了企業(yè)里常用的文件存儲(chǔ)方案。熱搜詞里還提到了“minio加入到springboot”這正好是一個(gè)加分項(xiàng)。第三個(gè)方向是引入工作流引擎。比如 Flowable 或者 Activiti把審核流程做成可配置的動(dòng)態(tài)流程。這個(gè)難度高但對(duì)于“征集審核”“入庫審批”這種多環(huán)節(jié)業(yè)務(wù)來說確實(shí)更貼切。如果你時(shí)間充裕可以建議團(tuán)隊(duì)里一兩個(gè)人專門研究這個(gè)方向作為進(jìn)階功能展示。這幾個(gè)擴(kuò)展方向里我個(gè)人最推薦第二個(gè)方案。理由很簡單在你們整個(gè)前后端分離的架構(gòu)里文件存儲(chǔ)是不可或缺的一個(gè)環(huán)節(jié)MinIO 的引入不會(huì)打斷現(xiàn)有代碼邏輯又能在答辯時(shí)展示你對(duì)“生產(chǎn)級(jí)文件存儲(chǔ)”的認(rèn)知性價(jià)比最高。9. 寫在后面做項(xiàng)目最忌諱“跑起來就完事”最后分享一點(diǎn)我自己做這些項(xiàng)目時(shí)的心得。很多人把一個(gè)項(xiàng)目拉下來之后跑起來截幾張圖論文一貼就覺得自己完成任務(wù)了。實(shí)際上等到答辯的時(shí)候老師隨便問一個(gè)“審核狀態(tài)是怎么流轉(zhuǎn)的”立刻就露餡了。我的建議是你拿到任何系統(tǒng)源碼不要急著跑而是先干兩件事第一件事用筆在紙上畫一遍數(shù)據(jù)庫關(guān)系圖。不用畫得多華麗就畫出用戶表、文物征集表、審核記錄表、圖片表之間誰關(guān)聯(lián)誰就能明確這個(gè)系統(tǒng)的業(yè)務(wù)主鏈路。畫完你就能發(fā)現(xiàn)原來從這個(gè)系統(tǒng)里隨便找一個(gè)功能點(diǎn)都離不開這幾張表的聯(lián)動(dòng)。第二件事把其中一個(gè)核心功能從頭到尾寫一遍。不需要完整重寫整個(gè)系統(tǒng)但你可以試著自己寫一個(gè)“文物征集信息新增”功能從建表、寫實(shí)體、寫 Mapper、寫 Service、寫 Controller到前端寫一個(gè)表單頁、調(diào)接口、刷新列表。親手寫完這一個(gè)閉環(huán)你就掌握了前后端分離項(xiàng)目里 80% 的套路。剩下的功能無非是列表查詢、狀態(tài)修改、刪除、統(tǒng)計(jì)套路都是同一個(gè)。這套項(xiàng)目值不值得學(xué)關(guān)鍵不在于它的功能有多炫而在于它把 Java Web 后端開發(fā)最常用的一整套知識(shí)串了起來MVC 分層、ORM 框架、事務(wù)管理、文件上傳、權(quán)限控制、前后端聯(lián)調(diào)、部署啟動(dòng)。你把這個(gè)項(xiàng)目吃透自己做畢業(yè)設(shè)計(jì)的時(shí)候完全不需要再到處找模板只需要在這個(gè)基礎(chǔ)上改業(yè)務(wù)字段、加模塊就行——因?yàn)楣羌芤呀?jīng)在你腦子里。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩人妻中文视频| 成人免费看吃奶视频网站| 日韩大香蕉| 欧美性生活综合| 久久一区二区蜜桃| 欧州色图区| 天天亚洲| 91精品导航| 亚洲美乱| 色狠狠综合| 亚洲色图A| 国产免费一区二区三区最新不卡 | 日韩免费看在线黄色片| 久神马| 欧美一级特黄淫片在线观看| 九九久久国产精品怡红院| 探花熟女,姿勢到位,體驗感也到位| 人人操人人射人人干| 激情啪啪拍91| 91大神精品长腿在线观看网站| 中文字幕日韩电影人妻| 啊啊啊啊在线播放| 九色 人妻 大香蕉| 亚洲中文日韩精品| 97日韩欧美| 884t在线| 五月婷色| 曰本人妻人人澡人人夹| 91综合在线| 久久成人东京热人妻| 六月丁丁香| 国产精品麻豆免费视频| 在线视频亚洲无码| 国产精品久久久亚洲第一牛牛_在线观看 | 国产人伦精品一区二区三区| 高清无码国产亚洲| 嫩草在线视频| 天天操夜夜操狠很操| 九九九久久久W精品| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 影音先锋国产精品| 久久久A∨| 国产第12页| 精品午夜福利导航| 精品久久久久综合无码| 亚洲综人网| www.男人的天堂| 亚洲a色| 91人人| 蜜汁欧美| 美女爽爽爽刺痛洞洞| 亚洲青青草| 久久成年精品| 99热超碰| 天天综合亚在线| 国产suv精品一区二区四| 婷婷午夜成人色中色| 手机在线A片| 色99999| 天天看天天日天天操| 国产一级高清免费观看| 欧美少妇性爱网站| 麻豆国产尤物AV| 久久婷婷精品| 久久这里精品国产99丫e6| 五月丁香婷婷啪啪| 青青操在线亚洲视频观看欧美在线 | 黑人操一区二区| 熟女六十路| 婷婷激情五月天小说网| 亚洲激情AV| 美女人妻色网站| 九九九网页| 精品9区| 欧美亚洲厕所精品偷拍91 | 欧美另类精品xxxx| 久久久工口| 麻豆传媒一区二区在线观看| 99999精品| 欧美狠狠| 国产13区| 久久9精品| 国产毛片片精品天天看视频| 无遮挡一级毛片视频免费的| 久久久夜夜嗨免费视频| 欧美72网页| 欧美97av| 屌色在线97视频| 偷拍综合亚洲| 国内一级精品| 91精品人妻电影| 一区二区娱乐网站| 91nbbbbbb| 久久国产AⅤ| 亚洲图片日本AⅤ欧美在线| 国产免费一区在线观看| 熟女AV一区| 人妻少妇精品久久久久久久| 精品一区二区三区蜜桃臀赵总 | 色精品极品| 国产又长又大又粗的视频| 麻豆av一区二区| 久久riav中文精品| 亚洲成人精品久久久| 骚人妻少妇视频| 激情五月综合开心五月| 成人性爱全视频观看| 日韩AV色图| 久久精品人妻一区二区| 亚洲激情综合另类男同| 嗯嗯啊啊操死我| 久久久久久久| 麻豆黄色五月天| 蜜桃AV天堂| 唐山老熟妇露脸啪啪叫| 一区二三区四区视频大全套| 一区二区三区亚洲| 精品亚州18| 天天夜夜rb| 久久99人妖视频国产| 久久99草| 人妻精品视频一区二区| 日韩欧美偷拍美女视频| 家庭乱伦国产| 国产精品视频在线播放| av网页一区二区三区| 亚洲男人的天堂在线看| 国产精品69人妻无码久久久| 国产成人主播| 97精品国产手机| 欧美亚洲在线| Julia在线播放亚洲久久| 少妇久久久久| 国产怡红院| 日韩亚洲精品一区二区| 美女丝袜激情小说| blacked精品一区国产| 熟女网站最新| 色999五月色| 97干在线视频| 操我啊啊啊啊啊| 91AV入口| 久久精品人妻一区二区三区| 啪啪综合网| 麻豆av一区二区| 天美av在线观看| 91P0RNY大屁股人妻| 国产视频大全| 日韩中文字幕二区| 17c嫩草51久久91嫩草| 亚洲av总站| 一类无码操逼视频| 亚洲男人天堂网站| 97青娱乐超碰久久| 国产亚洲综合欧美一区| 欧美亚洲自拍另类人妻| 福利风月五月天影院| 国产成人拍国产亚洲精品| 情色av电影| 搡老人老9丨女老熟人| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 神马麻豆福利院| 蜜臀99999| 91精品无码久久久久久久| 欧美老妇女内射网址| 手机在线观看不卡无码av| 久草综合网| 久久超碰亚洲人| 亚洲天堂7777| 久久亚洲国产成人| 青青在线视频日韩欧美| 91热色| 精产国品一区二三产品| 农村妇女一级二级三级视频| 久久性爱大全| 操逼视频亚洲| 91视频伊人| 精品少妇99| 天天澡天天爽日日AV| 97超级欧美| 亚洲成人av色网| 精品九九国产无码| 亚洲男人久久综合天堂| 亚洲欧美综合| 九九精品网| 亚洲污污网站| 啊啊啊在线看| 伊人在线大香蕉视频久久| AV 少妇 人妻 偷拍| 波多野结衣被操50分钟免费视频| 久久69| 久久激情视频| 亚洲风情综合网| 天天干夜夜肏| 国产精品夜夜夜| 国产久久日| 亚洲av总站| 暖暖精品二区三区观看| 偷拍欧美激情| 九久9热| 偷拍欧美激情| 强上我不卡卡| 色好看av| 91AV天美在线视频| 亚洲国产丝袜在线观看| 少妇内射视频| 91狠狠狠| 中韩中文字幕在线观看| 欧美中字不卡| 黑人性暴力毛片| 午夜操操操| 天天天操天天天爱| 97精品视频免费| 免费看美国人人爽,人人操| 精品人妻一区二区三区-国产| 天天日少妇逼AV| 久久久五月天| 少妇国产不卡| 麻豆国产第一| 国偷自 一区二区| 欧美中字不卡| 精产品久久| 91性片| 毛片一区二区| 无码聚合| 久久大香蕉| 五月激情在线| 日本不卡二三区| 欧美乱妇狂野欧美在线视频| 蜜桃香蕉久草精品在线| 亚洲黄色视频在线观看视频| 一级黄色牲爱A级片| 艹比视频国产精品| 1024久久高清视频| 日本精品性生活久久久| 99这里只有精品| 97久久超碰| 波多野42部无码喷潮在线观看| 日韩欧美tv一区二区在线观看| 亚洲第2页| 欧美日不卡| 二级久久网| 一区二区三区在线日韩影院观看| 校园春色五月天| a片久久久久久久久久久久 | 日本人人操人人操| 亚洲成人av色网| 亚洲色图美腿丝袜| 91亚洲人| 明星性猛交ⅹxxx乱大交| 91在线视频观看国产| 国产成人精品日本亚洲语言| 少妇蜜汁| AV中文字幕三四五| 自拍偷拍亚洲熟女妇人精品| 五月天激情小说| 中文字幕精品丝袜| rion磁力链接| 午夜久久无码1000合集| 1区2区3区在线视频| 大学生口爆吞精| 亚洲操操操| 超碰1997| 日本一级特级毛片视频| 人人色人人操在线| 中文久久96| 国产在线播放成人免费| 免费黄色片子| 国产高清在线自在拍69| 亚洲AV无码乱码| 丁香五月婷婷基地| 亚洲精品97久久中文字幕| 欧美男人天堂| 欧美中出1| 天操老女人| 人人妻人人爽| 精品国产丝袜一区二区三区乱码 | 97久久久网站| 国产精品久久久久久无码红治院| 日本久操视频| 9I1性色影院| 激情五月天丁香社区| 久久久久久九九九九-美女久久久久久久-成人AV| 蜜臀久久99'精品久久久| 国产福利电影| 人妻天堂综合网| 欧美国产有色电影| 激情网色| 一级免费精品| 无码粉嫩白虎一线天b区| 翔田千里无码一区| 超碰超碰欧美| 久久少妇| 在线啊啊啊啊| 人妻丝袜一区二区三区在线| 99综合网| av三级电影在线播放| 免费视频a级毛片免费视频| 久久视频,这里只有精品| 国产免a费看黄片在线| 91亚洲精品青草| 综合夜夜| 婷婷久久五月| 欧美综合色,www| 色色色色网站| 亚洲丝袜二区在线| 国产亚洲色婷婷久久99精品91| 97资源站久久| 日本网色| 欧美综合色,www| 亚洲AV无码成人精品久久| 综合九九| 久久午夜伦| 国产浮力影院第1页| 久久久久久9999| 艹精品| 国产精品密臀网在线观看| 欧美极品性爱天天射| 加勒比五月天| 久久99综合| 色噜噜国产精品视频一区二区| xxx0国产在线播放| 九九热精品视频六| 欧美精品91| 翔田千里AⅤHD无码| 91精品国久久久久久无码| 日韩兔费看黄片| 乱老熟女一区二区三区| 黄片免费久久久久久久| 爱丝福利| 国产免费大片| 岛国成人av在线播放网址| 男人的天堂VA| 热天堂一区二区| 在线色导航| 成人情色综合网| 麻豆 欧美 日韩| 日本三级一区二区 在线| 亚洲清纯唯美| 素人美腿视频网站| 黄色免费网页无码| 五月丁香六月综合缴清无码| 91操人| 大香蕉伊人色偷偷在线| av日韩在线观看电影| 亚洲综人网| 日韩av熟女一区二区三区成人| 少妇一区二区三区精选| 91精品人妻五十路| 一区 欧美 日韩 麻豆| 亚洲天堂人妻熟妇视频| 日产操逼| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 亚洲成人贴图| 91超碰碰在线| 天堂麻豆天美| 天天综合亚在线| 综合五月婷婷| 狠狠色狠狠色狠狠五月| 女性喷水高潮在线观看| 91久热| 精品视频专区| 精品射1999| 天天躁日日躁AAAXX| 乱伦日本中文自拍| 九九九九久久久久| 超碰97人妻自拍| 美欧老女人97| 欧美狠狠操| 色情成人五月天| 美女毛片999| 懂色综合久久久| 丝袜美腿制服人妻二区中文字幕| 乱伦熟女论坛| 欧美亚洲情色| 欧美色女人| 天堂av最新电影网| 亚洲 综合 第一页| A男人的天堂| 亚洲熟妇乱女区二区三区| 亚洲人妻av| 亚洲操逼视频网站| 久久久久久久国产a∨| 超碰精品国产无码| 啊啊啊啊操死我| 国产精品一区二区密臀| 日韩青久久| 亚洲国内精品成人不卡| 午夜福利在线视频1000| 亚洲日韩欧美一区二区| 九九九九九九视频| 亚洲天堂日本| 天天影视网色欲色香| 九九热男人天堂| 97色色色| 精品视频久久久久九九九九9999| 色五月婷婷五月天| 天天肏美女| a人欧美综合天堂麻豆| 嗯阿好爽好紧| 97超碰天天爱天天爱| 欧美高清性猛交| 久久伊人青青草| 午夜精品久久久久久久99热影院| 国产成自自拍在线观看| 中文字幕乱偷人妻久久艾草网| 色妺妺在线视频| 日韩美女久久一区二区三区| 国产 大胆 对白| 四季AV一区二区凹凸精品小说| 日本日日色视频| 日韩精品操少妇| 大香蕉综合在线| 国产精品3| 亚洲精品国产拍免费91在线| 男人精品区| 国产精品久久久久久高清无码免费看 | 亚洲无码国产精品久久| 欧美亚洲色图另类国产| 大香樵伊人网| 香港成人一级视频在线青青草| 夜夜 中文视频rt| 日本免费一区二区不卡| 91亚洲欧美激情| 日韩精品在线视频在线观看| 国产又操| 亚州成人a∨| 青女在线| 精品99999| 极品国产内射| 日韩欧美国产高清视频| 超碰三级秋霞| 日日干男人的天堂| 999综合网| 狠狠中文字幕| 91 刺激在线| m欧洲一级午老| 久久久久久久久久久精| 色色网91| 亚洲91少妇| 激情文学 亚洲图片| 玖玖爱视频网站| 国产成年免费大片黄在线观看| 久久婷婷伊人| AV中文字幕剧情1区2区3| 大逼色网站| 久久社区一区二区三区| 丝袜内射| 97色亚洲| 激情五月综合网| 色偷综合| 亚洲欧洲日本精品中文a∨| 秋霞视频一区二区| 精品久久久不卡一区二区| 欧美91在线| 国产成人自拍视频在线| 免费99精品国产自在在线| 精品人妻一二三| 久久男人的天堂国产| 丝袜狠狠草尤物 91| 亚洲不卡三级手机播放| 熟妇人妻精品一区二区视频色欲| 99日视频在线免费| 免费啪啪啪网站18岁| 免费网站观看www在线观| 久草新在线| 欧美人妻精品一区二区| 国产60区。| 中文字幕国产在线天堂| 亚洲图片欧美91N| 亚洲青色欧美| 操逼视频亚洲| 欧美性综合| 国产午夜在线观看视频| www.色婷婷| 91精品国| 亚洲精品视频在线| 91爱| 久热久一区二区三区| 国产精品一区二区密臀| 欧美日韩性爱视屏免费看了| 超碰在线日韩一区| 久久五月综合| 亚洲资源站| 国模精品一区二区三区苹果色戒| 亚洲风情综合网| 2024人人操人人摸| 九热中文字幕| 欧美亚洲丝袜美女电影| 国产狂喷潮在线精品| 性生活久久久久久久久久| 免费A片三p视频| 97自拍一区| 丁香六月激情| 欧美 日韩第一性色| 手机看av网站在线看| 精品人妻一区二区蜜桃视频| 亚洲国产欧美中文永久| 日日躁天天躁狠狠躁| 色播五月婷婷| 亚洲成aⅴ人片不卡无码| 神马午夜久久久| 操逼操逼逼操操逼91| 超碰欧美97资源| 亚洲一区深夜| 综合国产影视三级| 熟女91网| 日韩啪啪啪啪啪| 第四色奇米影视777| 欧美亚洲se91| 欧美色色色| 揉揉日日日日| 亚洲区限制级| 920日本午夜免费| 大香蕉乱级| 蜜臀va69| 图色综合网| 思思热影视| 欧美日韩在线小说| 久久精品女同亚洲女同13| 97超碰国产精品| 精品成人亚洲午夜电影| 亚洲色阁| 欧美 日韩第一性色| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 99在线精品观看99| 久久性爱视频99| 久久精品一区二区三区蜜桃臀| 粉嫩绯色AV一区二区在线| A 天堂| 亚洲双插| 91成人社区| 香蕉99秘 精品一区丁香| 日本精品高清一二区一本到| 视频国产成人精品日本亚洲18| 国产乱子伦一区二区三区免看| 青娱乐av在线| 乱色视频中文字幕| 国产精品爽爽v| 狠狠爱综合网| 97亚洲欧美| 一区二区亚州激情久婷婷欧美| 国产精品天美传媒| 日韩去日本高清在| 欧美激情性爱视频网站| 人妻三级在线中文字幕| 99re这里只有精品2| 婷婷日韩一区二区三区中文字幕在线| 国产亚洲色婷婷久久99精品91葵花宝典 | 九九九九精品视频| 色欲久久99精品久久| 色噜噜人妻丝袜AV资源| 啪啪视频mP4| 开心五月天激情网| 色五月婷婷色| 性爱av在线免费观看| 岛园激情| 黑人嘿嘿嘿超爽免费视频| www.yeyecao| 精品无码久久久久久久久果冻糖心| 欧美日韩人妻精品一区二区三区| 欧美国产操逼| 青青伊人加勒比海| 成人久久久精品| 啊啊啊啊啊啊啊网址在线观看| 99www.bibizy香蕉资源国产一区二区三区高清 | 色婷婷九月| 日本精品不卡一二三区| 欧美黄片欧美黄片xxx| 少妇无码av专区线| 日韩欧美综合激情| 嫩草一区二区在线观看| 丰满少妇乱子伦精品无| 精品中文字幕一区二区| 国产69精品久久久久99尤物| 3d成人精品一区二区| 国产区91柔拿会所技师| 久热大香蕉| 99久久九九| 欧美激情五月天| 欧美天天插| 麻豆天美传媒在线视频天堂| 一区二区三区四区久久视1| 欧美 熟女 日韩| 东京热av男人的天堂| 日本999精品| 久热大香蕉网站| 色婷婷A V一二三四区麻豆综合| 疯操AV| 天天综合中文字幕 91| 日本精品999| 狠狠爱大香蕉| 国产AV激情无码久久无码| 久久亚洲AV无码专区国产精品| 天天日天天干天天整| 密桃99999| 极品粉嫩一区二区| 久久久久久久六六| 校园春色五月天| 影音先锋乱伦资源| 91超碰人人操| 国产精品九9| 中文字幕精品专区搜索结果91| 男人的天堂久久| 私人尤物在线精品不卡| 欧美一区二区亚洲天堂| 素人美腿视频网站| 97精选久久| 国产97在线 | 亚洲| 欧美,日韩综合久久| 九九人人操| 国产农村妇女精品一| 欧美强奸乱能| 人妻久久久久久| 少妇内射www在线观看视频| 九九九草| 国产无码三级视频在线观看| 人人做人人妻人人夜视频| 精品精品精品| 33044男人的天堂深夜备| 日韩一级欧美一级国产一级台湾| 亚洲黄色a级片| 熟妇最新先锋一二三区| 亚洲日韩资源| 日韩国产欧美伦理在线| 亚洲福利中文字幕在线| 97天天在线| 夜夜草天天| 久操婷婷| 成人草草视频| 日本操逼二区| 97欧美精品综合| 91综合色| 日本三级中国三级99人妇网站| 小骚逼被操的爽不爽| 三级日韩一区二区三区| 欧美国产日韩清纯唯美| 淫穴高潮色图| 国产精品无套内谢| 日韩视频小说在线观看| 91视频精品| 中文字幕一区av| 91n处女在线观看| 五月天婷精品激情| 亚洲视频二区 | 超91综合网| 97视频免费播放| 国产精品青草综合久久| 色香综合天天影视综合 | 久久亚洲中文字幕视频| 麻豆天美久久91| 精品日日人妻| 综合色色网| 综合性视频99| 成年人一级黄色毛片大全在线观看| 亚洲少妇色图自慰直播| 国产精品久久久久久久久久梁医生| 丰满欧美少妇| 久久国产AⅤ| 国产精品对白内射| 久96热在线观看视频| 嗯嗯啊啊啊好舒服| 98人妻精品一区二区色欲| 人妻日日夜夜精品| 影音先锋日本乱伦| 最新精品久久蜜桃| 曰韩操B| 国产精品97超碰| 中文字幕 国产区| 欧美日韩人妻精品一区二区三区| 婷婷色综合| 日韩大香蕉| 伊人久久亚洲中文字幕| 国产精品视频内谢女人| 亚洲在高跟鞋自慰久久在色线| 国产一进一出视频网站| 丰满丝袜少妇AV| 另类在线| 成人精品无码| 伊人精品视频| 久操精品网| 黑人猛交| 国产精品密臀网在线观看| 性爱1区| 青青草国产欧美非洲黑人| 18一区二区三区| 美国aaaaa一级黄片| 亚洲熟女一区二区| 美国美女AV在线| 蜜臀99久久精品久久久懂爱| 91丨九色丨熟女高潮| 96精品久久| 国产污视频麻豆传媒一区二区| 亚洲美女自拍偷拍视频| 精品国产乱码久久久A| 欧美日不卡| 欧美五十路熟| 91丝袜人妻| 夜夜爽妓女| 97干在线| 青娱乐欧美激情一区二区| 99re综合伊人| 欧美一二三区四五区| 久久精品国产亚洲AV片多多| 天天综合网~91| 色拍偷亚洲| 日韩av女优在线免费一区| 变态乱伦伪娘灌肠一区二区| 美女高潮国产高清| 欧美在线综合| 成人无码专区精品视频| 久久香蕉网| 国产不卡免费在线视频| 91夜色| 91无码人妻精品一区二区三区蜜桃| 97精品一二区| 久久久精品国产亚洲AV无码| 黄色激情电影在线观看| 亚洲97综| 九九九不卡| 天堂亚洲精品久久老牛| 炮色五月| 97人人草| www久久99| 美国aaaaa一级黄片| 欧美人妻制服| 亚洲欧美内射| 中文字幕精品三级久久久| 欧色性第一页| 日本一二三高清| 大香蕉碰碰| 天天插天天干| 色综合尤物| 久久人人爽爽人人爽人人片αV| 亚洲AV成人精品网站在AV| 欧美大的香蕉有线电视视频| 玖玖超碰熟| 香蕉大久久久| 热的中文 热的有码 热的国产| av婷婷色网| 性色高清在线| 亚洲国产一区二区三区在线| 亚洲欧美日韩精品久久久一区二区| 日韩人妻制服丝袜av| 亚洲精品一区二区精品| 国产精品蜜臀久久久久无码AV| 亚洲加勒比久久日本道| 日韩97| 中国操逼无码| 青娱乐老司机视频| 欧美gv在线观看| 日韩免费高清大片在线| 一级做a爰片性色毛片久久| 久草成人| 日韩黄片影院| 99老司机精品视频在线观看| 久久久精品网| av毛片aaaaa免费看| 青草成人免费视频一com| 国产精品美女| 色色毛片| 午夜亚洲国产理论秋霞| 99精品久久久久久久婷婷| 天天色播亚洲综合网站| 久久婷婷亚洲| 久久欧美1卡2卡3| 夜夜騷av、一區二區| 思思热久久成人| 日韩AV片| 五月丁香影院| 人人妻人射| 极品尤物在线观看| 色色色网站| 色鬼在线综合| 国产第二页| 久久久久久中文| 欧美组图日韩亚洲中文字幕| 黄色成人网久久久久久| 激情小说日韩无码| 国产女同视频在线播放| 十八禁成人网站在线观看| 97人人草| 欧美狠狠操| 国产久9| 东京热一区二区中文字幕| 中文字幕精品一区二| 夜嗨影院| www.91色综合| 加勒比综合九九99视频在线播放| 中文字幕av一区二区三区人妻少妇| 亚洲图片欧美偷拍| 一级做a爰片性色毛片久久| 一起草精品人妻| www四虎| 91视频女生| 国产性爱强奸乱伦大全| 欧美日本国产日韩激情视频| 欧美日不卡| se,,,亚洲欧美| 欧美 亚洲精品首页| 色网在线视频观看免费| 激情五月综合| 久久精品电影| 亚洲国产精品无码AV久久| a天堂视频| 亚洲色图20p| 91老妇女| 一本色道综合久久欧美日韩精品| 多毛小伙内射老太婆 | 欧美亚洲高清不卡| 亚洲自拍97| av国产无码| 伊人久久久日韩一区| 97超碰欧美中文字幕| 亚洲性爱无码乱伦av| 中文字幕丝袜美腿| 人人九九精| 亚洲第一狼人丝袜美女另类| 欧美天天插| 欲香欲色综合天天伊人| 老司机老司机午夜影院| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 日韩天天本| 亚洲另类欧美精品| 最新欧洲欧美日本激情网站| 91老熟女逼| 91熟女网| 日本免费亚洲欧美| 久操电影网| 亚洲欧美日韩精品久| 美女黑人91神马| 免费久久一级毛片大黄| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 亚洲一区二区三区麻豆传媒| 人爽不卡视频| 视频二区美腿丝袜制服人妻欧美| 国产一区二区精品在线视频| 精品国产91内射久久| 亚洲91亚洲| 婷婷久久五月综合激情| 久久久久久夜夜夜夜夜| 亚洲风情在线观看| 天天爽天天操| 羞涩视频| 青青草日本无码| 91香蕉国产尤物视频| 深夜啪啪啪视频免费| 97超碰大| 亚洲天堂性爱| 放黄片放3级黄片没穿衣服| 九九九综合精品| av激情亚洲五月天| 内射日韩大臀美女| 超碰在线人妻中文字幕| 欧美日韩人人早| 国产精品毛片?v一区二区三区| 97 国产一区| 尤物av网站免费在线播放| 香一区二区三区| 中文字幕av亚洲精品| 日日夜夜国产综合| 少妇人妻好深太紧了vr91| 亚洲日韩东京热一区| 一级特级aaaa毛片免费观看| 欧美大干日韩| 久久女婷| 男女无套 免费网站| 99国产精品久久久久久久成人热| 国产在线强奸视频| 国产1727欧美| 95人妻爽爽人人做人人澡 | 久99久视频精选| av一区二区三区不卡| 久久手机好看网站| 女同女同恋久久级三级| 后入式五六区| 久久久久骚| 啪啪啪东京| 亚洲午夜精品久久久中文影院| 视频二区美腿丝袜制服人妻欧美| 中文字幕国产在线天堂| 天天超级碰碰碰| 久久婷婷精品| 免费福利视频中文字幕| 日韩97视频| 99热伊人| 超清福利精品视频在线| 玖玖超碰熟| 国产高清1234区| 国产操操日韩三级黄| 99夜夜操| 婷婷另类小说| 男人天堂婷婷五月天校园春色| 亚洲熟女乱色一区二区三区| 日夜尻逼网| 99国产精品人妻人伦| 国产精品精品系列在线观看| 久久久久9| 老女人爆菊| 国产福利视频精品视频| 老熟女综合网| 2017大香蕉国产精品久久| 久久乐| 欧美强奸乱能| 亚洲成人福利电影免费| 久久五月丁香| 八人操人人摸人人看| 天天久久| 大香蕉综合| 久久国产视频性吧| 操逼操逼视频操逼| 欧美日韩黄片精品在线| 麻豆精品.欧美精品.日韩精品.| 日日骚精品视频| 91在线免费观看处女| 久操热| 在线观看AV片| 电家庭影院午夜69久久夜色精品国产69乱 | 少妇内射www在线观看视频| 色婷婷五月天| 巨爆乳肉感一区二区三区竹菊影视 | 色情乱伦AV| 久久无码成人| 成年人网站在线免费观看| 欧美性高潮| 欧美日韩亚洲少妇寂寞影院正在播放 | 精品久久久久,69国产成人精| 少妇干B| 夜草网站| 91丝袜在线观看| 亚洲成人在线乱码色午夜| 俞拍自拍| 色超碰综合| 青青欧洲黑| 日韩精品第3页| 国产精品高潮久久AV| 婷婷三区| 丝袜综合色图| 九九英色视频| 丁香色色网| 婷婷五月天网| 五月丁香综合激情| 美女黄色一级A视频| 色综合色综合网| 99久久网站| 欧美在线干| 男人天堂一区二区| 日本欧美成人片AAAA| 国产精品一二三免费网站| 九色PORNY9l原创自拍| 五月丁香在线| 天天流夜夜操| 婷婷丁香成人| 五月开心网| 黄色欧美性爱视频| 3p国产色噜噜一区| 影音先锋国产精品| 玖玖综合.com| 中文字幕视频一区视频二区| 亚洲自拍欧美国产首页网曝 | 人妻欧美| 波多野结衣之双飞调教在线播放 | 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 欧美激情视频一区二区三区不卡| 爽爽淫人网| 一区二区三区日韩欧美| 青青草啪啪网| 大香蕉日亚洲日本亚大| 2020天天色综合| 久久九色| 欧美呦呦性爱| 美女黄频a美女大全免费皮| 国产 丝袜 欧美中文 另类| 久久精品国产精品亚洲艾通辽熟妇| 99re9在线| 丝袜亚洲91| 亚洲色图欧美色图综合| 国产精品高潮久久久无码| 啪啪啪精品| 色色激情五月天| 97综合在线观看| 97视频在线视频| 欧美色97| www欧美91| 密乳AV免费观看| 色yeye成人免费视频| 奸色色 男人天堂 天天射| 大香网伊人久久综合网eew| 肥佬影院91| 懂色中文一区二区三区| 五月丁香成人网| 97在线欧洲| 热热色91| 国产毛片在线| 欧美天天拍| 人妻少妇精品久久久| 懂色Av一区二区三区| 久草免费在线视频| 日韩电影在线观看网址| 26uuu国产成人综合| 曰韩精品九九无码| 欧美视频第二页| 熟妇无码视频三区| 色屁屁影院www国产| 国产AV高清AV无码| 久久蜜桃综合网| 亚洲情色视频| 影音先锋乱| 亚洲和欧美裸体美女双飞视频| 大香交| 亚洲爽图| 精品黑人一区二区| 丝袜性亚洲| 1024精品在线| 秋霞一级视频在线观看免费| 久久av色| 丝袜足交视频| WWW黄片COM| 九九九草| 日本操逼视频不卡直接放| 中文字幕91综合| 欧美精品欧美精品系列| 中国一级αV| 天天色播| 97ai亚洲| 在线精品福利免费播放| 老师充足的奶水小说| 综合97| 超碰97爽| 香蕉99秘 一区精品蜜桃臀| 大香蕉综合| 亚洲日韩久久精品一区| 一级二级三级黑人无码| 国产视频一区二区在线| 999综合网| 亚洲最大无码中文字幕网站| 熟女精品一区二区在线观看| 久久精品店| 亚洲天堂综合AV| 亚洲色图日韩丝袜制服一区二区五月在线| 国产成人精品无码久久| 91男同| 国产极品美女高潮无套在线观看| 青青欧洲黑| 五月婷婷六月丁香网址| 欧亚不卡| 无码区蜜乳| 97视频新免费| jizzjizz欧美| 久热网| 欧洲熟妇xxXx欧美老妇裸体| 欧美97网| 丁香五月电影| 97色碰| 中文字幕一二三区| 成全在线观看免费观看| 好好的日:com久久九九| 亚洲综合影院| 操婷婷逼| 成人青青草原伊人| 福利在线观看一区二区| 天美av在线| 深田咏美亚洲精品福利社| 欧美亚洲韩国视频十五区| 婷婷在线播放| 老熟女综合| 97操97色| 国产一区二区三区视频在线看| 久久久久久久9最新免费视频观看| 色婷婷激一区二区三区 | 性爱视频无打码在线观看| 青青草色插素人| 激情熟女12P| 久草婷婷| 国产久久免费精品视频| 欧美香蕉视xxx| 在线看的av| 啊啊好多水| 久久9视频| 日韩操p| 老鸭窝日丰县女人| 久久6热视频免费观看| 亚洲熟女一区二区| 久久超碰亚洲人| 色视频蜜乳| 偷拍片久久| 一本久道久久综合狠狠爱| 正在播放国产精品一区| 欧洲综合视频| 人人操肉肉| 女色综合| 91爱欧美| www.狠狠操| 97人人夜夜精品视频| 国产久久天堂资源| 久久久久ab| 91一区二区| 久操网视频| 偷拍盗拍亚洲色图图片| 在线强奷到舒服的无码视频 | 台欧久久精品视频| av绯色| 青青在线视频日韩欧美| 综合av影片| 亚洲日韩青青草色月| 翔田千里AⅤHD无码| 欧美综合中文| 91精品免费| 国模限制级电影| 亚洲国产精品99久久久| 啊啊啊好大好深| 欧美第二页午夜| 色综合中文字幕不卡| 欧美大香蕉专区网| 色婷婷一区二区三区久久| 操曰本熟女| 啪啪视频mP4| 国产成人久久久精品免费AV| 一本久道在线综合视频| 超碰97亚洲| 97超碰伊人| 久久99精品国产| 91狠狠综合久久久久久| 色综合五月天| 日韩不卡毛片Av免费高清| 亚洲图片日本AⅤ欧美在线| 亚洲,欧美,综合网| 综合天天网| 超碰爽人妻熟女Av| 中文字幕永久在线| 日本一本道A级黄色毛片试看60分钟| 人人搞人人插人人操| 人妻精品一区二区全免费| 中文字幕国产| 蜜臀久久99精品久久久久久无删减 | 国产二区三区粉嫩在线| 久久久久一本一区二区青青蜜月| 91 亚洲 欧洲| 五月婷婷六月色| 第一高清av中文字幕| 日韩欧美成人性爱在线| 日韩中文字幕人妻视频| 91M一社| 色哟哟av| 蜜屁av| AV有码在线| 97精品一区| 欧美亚洲色的图| 欧美97免费| 手机在线大香蕉| 久久国产精品一区二区| 99re久久| 老司机香蕉久久久久| 欲综合网| 男人的天堂99| 欧色网址| 亚州综合色| 性久久久| 99国产在线 精品 视频|