国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

回收系統架構演進實戰:與Cursor結對掃清系統混沌

開發 架構
這篇文章分享的是我們正在進行的探索,而非一個 "完美的成功案例" 。我們的重構之旅才走了一小步,還有很多坑要踩,很多問題要解決。但我們選擇邊做邊分享,因為:真實的經驗比完美的故事更有價值。

"最好的代碼不是一次寫對的,而是不斷重構出來的。" —— Martin Fowler

前言:技術債務帶來的效能瓶頸

我所在的團隊負責一個多渠道回收業務系統,接入了十幾個外部渠道。每個渠道都有自己獨特的協議規范、業務流程和特殊要求。隨著業務發展,系統逐漸的遇到了一系列問題:

  • 代碼膨脹:單個策略類代碼超過800行,包含大量if-else判斷,可讀性極差
  • 重復代碼:不同渠道間有70%的代碼邏輯相似,有很多都是邏輯類似,但參數名稱、結構不一致,難以復用
  • 難以測試:業務邏輯與協議處理耦合,單元測試覆蓋率不到30%,主要依賴人工測試
  • 維護困難:改一個渠道的邏輯,需要理解整個類的800行代碼,調研成本極高

技術債務不僅影響代碼質量,更直接沖擊了團隊的研發效能。我們在日常開發中遭遇了三個核心瓶頸:

① 新人上手困難,培養周期長

新同學加入團隊后,需要2-3個月才能理解現有代碼邏輯:

  1. 單個策略類800+行,找一個業務邏輯點要翻半天
  2. 協議處理、業務邏輯、數據操作混在一起,理不清頭緒
  3. 沒有清晰的架構文檔,只能靠"師傅帶徒弟"口口相傳

② 需求承接效率低,開發成本高

每次接入新渠道,都是一次"復制粘貼+魔改"的過程:

  1. 復制一個相似渠道的策略類
  2. 對照需求文檔,逐個方法修改參數、邏輯
  3. 開發寫入個性化邏輯

③ 測試回歸成本高,質量保障困難

代碼耦合導致"牽一發而動全身":

  1. 修改一個渠道的邏輯,可能影響其他渠道,測試范圍難以評估
  2. 單元測試覆蓋率低(30%),主要靠人工回歸測試
  3. 每次發版前,測試同學要回歸受影響渠道的核心流程

此時我的腦子里出現了一個想法:為了早點下班~ 必須重構了!

一、 重構方案設計

針對上述的三大痛點,我們很快制定了初步的重構規劃:

痛點

重構目標

預期效果

新人上手慢

架構清晰化、職責單一化

培養周期從3周降到1周,調研成本降低70%

需求效率低

通用邏輯可復用、新增渠道可配置化

新渠道接入成本降低70%

測試成本高

解耦分層、單元測試覆蓋率≥80%

回歸測試時間減半,Code Review時間降低80%

三大技術策略

  1. 分層解耦:將協議層、業務層、數據層清晰分離,讓新人快速定位代碼
  2. 責任鏈模式:每個Handler職責單一,可獨立開發、測試、復用
  3. 適配器模式:新渠道只需實現Adapter,組裝Handler即可

目標有了,問題也來了:這是一個對接10余個活躍渠道的業務系統,系統復雜,且每日有數百萬請求打進系統,如何在不影響線上業務的前提下進行重構?

漸進式落地,而非一步到位

出于對生產環境的敬畏之心,我們不敢"一刀切"地推倒重來。經過評估,我們選擇了漸進式重構策略: 整體改進是一個持續的過程,目標清晰但落地需要時間。我們會逐步驗證架構可行性,再慢慢進行遷移,確保每一步都是穩定可控的。

階段規劃:

階段

時間

目標

第一階段

1-2周

架構驗證:完成1個渠道的規范化改造

第二階段

1-2個月

核心遷移:完成50%渠道的遷移

第三階段

3-6個月

