精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于 Spring 狀態(tài)機(jī)實(shí)現(xiàn)電商訂單狀態(tài)流轉(zhuǎn)管理

開發(fā) 前端
傳統(tǒng)的if-else分支判斷在狀態(tài)較多、轉(zhuǎn)移邏輯復(fù)雜時(shí)會(huì)變得難以維護(hù),而Spring狀態(tài)機(jī)結(jié)合狀態(tài)模式可以很好地解決這個(gè)問題,讓狀態(tài)轉(zhuǎn)移邏輯更加清晰、可擴(kuò)展。

引言

在電商系統(tǒng)中,訂單狀態(tài)的流轉(zhuǎn)是核心業(yè)務(wù)流程之一。從用戶下單、支付、商家發(fā)貨到用戶收貨、售后等環(huán)節(jié),每個(gè)環(huán)節(jié)對(duì)應(yīng)不同的訂單狀態(tài),且狀態(tài)之間的轉(zhuǎn)移需要滿足嚴(yán)格的業(yè)務(wù)規(guī)則。

傳統(tǒng)的if-else分支判斷在狀態(tài)較多、轉(zhuǎn)移邏輯復(fù)雜時(shí)會(huì)變得難以維護(hù),而Spring狀態(tài)機(jī)結(jié)合狀態(tài)模式可以很好地解決這個(gè)問題,讓狀態(tài)轉(zhuǎn)移邏輯更加清晰、可擴(kuò)展。

實(shí)現(xiàn)

圖片圖片


圖片圖片

案例代碼

訂單狀態(tài)枚舉

定義訂單的所有狀態(tài),每個(gè)狀態(tài)對(duì)應(yīng)業(yè)務(wù)中的一個(gè)環(huán)節(jié):

@WithStateMachine
public enum OrderStatus {
    WAIT_PAY("待支付"),
    WAIT_DELIVER("待發(fā)貨"),
    WAIT_RECEIVE("待收貨"),
    COMPLETED("已完成"),
    CLOSED("已關(guān)閉"),
    AFTER_SALE("售后中");

    @Getter
    private final String desc;

    OrderStatus(String desc) {
        this.desc = desc;
    }
}

訂單事件枚舉

事件是觸發(fā)狀態(tài)轉(zhuǎn)移的動(dòng)作,每個(gè)事件對(duì)應(yīng)一次狀態(tài)變更的觸發(fā)條件:

public enum OrderEvent {
    PAY_SUCCESS("支付成功"),
    DELIVER("倉庫發(fā)貨"),
    RECEIVE("確認(rèn)收貨"),
    CANCEL("用戶取消/超時(shí)"),
    APPLY_REFUND("審核退款"),
    APPLY_AFTER_SALE("申請(qǐng)售后");

    @Getter
    private final String desc;

    OrderEvent(String desc) {
        this.desc = desc;
    }
}

狀態(tài)機(jī)配置

配置狀態(tài)機(jī)的狀態(tài)、事件、轉(zhuǎn)移邏輯及監(jiān)聽器:

