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

首頁 > 編程 > JavaScript > 正文

JS組件Bootstrap Table表格多行拖拽效果實現代碼

2019-11-20 11:03:59
字體:
來源:轉載
供稿:網友

前言:前天剛寫了篇JS組件Bootstrap Table表格行拖拽效果,今天接到新的需要,需要在之前表格行拖拽的基礎上能夠同時拖拽選中的多行。用了半天時間研究了下,效果是出來了,但是感覺不盡如人意。先把它分享出來,以后想到更好的辦法再優化吧。

一、效果展示

1、拖動前

2、拖動中

3、拖動后

4、撤銷回到拖動前狀態

二、需求分析
通過上篇我們知道,如果要實現拖拽,必須要有一個可以拖拽的標簽,或者叫容器,比如上篇里面的tr就是一個拖拽的容器,那么如果要實現選擇行的拖拽,那么博主的第一反應是將選中的行放到一個容器里面,比如放到一個div中,然后注冊這個div的可拖拽,可是實際情況是,tr是在table里面的標簽,如果將tr用div包起來,勢必將table里面的樣式打亂,這個界面就真的是亂掉了。很顯然,這條路走不通。然后通過谷歌瀏覽器審核元素知道,用Bootstrap table生成的表格tr的父級元素實際上是tbody,于是在想是否可以注冊tbody的拖拽,實踐證明,此法可行。于是就此開干。

三、代碼示例
cshtm的代碼就不再重復,和上篇相同。我們重點來看看js代碼。

