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

基于CI的事件驅動擴展和開發規范

開發 架構
最近在做一個網盤的項目,得到了很多經驗和教訓。總結了一些常見的問題,于是寫了下面這樣一個小東西來解決。

問題

項目中為了追求速度和性能,數據庫的表設計往往不是滿足范式的。這就可能導致在改一個表中項目實體的元信息時,需要同時修改其他表中的信息。比方說:我有一個一張表來表示虛擬的文件(每一行記錄表示一個文件),另一個張表用來記錄已經發布的文件和生成的外鏈信息。可能為了少進行一次查表,我們會把文件的一些基本信息,如(文件名,發布人的名字)記錄在外鏈的表中。當修改了文件表中的元信息時,外鏈表中的信息也需要修改。常見的方法是使用ORM,但如果我還需要“根據具體情況再決定要修改其他表中的元信息”這種情況時,ORM就有點難搞了。

同時,我希望我在對上一個問題中提到的“文件”數據進行操作時,不需要知道任何其他相關的細節。也就是將其他的這些關系劃到其他模塊去。

系統的接口往往需要復合的權限控制,并且在完成基礎的部分的權限控制之后,不希望由于后續功能的增加而去修改基礎部分。同時希望后續的這些功能在不啟用時,系統能夠恢復到基礎的權限控制策略。比方說,一個模擬的網盤文件,我在系統沒有增加分享這個功能時,權限控制策略是“只有自己可以訪問”,在增加了分享功能后,策略是“指定分享的好友都可以訪問”。為了在單獨完成分享模塊代碼時不修改之前的代碼,常用的方法是使用鉤子來拋出權限信息,系統自動進行復合,下面會詳述。

當項目不是太大時(沒有大到需要使用HMVC等更高級的模式),需要一種簡單、弱耦合的模塊管理和開發規范。

解決方案(以CI為基礎框架)

第一部分 

以 問題1和2 中的例子來說,數據變化的主體是文件,其他都是跟隨變化。很自然就讓人想到觀察者模式,只不過我這里不是把“關聯”的類注冊到“文件”類中監聽變化,而是聲明一個全局事件,每一個模塊都持有它的一個引用,都通過它來拋出事件,都通過監聽它的事件來進行自己的操作。

你可能會說這在某種程度上破壞了模塊的封裝,因為模塊知道了上層的細節。但是這樣做就大大降低了模塊之間的耦合。首先,基礎模塊(“文件”)不用知道外部如何應對變化,也不用管理外部的監聽者,對自己的操作只需要拋出一個事件就夠了。對監聽模塊來說,只需要監聽系統統一約定的事件就好,設置不用關注基礎模塊的監聽方法甚至名字都不用關心。

在CI中的實現有兩個步驟:

1.在CI中聲明一個事件類,生成一個實例作為全局事件對象,綁定在控制器實力上。

2.使用CI的model作為模塊(為了實現更強的封裝可以把業務邏輯單獨寫成libraries中的類),初始化時給它綁定這個事件。同時獲取的模塊需要監聽的事件,將這些事件綁定到全局事件對象。

以下是代碼,Event 類。

  1.  <?php 
  2. /** 
  3.  * @author rainer_H 
  4.  * @date 2012-6-25 
  5.  * @encode UTF-8 
  6.  */ 
  7. class Event { 
  8.     private $event_array = array(); 
  9.     public function __construct(){ 
  10.     } 
  11.     //$module_callback : array(module_name, callback_method) 
  12.     public function bind( $event_name$module_callback ){ 
  13.         if( !isset( $this -> event_array[$event_name] ) ){ 
  14.             $this -> event_array[$event_name] = array(); 
  15.         } 
  16.         array_push$this -> event_array[$event_name], $module_callback ); 
  17.     } 
  18.     public function multi_bind( &$bindings ){ 
  19.         foreach$bindings as $event_name => $module_callback ){ 
  20.             $this -> bind( $event_name$module_callback ); 
  21.         } 
  22.     } 
  23.    public function trigger( $event_name ){ 
  24.        if( isset( $this -> event_array[$event_name] )){ 
  25.           foreach$this -> event_array[$event_nameas $module_callback ){ 
  26.              $args = array_slice( func_get_args(), 1); 
  27.                 call_user_func_array(array(  $module_callback[0],$module_callback[1]), $args); 
  28.             } 
  29.         } 
  30.     } 
  31. ?> 

