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

DDD 對決:事務腳本 vs. 領域模型,哪個才是業務優化的終極方案?

開發 前端
事務腳本(Transaction Script)是一種應用程序架構模式,主要用于處理簡單的業務場景。它將業務邏輯和數據庫訪問緊密耦合在一起,以便實現對數據的操作。

在 CQRS 架構篇提到,由于 Command 和 Query 內部驅動力完全不同,需要在架構層就進行分離,但其中有個一個原則極為重要:

  1. “讀”再復雜也是簡單;
  2. “寫”再簡單也是復雜;

可見 Command 遠比 Query 棘手的多,其中最關鍵的便是使用哪種模式來承載業務?

最常見的業務承載模式有:

  1. 事務腳本。
  2. 領域模型。

1. 事務腳本 與 領域模型

事務腳本 和 領域模型 都是承載業務的不同模型,都有其適合的場景,沒有絕對的對和錯。核心的決策依據只有一個:選擇最合適的業務場景即可。

簡單且直觀的對兩者進行區分:

  1. 事務腳本,門檻低上手快,適合簡單的業務場景,比如資訊、博客等;
  2. 領域模型,門檻很高,適合處理復雜的業務場景,比如電商、銀行、電信等;

大家最常聽說也是最反感的便是:被別人稱為 CRUD boy,更多時候說的便是 事務腳本。

1.1. 事務腳本

事務腳本(Transaction Script)是一種應用程序架構模式,主要用于處理簡單的業務場景。它將業務邏輯和數據庫訪問緊密耦合在一起,以便實現對數據的操作。

事務腳本,將整個業務邏輯封裝在一個事務中,借助數據庫事務來滿足業務操作的 ACID 特性。通過將邏輯和事務封裝在一起,從而簡化應用程序的處理和開發。

下圖是基于事務腳本的生單流程:

圖片圖片

簡單描述就是:將“腳本”(SQL)進行打包,然后放在一個“事務”中運行。這也就是“事務腳本”命名的由來。

接下來,看一個訂單改價流程:

圖片圖片

和生單流程基本一致,在此不做過多介紹。

1.2. 領域模型

領域驅動設計(Domain-Driven Design,DDD)是應對復雜業務場景的利器,它是對業務領域中的關鍵概念和業務規則的抽象。領域模型是一個對象模型,它主要描述各領域對象之間的關系和行為。

和事務腳本不同,領域模型使用對象來承載業務邏輯,領域模型的設計基于業務領域知識,強調領域專家的參與,以提高軟件系統的質量和開發效率。

下圖是基于領域模型的生單流程:

圖片圖片

簡單描述就是:核心業務邏輯全部由對象實現(addItems方法),數據庫僅做數據存儲。

接下來,看下基于DDD的訂單改價流程:

圖片圖片

和生單流程基本一致,核心邏輯由 Order 的 modify price 實現。

相比之下,領域模型就復雜太多,它由多個實體 (Entity)、值對象 (Value Object)、聚合 (Aggregate)、領域服務 (Domain Service)、工廠 (Factory) 等組成,它們共同構成了領域對象模型。在模型中,實體和值對象表示業務中的實際對象,聚合是由多個高內聚實體和值對象形成的組合提,領域服務表示不屬于任何一個實體或值對象的操作,工廠則用于創建復雜的對象,比如實體和值對象等。

1.3. 區別

兩者都是承載業務邏輯的架構,但區別巨大:

  1. 事務腳本是以流程為中心的設計方法,在數據庫層面執行指令,簡化數據處理的過程;DDD 是以領域對象為中心的設計方法,旨在更好地理解和解決業務問題。
  2. 事務腳本以技術和流程為重點,以技術為中心,以代碼實現為核心,關注數據處理問題;DDD 則強調模型驅動開發,以業務為中心,以領域模型為核心,關注業務邏輯,并以此為基礎進行技術實現。
  3. 事務腳本很容易造成代碼的累積,難以維護;DDD 能夠幫助開發人員找到領域的本質(深層模型),并以此為核心,從而形成統一的、易于維護的架構。

