久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

基于SSM+JSP+MySQL的圖書(shū)管理系統(tǒng):從數(shù)據(jù)庫(kù)設(shè)計(jì)到前后臺(tái)部署全解析

基于SSM+JSP+MySQL的圖書(shū)管理系統(tǒng):從數(shù)據(jù)庫(kù)設(shè)計(jì)到前后臺(tái)部署全解析 做JavaWeb課程設(shè)計(jì)或者畢業(yè)設(shè)計(jì)的同學(xué)十個(gè)里有八個(gè)都繞不過(guò)“圖書(shū)管理系統(tǒng)”這個(gè)題目。而當(dāng)你拿到的需求是“基于javaweb和mysql的ssm前臺(tái)后臺(tái)精品圖書(shū)管理系統(tǒng)(javassmjspmysql)”時(shí)本質(zhì)上你要交付的不只是一堆能跑的頁(yè)面而是一個(gè)把前臺(tái)用戶操作和后臺(tái)管理維護(hù)打通了的完整項(xiàng)目。這套東西放在簡(jiǎn)歷上是SSM整合經(jīng)驗(yàn)的證明放在答辯現(xiàn)場(chǎng)是數(shù)據(jù)庫(kù)設(shè)計(jì)和業(yè)務(wù)邏輯的展示。我將從怎么拆需求、怎么搭環(huán)境、怎么設(shè)計(jì)表、怎么寫(xiě)核心代碼再到上線部署前必須處理掉的坑完整走一遍這個(gè)項(xiàng)目的落地路徑。不管你是剛學(xué)完JavaWeb基礎(chǔ)、準(zhǔn)備做課程設(shè)計(jì)的新手還是被畢設(shè)題目折騰到到處找參考的在校生或者接了外包單子需要快速理解需求的開(kāi)發(fā)這份經(jīng)驗(yàn)都能幫你少走一半彎路。1. 拆解“前臺(tái)后臺(tái)”這套圖書(shū)管理系統(tǒng)的業(yè)務(wù)邊界到底在哪對(duì)著“前臺(tái)后臺(tái)”這幾個(gè)字很多人第一反應(yīng)是“多做幾個(gè)頁(yè)面就行”。真上手才發(fā)現(xiàn)前臺(tái)的用戶頁(yè)和后臺(tái)的管理頁(yè)之間數(shù)據(jù)是同一套但操作邏輯和權(quán)限邊界完全不一樣。先把業(yè)務(wù)邊界理清楚后面寫(xiě)代碼才不會(huì)寫(xiě)著寫(xiě)著就亂套。1.1 前臺(tái)功能用戶能做什么前臺(tái)的典型用戶是“借書(shū)人”不是管理員。圍繞“找書(shū)—借書(shū)—還書(shū)—看自己借了啥”這條主鏈路前臺(tái)至少要覆蓋這幾個(gè)場(chǎng)景注冊(cè)與登錄用戶能自己注冊(cè)賬號(hào)密碼不能明文存數(shù)據(jù)庫(kù)登錄后狀態(tài)要能保持。圖書(shū)瀏覽與檢索按分類(lèi)瀏覽圖書(shū)按書(shū)名、作者、ISBN做模糊搜索結(jié)果要分頁(yè)展示。圖書(shū)詳情頁(yè)能看到封面、簡(jiǎn)介、庫(kù)存量、價(jià)格等基本信息。借書(shū)操作點(diǎn)擊借閱時(shí)系統(tǒng)要檢查這本書(shū)還有沒(méi)有庫(kù)存、這個(gè)用戶有沒(méi)有逾期未還的圖書(shū)記錄。我的借閱展示當(dāng)前用戶的借閱列表區(qū)分“借閱中”和“已歸還”還書(shū)操作也在這里觸發(fā)。個(gè)人資料修改手機(jī)號(hào)、密碼等基本信息。實(shí)際開(kāi)發(fā)中前臺(tái)頁(yè)面大概就是首頁(yè)、圖書(shū)列表頁(yè)、詳情頁(yè)、登錄注冊(cè)頁(yè)、個(gè)人中心這五六個(gè)頁(yè)面??雌饋?lái)不多但每個(gè)頁(yè)面對(duì)應(yīng)的Controller、Service、Mapper都要完整走一遍。1.2 后臺(tái)功能管理員能做什么后臺(tái)是給管理員用的核心就一個(gè)詞維護(hù)。管理員不關(guān)心“這本書(shū)該不該借”只關(guān)心“數(shù)據(jù)是否準(zhǔn)確、有沒(méi)有人欠書(shū)不還”。后臺(tái)模塊一般拆成這幾塊圖書(shū)管理圖書(shū)的增刪改查、上下架、封面圖上傳。用戶管理查看注冊(cè)用戶列表、禁用違規(guī)賬號(hào)。借閱管理查看所有人的借閱記錄、處理還書(shū)、標(biāo)記逾期。分類(lèi)管理維護(hù)圖書(shū)分類(lèi)新增或刪除。公告管理發(fā)布簡(jiǎn)單的系統(tǒng)公告前臺(tái)首頁(yè)可以展示。后臺(tái)和前臺(tái)最大的區(qū)別不是頁(yè)面長(zhǎng)什么樣而是操作權(quán)限。后臺(tái)URL必須經(jīng)過(guò)管理員校驗(yàn)不能通過(guò)前臺(tái)普通用戶身份訪問(wèn)。用SSM框架實(shí)現(xiàn)這種權(quán)限分流核心就是攔截器加Session角色判斷這部分后面單獨(dú)展開(kāi)。1.3 為什么這個(gè)題目會(huì)選SSM而不是Spring Boot這幾乎是面試必問(wèn)的問(wèn)題“你怎么看待SSM和Spring Boot的區(qū)別”對(duì)于課設(shè)和畢設(shè)來(lái)說(shuō)選SSM其實(shí)是刻意為之的。SSM的每個(gè)組件職責(zé)非常清晰——Spring管對(duì)象、SpringMVC管請(qǐng)求分發(fā)、MyBatis管數(shù)據(jù)庫(kù)操作三者耦合度低代碼走到哪一步一看便知。相比之下Spring Boot雖然起步快但很多配置被自動(dòng)裝配“藏”起來(lái)了評(píng)審老師追問(wèn)底層機(jī)制時(shí)初學(xué)者反而容易答不上來(lái)。SSM這套架構(gòu)下一個(gè)典型的請(qǐng)求路徑是這樣的JSP頁(yè)面發(fā)起請(qǐng)求 - SpringMVC的DispatcherServlet - Controller - Service接口實(shí)現(xiàn) - Mapper接口 - MyBatis執(zhí)行SQL - MySQL返回結(jié)果把這條鏈路在腦子里跑通整個(gè)SSM項(xiàng)目你就理解了八成。后面所有功能都是往這條鏈路上掛新接口而已。2. 環(huán)境與工程骨架從零把SSMJSPMySQL在IDEA里跑起來(lái)很多同學(xué)項(xiàng)目代碼寫(xiě)得差不多了卻卡在“項(xiàng)目起不來(lái)”這一步。IDEA跑JavaWeb項(xiàng)目這件事看似簡(jiǎn)單實(shí)際操作里的坑一個(gè)接一個(gè)——Tomcat版本不匹配、依賴沒(méi)引全、數(shù)據(jù)庫(kù)驅(qū)動(dòng)版本不對(duì)、SSL連接報(bào)錯(cuò)……我把整個(gè)環(huán)境搭建過(guò)程重新梳理了一遍按順序走基本不會(huì)出問(wèn)題。2.1 IDEA配置Tomcat并運(yùn)行JavaWeb項(xiàng)目的關(guān)鍵操作如果你是用IDEA打開(kāi)別人給的SSM項(xiàng)目第一步不是點(diǎn)綠色按鈕而是確認(rèn)三件事JDK版本、Tomcat版本、Maven依賴是否全部下載完成。這三件是項(xiàng)目能跑起來(lái)的地基任何一件出問(wèn)題報(bào)錯(cuò)千奇百怪。項(xiàng)目結(jié)構(gòu)里檢查Project SDKSSM項(xiàng)目通常用的JDK 1.8或11用17容易遇到Tomcat版本不適配和各種反射警告。確認(rèn)Libararies里是否已有Spring、SpringMVC、MyBatis、MySQL驅(qū)動(dòng)等依賴。如果用的是Maven管理執(zhí)行clean reimport看右側(cè)Maven面板的依賴列表是否全部變綠。配置Tomcat時(shí)關(guān)鍵是“Deployment”標(biāo)簽頁(yè)里把項(xiàng)目的war包添加進(jìn)去Application context設(shè)為/。很多人只配了Server標(biāo)簽頁(yè)沒(méi)配Deployment一啟動(dòng)瀏覽器404。如果你拿到的是不帶Maven的老式SSM項(xiàng)目依賴都放在web/WEB-INF/lib下那更要注意Tomcat版本和依賴jar包版本的兼容性。我建議能轉(zhuǎn)Maven就轉(zhuǎn)Maven版本沖突和缺少傳遞依賴的問(wèn)題會(huì)少很多。實(shí)踐中最穩(wěn)的依賴組合是Spring 5.x MyBatis 3.5.x MySQL驅(qū)動(dòng)8.x JSTL 1.2Tomcat選擇8.5或9.0。2.2 配置SSM三個(gè)核心文件applicationContext.xml、spring-mvc.xml、mybatis-config.xmlSSM整合的本質(zhì)是Spring容器把SpringMVC和MyBatis全部管起來(lái)。多數(shù)教學(xué)項(xiàng)目會(huì)拆成三個(gè)配置文件各管一攤applicationContext.xml只管Service層和Mapper層的Bean開(kāi)啟注解掃描時(shí)注意排除掉Controller注解。spring-mvc.xml只管Controller層開(kāi)啟注解驅(qū)動(dòng)、配置視圖解析器InternalResourceViewResolver。mybatis-config.xml配置MyBatis全局屬性比如下劃線轉(zhuǎn)駝峰再交給Spring的SqlSessionFactoryBean加載。新手最常見(jiàn)的問(wèn)題是在applicationContext.xml里掃描Controller的注解在spring-mvc.xml里又掃描了Service結(jié)果導(dǎo)致同一個(gè)Bean被創(chuàng)建兩次有些方法調(diào)用時(shí)拿到的是空的代理對(duì)象啟動(dòng)不報(bào)錯(cuò)一調(diào)用就報(bào)空指針。正確做法是Spring配置文件里掃描service和daoSpringMVC配置文件里只掃描controller。2.3 MySQL 8安裝配置與驅(qū)動(dòng)、SSL連接的坑數(shù)據(jù)庫(kù)環(huán)境的坑比項(xiàng)目代碼更隱蔽?,F(xiàn)在電腦上裝的大概率是MySQL 8.x和很多博客里寫(xiě)的5.x配置有幾點(diǎn)關(guān)鍵區(qū)別JDBC驅(qū)動(dòng)類(lèi)不要再用com.mysql.jdbc.Driver要寫(xiě)com.mysql.cj.jdbc.Driver。JDBC連接URL里最好帶上useSSLfalse和serverTimezoneAsia/Shanghai否則啟動(dòng)時(shí)會(huì)報(bào)SSL連接錯(cuò)誤或時(shí)區(qū)錯(cuò)誤這是MySQL 8的常見(jiàn)問(wèn)題。一個(gè)典型可用的JDBC配置如下jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/library?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456在IDEA里連接數(shù)據(jù)庫(kù)時(shí)如果也遇到SSL報(bào)錯(cuò)直接編輯連接在Driver Properties里把useSSL設(shè)為false即可。別一看到SSL就慌這只是MySQL 8默認(rèn)走安全連接而本地開(kāi)發(fā)環(huán)境證書(shū)不全導(dǎo)致的。配置完環(huán)境我強(qiáng)烈建議先在數(shù)據(jù)庫(kù)客戶端Navicat或IDEA自帶的Database面板里把數(shù)據(jù)庫(kù)和表建好、灌入幾條測(cè)試數(shù)據(jù)再啟動(dòng)項(xiàng)目。否則項(xiàng)目起來(lái)了頁(yè)面上一片空白或者報(bào)“Table doesn’t exist”很難分清是代碼問(wèn)題還是數(shù)據(jù)庫(kù)沒(méi)初始化。最好用Navicat跑一遍全部建表SQL文件確認(rèn)沒(méi)報(bào)錯(cuò)再繼續(xù)。3. 數(shù)據(jù)庫(kù)設(shè)計(jì)圖書(shū)、用戶、借閱、分類(lèi)四張核心表的落地細(xì)節(jié)圖書(shū)管理系統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)網(wǎng)上能找到很多版本但大多存在一個(gè)通病邏輯上只有圖書(shū)和用戶兩張表借閱關(guān)系直接用一張中間表草草了事。等做到“我的借閱”頁(yè)面需要顯示圖書(shū)名、作者、借閱時(shí)間、應(yīng)還時(shí)間時(shí)就開(kāi)始瘋狂聯(lián)表查詢頁(yè)面越寫(xiě)越痛苦。我的建議是把四張表的關(guān)系一開(kāi)始就定死圖書(shū)表、用戶表、圖書(shū)分類(lèi)表、借閱記錄表。這樣后期功能擴(kuò)展空間大代碼也更好寫(xiě)。3.1 四張表的完整字段設(shè)計(jì)圖書(shū)表book的字段設(shè)計(jì)要考慮前臺(tái)展示和后臺(tái)檢索的需求核心字段如下字段名類(lèi)型說(shuō)明book_idint主鍵自增book_namevarchar(100)書(shū)名authorvarchar(50)作者publishvarchar(100)出版社isbnvarchar(20)ISBN可做唯一索引pricedecimal(10,2)價(jià)格category_idint分類(lèi)ID邏輯外鍵covervarchar(200)封面圖片路徑stockint庫(kù)存數(shù)量descriptiontext簡(jiǎn)介create_timedatetime入庫(kù)時(shí)間用戶表user除了基本信息還必須有一個(gè)status字段來(lái)支持管理員禁用賬號(hào)的操作字段名類(lèi)型說(shuō)明user_idint主鍵自增usernamevarchar(30)用戶名唯一索引passwordvarchar(64)經(jīng)過(guò)MD5加鹽后的密碼real_namevarchar(50)真實(shí)姓名phonevarchar(20)手機(jī)號(hào)statustinyint1正常0禁用create_timedatetime注冊(cè)時(shí)間借閱表是整個(gè)系統(tǒng)的核心它記錄的不只是“誰(shuí)借了哪本書(shū)”還應(yīng)該記錄借出時(shí)間、應(yīng)還時(shí)間、實(shí)際歸還時(shí)間、當(dāng)前狀態(tài)字段名類(lèi)型說(shuō)明borrow_idint主鍵自增user_idint借閱人IDbook_idint圖書(shū)IDborrow_timedatetime借出時(shí)間return_timedatetime應(yīng)還時(shí)間通常借出時(shí)間30天actual_return_timedatetime實(shí)際歸還時(shí)間未還為nullstatustinyint0借閱中1已歸還2逾期未還分類(lèi)表category就簡(jiǎn)單了category_id和category_name兩個(gè)字段前臺(tái)導(dǎo)航欄按分類(lèi)查書(shū)時(shí)用。3.2 為什么借閱表要冗余用戶和圖書(shū)信息這是我和很多同學(xué)看法不一樣的地方。教科書(shū)上總是強(qiáng)調(diào)“范式”數(shù)據(jù)庫(kù)設(shè)計(jì)要盡量消除冗余但實(shí)際做這種業(yè)務(wù)系統(tǒng)時(shí)我傾向于在借閱表里冗余賬號(hào)和書(shū)名兩個(gè)字段。原因是聯(lián)表查詢的性能和維護(hù)成本。如果借閱列表頁(yè)要顯示“誰(shuí)借了哪本書(shū)”按第三范式必須join用戶表和圖書(shū)表。當(dāng)數(shù)據(jù)量到了幾萬(wàn)條借閱記錄每次打開(kāi)后臺(tái)借閱管理頁(yè)面都要做兩次大表關(guān)聯(lián)數(shù)據(jù)庫(kù)壓力很大。更重要的是如果某本書(shū)后來(lái)被管理員刪除了物理外鍵會(huì)導(dǎo)致借閱記錄刪除失敗邏輯外鍵則會(huì)讓借閱記錄變成“孤兒數(shù)據(jù)”頁(yè)面上一顯示就是空白或報(bào)錯(cuò)。所以我在實(shí)際項(xiàng)目中這樣處理借閱表里除了user_id和book_id還冗余了user_name和book_name兩個(gè)字段查詢借閱流水時(shí)不需要聯(lián)表直接查這一張表就夠。前提是系統(tǒng)里用戶名不能改、書(shū)名改了以后歷史借閱記錄顯示的還是舊名字也無(wú)所謂。對(duì)于圖書(shū)管理系統(tǒng)這個(gè)場(chǎng)景這個(gè)取舍完全值得。3.3 字段默認(rèn)值與初始化數(shù)據(jù)的幾個(gè)經(jīng)驗(yàn)建表時(shí)還有一個(gè)容易忽略的細(xì)節(jié)字段默認(rèn)值。比如customer的status字段默認(rèn)設(shè)置成1正常借閱表的status默認(rèn)0借閱中圖書(shū)的stock默認(rèn)0而不是null。從數(shù)據(jù)庫(kù)層面多加一層兜底代碼里就能少寫(xiě)很多空值判斷。初始化數(shù)據(jù)也要提前準(zhǔn)備不要等運(yùn)行時(shí)再手動(dòng)敲??梢詫?xiě)一個(gè)init.sql里面插入幾個(gè)分類(lèi)文學(xué)、科技、歷史、少兒、10本左右圖書(shū)、一個(gè)管理員賬號(hào)admin/admin、一個(gè)測(cè)試用戶。這樣項(xiàng)目第一次啟動(dòng)頁(yè)面上就有內(nèi)容可看前臺(tái)搜索、借閱、后臺(tái)管理都能直接演示答辯的時(shí)候也不會(huì)出現(xiàn)“頁(yè)面空空如也”的尷尬。4. 前后臺(tái)權(quán)限分流登錄校驗(yàn)、攔截器、密碼加鹽一個(gè)都不能少圖書(shū)管理系統(tǒng)的“前后臺(tái)”不僅是頁(yè)面路由的區(qū)分更是安全邊界的區(qū)分。普通用戶JSP頁(yè)面可以訪問(wèn)前臺(tái)但后臺(tái)管理頁(yè)必須管理員才能進(jìn)用戶調(diào)接口必須帶著登錄Session才能操作。用SSM實(shí)現(xiàn)這套權(quán)限控制最核心的就是SpringMVC攔截器加Session機(jī)制。4.1 HandlerInterceptor攔截器的實(shí)現(xiàn)邏輯SpringMVC里權(quán)限校驗(yàn)最簡(jiǎn)潔的方式就是定義一個(gè)HandlerInterceptor類(lèi)重寫(xiě)preHandle方法在請(qǐng)求進(jìn)入Controller之前判斷Session里有沒(méi)有登錄標(biāo)記。public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user request.getSession().getAttribute(loginUser); if (user null) { // 未登錄重定向回登錄頁(yè) response.sendRedirect(request.getContextPath() /login.jsp); return false; } return true; } }然后在spring-mvc.xml里注冊(cè)這個(gè)攔截器并配置攔截路徑。這里有個(gè)細(xì)節(jié)必須注意攔截路徑不能寫(xiě)死成/否則登錄頁(yè)和靜態(tài)資源全被攔截就死循環(huán)了。推薦配置方式mvc:interceptors mvc:interceptor mvc:mapping path/user/**/ mvc:mapping path/admin/**/ mvc:exclude-mapping path/login/ mvc:exclude-mapping path/register/ mvc:exclude-mapping path/static/**/ /mvc:interceptor /mvc:interceptors4.2 后臺(tái)管理員的角色區(qū)分與請(qǐng)求分流既然有“前臺(tái)后臺(tái)”那登錄用戶分成兩類(lèi)普通用戶和管理員。最簡(jiǎn)的做法是用戶表里加一個(gè)role字段0表示普通用戶1表示管理員。登錄時(shí)把整個(gè)用戶對(duì)象放進(jìn)Session后續(xù)每個(gè)需要權(quán)限的接口都判斷Session里的用戶對(duì)象是否存在以及role是否為1。我習(xí)慣再加一個(gè)AdminInterceptor專(zhuān)門(mén)管/admin/**路徑邏輯和LoginInterceptor類(lèi)似但多一層role判斷Object loginUser request.getSession().getAttribute(loginUser); if (loginUser instanceof User) { User user (User) loginUser; if (user.getRole() 1) { return true; } } response.sendRedirect(request.getContextPath() /login.jsp); return false;之所以單獨(dú)再寫(xiě)一個(gè)攔截器而不是在LoginInterceptor里拿到所有業(yè)務(wù)邏輯是為了兩個(gè)角色的擴(kuò)展性。以后如果還要加一個(gè)“圖書(shū)管理員”角色前臺(tái)也能訪問(wèn)某些后臺(tái)接口改起來(lái)就方便。4.3 密碼不要明文存MD5加鹽的正確做法數(shù)據(jù)庫(kù)里直接存密碼明文是答辯時(shí)最容易被打低分的點(diǎn)。其實(shí)用Spring自帶的DigestUtils就能輕松做MD5加密但單純MD5還是會(huì)被彩虹表爆破常規(guī)做法是“鹽值 MD5”。我的實(shí)現(xiàn)思路是注冊(cè)時(shí)取一段固定的鹽值比如“l(fā)ibrary_salt”和用戶輸入的密碼拼接再一起做MD5把加密結(jié)果存數(shù)據(jù)庫(kù)登錄時(shí)對(duì)用戶輸入的密碼做同樣拼接加密再和數(shù)據(jù)庫(kù)里的密文比對(duì)。String salt library_salt; String encryptedPwd DigestUtils.md5DigestAsHex((salt rawPassword).getBytes(UTF-8));這樣做的好處是哪怕兩個(gè)用戶的密碼相同只要鹽值參與拼接數(shù)據(jù)庫(kù)中存的密文也都一樣不影響驗(yàn)證邏輯但比純MD5安全了一步。如果是更規(guī)范的項(xiàng)目建議給每個(gè)用戶隨機(jī)一個(gè)鹽值然后單獨(dú)存在用戶表里不過(guò)課設(shè)和外包項(xiàng)目用固定鹽值也夠用了。4.4 登錄信息與退出登錄成功后把用戶對(duì)象放進(jìn)Session頁(yè)面上的顯示用JSTL的${sessionScope.loginUser.username}即可。退出功能就是執(zhí)行session.invalidate()把Session整個(gè)失效同時(shí)把購(gòu)物車(chē)、借閱臨時(shí)狀態(tài)一并清掉。這里提醒一句JSP頁(yè)面里取Session的值一定要加${empty sessionScope.loginUser}判斷否則未登錄用戶訪問(wèn)首頁(yè)時(shí)明明沒(méi)登錄卻能在導(dǎo)航欄看到一個(gè)用戶名非常出戲。5. 核心業(yè)務(wù)實(shí)現(xiàn)檢索分頁(yè)、借閱事務(wù)、后臺(tái)CRUD的代碼思路權(quán)限分開(kāi)后剩下的就是把各個(gè)業(yè)務(wù)功能逐個(gè)填進(jìn)SSM的鏈路。以下三個(gè)模塊基本覆蓋了這個(gè)系統(tǒng)的全部技術(shù)難點(diǎn)也是答辯時(shí)老師最想看的部分。5.1 前臺(tái)圖書(shū)檢索模糊查詢 分頁(yè)的實(shí)現(xiàn)圖書(shū)列表頁(yè)是用戶進(jìn)入系統(tǒng)后看到的第一個(gè)頁(yè)面處理不好就會(huì)又慢又亂。我在項(xiàng)目里用MyBatis的動(dòng)態(tài)SQL做一個(gè)多條件查詢支持按分類(lèi)、書(shū)名模糊搜索、作者模糊搜索。核心Mapper寫(xiě)法如下select idsearchBooks resultTypecom.example.entity.Book SELECT * FROM book where if testkeyword ! null and keyword ! AND (book_name LIKE CONCAT(%, #{keyword}, %) OR author LIKE CONCAT(%, #{keyword}, %)) /if if testcategoryId ! null AND category_id #{categoryId} /if /where ORDER BY book_id DESC LIMIT #{offset}, #{pageSize} /select分頁(yè)有兩種選擇自己手寫(xiě)一個(gè)簡(jiǎn)單的PageBean或者引入PageHelper插件。如果你的項(xiàng)目只是課設(shè)我建議自己寫(xiě)邏輯非常清晰——接收當(dāng)前頁(yè)碼pageNum和每頁(yè)條數(shù)pageSize計(jì)算offset查完數(shù)據(jù)后把總記錄數(shù)拿出來(lái)算總頁(yè)數(shù)封裝成一個(gè)PageBean返回給JSP。5.2 借閱業(yè)務(wù)事務(wù)、庫(kù)存校驗(yàn)和狀態(tài)判斷借閱是Service層最典型的業(yè)務(wù)方法也是考察事務(wù)管理是否掌握的關(guān)鍵點(diǎn)。一套完整的借閱邏輯包括四步根據(jù)bookId查出圖書(shū)判斷庫(kù)存是否大于0。根據(jù)當(dāng)前登錄用戶的ID查其是否有未歸還的借閱記錄避免同一人重復(fù)借同一本書(shū)。執(zhí)行更新圖書(shū)庫(kù)存減1插入一條借閱記錄狀態(tài)為借閱中應(yīng)還時(shí)間為當(dāng)前時(shí)間加30天。上述任何一步失敗回滾所有操作。少一個(gè)判斷借閱流程就是殘缺的。尤其要注意“減庫(kù)存”和“插入借閱記錄”這兩個(gè)數(shù)據(jù)庫(kù)操作必須放進(jìn)同一個(gè)事務(wù)里。如果只減了庫(kù)存而沒(méi)插入借閱記錄圖書(shū)就莫名其妙少了一本如果只插了記錄而沒(méi)減庫(kù)存庫(kù)存數(shù)據(jù)就會(huì)虛高。所以Service方法上必須加Transactional注解Transactional(rollbackFor Exception.class) public void borrowBook(Integer userId, Integer bookId) { Book book bookMapper.selectByPrimaryKey(bookId); if (book.getStock() 0) { throw new RuntimeException(庫(kù)存不足); } int count borrowMapper.countNotReturnByUserAndBook(userId, bookId); if (count 0) { throw new RuntimeException(請(qǐng)先歸還之前借閱的圖書(shū)); } bookMapper.decreaseStock(bookId); BorrowRecord record new BorrowRecord(); // 設(shè)置userName、bookName等冗余字段 record.setUserId(userId); record.setBookId(bookId); record.setBorrowTime(new Date()); record.setReturnTime(DateUtils.addDays(new Date(), 30)); record.setStatus(0); borrowMapper.insert(record); }5.3 后臺(tái)CRUDMyBatis動(dòng)態(tài)SQL與批量操作后臺(tái)圖書(shū)管理的增刪改查核心用法是MyBatis的if動(dòng)態(tài)SQL。新增圖書(shū)時(shí)字段很多不同場(chǎng)景下傳參不同動(dòng)態(tài)SQL最適合。修改圖書(shū)時(shí)只改有值的字段避免把不需要?jiǎng)拥淖侄胃采w成null。這里還有兩個(gè)容易被忽視的業(yè)務(wù)點(diǎn)刪除圖書(shū)如果這本書(shū)還有未歸還的借閱記錄直接刪除會(huì)導(dǎo)致用戶還書(shū)時(shí)找不到對(duì)應(yīng)圖書(shū)應(yīng)該在刪除前檢查借閱表中有沒(méi)有該書(shū)的未歸還記錄。有的話提示“該書(shū)存在未歸還記錄無(wú)法刪除”。修改圖書(shū)狀態(tài)不要物理刪除圖書(shū)用一個(gè)is_delete字段標(biāo)記邏輯刪除是更穩(wěn)妥的方案。這樣即使某本書(shū)被下架歷史借閱記錄也不會(huì)變成孤兒數(shù)據(jù)。5.4 JSP頁(yè)面的數(shù)據(jù)展示JSTL EL是標(biāo)準(zhǔn)答案JSP頁(yè)面里最忌諱的就是寫(xiě)大段Java腳本片段scriptlet頁(yè)面會(huì)又丑又難維護(hù)。前臺(tái)列表頁(yè)展示循環(huán)數(shù)據(jù)時(shí)用JSTL標(biāo)簽加EL表達(dá)式干凈利落c:forEach items${pageBean.list} varbook div classbook-item h3a href${pageContext.request.contextPath}/book/detail?id${book.bookId}${book.bookName}/a/h3 p作者${book.author}/p p庫(kù)存${book.stock}/p a hrefjavascript:void(0) onclickborrowBook(${book.bookId})借閱/a /div /c:forEachJSP頁(yè)面加載完成后刷新一次的問(wèn)題很多人遇到過(guò)表單提交后瀏覽器地址欄沒(méi)有變化用戶手動(dòng)刷新導(dǎo)致表單重復(fù)提交。解決思路有兩個(gè)第一是提交后Controller使用redirect:重定向到列表頁(yè)而不是forward第二是JSP里用c:redirect或者在頁(yè)面加載時(shí)調(diào)用一段JavaScript控制歷史記錄。我在項(xiàng)目中實(shí)測(cè)下來(lái)最省心的方案還是Controller里統(tǒng)一用redirect保證刷新不會(huì)重復(fù)提交。6. 我踩過(guò)的坑亂碼、日期、孤兒數(shù)據(jù)與MySQL 8的SSL報(bào)錯(cuò)代碼寫(xiě)完之后真正常在找錯(cuò)上耗幾小時(shí)的往往不是業(yè)務(wù)邏輯而是環(huán)境類(lèi)和常識(shí)類(lèi)的坑。這些坑百分之百會(huì)在你的項(xiàng)目中遇到提前排掉后面就順了。6.1 三層亂碼JSP、請(qǐng)求、數(shù)據(jù)庫(kù)各管一截SSM項(xiàng)目出現(xiàn)中文亂碼十有八九是編碼設(shè)置不完整。亂碼需要從三個(gè)層面同時(shí)排查缺一不可頁(yè)面層JSP第一行設(shè)置% page contentTypetext/html; charsetutf-8 pageEncodingutf-8 %。請(qǐng)求層配置SpringMVC的CharacterEncodingFilter強(qiáng)制UTF-8。數(shù)據(jù)庫(kù)層JDBC連接URL里加characterEncodingutf8建表語(yǔ)句加default charsetutf8。filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping順序錯(cuò)了不行漏了更不行。我曾經(jīng)整了半天發(fā)現(xiàn)數(shù)據(jù)庫(kù)表是latin1編碼JSP改一百遍也沒(méi)用。建議建表時(shí)統(tǒng)一加上ENGINEInnoDB DEFAULT CHARSETutf8一勞永逸。6.2 日期顯示問(wèn)題JSP上的借閱時(shí)間和應(yīng)還時(shí)間數(shù)據(jù)庫(kù)datetime字段傳到頁(yè)面上默認(rèn)格式是“2024-06-01 12:00:00”看著還算正常。但如果你把日期放在輸入框中做編輯或者需要顯示成“2024年6月1日”這種格式就得做格式化。JSTL的fmt:formatDate是最方便的選擇fmt:formatDate value${record.borrowTime} patternyyyy-MM-dd HH:mm:ss/后臺(tái)借閱管理里經(jīng)常要根據(jù)應(yīng)還時(shí)間判斷逾期千萬(wàn)別在Java代碼里把日期轉(zhuǎn)成字符串比較直接用new Date()和數(shù)據(jù)庫(kù)里查出來(lái)的Date對(duì)象做after、before比較前端只管顯示格式化后端只管拿對(duì)象比較這樣不會(huì)出時(shí)區(qū)偏差。6.3 邏輯刪除導(dǎo)致的孤兒數(shù)據(jù)坑前面提到過(guò)借閱表不要物理外鍵這里再提醒一個(gè)相關(guān)坑如果你用了物理外鍵刪除圖書(shū)分類(lèi)時(shí)只要該分類(lèi)下還有圖書(shū)數(shù)據(jù)庫(kù)就會(huì)拒絕刪除。很多人的做法是改成“邏輯刪除”——分類(lèi)表加一個(gè)is_delete字段刪除時(shí)執(zhí)行update而不是delete。這本身沒(méi)錯(cuò)但緊接著就會(huì)遇到新問(wèn)題統(tǒng)計(jì)某分類(lèi)下圖書(shū)數(shù)量時(shí)、前臺(tái)按分類(lèi)展示時(shí)都要記得在SQL里加WHERE is_delete 0否則下架的舊分類(lèi)和舊圖書(shū)全會(huì)出現(xiàn)在頁(yè)面上。我在最終演示前就栽過(guò)一次明明做了邏輯刪除前臺(tái)分類(lèi)導(dǎo)航里還顯示著已刪除的分類(lèi)就是因?yàn)椴樵儠r(shí)漏了is_delete條件。6.4 IDEA部署刷新慢、JSP修改不生效的問(wèn)題操作系統(tǒng)SSM項(xiàng)目時(shí)還會(huì)遇到一個(gè)現(xiàn)象改了JSP重啟Tomcat后看到的還是舊頁(yè)面。這跟瀏覽器緩存和Tomcat的JSP編譯緩存都有關(guān)系。排查時(shí)先按CtrlF5強(qiáng)制刷新瀏覽器還不行就手動(dòng)清理Tomcat的work目錄下該項(xiàng)目的編譯緩存。IDEA里也可以把Tomcat的On frame deactivation設(shè)為Update classes and resources改JSP能熱更新但改Java代碼還是需要重啟別指望完全熱部署。7. 項(xiàng)目跑通之后從IDEA到服務(wù)器完成一次可演示的部署交付很多人在IDEA里跑通了項(xiàng)目就以為戰(zhàn)斗結(jié)束了其實(shí)考試和交付場(chǎng)景下最常見(jiàn)的要求是“在服務(wù)器上能訪問(wèn)”。這個(gè)環(huán)節(jié)雖然不需要你精通運(yùn)維但幾個(gè)核心步驟必須有概念。7.1 打war包還是直接打包SSM項(xiàng)目的JSP頁(yè)面在webapp目錄下通常用IDEA的Artifacts打war包或者M(jìn)aven配置packagingwar/packaging后執(zhí)行package。war包的好處是Tomcat直接扔進(jìn)webapps目錄就能跑無(wú)需額外配置。如果你的項(xiàng)目用Maven構(gòu)建打包前注意資源文件的問(wèn)題mapper.xml如果放在src/main/java的包下可能不會(huì)被打進(jìn)war包需要在pom.xml的build節(jié)點(diǎn)里加上resources配置把mapper文件也包含進(jìn)去。這個(gè)問(wèn)題相當(dāng)常見(jiàn)我見(jiàn)過(guò)好幾次“打包后在服務(wù)器上報(bào)MapperBindingException本地卻好好的”八成就是mapper.xml沒(méi)打進(jìn)去。7.2 云服務(wù)器上部署的完整流程在服務(wù)器上的部署流程按這個(gè)順序操作基本不會(huì)翻車(chē)服務(wù)器安裝JDK、Tomcat、MySQL版本和本地保持一致。把本地的library數(shù)據(jù)庫(kù)導(dǎo)出為SQL文件在服務(wù)器MySQL里執(zhí)行導(dǎo)入。修改數(shù)據(jù)庫(kù)配置文件把localhost換成服務(wù)器內(nèi)網(wǎng)地址或公網(wǎng)地址賬號(hào)密碼改成生產(chǎn)環(huán)境的強(qiáng)密碼。把war包上傳到Tomcat的webapps目錄啟動(dòng)Tomcat。查看Tomcat日志catalina.out確認(rèn)啟動(dòng)成功再通過(guò)瀏覽器訪問(wèn)http://服務(wù)器IP:8080/項(xiàng)目名/。如果訪問(wèn)時(shí)報(bào)404先檢查T(mén)omcat啟動(dòng)日志里有沒(méi)有“Deployment of web application archive ... has finished”字樣如果報(bào)數(shù)據(jù)庫(kù)連接錯(cuò)誤優(yōu)先查防火墻是否放通了3306端口以及MySQL是否允許遠(yuǎn)程連接user表里host是否是%。這些點(diǎn)排查完部署問(wèn)題就解決了大半。7.3 交付時(shí)怎么展示這個(gè)項(xiàng)目最加分最后說(shuō)點(diǎn)實(shí)在的交付或者答辯時(shí)代碼量不是重點(diǎn)功能鏈路完整才是重點(diǎn)。站位從“我寫(xiě)了多少個(gè)頁(yè)面”轉(zhuǎn)變成“我把一條數(shù)據(jù)從用戶點(diǎn)擊到數(shù)據(jù)庫(kù)落庫(kù)走通了”。演示時(shí)建議按這條主線走前臺(tái)注冊(cè)用戶 → 登錄 → 搜索一本書(shū) → 借閱成功 → 庫(kù)存減一 → 切到管理員賬號(hào) → 后臺(tái)看到這條借閱記錄 → 歸還該書(shū) → 前臺(tái)用戶看到已歸還狀態(tài)。這一條鏈路里任何一個(gè)環(huán)節(jié)能講出數(shù)據(jù)流轉(zhuǎn)的原理比如庫(kù)存是在哪個(gè)事務(wù)里減的、Session里存了什么、攔截器攔了誰(shuí)比你在臺(tái)上背一百句“基于SSM實(shí)現(xiàn)了什么功能”都管用。再補(bǔ)充一個(gè)展示技巧把數(shù)據(jù)庫(kù)客戶端分屏放在旁邊。當(dāng)你在前臺(tái)頁(yè)面點(diǎn)下“借閱”按鈕時(shí)現(xiàn)場(chǎng)指著數(shù)據(jù)表里新增的那條記錄說(shuō)“看庫(kù)里的stock從3變成2了”這種直觀的演示比任何PPT截圖都有說(shuō)服力。我在實(shí)際帶這個(gè)項(xiàng)目時(shí)最深的體會(huì)是圖書(shū)管理系統(tǒng)這種老生常談的題目難度從來(lái)不在于它看起來(lái)有多簡(jiǎn)單而在于你能不能把那些“大家都這么寫(xiě)但都不說(shuō)為什么”的細(xì)節(jié)處理好——為什么要邏輯刪除、為什么借閱表要冗余字段、為什么減庫(kù)存和插記錄必須放進(jìn)同一個(gè)事務(wù)。這些細(xì)節(jié)才是讓老師相信你真的掌握了SSM和MySQL而不是背了份代碼的關(guān)鍵。最后分享一個(gè)我在收尾階段經(jīng)常會(huì)做的小檢查把項(xiàng)目從IDEA里原封不動(dòng)部署到一臺(tái)干凈服務(wù)器上如果中間不依賴任何本地的緩存和配置就能跑通那這個(gè)項(xiàng)目才算真正交付完成。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲情色第一页| 亚洲色图日韩精品| 久久9久9久99久9久9| 国产精品一区av在线| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 囯产精品久久久久久久久久梁医生 | 欧美高清16| 私色综合网| 日本成人在线不卡一区二区三区| 日韩熟女视频二区| 欧美老妇女内射网址| 久久久亚洲欧美综合| 97久久超碰日韩精品| 激情图片亚洲色图| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美黄色手机在线观看| 欧美成人精品一区二区男人蜜臀| 99丝袜福利在线播放| 伊人热综合| 美女丝袜激情小说| 天美传媒Av在线| 最新国产精品久久精品| 天天视频黄| 快播久久人人aV| 色一射色一射| 伊人久久88国产女| 黄色小视频日本txt| 久久精品人人做人人看| 天天操天天干美女网址导航| 久9久9久9久9久9久9| 五月天婷婷欧美三区| 亚洲第一无码播放立川理惠| 亚洲精品一区二区精华| 国产免费内射视频| 少妇熟女一区二区三区| 久久这里只精品| 久久视频,这里只有精品| 亚洲色图加勒比| 色色五月婷| 国语av最新自产拍在线观看| 熟女六十路| 久久国产逼| 色区97| 亚洲日韩熟女人妻高清在线| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 蜜桃传媒视频第一区入口在线看| 大香蕉亚洲中文| 99色天堂| 国产精品视频一区二区三区八戒| 另类天堂| 日韩天天本| 日本精品免费一区二区三区四区| 久久综合乱子伦国产免费| 999在线电影香蕉| 欧美v亚洲v日韩v最新在线二区| 粉嫩在线一区二区懂色| 黄片aaaaa一区| 日熟女| 欧美AB在线| 九九久久国产精品怡红院| 亚洲蜜臀视频精品久久| 91精品免费| 九九人妻| 国产熟码AV| 91影视亚洲| 情色五月天久久久| 激情四射五月天| 亚洲网污污污污| 日本淫穴在线| 亚洲人妻久久久| 桑老女人九区| 91免费看一区二区三区 | 欧美碰碰综合色| 国产精品久久| 涩综合导航| 亚洲欧洲自拍图片专区满春格| 91欧美大片| 国产sv美女内射| 亚洲一区在线观看欧洲| 女人被添高潮免费视频| 人妻啊啊人妻啊| 九九色色| 天天肏美女| 天堂蜜桃无码视频一区二区| 青久操| 欧美色日本| 超碰在97| 日韩猛交| 呦呦一区| 亚洲欧美在线观看2021| 亚洲啪啪性视频| 天美精品av| 欧美性天天影院| 欧美成人精品一区二区男人蜜臀| 日韩成人高清一区二区| 日本在线视频导航| 天天天天天天天天综合| 粉嫩av一区二区三区天美传媒| 色欲天天综合久久久无码网中文| 大伊香蕉在线视频免费| 青青草五月天| 国产 日韩 欧美一区| 狼狼色丁香久久婷婷综合五月| 自拍鲍鱼一区在线高清观看免费| 97久久超碰国产网站| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 九九热精品| 呻吟 欧美 日本 中出| 婷婷爽人人婷婷爽视频| 国产乱码精品一区二区三区四川| 欧美色棕合| 9999九九九久久久| 国产v片在线免费观看| 在线观看黄色电话| 亚洲国内精品成人不卡| 久久免费少妇| 嗯啊不要啊在线| 国产热av| 免费操逼91| 日本高清_区二区三区 | 97摸视频| 国产无遮挡| 97久久国产精品| 少妇干B| 午夜天天碰综合视频| 亚欧美综合| 国产成人亚洲精品无码最新在线| 精品国产一区二区三区av在线资源| 97爱b| 亚州欧美另类| 国产精品一二三在线看| 男人的天堂无码| 亚洲精品一区二区精品| 青青草色AV| 另类小色呦| 伊人色综合欧美| 26UUU欧美激情一区二区| 96AV久久久| 97这里只有精品| 狠狠色综合网| 久久久久久电影| 亚洲精品97中文字幕| 国产亚洲精品精AV.| 成人在线视频二区| 国产av强奸美女| 蜜臀一二三区| 久综合网| 欧美图片色五月天| wwwss在线观看| 国产一区二区在线播放| 91精品国久久久久久无码| 欧美视频一| 91xingse| 91久久九九精品国产综合| 久久香蕉综合一本到3atv| 伦理日韩国产久久| 99无码视频| 无套后入双马尾| 久久av色| 亚洲h片在线免费观看| 东北女人被操| 国产aⅴ无码片毛片一级网站| 国产精品另类一区大香蕉| 日本精品一区二区中文字幕| 欧美性夜| 日本精品性生活久久久| 婷婷色综合| 国产97免费视频| 久久111| 日韩操逼HD| 日本免费一区二区不卡 | 美日韩一卡二卡三卡免费人妻精品| 91精品久久久久| 亚洲成人碰碰| 黄片免费久久久久久久| 午夜福利 成人 91| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 熟妇xxxxx性春色| 91在线色| 婷婷AV一区二区三区| 中文字幕免费在线观看| 嗯~啊~快点 死我视频| 久草尤物| 久久↗↗| 91亚州日韩高清| 国产亚洲日韩欧| 97国产伦理| 亚洲欧洲小说图片视频 | 91狠狠综合久久久| 欧美爱爱97| 精品一二三区女同| 天天综合网久久ww| 91久久精品蜜臀| 黑人免费福利视频| 激情小说亚洲色图| 老鸭窝成人| 中文有码第五页| 久久xxxx| 肏逼福利网站| 综合亚洲网| 91麻豆天美传媒HD| 2019亚洲男人天堂| 超碰人妻中文在线| 国产馆极品诱惑| 尤物一级在线免费观看| 国产黄色在线播放观看| 黄色免费网| 精品人妻少妇| 91精品国产91久久久久久久久久久久| 日韩精品三级片长长久久| 啊啊啊操一区| 性一交一乱一交A片久久四色| 性久久| 国产精品一区二区三区四区五区| 久久久久9999妇女| 动漫区日韩区欧美区| 96爱综合| 鸥美插入视频| 操学生天天| 欧美日韩m| 亚洲人妻一区二区三区| 欧美色婷婷| 日韩一级成人毛片免费观看| 嫩草影院在线观看精品| 377p欧洲日本亚洲大胆| 国产黄色在线播放观看| 家庭乱伦国产| 一级日本牲交大片好爽在线看| 97色网| 亚洲激情欧美色图| 智利AV在线网| 欧美人妻熟女在线| 久久啊啊| 欧美在线天堂| 国产后入式在线观看| 欧在线一二区| 91一区二区三区蜜桃| 私人尤物在线精品不卡| 欧美色图片| 久久精品一区二区一8| 婷婷中文字幕| 久操B网| 亚洲一卡2卡3卡4卡乱码网站 | 黄色一区二区秘书性感| 国产日韩欧美亚洲精品95 | 超碰97起碰| 97久久精品亚洲| 九九九九九九九精品视频| 一本一道vs波多野结衣| 国产 热久久久久国产精品| 乱伦图一区| 丝袜熟女一区二区三区| 人人摸人人干人人拍97| 中文字幕 一区二区 亚洲无码| 色噜噜人妻av 中文字幕| 夜夜一区二区| 欧美激情色婷婷花野真衣一区二区| 欧美91精彩| 9999久久久久| 99re视频这里只有精品| 97爱爱爱| 亚洲春色欧美激情自拍| 国产福利影视| 成人aⅴ一区二区三区| 久热超碰| 国产av高清版| 少妇第一页| 亚洲成a人v欧美综合天堂下载| 亚洲一曲日韩精品| 无码免费一区二区三区啪啪| 四虎在线免费视频| av网站免费线看| 偷拍自拍在线视频观看| 夜夜操天| 好吊色一区| 九九九久久久久| 变态另类专区| 26uuu欧美日韩| 天天色悠悠激情| 乱子伦一区二区三区国产精品| 东京热毛片调教| 日本操逼aaaaa| 天天干天天爽| 亚洲天天影视综合网| 老司机香蕉久久久久| 乱伦3P视频| 国产高清不卡视频| 日日夜夜摸| 色综合久久888| 日韩天天本| 精品一级毛片在线观看| 亚洲激情综合| 人妻精品一区二区三区| 4399成人黄A片| 中文字幕综合人妻| caoni国产亚洲av| 久草精品热视| 九九九九精品九九九九| 亚洲欧洲另类| 97超碰香蕉| 久久人妻办公室视频| 职场同事知名国产国产精品久久欧美日韩| 超碰精品日韩欧美国产| 色综合加勒比四四季| 97精品一区二区三区免费| 黑人精品成人一区二区三区 | 熟女网站最新| 影音先锋日本一区二区| 亚州再线| 久操免费在线| 99精品网| 亚洲综合伊人无码久久| 99热这里只有精品地址| 在线洲亚线| 中字乱伦AV| 午夜亚洲国产理论秋霞| 亚洲无码超碰免费| 97 国产精品| 加勒比久久av| 在线v中文字幕一区二区三区| 嗯嗯嗯啊啊啊在线免费观看| 欧美色图20P| 这里只有精品视频在线| 免费男人的天堂| 97操| 天天综合中文字幕 91| 26uuu最新| 久久9久9久99久9久9| 婷婷五月天激情四射| 亚洲熟妇自偷自拍另欧美| 九草九九九| 天天拍天天操| 久久久久久久强迫| 青青草成人视频在线观看二区| 在线无码视频| 国产精品扒开腿做爽爽爽视频| 91狠| 免费A片三p视频| 日韩国产乱子伦App| 大香蕉综合在线| 亚洲欧综合另类无码一区| 亚洲综合贴图91| 日韩乱伦视频| 国产高清自拍| 伊人991| 一区二区三区探花在线观看| h色99999| 操逼网免费无码视频| 96一区二区三区| 国产av高清版| 国产99精品一区二区三区免费| 亚洲男人的天堂在线看| 97操操| 亚洲情欲| 国产视频三区四区| 97人人操人人摸人人爱| 亚洲欧美黄| 日韩精品三级片长长久久| 亚洲成人精品久久久| 韩国手机不卡无码三级视频| 日韩精品大香蕉伊人在线| 日产狠狠干| 日韩黄色片子| 人妻欧美| 免费人人搞97| 一区操逼日比视频| 精品无码欧美三级| 天天综合91在线| 做爱A级亚欧| 亚洲男人天堂av| 超碰在线97国产| 日韩情色视频| 亚洲丝袜色| 色婷婷视频| 国产精品熟女一区二区三区| 97欧美综合网| 九九热九九热| 插日本熟女视频| 青春草莓视频在线观看网址| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 亚洲欧美电影| 日韩91网站| 亚洲精品黑丝| 久久亚洲色图中文字幕| 婷婷综合在线观看| 麻豆AV一区二区| 久久香蕉国产传媒一区剧情天美| 亚欧高清v| 天天操天天干一区二区| 亚洲欧美日韩免费电影| 夜夜操美女| 欧美翘臀视频网站一区二区三区| 久久亚码| 一区二区三区蜜桃成人撸久久东京热 | 亚州熟妇精品| 日本中文字幕一区| 欧洲亚洲人人爽爽视频| 日韩欧美偷拍美女视频| 97资源免费视频| 亚洲色香| 国产高清不卡视频| 中文字幕日韩人妻视频一区二区三区交换夫妻| 91精品电影18| 亚洲综合另类欧美久久久| 国产丝袜视频| 91在线色综合| 亚洲成人碰碰| 久草婷婷| 91视频成人福利网站在线一区 | 三级网站超变态精品| 97精彩视频网站| 一本道综合色图| 欧美黑人XXXⅩ高潮交| 国产激情视频在线观看| 六月色婷婷| 五月综合色| 长长久久88视频| 五月天婷婷激情| 亚州伊人色综台| 天天摸天天插天天日| 少妇500双飞99| 青青草国产亚洲精品久久| 97色97干| 午夜一区| 色综合天天爱去电影网| 超碰97久久| 人人做,人人操,人人摸| 欧美顶级黄色大片免费| 国产版a级片直播在线| 亚洲丝袜色| 91人妻视频在线| 亚洲美女 晚间男人天堂 | 熟妇熟女视频一区二区三区| 岛国片在线观看视频亚洲| 欧美日韩m| 91性生活久久久| 青青草无码视频| 人妻熟女一区二区三区在线| 91痴汉| 九九碰九九爱97超| 第四色奇米影视777| 欧美成人黄网色网站| 五月婷婷久久综合| AV天堂男人的天堂| 狠狠色五月亚洲91| 精品视频免费在线一区| 男人天堂一区二区| 97操在线| 97日韩欧美亚洲| 午夜小电影在线插入淫高潮 | 天天综合色电影| 神马久久久久久久久久| 欧美亚洲首页| 天天看天天在线精品| 丁香六月婷婷久久综合| 999 久久久| 香蕉99秘 一区精品蜜桃臀| 看免费的黄片| 欧洲中文字幕| 欧美熟妇精品黑人巨大91| 欧美十八禁视频| 精品亚洲黄色片 国产精品导航一区二区| 蜜桃视频精品一区二区| 免费99精品国产自在在线| 屁股久久久久久| 国产av美女被艹的乱叫| 91性高| 美女黄站| 国产一区自拍欧美日韩| 三级片大波波| 天天干人人乐| 国内精品久久久久影院亚洲| 婷婷五月天无码| 99久国产精品午夜性色福利| 香一区二区三区| 中日韩久久久免费看| 成 人片 黄色大片| 精品性爱久久视频| 人妻一区二区三区视频 | 大香蕉中文网| 国产三级在线现体验区| 欧美色日| www.亚洲黄色| 夫妻四区五区六区| 久久亚州精品成人Av无| 免费视频在线观看啊啊啊啊啊| 超碰偷拍| 超碰夫妻97| 中文字幕三四区| 99热这里只有精品99| 国产精品伦理| 五月激情小说| 国产黑白丝在线| 中国亚洲呦女专区| 亚洲欧美综合网| 亚洲精品亚洲人成人网| 日韩射精| 91人妻超碰| 97精品免费| 91色情黑丝搞鸡在线观看一区二区三区三州 | 97精品国产97久久久| 日韩淫色网| 99精品无码| 熟妇视频一区二区三区在线| 99啪| 黄色免费一级在线毛片| 中文字暮97| 好色综合| 性感女人网页在线观看视频| 搡老女人老91二区| 久草色悠悠在线视频| 欧美探花网| 97av,com| 午夜一区| 性91| 欧美精品第3页| 亚洲不雅视频1区二区| 国产精品老师| 少妇久久久| WWW.加勒比人妻一区不卡.com| 日韩成人在线性爱视频| WWW美腿丝袜香蕉中文| 91超级碰碰| 国产精品女aA片爽爽视频| 久久久久久久久久久久久久久乱码| 老熟女乱伦一区| 91操人| 中文字幕精品区先锋资源| 狠插 制服 自拍| 日本视频一区二区三区| 欧美热图99| 干B视频伊人网| 无码精品久久久天天影视 | 中文字幕一区二区三区50路| 无码视频一区二区| 国产成人自拍视频在线| 深夜福利黄片| 人妻少妇久久| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 久久久久久久亚洲Av无码| 玖玖大干人妻| 97天天综合网| 九九在线精品| 亚洲第一精品在线视频| 思思热国产高清| 啊啊啊好疼| 日本97久久久精品| 久久乐| 伊人精品久久网站| 超碰九7| 九九九九日本| 欧美激情久久久久| 久久久久久久久久久人妻| 玖玖爱免费观看视频| 蜜臀久久99精品久久久| 夜夜嗨一区| 亚洲综合射| 亚洲乱色视频一区、二区在线| 久久精品性| 中文字幕乱码人妻二区三区| 久久精品国产Aⅴ| 久久久久国色αv免费观看| 欧美日韩人妻婷婷一区| 熟女一区二区三区| 国产91精品久久久久久久网曝门| 无码免费一区二区三区啪啪| 美日韩成人| 久久久夜夜嗨免费视频| 欧美综合娱乐久久| 中国AV美女| 热热色青青草| 精品无人区麻豆乱码1区2区图片| www.AV有限公司一区| 欧洲中文字幕| 午夜呻吟欧美| 很黄很污的免费网站| 白嫩嫩一区| 91美女丝袜诱惑视频| 丁香六月啪| 色久桃花影院在线观看| 操迟操逼在巾线Fre看| 中国操逼无码| 外国91| 久久久久久久久9| 夜夜 中文视频rt| 久久精品老司| 97超碰热线| 欧美天天谢综合网| 性生活久久久久久久久久| 久久久久日本视| 天天日天天插| 久久麻豆一区二区| 无码人妻一区二区一牛影视| 99热精品青草在线| 美女大乳久久久久久久女人18| 黑人天8A∨高清网站| 午夜福利久久久噜久噜久久综合 | 97在线免费看视频| 国产极品馒头逼| 天天草天天日| 中文字幕91页| 国产Av超碰| 51一区二区三区| 97精品在线| 无卡一区=区| 清纯唯美综合| 在线有码中文字幕| 人人爱人人操人人性| 久久综合亚洲色1080p| 欧美成人午夜免费福利785| 婷婷伊人| 欧亚综合一卡二卡中文字幕| 欧美精品91| 色欲色香天天天综合网www-亚洲综合国| 天堂伊人久久| 日日97| 欲色综合| 日韩人妻精品| 亚州性9| 美女好片色日本| 91天天看| 九月激情婷婷| 岛国黄色大片网站| 日韩女优在线| 本道在线| 亚洲天堂2020| 精品99999| 久久久久久久强迫| 国产福利影视| 欧美性战999| 国产日韩美女小穴视频网站不卡| 国产91福利小视频在线观看| 色在线亚洲视频www| 五月丁香久久| 美女丝袜激情小说| 精品无码一区二区三区| 久热大香蕉| 综合视频91| 亚洲av青草久久一区二区| 欧美性爱www免费版| 五月天激情国产综合婷婷婷| 在线五区| 草草电影院| 欧美日韩性爱视屏免费看了| 97干天天| 五月天人妻综合| 蜜臀久久99精品久久久电影| 99ri视频| 亚洲限制级| 欧美超碰97| 国产精品毛片?v一区二区三区| 婷婷97| 久久国语| 精品人妻一区二区免费看| 东京热男人的天堂精品| 欧美色图片91| 欧美天天弄| 色婷五月| AV色五月天| 成人怡红院| 99久久久| 97伦乱| 在线观看不卡一区二区三区| 久久精彩视频| 麻豆亚洲AV成人无码久久精品| 欧美人人AAA| 久久e6只有精品| 91久久青青草原精品| 久久人妻视频网| AV女优男人的天堂| 亚洲精品 大香蕉| 欧美性夜| 欧美日韩第一页| 亚洲精品人伦一区二区| 亚洲三区视频| 大香蕉一人在线| 黄片免费视频2019| 美女主播色欲91抠b在线播放| 亚洲无码 国产无码| 99re6国产精品99re在线| 国产9区| 尹人大香蕉视频在线| 91色堂| 操高情无码| 土豪酒店各种姿势玩弄极品幼稚| 国产成人 综合亚洲 天堂| 国产精品午夜成人福利| 国内毛片欧美香蕉精品| 超碰97网址| 国产精品人人爽人人做可爱福利| a人欧美综合天堂麻豆| 午夜福利av电影在线| 97干综合网| 无码视频黄色网战| 欧综合网| 99亚亚热| 深夜国产福利| 人人澡人人爽人人精品| 国产一级特黄大片处女| 欧美性少妇| 97超碰美国| 夜夜嗨视频| 人人喜人人妻| 曰韩操B| 欧美午夜色妇色鬼| 日韩性爱视频在线免费观看| 北京美女一区二区| 无遮挡h肉动漫在线观看| 欧美+日产+中文| 大香蕉国产中文自拍| 久久精品亚洲成a人天堂| 亚州性色| 9 7超碰在线免费观看| 99久久婷婷丁香| 久久久啊啊啊| 色欲人妻一区二区在线| 国产黄色av大片网站| 亚洲欧美另类图片| 欧美日韩精品久久| 九九热免费视频| 久久78| 亚洲 欧美 另类 日韩 人妻一区| 国产精品爱欲| 人妻久久| 亚洲情色电影网| xxxx网站亚洲精品| 猛猛干| 97天天做| 国产精品探花色| 男生通女生屁股| 国产原创精品| 日本理论在线| 蜜臀久久99精品久久久| 久久精品一区二区三区蜜桃臀| 久久久一级| 曰本人妻人人澡人人夹| 丝袜 中出 制服 人妻 美腿 中文字幕| 国产精品 午夜福利| 777奇米影视777四色| 影音先锋每日最新资源在线观看| 色九久| 日韩美女久久一区二区三区| 手机在线视频国内精品| 一区二区三区免费视频入口| 99日免费视频中文字幕| 丝袜综合| 九九九九九九九精品视频| 日韩在线一区高清在线| 国产1024在线播放| 91精品人妻一区二区三区蜜桃| 中文字幕一区二区三区蜜桃视频| 天天综合香 ld视频| 99青草| 亚洲砖码砖专无区2023| 100啪啪视频大全| 欧美裸体美女日麻屄| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 九九九九免费视频| 一区二区 电影 亚洲| 九九九久千久久激情蜜桃在线看| 欧美午夜视频精品久久| 人妻少妇被猛烈进入中| 91搡老女人老妇女老熟女歌词翻译| 超碰在线日韩一区| 一二三区视频在线观看| 老熟妇一区二区三区…| 国产精品高清2021在线| 免费中文综合精品| 在线αⅴ| 日本孕妇一区二区视频操逼免费看| 国产精品久久泡妞网站| 久久日本熟女精品一区| 亚洲自拍一区夜夜操| 操美女人妻| 欧美精品第四五页中文字幕在线观看| 大香蕉伊人网WWWn0n| 久久人妻四季| 91网亚洲| 99爱久久视频频| 伊人成人中文字幕久久网| 丁香五月偷拍| 久热色情精品| 欧美 传媒 麻豆 日韩 偷拍| 禁十八久久| 伦在线97| 无码人妻系列少妇| 天天日骚逼熟女| 欧美日韩一二三| JuliaAnn丝袜熟女系列| 蜜臀久久99精品久久久久久无删减 | 青娱乐999| 国产精品 久久久精品一牛| 欧美91精品国产自产| 自拍偷拍草一草| 欧美丝袜制服久久| 伊人久久婷婷| 蜜乳AV一区| 人人妻人人澡人人爽久久av| 一区二区三区精品黑丝白丝酒店对鸡 | 俄罗斯一区二区视频在线观看| 欧美片第一页| 亚洲日本激情| 国产99 中文字幕日韩小视频| 激情五月天丁香| 日韩丝袜人妻AV| 天天激色| 果冻传媒一区二区三区| 日天天九九天堂666| 精品福利| 少妇久久久久| 一级性爱视频免费观看 | 黄色大片一区二区密桃丝袜| 蜜臀久久在线视频| 少妇高潮九九九九九九九| 欧州91高潮| 丝袜美腿制服人妻二区中文字幕 | 亚洲第一黄色av网站| 水野优香在线观看| 狠狠干妹子| 人妻啪| 日本 欧美 亚中文字幕| 97伪v| juliaann欧美丝袜办公室| av爱爱爱| 五月婷婷六月丁香| 亚洲男人综合网| 亚洲无码视频免费在线观看网址!| 中文字幕成人理论在线| 欧洲精品一区二区三区| 大香蕉一级黄色片久久| 粉嫩不卡一区二区性爱| 亚洲瓯美色图| 欧美激情高清性猛交| 久久美女国产| 国产精品肉丝自拍| 天天综合91入口| 国产强奸乱伦xd| 九九久久九九久久| 日韩精品人妻中文字幕不卡乱码| 17c在线成人免费A片观看| 乱伦AVxx| 91亚州日韩高清| 日韩精品电影| 欧美不卡五十路| 人妻熟女字幕一区二区| 国产高清在线自在拍69| 久草视频观看视频在线| 国产久久一区二区三区野外在线| 大逼色网站| 97香蕉碰碰人妻国产欧美| 99r九九| 欧美淫乱视频| 大香蕉专区| 欧美日本天堂| 超碰免费人妻人人| 后X久久| 免费男人的天堂| 国产91av在线播放| 97超碰色屌| 日产欧美电影一区二区三区| 天天摸天天插天天日| 一级二级在线观看| 天堂av2019| 999综合网| 亚州少妇| 国产sv美女内射| 蜜桃av综合网发布| 搡老女人老91妇女熟女| 日本免费一级AAA大片器| 91欧美成人色站| 清纯唯美综合| 国产伦乱91| 天天干夜夜操一区二区| 国产成人无码网站在线视频| 久久人妻视频网| 一本色道久久综合精品婷婷| 精品国产乱码久久久久久久久1 | 久久 精品| 日本一区二区三区欧美日韩中文字幕| 日韩有码 一区二区三区| 久久久久久久78| 日韩av在线免费网站| 亚洲综合有码| 伊人成人情色综合| 欧洲一级性爱视频在线观看| 亚洲天堂加勒比| 欧美激情超碰777| 日本一区二区不卡精品| 欧美色图综合网| 狠狠夜色午夜久久综合在线| 在线性黄高清免费视频| 大香蕉一级黄色片久久| 少妇第一页| 免费一级视频特黄色大片| 久久AV无码AV| 欧美日韩国产人人| 91一区二区| 免费观看国产小粉嫩喷水精品午| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 男人天堂毛片| 亚洲男人的天堂一区二区| 一,爱啪啪,在线免费视频| 青娱乐啪啪视频| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 一区AV| 热热色色综合| 亚洲色堂免费视频| 欧洲一级性爱视频在线观看| 97精品免费| 亚洲日本天堂| 116美女午夜| 熟女人妻一区二区三区| 麻豆国产精品午夜视频| 91中文字幕在线观看| 69精品人人人人| 一本道综合色图| 强奸乱伦麻豆| 无码一区二区精品视频久久久春药 | wwwxxx日本爽| 不卡在线观看视频| AV色五月| 一区中文字幕二区日韩| 激情五月婷婷| 综合欧美日韩在线观看| 少妇一级婬片免费放一级a性色.| 黄页av| 97超碰精品成| 99爱久久视频频| 99热思思| 日韩精品黄片免费观看| 久久天天艹| TS人妖另类精品视频系列| 91性网| 97精品网站| 五月天伊人| 九九九九88| 亚洲情色电影网| 丁香五月色情| 精品婷婷| 日本一区二区三区四区免费观看| 51久久夜色精品国产麻豆| 91精品人| 婷婷激情四射| 激情文学亚洲| 国产熟女自拍| 亚洲激情欧美色图 | 欧美72网页| 欧洲乱码一区二区| 操我啊啊啊啊啊| 狼人综合婷婷激情四射 | 国产成年女人免费视频播放a| 东北少妇高潮zzzz| 2024黄色视频| 国产无码成人无码| 精品视频一区二区| 亚洲欧美人妻| 最新亚洲黄色免费电影| 日本欧美中文字幕| 又大又大又大又粗爽高潮观看 | 嗯嗯嗯,草死我| 欧美狠狠弄| 热久久国产精品视频大陆精品| 色婷婷婷五月天激情四射| 性性欧美| 日韩不卡码| 加勒比少妇AV婷婷六月天超碰超碰| 91少妇香蕉久久精品| 久久精品高清无码一区| 欧美性Fer办公室秘书| 久久婷婷一区| 啊啊啊啊啊啊啊啊视频| 国产午夜精品理论片a大结局| 91久久免费视频互動交流| 国产乱色国产精品免费视| 久久成人国产| 亚洲九区| 欧美性爱五月天| 大香蕉九九| 亚洲 欧美 中文 日韩超碰 | 20cm女自慰在线日韩欧美| 亚洲性爱电影| 色色色色网站| 亚洲美乱| 亚洲丝袜B诱惑| 久久久久网站-538在线视频-欧美永久乱码| 嗯,啊。舔我逼| 国产sv美女内射| 日本高清视频xxxx| 久久久久久AⅤ无码免费肉站 | 天天综合网在线91| 国产在线能看的你懂的| 亚洲 国产 精品一区| 人人天天欧洲| 亚洲精品人伦一区二区| 九九九九9999| 人人摸人人添人人操 | 好吊色在线观看| 精品人妻一区二区三区-国产精品| 韩日巨乳美女免费视频在线观看| 亚洲男人在线观看天堂| 又粗又长又爽在线观看| 蜜臀少妇一区二区| 人妻天天爽| 精品欧美老熟女一二区| A 天堂在线观看视频| 中文字幕视频2区| 青青草五月份天| 国产美女销魂在线观看不卡| 五月婷婷无码| 最新9久久久9免费视频| 国产免费黄色一级大片| 天天爽人人综合免费7799| 久久久久久久国产| 国产400孕妇孕交群| 天天色综亚洲91污| 97天天操天天干| 91狠狠综| 大色综合网| 天堂麻豆天美| 精品九区| 秋霞久久亚洲精品成人| 婷婷性爱| 久久久久9| 日韩一级久久毛片| 天天日日夜夜| 天天操熟妇| 久久69精品久久久久久久| 久久手机视直播| 91国产丝袜白虎| 国产精品爽爽v| 欧美日日夜夜| 色逼综合| 日本高清一区二区在线| yazhousetuoumei| 亚洲一二三四区| 婷婷五月天激情小说| 欧美肥臀在线| 久久‘黄片视频| 97精品97久久| 日本欧美一区二区三区免费| baiduhicn.com。| 乱伦一区二区三区‘| 久久精品72| 无码精品久久| 91网站18在线| 国产精品亚洲天堂网址| 久久久18禁| 日本欧美韩国国产在线| 成人热久久精品| 很黄很色的视频在线观看| 婷婷丁香一区二区三区| 午夜超爽| av麻豆啪啪| 性爱Av免费| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 国产精品69久久久久久久| 女人喷水视频在线观看| 99国产精品自在自在| 亚洲精品国产精品乱码不99| 人妻少妇精品无码专区二区密桃| 一区二区三区机械有限公司| 国产9l 大屁股| 爱爱动态120秒| 51国产午夜精品视频| 激情欧美日韩女同久久| 亚洲精品啪视频| 东京太热男人的天堂久久久| 懂色AV一区二区三区| 日韩免费中文字幕视频| 中文字幕久久精视频久久大全| 人人看人人爰人人操| 中文字幕第95页| 五月香婷婷| 亚洲无码超碰免费| 国产日韩欧美| 久久性视频| 天天草天天日| a片亚洲一本通视频| 大香蕉五月天婷婷| 天天干人人看综合| 亚州熟妇精品| 337p大胆噜噜噜噜噜91Av| 中文?日韩?免费?精品| 中文字幕女同在线| 国产亚洲国产超碰| 中文字幕一区二区视频在线观看 | 国产天美欧美| 亚洲免费成人在线高清无码视频 | 屌逼传媒| 亚洲欧洲成人在线电影| 91AV天美在线视频| 五月丁香网站| 人人做,人人操,人人摸| 久久久久婷婷精品av电影| 97神马久久| 久妇网| 中文字幕AV乱伦| 加勒比av网| 激情图片伦理国产一区二区日韩| 亚洲综合图色在线| 亚洲AV不卡在线观看尤物| 丁香六月东京热| 中文字幕丰满人妻日本| 91美女国产在线| 骚乳在线| 日韩黄片视频试看| 国内毛片四区| 国产成自自拍在线观看| 97人人模人人爽人人| 麻豆国产精品午夜视频| 精品一区二区2| 午夜精品久久久99| 99精品在线| 一区操逼日比视频| 久久精品国产亚洲AV先锋| 天天影视网色欲色香| 97网址www| 天天躁日日躁AAAXX| 日韩精品在线观看观看| 日本色日夜干| 好一吊区二区| 一牛一区二区三区久久| 大香蕉亚洲中文| 国产高清MV操逼视频| 国产精品一区二区手机看片| 综合欧美色图| 操老熟女AV| 黄呦呦在线| 中文字幕精品人妻丝袜| 涩涩五月天| 久久久成人国产精品无码| 强奸乱伦大香蕉| 亚洲人成网站7777| 91少妇人妻| 97在线观看视频| 中文日韩欧美熟| 人妻熟女一区二区三区在线| 日本青青草在线| 久久极品一区二区| 狠狠干婷婷| 91精品伊人久久久大香线蕉91| 亚洲激情综合另类男同| 涩综合导航| 超碰在线人妻中文字幕| 亚洲欧美日韩偷拍色图| 天天92av| 蜜桃传媒视频第一区入口在线看| 色爱欲亚洲| 夜夜操老骚逼视频网站| 日韩三级久久久| 性色一线| 99热91| 亚洲 国产 精品一区| 青草草免费网站av| 五十路六十路素人熟女| A片A5445444| 在线综合 亚洲 欧美中文字幕| www.亚洲成人一区| 伊人丁香五月婷婷| 亚洲欧美在线观看无码|