色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

JavaWeb超市管理系統(tǒng)畢業(yè)設(shè)計:基于JSP+Servlet+MySQL的完整實現(xiàn)方案

JavaWeb超市管理系統(tǒng)畢業(yè)設(shè)計:基于JSP+Servlet+MySQL的完整實現(xiàn)方案 簡介基于 Java Web 的超市管理系統(tǒng)畢業(yè)設(shè)計項目內(nèi)含完整源碼、數(shù)據(jù)庫腳本和運(yùn)行配置面向計算機(jī)、通信、人工智能、自動化等專業(yè)的學(xué)生、老師及從業(yè)者。項目經(jīng)過調(diào)試與測試答辯評審分達(dá) 98 分整體可作為期末課程設(shè)計、課程大作業(yè)或畢業(yè)設(shè)計的直接參考。壓縮包共 386 個文件大小 10.36MB其中 49 個 Java 源文件和 56 個 JSP 頁面構(gòu)成主要業(yè)務(wù)邏輯與頁面層98 個 class 文件為編譯后字節(jié)碼可直接部署運(yùn)行SQL 腳本可快速導(dǎo)入建庫另有 XML 配置、CSS/LESS/SCSS 樣式、JavaScript 腳本及圖片等資源覆蓋前端展示與后端處理所需內(nèi)容。項目中控制器、DAO 實現(xiàn)類與 JSP 頁面分層明確可快速定位商品、會員、供應(yīng)商、結(jié)賬等核心功能入口。已有 156 人學(xué)習(xí)使用適合作為入門到進(jìn)階的實踐素材基礎(chǔ)較好的讀者可在現(xiàn)有功能模塊上繼續(xù)擴(kuò)展也可以按自身需求調(diào)整業(yè)務(wù)邏輯具有較強(qiáng)的二次開發(fā)價值。1. 這個 javaweb 超市管理系統(tǒng)到底在做什么值不值得選每年畢業(yè)季總有人從各種渠道下載到基于 javaweb 的超市管理系統(tǒng)這類項目解壓后對著十幾個文件夾和一坨 XML 配置發(fā)呆要么數(shù)據(jù)庫連不上要么頁面 404最后一邊罵怎么跑不起來一邊又找下一個源碼包。實際上這個題目是 javaweb 方向最穩(wěn)妥的畢業(yè)設(shè)計選題之一它不追求新框架而是把 JSP、Servlet、MySQL、JDBC 這一套經(jīng)典技術(shù)棧完整串起來做成一個業(yè)務(wù)閉環(huán)完整的系統(tǒng)。你做完它既能在答辯時把每一行代碼講明白又能在簡歷上寫?yīng)毩⑼瓿蛇M(jìn)銷存核心模塊設(shè)計與實現(xiàn)。如果你正在糾結(jié)選題或者已經(jīng)在做但卡在某個環(huán)節(jié)這篇文章把從建庫到部署的完整方案拆開講。這個系統(tǒng)的價值不在于超市這個業(yè)務(wù)本身而在于它覆蓋了 javaweb 項目最常見的三類核心需求登錄權(quán)限控制、商品進(jìn)銷存數(shù)據(jù)流轉(zhuǎn)、報表統(tǒng)計。這些能力換個殼放到圖書管理、藥店管理、倉庫管理系統(tǒng)里完全通用。它的技術(shù)棧舊但不過時——你去看很多公司的老舊維護(hù)項目還在用 JSPServlet 的并不少見。適合的人群很明確JavaWeb 剛學(xué)完、需要鞏固綜合能力的學(xué)生以及想快速搭建一個能演示、能答辯、能寫進(jìn)簡歷的項目的人。2. 選型與數(shù)據(jù)庫設(shè)計為什么用 JSPServlet 而不是 Spring Boot2.1 技術(shù)選型畢業(yè)設(shè)計場景下 jspservlet 依舊是穩(wěn)妥方案很多人會問現(xiàn)在企業(yè)里都用 Spring Boot為什么畢業(yè)設(shè)計還選 Servlet這不是技術(shù)落后而是答辯邏輯決定的。畢業(yè)設(shè)計評委會問你連接池怎么做請求怎么分發(fā)事務(wù)怎么控制如果你用 Spring Boot這些都被框架封住了你說不出底層實現(xiàn)只能答框架幫我處理了這在本科答辯里很吃虧。而 JSPServlet 這套組合你能明確說出瀏覽器發(fā)請求到 TomcatServlet 接收請求調(diào)用業(yè)務(wù)層業(yè)務(wù)層通過 JDBC 操作 MySQL數(shù)據(jù)渲染到 JSP 頁面返回。這條鏈路每一個環(huán)節(jié)都是你自己的代碼評委看得見你的工作量。常見做法是三層的 MVC 結(jié)構(gòu)JSP 負(fù)責(zé)頁面展示Servlet 負(fù)責(zé)接收請求和控制跳轉(zhuǎn)ServiceDAO 負(fù)責(zé)業(yè)務(wù)邏輯和數(shù)據(jù)庫操作。有些同學(xué)會把業(yè)務(wù)全寫在 Servlet 里頁面里嵌大量 Java 代碼系統(tǒng)照樣能跑但數(shù)據(jù)庫連接不關(guān)、SQL 拼字符串這些問題會在答辯時被追問得很痛苦。我一般建議用 Druid 連接池配合 JdbcTemplate 或者原生 JDBC 封裝既避免手寫連接管理的低級錯誤又保留了 SQL 的可見性。2.2 建庫建表八張表拆解超市業(yè)務(wù)的最小閉環(huán)數(shù)據(jù)庫是標(biāo)題里含數(shù)據(jù)庫的分量所在表結(jié)構(gòu)設(shè)計得好不好答辯時一眼就能看出來。超市管理系統(tǒng)最少需要八張表用戶表、商品分類表、商品表、供應(yīng)商表、進(jìn)貨單表、進(jìn)貨明細(xì)表、銷售單表、銷售明細(xì)表。用戶表管登錄分類表管商品的層級歸類商品表是核心進(jìn)貨和銷售通過單據(jù)表加明細(xì)表的方式記錄這樣每一筆業(yè)務(wù)都有據(jù)可查。先創(chuàng)建數(shù)據(jù)庫再按依賴順序建表以下是核心建表腳本MySQL 5.7 及以上均可運(yùn)行CREATE DATABASE IF NOT EXISTS supermarket_db DEFAULT CHARACTER SET utf8mb4; USE supermarket_db; -- 用戶表區(qū)分管理員、收銀員、倉管員 CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32) NOT NULL UNIQUE COMMENT 登錄名, password VARCHAR(64) NOT NULL COMMENT 存儲MD5加密后密文, real_name VARCHAR(32) COMMENT 姓名, role TINYINT NOT NULL DEFAULT 1 COMMENT 1管理員 2收銀員 3倉管員, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB COMMENT用戶表; -- 商品表中庫存字段承擔(dān)關(guān)鍵預(yù)警職責(zé) CREATE TABLE t_product ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT NOT NULL COMMENT 關(guān)聯(lián)分類表, product_code VARCHAR(32) NOT NULL UNIQUE COMMENT 商品編碼掃碼槍掃的就是它, product_name VARCHAR(64) NOT NULL, spec VARCHAR(64) COMMENT 規(guī)格如500ml/瓶, unit VARCHAR(8) NOT NULL COMMENT 單位瓶/包/盒, purchase_price DECIMAL(10,2) NOT NULL COMMENT 進(jìn)價成本計算依據(jù), sale_price DECIMAL(10,2) NOT NULL COMMENT 售價, stock INT NOT NULL DEFAULT 0 COMMENT 當(dāng)前庫存, stock_min INT NOT NULL DEFAULT 10 COMMENT 庫存預(yù)警下限, status TINYINT DEFAULT 1 COMMENT 1上架 0下架, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB COMMENT商品表;這段 SQL 里最值得注意的設(shè)計決策是庫存字段直接冗余在商品表里。有些教程會把庫存設(shè)計成每次進(jìn)貨和銷售時去單據(jù)明細(xì)表里 SUM 計算得到理論上更規(guī)范但實際業(yè)務(wù)里每次查詢商品都要掃描所有明細(xì)數(shù)據(jù)庫壓力和代碼復(fù)雜度都不合算。在超市這種高頻讀商品的場景下冗余一個 stock 字段讓查詢變成一次主鍵讀取配合事務(wù)控制來保證不超賣是工程上更務(wù)實的做法。商品編碼 product_code 建議用純數(shù)字條碼格式后面對接掃碼槍輸入時不需要改代碼。供應(yīng)商表、進(jìn)貨單表和明細(xì)表的結(jié)構(gòu)同樣要注意關(guān)聯(lián)方式。進(jìn)貨單主表只存供應(yīng)商、操作員、總金額、進(jìn)貨時間每一條商品進(jìn)入進(jìn)庫明細(xì)表。這種主表明細(xì)表的設(shè)計在銷售單上同樣適用是進(jìn)銷存系統(tǒng)的通用范式。下面把這三張表的建表語句補(bǔ)全CREATE TABLE t_supplier ( id INT PRIMARY KEY AUTO_INCREMENT, supplier_name VARCHAR(64) NOT NULL, contact VARCHAR(32) COMMENT 聯(lián)系人, phone VARCHAR(20), address VARCHAR(128) ) ENGINEInnoDB COMMENT供應(yīng)商表; -- 進(jìn)貨單主表一筆進(jìn)貨對應(yīng)一條記錄 CREATE TABLE t_stock_in ( id INT PRIMARY KEY AUTO_INCREMENT, supplier_id INT NOT NULL, user_id INT NOT NULL COMMENT 操作員, total_amount DECIMAL(10,2) NOT NULL COMMENT 進(jìn)貨總金額冗余存儲便于統(tǒng)計, stock_in_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB COMMENT進(jìn)貨單主表; -- 進(jìn)貨明細(xì)一條主表記錄對應(yīng)多行商品 CREATE TABLE t_stock_in_item ( id INT PRIMARY KEY AUTO_INCREMENT, stock_in_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL COMMENT 進(jìn)貨數(shù)量, price DECIMAL(10,2) NOT NULL COMMENT 當(dāng)時進(jìn)價商品改價不影響歷史單據(jù) ) ENGINEInnoDB COMMENT進(jìn)貨明細(xì)表;明細(xì)表里冗余 price 字段是一個關(guān)鍵設(shè)計如果商品進(jìn)價變動歷史單據(jù)里的價格仍然保持錄入時的值不會跟著商品表一起變。這在做利潤統(tǒng)計和審計時非常重要。另一個關(guān)鍵點(diǎn)是金額的冗余存儲進(jìn)貨單主表里的 total_amount 是通過明細(xì)算完后寫進(jìn)去的統(tǒng)計某月進(jìn)貨總額直接 SUM 主表即可不用再 JOIN 明細(xì)表這是典型的以空間換時間的做法。2.3 把 SQL 導(dǎo)入數(shù)據(jù)庫并驗證表結(jié)構(gòu)建表語句準(zhǔn)備好后啟動 MySQL 服務(wù)在命令行或者 Navicat 里執(zhí)行腳本。如果你用的是 MySQL 8.0 以上版本要注意驅(qū)動和連接串的差異這在后面連接池配置時會詳細(xì)講。導(dǎo)入后執(zhí)行SHOW TABLES;應(yīng)該能看到全部八張表再執(zhí)行DESC t_product;檢查字段類型確認(rèn)utf8mb4字符集沒有亂碼風(fēng)險。創(chuàng)建一個測試用戶并插入一條商品數(shù)據(jù)方便后面聯(lián)調(diào)登錄和商品查詢功能INSERT INTO t_user(username, password, real_name, role) VALUES(admin, MD5(123456), 系統(tǒng)管理員, 1); INSERT INTO t_product(category_id, product_code, product_name, unit, purchase_price, sale_price, stock, stock_min) VALUES(1, 6901234567890, 農(nóng)夫山泉550ml, 瓶, 1.20, 2.00, 100, 20);這里插入的是 MD5 加密后的密碼實際開發(fā)中更好的做法是 MD5 加鹽但畢業(yè)設(shè)計用 MD5 已經(jīng)足夠描述清楚你的加密方案。注意建表順序——先建用戶表和分類表再建商品表因為商品表的外鍵依賴分類表如果順序反過來會報 1215 錯誤無法添加外鍵約束。3. 搭建 javaweb 項目骨架Maven 結(jié)構(gòu)、連接池和第一個 Servlet3.1 用 IDEA 新建項目并引入依賴現(xiàn)在開始建工程。這里以 IDEA 2022 及以上版本為例新建項目時選擇 Maven 的 webapp 模板或者直接建一個普通 Maven 項目再右鍵添加框架支持—Web兩種方式都可以。項目結(jié)構(gòu)上src/main/java放 Java 代碼src/main/resources放配置文件和 SQL 腳本src/main/webapp放 JSP 頁面和靜態(tài)資源。這里要提醒一下很多畢業(yè)設(shè)計源碼包是從 Eclipse 導(dǎo)出的目錄結(jié)構(gòu)是 src/webroot拿到 IDEA 里要手動調(diào)整否則部署時找不到 JSP 文件。我見過太多人卡在這步。在pom.xml里引入關(guān)鍵依賴版本要匹配你本機(jī)的環(huán)境和 Tomcat 版本。下面是核心依賴配置dependencies !-- Servlet APITomcat 9 對應(yīng) javax.servlet-api 4.0.1 -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency !-- JSP API -- dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.3/version scopeprovided/scope /dependency !-- JSTL 標(biāo)簽庫 -- dependency groupIdjstl/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- MySQL 驅(qū)動按本地數(shù)據(jù)庫版本選擇8.0.33 兼容 5.7 和 8.0 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency !-- Druid 連接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.20/version /dependency /dependenciesscope為 provided 的依賴在打包時不會打進(jìn)去因為 Tomcat 自帶 Servl et 和 JSP 的 API 實現(xiàn)重復(fù)打入反而會報沖突。如果本地 MySQL 是 5.6 或 5.7也可以把連接驅(qū)動換成mysql-connector-java 5.1.49對應(yīng)的driverClassName也要同步調(diào)整。Druid 是目前國內(nèi)中小項目里最常用的連接池提供監(jiān)控頁面和 SQL 防注入功能答辯時可以多講它它不只是連接復(fù)用還能幫你看到每個 SQL 的執(zhí)行耗時。3.2 編寫 db.properties 和 Druid 工具類連接配置單獨(dú)放在src/main/resources/db.properties里方便切換環(huán)境。這里有一個高頻踩坑點(diǎn)MySQL 8.0 的連接驅(qū)動類名是com.mysql.cj.jdbc.Driver而 5.7 時代是com.mysql.jdbc.Driver抄舊源碼的人經(jīng)常在這里翻車。另外連接串里要顯式指定useUnicodetruecharacterEncodingutf8和serverTimezone否則插入中文數(shù)據(jù)會亂碼高版本 MySQL 還會直接報時區(qū)錯誤。driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://127.0.0.1:3306/supermarket_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai usernameroot password你自己的密碼 # 初始連接數(shù)、最大連接數(shù)、最大等待時間 initialSize5 maxActive20 maxWait60000在java目錄下建com.supermarket.util.DBUtil類。這個工具類全局只創(chuàng)建一個 DruidDataSource 實例所有 DAO 層代碼都通過它拿連接和釋放資源。注意這里必須用靜態(tài)代碼塊保證只初始化一次否則每次請求都新建連接池會被系統(tǒng)資源直接拖垮package com.supermarket.util; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; public class DBUtil { private static DataSource dataSource; static { try { InputStream in DBUtil.class.getClassLoader().getResourceAsStream(db.properties); Properties props new Properties(); props.load(in); dataSource DruidDataSourceFactory.createDataSource(props); } catch (Exception e) { throw new ExceptionInInitializerError(數(shù)據(jù)庫連接池初始化失敗 e.getMessage()); } } public static Connection getConnection() throws Exception { return dataSource.getConnection(); } /** 數(shù)據(jù)庫連接池中拿到的連接調(diào)用 close() 只是歸還連接 */ public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs ! null) rs.close(); } catch (Exception ignored) {} try { if (stmt ! null) stmt.close(); } catch (Exception ignored) {} try { if (conn ! null) conn.close(); } catch (Exception ignored) {} } }代碼邏輯上這類工具類是整個系統(tǒng)的地基。任何 DAO 里都通過DBUtil.getConnection()拿連接用完必須調(diào)用close()歸還。Druid 的close()行為不是真正關(guān)閉連接而是歸還到池里這一點(diǎn)要在答辯時說清楚——你并不是放棄了連接而是在做連接復(fù)用。參數(shù)方面maxActive設(shè) 20 對畢業(yè)設(shè)計足夠并發(fā)量不大的情況下 20 個連接已經(jīng)富余maxWait設(shè) 60000 表示如果池里沒有空閑連接最多等待 60 秒超時則拋出異常避免請求無限阻塞。3.3 用 BaseServlet 統(tǒng)一請求分發(fā)告別 Servlet 類爆炸如果按傳統(tǒng)方式做商品模塊要寫商品列表 Servlet、添加商品 Servlet、刪除商品 Servlet……一個模塊三四張 Servlet 類整個系統(tǒng)會膨脹到二十多個類維護(hù)起來非常痛苦。這里換一種思路寫一個 BaseServlet 子類利用反射根據(jù)請求參數(shù)里的action值來路由到子類的具體方法。這是一個 show 代碼功力明顯的設(shè)計答辯時講出來能加分不少。BaseServlet 代碼如下package com.supermarket.servlet; import com.supermarket.util.DBUtil; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; /** * 所有業(yè)務(wù) Servlet 的父類 * 子類通過繼承它自動獲得按 action 參數(shù)分發(fā)請求的能力 */ public class BaseServlet extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String action req.getParameter(action); if (action null || action.isEmpty()) { resp.sendError(400, 缺少 action 參數(shù)); return; } try { // 反射調(diào)用子類中與 action 同名的方法 Method method this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); method.setAccessible(true); method.invoke(this, req, resp); } catch (Exception e) { throw new ServletException(請求分發(fā)失敗 action, e); } } }邏輯上所有的業(yè)務(wù) Servlet 都繼承這個 BaseServlet新增加一個功能只需要在當(dāng)前 Servlet 里多寫一個 public 方法方法名就是 action 的值。例如ProductServlet里有l(wèi)ist方法和add方法前端請求product?actionlist就會自己走到 list 方法。到了 Servlet 3.0 以后映射關(guān)系用 WebServlet 注解寫在子類上不用再改 web.xml代碼能少寫一大截。反射調(diào)用的性能損耗可以忽略不計Tomcat 會復(fù)用 Servlet 實例。對應(yīng)的寫一個 LoginServlet 演示登錄邏輯和 Session 控制WebServlet(/login) public class LoginServlet extends BaseServlet { /** 渲染登錄頁面 */ public void toLogin(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher(/login.jsp).forward(req, resp); } /** 校驗登錄 */ public void doLogin(HttpServletRequest req, HttpServletResponse resp) throws Exception { String username req.getParameter(username); String password MD5Util.md5(req.getParameter(password)); UserDao userDao new UserDao(); User user userDao.findByUsernameAndPassword(username, password); if (user ! null) { // 存入 Session后續(xù)用過濾器判斷是否已登錄 req.getSession().setAttribute(loginUser, user); resp.sendRedirect(req.getContextPath() /product?actionlist); } else { req.setAttribute(errorMsg, 用戶名或密碼錯誤); req.getRequestDispatcher(/login.jsp).forward(req, resp); } } }MD5Util 是一個自己封裝的工具類對MessageDigest做包裝把密碼摘要成十六進(jìn)制字符串。注意這里有個安全習(xí)慣數(shù)據(jù)庫里存的是 MD5 密文用戶輸入密碼后要在 Java 端先加密再比較絕不能WHERE password$password直接拼接明文。登錄成功后用重定向而不是轉(zhuǎn)發(fā)這樣可以防止用戶刷新頁面時重復(fù)提交表單。Session 里的 loginUser 會被后面的登錄過濾器讀取這是 javaweb 項目做權(quán)限控制的標(biāo)準(zhǔn)姿勢。3.4 登錄過濾器和 web.xml 配置讓未登錄用戶無法訪問敏感頁面登錄校驗做完必須配上過濾器攔住那些不登錄就輸入 URL 訪問頁面的請求。創(chuàng)建一個 LoginFilter 實現(xiàn)javax.servlet.Filter接口在doFilter方法里判斷 Session 是否存在用戶存在就放行不存在直接重定向到登錄頁。要注意放行靜態(tài)資源和登錄相關(guān)的 URL否則模板引擎一加載 CSS 圖片就被攔住了頁面會變成純文本裸奔。filter filter-nameloginFilter/filter-name filter-classcom.supermarket.filter.LoginFilter/filter-class /filter filter-mapping filter-nameloginFilter/filter-name !-- 攔所有請求但靜態(tài)資源和登錄頁需要手動放行 -- url-pattern/*/url-pattern /filter-mapping如果項目用的是純注解方式也可以用WebFilter(/*)但是要注意dispatcher配置在 web.xml 和注解混用時代很容易出現(xiàn)過濾器重復(fù)執(zhí)行。配置完成后啟動 Tomcat瀏覽器訪問http://localhost:8080/supermarket/login能看到登錄頁面說明環(huán)境已經(jīng)通了一半——接下來用測試賬號登錄并跳到商品列表頁這一條鏈路跑通后面所有模塊的排查思路就清晰了。4. 核心業(yè)務(wù)實現(xiàn)進(jìn)貨入庫和 POS 收銀的事務(wù)與庫存聯(lián)動4.1 進(jìn)貨入庫主表明細(xì)表的寫入邏輯超市系統(tǒng)最核心的閉環(huán)是進(jìn)貨 → 入庫 → 上架 → 銷售 → 庫存扣減。進(jìn)貨這一步頁面是選擇供應(yīng)商 動態(tài)添加商品行提交到后端時請求里會攜帶一個供應(yīng)商 ID、多個商品 ID 和數(shù)量。這里故意設(shè)計成單個 Servlet 的單個方法一次性接收所有參數(shù)不能再走常見的逐條保存。具體邏輯拆解如下WebServlet(/stockIn) public class StockInServlet extends BaseServlet { public void add(HttpServletRequest req, HttpServletResponse resp) throws Exception { int supplierId Integer.parseInt(req.getParameter(supplierId)); int userId ((User) req.getSession().getAttribute(loginUser)).getId(); String[] productIds req.getParameterValues(productId); String[] quantities req.getParameterValues(quantity); String[] prices req.getParameterValues(price); // 內(nèi)部累加總金額同時生成主表記錄 double totalAmount 0; for (int i 0; i productIds.length; i) { totalAmount Double.parseDouble(prices[i]) * Integer.parseInt(quantities[i]); } Connection conn null; try { conn DBUtil.getConnection(); // 開啟事務(wù)之后任何一步失敗進(jìn)庫主表都不會留下殘缺數(shù)據(jù) conn.setAutoCommit(false); StockInDao stockInDao new StockInDao(); StockInItemDao itemDao new StockInItemDao(); ProductDao productDao new ProductDao(); // 1. 插入進(jìn)貨單主表拿到自增 ID int stockInId stockInDao.insert(conn, supplierId, userId, totalAmount); // 2. 逐條插入明細(xì)表 for (int i 0; i productIds.length; i) { int productId Integer.parseInt(productIds[i]); int quantity Integer.parseInt(quantities[i]); double price Double.parseDouble(prices[i]); itemDao.insert(conn, stockInId, productId, quantity, price); // 3. 同步累加商品庫存 productDao.increaseStock(conn, productId, quantity); } // 全部成功才提交 conn.commit(); resp.sendRedirect(req.getContextPath() /stockIn?actionlist); } catch (Exception e) { // 異常則整體回滾保證數(shù)據(jù)一致 conn.rollback(); throw new ServletException(進(jìn)貨失敗已回滾 e.getMessage(), e); } finally { conn.setAutoCommit(true); DBUtil.close(conn, null, null); } } }這段代碼有兩個關(guān)鍵點(diǎn)必須講給讀者。第一是conn.setAutoCommit(false)開啟手動事務(wù)把插主表 插明細(xì) 更新庫存變成一個原子操作任何一步拋異常所有已執(zhí)行的操作全部回滾。如果沒有事務(wù)極容易出現(xiàn)主表寫了一條進(jìn)貨單但庫存沒加上的臟數(shù)據(jù)。第二是 DAO 方法全部接受Connection參數(shù)——這是為了保證它們參與同一個事務(wù)而每個方法內(nèi)部不能再自己DBUtil.getConnection()拿新連接否則事務(wù)就斷開了。這是很多不成熟的源碼最常見的錯誤把事務(wù)相關(guān)的代碼寫得看似有但實際無效。參數(shù)說明上productIds使用getParameterValues接收同名參數(shù)數(shù)組這要求前端表單里每個商品行的name屬性都叫productId。如果實際運(yùn)行時只拿到一條數(shù)據(jù)先去看瀏覽器 Network 面板再決定是改前端還是改后端。totalAmount在 Java 端累加后寫入主表避免數(shù)據(jù)庫里多次 SUM 帶來的性能浪費(fèi)。庫存更新用的increaseStock是 PreparedStatement 的UPDATE t_product SET stock stock ? WHERE id ?這比先 SELECT 再 UPDATE 的讀改寫方式更安全不會因為并發(fā)讀取舊值而覆蓋掉中間的變動。4.2 收銀出庫同時扣庫存和生成銷售單收銀臺是另一個高頻操作。顧客選完商品后收銀員在頁面逐個掃描條碼系統(tǒng)累加購物車最后點(diǎn)擊結(jié)算后端一次性處理生成銷售單主表、寫入銷售明細(xì)、扣減庫存。扣庫存的 SQL 非常關(guān)鍵——把它設(shè)計成條件更新只有stock 購買數(shù)量時才執(zhí)行成功這正是解決超賣的方法UPDATE t_product SET stock stock - ? WHERE id ? AND stock ?前端收銀頁的核心邏輯是輸入框監(jiān)聽回車事件條碼匹配后通過 AJAX 查詢商品信息把名稱價格追加到購物車列表。這個效果聽起來復(fù)雜但可以用 jQuery 加少量 JavaScript 在 JSP 頁面里實現(xiàn)。關(guān)鍵代碼邏輯是每掃描一個條碼就向product?actionfindByCode發(fā)一個請求成功后往表格里追加一行。結(jié)算時把購物車數(shù)據(jù)依次填到隱藏表單字段里一次性提交全部數(shù)據(jù)。這種設(shè)計要說明的是數(shù)據(jù)量在單次幾十件以內(nèi)時完全沒有性能壓力不需要把購物車放到 Session 里每次結(jié)算都攜帶完整商品數(shù)組即可結(jié)構(gòu)簡單也不容易出錯。4.3 庫存預(yù)警讓項目看起來會思考進(jìn)銷存之外一個加分模塊是庫存預(yù)警。商品表里的stock_min字段此刻派上用場商品列表頁加載時對所有stock stock_min的商品打上紅色標(biāo)記首頁再用一個 SQL 查出需要補(bǔ)貨的商品數(shù)量。這個功能實現(xiàn)難度低、可視性強(qiáng)答辯時評委一般都會看上兩眼。典型實現(xiàn)是商品列表 DAO 里加一個方法public ListProduct findLowStockList(Connection conn) { String sql SELECT * FROM t_product WHERE stock stock_min ORDER BY (stock_min - stock) DESC; return queryList(conn, sql); }把低庫存列表放到后臺首頁登錄后第一眼就能看到哪些商品需要補(bǔ)貨這就是整個系統(tǒng)里最有業(yè)務(wù)價值的功能之一。從能用到好用庫存預(yù)警是一個性價比很高的功能點(diǎn)。對比維度上它和銷售時段統(tǒng)計報表一樣可以讓項目在功能列表里多出決策輔助這一分類而后者可以基于銷售單據(jù)表按小時分組聚合SQL 復(fù)雜一點(diǎn)但同樣可控。5. 部署和測試避坑5 個你能遇到的痛苦時刻和對應(yīng)解法5.1 現(xiàn)象Druid 啟動直接拋 ClassNotFoundException項目根本起不來這個報錯是驅(qū)動 JAR 沒有真正進(jìn)入 Tomcat 的 classpath 造成的。原因一般是 Maven 依賴沒導(dǎo)入全或者是 IDEA 的 Artifacts 配置里沒有把 mysql-connector 這個 jar 加入WEB-INF/lib。很多人只在 pom.xml 里寫了依賴就以為萬事大吉實際上 IDEA 要把依賴打進(jìn)去還需要重新構(gòu)建 Artifact。解決方法是打開File → Project Structure → Artifacts在 Output Layout 里右鍵Put into Output Root把mysql-connector-java和druid的 jar 加入WEB-INF/lib然后Build → Rebuild Project。如果還是報錯用壓縮軟件打開生成的 war 包檢查WEB-INF/lib下有沒有這兩個 jar這個土辦法最直觀。5.2 現(xiàn)象插入數(shù)據(jù)庫的中文全是問號或者變成 ?23? 這類亂碼原因通常是三層字符集不一致數(shù)據(jù)庫表字符集、JDBC 連接串字符集、JSP 頁面字符集。建庫時已經(jīng)用了utf8mb4連接串里也寫入characterEncodingutf8那亂碼多半出在 JSP 或者請求編碼上。檢查所有 JSP 頁面開頭是否有% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%以及 Tomcat 是否設(shè)置了 URI 編碼在conf/server.xml的 Connector 節(jié)點(diǎn)上加URIEncodingUTF-8。GET 請求的參數(shù)默認(rèn)按 ISO-8859-1 解碼這是鄙視鏈最頂端一個隱藏很深的坑POST 請求則靠req.setCharacterEncoding(UTF-8)解決。如果你每一步都對還是亂碼用數(shù)據(jù)庫客戶端直接執(zhí)行 SQL 插入一條中文數(shù)據(jù)能正常顯示的話說明問題確實在應(yīng)用層。5.3 現(xiàn)象登錄后跳轉(zhuǎn)商品列表 404控制臺找不到任何錯誤這種情況大概率不是代碼錯了而是訪問路徑不對。Servlet 配置的映射是/product但請求里寫成了/productServlet或者 JSP 頁面里表單 action 寫的路徑?jīng)]有帶req.getContextPath()。在 IDEA 內(nèi)置 Tomcat 中運(yùn)行時應(yīng)用上下文路徑就是部署時設(shè)置的名稱比如http://localhost:8080/supermarket_war_exploded/后面這串又臭又長的路徑是 IDEA 默認(rèn)生成的應(yīng)該手動改成/supermarket。修改方式Edit Configurations → Deployment → Application context改成/supermarket以后所有鏈接統(tǒng)一以${pageContext.request.contextPath}開頭。這一步是新手花時間最多的地方不是代碼邏輯問題而是工程配置問題要一步步排查。5.4 現(xiàn)象服務(wù)器啟動后訪問報 500堆棧里提示 Client does not support authentication protocol requested by server這是 MySQL 8.0 特有的坑默認(rèn)密碼加密方式是caching_sha2_password而老版本的 MySQL 驅(qū)動 JDBC 不支持。解決方法是把驅(qū)動升級到 8.0 以上或者把用戶密碼認(rèn)證方式改成mysql_native_password。在數(shù)據(jù)庫里執(zhí)行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密碼; FLUSH PRIVILEGES;如果改了還是報錯檢查連接串里是否漏加了serverTimezoneAsia/Shanghai高版本 MySQL 驅(qū)動要求必須顯式指定時區(qū)否則連接時會拋 SQLException。這些其實都不是復(fù)雜原理就是每個做 javaweb 的人都會走一遍的路說出來是為了讓你遇到時不用問人也能自己判斷。5.5 現(xiàn)象兩個用戶同時買同一個商品庫存變成負(fù)數(shù)這屬于典型的并發(fā)超賣問題。原因在于用先 SELECT stock 再 UPDATE stock stock - 1兩步操作兩個請求同時讀到舊庫存就會互相覆蓋。解決方案就是前面收銀出庫部分寫的條件更新 SQLUPDATE t_product SET stock stock - ? WHERE id ? AND stock ?讓數(shù)據(jù)庫自己去判斷扣減條件而不是靠 Java 代碼先查后設(shè)。這個 SQL 保證了只有當(dāng)前庫存大于等于本次購買數(shù)量時才會真正執(zhí)行更新JDBC 返回的影響行數(shù)為 0則說明庫存不足本次結(jié)算直接提示用戶。這種處理在數(shù)據(jù)庫層面保證了原子性也是進(jìn)銷存系統(tǒng)最常被考察的點(diǎn)。6. 答辯前做這兩件事數(shù)據(jù)驗證和報表之星系統(tǒng)功能做完別急著寫論文先用數(shù)據(jù)驗證證明系統(tǒng)的可靠性。準(zhǔn)備一個十行左右的 SQL 腳本模擬多次進(jìn)貨和多次銷售然后核對商品表庫存是否等于進(jìn)貨總量減銷售總量。如果一致說明事務(wù)控制正確如果不一致回頭檢查 4.1 節(jié)里的事務(wù)邊界是否有 Service 層繞過 Connection 參數(shù)的問題。這一步的驗證結(jié)論可以直接寫進(jìn)畢業(yè)論文的系統(tǒng)測試章節(jié)比你隨便寫幾行測試用例有說服力得多。第二個加分項是做一個簡單的近 30 天銷售趨勢報表頁面。SQL 用DATE_FORMAT(sale_time, %Y-%m-%d)做分組COUNT 算單量SUM 算銷售額每天一條記錄返回。頁面放一個表格或者用 ECharts 畫個折線圖展示波峰波谷日期。這個功能實現(xiàn)的絕對難度不大但它讓項目從增刪改查進(jìn)階到了數(shù)據(jù)可視化分析答辯時把亮點(diǎn)落在這里評委對工作量的認(rèn)可度會明顯不一樣。以前帶過的一個學(xué)生技術(shù)棧完全一樣就是多了這個報表答辯成績從良變成了優(yōu)。畢業(yè)設(shè)計項目的價值不完全在于功能數(shù)量而是在于你能把每個功能的設(shè)計緣由和工程權(quán)衡說清楚。希望這些經(jīng)驗?zāi)軒湍阍诖疝q前把系統(tǒng)打磨得又穩(wěn)又亮眼如果一路照著搭下來遇到什么反常識的報錯多半是環(huán)境問題而不是代碼問題別急著刪代碼重來先從配置上找原因。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香五月激情啪啪| 欧美精品精品一区二区| 天天干干天天干干| 嗯,啊。舔我逼| 国产精品一区午夜福利| 亚洲欧美国产中文字幕| 亚洲色电影在线| aaa淫乱视频| 神马久久久久久久| 亚州91| 日本三级韩三级99久久| 国产精品国产精品国产| 亚洲乱色视频一区、二区在线| 青青草毛片| 大香蕉手机在线视频| 久久人妻| 一区二三区四区视频大全套| 丰满人妻av一区二区三区 | 97超级欧美| 亚洲 欧美 偷拍 唯美| 婷婷五月天福利| 91五十路| 日韩av情韩国爱禁区av一区二区| 东北少妇高潮zzzz| 熟妇人妻一区二区三在线| 国精精品无码一二三区水多多| www.91欧美| 91free福利| av亚欧| 美腿丝袜高跟网免费视频免费视频| 国产在线激情| 狠色婷婷久久一区二区三区_| 国产AV毛片| 婷婷综合伊人一区| 欧美偷偷网| 久久久影院| 天天综合网日韩7799| aV中文麻| 男人天堂免费| 二区熟妇韩日| 日曰骚久久精品| 日本不卡码黄色| 99久久99九九99九九九| 在线a v| 啊啊啊啊啊啊好多水| 搞中出视频在线观看| 91久久婷婷| 国产亚洲精品美女久久久| 97伊人网| 农村少妇久久久久久久| 97超碰人操| 久极品在线观看| 国模吧 一区二区三区| 久久伊人最新网址视频| 亚洲影视综合| 美女诱惑久久| 97网色| 中文字幕青青草| 久久久精品视频欧州站| 欧美日韩中国x| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 国产少妇与亚洲av| 天天插天天插| 91色碰| 天天色综合图片| 亚洲中文字幕精品久久久久久直播| 久久久久人妻二区精品叶可怜| 国产精品操| 日本不卡二区| 97人人干| 久久国产精品视频| 亚洲骚男同com| 日本美女性生活久久久久久久| 色丁香五月婷婷| 久久婷婷视频| 久久久久成人蜜桃精品| 久久综合精品一区二区三区| 91欧美丨精品丨入口| 天天享受天天看| 久久一本大香蕉| 69综合网| 骚妻少妇精品性色无码四色A V| 啊啊啊啊在线播放| 久久久人妻| 九七超碰人人乐| 成人开心网在线视频| 99re99在线视频| 91狠狠综合网| 操逼视频免费日韩无码| 色蜜AV| oumeizonghese,www| 久久人妻一区二区三区高清| 福利视频网站| 亚洲成人av电影在线| 免费A V在线播放| 国产女人91精品嗷嗷嗷嗷| 日本熟妇一区二区三区| 色色婷| 26uuu欧美| 狠狠亚洲| av网页一区二区三区| 亚洲欧美中文日韩视频中国语| 国产最新AV| 一二三区精品视频| 18禁精品网站在线看| 国产女人成人精品视频| 欧洲综合视频| 神马麻豆福利院| 干干干天天| 啊啊啊啊啊啊啊国| 91在线国产后入风骚翘臀美女素人| 怡红院成人视频| 久久综合九色综合欧洲98| 风流老熟女一区二区三区l| 激情专区综合| 日韩ab网| 人妻无码一区二区三区久久99| 一区二区高清视频| 亚洲国产精品成人综合| 7777欧美成是人在线观看| 九九九网页| 9久9久9久9久视频网站| 欧美疯狂做爰xxxx| 日本黄色XXX| 777AV电影| 9 7超碰在线免费观看| yazhououmeizongya| 欧美中文字幕日韩在线| 中文字幕精品久久久久人妻红杏ⅰ| 91老司机视频| 超碰在线974| 一级一性爱免费视频| 国产精品青青草| 亚洲色图欧美一区二区不卡| 99国产天美| 日韩一级欧美一级国产一级台湾| www.久久超碰| 五月婷婷无码| 精品久久久久久AV无码| 日韩欧美天天爽爽爽天天爽爽| 国产黄色小视频网站| 久久久久78| 免费在线黄片视频| 国产乱子伦久久精品综合一区二区三| 69AV女优男人的天堂| 欧美一二三级精品在线| 中文字幕欧美日本乱码一线二线| 在线只有精品| 精品国产人成在线| 成人日本视频人妻在线| 精品二区三四区五电影 | 欧美日韩情色一区二区| 精品人妻一区二区视频| 91亚洲影视| 撸撸成人在线视频| 九九色热| 久久精品国产亚洲AV嘿嘿| 96国产精品| 青青草久久一区网| 色5月婷婷| 国产av强奸美女| 啊啊啊啊啊好多水| 无码精品啪啪啪一区二区三区三州| 中文字幕 码 自拍 视频 区| 日本Xx性爱| 亚洲 暴爽 AV人人爽日日碰| 久久9免费视频| 久久国产免费激情视频| 26uuu国产免费观看| 国产深喉| 日本不卡一区二区三区| 久久天天躁日日躁狠狠躁 | 久久乐| 国产浮力影院第1页| 欧美日韩插逼视频| 亚洲加勒比久久日本道| 啪啪啪男女亚洲中文字幕99| 国产日韩人人| 亚洲男人的天堂在线看| 抽查国产福利主播| 国产精品2020| 午夜成人福利影视| 97色97好| 精品国产国产AV| 欧美日韩精品国产91| 亚洲精品一区二区三区新线路| 婷婷九月色| 大香蕉久| 看看小穴| 亚洲日韩青青草色月| 少妇毛片久久| 成人在线永久| 精品久久久一本一道| 亚洲天天影视色综合| 久久久久久久六六| 啊啊啊 在线| 欧美日本不卡在线| 国产白丝av| 日韩免费福利在线观看| 免费伦费视频在线观看| 婷婷啪啪| 麻豆伊人网| 亚洲高清91| 再深点灬舒服灬太大了添视频| 天天综合91入口| 美女91| 亚洲欧美国产va在线播放频| 欧美日产国产在线成人第一区| 岛国大片国产| 开心五月婷婷| 亚州中文字幕超碰97| 另类老少妇| 欧成人精品一区二区三区| 亚洲天堂欧美| 日韩一区二区三区四区五区| 9/A片| 97bbn| 欧美狠狠干| 三级网色| 97人人爱人人做人人乐| 青青草一区二区高清无码视频 | 成人精品无码| 岛国成人av在线播放网址| 久久精品欧美一区蜜桃| 精品熟妇视频一区二区| 青娱乐欧美激情一区二区 | 亲子敌伦对白在线播放| 亚欧高清在线| 日韩丝袜高跟制服在线观看| 亚洲欧美日韩免费观看| 色欲久久综合| 欧美 日韩第一性色| 国产婷婷综合在线观看| 久久久蜜桃一区二区三区| 97在线青| 亚洲一欧洲中文字幕在线| 人妻精品综合中文字幕在线 | 97WW精品| 国产黄a三级三级三级av在线看| 四虎AV在线观看| 中文字幕精品专区搜索结果91| 尤物av网站免费在线播放| 日本熟女中文| 日韩久射综合| 人人操av| 天天影视亚洲| 蜜臀av在线播放一区二区三区| 韩国毛片一区二区三区| 天天操天天舔| 免费视频观看60秒| 婷婷丁香六月天| 情色图区| 人妻啊啊人妻啊| 99re免费| 久久久婷| 国产精品久久久久久片| 极品出轨视频网站| 熟女一区二区三区四区| 国产男人又猛又粗又爽| 桑老女人九区| 日韩精品区二区三区不卡| 欧美综合网在线| 久久国产99精品72福利 | 粉嫩国产精品久久粉嫩| 澳门黄片一香蕉视频| 熟女中出视频| 综合久久欧美| 亚洲一区二区在线观看91| 人人爽夜夜操| 黄色av片三级三级三级免费看| 日韩成人人妻网站| 男人兔费天堂| 国产69精品久久久久99尤物| 日本 情色 1区| 大色综合网| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 精品无码一区二区三区| 性欧美另类高清| 午夜AV人气不卡| 青青草原伊人网| 亚洲情色1区| 草莓精品视频| 一级片视频啪啪| 色亚州人久干视频在线观看免费版| 日韩精品一区的| 尹人免费观看视频在线| 亚洲天天自拍| 欧美一区二区三区成人性生活| www.91色综合| 久久久久久AⅤ无码免费肉站| 日韩欧美亚洲自拍偷拍| 91在线一起| 亚洲天堂人人妻| 欧美亚洲玖玖玖| 97欧美性爱| 操婢日韩| 日韩成年人性爱视频| chaopen97久久| 69人妻精品丰满熟女区| 日韩 人妻 精品| 婷婷五月天成人网| 六月丁香五月婷婷| 久久女婷| 少妇滛荡视频| 国产超碰| 99热这里| 天天91~综合入口| 日韩一级二级| 蜜臀久久久久久999| 亚洲黑丝在线| 爽爽歪在线视频| 超AV色女| 一区=区三区视频| 国产嫩草精品A88AV| 久久9久| 嗯嗯啊好大| 伊蕉97蜜桃97狠狠综合干| 超碰97资源中文字幕| 97国产精品国| 欧美日韩亚洲五月天婷婷| 精久久久91| 欧美国产成人在线| 青草伊人久久| 欧美aa一级片| 中文字幕诱惑制服人妻丝袜美丝袜美 | WWW.操逼.COM| 国产精品爆乳懂色蜜乳| 综合伊人激情| 中文字幕奈奈美被公侵犯| 国产一区免费午夜视频| 国产高清精品一区二区三区毛片| 精品久久久久久中文字幕三区| 精品人妻一区二区三区四区石在线| 亚洲情色视频| 操逼日批| 美女黄频a美女大全免费皮| 性色av婷婷久久一区二区点复制| 色婷网| 2020视频1区2区3区| 亚洲精品精品一区二区| 国产成人网址| 特级大荫道BBwBBwBBW| 欧美中文字幕一区| 东北操逼| 日韩一级二级三级在线不卡观看完整| 国产又猛又粗又爽又黄| 美中日韩无码| 富二代亚洲精品99| 狠狠躁日日躁夜夜躁A| 日本欧美不卡| 亚洲,日韩,欧美,成人播放| 人人扣人人操| www亚洲欧美| 亚洲国产亚洲天堂| 精品视频一二三中文| 天天日天天干天天色| 一区二区三区精品视频| 夜夜狼人妻| 亚欧操逼片在线观看 | 久久久一二三四区| 国产偷人伦激情在线观看| 免费簧片在线观看| 午夜呻吟欧美| 高清视频一区| 免费看久久久性性| 97一本大道亚洲一区| 大干人妻| 婷婷影院入口| 国产精品。| 人人妻人人爱人人玩| 中文字幕精品日韩中文字幕| 97色97好| 日韩成人高清一区二区| 男人的天堂不卡一区二区| 精品人妻一区春色| 欧美的性爱网站免费| 天天爱天天操| 亚洲AV人人澡人人爱| 啊啊啊好舒服视频| 狠狠狠狠狠狠| 中文字幕一二三av| 凸凹视频在线观看| 97久久精品不卡| 中文字幕乱码人妻二区三区| 五月天综合网| 亚洲精品国产日韩无码AV永久免| 久久亚州高清| 美国日韩黄片| 日韩激情中文字幕有码| 久久五十路熟女人妻| 国产精品制服丝袜中文字幕日韩一区二区三区 | 亚洲AV在线资源| av大香蕉| 久久99草| 精品一区二区人妖| 欧美女同在线| 亚洲 综合 欧美| 一二三四视频在线社区中文字幕| 91深夜夜| 欧美日韩中文字幕不卡| 亚洲色天堂日韩中| 精品久久久av无码免费| 熟女网站最新| 人妻99p| 久久99国产精品| 九九成人| 中文AV制服乱伦| 亚洲情色 自拍| 久久最新免费视频23| 中文字幕日韩专区精品系列| 色香综合天天影视综合| 丁香六月综合激情| 亚洲密乳AV| 97视频900| www.久久爱| 最新日本中文字幕| 日本五区不卡| 九九九久千久久激情蜜桃在线看| 国产又黄又粗的视频| 亚洲揄拍网| 99自拍视频在线| 欧美gv在线观看| 福利天天都操| 69人妻精品丰满熟女区| 婷婷中文网| 国产在线观看一区二区三区| 欧美综合777| 亚洲人精| 91粉芽高清在线一区二区| 黄色片,com| 视频一区二区免费在线| 一本色道久久综合亚洲二区三区| 在线播放中文字幕| 国产精品自在自拍视频| AV污污污污| 五月天开心网| 97操| 在线观看啊啊啊啊啊| wwe 天天干.com| 超碰久久性爱| 亚 欧 美 综合| 5月婷婷6月六月丁香| 亚欧免费| 久久国产免费激情视频| 日韩免费中文字幕视频| 综合另类| 日本欧美中文字幕| 91精品人妻一区二区三区蜜桃| 97操综合| 日韩欧美久久婷婷网站| 蜜区区视频79| 亚洲中文字幕久久无码精品| 91在线丝袜| 午夜无遮挡男女啪啪视频| 日韩熟女精一区二区三区不卡| 久久影视二区三区行押| 日本免费一区二区不卡| 精品人妻视频一区二区在线播放| 国产情色第一第二页在线观看| 10000部十八禁看电影| 亚洲AV无码久久精品蜜桃小说| 春色校园综合网| 中文字幕天天天天天| 免费农村成人少妇人妻Aa一区二区视频 | 亚洲成a人片在线观看中文!!!| 熟女乱3伦999| 欧美另类精品xxxx| 92人人操人人| 熟妇人妻精品一区二区视频色欲| 亚洲不卡AV在线| 国内精品不卡无毒99999| 熟妇人妻一区二区| 天天影视网色欲色香| 五月天欧美色图| 97chaopengongkai| 国内精品嫩模A∨私拍小视频| 亚洲av综合色区图片亚洲| 国产精品嫩草影院免费| 精品成人av一区二区三区在线| 精品夜夜澡人妻无码AV| 色拍偷亚洲| 嗯嗯不要视频| 欧美αv.com| 国产精品久久久久久 百度| 国产欧美亚洲精品a第2页| av一区二区三区 中文| 国模限制级电影| 欧洲亚洲人人爽爽视频| 日韩在线电影| 91人妻中文| 九九九综合精品| 日本ZZ高免费A级视频| 欧美精品精品一区二区| 日本人人操人人操| 夜夜狼人妻| 97视频播放| 中文人妻av高清一区| 草莓精品视频| 亚洲 欧美 小说| 欧美日韩传媒| 国产高潮AA片免费看| 青青青草原| 91色图| 精品成人动漫一区二区| 日韩天堂av电影在线观看| 久久东京热成人| 日韩精品在线观看观看| 嗯嗯嗯啊啊啊在线免费观看| 后入式视频国产自| 成人性爱视频在线看| 超碰日本97美女人妻人人玩人人爱| 爱丝福利| 色综合av男人天堂| 欧美天堂亚洲电影院一区在线播放| 97综合在线| 夜夜嗨AV一区天天| 中文字幕一二三| 欧美性特| 国产白丝精品在线观看| 人妻久热在线| 男人的天堂 在线一区| 国产九月婷婷| 91狠狠综| AV天堂男人的天堂| 青娱乐亚洲自拍| 国产亚洲99久久精品| 91九色网| 欧美亚洲韩国视频十五区 | 强奸乱伦亚洲第一页| 97这里只精品| 日本在线视频导航| 东北熟女91| 精品免费一区二区三区在线亚洲人成| 国产深喉视频一区二区| 国产精品亚洲四五区在线观看| 久久这里只精品免费福利| 99xav| 色久桃花影院在线观看| 日本精品加勒比海一区| 欧美一区91大爱| 午夜福利1区2区3区| 久9久精品视频| 色婷婷影视| www.天天干| 日本精品五区| 1024午夜激情男人的天堂| 三级片网站在线播放| 国产色图乱伦| 欧美精品亚洲精品日韩传电影| 激情综合网激情五月天| 无码人妻精品一区二区三区99不卡| jiujiujiujingpin| 丁香五月综合| 丰满高潮18xxxx| 少妇久久久久久久久| 超碰天天操你比| 色色色色色色色色色色色色色色综合 | 91精品在线播放| 中文字幕在线观看AV| 少妇滛荡视频| 欧美色视频在线| 老女人综合网| 亚洲中文字幕av| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 久久熟女人| 国产乱伦一二三区| 丝袜剧情| 老司机天天操| 俺去啦俺来也久久综合| 91路www| 人妻中文在线| 日韩色| 国产9l 大屁股| 大干人妻| 亚洲中字慕不卡| 色亚州人久干视频在线观看免费版| 青青草日本无码| 日韩成人精品| 免费看黄片现成| 精品三级在线专区| 人妻献身系列第54部| 一区二区中文| 91色综合| 欧美大香蕉久| yazhousetuoumei| 国产 丝袜 欧美中文 另类| 国产成人bd在线观看| 爱妃国产亚洲视频中文字幕| 久久性爱精品一区| 高潮的A片激情扒开一区| 日韩综合无码色欲vv| 欧美1区二区三区公司| 国产毛片在线| 99操碰| 亚洲色图激情小说| 日韩av色图综合| 伊人 俄罗斯 a v| 婷婷激情五月综合| 欧美色图亚洲色| 午夜性生活av免费在线看 | 亚洲精品天天影视综合网| 日韩成人午夜精品久久高潮| 亚洲资源网| 青青草AV色| 九九碰九九爱97超| www亚洲免费| 嫖老熟女A片一二三区| 91碰碰碰| 精品十三区| 97jingpin| 一区二区三区四区理论片| 日本乱人伦片中文三区| 国产欧美日韩臀| www.成人无码| 少妇高潮流水av免费| 欧美视频边做饭边橾| 性色A∨91| 色黄色美女大长腿午夜视频| 99在线精品视频| 国产精品在线网站| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 日韩大香蕉AV影片| 午夜男女爽爽爽影院视频| 亚洲熟女中文字幕在线| 亚洲妇色| 成人线上超碰| 日本欧美成人片AAAA| 淫乱图区 | 精品久热| 天天在线91| 亚洲 日本 一 二 三| 日本 情色 1区2区3区| 亚洲AV麻豆Aⅴ无码电影一| 婷婷五月天成人网| 综合天天。| 亚洲一级性爱视频免费看| 久久香蕉国产传媒一区剧情天美| 中文字幕久久亚州无码| 级做a爱无码性色永久免费| 色婷五月天| 久久久精选| 自慰白浆在线观看| 怡红院亚洲怡春院av| 天天操夜夜操狠很操| 欧美后进式| 老熟女91视频| 久久色激情一区二区三区| 999精品女人| 婷婷五月花| 精品少妇人妻一区二区三区| 久操网址| 香蕉大久久久| 中文字幕在线免费观看视频| 欧美淫乱视频| 丰满高潮18xxxx| 欧美一区二区三熟女剧情| 3P乱轮视频| 97草草| 强奸a片网| 97超碰日韩| 强上我不卡卡| 天天视频黄网站| 精品一区二区2| 亚洲 图片 综合91| а√天堂资源官网在线资源| 亚洲、日韩、综合、另类| 色色毛片| 97国产精选| 翘臀vidoes| 乱伦图av| 久久久久久久久久久久色网| 日本天堂网| 蜜乳AV网址| 婷婷三区| 午夜120视频在线观看| 青青青草原| 久久综合日韩亚洲欧美| 精品国产91av一区二区三区 | 国内毛片无码一级毛片| 欧美丰满少妇交换91欧美精品| 精品国产一区二区三区av在线资源| 超碰97人人cao| 另类图片五月天| 欧美性区| 夜夜爽33333| 国产精品久久久久中文字幕| 国产日本一区二区三区蜜臀在线观看| 免费看污网址| 久悠悠av| 色色综合网站| 中文字幕精品资源在线| 伊人久久综合影院精品久久久 | 嗯嗯啊啊操死我| 亚洲1区| 在线人人人人人人精品超 | 强奸xx国产| 亚洲精品啪视频| 蜜乳视频网站| 啪啪视频免费在线观看| 69麻豆天美| 国语精品对白| 综合少妇网| 另类专区加勒比| 二三四区精品| 日韩操呦呦影院在线观看| 淫色网综合| 欧美亚洲第1页| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 欧美高清无码免费视频高清版| 超碰在线免费一区二区三区| 超碰97久| 2020中文字幕在线观看| 九九九国产| 中文不卡视频| 蜜臀久久99精品久久久久久婷婷| 蜜臀AV一区二区三区| 日本不卡免费二区| 超碰天天去日穴| 综合久久9| AAA久久| 亚洲精品一二牛牛| 五月天婷婷欧美三区| 国模精品一区二区三区苹果色戒| 无码聚合| 丁香五月社区| 精品国产91久久久久久一区黄无| 综合网欧| 一区超碰一区| 玖玖久久久| 欧美v日韩v亚洲v最新在线| 国产成年女黄特黄| 丝袜剧情| 五月综合色| 美女AV一区二区| 97国产精品久久久久| 欧美亚洲手机在线| 26UUU欧美日本| 欧美久久伊人| 欧美顶级黄片AAAAA在线免费看| 大香蕉综合久久| 精品久久久久久中文字幕视频免费| 电影69乱码96| 欧美第一页性| 96久久久| 欧美色图 色综合图| 欧美黄业| 99操视频| 人妻一区二区三区四区视频| 亚洲精品成人| 黄片视频观看| 99少妇内射| 国产偷仑| 67194国产| 骚妻少妇精品性色无码四色A V| 大香交伊人网| 欧美系列在线一区二区| 欧美熟妇色| 98福利在线视频| 无码99| av天堂5| 亚洲阿v天堂在线| 久久99干一本高清| 日韩99神马视频片| 中文字幕 人妻不满 在线视频| 日本色色视频网站| 久久 精品| 天天摸夜夜操视频| 色性欧美| 超碰久热| 最新日产中文在线麻豆| 极品综合| 操东北女人| 四虎在线视频| 久久AV色| 人妻无码后入| 精品女人999| 国内精品久久久久影院亚洲| 亚洲 欧美 制服 另类 自拍| 亚洲久久久久| 91爱啪| 日本五区不卡| 中国黄色特级精品一区二区三区片| www.狠狠| 超碰碰碰碰| 综合一区中亚洲国产成人综合精品 | 中文字幕制服欧美久久一区| 国产农村妇女一区二区| 97久久久| 激情五月婷| 自拍鲍鱼一区在线高清观看免费| 免费啪啪一级视频| 在线a v| 日韩亚洲国产视频| 国产操偷| 伊人久久综合精品欧美| 91午夜无码| 男人天堂黄片| 欧美一级久久久久久久大片动画| 久草尤物| 亚洲 小说 欧美 激情 另类| 韩日欧亚a级| 四虎影视国产精品| 精品人妻久久久| 人妻激情视频| 后入国产| 91综合熟女| 超碰在线人人射| 好涩综合| 2017大香蕉| 试看日韩黄片| 97精品一区二区视频| 国产操逼网站亚洲一级黄色| 东京热一区二区中文字幕| 亚洲综合电影| 风间由美日韩欧美久久| 亚洲第一视频 欧美风情 日韩| 极品美女嘿咻| 超碰色图| 日韩日本欧美在线观看| 欧美十八禁视频| 亚洲精品国产专区在线观看| 国产一级操B视频| 无码 有码 国产18p| 亚洲天堂久久| 91麻豆天美国产欧美日| 久久九七| 2019午夜福利视频| 亚欧洲日韩国产精品| 欧美中出| 综合av社区| 国产熟女乱论| 亚洲精品视频在线播放| 97爱免费插| 91麻豆天美国产欧美日| 欧洲射精91| av久日| 中文字幕福利视频一区二区三区在线观看| 男人天堂2017| 岛国激情视频在线观看| 亚洲图片偷拍视频区| 天天操女人| 美美91成人国产精品欧美精品久久久久久久| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 亚洲 暴爽 AV人人爽日日碰| 曰韩精品视频一区二区| 人妻乱仑一区二区三区| 久久久98网站免费视频| 神马久久久久久久久久久久| 黑白配性爱AV成| WWW.操逼.COM| 色yeye成人免费视频| 人妻熟女字幕一区二区| 97久久精品国产| 偷拍亚洲情色| 黄色免费一级在线毛片| 亚洲图片欧洲图片aⅴ| 调教熟妇 久久久久久| 色999偷自拍拍| 丝袜美腿91| 大粗鳼巴久久久久| 人人看人人爰人人操| 99热免费| 免费看污网址| 色欧洲| 成人av福利在线观看| 99热综合| 中文字幕一区二区三四五区日日骚| 九九九国产| 美女午夜福利免费视频| 99这里只有精品| 91美女看B| 国产色图乱伦| 久久久精品视频免费观看| 人妻美腿丝袜制服诱惑综合天堂-| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 国产成人精品亚洲日本| 看黑人AV不卡| 噜噜瑟| 日韩中文字幕视频| 婷婷五月天色| 成人久久精品| 国产日本一区二区三区蜜臀在线观看| 亚州免费啪啪视频| 黑操B| 欧美性视频二区三区| 97干在线| 午夜福利成人免费视频| 熟妇艹鸡八| 亚洲91色| 中文字幕日韩人妻视频一区二区三区 | 亚洲综合九九| 国产人妻天天干精品| 欧美综合加勒比在线| 日本一卡二区在线| 欧美日韩国产高清在线一二三区| 欧美中文字幕一区| 国产精品久久久久婷婷二区次| 精品国产乱码久久久久久口爆网站| 欧美久久久15P| 久久人| 六月丁香啪啪| 少妇高潮喷水无套久久久久久| 九九精品99| 歐美一級亂黃99在綫精品| 美女高潮国产高清| 97av在线视频| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 日本三级A片网站com| 蜜臀AV一区二区三区激情综合| 久久久啊啊啊| 日本三级大片| 日本黄色精品| 东京热免费视频| 黄色交缠性感爆操91国产精品免费一区二区三区| 人人摸.人人色| 天天日天天舔东京热| 欧美美女视频| 亚 欧 美 综合| 亚洲丝袜诱惑| 女同在线视频一区| 一区二区高清视频| 99re6久热只有精品6在线直播| 97视频免费播放| 午夜精品一区二区三区三上悠亚| 97K超碰在线| 日韩人妻资源在线看| 超碰美女97| 无码99| 少妇久久久久久久| 91亚·色| 国产9 9在线 | 亚洲| 色五月天AV| 亚洲无码太久| 人妻内射一区二区在线视频| xxx0国产在线播放| 毛片麻豆91糖心精品毛情片| 日本护士高潮| 亚洲中字慕不卡| www.婷婷六月天| 97超碰站| 97激情97激情| 91在线视频免费播放| 丁香7月婷婷| 激情专区综合| 亚洲毛片基地专区| 黑人中出21连凳花野真衣| 操逼视频国产无套| 天天超级碰碰碰| AV污污污污| 欧洲亚洲人妻无码久久三区四区| 五月丁香成人网| 欧美 亚洲 第一页| 美女的肌被草喷水视频| 亚洲高清视频在线免费观看| 嗯嗯啊啊用力视频免费| 国产精品无码久久久久2028| 制服诱惑亚洲一区二区三区在线观看| 屁屁影院一区二区三区国产| 欧美亚洲手机在线| 亚洲免费精品一区| 日韩Va亚洲va欧美Ⅴa久久| 91美女看B| 国产欧美日韩在线不卡第一页| 天天综合欧美| 超碰97男人| 女人午夜视频777| 一区二区不卡视| 97色视频在线| 日韩人妻无码专区| 国产精品黑人一区二区三区| 久久亚码| 欧洲天天在线| 日韩色| 亚洲欧美洲综合| 啊啊啊好舒服好爽啊啊啊视频| 日本操逼视频导航| 91视频在线观看18| 91色色综合| 这里只有精品久久| 亚洲av综合色区图片亚洲| 色路综合| 91网18| 九九成人| 久久成人午夜精品影院| 久久丝袜| 精品中文日韩字幕视频| 欧美综合骚| 襙一襙| 欧美后入式| 一区,二区,三区网站| 久久久国产成人一区二区三区在线| 国产精品点击进入在线影院高清| 久久97超碰香蕉| 久久精品人体| 久久伊人亚洲AV无码网站| 精品十八在线观看| 亚州中文字幕超碰97| 国产刺激视频| 欧美东京热精品A∨| 青娱乐福利99| 久久久涩| 天堂涩涩| 东京热一区二区三区四区五区六区| 日韩丝袜二区| 一级二级三级黑人无码| 超碰美女97| 天天干1区2区在线| 中文字幕久久精视频久久大全| 天天综合网站| 欧美不卡二区| www.亚洲成人一区| 欧美激情综合网| 精品人妻视频一区二区在线播放| 青春草A| 色色色色色色色色色色色色色色综合 | 爱做久久久久久| 伊人网青青| 免费国产视频| 青青青在线高清视频在线一二三四区 | 超碰97在线中文| 狠狠操一区二区| 一区二区久久天天干狠狠| 老司机老司机午夜影院| 亚洲国产欧美一区二区潘金莲 | 老熟女天天操| 黄站在线免费观看| 久湿久久| 日韩美女久久一区二区三区| 曰韩精品九九无码| 思思热在线| 欧美日韩国产中文精品字幕自在自线 | 国产后入精品| 青青草日韩无码| 久99视频| 美女被艹尤物视频| 免费av大片| 香蕉人人操tv| 国产大学生口爆吞精合集| 伊人久久综合影院| 高潮毛片无遮挡高清免费| 探花精品 一区二区| 97免费在线观看| 九月伊人中文字幕| 欧美激情在线观看视频| 天天综合网在线91| 1024精品在线| 欧美综合中文| 久操免费电影| 97综合激情| 偷拍导航视频网站| 男人天堂新在线| 人人妻人人澡人人爽人人精品浪潮| 国产精品大屁股999| 91九色丰满高潮| 婷婷探花久久精品一区| 俺也射| 97精品全部| 夜色综合| 亚洲牲交| 性爱综合一区二区| 亚洲一曲日韩精品| 久久riav中文精品| 人人摸人人摸人人干| 国产视频一区二区免费| 在线99热| 日本天天操| 久久久久性熟视频| 九九英色视频| 一级黄碟在线观看| 欧洲精品一二三在线| 久久久九九| 视频在线97| 九月伊人中文字幕| 日韩无码视频黄色| av天堂精品久久| 新婚人妻扶着粗大强行坐下| 午夜天堂啪啪| a网站免费观看| 色哟哟国产精品免费网址| 啊啊啊啊二区好大| 91色综合激情| 九九九九97| 欧美姓爱综合网| AA级电影三区| 欧美极品性爱天天射| 凹凸视频特色日本特黄| 亚洲天堂中文字幕无码男同| 超碰超碰欧美| 欧美 熟女 日韩| 综合亚州欧美| 超碰在线一区| 亚洲最新av无码成人精品区| 丁香五月电影| 色九九九九久| 99抽插| 亚洲欧美综合图片| www熟女乱伦com| 久久夜黄色无码A级大片| 99色热| 大香网伊人久久综合网eew| 啊嗯嗯啊好大好爽| 国产精品第一页国产大屁股视频免费区| 91大神精品长腿在线观看网站| 探花在线免费观看视频国产一区| 爱我干综合| 色九月综合| 亚洲天堂久| 亚洲不雅视频1区二区| 国产精品永久免费10000| 丁香五月婷婷基地| 久久99国产综合精品女同| 国模91| 免费AV中文网在线观看| 中国农村熟妇毛片视频| 亚洲 欧美 手机在线观看| 91久久精品国产| 午夜无码熟妇丰满人妻| 亚洲日韩美女丝袜美腿人妻视频| 欧美性爱无码一区二区三区| 天天日少妇逼AV| 人妻无码久久一区二区三区免费| 大鸡巴久久| 亚洲成人一区二区精品| 久久e6只有精品| 97精品视频在线播放| 国产精品嫩草影院午夜两性| www.婷婷| 亚洲性猛交| 偷拍精品一区二区三区| 久操精品网| 玖玖爱一区在线| 国产精品视频在线观看| 欧美日韩性爱无码| 蜜桃中文字日产乱幕4区| 91色堂| 国产美女销魂在线观看不卡| 一区二区你上我| 成人在线午夜视频一区| 99久在线精品99re8a| 亚洲高清视频在线免费观看| 日韩女模中文造逼| 久久久久密臀视频| 综合97| 成功精品影院| 超碰社区97| 欧美1区二区三区公司| 麻豆 欧美 日韩| 国产sv美女内射| 亚洲少妇中文字幕网址| 人妻精品一区二区全免费| 日本天天干天天操一区| 精品亚洲国产成人AV制服丝袜| 日韩情色视频| 亚洲高清欧美总合| 狠狠婷婷亚洲中文综合久久| 午夜丁香| 欧美日本不卡| 中文字幕一区二区三区字幕| 猛交交| 久久综合久色欧美综合狠狠 |