除此之外,DDD 還有很多的特點,比如:

  1. 標準化。DDD 由一組嚴謹的規范組成,有完整的理論基礎,可以實現落地過程的標準化;
  2. 設計模型。大家在日常工作中很少使用設計模型的根因在于:缺乏應用場景。當你處于“過程式”的開發模式下,只能產出面條代碼;只有面對“面對對象”場景,才能落地設計模式,提升抽象能力;
  3. 降維打擊。DDD 是從業務需求出發,將業務概念轉化為對象模型,最后通過技術進行落地。這本身就是一種自上而下的設計方式,聚焦于業務,解決真實問題;

2. 實戰體驗

對于程序員來說,文字顯得不夠直觀,在此我們通過代碼來體驗下兩者的不同。

為了更好的體現兩者的區別,將會從兩個場景進行對比:

  1. 創建場景。圍繞電商下單流程進行說明。
  2. 更新場景。以電商訂單改價流程為基礎進行說明。

在日常開發中,物理刪除場景用的非常少,甚至很多公司都明令禁止使用“delete”語句。通常使用 “邏輯刪除” 替代,它可歸屬為標準的更新場景,在此暫不對比 物理刪除場景。

2.1. 創建場景:下單

在電商中,一個標準的下單需求主要包括:

  1. 對商品庫存進行校驗,避免出現超賣的情況;
  2. 對商品庫存進行鎖定,如果支付成功則直接扣減鎖定的庫存;如果支付失敗,則對鎖定的庫存進行歸還;
  3. 為每一種購買的商品生成一個訂單項(OrderItem),記錄商品單價、購買數量、需付總價、應付金額等;
  4. 為每一筆下單生成一個訂單(Order),記錄用戶、地址、支付金額、訂單狀態等;
2.1.1. 基于事務腳本的下單

核心代碼如下:

@Transactional
public void createOrder(CreateOrderCommand createOrderCommand) {
    // 1. 庫存校驗
    for (OrderItemDTO itemDTO : createOrderCommand.getItems()) {
        Integer stock = inventoryMapper.getStock(itemDTO.getProductId());
        if (stock < itemDTO.getQuantity()) {
            throw new IllegalStateException("庫存不足");
        }
    }
    // 2. 鎖定庫存
    for (OrderItemDTO itemDTO : createOrderCommand.getItems()) {
        inventoryMapper.lockStock(itemDTO.getProductId(), itemDTO.getQuantity());
    }

    // 3. 生成訂單項
    List<OrderItem> items = createOrderCommand.getItems().stream()
            .map(OrderItem::create)
            .collect(Collectors.toList());
    orderItemMapper.createOrderItems(items);

    // 4. 生成訂單
    Long totalPrice = items.stream()
            .mapToLong(OrderItem::getPrice)
            .sum();

    Order order = new Order(createOrderCommand.getUserId(),  totalPrice, OrderStatus.CREATED);
    orderMapper.createOrder(order);

}

事務腳本與需求所需操作流程完全一致,簡單來說就是使用“編程語言”對需求進行了翻譯。

2.1.2. 基于 DDD 的下單

核心代碼如下:

public void createOrder(CreateOrderCommand createOrderCommand) {
    // 1. 檢查庫存,如果足夠則進行鎖定;如果不夠,則拋出異常
    this.inventoryService.checkIsEnoughAndLock(createOrderCommand.getItems());

    // 2. 創建 Order 聚合,此處使用靜態工廠創建復雜的 Order 對象
    Order order = Order.create(createOrderCommand);

    // 3. 保存 Order 聚合, @Transactional 在OrderRepository上
    this.orderRepository.save(order);
}

public class Order {
    private Long id;
    private Long userId;
    private Long totalSellingPrice = 0L;
    private Long totalPrice = 0L;
    private OrderStatus status;
    private List<OrderItem> orderItems = new ArrayList<>();

    // 避免外部調用
    private Order(Long userId) {
        this.userId = userId;
    }

    // 靜態工廠,封裝復雜的 Order 創建邏輯,并保障創建的 Order 對象是有效的
    public static Order create(CreateOrderCommand createOrderCommand) {
        Order order = new Order(createOrderCommand.getUserId());
        order.addItems(createOrderCommand.getItems());
        order.init();
        return order;
    }