全量遷移:剩余渠道全部遷移

第四階段

持續優化

補充協議Handler、完善監控

關鍵原則

  1. 新老并行:新架構與舊代碼并存,通過配置開關灰度切換
  2. 小步驗證:每完成一個渠道,立即上線驗證,確保穩定后再推進下一個
  3. 數據對比:新老架構同時執行,對比結果一致性,發現問題及時回滾

二、 基于PDCA思想驅動的人機協作模式

PDCA(Plan-Do-Check-Act)是戴明環的核心思想,特別適合用于:

  • 復雜系統的漸進式改進:將大目標拆解為小任務
  • 風險可控的迭代驗證:每個小步驟都可驗證
  • 知識沉淀與持續優化:從單次需求到全局改進

在與AI協作時,PDCA的價值更加明顯:

PDCA階段

人的職責

AI的職責

協作模式

Plan

架構設計、任務拆解、確定路徑

提供設計建議、分析技術方案

人主導

,AI輔助

Do

編寫核心邏輯、Review代碼

生成模板代碼、實現細節

結對編程

Check

驗證業務邏輯、集成測試

生成單元測試、代碼檢查

人驗證

,AI執行

Act

總結經驗、沉淀規則

整理文檔、提取模式

共同迭代

三、 實戰案例:渠道統一Handler架構重構

3.1 Plan階段:架構設計與任務拆解

3.1.1 原有架構的痛點分析

重構前,我們的代碼結構是這樣的:

@Service("kaChannelBusinessStrategy")
publicclass KaChannelBusinessStrategy extends BaseChannelBusinessStrategy {
    
    public EnquiryPriceResult getEnquiryPrice(...) {
        // 1. 參數校驗(50行)
        // 2. 解密驗簽(30行)
        // 3. 獲取渠道配置(40行)
        // 4. 調用報價服務(60行)
        // 5. 計算傭金(50行)
        // 6. 組裝響應(30行)
        // 7. 加密簽名(20行)
        // ... 總計500+行
    }
    
    public CreateOrderResult createRecycleOrder(...) {
        // 同樣的模式,又是幾百行...
    }
}

問題總結

  1. 職責不清:一個類既處理協議,又處理業務,還管數據
  2. 代碼重復:AChannelBusinessStrategy、BChannelBusinessStrategy里有大量相似代碼
  3. 難以擴展:新增一個渠道,需要復制粘貼800行代碼
  4. 測試困難:依賴過多,mock成本高

3.1.2 新架構設計思路

本次我們的設計,是一個基于責任鏈模式的新架構:

圖片圖片

核心設計點

  • 分層解耦

Facade層:統一入口,參數校驗、異常處理

Adapter層:渠道適配,協議轉換

Handler層:責任鏈模式,每個Handler職責單一

  • 可復用的Handler
DuplicationCheckHandler     → 冪等性檢查(通用)
ChannelConfigHandler        → 渠道配置獲取(通用)
ReportMappingHandler        → 報告映射(通用)
OrderParamAssemblyHandler   → 參數組裝(可定制)
OrderCreationHandler        → 訂單創建(通用)
  • 靈活的編排機制
// A渠道:標準流程
chain.addHandler(duplicationCheck)
     .addHandler(channelConfig)
     .addHandler(reportMapping)
     .addHandler(orderParamAssembly)
     .addHandler(orderCreation);

// KA渠道:額外增加權限校驗
chain.addHandler(duplicationCheck)
     .addHandler(kaAuthCheck)  // KA特有
     .addHandler(channelConfig)
     .addHandler(reportMapping)
     .addHandler(orderParamAssembly)
     .addHandler(orderCreation);

3.1.3 任務拆解

有了架構設計后,我將重構任務拆解為8個小任務:

任務ID

任務描述

依賴關系

T1

定義責任鏈上下文數據結構

-

T2

定義IChannelAdapter接口

T1

T3

定義BusinessHandler接口

T1

T4

