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

HTML 5離線存儲之Web SQL

開發 前端
WebDatabase 規范中說這份規范不再維護了,原因是同質化(幾乎實現者都選擇了Sqlite), 且不說這些,單看在HTML5中如何實現離線數據的CRUD,最基本的用法(入門級別)

本篇沒有考慮異步,多線程及SQL注入

WebDatabase 規范中說這份規范不再維護了,原因是同質化(幾乎實現者都選擇了Sqlite),

且不說這些,單看在HTML5中如何實現離線數據的CRUD,最基本的用法(入門級別)

1,打開數據庫

2,創建表

3,新增數據

4,更新數據

5,讀取數據

6,刪除數據

事實上,關鍵點在于如何拿到一個可執行SQL語句的上下文,

像創建表,刪除表,CRUD操作等僅區別于SQL語句的寫法.OK,貌似"SqlHelper"啊,換個名字,dataBaseOperator就它了

executeReader,executeScalar兩個方法與executeNonQuery嚴重同質,

下邊的代碼產生定義了我們的dataBaseOperator"類",第二行

3-5行則定義打開數據庫連接方法,"類方法",效果類似C#中的靜態方法,直接類名.方法調用

6-15行則定義executeNonQuery方法,意指查詢數據庫,與executeReader方法和executeScalar方法同質,均可返回記錄集

整個 dataBaseOperator就完整了,很簡單,唯一要指出的是,測試以下代碼時請選擇一個支持HTML5的瀏覽器!如Google Chrome

  1. //TODO;SQL注入   
  2.   function dataBaseOperator() {};   
  3.  dataBaseOperator.openDatabase = function () {   
  4.      return window.openDatabase("dataBaseUserStories", "1.0", "dataBase used for user stories", 2 * 1024 * 1024);   
  5.  }   
  6.  dataBaseOperator.executeNonQuery = function (sql, parameters, callback) {   
  7.      var db = this.openDatabase();   
  8.      db.transaction(function (trans) {   
  9.          trans.executeSql(sql, parameters, function (trans, result) {  
  10.              callback(result);  
  11.          }, function (trans, error) {  
  12.              throw error.message;  
  13.          });  
  14.      });  
  15.  }  
  16.  dataBaseOperatordataBaseOperator.executeReader = dataBaseOperator.executeNonQuery;  
  17.  dataBaseOperatordataBaseOperator.executeScalar = dataBaseOperator.executeNonQuery; 

有了"SqlHeper",再看業務處理層(Business Logic Layer)

