亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解js樹形控件―zTree使用總結

2019-11-19 18:13:37
字體:
來源:轉載
供稿:網友

0 zTree簡介

樹形控件的使用是應用開發過程中必不可少的。zTree 是一個依靠 jQuery 實現的多功能 “樹插件”。優異的性能、靈活的配置、多種功能的組合是 zTree 最大優點。

0.0 zTree的特點

  • 最新版的zTree將核心代碼按照功能進行了分割,不需要的代碼可以不用加載,如普通使用只需要加載核心的jquery.ztree.core-3.5.js,需要使用勾選功能加載jquery.ztree.excheck-3.5.min.js,需要使用編輯功能加載jquery.ztree.exedit-3.5.min.js
  • 采用了延遲加載技術,上萬節點輕松加載,即使在 IE6 下也能基本做到秒殺
  • 兼容 IE、FireFox、Chrome、Opera、Safari 等瀏覽器
  • 支持 JSON 數據
  • 支持靜態 和 Ajax 異步加載節點數據
  • 支持任意更換皮膚 / 自定義圖標(依靠css)
  • 支持極其靈活的 checkbox 或 radio 選擇功能
  • 提供多種事件響應回調
  • 靈活的編輯(增/刪/改/查)功能,可隨意拖拽節點,還可以多節點拖拽
  • 在一個頁面內可同時生成多個 Tree 實例
  • 簡單的參數配置實現,靈活多變的功能

0.1 zTree文件介紹

從zTree官網下載的zTree包括以下組成部分

  • metroStyle文件夾:zTree的metro風格樣式相關文件(圖片及css樣式表)。
  • zTreeStyle文件夾:zTree的標準風格樣式文件夾(圖片及css樣式表)
  • js文件:zTree.all.js是完整的js庫,可單純加載此文件實現所有zTree功能,ztree.core、ztree.excheck、ztree.exedit、ztree.exhide是對ztree按照功能進行的分割,分別對應基本功能、復選功能、編輯功能、顯隱功能。

1 zTree的基本使用

1.0 zTree的創建

在頁面中添加對zTree的js及css引用,由于zTree基于JQuery,JQuery的引用是必須的。

<!DOCTYPE html><HTML><HEAD> <TITLE> ZTREE DEMO </TITLE> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="zTreeStyle/zTreeStyle.css" type="text/css"> <script type="text/javascript" src="jquery-1.4.2.js"></script> <script type="text/javascript" src="jquery.ztree.core-3.x.js"></script> <SCRIPT LANGUAGE="JavaScript">  var zTreeObj;  var setting = {};  // zTree 的參數配置,后面詳解   var zNodes = [   // zTree 的數據屬性,此處使用標準json格式   {   name: "test1", open: true, children: [   { name: "test1_1" }, { name: "test1_2" }]  },  {   name: "test2", open: true, children: [   { name: "test2_1" }, { name: "test2_2" }]  }  ];  $(document).ready(function () {   zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes); //初始化zTree,三個參數一次分別是容器(zTree 的容器 className 別忘了設置為 "ztree")、參數配置、數據源  }); </SCRIPT></HEAD><BODY> <div>  <ul id="treeDemo" class="ztree"></ul>  </div></BODY></HTML>

運行結果如下

1.1 zTree的配置

zTree的配置采用Json格式,按照配置的類型分為view(可視界面相關配置)、data(數據相關配置)、check(復選框相關配置)、callback(各類事件的回調函數配置)、async(zTree異步加載配置),一下是我們經常會使用到的一些配置及說明,其他詳細配置可以參考zTree官方API文檔的詳細介紹。