@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends EnumStateMachineConfigurerAdapter<OrderStatus, OrderEvent> {

    /**
     * 配置狀態(tài)機(jī)的“狀態(tài)集合”和“初始狀態(tài)”
     */
    @Override
    public void configure(StateMachineStateConfigurer<OrderStatus, OrderEvent> states) throws Exception {
        states.withStates()
                .initial(OrderStatus.WAIT_PAY) // 初始狀態(tài)為“待支付”
                .states(EnumSet.allOf(OrderStatus.class)); // 注冊(cè)所有狀態(tài)
    }

    /**
     * 配置狀態(tài)機(jī)的“轉(zhuǎn)移規(guī)則”(事件觸發(fā)狀態(tài)變更)
     */
    @Override
    public void configure(StateMachineTransitionConfigurer<OrderStatus, OrderEvent> transitions) throws Exception {
        transitions
                // 待支付 → 待發(fā)貨:支付成功
                .withExternal()
                .source(OrderStatus.WAIT_PAY).target(OrderStatus.WAIT_DELIVER)
                .event(OrderEvent.PAY_SUCCESS)
                .and()
                // 待支付 → 已關(guān)閉:用戶取消/超時(shí)
                .withExternal()
                .source(OrderStatus.WAIT_PAY).target(OrderStatus.CLOSED)
                .event(OrderEvent.CANCEL)
                .and()
                // 待發(fā)貨 → 待收貨:倉庫發(fā)貨
                .withExternal()
                .source(OrderStatus.WAIT_DELIVER).target(OrderStatus.WAIT_RECEIVE)
                .event(OrderEvent.DELIVER)
                .and()
                // 待發(fā)貨 → 已關(guān)閉:審核退款
                .withExternal()
                .source(OrderStatus.WAIT_DELIVER).target(OrderStatus.CLOSED)
                .event(OrderEvent.APPLY_REFUND)
                .and()
                // 待收貨 → 已完成:確認(rèn)收貨
                .withExternal()
                .source(OrderStatus.WAIT_RECEIVE).target(OrderStatus.COMPLETED)
                .event(OrderEvent.RECEIVE)
                .and()
                // 已完成 → 售后中:申請(qǐng)售后
                .withExternal()
                .source(OrderStatus.COMPLETED).target(OrderStatus.AFTER_SALE)
                .event(OrderEvent.APPLY_AFTER_SALE);
    }

    /**
     * 配置狀態(tài)機(jī)的“全局配置”(如監(jiān)聽器)
     */
    @Override
    public void configure(StateMachineConfigurationConfigurer<OrderStatus, OrderEvent> config) throws Exception {
        config.withConfiguration()
                .listener(new OrderStateMachineListener()); // 注冊(cè)狀態(tài)變更監(jiān)聽器
    }
}
@Slf4j
@Component
public class OrderStateMachineListener extends StateMachineListenerAdapter<OrderStatus, OrderEvent> {

    @Override
    public void stateChanged(State<OrderStatus, OrderEvent> from, State<OrderStatus, OrderEvent> to) {
        if (from != null) {
            log.info("訂單狀態(tài)從: " + from.getId().getDesc() + " 變更為: " + to.getId().getDesc());
        } else {
            log.info("訂單初始狀態(tài): " + to.getId().getDesc());
        }
    }
}

業(yè)務(wù)邏輯層實(shí)現(xiàn)

封裝狀態(tài)機(jī)觸發(fā)邏輯與數(shù)據(jù)庫操作,保證事務(wù)一致性:

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private StateMachine<OrderStatus, OrderEvent> stateMachine;

    @Autowired
    private StateMachinePersister<OrderStatus, OrderEvent, Order> stateMachineMemPersister;

    /**
     * 創(chuàng)建訂單(初始狀態(tài)為待支付)
     */
    @Transactional
    public Order createOrder(Order order) {
        order.setStatus(OrderStatus.WAIT_PAY);
        orderMapper.insert(order);
        return order;
    }

    /**
     * 觸發(fā)狀態(tài)事件,更新訂單狀態(tài)
     */
    @Transactional
    public boolean triggerEvent(Long orderId, OrderEvent event) {
        // 查詢訂單
        Order order = orderMapper.selectById(orderId);
        if (order == null) {
            throw new RuntimeException("訂單不存在:" + orderId);
        }
        boolean result = false;
        try {
            // 從訂單中恢復(fù)狀態(tài)機(jī)當(dāng)前狀態(tài)
            stateMachineMemPersister.restore(stateMachine, order);
            // 發(fā)送事件觸發(fā)狀態(tài)變更
            Message<OrderEvent> message = MessageBuilder.withPayload(event)
                    .setHeader("orderId", orderId)
                    .build();
            result = stateMachine.sendEvent(message);
            // 狀態(tài)轉(zhuǎn)移成功,更新數(shù)據(jù)庫中的訂單狀態(tài)
            if (result) {
                // 持久化狀態(tài)機(jī)最新狀態(tài)
                stateMachineMemPersister.persist(stateMachine, order);
                // 更新訂單實(shí)體狀態(tài)
                order.setStatus(stateMachine.getState().getId());
                orderMapper.updateById(order);
            }
        } catch (Exception e) {
            throw new RuntimeException("狀態(tài)變更失敗:" + e.getMessage(), e);
        }
        return result;
    }

    /**
     * 查詢訂單(用于測(cè)試)
     */
    public Order getOrder(Long orderId) {
        return orderMapper.selectById(orderId);
    }

}
接口層實(shí)現(xiàn)

