精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产一级片久久| 一级黄色大片免费看| 国产视频网站在线| 免费看欧美美女黄的网站| yellow中文字幕久久| wwwww在线观看| 天堂中文在线播放| 国产精品视频看| 亚洲精品免费网站| 激情五月色婷婷| 欧美日韩性在线观看| 5月丁香婷婷综合| 欧美 国产 综合| 日本三级视频在线播放| 国产91对白在线观看九色| 热99在线视频| 在线看的片片片免费| 欧美1区2区3区4区| 欧美一区二区三区在线观看| av动漫在线看| 中文字幕资源网在线观看| 92精品国产成人观看免费| 成人黄色生活片| 美日韩一二三区| 亚洲视频在线免费| 精品性高朝久久久久久久| 在线观看免费不卡av| 欧美激情网站| 亚洲美女视频在线观看| 欧美亚洲爱爱另类综合| 亚洲第一成年人网站| 日韩不卡免费视频| 国产91|九色| 欧美日韩精品亚洲精品| 日韩在线观看一区 | 国产亚洲激情在线| 亚洲自拍偷拍精品| 亚洲精品一区二区三区在线| 欧美日韩成人综合天天影院 | 麻豆导航在线观看| 不卡一卡二卡三乱码免费网站| 国产中文字幕91| 午夜视频网站在线观看| 亚洲作爱视频| 欧美激情视频免费观看| 2018天天弄| 99久久精品费精品国产风间由美| 亚洲欧美精品在线| 日韩成人av一区二区| 伊人久久影院| 欧美sm极限捆绑bd| 亚洲熟女乱综合一区二区| 亚洲精品第一| 欧美福利一区二区| 一起操在线视频| 看片一区二区| 欧美日本韩国一区二区三区视频 | 国产成人l区| 国产精品午夜在线观看| 日韩中文字幕一区二区| 国产剧情在线观看| 欧美激情一区在线| 亚欧洲精品在线视频免费观看| 麻豆av电影在线观看| 久久久影院官网| 日本欧美精品久久久| 欧美xxx.com| 久久色在线观看| 日韩高清dvd| av在线电影播放| 国产精品久久看| 黄瓜视频免费观看在线观看www| 欧洲不卡视频| 一区二区在线观看免费| 日韩免费在线观看av| 人妖欧美1区| 亚洲成av人影院| 日韩久久一级片| 欧美三级精品| 欧美日韩国产免费一区二区 | 欧美一区二区三区四区视频| 亚洲一级片av| 亚洲一区 二区| 亚洲国产成人在线视频| 天天躁日日躁aaaxxⅹ| 日韩一区二区三区免费播放| 欧美精品在线看| 国产在线综合网| 午夜在线播放视频欧美| 国产精品三级久久久久久电影| 一区二区不卡视频在线观看| 国产成人综合在线播放| 国内精品一区二区| 成av人电影在线观看| 亚洲欧美日韩久久精品| 搞av.com| 国产91欧美| 精品国一区二区三区| 亚洲永久精品ww.7491进入| 不卡中文字幕| 欧美激情久久久| 91在线视频免费播放| 久久99精品国产.久久久久久| av资源站久久亚洲| 国产在线免费观看| 亚洲三级电影全部在线观看高清| 国产免费黄色一级片| 日本一区二区三区视频在线| 日韩欧美国产一区二区三区| 爱爱免费小视频| 香蕉视频国产精品| 欧美野外猛男的大粗鳮| 国产农村妇女毛片精品| 久久蜜桃香蕉精品一区二区三区| 男女h黄动漫啪啪无遮挡软件| 欧美另类老肥妇| 欧美一区二区在线观看| 国产三级国产精品| 欧美日韩1080p| 国产精品美女免费看| 天天操天天操天天| 最新久久zyz资源站| 免费无码av片在线观看| 91成人短视频| 久久亚洲欧美日韩精品专区| 在线观看日本视频| 成人黄色大片在线观看| 欧美一级免费在线观看| 欧美电影免费观看| 亚洲福利视频在线| 日韩欧美综合视频| 美女www一区二区| 蜜桃传媒视频第一区入口在线看| 色网在线观看| 欧美日韩精品电影| 熟女俱乐部一区二区| 日韩午夜在线| 国产精品青青草| 成人看片免费| 欧美人妇做爰xxxⅹ性高电影| 国产sm调教视频| 国产欧美三级| 久久99热只有频精品91密拍| 免费毛片在线看片免费丝瓜视频| 欧美久久久久久久久久| 欧美波霸videosex极品| 免费在线播放第一区高清av| 国产一区二区三区色淫影院| 丁香影院在线| 日韩欧美区一区二| 日日骚一区二区三区| 狠狠久久亚洲欧美| 99精品一区二区三区的区别| 国产电影一区| 欧美精品生活片| 精品国产无码AV| 亚洲九九爱视频| 下面一进一出好爽视频| 中文字幕一区二区三区在线视频| 91久久嫩草影院一区二区| 午夜视频在线观看免费视频| 精品视频一区 二区 三区| 波多野结衣a v在线| 日韩国产一区二| 日韩欧美一区二区视频在线播放| 美女100%一区| 有码中文亚洲精品| 97人人爽人人爽人人爽| 亚洲日穴在线视频| 久久久国产精品久久久| 亚洲视频免费| 精品一区二区国产| 婷婷综合六月| 最近2019年日本中文免费字幕| 国产一区二区麻豆| 一区二区成人在线| 野花社区视频在线观看| 欧美一级久久| 一级日韩一区在线观看| 精品国产亚洲一区二区三区在线| 欧美激情aaaa| 偷拍自拍在线| 欧美天堂亚洲电影院在线播放| 99热这里只有精品4| 国产精品一区专区| 免费成人午夜视频| 日韩专区精品| 国产精品久久久久久久免费大片| 深夜在线视频| 色偷偷偷亚洲综合网另类| xxxx国产精品| 欧美视频中文字幕在线| 国产麻豆a毛片| 成人精品免费网站| 一级特黄性色生活片| 伊人久久大香线| 就去色蜜桃综合| www.成人| 青青精品视频播放| 国产日产一区二区三区| 日韩激情片免费| 国产又爽又黄免费软件| 亚洲va欧美va天堂v国产综合| 亚洲a v网站| 国产乱理伦片在线观看夜一区| 女性女同性aⅴ免费观女性恋| 9999国产精品| 麻豆传媒一区| 精品视频一区二区三区在线观看| 欧美亚洲日本网站| 色呦呦在线视频| 在线精品视频视频中文字幕| 亚洲欧美高清视频| 欧美日韩在线播放三区| 永久免费看片在线播放| 亚洲男人天堂av| 懂色av粉嫩av浪潮av| av不卡免费在线观看| 一级片黄色免费| 日本视频免费一区| 国产精品免费入口| 午夜精品偷拍| 一区二区三区国| 国产一区99| 精品一区国产| 视频一区国产| 成人性生交大片免费观看嘿嘿视频 | 风间由美性色一区二区三区| 一区二区三区 日韩| 亚洲综合日本| 国产原创中文在线观看 | 日韩在线三区| 自拍视频一区| 精品视频一区二区三区四区| 欧美黄色一级| 成人免费淫片aa视频免费| 99久久综合国产精品二区| 欧美一级片在线播放| 2019中文字幕在线电影免费 | 成人在线免费网站| 美女日韩一区| 成人免费网站在线观看| 四虎精品一区二区免费| 国产精品网站视频| 成人在线免费| 国产精品一区二区三区毛片淫片| japanese23hdxxxx日韩| 日产精品久久久一区二区福利| h片在线观看视频免费| 欧美日韩国产91| av免费在线观看网站| 美乳少妇欧美精品| 9191在线播放| 欧美国产高跟鞋裸体秀xxxhd| 四虎亚洲精品| 九九精品视频在线| 97超碰在线公开在线看免费| 久久福利视频导航| 18videosex性欧美麻豆| 欧美黄色免费网站| av3级在线| 91黑丝在线观看| 亚洲欧美一区二区三区| 国产成人在线一区| 精品视频在线一区二区在线| 国产免费观看久久黄| 4438五月综合| 3d动漫精品啪啪一区二区三区免费| 国产一区二区三区| 国产精品日韩高清| 亚洲区小说区图片区qvod| 欧美日韩另类综合| 日韩免费高清| 在线观看av的网址| 影音先锋久久精品| 成人精品视频一区二区| 男男视频亚洲欧美| 久久黄色一级视频| 91亚洲精品久久久蜜桃| 国产精品一二三区在线观看| 国产精品国产三级国产aⅴ原创| 黑人操日本美女| 亚洲午夜视频在线| 精品免费囯产一区二区三区| 欧美三区免费完整视频在线观看| 国产理论视频在线观看| 精品电影一区二区| 邻居大乳一区二区三区| 久久韩剧网电视剧| 超碰激情在线| 国产精品美女呻吟| 成人台湾亚洲精品一区二区 | 欧美中文在线观看| 亚洲色图综合| 久久国产精品亚洲va麻豆| 日本不卡二三区| 中国丰满熟妇xxxx性| 日韩福利电影在线观看| 欧美xxxx日本和非洲| 久久综合久久综合亚洲| 久久久久久视频| 欧美日韩综合视频网址| 999av视频| 亚洲欧美激情视频| 天使と恶魔の榨精在线播放| 日韩免费在线免费观看| 精品中文字幕一区二区三区| 欧美不卡三区| 欧美性色综合| 国产91色在线观看| av电影天堂一区二区在线| 侵犯稚嫩小箩莉h文系列小说| 欧美性生交大片免费| 国产www视频| 国产一区二区精品丝袜| 成人免费网站观看| 96pao国产成视频永久免费| 香蕉久久夜色精品国产使用方法| ijzzijzzij亚洲大全| 欧美aa在线视频| 国产精品第七页| 亚洲一区免费视频| 国产探花精品一区二区| 国产亚洲精品久久久久动| av在线播放资源| 97欧洲一区二区精品免费| 日韩视频在线观看| 男人的天堂日韩| 99久久久无码国产精品| 国产精品久久久久久久精| 欧美综合亚洲图片综合区| 天堂成人在线观看| 欧美激情伊人电影| 欧美日韩黄色| 超碰成人在线免费观看| 蜜臀va亚洲va欧美va天堂| 国产成人精品无码免费看夜聊软件| 亚洲国产aⅴ天堂久久| 国产jzjzjz丝袜老师水多 | www红色一片_亚洲成a人片在线观看_| 国产成人高潮免费观看精品| 欧美综合精品| 黄色一级片黄色| 国产成人av电影免费在线观看| 成人自拍小视频| 91精品国产色综合久久| 黄a在线观看| **亚洲第一综合导航网站| 亚洲天堂免费| 日本美女久久久| 亚洲欧美日韩国产综合在线| 国产精品探花视频| 久久久国产精品免费| 天天综合91| 日韩人妻精品一区二区三区| 国产一区二区中文字幕| 久久高清内射无套| 欧美zozo另类异族| 黄页网站在线| 精品国产一区二区三区四区精华 | 91视频 - 88av| 国产福利一区在线| 精品少妇爆乳无码av无码专区| 日韩精品一区二区在线| 五月花成人网| 精品国产一区二区三区麻豆免费观看完整版 | 久久精品亚洲欧美日韩精品中文字幕| 福利片一区二区三区| 亚洲久草在线视频| 神宫寺奈绪一区二区三区| 欧美在线性爱视频| 成人黄色av| 国产精品久久久久久久99| 一区二区三区蜜桃网| 熟妇人妻一区二区三区四区| 欧美有码在线视频| 成人国产精品一级毛片视频| www.污网站| 午夜精品一区二区三区电影天堂| 香蕉视频黄在线观看| 国产精品99久久久久久白浆小说 | 蜜桃视频在线观看播放| 欧美亚洲一级二级| 日韩福利电影在线观看| 成年人av电影| 日韩毛片中文字幕| 欧美美女福利视频| 18禁裸男晨勃露j毛免费观看| 99久久99久久精品免费观看| 中文字幕人妻色偷偷久久| 欧美精品在线免费| 中文精品一区二区| www.午夜av| 欧美日韩国产在线看| 最近高清中文在线字幕在线观看| 99久久精品免费看国产一区二区三区| 日韩视频一区二区三区在线播放免费观看| 影音先锋制服丝袜| 日韩欧美中文字幕制服| 成人影院网站|