var setting = {   view: {    selectedMulti: true, //設置是否能夠同時選中多個節點    showIcon: true,  //設置是否顯示節點圖標    showLine: true,  //設置是否顯示節點與節點之間的連線    showTitle: true,  //設置是否顯示節點的title提示信息   },   data: {     simpleData: {     enable: false, //設置是否啟用簡單數據格式(zTree支持標準數據格式跟簡單數據格式,上面例子中是標準數據格式)      idKey: "id",  //設置啟用簡單數據格式時id對應的屬性名稱      pidKey: "pId" //設置啟用簡單數據格式時parentId對應的屬性名稱,ztree根據id及pid層級關系構建樹結構    }   },   check:{    enable: true   //設置是否顯示checkbox復選框   },   callback: {    onClick: onClick,    //定義節點單擊事件回調函數    onRightClick: OnRightClick, //定義節點右鍵單擊事件回調函數    beforeRename: beforeRename, //定義節點重新編輯成功前回調函數,一般用于節點編輯時判斷輸入的節點名稱是否合法    onDblClick: onDblClick,  //定義節點雙擊事件回調函數    onCheck: onCheck    //定義節點復選框選中或取消選中事件的回調函數   },   async: {    enable: true,      //設置啟用異步加載    type: "get",      //異步加載類型:post和get    contentType: "application/json", //定義ajax提交參數的參數類型,一般為json格式    url: "/Design/Get",    //定義數據請求路徑    autoParam: ["id=id", "name=name"] //定義提交時參數的名稱,=號前面標識節點屬性,后面標識提交時json數據中參數的名稱   }  };

需要注意的是,zTree的事件回調部分,基本上每一個事件都對應一個beforeXXX事件,比如onClick事件對應有一個beforeOnClick事件,主要用于控制相關事件是否允許執行,如果before事件返回false,則取消執行對應相關事件。

1.2 zTree的數據格式

zTree的每一個節點都是一個treeNode對象,treeNode對象經常用到的屬性和方法如下:

treeNode: {    name,  //節點顯示的文本    checked, //節點是否勾選,ztree配置啟用復選框時有效    open,  //節點是否展開    icon,  //節點的圖標    iconOpen, //節點展開式的圖標    iconClose, //節點折疊時的圖標    id,   //節點的標識屬性,對應的是啟用簡單數據格式時idKey對應的屬性名,并不一定是id,如果setting中定義的idKey:"zId",那么此處就是zId    pId,  //節點parentId屬性,命名規則同id    children, //得到該節點所有孩子節點,直接下級,若要得到所有下屬層級節點,需要自己寫遞歸得到    isParent, //判斷該節點是否是父節點,一般應用中通常需要判斷只有葉子節點才能進行相關操作,或者刪除時判斷下面是有子節點時經常用到。    getPath() //得到該節點的路徑,即所有父節點,包括自己,此方法返回的是一個數組,通常用于創建類似面包屑導航的東西A-->B-->C    }

zTree的數據源一般有標準數據格式、簡單數據格式兩種,標準數據格式通過指定節點的chidren屬性構建層級關系,而簡單數據格式根據根據id,pid屬性構建層級關系,我們在應用開發中使用關系型數據庫,一般采用的都是簡單數據格式。

標準數據格式

var nodes = [ {name: "父節點1", children: [  {name: "子節點1"},  {name: "子節點2"} ]}];

簡單數據格式

var nodes = [ {id:1, pId:0, name: "父節點1"}, {id:11, pId:1, name: "子節點1"}, {id:12, pId:1, name: "子節點2"}];

注意zTree的默認配置是不啟用簡單數據格式,使用簡單數據格式一定要在setting中進行簡單數據格式的相關配置。

1.3 zTree的常用方法

zTree的主要操作方法介紹如下

獲取zTree對象

var treeObj = $.fn.zTree.getZTreeObj("tree");

增加節點

addNodes(parentNode,index,newNodes,isSlient)

parentNode:指定的父節點,如果增加根節點,請設置 parentNode 為 null 即可

index:新節點插入的位置(從 0 開始),index = -1 時,插入到最后,此參數可忽略

newNodes:需要增加的節點數據 JSON 對象集合,數據只需要滿足 zTree 的節點數據必需的屬性即可

isSilent:true 時,添加節點后不展開父節點,其他值或缺省狀態都自動展開

勾選或取消勾選全部節點

checkAllNodes(checked);

checked參數為true時全部勾選,為false時全部取消勾選。

勾選或取消勾選單個節點

checkNode(node, checked, checkedTypeFlag,callbackFlag);

node:要進行操作的節點

checked:為true勾選,為false取消勾選

checkeTypeFlag:為true表示對當前結點的子節點及父節點進行勾選狀態的聯動,為false不聯動

callbackFlag:為true時表示執行beforeOnCheck和onCheck事件的回調函數,為false不執行

編輯節點

edit(node);  使節點處于編輯狀態,必須引用jquery.ztree.exedit 擴展。

展開或折疊全部節點

expandAll(expand);

expand為true是展開所有節點,為false是折疊所有節點。

根據節點屬性查找結點

getNodesByParam(key,value, parentNode);

key:屬性名

value:屬性值

parentNode:是否在指定節點下查找,為null表示整個樹查找。

獲取被勾選或未被勾選的節點集合

getCheckedNodes(checked);

checked為true表示獲取所有被勾選的節點集合,為false表示所有未被勾選的節點集合

獲取輸入框勾選狀態被改變的節點集合

getChangeCheckedNodes()

2 zTree的常用操作

2.0 ajax請求數據并創建zTree 

$(function () {   var setting = {     //此處根據自己需要進行配置    view: {     selectedMulti: false    },    data: {     simpleData: {      enable: true     }    },    callback: {     onClick: onDesignTreeClick,     onRightClick: OnRightClick,     beforeRename: beforeRename,     onCheck:onCheck    }   };   $.ajax({    type: "Get",    url: "/Design/GetDesignTreeData",     //ajax請求地址     success: function (data) {     $.fn.zTree.init($("#treeZo"), setting, data); //加載數據    },   });  });

后臺代碼如下,可以根據需要返回你想要的任何數據,綁定到zTree上,然后通過treeNode.屬性名取到對應的值,實現一些界面邏輯操作。

 public ActionResult GetDesignTreeData()  {   var result = _designAppService.GetDesignTreeData();   List<ModelTreeViewModel> treeModels = new List<ModelTreeViewModel>();   bool open = false;   foreach (var design in result.Designs)   {    if (design.ParentId == Guid.Empty)     open = true;    else open = false;    treeModels.Add(new ModelTreeViewModel() { Id = design.Id.ToString(), PId = design.ParentId.ToString(), Name = design.Name, Open = open, Data = design.Remarks ?? "", ViewPoint = design.ViewPoint ?? "", Checked = true });   }   return Json(treeModels, JsonRequestBehavior.AllowGet);  }

 2.1 節點單擊操作

節點單擊事件會捕獲事件對象e,zTree的唯一標識treeId,當前選中的節點對象treeNode三個參數。根據實際需求可獲取treeNode中包含的任何屬性數據,進行相關操作

function onClick(e, treeId, treeNode) {   if (treeNode.isParent) //如果不是葉子結點,結束    return;   alert(treeNode.name); //獲取當前結點上的相關屬性數據,執行相關邏輯  };

2.2 節點復選框事件

一般情況下我們會直接使用treeObj.getCheckedNodes(true);獲取所有選中的節點,然后遍歷所有選中的節點進行相關操作,當面對大數據量時,這種操作方法便不可取,可通過getChangeCheckedNodes()方法獲取勾選狀態被改變的節點集合,值針對狀態改變的節點做相應處理。

 function onCheck() {   var treeObj = $.fn.zTree.getZTreeObj("treeDemo"); //獲取樹對象   var nodes = treeObj.getChangeCheckedNodes();  //獲取勾選狀態改變的節點   var designIds = [];   var status = 0;         //定義初始勾選狀態為未勾選   if (nodes[0].checked)    status = 1;         //如果狀態改變節點為勾選狀態,說明當前操作是從未勾選變為已勾選。   $.each(nodes, function (i, item) {    designIds.push(item.id);      //將狀態改變的節點id輸出到數組     item.checkedOld = item.checked;    //這句話很關鍵,將節點的初始狀態置為當前狀態。否則每次勾選操作獲取狀態改變節點時只會跟樹初始化的狀態相比較。   })   $.ajax({    type: "Post",    url: "/Design/GetRelationComponentIdsByDesigns",    data: { "designIds": designIds },    success: function (data) {     RealBimOcx.BatchAddSubClrInfoBegin();     $.each(data.result, function (i, item) {      if (status == 1)           //這里根據發生改變的節點是勾選還是為勾選進行相關邏輯操作。       RealBimOcx.AddSubClrInfo(item, 255, 255, 0);      else       RealBimOcx.AddSubClrInfo(item, 0, 255, 0);      if (i % 100 == 0) {       RealBimOcx.BatchAddSubClrInfoEnd();       RealBimOcx.BatchAddSubClrInfoBegin();      }     })     RealBimOcx.BatchAddSubClrInfoEnd();    }   })  };

 2.3 實現zTree的右鍵增刪改操作

首先定義右鍵彈出面板

<div id="rMenu" style="z-index:100;">  <ul>   <li id="m_add" onclick="addTreeNode();">新增節點</li>   <li id="m_del" onclick="removeTreeNode();">刪除節點</li>   <li id="m_edit" onclick="editTreeNode();" style="border-bottom:1px solid #cecece">編輯節點</li><li id="m_left">升級</li>   <li id="m_right">降級</li>   <li id="m_up">上移</li>   <li id="m_down" style="border-bottom:1px solid #cecece">下移</li>   <li id="m_reset" onclick="resetTree();">重置節點</li><li id="m_open" onclick="treeOpen()">展開所有</li>   <li id="m_stop" onclick="treeStop()">收起所有</li>  </ul></div>

實現zTree右鍵單擊事件回調函數 

  //右鍵單擊回調函數  function OnRightClick(event, treeId, treeNode) {   $("#treeZo").hide();   if (!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) {    zTree.cancelSelectedNode();    showRMenu("root", event.clientX, event.clientY); //根據鼠標位置顯示右鍵操作面板   } else if (treeNode && !treeNode.noR) {    zTree.selectNode(treeNode);    showRMenu("node", event.clientX, event.clientY);   }   $("#treeZo").show();  }  //根據節點類型,控制右鍵操作菜單哪些可用哪些不可用  function showRMenu(type, x, y) {   $("#rMenu ul").show();   if (type == "root") {    $("#m_del").hide();    $("#m_edit").hide();    $("#m_left").hide();    $("#m_right").hide();    $("#m_up").hide();    $("#m_down").hide();    $("#m_add").addClass('mboder');   } else {    $("#m_del").show();    $("#m_edit").show();    $("#m_left").show();    $("#m_right").show();    $("#m_up").show();    $("#m_down").show();    $("#m_add").removeClass('mboder');   }   rMenu.css({ "top": y + "px", "left": x + "px", "visibility": "visible" });   $("body").bind("mousedown", onBodyMouseDown);  }  //以藏右鍵面板  function hideRMenu() {   if (rMenu) rMenu.css({ "visibility": "hidden" });   $("body").unbind("mousedown", onBodyMouseDown);  }  //單擊頁面其他位置 隱藏右鍵面板  function onBodyMouseDown(event) {    if (!(event.target.id == "rMenu" || $(event.target).parents("#rMenu").length > 0)) {    rMenu.css({ "visibility": "hidden" });   }  }

 新增節點 

  //增加節點  function addTreeNode() {   hideRMenu();   var name = new Date().getTime(); //利用時間戳生成節點名稱,保證節點名稱唯一    var newNode = {    name: name   };   if (zTree.getSelectedNodes()[0]) {    newNode.checked = zTree.getSelectedNodes()[0].checked;    newNode.pid = zTree.getSelectedNodes()[0].id;    zTree.addNodes(zTree.getSelectedNodes()[0], newNode);   } else {    zTree.addNodes(null, newNode);   }   var node = zTree.getNodeByParam("name", name, null); //得到新增加的節點   zTree.selectNode(node); //選中新增加的節點   zTree.editName(node);  //讓新增加的節點處于編輯狀態  }

 編輯節點

function editTreeNode() {   var nodes = zTree.getSelectedNodes(); //得到選中節點集合   if (nodes && nodes.length > 0) {    var parent = nodes[0].getParentNode(); //得到選中節點的父節點    if (parent) {     nodes[0].pid = parent.id; //如果選中節點父節點存在,將當前結點的pid屬性值設置為父節點的id    }    zTree.editName(nodes[0]); //讓選中節點處于編輯狀態   }   hideRMenu();  //隱藏右鍵面板  };

節點編輯狀態離開時觸發事件

  //編輯并保存節點  function beforeRename(treeId, treeNode, newName, isCancel) {   if (newName.length == 0) { //節點名稱判斷    alert("不能為空。");    return false;   }   else {    $.ajax({     //數據入庫     type: "Post",     url: "/Design/InsertOrUpdate",     data: { "dto": { "Id": treeNode.id, "ParentId": treeNode.pid, "Name": newName } },     success: function (data) {      if (data.result == "Faild") {       layerAlert("保存失敗。");       return false;      }      else {       treeNode.id = data.result; //將返回的id賦值給當前結點       return true;      }     }    });   }  };

 刪除節點數據 

function removeTreeNode() {   hideRMenu();   var nodes = zTree.getSelectedNodes();   if (nodes && nodes.length > 0) {    if (nodes[0].children && nodes[0].children.length > 0) {     alert("包含下級,無法刪除。");    } else {     if (confirm("該操作會將關聯數據同步刪除,是否確認刪除?") == true) {      $.ajax({       type: "Post",       url: "/Design/Delete",       data: { "id": nodes[0].id },       success: function (data) {        if (data.result == "Success") {         zTree.removeNode(nodes[0]);        }        else {         alert("刪除失敗。");        }       }      });     };    }   }  };

2.4 一些總結

我們通常使用到樹形控件做授權或關聯類似的操作,一般會先全部取消勾選,然后根據選中的數據關聯對樹控件的復選框進行選中操作,在大數據量時,大約幾萬條數據,全部取消勾選+根據關聯數據勾選相關節點這個操作通過js執行會很慢,這種情況建議在后臺通過關聯關系重新組織zTree需要的數據源,對每條數據(對應樹節點)設置checked屬性,然后再前臺頁面重新加載樹,這種操作速度要快得多。

$.ajax({   type: "Get",   url: "/Model/GetRelationModelTreeData?designId=" + treeNode.id + "&t=" + new Date(),   success: function (data) {    //$.each(data.result, function (i, item) {    // var node = modelTree.getNodeByParam("id", item, null);    // modelTree.checkNode(node, true, true);    //});    $.fn.zTree.init($("#treejian"), setting1, data.result); //改為重新加載,比js循環勾選速度要快。   }  });

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人天堂视频| 日韩有码在线播放| 亚洲欧美日韩精品久久亚洲区| 中日韩美女免费视频网站在线观看| 国产乱肥老妇国产一区二| 成人在线精品视频| 在线日韩日本国产亚洲| 91视频国产一区| 国产日韩欧美在线看| 久久精品91久久香蕉加勒比| 国产精品久久久久久久久| 精品久久久在线观看| 国产999在线观看| 亚洲精品久久久久久久久久久久| 国产日韩欧美自拍| 欧美国产第二页| 亚洲网站在线看| 国自在线精品视频| 欧美成人免费小视频| 欧美日韩国产二区| 97精品国产97久久久久久春色| 日本久久久a级免费| 欧美成人免费va影院高清| 91国产一区在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品福利在线视频| 亚洲精品资源美女情侣酒店| 国产精品免费看久久久香蕉| 国产精品女人网站| 欧美日韩国产一区在线| 最近的2019中文字幕免费一页| 久久久久这里只有精品| 日韩av综合中文字幕| 欧美精品一本久久男人的天堂| 韩国视频理论视频久久| 97精品国产97久久久久久| 日韩中文字幕在线精品| 亚洲片国产一区一级在线观看| 亚洲尤物视频网| 久久久久久高潮国产精品视| 欧洲亚洲妇女av| 91在线观看免费网站| 久青草国产97香蕉在线视频| 九九精品在线观看| 日韩av在线免费观看一区| 国产精品91久久| 欧美日韩国产一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 欧美性猛交xxxxx免费看| 亚洲天堂av电影| 国产一区二区三区丝袜| 国模极品一区二区三区| 精品视频—区二区三区免费| 综合网日日天干夜夜久久| 日韩经典中文字幕| 欧美日韩一区二区免费视频| 久久久久久免费精品| 亚洲一区二区免费| 国产xxx69麻豆国语对白| 一区二区日韩精品| 中文字幕亚洲专区| 伊人青青综合网站| 91久久国产精品91久久性色| 精品色蜜蜜精品视频在线观看| 欧美成人亚洲成人| 亚洲另类激情图| 日韩精品久久久久久久玫瑰园| 国产精品激情自拍| 亚洲性视频网址| 欧美精品一区在线播放| 国精产品一区一区三区有限在线| 欧美激情一区二区三区成人| 久久精品中文字幕| 中文字幕精品在线| 97香蕉久久夜色精品国产| 一本久久综合亚洲鲁鲁| 国产亚洲一级高清| 成人黄在线观看| xxxx欧美18另类的高清| 91av国产在线| 日韩美女福利视频| 成人欧美一区二区三区在线| 国产精品久久久久久超碰| 欧美精品久久久久久久久久| 亚洲97在线观看| 亚洲精品视频免费| 久久久精品久久| 国产欧美久久一区二区| 成人日韩在线电影| 午夜精品视频在线| 国产美女搞久久| 亚洲电影中文字幕| 亚洲精品xxx| 在线观看国产精品日韩av| 国产成人激情视频| 精品福利在线看| 91国产高清在线| 欧美日韩黄色大片| 国产精品入口夜色视频大尺度| 精品久久久免费| 国产经典一区二区| 国产99久久精品一区二区永久免费| 亚洲最大成人网色| 亚洲国产精品大全| 亚洲新声在线观看| 乱亲女秽乱长久久久| 亚洲第一中文字幕| 亚洲欧美福利视频| 亚洲综合日韩在线| 久久久久999| 亚洲a级在线观看| 色爱av美腿丝袜综合粉嫩av| 第一福利永久视频精品| 久久影视电视剧免费网站清宫辞电视| 久久在线视频在线| xvideos成人免费中文版| 秋霞午夜一区二区| 亚洲视频在线免费观看| 国产成一区二区| 久久久视频精品| 欧美日韩电影在线观看| 精品国产依人香蕉在线精品| 日韩欧美一区二区三区久久| 国产日产久久高清欧美一区| 国产精品久久av| 国产欧美亚洲视频| 亚洲加勒比久久88色综合| 91麻豆国产精品| 一区二区三区黄色| 91伊人影院在线播放| 国产91精品高潮白浆喷水| 欧美激情三级免费| 亚洲深夜福利在线| 国产亚洲激情视频在线| 久久久精品影院| 成人动漫网站在线观看| 国产成人小视频在线观看| 亚洲影院在线看| 久久艳片www.17c.com| 亚洲欧美国产精品专区久久| 久久成人18免费网站| 国产一区二区三区毛片| 亚洲尤物视频网| 永久免费看mv网站入口亚洲| 国产日韩欧美成人| 成人黄色免费网站在线观看| 亚洲精品福利免费在线观看| 国产精品美女无圣光视频| 久久久久五月天| 91精品国产91久久久久久最新| 国产视频精品久久久| 欧美日韩一区免费| 亚洲欧美日韩图片| 亚洲国产精品高清久久久| 91精品国产91久久| 欧美电影院免费观看| 亚洲美女中文字幕| 日韩一区二区三区xxxx| 欧美高清自拍一区| 午夜精品久久久久久99热| 久久久久亚洲精品| 欧美孕妇毛茸茸xxxx| 国产精品jvid在线观看蜜臀| 国产精品扒开腿做爽爽爽男男|