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

ARTICLE DETAIL

資訊詳情

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

SpringBoot+Thymeleaf+AdminLTE后臺CRUD實戰(zhàn)

SpringBoot+Thymeleaf+AdminLTE后臺CRUD實戰(zhàn) 做過后臺管理系統(tǒng)的人大概都遇到過一個岔路口一個只有十來個人用的內(nèi)部工具需求三天兩頭改前端要做的其實就是列表、表單、彈窗、刪除確認這幾件事這時候如果上來就搞前后端分離光是接口聯(lián)調(diào)、跨域、權(quán)限透傳、部署兩套產(chǎn)物就能耗掉大半工期。我前陣子接手的一個運維臺賬系統(tǒng)就是這么個場景十來個頁面二十多張表交付周期四周最后定下來的技術(shù)組合就是標題里這四樣SpringBoot 打底、MyBatis-Plus 干數(shù)據(jù)層、Thymeleaf 渲染頁面、AdminLTE 套殼。整套東西跑起來增刪改查這類活兒的開發(fā)節(jié)奏會非??煲粋€標準模塊從建表到頁面能點熟練的話兩三個小時就能出一版。這篇內(nèi)容想聊的就是這套組合在真實項目里的落地細節(jié)不是官方文檔的復(fù)述。適合的人大概有三類剛接觸 SpringBoot 想做點完整東西練手的手上有個內(nèi)部系統(tǒng)要快速交付、不想被前端工程化拖住的以及已經(jīng)會用這套棧但總在分頁、表單回顯、靜態(tài)資源這些地方反復(fù)卡殼的。我會把依賴版本的坑、MyBatis-Plus 分頁插件的正確姿勢、AdminLTE 接 Thymeleaf 的布局復(fù)用方式、還有增刪改查四個動作里那些文檔不會寫的細節(jié)一條一條攤開講。中間穿插的配置和代碼都是可以直接抄去改的遇到需要取舍的地方我會說清楚為什么這么選。1. 先想清楚這套四件套各自的邊界在哪1.1 服務(wù)端渲染在內(nèi)部系統(tǒng)里的性價比賬選型這件事最怕的是拿互聯(lián)網(wǎng) C 端的標準去套內(nèi)部管理系統(tǒng)。C 端產(chǎn)品用戶量大、交互復(fù)雜、首屏性能敏感前后端分離帶來的收益能覆蓋掉工程復(fù)雜度。但內(nèi)部臺賬、審批、配置管理這類系統(tǒng)頁面數(shù)量有限、交互模式高度重復(fù)、用戶就那幾十個首屏慢個三百毫秒沒人在意反而更在意這個字段能不能加一列這個查詢條件能不能多一個這種需求變更的速度。服務(wù)端渲染在這個場景下的優(yōu)勢很直接一個 Controller 方法配一個模板數(shù)據(jù)從數(shù)據(jù)庫到頁面是一條直線沒有中間層。改一個字段動的是實體類、Mapper 不用動、模板加一行、Controller 加一個取值五分鐘的事。換成前后端分離同樣的改動要動 DTO、接口、前端 model、前端表單、可能還有類型定義五個文件起步還得等前端同學排期。代價也要說清楚。Thymeleaf 的模板語法是在 HTML 屬性上做文章邏輯復(fù)雜了會很難看超過三層的條件嵌套基本就沒法維護了局部刷新能力弱想要個下拉聯(lián)動、表格無刷新編輯就得自己寫零散的 JSSEO 完全談不上不過內(nèi)部系統(tǒng)也不需要。我的判斷標準很簡單如果這個系統(tǒng)的主要使用者是公司內(nèi)部員工、頁面總數(shù)在五十個以內(nèi)、沒有復(fù)雜的前端狀態(tài)管理需求這套組合就是劃算的如果要做的是面向外部用戶的產(chǎn)品或者有大量實時交互那就老老實實上分離架構(gòu)。1.2 四個組件各管一段別讓職責串味實際寫代碼時最常見的混亂是把本該在 Service 層的邏輯塞進 Controller或者把查詢條件拼裝散落在模板里。這套棧里四樣東西的職責其實很清晰組件負責的事不該干的事SpringBoot容器、依賴注入、配置、事務(wù)邊界不寫業(yè)務(wù)規(guī)則MyBatis-Plus單表 CRUD、條件構(gòu)造、分頁、邏輯刪除不處理展示格式、不做權(quán)限判斷Thymeleaf數(shù)據(jù)渲染、條件展示、循環(huán)、格式化不拼查詢條件、不做業(yè)務(wù)計算AdminLTE頁面骨架、樣式、常用交互組件不承載業(yè)務(wù)邏輯一個典型的分層寫法是Controller 只做參數(shù)接收、調(diào)用 Service、往 Model 里塞數(shù)據(jù)、返回視圖名Service 管事務(wù)和業(yè)務(wù)規(guī)則比如用戶名不能重復(fù)刪除前要檢查有沒有關(guān)聯(lián)數(shù)據(jù)Mapper 只管數(shù)據(jù)訪問。Thymeleaf 模板里只做展示判斷比如狀態(tài)字段是 0 還是 1 決定顯示什么顏色的標簽。這個邊界守住了后面加需求才不會牽一發(fā)動全身。1.3 什么時候該果斷放棄這套方案我不太喜歡某某技術(shù)已死這種論調(diào)但確實有幾類需求不適合硬套。一是需要大量圖表實時刷新的看板Thymeleaf 渲染完就定死了后續(xù)全靠手寫 JS 輪詢不如直接上圖表庫配接口二是移動端適配要求高的場景AdminLTE 是桌面優(yōu)先的布局雖然響應(yīng)式做了但在手機上體驗一般三是需要多人協(xié)同編輯同一份數(shù)據(jù)的場景服務(wù)端渲染那套表單提交模型處理不了沖突合并。碰到這三類趁早換方案別等到寫了一半再返工。2. 骨架搭建依賴順序和版本對齊比想象中重要2.1 pom 里的依賴清單版本別隨手寫新建工程的時候最容易出事的就是版本。SpringBoot 版本、MyBatis-Plus 版本、Thymeleaf 版本三者之間有隱性約束尤其是 MyBatis-Plus它跟 SpringBoot 的適配是按大版本對應(yīng)的3.5.x 系列對 SpringBoot 2.x 和 3.x 的支持情況不一樣。我的做法是先用 Spring Initializr 生成一個干凈的骨架選定 SpringBoot 版本然后把 MyBatis-Plus 的版本號顯式寫上不依賴父 POM 的默認管理。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.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.5/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies這里有兩個細節(jié)值得單獨拎出來。第一spring-boot-starter-validation必須單獨引入SpringBoot 2.3 之后校驗相關(guān)的包已經(jīng)從 web starter 里剝離了不引這個Valid注解會靜默失效——注意是靜默不報錯表單提交什么校驗都不觸發(fā)很容易查半天。第二MySQL 驅(qū)動在較新的 SpringBoot 里坐標改成了com.mysql:mysql-connector-j老項目里常見的mysql:mysql-connector-java雖然還能用但會有告警新項目直接寫新的。如果你用的是 SpringBoot 3.xMyBatis-Plus 的 starter 也要換成mybatis-plus-spring-boot3-starter這個坐標差異在官方文檔里不算顯眼但包名不一樣直接復(fù)制 2.x 的配置會啟動失敗報找不到自動配置類。2.2 application.yml 里必須動的那幾項配置文件這塊默認值大多能用但有四項我每次都會改server: port: 8080 servlet: encoding: charset: UTF-8 force: true spring: thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html mode: HTML datasource: url: jdbc:mysql://127.0.0.1:3306/demo_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: demo password: demo123 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 mapper-locations: classpath*:/mapper/**/*.xmlthymeleaf.cache在開發(fā)期一定要關(guān)掉這個后面還會展開講它是最容易讓人懷疑人生的一個配置。map-underscore-to-camel-case默認是 true但顯式寫出來能避免接手別人項目時的困惑。log-impl打開 SQL 打印調(diào)試期非常有用上線前記得關(guān)掉不然日志量會很嚇人。serverTimezone這個參數(shù)不能省省了在寫入LocalDateTime的時候可能差八小時而且是那種數(shù)據(jù)看著對、時間就是不對的詭異問題。數(shù)據(jù)源連接串里的allowPublicKeyRetrievaltrue是配合較新版本 MySQL 的認證插件用的不加的話在某些環(huán)境下會報公鑰檢索失敗。這個參數(shù)涉及安全邊界只在本地和內(nèi)網(wǎng)開發(fā)環(huán)境用生產(chǎn)環(huán)境按各自的數(shù)據(jù)庫規(guī)范走。3. MyBatis-Plus 數(shù)據(jù)層從實體映射到分頁查詢的完整鏈路3.1 實體類和表結(jié)構(gòu)的映射約定MyBatis-Plus 默認有一套約定類名轉(zhuǎn)下劃線對應(yīng)表名字段名轉(zhuǎn)下劃線對應(yīng)列名。遵守約定能省掉大量注解。我在項目里通常就三條規(guī)則表名統(tǒng)一加業(yè)務(wù)前綴比如sys_user、biz_order主鍵統(tǒng)一叫id且自增每張表都帶create_time、update_time、deleted三個公共字段。Data TableName(sys_user) public class SysUser { TableId(type IdType.AUTO) private Long id; private String username; private String realName; private String phone; private Integer status; TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; TableLogic private Integer deleted; }TableLogic這個注解是邏輯刪除的核心。加上它之后所有通過 MyBatis-Plus 生成的刪除語句都會自動變成UPDATE ... SET deleted 1查詢語句會自動追加deleted 0。這個機制的好處是業(yè)務(wù)代碼里完全感知不到刪除的實現(xiàn)方式壞處是有幾個場景會失效手寫 XML 里的 SQL 不會自動加條件需要自己補update語句也不會自動過濾已刪除數(shù)據(jù)還有就是唯一索引要重新設(shè)計——如果username建了唯一索引刪掉一個用戶之后想再建同名用戶就會沖突因為那條軟刪除的記錄還在表里。軟刪除的唯一索引問題常見的解法是把deleted字段設(shè)計成刪除時寫入主鍵 ID而不是固定寫 1這樣聯(lián)合唯一索引(username, deleted)就能保證只有一條未刪除記錄。不過這樣配置就復(fù)雜一些小項目里我一般直接放棄用戶名唯一索引改在 Service 層做查重判斷簡單夠用。自動填充需要配一個處理器Component public class MetaHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }注意strictUpdateFill只對TableField(fill FieldFill.INSERT_UPDATE)標注的字段生效如果實體類漏了這個注解填充不會執(zhí)行而且不會報錯。3.2 分頁插件必須先注冊否則分頁永遠返回全量這是我見過最多人踩的坑。MyBatis-Plus 從 3.4 開始分頁功能必須手動注冊攔截器不注冊的話Page對象傳進去也不報錯但total永遠是 0、records永遠是全表數(shù)據(jù)。很多人第一次遇到會以為是Page參數(shù)位置傳錯了查半天。Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); PaginationInnerInterceptor pagination new PaginationInnerInterceptor(DbType.MYSQL); pagination.setMaxLimit(500L); pagination.setOverflow(false); interceptor.addInnerInterceptor(pagination); return interceptor; } }setMaxLimit(500L)是個保護措施防止前端傳個size999999把數(shù)據(jù)庫拖死。setOverflow(false)的意思是頁碼超出范圍時返回空列表而不是回到第一頁這個選擇看業(yè)務(wù)習慣我傾向于 false因為回到第一頁會讓用戶以為自己點錯了。分頁查詢配合條件構(gòu)造器的典型寫法public IPageSysUser pageQuery(UserQuery query, long current, long size) { PageSysUser page new Page(current, size); LambdaQueryWrapperSysUser wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.hasText(query.getUsername()), SysUser::getUsername, query.getUsername()) .eq(query.getStatus() ! null, SysUser::getStatus, query.getStatus()) .ge(query.getBeginTime() ! null, SysUser::getCreateTime, query.getBeginTime()) .le(query.getEndTime() ! null, SysUser::getCreateTime, query.getEndTime()) .orderByDesc(SysUser::getId); return this.page(page, wrapper); }LambdaQueryWrapper比QueryWrapper好在字段名是方法引用改字段名的時候編譯器會報錯字符串寫法的QueryWrapper只能等到運行時才發(fā)現(xiàn)列名寫錯了。條件構(gòu)造器里每個方法都有個重載版本第一個參數(shù)是布爾值用來控制這個條件是否生效這個特性在寫動態(tài)查詢時極其好用能避免大量 if 判斷。3.3 多條件搜索的拼接邏輯應(yīng)該放在哪條件拼接的位置有兩派做法放 Controller 里用參數(shù)逐個判斷或者放 Service 里封裝成一個方法。我傾向后者Controller 就負責把請求參數(shù)打包成一個查詢對象傳下去。這樣做的另一個好處是查詢參數(shù)可以做成一個獨立的類字段上直接掛校驗注解和日期格式注解。Data public class UserQuery { private String username; private Integer status; DateTimeFormat(pattern yyyy-MM-dd) private LocalDate beginTime; DateTimeFormat(pattern yyyy-MM-dd) private LocalDate endTime; }DateTimeFormat這個注解是給表單綁定用的處理的是從頁面提交上來的字符串到日期對象的轉(zhuǎn)換。如果是 JSON 接口用的是JsonFormat兩個注解長得像但作用域完全不同混用會導致日期綁不上、拋 400 錯誤。這個區(qū)別我在帶新人的時候解釋過很多遍本質(zhì)上就是數(shù)據(jù)來源不同表單走的是 Spring 的ConversionServiceJSON 走的是 Jackson。4. AdminLTE 接 Thymeleaf靜態(tài)資源、布局復(fù)用和腳本順序4.1 靜態(tài)資源目錄怎么擺路徑怎么寫才不打架AdminLTE 是一套基于 Bootstrap 的后臺模板下載下來是個完整的前端工程里面有dist、plugins兩個主要目錄。放進 SpringBoot 項目的正確位置是src/main/resources/static/放進去之后通過/dist/css/adminlte.min.css這樣的路徑就能訪問。目錄結(jié)構(gòu)我一般是這么組織的resources/ static/ dist/ AdminLTE 的 css、js plugins/ 各種插件fontawesome、jquery、bootstrap uploads/ 用戶上傳的圖片運行時生成 templates/ layout/ 公共片段 user/ 業(yè)務(wù)頁面 login.html有個細節(jié)很容易被忽略SpringBoot 的靜態(tài)資源默認映射到/**如果模板里寫的是link th:href{/dist/css/adminlte.min.css}加了{}語法之后SpringBoot 會自動處理上下文路徑。如果你的應(yīng)用部署在非根路徑下比如server.servlet.context-path/admin不用{}寫死的相對路徑全部會 404。這個坑在本地開發(fā)時完全發(fā)現(xiàn)不了因為本地默認是根路徑。上傳目錄的問題要單獨說一下。static/uploads這個位置在打成 jar 包之后是只讀的往里寫文件會失敗。生產(chǎn)環(huán)境應(yīng)該把上傳路徑配成一個外部目錄通過WebMvcConfigurer加資源映射Configuration public class WebConfig implements WebMvcConfigurer { Value(${app.upload-path}) private String uploadPath; Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/uploads/**) .addResourceLocations(file: uploadPath); } }這樣頁面里引用/uploads/xxx.png就能拿到外部目錄里的文件開發(fā)和生產(chǎn)的路徑差異用配置文件隔離。4.2 用 fragment 做布局復(fù)用別引額外的方言包Thymeleaf 復(fù)用頁面的方式有好幾種官方推薦的thymeleaf-layout-dialect用起來確實優(yōu)雅但它多一個依賴語法也自成一套團隊里如果新人多學習成本不太劃算。我一般用原生的 fragment 組合來實現(xiàn)。先定義公共片段!-- templates/layout/common.html -- !DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head th:fragmenthead(title) meta charsetutf-8 title th:text${title}頁面標題/title link th:href{/plugins/fontawesome-free/css/all.min.css} relstylesheet link th:href{/dist/css/adminlte.min.css} relstylesheet /head body nav th:fragmentnavbar classmain-header navbar navbar-expand navbar-white navbar-light ul classnavbar-nav li classnav-item a classnav-link>!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head th:replace~{layout/common :: head(用戶管理)}/head body classhold-transition sidebar-mini layout-fixed div classwrapper nav th:replace~{layout/common :: navbar}/nav aside th:replace~{layout/common :: sidebar}/aside div classcontent-wrapper section classcontent-header div classcontainer-fluid h1用戶管理/h1 /div /section section classcontent div classcontainer-fluid !-- 業(yè)務(wù)內(nèi)容 -- /div /section /div footer th:replace~{layout/common :: footer}/footer /div /body /htmlth:replace和th:insert的區(qū)別要說一下replace是用片段整體替換掉當前標簽insert是把片段塞進當前標簽內(nèi)部。用replace的時候當前標簽本身會被丟掉所以寫法上要保證被替換的標簽類型跟片段的根標簽一致。側(cè)邊欄的菜單高亮靠當前路徑判斷a th:href{/user/list} classnav-link th:classappend${#httpServletRequest.requestURI.startsWith(/user)} ? active#httpServletRequest這個對象在 Thymeleaf 3 里默認是可用的不過在嚴格的安全配置下可能取不到取不到就退回用手動傳一個activeMenu變量的方式穩(wěn)一些。4.3 腳本加載順序不對頁面會靜默失靈AdminLTE 依賴 jQuery、Bootstrap、popper這幾個的順序不能亂。正確的寫法是 jQuery 在最前然后 bootstrap 的 bundle 版本自帶 popper最后才是 adminlte 的主腳本script th:src{/plugins/jquery/jquery.min.js}/script script th:src{/plugins/bootstrap/js/bootstrap.bundle.min.js}/script script th:src{/dist/js/adminlte.min.js}/script順序錯了的典型現(xiàn)象是折疊菜單點不開、下拉框點一下閃一下就關(guān)、彈窗出不來。控制臺可能只有一條$ is not defined或者干脆什么都沒有。我遇到過最隱蔽的一次是有人把 adminlte.min.js 放到了head里頁面骨架還沒渲染完腳本就執(zhí)行了界面看著正常但所有交互事件都沒綁上。所以腳本統(tǒng)一放/body前這是硬規(guī)矩。還有個版本匹配的坑AdminLTE 3 基于 Bootstrap 4AdminLTE 4 基于 Bootstrap 5。如果從網(wǎng)上復(fù)制了個 AdminLTE 3 的頁面模板又去引了 Bootstrap 5 的 CSS會出現(xiàn)間距全亂、圓角對不上、按鈕顏色偏色這類看著像但又不太像的問題。這種情況我的建議是一旦確定用哪個版本把整套靜態(tài)資源一次性拷全不要東拼西湊。5. 增刪改查四個動作真正花時間的都在細節(jié)里5.1 列表頁分頁、搜索條件回填與參數(shù)保持列表頁看著最簡單實際上坑最多。分頁組件要跟搜索條件共存翻到第二頁的時候搜索條件不能丟這個是最基本的要求。我的做法是 Controller 接收查詢對象和分頁參數(shù)把所有條件重新塞回 ModelGetMapping(/list) public String list(UserQuery query, RequestParam(defaultValue 1) long current, RequestParam(defaultValue 10) long size, Model model) { IPageSysUser page userService.pageQuery(query, current, size); model.addAttribute(page, page); model.addAttribute(query, query); return user/list; }模板里的分頁鏈接必須帶上搜索條件nav ul classpagination pagination-sm li classpage-item th:classappend${page.current 1} ? disabled a classpage-link th:href{/user/list(current${page.current - 1}, size${page.size}, username${query.username}, status${query.status})}上一頁/a /li li classpage-item th:eachi : ${#numbers.sequence(1, page.pages)} th:classappend${i page.current} ? active a classpage-link th:href{/user/list(current${i}, size${page.size}, username${query.username}, status${query.status})} th:text${i}1/a /li li classpage-item th:classappend${page.current page.pages} ? disabled a classpage-link th:href{/user/list(current${page.current 1}, size${page.size}, username${query.username}, status${query.status})}下一頁/a /li /ul /nav{...}語法里括號內(nèi)的參數(shù)會自動做 URL 編碼不用手動處理中文。這是 Thymeleaf 一個很實用的特性用字符串拼接的方式拼 URL 反而容易出問題。頁碼直接用#numbers.sequence全展開在數(shù)據(jù)量小的內(nèi)部系統(tǒng)里夠用。如果分頁超過二十頁這個寫法會把頁碼撐爆需要做滑動窗口那就得寫個小工具方法或者在 Controller 里算好beginPage和endPage傳給模板。內(nèi)部系統(tǒng)我一般不管頁面撐開了用戶自己會縮小范圍。搜索表單的回填也要注意th:value里如果原值是 null渲染出來是空字符串不會報錯但下拉框要注意選中狀態(tài)select namestatus classform-control option value全部狀態(tài)/option option value1 th:selected${query.status 1}啟用/option option value0 th:selected${query.status 0}停用/option /select這里有個類型陷阱query.status是Integer如果表單里value1Thymeleaf 在比較時做的是對象比較Integer(1) 1在 Thymeleaf 的表達式引擎里通常能自動拆箱成立但如果 status 是String類型就會失敗。我在項目里統(tǒng)一用Integer接狀態(tài)值避免這個歧義。5.2 新增和編輯表單復(fù)用、校驗失敗回顯與查重時機新增和編輯的頁面高度相似字段完全一樣區(qū)別只是有沒有初始值。復(fù)用同一個模板是標準做法用一個id是否為空來判斷GetMapping(/form) public String form(RequestParam(required false) Long id, Model model) { SysUser user id null ? new SysUser() : userService.getById(id); model.addAttribute(user, user); return user/form; }模板里所有th:value都綁到user對象的字段上新增時是空對象自然是空值。保存用兩個方法分別處理新增和修改不要試圖用一個方法通用因為校驗規(guī)則不一樣新增要查重修改要排除自己。校驗這塊PostMapping(/save) public String save(Valid ModelAttribute(user) SysUser user, BindingResult bindingResult, RedirectAttributes ra) { if (userService.existsUsername(user.getUsername(), user.getId())) { bindingResult.rejectValue(username, duplicate, 該登錄名已被占用); } if (bindingResult.hasErrors()) { return user/form; } userService.saveOrUpdate(user); ra.addFlashAttribute(msg, 保存成功); return redirect:/user/list; }ModelAttribute(user)里的名字很關(guān)鍵它決定了模板里用${user}能不能取到值。如果校驗失敗返回表單頁Model 里必須有這個對象ModelAttribute會自動把它塞進去。這一點如果漏了表現(xiàn)就是校驗失敗跳回表單頁結(jié)果所有已填內(nèi)容全空用戶得重新填一遍體驗極差。RedirectAttributes的addFlashAttribute是重定向后傳遞提示消息的標準做法數(shù)據(jù)存在 session 里跳轉(zhuǎn)后讀一次就沒了。如果用addAttribute參數(shù)會拼到 URL 上中文還得編碼很難看。表單模板里的錯誤提示div classform-group label登錄名 span classtext-danger*/span/label input typetext classform-control th:classappend${#fields.hasErrors(user.username)} ? is-invalid th:field*{username} div classinvalid-feedback th:if${#fields.hasErrors(user.username)} th:errors*{username}錯誤信息/div /divth:field*{username}會自動生成id、name、value三個屬性比手寫th:value更省事而且跟#fields的錯誤機制是配套的。用th:field的時候注意必須在form上掛th:object否則*{}語法找不到上下文。查重的時機也有講究。放在 Service 里做也行但那樣校驗失敗的信息拿不到BindingResult只能拋異?;蛘叻祷劐e誤碼頁面回顯就得另想辦法。放在 Controller 里配合bindingResult.rejectValue是這套棧下最順手的做法錯誤信息能直接出現(xiàn)在對應(yīng)字段下面。5.3 刪除單條、批量與邏輯刪除的取舍刪除功能最容易被輕視。一個GetMapping(/delete/{id})寫完就完事了看著能跑但這是典型的錯誤做法——GET 請求被瀏覽器預(yù)加載、被爬蟲抓取、被用戶誤刷新都能觸發(fā)刪除。刪必須用 POST。PostMapping(/delete) public String delete(RequestParam Long id, RedirectAttributes ra) { userService.removeById(id); ra.addFlashAttribute(msg, 刪除成功); return redirect:/user/list; } PostMapping(/batchDelete) public String batchDelete(RequestParam(ids) ListLong ids, RedirectAttributes ra) { userService.removeByIds(ids); ra.addFlashAttribute(msg, 已刪除 ids.size() 條); return redirect:/user/list; }前端確認用 AdminLTE 自帶的模態(tài)框或者confirm批量刪除要注意一個細節(jié)如果用戶一條都沒勾選就點刪除ids參數(shù)是空的Spring 綁定ListLong會直接拋 400。穩(wěn)妥的寫法是RequestParam(value ids, required false)進來先判空if (CollectionUtils.isEmpty(ids)) { ra.addFlashAttribute(msg, 請先選擇要刪除的記錄); return redirect:/user/list; }邏輯刪除的取舍前面提過一部分這里補充一個實際場景如果業(yè)務(wù)上需要回收站功能邏輯刪除是必須的如果數(shù)據(jù)完全不敏感物理刪除反而干凈因為軟刪除的記錄日積月累會讓表越來越大查詢還得帶條件。我的經(jīng)驗是涉及人員、訂單、財務(wù)這類數(shù)據(jù)的表用邏輯刪除配置項、日志這類表直接物理刪?;熘脹]問題加不加TableLogic是按實體類控制的。6. 聯(lián)調(diào)階段最容易卡住的幾個現(xiàn)象與排查順序6.1 模板改了頁面不變先看緩存開關(guān)這個現(xiàn)象我第一次遇到時懷疑過 IDE 沒保存、懷疑過瀏覽器緩存、懷疑過 SpringBoot 沒熱加載折騰了快一個小時最后發(fā)現(xiàn)就是spring.thymeleaf.cachetrue。開發(fā)環(huán)境必須設(shè)成 false這個配置默認值在 SpringBoot 里是 true。即使關(guān)了緩存如果你改了模板但沒重新編譯而項目又是從target/classes里讀模板的那還是看不到變化。IDEA 里的做法是 Build 一次或者用spring-boot-devtools配合自動編譯。我用 devtools 的時候會把spring.thymeleaf.prefix指向file:src/main/resources/templates/直接從源碼目錄讀改完刷新就生效省掉編譯這一步spring: thymeleaf: prefix: file:src/main/resources/templates/ cache: false這個配置只能用在開發(fā)環(huán)境生產(chǎn)環(huán)境必須走 classpath。另外一個容易混淆的點改了 Java 代碼之后模板的變動可能被編譯覆蓋。排查順序我一般是配置文件有沒有生效 → 模板路徑對不對 → 編譯產(chǎn)物是不是最新的從外往里查比一上來就打斷點快。6.2 日期和數(shù)字的格式化Thymeleaf 里要靠工具類LocalDateTime直接輸出到頁面會是2024-03-15T10:23:45中間帶個 T很難看。格式化的寫法td th:text${#temporals.format(user.createTime, yyyy-MM-dd HH:mm)}時間/td#temporals是 Thymeleaf 3 內(nèi)置的處理 Java 8 時間類型的工具需要thymeleaf-extras-java8time依賴不過 SpringBoot 的 starter 里已經(jīng)包含了不用單獨引。如果是Date類型用的是#dates.format兩個工具類不能混用混了會報找不到方法??罩堤幚硎橇硪粋€高頻問題。${user.realName}如果是 null頁面直接不渲染內(nèi)容不會報錯但#temporals.format(null, ...)會拋異常。穩(wěn)妥的寫法是td th:text${user.createTime ! null} ? ${#temporals.format(user.createTime, yyyy-MM-dd HH:mm)} : --/td金額類的字段用#numbers.formatDecimal(amount, 1, 2)保留兩位小數(shù)注意第一個參數(shù)是整數(shù)最少位數(shù)不是總位數(shù)這個參數(shù)含義經(jīng)常被搞反。6.3 靜態(tài)資源 404 與中文亂碼的分層排查靜態(tài)資源 404 的排查我有一套固定順序。先看 URL 對不對瀏覽器 F12 的網(wǎng)絡(luò)面板里能看到實際請求的路徑如果路徑里帶了../或者重復(fù)的/static/說明模板里的路徑寫錯了——{}語法不需要你手寫/static它對應(yīng)的就是static目錄的根。再看 Spring Security 有沒有攔截如果項目集成了安全框架靜態(tài)資源默認是要放行的配置里漏了requestMatchers(/dist/**, /plugins/**).permitAll()就會全 404。最后看打包方式j(luò)ar 包里的static目錄是通過 classpath 訪問的如果資源放的目錄名不是static比如放成了public或者resources那 SpringBoot 也能識別但目錄名拼錯就完了。中文亂碼分兩種。一種是請求參數(shù)亂碼表單提交的中文到后端變成問號這是編碼配置問題server.servlet.encoding.forcetrue加上頁面的charsetutf-8基本能解決。另一種是響應(yīng)內(nèi)容亂碼頁面上中文變成方塊或者亂碼通常是模板文件本身的編碼不對IDEA 里在文件右下角能看到當前編碼確認是 UTF-8 就行。還有一種最隱蔽的數(shù)據(jù)庫連接的characterEncoding寫成了utf8但表是utf8mb4存表情符號的時候報錯或者截斷這個只能從建表語句開始統(tǒng)一。6.4 表單提交后提示信息不顯示addFlashAttribute存進去的消息在頁面里要用${msg}取。取不到的情況一般是重定向的地址跟存放的會話不一致或者頁面模板里漏了判斷div classalert alert-success alert-dismissible th:if${msg ! null} button typebutton classclose>
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品精品精品| 日韩猛交| 野狼激情网| 青草草免费网站av| 男人的天堂在线2| A片A5445444| 黄色不卡视频| 男人的天堂2018东京热啪啪啪| 中出91视频| 国产成自自拍在线观看| 美欧老女人97| 精品无码人妻一区二区免费蜜桃| 亚洲第2页| 伊人骚琪琪亚洲天堂网站| 亚洲欧美另类少妇精品| 婷婷操逼| 日本熟妇人妻中出视频| 秋霞免费无码视频日韩A片| 夜夜操夜夜高潮夜夜爽国产精品区| 欧美夜夜狠| 亚洲欧洲日韩国产自在线| 九九九精品成人免费视频小说| 色哟哟av| 国产懂色精品国产av| 亚洲中文字幕在线视频一区二区| 中文字幕日韩精品一区二区三区| 欧美|91色综合| 色噜噜婷婷| 亚洲图片日本AⅤ欧美在线| 这里只有97精品| 330Dv国产女人终合视频极品人与兽| 五月婷婷六月色| 亚洲精品第一| 五月色网| 五月丁香综合激情| 久久超碰av在线| 男人的天堂三级| 综合色图区| 欧美日韩国产中文精品字幕自在自线| 亚洲国产成人精品999| 99精品九九九九九九| 亚洲欧洲无码一区夜| 九九九九九九九精品视频| 欧美精品999| 牛牛aV| 欧美亚洲第一页| 欧色网址| 日产操逼| 欧美黄色片在线播放| 男人天堂网址| a'v在线资源| 中文字幕三四区| 91狠狠狠| 东京热天堂网| 84YTCOM性无码| 超碰导航97| 99久久免费看精品国产一区| 日韩啪啪啪啪啪| 五月综合激情网| 9色在线| 大香蕉综合在线| 女人被添高潮免费视频| 大香蕉九九| 激情五月天综合网| 任我爽在线视频免费观看| 老色鬼成人精品视频下载大在线观看| 天天舔天天日天天射| 亚洲 图片 欧美 色图| 日韩成人精品中文字幕| 久久这里都是精品| 日日嗷| 嗯嗯不要视频| 天天干夜夜一操| 国产 日韩 另类 视频一区爱| 激情五月婷| 天天日日日射| 亚洲第一男人天堂| 久操91视频| 成人七区| 天美国产三级传媒| 亚洲天天精品| 精品九九九九九| 亚洲 小说 欧美 激情 另类| 大香网站| 欧美色图天堂网m| 97在线资源| 亚洲人妻色图| 久久久久久日韩| 日本精品不卡一二三区| 99 国产丝袜在线| 日日噜噜夜夜久久亚洲一区二区| 97在线观看视频| 999综合网| 少妇人妻好深太紧了vr91| 成人片在线播放| 亚州宗合另类| 超碰在线成人电影| 国产精品探花色| 午夜精品视频777| 插入综合网| 俞拍自拍| 搡老女人老妇女AAA一VU麻豆| 在线 制服丝袜中出 人妻| 亚洲不卡av在线| 国产精品色| 亚洲在线欧美| 五月天婷婷小说| 色5月婷婷| 啊啊啊啊啊在线视频| 人妻天堂三区| 五月婷婷无码| 人妻激情在线视频| 特级丰满少妇一级AAAA爱毛片| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 国产一区二区a毛片| 精品一区二区三区蜜桃臀赵总| 国产精品久久久久久久久久久久久久久久| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 中文字幕黄色片| 欧美性爱网97| 翔田千里爆乳巨臀无码| 日韩97视频!在线| 婷婷人妻激情| 婷婷啪啪| 成人性生活高清视频在线播放| 377p欧洲日本亚洲大胆| 9999九九九久久久| 久久九九99| 综合亚洲网| 亚洲精品乱码久久久久久蜜桃麻豆 | 97超碰日韩| 天天搞在线综合网| 大香蕉懂9| 日本精品一区二区中文字幕| 一卡二卡三卡| 色婷视频| 国产老太乱伦一区| 日韩一999精品| 少妇厨房愉情理伦片bd在线观看| 天天摸夜夜摸| 亚洲国产成人精品999| 四虎影库国产精品免费| 人人贴人人摸| 99re这里| 色五月综合网| 久久久九九九| 蜜桃一区二区三区| 亚洲成人久久美女| 午夜爽爽爽| 六九九九| 久久精品一区二区一8| 中文字幕版| 男人的天堂午夜av| 亚洲综合伊人| 丁香五月激情综合国产| 乱伦一二三| 男插女青青影院| 岛国色情视频在线观看| 啊啊啊不要啊啊受不了了视频在线| 日韩一级久久毛片| 亚州国产成人精品女人久久| 欧洲熟妇xxXx欧美老妇裸体| 亚洲av性爱电影| 少妇人妻无码| 神马精品视频| 无码精品久久久天天影视| 日本一级不卡一二区| 九九在线视频| 在线看的av| 精品夜夜澡人妻无码AV| 加勒比人妻综合| 五月天激情小说| 春色综合网| 久久久久亚洲精品| www.91色综合| 丝袜美腿制服人妻二区中文字幕| 久久人妻| 鸥美中出| 亚州九九九精品视频| 久久久一区二区三区四曲免费听| 91人妻精华帖| 男人的天堂 在线一区| 亚洲综合99999| 无码9区| 亚洲一卡2卡3卡4卡乱码网站 | 综合激情一一91| 很很干很很操| 五月天久久久| 色综合久| 国产精品爽爽va在线观看98| 麻豆国产视频精品观看| 97国产精品一区二区传媒公司| 天天日天天操VV| 精品国产乱码久久久久久影片| 国产精品熟女九色九色蜜臀| 国产精品视屏| 日本韩高清无砖码22o| 久久熟女嫩草成人片免费| 天堂国产AV| 黄色av一区二区在线| 蜜乳视频网站| 日韩欧美大片免费高清啪啪| 国产熟女精品一区二区| 性色A∨91| 另类老少妇| 国产白领连续中出在线播放| 台湾佬激情综合| 芊芊操逼视频无码| 草莓精品视频在线免费观看| 手机看片91人妻| 亚州性色| 少妇久久| 秋霞怕怕片| 大香蕉懂9| 日本高清一本二本免费不卡| 老司机香蕉久久久久| 夜夜嗨一区二区三区三州加勒比| 夜色97| 97国产色图| 欧美综合色站| 欧美日本天堂| 麻豆色约约| 欧美色图亚洲色,麻豆| 综合欧美日韩在线| 物业黑人 AV一区| 中国的操老妇女| 国产美女激情| 天天性射网| 玖玖无码超碰| 午夜精品人妻二区三区| 香蕉精品二区二区| 日产操逼| 亚洲成人免费中文字幕| 日韩欧美成人综合在线| 午夜欧美女人操逼| 91粉嫩萝控精品福利网站_精品影音先锋国 | 激情小说在线视频| 先锋激情∨在线视频播放| 啪啪啪东京| 八人操人人摸人人看| 亚洲 欧美 手机在线观看| AV免费在线播放一区| 岛国黄| 亚洲精品一区二区三区在线播放| 少妇超碰在线| 亚洲一区二区 麻豆传媒| 国产后入清纯| 欧美色欧美| 国产强奸乱伦xd| 中文字幕 国产 精品| 99热精品免费| 麻豆精品三区视频| 欧美激情精品| 精品中文字幕一区二区| 六月色色| 久久久久ab| 欧美色图99| 好吊色综合| 国产一区二区三区免费视频在性观看| aaaa少妇高潮大片| 一区二区久久天天干狠狠| 中文字幕免费观看| 亚洲图片小说欧洲| 免费精品中文字幕| 91男女啊啊啊| 国产精品农村妇女精品| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 人妻丝袜无 码视频专区| 综合网亚| 国产精品扒开腿做爽爽爽视频| 国产无码高清操逼视频| 人人操av| 激情文学小说一区二区 | 人人操人人93| 成人三级片无码| 夜夜高潮夜夜爽高清视频一 | 成人小说另类在线| 蜜桃色色网站视频三区| 91男同| 日本操逼无码| 午夜精品久久久久久久男人的天堂| 乱老熟女一区二区三区| 亚洲性爱成人| 好吊妞转入那个网| 999久久久久久久久| 国产欧美精选激情视频| 午夜男人天堂| 欧美碰碰综合色| a级成人毛片免费视频高清| 亚洲情色一区综合| 人人操人人摸人人骑| 无码高清国产AV| 夜夜嗨AV蜜臀av| 欧美日韩久久精品爱爱| 日韩精品在线观看网站| 久久人妻少妇| AV免费在线播放一区| 人妻密肉在线观看| 亚洲精品国产精品成人| 激激五月| 中国一级αV| 久久精品国产精品亚洲艾通辽熟妇 | 91天天综合在线| 国产精品视频白浆免费| 亚洲熟女乱综合一区二区三区 | 97色碰| 日韩精品资源| 99久热| 我要色综合网| 视频在线观看一二三区| 一中国女人毛片水真多| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 久久黄片国产一区二区| 日本五十路在线| 国产亚洲精品无码三区| 婷婷15月天青娱乐| 国产综合在线视频网站| 欧美熟女丝袜| 国产AV激情无码久久无码 | 18禁免费视频| 99热国产精品| 成年人黄色小视频网站| 美女网站黄页| 天天爽夜夜操| 操逼无码操逼| 九九九草| 国产一区96在线| 97超碰欧美| 欧美综合色站| 国产网站在线播放| 性91| 日韩精品熟妇| 欧美三级中文字幕hd| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 天天综合~91| 中文字幕精品三级久久久| 丁香六月啪| 五月婷亚洲精品天堂| 中文字幕丝袜美腿| 日欧操屄视频| 国产探花日韩援交| 夜夜春夜夜操| 欧美中字二区| 丁香五月天堂网| 亚州男人天堂| 骚人妻少妇视频| 国产av波波国产精品| 亚洲中文sv| 97国伦国色| 久久九九国产精品| 无遮挡男女激烈动态图| 91色亚洲| 91国产美女丝袜足交精品视频| 韩国手机不卡无码三级视频| 亚洲,欧美,综合网| 91总综合网| 丁香九月婷婷| 亚洲精品亚洲人成在线麻豆| 91精品无码久久久久久久| 综合色久欲| 密臀在线免费观看| 一本色道久久天天射天天干| 九九九九热只有精品| 欧美激情片一区二区| 亚洲欧美国产日本一区二区三区| 欧美一级AAAAAAA| 青青草AV色| oumeisetupian| 亚洲图片欧美91N| 狠狠色综合网| 欧美三级不卡| 欧美|91色综合| 成人情色一区二区| 狠狠干综合| 五月丁香综合啪啪| 五月丁香综合啪啪| 久久曰曰| 丁香五月天啪啪| 操逼日韩无码 | 超碰人人超在线观看| 国产欧美岛国精品一区| 亚洲精品三| 人人色人人操在线| 欧美少妇熟女| 天美一二三在线观看Av| 日日夜夜国产综合| 国产欧美黑人丰满在线| 色踪合AV| 少妇大屁屁| 超碰97伊人| 人人妻人人爽一区二区三区| 欧美情色男人的天堂| 九九九999久久久网站| 天天日日本| 中文乱码99| 国产成人亚洲精品无码最新在线| 亚射在线| 无码不卡八戒| 秋霞福利网| 日韩欧美午夜视频在线| 亚洲在钱| 99热99色| 欧美人体性爱互联网第一页婷婷日本| 中文字幕一区av| 外国免费性情大片| 大胆91| 天天综合色图| 美女尤物福利视频| 国产丝袜美女在线一区| 99只有精品| 亚洲AV噜噜狠狠网址蜜桃动漫| 欧美国产操逼| 2024人人操人人摸| 最新无码国产| 99热18这里只有精品| 欧美成人性爱视频大全| 91亚洲欧美激情| 黄污污污污| 免费一二区| 人人操天天爽| 操B在线观看| 国产伊人精品在线| 成人日韩3| 99最新日韩偷拍视频| 婷婷丁香六月天| 中文字幕美女91| 97久久精品不卡| 丝袜美腿欧美| 久久国内| 欧美精品成人一区二区在线观看 | 国产67194| 免费观看日本操逼视频| 熟妇激情| 超碰79人人乐| 亚洲一卡2卡3卡4卡乱码网站| 超碰99在线| 日韩资源网| 夜夜爽77777| 911av网站免费观看| 美女9118禁| 欧美亚洲AN| 开心激情站| 国产Aα| 男人天堂网址| 超碰色大香蕉| 丝袜高跟澳门91视频| 亚洲av在线免费观看| 久草免费福利在线播放| 精品国产一区探花在线观看| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 精品久久久久9999| 色情成人五月天| 91高清无码下载| 天美精品原创av片国产| 日本幼女18+| 久久久久亚洲一区女同性恋中文字幕| 理论久久婷婷网 8| 色婷婷亚洲婷婷| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 午夜免费福利视频一区| 亚洲成人久久一区二区| 国产精品网址| 激情熟女12P| 美女久久久久久久久久久| 另类专区加勒比| 精爱久久| 骚乳在线| 老鸭窝亚洲毛片| 天天日夜夜爽| 啪啪啪大香蕉| 超碰在线99| www.久久久久| 九九热AV| 超碰人人色| 青青草丝袜在线视频| 夜间福利片1000无码| 中文字幕五月婷婷免费| 精品亚洲一区在线观看| 国产黄色在线播放观看| 成人a v在线播放免费| 色臀av| 亚洲另类春色| 另类天堂| a片久久久久久久久久久久 | 精品国产乱码久久久久久网站入口| 久操视频在线| a啊啊啊啊啊啊啊啊一区二区| 后入式福利| 综合少妇网| 深夜国产福利| 999久久久免费精品国产牛牛| 亚洲欧美不卡线| 操国产高清| 人人操人人爽人人操人人| 中文?日韩?免费?精品| 熟女乱3伦999| 99久久精品无码一区二区毛片免费| 100啪啪视频大全| 91成人高清在线观看| 国产传媒午夜理伦精品| 久久直播国产| 国产一级黄色片在线观看| 国产精品免费视频人成| 亚洲操逼网| 国产伊人自拍| 天天舔天天日天天射| 99热线麻豆 | 欧美黄页| 国产精品无码久久久久2028| 性色av网站| 婷婷色网| 精品无人区麻豆乱码久久久| 日韩亚洲97| 天天天干977| 视频国产成人精品日本亚洲18| 日本精品中文字幕视频| 欧洲成人性爱视频| 99免费视频| 99综合自拍| 少妇蹲下买菜露大唇0| 搡老女人老熟女91老熟女综合网| 国产精品99精品视频网站| 偷拍自拍在线视频观看| 熟女人妻av在线资源,黄色的资源| 爱欲AV| 久操| 26uuu成人影片| 黄色性爱网网| 亚洲成人精品久久久| 91激情国产| 国产午夜在线观看| 久久久精品成人国产| 天天透伊人| 黄色一区三区| 家庭乱伦国产精品| 亚洲欧洲另类| 亚洲熟女偷拍在线观看| 久久久97| 久热无码| 9997se| 日韩极品无码B| 欧美激情综合| 国产成人啪一区二区| 日韩欧美大片免费高清啪啪| 99熟女| 日本顶级天天操狠狠操夜夜操中文字幕| 亚洲视频精选| 中文字幕在线日亚州9| 日韩啪啪啪视频| 97久久超碰| 丁香五月性爱| 春色综合免费| 国产精品一二三在线看| 2019天天操天天爽天天拍| 偷拍盗拍亚洲色图图片| 午夜国产成人福利视频| 蜜桃一区二区三区| 亚洲成人在线高清| 91人妻视频在线| 高清孕妇孕交 交| 成人免费在线网站| 国产性爱欧美性爱在线| 无遮挡一级毛片视频免费的| 99999无码| 97超碰欧美中文字幕| 性色av婷婷久久一区二区点复制| 熟女自慰久久久| J?P?NESEHD熟女熟妇伦| 久操99| 国产剧情在线| 亚洲夜色在线| 欧美97爱| 啪啪视频mP4| 国产精品乱码久久久久| 日本人体九九九九九九| 欧美亚洲手机在线| 免费观看欧美日韩操逼视频| 天天干18禁| 婷婷五月影院| 综合97| 偷拍欧美激情| 久久亚洲中文字幕视频| 欧美 亚洲 大香| 亚洲欧洲中文日韩女优乱码| 日逼五月天| 日韩中文字幕精品一区在线| 婷婷五月天无码| 亚洲日韩美国人妻| 啊啊啊啊,啊啊好多水| 欧美性爱在线无码| 亚洲美女精品九九视频| 蜜桃久久综合视频| 91福利网在线观看| 九九自拍伦理| 无码国产精品午夜不卡(| 人妻第一页| 天美传媒av 在线| 四虎午夜影院| 美女网站黄页| 五月丁香在线| yaouchengrenav| 日韩精品大香蕉伊人在线| 国产高清精品福利| 精精品人妻一区二区三区| 日韩人妻操B| 天天干天天燥| 精品美女少妇一区二区| 欧美亚洲激情小说| 欧美性爱中文字幕无线码| 好一吊区二区| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 97超碰色五月| 日韩中文字幕人妻视频| 快播电影网日韩新片| 奸色色 男人天堂 天天射| ,成人免费啪啪视频| 伊人久久亚洲色欲综合网站 | 亚洲天堂中文字| 天天综合网~91| 一区二区三区日韩欧美| 伊人久操| 伊人热综合| 亚洲精品97p| 亚洲码和欧洲精品激情系列| 日韩中文字幕视频在线观看| 69视频入口| 91美女高潮| 国产精品乱码久久久久久久久久久久| 五月综合婷婷久久网站| 亚洲春色一区二区三区| 中文字幕免费在线观看| 午夜天堂精品久久| 99色在线视频| 久久精品国产亚洲AV无码做| 超碰78| 青青草华人在线欧美在线| 中文字幕视频2区| 无码自拍SM| 日本免费中文字幕在线| 亚洲黑人在线| 亚洲中文sv| 亚洲欧美日韩国产丝袜自拍中文| 看看小穴| 五月丁香啪| 欧美日韩性爱操大逼| 国产精品4p在线观看| 欧美偷拍| 情色图区| 亚洲好色人妻| 日日日大屁股骚女人精品| 岛国小电影| 五月天激情小说| 熟女突然公开看18禁影片| 操操逼视频| 国产白丝精品在线观看| 午夜传煤十二区精品| 97超碰中文| 欧美国产有色电影| 伊人国产视频| 台湾大香蕉99热| 精品久久久久瑟瑟| 天天色悠悠激情| 日韩精品99999| 大香蕉手机视频| 九九aV| 日本在线视频导航| 日本人人操人人操| 亚洲成熟国产精品美女| 亚洲成人性| 人人看人人爰人人操| 久久久精品中文字幕爱豆| 蜜臀久久99精品久久久电影| 亚洲激情视频| 男人天堂网站| A 天堂| 性色AV蜜色av色欲av| 欧美第一页| 一起草高清无码| 91操操操操| 欧美高清无码免费视频高清版| 东京热一区二区中文字幕| 精品国产Av无码久久久伦古装| 国产精品扒开腿做爽爽爽视频| 久操国产在线| 清纯唯美亚洲| 2017av无码免费无线播| 久久欲| 色在线亚洲视频www| www.99中文字幕| 亚洲成人美女无吗| 色丁香久久| 色婷婷五月天| 草b在线 | 久久大精品乱码视频人妻熟女| 天天干人妻| 天操天操夜操夜月操月年年操操| 中文字幕第7页| 97超碰欧美中文字幕| 日韩特级毛片免费观看全集| 久久精品国产AV一区二区三区| 国产成年女人免费视频播放a| 日本免费专区| 一区二区娱乐网站| 日韩情色视频| 99只有精品| 91中文字幕在线观看| 国产综合久久久麻桃个 | 一本大道青青| 日韩欧美性爱电影在线观看| 亚洲精品尤物yw在线影院| 91人妻做a观看视频| 国产精品国产拍高清AV| 麻豆黄色五月天| 久久夜精品一区二区三区| 成人AV在线网站| JIZZJIZZ亚洲女人被躁| 久久一级无码精品毛片6| A久久| 久偷拍| 东京热毛片调教| 日本性爱视频一级| 手机在线看片免费人成视频| 天美传媒国产原创中文字幕亚洲欧美另类| 超碰1024久久| 伊人国产AV| 精品亚洲一区在线观看| 日韩人妻一区二区精品| 天天摸天天插天天日| 插入粉嫩少妇视频| 日产操逼| 免费看日本操逼视频| 亚洲欧美爆| 日韩天天综合| 久久精品日韩| 91人人爽人人爽| 久久激情四射婷婷丁香五月天| 欧美裸体美女日麻屄| 综合久久六月久久婷婷| 伊人青青一区成人视频在线观看区| 国产吹潮女在线观看| 亚洲影院365| 五月大香蕉| 91久久久老司机| 欧美岛国精品在线观看| 免费黄色视频网址| 激情人妻另类| 亚洲av无码国产精品字幕| 超碰99在线| 亚洲偷拍欧美激情| 亚洲日韩视频二区| 无码99| 九九九一二三| 天天做日日爱夜夜爽| 欧美日韩一干二干| 91处女在线观看| 这里有精品| 中文字幕午夜精品久久久| 国产精品直播在线观看直播| 亚洲国产麻豆一区二区三区| 亚洲精品一区二区三区新线路| 九九超碰综合网| 日韩欧美综合激情| 一道本东京热加勒比一区二区三区| 香蕉免费一区二区三区不读 | 日韩 国产 欧美自拍| 久久婷婷色综合一区二区三区| AV色女综合| 伊人久久艹| 变态另类专区| 人妻中文在线| 九t超碰| 人妻久久久| 亚洲丝袜少妇在线| 久久久一区二区三区四曲免费听 | 日韩午夜国产| 99在线免费公开视频| 人妻人人澡人人爽人人| 欧美伊人久久综合网| 欧美熟女妇同| 2018天天干在线视频| 久久综合av| 自拍偷拍 日韩无码| 欧美性Fer办公室秘书| 蜜臀操逼黄色视频操的好爽| 人伦四五区| www色色色com| 亚洲欧美高清| 亚洲三级网址久久最新| 中文色综合| 青青草玖玖爱| 柠檬AV导航| 午夜精品久久久久久久| 午夜啊啊啊| 国产一区二区成人av在线播放| 久久久久久性爱视频| 日韩av免费一级电影| 粉嫩AV一区夜夜嗨| 熟女字幕| 久久久久久久| 欧美性战999| 久久人人爽爽人人爽人人片αV| 午夜福利在线合集| 久久丁香五月婷婷| 欧美激情一区| A男人的天堂| 五月丁香影院| 日韩免费一级性爱视频| 亚洲黄色网址| www.夜夜| 日韩无码精品综合久久| 十八禁电影伊人网| 人妻嗯啊啊在线播放| 天天看夜夜看日日干| 欧美影音在线| 91黑丝在线播放| 亚洲成人性爱网站在线播放| 欧美激情一| 久久婷婷一区二| 亚洲图片激情综合另类| 天天日天天干天天摸天天操| 日韩国产品视频中文字| 免费的很黄很污的全部视频| 99re这里只有精品2| 在线天堂999| www色日本| 成人一二| com 首页 18岁 禁区 女优 免费 精选 同城 | 91丝袜在线观看| 中文字幕av丝袜| 久久久一热在线播放| 人妻日日干| AVE乱伦| 精品国产乱码久久久影院| 欧美在线伊人色| 激情色色| 欧亚乱色熟女一区二区| 久久久97| 欧美色图99| 激情欧美日韩女同久久| 五月色综合| 亚洲人妻中文高清| 一级黄色性爱裸体视频| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 又粗又长又爽在线观看| 91 丝袜在线播放| 亚洲情色 无码专区| 久草资源欧美在线视频| 亚洲欧美精品一区天堂久久 | 国产成人主播| 中文一区二区婷婷视频| 亚洲操逼网| 九月丁香综合网| 精品无码久久久久久国产浪潮| 欧美综合亚洲综合| 大香蕉性欧美| 欧美一品道| 嗯嗯,好大,好爽,好骚 | 综合久久婷婷| 国产 无码 一区二区| 欧美视频一| 免费成人自拍视频在线| 花花AV导航| 另类欧美综合| 精品无人区麻豆乱码1区2区图片| 久神马| 四虎国产成人精品免费一女五男| 99re这里只有精品中心播放| 天天日天天插| 激情五月婷| 日本色婷婷| 激情久久久| 中文字幕亚韩| 人妻aa| 五月天玖玖资源站| 午夜福利免费精品视频| 国产黄片在线免费观看| 天天做日日做| 久草免费福利在线播放| 艹精品| 亚洲啪啪视频一区二区| 亚洲第一狼人丝袜美女另类 | 久久av一级av少妇av高潮| 久久黄片国产一区二区| 欧美自拍偷拍综合图片| 亚洲国产av中文字幕久久 | 好爽视频在线观看| 91天天综合日韩欧美| 欧美天堂在线| 亚洲精品99999| 亚洲?V高清一区二区三区尤物| 成·人免费午夜在线观看| 思思热一热婷婷热一热| 色婷婷激一区二区三区| 日本高清_区二区三区| 国产一区二区三区导航| 国产版a级片直播在线| 成片免费播放| 2011国产精品| 欧美中文字幕一区| 小草av不卡亚洲二区| 蜜臀久久99'精品久久久| 在线播放中文字幕| 97日亚洲欧美| 亚欧无码线免费观看视频| 最新av网站在线观看| 99精品欧美一区二区三区桃色| 日本操逼视频导航| 色婷婷色99国产综合精品| 日本福利社| 欧美亚洲影视| 熟妇激情| 国产97亚洲| 色黄污美女啪啪啪免费网站| 岛国艾薇凹凸视频天堂| 91丨九色丨大屁股| 日韩 人妻 精品| 欧美在线视频播放| 欧美综合1性辶| 日本αv| 久久久精品视频免费观看| 六月婷婷激情| 亚洲男人的天堂AV| 国产熟码AV| 欧美91精品国产自产| 自拍视频一区在线观看| 久久激情网| 日本 免费 一区二区三区 久久香蕉 | 亚洲夜夜欢无码一区二区| www鬼畜国产男人的天堂| 男人天堂日日夜夜| 51一区二区三区| 午夜小电影在线插入淫高潮| 久久av一级av少妇av高潮| 狠狠综合| 啊啊啊不要好爽日韩无码一区| 中文字幕av一区二区三区人妻少妇| 亚洲乱妇p22| 黄片aaaaa一区| 人妻夜夜爽天天爽麻豆三区网站 | 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 久久精品国产AV一区二区三区| 久久精品国产免费观看99| 青青草在线视频人人想人人上| 欧美天堂亚洲电影院一区在线播放| 亚洲视频精选| 老司机老司机午夜影院| 偷拍 精品 另类 四区| 亚洲色综网| 性暴力欧美猛交在线直播| 丁香六月激情综合| 欧美综合网1| 日本色色色网站免费看不卡| 男人的天堂一区三区| 亚洲永久AV无码精品秋霞| 97在线免费视频观看| 最新中文字幕在线亚洲| 夜夜操天天肏| 亚洲天堂资源网| 粉嫩绯色AV一区二区在线| 亚州久久9| 人妻天天爽天天爽三区| 久久激情网| 国产精品3| 亚洲AV无码翔田千里网站| 天天射网| 97亚洲在线| 国产精品三级视频网站| 久久99精品九九久久久婷婷| 精品无码久久久久久久杏吧| 婷婷五月天网| 欧美后入式| 熟女色综合久久| 欧美日本天堂| 亚洲一卡二卡在线免费| 97超碰jingpin| 国产日韩怡红院| 成人性爱电影一区二区| 青青欧美| 亚洲精品人妻在线| 97超级欧美| 色y情视频免费看| 不卡九肏| 人人操人人干xxx| 大香蕉免| a片自拍直播视频| 日本免费一区二| 可免费观看的av毛片中日美韩| 亚洲高潮少妇| 神马午夜久久| 麻豆60秒| 九九九九热| 人人手机欧洲亚洲国产人妻| 91天天看| 欧美亚综合色图| 欧美呦呦性爱| 偷拍在线观看视频| 色黄色美女大长腿午夜视频| 日本九九久久99| 亚洲第一狼人丝袜美女另类| 久久久久久久久久久久久久久久9| 日本1区2区不卡视频| 久久骚少妇| 国产精品无套内谢| 亚洲女人毛茸茸91| 国产尹人在线视频免费| 亚洲中文字幕av| 男人的天堂啪啪| 成·人免费午夜在线观看| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 97超级久久强资源| 欧美激情内射| 一本一道人妻久久一区二区三区| 五月丁香激情四射| 色婷婷综合久久久久中文一区二区| 日韩欧洲操屄视频| 亚热日本熟女| 欧美日韩国产色图在线| 欧美亚洲系列| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 日韩精品影视| 狠狠综合| 操国产逼| 欧美中字不卡| 国产九月婷婷| ji熟女.com| 久久精品综合| 久久久久13| 国产亚洲精品激情| 熟妇一区,二区,三区。| 国产在线76页| 欧 美 自 拍 偷 拍| 久久久少妇诱惑精品视频| 婷婷五月天在线观看| 国产在线能看的你懂的| 综合网97| 亚洲色吧网| 95自拍视频在线观看| 91高清欧美| 欧美72网页| 爱射综合| 国产精品 久久久精品一牛| 婷婷探花久久精品一区| 大香蕉 222| 人妻精品视频一区二区| 国产强奸乱伦第1页| 天天摸天天舔天天操| 六月婷婷综合| 青青操综合网| 97爱| 人妻无码一区二区三区久久99| 成人五月香网在线| 韩国成人精品久久久免费看| 超碰97 线线 在现| 无毛精品| 日产中文字幕2020| 欧美在线视频99| 亚洲AV噜噜狠狠网址蜜桃动漫| 青草成人免费视频一COm| 情色五月天网| 亚洲。日韩。欧美| 插欧洲美女欧美精品| 日本人妻伦在线中文字幕| 伊人宅男大香蕉| 久久久∴| 久久熟女人| 欧美黄片视频在线观看免费| 日本精品网站在线中文| 男人的天堂va| 日韩无码服务区| 97色涩| 91人妻视频在线| 99热综合| 亚洲欧美国产其他二区| 亚洲熟女性高潮久久久| 张柏芝国产一区在线观看| 久久久久久中文| 97视频900| 欧美精品丝袜久久久中文字幕| 99性爱| 亚洲AV无码乱码在线观看性色| 国产一级高跟丝袜| 国语对白露脸XXXXXX| 91人人| 东京太热男人的天堂久久久| 日本精品一区二区三| 亚洲和欧美裸体美女双飞视频| 日韩影片中文字幕一区二区三区| 九九热视频在线观看| 免费一级欧美片片线观看| 黄片com.| 一线黄色免费性爱片| 被男人吃奶很爽的毛片| 中文字幕在线免费观看2| 东京热大香蕉| 神马麻豆福利院| 操久久久久| 日日躁夜夜躁狠狠躁超爽| 欧美在线大香999| WWW美腿丝袜香蕉中文| 综合欧美日韩在线| 在线亚洲精品久久久| 久9久9精品| 性爱AV天堂| 热热热热日日漂亮永久永久国产日| 欧美熟女激情| 成人综合网 欧美| 免费9 1久久| 成人A片男人的天堂| 六月丁操逼| 韩国女主播青草在线| 男生女生啊啊啊啊| 极品少妇99| 成人一区二区三区四区| 欧亚日韩三区| 99re99视频在线免费观看| 黄日韩| 久操影视| 久久久涩| 妇女一区二区三区| 日日爱99| 亚洲**2021在线观看| se吧提供91精品国产91久久久久久| 亚洲A曰本VA欧美VA视频| 国产家庭乱伦性爱视频| 大鸡吧尹人在线| 一区二区三区四区五区高清无码永久视频| 日韩亚洲美女一区久久| 欧美天天谢综合网| 北京美女一区二区| 天堂精品| 78操B| 久久精品一区二区一8| 伊人网免费视频| 狼狼色丁香久久婷婷综合五月| 太久视频| 亚洲国产激情国产av| 欧美性天天影视| 久久99手机免费视频| 99999这里都精品| 91欧| 秋霞一集毛片观看| av无码精品久久久久| 国产亚洲99久久精品| 日韩亚洲美女一区久久| 1区2区3区中文字幕日韩| 韩国嫰模上门援交视频| 九九精品网| 亚洲精品自拍| 国产中文字幕曰本毛片| 久久久久久午夜男人的天堂| 欧美在线色图| 日韩中文字幕精品一二三事国产精品| 天天欧美| 亚洲性爱乱操x| 色999五月色| 日本A级视频| 精品国产乱码久久久| 青娱乐999| 国产精品99久久久www| 操我啊啊啊啊啊|