var i_statuindex = 0;var arrdata = [];var m_oTable = null;$(function () { //1.初始化表格 m_oTable = new TableInit(); m_oTable.Init(); //2.初始化按鈕事件 var oButtonInit = new ButtonInit(); oButtonInit.Init(); //3.日期控件的初始化 $(".datetimepicker").datetimepicker({ format: 'yyyy-mm-dd hh:ii', autoclose: true, todayBtn: true, });});//表格相關事件和方法var TableInit = function () { var oTableInit = new Object(); oTableInit.Init = function () { $('#tb_order_left').bootstrapTable({ url: '/api/OrderApi/get', method: 'get', striped: true, cache: false, striped: true, pagination: true, height: 600, uniqueId:"TO_ORDER_ID", queryParams: oTableInit.queryParams, queryParamsType: "limit", sidePagination: "server", pageSize: 10, pageList: [10, 25, 50, 100], search: true, strictSearch: true, showColumns: true, showRefresh: true, minimumCountColumns: 2, clickToSelect: true, columns: [{ checkbox: true }, { field: 'ORDER_NO', title: '訂單號' }, { field: 'BODY_NO', title: '車身號' }, { field: 'VIN', title: 'VIN碼' }, { field: 'TM_MODEL_MATERIAL_ID', title: '整車編碼' }, { field: 'ORDER_TYPE', title: '訂單類型' }, { field: 'ORDER_STATUS', title: '訂單狀態' }, { field: 'CREATE_DATE', title: '訂單導入時間' }, { field: 'PLAN_DATE', title: '訂單計劃上線日期' }, { field: 'VMS_NO', title: 'VMS號' }, { field: 'ENGIN_CODE', title: '發動機號' }, { field: 'TRANS_CODE', title: '變速箱號' }, { field: 'OFFLINE_DATE_ACT', title: '實際下線日期' }, { field: 'HOLD_RES', title: 'hold理由' }, { field: 'SPC_FLAG', title: '特殊標記' }, ], onLoadSuccess: function (data) { oTableInit.InitDrag(); if (data.total > 0) { var iheight = $('#div_tableleft').find(".fixed-table-container").height(); $('#div_tableleft').find(".fixed-table-container").height(iheight + 36); } }, onCheckAll: function (rows) { $("#tb_order_left tbody tr").addClass("selected"); }, onUncheckAll: function (rows) { $("#tb_order_left tbody tr").removeClass("selected"); } }); $('#tb_order_right').bootstrapTable({ url: '/api/OrderApi/get', method: 'get', toolbar: '#toolbar_right', striped: true, cache: false, striped: true, pagination: true, height: 600, queryParams: oTableInit.queryParamsRight, queryParamsType: "limit", //ajaxOptions: { departmentname: "", statu: "" }, sidePagination: "server", pageSize: 10, pageList: [10, 25, 50, 100], search: true, strictSearch: true, showRefresh: true, minimumCountColumns: 2, columns: [ { field: 'ORDER_NO', title: '訂單號' }, { field: 'BODY_NO', title: '車身號' }, { field: 'VIN', title: 'VIN碼' }, { field: 'TM_MODEL_MATERIAL_ID', title: '整車編碼' }, { field: 'ORDER_TYPE', title: '訂單類型' }, { field: 'ORDER_STATUS', title: '訂單狀態' }, { field: 'CREATE_DATE', title: '訂單導入時間' }, { field: 'PLAN_DATE', title: '訂單計劃上線日期' }, { field: 'VMS_NO', title: 'VMS號' }, { field: 'ENGIN_CODE', title: '發動機號' }, { field: 'TRANS_CODE', title: '變速箱號' }, { field: 'OFFLINE_DATE_ACT', title: '實際下線日期' }, { field: 'HOLD_RES', title: 'hold理由' }, { field: 'SPC_FLAG', title: '特殊標記' }, ], onLoadSuccess: function (data) { oTableInit.InitDrop(); } }); }; oTableInit.InitDrag = function () { $('#tb_order_left tbody').draggable({ helper: "clone", start: function (event, ui) { var old_left_data = JSON.stringify($('#tb_order_left').bootstrapTable("getData")); var old_right_data = JSON.stringify($('#tb_order_right').bootstrapTable("getData")); var odata = { index: ++i_statuindex, left_data: old_left_data, right_data: old_right_data }; arrdata.push(odata); }, stop: function (event, ui) { } }); }; oTableInit.InitDrop = function () { $("#div_tableright div[class=fixed-table-container]").droppable({ drop: function (event, ui) { var arrtr = $(ui.helper[0]).find("tr[class=selected]"); if (arrtr.length <= 0) { alert("請先選中要插單的行"); return; } var oTop = ui.helper[0].offsetTop; var iRowHeadHeight = 40; var iRowHeight = 37; var rowIndex = 0; if (oTop <= iRowHeadHeight + iRowHeight / 2) { rowIndex = 0; } else { rowIndex = Math.ceil((oTop - iRowHeadHeight) / iRowHeight); } for (var i = 0; i < arrtr.length; i++) { var arrtd = $(arrtr[i]).find("td"); var uniqueid = $(arrtr[i]).attr("data-uniqueid"); var rowdata = { ORDER_NO: $(arrtd[1]).text(), BODY_NO: $(arrtd[2]).text(), VIN: $(arrtd[3]).text(), TM_MODEL_MATERIAL_ID: $(arrtd[4]).text(), ORDER_TYPE: $(arrtd[5]).text(), ORDER_STATUS: $(arrtd[6]).text(), CREATE_DATE: $(arrtd[7]).text() == "-" ? null : $(arrtd[7]).text(), PLAN_DATE: $(arrtd[8]).text() == "-" ? null : $(arrtd[8]).text(), VMS_NO: $(arrtd[9]).text(), ENGIN_CODE: $(arrtd[10]).text(), TRANS_CODE: $(arrtd[11]).text(), OFFLINE_DATE_ACT: $(arrtd[12]).text() == "-" ? null : $(arrtd[12]).text(), HOLD_RES: $(arrtd[13]).text(), SPC_FLAG: $(arrtd[14]).text(), TO_ORDER_ID: uniqueid }; $("#tb_order_right").bootstrapTable("insertRow", { index: rowIndex++, row: rowdata }); $('#tb_order_left').bootstrapTable("removeByUniqueId", uniqueid); }   oTableInit.InitDrag(); } }); }; oTableInit.queryParams = function (params) { //配置參數 var temp = { //這里的鍵的名字和控制器的變量名必須一直,這邊改動,控制器也需要改成一樣的 limit: params.limit, //頁面大小 offset: params.offset, //頁碼 strBodyno: $("#txt_search_bodynumber").val(), strVin: $("#txt_search_vinnumber").val(), strOrderno: $("#txt_search_ordernumber").val(), strEngincode: $("#txt_search_engin_code").val(), strOrderstatus: 0, strTranscode: $("#txt_search_trans_code").val(), strVms: $("#txt_search_vms").val(), strCarcode: $("#txt_search_carcode").val(), strImportStartdate: $("#txt_search_import_startdate").val(), strImportEnddate: $("#txt_search_import_enddate").val(), strSendStartdate: $("#txt_search_send_startdate").val(), strSendEnddate: $("#txt_search_send_enddate").val(), }; return temp; }; oTableInit.queryParamsRight = function (params) { //配置參數 var temp = { //這里的鍵的名字和控制器的變量名必須一直,這邊改動,控制器也需要改成一樣的 limit: params.limit, //頁面大小 offset: params.offset, //頁碼 strBodyno: "", strVin: "", strOrderno: "", strEngincode: "", strOrderstatus: 5, strTranscode: "", strVms: "", strCarcode: "", strImportStartdate: "", strImportEnddate: "", strSendStartdate: "", strSendEnddate: "", }; return temp; }; return oTableInit;};//頁面按鈕初始化事件var ButtonInit = function () { var oInit = new Object(); var postdata = {}; oInit.Init = function () { //查詢點擊事件 $("#btn_query").click(function () { $("#tb_order_left").bootstrapTable('refresh'); }); //重置點擊事件 $("#btn_reset").click(function () { $(".container-fluid").find(".form-control").val(""); $("#tb_order_left").bootstrapTable('refresh'); }); //插單操作點擊事件 $("#btn_insertorder").click(function () {  }); //撤銷操作點擊事件 $("#btn_cancel").click(function () { if (i_statuindex <= 0) { return; } for (var i = 0; i < arrdata.length; i++) { if (arrdata[i].index != i_statuindex) { continue; } var arr_left_data = eval(arrdata[i].left_data); var arr_right_data = eval(arrdata[i].right_data); $('#tb_order_left').bootstrapTable('removeAll'); $('#tb_order_right').bootstrapTable('removeAll'); $('#tb_order_left').bootstrapTable('append', arr_left_data); for (var x = 0; x < arr_right_data.length; x++) { $("#tb_order_right").bootstrapTable("insertRow", { index: x, row: arr_right_data[x] }); }  //$('#tb_order_right').bootstrapTable('append', arr_right_data);//append之后不能drop break; } i_statuindex--; //重新注冊可拖拽 m_oTable.InitDrag(); //m_oTable.InitDrop(); }); }; return oInit;};

還是重點看看部分代碼

1、注冊左邊可拖拽

$('#tb_order_left tbody').draggable({ helper: "clone", start: function (event, ui) { var old_left_data = JSON.stringify($('#tb_order_left').bootstrapTable("getData")); var old_right_data = JSON.stringify($('#tb_order_right').bootstrapTable("getData")); var odata = { index: ++i_statuindex, left_data: old_left_data, right_data: old_right_data }; arrdata.push(odata); }, stop: function (event, ui) { } });


這里代碼很簡單,主要做了兩件事:

(1)注冊tbody的可拖拽,同樣適用的JQuery UI的draggable事件。

(2)在開始拖拽前,保存兩邊表格的數據,用于還原的操作。

2、注冊右邊drop

    $("#div_tableright div[class=fixed-table-container]").droppable({ drop: function (event, ui) { var arrtr = $(ui.helper[0]).find("tr[class=selected]"); if (arrtr.length <= 0) { alert("請先選中要插單的行"); return; } var oTop = ui.helper[0].offsetTop; var iRowHeadHeight = 40; var iRowHeight = 37; var rowIndex = 0; if (oTop <= iRowHeadHeight + iRowHeight / 2) { rowIndex = 0; } else { rowIndex = Math.ceil((oTop - iRowHeadHeight) / iRowHeight); } for (var i = 0; i < arrtr.length; i++) { var arrtd = $(arrtr[i]).find("td"); var uniqueid = $(arrtr[i]).attr("data-uniqueid"); var rowdata = { ORDER_NO: $(arrtd[1]).text(), BODY_NO: $(arrtd[2]).text(), VIN: $(arrtd[3]).text(), TM_MODEL_MATERIAL_ID: $(arrtd[4]).text(), ORDER_TYPE: $(arrtd[5]).text(), ORDER_STATUS: $(arrtd[6]).text(), CREATE_DATE: $(arrtd[7]).text() == "-" ? null : $(arrtd[7]).text(), PLAN_DATE: $(arrtd[8]).text() == "-" ? null : $(arrtd[8]).text(), VMS_NO: $(arrtd[9]).text(), ENGIN_CODE: $(arrtd[10]).text(), TRANS_CODE: $(arrtd[11]).text(), OFFLINE_DATE_ACT: $(arrtd[12]).text() == "-" ? null : $(arrtd[12]).text(), HOLD_RES: $(arrtd[13]).text(), SPC_FLAG: $(arrtd[14]).text(), TO_ORDER_ID: uniqueid }; $("#tb_order_right").bootstrapTable("insertRow", { index: rowIndex++, row: rowdata }); $('#tb_order_left').bootstrapTable("removeByUniqueId", uniqueid); }   oTableInit.InitDrag(); } });


這里代碼和之前有點變化

(1)注冊#div_tableright div[class=fixed-table-container]標簽的droppable,這個標簽是Bootstrap Table表格初始化后自動生成的,為什么不直接注冊表格#tb_order_right的droppable,是因為這個標簽作用域太小,會導致拖過來的tbody捕捉不到drop事件。而注冊表格外部的#div_tableright div[class=fixed-table-container]這個div標簽可以解決問題。

(2)通過var arrtr = $(ui.helper[0]).find("tr[class=selected]");找到拖過來tbody里面選中的行,然后將數據取出依次插入右邊表格,左邊表格則依次刪除行數據。

(3)這里有點麻煩的是找drop的位置,我們知道,要想將左邊選中的行放到右邊指定的位置,那么就得得到當前鼠標drop的位置,這里通過ui.helper[0].offsetTop屬性來獲得鼠標的Y軸位置,通過計算得到要插入的位置。

3、撤銷操作  

 $("#btn_cancel").click(function () { if (i_statuindex <= 0) { return; } for (var i = 0; i < arrdata.length; i++) { if (arrdata[i].index != i_statuindex) { continue; } var arr_left_data = eval(arrdata[i].left_data); var arr_right_data = eval(arrdata[i].right_data); $('#tb_order_left').bootstrapTable('removeAll'); $('#tb_order_right').bootstrapTable('removeAll'); $('#tb_order_left').bootstrapTable('append', arr_left_data); for (var x = 0; x < arr_right_data.length; x++) { $("#tb_order_right").bootstrapTable("insertRow", { index: x, row: arr_right_data[x] }); }  //$('#tb_order_right').bootstrapTable('append', arr_right_data);//append之后不能drop break; } i_statuindex--; //重寫注冊可拖拽 m_oTable.InitDrag(); //m_oTable.InitDrop(); });

撤銷操作和之前也基本相同。

四、總結
效果是完成了,美中不足的是每次拖過去的都是整個tbody,而不是選中的行,奈何多個選中的行無法用某一個容器包起來。暫時沒找到合適的解決方案。先這樣吧,等以后想到好的方案了再優化吧。 

五、優化方案

1、注冊drap的方法

oTableInit.InitDrag = function () { $('#tb_order_left tbody').draggable({ helper: "clone", start: function (event, ui) { var old_left_data = JSON.stringify($('#tb_order_left').bootstrapTable("getData")); var old_right_data = JSON.stringify($('#tb_order_right').bootstrapTable("getData")); var odata = { index: ++i_statuindex, left_data: old_left_data, right_data: old_right_data }; arrdata.push(odata); $(ui.helper[0]).find("tr[class!=selected]").remove(); }, stop: function (event, ui) { } }); };

增加了這一句$(ui.helper[0]).find("tr[class!=selected]").remove();這樣在拖動的時候就看不到未選中的行了。
2、精準定位到右邊表格指定位置:

oTableInit.InitDrop = function () { $("#div_tableright div[class=fixed-table-container]").droppable({ drop: function (event, ui) { var arrtr = $(ui.helper[0]).find("tr[class=selected]"); if (arrtr.length <= 0) { toastr.warning('請先選中要插單的行'); return; } var oTop = ui.helper[0].offsetTop; //因為表格每行的高度可能不一致,所以這里取插入行位置的辦法是:取右邊表格的行高依次累加,計算行索引。 var rowIndex = 0; var bIsBottom = true; var iRowHeadHeight = 40; var addHeight = iRowHeadHeight; var trs = $("#tb_order_right tbody tr"); for (var i = 0; i < trs.length; i++) { addHeight += $(trs[i]).height(); if (addHeight > oTop) { rowIndex = i; bIsBottom = false;//這里參數用來定義拖動到右邊表格最下面的情況,這時沒有進入到此條件判斷里面。 break; } } if (bIsBottom) { rowIndex = trs.length; } for (var i = 0; i < arrtr.length; i++) { var arrtd = $(arrtr[i]).find("td"); var uniqueid = $(arrtr[i]).attr("data-uniqueid"); var rowdata = { ORDER_NO: $(arrtd[1]).text(), BODY_NO: $(arrtd[2]).text(), VIN: $(arrtd[3]).text(), TM_MODEL_MATERIAL_ID: $(arrtd[4]).text(), ORDER_TYPE: $(arrtd[5]).text(), ORDER_STATUS_NAME: $(arrtd[6]).text(), CREATE_DATE: $(arrtd[7]).text() == "-" ? null : $(arrtd[7]).text(), PLAN_DATE: $(arrtd[8]).text() == "-" ? null : $(arrtd[8]).text(), VMS_NO: $(arrtd[9]).text(), ENGIN_CODE: $(arrtd[10]).text(), TRANS_CODE: $(arrtd[11]).text(), OFFLINE_DATE_ACT: $(arrtd[12]).text() == "-" ? null : $(arrtd[12]).text(), HOLD_RES: $(arrtd[13]).text(), SPC_FLAG: $(arrtd[14]).text(), TO_ORDER_ID: uniqueid, ORDER_STATUS:0 }; $("#tb_order_right").bootstrapTable("insertRow", { index: rowIndex++, row: rowdata }); $('#tb_order_left').bootstrapTable("removeByUniqueId", uniqueid); } oTableInit.InitDrag(); } }); };

因為每一行的行高不確定,是由行里面的數據動態撐出來的,所以這里也動態計算drop的位置。

至此,這個小的功能基本告一段落,基本的效果和待優化點也完成了。

源碼下載:Bootstrap Table表格多行拖拽效果

如果大家還想深入學習,可以點擊這里進行學習,再為大家附兩個精彩的專題:Bootstrap學習教程 Bootstrap實戰教程

以上就是本文的全部內容,希望本文所述對大家學習javascript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕在线高清| 久久久久久久久久久人体| 亚洲国产精彩中文乱码av在线播放| 欧美日韩在线观看视频小说| 亚洲欧美日韩精品久久| 亚洲精品美女在线观看播放| 亚洲高清福利视频| 午夜精品国产精品大乳美女| 国产精品视频自拍| 国产成人aa精品一区在线播放| 亚洲精品免费一区二区三区| 日韩国产欧美精品一区二区三区| 欧美中文字幕视频| 国产精品网站视频| 96国产粉嫩美女| 亚洲中国色老太| 久久久久亚洲精品成人网小说| 日韩免费在线电影| y97精品国产97久久久久久| 青青青国产精品一区二区| 亚洲电影免费观看高清完整版| 亚洲欧美成人网| 欧美三级免费观看| 韩国国内大量揄拍精品视频| 国产精品第一第二| 精品视频在线播放色网色视频| 亚洲欧美福利视频| 成人福利在线观看| 欧美电影免费在线观看| 久久综合久久美利坚合众国| 国产精品一区二区三区在线播放| 亚洲欧美日韩国产中文专区| 免费91麻豆精品国产自产在线观看| 久久人人爽人人| 亚洲国产欧美精品| 国产日韩在线视频| 欧美国产日本在线| www.亚洲一二| 日韩成人激情影院| 欧美裸体xxxx极品少妇软件| 欧美电影免费观看高清| 夜夜嗨av一区二区三区四区| 国产精品www网站| 精品久久久香蕉免费精品视频| 亚洲人成人99网站| 精品亚洲国产视频| 国产精品视频公开费视频| 最新的欧美黄色| 91亚洲午夜在线| 国产91成人video| 在线视频精品一| 日韩精品极品视频免费观看| 日韩高清人体午夜| 不卡av在线播放| 欧美床上激情在线观看| 亚洲一区二区三区香蕉| 日韩电视剧免费观看网站| 超碰97人人做人人爱少妇| 91成人福利在线| 丝袜美腿精品国产二区| 91高清视频在线免费观看| 久久夜色精品亚洲噜噜国产mv| 亚洲成人精品视频在线观看| 欧美美女15p| 日韩免费在线电影| 国产高清视频一区三区| 亚洲综合色av| 国产精品视频白浆免费视频| 福利视频一区二区| 国产美女精品视频| 亚洲午夜精品视频| 中文字幕亚洲自拍| 亚洲视频视频在线| 538国产精品一区二区在线| 欧美性生交大片免费| 久久成人在线视频| 91在线无精精品一区二区| 亚洲精品自拍偷拍| 成人国产精品一区| 日本国产高清不卡| 一区二区三区天堂av| 日韩高清免费观看| 日本一区二区不卡| 成人444kkkk在线观看| 成人久久一区二区| 91精品久久久久久久久久久久久久| 成人欧美一区二区三区在线| 日韩欧美中文免费| 亚洲国产精品成人一区二区| 亚洲欧洲日本专区| 久久视频这里只有精品| 亚洲sss综合天堂久久| 中文字幕精品av| 国产福利精品视频| 欧美电影在线观看网站| www.欧美精品一二三区| 亚洲福利视频二区| 国产午夜一区二区| 国产视频丨精品|在线观看| 精品视频久久久| 日韩电影中文 亚洲精品乱码| 亚洲成人aaa| 日韩av最新在线观看| 国产成人一区二| 欧美一级大片在线免费观看| 日韩免费在线看| 日韩成人av在线播放| 精品偷拍一区二区三区在线看| 国产婷婷97碰碰久久人人蜜臀| 91久久久久久久久久久| 在线观看国产精品91| 亚洲欧美中文字幕| 欧美最猛性xxxxx亚洲精品| 日本91av在线播放| 中文字幕一精品亚洲无线一区| 久久久久北条麻妃免费看| 久久琪琪电影院| 在线观看视频亚洲| 久久激情视频久久| 国产欧美日韩最新| 亚洲久久久久久久久久| 欧美最顶级丰满的aⅴ艳星| 欧美激情视频给我| 日本精品久久中文字幕佐佐木| 亚洲成人教育av| 九九九热精品免费视频观看网站| 日韩av男人的天堂| 亚洲人成在线观看网站高清| 欧洲中文字幕国产精品| 欧美激情视频给我| 国产偷亚洲偷欧美偷精品| 亚洲少妇中文在线| 欧美在线视频播放| 欧美成人精品在线播放| 成人黄色av播放免费| 中文字幕免费精品一区高清| 亚洲在线视频观看| 国产午夜精品麻豆| 亚洲欧美中文字幕| 国产精品久久久久久久久粉嫩av| 久久久久久999| 亚洲人精选亚洲人成在线| 色综合久久中文字幕综合网小说| 国产成人欧美在线观看| 欧美交受高潮1| 亚洲精品一区av在线播放| 亚洲第一页在线| 亚洲加勒比久久88色综合| 日韩一区二区av| 激情久久av一区av二区av三区| 欧美在线www| 久久韩剧网电视剧| 91av在线免费观看| 青青青国产精品一区二区| 欧美裸身视频免费观看| 亚洲国产精彩中文乱码av在线播放| 国产亚洲成av人片在线观看桃| 亚洲日韩第一页| 亚洲欧洲在线视频| 国产精品视频网址| 国产精品露脸av在线| 亚洲第一区第一页| 国产精品电影网| 国产精品视频1区|