99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

基于Spring Boot的游泳館管理系統(tǒng):會(huì)員卡扣減、場次售票與核銷

基于Spring Boot的游泳館管理系統(tǒng):會(huì)員卡扣減、場次售票與核銷 簡介「游泳館管理系統(tǒng)」是一套面向高校計(jì)算機(jī)與數(shù)據(jù)庫課程設(shè)計(jì)的Java項(xiàng)目源碼適合正在完成課程作業(yè)、練習(xí)企業(yè)級應(yīng)用開發(fā)的學(xué)生參考。系統(tǒng)圍繞會(huì)員信息、在線預(yù)約、泳道與更衣室等場地調(diào)度、收費(fèi)記賬及財(cái)務(wù)報(bào)表展開包含會(huì)員等級、預(yù)約沖突處理、場地狀態(tài)維護(hù)等業(yè)務(wù)點(diǎn)并配有基于ER模型的數(shù)據(jù)庫設(shè)計(jì)可幫助理解實(shí)體關(guān)系、數(shù)據(jù)一致性與界面實(shí)現(xiàn)思路。壓縮包共1286個(gè)文件、約3.81MB主要由htm頁面、class字節(jié)碼與java源碼構(gòu)成另含jar、sql及mdf/ldf數(shù)據(jù)庫文件覆蓋前端頁面、程序代碼與建庫腳本。已有1536人學(xué)習(xí)讀者可借助源碼梳理會(huì)員、預(yù)約、場地與收費(fèi)模塊的調(diào)用關(guān)系對照SQL與MDF/LDF文件理解建庫過程并補(bǔ)全需求分析、系統(tǒng)設(shè)計(jì)與測試文檔積累Java數(shù)據(jù)庫項(xiàng)目經(jīng)驗(yàn)。1. 一套跑在瀏覽器里的泳池前臺游泳館管理系統(tǒng)的真實(shí)邊界上個(gè)月有個(gè)做場館運(yùn)營的朋友拿著 Excel 來找我說暑假一天賣三百多張票晚上對賬對了兩個(gè)小時(shí)最后還漏了三張次卡沒扣。這種場景下一個(gè)用 Java 寫的游泳館管理系統(tǒng)干的事其實(shí)很樸素把會(huì)員、票卡、場次、泳道、入場核銷和日結(jié)報(bào)表收進(jìn)一個(gè)后臺前臺掃碼放行后臺自動(dòng)記賬中間不靠人手抄。它適合兩類人一類是做課程設(shè)計(jì)、想找一個(gè)業(yè)務(wù)閉環(huán)完整、表結(jié)構(gòu)不至于太寒酸的 Java 項(xiàng)目另一類是小型場館想拿一份能跑起來的底子改成自己的。邊界也得先說清它不做硬件閘機(jī)直連不接真實(shí)支付渠道核銷和記賬是核心報(bào)表是加分項(xiàng)剩下的靠二次開發(fā)補(bǔ)。2. 技術(shù)棧與工程骨架Spring Boot 分層怎么落到目錄上2.1 技術(shù)選型這套組合為什么成了默認(rèn)答案這個(gè)項(xiàng)目的技術(shù)組合基本是 Java 生態(tài)里做中小型管理系統(tǒng)的標(biāo)準(zhǔn)配置Spring Boot 做容器和自動(dòng)裝配MyBatis-Plus 做持久層MySQL 8 存業(yè)務(wù)數(shù)據(jù)Redis 可選用來放登錄 token 和場次余量緩存前端可以是 Vue2 Element UI 的前后端分離也可以是 Thymeleaf 服務(wù)端渲染。選 Spring Boot 的理由很直接一個(gè)main方法就能把 Tomcat、數(shù)據(jù)源、事務(wù)管理器全帶起來不用再去寫一堆 XML。選 MyBatis-Plus 而不是 JPA 的理由更實(shí)際場館類系統(tǒng)的報(bào)表 SQL 特別多日結(jié)、月結(jié)、按場次統(tǒng)計(jì)人次這些用 JPA 的 Criteria 寫出來又長又難調(diào)而 MyBatis-Plus 保留了手寫 SQL 的自由同時(shí)把單表 CRUD 用BaseMapper省掉了。代碼生成器跑一遍entity、mapper、service、controller 四層骨架就出來了對課設(shè)這種時(shí)間緊的場景幾乎是救命稻草。前端走分離還是走模板取決于你要不要給閘機(jī)側(cè)留接口。分離方案里后臺管理頁面和前臺核銷頁面共用一套axios封裝接口層用 JWT 做無狀態(tài)鑒權(quán)攔截器里解析 token 塞進(jìn)ThreadLocalService 層隨時(shí)能拿到當(dāng)前操作人。模板方案省一個(gè)工程但核銷頁要單獨(dú)做移動(dòng)端適配時(shí)會(huì)很難受我一般還是傾向分離。權(quán)限這塊項(xiàng)目里通常是sys_user、sys_role、sys_menu、sys_user_role、sys_role_menu五張表登錄后查出菜單樹渲染側(cè)邊欄接口層用自定義注解RequirePerm(member:add)配合 AOP 做校驗(yàn)。不要一上來就上 Spring Security 全套配置量會(huì)吃掉你一半的調(diào)試時(shí)間用一個(gè) HandlerInterceptor 加注解足夠撐住這個(gè)體量。2.2 目錄結(jié)構(gòu)一個(gè)包一層看過去單模塊工程是這個(gè)項(xiàng)目最常見的形態(tài)分包按職責(zé)切不按業(yè)務(wù)切??粗鴺闼氐钠饋碚业玫降胤健wim-center ├── pom.xml ├── sql/ │ ├── schema.sql # 建表語句 │ └── data.sql # 字典、菜單、管理員初始數(shù)據(jù) └── src/main/ ├── resources/ │ ├── application.yml │ ├── application-dev.yml │ └── mapper/ # MyBatis XML復(fù)雜 SQL 放這里 └── java/com/example/swim/ ├── SwimApplication.java ├── common/ # Result、BizException、全局異常處理 ├── config/ # MybatisPlus、Jackson、WebMvc、跨域 ├── controller/ # 只做參數(shù)接收和結(jié)果包裝 ├── service/ │ └── impl/ # 業(yè)務(wù)邏輯和事務(wù)邊界都在這一層 ├── mapper/ # 繼承 BaseMapper 的接口 ├── entity/ # 和表一一對應(yīng) ├── dto/ # 入?yún)ο髱r?yàn)注解 ├── vo/ # 出參對象拼裝展示字段 ├── task/ # 定時(shí)任務(wù)場次關(guān)閉、卡過期 └── util/ # 訂單號、二維碼、導(dǎo)出工具dto和vo分開這件事很多課設(shè)項(xiàng)目會(huì)偷懶合并成 entity 直接用結(jié)果是前端一傳參就能改balance字段。分開之后MemberCardDTO里根本不出現(xiàn)余額字段越權(quán)修改從入?yún)用婢捅欢伦×恕M瑯觱o用來拼memberName、sessionName這類跨表展示字段避免在 entity 上掛一堆TableField(exist false)。service/impl是事務(wù)的唯一入口。Controller 不寫TransactionalMapper 也不寫事務(wù)邊界統(tǒng)一收在 Service 的公開方法上異常往上拋全局異常處理器統(tǒng)一轉(zhuǎn)成Result。這套約定聽著教條但項(xiàng)目一旦超過二十個(gè)接口沒有約定就會(huì)亂成一鍋粥。2.3 把項(xiàng)目跑起來配置、建庫、啟動(dòng)四步配置文件里真正需要改的其實(shí)只有三處數(shù)據(jù)源、時(shí)區(qū)、MyBatis 的 mapper 掃描路徑。剩下的照抄即可。server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver # serverTimezone 必須顯式指定否則 MySQL 8 下時(shí)間會(huì)整體偏移 url: jdbc:mysql://127.0.0.1:3306/swim_center?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: root password: 123456 jackson: # 統(tǒng)一出參時(shí)間格式前端不用再自己格式化 date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml configuration: map-underscore-to-camel-case: true # 下劃線轉(zhuǎn)駝峰e(cuò)ntity 不用寫 TableField log-impl: org.apache.ibatis.logging.stdout.StdOutImpl參數(shù)含義逐個(gè)說serverTimezoneAsia/Shanghai解決的是 JDBC 驅(qū)動(dòng)和 MySQL 服務(wù)端時(shí)區(qū)解釋不一致的問題不加它LocalDateTime寫進(jìn)去再讀出來可能差 8 小時(shí)allowPublicKeyRetrievaltrue是 MySQL 8 默認(rèn)加密插件在沒配 SSL 時(shí)的必需項(xiàng)不加會(huì)報(bào)Public Key Retrieval is not allowedmap-underscore-to-camel-case打開后create_time自動(dòng)映射到createTime省掉大量TableField注解。啟動(dòng)步驟按順序走# 1. 建庫字符集必須是 utf8mb4否則會(huì)員昵稱里的表情符號存不進(jìn)去 mysql -uroot -p -e CREATE DATABASE swim_center DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; # 2. 導(dǎo)入表結(jié)構(gòu)和初始數(shù)據(jù)順序不能反 mysql -uroot -p swim_center sql/schema.sql mysql -uroot -p swim_center sql/data.sql # 3. 編譯打包課設(shè)階段沒必要跑測試拖時(shí)間 mvn clean package -DskipTests # 4. 啟動(dòng)生產(chǎn)環(huán)境把 dev 換成 prod日志級別和連接池參數(shù)會(huì)跟著切 java -jar target/swim-center-1.0.0.jar --spring.profiles.activedev跑起來之后先訪問登錄接口拿 token再拿 token 去調(diào)會(huì)員列表能返回?cái)?shù)據(jù)就說明數(shù)據(jù)源、MyBatis 映射、鑒權(quán)攔截器三關(guān)都通了。這一步別急著看前端頁面接口通不通是根頁面白屏十有八九是跨域或者 token 沒帶。提示data.sql里一般會(huì)預(yù)置一個(gè)管理員賬號和幾條卡類型字典。密碼如果存的是 MD5第一次登錄后記得在后臺改掉別直接拿去部署。3. 核心業(yè)務(wù)拆解從賣一張票到放一個(gè)人進(jìn)場3.1 會(huì)員卡與余額扣減先查后改為什么一定會(huì)出事余額扣減是這個(gè)項(xiàng)目里最容易寫錯(cuò)的地方。新手版本的寫法通常是先select出卡對象判斷balance amount然后setBalance(balance - amount)再update。單機(jī)單線程跑起來毫無問題一開并發(fā)就翻車兩個(gè)請求同時(shí)讀到余額 100各自判斷通過各自寫回 0 和 0實(shí)際扣了兩次但賬上只少了一次。正確的做法是把判斷和更新壓到一條 SQL 里由數(shù)據(jù)庫保證原子性影響行數(shù)就是唯一判據(jù)。Service RequiredArgsConstructor public class MemberCardService { private final MemberCardMapper cardMapper; private final CardFlowMapper flowMapper; /** * 扣減余額 * param cardId 會(huì)員卡主鍵 * param amount 扣減金額單位分 * param bizNo 業(yè)務(wù)單號用于流水冪等 */ Transactional(rollbackFor Exception.class) public void deductBalance(Long cardId, Long amount, String bizNo) { // 條件更新余額不足、卡凍結(jié)、卡過期三種情況都會(huì)讓 rows 為 0 int rows cardMapper.deductBalance(cardId, amount); if (rows 0) { throw new BizException(卡余額不足或卡狀態(tài)不可用); } // 流水落庫biz_no 上建唯一索引重復(fù)提交會(huì)直接拋 DuplicateKeyException CardFlow flow new CardFlow(); flow.setCardId(cardId); flow.setAmount(-amount); flow.setBizNo(bizNo); flow.setCreateTime(LocalDateTime.now()); flowMapper.insert(flow); } }對應(yīng)的 Mapper SQLupdate iddeductBalance UPDATE member_card SET balance balance - #{amount}, update_time NOW() WHERE id #{cardId} AND status 1 AND (expire_time IS NULL OR expire_time gt; NOW()) AND balance gt; #{amount} /update三個(gè)參數(shù)的作用分別是cardId定位到具體一行InnoDB 會(huì)在這行上加排他鎖amount是扣減額用減法而不是覆蓋賦值天然避免丟失更新bizNo不進(jìn)這條 SQL但它是流水表的唯一鍵同一個(gè)業(yè)務(wù)單號重復(fù)調(diào)用第二次會(huì)直接拋唯一鍵沖突相當(dāng)于給接口加了一層冪等。為什么不用select ... for update不是不能用而是它把鎖的持有時(shí)間拉長了中間還要走一遍 Java 判斷代碼路徑變長就多一個(gè)出錯(cuò)點(diǎn)。條件更新一條語句解決鎖的范圍和時(shí)長都是最小的。金額單位統(tǒng)一用「分」存bigint這一點(diǎn)后面還會(huì)提到它是對賬能不能對上的分水嶺。3.2 場次容量一條帶 where 的 update 擋住超賣游泳館和普通票務(wù)不一樣它有時(shí)段概念。上午場限 200 人賣滿就不能再賣否則池子里站不下。這個(gè)「賣滿」的控制本質(zhì)和秒殺扣庫存是同一類問題。表里給swim_session放兩個(gè)字段capacity可售人次sold已售人次。下單時(shí)不是先查sold capacity再更新而是直接帶著條件去更新。Transactional(rollbackFor Exception.class) public Long buyTicket(Long sessionId, Long memberId, Long ticketTypeId) { // 第一步占坑。只有 sold capacity 時(shí)才會(huì) 1返回 0 說明已滿 int rows sessionMapper.tryOccupy(sessionId); if (rows 0) { throw new BizException(該場次已滿請選擇其他場次); } // 第二步落訂單。訂單插入失敗會(huì)觸發(fā)整個(gè)事務(wù)回滾把剛占的坑位吐回去 TicketOrder order new TicketOrder(); order.setOrderNo(OrderNoUtil.next()); order.setMemberId(memberId); order.setSessionId(sessionId); order.setTicketTypeId(ticketTypeId); order.setStatus(1); // 1 待入場 order.setCreateTime(LocalDateTime.now()); orderMapper.insert(order); return order.getId(); }update idtryOccupy UPDATE swim_session SET sold sold 1 WHERE id #{sessionId} AND status 1 AND sold lt; capacity /update這段的關(guān)鍵在于「相對更新」而不是「絕對值更新」。sold sold 1是在數(shù)據(jù)庫當(dāng)前值基礎(chǔ)上加多個(gè)事務(wù)并發(fā)進(jìn)來InnoDB 的行鎖會(huì)把它們排成隊(duì)每個(gè)事務(wù)看到的都是上一個(gè)事務(wù)提交后的值sold capacity這個(gè)條件在排隊(duì)過程中逐個(gè)判定第 201 個(gè)人拿到的rows必然是 0。status 1這個(gè)條件也別省。場次被后臺手動(dòng)關(guān)閉之后即使沒賣滿也不該繼續(xù)放票把它寫進(jìn) where 里關(guān)閉動(dòng)作和售賣動(dòng)作天然互斥。注意這里整段必須在同一個(gè)事務(wù)里。如果占坑和落訂單分別提交訂單插入失敗時(shí)坑位不會(huì)回滾sold就會(huì)越漲越高最后場次明明沒人卻顯示已滿這種臟數(shù)據(jù)排查起來極其費(fèi)勁。3.3 入場核銷掃碼掃兩次賬不能記兩條前臺核銷是這個(gè)系統(tǒng)里調(diào)用頻率最高、也最容易出并發(fā)的接口??腿四弥S碼在閘機(jī)前晃網(wǎng)絡(luò)抖一下前端重試一次或者工作人員手快點(diǎn)兩下就會(huì)出現(xiàn)同一個(gè)訂單進(jìn)兩次的情況。核銷接口必須做到冪等。設(shè)計(jì)上走狀態(tài)機(jī)訂單狀態(tài) 1 是待入場2 是已入場3 是已退票。核銷就是把 1 推到 2推不動(dòng)就說明已經(jīng)處理過了。Transactional(rollbackFor Exception.class) public void checkIn(String orderNo, String gateNo) { TicketOrder order orderMapper.selectByOrderNo(orderNo); if (order null) { throw new BizException(訂單不存在); } // 帶原狀態(tài)的條件更新只有當(dāng)前還是 1 才能推到 2 int rows orderMapper.updateStatus(order.getId(), 1, 2); if (rows 0) { // 推不動(dòng)有兩種可能已核銷狀態(tài) 2或已退票狀態(tài) 3 // 已核銷直接靜默返回重復(fù)掃碼不彈紅已退票才需要報(bào)錯(cuò) TicketOrder latest orderMapper.selectById(order.getId()); if (latest.getStatus() 2) { return; } throw new BizException(該訂單狀態(tài)不可入場); } EntryRecord record new EntryRecord(); record.setOrderId(order.getId()); record.setMemberId(order.getMemberId()); record.setSessionId(order.getSessionId()); record.setGateNo(gateNo); record.setEntryTime(LocalDateTime.now()); entryRecordMapper.insert(record); }update idupdateStatus UPDATE ticket_order SET status #{toStatus}, update_time NOW() WHERE id #{id} AND status #{fromStatus} /updateupdateStatus的三個(gè)參數(shù)是訂單主鍵、期望的原狀態(tài)、目標(biāo)狀態(tài)本質(zhì)是一個(gè) CAS 操作。并發(fā)兩次請求只有一個(gè)能把status 1改成 2另一個(gè)影響行數(shù)為 0走靜默返回分支。數(shù)據(jù)庫層面再加一道保險(xiǎn)entry_record表上給order_id建唯一索引。就算哪天有人繞過 Service 直接寫 Mapper或者事務(wù)傳播行為配錯(cuò)導(dǎo)致狀態(tài)更新和記錄插入不在一個(gè)事務(wù)里唯一索引也會(huì)在第二次插入時(shí)拋異常把臟數(shù)據(jù)擋在門外。這種「代碼邏輯 數(shù)據(jù)庫約束」雙保險(xiǎn)的寫法在涉及錢和進(jìn)出的業(yè)務(wù)里我基本都會(huì)加上。3.4 日結(jié)報(bào)表一條聚合 SQL 加一層 VO場館老板每天最關(guān)心的就三件事今天賣了多少張、收了多少錢、會(huì)員占多少。這個(gè)需求用一條 SQL 就夠了不需要在 Java 里循環(huán)累加。SELECT DATE(o.create_time) AS bizDate, COUNT(*) AS orderCnt, SUM(o.amount) AS totalAmount, SUM(CASE WHEN o.member_id IS NOT NULL THEN 1 ELSE 0 END) AS memberCnt, SUM(CASE WHEN o.source 2 THEN 1 ELSE 0 END) AS offlineCnt FROM ticket_order o WHERE o.status IN (1, 2) -- 排除已退票 AND o.create_time gt; #{startTime} AND o.create_time lt; #{endTime} -- 用小于而不是小于等于避開邊界重復(fù) GROUP BY DATE(o.create_time) ORDER BY bizDate DESC幾個(gè)細(xì)節(jié)值得說。SUM(o.amount)依賴amount是整數(shù)分如果是decimal或者double累加幾十萬條之后尾差會(huì)顯現(xiàn)出來對賬時(shí)差一分錢能讓人查一下午。create_time start AND create_time end這種左閉右開的寫法是為了避免BETWEEN在跨天統(tǒng)計(jì)時(shí)把 23:59:59 之后的數(shù)據(jù)漏掉或者重復(fù)算。返回的 VO 里totalAmount在序列化前除以 100 轉(zhuǎn)成元用BigDecimal做除法并指定保留兩位別直接用double除浮點(diǎn)誤差在小數(shù)位上會(huì)現(xiàn)形。public class DailyReportVO { private String bizDate; private Integer orderCnt; private BigDecimal totalAmount; // 出參已轉(zhuǎn)成元保留兩位 private Integer memberCnt; private Integer offlineCnt; }報(bào)表接口一般還要支持按場次維度再切一刀那就把GROUP BY DATE(o.create_time)換成GROUP BY o.session_id其余聚合邏輯不變。同一個(gè) Mapper 里放兩個(gè)selectService 層根據(jù)前端傳的dimension參數(shù)分發(fā)比寫兩套 Controller 干凈。4. 數(shù)據(jù)表與 SQL十幾張表撐起一個(gè)場館4.1 核心表清單與字段取舍整個(gè)系統(tǒng)的表不算多十四五張能覆蓋主要業(yè)務(wù)。按模塊歸一下表名作用關(guān)鍵字段備注member會(huì)員檔案name、phone、status手機(jī)號建唯一索引card_type卡類型字典type、price、times、valid_daystype1 儲值 2 次卡 3 期限卡member_card會(huì)員持卡card_no、balance、remain_times、expire_time金額單位分swim_session場次start_time、capacity、sold、status售賣核心表ticket_order票訂單order_no、session_id、amount、status狀態(tài)機(jī) 1/2/3entry_record入場記錄order_id、gate_no、entry_timeorder_id唯一card_flow卡流水card_id、amount、biz_nobiz_no唯一冪等用coach教練name、level、phone排課關(guān)聯(lián)course_schedule課程排期coach_id、start_time、capacity二次開發(fā)高頻改動(dòng)點(diǎn)locker儲物柜no、status、member_id可選模塊water_quality水質(zhì)記錄ph、chlorine、check_time應(yīng)付檢查用sys_user/sys_role/sys_menu權(quán)限三件套—配關(guān)聯(lián)表字段取舍上有個(gè)原則凡是涉及錢和次數(shù)的一律用整數(shù)存最小單位。balance存分、remain_times存整數(shù)次數(shù)不用decimal也不用double。看著不優(yōu)雅但省掉了所有浮點(diǎn)比較的麻煩balance amount直接比大小不用考慮0.1 0.2 ! 0.3這種玄學(xué)問題。時(shí)間字段統(tǒng)一用datetime而不是timestamp。timestamp有 2038 年上限而且會(huì)隨時(shí)區(qū)轉(zhuǎn)換導(dǎo)出報(bào)表給別人時(shí)容易對不上。datetime存的是字面值存什么讀什么配合LocalDateTime用起來最省心。4.2 三張關(guān)鍵表的建表腳本swim_session是全場最熱的一張表讀寫都集中在這。索引除了主鍵只留一個(gè)時(shí)間范圍查詢用的聯(lián)合索引。CREATE TABLE swim_session ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵, name varchar(64) NOT NULL COMMENT 場次名如上午場, start_time datetime NOT NULL COMMENT 開場時(shí)間, end_time datetime NOT NULL COMMENT 散場時(shí)間, capacity int NOT NULL DEFAULT 0 COMMENT 可售人次, sold int NOT NULL DEFAULT 0 COMMENT 已售人次, status tinyint NOT NULL DEFAULT 1 COMMENT 1開放 0關(guān)閉, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_time (start_time, end_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT場次表;entry_record的重點(diǎn)在唯一索引它是核銷冪等的最后一道防線。CREATE TABLE entry_record ( id bigint NOT NULL AUTO_INCREMENT, order_id bigint NOT NULL COMMENT 票訂單主鍵, member_id bigint DEFAULT NULL, session_id bigint NOT NULL, gate_no varchar(32) DEFAULT NULL COMMENT 閘機(jī)編號, entry_time datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_order (order_id), -- 一個(gè)訂單只能進(jìn)一次 KEY idx_session_time (session_id, entry_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT入場記錄;member_card的card_no唯一索引用來防止重復(fù)發(fā)卡member_id上的普通索引用來做「查這個(gè)人的所有卡」這個(gè)高頻查詢。CREATE TABLE member_card ( id bigint NOT NULL AUTO_INCREMENT, member_id bigint NOT NULL, card_no varchar(32) NOT NULL COMMENT 卡號可掃碼, card_type_id bigint NOT NULL, balance bigint NOT NULL DEFAULT 0 COMMENT 余額單位分, remain_times int NOT NULL DEFAULT 0 COMMENT 次卡剩余次數(shù), expire_time datetime DEFAULT NULL, status tinyint NOT NULL DEFAULT 1 COMMENT 1正常 0凍結(jié) 2作廢, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_card_no (card_no), KEY idx_member (member_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT會(huì)員卡;ON UPDATE CURRENT_TIMESTAMP這個(gè)細(xì)節(jié)省事任何一次 update 都自動(dòng)刷新update_time不用在每條 SQL 里手寫。但要注意如果哪天做數(shù)據(jù)同步需要保留原始時(shí)間得顯式在 update 語句里給update_time賦值否則會(huì)被自動(dòng)覆蓋。4.3 慢查詢一般出在哪這個(gè)體量的系統(tǒng)數(shù)據(jù)量不上百萬基本不會(huì)慢。真正出問題的地方集中在兩類查詢上。第一類是報(bào)表的日期范圍掃描。ticket_order表只建了主鍵索引WHERE create_time BETWEEN ...會(huì)走全表掃。解決辦法是給create_time單獨(dú)建索引或者建(status, create_time)的聯(lián)合索引把狀態(tài)過濾也帶上。聯(lián)合索引的字段順序按「等值在前、范圍在后」排status IN (1,2)是等值create_time是范圍順序不能反。第二類是后臺列表的模糊搜索。會(huì)員列表按姓名或手機(jī)號搜LIKE %張%前置通配符會(huì)讓索引失效。這個(gè)場景數(shù)據(jù)量一般不大實(shí)在要優(yōu)化就上全文索引或者把手機(jī)號改成前綴匹配LIKE 138%。別為了這個(gè)去引 ES運(yùn)維成本遠(yuǎn)超收益。還有一種隱蔽的慢來自 N1 查詢。訂單列表里每條記錄都要顯示會(huì)員姓名和場次名稱如果循環(huán)里逐條查一頁 20 條就是 40 次查詢。改成 MyBatis 的collection嵌套查詢或者直接在 SQL 里L(fēng)EFT JOIN一次搞定。XML 里寫 join 比在 Java 里拼裝可讀性高得多。4.4 初始化數(shù)據(jù)與字典data.sql里必須預(yù)置的東西有四類管理員賬號、卡類型字典、場次模板、菜單權(quán)限。-- 管理員密碼是 BCrypt 加密后的 123456首次登錄必須改 INSERT INTO sys_user (id, username, password, real_name, status) VALUES (1, admin, $2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iKTVKIUi, 管理員, 1); -- 卡類型儲值卡、次卡、月卡 INSERT INTO card_type (id, name, type, price, times, valid_days) VALUES (1, 儲值卡, 1, 0, 0, NULL), (2, 十次卡, 2, 300, 10, 180), (3, 月卡, 3, 500, 0, 30); -- 場次模板日期部分按實(shí)際排期改 INSERT INTO swim_session (name, start_time, end_time, capacity, sold, status) VALUES (上午場, 2024-07-01 08:00:00, 2024-07-01 12:00:00, 200, 0, 1), (下午場, 2024-07-01 13:00:00, 2024-07-01 17:00:00, 200, 0, 1), (夜場, 2024-07-01 18:00:00, 2024-07-01 22:00:00, 150, 0, 1);密碼用 BCrypt 而不是 MD5是因?yàn)?MD5 撞庫太容易而且同一個(gè)密碼每次加密結(jié)果一樣拖庫之后一眼就能看出哪些用戶密碼相同。BCrypt 自帶鹽值每次加密結(jié)果不同校驗(yàn)時(shí)用matches比對。菜單數(shù)據(jù)插入后登錄接口返回的菜單樹才有內(nèi)容前端側(cè)邊欄不會(huì)空著。這塊數(shù)據(jù)建議直接從 SQL 腳本導(dǎo)入別在代碼里硬編碼改權(quán)限的時(shí)候只改數(shù)據(jù)不改代碼。5. 避坑與排查五個(gè)坑每一個(gè)都能卡住半天5.1 環(huán)境和啟動(dòng)階段的三個(gè)坑現(xiàn)象啟動(dòng)報(bào)Communications link failure日志里連不上數(shù)據(jù)庫。原因通常是三種MySQL 服務(wù)沒起、端口不是 3306、或者 8.0 版本必須帶allowPublicKeyRetrievaltrue而配置里漏了。 解決順序是先telnet 127.0.0.1 3306確認(rèn)端口通再檢查 URL 參數(shù)。如果是 Docker 起的 MySQL注意容器內(nèi)外的端口映射本地連127.0.0.1沒問題但配置里寫成容器名就需要在同一網(wǎng)絡(luò)里。現(xiàn)象頁面上的時(shí)間和數(shù)據(jù)庫里存的差 8 小時(shí)。原因是時(shí)區(qū)在三處各管一段JDBC 連接的serverTimezone、Jackson 序列化的time-zone、MySQL 服務(wù)端的time_zone。哪一處沒對齊都會(huì)偏。 解決是把三處統(tǒng)一成Asia/Shanghai并且在實(shí)體類上不要再用java.util.Date統(tǒng)一換成LocalDateTime。Date會(huì)受 JVM 默認(rèn)時(shí)區(qū)影響LocalDateTime是明確的本地時(shí)間語義少一層解釋就少一個(gè)坑?,F(xiàn)象前端拿到的id末尾幾位變成 0或者詳情頁查不到數(shù)據(jù)。原因是雪花算法生成的長整型超過了 JavaScript 的Number.MAX_SAFE_INTEGERJSON 反序列化時(shí)精度丟失。 解決有兩種后端全局配置 Jackson 把Long序列化成字符串或者給主鍵字段加JsonSerialize(using ToStringSerializer.class)。我一般選全局配置一次性解決所有實(shí)體省得漏加。Configuration public class JacksonConfig { Bean public Jackson2ObjectMapperBuilderCustomizer longToString() { return builder - builder .serializerByType(Long.class, ToStringSerializer.instance) .serializerByType(Long.TYPE, ToStringSerializer.instance); } }這個(gè)配置加上之后前端所有id都是字符串路由傳參和比較時(shí)要注意別用直接比數(shù)字血淚經(jīng)驗(yàn)。5.2 業(yè)務(wù)和數(shù)據(jù)層面的兩個(gè)坑現(xiàn)象對賬時(shí)總額差幾分錢逐條核對又看不出問題。原因八成是金額字段用了double或者float累加過程中產(chǎn)生了浮點(diǎn)誤差。0.1 0.2 0.30000000000000004這種事在單條記錄上看不出來聚合之后就顯形了。 解決是把金額全部改成bigint存分Java 側(cè)用Long只在展示層除以 100 轉(zhuǎn)BigDecimal。改的時(shí)候要全表掃一遍凡是decimal(10,2)的金額字段都換成bigintSQL 里的SUM結(jié)果再除。這個(gè)改造越早做越省事等數(shù)據(jù)攢了幾十萬條再改遷移腳本能寫到你懷疑人生?,F(xiàn)象Service 方法上明明加了Transactional拋異常后數(shù)據(jù)還是寫進(jìn)去了。原因有四種常見情況同類內(nèi)部方法自調(diào)用代理不生效異常被try-catch吞掉沒有重新拋出方法不是public異常類型是受檢異常而注解沒配rollbackFor。 排查方法是先看調(diào)用是不是從外部進(jìn)來的再看 catch 塊里有沒有throw最后確認(rèn)注解寫了rollbackFor Exception.class。Spring 默認(rèn)只對RuntimeException回滾業(yè)務(wù)里拋的自定義異常如果繼承的是Exception不加這個(gè)參數(shù)就不會(huì)回滾這個(gè)坑我見過不止一次。// 錯(cuò)誤示范內(nèi)部自調(diào)用事務(wù)注解形同虛設(shè) public void outer() { this.inner(); // 走的是 this不是代理對象 } Transactional(rollbackFor Exception.class) public void inner() { /* ... */ }正確做法是把inner挪到另一個(gè) Bean 里或者注入自身代理Lazy MemberCardService self再調(diào)self.inner()。后者寫法簡單但有點(diǎn)繞前者結(jié)構(gòu)更清晰我一般選前者?,F(xiàn)象核銷接口偶發(fā)Duplicate entry異常日志里一片紅。原因不是 bug恰恰是唯一索引在起作用——同一個(gè)訂單被并發(fā)核銷了兩次第二次插入被擋下來了。但這個(gè)異常如果直接拋到前端工作人員會(huì)以為系統(tǒng)壞了。 解決是在 Service 層捕獲DuplicateKeyException當(dāng)成「已核銷」處理返回成功即可。同時(shí)把狀態(tài)更新的 CAS 邏輯補(bǔ)上讓絕大多數(shù)重復(fù)請求在第一步就被攔住唯一索引只做兜底。6. 二次開發(fā)加一個(gè)培訓(xùn)課程報(bào)名模塊要?jiǎng)幽膸讓訄鲳^跑順之后老板十有八九會(huì)提一句「順便把游泳培訓(xùn)班的報(bào)名也管起來」。這個(gè)需求看著是新增實(shí)際是復(fù)用改動(dòng)清單可以列得很清楚。層次改動(dòng)內(nèi)容復(fù)用點(diǎn)表新增course、course_schedule、course_booking容量字段和swim_session同構(gòu)實(shí)體/Mapper三張表各生成一套MyBatis-Plus 代碼生成器直接跑ServiceCourseBookingService.book()直接套 3.2 的tryOccupy模式Controller報(bào)名、取消、我的課程三個(gè)接口鑒權(quán)和統(tǒng)一返回體沿用菜單sys_menu插三條記錄綁定角色后臺刷新即可見核心的報(bào)名扣名額邏輯和票務(wù)售賣是同一個(gè)套路把表名換掉就行Transactional(rollbackFor Exception.class) public Long book(Long scheduleId, Long memberId) { // 和場次占坑完全一致的 CAS 寫法只是換了張表 int rows scheduleMapper.tryBook(scheduleId); if (rows 0) { throw new BizException(該課程已報(bào)滿); } // 報(bào)名記錄上給 (schedule_id, member_id) 建唯一索引防止同一個(gè)人重復(fù)報(bào) CourseBooking booking new CourseBooking(); booking.setScheduleId(scheduleId); booking.setMemberId(memberId); booking.setStatus(1); bookingMapper.insert(booking); return booking.getId(); }驗(yàn)證的時(shí)候別只點(diǎn)頁面。用ab或者 JMeter 對報(bào)名接口打 200 并發(fā)搶 50 個(gè)名額跑完查SELECT COUNT(*) FROM course_booking WHERE schedule_id ?是不是正好 50再看sold字段和實(shí)際記錄數(shù)對不對得上。這個(gè)驗(yàn)證方法比點(diǎn)一百次頁面都管用而且能順帶壓出連接池配置的問題。還有一個(gè)容易忽略的點(diǎn)新模塊上線前把course_booking的唯一索引和course_schedule的sold capacity條件一起寫進(jìn)回歸清單。后來加功能的人如果只改了 Service 沒動(dòng) SQL接口層面測不出問題只有并發(fā)場景才會(huì)暴露。從那以后我每次給這類系統(tǒng)加新模塊都強(qiáng)制先跑一遍并發(fā)腳本再提測寧可多花二十分鐘也不想半夜被電話叫起來查「為什么多賣了八張票」。希望這些拆解能幫你少走點(diǎn)彎路。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
www.91.com处女在线直播| 亚洲视色| 五月天丁香网| 亚洲色婷婷激情| www.色婷婷| 久久有码| 91视屏在线观看com.wwwvv| 日hao1区| 五月丁香中文婷婷中文| 亚洲精品另类| 五月婷婷丁香日韩在线| 色五月婷婷丁香婷婷| 色五月综合97| 婷久久综合| 噼里啪啦在线观看免费完整版视频 | 欧美在线骚货| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 天天插天天很| 五婷婷六月合| 99re思思在线视频| 婷婷爱综合| 丁香婷婷五月六月久久| 偷拍91九色| 伊久大香蕉| 九九成人| 麻豆AV一区二区三区| 色婷| 99热.com| 久这里只有精品99| 久久停停超碰| 五月天激情小说| 九九热99熟女| 久久性刺激| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 丁六月激情| 在线中文av| 欧美超级视频97| 丁香五月婷婷老师网站| 另类图片五月激情| 97婷婷狠狠久久综合9色| 色婷网站| 狠狠色丁香久久综合婷婷亚洲成人福利 | 99热e| 99热热这里只精品996小说| 久久久久97| 婷婷丁香日韩五月| 久久国产高潮白浆免费观看99| 麻豆五月丁香婷婷| 丁香五月 六月婷婷首页| 26uuu淫色| 99热99网| 五月丁香六月色婷婷| 五月天六月丁香| 欧美丁香婷婷天天操| 欧美日韩一a.无| 色色激情五月天| 成人AV在线电影| 色欲婷婷五月天| 激情色色| 99久久成人| 无码婷婷五月天| 思思99re这里只有| 日本色视| WWW,五月| 色啦啦视频| 婷婷婷婷午夜| 丁香五月综合激情啪啪| 欧美成人无码一区二区三区| 99性爱视频网站| 天天日夜夜拍| 五月天社区| 亚洲精品一区中文字幕乱码| 538任你爽视频不一样的| 久久与婷婷| 婷婷色影院| 六月丁香基地| 国产精品香蕉| 996er热| 影音先锋91在线资源站| 久久婷婷五月天激情| 亚洲一区国产传媒| 五月天色婷婷视频| 91人操| 国产超碰在线| 大大香蕉综合在线| aaa丁香五月天| 激情精品久久| 欧美在线看| www。五月天激情| 欧美激情 日韩无码 婷婷 五月天| 内射丰满人妻| 综合色99| 色播色丁香五月| 生活片五区| 婷婷八月激情| 色停停五月,在线观看| 免费婷婷| 碰久久精品w| 日本一级特黄大片AAAAA级| 99久热在线精品| 色高清无码视频| 这里只有精品视频在线| 青柠影视免费高清电视剧| 99精品女人天堂| 日本熟女视频一区二区| 日日干夜夜干| 99视频热99| 婷婷射图五月天| 日日干日日色| 黄色片区子| 丁香综合伊人AV| 1024操逼视频| 97人人干。| 久久精品爱爱| 91色色色18| 成人做爰A片免费看视频| 色色色丁香| 五月丁香六月婷婷精品| 久久丝袜婷婷| 91日综合欧美| 综合伊人狠狠| 色狠狠色噜噜AV天堂五区| 超碰av天堂| 森林影视大全,最好看的2019年视频 | 大香蕉啪啪啪| 亚洲色另类| 国产精品18久久久| 天天搞夜夜六| 91操操| 在线伦子99热| 蜜桃五月天| 大香蕉综合在线| 91热网址| 色色无码| 91打屁股视频网站| 五月天播播| 99热都是精品| 少妇性按摩无码中文A片| 六月激情网| 欧美天天干五月丁香| 91尤物九色在线| 综合五月激情网| 四色永久成人网站| 人人色婷婷五月天| 五月天久久久| 色五月婷婷、老熟女| 一级黄色影片| 婷婷五月激情网站| 色综合五月天| 中文人妻主播久久| 亚洲无AV在线中文字幕| 深爱五月中文字幕| 日韩成人精品中文字幕电影| 五月色丁香国产在线视频| 天天爽天天| 丁香五月首页| 亚洲色网址| 亚洲操逼网| www.91.com黄| 看黄的网站18禁| 色综合婷婷| 九九热99免费视频| 天天干夜夜谢| 五月丁香网视频| 影音先锋一区二区三区| 91热爆在线| 国产精品成人AV在线| 丁香五月成人av| 影音先锋男士资源网一区| 六月丁香综合网| 亚洲亚洲人成综合网络| 丁香五月六月激情久久| 九九99在线视频| 欧美色婷婷| 成人资源在线| 婷婷综合激情| 日韩AAA| 国产精品久久久久久久久久免费| 日日肏夜夜干| 伊人9在线| 播播网色播播| 激情四射五月天偷偷看婷婷| av操逼网| 色噜噜五月天| 成人做爰A片免费看网站找不到了| 激情深爱五月天| 97丁香花五月天激情小说| AV性爱网| 天天色综合网1| 久久五月天 91| 欧美激情综合五月色丁香| 狠狠色九月| 国产精品色色| 久鲁鲁色网| 午夜天堂一区人妻| 五月久视频| 台湾无码A片一区二区| 日本超碰在线| 精久久色| 97碰超级人人看| 激情丁香五月婷婷| 亚洲欧美国产高清vA在线播放| 久久精品女人天堂AAA| 狠狠操天天干| 另类图片五月天婷婷| 97爱艹婷婷开心丁香激情综合| 丁香五月激情在线| 欧美情月伍月天| 久久久国产精品黄毛片| www,色婷婷| WWW、日本色丁香co m| 热91久| 五月天婷婷乱论小说| 久久99婷婷| 天天干,天天日| 常久最新免费的色吊丝| 国产精品久久99| 99爱在线| 天天综合色| 这里只有精品网站| 99热这里只有精品98| 日本成人内射| 丁香久久| 丁香花五月天激情| 99热在线这里| 色五月五月丁香| 97自拍99| 五月天操逼激情| 婷婷综合色图| 国产综合网在线| 国产成人+综合亚洲+天堂| 久久九九热re6这里有精品| 色色色地址| 色五月开心五月激情五月| 久久sp免费视频| 中文字幕人妻熟女在线| 亚洲久热| 丁香六月激情| 婷婷五月天电影网| 日日爽天天| 亚洲小视频免费播放| 天天久久婷婷| 国产精品久久久久9999小说| 色播六月| 99热亚洲精品| 色色色色色色色色网站| 丁香五月冃欧美| 久久这里精彩免费在线观看| 色哟哟性爱av| 婷婷丁香先锋资源网站| 九色在线五月婷婷网址| 午夜69成人做爰视频| www.jiujiujiu| 五月 婷婷 成人| 99在线观看免费精品视频| 超碰在线观看9| 草久私拍| 婷婷五月天亚洲综合网| 2025超碰| 99燥99日| 艹B高清无码| 五月天婷婷激情| 天堂久久性| 丁香六月婷婷综合在线| 久久精品视频9| 日本本土色网第一区| 91干视频| 婷婷五月情| 大香蕉75线| 亚洲AV成人一区二区在线观看| 婷婷色在线| 亚洲激情在线| 五月婷婷婷婷| 99热这里只有精品8| 国产精品美女| 色婷婷狠| 婷婷亚洲天堂| 99这里都是精品6| 婷婷丁香亚洲色综合91| 色综合久久天天综合网| 99热新网址| 超碰在线94| 激情碰碰碰| 色情成人五月天| 一级黄在线| 嫩草AV久久伊人妇女超级A | 久久婷婷五月天| 久久HD| 色婷婷欧美| 婷婷午夜激情| 综合激情婷婷| 久久久久亚洲AV综合| 国产欧美精品AAAAAA片| 九九色婷| 色五月婷婷1| 亚洲人妻Av| 亚洲不卡| 婷婷的五月天另类视频| 欧美综合五月丁香六月婷| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 97色色视频| 色 色 色综合com| 亚洲精品国产精品乱码视99| 五月丁香激情婷婷| 婷婷五月天综合网| 色综合综合综合| av操逼网| 99热销国产这里有精品| 久久久久久xxxxx| 小视频在线亚洲| 五月丁香久久久日婷婷久久婷婷日| 日日色五月天| 99久热这里只有精品| 九九热精品| 欧美三级欧美一级| 久久小说| 婷婷色在线播放| 色婷婷网| 五月婷婷欧美激情| 亚洲啪啪啪啪| 婷婷色色综合| 97色色婷婷五月天| 天天摸夜夜爽天天做| 97在线天堂| 91丨九色丨国产在线| 亚洲综合无码| 丁香5月啪啪| 色色性爱视频| 丁香六月综合激情| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 26uuu欧美| 国产精品久久久久久白浆色欲| www超碰| av婷婷丁香| 婷婷激情在线| 日本成人噜噜| 色五月激情五月天| 色婷婷久久7777| 日韩黄色网络| 亚州精品久久久久AV无码| 久久久久久久人妻| 国产精品久久久爽爽爽麻豆色哟哟| 91欧美日韩| 九色视频91| 久久久婷丁香五月| 成人婷99最新| 日韩色五月| 色热久| 97五月婷| 五月丁香美女| 午夜九九九九九九九九九九九九九| 午夜丁香婷婷| 综合99综合久久久久久久| 五月丁香va| 狠狠色五月天| 九九爱精品网站| 亚洲精品国产成人AV在线| 欧美va亚洲va在线播放| 色狠狠综合| 碰碰碰91| 天天操狠狠操| 四川BBB搡BBB爽爽视频| 天天艹天天综合网| 五月婷六月| 久久婷婷五月综合色丁香花| 九热在线这里有精品6| 欧美狠狠色| 中字幕视频在线永久在线观看免费| 综合色影院| www.婷婷,com| 国产精品久久久久久久久久| www超碰| 激情五月婷婷啪啪| 五月婷婷无码专区| 天天干天天做| 丁香婷婷激情综合五月激情| 性生活视频98791| www.金莲av| 久久99激情| 五月婷婷色影院| 九一九九黄色| 五月天久久丁香| 另类视频在线| 婷婷亚洲五| 九九AV在线| 熟美女麻豆| 色五月婷婷内射| 青柠影视免费高清电视剧| 91爱啪啪| 亚洲免费婷婷| 丁香五月激情宗合网| 亚洲成人中心| 色情五月天丁香社区| 99色精品| 五月婷婷七月丁香| 香蕉人在线香蕉人在线 | www.婷婷激情网.com| 深爱激情九九五月天| 久久综合婷婷| 激情五月天色播| 久久久精品AV| 欧美色图天堂网| 久久婷婷五月综合伊人| 色婷婷AAA| www.精品99| 久久久久久97| 超碰99在线观看| 日韩无码专区| 丁香五月激情六月欧亚激情综合导航 | 99在线公开视频| 激情无码网| 婷婷九月丁香天堂丁香天堂| 激情五月婷| 碰97久久| 亭亭五月丁香五月天激情| 性日本激情| 色色色99| 日韩久久这里只有精品| 九色视频入口91| 婷婷激情五月色综合| 精品九九九久| www.夜夜操| 激情五月,激情综合网| 99热免费精品| 五月丁香爱婷婷深深| 激情网五月天| 96丁香婷婷九月蜜桃综合久久| 99精品7| 99久久欧美| 婷婷伊人五月天| 99精品视频推荐| 亚洲欧美婷婷五月色综合| 综合网啪啪| 色色婷| 99r这里只有精品哦| 国产精品久久久久久久久久免费| 亚洲va在线| 高清国产AV| 婷婷五月情| 人人操Av| 超级碰人人操人人干| 99热在线看片| 久久综合网免费视频| 1024操逼| 91肏| 色久五月| 婷婷99视频精品| 99婷婷| 亚洲亚洲亚洲AAAAAA| 欧美啪啪网| 久久婷婷色| 亚洲色五月天是什么| 99天堂在线观看免费视频| 殴美日韩成人| 可以看的av网站| 丁香五月久久综合| 4399亚洲视频| 人妻日日日| 丁香五月天狠狠| 亚洲sesesese| 狠狠综合久久综合| 婷婷六月色| 丁香六月婷婷综合欧美| 女性自慰系列第五页| 97超级碰| 日韩人妻无码专区| 五月欧美丁香在线观看| 婷久看人爽| 婷婷综合av| 日韩人妻无码专区| 激情图片久久| 五月婷婷视频28| 一逼色综合| 大香蕉AV电影在线| 日本色婷婷| 婷婷亚洲欧美丁香五月| 婷婷五月天777| www.色情五月天.com| AA丁香综合激情| 思思热久热| 五月色丁香综合| 婷婷激情五月天小说| 九九综合| 91viP在线看| 久久免费视频62| 无码色色色色色| 久碰久| 欧美69久成人做爰视频| 丁香六月啪啪| 婷婷激情在线| 婷婷色基地| 婷婷六月爽| 色色五月天网站| 色婷婷91激情小说| 国产麻豆视频| 另类少妇人与禽zOZZ0性伦| 婷婷伊人久久| se99热久久一本| 婷婷无五月无码视频| 97干在线| 大香蕉99热| www、色色色| 婷婷丁香人妻| 梁铮版《蜘蛛女侠》在线| 丁香九月综合| 99热丁香五月| 婷婷中文字幕网| 91婷婷视频| 精品一二三区久久AAA片| 五月婷婷色影院| 婷婷五月天电影网| 六月丁AV| 超碰1999| 狠狠干无码| 五月丁香六月停停| 五月四色婷婷| 五月天激情AAAA| 成人色站,在线视频,看片-SS1AV| 狠狠干五月天婷婷网| 九九热10| 久久婷婷色情7777网站| 伊人玖玖精品| 色五月婷婷综合| 五月天婷婷基地综合网| 久久久久久久久久91| 99成人在线观看| 91综合在线观看| 成人片黄网站色大片免费毛片| 久久伊人五月天| 久久婷婷五月综合| 激情五月综合网| 久热免费视频| 国产午夜精品AV一区二区麻豆 | 色综合中文色综合网| 久久中国毛毛片爱久久| 婷婷终合色图| www.97碰碰com| 国产免费一区二区三区三州老师F1F1.CC| 一区二区传媒视频| 久久婷婷综合国产| 在线婷婷| 广东99色在线| 男女久久婷婷五月天| 五月丁香婷婷中文网| 婷婷五月色网| 另类小说激情五月天| 99亚洲精品视频| 这里只有精品无码| 少妇高潮一区二区三区99欧美| 色一情一乱一乱一区91Av| 丁香婷婷五月| 亚洲V国产V欧美V久久久久久| 久色精品| 综合激情sV| 丁香五月区| 六月丁香婷婷五月天| 操国产人妻| 五月天狠狠干| 婷婷成人五月天| 无码激情| 成人国产欧美大片一区| 综合日本婷婷| 1024人妻| 开心色播色五月婷婷| 青草激情综合| 成人在线日韩| 69凹凸成人综合网| 性爱网六月丁香| 久9热在线视频| 99热成人| 五月婷婷丁香日韩在线| 国产色网站| 色色是色N一| 五月婷在线色视频| 女人被男人吃奶到高潮| 99久久99久久综合| 人人草碰| 久久婷婷六月| 六月丁香综合| 99热色精品| 丁香五月很很肏| 91操碰| 久久人人人人妻| 另类图片五月天| 欧美性爱五月天| 国产三级在线播放| 激情久久四色| www.婷婷五月| 亚洲精品又粗又大又爽A片| 久久性爱激情| 婷婷五月成人色综合| 亚洲色亚洲精品| 大香蕉手机视频| 九九久久9 9在线观看| 久久久.COM| 天天草天天日| 婷婷激情图片| 伊人狠狠色婷婷综合丁香一区| 激情综合五月激情XXXX| 丁香六月婷婷综合缴| 91操碰| 五月丁香色婷基地综合久久| 五月婷深深爱激情网| 丁香五月另类色婷婷麻豆| 色哟呦av| 五月丁香成人网| 欧美婷婷丁香五月| 俺去也在线官网| 激情五月丁香五月| 久久996re热这里只有精品无码| 婷婷综合成人| 能看的AV| 色婷婷狠狠爱| 亚洲天堂色色| 秋霞九九无码| 五月婷婷综合激情| 色爱亚洲| 狼人婷婷久久| 这里只有精品免费| 日操夜操天天操不卡| 婷婷五月色花丁香社区| 99综合在线| 99热精品超碰| 五月激情网站| 婷婷五月天天| 色播五月丁香婷婷| 激情五月丁香五月| 五月丁香网视频| 91超级碰在线| 啪啪操超碰| 97丁香五月| 婷婷D区| 精品久久婷婷五月天| 丁香激情网| 免费成人网在线观看| 综合五月激情| 五月Huangsewang| 99成人网站| 丁香婷婷六月激情文学| 99在线视频资源| 色玖玖网| 亚洲欧洲中文日韩久久AV乱码| 色色色色丁香| 亚洲VA在线| 国产精产国品一二三在观看| 2025中文在线视频字幕免费观看| 色综合天天| 在线视频你懂得| 五月婷婷99热| 黄色AV日韩| 五月丁香六月香香蕉| 色99热| 综合AV在线| 五月婷网| 亚洲操B| 99re99热| 中文字幕无码人妻少妇免费视频| 99热香港| 色噜噜丁香| 日本va视频| 97涩婷婷| 色综合久久88色综合天天99| 色激情五月| 琪琪色五月天| 婷婷月五天在线在线看| 色墦五月丁香| 99这里只有精品在线| 性爱网五月婷婷| 午夜婷婷五月天| 婷婷激情五月天激情小说| 激情五月天婷婷五月天| 久久9精品视频| 超碰免费在线| 婷婷六月丁香久| 五月婷婷av在线| 亚州操人在线视频| 九九狠狠干| 开心深爱激情网| www。88热在线视频免费观看| 丁香五月激情月| 久久久国产精品黄毛片| 色中色综合| 久久丁香五月| 久久婷五月| 激情九九综合网| 1234操逼网| 九九AV在线| 丁香五月天激情婷婷丁香六月 | 99超碰人人| 久久激情视频| 久热这里只有精品66| 伊人大蕉香| 91精品在线看| 五月天综合区| 日韩另类在线观看| 67194国产| 久久视频这里99| 91无码视频| 欧美色综合天天久久综合精品| 手机免费福利视频| 色九九综合| 国产性av| 99ri国产在线| 99精品网站| 色激情五月| 久久小视频| 五月亚洲| 超黄亚洲瑟瑟网站| 91视频综合网| 一本大道熟女人妻中文字幕在线| 狠狠操狠狠操AV| 极品色丁香| 色婷婷啪啪综合网| 婷色五月天| 丁香五月天在线| 国产伦理精品高清在线观看网站一区二区 | 五月婷成人网| 六月婷久久| 久久caop| 婷婷伊人綜合中文字幕小说| 日韩99色99| 亚洲小视频免费观看| 日逼影音先锋AV男人资源站| 久操热| 中文久久婷婷| 五月天天丁香婷婷| 婷婷色综合| 九九热在线99| er99免费视频在线| 热99国产精品| 99精品国产在热久久婷婷| 久久人妻熟女一区二区| 亚洲五月婷婷| 色色色热| 五月开行婷婷色五月| www.粉嫩av.com| 综合五月丁香97| 国内一级片| 亚洲热热视频| 九色七七| 日韩啊啊啊| 色婷婷五月天堂资源| 九九成人精品免费视频| 97色97干| 男人視頻站| 亞洲自怕| 桃色成人网| 超碰在线成人| 色狠狠综合| 日本色色网站| 五月天网站亭亭| 伊人狠狠操| 激情五月综亚网| 99免费成人网| 超碰人人在线| 色婷婷av在线| 色七七九九| 婷婷刺激综合| 亚洲av成人电影在线观看| 亚洲黄网在线| 欧美色激情四射| 熟女人妻一区二区三区免费看| 狠狠干无码| 久久婷婷影院| 综合激情伊人影视在线| 久热91精品| 9热在线观看| 亚洲AVDVD| 婷婷丁香www视频日本韩国| 人妻有码乱操| 婷婷五月天av小说| 亚洲无码影片| 五月天色色色网| 激情五月婷婷综合秋霞| 婷婷丁香五月天综合在线日韩| 中文字幕按摩做爰| 精品国产一区二区三区四区阿崩 | 日本天天色| 日本天天操| 国产乱子轮XXX农村| 激情小说五月天| 99自拍视频在线观看| 五月婷婷丁香六月| 狠狠综合网| 亚洲中文字幕在线观看| 亚洲色无码A片一区二区麻豆| 色狠狠色噜噜AV天堂五区| 国产精品国产成人国产三级| 无码激情AAAAA片-区区| 色五月婷婷在线观看第一页舔| 婷婷五月在线影院| 殴美97色| 五月丁香激情综合啪啪| 99色天堂| 66久久视频在线| 天天摸日日舔狠狠添婷婷婷| 五月天久久丁香| 婷婷成年人免费视频| 久色大| 久热大香蕉| 97精品综合久久| 99视频这里有精品| 色婷婷丁香AV综合| www.五月天婷婷| 色婷婷影视| 五月 丁香 欧美| 欧美日韩aaaa| 丁香激情五月| 99性爱| 五月天激情美女久久| 婷五月天| 久久精典| 天天操夜夜夜拍拍拍| 色五XX| 久久激情五月天| 婷婷综合五月| 在线中文字幕免费视频| 亚洲人妻Av| 人人操Av| 久久ab| 深爱五月激情| 91精品91久久久久77777| 亚洲AV无码一区二| 五月婷婷在线视频免费观看| 婷婷丁香色五月久久88| 狠狠爱婷婷爱| 色狠狠色噜噜AV天堂五区| 午夜福利8055| 啪啪色激情五月天| 激情五月天www| 91超碰在线观看| 亚洲欧美在线观看| 色噜噜五月天| 日韩婷婷五月天| 日日干夜夜干| 国产又黄又爽又色的免费| 欧美色偷偷大香| 97干在线| 免费观看欧美成人AA片爱我多深 | 九九色综合| 91AV视频| 婷五月天在线草| 五月亭亭开心网| 大地9中文在线观看免费高清 | 中文字幕丰满孑伦无码专区| 9久久网| 五月天开心婷婷久久| 天天在线XXX| 欧美日韩欧美| www99在线观看视频| 色婷婷丁香五月天激情综合网| 2017狠狠干| 五月丁香亭亭激情操逼网| 色V狠狠的干| 色综合色综合色综合| 中文av网| 六月丁香婷婷色狠狠久久| 大波美女VA网站| 久久东京热婷婷五月| www久久久久久久久久久久久久久久久| 五月天堂色| 五月天综合在线观看| 久久大香蕉| 大香蕉99| 天天操天天曰| 午夜不卡久久精品无码免费| 国产精品久久..4399| 俺去也五月天婷婷| 无码人妻丰满熟妇奶水区码| 啊v视频在线观看| 五月丁香中文| 伊人婷婷99热精品| 99久久99热| 久久9精品| 婷婷自拍| 青青草原精品久久| 亚洲蜜桃精久久久久久久久久久久| 日韩成人av在线| 激情综合五月婷婷丁香| 色操综合| 丁香涩涩五月天| 97久久视频| 久久婷婷伊人| 999婷婷综合| 91日韩美女被插视频| 天天爽日日爽夜夜爽| 欧美性生交A片免费看| 亚洲婷婷丁香五月在线| 色婷婷久久综合| 麻豆雪千夏| 99精品免费视频| 97碰操| 亚洲亚洲永久无码777777| 色色欧美色色| http://www.lingjunshare.com/| 亚洲成人免费电影| 99免费热在线精品| 天天色天天日| 国产1区2区3区在线观| www.99视频| 九九激情综合| 色综合婷婷| 超碰人人艹| 激情五月天色网站| 九色视频91疯狂| 另类A片| 日本不卡中文字幕| 另类视频综合| 亚洲天堂热| 亚洲色婷婷| 婷婷丁香五月亚洲欧美| 色色色色网站| 激情小说五月天社区丁香 | 九九视频在线观看视频6 | 热热久久精品视频| 国产熟妇的荡欲午夜视频| 美女婷婷六月色| 性生生活大片又黄又| 五月丁香狠狠爱婷婷综合| 精品少妇人妻AV无码专区偷人| 极品 少妇 内射| 亚洲狠狠色丁香婷婷综合久久| 五月丁香人人婷婷在线观看| 久久久久久99日本| 激情五月婷婷老师| 久久九九婷婷| 热99精品视频五月| 怡红院 久久| 狠狠色综合网| 色宗合久久五月婷婷| 亚洲综合视频八| 国产激情综合五月久久| 婷婷九月亚洲| 日本欧美成人片AAAA| 色播五月天天| 91在线视频观看午夜福利| 激情五月六月婷婷| 亚洲色图45p| 人人操AV| 91大屁股| 嫩草视频观看| WWW,五月| 丁香五月狠狠综合欧美| 天天久久婷婷| 综合视频久久| 77799热| 九月婷婷综合色干| 任你爽精品免费视频6| 九九热这里只有精品556| 亚洲最大成人综合网720P| 婷婷王月天影院| 五月丁香久人妻中文| 色中色综合| 六月丁香婷婷天堂| 色九月综合网| 99热亚洲精品| 日日日影院| 色情五月天丁香社区| 五月婷婷激情| 天天视频亚洲| 日韩欧洲亚洲| 亚洲中字AV电影在线网站| 天天澡天天狠天天天做| 99色区| 99热黄| 九九热在线视频观看| 日韩精品色| 九九大香视频| 国产欧美精品AAAAAA片| 99在线观看精品视频| 久久久精品99亚洲综合| 99爱在线| 开心激情五月天网| 激情五月深爱婷婷| 激情综合五月| 激情五月天情色| 激情综合网色播五月| 丁香五月六月婷婷殴美综合| 激情五月天色色网| 亚洲日比视频| www.夜夜操.com| 激情五月天电影| 五月色亭丁香| 婷婷色在线播放| 成人国产欧美大片一区| 五月天婷婷基地综合网| 久久婷婷操| 99色色网| 国产三级在线播放| 五月天激情小说| 五月开心久久| 婷婷综合成人五月天| 综激情网| 亚洲av成人一区二区电影在线| 99在线观看精品视频| 日韩五月丁香| 人人色AV| 婷婷五月天丁香花| 综合爱久久| 99国产在线精品视频| 亚洲欧美婷婷五月色综合| 美女妹子后射视频网站在线观看| 色婷婷中文字母五月丁香| 欧美色色色色色色| 婷婷五月色综合香五月| 天天综合精品| 91久久综合亚洲鲁鲁五月天| 天天摸夜夜夜| 五月色丁香婷婷中文字幕| 色欲天天综合网| 金品在线视频99| 久婷婷视平| 亚洲人妻av伦理| 午夜天堂啪啪| 99无码精品| 国产精品热搜丁香五月婷婷| 天天在线久久综合 | 九九精品婷| 婷婷操无码| 99噜噜噜在线播放| 激情综合网五月天| 婷婷99视频精品| 免费视频99| 天天摸天天日天天舔| 五月婷无码| 丁香五月天在线视频| 草一草avb| 偷拍91九色| 激情五月婷婷色色| 国内一级片| 少妇2做爰HD韩国电影| 国产日韩欧美性爱| 开心五月婷婷激情| AV在线免费网站| 五月丁香啪啪啪| 色五月天电影| 婷婷五月丁香六月综合网| 五月丁香婷婷潮喷中文字幕| 久久五月婷婷开心网| 丁香婷婷人妻综合网| 凹凸7777操操操| 精热在线综合网| 久久综合99| 日本色婷婷| 五月丁香综合| 97色婷| 99精品国产在热久久 | 日韩在线观看亚洲| 性热视频99精品| 色五月婷婷操逼| 成人版视频在线观看| 色色五月婷婷久久| 玖玖爱综合网| 亚洲午夜AV| 午夜丁香婷婷| 超碰成人免费| 嫩BBB槡BBBB搡BBBB| 精品国产乱码久久久久夜深人妻| 精品一二三区久久AAA片| 777精品久无码人妻蜜桃| 欧美经典片免费观看大全| 福利视频在线播放| 日本黄色一级| 涩丁香91| 99热这里| 激情av在线| WWW.99热| 女人天堂AV| 狠狠精品干练久久久无码中文字幕| 亚洲精品V天堂中文字幕| 中文字幕视频色婷婷| 五月天另类小说久久小说网| 久久亭亭电影| 天堂综合久久| 无码人妻激情| 欧美噜噜免费观看| 9久热这里只有精品视频| 婷婷五月丁综合| 99热这里只有精品9| 91视频精品99| 激情99| 狠狠婷婷色| 日韩情色在线观看| 97碰| 开心五月激情| 蜜臀嫩草| 99精品一二三四视频| 色无码| 色插人人| 亚洲婷婷五月| 婷婷五月激情四月综合| www.日韩艹| 激情五月天社区| 九九综合久久| 精品一二三区久久AAA片| 婷婷色色宗合网| 91热99| 激情网开心网| 激情五月综合网| 激情小说五月天| 亚洲AV成人无码精品| 久久3p| 夜夜天天久久婷婷| 激情图片五月天| 五月天开心网| 97婷婷五月丁香| 亚洲区视频| 涩涩婷婷五月| 99九无网码| 99国产精品久久久久久久久久久 | 婷婷久久五月天丁香| 99在线观看视频蜜臀| 玖玖热视频| 激情五月天综合网| 五月天婷婷网站| 伊人激情| 99无吗| 五月丁香影院| 五月丁香婷婷色播无码| 一级片sese片.COM| 思思国产99| 婷婷久久大香蕉| 91久久九色| 五月婷成人网| 久久精品99久久久久久| 超碰日韩人妻在线| 超碰人人艹| 99久久久| 色色五月天婷婷| 久婷婷色| 五月丁香亭亭天天舔| 97色色婷婷| 青青操日本摸摸看看| 丁香五月激情宗合网| 婷婷天天色| AA片在线观看视频在线播放 | 丁香五月天偷拍| 这里只有精品视频在线| 国产人妻777人伦精品HD| 爱久综合| 综合激情站| 国产真人做爰视频免费| 亚洲一级色电影| 成人综合伍月天| 噼里啪啦完整版中文在线观看| 婷婷五月综合色拍| 视频色色色色色色| 中国女人做爰A片| 婷婷五月亚洲综合| 夜夜爽天天干| 这里只有精品96| 色频玖玖五月天| 五月丁香激| 丁香久久激情俄| 国产美女最新VA在线免费观看| 丁香六月婷婷色XXXXX| 久热亚洲| 精品色色色| 精品香蕉99久久久久网站| 日韩中文欧美| 伊人婷婷大香蕉| 激情丁香久久| 五月天婷婷中文字幕在线播放| 精品人妻伦九区久久AAA片| 五月激情啪啪| xxxx久| 五月间天堂综合| 综合九九| 日韩啪啪视品| 久久婷婷五月天激情| 五月丁香六月| 久久久五月天| 中文字幕AV在线| 97热在线精品| 五月综合视频| 亚洲成人AV在线| 夜丁香综合| 超碰成人影视| 五月婷婷丁香在线视频| 99视频在线观看地址| 天天色爽| 亚洲综合五月天婷婷丁香| 久久五月视频| 99热这里只有精品在线| 色综合色| 99久久6| 婷婷色婷婷| 亚洲激情四射| 久久99网站| 九九视频这里只有精品| 色婷婷丁香| 91碰碰| 五月婷婷干干干| 五月激情综合网| 丁香婷婷六月婷婷六月婷婷六月婷婷| 久久丁香五月婷婷| 婷婷五月情| 国产精品大香蕉| 亚洲综合网激情五月天| 六月丁香五月激情婷婷| 久久无码成人| 色小说五月婷婷| 激情综合视频| 激情五月天色婷婷| 艹色18p| 五月久视频| 九九综舍久久| 五月婷婷黄色| 激情五月,色五月| 丁香五月综合| 五月婷婷在线网站| 久久日婷婷| 这里只有精品无码| w婷婷五月婷婷w| 色五月激情五月天| 99热在线里有精品| 日韩AV免费看| 婷婷丁香五月在线播放| 久色五月天| 欧美日韩99| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 激情婷婷狠狠干| 超碰69天堂| 九九视屏| 久热无码| 无码激情AAAAA片-区区| 这里只有精品免费观看网占| 综合激情在线观看| 久久综合中文| 五月丁香婷婷AV天堂| 一级黄色片看看| 成人短视频在线免费观看| 国产67194| 亚洲乱码日产精品BD| 国语精品探花| 91久久精品无码一区二区三区| 天天影院色| 五月天婷婷导航| 啪精品| 99热国产免费| 激情五月婷在线精品| 玖玖精品婷婷| 亚洲精品99| 五月婷婷激情四月| 久久久性爱网| 99精品成人无码A片观看金桔| 五月婷婷福利| 97香蕉久久超级碰碰高清版 | 99热1| 丁香五月日啪| 六月婷婷最新网址| 日本色五月| 丁香美女主播视频在线观看| 婷婷久久丁香五月| 中文中文在线| 播播网色播播| 99热久只有| 亚洲九九婷婷| 久久性爱视频| 九九热精品在线| 这里只有精品日韩精品| 国产4P视频精品五区| AV九九| 91久久电影| 中文aV网| 草一草avb|