對(duì)外暴露HTTP接口,用于創(chuàng)建訂單和觸發(fā)狀態(tài)事件:

@CrossOrigin
@RestController
@RequestMapping("/order")
public class OrderController {

    @Resource
    private OrderService orderService;

    /**
     * 創(chuàng)建訂單
     */
    @PostMapping("/create")
    public Order createOrder(
            @RequestParam String userId,
            @RequestParam String productId,
            @RequestParam BigDecimal amount) {
        Order order = new Order();
        order.setId(userId);
        order.setProductName(productId);
        order.setAmount(amount);
        order.setStatus(OrderStatus.WAIT_PAY);
        return orderService.createOrder(order);
    }

    /**
     * 觸發(fā)訂單狀態(tài)事件
     */
    @PostMapping("/event/{orderId}/{event}")
    public boolean triggerEvent(
            @PathVariable Long orderId,
            @PathVariable String event) {
        OrderEvent orderEvent = OrderEvent.valueOf(event);
        return orderService.triggerEvent(orderId, orderEvent);
    }

    @GetMapping("/{orderId}")
    public Order getOrder(@PathVariable Long orderId) {
        Order order = orderService.getOrder(orderId);
        if (order == null) {
            throw new RuntimeException("訂單不存在");
        }
        return order;
    }
}

持久化(可選)

@Slf4j
@Configuration
public class StateMachinePersistConfig {

    /**
     * 內(nèi)存持久化(基于HashMap)
     * 適合單體應(yīng)用,服務(wù)重啟后狀態(tài)會(huì)丟失
     */
    @Bean(name = "stateMachineMemPersister")
    public StateMachinePersister<OrderStatus, OrderEvent, Order> stateMachineMemPersister() {
        // 實(shí)現(xiàn)StateMachinePersist接口,定義狀態(tài)讀寫邏輯
        StateMachinePersist<OrderStatus, OrderEvent, Order> persist = new StateMachinePersist<OrderStatus, OrderEvent, Order>() {
            // 用HashMap存儲(chǔ)訂單ID與狀態(tài)機(jī)上下文的映射
            private final Map<String, StateMachineContext<OrderStatus, OrderEvent>> stateMap = new HashMap<>();

            @Override
            public void write(StateMachineContext<OrderStatus, OrderEvent> context, Order order) throws Exception {
                log.info("內(nèi)存持久化狀態(tài)機(jī) - 寫入,訂單ID: {}, 狀態(tài)上下文: {}", order.getId(), JSON.toJSONString(context));
                stateMap.put(order.getId(), context);
            }

            @Override
            public StateMachineContext<OrderStatus, OrderEvent> read(Order order) throws Exception {
                StateMachineContext<OrderStatus, OrderEvent> context = stateMap.get(order.getId());
                log.info("內(nèi)存持久化狀態(tài)機(jī) - 讀取,訂單ID: {}, 狀態(tài)上下文: {}", order.getId(), JSON.toJSONString(context));
                return context;
            }
        };

        // 使用Spring提供的DefaultStateMachinePersister包裝
        return new DefaultStateMachinePersister<>(persist);
    }
}

Redis持久化配置案例:

@Configuration
public class StateMachinePersistConfig {