實現5個通用Handler

T3

T5

實現統一對外接口

T2

T6

實現ChannelAdapter

T2, T4

T7

編寫單元測試

T4-T6

T8

集成測試與灰度發布

T7

關鍵點:每個任務都是獨立可驗證的,這也為后續與Cursor協作奠定了基礎。

3.2 Do階段:與Cursor協同編碼

3.2.1 建立清晰的上下文

在開始編碼前,我做了三件事:

1、 用自然語言寫了一個詳細的架構說明文檔

AI更擅長理解結構化信息,為了提升Cursor的代碼生成質量,我首先為Cursor量身定制了一份"產品需求文檔"(PRD)。有了這份文檔,Cursor代碼生成的有效率大大提升,大部分時間,我只需要微調業務細節,就可以直接使用它生成的代碼。

包含:

  • 架構全景圖
  • 核心設計模式(責任鏈、適配器、模板方法、策略)
  • 數據流轉過程(Context如何在Handler間傳遞)
  • 擴展點說明(如何新增渠道、Handler、Action)

2、 定義好接口和數據結構

/**
 * 渠道上下文
 */
@Data
@Builder
public class ChannelContext {
    private String requestId;        // 請求ID
    private String channelCode;      // 渠道編碼
    private String action;           // 業務動作
    private Object bizData;          // 業務數據
    private Map<String, Object> handlerResults;  // Handler結果
    // ...
}

3、 編寫第一個Handler作為示例

我手寫了一個DuplicationCheckHandler,作為Cursor的參考模板:

@Component
publicclass DuplicationCheckBusinessHandler 
    extends AbstractTypedBusinessHandler<CreateOrderBizData, Boolean> {
    
    @Override
    protected Boolean handleTyped(CreateOrderBizData input, ChannelContext context) {
        // 1. 根據outOrderNo查詢訂單
        RecycleOrderVO existOrder = orderService.queryByOutOrderNo(input.getOutOrderNo());
        
        // 2. 如果訂單已存在,返回true(跳過后續Handler)
        if (existOrder != null) {
            log.info("訂單已存在,跳過創建流程, outOrderNo={}", input.getOutOrderNo());
            context.putHandlerResult("ORDER_EXISTS", existOrder);
            returntrue;
        }
        
        returnfalse;
    }
    
    @Override
    public int getOrder() {
        return100;  // 最先執行
    }
}

完成了上述步驟后,我開始與Cursor結對編程。

參考DuplicationCheckBusinessHandler,幫我實現ChannelConfigBusinessHandler,用于獲取渠道配置。需要滿足:

  • 從ExternalChannelConfigService獲取配置
  • 從PricedSourceService獲取報價源配置
  • 將結果保存到context的handlerResults中
  • order設置為200

Cursor生成的代碼:

@Component
publicclass ChannelConfigBusinessHandler 
    extends AbstractTypedBusinessHandler<CreateOrderBizData, ExternalChannelConfig> {
    
    @Resource
    private ExternalChannelConfigService configService;
    
    @Resource
    private PricedSourceService pricedSourceService;
    
    @Override
    protected ExternalChannelConfig handleTyped(CreateOrderBizData input, ChannelContext context) {
        String channelCode = context.getChannelCode();
        
        // 1. 獲取渠道配置
        ExternalChannelConfig channelConfig = configService.getByChannelCode(channelCode);
        if (channelConfig == null) {
            thrownew ChannelException("CHANNEL_NOT_FOUND", "渠道配置不存在: " + channelCode);
        }
        
        // 2. 獲取報價源配置
        PricedSourceBO pricedSource = pricedSourceService.getPricedSource(
            channelConfig.getOrgId(), input.getCategoryId());
        
        // 3. 保存到上下文
        context.putHandlerResult("CHANNEL_CONFIG", channelConfig);
        context.putHandlerResult("PRICED_SOURCE", pricedSource);
        
        log.info("獲取渠道配置成功, channelCode={}, orgId={}", 
            channelCode, channelConfig.getOrgId());
        
        return channelConfig;
    }
    
    @Override
    public int getOrder() {
        return200;
    }
}