MY_Controller 的構造函數實現:

  1. public function __construct(){ 
  2.         parent::__construct(); 
  3.            //初始化事件中心 
  4.         $this -> load -> library("Event"); 
  5.         //初始化注冊模塊,這里寫你自己的。 
  6.         $modules = array('user','test'); 
  7.         //初始化事件中心模塊 
  8.         $auths = array(); 
  9.         foreach$modules as $module ){ 
  10.             //初始化各個模塊,將事件中心傳入以供模塊調用 
  11.             $model_name = "{$module}_model"
  12.             $this -> load -> model( $model_name$module ); 
  13.             $this -> $model_name -> event =  $this -> event; 
  14.             //以上這句優雅一點可以寫成 
  15.             //$this -> $model_name -> set_handler($this -> event); 
  16.             //綁定事件 
  17.             $listen = $this -> $module -> listen(); 
  18.             foreach$listen as $event_name => $callback ){ 
  19.                $listen[$event_name] = array$this-> $module$callback ); 
  20.          } 
  21.           $this -> event -> multi_bind( $listen ); 
  22.      } 
  23.     } 

以上你注意到模塊需要有一個listen方法,來返回所有自己需要監聽的事件。如果你不喜歡這種約定也可以在模塊獲得全局事件對象event后,自己在模塊內通過event->bind()來實現綁定。