    /**
     * Redis持久化(分布式系統(tǒng)適用)
     * 狀態(tài)機(jī)上下文存儲(chǔ)在Redis中,支持多實(shí)例共享狀態(tài)
     */
    @Bean(name = "stateMachineRedisPersister")
    public StateMachinePersister<OrderStatus, OrderEvent, Long> stateMachineRedisPersister(
            RedisConnectionFactory redisConnectionFactory) {
        // 創(chuàng)建Redis狀態(tài)機(jī)上下文倉庫
        RedisStateMachineContextRepository<OrderStatus, OrderEvent> repository = 
                new RedisStateMachineContextRepository<>(redisConnectionFactory);
        
        // 基于倉庫實(shí)現(xiàn)持久化邏輯
        RepositoryStateMachinePersist<OrderStatus, OrderEvent, Long> persist = 
                new RepositoryStateMachinePersist<>(repository);
        
        // 包裝為RedisStateMachinePersister
        return new RedisStateMachinePersister<>(persist);
    }
}
注意事項(xiàng)
  • 狀態(tài)機(jī)上下文結(jié)構(gòu):Spring State MachineStateMachineContext包含當(dāng)前狀態(tài)、歷史狀態(tài)、擴(kuò)展變量等信息,持久化時(shí)會(huì)完整存儲(chǔ)這些內(nèi)容,確保狀態(tài)恢復(fù)的準(zhǔn)確性。
  • Redis鍵設(shè)計(jì):Redis持久化默認(rèn)鍵格式為STATE_MACHINE_CONTEXT:{orderId},可通過自定義RedisStateMachineContextRepository修改鍵前綴,避免與其他業(yè)務(wù)鍵沖突。
  • 過期策略:對(duì)于Redis持久化,可設(shè)置鍵過期時(shí)間(如訂單完成后24小時(shí)),避免無效數(shù)據(jù)占用內(nèi)存。
  • 分布式鎖:在Redis持久化的分布式場(chǎng)景中,建議為triggerEvent方法添加分布式鎖(如 Redisson),防止并發(fā)狀態(tài)修改導(dǎo)致的數(shù)據(jù)不一致。
責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2025-04-14 09:30:11

Spring狀態(tài)機(jī)訂單

2023-03-06 07:35:30

狀態(tài)機(jī)工具訂單狀態(tài)

2025-07-29 09:36:13

2024-10-10 17:46:06

2011-06-24 16:09:24

Qt 動(dòng)畫 狀態(tài)機(jī)

2021-04-29 09:31:05

前端開發(fā)技術(shù)

2010-06-18 12:38:38

UML狀態(tài)機(jī)視圖

2024-04-16 09:21:59

Spring流轉(zhuǎn)狀態(tài)數(shù)據(jù)狀態(tài)處理

2020-12-02 13:33:58

函數(shù)指針編程語言

2020-10-15 10:38:35

C語言狀態(tài)模型

2010-06-18 13:25:44

UML狀態(tài)機(jī)視圖

2013-09-03 09:57:43

JavaScript有限狀態(tài)機(jī)

2020-03-27 10:50:29

DSL 狀態(tài)機(jī)工具

2021-07-08 09:15:20

單片機(jī)編程狀態(tài)機(jī)編程語言

2025-09-26 04:11:00

Spring狀態(tài)機(jī)業(yè)務(wù)流程

2024-01-08 09:46:47

2010-07-08 13:03:31

UML狀態(tài)機(jī)圖

2011-06-29 18:36:59

Qt 動(dòng)畫 狀態(tài)機(jī)

2023-08-07 18:45:30

電商訂單訂單類型批量發(fā)貨

2010-07-12 15:00:56

UML狀態(tài)機(jī)視圖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