    // 添加 OrderItem,并計算總金額
    private void addItems(List<OrderItemDTO> items) {
        if (!CollectionUtils.isEmpty(items)){
            items.forEach(item ->{
                OrderItem orderItem = OrderItem.create(item);
                this.orderItems.add(orderItem);
                this.totalPrice += item.getPrice();
            });
        }
        this.totalPrice = totalSellingPrice;
    }

    // 設置狀態完成對象的初始化
    private void init() {
        this.status = OrderStatus.CREATED;
    }
}

和事務腳本相比,由以下幾點不同:

  1. 應用服務中的 createOrder 方法內容非常簡單,可以看做是模版代碼,變化的可能性非常小,可以對其進行進一步的封裝;
  2. 核心邏輯全部在 Order 聚合根中,通過靜態方法 create 完成 Order 對象的創建,業務邏輯非常集中,形成了擁有屬性和行為的“富對象”;
  3. 數據操作與邏輯解耦,最后一步操作 orderRepository#save 方法 完成內存對象向DB數據的同步,其他部分均不涉及基礎設施;

2.2. 更新場景:訂單改價

在電商中,訂單改價主要包括:

  1. 修改訂單項價格(OrderItem),根據商品要支付金額對新價格按比例進行均攤;
  2. 修改訂單價格(Order),修改訂單的支付金額;
2.2.1. 基于事務腳本的訂單改價

核心代碼如下:

@Transactional
public void changeOrderPrice(Long orderId, Long newPrice) {
    // 1. 校驗金額
    if (newPrice <= 0) {
        throw new IllegalArgumentException("金額必須大于0");
    }

    // 校驗訂單有效性
    Order order = orderMapper.getOrderById(orderId);
    if (order == null) {
        throw new IllegalArgumentException("訂單不存在");
    }

    // 2. 對訂單項價格進行均攤
    allocateDiscount(order, order.getTotalPrice() - newPrice);

    // 3. 修改訂單價格
    order.setTotalPrice(newPrice);
    orderMapper.updateOrder(order);
}

public void allocateDiscount(Order order, Long discount) {
    if (discount == 0){
        return;
    }

    List<OrderItem> items = this.orderItemMapper.getByOrderId(order.getId());
    Long totalAmount = order.getTotalPrice();
    Long allocatedDiscount = 0L;

    for (int i = 0; i < items.size(); i++) {
        OrderItem item = items.get(i);
        Long itemAmount = item.getSellingPrice();
        if (i != items.size() - 1) {
            // 按比例進行均攤
            Long itemDiscount = itemAmount / totalAmount * discount;
            // 重新設置金額
            item.setPrice(item.getPrice() - itemDiscount);
            // 記錄累加金額
            allocatedDiscount += itemDiscount;
        }else {
            // 分攤余下的優惠金額到最后一個訂單
            Long lastItemDiscount = discount - allocatedDiscount;
            item.setPrice(item.getPrice() - lastItemDiscount);
        }
        // 更新數據庫
        this.orderItemMapper.update(item);
    }
}

和所描述的操作流程完全一致,成功使用“編程語言”完成了對需求的翻譯。

2.2.2. 基于 DDD 的訂單改價

核心代碼如下:

@Transactional
public void changeOrderPrice(Long orderId, Long newPrice) {
    // 1. 校驗金額
    if (newPrice <= 0) {
        throw new IllegalArgumentException("金額必須大于0");
    }

    // 2. 獲取訂單聚合根
    Optional<Order> orderOpt = this.orderRepository.getById(orderId);

    Order order = orderOpt.orElseThrow(() -> new IllegalArgumentException("訂單不存在"));

    // 3. 修改價格
    order.changePrice(newPrice);

    // 4. 保存 Order 聚合
    this.orderRepository.save(order);

}

// Order 聚合根內方法
public void changePrice(Long newPrice) {
    if (newPrice <= 0) {
        throw new IllegalArgumentException("金額必須大于0");
    }

    long discount = getTotalPrice() - newPrice;
    if (discount == 0){
        return;
    }
    // Item 均攤折扣
    discountForItem(discount);
    // Order 折扣
    discountForOrder(discount);
}

