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

ARTICLE DETAIL

資訊詳情

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

Java網(wǎng)上書店系統(tǒng)實(shí)戰(zhàn):Spring Boot與MySQL實(shí)現(xiàn)訂單事務(wù)與庫(kù)存扣減

Java網(wǎng)上書店系統(tǒng)實(shí)戰(zhàn):Spring Boot與MySQL實(shí)現(xiàn)訂單事務(wù)與庫(kù)存扣減 簡(jiǎn)介這是一套基于 Java 實(shí)現(xiàn)的網(wǎng)上書店及書店管理系統(tǒng)課程設(shè)計(jì)資源面向正在準(zhǔn)備畢業(yè)設(shè)計(jì)、課程設(shè)計(jì)或需要 Java Web 項(xiàng)目實(shí)戰(zhàn)的學(xué)習(xí)者。系統(tǒng)分為顧客和管理員兩類角色顧客可注冊(cè)登錄、瀏覽圖書并按圖書類別、名稱、作者三種方式查詢購(gòu)買同時(shí)支持購(gòu)物車、訂單及個(gè)人資料管理管理員則可對(duì)圖書、訂單和用戶信息進(jìn)行查看與增刪改查。前端采用 Vue Bootstrap后端使用 Java Servlet JDBC 連接 SQL Server整體技術(shù)路線典型且完整。資源包共 1664 個(gè)文件約 25.68MB涵蓋 HTML、LESS、JS、CSS 等前端源碼Java、Class 等后端邏輯以及圖片、字體和工程配置文件結(jié)構(gòu)清晰便于導(dǎo)入開發(fā)工具后理解與復(fù)用。目前已有 536 人學(xué)習(xí)下載除項(xiàng)目源碼和項(xiàng)目說明外還適合直接作為畢設(shè)/課設(shè)方案使用也可作為 Java 學(xué)習(xí)者對(duì)照實(shí)踐、二次開發(fā)的參考藍(lán)本。1. 網(wǎng)上書店課程設(shè)計(jì)先搞清楚這行字背后的真實(shí)要求很多人在拿到「課程設(shè)計(jì)基于Java實(shí)現(xiàn)的網(wǎng)上書店及書店管理系統(tǒng)源碼項(xiàng)目說明.zip」這個(gè)標(biāo)題時(shí)第一反應(yīng)是去找現(xiàn)成的壓縮包解壓、導(dǎo)入IDE、點(diǎn)運(yùn)行然后寫一份報(bào)告交差。但真正動(dòng)手做過的同學(xué)都知道這個(gè)流程走下來翻車的概率極高代碼能跑起來不代表知道怎么講清楚報(bào)告寫得再厚也掩蓋不了核心邏輯沒有閉環(huán)。這個(gè)題目的本質(zhì)不是「做一個(gè)賣書的網(wǎng)站」而是用Java把兩條業(yè)務(wù)鏈路走通一條是面向讀者的檢索、下單、支付模擬另一條是面向管理員的庫(kù)存、訂單、用戶維護(hù)。兩者共用同一套數(shù)據(jù)庫(kù)和業(yè)務(wù)層區(qū)別只在接口和權(quán)限邊界。這個(gè)題目適合誰(shuí)適合正在修Java課程設(shè)計(jì)、需要一個(gè)能在答辯現(xiàn)場(chǎng)講明白的項(xiàng)目的人也適合想從「跟著視頻敲代碼」過渡到「自己設(shè)計(jì)表結(jié)構(gòu)和接口」的初學(xué)者。網(wǎng)上書店的難點(diǎn)從來不在頁(yè)面而在數(shù)據(jù)一致性、狀態(tài)流轉(zhuǎn)、并發(fā)扣庫(kù)存這類平時(shí)上課不太細(xì)講的地方。這篇文章不替你寫代碼但會(huì)把表怎么建、事務(wù)怎么開、參數(shù)怎么調(diào)、哪些地方會(huì)莫名踩坑講透給你一條能復(fù)現(xiàn)、能解釋、能扛住提問的完整路徑。2. 技術(shù)選型Servlet還是Spring Boot為什么最終這么定2.1 課程設(shè)計(jì)場(chǎng)景下的三套方案對(duì)比常見的做法是把技術(shù)路線分成三檔。第一檔是純JSPServletJDBC好處是和學(xué)校課程內(nèi)容貼合度最高從HttpServlet到PreparedStatement幾乎就是把課堂代碼放大了一遍老師問什么你都能對(duì)上號(hào)。壞處是代碼結(jié)構(gòu)很容易變成「JSP里寫Java、Servlet里拼HTML」的意大利面項(xiàng)目一旦超過十個(gè)頁(yè)面就難以維護(hù)。第二檔是SSH或SSM這種老框架組合現(xiàn)在越來越多學(xué)校已經(jīng)不講Struts了除非你確定老師認(rèn)可這條路否則不推薦為了「顯得高級(jí)」去用一套自己都說不清原理的東西。第三檔是Spring Boot MyBatis或MyBatis-Plus Thymeleaf這也是我實(shí)際帶課設(shè)時(shí)最常推薦的一條路線。為什么推薦Spring Boot因?yàn)樗钱?dāng)前Java后端崗位面試題里的??妥鐾赀@個(gè)項(xiàng)目你順手就把依賴注入、自動(dòng)配置、事務(wù)注解這些概念全摸了一遍哪怕學(xué)校不強(qiáng)制要求簡(jiǎn)歷上也能寫。更現(xiàn)實(shí)的理由是Spring Boot內(nèi)嵌Tomcat打包成jar就能跑避免了在本地Tomcat里部署war包時(shí)出現(xiàn)的一堆環(huán)境變量問題。MySQL還是H2課設(shè)答辯現(xiàn)場(chǎng)最怕的就是數(shù)據(jù)庫(kù)連不上。H2的內(nèi)存模式雖然零配置但數(shù)據(jù)類型和真實(shí)MySQL有差別而且老師可能會(huì)現(xiàn)場(chǎng)要求看數(shù)據(jù)所以我更建議用MySQL 5.7或8.0把建庫(kù)SQL腳本放進(jìn)項(xiàng)目里答辯前手動(dòng)執(zhí)行一遍即可。2.2 依賴選型與參數(shù)設(shè)置一個(gè)能直接抄的pom.xml無(wú)論你選Spring Boot 2.7還是3.x關(guān)鍵依賴就那幾個(gè)spring-boot-starter-web、spring-boot-starter-thymeleaf、mybatis-spring-boot-starter、mysql-connector-j、lombok。Spring Boot 3.x要求JDK 17如果你機(jī)器上裝的是JDK 8那就老老實(shí)實(shí)用2.7.x不然編譯都過不去這是一個(gè)最常見的啟動(dòng)失敗原因。下面這段pom.xml是我常用的配置基線parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.1/version /dependency !-- 管理端可以使用JSP但一致性考慮建議全用Thymeleaf -- dependency groupIdmysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies版本號(hào)這里有兩個(gè)值得注意的點(diǎn)。第一mybatis-spring-boot-starter不要用太老的版本1.x系列和Spring Boot 2.7有兼容性警告直接上2.3.x就好。第二MySQL驅(qū)動(dòng)在Spring Boot 2.7里一般用mysql-connector-j而不是舊的mysql-connector-java后者在某些組合下會(huì)出現(xiàn)時(shí)區(qū)錯(cuò)誤。spring-boot-starter-parent鎖定了驅(qū)動(dòng)版本你不需要專門指定但如果你習(xí)慣手動(dòng)指定版本請(qǐng)確保它至少是8.0.33否則SSL握手報(bào)錯(cuò)會(huì)把你逼瘋。配置文件的重點(diǎn)在application.yml。spring.datasource.url里必須帶useSSLfalse和serverTimezoneAsia/Shanghai這是兩個(gè)缺一不可的參數(shù)。前者解決本機(jī)MySQL沒有配置SSL證書時(shí)連接被拒的問題后者解決Java時(shí)區(qū)與MySQL會(huì)話時(shí)區(qū)不一致導(dǎo)致的時(shí)間錯(cuò)亂問題后面避坑章節(jié)會(huì)再細(xì)講。3. 數(shù)據(jù)庫(kù)設(shè)計(jì)把「書店管理系統(tǒng)」拆成六張表的完整建庫(kù)腳本3.1 表結(jié)構(gòu)與字段設(shè)計(jì)用戶、圖書、購(gòu)物車、訂單網(wǎng)上書店的數(shù)據(jù)模型放在任何課程設(shè)計(jì)里都是標(biāo)準(zhǔn)的「用戶-商品-訂單」三元組但大多數(shù)人把它做成了五張互不關(guān)聯(lián)的孤立表導(dǎo)致下單時(shí)邏輯寫在Servlet里連查四張表事務(wù)還不知道怎么開。正確做法是先按業(yè)務(wù)歸屬劃分模塊用戶模塊只關(guān)心user表圖書模塊只關(guān)心book表而訂單模塊需要同時(shí)依賴order和order_item兩張表購(gòu)物車則單獨(dú)用cart表來保存臨時(shí)狀態(tài)。用戶和地址之間如果急著交作業(yè)不需要單獨(dú)建地址表直接給user表加一個(gè)address字段即可這樣能省去一對(duì)多關(guān)聯(lián)時(shí)要處理的那一堆麻煩。我給出的建表SQL遵循幾條原則主鍵用自增int不用UUID因?yàn)樵谡n設(shè)規(guī)模下UUID白白增加索引存儲(chǔ)和查詢開銷金額字段用decimal(10,2)絕不用float或double避免浮點(diǎn)誤差時(shí)間字段統(tǒng)一datetime由Java側(cè)通過LocalDateTime傳入不讓MySQL的CURRENT_TIMESTAMP在批量插入時(shí)產(chǎn)生時(shí)區(qū)歧義狀態(tài)字段用tinyint而不是varchar因?yàn)閮?nèi)存占用更小而且Java枚舉映射更自然。下面這段是建庫(kù)腳本的核心部分CREATE DATABASE IF NOT EXISTS bookstore DEFAULT CHARACTER SET utf8mb4; USE bookstore; CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE COMMENT 登錄名, password VARCHAR(100) NOT NULL COMMENT 加密后密碼, nickname VARCHAR(50) DEFAULT COMMENT 顯示昵稱, address VARCHAR(200) DEFAULT COMMENT 默認(rèn)收貨地址, role TINYINT NOT NULL DEFAULT 0 COMMENT 0-普通用戶 1-管理員, create_time DATETIME NOT NULL COMMENT 注冊(cè)時(shí)間 ) ENGINEInnoDB COMMENT用戶表; CREATE TABLE book ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL COMMENT 書名, author VARCHAR(50) NOT NULL COMMENT 作者, price DECIMAL(10,2) NOT NULL COMMENT 定價(jià), stock INT NOT NULL DEFAULT 0 COMMENT 庫(kù)存余量, sales INT NOT NULL DEFAULT 0 COMMENT 累計(jì)銷量, publisher VARCHAR(100) DEFAULT COMMENT 出版社, cover_path VARCHAR(200) DEFAULT COMMENT 封面圖存儲(chǔ)路徑, status TINYINT NOT NULL DEFAULT 1 COMMENT 1-上架 0-下架 ) ENGINEInnoDB COMMENT圖書表;user表里的password字段長(zhǎng)度我預(yù)留到100不是因?yàn)槲掖蛩愦婷魑亩菫榱私oBCrypt加密結(jié)果留空間。很多課設(shè)項(xiàng)目用varchar(20)存密碼答辯時(shí)老師要求展示數(shù)據(jù)庫(kù)直接在Navicat里看到一串明文這是非常掉價(jià)的細(xì)節(jié)。book表的sales字段可以在每次下單成功后通過事務(wù)更新和stock做聯(lián)動(dòng)。status字段用于下架操作而非物理刪除因?yàn)闅v史訂單關(guān)聯(lián)不能斷。3.2 訂單與訂單明細(xì)為什么必須拆兩張表訂單和訂單明細(xì)一定要拆這是整個(gè)設(shè)計(jì)里最容易被問倒的地方。如果不拆一個(gè)訂單包含三本書就要在order表里插三行每一行的總金額還都不一樣查「某用戶的歷史訂單列表」時(shí)會(huì)出現(xiàn)無(wú)數(shù)重復(fù)行更重要的是如果要改訂單狀態(tài)得同時(shí)改三行的狀態(tài)一個(gè)字段漏了數(shù)據(jù)就亂套。拆成兩張表后order表用于記錄一次購(gòu)買行為order_item用于記錄這次行為里的每一本書及其快照信息。快照的意思是下單那一刻的單價(jià)、書名、作者要原樣存進(jìn)明細(xì)表不能通過book_id去關(guān)聯(lián)查詢否則以后書改了價(jià)歷史訂單的金額也跟著變這在業(yè)務(wù)上是嚴(yán)重錯(cuò)誤。CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT 業(yè)務(wù)訂單號(hào), user_id INT NOT NULL COMMENT 下單用戶ID, total_amount DECIMAL(10,2) NOT NULL COMMENT 訂單總金額, status TINYINT NOT NULL DEFAULT 0 COMMENT 0-待支付 1-已支付 2-已發(fā)貨 3-已完成 4-已取消, create_time DATETIME NOT NULL COMMENT 下單時(shí)間, pay_time DATETIME DEFAULT NULL COMMENT 支付時(shí)間, KEY idx_user (user_id) ) ENGINEInnoDB COMMENT訂單主表; CREATE TABLE order_item ( id INT AUTO_INCREMENT PRIMARY KEY, order_id INT NOT NULL COMMENT 所屬訂單ID, book_id INT NOT NULL COMMENT 圖書ID, book_title VARCHAR(100) NOT NULL COMMENT 下單時(shí)書名快照, book_price DECIMAL(10,2) NOT NULL COMMENT 下單時(shí)單價(jià)快照, quantity INT NOT NULL COMMENT 購(gòu)買數(shù)量, KEY idx_order (order_id) ) ENGINEInnoDB COMMENT訂單明細(xì)表;注意order我用的是orders作為表名。order是SQL的關(guān)鍵字直接建表會(huì)報(bào)語(yǔ)法錯(cuò)誤除非你全程加反引號(hào)但那樣寫Mapper XML時(shí)很容易漏所以建表時(shí)避開關(guān)鍵字是最省心的選擇。order_no字段設(shè)計(jì)成varchar(32)業(yè)務(wù)上用于展示給用戶看一般由Java側(cè)生成格式類似20250607153012 用戶ID之類的組合比自增ID更適合復(fù)制到客服對(duì)話框里核對(duì)。3.3 購(gòu)物車與種子數(shù)據(jù)讓系統(tǒng)交付時(shí)不用手動(dòng)造數(shù)購(gòu)物車表是典型的弱實(shí)體它只做兩件事記錄用戶往購(gòu)物車?yán)锓帕四男涗浢勘緯帕藥妆?。cart表不需要獨(dú)立主鍵業(yè)務(wù)含義用id自增即可(user_id, book_id)加一個(gè)唯一索引防止同一本書被重復(fù)插入兩行。管理員功能不需要單獨(dú)的表user表里的role字段已經(jīng)區(qū)分了身份管理端頁(yè)面靠攔截器控制訪問即可。sales表如果你有時(shí)間可以做沒有也不影響核心功能因?yàn)閎ook.sales已經(jīng)能支撐「熱銷排行」這個(gè)展示位了。種子數(shù)據(jù)非常重要。你不可能把項(xiàng)目交給老師時(shí)說「請(qǐng)先手動(dòng)往數(shù)據(jù)庫(kù)里添加20本書才能看到效果」所以建庫(kù)腳本里一定要包含一段INSERT語(yǔ)句INSERT INTO user (username, password, nickname, role, create_time) VALUES (admin, $2a$10$Eyi7lPwHONlFOT5n1x1K3uJzYVpFKTHJQ8A0Y9qH3XxY8yC7fLq, 管理員, 1, NOW()); INSERT INTO book (title, author, price, stock, sales, publisher, status) VALUES (深入理解Java虛擬機(jī), 周志明, 129.00, 50, 320, 機(jī)械工業(yè)出版社, 1), (Java并發(fā)編程實(shí)戰(zhàn), Brian Goetz, 89.00, 30, 215, 人民郵電出版社, 1), (Spring實(shí)戰(zhàn)第6版, Craig Walls, 108.00, 20, 188, 人民郵電出版社, 1);密碼那一串$2a$10$開頭的字符串是BCrypt加密后的123456對(duì)應(yīng)的明文在項(xiàng)目說明文檔里要寫清楚。管理員賬號(hào)的role1在Java側(cè)配合攔截器可以實(shí)現(xiàn)訪問控制。種子數(shù)據(jù)不求多每張關(guān)聯(lián)表能覆蓋典型查詢即可比如兩本書、一個(gè)用戶、一筆包含兩個(gè)明細(xì)的訂單這樣你去驗(yàn)證列表、詳情、訂單詳情時(shí)都有現(xiàn)成數(shù)據(jù)可查。4. 核心功能實(shí)現(xiàn)從登錄鑒權(quán)到下單扣庫(kù)存的完整鏈路4.1 登錄與權(quán)限控制攔截器和密碼加密的設(shè)計(jì)細(xì)節(jié)登錄鑒權(quán)在課設(shè)里最常見的寫法是用戶提交表單Servlet查詢數(shù)據(jù)庫(kù)比對(duì)用戶名和密碼比對(duì)成功就把用戶名塞進(jìn)Session。這個(gè)寫法能跑但有兩個(gè)問題一是密碼明文存儲(chǔ)在數(shù)據(jù)庫(kù)答辯時(shí)被問到「如何防止拖庫(kù)」答不上來二是Session里只存了用戶名每次查詢用戶信息都得再查一次數(shù)據(jù)庫(kù)。我采用的方案是密碼用BCrypt加密登錄成功后將User對(duì)象整體放入Session業(yè)務(wù)需要用戶信息時(shí)直接取管理員接口通過HandlerInterceptor統(tǒng)一攔截。Service public class UserServiceImpl implements UserService { private final UserMapper userMapper; // BCryptPasswordEncoder 是 Spring Security 提供的工具單獨(dú)引入即可 private final PasswordEncoder passwordEncoder new BCryptPasswordEncoder(); public User login(String username, String rawPassword) { User user userMapper.findByUsername(username); if (user ! null passwordEncoder.matches(rawPassword, user.getPassword())) { return user; } return null; } }上面這段代碼的邏輯說明matches方法負(fù)責(zé)把用戶輸入的明文密碼進(jìn)行同樣的鹽值運(yùn)算然后和數(shù)據(jù)庫(kù)里的哈希結(jié)果比對(duì)全程不需要你手動(dòng)處理鹽。調(diào)用方拿到User對(duì)象后放入Session后續(xù)請(qǐng)求從Session取值即可。要注意的是BCryptPasswordEncoder來自spring-security-crypto這個(gè)依賴你不想引入全套Spring Security的話單獨(dú)引這個(gè)包就行pom.xml中加依賴即可。攔截器的寫法不展開代碼了核心就一個(gè)preHandle方法判斷當(dāng)前請(qǐng)求的URI是否以/admin開頭如果是則從Session里取user取不到就重定向到登錄頁(yè)取到但role ! 1就返回403提示頁(yè)。這個(gè)邏輯必須在WebMvcConfigurer里注冊(cè)并且要放行登錄接口、靜態(tài)資源、以及圖書列表和詳情這些匿名可訪問的頁(yè)面。4.2 圖書檢索與分頁(yè)一套能扛住答辯追問的Mapper寫法圖書檢索頁(yè)面是系統(tǒng)里訪客流量最大的地方搜索條件包括書名模糊匹配、作者匹配、價(jià)格區(qū)間、分類如果有還得支持分頁(yè)。很多課設(shè)項(xiàng)目在Service里先select * from book把所有數(shù)據(jù)查出來然后在內(nèi)存里做過濾和分頁(yè)這個(gè)做法數(shù)據(jù)量小的時(shí)候看不出問題但答辯老師一句「如果有一萬(wàn)本書呢」就會(huì)讓你很難受。正確的做法是在SQL層面完成過濾和分頁(yè)數(shù)據(jù)庫(kù)只返回當(dāng)前頁(yè)需要的數(shù)據(jù)。select idsearchBooks resultTypecom.example.bookstore.entity.Book SELECT * FROM book where if testkeyword ! null and keyword ! (title LIKE CONCAT(%, #{keyword}, %) OR author LIKE CONCAT(%, #{keyword}, %)) /if if testminPrice ! null AND price gt; #{minPrice} /if if testmaxPrice ! null AND price lt; #{maxPrice} /if AND status 1 /where ORDER BY id DESC LIMIT #{offset}, #{pageSize} /select這里有幾個(gè)細(xì)節(jié)值得跟評(píng)委講清楚。where標(biāo)簽會(huì)自動(dòng)去掉第一個(gè)多余的AND這是MyBatis的動(dòng)態(tài)SQL特性你不需要在XML里手動(dòng)拼接where 11。LIKE模糊查詢必須用CONCAT(%, #{keyword}, %)如果用%${keyword}%用戶輸入一個(gè)%就會(huì)查出全表這是經(jīng)典的SQL注入點(diǎn)。OFFSET的計(jì)算放在Service層完成入?yún)⑹莗ageNum和pageSize在Service里算出offset (pageNum - 1) * pageSize傳入Mapper。LIMIT后面只能用#{}參數(shù)不能直接寫死一個(gè)變量名因?yàn)樗鼤?huì)被當(dāng)作預(yù)編譯參數(shù)處理。4.3 下單與扣庫(kù)存為什么必須用事務(wù)保住數(shù)據(jù)一致性用戶點(diǎn)「提交訂單」按鈕后后端做的事比你表面上看到的多得多先生成訂單號(hào)和訂單主記錄再遍歷購(gòu)物車?yán)锏拿恳豁?xiàng)往order_item插明細(xì)然后更新對(duì)應(yīng)圖書的stock和sales最后清空購(gòu)物車。這四步里任何一步失敗都不能允許前面已經(jīng)執(zhí)行的部分保留下來。比如插入了訂單主記錄但扣庫(kù)存失敗下次用戶查詢訂單時(shí)就會(huì)看到一筆幽靈訂單。課程設(shè)計(jì)階段不要求你實(shí)現(xiàn)分布式事務(wù)但本地事務(wù)必須用對(duì)也就是在Service方法上加Transactional并把事務(wù)控制放在Service層而不是Controller層。Spring Boot默認(rèn)的事務(wù)管理機(jī)制是遇到RuntimeException或Error時(shí)自動(dòng)回滾遇到受檢異常默認(rèn)不回滾。所以你在業(yè)務(wù)代碼里要養(yǎng)成一個(gè)習(xí)慣數(shù)據(jù)校驗(yàn)失敗時(shí)直接拋出RuntimeException的子類而不是返回false或null讓調(diào)用方判斷。.NET或PHP背景的老師可能會(huì)問事務(wù)隔離級(jí)別你可以說默認(rèn)用REPEATABLE_READInnoDB的行鎖能保證兩筆并發(fā)下單不會(huì)互相覆蓋庫(kù)存。下面這段代碼展示了下單Service層的核心結(jié)構(gòu)Transactional(rollbackFor Exception.class) public Long createOrder(Long userId, MapLong, Integer cartMap) { // 1. 生成訂單號(hào)時(shí)間戳 隨機(jī)數(shù)避免并發(fā)重復(fù) String orderNo BO System.currentTimeMillis() String.format(%03d, ThreadLocalRandom.current().nextInt(1000)); BigDecimal total BigDecimal.ZERO; for (Map.EntryLong, Integer entry : cartMap.entrySet()) { Book book bookMapper.selectById(entry.getKey()); BigDecimal itemTotal book.getPrice().multiply(BigDecimal.valueOf(entry.getValue())); total total.add(itemTotal); } Orders order new Orders(); order.setOrderNo(orderNo); order.setUserId(userId); order.setTotalAmount(total); order.setStatus(0); // 待支付 order.setCreateTime(LocalDateTime.now()); orderMapper.insert(order); // 2. 插入訂單明細(xì)并扣減庫(kù)存 for (Map.EntryLong, Integer entry : cartMap.entrySet()) { OrderItem item new OrderItem(); item.setOrderId(order.getId()); item.setBookId(entry.getKey()); Book book bookMapper.selectById(entry.getKey()); item.setBookTitle(book.getTitle()); item.setBookPrice(book.getPrice()); item.setQuantity(entry.getValue()); orderItemMapper.insert(item); int updated bookMapper.deductStock(entry.getKey(), entry.getValue()); if (updated 0) { throw new RuntimeException(庫(kù)存不足: book.getTitle()); } } cartMapper.deleteByUserId(userId); return order.getId(); }rollbackFor Exception.class這個(gè)參數(shù)是必須寫的不寫的話默認(rèn)策略只對(duì)RuntimeException生效。數(shù)據(jù)庫(kù)層做一個(gè)deductStock的SQLUPDATE book SET stock stock - #{quantity} WHERE id #{id} AND stock #{quantity}然后判斷影響行數(shù)是否為0為0說明庫(kù)存不足直接拋異常觸發(fā)整體回滾。這種寫法天然解決并發(fā)超賣問題兩筆請(qǐng)求同時(shí)進(jìn)來InnoDB行鎖會(huì)串行化這一行第二個(gè)事務(wù)執(zhí)行時(shí)已經(jīng)扣過一次庫(kù)存條件不滿足就不會(huì)誤扣。這個(gè)方案雖然簡(jiǎn)單卻足以在答辯現(xiàn)場(chǎng)講清楚「樂觀鎖思路」。4.4 管理端功能圖書上下架與訂單狀態(tài)流轉(zhuǎn)書店管理系統(tǒng)給管理員提供四塊功能圖書列表包含搜索和狀態(tài)篩選、新增/編輯圖書、處理訂單發(fā)貨、完成、取消、查看銷售概況。這里最容易被做成「只寫了增刪改查」而失去管理意義。你要清楚每一項(xiàng)操作背后的業(yè)務(wù)規(guī)則圖書下架不能物理刪除只能把status置為0否則歷史訂單關(guān)聯(lián)查詢時(shí)會(huì)查不到書名訂單狀態(tài)必須是單向流轉(zhuǎn)待支付 - 已支付 - 已發(fā)貨 - 已完成是正向待支付 - 已取消是分支不允許把已發(fā)貨的訂單改回待支付單價(jià)和庫(kù)存可以由管理員編輯但sales字段必須由系統(tǒng)自動(dòng)累加不能手工修改。5. 避坑排查課程設(shè)計(jì)階段最容易翻車的五個(gè)真實(shí)場(chǎng)景5.1 MySQL連接報(bào)錯(cuò)Public Key Retrieval is not allowed報(bào)名時(shí)數(shù)據(jù)庫(kù)連接一直報(bào)這個(gè)錯(cuò)application.yml里用戶名密碼都沒問題Navicat能連但Java連不上而且報(bào)錯(cuò)信息不完整一會(huì)兒說SSL握手失敗一會(huì)兒說公鑰檢索不允許。這個(gè)問題的根源在于MySQL 8.0默認(rèn)使用caching_sha2_password認(rèn)證插件而JDBC驅(qū)動(dòng)在沒有拿到服務(wù)器公鑰時(shí)不允許發(fā)送加密密碼。解決方法是給MySQL連接URL加上兩個(gè)參數(shù)allowPublicKeyRetrievaltrueuseSSLfalse兩個(gè)缺一不可。前者允許客戶端從服務(wù)器請(qǐng)求公鑰后者避免在本地開發(fā)環(huán)境下走SSL加密通道。這樣改完之后再啟動(dòng)連接就正常了。5.2 時(shí)間字段差8小時(shí)DATETIME和時(shí)區(qū)設(shè)置頁(yè)面顯示的下單時(shí)間和數(shù)據(jù)庫(kù)里查出來的時(shí)間差了整整8小時(shí)你可能會(huì)懷疑代碼里L(fēng)ocalDateTime.now()有問題實(shí)際上代碼沒問題。根本原因是JDBC連接串里沒有指定時(shí)區(qū)Java側(cè)的LocalDateTime不帶時(shí)區(qū)信息而MySQL的serverTimezone默認(rèn)取系統(tǒng)時(shí)區(qū)如果本機(jī)是UTC寫入時(shí)就會(huì)按UTC轉(zhuǎn)碼。解決方法是把serverTimezoneAsia/Shanghai加進(jìn)JDBC URL同時(shí)檢查MySQL服務(wù)器的time_zone變量是否也設(shè)成了08:00。順便提一個(gè)進(jìn)階點(diǎn)建表時(shí)時(shí)間字段用DATETIME而不用TIMESTAMP因?yàn)門IMESTAMP有2038年問題雖然在課設(shè)場(chǎng)景里不會(huì)遇到但這個(gè)問題本身可以作為答辯加分項(xiàng)講出來證明你關(guān)注過真實(shí)生產(chǎn)環(huán)境。5.3 前端提交表單中文亂碼過濾器配置位置不對(duì)Spring Boot項(xiàng)目里表單提交中文亂碼最典型的場(chǎng)景是搜索框輸入「深入理解」查不出任何結(jié)果。如果用的是POST提交Spring Boot的CharacterEncodingFilter理論上會(huì)自動(dòng)處理UTF-8編碼但失效的常見原因是你在Controller里手動(dòng)讀取了getParameter()之前沒有設(shè)置request.setCharacterEncoding(UTF-8)導(dǎo)致容器已經(jīng)按ISO-8859-1解碼了。更隱蔽的情況是你寫了自定義的Filter并且執(zhí)行順序在CharacterEncodingFilter之前那你的過濾器如果沒有強(qiáng)制設(shè)置編碼后續(xù)的編碼過濾器也不會(huì)生效因?yàn)檎?qǐng)求參數(shù)已經(jīng)在你的過濾器里被讀取過了。解決思路是不要自定義全局FilterSpring Boot自帶的就夠了如果你真的需要設(shè)置spring.characterEncoding.forcetrue讓編碼過濾器優(yōu)先執(zhí)行并覆蓋請(qǐng)求和響應(yīng)編碼。5.4org.thymeleaf.exceptions.TemplateInputException模板路徑拼寫問題Thymeleaf頁(yè)面渲染時(shí)報(bào)模板找不到提示TemplateInputException而且錯(cuò)誤信息里給出的路徑和你templates目錄下的文件看起來一模一樣。這個(gè)問題的常見原因是Controller返回的視圖名帶上了.html后綴比如return admin/book-list.html而Thymeleaf默認(rèn)的視圖解析器會(huì)拼接前綴classpath:/templates/和后綴.html結(jié)果變成了classpath:/templates/admin/book-list.html.html自然找不到。解決方法是去掉后綴只返回邏輯視圖名admin/book-list。另外要檢查pom.xml里是否引入了spring-boot-starter-thymeleaf如果只引入了spring-boot-starter-web模板引擎根本沒注冊(cè)返回字符串會(huì)被當(dāng)作普通文本寫到響應(yīng)體里頁(yè)面內(nèi)容看起來就是一行結(jié)構(gòu)化的字符串。5.5 并發(fā)下單導(dǎo)致的超賣stock #{quantity}條件策略要寫對(duì)在測(cè)試階段你可能用Postman同時(shí)發(fā)兩個(gè)請(qǐng)求下單同一本書最后發(fā)現(xiàn)庫(kù)存被扣成了負(fù)數(shù)。原因是你的扣庫(kù)存SQL寫成了先查在內(nèi)存判斷再執(zhí)行更新。就算在Service層開了事務(wù)兩個(gè)請(qǐng)求同時(shí)讀到庫(kù)存還剩1本各自判斷通過然后都去更新結(jié)果是兩次更新都成功庫(kù)存變?yōu)榱素?fù)值。正確做法是把判斷條件寫進(jìn)UPDATE語(yǔ)句里即WHERE stock #{quantity}這一條數(shù)據(jù)庫(kù)行鎖會(huì)讓第二個(gè)更新事務(wù)等待第一個(gè)事務(wù)提交后再執(zhí)行此時(shí)庫(kù)存已扣減條件不滿足影響行數(shù)直接為0在MyBatis里映射的結(jié)果就是updated 0再結(jié)合Transactional的回滾機(jī)制整個(gè)訂單創(chuàng)建失敗。這段代碼就是第4章末尾展示的那個(gè)deductStock方法如果你的項(xiàng)目里沒寫這個(gè)條件趁現(xiàn)在趕緊補(bǔ)上。6. 項(xiàng)目說明文檔怎么寫從「源碼壓縮包」到「能答辯的作品」6.1 項(xiàng)目說明文檔的目錄結(jié)構(gòu)與每部分必須有的內(nèi)容很多同學(xué)在最后一天才開始寫文檔寫出來的東西老板看了想退款老師看了想打回。項(xiàng)目說明文檔的核心目的不是記錄代碼而是證明你理解了這個(gè)系統(tǒng)的每一個(gè)設(shè)計(jì)決策。一個(gè)推薦的文檔目錄是項(xiàng)目背景與需求分析、技術(shù)架構(gòu)圖與選型理由、數(shù)據(jù)庫(kù)設(shè)計(jì)說明含E-R圖和關(guān)鍵表注釋、核心功能實(shí)現(xiàn)說明登錄鑒權(quán)、下單事務(wù)、庫(kù)存扣減、測(cè)試方案與測(cè)試用例、部署步驟與運(yùn)行環(huán)境。這個(gè)結(jié)構(gòu)里最容易被忽略的是「測(cè)試方案」但答辯現(xiàn)場(chǎng)老師最愛問的就是「你怎么驗(yàn)證你的系統(tǒng)是對(duì)的」如果你能現(xiàn)場(chǎng)跑一遍測(cè)試用例把輸入、預(yù)期結(jié)果、實(shí)際結(jié)果列成表格分?jǐn)?shù)會(huì)拉開一截。部署步驟這一節(jié)不要只寫「用IDEA打開項(xiàng)目配置數(shù)據(jù)庫(kù)運(yùn)行」要寫清楚JDK版本、Maven版本、MySQL版本、數(shù)據(jù)庫(kù)初始化的命令行或SQL腳本路徑、配置文件里的哪些參數(shù)需要改。例如環(huán)境項(xiàng)要求說明JDK1.8或17根據(jù)Spring Boot版本選擇Maven3.6用IDEA自帶Maven也可MySQL5.7或8.0執(zhí)行bookstore.sql初始化端口8080避免和本機(jī)其他服務(wù)沖突6.2 答辯前的驗(yàn)證腳本一條命令測(cè)一個(gè)業(yè)務(wù)閉環(huán)答辯最常見的尷尬是現(xiàn)場(chǎng)演示時(shí)數(shù)據(jù)對(duì)不上或者功能點(diǎn)忘詞了。我習(xí)慣的做法是準(zhǔn)備一個(gè)「業(yè)務(wù)驗(yàn)證順序清單」每一步做什么、預(yù)期看到什么提前在本地跑通兩遍。推薦的順序是管理員登錄進(jìn)入圖書管理新增一本測(cè)試書設(shè)置價(jià)格為19.9、庫(kù)存為5退出管理員注冊(cè)一個(gè)新用戶搜索這本測(cè)試書加入購(gòu)物車數(shù)量改2提交訂單確認(rèn)訂單狀態(tài)為待支付回到管理員后臺(tái)看到訂單金額為39.8、庫(kù)存變?yōu)?點(diǎn)擊發(fā)貨回到用戶端確認(rèn)訂單狀態(tài)變?yōu)橐寻l(fā)貨。這一個(gè)閉環(huán)把你系統(tǒng)的用戶端、管理端、訂單、庫(kù)存全部覆蓋了而且每一步都能對(duì)應(yīng)到數(shù)據(jù)庫(kù)里的數(shù)據(jù)變化。還有一個(gè)容易被忽略的準(zhǔn)備工作把你的項(xiàng)目打成可執(zhí)行jar包在命令行用java -jar跑一遍確認(rèn)靜態(tài)資源和模板引擎都正常加載。很多項(xiàng)目在IDEA里跑得好好的一打包就找不到頁(yè)面原因是模板文件或者M(jìn)apper XML沒有正確打包進(jìn)jar。檢查target/classes目錄下有沒有mapper目錄和templates目錄如果沒有就是pom.xml的resources配置把XML文件排除掉了需要在build里顯式聲明包含。這個(gè)檢查只需要一分鐘但能避免答辯當(dāng)天「現(xiàn)場(chǎng)換了臺(tái)電腦打不開項(xiàng)目」的悲劇。6.3 一個(gè)加分技巧用Logback記錄關(guān)鍵操作日志如果你的項(xiàng)目說明文檔里寫了「系統(tǒng)安全性」但是代碼里連一行日志都沒有老師追問時(shí)你很難自圓其說。我建議在登錄、下單、支付、發(fā)貨這幾個(gè)核心操作上加上日志輸出使用SLF4J的Logger即可不需要引入額外組件。日志的作用有兩個(gè)一是你自己排查問題時(shí)能看清請(qǐng)求參數(shù)和處理結(jié)果二是答辯時(shí)可以現(xiàn)場(chǎng)打開logs/bookstore.log向老師展示「我可以通過日志追蹤一筆訂單從創(chuàng)建到發(fā)貨的全過程」。這個(gè)技巧花10分鐘就能做完但呈現(xiàn)出來的工程素養(yǎng)和一個(gè)「只寫了CRUD的課設(shè)」完全不是一個(gè)段位。private static final Logger log LoggerFactory.getLogger(OrderServiceImpl.class); log.info(用戶[{}]創(chuàng)建訂單訂單號(hào)[{}]總金額[{}]包含{}項(xiàng)明細(xì), userId, orderNo, total, cartMap.size());注意日志里不要打用戶密碼、完整收貨地址這類敏感信息打印訂單號(hào)和金額是沒有問題的。日志文件的大小和保留策略不用刻意配置Spring Boot默認(rèn)的logback-spring.xml配置足夠應(yīng)付課設(shè)場(chǎng)景了。我自己的習(xí)慣是每寫完一個(gè)模塊先跑一遍完整業(yè)務(wù)流打開日志文件確認(rèn)關(guān)鍵步驟都有輸出再寫下一塊這樣最后寫項(xiàng)目說明文檔時(shí)測(cè)試記錄是現(xiàn)成的不是臨時(shí)編的。希望這份實(shí)戰(zhàn)拆解能讓你做完的不只是一個(gè)能運(yùn)行的課設(shè)而是一個(gè)能講清楚設(shè)計(jì)決策、能扛住現(xiàn)場(chǎng)提問、哪怕以后寫進(jìn)簡(jiǎn)歷也不心虛的作品。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天射影院| 亚洲深喉aV| 五月丁香六月久久| 五月丁香A∨在线| 欧美啪啪9| 亚洲一个色| 狠狠爱成人综合网| 深爱激情综合| 丁香五月天黄色片| 欧美婷婷色五月网| 日韩AV无码影片| 99亚洲视频| 亚洲五月天天| 久青青久| AV电影在线播放| 婷婷五月天亚洲综合网| 偷偷与邻居做爰完整视频| 99久视频| 熟女激情五月天| 六月丁香婷婷视频综合在线观看| 精品人妻在线| 1234操逼网| 成人av免费观看| 天天插综合网| 五月天亚洲综合网| 婷婷丁香五月综合激情视频| 五月婷婷深爱六月| 激情综合婷婷| 五月天婷婷在线观看精品男人| 五月婷婷九九热| 99精彩视频网站在线| 91操片| 狠狠久久婷五月综合色| 天天日狠狠| 99久久精品色老| 97sese婷婷| 搡BBBB搡BBB搡18 | 婷婷综合仓库中文| 久久久91精品| 青青操丝袜美腿| 日韩一区二区A片免费观看| 激情综合网五月丁香| 天天激情| 色色婷婷丁香五月天| 丁香美女主播视频在线观看| 亚洲va欧洲va国产va不卡| 五月婷庭丁香在线| 九九久久视频| 婷婷五月天开心激情网| 草综合14| 久久HD| 国产婷婷综合| 综合激情站| 久婷婷婷| 午夜丁香婷婷| 2018夜夜草| 被强行糟蹋的女人A片| 久久九九免费视频| 亚洲精品一区无码A片| 天天草天天爽| 天天天操天天天日| 五月丁香中文字幕| 色噜噜狠狠色综无码久久合欧美| 五月婷婷丁香| 国产成人精品一区二三区熟女在线| 99这里只有| www.狠狠| 五月天操逼激情| 人人人操 超碰| 国产精品久久久爽爽爽麻豆色哟哟| 无码人妻精品一区二区蜜桃色欲| 9 1 A v久久久| 色五月综合97| 五月久久五月激情| 日日操日日爽| 六月婷婷激情| 日本久久久97| 午夜成人天堂久久无码日韩久久| ss五月天激情| 五月六月伦理| 九月丁香| 久热精品9999| 在线国产精品色| 开心五月激情| 婷婷网五月天| 狠狠操天天干| 99爱视频在线| 1024人妻无码中文字幕| 91热爆在线| 99热99思午夜精品| 国产视频婷婷| 中文字幕按摩做爰| 色五月色图| 超碰人人操在线| 六月色伊人婷婷| 色爆五月| 九九AV| 五月丁香网站在线播放| 中文字幕,综合,91| 91超级碰| 丁香99| 操逼毛片国语对白| 免费五月婷婷网| 夜色综合网| 丁香五月成人社区| 日韩视频女神99| 国产免费AV在线| 色婷婷成人丁香| 五月花婷婷最新| 99在线精品免费视频| 色哟哟精品| 欧美精品999| 久久日本wwww色| 免费AV播放| 激情综合网激情五月网| 激情五月天小说网| 久久9视频欧美| 色婷婷亚洲在线| 大香蕉啪啪| 亚洲激情四射色| 9l视频自拍九色9l视频在线观看| www,av好吊操| 午夜成人片400| 免费AV在线网址| 亚洲性爱99| 99热这里只有精品8| 欧美大片免费播放器| 色婷婷先锋| 99色播| 综合久久婷婷| 久热黄色| 色五月欧美| 美女婷婷激情亚洲| 五月激情综合五月| 人人爱操| 天天免费成年人视频| 六月丁香五月婷婷| 激情婷| 呦呦v线| 亚州操人在线视频| 丁香5月激情网| 激情综合五月开心狠狠| 五月婷婷亚洲综合在线| 久久a热| 日韩艹比| 五月婷婷激情综合拍| 五月婷激情| 人碰91| 五月丁香婷婷中文网| 天天婷婷综合亚洲亚洲| 久热这里只有精品在线观看| 九九热视频在线观看| 五月丁香婷婷激情影院欧美| 操九色| 亚洲婷婷综合视频| 丁香五月五月婷婷| 婷婷色吧| 五月天亭亭俺也| 久久婷狠狠色| 激情五月综合| 玖久精品视频9| 91男同视频| 五月婷婷色丁香| 五月天大香蕉| 色五月婷婷DVD| 婷婷五月天免费99| 亚洲无码99| 人操91在线| 五月深爱网| 日本三级99人妇网站| 激情黄色小说五月天| 国产看真人毛片爱做A片| 五月份婷婷| 中文字幕 中文字幕明步| 色综合com| 丁香五月中文字幕| 色五月婷婷天天干| 波多婷婷久久| 丝袜激情网| 丁香五月婷婷激情网| 亚洲精品99| 婷婷久草| 就去色色五月丁香婷婷久久久| 色婷婷五月天视频在线| a网站免费观看| 色九月婷婷| 婷婷激情丁五月| 亚洲影院婷婷色| 色欲午夜无码久久久久久张津瑜| 欧美99热| 大香蕉人在线65| 丁香激情久久| 人人舔人人| 武则天精品久久| 色婷婷久久| 五月天激情子轮| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 色婷婷XXXXX| 午夜精品人妻无码一区二区三区| 人妻久久久久久| 亚洲欧洲国产精品| 五月丁香婷婷狠狠操| 日本久久人| 天天开心婷婷丁香五月| 激情熟女网| 操一区| 五月婷综合性中心| 日韩一区二区在线播放| 秋霞AV美国| 日产精品一线二线三线芒果| 97热这里精品在线视频| 欧美日韩aaaa| 啪啪啪五月天| 色婷婷综合久色AV五色最新| 久热91精品| 国产成人AV不卡| 久久伊人婷婷| 无码区婷婷五月花开| 婷婷五月丁香六月伊人网| 久热精彩视频98| 久久天天| 亚洲激情四射| 久久 天天| 五月激情精品视频| 66精品国产成人| 亚洲图片 丁香婷婷| 99热超碰在线| 狠狠色综合网| 亚洲啪视频| 操日挥操日日| 五月六月激情| 99愛国产| 99久久精品视频女神1| 丁香婷婷五月天校园春色| 超碰免费电影| 青青色com久久| 亚洲精品久久久久久久久久吃药| 久久丁香五月婷婷| 99综合| 丁香五月色网| 91九色熟女| 激情综合色播| 丁香五月偷拍| 婷婷射丁香| 久久精品视频在这里有| 久热丁香| 久久人人九九| 2020日日干| 天天爽天天摸天天爱| 丁香五月激情综合在线观看| 六月婷婷狠狠| 五月天婷婷色播| 久久久久久久久久久久久久人妻视频 | 99精品在| 色婷婷色人人射| 精品国产va久| 亚洲五月综合色播| 色婷婷五月综合网| 丁香六月激情国产| 色综合九九| 亚洲色在线观看| 日日射天天射| 久久久久久久久人妻| 五月天俺去也| 色婷婷六月天| 天天骑天天操| 国产黄色在线观看| 色天堂操| 免费九九热| 99re99在线看| 五月丁香花免费视频| 开心色播色五月婷婷| 热久久66| 激情深爱五月天| 五月婷婷色播| 99热综合| 九九中文色色| 九九RE视频在线精品| 91久久久久久| 五月丁香好婷婷A片网| 伊人六月丁香婷婷| 人人视频人人干人人做| 激情五月久久| 日韩三十六页| 丁香婷婷基地| 天天添天天摸天天天天做| 婷婷丁香激情五月| 亚洲操操操| 一级精品999WWW| 一级黄色影片| 99re8热精品免费视频| 久热A片| 玖玖色资源| 久久黄A片| 婷婷五月天AV激情| 五月天丁香| 伊人五月天在线| 国产3p露脸普通话对白| 久久久久久99精品无码| 巴基斯坦粉嫰无码视频| 色五月色五天色情网| 丁香五月综合| 色色色色色五月丁香| 狠狠搞五月天| 五月婷婷婷丁香播| 亚洲第一成人无码A片| 色色九区| 丁香五月丁香伊人| 97干在线| 五月天久久网站| av九九| 狠狠插日日干撸| 国产成人综合在线| 玖玖综合玖玖| 婷婷五月激情在线| 狠狠干,狠狠操| 超碰在线个人观看| 噜噜噜色噜噜| 色五月婷婷在线| 热久久婷婷| 狠狠色婷婷7| 色五月婷婷在线观看| 狠狠色综合网| 丁香五月香蕉| 外国碰视频网站97| 五月婷婷97| 五月婷婷少妇之| 久久婷婷五月综合啪| 欧美叉叉叉BBB网站| 欧美日本黄色| 婷婷五月天影院| 中文字幕精品无码一区二区| 精品在线| 久久久久er热| 欧美性爱五月天| 久久怕怕视频| 日韩精品无码AV| 欧美婷| 狠狠五月天| 99人妻碰碰碰久久久久| 丁香色婷婷五月天| 人人操婷婷| 天天做天天要天天爽| 久久激情网| www91久久| 婷婷五月天激情网站| 黄桃AV无码免费一区二区三区| 久久婷婷视频| 亚洲中文字幕av| 日本乱论99| 丁香婷婷视频一区二区| 丁香婷婷激情四射五月| 综合久久六月| 日本色色影院| 中文字幕 中文字幕明步| ..真实国产乱子伦毛片 | 五月丁香毛片| 一区二区免费看| 91久草五月天婷婷| 六月丁香网| 狠狠色九月| 激情五月丁香亭亭| 大香蕉九九热| 色色A| 97人人射| 天天插天天干| 婷婷五月天激情综合深爱激情| j五月香在线| 亚洲第精品| 婷婷丁香无码专区| 丁香五月欧美| 激情五月天婷婷图| 精品香蕉99久久久久网站| 另类综合激情| 九九99九九精品视频| 五月婷婷激情综合网| 97超碰欧美中文字幕| 五月天综合激情网| 操人91| 嫩草AV久久伊人妇女超级A| 天天干夜夜操A片| 久草热久草在线视频| 五月 丁香 欧美| 影音先锋高清无码资源网| 婷婷夜夜夜夜| 五月综合丁香婷婷| 国产精产国品一二三在观看| 五月婷婷 激情五月| 丁香婷婷午夜| 婷婷五月成人| 五月花激情| 色吧五月婷婷| 青青草伊人婷婷| 六月丁香VA| 九色91国产| 九九黄色网| 五月丁香五月天现场视频| 东京热人妻一区二区三区在线| 五月丁香六月天| 婷婷激情四射| 亚洲人成网站999久久久综合| 中文久久婷婷| 热久久66| 五月婷婷啪啪啪| 五月丁香激情啪啪| 另类激情综合| 五月天色婷婷视频| 色久九| 91人在线观看| 99综合免费视频| 开心五月婷婷在线| 99这里有精品视频3| 色婷婷很很十八禁| 色婷婷电影网| 婷婷刺激综合| 久久深爱激情网| 丁香蜜臀黄色婷婷五月天| 人妻丰满精品一区二区A片| 久久综合人妻| 99re26视频| 欧日韩成人| 久久婷婷五月综合色区| 日本色五月| 日韩色五月| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 色婷婷aV四虎| 成人国产网站在线免费看| 婷婷99中文字幕| 久久婷婷五月丁香| 青青操avbb| 91视频人人做97| 国产精产国品一二三在观看| 激情五月天电影| 亚洲热久久| 亚洲 日韩色色| 先锋资源91| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 日本视频不卡123区| 热九九精品| 婷婷播5月| 久久婷婷午夜| 99热个人在线| 亚洲成av人影院| 色五月综合激情| 深爱激情五月网| 思思热在线视频99| 色婷婷香蕉丁丁网| 情五月亚洲婷婷| www99久久| 亚洲人成网站999综合| 亚洲精品又粗又大又爽A片| 成人电影一区| 久久久久久综合88| www.99热在线观看| 99久热在线精品| 激情文学五月丁香六月婷婷| 天天日日综合| 99热免| 久草xx性爱视频| 国内裸舞二区| 日本狠狠爽| 五月色婷婷在线观看| 色色色婷| 天天爽成人综合网站| 色五月婷婷婷婷婷婷婷婷婷婷| 91玖玖| 中文字幕不卡+婷婷五月| 大香线蕉伊人| 色婷婷五月天激情| 激情五月婷婷色综合| 老师的粉嫩小又紧水又多A片视频| 淫视馆aV二区一区| 激情五月天婷婷| 99精品免费视频| 久久久婷| 欧美性生交XXXXX无码小说| 中字幕视频在线永久在线观看免费 | 97色 五月天丁香| 五月婷婷五月天| 色婷久久| 婷婷五月天成人视频| 婷婷激情五月天桃花网| 狠狠色色综合| 九月丁香婷婷综合激情| 人人色AV| 婷婷五月六月丁香| 久热91| 久久精品性爱| 狠狠色丁香乆乆| 激情九九九九| 综合婷婷| 欧美综合激情五月天| 五月婷婷丁香俺日污视频| 色色国产| 嫩草AV久久伊人妇女超级A| 777米奇影视第四色| 超碰天堂网| 99精品国产在热久久婷婷| 综合一区二区三区| www.婷婷六月天| 91人人爱| 亚洲精品亚洲人成人网| 九九久久五月天综合伊人| 五月丁香婷婷俺| 激情图片婷婷| 亚洲精品V天堂中文字幕| 亚洲中文字幕翔田千里| 超碰人人超碰| 婷婷射图五月天| 久综合| 五月天开心网| 另类亚洲视频| 99热这里只有精品13| 狠狠色狠狠操| 久久AAAA片一区二区| 色综啪啪啪啪啪啪| 丁香色六月婷婷| 思思久久青草热| 日韩在线观看亚洲| 丁香五月亚洲综合丝袜| 久操操| 丁香五月亚洲| 狠狠综合网| 狠干综合| 六月丁香激情婷婷| 五月天六月色| 婷婷五月色色| 五月丁香六月激情综合欧美| 国产日韩欧美| 欧美99热| 97五月久久丁香婷婷| 无码少妇高潮喷水A片免费| 色域五月婷婷丁香| 深爱五月激情五月| 日韩99无码| 激情五月天在线观看色婷婷| 日本操碰碰| 国产精品成av人在线视午夜片| 秋霞性爱AV| 色婷婷丁香五月天在线观看| 久久婷婷五月综合伊人| 狠狠穞A片一區二區三區| 停停综合色色| 婷婷五月综合激情免费| 色和综合网| 欧美成性色| 亚洲av日韩无码| 色播激情| 激情五月四色| 婷婷九月丁香中文| 日日操,夜夜撸| 99热综合| 欧美成人无码一区二区三区| 婷婷五月激情中文字幕| 成人精品在线观看| 九九99久久| 精品久久9| 激情综合一| 久久丁香网| 婷婷六月色情| 色婷婷av综合网| 丁香五月天激情小说| 天天拍天天操| 激情五月婷婷啪啪| 桃色五月婷婷| 99色 色| 丁香婷婷五月份| 色情五月天se| 五月天操逼激情| 丁香5月啪啪| 亚洲精品无人区| 色婷婷丁香五月丁香| 大战熟女丰满人妻AV| 丁香五月另类小说在线阅读| 人与禽A片啪啪| 亚洲综合五月天综合| 免费无码毛片一区二区A片| 激情婷婷五月天网址| 天天操夜夜操| 色情五月天A片| 五月停亭久久电影| 婷婷五月天av| 狠狠搞五月天| 亚洲情综合五月天| 夜夜骑天天玩天天日| 日韩久久日| 开心激情五月天网| 色五月天堂| 五月婷婷丁香六月| 五月天婷婷青青草| 六月婷婷九月丁香| 人人摸人人干| 欧美性色五月天| 一区无码| 久热中文字幕| 最新精品视频99| 久久久久久久久18久久| 久久五月天色婷婷| 婷婷激情综合无月| 色婷婷人人| 久久婷丁香五月| 操操操www.com| 综合色色五月| 久久婷婷网| 天堂爱爱| 丁香五月婷婷99| 超碰免费在线| 精品久久66| 大香蕉天堂| 成人精品视频99在线观看免费| www.lingjunshare.com| 婷婷99中文字幕| 777影视理论片大全在线观看| av性爱在线| 色色色婷婷五月天| 婷婷五月色综合香五月| 操99| 五月成人天| 婷婷五月天成人导航| 9色资源在线| 91九色国产| 五月丁香久久激情网| 久久久久久99精品无码| 国产伦亲子伦亲子视频观看| 亚洲午夜视频| 狠狠色噜噜色狠狠狠综合久久成人波 | 六月丁香婷婷五月| 狠狠操之狠狠操| 淫荡A片| 女人高潮内射99精品| 99这里| 天天做天天干天天综合网| 伊人综合婷婷| 99干免费视频| 97人人射| 色婷久久| 丁香六月婷| 激情色情五月天| 99免费成人网| 大香蕉婷婷丁香视频在线| 欧美日韩婷婷五月天| 六月丁香五月天| 久草热在线视频| 丁香五月亚洲综合| 99这里精品| 99久久婷| 婷婷五月丁香超碰| 日韩啪图| 亚洲啪啪自拍| 韩国中文字幕91| 99久久婷婷| 中文字幕在线不卡| 九九99热| 激情噜噜噜| 久久人妻伊人| 五月天久久综合婷婷丁香| 激情综合网婷婷久久| 大香蕉婷婷丁香天堂AV| 九热...av| 天天操五月天| 久久婷婷五月天激情| 免费成人中文字幕| 色色色五月天激情资源| 99热人人操人人操| 色婷婷91激情小说| 丁香五月天堂亚洲社区| 亚洲黄色操逼| 久热A片| 亚洲综合色成丁香五月色| 夜夜爽77777妓女免费下载| 久热只有精品| 狠狠综合| 免费观看全黄做爰的视频| 激情小说五月天| 婷婷五月天福利| 九九亚洲视频| 国产精品A成V人在线播放| 国产精品久久久久久久久久| 国产精品18久久久| 超碰国产在线播放| 啪啪啪丁香五月| 五月婷婷亚洲色图| 超碰在线免费9| 五月婷婷偷拍| 国产真实乱对白精彩| 婷婷丁香18| www.色99| 亚洲色无码A片一区二区麻豆| 超碰在线caop| 日韩欧美婷婷丁| 99久久新视频| 99色在线视频| 操逼福利视频| 开心激情五月天网| 日韩成人av在线| 国产免费一区二区在线A片视频| 免费看欧美成人A片无码| 91性交在线播放| 欧美激情 日韩无码 婷婷 五月天| 久久婷婷五月综合一| 99热免费精品| 亚洲婷婷开心五月| 婷婷五月天激情免费在线观看| 六月激情综合| 一本色道久久综合狠狠躁小说| 国产人妻人伦精品一区二区| 另类图片五月天激情| 色天使色婷婷| 色九月激情综合网| 国产va视频| 久久九九免费视频| 丁香五月玖玖| 91精品久久久久| 五月婷婷插一插| 激情五月婷婷视频一区二区三区| 深爱五月激情五月| 伦乱人妻| 丁香五月天色综合| 久久婷婷综合五月天| 99视频在线| 天天综合区| 色综合色五月| 五月丁香六月香综合激情| 国产激情在线| 日韩专区五月天婷婷丁香| 日本久久爽| 九九热思思热| 婷婷激情性爱| 久久日婷婷| 永久思思热在线| 停停五月丁香| 少妇性按摩无码中文A片| 五月丁香五月丁香五月丁香五月丁香91| 五月丁香综合啪啪| 六月色播| 欧美性生交XXXXX无码小说| 婷婷性爱视频在线| 激情合网婷婷| 99色亚洲| 69久久99精品久久久久| 天天舔天天插天天干| 色婷婷成人| 丁香激情五月少妇| 丁香六月无码| 日韩成人无码| 狠狠色丁香久久久婷| 五月婷婷草| 婷婷五月天亚洲综合网| 亚洲丁香五月天在线视频| 丁香六月婷婷综合激情欧美| 九九精品re免费视频| 激情婷婷五月天伊人在线观看 | 91九色国产在线| 日韩五月丁香| 色九月综合| 99热综合在线观看| 免费观看的av| 只有精品在线观看| 五月激情视频| 变态另类9| 日本欧美成人片AAAA| 91啦丨九色丨刺激中文| 99热精国产这里只有精品| 人人爱操| 色之综合网| 婷婷五月天色| 久久久8| 丁香五月网址| 日韩操逼大片| 精品久久9| 婷婷色中文| 精品色色| 大香蕉中文| 日本天天操| 人妻激情视频| 超碰二区| 久久久久9999| 丁香五月香蕉| 玖月婷婷爱丁香| 色婷婷五月天在线观看| 午夜色色色极品视频| 久久综合五月天| a色色色色色| 五月婷婷色| 六月婷婷狠狠| 2025超碰| 色五月婷婷激情| 日本三级片片| 日本色天堂| 亚洲激情综合| 国产毛片精品一区二区色欲黄A片| 婷婷丁香五| 亚洲三A| 五月婷婷激情久久| 日韩超碰在线| 色色综合网站| 色婷婷丁香五月色综合网| 99情色五月天| 婷婷五月激情图片| 凹凸7777操操操| 综合六月久久| 五月天激情视频| 九九精品99| 国产精品18久久久| 五月激情久久综合网| 91|九色|动漫| 丁香五月社区| 色婷婷九月| 成人综合视频在线| 五月婷婷大香蕉| 婷婷五月天色综合| www.maotanji.com| 激情五月天综合网| 五月花综合视频| 六月婷久久| 伊人在线视频| 亚洲人成色A777777在线观看| 日韩成人电影AV| 69凹凸成人综合网| 五月丁香六月激情综合| 这里只有精品热| 超碰成人在线免费观看| 亚洲色在线观看| 操丝袜视频影院导航| 男女免费视频999| 成人短视频在线观看| 人妻久久久久久久久久久| 国产激情视频在线观看| 人操综合| 久久激情网| 天天天天天天操| www色婷婷久久综合久色| 月丁香久久久| 婷婷五月天色| 婷婷色在线视频| 狠狠狠狠狠狠狠狠草| 99久久99视频| 六月婷婷综合网2| 婷婷丁香五另类网站| 狠狠色噜噜狠狠狠888了| 婷婷五月丁香久久| 狠狠色婷婷丁香五月| 色色五月丁香| 先锋资源91| 婷婷六月天亚州| 五月天激情黄色小说在线观看| 超碰啪啪网| 国产肥白大熟妇BBBB视频| 色99色| 99热99热99热99热| 美妞av| 婷婷五月电影| 久9草在线观看视频| 中文字幕无码人妻少妇免费视频| 亚洲免费看片| 91视频久久久| 婷婷丁香色女人| 少妇大叫太大太粗太爽了A片| www.日韩国产| 99热九九热| 天天操天天谢| 管管補管管紱| 婷婷五月天天天日日夜夜| av激情在线| 久9热插入| 人人插操| 国产亚洲成AV人片在线观黄桃| 亚洲第一黄网| 亚洲中文乱字字幕线在永久| 国产精品久久久久久白浆色欲| 激情亭亭五月| 亚洲视频1区| 欧美成人猛片AAAAAAA| 色婷婷婷婷| 99久在线精品99re5热视频| 99热6色| 99热99这里免费的精品| 久热这里只有精品在线观看 | 久久伦乱| 久久视频婷婷| 超碰在线个人观看| 超碰97在线观看免费| 色爱综合网| 欧美在线视频99| 日日日日日| 伊人91| 五月婷婷色| 综激情网| 色爱综合网| 亚州操操| 丁香九月激情| 五月天婷婷色综合| www久| 亚洲色网址| 婷婷综合久久| 婷婷五月天综合网| 疯狂做受XXXX高潮A片| 亚洲精品亚洲人成人网| 99视频只有精品| 青青操avbb| 一區四區歐美日韓| 激情五月婷婷在线区| 婷婷5月天av| 开心五月丁香啪| 这里只有免费的精品| 丁香六月婷婷一区二区三区| 色五月开心五月激情五月| 天天综合五月| 可以观看的AV| 夜夜躁爽日| 狠狠色噜噜狠狠| 免费AV在线| 激情五月丁香五月| 天堂无码人妻精品AV一区| 四LLL少妇BBBB槡BBBB| 九九九九九999999| 99在线视频操999| 日韩三及成人AV片| 免费婷婷| 婷婷丁香77777| 五月天玖玖狠狠色色| 狠狠色噜噜狠狠狠888了| 激情六月综合| 99在线视频精品| 99色视频| www,婷婷,com| 亚洲一区二区 成人网站戴套| 先锋资源91| 久久久久久久综合狠狠综合| 【乱子伦】黄色| 久久性爱视频这里只有精品| 婷婷五月激情六月| 五月婷视频| 99ri6在线视频| 九九精品热播| 久热2025无码| 五月丁香六月婷婷的女人| 婷婷色丁香五月| 国产露脸150部国语对白| 久久涩视频| 7777激情基地| 很很操很很操| 欧美色色色色色色色色色色| 国产午夜精品AV一区二区麻豆| 99热国产在线| 五月综合久久| 五月丁香成人| 色五月婷婷老师| A片试看120分钟做受视频红杏 | 97操碰视频| 色色热| 超碰在线免费9| 手机看片日日做夜夜| 久久狠狠干| 99精品成人无码A片观看金桔| 婷婷五月天AV在| 婷香五月网在线| 亚洲色色色| 五月综合激情婷婷六月色窝| 五月丁香婷婷婷激情爱爱| 欧美综合婷婷欧美综| 5月婷婷激情在线| 精品人妻伦九区久久AAA片| 婷婷伊人五月丁香天堂网| 欧美精品久久久久久视频观看| 五月天婷婷激情| 午夜性做爰电影| 日本一道久久| 婷婷五月在线视频| 亚洲亚洲人成综合网络| 东京热伊人| 亚洲综合色色| 成人五月丁香花| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 色五月婷婷影院| 欧美情色电影一区二区| 丁香五月亚洲激情婷婷射| 亚洲色另类| 日韩精品AV一区二区三区| 色婷婷在线播放| 丁香六月色婷婷综合| 免费看欧美成人A片无码| www.久久99| 99精品在线观看视频| 五月天丁香婷婷网| 99人这里只有精品| 99九九在线观看免费| 丁香色影院| 一根材五月婷成人| 91久久久久久| 婷婷午夜精品久久久| 亚洲综合激情五月| 丁香五月婷婷影视先锋| 丁香五月宝贝激情网| 99欧美| 另类图片色五月| 久久精品五月天| 久久久久五月丁香| 激情五月丁香六月| 日韩中文字幕| 天天搞夜夜叫| 色五月丁香五月| 成人短视频在线| 亚洲国产成人在线| 人妻综合网| www.久久99热地址发布| 超碰在线免费9| 五月丁香激| 毛v一区二区视频| 五月亭亭性| 光棍影院日韩精品| 丁香婷婷成人网| 秋霞丝袜啪啪啪| 超碰在线超碰| 久久色五月天| 97狠狠色| 99热碰碰热| 伊人久久99| 色色婷婷丁香| www.色综合| 天色综合网站| 国产真实乱了老女人视频 | 色五月婷婷基地| 五月丁香在线观看99| 欧美精品啪啪| 国产熟女一区二区三区五月婷| 婷婷色中文字幕| 狠狠色狠狠干| 亚洲欧洲中文日韩久久AV乱码| 久色中文| 激情婷| 五月天激情图片| 久久婷婷啪啪视频| www色色色com| 狠狠五月激情在线| 色婷婷丁香花五月天| 欧美一级操逼视频| 亚洲超级碰| 天天操天天曰| 国产激情综合五月久久| 五月天综合| 九九久久五月天综合伊人| 国产精品电影| 五月丁香婷婷俺| 久久综合无| 亚洲成人在线播放| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 九九久久腿| 五月天婷婷免费| 五月天伊人av| 亚洲狠狠色丁香婷婷综合久久| 色99网| 玖玖在线视频福利| 噼里啪啦完整版中文在线观看| 天天干天天爽天天操| 丁香狠狠色婷婷| 五月天色丁香| 婷婷五月天成人基地| 欧美啪啪9| 99久久九九| 99热免费在线| 五月丁香综合激情在线观看| 欧美黄色一级录像| 欧美性爱一区| 狠狠色狠狠鲁| www.99热这里精品| 日本乱子人伦在线视频| 五日激情综合| 五月激情婷婷图片基地| 狠狠色九月| 欧美性爱五月天| 日本VA视频| 婷婷基地成人五月天| 99热 在线播放| 综合色色色| 久久六月天| 538久久| 97电影99热| 婷婷五月性感| 色色色热| 丁香五月激情啪啪| 久久99热这里只有精品23| 激情四射婷婷色色色| 超碰人人在线| 亚洲综合草草| 99热6这里只有精品| 五月丁香婷婷综合| 色婷婷亚洲综合av| 国产XXXX搡XXXXX搡麻豆| 色欲天天综合| 五月丁香婷庭在线| 欧美丁香婷婷天天操| 婷婷丁香五月天影院 | 蜜桃婷婷狠狠久久综合| 欧美内射AAAAAAXXXXX| 丁香久月| 五月开心深爱激情网| www.色窝| 九九色欲网| 综合日本婷婷| 天天色中文字幕女优AV| 超碰人人操| 亚洲综合激情五月| 欧洲激情五月天| 婷婷五月丁香欧洲| 日本44久久在线| 丁香五月影院| 99色网站| 99A级片| 婷婷六月亚洲综合| 综合久久六月| 第四色婷婷五月| 79精品在线视频| 婷婷五月天AV网| jiujiujiuwuyuetian| AV在线不卡网站| www,setingting| 久久久com| 超碰免费99| 五月婷婷影| 类似婷婷激情综合网站| 五月好婷婷| 五月草影视| dingxiangtingtingliuyue| 99在线观看精彩视频| 这里只有精品偷拍| 九九热99re8热免费观看| 成人av观看| 碰97久久| 激情婷婷在线中文字幕| 色综合天堂| 丁香五月婷婷综合精品素人| 99爱爱网| 婷婷色五月激情强奸四射| 99热精品10| 99干视频| 91久操| 五月婷婷新网站| 精热在线综合网| 久热2025无码| 插插五月天| 5月婷婷激情6月| 欧美综合五月丁香五月天| 日韩色情亚洲五月天婷婷| 激情五月婷| 五月天久久久| 久热这里只有精品在线观看| 丁香五月天婷婷久久综合| 亚州精品色情在线观看| 四色女婷婷| 色婷婷88| 久9久9久9久9久9久9| www.99精品在线| 婷香五月| 97资源碰碰| site:picc-up.com| 五月丁香久久丝袜啪啪| 狠狠五月天激情| 欧美性丁香色色五月天干干| 九九re精品视频在线观看| 日本色色色| 99精品网| 欧美五月停| 色婷婷性爱| 国产探花一片区| 99久久精品色老| 色久婷婷网| 激情婷婷五月天日本系列 | 婷婷五月天色色| 伊人爱爱日本| 九九精品re免费视频| 久久六月天| 综合狠狠干| 人人草人人爱| 国产99久久久| 欧美性生交A片免费看| 大香婷婷| 婷婷丁香成人五月天| 天天插天天插天天日| 五月丁香做爱视频| 9 1超碰九色| 国产成人综合网| 久久一伦| 天天人人综合| 操操操AV| 五月婷亚洲精品AV天堂| 国产乱妇乱子在线播视频播放网站| 九九色情网五月天| 九九色图| 91大屁股| 碰碰91| 婷婷五月色综合香五月| 国产成人精品一区二三区熟女在线| 欧美超碰亚洲| 精品无码av丁香五月激情| 日本色狠狠| 婷婷五月丁香六月| 9 1大香蕉| 日日噜噜久久婷婷五月天 | 九九热99精品在线| 婷婷狠狠干| 夫妇交换刺激做爰| 九热视频在线精品15| 色五月天激情| 玖玖无码中文| 天天日P天天射P| 99区视频| 99日本黄站| 日本44久久在线| 美女亚洲五月丁香| 久久香蕉丁香| 九九综合网| 婷婷第六色| 国产精品日日躁夜夜躁| AV片在线观看| 天天在线天天综合网色| 五月天伊人| 草榴视频黄色网| 婷婷五月天天| 亚洲人妻av| 日本少妇AA一级特黄大片| 色五月婷婷视频| 色播播五月天| 丁香色五月 97干| 青草激情综合| 99se丁香| 亚洲日韩26uuu| 在线另类| 色噜噜夜夜夜综合网| 激情伊人五月天| 伊人免费视频9| 狠狠色丁婷婷日日,伊人激情综合网| 色婷婷精品视频| 97超碰色| 亚洲色婷婷视频| 97一区二区| 中文AV在线播放| 亚洲天堂色色| www.爱婷婷.com| www.99成人视频| 色99久草在线| 综合婷婷六月| www.色婷婷.com| 99热国产| 五月婷婷激情久久| 看全色黄大色大片| 亚洲激情婷婷| 五月婷婷亚洲色图| 欧美婷婷精品激情| 激情五月天久久| 深爱五月亚洲| 婷婷.com| 色婷亚洲| 色99xx| 欧美综合激情五月天| 95精品区一区二| 天天综合亚洲综合| 婷婷五月天99综合网站| 色播播之激情五月婷婷| 少妇性按摩无码中文A片| 无码中文一区二区三区| 免费看欧美成人A片无码| 婷婷五月天av| 九九色影院| 激情综合婷婷| 91九九九九九九|