欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

SpringBoot+Vue全棧實(shí)現(xiàn)自習(xí)室預(yù)約管理系統(tǒng):從需求到部署

SpringBoot+Vue全棧實(shí)現(xiàn)自習(xí)室預(yù)約管理系統(tǒng):從需求到部署 自習(xí)室預(yù)約這套題說實(shí)話已經(jīng)被做成“畢業(yè)設(shè)計(jì)常青樹”了。但凡帶點(diǎn)管理系統(tǒng)的課設(shè)、畢設(shè)十有八九繞不開這個(gè)選題。我這次做的就是一個(gè)基于SpringBootVue的MVC架構(gòu)自習(xí)室管理和預(yù)約系統(tǒng)技術(shù)棧落在JavaMySQLMyBatis上屬于典型的全棧分離項(xiàng)目。整個(gè)系統(tǒng)拆成用戶端和管理端兩套界面用戶在手機(jī)上或者瀏覽器里能看到自習(xí)室列表、樓層分區(qū)、座位占用情況選個(gè)座位預(yù)約一段時(shí)間管理員在后臺(tái)維護(hù)自習(xí)室、座位、預(yù)約規(guī)則還能看統(tǒng)計(jì)報(bào)表。這篇文章我就按自己做這個(gè)項(xiàng)目的完整過程來寫從需求拆解、技術(shù)選型、數(shù)據(jù)庫設(shè)計(jì)到后端接口、前端交互、部署運(yùn)行再到我實(shí)際踩過的坑都會(huì)交代清楚。適合正在做課設(shè)/畢設(shè)、想復(fù)現(xiàn)一個(gè)完整前后端分離項(xiàng)目的同學(xué)參考也適合想入門SpringBootVue全棧開發(fā)的人照著搭一套練手。源碼層面我會(huì)把關(guān)鍵代碼片段貼出來不是那種“只給目錄不給細(xì)節(jié)”的分享。1. 項(xiàng)目到底要解決什么問題1.1 自習(xí)室預(yù)約的核心痛點(diǎn)學(xué)校或者社會(huì)自習(xí)室的座位資源看起來是“公共的”但實(shí)際運(yùn)營起來全是問題。最常見的場景就是考研季、期末周座位嚴(yán)重不夠用第二天一早門口排隊(duì)搶座甚至有人拿書占座幾天不來。反過來非高峰期大量座位空著資源閑置。自習(xí)室管理員也很頭疼紙質(zhì)登記本翻起來麻煩誰占著座位、什么時(shí)候走完全靠人肉盯。這個(gè)系統(tǒng)的核心價(jià)值就是把“座位狀態(tài)數(shù)字化”。每一張座位在系統(tǒng)里都有明確狀態(tài)空閑、已預(yù)約、已簽到、暫離、禁用。用戶預(yù)約之前一眼看清哪些座位能用預(yù)約之后到現(xiàn)場簽到入座離開時(shí)釋放座位。管理員不用再跑現(xiàn)場后臺(tái)就能看到實(shí)時(shí)占用率還能設(shè)置每個(gè)自習(xí)室的開放時(shí)段、預(yù)約時(shí)長上限。本質(zhì)上這就是一個(gè)帶時(shí)間維度的資源管理系統(tǒng)和會(huì)議室預(yù)約、健身房場地預(yù)約的邏輯是相通的。1.2 功能拆解與用戶角色設(shè)計(jì)用戶角色我分成三類普通學(xué)生用戶、管理員、超級管理員。沒有做“教師”角色因?yàn)樽粤?xí)室場景里教師通常只參與審批或者設(shè)備管理沒必要為了湊功能硬加。普通用戶側(cè)的關(guān)鍵功能注冊登錄、個(gè)人信息維護(hù)查看自習(xí)室列表按樓棟、區(qū)域篩選查看每個(gè)自習(xí)室的座位圖區(qū)分不同座位狀態(tài)預(yù)約座位選擇日期和起止時(shí)間簽到入座、暫離、釋放座位查看自己的預(yù)約記錄、違規(guī)記錄管理員側(cè)的關(guān)鍵功能自習(xí)室管理新增、編輯、啟停用座位管理批量生成座位、設(shè)置座位類型靠窗/普通/帶電源、禁用某個(gè)座位預(yù)約規(guī)則管理設(shè)置可預(yù)約天數(shù)、單次最長時(shí)長、簽到時(shí)限預(yù)約記錄查詢與統(tǒng)計(jì)導(dǎo)出表格用戶管理封禁、解封、重置密碼開發(fā)展示中最容易被問的就是“這個(gè)系統(tǒng)有什么亮點(diǎn)”。我當(dāng)時(shí)給出來的方案是“座位狀態(tài)實(shí)時(shí)同步預(yù)約沖突兜底”。也就是用戶在選座時(shí)看到的座位狀態(tài)是準(zhǔn)實(shí)時(shí)的提交預(yù)約時(shí)后端再做一次防沖突校驗(yàn)避免兩個(gè)人同時(shí)鎖到同一個(gè)座位。2. 技術(shù)選型與架構(gòu)設(shè)計(jì)思路2.1 為什么是SpringBootVue這套組合先說后端。SpringBoot在這個(gè)場景里幾乎是無可爭議的選擇原因很簡單內(nèi)嵌Tomcat不需要額外部署Web容器自動(dòng)配置把大量樣板代碼省掉生態(tài)成熟社區(qū)資料多遇到問題基本都能搜到答案。相比之下如果再用傳統(tǒng)的SSHSpringStrutsHibernate那一套光是寫各種XML配置就能勸退一堆初學(xué)者。我用的版本組合比較穩(wěn)SpringBoot 2.7.x JDK 1.8 MySQL 5.7/8.0 MyBatis 2.x。為什么要鎖這個(gè)版本因?yàn)镾pringBoot 3.x強(qiáng)制要求JDK 17而且部分老項(xiàng)目用的MyBatis、PageHelper插件在3.x下需要額外適配如果你照著網(wǎng)上的教程抄作業(yè)大概率會(huì)踩版本不一致的坑。所以我的建議是除非你有明確理由否則畢設(shè)/課設(shè)別追新版本。前端選Vue就更好理解了。Vue 2.x Element UI是當(dāng)前中文社區(qū)里資料最多、最穩(wěn)定的組合Vue 3 Element Plus雖然新但有些組件用法變動(dòng)比較大網(wǎng)上的老舊教程容易誤導(dǎo)。我這次用的是Vue 2.6 Element UI 2.15配合vue-router和axios足夠支撐這種后臺(tái)管理用戶選座的場景。2.2 MVC分層在后端怎么落地標(biāo)題里特意提到MVC這個(gè)必須解釋清楚。MVC本身是一個(gè)設(shè)計(jì)思想不是一套固定框架。我后端的代碼結(jié)構(gòu)就是按照Controller、Service、MapperDAO三個(gè)層次來的Model用實(shí)體類和VO來表現(xiàn)。典型的調(diào)用鏈路是這樣的瀏覽器發(fā)起請求到Controller層Controller負(fù)責(zé)參數(shù)接收、簡單校驗(yàn)然后調(diào)用Service層Service層處理業(yè)務(wù)邏輯比如校驗(yàn)預(yù)約沖突、計(jì)算座位狀態(tài)Service調(diào)用Mapper接口Mapper對應(yīng)XML里的SQLMySQL返回結(jié)果Mapper映射成實(shí)體類經(jīng)過Service組裝成VO最后由Controller返回JSON給前端這樣的分層好處很明顯至少有三點(diǎn)各層職責(zé)單一代碼可讀性好。別人拿到項(xiàng)目不需要翻完整套代碼只看Controller就知道系統(tǒng)提供了哪些接口。Service層獨(dú)立后業(yè)務(wù)規(guī)則可以單獨(dú)做單元測試。比如預(yù)約沖突檢測這種核心邏輯不依賴Controller和前端就能跑通。后期替換技術(shù)方案更方便。比如把MyBatis換成MyBatis-Plus或者把MySQL換成PostgreSQL底層影響可以被控制在Mapper層。實(shí)體類這塊我做了一個(gè)區(qū)分?jǐn)?shù)據(jù)庫表對應(yīng)的叫Entity接口返回前端的叫VO前端提交參數(shù)用DTO。之前的項(xiàng)目吃了不區(qū)分的虧查了一個(gè)用戶信息順便把密碼hash也返回了前端雖然前端不顯示但這事很不專業(yè)。2.3 前端Vue項(xiàng)目的目錄組織Vue項(xiàng)目不是簡單的“一個(gè)頁面一個(gè)組件”就完了。我按功能模塊拆分成view頁面級組件和component可復(fù)用組件兩大類。src/apiaxios請求封裝按模塊拆分成user.js、seat.js、reservation.jssrc/router路由配置文件區(qū)分需要登錄的頁面和不需要登錄的頁面src/storeVuex存放用戶登錄信息、當(dāng)前選中的自習(xí)室狀態(tài)src/views頁面級組件比如Login.vue、SeatMap.vue、Admin/ReservationManage.vuesrc/components通用組件比如座位格子SeatItem.vue、分頁組件封裝的PaginationTable.vue實(shí)際開發(fā)中很多初學(xué)者會(huì)把所有邏輯全部塞進(jìn)一個(gè)頁面組件幾百行代碼堆在一個(gè)Vue文件里后面想改一個(gè)選座邏輯都要翻半天。我這次強(qiáng)行把座位圖抽成了獨(dú)立組件狀態(tài)由父頁面?zhèn)魅虢换ネㄟ^事件回調(diào)這樣座位圖組件可以單獨(dú)測試也能復(fù)用到管理端的座位預(yù)覽功能里。3. 數(shù)據(jù)庫設(shè)計(jì)預(yù)約系統(tǒng)的命門3.1 核心表結(jié)構(gòu)設(shè)計(jì)數(shù)據(jù)庫設(shè)計(jì)是這種系統(tǒng)里最考驗(yàn)功力的部分。表設(shè)計(jì)不好后面寫業(yè)務(wù)代碼就是連環(huán)坑。我規(guī)劃了這幾張核心表sys_user用戶表字段包括id、username、password、real_name、role、status、create_timestudy_room自習(xí)室表字段包括id、name、location、floor、open_time、close_time、status、capacityseat座位表字段包括id、room_id、seat_no、type、position_x、position_y、statusreservation預(yù)約記錄表字段包括id、user_id、seat_id、room_id、reserve_date、start_time、end_time、statusviolation_record違規(guī)記錄表記錄超時(shí)未簽到、超時(shí)未釋放等情況用戶表里role字段我直接用的字符串USER、ADMIN、SUPER_ADMIN。也有人用int類型再在代碼里映射枚舉我個(gè)人覺得字符串更直觀查數(shù)據(jù)庫的時(shí)候一眼能看懂也不容易被數(shù)字映射搞糊涂。座位表里的position_x和position_y是干嘛的這是為了前端渲染座位圖準(zhǔn)備的。每張座位在自習(xí)室的平面圖里有一個(gè)坐標(biāo)前端拿到數(shù)據(jù)后可以直接按坐標(biāo)渲染到對應(yīng)位置比后端拼接好HTML再返回強(qiáng)多了。當(dāng)然純粹做簡單系統(tǒng)也可以讓前端寫死布局但那樣教室里臨時(shí)加把椅子就得改代碼。3.2 預(yù)約時(shí)間沖突的處理思路預(yù)約系統(tǒng)的核心難點(diǎn)不是CRUD而是“同一座位同一時(shí)間段不能被兩個(gè)人預(yù)約”。這個(gè)沖突檢測我一開始想用純SQL來做后來發(fā)現(xiàn)反而復(fù)雜干脆在Service層加鎖校驗(yàn)。邏輯是用戶提交預(yù)約時(shí)后端根據(jù)seat_id和reserve_date去查已經(jīng)存在的預(yù)約記錄只要新預(yù)約的時(shí)間段和已有記錄存在重疊就拒絕。SQL大概是這樣的select idselectConflict resultTypejava.lang.Integer SELECT COUNT(*) FROM reservation WHERE seat_id #{seatId} AND reserve_date #{reserveDate} AND status IN (BOOKED, CHECKED_IN, AWAY) AND NOT ( #{newEndTime} lt; start_time OR #{newStartTime} gt; end_time ) /select這里的時(shí)間重疊判斷就是兩個(gè)區(qū)間的交集判斷新預(yù)約開始時(shí)間不早于已有記錄的結(jié)束時(shí)間或者新預(yù)約結(jié)束時(shí)間不晚于已有記錄的開始時(shí)間才算不沖突。反過來只要兩個(gè)時(shí)間段存在任何交叉區(qū)域就說明有人占用了。只做查詢校驗(yàn)還不夠。兩個(gè)請求同時(shí)提交理論上都能通過校驗(yàn)然后都插入成功這就產(chǎn)生了并發(fā)問題。解決辦法一個(gè)是給座位加行鎖用SELECT ... FOR UPDATE把座位記錄鎖住再校驗(yàn)另一個(gè)是對reservation表加唯一索引配合狀態(tài)字段。我最終采用的是“事務(wù)座位行鎖”的方案這也是商用系統(tǒng)中比較穩(wěn)妥的做法。3.3 索引設(shè)計(jì)索引不是用來炫技的而是要命中實(shí)際查詢場景。這個(gè)系統(tǒng)里查詢頻率最高的場景就兩個(gè)用戶查詢自己某一時(shí)間段的預(yù)約記錄按座位查詢某個(gè)日期的預(yù)約占用情況所以我在reservation表上建了兩個(gè)復(fù)合索引idx_user_time (user_id, reserve_date, start_time)idx_seat_time (seat_id, reserve_date, start_time)建索引的理由很直接預(yù)約記錄表會(huì)越來越大沒有索引的話WHERE user_id ? AND reserve_date BETWEEN ? AND ?這種查詢就是全表掃描數(shù)據(jù)量到幾萬條之后響應(yīng)時(shí)間會(huì)明顯變差。加了復(fù)合索引后查詢可以走索引快速定位排序也順手能利用上索引。再強(qiáng)調(diào)一個(gè)細(xì)節(jié)不要給每個(gè)字段單獨(dú)建索引那樣不但不加速反而拖慢寫入速度。MySQL的索引機(jī)制決定了復(fù)合索引的字段順序也有講究最常用的等值條件字段放前面范圍條件字段放后面。4. 后端核心實(shí)現(xiàn)與關(guān)鍵細(xì)節(jié)4.1 登錄認(rèn)證與用戶上下文登錄這塊我用的方案是JWTJSON Web Token。跟Session那套比JWT最大的好處是無狀態(tài)后端不用存儲(chǔ)會(huì)話記錄橫向擴(kuò)展的時(shí)候不用做會(huì)話同步。對畢設(shè)項(xiàng)目來說前端拿到token后存到localStorage里每次請求在axios攔截器里帶上Authorization頭就行。具體實(shí)現(xiàn)上我用JWT生成token時(shí)把user_id作為payload核心字段。用戶每次請求受保護(hù)接口時(shí)后端攔截器解析token拿到user_id后去redis或者直接查數(shù)據(jù)庫取用戶信息放入ThreadLocal里作為本次請求的用戶上下文。注意我在這里沒有用Spring Security因?yàn)閷ψ粤?xí)室預(yù)約這種場景來說Spring Security的學(xué)習(xí)成本和配置成本有點(diǎn)重。自己寫一個(gè)HandlerInterceptor 自定義注解RequireRole代碼量不大邏輯還更好懂。自定義注解是這樣一個(gè)思路Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface RequireRole { String value() default USER; }在攔截器中根據(jù)Controller方法上的注解判斷當(dāng)前用戶是否擁有對應(yīng)角色。管理端接口標(biāo)記RequireRole(ADMIN)用戶端接口標(biāo)記RequireRole(USER)超級管理員兩個(gè)角色都能訪問。4.2 預(yù)約與取消的核心業(yè)務(wù)邏輯預(yù)約的核心邏輯我在Service里用事務(wù)包裹起來大致流程是這樣的校驗(yàn)用戶是否有預(yù)約權(quán)限是否已被封禁、是否已經(jīng)約了同一時(shí)段鎖定座位記錄SELECT ... FOR UPDATE查詢沖突預(yù)約判斷時(shí)間段是否重疊插入一條預(yù)約記錄狀態(tài)為BOOKED更新座位狀態(tài)為OCCUPIED為什么要先鎖座位再查沖突因?yàn)槿绻绘i并發(fā)場景下兩個(gè)人同時(shí)查到“無沖突”然后都插入成功就出現(xiàn)了超賣問題。鎖座位雖然犧牲了一點(diǎn)并發(fā)量但對于自習(xí)室這種場景完全沒有壓力單把椅子一天最多也就被約幾次沒有效能瓶頸。取消預(yù)約的規(guī)則有個(gè)細(xì)節(jié)距離預(yù)約開始時(shí)間不足30分鐘不允許用戶在線取消必須到現(xiàn)場找管理員操作。這個(gè)規(guī)則在管理端可以配置但默認(rèn)值我是直接寫在Service層常量里。為了這個(gè)規(guī)則我在事務(wù)里能直接判斷當(dāng)前時(shí)間是否滿足條件很快也不用額外設(shè)計(jì)提醒表。流程是刪除或標(biāo)記預(yù)約記錄為CANCELLED同時(shí)釋放座位狀態(tài)。我選擇的是保留預(yù)約記錄、把狀態(tài)改成CANCELLED而不是物理刪除。這樣保留歷史數(shù)據(jù)后面做統(tǒng)計(jì)分析比如“哪些座位最受歡迎”才有數(shù)據(jù)可用。4.3 MyBatis動(dòng)態(tài)SQL與緩存配置MyBatis在這個(gè)項(xiàng)目里承擔(dān)所有數(shù)據(jù)庫訪問工作。我坦白說一開始我也糾結(jié)要不要用MyBatis-Plus因?yàn)樗娴哪苁〉舸罅繂伪鞢RUD代碼。后來考慮到很多課設(shè)答辯的老師要求“使用MyBatis實(shí)現(xiàn)”所以我保留了原生MyBatis的XML寫法把多表查詢和動(dòng)態(tài)SQL都寫清楚了。動(dòng)態(tài)SQL在預(yù)約記錄查詢里特別好用。管理端查詢預(yù)約記錄時(shí)篩選條件可能是“按日期查”“按自習(xí)室查”“按用戶姓名查”也可能全部不選查全量。這種場景用動(dòng)態(tài)SQL最合適select idselectReservationPage resultTypecom.example.entity.Reservation SELECT r.*, u.username, s.seat_no FROM reservation r LEFT JOIN sys_user u ON r.user_id u.id LEFT JOIN seat s ON r.seat_id s.id where if testroomId ! null AND r.room_id #{roomId} /if if testreserveDate ! null AND r.reserve_date #{reserveDate} /if if teststatus ! null and status ! AND r.status #{status} /if /where ORDER BY r.reserve_date DESC, r.start_time DESC /selectwhere標(biāo)簽會(huì)自動(dòng)處理“第一個(gè)條件前面的AND會(huì)被去掉”的問題不用自己手動(dòng)拼接字符串避免SQL注入的同時(shí)代碼也干凈很多。MyBatis的二級緩存我也聊一下。默認(rèn)情況下MyBatis的二級緩存是關(guān)閉的我沒有在全局開啟而是只對seat表的Mapper開了二級緩存。原因很簡單預(yù)約記錄和用戶表的實(shí)時(shí)性要求高緩存命中率低而且一旦數(shù)據(jù)變更還要考慮緩存刷新容易臟讀。座位表相對穩(wěn)定狀態(tài)變更頻率不高開啟二級緩存后可以少打幾次數(shù)據(jù)庫。不過要注意現(xiàn)在很多項(xiàng)目直接用Spring Cache Redis做緩存MyBatis的二級緩存用得少了因?yàn)槎嗉壘彺娴囊恢滦跃S護(hù)成本偏高。4.4 管理端功能實(shí)現(xiàn)管理端的核心功能是自習(xí)室和座位管理我用了一個(gè)比較省事的思路座位批量生成。一個(gè)自習(xí)室可能有幾十上百個(gè)座位一個(gè)個(gè)人工錄入不現(xiàn)實(shí)。我的方案是在新增自習(xí)室時(shí)讓管理員輸入“行數(shù)”和“列數(shù)”系統(tǒng)自動(dòng)生成座位編號例如A01、A02B01、B02并按照坐標(biāo)規(guī)則寫入seat表。這樣既省了管理員的工作量又保證了前端座位圖的位置數(shù)據(jù)是完整的。座位批量生成的核心代碼大致是for (int row 1; row rowCount; row) { for (int col 1; col colCount; col) { Seat seat new Seat(); seat.setRoomId(roomId); seat.setSeatNo(String.format(%s%02d, (char)(A row - 1), col)); seat.setPositionX(col); seat.setPositionY(row); seat.setStatus(FREE); seatMapper.insert(seat); } }管理端還有一個(gè)實(shí)用功能是今日統(tǒng)計(jì)。首頁展示“今日預(yù)約數(shù)”“當(dāng)前在場人數(shù)”“自習(xí)室占用率”。占用率的計(jì)算方式是當(dāng)前已占用座位數(shù) / 總座位數(shù)查詢時(shí)先分組查每個(gè)自習(xí)室的座位總數(shù)再查當(dāng)前狀態(tài)為OCCUPIED的座位數(shù)兩個(gè)數(shù)據(jù)在Service層合并成統(tǒng)計(jì)VO返回前端。5. 前端頁面與交互實(shí)現(xiàn)5.1 Vue路由與頁面結(jié)構(gòu)前端路由用的是Vue Router。路由設(shè)計(jì)上我分了兩層不需要登錄就能訪問的和必須登錄才能訪問的。不需要登錄的路由/login登錄頁/register注冊頁必須登錄的路由放在/layout父路由的children里因?yàn)檫@一部分頁面都有共同的頂部導(dǎo)航和側(cè)邊欄布局。{ path: /layout, component: Layout, redirect: /layout/home, children: [ { path: home, component: Home, meta: { title: 首頁 } }, { path: rooms, component: RoomList, meta: { title: 自習(xí)室 } }, { path: seat-map, component: SeatMap, meta: { title: 選座 } }, { path: my-reservation, component: MyReservation, meta: { title: 我的預(yù)約 } } ] }管理端路由單獨(dú)建了一份掛在/admin下面比如/admin/room-manage、/admin/seat-manage、/admin/reservation-manage。這里要注意的是前端路由的權(quán)限控制只是用戶體驗(yàn)層面的真正的權(quán)限校驗(yàn)必須依賴后端接口。前端不能訪問的頁面只是看不到入口如果直接調(diào)后端接口沒有權(quán)限后端必須返回403。路由守衛(wèi)方面我在router.beforeEach里檢查本地有沒有tokenrouter.beforeEach((to, from, next) { const token localStorage.getItem(token); if (to.meta.requiresAuth !token) { next(/login); } else { next(); } });5.2 座位選座交互選座界面是整個(gè)前端最核心的交互頁面我在設(shè)計(jì)上參考了影院選座、演唱會(huì)選座那一套一個(gè)平面圖座位格子一個(gè)個(gè)平鋪在上面用顏色區(qū)分狀態(tài)。座位狀態(tài)的配色我定的是空閑白色/淺灰色已預(yù)約黃色已簽到綠色暫離橙色禁用深灰色打叉用戶點(diǎn)擊一個(gè)空閑座位后右側(cè)彈出預(yù)約面板選擇日期和起止時(shí)間點(diǎn)擊確認(rèn)后走預(yù)約接口。這個(gè)交互邏輯我封裝在SeatMap.vue里數(shù)據(jù)來源是后端接口返回的座位列表和座位狀態(tài)列表。這里有一個(gè)交互細(xì)節(jié)用戶選中座位后要在前端本地標(biāo)記“正在選中”狀態(tài)但這個(gè)狀態(tài)不能和后端實(shí)時(shí)同步等到真正提交時(shí)才返回給后端。所以為了防止兩個(gè)用戶同時(shí)選同一座位前端顯示的狀態(tài)只能作為參考后端提交時(shí)的沖突校驗(yàn)才是兜底。座位圖渲染的模板大概是div v-forseat in seatList :keyseat.id classseat-item :classgetSeatClass(seat) :style{ left: (seat.positionX - 1) * seatSize px, top: (seat.positionY - 1) * seatSize px } clickhandleSeatClick(seat) {{ seat.seatNo }} /div座位尺寸我固定用44px×44px間距6px這樣一張A4紙寬度的屏幕能放下十幾個(gè)座位體驗(yàn)比較自然。如果自習(xí)室座位特別多還可以在右側(cè)加一個(gè)縮小比例的迷你地圖用于快速定位。5.3 Axios封裝與權(quán)限控制axios不能每個(gè)組件里單獨(dú)引一遍要統(tǒng)一封裝。我在src/api/request.js里做了以下事情創(chuàng)建axios實(shí)例設(shè)置baseURL和timeoutbaseURL指向后端接口地址比如http://localhost:8080/api請求攔截器里從localStorage讀取token放到請求頭響應(yīng)攔截器里統(tǒng)一處理HTTP狀態(tài)碼401跳轉(zhuǎn)登錄頁403提示無權(quán)限500提示服務(wù)器錯(cuò)誤把后端返回的業(yè)務(wù)狀態(tài)碼也做了統(tǒng)一處理比如code500的提示語統(tǒng)一用Element UI的Message組件展示這種封裝的好處是后面如果后端接口地址變了只需要改一個(gè)文件如果后端的鑒權(quán)方式變了比如改為請求參數(shù)攜帶token也只需要改一個(gè)攔截器組件里的業(yè)務(wù)代碼完全不用動(dòng)。6. 從零到一完整部署運(yùn)行步驟6.1 本地環(huán)境準(zhǔn)備先說一下我本地的環(huán)境JDK 1.8如果你是JDK 17也可以跑SpringBoot 2.7但部分老插件可能報(bào)錯(cuò)Maven 3.6MySQL 5.7或8.0Node.js 14Vue 2項(xiàng)目不建議用Node 18會(huì)有兼容問題IDE后端用IDEA前端用VS Code環(huán)境這塊我吃過虧尤其Node版本。Vue 2的老項(xiàng)目用Node 17跑npm install經(jīng)常報(bào)Error: error:0308010C:digital envelope routines::unsupported這是因?yàn)樾掳鍺ode的OpenSSL策略變了。解決辦法要么把Node降級到14/16要么在package.json的啟動(dòng)腳本里加一句NODE_OPTIONS--openssl-legacy-provider。我更推薦前者降級到Node 14一了百了。6.2 數(shù)據(jù)庫初始化數(shù)據(jù)庫這塊我用Navicat新建一個(gè)study_room_db數(shù)據(jù)庫字符集選utf8mb4為什么不用utf8因?yàn)閡tf8在MySQL里是utf8mb3不支持emoji和一些特殊字符雖然系統(tǒng)里不太用emoji但保不準(zhǔn)用戶昵稱里有特殊符號。然后直接執(zhí)行init.sql腳本里面包含建表語句和初始數(shù)據(jù)。初始數(shù)據(jù)至少要有一個(gè)超級管理員賬號admin/admin123兩個(gè)自習(xí)室數(shù)據(jù)每個(gè)自習(xí)室對應(yīng)的座位數(shù)據(jù)我直接用批量插入SQL寫死了幾條演示用的預(yù)約記錄方便前端展示效果關(guān)于賬號密碼我在user表里存的是MD5加密后的值。明說一句MD5現(xiàn)在已經(jīng)不夠安全了真正商用至少要用BCrypt。我這里圖省事用了MD5但代碼里把加密算法抽成了工具類想替換成BCrypt很容易。6.3 后端啟動(dòng)后端項(xiàng)目導(dǎo)入IDEA后第一步修改application.yml里的數(shù)據(jù)庫連接配置server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/study_room_db?useUnicodetruecharacterEncodingutf8mb4useSSLfalseserverTimezoneAsia/Shanghai username: root password: 你的數(shù)據(jù)庫密碼 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity configuration: map-underscore-to-camel-case: truemap-underscore-to-camel-case這個(gè)配置一定要開啟否則數(shù)據(jù)庫字段seat_no映射到Java屬性seatNo會(huì)失敗查詢結(jié)果全是null。這是個(gè)非常典型的新手問題排錯(cuò)能排半天。配置改完后先啟動(dòng)MySQL再運(yùn)行StudyRoomApplication主類。后端啟動(dòng)后瀏覽器直接訪問http://localhost:8080/api/health如果能返回正常結(jié)果說明后端已經(jīng)跑起來了。6.4 前端啟動(dòng)前端項(xiàng)目打開終端按順序執(zhí)行npm install npm run devnpm install如果速度慢可以換成淘寶鏡像源先執(zhí)行npm config set registry https://registry.npmmirror.com再裝。啟動(dòng)后開發(fā)服務(wù)器默認(rèn)跑在http://localhost:8081我特意把端口改到8081避免和后端8080混淆。Vue開發(fā)服務(wù)器的端口可以在vue.config.js里配置module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }這里用proxying而不是直接寫死http://localhost:8080作為baseURL是為了避免開發(fā)階段的跨域問題。瀏覽器訪問8081端口請求通過Vue開發(fā)服務(wù)器轉(zhuǎn)發(fā)到8080同源策略就不會(huì)攔截了。如果不用proxy要么后端配置CORS要么前端調(diào)接口時(shí)直接帶完整地址但會(huì)被瀏覽器攔截所以這個(gè)配置很關(guān)鍵。7. 常見問題與排查經(jīng)驗(yàn)7.1 端口占用與配置不一致啟動(dòng)后端時(shí)最常遇到的報(bào)錯(cuò)就是Web server failed to start. Port 8080 was already in use.端口被占用的原因五花八門可能是你自己之前啟動(dòng)過一次沒關(guān)掉也可能是其他軟件搶占了端口。排查方法Windows下用netstat -ano | findstr 8080查看占用進(jìn)程PID用taskkill /PID 進(jìn)程號 /F強(qiáng)制殺掉或者在application.yml里換一個(gè)端口但我更建議換端口而不是殺進(jìn)程因?yàn)闅⒌舻倪M(jìn)程有可能是別人正在用的服務(wù)。比如你機(jī)器上已經(jīng)跑了一個(gè)Tomcat在8080你非要用8080最好還是改自己的項(xiàng)目端口。7.2 數(shù)據(jù)庫連接失敗排查數(shù)據(jù)庫相關(guān)的報(bào)錯(cuò)幾乎占了新手問題的一半。常見的幾個(gè)Communications link failure這個(gè)報(bào)錯(cuò)十有八九是數(shù)據(jù)庫沒啟動(dòng)或者連接地址寫錯(cuò)。先確認(rèn)MySQL服務(wù)在系統(tǒng)服務(wù)列表里是“運(yùn)行中”然后在命令行用mysql -u root -p直接連一下確認(rèn)賬號密碼沒問題。Unknown database study_room_db這個(gè)就是數(shù)據(jù)庫沒創(chuàng)建或者名字寫錯(cuò)了。去Navicat里看看庫名是不是和url里的一致注意大小寫。The server time zone value ?D1ú±ê×?ê±?? is unrecognized這個(gè)報(bào)錯(cuò)是因?yàn)镸ySQL時(shí)區(qū)設(shè)置問題在url上加serverTimezoneAsia/Shanghai就能解決。如果還報(bào)錯(cuò)就在MySQL的配置文件my.ini里加上default-time-zone 08:00。7.3 跨域問題我用了devServer的proxy方案之后開發(fā)階段基本不會(huì)遇到跨域。但如果你把前端打包成靜態(tài)文件在Nginx里部署或者直接打開dist/index.html跨域問題就會(huì)冒出來。本地開發(fā)時(shí)如果不用proxy就必須在后端加CORS配置。一個(gè)簡單的做法是在Controller上或者全局配置類上加CrossOrigin或CorsFilter。CORS配置時(shí)要指定允許的來源、方法和請求頭不能直接寫*加允許所有請求頭那是懶人配置不嚴(yán)謹(jǐn)。前端部署時(shí)更推薦Nginx反向代理的方式把/api/開頭的請求轉(zhuǎn)給后端服務(wù)。Nginx配置大致是location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }7.4 MyBatis相關(guān)坑MyBatis使用中我踩過最深刻的坑就是“SQL沒有問題但查詢結(jié)果全是null”。這個(gè)我在前面提過就是map-underscore-to-camel-case沒開啟。如果你不喜歡全局開這個(gè)配置也可以在XML里的resultMap里手動(dòng)映射每一列但是那樣的代碼量翻倍不推薦。另外一個(gè)坑是參數(shù)傳遞問題。當(dāng)Mapper接口方法有兩個(gè)或以上參數(shù)時(shí)必須用Param注解標(biāo)注參數(shù)名否則MyBatis不知道#{userId}對應(yīng)哪個(gè)參數(shù)。我見過太多人寫這樣的代碼然后報(bào)Parameter xxx not found的錯(cuò)誤。還有MyBatis的if判斷字符串比較時(shí)寫成if teststatus BOOKED有時(shí)候不生效原因在于MyBatis解析OGNL表達(dá)式時(shí)單引號內(nèi)的內(nèi)容會(huì)被解析成字符而非字符串。正確寫法是if teststatus BOOKED外層用單引號內(nèi)層用雙引號。這個(gè)真是很陰間的細(xì)節(jié)。7.5 預(yù)約并發(fā)沖突實(shí)戰(zhàn)最后說一個(gè)真實(shí)遇到過的業(yè)務(wù)問題。系統(tǒng)上線模擬壓力測試時(shí)兩個(gè)用戶同時(shí)點(diǎn)預(yù)約同一個(gè)座位結(jié)果兩個(gè)都成功了。我排查后發(fā)現(xiàn)問題出在事務(wù)邊界上我第一次把座位狀態(tài)校驗(yàn)放到了事務(wù)外等事務(wù)內(nèi)插入時(shí)才去更新座位中間丟了一個(gè)校驗(yàn)窗口。修正方案是在Service方法上加Transactional進(jìn)入事務(wù)后先執(zhí)行SELECT ... FOR UPDATE鎖定該座位記錄再執(zhí)行沖突查詢和插入操作。加上行鎖之后模擬并發(fā)請求就不會(huì)再出現(xiàn)超賣場景了。這個(gè)問題的通用排查思路就是凡是涉及“資源唯一性”的業(yè)務(wù)座位、庫存、優(yōu)惠券都必須考慮并發(fā)。只有業(yè)務(wù)校驗(yàn)沒有數(shù)據(jù)庫鎖或者唯一約束遲早出問題。8. 項(xiàng)目擴(kuò)展與個(gè)人心得做完這套系統(tǒng)再回頭去看我會(huì)覺得技術(shù)棧本身并不復(fù)雜真正花時(shí)間的其實(shí)是業(yè)務(wù)規(guī)則的設(shè)計(jì)和落地。預(yù)約時(shí)間沖突判斷、簽到時(shí)限、暫離時(shí)長限制每一個(gè)規(guī)則邊界都需要想清楚否則上線之后運(yùn)營人員會(huì)被各種邊界case折磨。很多人以為做一個(gè)管理系統(tǒng)就是增刪改查做完才發(fā)現(xiàn)增刪改查只是最外面一層皮真正的核心在于“狀態(tài)機(jī)怎么流轉(zhuǎn)”“并發(fā)下如何保持一致”“用戶體驗(yàn)怎么做得好”。如果你也正在做類似的系統(tǒng)我的建議是先把業(yè)務(wù)流程圖畫明白把每個(gè)狀態(tài)之間的跳轉(zhuǎn)條件和限制想清楚再動(dòng)手寫代碼。數(shù)據(jù)庫設(shè)計(jì)可以花一整天反復(fù)推敲這比代碼寫了一半再改表結(jié)構(gòu)要?jiǎng)澦愕枚?。這個(gè)項(xiàng)目后續(xù)可以擴(kuò)展的方向也很多。比如加入一個(gè)基于WebSocket的實(shí)時(shí)座位狀態(tài)推送有人釋放座位時(shí)其他在線用戶立刻看到或者引入Redis緩存熱點(diǎn)數(shù)據(jù)減輕數(shù)據(jù)庫壓力再或者把前端升級成Vue 3 TypeScript代碼的可維護(hù)性會(huì)再上一個(gè)臺(tái)階。但這些都是增量優(yōu)化核心骨架不變。最后說一個(gè)實(shí)際開發(fā)里的細(xì)節(jié)我在項(xiàng)目里對所有時(shí)間字段統(tǒng)一用了LocalDateTime而不是Date。這樣在做時(shí)間段比較的時(shí)候比Date要順手很多也避免了時(shí)區(qū)偏移導(dǎo)致的坑。如果你正在選型階段一開始就統(tǒng)一用LocalDateTime能省掉后面不少麻煩。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色吊丝99| 五月婷婷久久爱| 九九99久久| 5月丁香六月婷婷| 99日本黄站| 色五月天综合| 婷婷成人网五月天| 久久精典| 激情床戏| 激情综合在线观看| 9999热在线免费观看| 婷婷丁香五月综合| 日本欧美成人片AAAA| 色色色色色网| 婷婷五月av| 中文人妻主播久久| 久久婷婷五月国产色综合激情| 金品在线视频99| 99热在线观看| 丰满人妻妇伦又伦精品国产| 疯狂做受XXXX高潮A片动画| 蜜桃人妻无码AV天堂三区| 欧美va亚洲va在线播放| 岛国av电影网站| 五月婷婷另类| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 天天射综合网站| 1024你懂的欧美曰韩| 国产超碰在线| 五月天开心成人网| 婷婷六月色丁香视频在线观看| 操日视频| 五月天堂色| 視频福利乱色| 9久热在线视频精品| 婷婷色色丁香| 色久影院| 亚洲欧洲99| 成人视屏在线观看| 九九热亚洲中文在线观看免费| 日本三久久| 色色丁香色五月| 99久久婷婷国产综合亚洲| BBWCUCKOLD精品熟妇 | 九九视频在线| 无码99| 九九在线视频| 欧美槡BBBB槡BBB少妇| 另类小说五月天| 激情五月久久| 激情都市另类| 黄色99热| 国产一级片| 美女黄频aⅴ视频| 99热天堂| 婷婷亚洲五| 婷婷在线播放av| 丁香五月色| 超碰免费在线| 六月激情婷婷综合| 99re在线免费视频| 日本在线视频播放91| 丁香久久九九99| 色五月婷婷激情基地| 91热网址| 久久人妻乱子伦| 国产色色网址网站| 五月婷婷综合精品| 啊V视频在线观看| WWW,五月| 99在线资源视频| 亚洲综合色激情色五月| 五月丁香激| 任你日视频| 婷婷丁香五月天综合AV| 激情五月天色婷婷| 色五月首页| 天天操综合网| 久久精品日| 9月色婷婷| 丁香婷婷性爱| 五月婷婷综合潮喷| 日韩婷婷| wwww.色婷婷| 超碰人人99| 六月婷婷激情| 深爱激情网五月天| 久热久| 免费观看全黄做爰的视频| 热99玖玖99玖玖99九九| 狠狠综合网| 天天在线久久综合 | 亚洲激情电影五月天色婷婷丁香一起草| 五月丁香啪啪激情| 国产免费AV在线| 亚洲色啪| 大香蕉久热| 婷婷五月综合婷婷| 丁香五月先锋| 国产一级黄色影片,| 中文字幕av久久爽一区| 色色草97| 侠女刀之记忆电影在线看免费| 深爱丁香激情| 婷婷六月综合激情| 天天干,天天操,天天射| 丁香婷婷啪啪啪| 五月丁香综合影院| 97luluse| 久婷婷五月丁香在线观看| 久久网思思| 99热新网址| www.超碰97| 色婷婷啪啪啪啪啪啪| 久久久久婷婷五月热综合| 色女伊人| 碰97 久| 五月丁香成人| 五月天播播| 亚洲综合成人网| www. 五月. com| 99热九九这里只有精品10| 深爱激清网| 另类激情中文| 五月婷婷久久大香蕉| 激情婷婷五月黑人| 激情五月天网| 久久激情五月| 狠狠爱五月婷婷| 五月丁香六月情| 久9精品| 99久久人人| 色婷婷香蕉| 五月天狠狠干| 亚洲五月六丁香激情| 天天日天天插| ww超碰在线| 开心婷婷五月激情网小说| 综合网视频| 天天色天天操天天射| 骚五月婷婷| 亚洲五月丁| 99热在这里只有精品| ww超碰在线| 五月花成人网| 国产成人精品一区二三区熟女在线| 99视频在线播放大全| 五月开行婷婷色五月| 激情五月婷婷视频一区二区三区| 91精品久久久久久77777| 激情五月天电影| 无遮羞AV| 亚洲色综合性| AV在线不卡网站| 99热精品综合| 91久久久久久久久久18| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 亚洲中文字幕av| 欧美色宗和激情| 99国产在线| 啪啪日本欧美| 五月天婷婷丁香六月| AA片在线观看视频在线播放| 成人狠狠成人狠狠成人狠狠成人狠狠 | 婷婷五月电影| 五月丁香激情综合网| 亚洲啪视频| 六月婷婷久久| 天天日天天舔天天摸| 久热九九| 5月婷婷视频网站综合| 九九色婷婷| 久青操| 日本久久人| 亚洲操B视频| 婷婷色色婷婷| 九九黄色网| 99热九九热| 久久色五月天| .青娱乐天天操B| 亚洲99手机免费看视频| 9色在线视频精品观看| 男人的天堂五月丁香| 思思热99er| 天天色域综合网| 欧美碰碰| 九九久久精品| WWW.开心五月天.COM| 色婷婷呢狠禁久禁| 日本色色网站| 天天天天天色| 精品亚洲日韩99欧美片| 97色色色色色| 婷婷六月花| 国产91在线视频| se影音资源在线观看| 99热第一页| 久久婷婷婷| 色色网站| 丁香五月五月婷婷五月天激情四射| 天天爱天天天射AV| 色久影院| 丁香色播五月天| www.ywav| 夜夜撸夜夜骑| 五月六月伦理| 成人色站,在线视频,看片-SS1AV| 啪啪操网| 这里只有精品久久| 久久婷婷五月| 色婷丁香五月| 99九九热视频| 欧洲电影在线观看免费版英语版| 五月天婷婷在线播放| 日本一毛片| 色99在线视频| rr天天操| 思思99精品视频在线观看| 草草色情综合网| 无码髙清| 视色综合| 凹凸7777操操操| 9视频在线成人网站| 久久五月天色婷婷| 俺去也在线视频| 天天肏高清在线| 26uuu国产| 色综合久久88色综合天天99| 日日夜夜青青草| 激情啪啪五月天| 五月花激情| A久网| 99在线热| 91se在线观看| 伊人久久丁香狠狠婷婷综合香蕉 | 激情五月份婷婷| 97操碰| 激情欧美五月丁香| 婷婷五月丁香五月天| 亚洲AV中文在线| 丁香五月天堂婷婷| 综合99在线| www.久久久久久久久久久| 五月丁香六月色| 天天透天天爱| 精品,99| 久久精品色| av在线不卡播放| 国产精产国品一二三在观看| 激情久久久| 深情五月天| 99在线观看免费精品视频| 久一网站| 99日视频在线| 婷婷激情五月天激情小说| 激情五月天丁香| 婷婷五月天AV在线| 婷婷综合在线| 这里只有精品免费| 久久这里有精品视频| 久久aaa| 99九九99九九九视频精彩| 久久综合五月天激情小说网站| 99热精品中文字幕| 国产激情视频在线观看| 96精品久久久久久久久| 色色色在线观看| 五月天 另类图片| 激情婷婷综合| 狠狠色丁香婷婷基地| www.色婷婷| 欧洲亚洲午夜| 一级性感黄色内射视频| www.五月婷婷.com| 91玖玖| 天堂色色色| 天天色天天| 色综合日日| 米奇激情婷婷| 激情小说之五月| 五月婷婷开心爱| 无码色色色色色| 91色综合网| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 97碰啪啪| 色五月av| 亚洲成av人影院| 色区久久| 久久AV无码精品人妻系列试探| 亚洲精品99| 人人爱国产| 99精品亚洲| 亚洲成人免费电影| 欧美电影在线播放| 天天爱天天天射AV| 欧洲区自拍| 成人短视频免费观看| 中文字幕精品推荐免费在线观| 天堂二区| 色99色| 天堂色婷婷| 色综合久久88色综合天天99| 看黄的网站18禁| 六月婷婷无码| AV天堂婷婷五月天| 五月婷婷深深爱| 久re热视频| 欧美 日韩 成人在线| 婷婷综合精品| 另类少妇人与禽zOZZ0性伦| 202丰满熟女妇大| 亚洲欧洲中文日韩久久AV乱码| 色噜噜狠狠色综无码久久合欧美| 91操女| 铁牛TV人妻| 日本啪啪网| eeuss人妻| 日本婷婷丁香五月| 26uuu精品一区二区| 色色99| 亚洲午夜av| 久久亚洲婷婷| 91精品视频男人的天堂| 久久99婷婷| 激情五月激情综合俺也去婷婷小说| 久久99热这里只有精品23| 亚州视频九九99| 丁香婷婷色五月| 久久艹99| 婷婷五月天A V| 99视频91| 亚洲激情99| 人人草人人爱手机视频看看| A片一曲| 中文字幕人成乱码在线观看| www.com.色色| 丁香五月激情欧欧美| 久久人妻视步| 五月丁香| 中文字幕激情综合| 五月天色导航| 婷婷精品免费久久| 日本在线观看aaa 99| 青青草色在线视频观看| 五月婷婷五月天亚洲无码| 久热超碰91| 婷婷五月天在线观看| 偷拍99在线视频观看| 五月婷婷狠狠干| 色欲丁香久久| 亚洲成人综合在线| 91人人爽人人操| 狠狠大香婷婷爱| 五月天影院| 九九热欧美| 大香蕉在线99热| 天天肏在线观看| 精品三区影院| 亚洲无码色| 超碰网站在线观看| 五月天电影网| 天天插天天射| 日本色婷婷| 色色色色av色色色色| 99这里只有精品|v| 99九九在线精品热动漫| 五月天综合视频| 99热精品在线观看| 色婷婷影院| 综合在线色婷婷| 丰满人妻妇伦又伦精品国产 | 不卡的AV网站| 玖月婷婷爱丁香| 夜夜操狠狠操| 69人人操人人爽| 日本色婷婷综合| 性热视频99精品| 99热国产在线| site:publishdd.com| 99视频在线精品免费观看2| 久久婷婷色综合老司机| 激情婷婷网| 丁香网站| 九九九九九无码| 91玖玖| 97碰在线免费观看| 日本五月天激情| 91精品刘玥| 婷婷色天香| 大香蕉九九| 日本精品干| 思思热久久久在线| 丁香六月丁香婷婷激情 | 伊人婷婷五月天| 九九综合网色全集| 五月天国产| 日韩精品在线观看9| 五月婷婷伊人网| 99ER热精品视频| 99色这里| 丁香五月性爱| 色色亚洲无码| 一本道在线电影| 久热久色| A片试看50分钟做受视频| 天天综合网、天天综合色| 99九九在线| 婷婷五月天丁香社区| 欧美性丁香色色五月天干干| 日韩情色在线观看| 丁香婷婷色五月激情综合| 国产婷婷久久| 丁香婷婷五月色成人网站| 欧美婷婷精品激| 五月天成人在线视频网站| 99热久久日本| 日本久热| www.99热国产| 热99玖玖99玖玖99九九| 综合色激情| 另类图片五月激情| 五月天丁香综合久久国产| 色欲婷婷五月天丁香| 蜜臀99精品| 91黄操| 这里只有精品视频99| 欧美噜噜噜草| 荫道BBWBBB高潮潮喷| 艹| 99国产99| 国产精品视频| 六月婷婷五月丁香首页| 五月婷婷丁香91| 天天操电影院色狼性av| 九热免费视频| 久久久免费精彩视频| 婷婷五月天在线综合导航| 97热91| 婷婷五月激情天| 色五月婷婷1| 激情久久综合| 六月丁香婷婷天堂| 大香蕉人在线65| 久久大香蕉| 99视频地址| 婷婷丁香九色| 成人网站免费在线播放| 这里只有视频精品| WWW.HENHENL.| 91Chinese在线| 亚洲综合网激情五月天| 丁香狠狠操| 婷婷丁香色五月| 色婷婷丁香五月高清在线| 在线五月婷| 精品久久久999| 久久人妻爱爱| 热久69| 97香蕉碰碰人妻国产欧美| 久久五月天激情视频| 99色在线免费观看视频| 色播综合| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 91狠狠综合久久久| 婷婷五月天综合久久日| 99热99干| 婷婷五月视频| 一夜福利不卡| 国内一级精品| 久久您您综合网| 青青草轻轻操| 九九久久视频| 色五月婷色彩免播放器| 婷婷综合在线视频| 久久久天堂国产精品女人| 日本女人久久| 五月丁香无码视频| 狠狠夜夜五月丁香| 婷婷综合视频| 五月色婷婷夜色| 97干在线视频| 久婷久婷| 婷婷五月天偷拍| 五月丁香婷婷综合| 天天天天干| 亚洲AAAA网| 97色干| 日本情色一区二区| 丁香五月-激情综合| 97在线碰| 91人操人人人操人| 九九视频这里只有精品| 五月婷婷综合色拍| 色五月丁香总合网| 级情九色| 99热新网址| 亚洲成人电影在线免费观看| A片试看50分钟做受视频| 日韩久热| 成人电影AV在线观看| 婷婷.com| 午夜做爱影院| 天天爽夜夜爽| 丁香五月欧美色综合| 美女va| 另类激情五月| 超碰在线观看9| 亚洲9久久精品| 疯狂做受XXXX高潮A片| 六月婷婷综合| 五月婷婷黄色| 久久性视频| 久久最新色| 激情五月婷婷视频一区二区三区| 日韩精品二三区| 五月婷婷免费| 九九久久综合网站| 六月丁香婷婷在线波多| 91小黄书网址在线观看| 久久久久99精品成人片| 人人综合五月人人婷婷| 成人狠狠成人狠狠成人狠狠成人狠狠 | 99色在线观看| 婷色五月| 丁香午月AV中文字幕| av在线观看免费| 操人久久| 91丨九色丨大屁股| 五月丁香网视频| 九九碰九九爱97| 久久久18| 天天骑日日爽| 精品视频99看在线视频| 久久五月丁香六月婷| www色婷婷久久综合久色| 亚洲思思热久| 热久久77777| 日韩精品AV一区二区三区| www.色综合| 天天综合色| 国产午夜精品AV一区二区麻豆| 超碰av在线| 天天爽天天操| www.第四色99| 97久久五月丁香婷婷| 国产视频福利| 69热在线| 久久成人精品视频| 色日本五月天| 玖玖无码中文| 天天干,夜夜爽| AA片在线观看视频在线播放| 玖玖婷婷五月天毛片| 国产亚洲成人综合| 五月天丁香婷| www久久五月com| 狠狠干总合| 天堂AV在线看| 98色花堂98t.R| www.色婷婷| 中文字幕按摩做爰| 九月婷婷人人操人人舔人人爱| 麻豆123区| 国产日韩av片| 亚州精品色情在线观看| 五月天综合影院| 久久激情天堂| 五月天婷婷色| 91九九精品| 亚洲另类婷婷综合| 日日射天天射| 天堂中文国产| 黑人巨粗进入警花疼哭A片| 色情网综合| 99在线资源| 天堂爱爱| 五月综合在线| 天天爽天天| 97色一二三| 99在线热| 26uuu亚洲欧美| 精品99在线| 亚洲中文字幕在线观看| 激情婷婷网| 亚洲区,视频区,视频区免费| 99爱无码| 婷婷五月色播放| 婷婷碰碰| 可以免费观看的av网址| 综合五月丁香六月婷婷| 五月丁香亭亭| 中文字幕性爱视频| 六月婷伊人| 香蕉人在线香蕉人在线 | 日本三级日本三级99| 99久久五月婷婷| 欧美五月丁香啪啪响视频| 婷婷亚州综合| 丁香五月天色| 六月婷婷久久| 婷婷丁香五月天之开心少妇| 五月丁香六月综合情在线观看| 久热精品视频| 久久99网站| 五月丁香在线观看99| 日本va欧美va精品发布视频| 91大神操美女| 99ri视频在线观看| 婷婷激情综合网| 国产 亚洲 在线| 991自拍视频| 五月丁香怕怕综合| 久久新地址| AV大片在线观看| 一本久久亚洲五月婷婷| 色三级色三级| 无码A片一区二区免费| 天天模,夜夜模夜夜爽| 在线播放中文字幕| 国产视频福利| 五月婷婷六月丁香综合| 丁香五月天AV在线 | 热久91| 伊人婷婷激情| 日本99热| 无码se| 秋霞成人毛片一级A片| 五月丁香婷婷色播无码| 五月天激情小说婷婷基地| 色欲人妻综合aaaaaaaa网| 色色色热| 操操熟女| 色婷婷五月中文字幕在线dvd| 国产国产乱老熟女视频网站97| 大香蕉九九| 殴美激情综合网| 欧美激情久| 日韩精品二三区| 天堂久久丁香| 九九成人精品| 精品香蕉99久久久久网站 | 午夜爱爱爱成人| 97人人射| 婷婷丁香六月影视| 99精品偷自拍| 激情五月天之五月婷婷| 大香蕉人妻| 99精品无码视频| 99综合视频| 天搞天天天天天| 九九热精品| 五月天堂婷婷| 亚洲丁香花色| 成人噜噜网| 五月色婷婷综合| 五月开心婷婷网| 大香网伊人久久综合| 狠狠久久婷五月| 九九99在线免费在线观看视频| 天天射美女| 欧美日韩成人在线| 二人电影免费版在线观看| 激情婷婷五月天| 久久老码第一| 日韩色色色色| 丁香六月婷婷综合在线| AVV黄| 国产午夜精品一区二区| 超碰激情网| 99性爱| 嫩草综合网| 影音 五月 婷婷 久久| 99综合一区| 综合 蜜月 婷婷| 婷婷五月天av| 思思热天天看| 久草婷婷网 | www.99久久久久99| 丁香激情久久| 婷婷九月激情| 久草婷妨| www.色综合.com| 九九成人精品免费视频| 亚洲愉拍99热成人精品| www天天爽| 综合久久高清| 99热这里只有精品99| 五月婷婷无码专区| 99精品国产在热久久婷婷| 成人 在线 日韩| 精品婷婷五月视| 色五月六月| 五月丁香好婷婷A片网| 九九色热| 丁香五月综合网亚洲综合欧美狠狠| 人人爽欧美婷婷久久久五月丁香| 国产亚洲99久久精品| 丁香六月婷婷综合网| 99资源在线| 六月婷婷中文字幕| www.成人婷婷综合| 婷婷伊人綜合中文字幕| 激情婷婷五月丁香啪啪啪| 久久久久激情网| 最新午夜理论片| 丁香熟女乱| 婷婷91| 毛片色五月| 五月丁香六月综合情在线观看| 色哟呦av| 色五月丁香五月| 久热中文字幕在线线观看| 99黄色在线视频精品熟女| 国产av天堂| 色五月激情五月开心五月| 五月丁了香蕉综合| 懂色av蜜臀av粉嫩av永陈冠希| 欧美在线干| 色中色综合| 婷婷五月天另类视频| 韩国19 主播内部福利vip免费播放| 91丨九色丨43老版熟女| 五月亭亭网成人在线视频| 久久丁香五月婷婷激情综合网| 中文成人在线| 婷婷成人基地| 久久性视频| 婷婷va| 亚洲色小说在线综合| 美女黄频aⅴ视频| 色99久草在线| 九九热精品视频在线观看| 免费看欧美成人A片无码| 亚洲 小说 欧美 激情 另类| 婷婷导航| 91打屁股视频网站| 超碰妻人人| 丁香五月激情婷婷| 91久久久久久久久| av人人干| 丁香五月色欲| 欧美综合在线五月天色婷婷| 日本精品在线噜噜噜| 国产精品色婷婷久久久精品| 九九99精品视品| 91一起操| 99ri国产| w婷婷五月婷婷w| 五月丁香六月婷婷操操操| 久久草婷婷丁香网站| 五月婷婷高清| 九九青青草成人| 亚洲成人在线综合| 五月天基地| 大香蕉网 久久| 成人无码精品1区2区3区免费看| 日韩视频99| www.日本91| 婷婷五月天综合在线| 婷婷五月伦理| 久久99热精品a片在线观看| 婷婷久久久久久久| 国在线激情网| 人妻狠狠操| 日韩黄黄| 色五月大香蕉| 在线不卡视频| 色婷婷丁香五月天| 中文字幕AV在线| 五月丁香婷草| 五月婷婷|欧美| 天天综合久久| 91成人电影| 五月丁香黄色| 婷婷情色五月天| 欧美日本黄色| 草一草avb| 亚洲欧美综合7777色婷婷| 人妻久热| 久久久com| AV堂狠狠干| 99视频色在线观看| 天天操夜夜夜夜爽| 色在线五月天免费| 五五月五月| 天天干、天天日日| 欧美日本va| 99激情视频| 国产免费一区二区三区三州老师F1F1.CC | 丁香色色五月| 亚洲欧洲小视频9| 亚洲xx网| 久久婷婷五月综合| 婷婷色五月噜噜| 五月婷婷久久内射| 五月天色视频| 激情五月天影院| 人人综合久| 丁香六月激情综合| 久久精彩免费视频| 丁香五月天天久久综合小说| 婷婷丁香综合色AV| 9l视频自拍9l九色9l成人| 99久在线精品99re8热| 天天 青草 制服丝袜 在线| 678五月丁香亚洲综合| 66精品成人免费网站在线观看| 狠狠草狠狠草| 久热综合| 国精产品一区一区三区免费视频| 丁香六月婷婷操逼网| 5五月综合网亚洲| 久久婷婷五月天懂色| 99爱免费在线观看| www,99热| 九九九九这里只有精品| 中文字幕1区2区。| 婷婷五月天久久综合88| 深爱激情网五月| www色综合| 9色在线视频| 乱精品一区字幕二区| 操操熟女| 可以免费观看的av网址| 丁香婷婷色五月天| 色~性~乱~伦~噜| 国产看真人毛片爱做A片| 9 9热这里有精品| 国产人妻操逼| 激情小说五月欧美亚洲丁香| 超碰人人操人人干| 热91久| 偷拍91九色| 99色看这里只有精品| 丁香五月亚综合图片| 三级黄网站| 久久九网| 婷婷久久五月| 色噜噜婷婷| 婷婷五月色播放| 欧美三级视频| 丁香六月婷婷| 五月丁香在线看| 99ri精品| 免费人人操| 五月婷婷成人w| 超碰九九热| 伊大人久久| 级情九色| 第五色婷婷| 国产午夜精品一区二区三区四区| 手机旧版看人妻1025| 97色色色色色色色色色色色色色| 久久总和99| 色五月色综合| 99re66热这里只有精品| 亚洲中文乱字字幕在线永久| 中文成人在线| 激情床戏| 天天激情| 97caop| 久久视网36| 天天操天天操天天操天天操天天操| 欧洲第一无人区观看| 9l视频自拍九色9l视频自拍九色9l社区| 五月丁香五月天现场视频| 久久激情五月婷婷| 99伊人性爱在线影院| 狠狠色综合网站| 色色五月天婷婷| 久久久久久久97| 日婷婷久久开心| 激情五月成年| 99热日韩这里只有精品| 中文字幕不卡+婷婷五月| 日韩精品一曲二曲三曲四曲五曲| 538久久| 婷婷五月影院| 人人操AV| 久久看婷婷| 青青色com久久| 99久久婷婷五月天| 一点色成人网| 激情综合五月激情17| 超碰色综合| www.91在线看| 久草热视频在线观看| 狠狠色 综合色区| 天天草天天爱| 激情第四色| 久久XX| 色区久久| 超碰免费人妻| 欧美色99| 五月激情婷婷综合| 欧美Va婷色| 中文字幕成| www色五月| 丁香花五月天婷婷成人社区| 激情伊人五月婷婷久久| 午夜丁香婷婷| 五月丁香激情五月天| 综合亚洲五月天| 性爱视频久久| 丁香六月婷婷综合激情欧美| 婷婷深爱五月| 国产亚洲在线观看| 激情五月婷婷五月| 天天摸.天天mo| 99热这里只有精| 久思思久视频| 六月丁香婷| 欧美激情五月天婷婷| 996热| 激情婷婷五月天伊人在线观看| 久久婷五月天| 深爱婷婷色| 黄急一级视频| 婷婷五月六月丁香综合| 婷婷久久爱| 国产性爱亚洲是图| 人橾人| 色五月天堂| 色播五月丁香| 天天弄天天操| 五月婷在线色视频| 久草婷妨| 国产成人亚洲综合A∨婷婷| 五月婷婷激情日本| 91碰| 可以免费看av网站| 91妻人人爽人人看片| 热99只有里视频| 久久嘟嘟丁香| 久久丁香五月婷婷| 色丁香五月婷婷婷| 欧美日本韩国亚洲| 五月天婷婷爱| 亚欧州精品视频| 五月婷婷影院| 九月婷婷丁香| 激情五月婷婷啪啪| 久久婷婷精品| 亚洲熟妇AV综合网五月丁香伊人| 色色色色色色色色色影院| 天天做天天爱天天做| 在线视频99| 囯产精品久久欠久久久久久九大| 丁香五月婷婷亚洲综合精品在线| 高清免费在线视频| 五月天丁香婷| 热久久77777| 五月丁香激情综合网官网| 97精品自拍视频| 噜综合| 热99玖玖99玖玖99九九| 婷婷的色色五月天| 天天色天天色天天色天天色天天色天天色| 五月丁香婷婷成人网| 99热国产这里只有精品| 亚洲色碰| 97luluse| 九九热欧美| 可以直接看的av网站| 五月天色站| 婷婷五月天基地| 五月成人综合| www.激情| 色综久久久| 九九黄色网| 都市激情小说婷婷| 97色婷婷成人综合在线观看| 久久色大香蕉| 九九九热精品| 精品久久久久久久人妻| 久操人妻| 中文AⅤ大全| 天天天干夜夜夜操| 99热在线观看精品免费| 天堂AV三级| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 亚洲成人AV在线观看| 99色热视频| 色99日韩| 婷婷五月综合中文字幕| 精品人妻一区二区| 深爱五月婷婷| 色狠狠伊人久久五月丁香| 色五月色图| httpwww色com日本| 婷婷激情图片| 九九综合| 这里只有精品在线免费视频| 九九日本视频| 丁香五月婷婷亚洲另类| AA片在线观看视频在线播放| 亚洲欧美婷婷五月色综合| 情婷婷五月天| 丁香五月婷婷成人色区| 久久婷婷网| 亚洲婷婷综合视频| 色五月情| 色婷婷综合网| XX久久| 5月婷婷激情在线| 99在线视频精品| 婷婷丁香六月综合激情站| 激情 婷婷| 九九热狼人| 精品一区二区三区四区五区六区| 久久久大香蕉| 色婷婷五月综合| 色噜噜狠狠狠综合曰曰曰| 亚洲天堂亚洲色色色| 色综合色五月| www.99热在线| 婷五月天| 久久日婷婷| 综合aV在线| 国内外色色色色色成人视频| 久久三级视频| 97碰久久| 超碰猛烈的性猛交| 久久这里有精品| 色欲色香伊人| 武汉美女啪啪视频免费一级片| 日本美女天天日天天爽| 色六月丁香婷婷啪啪啪| 超碰人人操在线| 99爱99操| 婷婷爱爱蜜臀天天操| 久七香蕉| 99五月婷| 久久视频婷婷| 91久久色| www91在线| 狠狠色丁香久久婷婷综合五月| 婷婷五月丁香激情图片| 色婷婷AV在线观看| 色五月在线综合| 激情五月天.色网| 亚洲天堂色| www.成人婷婷综合| 99爱在线观看视频| 五月丁香六月综合基地| 五月天精品视频| 丁香五月婷婷色情综合| 色婷婷成人五月| 成人精品亚洲性爱| 天天干天干| AV操操操| 操97免费超级视频| 天堂网啪啪| 91精品无码| 欧美婷婷五月丁香| 思思热在线观看| 国产69久久久欧美黑人A片| 中文字幕按摩做爰| 中文字幕无码AV| 超碰人人在线观看| 免费成片在线观看| 亚洲色激情| 91狠狠综合久久久久久| 99丁香五月婷| 婷婷五月丁香色情| 激情六月婷| 五月婷婷色| 久/久精品99看9| 日本片日本片祼观看网站在线看中文版网页在线看 | 青草视频在线观看视频| 97超碰,人人舔,人人操,人人摸| 久9精品视频在线| 毛v一区二区视频| 色色色婷| 综合激情开心五月| 深爱激情网噜噜色| 婷婷色五月丁香六月欧美啪| 久久五月婷婷丁香| 99热啪啪| 另类小说五月天| 嫩草AV久久伊人妇女超级A| 日本成人内射| 国产avapp 网| 性色欲情 网站| 婷婷九月激情| 婷婷色丁香六月| 色综合久久88色综合天天99| 色婷婷五月天激情在线观看| 99久久婷| 性做爰1一7伦| 久久婷婷五月综合一| 欧美日韩成人在线观看| 丁香五月天激情网址| 五月开心啪啪| 婷婷成人五月天成人文学小说| 久久婷婷网| 性av| 激情网色五月| 五月天色色激情综合| 热99re| 欧美99视频| 五月婷婷激情网| 五月黄色婷婷| 六月99天天婷婷激情综合| 五月天婷婷色播| 欧美Va在线| 婷婷99狠狠| 色色色网站| yw国产AV| 色域五月婷婷丁香| 婷婷基地五月色| 激情综合九月| 国产AV影片| 国产免费av在线| 五月丁香综合伦理片| 五月丁香影院| 五月综合视频| 综合网狠狠| 色婷婷久久综合久色| 天天插综合| 人妻久久久久久久 | 色五月婷婷久久| 婷婷五月天亚洲综合网| 婷婷五月天久久久| 夜丁香五月婷婷| 丁香桃色网| 成人精品一区日本无码网| 9九色首页| 五月天婷爱综合| 六月婷婷久久| 久热re视频在线观看网站| 久久久久妻| 色婷婷的五月天| 中文字幕人妻熟女在线| 蜜臀av粉嫩av懂色av| 少妇人妻凹凸视频| 五月天激情图片| 五月婷九月| 五月丁香好婷婷姑娘综合网| 97操碰碰无码视频| 欧美日本韩国亚洲| 99re6热在线精品视频播放速度| 色播激情五月天| 国产人妻777人伦精品HD| 铁牛TV人妻| 丁香婷婷中文字幕| 欧美三级A做爰在线观看| 九月色婷婷综合| 五月天深爱激情网| 亚洲婷婷五月天| 狠狠爱综合| 婷香狠狠爱五月| 久久66精品| 精品无码久久久久久久久| 91精品在线看| 丁香五月婷久久| 激情五月婷婷老师| 这里只有精品99视频| 九九九九毛片| 亚洲五月天色色| www.五月丁香av| 亚洲无AV在线中文字幕| 日本怕怕视频| 久婷婷色| 91精品丝袜久久久久久久久粉嫩| 色情久久久| 99久在线精品99re8| 天天噜日日噜综合无码| 成人短视频在线免费观看| 天天久久婷婷| 九九成人精品| 国产特级毛片AAAAAAA高清| 五月婷婷婷丁香播| 婷婷五月天综合小说网| 欧美丰满熟妇BBB久久久| 欧美va精品va老师va| 色久天| 五月婷婷啪啪啪啪| 色婷婷伦理| 欧美日本日韩| 在线婷婷| 人人操AV| 五月婷婷天堂| 欧美色99| www.com亚洲网站在线免费| 五月丁香在线观看| 六月激情网| 天天日天天干天天操| 99热色综合| 第四色首页| 丁香五月色色婷| 综合五月丁香六月婷婷| 久久婷婷五月天大香蕉| 久久婷婷操| 久久婷婷超碰| 夜夜爽天操| 国产肥白大熟妇BBBB视频| 久久激情综合| 亚洲情综合五月天| 小视频一区| 五月综合激情婷婷六月色窝| 婷婷5月天av| 国产午夜精品一区二区三区四区| ss99热| 婷婷五月综合中文字幕| 五月丁香六月婷婷婷婷| 精品久9| jizzdr| 国产性爱一级| 五月婷婷亚洲| 伊人网欧美在线男人天堂五月丁香| 精品色色| 五月天中文字幕在线婷婷| 精品国产乱码久久久久久免费| 五月天婷婷久久综合| 久久九九99视频| 丁香五月五月婷婷| 伊人久久中文网| 五月天激情影院| 激情五月开心五月在线视频| BBWCUCKOLD精品熟妇| 久久一热免费视频| 无码人妻精品一区二区蜜桃色欲| 91婷婷五月天综合视频| 性爱激情久久| 五月天开心网| 另类综合激情| 婷婷丁香久久| 激情五月天免费视频| 亚洲成人综合网在线免费观看| 五月天综合视频网| 婷婷久久五月丁香| 嫩草AV久久伊人妇女超级A | 91se在线观看| 婷婷五月小说色综合| 双性美人被调教到喷水A片| 亚洲第精品| 色婷婷五月成人网| 亚洲精品大片| 亚洲婷婷乱乱丁香| 狠狠爱夜夜| www.99视频| 激情 婷婷 丁香五月天| www热久久yy9| 色九月婷婷| 亚洲激情五月丁香久久久久| 婷婷丁香五月激情密臀av| 五月激情综合网| 九九视频这里有精品| 九九aV| 亚洲视频在线观看| 欧美丁香五月| 五月天日日操夜夜操 | 色玖玖爱| 99亚洲精品| 狠狠的日| 天天插综合在线| 黄页免费一级视频懂色| 色亭亭五月天丁香综合AV - 百度 - 百度| 婷婷五月情| 超碰天堂网| 色综合婷婷| 开心婷婷五月中文字幕组| 六月丁香大香蕉| 五月天丁香久久综合| 色啪网|