以下是listen返回的事件監聽數組,也是事件格式:

  1. public function listen(){ 
  2.     return array( 
  3.         //事件名 => 觸發的函數名 
  4.         "user logged in" => "react_user_login" 
  5.     ); 

第二部分

對于事件的復合我采用了一個簡單的鉤子模式,就是讓模塊約定聲明一個auth方法,返回自己要進行權限控制的api和自己進行控制的方法。示例如下:

  1. public function auth(){ 
  2.        return array( 
  3.            //api名稱 
  4.            'main/index' => array( 
  5.                //權限規則名稱 
  6.                'user_login' => array( 
  7.                    //對同一api需要忽略掉的規則 
  8.                    'ignore' => array( 'text_login' ), 
  9.                    //自己的驗證函數 
  10.                    'validate' => 'login_validate' 
  11.                ) 
  12.            ) 
  13.        ); 
  14.    } 

由于一個api可能會有多個模塊聲明自己的驗證規則,所以提供一個ignore字段來表示需要明確忽略掉的規則。在validate指向的函數值,函數自己通過post或這個get獲取參數并進行驗證。這里有點讓人感覺不舒服的地方就是上層的模塊需要知道基礎模塊的權限驗證細節,以便使用ignore來去掉和自己沖突的規則。好在這種情況應該不會太多,大部分可以通過“將沖突的api拆成不同的api”來解決。而且這種方法可以使你在增加功能時完全不再修改之前的權限設置。

那么如何進行合并?這里改造了一下MY_controller。代碼如下:

  1. class MY_Controller extends CI_Controller{ 
  2.    protected $auth_array = array(); 
  3.    public function __construct(){ 
  4.        parent::__construct(); 
  5.        //初始化事件中心 
  6.        $this -> load -> library("Event"); 
  7.        //初始化注冊模塊 
  8.        $modules = array('user','test'); 
  9.       //初始化事件中心模塊 
  10.        $auths = array(); 
  11.        foreach( $modules as $module ){ 
  12.            //初始化各個模塊,將事件中心傳入以供模塊調用 
  13.            $model_name = "{$module}_model"
  14.            $this -> load -> model( $model_name, $module ); 
  15.            $this -> $model_name -> event =  $this -> event
  16.              //綁定事件 
  17.            $listen = $this -> $module -> listen(); 
  18.            foreach( $listen as $event_name => $callback ){ 
  19.                $listen[$event_name] = array( $this-> $module, $callback ); 
  20.            } 
  21.            $this -> event -> multi_bind( $listen ); 
  22.          //獲取模塊的權限信息 
  23.            if( method_exists( $this -> $module , "auth") ){ 
  24.                $auths[$module] = $this -> $module -> auth() ; 
  25.            } 
  26.        } 
  27.                //得到整合后的權限數組 
  28.        $this -> auth_array = $this -> map_auth_array( $auths ); 
  29.    } 
  30.    private function map_auth_array( $auth_array ) { 
  31.        $output = array(); 
  32.        foreach( $auth_array as  $module_name => $auths_content ){         
  33.            foreach( $auths_content as $route => $auths ){ 
  34.               if( !isset( $output[$route] ) ){ 
  35.                    $output[$route] = array(); 
  36.                    $output[$route]['ignore'] = array(); 
  37.                }  
  38.                foreach( $auths as $auth_name => $auth ){ 
  39.                    $auths[$auth_name]['module'] = $module_name; 
  40.                    if( isset( $auth['ignore'] ) ){ 
  41.                        if( !is_array( $auth['ignore'])){ 
  42.                            $auth['ignore'] = array( $auth['ignore'] ); 
  43.                        } 
  44.                        $output[$route]['ignore'] = array_merge($output[$route]['ignore'],$auth['ignore']); 
  45.                        array_unique( $output[$route]['ignore'] ); 
  46.                    } 
  47.                }  
  48.                $output[$route] += $auths; 
  49.            } 
  50.        } 
  51.           foreach( $output as $route => $auths){ 
  52.            if( !empty( $auths['ignore'] ) ){ 
  53.                foreach( $auths['ignore'as $ignore ){ 
  54.                    unset( $output[$route][$ignore] ); 
  55.                } 
  56.            } 
  57.            unset( $output[$route]['ignore']); 
  58.        } 
  59.       return $output; 
  60.    } 
  61.    public function auth_validate(){ 
  62.        //獲取當前路徑 
  63.        $route = 'main/index'
  64.        if( $this -> auth_array[$route] && !empty( $this -> auth_array[$route] ) ){ 
  65.            foreach( $this -> auth_array[$route] as $auth ){ 
  66.                $this -> $auth['module'] -> $auth['validate'](); 
  67.            } 
  68.        } 
  69.    } 

控制器將最后計算出來的權限驗證數組放在了自己的auth_array屬性中,用戶在繼承了該控制器之后,通過$this -> auth_validate() 就能開始執行驗證。

如果你不喜歡這種控制器與權限合并的方式或者你的控制器很復雜時,你也可以將權限單獨提出到一個類中。另外你可以再權限合并函數中記錄日志幫助調試。

另外貼出兩個具體的model:

  1. <?php 
  2. /** 
  3.  * @author rainer_H 
  4.  * @date 2012-6-26 
  5.  * @encode UTF-8 
  6.  */ 
  7. class User_model extends CI_Model{ 
  8.     //聲明自己的權限控制規則 
  9.     public function auth(){ 
  10.         return array
  11.             //api名稱 
  12.             'main/index' => array
  13.                 //權限規則名稱 
  14.                 'user_login' => array
  15.                     //對同一api需要忽略掉的規則 
  16.                     'ignore' => array'text_login' ), 
  17.                     //自己的驗證函數 
  18.                     'validate' => 'login_validate' 
  19.                 ) 
  20.             ) 
  21.         ); 
  22.     } 
  23.    public function __construct(  ){ 
  24.         parent::__construct( ); 
  25.     } 
  26.      //聲明自己需要監聽的對象 
  27.     public function listen(){ 
  28.         return array
  29.         ); 
  30.     } 
  31.     public function login_validate(){ 
  32.         echo "user login_validate"
  33.     } 
  34.    public function login(){ 
  35.         $this -> event -> trigger( "user logged in""hahaha" ); 
  36.     } 
  37. ?> 
  38. <?php 
  39. /** 
  40.  * @author rainer_H 
  41.  * @date 2012-6-26 
  42.  * @encode UTF-8 
  43.  */ 
  44. class Test_model extends CI_Model{ 
  45.     public function __construct(  ){ 
  46.         parent::__construct(  ); 
  47.     } 
  48.     public function auth(){ 
  49.         return array
  50.             'main/index' => array
  51.                 'text_login' => array
  52.                     'validate' => 'login_validate' 
  53.                 ) 
  54.             ) 
  55.         ); 
  56.     } 
  57.     public function listen(){ 
  58.         return array
  59.             "user logged in" => "react_user_login" 
  60.         ); 
  61.     } 
  62.     public function login_validate(){ 
  63.         echo "test login_validate"
  64.     } 
  65.      public function react_user_login( $user = false ){ 
  66.         echo "{$user} user logged in react from Test."
  67.     } 
  68. ?> 

原文鏈接:http://www.cnblogs.com/sskyy/archive/2012/06/27/2565294.html

 

【編輯推薦】

 

 

責任編輯:彭凡 來源: 博客園
相關推薦

2023-11-02 08:01:22

2024-06-28 10:19:02

委托事件C#

2023-03-16 15:18:16

2021-08-01 23:47:54