// Item 均攤
private void discountForItem(long discount) {
    Long totalAmount = getTotalPrice();
    Long allocatedDiscount = 0L;

    for (int i = 0; i < getOrderItems().size(); i++) {
        OrderItem item = getOrderItems().get(i);
        Long itemAmount = item.getSellingPrice();
        if (i != getOrderItems().size() - 1) {
            // 按比例進行均攤
            Long itemDiscount = itemAmount / totalAmount * discount;
            // 重新設置金額
            item.setPrice(item.getPrice() - itemDiscount);
            // 記錄累加金額
            allocatedDiscount += itemDiscount;
        }else {
            // 分攤余下的優惠金額到最后一個訂單
            Long lastItemDiscount = discount - allocatedDiscount;
            item.setPrice(item.getPrice() - lastItemDiscount);
        }
    }
}
// Order 折扣
private void discountForOrder(long discount) {
    Long newTotalPrice = getTotalPrice() - discount;
    setTotalPrice(newTotalPrice);
}

和生單流程一樣:

  1. 應用服務中的 changeOrderPrice 方法內容非常簡單,標準的模版代碼,變化可能性非常小,需要對其進行封裝;
  2. 核心邏輯全部在 Order 聚合根中,通過 changePrice 方法 完成改價邏輯,業務邏輯非常集中,形成擁有屬性和行為的“富對象”;
  3. 數據操作與邏輯解耦,最后一步操作 orderRepository#save 方法 完成內存對象向DB數據的同步,其他部分均不涉及基礎設施;

2.3. 對比

看過這兩種風格代碼有什么感覺?你可能會說代碼也沒少些什么,只是組織方式發生了變化。

確實是,只是組織方式發生變化,代碼一行都沒少。這是這點變化,帶來了革命的創新。

來看個新的場景:業務改價過于隨意,產品想增加一個環節:填入改價金額后,先把每個訂單項的均攤價格展示出來,確認無誤后在提交改價請求。

在不同的模式下,又該怎么解呢?

  1. 事務腳本模型下,大概率會 copy 一個新的 changePrice,并在其基礎上進行修改。這將產生代碼的冗余,比如原來 changePrice 方法存在bug,在修復時你需要修改多處,但往往只會想起一處;
  2. DDD模型下,你只需獲取 Order 聚合,然后調用 changePrice 方法,把均攤結果進行返回,便可實現想要的結果;

3. 小節

事務腳本 和 領域模型 是承載業務的不同模式,都有各自適用的場景,需要根據自己的需求進行選擇。

事務腳本:流程 + 數據,在操作流程中對數據進行操作;

領域模型:編排 + 模型 + 數據,基于模型能力進行編排,以完成業務操作;操作結果暫存于對象中,最后將其同步到數據庫;

DDD 靈活性還體現在:

  1. 流程組合,添加一個新功能,一次性完成生單和改價操作;
  2. 封裝不變,創建和更新主流程基本一致,可以對其進行封裝,以統一操作;
  3. 應用模式,邏輯由聚合對象承接,各種模式都可以拿來使用,比如設計模式、架構模式、領域模式等;
  4. 局部標準化,基于 DDD 戰術體系,構建標準的編程模型;

想了解 DDD 的精髓,讓我們進入下一篇:初識極簡DDD。

責任編輯:武曉燕 來源: geekhalo
相關推薦

2023-05-22 19:49:30

命令Linux

2024-12-12 08:57:47

2011-07-12 09:12:54

PowerShellPowerCLI

2012-12-10 14:03:11

InfiniBand千兆以太網超級計算機

2020-04-15 10:21:43

云計算AWSAzure

2012-12-06 15:42:00

InfiniBand千兆以太網

2017-11-17 05:39:27

DDD建模模型

2021-01-13 16:04:07

網絡On-Prem托管

2019-04-30 10:24:24

混合云多云云計算

2012-02-29 14:49:38

2025-07-01 08:15:00

FlaskDjangoPython

2015-04-03 10:24:26

2021-10-29 08:00:00

JSONJava代碼庫

2023-02-20 14:44:22

DDD領域模型

2023-02-08 07:51:52

DDD領域驅動

2025-01-26 10:10:30

2025-09-29 01:25:00

GoGinWeb 服務

2021-08-30 12:45:37

nodejsbash前端

2021-09-14 13:00:17

nodejsbash前端

2023-09-26 01:18:55

