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

ARTICLE DETAIL

資訊詳情

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

SpringBoot物流寄件發(fā)貨管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

SpringBoot物流寄件發(fā)貨管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 做物流寄件發(fā)貨管理系統(tǒng)這個(gè)題目大部分人第一反應(yīng)是“不就是個(gè)增刪改查嗎”但真正動(dòng)手才發(fā)現(xiàn)從下單、派單到運(yùn)費(fèi)計(jì)算、軌跡回傳每一步都有藏著細(xì)節(jié)的坑。尤其是用SpringBoot搭這種多角色、多狀態(tài)的業(yè)務(wù)系統(tǒng)框架本身不難難的是業(yè)務(wù)流程怎么落地成表結(jié)構(gòu)和接口設(shè)計(jì)。這篇文章我會(huì)把整個(gè)系統(tǒng)的設(shè)計(jì)思路、核心模塊拆解、關(guān)鍵代碼實(shí)現(xiàn)和實(shí)際開發(fā)中遇到的坑一次講清楚基本都是可以直接抄作業(yè)的級(jí)別適合正在做畢業(yè)設(shè)計(jì)、或者公司內(nèi)部要快速搭一套寄件管理后臺(tái)的同學(xué)參考。1. 需求梳理與整體架構(gòu)設(shè)計(jì)1.1 業(yè)務(wù)角色與核心流程拆解物流寄件發(fā)貨管理系統(tǒng)本質(zhì)上是個(gè)多角色協(xié)作平臺(tái)光“下單”這一個(gè)動(dòng)作背后就牽扯到用戶、快遞員、網(wǎng)點(diǎn)管理員、系統(tǒng)管理員四類角色。我在設(shè)計(jì)的時(shí)候先把完整業(yè)務(wù)鏈路畫了一遍用戶提交寄件申請(qǐng) → 系統(tǒng)根據(jù)地址和重量計(jì)算運(yùn)費(fèi) → 快遞員接單攬收 → 包裹進(jìn)入運(yùn)輸節(jié)點(diǎn) → 簽收完成。每個(gè)環(huán)節(jié)都會(huì)改變訂單狀態(tài)所以第一步不是寫代碼而是把這張狀態(tài)流轉(zhuǎn)圖理清楚。系統(tǒng)最終劃分為六大模塊用戶管理、寄件下單、訂單管理、快遞員任務(wù)、運(yùn)費(fèi)管理、數(shù)據(jù)統(tǒng)計(jì)。用戶端負(fù)責(zé)維護(hù)地址簿和下單快遞員端負(fù)責(zé)接單和更新運(yùn)輸狀態(tài)管理后臺(tái)則處理人員分配、價(jià)格策略和異常訂單。每個(gè)模塊之間通過訂單ID這條主線關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)上要求訂單表能串聯(lián)起所有業(yè)務(wù)動(dòng)作。做這類系統(tǒng)最忌諱一上來就建表我建議先用文字把每個(gè)角色的操作場(chǎng)景列出來再從中提取實(shí)體和關(guān)系。比如“用戶下單”這個(gè)場(chǎng)景就能提取出用戶表、地址表、訂單表“快遞員攬收”會(huì)提取出快遞員表、攬收記錄表以及訂單表里的分配字段。角色明確、場(chǎng)景清晰表結(jié)構(gòu)自然就浮出來了。1.2 SpringBoot 在中小型管理系統(tǒng)中的技術(shù)選型邏輯選擇SpringBoot作為基礎(chǔ)框架不是因?yàn)楦L(fēng)而是它確實(shí)適合這種業(yè)務(wù)密集型系統(tǒng)。物流寄件系統(tǒng)的核心訴求是快速開發(fā)、穩(wěn)定運(yùn)行、易于維護(hù)SpringBoot的自動(dòng)裝配機(jī)制把大量繁瑣的配置工作消化掉了一個(gè)starter就能搞定數(shù)據(jù)源連接不用像傳統(tǒng)SSH那樣寫一堆XML配置文件。具體技術(shù)棧我用了SpringBoot 2.7.18 MyBatis-Plus MySQL 8.0 Redis Vue 3這套組合在今天看來依然是比較穩(wěn)的選擇。MyBatis-Plus讓單表CRUD完全不用寫SQL復(fù)雜的多表統(tǒng)計(jì)查詢?cè)偈謱慩ML開發(fā)效率很高。Redis主要用來存登錄token和快遞員地理位置緩存雖然小項(xiàng)目里也可以用JWT自校驗(yàn)代替但有了Redis做集中管理后續(xù)做會(huì)話踢出、在線狀態(tài)展示都很方便。安全認(rèn)證這塊用的是Spring Security JWT這個(gè)組合既能滿足接口鑒權(quán)需求又能保持服務(wù)無狀態(tài)方便后續(xù)擴(kuò)展成前后端分離架構(gòu)。文件上傳用的本地存儲(chǔ)因?yàn)檫@類系統(tǒng)的運(yùn)單照片、身份證照片量級(jí)不大沒必要一開始就接OSS或者M(jìn)inIO等真正跑起來了再換不遲。2. 數(shù)據(jù)庫設(shè)計(jì)與核心模塊實(shí)現(xiàn)2.1 訂單主表設(shè)計(jì)狀態(tài)字段是靈魂訂單表是整個(gè)系統(tǒng)的心臟我在設(shè)計(jì)時(shí)分了三個(gè)層次訂單主表存基礎(chǔ)信息和當(dāng)前狀態(tài)訂單狀態(tài)履歷表存每一次狀態(tài)變更的日志訂單擴(kuò)展表存不同快遞類型普通件、生鮮件、大件的個(gè)性化字段。三表通過order_id關(guān)聯(lián)既保證了主表查詢效率又保留了業(yè)務(wù)擴(kuò)展空間。CREATE TABLE order_info ( id bigint NOT NULL AUTO_INCREMENT, order_no varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT 訂單編號(hào), user_id bigint NOT NULL COMMENT 下單用戶ID, sender_name varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 寄件人姓名, sender_phone varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT 寄件人電話, sender_address varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT 寄件地址, receiver_name varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 收件人姓名, receiver_phone varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT 收件人電話, receiver_address varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT 收件地址, goods_name varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 物品名稱, goods_weight decimal(10,2) DEFAULT NULL COMMENT 物品重量(kg), freight decimal(10,2) NOT NULL COMMENT 運(yùn)費(fèi)金額, status tinyint NOT NULL DEFAULT 0 COMMENT 訂單狀態(tài):0待支付,1待攬收,2已攬收,3運(yùn)輸中,4已簽收,5已取消, courier_id bigint DEFAULT NULL COMMENT 接單快遞員ID, create_time datetime NOT NULL, update_time datetime NOT NULL, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_courier_id (courier_id), KEY idx_status (status), KEY idx_order_no (order_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT寄件訂單表;狀態(tài)字段我用了tinyint而不是字符串原因很簡(jiǎn)單查詢快、存儲(chǔ)小、排序方便。0到5的數(shù)字代表不同狀態(tài)在代碼里維護(hù)一個(gè)枚舉類做映射可讀性完全夠用。關(guān)鍵索引要覆蓋查詢場(chǎng)景用戶查自己的訂單列表走idx_user_id快遞員查待接單列表走idx_status后臺(tái)按快遞員查派單記錄走idx_courier_id這些索引加完后基本能保證所有查詢都在毫秒級(jí)返回。2.2 地址簿與常用寄件人管理地址簿是提升用戶體驗(yàn)的重要模塊用戶下單時(shí)不用每次重新輸入地址直接從地址簿選擇即可。我設(shè)計(jì)了獨(dú)立的address_book表存用戶ID、聯(lián)系人姓名、電話、省市區(qū)編碼、詳細(xì)地址、地址標(biāo)簽家/公司/其他、是否默認(rèn)地址。這里有個(gè)細(xì)節(jié)刪除地址時(shí)不能物理刪除要用邏輯刪除標(biāo)記因?yàn)闅v史訂單里可能引用過這個(gè)地址真刪了會(huì)讓訂單信息不完整。Service public class AddressBookServiceImpl extends ServiceImplAddressBookMapper, AddressBook implements AddressBookService { Override public boolean saveAddress(AddressBook addressBook) { if (Boolean.TRUE.equals(addressBook.getIsDefault())) { // 如果設(shè)置當(dāng)前地址為默認(rèn)先把該用戶其他地址的默認(rèn)標(biāo)記取消 LambdaUpdateWrapperAddressBook updateWrapper new LambdaUpdateWrapper(); updateWrapper.eq(AddressBook::getUserId, addressBook.getUserId()) .set(AddressBook::getIsDefault, false); this.update(updateWrapper); } return this.save(addressBook); } }這段代碼解決了一個(gè)很容易被忽略的業(yè)務(wù)規(guī)則同一個(gè)用戶只能有一個(gè)默認(rèn)地址。每次設(shè)置新的默認(rèn)地址時(shí)必須先把舊的默認(rèn)標(biāo)記清零。如果忘了這步用戶每次下單都會(huì)彈出兩個(gè)默認(rèn)地址非常影響體驗(yàn)。2.3 運(yùn)費(fèi)計(jì)算引擎按地區(qū)階梯定價(jià)運(yùn)費(fèi)計(jì)算是業(yè)務(wù)核心中的核心不能寫死在業(yè)務(wù)代碼里。我在設(shè)計(jì)時(shí)將運(yùn)費(fèi)策略分成三個(gè)維度基礎(chǔ)運(yùn)費(fèi)首重價(jià)格、續(xù)重單價(jià)、偏遠(yuǎn)地區(qū)附加費(fèi)。每個(gè)維度都做成可配置的數(shù)據(jù)庫表管理員可以在后臺(tái)調(diào)整不需要改代碼重新部署。實(shí)現(xiàn)思路也很直接先根據(jù)收件地址的省份和城市在運(yùn)費(fèi)配置表中查出對(duì)應(yīng)的地區(qū)規(guī)則再根據(jù)商品重量套用首重續(xù)重公式總運(yùn)費(fèi) 首重價(jià)格 ceil((重量 - 首重)/續(xù)重單位) * 續(xù)重單價(jià)最后判斷是否屬于偏遠(yuǎn)地區(qū)是則加上附加費(fèi)。整個(gè)過程用策略模式封裝后續(xù)如果接入不同快遞公司的計(jì)價(jià)規(guī)則只需新增一個(gè)實(shí)現(xiàn)類即可。public class FreightCalculator { private static final double FIRST_WEIGHT 1.0; public static BigDecimal calculate(BigDecimal weight, FreightRule rule) { if (weight.compareTo(BigDecimal.ZERO) 0) { throw new BusinessException(重量必須大于0); } BigDecimal firstPrice rule.getFirstPrice(); BigDecimal additionalPrice rule.getAdditionalPrice(); // 首重1kg內(nèi)按首重價(jià)格超出部分按續(xù)重單價(jià)計(jì)算 if (weight.compareTo(BigDecimal.valueOf(FIRST_WEIGHT)) 0) { return firstPrice; } double additionalWeight Math.ceil(weight.doubleValue() - FIRST_WEIGHT); BigDecimal freight firstPrice.add(BigDecimal.valueOf(additionalWeight).multiply(additionalPrice)); // 判斷是否加偏遠(yuǎn)地區(qū)附加費(fèi) if (Boolean.TRUE.equals(rule.getIsRemote())) { freight freight.add(rule.getRemoteFee()); } return freight.setScale(2, RoundingMode.HALF_UP); } }重量向上取整是整個(gè)計(jì)算的關(guān)鍵2.1kg按3kg算這是物流行業(yè)通行的計(jì)費(fèi)規(guī)則不能四舍五入。我見過有同事在這個(gè)地方用BigDecimal的setScale做四舍五入結(jié)果每單少收幾毛錢月底對(duì)賬怎么都對(duì)不上。另外價(jià)格計(jì)算一定要用BigDecimaldouble直接算錢會(huì)出大問題。3. 核心接口與業(yè)務(wù)邏輯實(shí)現(xiàn)3.1 下單流程事務(wù)與唯一編號(hào)生成用戶下單接口是調(diào)用頻率最高的接口也是并發(fā)壓力最大的點(diǎn)設(shè)計(jì)得不好容易產(chǎn)生重復(fù)訂單和超賣問題。我實(shí)現(xiàn)下單接口時(shí)做了三件事生成唯一訂單編號(hào)、計(jì)算運(yùn)費(fèi)、保存訂單和預(yù)扣庫存。訂單編號(hào)規(guī)則是日期隨機(jī)數(shù)自增序列用Redis的INCR命令生成序列部分確保高并發(fā)下不會(huì)重復(fù)。Transactional(rollbackFor Exception.class) public OrderVO createOrder(OrderCreateDTO dto) { // 1. 生成訂單編號(hào) yyyyMMdd 6位自增 String datePrefix LocalDate.now().format(DateTimeFormatter.ofPattern(yyyyMMdd)); Long seq redisTemplate.opsForValue().increment(order:seq: datePrefix); String orderNo datePrefix String.format(%06d, seq); // 2. 查詢運(yùn)費(fèi)規(guī)則并計(jì)算運(yùn)費(fèi) FreightRule rule freightRuleMapper.selectByRegion(dto.getReceiverProvince(), dto.getReceiverCity()); BigDecimal freight FreightCalculator.calculate(dto.getGoodsWeight(), rule); // 3. 構(gòu)建訂單實(shí)體并保存 OrderInfo order new OrderInfo(); BeanUtils.copyProperties(dto, order); order.setOrderNo(orderNo); order.setFreight(freight); order.setStatus(OrderStatusEnum.PENDING_PAYMENT.getCode()); orderInfoMapper.insert(order); // 4. 記錄狀態(tài)履歷 orderStatusLogMapper.insert(new OrderStatusLog(order.getId(), order.getStatus(), 用戶提交訂單)); return OrderVO.fromEntity(order); }Transactional注解在高并發(fā)場(chǎng)景下有一個(gè)需要特別注意的點(diǎn)聲明式事務(wù)默認(rèn)只在拋出RuntimeException時(shí)回滾如果方法里catch住了異常但不往外拋事務(wù)是不會(huì)回滾的。我習(xí)慣把rollbackFor設(shè)置為Exception.class讓所有異常都觸發(fā)回滾防止臟數(shù)據(jù)落庫。至于為什么用Redis生成訂單號(hào)而不是數(shù)據(jù)庫自增ID原因是訂單號(hào)要暴露給用戶不能讓別人通過訂單號(hào)猜測(cè)出平臺(tái)一天有多少單。自增ID在分布式環(huán)境下也會(huì)出現(xiàn)沖突Redis的INCR命令單線程原子性無論多少并發(fā)請(qǐng)求拿到的序列號(hào)都不會(huì)重復(fù)。3.2 快遞員接單樂觀鎖防超賣快遞員接單接口是并發(fā)沖突的重災(zāi)區(qū)同一個(gè)訂單如果被兩個(gè)快遞員同時(shí)點(diǎn)擊接單處理不好就會(huì)產(chǎn)生雙重指派。常規(guī)做法是先查訂單狀態(tài)再更新但這在并發(fā)下會(huì)出問題。我用的方案是樂觀鎖更新時(shí)帶上狀態(tài)條件如果影響行數(shù)為0說明有人搶先了直接返回“訂單已被接單”。Transactional(rollbackFor Exception.class) public boolean acceptOrder(Long orderId, Long courierId) { // 指定status1待攬收作為條件只有狀態(tài)匹配才能更新成功 int updateCount orderInfoMapper.update(null, new LambdaUpdateWrapperOrderInfo() .eq(OrderInfo::getId, orderId) .eq(OrderInfo::getStatus, OrderStatusEnum.PENDING_PICKUP.getCode()) .set(OrderInfo::getCourierId, courierId) .set(OrderInfo::getStatus, OrderStatusEnum.PICKED_UP.getCode())); if (updateCount 0) { throw new BusinessException(手慢了訂單已被其他快遞員接走); } return true; }用UPDATE...WHERE status1這種方式數(shù)據(jù)庫行鎖天然保證了同一時(shí)刻只有一個(gè)事務(wù)能更新成功邏輯既簡(jiǎn)單又可靠。我以前用過先SELECT再UPDATE的方式壓測(cè)時(shí)100個(gè)并發(fā)請(qǐng)求里有3個(gè)會(huì)產(chǎn)生重復(fù)指派后來換成條件更新后這個(gè)問題徹底消失了。核心思想就是不要把判斷和操作分成兩步要讓數(shù)據(jù)庫在原子操作里完成校驗(yàn)。同時(shí)狀態(tài)機(jī)里的每一個(gè)分支都是類似的寫法狀態(tài)變更、記錄履歷、附帶業(yè)務(wù)動(dòng)作。比如“攬收”動(dòng)作會(huì)記錄攬收人、攬收時(shí)間“運(yùn)輸中”動(dòng)作會(huì)更新當(dāng)前節(jié)點(diǎn)編碼。這些節(jié)點(diǎn)信息合起來就形成了用戶端看到的物流軌跡。3.3 物流軌跡狀態(tài)履歷與Node節(jié)點(diǎn)物流軌跡模塊一開始我只設(shè)計(jì)了一張訂單狀態(tài)履歷表但后來發(fā)現(xiàn)不夠用——用戶需要看到的是“包裹已到達(dá)【杭州轉(zhuǎn)運(yùn)中心】”這種帶節(jié)點(diǎn)的信息而不只是“運(yùn)輸中”三個(gè)字。所以我增加了transport_node表專門記錄包裹每次經(jīng)過的節(jié)點(diǎn)編碼和描述。快遞員每更新一次節(jié)點(diǎn)系統(tǒng)就會(huì)同時(shí)寫入兩條記錄一條進(jìn)狀態(tài)履歷表一條進(jìn)節(jié)點(diǎn)表。查詢用戶的物流軌跡時(shí)把這兩個(gè)表的數(shù)據(jù)按時(shí)間合并展示就能拼出完整的路徑。這里需要注意的是節(jié)點(diǎn)表的數(shù)據(jù)量會(huì)持續(xù)增長我做了按訂單號(hào)分表的預(yù)留設(shè)計(jì)目前單表查詢用order_id加索引響應(yīng)時(shí)間穩(wěn)定在幾十毫秒內(nèi)。3.4 角色權(quán)限JWT Spring Security 的輕量級(jí)實(shí)現(xiàn)管理系統(tǒng)的權(quán)限模型一般分三到四級(jí)我這邊是管理員、網(wǎng)點(diǎn)經(jīng)理、快遞員、用戶四種角色。由于是單體應(yīng)用沒有引入Spring Security OAuth2這種重框架只用Spring Security JWT就足夠了。核心思路是登錄成功后簽發(fā)JWTJWT里帶上用戶ID和角色編碼請(qǐng)求攔截器解析Token后把用戶信息放入ThreadLocal接口通過自定義注解校驗(yàn)角色。Component public class JwtAuthenticationFilter extends OncePerRequestFilter { Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String token request.getHeader(Authorization); if (StringUtils.hasText(token) token.startsWith(Bearer )) { token token.substring(7); try { Claims claims JwtUtil.parseToken(token); Long userId claims.get(userId, Long.class); String role claims.get(role, String.class); // 存入上下文業(yè)務(wù)代碼直接獲取當(dāng)前登錄用戶 UserContext.set(userId, role); } catch (Exception e) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return; } } chain.doFilter(request, response); } }這里有一個(gè)細(xì)節(jié)值得說JWT天然無狀態(tài)但如果用戶修改了密碼或者被管理員封禁已簽發(fā)的Token依然是有效的。要解決這個(gè)問題簽發(fā)Token時(shí)可以順便把Token版本號(hào)存到Redis每次請(qǐng)求都校驗(yàn)一次版本。代價(jià)是多一次Redis查詢但對(duì)于即時(shí)生效的賬號(hào)封禁場(chǎng)景非常值得。4. 管理后臺(tái)與數(shù)據(jù)看板4.1 商品分類與價(jià)格規(guī)則管理后臺(tái)核心功能之一是維護(hù)運(yùn)費(fèi)規(guī)則表。我實(shí)現(xiàn)了運(yùn)費(fèi)規(guī)則的可視化配置界面管理員可以按照省份、城市、首重價(jià)格、續(xù)重單價(jià)、偏遠(yuǎn)地區(qū)標(biāo)記、生效時(shí)間六個(gè)維度維護(hù)策略。規(guī)則表設(shè)計(jì)為支持多版本修改規(guī)則時(shí)新數(shù)據(jù)默認(rèn)從次日起生效歷史訂單查詢時(shí)仍用下單時(shí)的規(guī)則快照保證對(duì)賬數(shù)據(jù)準(zhǔn)確。CREATE TABLE freight_rule ( id bigint NOT NULL AUTO_INCREMENT, province varchar(50) NOT NULL COMMENT 省份, city varchar(50) DEFAULT NULL COMMENT 城市, first_weight decimal(4,2) NOT NULL DEFAULT 1.00 COMMENT 首重重量(kg), first_price decimal(10,2) NOT NULL COMMENT 首重價(jià)格(元), additional_unit decimal(4,2) NOT NULL DEFAULT 1.00 COMMENT 續(xù)重單位(kg), additional_price decimal(10,2) NOT NULL COMMENT 續(xù)重單價(jià)(元/kg), is_remote tinyint(1) NOT NULL DEFAULT 0 COMMENT 是否偏遠(yuǎn)地區(qū), remote_fee decimal(10,2) DEFAULT 0.00 COMMENT 偏遠(yuǎn)地區(qū)附加費(fèi)(元), effective_date date NOT NULL COMMENT 生效日期, create_time datetime NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT運(yùn)費(fèi)規(guī)則表;運(yùn)費(fèi)規(guī)則配置完成后后臺(tái)還要能模擬算價(jià)。我在管理端加了一個(gè)“試算運(yùn)費(fèi)”功能輸入省份和重量立刻返回運(yùn)費(fèi)方便運(yùn)營人員快速核對(duì)計(jì)算結(jié)果是否正確。這個(gè)功能不到一百行代碼但極大減輕了測(cè)試負(fù)擔(dān)每次調(diào)整價(jià)格策略后鼠標(biāo)點(diǎn)幾下就能完成驗(yàn)證。4.2 數(shù)據(jù)看板訂單趨勢(shì)與收入統(tǒng)計(jì)數(shù)據(jù)看板是管理者每天打開系統(tǒng)的第一屏我設(shè)計(jì)了三個(gè)核心指標(biāo)卡今日訂單量、今日營收、待處理異常件數(shù)。下面配兩張趨勢(shì)圖一張是近7天訂單量折線圖一張是不同快遞類型訂單占比餅圖。這些統(tǒng)計(jì)數(shù)據(jù)不需要實(shí)時(shí)計(jì)算我用定時(shí)任務(wù)每5分鐘聚合一次把結(jié)果寫入統(tǒng)計(jì)表查詢時(shí)直接返回緩存數(shù)據(jù)大幅降低數(shù)據(jù)庫壓力。Component public class OrderStatisticsTask { Scheduled(cron 0 */5 * * * ?) public void aggregate() { // 1. 查最近7天每天的訂單量和營收 ListMapString, Object list orderInfoMapper.selectDailyStats( LocalDate.now().minusDays(6), LocalDate.now()); // 2. 寫入統(tǒng)計(jì)表已存在則更新 for (MapString, Object item : list) { String date String.valueOf(item.get(stat_date)); Integer orderCount ((Number) item.get(order_count)).intValue(); BigDecimal amount (BigDecimal) item.get(total_amount); dailyStatsMapper.insertOrUpdate(date, orderCount, amount); } } }定時(shí)任務(wù)用Spring自帶的Scheduled就能搞定不需要額外引入XXL-Job這種重框架。但要注意定時(shí)任務(wù)默認(rèn)是單線程串行執(zhí)行的如果有多個(gè)任務(wù)要分開配置線程池。我在項(xiàng)目里專門定義了一個(gè)ScheduledConfig類把線程池核心線程數(shù)設(shè)為5避免一個(gè)耗時(shí)任務(wù)拖慢其他任務(wù)。4.3 異常訂單處理機(jī)制線上跑了一段時(shí)間后發(fā)現(xiàn)訂單流程總會(huì)出現(xiàn)各種異常情況用戶支付成功但快遞員一直不接單、包裹在途中超48小時(shí)沒有節(jié)點(diǎn)更新、用戶發(fā)貨前取消訂單但運(yùn)費(fèi)已扣。針對(duì)這些場(chǎng)景我給后臺(tái)增加了一個(gè)異常訂單管理頁面按異常類型分類展示運(yùn)營人員可以直接在頁面上做退款、改派、標(biāo)記丟失等操作。這里最重要的是退款操作和財(cái)務(wù)記錄的聯(lián)動(dòng)。每次退款都要生成一條財(cái)務(wù)流水字段包括訂單號(hào)、退款金額、退款原因、操作人、時(shí)間。這樣一來后續(xù)對(duì)賬時(shí)所有資金變動(dòng)都有據(jù)可查。我在財(cái)務(wù)流水表上加了唯一索引order_id, type防止運(yùn)營人員手滑重復(fù)退款。5. 系統(tǒng)優(yōu)化與部署實(shí)戰(zhàn)5.1 數(shù)據(jù)庫層面優(yōu)化索引與SQL執(zhí)行計(jì)劃系統(tǒng)上線不久訂單列表查詢?cè)絹碓铰绕涫呛笈_(tái)按用戶ID時(shí)間范圍狀態(tài)組合篩選時(shí)響應(yīng)時(shí)間一度超過3秒。我通過EXPLAIN命令分析執(zhí)行計(jì)劃發(fā)現(xiàn)主要問題有兩個(gè)一是查詢條件里用了函數(shù)如DATE_FORMAT(create_time)導(dǎo)致索引失效二是排序字段沒有索引導(dǎo)致文件排序。優(yōu)化的具體操作把create_time條件改成等值或范圍查詢直接傳日期對(duì)象讓MyBatis-Plus生成format參數(shù)避免在SQL里對(duì)字段套函數(shù)然后給組合查詢場(chǎng)景添加聯(lián)合索引(create_time, status, user_id)最后把分頁查詢的結(jié)果總數(shù)COUNT語句單獨(dú)優(yōu)化去掉不必要的JOIN。優(yōu)化后同樣的查詢響應(yīng)時(shí)間降到200毫秒以內(nèi)。5.2 Redis緩存策略熱點(diǎn)數(shù)據(jù)與防穿透用戶端的首頁會(huì)展示運(yùn)費(fèi)價(jià)格表、常見問題、公告信息這些數(shù)據(jù)變化頻率極低但訪問量大是典型的緩存場(chǎng)景。我用Redis做了兩級(jí)緩存策略第一級(jí)HashMap本地緩存用于單機(jī)環(huán)境快速返回第二級(jí)Redis緩存用于多實(shí)例共享。數(shù)據(jù)更新時(shí)主動(dòng)刪除緩存下次請(qǐng)求自動(dòng)回源數(shù)據(jù)庫并重建緩存。另一個(gè)要防的是緩存穿透惡意請(qǐng)求反復(fù)用一個(gè)不存在的訂單號(hào)查詢數(shù)據(jù)庫每次都會(huì)命中空結(jié)果。解決辦法是用空值緩存查詢結(jié)果為null時(shí)也寫入Redis過期時(shí)間設(shè)置為3分鐘。此外在接口入?yún)幼隽嘶A(chǔ)校驗(yàn)訂單號(hào)必須符合日期數(shù)字的格式規(guī)范不合法直接拒絕。5.3 本地Docker Desktop部署與容器化項(xiàng)目完成后部署到服務(wù)器前我在本地先用Docker Desktop跑了一遍全流程。這里說一個(gè)自己在實(shí)踐中摸索出的經(jīng)驗(yàn)SpringBoot項(xiàng)目用JDK 1.8打包成Docker鏡像時(shí)基礎(chǔ)的openjdk:8鏡像體積偏大建議直接用帶Alpine版本的。Dockerfile我寫成了多階段構(gòu)建先Maven打包再拷貝到運(yùn)行鏡像整個(gè)鏡像控制在250MB以內(nèi)。# 構(gòu)建階段 FROM maven:3.8-openjdk-8 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline -B COPY src ./src RUN mvn package -DskipTests # 運(yùn)行階段 FROM openjdk:8-jre-alpine WORKDIR /app COPY --frombuilder /app/target/logistics-system.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar, --spring.profiles.activeprod]MySQL和Redis同樣用Docker容器運(yùn)行我專門寫了一個(gè)docker-compose.yml把三個(gè)服務(wù)編排在一起。data目錄掛載到宿主機(jī)保證容器重啟數(shù)據(jù)庫不丟這點(diǎn)非常關(guān)鍵——我有一次圖省事沒掛載Docker一更新整個(gè)庫都沒了教訓(xùn)深刻。上線前再檢查一遍環(huán)境和數(shù)據(jù)卷掛載測(cè)試環(huán)境跑幾天確保穩(wěn)定后切生產(chǎn)。5.4 配置文件管理與多環(huán)境切換項(xiàng)目從開發(fā)到測(cè)試再到生產(chǎn)三套環(huán)境的配置肯定不一樣。我用的方案是SpringBoot的Profile多環(huán)境配置application.yml里只放公共配置application-dev.yml、application-test.yml、application-prod.yml分別存放各自環(huán)境的數(shù)據(jù)庫地址、Redis地址、日志級(jí)別等。啟動(dòng)時(shí)通過--spring.profiles.active參數(shù)指定跑哪套配置。數(shù)據(jù)庫密碼這類敏感信息我沒有明文寫在配置文件里用了Jasypt做加密。配置項(xiàng)寫成ENC(加密串)的形式應(yīng)用啟動(dòng)時(shí)自動(dòng)解密。這樣即使配置文件泄露了別人也拿不到明文密碼。Jasypt集成SpringBoot很簡(jiǎn)單加依賴、改配置、用工具類加密原始密碼三步搞定。6. 踩坑記錄與開發(fā)工具推薦6.1 常見問題速查表與解決思路開發(fā)過程中我整理了一份問題排查清單都是自己碰到過且有明確解決辦法的。最典型的是循環(huán)依賴問題訂單服務(wù)和快遞員服務(wù)互相調(diào)用導(dǎo)致啟動(dòng)直接報(bào)錯(cuò)。解決辦法不是加Lazy注解糊弄過去而是從設(shè)計(jì)層面把公共邏輯抽出來放到獨(dú)立的Service里打破依賴環(huán)。問題現(xiàn)象根本原因解決方案訂單狀態(tài)更新丟失并發(fā)更新未加版本號(hào)或狀態(tài)條件UPDATE使用WHERE status預(yù)期值金額對(duì)賬不平double計(jì)算精度丟失全部改成BigDecimal計(jì)算緩存穿透導(dǎo)致DB壓力大查詢不存在的數(shù)據(jù)反復(fù)打庫空值緩存 入?yún)⑿r?yàn)事務(wù)未回滾異常被catch后未拋出事務(wù)方法內(nèi)不吞異常rollbackForException跨域請(qǐng)求被攔截前后端分離未配跨域?qū)崿F(xiàn)WebMvcConfigurer配置CorsMapping6.2 我常用的幾個(gè)效率提升工具說實(shí)話做這類管理系統(tǒng)真正拉開效率差距的是工具鏈的熟練度。SpringBoot項(xiàng)目里L(fēng)ombok幾乎是我必裝的Data注解直接省掉所有g(shù)etter/setter代碼量瞬間少一半。MapStruct做屬性拷貝比BeanUtils性能好很多編譯期就生成轉(zhuǎn)換代碼不會(huì)像反射那樣在頻繁調(diào)用時(shí)損耗性能。接口調(diào)試用Apifox對(duì)比Swagger和Postman它的優(yōu)勢(shì)是直接把接口文檔、調(diào)試、Mock數(shù)據(jù)整合在一個(gè)工具里方便前端快速聯(lián)調(diào)。還有一個(gè)非常實(shí)用的小工具是Spring官方提供的Spring Initializr創(chuàng)建項(xiàng)目時(shí)勾選依賴就自動(dòng)生成完整骨架比在開發(fā)工具里新建省事很多。數(shù)據(jù)庫層面配合MySQL Workbench做表結(jié)構(gòu)版本管理加上Flyway做數(shù)據(jù)庫遷移表結(jié)構(gòu)變更不再直接在生產(chǎn)庫上手工執(zhí)行SQL。這樣每次發(fā)版數(shù)據(jù)庫變更腳本和應(yīng)用代碼一起走版本控制基本杜絕了環(huán)境之間表結(jié)構(gòu)不一致的尷尬場(chǎng)面。6.3 application.yml 不自動(dòng)提示的解決辦法開發(fā)過程中不少同事遇到過IDEA里寫application.yml沒有自動(dòng)提示的問題第一次遇到其實(shí)很困惑。原因是IDEA無法識(shí)別這個(gè)文件對(duì)應(yīng)的配置元數(shù)據(jù)解決方法是手動(dòng)把a(bǔ)pplication.yml標(biāo)記為Spring配置文件右鍵文件 → 點(diǎn)擊“Add as Spring Boot Configuration File”之后寫配置項(xiàng)就會(huì)有自動(dòng)提示了。另外如果引入了自定義starter但I(xiàn)DEA里就是不提示自定義配置項(xiàng)需要依賴spring-boot-configuration-processor這個(gè)注解處理器來自動(dòng)生成配置元數(shù)據(jù)。在pom.xml引入該依賴后重新編譯項(xiàng)目IDEA就能識(shí)別所有配置項(xiàng)。沒加之前很多配置只能靠手寫非常容易拼錯(cuò)加上后效率翻倍。7. 項(xiàng)目測(cè)試與系統(tǒng)部署7.1 單元測(cè)試與接口自動(dòng)化測(cè)試管理系統(tǒng)最容易忽視質(zhì)量保障但我堅(jiān)持把核心計(jì)算和狀態(tài)流轉(zhuǎn)的邏輯用單元測(cè)試覆蓋起來。比如運(yùn)費(fèi)計(jì)算器我寫了六個(gè)測(cè)試用例覆蓋首重內(nèi)、超首重、偏遠(yuǎn)地區(qū)、重量為零、超重邊界、極端大重量六個(gè)場(chǎng)景保證每次修改價(jià)格策略后回歸測(cè)試一鍵執(zhí)行。Test void testCalculateOverFirstWeight() { FreightRule rule new FreightRule(); rule.setFirstPrice(new BigDecimal(10.00)); rule.setAdditionalPrice(new BigDecimal(2.00)); rule.setIsRemote(false); rule.setRemoteFee(BigDecimal.ZERO); BigDecimal freight FreightCalculator.calculate(new BigDecimal(2.1), rule); // 2.1kg按3kg算運(yùn)費(fèi)102*214 Assertions.assertEquals(0, freight.compareTo(new BigDecimal(14.00))); }接口自動(dòng)化測(cè)試方面我用了RestAssured配合JUnit5寫了一套冒煙測(cè)試腳本覆蓋登錄、下單、接單、軌跡查詢、后臺(tái)統(tǒng)計(jì)五個(gè)核心鏈路。每次構(gòu)建后自動(dòng)跑一遍接口掛了會(huì)第一時(shí)間發(fā)現(xiàn)不用等到上線被用戶投訴才知道。7.2 部署流程與上線檢查清單最終部署我整理了一份操作清單每次發(fā)布前都過一遍打新包前先跑一遍所有單元測(cè)試確認(rèn)核心邏輯沒被改掛備份生產(chǎn)數(shù)據(jù)庫防止發(fā)布過程中數(shù)據(jù)操作失誤關(guān)閉舊服務(wù)再啟動(dòng)新包避免版本不一致導(dǎo)致數(shù)據(jù)庫連接異常啟動(dòng)后立刻檢查日志有沒有報(bào)錯(cuò)堆棧再跑一遍核心接口冒煙測(cè)試。系統(tǒng)上線后第一周我持續(xù)觀察了日志和慢查詢記錄沒出現(xiàn)致命問題后整個(gè)項(xiàng)目才算真正交付完成。之后我結(jié)合用戶反饋又迭代了幾個(gè)小功能用戶地址簿增加地圖選點(diǎn)、快遞員端增加批量攬收、后臺(tái)報(bào)表支持導(dǎo)出Excel。管理系統(tǒng)就是這樣核心框架搭扎實(shí)了后續(xù)想加什么功能都能快速實(shí)現(xiàn)。8. 項(xiàng)目復(fù)盤與個(gè)人心得如果要給這個(gè)物流寄件系統(tǒng)做一個(gè)復(fù)盤總結(jié)我最深的體會(huì)是SpringBoot這類框架再強(qiáng)大也只是解決了技術(shù)層面的問題而系統(tǒng)設(shè)計(jì)真正的難點(diǎn)在于業(yè)務(wù)流程的梳理和邊界條件的考慮。做這個(gè)系統(tǒng)的過程中我花在理解物流業(yè)務(wù)上的時(shí)間遠(yuǎn)多于寫代碼的時(shí)間。第二個(gè)心得是不要追求一步到位先做出來再用起來再優(yōu)化。第一版系統(tǒng)我只實(shí)現(xiàn)了基礎(chǔ)的下單、接單、狀態(tài)流轉(zhuǎn)和管理后臺(tái)上線跑了兩周后結(jié)合真實(shí)使用場(chǎng)景才逐步加入運(yùn)費(fèi)規(guī)則配置、異常訂單處理、數(shù)據(jù)看板這些進(jìn)階功能。如果一開始就想著把所有功能全部做完再交付周期會(huì)拉得很長容易遙遙無期。最后分享一個(gè)小經(jīng)驗(yàn)寫這類系統(tǒng)的過程中數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì)千萬別圖省事把大量信息堆在一張大表里。適度拆分表、增加冗余字段、預(yù)留擴(kuò)展位雖然前期多花一點(diǎn)時(shí)間但后期維護(hù)起來會(huì)輕松非常多。比如訂單表的擴(kuò)展字段我預(yù)留了一個(gè)json類型的extra列后續(xù)接第三方快遞接口時(shí)很多自定義屬性直接往里塞就行不用頻繁改表結(jié)構(gòu)。這個(gè)“小設(shè)計(jì)”幫我在后期的需求變更里省了不少事。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲色宗合| 亚洲日韩视频二区| 日日夜夜国产综合| 国产99 中文字幕日韩小视频| 东京太热男人的天堂久久久| 尤物视频偷拍免费| 欧美色日本| 久久人妻办公室视频| 国产探花日韩援交| 中文字幕精品码亚洲| 人人搡人人肉久久精品| 人妻久热在线| 人妻中文在线| wwwss在线观看| 欧美日韩国产高清在线一二三区| 超碰精品日韩欧美国产| 久久九色| 99操逼| 神马久久久久久久久久久久| 青青草日韩无码| 亚洲αv一区二区三区| 久久精品熟女亚洲AV麻豆软件| 永久免费av无码网站国产app| 美熟女逼导航AV操逼| 日本天天吊| 2018色综合天天操| 亚洲色图亚洲无码强奸乱伦| 欧美视频一区二区在线| 亚洲图片欧洲图片aⅴ| 日韩精品在线视频,日韩精品……| 天天综合网亚洲综合网| 欧美18老人禁| 乳欲人妻办公室奶水| 欧美性爱精品七区| 天天躁日日躁成人字幕aⅴ| 人妻丝袜美腿中文字幕| 啊啊啊啊啊啊啊啊视频| 久久国产熟女影院| 亚洲中文国际强奸字幕| 亚洲国产精品无码AV在线| 黑人白女精品一区| 精品亚洲国产成人精品| 五月婷婷丁香中文字幕| 激情五月综合| 91色艳| 小草精彩毛片| 久久久久久性爱视频| AV天天在线观看| 人妻少妇视频在线播放| 四季AV一区二区凹凸精品小说| 顶级少妇BT天堂| 国产性刺激| 欧美超碰96| SS久久| 伊人久久久日韩一区| 操b网站亚洲无码| 搡老女人老妇女老妇老熟女怎么读| 久久99黄色卞西瓜| 99热 按摩 日韩| 欧美女同在线| 97在线视频免费观看| 美女91网站| 青娱乐国产剧情av一区| 99热在线观看| 91国产大片| 九九自拍伦理| 亚洲欧美首页| 岛国黄| 日本三级日本三级99| 久久XX| 成人AV素股で擦久久| 欧美色图中文字幕| 亚洲狠狠入| 丝袜美腿av女优在线| 日韩无码三级影院| 99在线精品视频| 女人的天堂大香蕉网| 久热精品在线| 囯产乱伦一区二区三女 | 久久99国产综合精品女同| 嗯嗯嗯啊啊啊在线免费观看| 好一吊区二区| 日韩性爱高清免费视频| 色av中文字幕| 中文字幕黄片在线| 色五月综合| 精品久久久久黄少妇| 中出20p| 操东北女人| 无遮挡又黄又刺激的视频| 狠狠色噜噜狠狠狠狠狠色综合久久 | 亚洲国产精品成人综合| 亚洲国产欧美中日韩成人综合视频| 日韩人妻大香蕉| 亚洲国内精品成人不卡| 丰满岳乱妇一区二区三区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 偷拍三区| 粉嫩av在线一区二区| 亚洲宅男天堂| 日韩丨制服丨中文|在线| 夜夜骑天天燥| 中文字幕一二区二三区人妻专区| 一本一道波多野毛片中文在线| 99久久婷婷国产综合精品草原| 欧美伦乱爱| 欧美精品一二三| 粉嫩粉嫩一区性色AV片| 神马午夜久久久| 国产97视频| 国产 热久久久久国产精品| 一区二区久久天天干狠狠| 粉嫩av一区二区三区四季| 精品美女久久久久| 亚洲熟妇丝袜在线观看| 日本性感人妻91| 嗯嗯,啊啊,国产精品| 91亚洲综合在线| 欧美黄色片AAAAA| 尤物视频偷拍免费| 日韩在线观看字幕精品| 亚欧美综合网。| 亚洲国产91精品一区二区久久| 婷婷五月丁香五月| A一区片| 另类小说五月天| 妇女乱色二区| 成人电影一区| 日韩小电影| 亚州精人品大香蕉| 51国产午夜精品视频| 超碰亚洲97| 欧美日韩在线小说| 成年男人的天堂| 欧美人人操人人插| 亚洲男人的天堂在线看| 欧美成人A天堂片在线观看| 北京美女一区二区| 亚洲一区二区三区四区视频| 青草伊人久久| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 特级毛片特黄久久免费看| 射丝袜大香蕉| 91啪啪视频| 五月天亚洲色图| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 黄页av| 超碰av人人人| 国内毛片热久久思思热| 一级免费精品| 91精品人妻一区二区三区蜜桃臀| 亚洲精美粉嫩嫩泬在线观看| 欧美日本国产日韩激情视频| 一起草在线视频| 亚洲情色五月天| 亚洲天堂一区二区久久| 丝袜美腿av女优在线| 色一射色一射| 操逼操操操91| 国产精品久久久啊| 男人的天堂日本东京热| 国产又粗又又黄又猛| 天天看精品动漫视频一区| 香蕉久久精品| 亚洲综合网电影91| 亚洲欧美日韩夜夜| 国产强奸AV在线| nuu12国产麻豆精品| 天天影视色香色欲| 亚洲第一综合| 男人的天堂网页| 懂色AV蜜臀无码精品APP| 国产乱不卡| 久久久久久久 九九九九九九九 | 九九英色视频| 国产欧洲精品亚洲午夜拍精品| 欧日a| 大香蕉久久| 国产精品久久久久久久久久久久久久久| 五月丁香社区婷婷日韩欧美精品影院 | 国产AV天美传媒一区二区三区 | 青青色综合| 日本人妻A片成人免费看片| 秋霞网无码| 欧美性五月| 嗯啊不要啊啊在线观看视频| 婷婷丁香久久| 欧美丰满熟妇XXXX性ppX人交| 国产中出内射一区二区| BBBBB97COM| 亚洲熟女诱惑| 亚洲AO在线| 丁香五月色| 国产女人极品高潮毛片| 日本欧美一区二区三区视频麻豆| 91综合中文字幕| 欧美日韩国产色五月综合在线| 色婷婷成人综合| 激情五月婷婷综合| 91爽啪| 久热无码| 日韩久久三区| 欧美后进式| 丁香婷婷色五月| 天天躁日日躁XXXXYY| 国产理论视频在线播放| 黄片com.| 岛国黄色大片网站| 超AV色女| 欧美最婬乱婬爆婬性视频| 精品无码产区一区二| 蜜臀在线免费观看在线免费观看| 人人澡人人爽人人精品| 日日干日日操五月天伦理视频| 超碰人人乐97| 人人综合| 男人把坤坤插入女人的下体| 欧洲精品人妻| 一二区在线观看视频| 亚洲精品九九九九九九| 被窝影院午夜看片无码| 欧美一区二区日韩三区| 亚洲一区二区中文字幕| 成人电影一区| 超碰激情808| 男人的天堂成人的社区| 人妻熟女一区二区| JIZZJIZZ亚洲女人被躁| 顶级丝袜熟女一区二区三区| 91视频国品一二三区| 日本三级久| 伊人网在线观看| 啊啊啊啊啊啊啊在线| 夜夜春夜夜操| 中文字幕欧美丝袜07资源| 69视频入口| 午夜操逼不卡| 丁香五月婷婷色| 久久久亚洲精品电影免费看| 五月开心久久AV官网| 加勒比久久av| 日韩精品在线视频在线观看| 伊人久久大香大香线蕉中文| 久久夜色一区二区| 色综合1991| 亚洲影视综合| 高跟丝袜AV专区国产| 九九伊人网| 亚洲美女30b| 91精品少妇搡搡搡| 久久久久久久强迫| 爽爽淫人网| 久久人妻无码毛片A片麻豆| 九九久久99| 日本午夜福利影院| 日本999精品视频| 呦女网站| 人妻丰满熟妇一区二区三| 欧美性爱三区二区| 色哟哟的毛片| 久久97视频| 第四色奇米影视777| 搡老女人老91妇女老熟女| 草草电影院| 3P乱轮视频| 亚洲色天堂日韩中| 骚日日av| 人人 操人人 操人人| 日本色色色| 欧美成人色| 夜夜欧美 | 久久久久亚洲Av无码专区老牛影视| 免费黄色片。| 亚洲91网。| 94色色电影网| 美日韩一二三区| 欧美亚洲首页| 日韩无码成人电影| 男人的天堂kva| 在线观看岛国有码| 人人澡人人弄| 秋霞网—男女啪啪亚洲免费体验区| 91oumei| 男人的天堂日韩| 久久免费99精品久久久久久| 97视频在线观看高清资源| 人人操人人肉久久精品| 狠狠色丁香| 麻豆传媒一区二区在线观看| 国产精品麻豆视频网站| 熟妇高潮精品一区二区三区下载| 免费人成毛片乱码| 九九玖玖精品| 欧美日韩*字幕一区| 粉嫩国产精品久久久| 91美女网站| 中日无幕一二三四区| 日韩一卡二卡三卡| 欧美熟妇人体| 免费的很黄很污的全部视频| 91操人| 色色福利| 天天操熟妇| 精品国产久热在线观看| 新91视频.cmp| 观看免费区二区三区二| 亚洲h片在线免费观看| 近亲乱伦一区二区| 亚洲涩图欧美| 午夜人妻精品综合在线| 日韩欧美亚洲自拍偷拍| 青青草在线成人视频| 亚洲无 码A片在线观看麻豆| 无码视频一区二区| 国产精品自在自拍视频| 美女91网址 | 人人色人人射人人妻| 91综合网| 97超视频在线观看| 久久亚洲精品成人av| 超碰这里有精品| 韩国一级婬片A片AAAAA| 亚洲欧美情色| 国精综合一二三区影视| 婷婷久月| 无码一区二区精品视频久久久春药| 东北老女人的激情视频| 亚洲强奸乱伦影视网| 精品国产乱码久久久久久久久久毛片| 白嫩嫩一区| 国产日韩区| 亚洲情色综合网| 久久久久成人蜜桃精品| 尤物网址| 天天干18禁| 91女神在线视频| 中文字幕一区二区在线日韩精品| 超碰美女97| 亚洲黄日韩无码专区| 凹凸视频在线观看伊人| 91一起操| 思思久热在线精品66| 天天日天天操VV| 开心五月婷婷激情| 人妻一区视频| a男人的天堂久久一级A毛片| 欧美天天影院| 欧美亚州色的图| 999狠狠综合| 无码精品蜜桃一区二区三区ww| 久久在肏| 九九九久| 精品性爱久久视频| 又大又黄国产| 日韩精品中文字幕二区| 国产精品视频白浆免费| 2019精品国产无码成人| 久久啊啊| 99re欧美| 丝袜色综合| 第二页中文字幕| 久久婷婷五月综合| 丁香五月成人| 天堂岛av| 另类在线| 国产这里只有精品| 久久性爱城| 精品久久久久久中文| 日韩熟女操逼| 久久久久久久久久va| 人妻一区二区三区熟女| 久久伊人影院| 60秒不遮不挡| 激情在线青青操| 亚洲精品国产拍免费91在线| 激情情色五月天| 美女网站黄页| 欧美97免费| 国产日韩中文字幕欧美| 久久影视二区三区行押| 亚洲天天精品| 暴力av在线| 欧美日韩亚洲少妇寂寞影院正在播放 | 日本天天吊| 超碰调教97| 五月天色图影视| 丰满人妻-区二区三区免费| 99热9| 婷婷五月天久久久| 强奸xx国产| 亚欧视频在线| 一区操逼| 国产一区二区三三视频| 岛国色情视频在线观看| 岛国片国产成人亚洲播放| 吖在线不卡一区二区国产剧情| 黄色香蕉视频网站一区| 欧美激情另类一区二区| 特级毛片特黄久久免费看 | 亚洲欧美日韩有码| 老熟妇综合| 长久操视频| 欧美综合色图网| 丁香九月婷婷| 中文字幕丝袜国产第一页不卡| 国产曰批免费观看久久久| 国语精品内射在线观看| 99久热| 国产视频三区四区| 999综合色| 日韩欧美中文字亚洲慕| 大香蕉一级黄色片久久| 欧美一级欧美三级在线观看| 性性久久| 蜜臀久久久99久久久久| 国产色综合亚洲色综合吹潮| 亚洲最大无码中文字幕网站| 精品久久青青草| 日本超碰97日韩精品人妻| 午夜精品人妻二区三区| 日韩兔费看黄片| 一级特黄aaa大片在线观看成人一级片在线观看 | 亚洲AV成人无码一区二区三区在线观看| 丁香五月色| 久久有码| 97亚洲在线| 亚欧毛片基地国产毛片基地| 激情五月天社区| 婷婷月色| 97欧美色综合| 国产福利视频精品视频| 亚洲操操| 乱码人妻一区二区三区| 91精品91久久久久77777俄罗斯老妇姓x| 一本色道综合久久欧美| 开心激情站| 囯产精品强| 欧州一区二区三区四区| 色综合久| 亚洲s色图| 国产亚洲色停停久久99精品91| 3p国产欧美99热| 内射黑人| 日韩成人高清一区二区| 欧美激情综合色综合啪啪五月| 色香在线| 91大神精品长腿在线观看网站| 看一级黄色视频| 一区二区视频你懂的| 中文字幕99999| 婷婷久久久| 亚洲中文字幕久久无码精品| 人人妻人射| 1204av韩国| 国产拍偷精品网站| 少妇同性| 亚洲国产成人精品999| 天天色香欲综合网| 五十路熟女人妻一区二区在线观看 | 色丁香久久| 极品AV网站在线观看| 91肉片| 操久久久久久| 97久久久网站| 激情五月天色色网| 人妻少妇精品无码专区二区密桃 | 大香蕉琪琪日本女优不卡| 日本东京热久久久电影| 欧美性猛交美女自慰91| 国产精品国产精品国产| 欧美性爱一内片一区二区三区| 9118禁| 91青视频| 精品国产av一区二区三区四区入口| 蜜臀少妇一区二区| 日韩性爱啪啪视频| 欧亚成人在线视频| 黄片不用下载在线观看| 欧美性第1页| 激情综合五月| 少妇被c 黄 免费观看| 69综合网| 美國A片| 亚洲天堂一二| 国产精品一区二区三区在线密挑| 91网站18| 人妻爽爽啪视频| 久久精品高清AV| 校园春色 亚洲| 91爱综合| 在线A日本| 国产三级中文字幕粉嫩| 欧美激情总合网| 欧美日韩在线视频网站| 校园春色亚洲无码| 色婷婷五月天| 95自拍视频在线观看| 国产91丝袜在线播放蜜月| 成人看片网站| 国产精品久久天天干| 亚洲h片在线免费观看| 和协影院中文字幕三区| 影音先锋国产精品| 无码动漫av中文字幕| 物业黑人 AV一区| 丁香五月激情啪啪| 乱伦a片视频| 东京太热男人的天堂久久久| 屌妞视频久久久久久久| 99热精品在线播放| 国产成人无码a| 高清视频一区| 国产第二页| 素人播放一区| 日逼国产| 翔田千里A片一区二区| 天美麻豆黄色录像| 亚洲成人一二三区| 天天插天天操| 国产精品嫩草久久久久| 97天堂| 精品女同一区| 亚洲视频一二区| 五月天激情网图片| 亚洲欧美日韩精品久| 大香蕉欧美| 大干人妻| 欧美亚洲se91| 欧美嗯啊……在线观看视频免费| 99久久e免费热视| 亚洲无 码A片在线观看麻豆| 92大香蕉| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 玖玖久久久| 人妻素股| 免费97视频| 久草精品国产蜜臀 | 91丨人妻丨国产丨丝袜| 精品美女少妇一区二区| 啊啊啊啊啊舒服| 秋霞一区二区三区四区五区六区七区| 色妺妺AⅤ| 超碰在线综合97| 97国产色图| 又摸又舔在线观看网站| 九月AV| 大鸡巴久久久| 熟妇在线视频一区二区| 国产11页| 伊人成人中文字幕久久网| 国产日韩欧美三级片| 91在线精品| 国产一级作爱毛片| 中文字幕狠狠玩| 玖玖爱免费观看视频| 欧美日韩一区二区三区四区蜜桃| 交换娇妻呻吟声不停中文字幕| 久久这里只精品免费福利| 亚洲精品97| 国产强奸无码乱伦| 操逼无码操逼| 国产亚洲精品美女久久久| 成人小说视频在线精品欧美| 精品中文字幕第一页| 小日子操bb在线看| 国产一级作爱毛片| 自拍偷拍2025在线观看| 久久婷婷视频| 尻女朋友一夜| 99久久综合| 91AV天美在线视频| 欧美韩日精品99综合| 综合色区偷拍| 国产精品美女视频诱惑| 飘花国产午夜精品不卡| 亚州AV无码国产精品| 精品人妻美妇91job| 国模精品一区二区三区苹果色戒| 婷婷精品视频| 久久综合日韩亚洲欧美| 亚洲情色一区二区三区| 激情内射| 亚洲成人激情小说视频| 日韩熟女乱伦中出| 免费看一级a性色生活片久久无| 色婷婷综合网| 欧亚第一综合网| 蜜桃臀一区二区aV| 91色狼| 久久只有精品一区二区三区| 日本狠狠干| 亚洲av综合色区图片亚洲| 天堂а√在线最新版在线 | 国产少妇与亚洲av| 日本三级精品| 99色热| 亚洲第一男人天堂| 欧美写真视频一区| 92性色国产午夜福利在线661| 色噜噜狠狠色综无码久久合欧美| 婷婷另类小说| 91黑丝操| 国产精品国产精品国产| 国产偷人伦激情在线观看| 欧美色视频在线| 无套内射性感少妇视频| 欧美色图片91| 秘书高跟黑色丝袜国产91在线| 91精片| 五月天久久综合网| 色综合色色| 中文幕97| 欧美中文字幕精品人妻| 一区三区啪啪| 97亚洲资源| 日韩人妻无码不卡网站| 欧美日韩在线国产在线| 密臀在线免费观看| 色欲久久99国产精品久久久久久| 亚洲囯产精品女人久久久| 麻豆60秒| 欧美97免费| 国产精品黄色三级av| 91青视频| 狠狠爱夜夜| 久久‘黄片视频| 亚洲人妻熟妇三十三区| 中出欧美| 五月天激情四射| 亚洲精品黑丝| 美女在线H91| 中国91AV| 午夜丁香| 大色网久久| 黄片色区软件| 亚洲欧美爆| 欧美色亚洲| 久久精品国产精品亚洲艾通辽熟妇 | 99国产精品人妻人伦| 蜜桃香蕉久草精品在线| av在线免费一区二区| 欧美日韩亚洲高清不卡一区二区三区| 欧美人妻少妇| 国产精品麻豆成人AV艾秋| 国产9熟妇视频网站| 91精品国产高清久久久久久,亚洲成人| 亚洲的天堂网| 色色福利| 天美传媒精品久久视频| 粉嫩av在线一区二区| 男人天堂 天天射| 你想操日本小逼吗| 精彩久久中文| 熟女突然公开看18禁影片 | 中文字幕五月婷婷免费| 日本东京热大香蕉a片| 视频一区二区三区精品| 97精品视频免费| 超清福利精品视频在线| 美女91在线观看| 国产毛片在线| AV久日| 欧美黄片视频在线观看免费 | 国产极品99热在线播放69| 亚洲91大片| 手机看片1024你懂的国产| 人妻色情天天操| 日韩中文欧美| 在线毛片片免费观看| 夜夜人妻爽| 成人黑料社久久| 色综91| 国产60区。| 69少妇一区二区| 国产粉嫩出水在线播放| 亚av顶级裸体一区二区三区四区五区 | 黄色网址久久精品欧美喷水| 97超碰精品| 欧美一区二区成人一卡| 国产吞精a级片激情电影| 992视频一区| 欧美狠狠弄| 女人双腿搬开让男人桶| 国产久久久久久| 欧美亚洲高清不卡| 裸体美女免费看网站青草| 内射小黄片| www.人人摸在线视频| 日本一区二区电影网站| 加勒比在线视频一区二区三区| 免费视频观看60秒| 神马午夜久久久| 丁香五月性| 国产传媒午夜理伦精品| 99操逼| 97天天做| 日本在线一二 | 91热情品| 1024香蕉视频| av午夜影院在线播放| 蜜臀中文字幕| 99福利社| 日本东京热大香蕉a片| 久久97| 日本免费一级AAA大片器| 日韩猛交| 玖色av| 中文字幕天天操| 色九区| 国产精品制服丝袜清纯唯美| 尤物网站91| 国产农村妇女毛片精品久久| 亚洲综合骚逼| 欧美久久久15P| 亚洲精品久久久久久久久豆丁网| 牛黄色久午久| 无码WWW免费视频网站| 视频一区二区免费在线| 国产精品久久久久久久久久久久久久吹 | 亚洲少妇色| 综合久久中文字幕综合日韩精品| 免费一级特黄特色大片在线观看看| 色激情综合网站| 欧美天天干| 视频二区美腿制服人妻欧美| 99re综合伊人| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 男人的天堂欧美| 丰满少妇一区二区三区专区| 色香色香欲天天天影视综合网| 久热大香蕉| 一区在线国产播放| 亚洲Av无码成人精品国产| 九九久久一区二区伦理| 欧美一区二区三区四区综合| 91精品无码久久久久久久| 啊啊啊网站| 欧美日韩中文视频播放| 亚洲动态色图| 超清中文乱码字幕| 大香蕉伊人网| 欧美亚洲国产91在线| 国产美女在线精品免费看| 中文字幕丰满人妻日本| 人妻精品视频一区二区三区| 国产成人亚洲精品无| 东北少妇高潮zzzz| 久久透逼视频| 东京热男人的天堂精品| 人人操人人摸人| 影音先锋国产精品| 亚洲综合另类| 极品白嫩福利在线| 东北女人| 久欲AV| 超碰97人人乐| 啪啪啪亚欧美视频| 亚洲精品国产精品成人| 精品丝袜无码一区二区三APP| 操B视频日韩无码| 国产AV激情无码久久无码 | 人妻人久久精品中文字幕| 91青青在线| 日本阿v天堂在线观看| 天天摸夜夜添无码小视频| 视频黄色国产一级| 丁香五月性爱| 超碰人妻久久人妻中文97| 在线情色电影 91大| 欧美后入式| www国产精品| 日韩综合成人免费视频| 日本在线不卡一二区| 夂久色| 蜜臀AV成人精品蜜臀| 久操视频在线| 日韩三级伦理中文字幕| 操逼视频亚洲| 天天欧美色| 好爽免费视频,| 国产精品视屏| 亚洲人妻中文高清| 中文字幕日韩国产传媒欧美精品| 丝袜美腿校园春色| 久久香蕉国产线看观看亚洲女人 | 五月丁香婷婷啪啪| 99国产精品免费| 精品无码少妇| 操逼啊啊啊91| 亚州成人A√| 日韩无码服务区| 日韩欧美大片免费高清啪啪| www.色操逼| 美性中文综合网| 亚洲在线欧美| 手机看片1025| 久久久久78| a级免费在线观看| 国产自偷自拍一区| 啊操爽品善一区二区三区| 夜夜嗨一区二区三区直播内容| 亚洲小电影免费涩涩成人在线高清| 狠狠干综合| 超碰综合97在线| 日韩激情毛片一级久久久| 超踫中文字幕| 九九精品网| 国产高清精品福利| 亚洲色资源| 亚洲人妻中文在线视频| 人人人人人人少妇| 日韩精品资源| 国产一区二区欧美日本| 99只有精品| 精品日韩人妻视频| 亚洲精品久| 少妇精品久久| 九九亚洲| 久久精品无码一区二区三区| 99久久精品国产高潮| 嗯嗯啊啊好大好爽| 日本性爰一道本| 亚洲色图国产另类| 久久久久久久九九九九九九| 亚洲成人一二三区| 国产一区二区二区按摩精品啪视频| 在线国产探花| 97ai亚洲| 99热精品在线观看| 中文字幕激情小说| 午夜大香蕉| 超碰久超碰久| 欧美毛片在线网| 麻豆精品.欧美精品.日韩精品.| 91站街按摩店老熟女熟女| 好一吊区二区| 伊人久久艹| 国产精品久久久久9999小说| 婷婷激情五月综合| 亚洲风情在线观看| 老女人爆菊| 婷婷伊人五月| 久久天天躁日日躁狠狠躁| 自拍偷拍国产欧美日韩韩| 国产一区麻豆免费观看| 天天插夜夜操| 激情小说亚洲视频| 国产成人在线观看综合| 天堂性色| 亚洲男人的天堂V| 九九精品无码专区免费| 天天综合网~91入口| 国产麻豆福利av在线播放| 久久人妻一区二区三区高清| 探花激情视频| 久久啊啊啊| 欧美色图私拍91| 美女写真| 欧美亚洲特P| 亚洲 图片 综合91| 欧美区亚洲区偷拍区| 性色av一区二区| 日本熟妇人妻中出视频| 超碰在线91| 91伊人影视综合| 国产色精品午夜大片| 久久精品操| 欧美在线伊人色| 久久久亚洲欧美综合| 欧美熟妇色| 91视频成人福利网站在线一区 | 欧美 综合 亚洲| 超碰人人超在线观看| sewuyueav| 999久久久九| 伊人久久大香线蕉无码| 97中文综合| 骚乳在线| 老司机老司机午夜影院| 超碰碰97资源站| 亚洲精品 超碰| 爆操无码| 麻豆国产97在线| 少妇久久久免费| 熟妇女人妻呻吟久久AV| 岛国在线一区二区三区| 亚州一区二区| 四虎影视永久在线观看精品免费网站 | 91neishe| 人人做人人妻人人夜视频| www国产无码| 亚洲 无码 有码 中文字幕| 后X久久| 亚洲av淫乱| 欧美特大AA级黄片| 欧美啪啪色吧在线| 亚洲诱惑天堂| 亚洲av热热色| 女同在线视频一区| 欧美精品自慰系列寂寞少妇| 欧美伊人久久综合网| 91美女小视频| 大香蕉日韩欧美| 神马久久69| 亚洲成人一二三区| 亚洲第一页色| 看一级黄色视频| 亚洲 一区二区 自拍| 高清国产无码av| 青草精品视频-日本久久久久网站| 天天日熟妇| 麻豆精品天美| 久久成年精品| 亚州成人A√| 91爱综合| 久久黄黄| 亚洲宅男天堂| AV中文在线| 色婷婷五月综合激情中文字幕| 爽极品影院| 国产精品 久久久精品一牛| 1769成人国产精品视频| 美女久久久久久久久久久| 麻豆一区二区三区在线看 | 精品国产乱码| ,成人免费啪啪视频| 午夜舔阴达高潮视频免费看| 激情欧美97| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | av片在线观看免费播放| 人妻在线视频| 凸凹视频在线观看| 国产亚州高清国产拍精| 精品在线观看视频在线| 黑人嘿嘿嘿超爽免费视频| 亚洲va有码在线天堂| 奇米四色影视777久久久| 亚欧性爱无码| 国产精品视频一区二区三区八戒| 久久综合亚洲色1080p| 97精品熟女少妇一区| 午夜爽爽爽在线观看永久入口姬片| 91影库| 一区二区三区成人高清视频| 免费精品中文字幕| 成人性爱视频在线看| 深夜国产一区二区三区在线看| 日本免费一级AAA大片器| 天天操天天干一区二区| 家庭乱伦网站国产| 亚洲图片偷拍视频区| 久久亚洲av成人无码国产| 色墦五月丁香| 国产av白丝| 成人色女网| 加勒比少妇AV婷婷六月天超碰超碰| 亚洲AV在线资源| 欧美色图另类图片| 亚洲在线欧美| 日韩免费三级黄片电影| 操高情无码| 欧美色色色| 国产天天骚| 九九九九免费视频| 男人天堂导航| 99久久久无码国产精品性啊聊| 国产AV色黄看到爽| 黄色一级视| 国产乱码久久| 裸体美女久久久| 国产又粗又长又大的视频| 亚洲色狠| 93人人操人人| 亚洲欧美成人在线| 欧美大香蕉卡久久| 日欧毛片久久| 怡红院久久老司机| 成人五月天丁香激情综合| 欧美aaaaaaa| 色色色网站| 美国久久一二三四| 欧美亚洲在线| www.亚洲成人一区| 黄aaaaaaaaaaaaaaaaaa色网站| 色色99| 国模不卡一本二本三电影| 亚洲成人帖图| 蜜乳成人AV| 六十路日本| 久久999久| 91爱剪切久久| 黄片色区软件| 在现视频女上位好爽| 国产风韵犹存熟妇三区| 欧美超碰97| 蜜桃av综合网发布| 99www.bibizy香蕉资源国产一区二区三区高清| rivers-china.com| 日本成人A片免费看| 床上啊啊啊一区二区三区| 97超碰人操| 另类亚洲一区二区三区| 百度百度日本操逼| 中文字幕黄色一起草| 色网站导航大全| 久久久97| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 校园春色亚洲无码| 日本操逼视频免费| 亚洲综合五月天| 亚洲国产亚洲天堂| 国产亚洲性生活视频播放| 亚洲综合色男人网| 99爱在线视频| 黑人粗大V S日韩女优视频| 麻豆国产97在线| 九九热精品视频在线观看| 天天操天天日天天干| 在线人成亚洲视频免费观看| 亚洲五月丁香花狠狠干一区二区三区 | 97色五月天完| 本道综合精品| 免费精品福利在线观看| 亚洲综合校园春色| 不卡av在线中文字幕| 国产性刺激| 熟女探花啪啪| 精品丰满人妻一区二区三区免费观| 干妹子| 免费在线观看国内色片网站网址| 99国产精品免费| 日韩成人精品| 欧美97日韩| 亚洲av无码国产精品字幕| 暖暖精品二区三区观看| 亚州欧美色图| 啪啪91| 日本成a人v网站在线观看| 青青草九九九九九| 呦呦一区| 亚州色站 日韩电影| 欧美日韩国产一区二区小黄片大全| 色97| 国产1024在线播放| 欧美激情 日韩精品| 日韩视频精品在线观看| 91网18| 中文字幕中文字幕一区二区| 成熟熟女国产精品一区二区| 操逼国产免费| 伊人少妇久久久| 性爱av在线免费观看| 成人青青草原伊人| 人妻啊啊人妻啊| 性无码专区2020| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 91九九| 国产成人亚洲精品无| 日韩精品人妻中文字幕有码午| 精品蜜乳AV免费观看| 色欲人妻一区二区在线| 操操操日本的逼| 夫妻AV网站| 嗯啊不要在线| 强奸抽插av| 欧美熟女丝袜| 色婷婷香蕉| dy888午夜老子影视达达兔| 天天综和| 近亲乱伦一区二区| 综合欧美色图| 国产夜夜艹| 风流老熟女一区二区三区l| 国语精品av| 欧美爆操91| 一级性爱aaaa| 偷拍 欧美 日韩| 一区二区不卡免费| 超碰亚洲欧美日韩无| 亚洲制服aⅴ中文字幕| 日日骚av| 色第一页| 91精品丝袜在线观看| 国产毛片片精品天天看视频| 极品久久久久久久久久久久久久| 国产AV久久久蜜爱影集| 99久久国产精品免费高潮| 锕锕好爽 死我在线观看| 99超碰色| 国产亚州高清国产拍精| 91这里只有精品| 蜜桃精品视频一区二区三区| 国产嫩草精品A88AV| 少妇xx精品| 国产性爱强奸乱伦大全| 呦女网站| 精品射1999| 亚洲欧洲网站免费观看| 日韩免费av片高清无码| 97欧美资源| 欧亚成人在线视频| 鲁鲁色综合网| 日韩乱插| 国产精品亚洲天堂网址| 久久久久久9| 91操熟妇| 久久久久久久久久精| 亚洲 图片 综合91| 日韩AV一起草| 国产成年精品高清在线观看91| 精品免费囯产一区二区三区| 色综合久久夜色精品国产天堂| 大鸡巴久久久| 天天干,天天日| 黄色欧美性爱视频| 亚洲色系另类精品国产| 天天看天天日天天操| 亚洲情色 自拍| 日韩淫色网| 欧天美中出| 亚洲狼狼干综合1| 尻女朋友一夜| 天天日天天插| 亚洲天堂久久| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 情色五月天就去干| 91精产一区二区三区| 蜜臀久久在线视频| 久久綜合很很很| 久久欧洲| 色诱avtt| 99爱久久视频频| 九九热男人天堂| 久久黄色网址| 91精品电影18| 国产视频一区二区在线| 黄页大片在线观看| 久久本道| 国产精品肉丝自拍| 久久久久9久久久久| 亚洲精品一区二区三区新线路| 最新欧美色网| 日本亚洲vr欧美不卡高清专区| 欧美日韩超碰在线| 超碰97欧美在线| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 在线 制服丝袜中出 人妻| 大香蕉啪啪啪| 亚洲色吧网| 偷拍 亚洲| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 日逼逼免费看| 国产熟女完整版中字| 精品在线观看视频在线| 蜜乳av首页| 欧美色图天堂在线| 亚洲国产97在线精品一区| 亚洲 欧美 第一页| 加勒比99999| 午夜αv|