午夜精品久久久久久久无码 | 成人a免费视频| xxxxx在线观看| 91视频亚洲| 欧美日韩国产限制| 亚洲国产一区二区在线| 亚洲精品成av人片天堂无码| 性8sex亚洲区入口| 久久天堂av综合合色| 波多野结衣有码| 成人午夜888| 欧美性猛交xxxxx水多| 波多野结衣三级在线| 四虎在线免费观看| 国产一区二区福利视频| 日本精品久久久久久久| 强行糟蹋人妻hd中文| 国产精品中文字幕亚洲欧美| 日韩一区二区三区视频在线 | 粉嫩嫩av羞羞动漫久久久| 日韩av电影院| 国产精品99re| 91精品国产91久久久久久密臀| 日韩精品欧美激情| 初高中福利视频网站| 一呦二呦三呦精品国产| 亚洲福中文字幕伊人影院| 在线视频欧美一区| 国产爆初菊在线观看免费视频网站 | 欧美大片网站在线观看| 久久午夜福利电影| 久久97久久97精品免视看秋霞| 91麻豆精品国产91久久久| 日日摸天天爽天天爽视频| a'aaa级片在线观看| 亚洲乱码中文字幕| 亚洲精品一区二区三| 日本福利在线观看| 成+人+亚洲+综合天堂| 亚洲影院污污.| 在线免费观看一区二区| 日韩中文字幕一区二区三区| 7777精品视频| 黄色片视频网站| 亚洲日产国产精品| 午夜精品久久久99热福利| 国产黄色片在线免费观看| 久久精品亚洲欧美日韩精品中文字幕| 在线电影av不卡网址| 亚洲欧美视频在线播放| 久久香蕉精品香蕉| 亚洲成人精品在线| 中文字幕在线播放一区| 国产伦精品一区二区三区免费优势| 日韩精品一区二区三区在线播放 | aaaaaa毛片| 亚洲尤物影院| 国产成人涩涩涩视频在线观看| 亚洲黄色免费观看| 久久三级视频| 国产成人精品视频在线| 手机av免费观看| 日韩国产精品久久久| 国产精品第七影院| 在线不卡免费视频| 韩国理伦片一区二区三区在线播放| 成人性生交大片免费看小说 | 永久久久久久| 久久久久久久久免费视频| 亚洲精品精品亚洲| 国产日韩av网站| 不卡一二三区| 欧美日韩一区成人| 国产又粗又猛大又黄又爽| 亚洲精品高潮| 国产视频精品xxxx| 国产馆在线观看| 中文无码久久精品| 91精品国产高清自在线| 国产美女www| 国产乱码精品一区二区三区五月婷 | 中文字幕日韩高清在线| 亚洲激情视频网| 精品无码在线观看| 自由日本语亚洲人高潮| 7777免费精品视频| 亚洲图片小说视频| 成人午夜在线播放| 神马影院午夜我不卡| 中文字幕中文字幕在线中高清免费版 | 99v久久综合狠狠综合久久| 欧美日韩亚洲一区二区三区在线观看| 亚洲s色大片| 亚洲国产精品久久艾草纯爱| 无码人妻h动漫| 精品国产三级| 亚洲男人天堂手机在线| 国产精品免费在线视频| 在线观看日韩av电影| 国产精品久久久精品| 午夜精品久久久久久久99老熟妇| 99精品视频在线免费观看| 亚洲欧洲日韩精品| 成人免费网站观看| 欧美色偷偷大香| 91视频在线免费| 成人在线丰满少妇av| 久久久久久久久久久亚洲| 中文精品久久久久人妻不卡| 成人成人成人在线视频| 亚洲一区二区精品在线观看| 激情国产在线| 欧美电影在线免费观看| 蜜臀av一区二区三区有限公司| 91tv官网精品成人亚洲| 国产精品 欧美在线| 丁香六月天婷婷| 一区在线观看免费| 国产成人精品无码播放| 牛牛精品成人免费视频| 欧美猛交免费看| 中文字幕 国产| 91亚洲精华国产精华精华液| 路边理发店露脸熟妇泻火| 国产精品毛片久久久久久久久久99999999| 日韩精品一区二区三区四区视频| 99热99这里只有精品| 日韩专区一卡二卡| 看高清中日韩色视频| 黄页网站在线| 日韩一区二区三区视频在线| 99自拍视频在线| 美腿丝袜亚洲三区| 日韩理论片在线观看| 英国三级经典在线观看| 日韩av影视在线| 国产第一页在线播放| 国产精品白丝jk黑袜喷水| 亚洲午夜精品久久| 国产原创一区| 国产亚洲一级高清| 无码日韩精品一区二区| 久久久美女毛片| 成人观看免费完整观看| 欧美午夜寂寞| 欧美孕妇与黑人孕交| 国产精品国产高清国产| 精品久久久久久久久久久久| 国产二级一片内射视频播放| 亚洲精品1234| 精品综合久久| sis001欧美| 亚洲日本欧美日韩高观看| 在线永久看片免费的视频| 国产亚洲欧美色| 亚洲色图久久久| 99国产**精品****| 91系列在线观看| 色操视频在线| 日韩乱码在线视频| 精品久久久久久久久久久久久久久久久久| 久久精品亚洲精品国产欧美| 天天爽天天爽夜夜爽| 日韩欧美视频专区| 91久久国产精品| 日本天码aⅴ片在线电影网站| 日韩欧美国产综合| 日韩欧美高清在线观看| 久久人人超碰精品| 亚洲第一中文av| 亚洲网色网站| 精品国产一区二区三区免费| 亚洲人体影院| 色av中文字幕一区| 性生活免费网站| 色综合久久综合网欧美综合网| 熟女少妇内射日韩亚洲| 国内精品国产成人| 成熟丰满熟妇高潮xxxxx视频| 国产精品美女久久久久久不卡 | 久久久久久香蕉| 天天综合久久| 精品国产一区二区三| 欧美成人app| 欧美国产精品人人做人人爱| 日本中文字幕电影在线观看 | 不卡一区2区| 91久久精品国产91久久性色tv| 草草在线观看| 日韩视频中文字幕| 天天干天天爱天天操| 欧美亚洲国产怡红院影院| 成人免费黄色小视频| 99久久777色| 亚洲一区二区三区三州| 久久久精品日韩| 亚洲国产一二三精品无码| 亚洲丝袜美腿一区| 97中文在线| www.久久.com| 91国产精品电影| 黄色视屏免费在线观看| 亚洲免费精彩视频| www.成人免费视频| 欧美专区亚洲专区| 日韩和一区二区| 亚洲欧美偷拍三级| 国产高清一区二区三区四区| 国产91露脸合集magnet| a在线观看免费视频| 亚洲免费影视| 东北少妇不带套对白| 天堂网在线观看国产精品| 久久久久无码国产精品一区| 日韩欧美久久| 国产日韩中文字幕在线| 中文字幕 在线观看| 欧美贵妇videos办公室| 在线视频二区| 亚洲午夜小视频| 免费福利在线视频| 亚洲国产天堂久久综合网| 性猛交xxxx乱大交孕妇印度| 欧美喷水一区二区| 亚洲精品一区二区二区| 欧美特级www| 日韩欧美性视频| 亚洲一区二区黄色| 欧美三级小视频| 亚洲青青青在线视频| 国产人与禽zoz0性伦| 日本一区二区三区四区| 国产免费无遮挡吸奶头视频| 91免费小视频| 五级黄高潮片90分钟视频| 成人在线综合网| 国产a级片视频| 国产成人精品一区二区三区网站观看 | www.色在线| 欧美黄色片视频| 天堂av最新在线| 欧美成人手机在线| 伊人影院在线视频| 久久6免费高清热精品| 超碰在线观看免费版| 久久国产精品久久国产精品| 国产原创视频在线观看| 欧美成人免费全部观看天天性色| 好了av在线| 欧美精品一区在线播放| 日本天码aⅴ片在线电影网站| 欧美黄色片在线观看| av今日在线| 欧美一级成年大片在线观看| 不卡一二三区| 国产精品视频大全| 成人久久精品| 成人av资源| 日韩高清在线免费观看| 欧美综合激情| 国产高清久久| 欧美高清中文字幕| a91a精品视频在线观看| 男人天堂成人在线| 蓝色福利精品导航| 性鲍视频在线观看| 成人福利视频在线| 亚洲AV无码成人精品区明星换面| 国产精品久久久爽爽爽麻豆色哟哟| 国精产品久拍自产在线网站| 亚洲精品视频在线| 成人午夜视频精品一区| 欧美在线一区二区三区| 一本一道精品欧美中文字幕| 欧美xxxx在线观看| 你懂得在线网址| www.欧美免费| 不卡av免费观看| 国产精品成人观看视频国产奇米| 午夜精品久久久久久毛片| 99在线观看视频| 西野翔中文久久精品国产| 亚洲人成影视在线观看| 一区在线播放| 美女网站色免费| 成人18视频日本| 成人一级片免费看| 亚洲v日本v欧美v久久精品| 无码人妻一区二区三区免费| 日韩一区二区影院| 国外av在线| 久久久久久久久国产| 精品国模一区二区三区| av蓝导航精品导航| jlzzjlzz亚洲女人| 精品少妇人欧美激情在线观看| 久久aⅴ国产紧身牛仔裤| 深夜做爰性大片蜜桃| 久久久久久综合| 久久久久成人精品无码| 欧美在线播放高清精品| 色一情一乱一乱一区91av| 日韩在线欧美在线国产在线| 交100部在线观看| 亚洲a在线播放| 色97色成人| 99精品视频在线看| 成人ar影院免费观看视频| 四虎永久免费地址| 欧美性精品220| 熟妇人妻中文av无码| 久久中文久久字幕| 91福利精品在线观看| 国内精品视频在线播放| 亚洲乱码在线| 色婷婷成人在线| 久久蜜桃一区二区| 日韩精品视频免费看| 日韩一区二区三| 欧美a免费在线| 国产成人午夜视频网址| 亚洲肉体裸体xxxx137| www.日本三级| 国产精品一区二区91| 刘亦菲国产毛片bd| 91久久精品午夜一区二区| 日本大片在线观看| 2020欧美日韩在线视频| 国产精品自在| 国模无码视频一区二区三区| 成人黄色一级视频| 九九热国产精品视频| 日韩欧美在线一区二区三区| 好操啊在线观看免费视频| 91精品久久久久| 99久久精品费精品国产| 亚洲人视频在线| 国产精品久久久久影视| 中文字幕丰满人伦在线| 日韩在线欧美在线| 在线播放成人| 今天免费高清在线观看国语| 韩日av一区二区| 丰满少妇高潮久久三区| 日韩免费一区二区三区在线播放| 亚洲欧美成人影院| 电影午夜精品一区二区三区| 激情久久一区| 黄色网址在线视频| 色综合视频在线观看| 国产精品一区二区婷婷| 国产精品偷伦一区二区| 91一区二区三区四区| 特种兵之深入敌后| 亚洲网友自拍偷拍| 视频三区在线观看| 国产成人福利视频| 日韩免费一区| 欧美日韩久久婷婷| 亚洲一区在线观看免费观看电影高清| 亚洲精品久久久久久久久久久久久久| 久久久久日韩精品久久久男男 | 亚洲一区二区三区精品动漫| 久久国产精品一区二区| 欧美成人黄色网| 日韩精品视频在线观看网址| 蜜桃视频成人m3u8| 日韩 欧美 自拍| 成人精品电影在线观看| 久久久久久久久久久久久av| 在线视频日韩精品| 久久av偷拍| 欧美在线观看成人| 一区精品在线播放| 色欲av永久无码精品无码蜜桃 | 波多野结衣大片| 久久天天躁狠狠躁老女人| 精品三级av| 在线观看国产一级片| 亚洲午夜久久久久久久久久久| 涩涩视频在线观看免费| 成人写真福利网| 国产深夜精品| 三级全黄做爰视频| 亚洲精品美女久久久| 国产一区高清| 久久成人免费观看| 亚洲欧洲av色图| 日本韩国精品一区二区| 亚洲va电影大全| 免费一级欧美片在线播放| 中国毛片直接看| 亚洲人成77777在线观看网| 国内精品视频| 九一精品在线观看| 亚洲成人在线观看视频| 午夜在线视频| 青青草原成人| 不卡一区二区中文字幕| 一区二区三区免费在线|