業務處理類包括了創建表,刪除表,新增記錄,刪除記錄以及讀取記錄,這里沒有寫更新,實際上先刪后增一樣滴,即使要寫也不復雜

  1. function userStoryProvider() {   
  2.      this.createUserStoryTable = function () {   
  3.          dataBaseOperator.executeNonQuery("CREATE TABLE tbUserStories(id integer primary key autoincrement,role,ability,benefit,name,importance,estimate,notes)");   
  4.      };   
  5.      this.dropUserStoryTable = function () {   
  6.          dataBaseOperator.executeNonQuery("DROP TABLE tbUserStories");   
  7.      };   
  8.      this.addUserStory = function (role, ability, benefit, name, importance, estimate, notes) {   
  9.          dataBaseOperator.executeNonQuery("INSERT INTO tbUserStories(role,ability,benefit,name,importance,estimate,notes) SELECT ?,?,?,?,?,?,?",  
  10.               [role, ability, benefit, name, importance, estimate, notes], function (result) {  
  11.                   //alert("rowsAffected:" + result.rowsAffected);  
  12.                });  
  13.      };  
  14.      this.removeUserStory = function (id) {  
  15.          dataBaseOperator.executeNonQuery("DELETE FROM tbUserStories WHERE id = ?", [id], function (result) {  
  16.              //alert("rowsAffected:" + result.rowsAffected);  
  17.           });  
  18.      };  
  19.      this.loadUserStories = function (callback) {  
  20.          dataBaseOperator.executeReader("SELECT * FROM tbUserStories", [], function (result) {  
  21.              callback(result);  
  22.          });  
  23.          //result.insertId,result.rowsAffected,result.rows24      };  
  24.  } 

createUserStoryTable,dropUserStoryTable,addUserStory,removeUserStory又是嚴重同質,不說了,僅SQL語句不同而已

但loadUserStories與上述四個方法均不同,是因為它把SQLResultSetRowList返回給了調用者,這里仍然是簡單的"轉發",頁面在使用的時候需要首先創建provider實例(使用類似C#中的類實例上的方法調用)

  1. var _userStoryProvider = new userStoryProvider(); 

 

之后就可以調用該實例的方法了,僅舉個例子,具體代碼省去

  1. function loadUserStory() {      
  2. try {          
  3. _userStoryProvider.loadUserStories(function (result) {             
  4.  var _userStories = new Array();              
  5. for (var i = 0; i < result.rows.length; i++) {                 
  6.  var o = result.rows.item(i);                
  7.  var _userStory = new userStory(o.id, o.name, o.role, o.ability, o.benefit, o.importance, o.estimate, o.notes);                 
  8.  _userStories.push(_userStory);           
  9.    }//...      
  10. } catch (error) {       
  11.    alert("_userStoryProvider.loadUserStories:" + error);      
  12. }} 

 

 

得到_userStories這個數組后,就沒有下文了,是自動創建HTML還是綁定到EXT,發揮想象力吧...繼續

userStory是一個自定義的"Model" "類"·

  1. function userStory(id, name, role, ability, benefit, importance, estimate, notes) {   
  2.      this.id = id;   
  3.      this.name = name;   
  4.      this.role = role;   
  5.      this.ability = ability;   
  6.      this.benefit = benefit;   
  7.      this.importance = importance;   
  8.      this.estimate = estimate;   
  9.      this.notes = notes;  
  10.  }; 

 

最后貼出應用的代碼,業務相關的代碼,不看也罷,誰家與誰家的都不同

  1. /*    
  2.      http://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage    
  3.      http://www.w3.org/TR/webdatabase/#sqlresultset    
  4.      http://html5doctor.com/introducing-web-sql-databases/    
  5.      http://stackoverflow.com/questions/844885/sqlite-insert-into-with-unique-names-getting-id    
  6.   */    
  7.  var _userStoryProvider = new userStoryProvider();    
  8.  $(document).ready(function () {    
  9.      loadUserStory();   
  10.     
  11.      /* 添加用戶故事 */   
  12.      $("#btnAdd").click(function () {   
  13.          var item = { role: $("#role").val(), ability: $("#ability").val(), benefit: $("#benefit").val(), name: $("#Name").val(), importance: $("#Importance").val(), estimate: $("#Estimate").val(), notes: $("#Notes").val() };   
  14.          try {   
  15.              _userStoryProvider.addUserStory(item.role, item.ability, item.benefit, item.name, item.importance, item.estimate, item.notes);   
  16.              loadUserStory();   
  17.          } catch (error) {   
  18.              alert("_userStoryProvider.addUserStory:" + error);   
  19.          }   
  20.      });   
  21.     
  22.      /* 創建用戶故事表 */   
  23.      $("#btnCreateTable").click(function () {          try {   
  24.              _userStoryProvider.createUserStoryTable();   
  25.          } catch (error) {   
  26.              alert("_userStoryProvider.createUserStoryTable:" + error);   
  27.          }   
  28.      });   
  29.     
  30.      /* 刪除用戶故事表 */   
  31.      $("#btnDropTable").click(function () {   
  32.          try {   
  33.              _userStoryProvider.dropUserStoryTable();   
  34.          } catch (error) {   
  35.              alert("_userStoryProvider.dropUserStoryTable:" + error);   
  36.          }   
  37.      });   
  38.  });   
  39.     
  40.  /* 加載用戶故事 */   
  41.  function loadUserStory() {   
  42.      try {   
  43.          _userStoryProvider.loadUserStories(function (result) {   
  44.              var _userStories = new Array();   
  45.              for (var i = 0; i < result.rows.length; i++) {   
  46.                  var o = result.rows.item(i);   
  47.                  var _userStory = new userStory(o.id, o.name, o.role, o.ability, o.benefit, o.importance, o.estimate, o.notes);   
  48.                  _userStories.push(_userStory);   
  49.              }   
  50.     
  51.              if (!_userStories) return;   
  52.              var table = document.getElementById("user_story_table");   
  53.              if (!table) return;   
  54.              var _trs = table.getElementsByTagName("tr");   
  55.              var _len = _trs.length;   
  56.              for (var i = 0; i < _len; i++) {   
  57.                  table.removeChild(_trs[i]);   
  58.              }   
  59.              {   
  60.                  var tr = document.createElement("tr");   
  61.                  tr.setAttribute("class", "product_backlog_row header");   
  62.                  {   
  63.                      tr.appendChild(CreateTd("id", "id"));   
  64.                      tr.appendChild(CreateTd("name", "name"));   
  65.                      tr.appendChild(CreateTd("importance", "importance"));   
  66.                      tr.appendChild(CreateTd("estimate", "estimate"));   
  67.                      tr.appendChild(CreateTd("description", "role"));   
  68.                      tr.appendChild(CreateTd("notes", "notes"));   
  69.                      tr.appendChild(CreateTd("delete", "delete"));   
  70.                  };   
  71.                  table.appendChild(tr);   
  72.              }   
  73.              for (var i = 0; i < _userStories.length; i++) {   
  74.                  CreateRow(table, _userStories[i]);   
  75.              }   
  76.          });   
  77.      } catch (error) {   
  78.          alert("_userStoryProvider.loadUserStories:" + error);   
  79.      }   
  80.  }   
  81.  function CreateRow(table, userStory) {   
  82.      if (!table) return;  
  83.      if (!userStory) return;   
  84.      {   
  85.          var tr = document.createElement("tr");   
  86.          tr.setAttribute("class", "product_backlog_row");   
  87.          {   
  88.              tr.appendChild(CreateTd("id", userStory.id));   
  89.              tr.appendChild(CreateTd("name", userStory.name));   
  90.              tr.appendChild(CreateTd("importance", userStory.importance));   
  91.              tr.appendChild(CreateTd("estimate", userStory.estimate));   
  92.              tr.appendChild(CreateTd("description", userStory.role));   
  93.              tr.appendChild(CreateTd("notes", userStory.notes));   
  94.              tr.appendChild(CreateDeleteButton("delete_button", userStory.id));   
  95.          };   
  96.          table.appendChild(tr);   
  97.      }   
  98.  }  
  99.  function CreateTd(name, value) {  
  100.      var td = document.createElement("td");  
  101.      td.setAttribute("class", "user_story " + name);  
  102.      td.innerText = value;  
  103.      return td;  
  104.  };  
  105.  function CreateDeleteButton(name, id) {  
  106.      var td = document.createElement("td");  
  107.      td.setAttribute("class", "user_story " + name);  
  108.      /* 刪除用戶故事 */  
  109.      td.innerHTML = "<a href=\"###\" title=\"delete\" onclick=\"javascript:_userStoryProvider.removeUserStory(\'" + id + "');removeRow(this);\">>>delete</a>";  
  110.      return td;  
  111.  }  
  112.  function removeRow(obj) {  
  113.      document.getElementById("user_story_table").deleteRow(obj.parentNode.parentNode.rowIndex);  
  114.      //obj.parentNode.parentNode.removeNode(true);  
  115.  }   

看完代碼復習下基本功課

1,WindowDatabase接口,注意openDatabase方法

  1. [Supplemental, NoInterfaceObject]  
  2. interface WindowDatabase {   
  3.  Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);};  
  4. Window implements WindowDatabase;  
  5. [Supplemental, NoInterfaceObject]  
  6. interface WorkerUtilsDatabase {   
  7.  Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);  DatabaseSync openDatabaseSync(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);};  
  8. WorkerUtils implements WorkerUtilsDatabase;  
  9. [Callback=FunctionOnly, NoInterfaceObject]  
  10. interface DatabaseCallback {    
  11. void handleEvent(in Database database);  
  12. }; 

 

2,SQLTransaction接口,關注executeSql方法

  1. typedef sequence<any> ObjectArray;  
  2. interface SQLTransaction {   
  3.  void executeSql(in DOMString sqlStatement, in optional ObjectArray arguments, in optional SQLStatementCallback callback, in optional SQLStatementErrorCallback errorCallback);};  
  4. [Callback=FunctionOnly, NoInterfaceObject]  
  5. interface SQLStatementCallback {  
  6.   void handleEvent(in SQLTransaction transaction, in SQLResultSet resultSet);};  
  7. [Callback=FunctionOnly, NoInterfaceObject]  
  8. interface SQLStatementErrorCallback {   
  9.  boolean handleEvent(in SQLTransaction transaction, in SQLError error);  
  10. }; 

3,最后看下SQLResultSetRowList定義

  1. interface SQLResultSetRowList {  
  2.   readonly attribute unsigned long length;    
  3. getter any item(in unsigned long index);  
  4. }; 

和SQLResultSet定義

  1. interface SQLResultSet {  
  2.    readonly attribute long insertId;  
  3.    readonly attribute long rowsAffected;  
  4.    readonly attribute SQLResultSetRowList rows;  
  5.  }; 

【編輯推薦】

  1. HTML 5可以做五件事情 超出你的想象
  2. 20佳驚艷超炫的HTML 5應用程序示例
  3. Dojo1.6新特性:HTML 5進行時
  4. 需要HTML 5模板 看一看HTML5 Boilerplate
  5. HTML 5的革新:結構之美
責任編輯:陳貽新 來源: kkun的博客
相關推薦

2012-12-03 13:53:38

IBMdW

2010-03-03 08:36:49

HTML 5 Web

2009-05-08 13:46:38

JavaScriptHTML5離線存儲

2018-05-30 08:54:00

離線存儲HTML5

2011-12-25 15:37:51

ibmdw

2010-09-17 09:00:06

HTML 5Web SQL數據庫

2011-08-29 10:49:22

2017-01-03 18:09:33

HTML5本地存儲Web

2012-04-24 10:08:12

HTML5

2010-08-10 09:08:29

WebSocketsHTML 5

2011-07-14 09:16:10

HTML 5

2012-05-23 09:49:50

HTML5

2011-07-06 10:12:26

Objective-CCSSJavaScript

2012-10-24 14:47:50

IBMdw

2013-01-04 13:14:22

2012-06-12 13:33:38

HTML5

2017-08-09 15:57:11

JavaScriptHtml5音頻

2013-01-21 11:04:38

2019-05-29 19:00:35

HTML5存儲方式前端

2015-05-22 10:06:58

點贊
收藏

51CTO技術棧公眾號

国内一区二区三区在线视频| 久久久国产精品免费| www黄色av| 国产鲁鲁视频在线观看免费| 美日韩一区二区三区| 久久亚洲精品一区二区| 国产69视频在线观看| 日本精品另类| 亚洲国产视频在线| 日韩黄色影视| 日本人妻熟妇久久久久久| 丝袜美腿亚洲一区二区图片| 超碰97人人做人人爱少妇| 欧美大片免费播放器| 欧美成人福利| 黑人巨大精品欧美一区免费视频| 亚洲一区二区在线免费观看| 高h放荡受浪受bl| 青青青伊人色综合久久| 久久久午夜视频| 国产精品18在线| 欧美a一欧美| 欧美一级生活片| 日日碰狠狠躁久久躁婷婷| av在线导航| 久久精品无码一区二区三区| 国产91亚洲精品一区二区三区| 高潮毛片又色又爽免费 | www.午夜色| 日韩精品一二| 暴力调教一区二区三区| 亚洲999一在线观看www| 中文字幕永久在线视频| 一本色道久久综合亚洲精品高清| 久久国产视频网站| 亚洲欧美日韩第一页| 天堂一区二区三区四区| 亚洲精品一区二区三区影院| av在线免费观看不卡| 国产成人免费9x9x人网站视频 | 日韩在线免费视频| 3d动漫精品啪啪一区二区下载| 久久国产精品免费一区二区三区| 欧美在线free| 美女福利视频在线| 中文字幕乱码中文乱码51精品| 亚洲一区二区在线免费观看视频| 亚洲成人动漫在线| 日本中文字幕视频在线| 国产日产欧美一区二区视频| 免费看污久久久| 日本成人一区二区三区| 91在线观看高清| 国产精品一 二 三| 免费观看成年人视频| 国产69精品久久久久777| 91深夜福利视频| 国产精品亚洲欧美在线播放| 精品一二线国产| 成人网中文字幕| 国产男男gay体育生网站| 久久99精品久久久久久| 成人欧美在线观看| 国产a级免费视频| 福利电影一区二区三区| 国产精品区免费视频| 日韩永久免费视频| 91蝌蚪porny九色| 欧美日韩在线观看一区二区三区| 理论在线观看| 五月激情婷婷综合| 国产在线播放一区三区四| 成人免费看吃奶视频网站| 一卡二卡在线观看| 国产酒店精品激情| 大波视频国产精品久久| 色香蕉在线视频| 97久久超碰国产精品电影| 欧美不卡福利| 一区二区三区视频在线观看视频| 最新日韩av在线| avav在线播放| 成人av三级| 欧美日韩国产一级二级| 久久无码人妻一区二区三区| 青青视频一区二区| 在线激情影院一区| 九九热视频精品| 性一交一乱一区二区洋洋av| 国产精品久久久久久久久免费| 一级特黄aaa| 99久久国产综合精品麻豆| 日本一区二区在线视频| 黄色精品免费看| 欧美日韩国产中字| 污污视频网站在线| 日韩成人一级| 久久的精品视频| 黄色片中文字幕| 国产一区二区免费视频| 久久av免费观看| av色综合久久天堂av色综合在| 疯狂欧美牲乱大交777| 天天摸天天舔天天操| 国产精品巨作av| 日韩视频中文字幕| 亚洲久久在线观看| 国产一区二区精品久久91| 乱色588欧美| 日本三级在线观看网站| 欧美在线一区二区| 一区二区视频观看| 一本精品一区二区三区| 欧美激情精品久久久久久大尺度| 亚洲熟女www一区二区三区| 视频一区二区三区在线| 国产精品大全| 国产一二三区在线观看| 色欧美片视频在线观看在线视频| 4438x全国最大成人| 色97色成人| 日韩免费高清在线观看| 黄色av中文字幕| 亚洲免费三区一区二区| 国产v亚洲v天堂无码久久久| 红杏aⅴ成人免费视频| 久久久av电影| 亚洲一区二区人妻| 国产亚洲精品福利| 久久国产亚洲精品无码| 亚洲91网站| 久久久精品一区二区| 亚洲av无码不卡| 91免费观看国产| 国产av天堂无码一区二区三区| gogo大尺度成人免费视频| 一区二区欧美在线| 极品国产91在线网站| 99久久婷婷国产精品综合| 国产1区2区3区中文字幕| 国产精品igao视频网网址不卡日韩| 国产亚洲精品日韩| 无码人妻av免费一区二区三区| 26uuu欧美| 黄色免费观看视频网站| 欧美丝袜足交| 91成人在线播放| 亚洲av激情无码专区在线播放| 亚洲一区二区欧美日韩| av av在线| 一本色道久久综合亚洲精品不卡 | 91国产美女视频| 粉嫩小泬无遮挡久久久久久| 亚洲一区在线视频| www.四虎在线| 一区二区三区国产在线| 精品国产中文字幕| 625成人欧美午夜电影| 亚洲毛片在线免费观看| 天堂网中文字幕| 国产亚洲欧美色| 亚洲无吗一区二区三区| 99热在线成人| 147欧美人体大胆444| 麻豆福利在线观看| 亚洲精品国产精品自产a区红杏吧| 日本在线观看中文字幕| 91老师国产黑色丝袜在线| 日韩精品免费播放| 欧美gay男男猛男无套| 亚洲一区二区三区久久 | 日韩三级电影网| 欧美视频一二三区| 亚洲精品卡一卡二| 精品综合久久久久久8888| 青青在线视频免费观看| 红杏视频成人| 国产精品久久一| 在线观看操人| 精品视频在线导航| 羞羞色院91蜜桃| 亚洲人成伊人成综合网小说| 日本泡妞xxxx免费视频软件| 亚洲自啪免费| 综合一区中文字幕| 给我免费播放日韩视频| 日韩av第一页| 成人影院在线观看| 亚洲精品国产电影| 亚洲视频在线观看一区二区| 亚洲综合激情小说| 亚洲精品成人无码| 国产高清久久久久| 日韩欧美在线免费观看视频| 一级欧洲+日本+国产| 精品免费视频123区| 免费一区二区三区四区| 国内揄拍国内精品少妇国语| 成人免费一区二区三区视频网站| 日韩欧美一级二级三级久久久| 国产精品黄色大片| 自拍av一区二区三区| 波多野结衣办公室33分钟| 国产一区美女在线| 热久久精品国产| 亚洲午夜一级| 日本精品视频一区| 国产在线视频欧美一区| 国产精品18久久久久久首页狼| 色呦呦在线视频| 深夜福利国产精品| 天堂а√在线8种子蜜桃视频| 337p亚洲精品色噜噜噜| 中文在线第一页| 亚洲va欧美va人人爽| 国产精品国产精品88| 国产婷婷色一区二区三区四区| 手机精品视频在线| 日韩精彩视频在线观看| 缅甸午夜性猛交xxxx| 亚洲电影在线一区二区三区| 欧美日韩综合久久| 麻豆精品少妇| 国产伦精品一区二区| 国产精品一区三区在线观看| 国产精品久久综合av爱欲tv| 在线免费三级电影网站| 国内精品久久久久久中文字幕| 国产婷婷视频在线| 日韩中文字幕在线免费观看| 裸体xxxx视频在线| 日韩精品小视频| 欧美视频在线观看一区二区三区| 日韩欧美在线网站| 一级视频在线播放| 欧美人与性动xxxx| 一区二区视频免费| 欧美亚洲国产一区二区三区 | 成人做爰69片免网站| 久久久天堂av| 在线免费观看日韩av| 91亚洲资源网| 爱爱免费小视频| 91美女福利视频| 日本xxxx裸体xxxx| 91毛片在线观看| 蜜桃精品成人影片| 久久综合狠狠综合久久综合88| 好吊色视频一区二区三区| www.日本不卡| 偷拍女澡堂一区二区三区| 久久夜色精品国产欧美乱极品| 精品夜夜澡人妻无码av| 久久一日本道色综合| 实拍女处破www免费看| 久久嫩草精品久久久精品一| 三上悠亚影音先锋| 国产欧美一区在线| 可以免费看av的网址| ...中文天堂在线一区| 免费看一级一片| 亚洲第一成人在线| 国产精品视频123| 91成人免费在线视频| 中文字幕在线日亚洲9| 91精品国产综合久久福利软件| 国产肥老妇视频| 日韩精品资源二区在线| 天天插天天干天天操| 亚洲欧美日韩另类| 午夜小视频在线| 欧美日韩成人网| 在线中文字幕播放| 国产精品久久在线观看| 国产一区二区三区黄网站| 国产精品一区二区不卡视频| 精品影片在线观看的网站| 日韩一区不卡| 午夜激情一区| 国产欧美在线一区| 麻豆精品国产传媒mv男同| 老女人性生活视频| 久久久久久久久免费| 日本激情视频一区二区三区| 亚洲成人综合网站| 国内自拍视频在线播放| 91超碰这里只有精品国产| 欧美自拍偷拍第一页| 亚洲一区www| 日本动漫同人动漫在线观看| 668精品在线视频| 日韩成人综合网站| 久久国产日韩欧美| 无码一区二区三区视频| 欧美一级视频在线播放| 日本欧美一区二区在线观看| 真实乱偷全部视频| 欧美极品少妇xxxxⅹ高跟鞋| 一区二区三区免费高清视频 | 色一情一乱一伦一区二区三区日本| 精品一区二区三区在线播放| 日本三级日本三级日本三级极| 欧美激情一区二区在线| 国产奶水涨喷在线播放| 欧美日韩亚洲不卡| 天堂av中文字幕| 俺去了亚洲欧美日韩| xxxxxx欧美| 国产精品xxx在线观看www| 午夜精品毛片| 日韩av一二三四| 成人av免费观看| 在线观看黄网址| 在线一区二区三区| 神马一区二区三区| 九九精品在线观看| 国产精品传媒麻豆hd| 久久精彩视频| 女主播福利一区| 欧美日韩一区二区三区69堂| 2020国产成人综合网| 久久久久亚洲av无码专区| 欧美精品一卡二卡| a天堂中文在线88| 日本精品免费一区二区三区| 国产ts一区| 91.com在线| 国产高清不卡二三区| 高h视频免费观看| 在线成人免费视频| 欧美jizz18性欧美| 国产美女久久久| 欧美日韩亚洲在线观看| 人妻丰满熟妇av无码区app| 91影院在线免费观看| 日本免费一二三区| 精品91自产拍在线观看一区| 欧美18hd| 亚洲一区二区三区四区视频| 99久久激情| 九九久久久久久| 亚洲视频在线一区观看| 一区不卡在线观看| 久久精品国产亚洲一区二区| 欧美一区=区三区| 爱爱爱视频网站| 国产精品系列在线播放| 欧美成人三级在线观看| 欧美一区二区三区免费视频| 成人影院在线看| 91视频婷婷| 影音先锋中文字幕一区| 在线xxxxx| 欧美色欧美亚洲高清在线视频| 欧洲综合视频| 国产精品视频久久| 国产精品久久久久一区二区三区厕所 | 久草免费在线观看| 91青草视频久久| 一区视频在线| 欧美bbbbb性bbbbb视频| 日韩欧美国产免费播放| 国产高清一级毛片在线不卡| 国产欧美韩国高清| 真实国产乱子伦精品一区二区三区| 永久免费看片在线观看| 婷婷久久综合九色国产成人| 男女污污视频在线观看| 国产精品美女久久久久av超清| 国产精品久久久久久久久久10秀 | 免费成人午夜视频| 久久精品欧美一区二区三区麻豆| 伊人久久国产精品| 久久综合电影一区| 久久资源综合| 国产视频在线视频| 亚洲男同1069视频| 亚州男人的天堂| 国产欧美一区二区三区久久人妖| 欧美精品一区二区三区久久久竹菊| 男女性杂交内射妇女bbwxz| 色94色欧美sute亚洲线路二| 1024国产在线| 成人综合av网| 日韩成人精品在线| 日本福利片在线观看| 日韩电影网在线| 亚洲18在线| 久久久久久久久久久99| 中文字幕精品一区二区三区精品| 国产成人麻豆精品午夜在线| 全球成人中文在线| 婷婷久久综合| 三上悠亚ssⅰn939无码播放| 制服丝袜在线91| 国产另类xxxxhd高清| www.男人天堂网| 国产精品午夜免费| 天堂av中文在线资源库| 91精品在线观|