可以看到,代碼結構完全符合預期,異常處理到位,日志也很規范。

3.2.3 快速迭代的秘訣

在Do階段,我總結出了幾個與Cursor高效協作的技巧:

技巧1:更加明確的提示

不好的提示詞:

幫我實現所有的Handler

好的提示詞:

先實現DuplicationCheckHandler,用于檢查訂單是否已存在

技巧2:提供參考代碼

參考DuplicationCheckHandler的實現方式,生成ChannelConfigHandler

技巧3:明確約束條件

要求:
1. 繼承AbstractTypedBusinessHandler
2. order設置為200
3. 必須包含日志
4. 異常使用ChannelException

技巧4:及時Check

每生成一個Handler,我都會:

  • 檢查是否符合接口規范
  • 運行單元測試
  • 代碼Review(看命名、異常處理、日志)

3.3 Check階段:代碼審查與驗證

3.3.1 多層次的檢查機制

在Check階段,我建立了三層驗證機制:

第一層:IDE即時檢查

  • Cursor的智能提示會提醒語法錯誤
  • SonarLint插件實時檢查代碼質量

第二層:單元測試

我讓Cursor幫我生成了單元測試:

為DuplicationCheckHandler生成單元測試,需要覆蓋:

  1. 訂單不存在的場景
  2. 訂單已存在的場景
  3. 查詢異常的場景

Cursor生成的測試:

@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:scf-spring-test.xml")
public class DuplicationCheckBusinessHandlerTest {
    
    @Resource
    private DuplicationCheckBusinessHandler handler;
    
    @Resource
    private IRecycleOrderService orderService;
    
    @Test
    public void testHandle_OrderNotExists() {
        // 構建測試數據
        CreateOrderBizData input = CreateOrderBizData.builder()
                .outOrderNo("OUT_ORDER_001")
                .channelCode("TEST_CHANNEL")
                .productId(123456L)
                .build();
        
        ChannelContext context = ChannelContext.builder()
                .requestId("REQ_001")
                .channelCode("TEST_CHANNEL")
                .action("CREATE_ORDER")
                .bizData(input)
                .build();
        
        // 執行
        Boolean result = handler.handleTyped(input, context);
        
        // 驗證
        System.out.println("訂單不存在場景測試結果: " + result);
        System.out.println("Context中的ORDER_EXISTS: " + context.getHandlerResult("ORDER_EXISTS"));
    }
    
    @Test
    public void testHandle_OrderExists() {
        // 構建測試數據 - 訂單已存在的情況
        CreateOrderBizData input = CreateOrderBizData.builder()
                .outOrderNo("OUT_ORDER_002")  // 這個訂單號在數據庫中已存在
                .channelCode("TEST_CHANNEL")
                .productId(123456L)
                .build();
        
        ChannelContext context = ChannelContext.builder()
                .requestId("REQ_002")
                .channelCode("TEST_CHANNEL")
                .action("CREATE_ORDER")
                .bizData(input)
                .build();
        
        // 執行
        Boolean result = handler.handleTyped(input, context);
        
        // 驗證
        RecycleOrderVO existOrder = (RecycleOrderVO) context.getHandlerResult("ORDER_EXISTS");
        System.out.println("訂單已存在場景測試結果: " + result);
        System.out.println("已存在訂單信息: " + JsonUtils.toJsonWithoutNull(existOrder));
    }
}

第三層:集成測試

我在測試環境跑了完整的下單流程,驗證Handler鏈的協作:

@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:scf-spring-test.xml")
public class ChannelUnifiedFacadeTest {
    
    @Resource
    private IChannelUnifiedFacade channelUnifiedFacade;
    
    @Resource
    private IRecycleOrderService orderService;
    
