日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

基于微信小程序的琴房預(yù)約管理系統(tǒng):從數(shù)據(jù)庫到?jīng)_突檢測全解析

基于微信小程序的琴房預(yù)約管理系統(tǒng):從數(shù)據(jù)庫到?jīng)_突檢測全解析 簡介面向高校計(jì)算機(jī)相關(guān)專業(yè)畢業(yè)設(shè)計(jì)或課程設(shè)計(jì)場景這份微信小程序琴房管理系統(tǒng)項(xiàng)目包含完整源碼、說明文檔、LW及演示視頻。系統(tǒng)按學(xué)生與管理員雙角色設(shè)計(jì)學(xué)生端支持琴房查看、預(yù)約與公告瀏覽管理員端覆蓋學(xué)生信息管理、琴房公告發(fā)布及登錄注銷等操作業(yè)務(wù)鏈路完整適合需要快速理解小程序全棧開發(fā)并產(chǎn)出畢設(shè)成果的讀者。壓縮包共1105個(gè)文件大小約25.4MB以vue、js、java、class等前后端源碼文件為主輔以wxml/wxss小程序頁面、json配置、sql數(shù)據(jù)庫腳本、docx文檔以及png/svg界面素材和mp4演示視頻目錄結(jié)構(gòu)清晰、資源類型齊全。已有188人學(xué)習(xí)下載。包內(nèi)還附帶安裝/運(yùn)行/構(gòu)建的bat腳本、關(guān)鍵文件備份與常見配置說明結(jié)合演示視頻和說明文檔可幫助讀者梳理琴房預(yù)約的業(yè)務(wù)流程、接口設(shè)計(jì)及前后端交互細(xì)節(jié)便于二次開發(fā)與答辯準(zhǔn)備。1. 琴房管理系統(tǒng)怎么做這個(gè)微信小程序項(xiàng)目到底解決什么問題琴房管理在很多學(xué)校還停留在「微信群接龍 管理員人工排表」的階段學(xué)生接龍預(yù)約到了現(xiàn)場發(fā)現(xiàn)琴房被占用管理員每天花大量時(shí)間核對時(shí)間表、處理沖突。基于微信小程序的琴房管理系統(tǒng)把整套流程搬到線上——學(xué)生打開小程序查看琴房實(shí)時(shí)狀態(tài)、按時(shí)間段預(yù)約管理員維護(hù)琴房、管理預(yù)約記錄。這類項(xiàng)目常出現(xiàn)在畢業(yè)設(shè)計(jì)和課程設(shè)計(jì)中因?yàn)闃I(yè)務(wù)邊界清晰又完整覆蓋了小程序前端、服務(wù)端接口、數(shù)據(jù)庫設(shè)計(jì)和定時(shí)任務(wù)幾個(gè)模塊。第一次做小程序全棧項(xiàng)目選它能把前后端基本功都練到評估它值不值得做核心就看一點(diǎn)預(yù)約沖突怎么用最少的代碼擋住。本文把這條線從頭到尾講透。2. 需求拆解與數(shù)據(jù)庫建模琴房預(yù)約的核心是時(shí)間沖突檢測做這類系統(tǒng)別急著寫代碼先把業(yè)務(wù)流程和表結(jié)構(gòu)想清楚。后臺(tái)的編排決定了預(yù)約邏輯的復(fù)雜度一旦表結(jié)構(gòu)定錯(cuò)后面改起來牽一發(fā)動(dòng)全身。琴房管理系統(tǒng)翻來覆去就那么幾個(gè)頁面但真正考驗(yàn)設(shè)計(jì)能力的是預(yù)約這件事怎么用數(shù)據(jù)模型表達(dá)出來。2.1 三種角色與核心業(yè)務(wù)流程預(yù)約、取消、簽到怎么串系統(tǒng)的角色其實(shí)就三類學(xué)生、管理員、定時(shí)任務(wù)。學(xué)生側(cè)重在鏈路上走查看琴房列表 → 選擇日期與時(shí)間段 → 提交預(yù)約 → 到琴房簽到 → 完成使用。管理員側(cè)重維護(hù)維護(hù)琴房信息、查看所有預(yù)約、異常情況下強(qiáng)制取消。定時(shí)任務(wù)做兜底把超時(shí)未簽到的預(yù)約標(biāo)記為爽約把過期預(yù)約歸檔。業(yè)務(wù)規(guī)則上我一般會(huì)按這幾條定同一琴房同一日期同一時(shí)間段只能存在一條有效預(yù)約。預(yù)約開始時(shí)間必須早于結(jié)束時(shí)間且落在琴房營業(yè)時(shí)間內(nèi)。只能預(yù)約未來 7 天內(nèi)的時(shí)段不能預(yù)約過去的日期。取消預(yù)約必須在開始時(shí)間之前完成。預(yù)約開始后遲到 15 分鐘未簽到視為爽約。這些規(guī)則里最容易出錯(cuò)的是第 1 條——時(shí)間沖突。判斷兩個(gè)時(shí)間段是否重疊很多人第一反應(yīng)是「新預(yù)約的開始時(shí)間是否落在已有預(yù)約的區(qū)間里」這個(gè)直覺是錯(cuò)的。正確的判定公式是只要新時(shí)段的開始早于已有時(shí)段的結(jié)束且新時(shí)段的結(jié)束晚于已有時(shí)段的開始就必然重疊。這個(gè)公式貫穿整篇文章后面的 SQL 和代碼都在圍著它轉(zhuǎn)。2.2 用三張表把業(yè)務(wù)落地user、room、booking 的字段設(shè)計(jì)與索引核心就三張表字段不需要多夠用就行。下面是推薦的表結(jié)構(gòu)。-- 用戶表 CREATE TABLE sys_user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, openid VARCHAR(64) NOT NULL COMMENT 微信用戶唯一標(biāo)識(shí), nickname VARCHAR(50) DEFAULT COMMENT 昵稱, student_no VARCHAR(20) DEFAULT COMMENT 學(xué)號管理員可錄入, role TINYINT NOT NULL DEFAULT 0 COMMENT 0-學(xué)生 1-管理員, status TINYINT NOT NULL DEFAULT 1 COMMENT 0-禁用 1-正常, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用戶表; -- 琴房表 CREATE TABLE piano_room ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, room_name VARCHAR(50) NOT NULL COMMENT 房間名如 A101, location VARCHAR(100) DEFAULT COMMENT 位置描述, piano_type VARCHAR(30) DEFAULT COMMENT 鋼琴類型, is_open TINYINT NOT NULL DEFAULT 1 COMMENT 0-關(guān)閉 1-開放, open_time TIME DEFAULT 08:00:00 COMMENT 營業(yè)開始, close_time TIME DEFAULT 22:00:00 COMMENT 營業(yè)結(jié)束, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT琴房表; -- 預(yù)約表 CREATE TABLE booking ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, room_id INT UNSIGNED NOT NULL COMMENT 琴房 id, user_id INT UNSIGNED NOT NULL COMMENT 用戶 id, book_date DATE NOT NULL COMMENT 預(yù)約日期, start_time TIME NOT NULL COMMENT 開始時(shí)間, end_time TIME NOT NULL COMMENT 結(jié)束時(shí)間, status TINYINT NOT NULL DEFAULT 0 COMMENT 0-已預(yù)約 1-已完成 2-已取消 3-爽約, remark VARCHAR(200) DEFAULT COMMENT 備注, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_room_time (room_id, book_date, start_time, end_time), KEY idx_user_status (user_id, status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT預(yù)約表;幾個(gè)設(shè)計(jì)要點(diǎn)說明。user 表的 openid 必須加唯一索引。微信小程序登錄拿到的是 openid它是用戶在當(dāng)前小程序下的唯一身份標(biāo)識(shí)每次登錄都用它做插入或更新重復(fù)插入會(huì)直接報(bào)錯(cuò)也能防止同一個(gè)微信號注冊出多個(gè)賬號。booking 表的 idx_room_time 聯(lián)合索引是沖突查詢的關(guān)鍵。沖突檢測的 SQL 會(huì)按 room_id 加 book_date 過濾再用 start_time 和 end_time 做區(qū)間比較這個(gè)索引能讓查詢走 range scan 而不是全表掃描。數(shù)據(jù)量幾千條時(shí)差別不明顯但到上萬條后有沒有這個(gè)索引就是毫秒級和秒級的差別。status 字段用 TINYINT 數(shù)字而不是字符串。畢業(yè)設(shè)計(jì)里很多人習(xí)慣存 booked、cancelled 這種字符串看著直觀但索引效率和代碼可讀性都不如數(shù)字枚舉。前后端約定好 0/1/2/3 的含義后端定義常量類統(tǒng)一使用比到處寫魔法數(shù)強(qiáng)得多。2.3 接口清單與鑒權(quán)方式小程序端和服務(wù)端怎么分工接口按資源拆RESTful 風(fēng)格就夠不需要引入復(fù)雜框架。核心接口如下。接口方法核心入?yún)⒄f明/api/auth/loginPOSTcode用 wx.login 的 code 換登錄態(tài) token/api/room/listGET無琴房列表與開放狀態(tài)/api/room/detailGETroomId琴房詳情含營業(yè)時(shí)間與可預(yù)約時(shí)段/api/booking/createPOSTroomId、bookDate、startTime、endTime創(chuàng)建預(yù)約/api/booking/mineGET無當(dāng)前用戶的預(yù)約記錄/api/booking/cancelPOSTbookingId取消預(yù)約/api/booking/checkinPOSTbookingId到琴房簽到/api/admin/room/savePOST琴房信息管理員維護(hù)琴房鑒權(quán)有兩種常見做法。輕量一點(diǎn)的是后端生成隨機(jī) token 存到 Redis設(shè)過期時(shí)間小程序每次請求把 token 放在 Authorization 頭里重一點(diǎn)的是直接上 JWT登錄時(shí)簽發(fā)過期時(shí)間由服務(wù)端控制。對這個(gè)項(xiàng)目來說Redis token 方案更直觀也方便管理員端做強(qiáng)制下線我一般會(huì)用這種。后端用攔截器統(tǒng)一校驗(yàn)白名單放行登錄接口其余接口都要求攜帶有效 token管理員接口再額外查一次 role 字段。3. 小程序端實(shí)現(xiàn)登錄態(tài)、琴房列表和預(yù)約提交的關(guān)鍵代碼小程序端的核心頁面就三個(gè)琴房列表頁、預(yù)約頁、我的預(yù)約頁。這一章把代碼拆開講從登錄態(tài)到預(yù)約提交每一步給出能直接用的片段。所有請求都走 wx.request業(yè)務(wù)層把 url 和 data 組織好就行。3.1 微信登錄與 Token 會(huì)話管理code 換 token 的完整鏈路微信小程序的登錄鏈路是小程序調(diào)用 wx.login 拿到一次性 code后端拿 code 去微信接口換 openid 和 session_key再生成業(yè)務(wù) token 返回給小程序。code 只能用一次且有效期很短所以小程序端不能緩存 code每次啟動(dòng)都要重新調(diào)用 wx.login。// miniprogram/utils/auth.js const TOKEN_KEY token; function login() { return new Promise((resolve, reject) { wx.login({ success: (res) { if (!res.code) { reject(new Error(wx.login 未返回 code)); return; } wx.request({ url: getApp().globalData.apiBase /api/auth/login, method: POST, data: { code: res.code }, success: (resp) { if (resp.data.code 0) { const token resp.data.data.token; wx.setStorageSync(TOKEN_KEY, token); resolve(resp.data.data); } else { reject(new Error(resp.data.msg || 登錄失敗)); } }, fail: (err) reject(err) }); }, fail: (err) reject(err) }); }); } function getToken() { return wx.getStorageSync(TOKEN_KEY); } module.exports { login, getToken, TOKEN_KEY };邏輯說明wx.login 成功后拿到 code把它 POST 給后端后端用 code 換 openid 后生成 token 返回。前端把 token 放進(jìn)本地緩存后續(xù)所有請求從緩存取。參數(shù)上注意 apiBase 是后端服務(wù)地址開發(fā)階段指向局域網(wǎng) IP 加端口正式上線必須換成已配置 HTTPS 證書的域名。提示token 失效時(shí)后端通常會(huì)返回 401小程序端應(yīng)該封裝一個(gè)請求函數(shù)統(tǒng)一攔截 401 后自動(dòng)重新登錄并重放原請求。這個(gè)習(xí)慣能幫你省掉大量「登錄態(tài)過期」導(dǎo)致的現(xiàn)場翻車。關(guān)于 session_key它用于解密微信加密數(shù)據(jù)比如手機(jī)號。琴房管理系統(tǒng)如果只是用 openid 做身份識(shí)別session_key 在后端換完就可以丟棄不用存。見過不少同學(xué)把 session_key 也寫進(jìn) user 表沒有必要除非你還要做微信手機(jī)號授權(quán)。3.2 琴房列表與狀態(tài)展示拉取數(shù)據(jù)、渲染與下拉刷新琴房列表頁的要點(diǎn)是狀態(tài)展示。后端返回的 room 里帶 status 字段前端要把它翻譯成用戶能看懂的文字和顏色而不是直接把數(shù)字渲染到頁面上。// pages/room/room.js const { getToken } require(../utils/auth.js); Page({ data: { rooms: [], loading: false }, onShow() { this.fetchRooms(); }, onPullDownRefresh() { this.fetchRooms(true); }, fetchRooms(isRefresh false) { if (this.data.loading) return; this.setData({ loading: true }); wx.request({ url: getApp().globalData.apiBase /api/room/list, header: { Authorization: Bearer getToken() }, success: (res) { if (res.data.code 0) { const rooms res.data.data.map((room) ({ ...room, statusText: this.statusText(room.status), statusClass: room-status- room.status })); this.setData({ rooms }); } else { wx.showToast({ title: res.data.msg || 加載失敗, icon: none }); } }, complete: () { this.setData({ loading: false }); if (isRefresh) wx.stopPullDownRefresh(); } }); }, statusText(status) { const map { 0: 空閑, 1: 使用中, 2: 維護(hù)中 }; return map[status] || 未知; }, goBook(e) { const roomId e.currentTarget.dataset.id; wx.navigateTo({ url: /pages/book/book?roomId roomId }); } });對應(yīng)的 WXML 片段view classroom-card wx:for{{rooms}} wx:keyid view classroom-name{{item.roomName}}/view view classroom-location{{item.location}} · {{item.pianoType}}/view view classroom-status {{item.statusClass}}{{item.statusText}}/view button typeprimary sizemini bindtapgoBook>// pages/book/book.js const { getToken } require(../utils/auth.js); const SLOT_MINUTES 60; const MAX_ADVANCE_DAYS 7; Page({ data: { roomId: , room: null, dateList: [], dateIndex: 0, slotList: [], slotIndex: -1, submitting: false }, onLoad(options) { this.setData({ roomId: options.roomId }); this.buildDateList(); this.loadRoomDetail(); }, buildDateList() { const list []; const week [日, 一, 二, 三, 四, 五, 六]; for (let i 0; i MAX_ADVANCE_DAYS; i) { const d new Date(); d.setDate(d.getDate() i); const dateStr ${d.getFullYear()}-${String(d.getMonth() 1).padStart(2, 0)}-${String(d.getDate()).padStart(2, 0)}; const label i 0 ? 今天 : i 1 ? 明天 : ${d.getMonth() 1}月${d.getDate()}日 周${week[d.getDay()]}; list.push({ dateStr, label }); } this.setData({ dateList: list }); }, loadRoomDetail() { wx.request({ url: getApp().globalData.apiBase /api/room/detail, data: { roomId: this.data.roomId }, header: { Authorization: Bearer getToken() }, success: (res) { if (res.data.code 0) { this.setData({ room: res.data.data }); this.buildSlotList(); } } }); }, buildSlotList() { const room this.data.room; if (!room) return; const slots []; const openHour parseInt(room.openTime.slice(0, 2), 10); const closeHour parseInt(room.closeTime.slice(0, 2), 10); for (let h openHour; h SLOT_MINUTES / 60 closeHour; h) { const start ${String(h).padStart(2, 0)}:00:00; const end ${String(h SLOT_MINUTES / 60).padStart(2, 0)}:00:00; slots.push({ start, end, label: ${start.slice(0, 5)} - ${end.slice(0, 5)} }); } this.setData({ slotList: slots }); }, onDateChange(e) { this.setData({ dateIndex: Number(e.detail.value), slotIndex: -1 }); }, onSlotSelect(e) { this.setData({ slotIndex: Number(e.currentTarget.dataset.index) }); }, submit() { const { roomId, dateList, dateIndex, slotList, slotIndex, submitting } this.data; if (slotIndex 0) { wx.showToast({ title: 請選擇時(shí)間段, icon: none }); return; } if (submitting) return; this.setData({ submitting: true }); const date dateList[dateIndex].dateStr; const slot slotList[slotIndex]; wx.request({ url: getApp().globalData.apiBase /api/booking/create, method: POST, header: { Authorization: Bearer getToken() }, data: { roomId: roomId, bookDate: date, startTime: slot.start, endTime: slot.end }, success: (res) { if (res.data.code 0) { wx.showToast({ title: 預(yù)約成功, icon: success }); setTimeout(() wx.navigateBack(), 1500); } else { wx.showToast({ title: res.data.msg || 預(yù)約失敗, icon: none }); } }, complete: () { this.setData({ submitting: false }); } }); } });邏輯說明日期生成用循環(huán)加 7 天第一二天顯示「今天」「明天」后面的顯示具體日期和星期這個(gè)細(xì)節(jié)在演示時(shí)很加分。時(shí)間片按 room.openTime 和 closeTime 解析出小時(shí)數(shù)循環(huán)生成整點(diǎn)時(shí)段。submitting 標(biāo)志防止用戶重復(fù)點(diǎn)擊提交這個(gè)在預(yù)約場景里是必須的不然一次點(diǎn)擊發(fā)出兩個(gè)請求就會(huì)出現(xiàn)「我只點(diǎn)了一次怎么訂了兩條」。注意一個(gè)邊界時(shí)間片生成只考慮了整點(diǎn)如果琴房營業(yè)時(shí)間是 08:30 到 21:30這種寫法生成的時(shí)段會(huì)不準(zhǔn)。穩(wěn)妥的做法是后端在 room/detail 接口里直接返回可預(yù)約時(shí)間片數(shù)組前端只負(fù)責(zé)渲染。這樣營業(yè)時(shí)間、粒度、特殊日期的規(guī)則全部收斂在后端一處前端永遠(yuǎn)不用自己去推。4. 后端服務(wù)與沖突控制把預(yù)約規(guī)則寫成可執(zhí)行的代碼后端是這類系統(tǒng)的重頭戲。預(yù)約創(chuàng)建、沖突檢測、超時(shí)釋放這三塊寫好了項(xiàng)目核心邏輯就立住了。這一章以 Java Spring Boot 的寫法為例其他語言思路一致SQL 部分可以直接搬過去。4.1 預(yù)約創(chuàng)建的完整流程參數(shù)校驗(yàn)、沖突檢測與事務(wù)預(yù)約創(chuàng)建的接口不能只是簡單 insert它要按順序做五件事參數(shù)校驗(yàn)、琴房校驗(yàn)、營業(yè)時(shí)間校驗(yàn)、沖突檢測、插入。任何一步失敗都返回業(yè)務(wù)錯(cuò)誤。Transactional(rollbackFor Exception.class) public Booking createBooking(BookingDTO dto, Long userId) { // 1. 基本參數(shù)校驗(yàn) if (dto.getStartTime().compareTo(dto.getEndTime()) 0) { throw new BusinessException(開始時(shí)間必須早于結(jié)束時(shí)間); } if (dto.getBookDate().isBefore(LocalDate.now())) { throw new BusinessException(不能預(yù)約過去的日期); } // 2. 琴房存在且開放 PianoRoom room roomMapper.selectById(dto.getRoomId()); if (room null || room.getIsOpen() ! 1) { throw new BusinessException(琴房不存在或未開放); } // 3. 時(shí)間必須落在琴房營業(yè)時(shí)間范圍內(nèi) if (dto.getStartTime().isBefore(room.getOpenTime()) || dto.getEndTime().isAfter(room.getCloseTime())) { throw new BusinessException(預(yù)約時(shí)間超出琴房營業(yè)時(shí)間); } // 4. 行鎖 沖突檢測 int conflict bookingMapper.countConflictForUpdate( dto.getRoomId(), dto.getBookDate(), dto.getStartTime(), dto.getEndTime()); if (conflict 0) { throw new BusinessException(該時(shí)間段已被預(yù)約請選擇其他時(shí)間); } // 5. 插入預(yù)約記錄 Booking booking new Booking(); booking.setRoomId(dto.getRoomId()); booking.setUserId(userId); booking.setBookDate(dto.getBookDate()); booking.setStartTime(dto.getStartTime()); booking.setEndTime(dto.getEndTime()); booking.setStatus(BookingStatus.BOOKED); bookingMapper.insert(booking); return booking; }邏輯說明第 1 步擋住「開始晚于結(jié)束」和「預(yù)約過去日期」兩種低級錯(cuò)誤這類請求根本不該進(jìn)到數(shù)據(jù)庫。第 3 步校驗(yàn)營業(yè)時(shí)間前端選了 21:30 但琴房 21:00 關(guān)門這里直接拒絕。第 4 步是核心countConflictForUpdate 會(huì)先鎖住相關(guān)記錄再統(tǒng)計(jì)避免兩個(gè)并發(fā)請求同時(shí)通過檢查。第 5 步插入后事務(wù)提交整個(gè)過程要么全部成功要么全部回滾不會(huì)出現(xiàn)「沖突檢測通過了但插入失敗」的臟狀態(tài)。注意Transactional 一定要加 rollbackFor Exception.class。Spring 默認(rèn)只在 RuntimeException 時(shí)回滾拋?zhàn)远x checked 異常時(shí)事務(wù)不回滾數(shù)據(jù)就寫進(jìn)去了這個(gè)細(xì)節(jié)坑過很多人。還有一個(gè)容易踩的坑有的同學(xué)把沖突檢測拆成獨(dú)立 service 方法然后在 createBooking 里調(diào)用。如果這個(gè)方法沒有事務(wù)傳播檢查完再插入的間隙另一個(gè)請求可能已經(jīng)插入了同一時(shí)段。所以檢測和插入必須在同一個(gè)事務(wù)方法里這是硬要求。4.2 沖突檢測 SQL 的正確寫法區(qū)間重疊判定與索引利用沖突檢測的 SQL 是全文最重要的幾行代碼。select idcountConflictForUpdate resultTypeint SELECT COUNT(*) FROM booking WHERE room_id #{roomId} AND book_date #{bookDate} AND status 0 AND start_time lt; #{endTime} AND end_time gt; #{startTime} FOR UPDATE /select邏輯說明新預(yù)約時(shí)段是 [startTime, endTime]已有預(yù)約時(shí)段是 [start_time, end_time]。兩者重疊的充要條件是新開始時(shí)間早于已有結(jié)束時(shí)間且新結(jié)束時(shí)間晚于已有開始時(shí)間。寫成 SQL 就是 start_time #{endTime} AND end_time #{startTime}。再加 book_date 限定同一天status 0 只統(tǒng)計(jì)有效預(yù)約排除已取消和已歸檔的記錄。反例值得單獨(dú)說。有同學(xué)會(huì)寫成下面這兩種-- 反例一只覆蓋「完全包含」的情況 WHERE start_time #{startTime} AND end_time #{endTime} -- 反例二只看已有預(yù)約的開始時(shí)間是否落在新時(shí)段內(nèi) WHERE start_time BETWEEN #{startTime} AND #{endTime}反例一漏掉了「新時(shí)段橫跨已有時(shí)段」的部分重疊反例二漏掉了「已有時(shí)段橫跨新時(shí)段」的場景。實(shí)測中這兩種寫法會(huì)各放走一批沖突預(yù)約等管理員在后臺(tái)看到記錄重了再去手工取消就很被動(dòng)。FOR UPDATE 是 MySQL InnoDB 的行鎖語法配合 idx_room_time 索引它會(huì)鎖住命中的索引區(qū)間。并發(fā)場景下兩個(gè)請求同時(shí)查同一琴房同一天的數(shù)據(jù)后到的會(huì)等先到事務(wù)提交后才繼續(xù)這樣沖突檢測就變成串行執(zhí)行不會(huì)出現(xiàn)兩人同時(shí)訂走同一時(shí)段的情況。這個(gè)鎖粒度對這個(gè)項(xiàng)目足夠沒必要上 Redis 分布式鎖。idx_room_time 聯(lián)合索引room_id, book_date, start_time, end_time覆蓋了查詢的過濾條件MySQL 會(huì)走索引 range scan數(shù)據(jù)量到十萬級也不會(huì)慢。如果這個(gè)項(xiàng)目用于期末設(shè)計(jì)這屬于「可展示的性能設(shè)計(jì)點(diǎn)」答辯時(shí)值得拿出來講。4.3 超時(shí)釋放與簽到定時(shí)任務(wù)讓預(yù)約狀態(tài)自動(dòng)流轉(zhuǎn)預(yù)約狀態(tài)不能永遠(yuǎn)停在「已預(yù)約」。到了時(shí)間沒來系統(tǒng)要自動(dòng)釋放琴房并標(biāo)記爽約當(dāng)天用完了要標(biāo)記完成。這些靠定時(shí)任務(wù)和簽到接口配合完成。Component public class BookingScheduler { Autowired private BookingMapper bookingMapper; // 每分鐘跑一次已預(yù)約但開始時(shí)間已過 15 分鐘的標(biāo)記為爽約 Scheduled(cron 0 * * * * ?) public void markNoShow() { ListBooking list bookingMapper.findExpiredNoShows(); for (Booking b : list) { b.setStatus(BookingStatus.NO_SHOW); bookingMapper.updateById(b); } } // 每天凌晨 2 點(diǎn)把前一天的記錄批量歸檔為已完成 Scheduled(cron 0 0 2 * * ?) public void archiveYesterday() { bookingMapper.archiveByDate(LocalDate.now().minusDays(1)); } }對應(yīng)的 SQL-- 找出已超時(shí)未簽到的預(yù)約 SELECT * FROM booking WHERE status 0 AND (book_date CURDATE() OR (book_date CURDATE() AND start_time DATE_SUB(CURTIME(), INTERVAL 15 MINUTE)))邏輯說明markNoShow 的判定條件是「開始時(shí)間已過去 15 分鐘且狀態(tài)仍是已預(yù)約」。這里故意留 15 分鐘緩沖學(xué)生可能因?yàn)槁飞系R晚到幾分鐘直接到點(diǎn)就釋放很容易引發(fā)投訴。archiveYesterday 是每天凌晨的兜底任務(wù)把前一天未完成的記錄批量歸檔。cron 表達(dá)式里0 * * * * ?表示每分鐘第 0 秒執(zhí)行0 0 2 * * ?表示每天凌晨 2 點(diǎn)整執(zhí)行。簽到接口單獨(dú)說一下。學(xué)生到琴房后點(diǎn)「簽到」后端要校驗(yàn)該預(yù)約屬于當(dāng)前用戶、狀態(tài)是已預(yù)約、當(dāng)前時(shí)間不早于預(yù)約開始時(shí)間然后狀態(tài)改成已完成。有個(gè)細(xì)節(jié)容易漏預(yù)約明天 10:00現(xiàn)在簽到必須拒絕預(yù)約今天 10:00 而現(xiàn)在是 10:05允許簽到。只判斷「日期相等」而忽略當(dāng)前時(shí)刻會(huì)導(dǎo)致預(yù)約還沒開始就能提前簽到的笑話邏輯。到這里系統(tǒng)核心鏈路已經(jīng)通了前端選時(shí)間、后端擋住沖突、定時(shí)任務(wù)兜底釋放。第 5 章把開發(fā)中最高發(fā)的幾個(gè)問題集中排一遍雷。5. 琴房管理系統(tǒng)避坑指南5 個(gè)高發(fā)問題與排查方法這一章按「現(xiàn)象 → 原因 → 解決」的格式寫都是這個(gè)項(xiàng)目里反復(fù)出現(xiàn)的問題每一類我都見過不止一次。你如果正在調(diào)試直接對照著查比從頭翻日志快得多。5.1 沖突檢測漏掉「部分重疊」導(dǎo)致重復(fù)預(yù)約現(xiàn)象A 同學(xué)約了 10:00-11:00B 同學(xué)竟然還能約 10:30-11:30后臺(tái)出現(xiàn)兩條重疊預(yù)約。原因沖突檢測 SQL 寫成了 start_time #{startTime} AND end_time #{endTime}只判斷新時(shí)段是否完整包含在已有時(shí)段內(nèi)。B 的 10:30-11:30 和 A 的 10:00-11:00 是交叉重疊新開始 10:30 落在 A 的時(shí)段內(nèi)但新結(jié)束 11:30 超出了 A 的結(jié)束時(shí)間條件不成立于是被放行。解決改用區(qū)間重疊判定 start_time #{endTime} AND end_time #{startTime}。改完用三種用例驗(yàn)證新時(shí)段在已有時(shí)段內(nèi)部、新時(shí)段橫跨已有時(shí)段、新時(shí)段與已有時(shí)段首尾相接前兩個(gè)必須返回沖突第三個(gè)在邊界恰好相切時(shí)允許通過。我一般會(huì)把這幾個(gè)用例寫進(jìn)單元測試防止后續(xù)改動(dòng)時(shí)悄悄回歸。5.2 并發(fā)預(yù)約「超賣」同一時(shí)段被兩人同時(shí)訂走現(xiàn)象兩個(gè)學(xué)生同時(shí)間隔幾百毫秒提交同一琴房同一時(shí)段的預(yù)約兩個(gè)接口都返回成功數(shù)據(jù)庫里兩條記錄。原因沒有加鎖的「先查詢后插入」存在競態(tài)窗口。請求 A 查到?jīng)_突數(shù)為 0還沒插入請求 B 也查到?jīng)_突數(shù)為 0接著兩個(gè)請求都執(zhí)行插入沖突檢測形同虛設(shè)。解決在沖突檢測 SQL 末尾加 FOR UPDATE并讓檢測與插入處于同一事務(wù)中。后到的請求會(huì)等待先到事務(wù)提交后再執(zhí)行查詢此時(shí)沖突數(shù)變成 1預(yù)約被拒絕。如果項(xiàng)目用的是 PostgreSQL對應(yīng)語法是 FOR KEY SHARE如果不想依賴數(shù)據(jù)庫鎖可以在 booking 表加唯一索引room_id, book_date, start_time做兜底插入沖突時(shí)直接報(bào)錯(cuò)再用異常重試邏輯處理。5.3 預(yù)約時(shí)間憑空差 8 小時(shí)數(shù)據(jù)庫時(shí)區(qū)問題現(xiàn)象小程序端選了 10:00 提交數(shù)據(jù)庫里存的是 02:00管理后臺(tái)看到的預(yù)約時(shí)間全部不對。原因Java 的 LocalDateTime 和 MySQL 的 DATETIME 在時(shí)區(qū)解析上出現(xiàn)偏差。常見的是 JDBC 連接串里沒有指定 serverTimezone驅(qū)動(dòng)用了默認(rèn)時(shí)區(qū)跟服務(wù)器系統(tǒng)時(shí)區(qū)不一致導(dǎo)致時(shí)間偏移。解決在 JDBC 連接串上顯式指定時(shí)區(qū)寫成 jdbc:mysql://localhost:3306/piano?serverTimezoneAsia/Shanghai。同時(shí)約定前后端傳輸時(shí)間一律用字符串格式如 10:00:00不傳時(shí)間戳。TIME 類型本身不涉及時(shí)區(qū)換算用字符串傳遞能避開大部分時(shí)區(qū)坑。這屬于典型的「開發(fā)環(huán)境不出錯(cuò)、一換機(jī)器就翻車」的問題答辯前一定要換臺(tái)機(jī)器部署驗(yàn)證一遍。5.4 開發(fā)者工具正常、真機(jī)請求失敗域名與 HTTPS現(xiàn)象微信開發(fā)者工具里所有接口都通掃碼到真機(jī)上一片空白控制臺(tái)報(bào) request:fail url not in domain list。原因小程序真機(jī)環(huán)境強(qiáng)制要求后臺(tái)接口走 HTTPS且域名必須在小程序后臺(tái)配置為 request 合法域名。開發(fā)工具默認(rèn)不校驗(yàn)合法域名本地 http 接口能通但真機(jī)不認(rèn)。解決開發(fā)階段在開發(fā)者工具的詳情設(shè)置里勾選「不校驗(yàn)合法域名、TLS 版本以及 HTTPS 證書」這只解決本機(jī)調(diào)試。要真機(jī)完整跑通需要準(zhǔn)備一個(gè)已配置 HTTPS 證書的域名在小程序后臺(tái)配好 request 合法域名再把后端接口地址從局域網(wǎng) IP 換成線上域名。證書和域名校驗(yàn)是硬條件沒有捷徑。演示視頻建議在真機(jī)網(wǎng)絡(luò)通暢時(shí)錄制別在開發(fā)工具里錄兩者觀感差很多。5.5 前端選了合法時(shí)間、后端卻報(bào)「超出營業(yè)時(shí)間」現(xiàn)象前端時(shí)間選擇器最多到 21:00但用戶改一下請求參數(shù)就能提交 22:00 的預(yù)約或者前端按 60 分鐘生成時(shí)間片后端允許提交 30 分鐘的時(shí)段預(yù)約粒度混亂。原因前端的時(shí)間組裝邏輯和后端校驗(yàn)規(guī)則是兩套代碼沒有統(tǒng)一。用戶只要繞過前端界面直接調(diào)接口就能提交任意時(shí)間。解決把「可預(yù)約時(shí)段」的完整定義收斂到后端。常見做法是后端 room/detail 接口直接返回該琴房可預(yù)約的時(shí)間片數(shù)組前端渲染時(shí)直接用不做二次計(jì)算后端 create 接口再做兜底校驗(yàn)即使前端被改非法時(shí)間也會(huì)被拒絕。一句話前端做體驗(yàn)后端做規(guī)則互不越界。6. 讓項(xiàng)目在答辯現(xiàn)場不翻車預(yù)置數(shù)據(jù)與演示路徑項(xiàng)目能跑和能演示是兩回事。很多同學(xué)代碼寫完了上臺(tái)演示時(shí)現(xiàn)場預(yù)約、現(xiàn)場等數(shù)據(jù)結(jié)果網(wǎng)絡(luò)慢、時(shí)間對不上、頁面轉(zhuǎn)圈。提前預(yù)置數(shù)據(jù)是最有效的規(guī)避手段。預(yù)置數(shù)據(jù)的核心原則讓演示路徑上的每一步都有「看起來真實(shí)」的數(shù)據(jù)支撐。下面這組 SQL 是三張表的最小演示數(shù)據(jù)集。-- 琴房 INSERT INTO piano_room (room_name, location, piano_type, is_open, open_time, close_time) VALUES (A101, 1號樓 1層, 立式鋼琴, 1, 08:00:00, 22:00:00), (A102, 1號樓 1層, 三角鋼琴, 1, 08:00:00, 22:00:00), (B201, 2號樓 2層, 電子鋼琴, 0, 09:00:00, 21:00:00); -- 用戶 INSERT INTO sys_user (openid, nickname, role, status) VALUES (demo_admin_openid, 管理員, 1, 1), (demo_student_openid, 演示學(xué)生, 0, 1); -- 預(yù)約一條待使用、一條已取消、一條已完成 INSERT INTO booking (room_id, user_id, book_date, start_time, end_time, status) VALUES (1, 2, DATE_ADD(CURDATE(), INTERVAL 1 DAY), 10:00:00, 11:00:00, 0), (1, 2, DATE_ADD(CURDATE(), INTERVAL 1 DAY), 14:00:00, 15:00:00, 2), (2, 2, DATE_ADD(CURDATE(), INTERVAL -1 DAY), 08:00:00, 09:00:00, 1);預(yù)約數(shù)據(jù)里用 DATE_ADD(CURDATE(), INTERVAL 1 DAY) 替代寫死的日期這個(gè)細(xì)節(jié)很關(guān)鍵它保證任何一天打開演示環(huán)境數(shù)據(jù)都是「明天有預(yù)約」不會(huì)因?yàn)闀r(shí)間推移全部過期。演示數(shù)據(jù)永遠(yuǎn)新鮮這是答辯演示最省心的一條技巧。演示路徑我一般按這個(gè)順序走登錄進(jìn)首頁看到三間琴房狀態(tài)各異 → 點(diǎn)開 A101 看到明天的時(shí)段列表 → 選 10:00-11:00 提交預(yù)約成功 → 切到「我的預(yù)約」看到剛剛的記錄 → 取消再重新預(yù)約 → 打開管理員視角看全部預(yù)約記錄。整條路徑覆蓋登錄、查詢、創(chuàng)建、取消、管理五個(gè)核心功能五分鐘講完節(jié)奏剛好。另一個(gè)容易忽略的點(diǎn)提前把演示用的賬號登錄態(tài)保持住別在現(xiàn)場等 wx.login 轉(zhuǎn)圈。正式演示前五分鐘在演示手機(jī)上完整走一遍登錄流程確認(rèn) token 有效再把小程序切到后臺(tái)待命?,F(xiàn)場只做操作不做登錄。做這個(gè)項(xiàng)目時(shí)我最大的教訓(xùn)是把「代碼寫完」當(dāng)成「項(xiàng)目做完」結(jié)果第一次聯(lián)調(diào)時(shí)被沖突檢測的邊界條件打臉。如果你正在做這個(gè)方向我建議把第 4 章的三種重疊用例寫進(jìn)測試跑通了再談演示。開發(fā)里多留一分敬畏答辯時(shí)就少一分慌張。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产99999久久精品| 亚洲、日韩、综合、另类| 密臀国产在线| 91欧美少妇| 97视频在线观看高清资源| 3p国产色噜噜一区| 95自拍视频在线观看| 精品人妻高清麻豆av| 搡老女人911熟妇老熟女| 九七毛片九九毛片| 欧美激情久久久久| 色鬼在线综合| 后入 亚洲 美女 射| 五月大香蕉| 欧美1区二区三区公司| rion磁力链接| 青草精品视频一日本久久久久网站| 日韩在线97| 精品无码久久久| 亚洲天堂99| 日韩亚洲国产视频| 久久午夜鲁丝片| 精品无吗m| 99热国产精品| 肉丝中文无码高清| 亚州国产成人精品女人久久| 在线小视频| 久操在97| 久久久久9999精品九九九| 人妻精品4K4K4K4K4| 91精品电影18| oumeisetu综合| 国产又操| 开心激情婷婷| 欧中日成人免费影视| 婷婷亚洲中文字幕在线| 91老熟女视频| 欧洲在线性爱视频| 欧美91视频| 日韩免费看在线黄色片| 九月婷婷综合| 九久9热| 青青国产精品在线| 欧中日成人免费影视| 欧插网站| 欧美亚综合色图| 大香蕉 222| 日韩天天本| 亚洲极品| 91精品老女人| 伊人五月天婷婷| 十八禁av无码免费网站APP| 成年人性爱日韩| 久久一级无码精品毛片6| 小情侣高清国产在线视频| 在线可观看的黄色网址| 日韩午夜啪啪视频| 精品人人| 久欲AV| 天天日天天看| 国产精品无码论坛| 深夜操逼网| 天色综合网| 97网址97| 殴美性色a级欧美| 久久最新视频免费观看| 国产精品大屁股999| 91热热色| 99这里只有精品国产| 久操网址| 欧美久久婷| 色香伊人| 久久精品一区二区一8| 香蕉国产精品麻豆亚洲欧美日韩| 国产1769在线| 爱爱动态试试看6 0秒| 老熟妇一区二区三区啪啪| 深夜视频| 黄色免费网页无码| 亚洲色图第一页| 久久久久久性爱免费视频| 高清无码在线播放网站| 青青草原综合久久大伊人精品| 久久一二三四不卡| 精品免费一区| 五月婷婷丁香中文字幕| 啊啊啊啊在线播放| 欧亚性爱在线视频| 午夜激情床戏激情| 久久精品国产亚洲粉嫩| 影音先锋视频在线| 亚洲三级网址久久最新| 久久系列| 激情小说图片亚洲首页| 99热9| 久久99精品九九久久久婷婷| 五月天久久综合网| 校园春色之综合网| 久久久97| 夜夜爽爽爽| 久久中文字幕女同性恋一区| 欧美日韩激情无码专区| 台湾佬中文娱乐网久久久久久久久久com | 黄色片大香蕉| 久久亚洲色图中文字幕| 日韩亚洲中文有码视频| 久操 高清| 精品九九九九| 激情四射熟女丝袜| 国产女生在线| 亚洲中字慕不卡| 国产特级毛片AAAAAA高潮流水 | 亚洲色五月| 激情文学小说一区二区| 成人性爱视频在线看| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠 | 国产精品人妻一区二区| 男女猛烈无遮掩视频免费软件| 91五月天| 91制服丝袜中文字幕| 国产成人无码久久精品| 中国AV美女| 久久 亚洲 日韩 人妻| 国产婷婷综合在线观看| 成人老鸭窝人人在线视频| 91人妻少妇| 亚洲中文字幕妇伦久久| 久草国产在线视频| 91痴汉| 桃花色涩综合影院| 日本视频在线中文字幕| 99啪啪| 狠狠操官网| 久久久久网站-538在线视频-欧美永久乱码 | 大吊色| 欧美传媒| 久久精品人妻一区二区| 国产亚洲99久久精品| 国产一二三福利视频网| 青青操97| 26uuu性| 九久久精品| 亚洲日韩精品在线播放| 国产精品乱码久久久久| 99热日| 久热91| 天堂日本亚洲欧美| 久久久久亚洲?V片无码V| 91 丝袜在线观看| 乱理日韩中文| 国产黄色av大片网站| 精品白丝一区| 99 国产丝袜在线| 97青青操视频| 国产动漫操逼视频| 国产成人拍国产亚洲精品| 大香蕉青青9| 亚洲福利中文字幕在线| 国产精品不卡高清在线观看| 午夜精品人妻二区三区| 日日日啊啊啊| 五月婷婷五月天| 激情熟女12P| 亚洲午夜精品久久久中文影院| 花野真衣| 桃花色涩综合影院| а√天堂资源官网在线资源| 蜜臀va69| 青青草综合在线| 日日日啊啊啊| 蜜臀av在线播放一区二区三区| 日韩有码 一区二区三区| 东京热AV男人的天堂| 亚洲最大黄网| www.91色综合| 两性色网| 婷婷香网站| 色色色欧美| 日韩熟女操逼| 天天日夜干| 狠狠干2020| 宅男91视频在线播放| 国产色呦呦| 国产亚洲深夜激情| 国产又黄又粗的视频| 欧美性夜| 日韩无码服务区| 欧美少妇一区二区三区| 9久综合网| 强奸乱伦av电影| www.久久制服糖| 欧洲综合色| 国产91专区| 后入式在线免费观看60秒| 97超碰碰碰| www.天天干| 最新啪啪视频| 女人爽到高潮潮喷18禁网站| 亚洲成A∨人影院在线欢看| 亚洲第一免费视频| 久久黄色视频一区二区三区 | 亚洲成人av色网| 成人午夜视频免费播放| 91强奸乱轮| 户外裸露刺激视频第一区| 看免费一级在线播放毛片| 男人的天堂啪啪| 天堂8在线新版官网| 中国国产精品一区视频| 免费A V在线播放| 色成人Www精品永久观看| 亚洲另类欧美精品| 岛国毛片在线观看免费| 亚洲影院小综合| 全免费a敌肛交毛片免费| 亚欧洲日韩国产精品| 中文伊人大香蕉视频| 亚洲最新av无码成人精品区| 午夜精品久久99蜜桃的功能章节| 成人黄页| 爱爱动态试试看6 0秒| 中文字幕狠狠玩| 精品国产三级av韩国在线| 亚洲人码13| 久久婷婷在线观看视频| 欧美亚男人的天堂| 嗯嗯啊啊操死我| 97人人草| 韩国久久97| 久久97| 亚洲精品中文字幕一区在线视频| 欧美 日韩 亚洲 春色| 国产美女高潮叫床视频| 亞洲久久直播| 久久精品国产72国产精品福利 | 91日韩网站| 熟妇一区,二区,三区。| 久久亚码| 97超碰色色| 天天射天天操天天干天天吃2018 | 日韩性爱电影一区| 香蕉综合网| 色啪网| 裸体美女免费看网站青草| 久久精品欧美一区蜜桃| 蜜臀AV一区二区三区激情综合| 97超碰美国| 五月天春色激情网| 日韩无码AB| 亚洲综合在线91| 亚洲欧美人妻| 一区 欧美 日韩 麻豆| 青青草伊人久久| 男人成人黄色视频在线观看免费下载| 亚洲校园激情| 大学生口爆吞精| 十八禁视频网站| 欧美综合色站| 97综合激情| 久久午夜鲁丝片| 日本欧美国内在线| 操逼精品视频| 亚洲熟妇综合久久久久久| 精品小视频在线| 精品久操| 亚洲熟女乱色| 国产嫩草精品A88AV| 秋霞免费无码视频日韩A片| 乱伦系列一区二区| 亚洲 欧美 综合 91| 97干在线| 丁香婷婷大香蕉| 乱老熟女一区二区三区| 啊v在线观看视频| 综合操逼| 国产视频大全| 国产一区二区免费福利片| 日韩去日本高清在| 91成人久久| 丁香五六月啪啪| 视频二区美腿丝袜制服人妻欧美| 久久久一区二区| 成人无遮挡毛片免费看| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 夜夜狼人妻| 91熟女丨91老女人| 极品内射| 国产自制av蜜乳| 久久久98网站免费视频| 色97干| 一区二区三区精品视频| 天天爱天天操| 另类小说五月天| 日本布卡一区二三区| 中文字幕av亚洲在线| 99日免费视频中文字幕| 亚洲天堂7777| 久久精品28| 曰韩无码777| 亚洲狠狠入| 曰韩无码777| 日本久久久久久久久久| 婷婷五月天成人网| 欧美日韩1234| 欧美性区| 最新三级网址| 久久风骚城市| 国产精点久久久成人| 人妻五十路在线| 亚洲精品国产精品乱码不99| 九九九不卡| 亚洲麻豆精品二区三区| 中文字幕一区二区免费在线| 1000午夜黄色| 亚洲精品国产精品乱码不99| 人妻天堂三区| 日韩一区二区熟女| 黄页网站免费高清在线观看| 99精品九九九九九九| 最新欧美色网| 国产精品网址| 丝袜AV一区二区三区| 亚洲天堂东京热| 日韩黄片视频试看| 精品九区| 欧洲精品一区二区三区| 亚洲宅男天堂| 亚欧免费| 97干在线视频| 天天内射| 日韩一级二级| 秋霞蝌科网日本一区| 精品一区二区三区18| 女人天堂AV五区在线| 岛国片在线播放| 经典丝袜一区| 国内黄色精品| 99在线观看| 91看黄片| 欧美色干| 国产后入清纯| 欧美 熟女 日韩| 国产av尤物| 3D污黄视频在线观看| 欧美78P| 99热18这里只有精品| 色婷婷五月天| 色牛牛AV| 69精品久久久久中文字幕| 国产专区第一页| 国产91亚洲精品一区二区三区| 人妻出轨一区二区三区| 国产懂色精品国产av| 日韩免费在线观看不卡| 综合五月天| 91老熟女老女人国产老太| 99色热| 国产理论视频在线播放| 蜜臀无码视频在线观看| 九九碰九九爱97超| 91狠狠综合久久| 亚洲自拍欧美色综合| julia在线观看久久| 精品久热| 无套内射性感少妇视频| www..com操老师| A 天堂| 超碰人妻97| 久久精品噜噜噜成人看免欧美大片| 99热在线不卡| 色诱中文字幕| 人人妻人人操人人乐| 久热九九| 亚洲精品 大香蕉| 久久九九综合| av国产无码| AV免费在线播放一区| 超97在线精品视频| 1禁看欧美黄片免费看| 精品成人亚洲午夜电影| 国产精品制服丝袜清纯唯美| 在线v中文字幕一区二区三区 | 俞拍久久国应视频| 快播电影网日韩新片| 人人妻天天做天天爽| 一区二区三区成人| 青青草五月份天| 物业黑人 AV一区| 是还免费视频1727我| 素人无码中文字幕| 91伊人久久在线| 亚洲蜜臀视频精品久久| 国产精品动态一区二区三区四四| 丰满少妇精品一区二区| 97爱亚洲| 日韩免费三级黄片电影| 先锋激情∨在线视频播放| 福利社区午夜一区二区| 亚洲精品亚洲人成在线麻豆| 国产无码一二三区| 91校园春色长篇| 欧美在线官网| 91熟女综合| 欧美草草| 久久精品| 亚洲精品影视老司机| 熟妇操花| 熟女丰满人妻一区| 91久久18禁| 69国产对白刺激| 一区二区三区免费视频入口| 国产成人午夜视频网址| 成人性爱全视频观看| 99视频只有精品| 欧美黑人性猛交91| 九9热伊人| 无套后入双马尾| 国产福利一区二| 久久蜜色情在线视频xxx免费观看| 日韩AV色图| 精品人妻一区春色| 中文字幕精品码亚洲| 人人爱人人乐人人操| 26uuu国产日韩综合在线观看| av片在线观看免费播放| 国产日韩精品一区二区三区| 亚洲综合图片在线| 欧美啪啪色吧在线| 嗯啊抽插大香蕉网页| 1024香蕉视频| 欧美91精彩| 人妻91少妇| 八戒无码国产午夜福利| 婷婷久久综合久| 求求你操操我| 久9无限国产| 国产精品嫩草影院免费| 久久久久久夜夜夜夜夜| 97 国产精品| 欧美高清无码免费视频高清版| 亚洲av影院在线观看| 97蜜桃综合| 久久久三区二区一区| 国产又猛又粗又爽又黄| 素人播放一区| 怡红院亚洲怡春院av| 手机午夜电影神马久久| 小少妇| 91 国产丝袜在线播放-百度| 中字幕人妻一区二区三区| 五月丁香啪啪啪| 91AV天美在线视频| 91c色| 啊啊啊好舒服好爽啊啊啊视频| 久久精品国产亚洲粉嫩| 大香蕉520| 欧美精品日韩久久久九| 内射日韩大臀美女| 高清无码人妻久久久一区二区三区aⅴ| 一类av片在线看| 欧色综合| 国产亚洲精品精AV.| 欧美亚洲性爱一区二区| 麻豆天美一区二区| av天天在线观看| 欧美激情视频一区二区| 可以免费观看的AV| 99久草| 久久人妻视频| 色爱亚洲| 久久国产精品,久久国产| 日韩性爱一级片| 99热99re超碰精品| 日韩精品资源专区二区| 青青草精玖玖69精品| 26uuu久久| 黑丝少妇麻豆| 亚洲成人性爱网站在线播放| 亚洲激情天堂网| 高潮的A片激情扒开一区| 久久久999| 国产激情在线| 国产精品交换一区二区| 精品人妻一二三| 亚洲 综合 欧美| 亚洲97综| 亚洲中文电影| 国产精品无码av在线| 亭亭在线资源| 麻豆这里只有精品| 蜜臀久久99精品久久久久久无删减| 国产欧美日韩在线观看麻豆传媒公司| 久久少妇| 欧美日韩国产电影| 男人的天堂一区三区| 中文字幕精品区先锋资源| AV女资源| 日韩AV一区二区三区三州三州| 国产精品久久久久久高清无码免费看| 亚洲性图91| 日韩精品一区二区三区色欲| 九九碰九九爱97超| 亚洲91网站| 久热9| 亚洲日韩人妻中文字幕一区| 久久久草草精品| 国产免费一区二区三区最新不卡| 国产三级在线现体验区| 日本亚欧爱爱| 天天干天天日天天射黄色| 欧美亚洲色图另类国产| 91丝袜视频在线观看| 日本丝袜美腿人妻九九| 97香蕉碰碰人妻国产欧美| 中文字幕乱亚洲美女精品一区| 偷拍超碰| 嗯啊不要在线| 特级毛片特黄久久免费看| 国产亚洲日韩欧| 亚洲春色一区二区三区| 日本 情色 1区2区3区| 成人情色一区二区| 在线无码操| 少妇久久久久久| 日韩人人精品| 婷婷丁香一区二区三区| 欧美后进式| 永久免费发布性爱网| 夜夜嗨视频| 亚洲涩图欧美| 丁香婷婷激情五月天无毒不卡| 丁香五月天激情综合| 很黄很色的视频在线观看| 色九久| 成人天天爽| 欧美 传媒 麻豆 日韩 偷拍| 男人亚洲91首页在线| 爱媛媛久久国产福利| 欧美的性爱网站免费| 97超碰色色| 91痴汉| 玖玖超碰熟| 男生女生啊啊啊啊| 天天干天天日天天射黄色大片| 大香蕉乱伦视频网| 国产精品爽爽va在线观看98| 国产精品亚洲高清在线| 黄色电影在线播放综合网站| 99精品国产户外露出| 果冻传媒A片麻豆熟妇人妻| 国产AB视频| 都市激情人妻一区二区青青操视频 | 韩日精品福利视频一区不卡在线免| 国产欧美美女免费观看视频| 野狼激情网| 欧美夜夜狠| 丁香久久| 久久超碰久| www.狠狠干.coom| 丝袜AV一二三区| 男人天堂久久精品| 亚洲欧洲视频小说在线观看| 大香蕉在线视频15| 亚洲天堂另类小说男人| 欧美在线啊啊啊| 97硬碰| 亚洲限制级| 99蜜桃臀久久久欧美精品网站| 精品一区二区三区四区女| 99在线观看无大码| 色偷偷超碰亚洲| 熟女91网| 精品天堂| 日韩国产精品人妻无码久久久| 九九九九国产| 国产一区二区成人av在线播放| 美国日韩黄片| 中文字幕亚洲永久精品| 亚洲第一在线视频| 国产农村妇女一区二区| 99热精品国产| 97欧美色| 免费成人自拍视频在线| 变态乱伦伪娘灌肠一区二区| 黑人精品成人一区二区三区| julia高潮后不停追击中出| 97人妻色| 亚欧美综合网。| 深夜激情| 亚洲天天做日日做天天谢日日| 2017人人操,人人摸| 久久久 国产精品| 天天综合色电影| 国产人妻一区二区三区欧美毛片| 亚洲 无码 有码 中文字幕| 国产91 丝袜在线播放 | 欧美美女自慰一区二区三区| 九九九九九用不成了| 伊人AAA| 亚洲精品男人的天堂| 久久原创中文| 91干熟女| 射久久| 中文久久一区| 国产51色综合久久免费| 国产精品大屁股999| 亚洲aV无码成人在线观看| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 中文字幕文字幕无码一区二区三区电影99| 青青久久手机线视频| 99久在线精品99re8| 欧美日韩99| av网站免费看| 久久999久| 午夜国产成人福利视频| 亚洲91色| 情色五月天网| 色五月首页| 激情小说图片亚洲首页| 91九九九吃| 亚洲第一综合| 蜜乳av一区二区| 婷婷五月天色网| 超碰国产情侣自拍网| 激情国产乱伦Av| 78精品| 亚码人妻| 色蜜AV| 少妇xx精品| 久久超碰日韩精品| 欧洲精品欧洲精品| 欧美亚洲国内自拍| 色久桃花影院在线观看| 色汉综合| 熟妇女伦乱视频视频| 色综合潮| 97av在线视频| 91精品女厕偷拍视频| 欧美性爱超碰97| 九草在线大香蕉| 无码99| 黄色区免费观看中文字幕| 97超碰中文在线| 内射中国少妇高清视频免费视频 | 26uuu性| 女人天堂av在线播放| 国产成人精品一区| 四虎视频在线观看| 天天综合色电影| 久久久精品成人国产| 人人操人人摸人人看人人插| 夜夜欢天天干| 久久久免费高清中文视频| 欧美色视频在线| 国产一区二区久久| 国产成人亚洲精品自产在线| 黄色电影观看久久9| 日本中文熟女视频| 91色欧美| 破处bbq| 五十路熟女工口| 久久久久密| 99热这里只有精品99| 少妇干B| 18禁美女裸体无遮挡啪啪| 操逼操2| 最近二区三区视频大全| 97久久超碰亚洲| 狠狠干妹子| 国产精品不卡一区二区三区| 天天综合香 ld视频| 天天日B狠狠操| 六月婷婷综合| 激情久久久| www.激情| 中亚黄色三级大片| 久久熟妇五十路一区| 九九玖玖精品| 色老汉色| 免费人人搞97| 91美女在线看| 青青操在线亚洲视频观看欧美在线 | 殴美性天天| 性欧美| 久久99干一本高清| 97资源站国产精品| 午夜福利合集| 欧美性爱一区二区三区| 大香久久| 97精| 97超碰磁| 色吧综合网| 91在线免费精品视频| 中文字幕精品码亚洲| 亚洲色图伊人网| 久草精品一区| 91男人综合| 老鸭窝在线视频播放| 国语精品av| 欧美日韩久久精品爱爱| 国产强奸乱伦第1页| 综合久久久久久久久91| 日韩操p| 国产欧美成人第一页在线观看 | 中文字幕交换人妻| 国产强上视频在线观看| 中文字幕在线高清男人的天堂| 久热无码| 观看免费区二区三区二| 欧美亚洲日韩16色| 99久在线精品99re8| 麻豆 美女 丝袜 人妻 中文| 国产色产精品在线观看| 一起草欧美| 午夜精品探花| 日韩草久视频| 亚洲资源网| 精产品久久| 视频国产成人精品日本亚洲18| 精品午夜福利国产一区二区在线观看| 综合久久欧美| 丰满人妻一区二区三区在线| 天天天天做夜夜夜夜做| 国产又粗又长的视频| 97爱爱爱| 成人美女av| 97爱免费插| 久久6热精品99视频| 日本色日夜干| 国产精品无码av在线| 999久久久精品国产| 99热免费精品| 天躁夜夜躁2021| 亚洲国产欧美一区二区潘金莲| 强奸乱伦αv片| 日韩内射视频| 久久精品无码熟妇一区二区三区视频导航| 欧美综合网| 欧美日韩国产色图在线| 91嫩草欧美| 亚洲国产天堂| 黄色AAAAAAAAAAA大片| 精品国产乱码久久久A| 亚洲欧美日韩制服另类| 日韩啪啪网| 熟妇高潮精品一区二区三区下载| 美女啊啊啊啊啊| 激情五月天婷婷| 久久色网| 日韩一级欧美一级在线观看| 麻豆久久久久久久久丝袜| 一本大道久| 精品国产乱码| 国产不卡精品91| 欧美综合自拍亚洲综合图| 伊人网青青| 农村妇女一级二级三级视频| 我想要啊 啊 啊| 欧美激情性爱视频网站| 91青视频| 亚洲色宗合| 60秒不遮不挡| 91AV国产精品| 美女尤物人人操| 久久综合精品一区二区三区| 超碰九区| 亚洲欧美日韩偷拍色图| 国产高清成人mv在线观看| 国产男女无套97| 九七超碰| www.91色综合| 91欧美经典| 一区二区三区机械有限公司| 四虎免费视频| 国产高清在线观看欧美| 超碰97久久观看| 国产亚洲精品A在线观看下载| 精品丰满人妻一区二区三区免费观| 欧美综合网站999| 久久免费精品视频免一| 亚洲综合校园春色| 色伊人91| 久九9精品| 丝袜熟女一区二区三区| 国产不卡的视频 | 土豪酒店各种姿势玩弄极品幼稚| 色黄色美女大长腿午夜视频| 男人 天堂 日 亚洲| 精品久久99| 北野未奈加勒比av| 草草影院最新网址| a人片中文字幕一区二区| av一区二区三区四区| 曰本熟女视频| 中文字幕五月婷婷免费| 99国产精品久久久在线播放| 国产啊v在线免费播放| 99re这里| 亚洲综合精品国产一区| 2020天天色综合| 六月丁香婷| 欧美色图 色综合图| 自拍偷拍草一草| 91人人看| 先锋激情∨在线视频播放| 久久久久网站-538在线视频-欧美永久乱码 | 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 校园春色制服丝袜中文字亚洲| 国产精品国产精品国产| 麻豆精品A片免费观看| 人人摸.人人色| 天天在线91| 一二三四免费视频| 国产丝袜美女在线一区| 天天操天天谢| 国产一级片| 国产精品久久久久久亚洲色欲| oumeizonghese,www| 成人乱码一区二区三少妇| 78精品| 欧美超碰96| 日本高清有码网址视频| 五十路熟女人妻一区二区三区四区五| 美腿色图| 久久精品国产72国产精品福利| 精品人妻一区二区三区不卡断| 美日韩一卡二卡三卡免费人妻精品| 亚洲第一免费视频| 欧美综合中文| 人妻精品一区二区全免费| 黄色片大香蕉| 天天看夜夜看日日干| 91美女視頻| 色999人与兽| 美国人人操人人操| 蜜臀久久99精品久久久| 97国产伦理| 亚洲图片欧美91N| 亚洲97久久精品亚洲| 91无遮挡| 久久精品日韩专区免费观看| 免费农村成人少妇人妻Aa一区二区视频| 久久av一级av少妇av高潮| 亚洲熟女诱惑| 九九九精品色乱九九九| 东北黄色电影| 欧美性生活综合| 日韩无码操逼片| 亚洲欧美伦综合| 少妇丝袜在线观看AV| 天天影视网综合少妇| 无码在线亚洲| 亚洲性爱乱操x| 亚洲熟女诱惑| 亚洲午夜蜜臀| 成人精品一区二区三区| 久久精品人体AV| 伊人色综合网电影| 精品毛片av一区二区| 精品人妻一区二区三区四区不卡在| 蜜桃臀一区二区三区久久| 国产农村妇女精品一二区| 尹人大香蕉视频在线| 亚洲成熟国产精品美女| 中文字幕精品一区欧美| 日本阿v天堂在线观看| 97久久超碰亚洲| 加勒比五月天| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 精品国产a∨一区天美传媒| 国产青青美女玩逼视频| 亚洲限制级在线| 久久男人的天堂国产| 丁香九月激情啪| 久久精品国产亚洲AV无码电影| 欧美日韩国产另类综合| 大象AV在线| 综合久草| 国产精品一二三免费网站| 超碰AV在线| 国产高清成人传媒影视| 国产女人操逼视频| 嗯啊抽插大香蕉网页| 日韩免费看在线黄色片| 看免费的黄片| ji熟女.com| 女同女同恋久久级三级| 91东京热男人的天堂| 无码不卡八戒| 大学生口爆吞精| 久久天天艹| 青椒国产97在线熟女| 久久性爱网站| www.国产高潮精品| 婷婷综合在线| 亚洲nv男人的天堂网| 人妻激情另类| 欧洲中文字幕| 青青草啪啪网| 狠狠躁日日躁夜夜躁A| 国产精品3| 亚洲男人天堂视频| 一本大道青青| 夜夜嗨视频| 夜夜草我| www.91理论| 爽 好舒服 无码刺激久久| 99ri精品| 偷窥自拍亚洲色图| 欧美色图下一页| 天天日美女的B| av橘色网站| 屁股久久久久久| 高清国产无码av| 亚洲中文国际强奸字幕| 精品-91人妻子系列| 青草视频在线看看看看看看看看看| 91亚洲不卡一区| 欧美少妇性乱| 九九九不卡| 91在线免费精品视频| 啪啪啪东京| 女同性恋久久| 东京热男人的天堂网| 久久亚州高清| 欧美高清在线| 91欧美在线| 亚洲人妻在线一区| 午夜大香蕉| 91在线免费观看处女| 嗯嗯啊啊啊啊轻点视频| 91N综合网| 四虎午夜影院| 蜜桃av综合网发布| 亚洲AV无码| 91亚洲欧美综合高清在线| 日本不卡一二区| 天天干天天舔| 99热日本| 综合天天网| 狠狠躁伊人中文字幕| 免费黄色片。| 91亚州日韩高清| 国产第11页| 中文乱码字幕观看| 郑州宾馆老熟女露脸啪啪| 丝袜美腿诱惑亚洲欧美视频在线观看| www.高清无码诱惑一区.com | 久久久久久91香蕉国产| 久久精品国产97欧美精品亚洲 | av草草在线电影| 国产精品爆乳懂色蜜乳| 久久天堂网| 成人性爱免费播放| 成人性爱美曰韩| 亚洲色图综合| 亚洲成人一区二区精品| 久99热| 狠狠亚洲| 亚洲成a人v欧美综合天堂下载| 成人免费在线网站| 亚洲色图加勒比| 日韩九九九| 欧美国产伊人久久久久| 中文字幕88av在线| 久9九综合在线| 日本熟妇人妻中出视频| 日日黄色三级网站| 日日爱99| 97碰在线视频| 久久久9 9 9精品| 成人无码在线视频网站| 98一区二区精品| 91热热色| 亚洲最大网站av| 亚州 综合 色图| 老司机深夜18禁污污网站| 青青草视频这里只有精品| 久艹99| 岛国在线一区二区三区| 欧美夜色| 午夜国产综合视频在线观看| 天天日少妇逼AV| 国产麻豆91欧美一区二区久久婷婷国产精品 | www.91色综合| 好涩综合| 久碰视频| 国产区在线| 色五月综合| 色路综合| 99精品在线观看| 超碰精品97| 综合色播| 亚洲国产精品无码AV久久久| 国产精品视频一区二区三区八戒| 欧美亚洲性爱一区二区| 无码粉嫩白虎一线天b区| 亚洲第一无码播放立川理惠| 天天色踪合| 可以在线观看的黄色网址| 激情终合网| 黄色片,com| 久久久久久久国产| 国产第12页| 97精品综合久久网| 日韩激情啪啪啪| 96久久久精品| 丁香五月综合| 国产91专区| 黄aaaaaaaaaaaaaaaaaa色网站 | 尤物一级在线免费观看| 国产和美国毛片| 黑人精品成人一区二区三区| 五十路成人在线视频二区三区| 亚洲乱码国产乱码精网站| 亚洲综合草草| 婷婷午夜| 欧美第二页| 亚洲美欧999| 做爱A级亚欧| 自拍第一页| 五月天色图| 97天天| 久久综合日韩亚洲欧美| 国产福利视频精品视频| 18禁久极品美女久久哦哟呀!| 午夜寂寞欧美| 91啪啪视频| 九九热九九| 久久綜合很很很| 亚洲一卡2卡3卡4卡乱码网站| 性感美女啊啊啊在线| 五月丁香啪| 亚洲国产一级黄色视频| 亚精品无码毛片一区二区三区| 人人看人人摸人人色| 国产AV中文| av亚洲天堂资源网站| 蜜乳AV一区二区三区四| 97视频播放| 99精品网站| 综合自拍| 久久久久亚洲Av无码专区老牛影视 | 8x福利精品第一福利视频导航| 久久网亚洲| 91精品成人www| 91足交| 亚洲另类春色| 久久久禁| 久久五月份| 亚洲第91页| 国产三级多多影院2022国产AA一级毛片无码 | 欧美日韩国第一区| 精品国产人成在线| 2019天天干| 91美女视频电影| 美腿色图| 婷婷精品视频| jk白丝没脱就开始啪啪| 久久久久久九九九| 欧美色图91p| 麻豆蜜桃视频在线观看| 最新啪啪视频| 免费αV在线视频| 狠狠躁久久躁| 精品97久久综合| 亚洲丝袜二区| 国产精品香蕉热久久新品| 欧美精品成人一区二区在线观看| 婷婷九月丁香| 亚洲欧美精品久| 97在线免费看| 日本黄 R色 成 人网站| 中文字幕一区二区三区字幕| 在线欧美亚洲| 欧美草草| 久干网| 亚洲人在线成线成人| 婷婷五月天激情网| 这里只有精品视频在线观看麻豆| 超碰欧美97| 国产丁香精品露脸视频| 亚洲性少妇| 影音综合网| 日韩三级久久久| 欧美日韩99| 手机看片1024你懂的国产| 日逼逼免费看| 韩国免费播放一级毛片| 91精品国产一区三一| 妇女乱色二区| 亚洲AV在线资源| 亚州色国| 九九夜精品九九在线| 韩国轻伦国内自拍一区| 67914亚洲精品| 久久五月综合| 国产97色在线| 国产精选三级在线观看| jizzjizz欧美| 天堂无码精品国产久| 岛国激情视频软件| 三级激情网站| 久久久亚洲Av| 欧美 日韩 亚洲 春色| 国产精品一区av在线| 国产又黄又粗的视频| 中国农村熟妇毛片视频| 中文字幕精品免费一区二区| 九九综合九九综合| 9久在线视频只有精品| 又大又大又大又粗爽高潮观看| 91人人操| 久久午夜色播影院免费高清| 亚州男人天堂| 久久91| 家庭乱伦麻豆| 五月天婷婷在线看| 午夜亚洲WWW湿好大| 欧美A片中文字幕| 国产操逼视频在线观看| 国产精品亚洲天堂网址| www.黄色在线| 成人性爱全视频观看| 日韩一级欧美一级在线观看| 亚洲欧洲综合视频在线| 天天做天天爱天天爽| 日韩三级一区| 大香蕉AV在线| 久久亚洲影院一区二区| 国产原创自拍| 天美传媒国产原创中文字幕亚洲欧美另类 | 欧美在线|亚洲| 嗯嗯嗯啊啊在线观看| 大香蕉日韩| 久久日本熟妇熟色一区| 沈阳熟女高潮对白视频| 久久久精品91八戒| 粉嫩不卡一区二区性爱| 色五月丁香五月| 中文字幕av色| 青娱乐手机日韩在线视频| 中出人妻中文字幕91在线| 亚洲综合嫩| 天堂v无码免费视频| 麻花豆传媒剧国产MV出差| 欧美一区二区三区日韩| 成人欧美一区二区三区黑人一| 涩爱AV在线| 精品国产久久乱码| 亚洲欧美清纯| ,成人免费啪啪视频| 无色无码| 69超碰综合| 成人在线永久| 国产精品一区二区密臀| 午夜视频黄| 立川理惠无码一区二区| www老逼91| 视频二区熟女人妻|