解密系統業務
點贊
收藏

51CTO技術棧公眾號

亚洲香蕉在线视频| 成人乱码一区二区三区av| 成人福利片网站| 国产精品一二三在| 国外成人在线播放| 毛茸茸多毛bbb毛多视频| 亚洲电影有码| 国产精品国产成人国产三级| 99久久自偷自偷国产精品不卡| 日本三级欧美三级| 色乱码一区二区三区网站| 欧美一区二区三区思思人| 丰满的少妇愉情hd高清果冻传媒 | 久久久久中文| 久久精品国产v日韩v亚洲| 久久性爱视频网站| 天天综合91| 欧美性xxxxxxxxx| 老司机午夜网站| 九九热视频在线观看| 国产精品一区二区三区四区 | 欧美黄色a视频| 亚洲a一区二区| 致1999电视剧免费观看策驰影院| 五月婷婷六月色| 精油按摩中文字幕久久| 日本精品久久久| 午夜爽爽爽男女免费观看| 亚洲美女久久| 日韩av在线免费播放| 中文字幕剧情在线观看| 亚洲男人av| 玉足女爽爽91| 91制片厂免费观看| 欧美精品少妇| 99热精品一区二区| 99re在线观看视频| 国产又粗又猛又爽又黄视频| 日韩国产精品久久| 青草成人免费视频| 中文字幕亚洲高清| 日韩一区二区久久| 欧美激情视频在线免费观看 欧美视频免费一 | 中文字幕在线观看视频一区| 欧美亚洲一级| 88国产精品欧美一区二区三区| 欧美一区二区三区爽爽爽| 成人羞羞网站| 在线观看日韩视频| 蜜桃av乱码一区二区三区| 亚洲福利天堂| 国产丝袜一区视频在线观看| 中文字幕影片免费在线观看| 国产91精品入| 亚洲第一级黄色片| 亚洲午夜三级在线| 国产精品久久久久久久久久久不卡| 天天插天天操天天干| 伊人狠狠色j香婷婷综合| 久久99久久99精品中文字幕| 欧美成人一区二区三区高清| 欧美日韩1080p| 欧美大片免费观看在线观看网站推荐| 五月天婷婷色综合| 天天色综合色| 欧美成人免费小视频| 日韩一区二区三区四区在线| 亚洲人体av| 久久6免费高清热精品| 免费在线观看h片| 欧美涩涩视频| 91精品国产成人| 黄色在线免费观看| 日韩av在线发布| 国产深夜精品福利| 99精品在线视频观看| 国产91精品在线观看| 久精品国产欧美| 国产精品久久久久一区二区国产 | 精品无码免费视频| 国产女人18毛片水真多| 9999精品视频| 日韩精品专区在线影院重磅| www.17c.com喷水少妇| 色天天色综合| 深夜成人在线观看| 免费又黄又爽又色的视频| 亚洲日本久久| 国产精品久久久久久久9999| 一级特黄录像免费看| 福利一区二区在线观看| 免费在线国产精品| 91高清在线| 亚洲精品第1页| 精品99在线视频| 欧美国产视频| 亚洲精品美女久久久久| 蜜桃av免费观看| 激情欧美日韩| 国产精品精品久久久| 国产超碰人人模人人爽人人添| 成人av在线影院| 亚洲精品影院| 不卡视频观看| 欧美精品一级二级| 亚洲天堂成人av| 91精品精品| 青青精品视频播放| 午夜精品久久久久久久96蜜桃 | 精品久久久久久一区| 在线视频1区2区| 精品高清一区二区三区| 91 视频免费观看| 久久91麻豆精品一区| 欧美精品一区二区免费| 亚洲欧美一二三区| 成人激情免费电影网址| 正在播放91九色| 性欧美videohd高精| 精品久久久久久久人人人人传媒 | 制服丝袜第一页在线观看| 日韩精品永久网址| 青青久久aⅴ北条麻妃| 精品国产伦一区二区三| 国产精品免费视频观看| 97国产精东麻豆人妻电影| 精品欧美视频| 最近免费中文字幕视频2019| 91video| heyzo一本久久综合| 成人手机在线播放| 婷婷丁香久久| 亚洲小说欧美另类社区| 中文字幕亚洲欧美日韩2019| 日韩一区二区视频在线| 成人小视频在线| 四虎精品欧美一区二区免费| 日本久久二区| 中文在线不卡视频| 波多野结衣在线观看视频| 91在线小视频| 97视频久久久| 超碰成人在线观看| 欧美另类精品xxxx孕妇| 国产熟女一区二区三区五月婷 | 国产精品成人69xxx免费视频| 久久亚洲影院| 欧美日韩一区在线播放 | 欧美日韩一区二区在线播放| 亚洲色偷偷色噜噜狠狠99网| 狠狠干综合网| 国产精品高清一区二区三区| 女同一区二区免费aⅴ| 日韩精品资源二区在线| 国产一级在线观看视频| 粉嫩欧美一区二区三区高清影视 | 国产蜜臀在线| 亚洲精品在线三区| 国产精品6666| 久久人人爽爽爽人久久久| 亚洲国产精品无码观看久久| eeuss国产一区二区三区四区| 久久中文精品视频| 亚洲国产精品久久人人爱潘金莲 | 久久亚洲欧美日韩精品专区| 亚洲欧美日本一区二区三区| 三级av在线| 午夜久久电影网| 免费a级黄色片| 日韩国产精品久久| 伊人久久大香线蕉av一区| 91视频亚洲| 久久久久久久久久久91| 色视频精品视频在线观看| 在线视频你懂得一区| 国产黄a三级三级| 国产东北露脸精品视频| 黄色一级在线视频| 九一亚洲精品| 91亚洲精品视频| 91超碰在线免费| 日韩精品在线免费播放| 亚洲一级特黄毛片| 一区二区三区免费| 全黄一级裸体片| 狠狠色狠狠色综合| 久久成人免费观看| 成人区精品一区二区婷婷| 亚洲一区二区三区香蕉| 免费成人在线电影| 色哟哟亚洲精品一区二区| 午夜精品久久久久久久96蜜桃| 欧美日韩国产中文字幕| 网站永久看片免费| 波多野结衣91| 久热在线视频观看| 亚洲视频1区| 中文字幕不卡每日更新1区2区| www.神马久久| 国产精品三级在线| 青草视频在线免费直播| 亚洲视频在线观看免费| av免费观看网址| 日本韩国欧美国产| 久久久一区二区三区四区| 国产亚洲va综合人人澡精品| 又色又爽又黄18网站| 青椒成人免费视频| 精品久久久久久久久久中文字幕| 欧美hd在线| 日韩欧美中文免费| а 天堂 在线| 欧美在线综合| 国产精品无码免费专区午夜| 欧美日韩在线播放视频| 激情小说综合网| 国产色99精品9i| 国产噜噜噜噜噜久久久久久久久| 看黄在线观看| 欧美激情久久久| h网站久久久| 色偷偷av一区二区三区| 欧美日本韩国一区二区| 欧美xingq一区二区| 亚洲一区二区激情| 色婷婷精品久久二区二区蜜臀av | 欧美在线免费一级片| 日本一区二区不卡高清更新| 狼人精品一区二区三区在线| 亚洲综合视频1区| 日韩一级特黄| 国产999精品| jizz内谢中国亚洲jizz| 高清在线视频日韩欧美| 日韩欧美一起| 九九热最新视频//这里只有精品| www视频在线观看免费| 日韩禁在线播放| 天天操天天操天天操| 欧美xxxx在线观看| 精品人妻一区二区三区浪潮在线| 欧美精品一二三| 一二区在线观看| 欧美日韩在线播放一区| 姑娘第5集在线观看免费好剧| 色欧美乱欧美15图片| 久草手机在线视频| 欧美午夜www高清视频| 91国产丝袜播放在线| 少妇高潮一区二区三区99| 欧美一级搡bbbb搡bbbb| 国产精品乱码久久久| 欧美久久一二三四区| 国产精品视频在线观看免费| 欧美精品在线一区二区三区| 国产麻豆免费视频| 日韩欧美国产三级电影视频| 亚洲成a人片77777精品| 欧美mv日韩mv国产网站app| www男人的天堂| 亚洲电影免费观看高清完整版在线| 日本精品一区二区在线观看| 日韩av网址在线| 国产三级在线看| 最近中文字幕mv在线一区二区三区四区| 91在线品视觉盛宴免费| 久久久国产成人精品| 日韩精品亚洲人成在线观看| 欧美精品久久久久久久久| 免费毛片b在线观看| 国产999在线| 青娱乐极品盛宴一区二区| 91亚洲va在线va天堂va国| 91精品入口| 麻豆av一区二区三区| 欧美色图一区| 国产精品一二三在线观看| 伊人影院久久| 国产福利一区视频| 国产在线一区二区综合免费视频| 国产人妖在线观看| 久久综合成人精品亚洲另类欧美| wwwww黄色| 亚洲精品日日夜夜| 国产无人区码熟妇毛片多| 欧美在线看片a免费观看| 亚洲中文字幕在线观看| 精品va天堂亚洲国产| 精品成人一区二区三区免费视频| 色yeye香蕉凹凸一区二区av| 黄色成人在线网| 国产精品久久久久久久久免费 | 懂色av粉嫩av蜜臀av一区二区三区| 综合久久久久久久| 日韩欧美一级视频| 欧美日韩成人综合在线一区二区| 亚洲精品一区二区三区区别| 国产亚洲美女精品久久久| 成人在线影视| 全球成人中文在线| 麻豆一二三区精品蜜桃| 久久久久久久久久码影片| 外国成人免费视频| 爱福利视频一区二区| 国产一区亚洲一区| 久久成人激情视频| 亚洲午夜久久久久| 夜夜骚av一区二区三区| 日韩精品福利网站| 最新黄网在线观看| 国产精品爽爽爽| 欧美人妖视频| 在线观看18视频网站| 日精品一区二区| 182在线视频| 亚洲精品一二三四区| 超碰在线97观看| 亚洲精品成人久久| 欧美xxxx免费虐| 91精品中国老女人| 日韩欧美高清在线播放| 国产二区视频在线播放| 成人网男人的天堂| 91精品一区二区三区蜜桃| 欧美性色黄大片| 波多野结衣视频播放| 成人香蕉社区| 久久99精品国产99久久| 欧美视频一区| 日批视频在线看| 亚洲图片你懂的| 亚洲综合网av| 伊人久久精品视频| 欧美专区福利免费| 乱色588欧美| 国产视频一区三区| 中国一级特黄录像播放| 亚洲一区二区视频在线观看| 99热这里只有精品99| 日韩视频免费中文字幕| 成人综合网站| 亚洲不卡1区| 久久久久久亚洲精品杨幂换脸| 精品人妻一区二区三区日产乱码卜| 亚洲无线码一区二区三区| 亚洲h视频在线观看| 色综合久综合久久综合久鬼88| 欧美激情精品| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 久久久加勒比| 亚洲欧美日韩国产yyy | 成人在线视频网站| 久久精品高清| 亚洲xxx在线观看| 日韩美女啊v在线免费观看| 国产又大又粗又硬| 免费av一区二区| 国产美女撒尿一区二区| 国产视频九色蝌蚪| 久久伊99综合婷婷久久伊| www.色国产| 在线视频欧美日韩精品| 国产资源一区| 日本美女爱爱视频| 成人性色生活片| 欧美国产成人精品一区二区三区| 亚洲欧美国产精品| 97久久网站| 日本xxx免费| 不卡一区二区三区四区| 国产精品免费精品一区| 在线观看国产精品91| 国产精品3区| 五月丁香综合缴情六月小说| 噜噜噜狠狠夜夜躁精品仙踪林| 久久亚洲春色中文字幕| 激情综合五月| 六月婷婷在线视频| 久久精品一区二区三区不卡牛牛 | 日韩午夜三级在线| 男人久久天堂| 亚洲图片在线观看| 国产成人在线观看| 国产91精品一区| 色偷偷88888欧美精品久久久| 成人福利一区| 热久久精品免费视频| 亚洲综合一区在线| 欧美色18zzzzxxxxx| 成人精品一区二区三区电影免费| 亚洲激情专区| 91香蕉视频污在线观看| 亚洲福利视频二区| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲午夜精品一区二区三区| 成人在线综合网站| 亚洲手机在线观看| 777午夜精品福利在线观看| 五月天激情综合网| 老鸭窝一区二区|