    @Test
    public void testCreateOrder_FullProcess() {
        // 構建完整的渠道請求
        CreateOrderBizData bizData = CreateOrderBizData.builder()
                .outOrderNo("TEST_OUT_ORDER_" + System.currentTimeMillis())
                .channelCode("KA")
                .productId(123456L)
                .categoryId(1L)
                .skuId(1001L)
                .userId(888888L)
                .picList(Collections.singletonList(
                    Pic.builder().picUrl("https://test.com/pic1.jpg").build()
                ))
                .build();
        
        ChannelRequest<CreateOrderBizData> request = ChannelRequest.<CreateOrderBizData>builder()
                .requestId("REQ_" + System.currentTimeMillis())
                .channelCode("KA")
                .action("CREATE_ORDER")
                .bizData(bizData)
                .build();
        
        // 執行完整流程
        ChannelResponse<Long> response = channelUnifiedFacade.process(request);
        
        // 打印結果
        System.out.println("=== 集成測試結果 ===");
        System.out.println("請求成功: " + response.isSuccess());
        System.out.println("訂單ID: " + response.getData());
        System.out.println("響應碼: " + response.getCode());
        System.out.println("響應信息: " + response.getMessage());
        
        // 驗證訂單確實創建成功
        if (response.getData() != null) {
            RecycleOrderVO order = orderService.getById(response.getData());
            System.out.println("訂單詳情: " + JsonUtils.toJsonWithoutNull(order));
            System.out.println("訂單狀態: " + order.getOrderState());
            System.out.println("外部訂單號: " + order.getOutOrderNo());
        }
    }
}

3.4 Act:規則沉淀與持續優化

3.4.1 沉淀提示詞模板

經過多次迭代,我總結出了一套可復用的提示詞模板:

模板1:生成Handler

角色:你是一個Java后端工程師,熟悉責任鏈模式

任務:實現一個BusinessHandler,用于[具體功能]

要求:
1. 繼承AbstractTypedBusinessHandler<P, R>
2. 輸入類型是[P],輸出類型是[R]
3. order值設置為[ORDER_VALUE]
4. 從context中獲取[DEPENDENCY]
5. 將結果保存到context.putHandlerResult("[RESULT_KEY]", result)
6. 異常使用ChannelException,格式:new ChannelException(errorCode, message)
7. 添加日志:處理開始、處理成功、處理失敗

參考代碼:[粘貼參考Handler代碼]

模板2:生成Adapter

角色:你是一個Java架構師,熟悉適配器模式和責任鏈模式

任務:實現[渠道名]ChannelAdapter

要求:
1. 繼承AbstractIChannelAdapter
2. 注入以下Handler:[列出Handler列表]
3. 根據action構建不同的Handler鏈:
   - CREATE_ORDER: [Handler順序]
   - UPDATE_ORDER: [Handler順序]
4. 添加@Component注解,value為渠道code,用于自動注入
5. 添加完善的日志

參考代碼:[粘貼AChannelAdapter代碼]

3.4.2 持續優化

在重構過程中,我發現了一個可以提取的通用模式:參數校驗

最初,每個Handler都自己做參數校驗:

// DuplicationCheckHandler
if (StringUtils.isBlank(input.getOutOrderNo())) {
    throw new ChannelException("PARAM_ERROR", "外部訂單號不能為空");
}

// ChannelConfigHandler
if (StringUtils.isBlank(input.getChannelCode())) {
    throw new ChannelException("PARAM_ERROR", "渠道編碼不能為空");
}

在Act階段,我提取了一個通用的ParamValidationHandler

@Component
publicclass ParamValidationBusinessHandler 
    extends AbstractTypedBusinessHandler<Object, Void> {
    
    @Override
    protected Void handleTyped(Object input, ChannelContext context) {
        //.....
        returnnull;
    }
    
    @Override
    public int getOrder() {
        return50; 
    }
}

