欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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ù)組合就是標(biāo)題里這四樣SpringBoot 打底、MyBatis-Plus 干數(shù)據(jù)層、Thymeleaf 渲染頁面、AdminLTE 套殼。整套東西跑起來增刪改查這類活兒的開發(fā)節(jié)奏會非常快一個標(biāo)準(zhǔn)模塊從建表到頁面能點熟練的話兩三個小時就能出一版。這篇內(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 端的標(biāo)準(zhǔn)去套內(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、前端表單、可能還有類型定義五個文件起步還得等前端同學(xué)排期。代價也要說清楚。Thymeleaf 的模板語法是在 HTML 屬性上做文章邏輯復(fù)雜了會很難看超過三層的條件嵌套基本就沒法維護了局部刷新能力弱想要個下拉聯(lián)動、表格無刷新編輯就得自己寫零散的 JSSEO 完全談不上不過內(nèi)部系統(tǒng)也不需要。我的判斷標(biāo)準(zhǔn)很簡單如果這個系統(tǒng)的主要使用者是公司內(nèi)部員工、頁面總數(shù)在五十個以內(nèi)、沒有復(fù)雜的前端狀態(tài)管理需求這套組合就是劃算的如果要做的是面向外部用戶的產(chǎn)品或者有大量實時交互那就老老實實上分離架構(gòu)。1.2 四個組件各管一段別讓職責(zé)串味實際寫代碼時最常見的混亂是把本該在 Service 層的邏輯塞進 Controller或者把查詢條件拼裝散落在模板里。這套棧里四樣?xùn)|西的職責(zé)其實很清晰組件負責(zé)的事不該干的事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 決定顯示什么顏色的標(biāo)簽。這個邊界守住了后面加需求才不會牽一發(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 里坐標(biāo)改成了com.mysql:mysql-connector-j老項目里常見的mysql:mysql-connector-java雖然還能用但會有告警新項目直接寫新的。如果你用的是 SpringBoot 3.xMyBatis-Plus 的 starter 也要換成mybatis-plus-spring-boot3-starter這個坐標(biāo)差異在官方文檔里不算顯眼但包名不一樣直接復(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)標(biāo)注的字段生效如果實體類漏了這個注解填充不會執(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ù)習(xí)慣我傾向于 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 就負責(zé)把請求參數(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兩個注解長得像但作用域完全不同混用會導(dǎo)致日期綁不上、拋 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)雅但它多一個依賴語法也自成一套團隊里如果新人多學(xué)習(xí)成本不太劃算。我一般用原生的 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}頁面標(biāo)題/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是用片段整體替換掉當(dāng)前標(biāo)簽insert是把片段塞進當(dāng)前標(biāo)簽內(nèi)部。用replace的時候當(dāng)前標(biāo)簽本身會被丟掉所以寫法上要保證被替換的標(biāo)簽類型跟片段的根標(biāo)簽一致。側(cè)邊欄的菜單高亮靠當(dāng)前路徑判斷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ù)用同一個模板是標(biāo)準(zhǔn)做法用一個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是重定向后傳遞提示消息的標(biāo)準(zhǔn)做法數(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 里在文件右下角能看到當(dāng)前編碼確認是 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
返回資訊列表
亚洲成人免费在线| 开心婷婷中文字慕| 人妻丰满精品一区二区A片| 五月天婷婷开心| 九九99在线视频| 精品人妻一区二区三区四区不卡在| 精品国婬伦V无码久久久| 久99视频在线观看| 日日干日日| caopeng97日韩| 久久精品天| 日本综合色图| 婷婷久久五月| 99re免费精品视频| 91成人电影| 少妇久久诱惑视频| 丁香五月色播中文在线播放| 欧美操人| 色婷婷基地在线| 久久aaaaa| 男同91 | 另类色视频| 伊人久久综合| 久久婷婷五| 亚洲视频在线观看| 欧美在线视频99| 91碰视频| 91综合在线| 亚洲色网络| 日韩AV色色色| 成人丁香五月| 久热免费| 91丨九色丨熟女丰满| 夜夜夜叫天天天做| 99re这里有精品手机在线| 亚洲Va成人| 日韩色五月| 日笨久久网| 五月婷婷影视| 激情性爱婷婷| 东京热免费视频网站| 久9久视频精品| 成人超碰网| 国产又黄又爽又色的免费| 日韩综合久久| 99国产精品白浆在线观看免费 | 丁香五月婷婷激情中文| 蜜臀99久久精品久久久久| 美女久久婷婷| 美国不卡视频| 99久热在线精品| 成人av播放| 色99在线看| 老师把我爽高潮了免费A片| 99欧美精品99日本精品| 色蜜婷婷| 毛片网站谁有| 久久久久久久久久人妻| 超碰97干| 专区无日本视频高清8| 狼人久草| aaaa.黄| 婷婷综合久久综合| 婷婷五月激情图片| 亚洲综合丁香婷婷六月天| 婷婷五月色| 一个色的综合| 国产免费一区二区在线A片视频| 99ri视频| 精品久久99码| 九九人人精品| 久久99热在线观看| 色婷婷AV久久久久久久| 天天干天天操天天上| 婷婷大乡焦噜噜| 亚洲无码影音| 婷婷91视频| www.久久久久| 97香蕉久久超级碰碰高清版| 丁香五月欧美| 亚洲热热视频| 五月丁香六月激情啪| 婷婷偷拍网| 青青久久大香蕉| www.9操| 九九性视频| 色蜜婷婷| 婷婷综合国产| 嫩草视频。| 欧美日综合| 精品网站:999WWW| 五月天色婷婷伊人网| 99热这是里只有精品| 超碰二区| 热久国产| 一逼色综合| 99九精品| www色五月| 丁香激情五月天| 亚洲一二三网| 六月丁香五月激情网| 综合网亚洲| 色播五月天激情| 丁香五月婷婷www..com| 婷婷开心青青草| 丁香五月婷婷偷拍| 超碰97色| 婷婷色5月激情网| 九色视频91| WWW、99热| 久久伊人大香蕉| 五月亚洲| 婷婷不卡基地| 天天操天爱综合| av九九| 婷婷影视久久| 婷婷五月天亚洲色| 色爱综合网| 视频1区2区| 一本久久亚洲五月婷婷 | 色播五月丁香婷婷| 色久女| 天天色天天色天天色天天色天天色| 乱码操操| 思思网站| 亚洲 五月 婷婷 成人| 日韩操逼小电影| 欧美日本一区二区三区| 日日夜夜婷婷| 久久作爱| 中文字幕丰满孑伦无码专区 | 婷婷激情丁香五月天综合| 激情综合五月| 六月丁香综合网| 六月婷婷影院| 五月色影院| 中文AV网| 日本色五月| 色九九综合| 国外亚洲成AV人片在线观看| 亚洲精品第一国产综合亚AV| www.综合久久.com| 极品少妇高潮啪啪AV无码| 久久九九综合| 一区=区操屄高清大全av| 99视频在线看| 天天色月| 婷婷情色激情| 精品久热| 九九婷婷五月天| 欧美碰碰| WWW色综合| 国产精品色色色色| 婷婷情色五月天| 亚洲这里只有精品| 亚洲AV日韩在线观看| 久久久久久18| 天天狠狠婷婷在线| 99久久大片| www.99日本| 久久五月天婷婷| 精品少妇人妻AV无码专区偷人| 99性爱视频| 99ER热精品视频| 久久99草五月婷婷| 婷婷综合网| 色婷婷五月天激情综合| 中文字幕激情综合| 成人网在线观看视频| 91在线观看www| 中美月韩免费A片| 激情com| 欧美激情综合色综合色| 亚洲成人免费在线| 男人的天堂99| 日日夜夜狠狠婷婷色| 亚洲区1| 99资源在线视频| 久久黄色网扯| 丁香五月欧美色综合| 婷婷色导航| 九九久久玖玖爱| 国产67194| 欧美婷| 一本色道久久综合狠狠躁小说| 99热成人精品网站| 人妻无码视频网| 婷婷久久18| 久久久这里有精品| 五月婷婷六月丁香综合视频在线| 色色五月婷婷| 91无码高清| av中文在线| 4399无码视频| 精品久热| 婷婷六月色| 日木狠狠干| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 五月丁香va| 丁香五月色情av| 男女免费视频999| 精品人妻一区二区三区在| 色综合色色| 日本精品在线噜噜噜| 一本大道熟女人妻中文字幕在线| 久久机只有这里精品| 丁香五月综合首页| 99久热视频在线| 97在线精品| 久久九九蜜| www.zbzhongsen.com| 超碰婷婷五月| 日本熟妇乱妇熟色A片蜜桃| 欧美Va日本Va| 26uuu亚洲精品国产| 色噜噜狠狠色综合无码久久欧美| 欧美性生交XXXXX无码小说| 丁香五月婷中字幕| 欧美久久婷婷| 五月综合影院| 色情激情五月| 色亚洲婷婷| 日韩性视频| 超级碰碰碰久久网站| www激情| 五月天激情丁香| 高清激情av在线观看| 91疯狂操操操操| 国产精品A成V人在线播放| 日本九九视频| www.天天干| 很操日本7| 欧美激情丁香五月| 婷婷放心五日爱| 六月丁香六月婷婷欧美| 超碰国产AV| 操大屄五月天视频| 日韩欧美不卡| 99在线资源视频| 天天爽天天干| 亚洲亚洲人成综合网络| 噼里啪啦完整版中文在线观看| 婷婷五月丁香色情| 激情 婷婷 丁香五月天| 人人舔天天| 色五月丁香总合网| 五月的婷婷六月丁香| 婷婷久久网| 久久人人九九| 五月婷婷综合网| 九九热中文| 欧美色宗和激情| 伊人热婷婷| 色综合久久8| 国产av天天插天天操天天爽| 一本到不卡高清DVD| 免费看欧美成人A片无码| 嫩草AV久久伊人妇女超级A | 五月综合视频| 男妓跪趴把舌头伸进我的嘴巴| AV操操操| 日韩操人| 少妇高潮呻吟A片免费看软件| 天天弄天天操| 可以直接看的av| 激情图片五月天| 深爱五月婷婷| 岛国AAAV| 五月激情网站| 六月丁香啪| 色婷婷婷综合五月天| 77799热| 五月夜丁香| 人妻VideOssS人妻| 五月婷精品| 色播播五月天| 中文字幕人妻AV| 亚洲热久| WWW五月天| 婷婷色丁香五月| 天天综合网亚洲网站| 狠狠色综合精品视频在线| 亚洲丁香五月天视频| 久久超级碰碰| 日本三级成人秘书精品片| 日噜噜色| 国产片天天爽夜夜爽| 婷婷六月色丁香视频在线观看| 久久免费精品小视频| 天天粽合合合合| 久久丁香五月婷婷| 五月婷婷之综合激情| 做爰丰满少妇1313| 手机在线日韩视频中文字幕| 热99久久这里只有精品| 丁香六月婷| 激情丁香五月天| 久久您您综合网| 婷婷五月网图片区| 五月婷婷深爱六月| 99久久9| 少妇人妻人伦A片| 激情五月天第四色| www.人人操人人看人人想人人摸 人人人人操,COM | 成 人片 黄 色 大 片| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 97香蕉人人在线观看| 九九热99视频| 天天爱天天做天天操| 大香蕉av在线| 丁香五月天激情四射网| 国产精品色色色色| 色色婷婷丁香| 五月婷婷九九久久| 五月婷婷视频28| 五月丁香啪啪网| 久久精99| wwccc久久久| 97久久精品| 伊人激情综合| 9久热这里只有精品视频| 欧美婷婷日本| 91色在线 | 日韩| 激情五月婷婷网在线观看| 这里只有精品视频| 婷婷丁香先锋资源网站| 五月天色婷婷基地| 日韩久久成人| 久久机热这里只有| 三级片AAA久久久AAA久久久AAA| 五月婷九月| 99re这里只有精品视频6| 丁香在线视频| 丁香激情五月少妇| 99av视频| 九九成年视频| 99色色色色| 国产乱妇无乱码大黄AA片| 最新av在线观看| 亚洲婷婷免费| 一区操| 四五月婷婷| 色色国产| 激情亚洲婷婷| 久久婷婷丁香五月一二三| 激情亚洲婷婷| 色综合综合网| 日韩av大全| 超碰在线观看99| 婷婷五月丁香激情图片| 日本黄色三级片内射| 91精品久久久久久| 色欲午夜无码久久久久久张津瑜| 五月天色丁香| www.色综合| 粉嫩av懂色av蜜臀av熟妇| 67194中文字幕| 久久伊人五月天| 色在线免费观看| 看久久性爱视频| 一本婷婷丁香久久| 无人精品在线视频| 五月丁香精品| 91色色色| 99色最新在线视频网站| 六月婷婷青青青视频| 亚洲亚洲永久无码777777| 91聚色综合网| 操逼六区| 狠狠操天天操| 天天日综合| 婷婷大美在线| 日 日干 日日做| 丁香六月婷婷久久综合八月| 色噜噜狠狠色综| AV在线免费网站| 久9视频免费播放| 丁香97综合| 1024欧美看片| 久久婷鲁| 我想看国产大学生口爆吞精的视频| 91精品综合久久久久久五月丁香| 久久久噜噜噜久久人妻| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 五月丁香婷婷福利| 男人天堂伊人五月丁香| 99热6这里之有精品| 性韩日色婷婷五月天激情啪啪XXX| 五月天大香蕉婷| 狠狠色丁香乆乆| 日本强伦片中文字幕免费看| 中文字幕 中文字幕明步| 99热这里只是精品| 狠狠操狠狠狠| 99亚洲无码| 激情九九这里只有精品| 激情五月视频在线婷婷| 狠狠色狠狠操| 九九热视频99| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 99热9| 激情久久久久久| 久久多色| www.色五月.com| 婷婷丁香五月天综合网| 色五月激情五月| 欧美成人色婷婷| 日韩成人AV在线| 天天日天天色| 亚洲五月停停| 天天舔天天摸天天射| 五月天激情综合网| 天天色播| 激情 婷婷| 人妻久久做| 日本三日本三级少妇三级66| 狠狠操狠狠插| 久久久久人妻网址| 日本精品99网站| 九九精品免费视频99| 99视频九九热| 亚洲丁香网| 99久热在线精品| 日本三级99人妇网站| 久久婷婷五月综合啪| 五月天婷婷基地丁香| 亚洲视频1区| 久久这里只有精品99| 99热这里只有精品最新网址| 欧美成人网婷婷综合在线| 日韩天堂久久| 丁香五月婷婷综合啪啪| 久久婷婷五月| 九九综合色| 性色视频| 五月开心婷婷| 玖玖综合色| 99五丁香月| 丁香六月综合激情| 国产无套精品一区二区| 五月噜噜| 一个色的综合| 五月丁香999| 亚洲在线操| 99干免费视频| 免费观看全黄做爰的视频| 另类图片天天影视在线观看| 深爱激情五月网| 婷婷深爱色五月| 99热无码精品| 亚洲激情亚洲激情| 婷婷五月av| 操碰久| 欧美丁香五月| 色色九区| 天天网曰日曰夜夜综合永久免费| 能看的av| 亚洲天天操| 日日夜夜天天| 婷婷丁香五月网| 饮料下药迷倒漂亮女同事强干| 色v综合网| 婷婷五月欧美| 中文字幕无线久必| 色婷婷色和| 婷婷综合仓库中文| 狠狠干五月| 九色视频九色九色91jiuseshipin| 天天爽天天爽| 五月天天综合| 欧美在线操| 99热爱爱干干日| 九九热在线精品| 精a品a| 五月丁香六月婷婷成人电影| 国产婷婷综合| 99爽视频| WWW.国产| 亚洲成人AV高清字幕| 丁香激情五月| 天天爽天天操| 丁香五月激情五月| 99色色| 亚洲综合99| 久久五月综合| 五月丁香婷婷综合| 丁香伍月婷电影全集| 色五月在线综合| 日本人妻操| 91大屁股精品| 99er6| 亚洲人妻一区二区| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 森林影视大全,最好看的2019年视频 | 婷婷激情综合| 五月婷婷久久综合| 国产欧洲欧洲精品久久| 在线看片av| 色色亚洲视频| 婷婷五月色花丁香社区| 亚洲AV日韩无码| 18av天堂| 99精品免费欧美小视频| 玖玖资源在线视频| 久草丁香婷婷1024| 免费人人操| 五月婷婷激情四季| 啪到高潮激情丁香五月| 五月婷婷激情| 91精品刘玥| 五月狠狠| 综合丁香婷婷五月天| 久久这里有精品视频| 91日视频| 狠狠色 综合色区| www五月天com| 婷婷涩五月天综合| 99在线观看视频| 激情综合五月| 激情四射网| 色综合xx| 色私五月婷婷| AV变态另类一区二区| 天堂色婷婷| 激情网狠狠干| 五月丁香六月婷婷久久| 丁香五月婷婷老师网站| 丁香五月激情宗合网| 亚洲五月色| 天天天天天日| 五月天堂色色| 可以直接看的av网站| 日本熟妇精品99| 久久色六月| 伊人婷婷大香蕉| 99爱视频在线播放| 人妻丰满精品一区二区A片| 综合久久六月| 色色哒五月婷婷六月丁香| 大香蕉啪啪啪| 高清国产AV| 丁香五月亚洲天堂| 亚洲激情网| 色私五月婷婷| 婷婷五月天六月| 九九热精品| 99五月婷| 五月婷婷免费| 中国丰满熟女A片免费观| 婷婷九月综合| 人人爽天天爽| 婷婷综合av| 五月婷婷综合色拍| 激情综合五| 九月丁香婷婷| 国产激情在线| 丁香五月WWW| 在线1青婷| 国产五月视频| 婷婷五月天激情偷拍| 五月天激情综合| 欧美在线看| 欧美色色色色色| 91在线观看www| 九九热短视频在线观看| 中文字幕 中文字幕明步| va中文资源在线观看| 99热国产精品| 色九月婷婷综合| 色玖玖综合网| 婷婷久久久久| 99久在线视频| 26UUU一区二区| 亚洲综合婷婷| 日日夜夜狠狠| 国产一级婬片毛片| 综合婷婷| 狠狠草狠狠草| 国产精品婷婷午夜在线观看| 丁香色影院| 久久激情五月天| 第2色五月婷| 欧美激情综合五月色丁香| 色丁香六月| AV网站免费在线| 日本99久久| 天天操,夜夜骑| 色婷婷综合综合网| 香蕉久久国产AV一区二区| 五月丁香久久呀| 伊久大香蕉| 99精品一二三四视频| 99久久精彩视频。| 国产成人精品一区二区三区视频| 99成人无码| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 五月婷婷激清网| 99超级碰碰| 五月丁香综合激情| 婷婷日日夜夜| 5月婷婷综合| 思思干精品| 色综合久久88色综合天天看| 丁香五月在线视频黑人| 亚洲婷婷基地| 99视频这里有精品| 亚洲国产成人在线| 欧美婷婷色五月网| 26uuu精品一区二区| 五月婷婷开心深| 欧美人人草草| 婷婷中文字幕| 九九干视频| 婷婷丁香五月精品| 狠狠色狠狠| 东京热五月婷婷| 久9久9久9久9久9久9| 狠狠色噜噜狠狠狠888了| 午夜九九九九九九九九九九九九九| 色噜噜97视频在线观看| 五月丁香狠狠| 超碰在线观看99| 久久婷婷五月丁香蜜桃网| 日日爽日日| 日韩欧美婷婷丁| 色激情综合狠狠婷婷| 久久婷.com| 五月丁香激情婷婷综合字幕| 无码色综合| 亚洲日韩一页精品发布| 天堂综合久| 丁香婷婷偷拍| 色愛综合网| 综合久久十三| 天天玩夜夜操| 大香蕉久久久久| 青青草婷婷综合五月| 性爱人人网| 国产乱人偷精品人妻A片| 五月婷婷亚洲色视频| 精品人妻伦| 亚洲国产成人综合| 色婷婷色和| 99热综合| 97久久久| 九色91视频| 国产在这里只有精品| 国产99精品免费视频| 午夜日日| www. 五月. com| 99ER热精品视频| 99色热视频| 日日干天天| 天天干天天射综合网| 性色人人爽| 成人在线网址| 九九av在线| 久久婷婷五月综合| 婷婷亚洲综合| 97资源欧美日韩大香蕉超碰一区| 日韩免费乱轮网站| 噜噜操操| 色你久久| 丁香五月香蕉| 色色九九五月天 | 亚洲精品亚洲人成人网| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 激情都市丁香婷婷| 俺也高清无码高清视频| 亚洲人妻五月丁香婷婷| 色五月天综合| 亚洲久久视频| 亚洲综合婷婷| 99亚洲大片精品永久在线观看| 2022久久婷婷| 日本久碰| 色婷婷色和| 蜜桃婷婷狠狠久久综合| 久久久久久9热不雅视频| 欧美成人一区二区三区在线视频 | 综合另类激情| 性爱五月婷婷| 九九热婷婷| 97五月综合网| 97九色视频| 久久久激情| 婷婷丁香色五月亚洲| 9l视频自拍9l九色成人| 玖玖资源部在线播放| 日韩草草草草草草草草草草草草| 综合大香蕉| 久久总和99| 内射综合网| 五月丁香婷婷综合在线| 亚洲激情无码久久| 天插天啪天啪天啪| 六月丁香网| 久久婷婷五月综合色奶水99啪| 第四色五月天| 五月婷婷激情综合| 久久99精品九九久久久婷婷| 99成人| 日韩综合成人| 超碰天堂网| 五月婷婷色啪| 丁香无月在线观看| 丁香综合网| 国产欧美va| 婷婷黄色| 天天日色情| 涩玖玖免费视频| WWW,激情五月天,COM| 婷婷丁香午夜综合影视| 久久婷婷色五月| 婷婷的99视频网站| 久久精品99国产精品日本| 开心五月网| 永久天堂日本| 久久综合性| 中文网av| 五月天婷婷av| 99久re热视频精品98| 婷婷日本色| 色色色国产| 婷婷丁香综合| 色色五月婷| 全部老头和老太XXXXX| 激情九月天天天天婷婷| 国内婷婷丁香社区在线播放| 五月天婷婷激情| 五月婷婷开心网| AV片在线观看| 激情com| 婷婷五月亚洲一本在线丁香| 成人精品一区日本无码网| 97操男人的天堂| 婷婷和五月天| 另类精品视频在线观看| 亚洲第一成人无码A片| 婷婷中文无码| 思思热精品在线观看| 婷婷在线视频| 大香蕉五月| 天天干狠狠操| 丁香六月婷婷久久综合| 天花AV无码| 亚洲在线激情婷婷五月| 超碰人妻在线| 日本久久9| 色色色国产| 成人片在线播放| 伊人五月综合网| 六月久久狠狠| 拍真实国产伦偷精品| 91色久| 久久激情网| 中文字幕乱码亚洲精品一区| 99热 免费| 婷婷色九月| 大香蕉久久婷婷| 五月婷婷六月奇米网丁香| 在线观看中文字幕| 成人片在线播放| 色五月婷婷老师| 综合日本婷婷| 成人九九视频| 丰满女老板BD高清A片| 狠狠色丁香五月婷巨| 五月天 婷 欧美亚洲| bukadeavzaixian| 丁香六月高清视频| www.99热视频| 超碰人人射| 五月天婷婷激情| 亚洲人妻电影| 99在线精品免费视频| 五月婷婷伊| 婷婷五月AA五月在线| 天天噜噜| 色色影院aaaav| 五月激情天| 色之综合网| 亚洲日日操| 狠狠爱婷婷爱| 97色永久免费视频| 婷婷操超碰| 激情六月丁香| 色碰碰| 丁香五月香蕉| 综合狠狠伊人| av在线中文| 人妻中文在线| 日日操日日撸| 六月丁香激情最新更新| 无码激情AAAAA片-区区| 婷婷丁香激情| 国产特黄色精品一区二区三区精品无广告| 97操在线视频| 婷婷精品| 五月婷婷激情69| 久综合4| 五月婷婷激情性爱| 色狠狠色噜噜AV天堂五区消防| 大香蕉五月天| 久久超级碰视频| 激情五月丁香五月| 亚洲美女裸体被操在线观看| 亚洲狠狠操| 欧美大片免费播放器| 丁香五月婷婷亚洲人| 99re这里| 丁香婷婷性爱| 五月丁香六月婷婷久久| 超碰超碰在线| 亚洲啪啪视频| 婷婷五月综激情| 婷婷五月婷婷| 久久久欧美精品sm网站| 丁香五月婷婷视频| 97亚洲婷婷| 欧美精品18| 免费播放片大片| 色色性爱视频| 五月婷婷www| 五月婷婷婷丁香播| 九伊人网| 九九99九九99偷拍视频免费看| 五月成人丁香av91| 五月丁香欧美综合| 狠狠色综合图片| 777久久综合视频| 激情婷婷丁香| 99久久国产宗和精品1上映| 国产美女无遮挡裸体毛片A片| 91人操| 五月天激情亚洲| 激情五月综合| 99热碰碰热| www.粉嫩av.com| 色情综合| 丁香婷婷五色月| 久草丁香婷婷1024| 九九热最新视频| 欧美精品狠狠色丁香婷婷| 激情综合网激情五月丁香| 婷婷五月综合性爱| 无码G高清天| 亚洲丁香五冃97色| 强伦轩人妻一区二区电影| 国产4P视频精品五区| 久婷| 国产色丁香| 激情综合网五月婷婷| 午夜精品777| 久久久aaa| 99热精品在线在线| 激情丁香社区| 99精品偷自拍| 狠狠干综合网| 伊人激情啪啪| 色婷婷av在线观看| 综合一本道| www.精品久9| 六月激情综合| 色五月五月丁香| 天天日日| 激情亚洲婷婷| 狠狠舔| 色色综合网www| 久久久久这里只有精品| 五月婷婷免费在线| 99精品国产乱码久久久人妻| 天天爽夜夜爽夜夜爽精品视频| 男女av免费看| 五月丁香福利| 丁香婷婷免费| 色久99| 99视频精品视频| 99热99热在线观看| 青青草原中文字幕| 亚洲国产精品SUV| 色五月婷婷一二| 第2色五月婷| 九一娱乐在线观看视频| 丁香花五月天激情| 婷婷五月噜噜| 大香蕉99| 婷婷五月丁香综合亚洲| 天天做综合网色综合| 玖玖婷婷色五月| 大香蕉久久草| 日韩成人av在线| 婷婷五月天综合久久| 99在线视频精品| 五月婷婷六月丁香首页| 99热销国产这里有精品| 超碰99热在线观看| 99丁香五月婷婷在线| 九月婷婷综合色干| 丁香花操逼| 中文字幕在线人妻| 午夜婷婷久久 | 婷婷六月爽| eeuss人妻| 南京搡BBBB搡BBBB| 天天爽天天日人人爱| 色五月婷婷五月丁香五月激情五月视频 | 天天插天天很| 五月丁香 久久久| 色婷婷五月亚洲| 开心五月丁香啪| 亚洲aV写真天天综合网久久| 激情五月丁香综合网站| 婷婷五月天六月丁香| 免费观看的av| 婷婷色五月天在线观看| 色五月激情| 欧洲MV日韩MV国产| 日韩专区五月天婷婷丁香| 五月激情久久| 中文字幕,综合,91| 人人草成人视频| 狠狠久久婷五月综合色| 色婷婷狠狠干芒果TV| 色色色.COM| 久久久久久综合88| 亚洲综合五月天婷婷丁香| 大色鬼综合| 丁香五月婷婷影院| 91啪啪视频| 久久99热这里| 丁香六月婷婷综合缴| 碰97久久| 欧美性猛交XXXX乱大交极品| 五月天婷婷综合色| 五月色婷婷影院| 丁香五月香蕉在线| 激情六月一二| 99热免费精品| 99国产在线精品视频| 嫩BBB槡BBBB搡BBBB| 婷婷五月精品| www.五月婷婷久久.com| 综合激情五月丁香9999久久精| 久久婷婷青草五月天| 久久五月网| 久久久久er热| www.夜夜| 偷拍99在线视频观看| 99热九九这里只有精品| 夜夜做天天爽| 久久久999精品| av国产精品| 影音先锋一区二区三区| 丁香色播五月天| 天天综合网91| 99热久久这里只有精品| 1024手机在线观看看片_日韩精品| 婷婷综合网性| WWW.开心五月天.COM| 成人视频在线免费播放| 五月开心播播网| 亚洲免费av观看| 超碰AAAAAAV| 99干日本| 人人操91色| 久久久久婷婷五月热综合| 九色啦蜜臀| 成人无码精品1区2区3区免费看| 久在热99| 国产婷婷色五月| 久久人妻视频| 98国产精品综合一区二区三区| 香蕉久久五月| 天天插天天狠| 婷婷成人视频| 少妇真实被内射视频三四区| 成人噜噜网| 天天激情站| 久cao香蕉影院| 色婷婷97| 91人操| 狠狠爱丁香婷| 六月亭亭久久综合激情| 99爱视频| 丁香激情五月少妇| 婷婷五月天精品| 色狠狠色噜噜AV天堂五区 | 五月综合婷婷五月| 丁香五月婷婷啪| 久久影视婷婷五月| 久久机热这里只有 | 五月丁香999| 婷婷五月综合网激情| 天天色天天爱天天爽| 99无码视频| 久久久人妻久久久| 91成人看片| www.综合久久.com| 狠色狠色综合久久| 久久婷婷五月综合色欧美| 欧美伊人9| 欧洲色色| 国产精品美女| 久久99热这里只有精品| 丁香六月成人网| 六月丁香好婷婷| 婷婷丁香五月天激情四射| 五月婷婷伦理| 精品一二三区久久AAA片 | 五月婷婷激情四月| 亚洲亚洲人成综合网络| 99色啊| 婷婷五月激情小说| 六月丁婷婷| 五月激情天| 激情五月婷婷欧美极品| 五月婷婷综合激情网| 操操人人| 日本三级韩三级99久久| 99欧美| 婷婷综合网站| 在线国产精品色| 欧美丰满熟妇BBB久久久| 婷婷五月天最新综合你懂的| 五月丁香六月婷综合成人综合| 97久久精品视频| 狠狠人人婷婷| 99久热精品在线| 丁香婷婷性爱| 丁香五月 综合| 亚洲综合激情五月久久| 国产精品蜜臀99| 97在线99| 99久在线精品99re8| 九月婷婷综合在线| www.婷婷六月天| 狼人久草| 亚洲愉拍99热成人精品| 伊人五月天在线| 狠狠色丁香久久| 91日本在线观看| 色宗合,宗合网| 久草视频大香蕉99| 五月激情在线| 天天综合色丁香| 婷婷九月| 色婷婷狠狠久久综合五月| 光棍影院日韩精品| 婷婷的99视频网站| 日 日干 日日做| 曰本久久女| 丁香五月婷婷亚洲综合精品| 激情综合久久| 99久久欧美| 五月婷婷久久综合| 天天日天天摸天天| 五月丁香人妻| 99热超碰| 丁香五月婷婷色| 开心五月婷婷婷美女| 无码少妇高潮喷水A片免费| 99色免费观看全部| 色婷婷av在线| 婷婷激情五月呦呦| 五月婷婷色播| www,色中色| 午夜福利8055| 少妇高潮A片无套内谢麻豆传| 嫩草综合网| 伊综合蕉| 性一交一乱一交A片久久四色| 激情综合五月| 日本三级第一页| 久久与婷婷| 色婷婷五月综合在线| 香蕉99网| 九九AV| 激情丁香九九五月综合网| 五月丁香六月婷婷,婷| 伊人久久大香线蕉综合网站| 五月天色丁香| 99热| 五月天深爱激情网| 五月婷婷免费在线| 殴美日韩成人| 亚洲成av人影院| 大香网伊人久久综合| 色五月丁香五月激情五月激情| 欧美顶级少妇做爰HD| 五月丁香欧美综合| 丁香五月激情六月综合| 色色色色色热| 超级碰91| 丁香六月成人| 免费观看18视频网站| 综合激情视频| 色欲香综合网| 超碰在线成人| 97婷婷久久丁香| 99亚洲精品综合在线| 97人人操人人干| 日本天天操| 精品五月天| 五月天成人在线视频丁香| 在线日韩视频| 亚洲成人av在线播放| 无码人妻一区二区一牛影视| 亚洲日本韩国| 亚洲热综合| 五月丁香六月香香蕉| 停停五月丁香| 色欲AV导航| 婷婷丁香五月亚洲综合网在线视频观看| 五月开心啪啪| 欧美一级毛卡片无码| 五月激情综合网| 亚洲色综合| av在线资源| 亚洲色啪| 欧美一级色| 99ri视频在线播放| 丁香五月天电影| 色欲一二三| 五月综合色播播丁香婷婷| 九九热短视频在线观看| 综合玖玖性爱免费视频| 国产资源在线视频| 99超超碰| 少妇人妻人伦A片| 丁香六月婷婷久久综合| 色综合色综合网| 天天拍天天操| 婷婷久久精品| 狠狠色噜噜狠狠狠888| 色五月婷婷很很操| 色色色热| 草综合14| 亚洲免费99| 久久久精品人妻录| 久久偷拍综合五月天| 五月丁香六月婷婷姐| 日日综合网| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 大香蕉欧美在线| 天天日天天摸| www999日韩精品| 久久六月综合| 思思热视频在线观看| 亚洲激情av| 五月天色色无码| 97超碰,人人舔,人人操,人人摸| 99精品在线播放| 亚洲久热| 97在线观视频免费观看| 99re资源在线视频导航| 色色综合网。| 97色色婷婷五月天| 丁香五婷婷| 久久9RE热视频精品98| 色www.con| 色99在线看| 五月丁香婷婷色| 奇米四色五月天| 午夜爱爱网站| 综合激情开心五月| 成人久久天天x资源站| www色中色综合| 五月激情综合网| 婷婷无码视频| 久久久99精品免费观看| www.lchjjc.com| 婷婷月综合| 深爱网深爱综合网| 五月丁香花激情综合网| 丁香五月天.com| 中文字幕人妻熟女在线| 九月丁香八月婷婷加勒比| 日本人人干| 狠狠五月天婷婷| 综合激情网激情五月。| 五月色色网| 亚洲精品又粗又大又爽A片| 99色嘟嘟精品网站| 91成人视频| 婷婷成人AV| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 欧美内射AAAAAAXXXXX| 高清资源站日A美A欧亚…| 激情 婷婷| 男人天堂亚洲综合| 99热这里只有精品国产精品| 色综合久久久久| 亚洲欧美成人在线| 90色免费视频| 狠狠爱综合网| 青青草六月丁香| 亚洲高清在线| 亚洲综合碰| av在线资源| 99九九精品| 五月丁香啪| 综合玖玖偷拍| 日本天天综合| 婷婷久久五月天丁香| 丁香婷婷综合激情五月色| 九九热99熟女| 国产乱妇乱子伦| 久久曰曰| 色婷婷香蕉丁丁网| 日韩按摩二区| 色婷婷中文在线| av人人操| 激情www.98com| 亚州操操| 99精彩视频在线观看| 色色影院aaaav| 色婷久久| 亚洲韩国日产综合AV| 成人片久久网站| 色五月五月天色婷婷色五月| 欧美性爱丁香五月| 丁香五月AV综合| 婷婷在线播放| 色吊丝av中文字幕| 五月婷婷九| 婷婷深爱五月天| 99re在线视频| 激情五月天社区| 538在线精品| 噜综合| 啪啪啪大香蕉| 97碰操| 激情狠狠丁香月| 亚洲综合视频在线| 五月天激情丁香| 免费无码毛片一区二区A片 | 99在线观看精品| 婷婷丁香综合| 曰韩五月丁香色婷婷无码| 美臀自射自家人妻| 久九色| 日本综合色色| 在线婷婷| 日韩久综合| 99热亚洲| 91超级碰在线| 99国产这里只有精品| 久99在线| 五月天久久丁香| 人妻熟妇国产精品| 五月丁香婷婷综合久久| 色色丁香五月天| 天天操无码| 丁香五月开心亚洲| 99视频九九热| 大香蕉久艹| 久99热在线观看| 色99在线观看| 91久操| 99热国产精品| 色婷婷影视| 超碰在线91| 99热这里只有精品13| 中文字幕日产A片在线看| 五月激情网五月综合网|