通用模型驅動

2023-12-28 07:57:27

2013-03-26 14:17:21

架構架構設計事件驅動

2009-12-31 08:49:15

模型驅動開發

2021-07-27 08:01:22

CICD平臺

2009-06-29 16:19:57

JSP Servlet

2009-07-02 09:56:24

導入事件驅動技術JSP Servlet

2009-10-20 14:58:15

Javascript事

2021-11-23 23:39:19

微服務開發架構

2025-02-13 08:53:10

WinForm事件驅動編程模型開發

2012-08-24 09:02:36

IBMdW

2020-04-16 21:02:35

前端命名規范html規范

2023-02-07 07:25:36

Spring事件驅動

2023-08-31 08:21:42

KubernetesKADA驅動

2015-12-02 14:56:07

Docker開發模式持續集成

2025-10-28 02:22:00

2019-04-19 21:06:23

事件驅動架構VANTIQ
點贊
收藏

51CTO技術棧公眾號

亚洲第一会所001| 日本大片在线观看| 欧美精品入口| 日韩手机在线导航| 少妇高潮毛片色欲ava片| 日韩三级电影网| 麻豆精品国产传媒mv男同| 蜜臀久久99精品久久久久久宅男| 中文字幕一区二区三区人妻在线视频| 91吃瓜在线观看| 国产精品麻豆久久久| 国产精品国产精品国产专区不卡| 日日夜夜操视频| 中文字幕亚洲精品乱码| 精品亚洲一区二区三区在线观看| mm131亚洲精品| 黄色激情在线播放| **欧美大码日韩| 久久狠狠久久综合桃花| 国产剧情久久久| 欧美亚洲一区| 色综合五月天导航| 国产又粗又长又黄的视频| 日韩精品社区| 欧美v国产在线一区二区三区| 日韩在线第三页| av资源在线播放| 亚洲精品一二三| 少妇精品久久久久久久久久| 天天操天天插天天射| 久久99热99| 国产成人精品一区| 国产a∨精品一区二区三区仙踪林| 日韩综合精品| 亚洲视频在线观看| 影音先锋黄色资源| 日韩区一区二| 日韩天堂在线观看| 亚洲怡红院在线| 欧美日韩五区| 91黄色小视频| 免费在线观看毛片网站| 黄色漫画在线免费看| 亚洲国产三级在线| 97超碰国产精品| 中文在线字幕免费观看| 亚洲日本一区二区| av动漫免费观看| 久久日韩视频| 亚洲欧美中日韩| 在线不卡视频一区二区| jyzzz在线观看视频| 久久久不卡网国产精品二区| 精品视频在线观看| 日韩黄色影片| 国产亚洲精品精华液| 欧美日韩在线高清| 精品视频三区| 日本一区二区三区dvd视频在线| 久久精品一区二区三区不卡免费视频| 人人妻人人澡人人爽精品日本 | 国产成人ay| 亚洲免费视频观看| 国产成人福利在线| av资源久久| 中文字幕国产亚洲2019| 毛片视频免费播放| 91精品国产乱码久久久久久久| 少妇激情综合网| 欧美老熟妇一区二区三区| 欧美成人一区二免费视频软件| 久久九九亚洲综合| 久草资源在线视频| 午夜在线一区| 国产精品久久久久久一区二区 | 亚洲精品国产欧美| 精品人妻一区二区三区视频| 久草成人在线| 久久精品国产视频| 日韩精品一区二区在线播放 | 亚洲欧美国产毛片在线| 日本高清视频免费在线观看| 2020av在线| 欧美午夜在线一二页| 三级黄色片免费观看| 国产一区福利| 在线观看精品自拍私拍| 五月天av网站| 亚洲在线国产日韩欧美| 国产精品午夜视频| 亚洲欧美强伦一区二区| 国产午夜精品久久| 国产一级黄色录像片| 亚洲深夜视频| 91精品综合久久久久久| 在线观看国产免费视频| 欧美亚洲精品在线| 日韩在线www| 在线观看免费国产视频| 麻豆精品一区二区综合av| 亚洲最大成人免费视频| 水莓100在线视频| 亚洲欧美一区二区三区国产精品 | 400部精品国偷自产在线观看| 超黄网站在线观看| 欧美日韩精品一二三区| 欧美熟妇精品一区二区蜜桃视频| 精品国产网站| 久久久欧美精品| 一级黄色小视频| 99精品在线观看视频| 欧美日韩视频免费在线观看| 自拍偷拍亚洲视频| 欧美xingq一区二区| 成年人网站在线观看视频| 国产一区白浆| 国产传媒欧美日韩| 久久日韩视频| 欧美三片在线视频观看| 日本黄色网址大全| 在线精品福利| 99在线免费观看视频| 欧美性猛交xxx乱大交3蜜桃| 日韩欧美在线免费| 伦理片一区二区| 综合国产精品| 成人伊人精品色xxxx视频| 狠狠v欧美ⅴ日韩v亚洲v大胸 | 国产精品又粗又长| 国产精品美女久久久久人| 中文国产成人精品| 亚洲成人av影片| 91在线看国产| 欧美不卡在线播放| 国产成人在线中文字幕| 欧美成人精品三级在线观看| 中文字幕人妻一区二区在线视频| 91免费看`日韩一区二区| 亚洲色成人www永久在线观看| 国产午夜久久av| 久久亚洲成人精品| 91在线公开视频| 国产精品护士白丝一区av| 免费看污污网站| 精品国产一区探花在线观看| 日本在线精品视频| 久久精品蜜桃| 在线一区二区视频| 黄免费在线观看| 日韩av在线发布| 视频一区二区三区免费观看| 深夜视频一区二区| 中文字幕无线精品亚洲乱码一区 | 日韩欧美一级大片| 日本一区二区视频在线| 一道本视频在线观看| 国产午夜一区| 国产精品免费福利| 拍真实国产伦偷精品| 91精品国产综合久久久久久久久久 | 成人免费毛片男人用品| 国产亲近乱来精品视频 | 国产精品69久久久久水密桃| 一本色道久久88亚洲精品综合| 涩爱av色老久久精品偷偷鲁 | av有声小说一区二区三区| 在线观看久久av| 99久久精品日本一区二区免费| 一区二区日韩av| 一本加勒比波多野结衣| 蜜桃视频一区| 亚洲人久久久| 亚洲成人五区| 97久久久久久| 国产尤物视频在线| 91麻豆精品国产自产在线| 青娱乐国产精品| 久久综合九色综合97婷婷女人| 国产高潮免费视频| 欧美人成在线| 欧美自拍资源在线| 精品一区91| 欧美一级高清免费播放| 97电影在线| 精品久久久三级丝袜| 国产嫩bbwbbw高潮| 亚洲品质自拍视频网站| 你懂的在线观看网站| 日韩av在线发布| 国产女教师bbwbbwbbw| 性欧美lx╳lx╳| 91系列在线观看| 中文字幕高清在线播放| 久久精品国产欧美激情| 深夜福利视频在线观看| 欧美一区二区三区视频在线| 久久亚洲天堂网| 亚洲色图.com| 亚欧洲乱码视频| 国产成人福利片| 国产精品一区二区电影| 亚洲国产精品免费视频| 在线不卡一区二区| 久久久久99精品| 国产精品天天看| 国产亚洲精品成人a| 日日夜夜免费精品视频| 日韩中文在线字幕| 精品视频免费| 精品久久久久久一区| 24小时成人在线视频| 欧美中文在线观看| 亚洲综合伊人久久大杳蕉| 亚洲欧洲av一区二区| 亚洲伦理在线观看| 欧美日韩五月天| 国产伦精品一区二区三区视频网站| 亚洲欧美日韩人成在线播放| 制服 丝袜 综合 日韩 欧美| 成人免费高清在线| 激情文学亚洲色图| 蜜臀91精品一区二区三区| 国模无码视频一区二区三区| 欧美极品一区二区三区| 亚洲人一区二区| 欧美亚洲国产一区| 欧美一区二区高清在线观看| 福利电影一区| dy888夜精品国产专区| 亚瑟国产精品| 国产精品日韩欧美综合| 伊人久久综合一区二区| 97精品在线视频| av资源在线看片| 欧美激情成人在线视频| av激情在线| 麻豆成人在线看| 黄色在线论坛| 日韩有码在线观看| 日本a级在线| 日韩在线精品一区| 9色在线视频| 中文日韩电影网站| 岛国在线大片| 在线日韩日本国产亚洲| 国产69久久| 中文字幕精品在线| 成人欧美亚洲| 日韩在线视频观看| 色开心亚洲综合| 久久久电影免费观看完整版| 黄色av电影在线播放| 久色乳综合思思在线视频| www.久久ai| 久久久久久尹人网香蕉| 123区在线| 欧美在线播放视频| 欧洲亚洲两性| 国产美女精品视频| 成人噜噜噜噜| 国产精品免费区二区三区观看 | 欧美在线不卡一区| 日韩国产亚洲欧美| 欧美精品日韩精品| 国产不卡av在线播放| 精品国产乱码久久久久久蜜臀 | 一二三四视频社区在线| 国产欧美精品| 日本中文字幕高清| 国产一区二区三区在线观看免费| 三大队在线观看| 99re这里只有精品6| 国产小视频自拍| 亚洲天堂av一区| 国产网友自拍视频| 色欧美日韩亚洲| 国产乱淫a∨片免费观看| 精品国产一区二区精华| 男生女生差差差的视频在线观看| 国产一区二区三区在线看| 国产婷婷视频在线| 韩国日本不卡在线| 亚洲精品555| 99热国产免费| 精品国产一区二区三区四区| 国产欧美综合一区| 国产精品三上| 中文字幕在线观看日| www.欧美.com| 老司机深夜福利网站| 亚洲成在人线免费| 国产精品第6页| 欧美www视频| 在线观看国产原创自拍视频| 久久久久久999| 国产精品麻豆成人av电影艾秋| 福利精品视频| 欧美艳星介绍134位艳星| 日本一本中文字幕| 日本亚洲一区二区| aaa黄色大片| 国产精品情趣视频| 成年免费在线观看| 69久久夜色精品国产69蝌蚪网| 亚洲三级中文字幕| 欧美成人免费全部| av高清一区| 国产一区二区不卡视频在线观看| 久久视频在线| 超碰网在线观看| 成人手机在线视频| 日韩成人短视频| 欧美亚洲动漫另类| 亚洲人视频在线观看| 久久久久久av| 国产高清精品二区| 日本精品国语自产拍在线观看| 黑人一区二区| 国产伦精品一区二区三区妓女下载| 国产亚洲欧美日韩日本| 精品在线播放视频| 欧美成人三级电影在线| 拍真实国产伦偷精品| 国产精品久久久久久av福利软件| 久久精品亚洲成在人线av网址| 久久久天堂国产精品| 九一九一国产精品| 美国黑人一级大黄| 色国产精品一区在线观看| 少妇人妻偷人精品一区二区| 欧美成人在线影院| 亚洲精品第一| 中文字幕成人一区| 美女久久久精品| 国产三级短视频| 在线视频中文字幕一区二区| 清纯唯美亚洲色图| 91精品成人久久| 欧美天堂社区| 欧美啪啪免费视频| 成人不卡免费av| 精品深夜av无码一区二区老年| 日韩欧美国产一区二区三区 | 奇米4444一区二区三区| 林ゆな中文字幕一区二区| 欧美不卡在线播放| 91在线视频官网| 福利网址在线观看| 亚洲欧洲国产精品| 欧美xxxx做受欧美护士| 五月婷婷一区| 久久激情五月婷婷| 一区二区国产精品精华液| 日韩一区二区三区观看| 欧美xxx黑人xxx水蜜桃| 国产精品一区二区不卡视频| 亚洲每日更新| 粉嫩av蜜桃av蜜臀av| 日本乱人伦aⅴ精品| jyzzz在线观看视频| 亚洲iv一区二区三区| 欧美女激情福利| 日本japanese极品少妇| 一本大道久久a久久综合| 福利成人在线观看| 国产视频999| 激情久久久久| 国产手机在线观看| 欧美日本在线一区| 三级资源在线| 欧美精品在线一区| 奇米色777欧美一区二区| 极品魔鬼身材女神啪啪精品| 精品欧美乱码久久久久久| 中文在线аv在线| 正义之心1992免费观看全集完整版| 国产呦萝稀缺另类资源| 日韩av男人天堂| 一区二区三区无码高清视频| 国语精品视频| 六月丁香婷婷激情| 国产精品传媒入口麻豆| 亚洲精品一区二区口爆| 国产999在线观看| 久久久久亚洲| 亚洲AV无码国产精品| 精品视频资源站| av免费不卡| 伊人久久99| 91蜜桃在线观看| 国产三级在线观看视频| 欧美在线视频网站| 中文字幕av亚洲精品一部二部| 日韩中文字幕电影| 日韩欧美一级二级三级| 欧美精品日日操| 久久人人爽人人爽人人av| 国产欧美日韩精品a在线观看| 亚洲黄色小说网址| 国产精品一区二区久久精品 |