現在,只需要在Handler鏈中加入這個Handler,就能統一處理參數校驗了。

最后的話

這篇文章分享的是我們正在進行的探索,而非一個 "完美的成功案例" 。

我們的重構之旅才走了一小步,還有很多坑要踩,很多問題要解決。但我們選擇邊做邊分享,因為:

真實的經驗比完美的故事更有價值。

愿你在AI時代,既能擁抱新工具提升效率,又能保持對代碼質量的追求、對架構美感的堅持。

關于作者,于天奇,俠客匯Java開發工程師。 想了解更多轉轉公司的業務實踐。

責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2022-08-25 22:24:19

架構電商系統

2022-08-26 20:00:00

系統架構

2024-06-13 07:51:08

2018-11-29 09:36:45

架構系統拆分結構演變

2018-09-19 13:42:28

Kubernetes架構負載均衡

2016-01-06 10:10:25

2022-01-20 10:14:33

架構軟件開發

2016-06-15 14:21:09

2018-06-19 17:32:32

電競數據平臺

2023-07-06 00:41:03

SQLNoSQL數據庫

2025-11-11 03:00:00

CursorAI開發模式

2021-09-02 16:10:57

系統數據存儲

2024-08-28 09:50:51

2025-04-03 00:45:12

UP主分銷系統

2025-08-01 02:22:00

2025-04-29 08:11:15

2019-01-28 08:31:47

360架構系統

2022-06-09 08:01:43

秒殺系統互聯網架構

2024-03-08 14:43:03

攜程技術系統

2025-07-11 03:10:00

LLMRAGAI
點贊
收藏

51CTO技術棧公眾號

欧美一区国产一区| 136福利第一导航国产在线| 亚洲日本国产| 九九九久久国产免费| 黄色一级片在线观看| 午夜久久久影院| 369你懂的电影天堂| 91麻豆精品一区二区三区| 自拍另类欧美| 久久aⅴ国产欧美74aaa| 国产伦精品一区二区三区在线 | 欧美亚洲一区三区| 在线视频色在线| 一区二区三区在线视频观看58| 国产日韩一区二区在线观看| 精品一区二区三区视频| 在线观看一区欧美| 精品一区二区三区视频在线观看| 午夜精品美女久久久久av福利| 巨乳诱惑日韩免费av| 亚洲v国产v在线观看| 免费观看30秒视频久久| 性欧美大战久久久久久久免费观看 | 亚洲国产高清aⅴ视频| 精品少妇人妻av免费久久洗澡| 蜜桃视频一区二区| 国产激情片在线观看| 成人看片黄a免费看在线| 国产精品后入内射日本在线观看| 久久久精品国产免大香伊| 成人禁在线观看网站| 亚洲成av人片在线观看| 91高清在线| 亚洲精品自拍第一页| 福利精品在线| 欧美一级黄色网| 影视一区二区| 日本在线一区| www欧美成人18+| 中午字幕在线观看| 日韩欧美另类在线| 成人交换视频| 日本国产欧美一区二区三区| 日韩中文字幕高清在线观看| 99蜜桃在线观看免费视频网站| 久久国产精品99国产| 国内少妇毛片视频| 亚洲色图.com| 毛片av在线| 欧美成人手机在线| 亚洲高清资源在线观看| 亚洲激情一区二区| 中文字幕精品一区二区三区精品| 在线播放av片| 亚洲欧美日本精品| 欧美人与牛zoz0性行为| 久久99国产精品| 久久午夜电影网| 青青操视频在线| 精品调教chinesegay| 国产成人福利av| 国产成人女人毛片视频在线| 国产中文一区二区三区| 黑巨人与欧美精品一区| 日韩一区二区三区视频在线观看| 亚洲一区导航| 亚洲在线第一页| 成人app下载| 毛片在线免费| 精品国产一区二区三区四区在线观看| 日韩成人精品一区| 日韩最新中文字幕| 一本大道久久a久久精二百| 国产精品蜜芽在线观看| 日本不卡免费高清视频| 久久成人免费网站| 日韩电影网址| 久久久久中文字幕| 久久99精品国产麻豆婷婷洗澡| 诱人的瑜伽老师3hd中字| 亚洲美女www午夜| 女生裸体视频一区二区三区| 美女日批免费视频| 欧美一区二区三区视频免费播放| 天堂久久av| 欧美高清视频一区| 亚洲精品视频在线观看网站| 中国色在线日|韩| 国产一区不卡在线观看| 亚洲视频图片小说| 丰满少妇一区| 色播亚洲婷婷| 日韩欧美一区二区三区| 在线日韩成人| 欧美一区二区三区综合| 欧美日韩在线播放三区| 日日狠狠久久偷偷综合色| 久久国产精品免费观看| 911国产精品| 久久一区二区三区喷水| www.精品在线| 久青草国产97香蕉在线视频| 可以免费看不卡的av网站| 免费在线超碰| 91精品久久久久久久久| 国产精品福利电影一区二区三区四区| 国产高清不卡| 亚洲ai欧洲av| 日韩视频在线永久播放| 欧美日韩午夜| 国产专区在线| 亚洲综合大片69999| 亚洲日本在线看| 爱爱精品视频| www.激情小说.com| 久久久久久成人精品| 久久日韩精品一区二区五区| 午夜伦理福利在线| 中文字幕一区综合| 亚洲国产高潮在线观看| 久久久999| 黄页在线观看免费| 日韩中文一区二区三区| 91精品蜜臀在线一区尤物| 亚洲一级特黄| 最近高清中文在线字幕在线观看| 99视频免费观看蜜桃视频| 一本色道久久综合狠狠躁的推荐| 日本精品黄色| 嫩草懂你的影院| 国产精品十八以下禁看| 亚洲高清免费视频| 999精品在线| 成年人在线观看| 欧美日韩亚洲一区二区三区在线观看| 日韩一区二区三区在线观看 | 国产在线1区| 欧美污视频久久久| 日韩亚洲电影在线| 久久精品国产成人一区二区三区| 91九色在线看| 日本精品免费视频| 中文字幕久热精品视频在线| 粉嫩av亚洲一区二区图片| 99精品国自产在线| 日本成人黄色网| 日本久久久久久久久| 欧美日韩亚洲91| 鲁大师影院一区二区三区| av资源中文在线天堂| www.一区二区.com| 精品中文字幕乱| 亚洲图片有声小说| av成人激情| 欧美粗大gay| 亚洲77777| 亚洲综合在线小说| 亚洲国产成人精品女人久久久 | 成人看片人aa| 欧美妇女性影城| 国内精品免费**视频| 久久伊人久久| 中国在线观看免费国语版电影| 国产伦精品一区二区三区免| 精品成人一区二区三区四区| 国产999精品久久久久久| 91精品网站在线观看| 黄色av免费| 国内一区在线| 国产午夜精品全部视频播放| 国产精品欧美精品| 欧美91福利在线观看| 激情国产在线| 91麻豆福利| 欧美一级片免费观看| 日韩中文字在线| 第一福利永久视频精品| 久久成人综合网| 久久av免费看| aaa在线播放视频| 91大神在线资源观看无广告| 国产精品v欧美精品v日韩精品| 一区二区欧美在线| 色综合久久久久| 成人av在线资源网站| 91精品电影| 97色婷婷成人综合在线观看| 国产一区二区三区不卡在线| 无码中文字幕色专区| 99久久精品无码一区二区毛片| 国产午夜精品全部视频在线播放| 亚洲综合激情小说| 精品一区二区免费在线观看| 一本久久青青| 中文字幕影音在线| 欧美婷婷久久五月精品三区| 91猫先生在线| 视频一区视频二区视频三区视频四区国产 | 黄色片久久久久| 久久精品日产第一区二区三区|