日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

跨平台桌面完全体

發布時間:2024/1/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跨平台桌面完全体 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

經過一點點的業余加班努力,終于實現了客戶端跨平臺完全體。客戶端可以調用打印,調用打印預覽,調用打印生成PDF,調用Excel導出。windows下可以驅動模板設計器等。除了攝像頭調用部分和監聽程序接口部分全部實現。攝像頭和監聽接口目前還涉及不到linux運行。普通用戶正常使用的功能是完事了。主要難度在打印預覽實現上。

老winform預覽,是打開winform界面做展示預覽的,預覽邏輯還不少,完全要做界面和服務分離。

//如果是預覽if (printFlag == "PrintPreviewOld" || printFlag == "PrintPreview"){PrintPreview.Document = pdDocument;PrintPreview.ShowPrinterSettingsBeforePrint = false;PrintPreview.ShowPrinterSettingsButton = true;PrintPreview.ShowPageSettingsButton = true;PrintPreview.PrintPreviewControl.Zoom = 1;PrintPreview.WindowState = FormWindowState.Maximized;PrintPreview.ShowDialog();//確定打印if (PrintPreview.printDialogResult == DialogResult.Yes){PrinterSettings setting = pdDocument.PrinterSettings;pdDocument = new PrintDocument();pdDocument.PrinterSettings = setting;iRow = 0;startPage = 0;//訂閱BeginPrint事件 pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);//定義打印內容pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);//訂閱EndPrint事件,釋放資源 pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);//打印PrintProxy();string state = GetPrintState();if (state != ""){if (shouldShowErr){FrmInfo frminfo = new FrmInfo();frminfo.Info = "打印機處于錯誤狀態";frminfo.CoderInfo = state;frminfo.ShowDialog();WriteLog(state);}else{errInfo += state;WriteLog(errInfo);}return;}}//確定打印else if (PrintPreview.printDialogResult == DialogResult.OK){//pdDocument = new PrintDocument();iRow = 0;startPage = 0;int curPage = 0;//當前頁開始int preStart = 0;pintPoints.Clear();//循環繪制每行數據for (int i = iRow; i < namesTable.Rows.Count; i++){if (PrintPreview.CurPage >= 0){if (curPage == PrintPreview.CurPage + 1){break;}}//取出當前行數據DataRow dr = namesTable.Rows[i];//打印類型string PrintType = dr["PrintType"].ToString();//換頁if (PrintType == "PAGE" || (i == (namesTable.Rows.Count - 1))){if (curPage < PrintPreview.CurPage){iRow = i + 1;}else{endRow = i + 1;}curPage++;//打印奇數頁if (PrintPreview.CurPage == -1){if (curPage % 2 != 0){if (PrintPreview.RangeStart > 0 && PrintPreview.RangeEnd > 0){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Add(new Point(preStart, i));}}else{pintPoints.Add(new Point(preStart, i));}}}//打印偶數頁else if (PrintPreview.CurPage == -2){if (curPage % 2 == 0){if (PrintPreview.RangeStart > 0 && PrintPreview.RangeEnd > 0){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Add(new Point(preStart, i));}}else{pintPoints.Add(new Point(preStart, i));}}}//打印偶數頁逆序else if (PrintPreview.CurPage == -3){if (curPage % 2 == 0){if (PrintPreview.RangeStart > 0 && PrintPreview.RangeEnd > 0){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Insert(0, new Point(preStart, i));}}else{pintPoints.Insert(0, new Point(preStart, i));}}}//范圍打印else if (PrintPreview.CurPage == -4){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Add(new Point(preStart, i));}}//當前頁開始位置preStart = i + 1;}}//訂閱BeginPrint事件 pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);//定義打印內容pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);//訂閱EndPrint事件,釋放資源 pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);//打印PrintProxy();string state = GetPrintState();if (state != ""){if (shouldShowErr){FrmInfo frminfo = new FrmInfo();frminfo.Info = "打印機處于錯誤狀態";frminfo.CoderInfo = state;frminfo.ShowDialog();WriteLog(state);}else{errInfo += state;WriteLog(errInfo);}return;}}}

先抽取界面數據共性,用來在UI和服務傳輸數據,需要展示預覽界面時候服務端給UI發消息,UI展示界面,把用戶選擇組裝消息發回給服務端。在用戶確認之前服務端處于線程等待狀態。

/// <summary>/// 打印預覽返回實體/// </summary>public class PrintPreViewRetDto{/// <summary>/// 選擇結果/// </summary>public string printDialogResult{get;set;}/// <summary>/// 當前頁/// </summary>public int CurPage{get;set;}/// <summary>/// 范圍開始/// </summary>public int RangeStart{get;set;}/// <summary>/// 范圍結束/// </summary>public int RangeEnd{get;set;}}

對接UI層實現,打印抽象接口

/// <summary>/// 操作打印的接口外殼/// </summary>public interface IOperPrintShell{/// <summary>/// 顯示運用程序信息/// </summary>/// <param name="info"></param>/// <param name="coderInfo"></param>void ShowAppInfo(string info, string coderInfo);/// <summary>/// 顯示彈窗消息/// </summary>/// <param name="info"></param>/// <param name="title"></param>void ShowMsgInfo(string info,string title="");/// <summary>/// 保存文件對話框/// </summary>/// <param name="Filter"></param>/// <returns></returns>string SaveFileDialog(string Filter);/// <summary>/// 選擇文件夾對話框/// </summary>/// <param name="Title"></param>/// <returns></returns>string SaveDirDialog(string Title);/// <summary>/// 顯示打印預覽/// </summary>/// <param name="imageJsonName">圖片Base64串JSON文件</param>/// <returns></returns>PrintPreViewRetDto ShowPrintPreview(string imageJsonName);}

打印界面接口實現

using DHCLabtrakReportPrint; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace LISClientMsgDeal {/// <summary>/// 操作打印的殼/// </summary>public class OperPrintShell : DHCLabtrakReportPrint.IOperPrintShell{/// <summary>/// 顯示消息框/// </summary>/// <param name="title">標題</param>/// <param name="msg">消息</param>/// <param name="buttonNames">按鈕名稱</param>/// <returns></returns>public string ShowMsgDialog(string title, string msg, string buttonNames){if (MessageServer.UIOper != null){return MessageServer.UIOper.ShowMsgDialog(title, msg, buttonNames);}Console.WriteLine(title+":"+ msg);return "0";}/// <summary>/// 從多個文件選一個彈窗/// </summary>/// <param name="selectStr">用|分割的多個名稱</param>/// <returns></returns>public string SelectFileDialog(string selectStr){if (MessageServer.UIOper != null){return MessageServer.UIOper.ShowSelectTmpFileDialog(selectStr);}Console.WriteLine("沒有UI,默認選擇第一個:");string path = selectStr.Split('|')[0];return path;}/// <summary>/// 保存文件對話框/// </summary>/// <param name="Filter"></param>/// <returns></returns>public string SaveFileDialog(string Filter){if(MessageServer.UIOper != null){return MessageServer.UIOper.ShowSaveFileDialog("保存文件","", Filter);}Console.WriteLine("請輸入要保存的路徑:");string path = Console.ReadLine();return path;}/// <summary>/// 顯示App信息/// </summary>/// <param name="info"></param>/// <param name="coderInfo"></param>public void ShowAppInfo(string info, string coderInfo){string head = DateTime.Now.ToString("hh:mm:ss") + "#";Console.WriteLine(head + info);Console.WriteLine(head + coderInfo);}/// <summary>/// 顯示消息/// </summary>/// <param name="info"></param>/// <param name="title"></param>public void ShowMsgInfo(string info, string title = ""){if (MessageServer.UIOper != null){MessageServer.UIOper.ShowMsgDialog(title, info, "確定");}string head = DateTime.Now.ToString("hh:mm:ss") + "#" + title;Console.WriteLine(head + info);}/// <summary>/// 選擇文件夾對話框/// </summary>/// <param name="Title"></param>/// <returns></returns>public string SaveDirDialog(string Title){if (MessageServer.UIOper != null){return MessageServer.UIOper.ShowSaveDirDialog("選擇要保存的路徑","");}Console.WriteLine("請輸入要保存的路徑:");string path = Console.ReadLine();return path;}/// <summary>/// 顯示打印預覽/// </summary>/// <param name="imageJsonName">圖片Base64串JSON文件</param>/// <returns></returns>public PrintPreViewRetDto ShowPrintPreview(string imageJsonName){if (MessageServer.UIOper != null){return MessageServer.UIOper.ShowPrintPreview(imageJsonName);}string head = DateTime.Now.ToString("hh:mm:ss") + "#" + imageJsonName;Console.WriteLine(head);PrintPreViewRetDto ret = new PrintPreViewRetDto();ret.printDialogResult = "Yes";ret.CurPage = 0;ret.RangeStart = -1;ret.RangeEnd = -1;return ret;}} }

和electron的UI交互層

using DHCLabtrakReportPrint; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace LISClientMsgDeal {public class UIOperElectron : IUIOperInterface{/// <summary>/// 連接,通過該連接和UI通信/// </summary>public LIS.IWebSocketConnection Socket{get;set;}/// <summary>/// 消息ID/// </summary>private static int id = 0;/// <summary>/// 顯示消息框/// </summary>/// <param name="title">標題</param>/// <param name="msg">消息</param>/// <param name="buttonNames">按鈕名稱</param>/// <returns></returns>public string ShowMsgDialog(string title,string msg,string buttonNames){if(buttonNames==""){buttonNames = "確定|取消";}UIMsgDto dto = new UIMsgDto();dto.Type = "MsgDialog";dto.NeedRet = true;dto.Paras = new List<string>();dto.Paras.Add(title);dto.Paras.Add(msg);dto.Paras.Add(buttonNames);//會阻塞等待返回UIMsgDto ret = SenMsgAndWait(dto);if (ret != null){if (ret.RetParas != null && ret.RetParas.Count > 0){return ret.RetParas[0];}}return "";}/// <summary>/// 顯示選擇文件對話框/// </summary>/// <param name="selectStr"></param>/// <returns></returns>public string ShowSelectTmpFileDialog(string selectStr){UIMsgDto dto = new UIMsgDto();dto.Type = "SelectTmpFileDialog";dto.NeedRet = true;dto.Paras = new List<string>();dto.Paras.Add(selectStr);//會阻塞等待返回UIMsgDto ret = SenMsgAndWait(dto);if (ret != null){if (ret.RetParas != null && ret.RetParas.Count > 0){return ret.RetParas[0];}}return "";}/// <summary>/// 顯示保存文件對話框/// </summary>/// <param name="title">對話框標題</param>/// <param name="defaultPath">默認路徑</param>/// <param name="filter">篩選:"Image Files (*.jpg;*.png)|*.jpg;*.png"</param>/// <returns>沒選擇就返回空,選擇了就返回路徑</returns>public string ShowSaveFileDialog(string title, string defaultPath, string filter){UIMsgDto dto = new UIMsgDto();dto.Type = "SaveFileDialog";dto.NeedRet = true;dto.Paras = new List<string>();dto.Paras.Add(title);dto.Paras.Add(defaultPath);dto.Paras.Add(filter);//會阻塞等待返回UIMsgDto ret = SenMsgAndWait(dto);if(ret!=null){if(ret.RetParas!=null&& ret.RetParas.Count>0){return ret.RetParas[0];}}return "";}/// <summary>/// 顯示選擇文件夾對話框/// </summary>/// <param name="title">對話框標題</param>/// <param name="defaultPath">默認路徑</param>/// <returns>沒選擇就返回空,選擇了就返回路徑</returns>public string ShowSaveDirDialog(string title, string defaultPath){UIMsgDto dto = new UIMsgDto();dto.Type = "SaveDirDialog";dto.NeedRet = true;dto.Paras = new List<string>();dto.Paras.Add(title);dto.Paras.Add(defaultPath);//會阻塞等待返回UIMsgDto ret = SenMsgAndWait(dto);if (ret != null){if (ret.RetParas != null && ret.RetParas.Count > 0){return ret.RetParas[0];}}return "";}/// <summary>/// 顯示打印預覽/// </summary>/// <param name="imageJsonName">圖片Base64串JSON文件</param>/// <returns></returns>public PrintPreViewRetDto ShowPrintPreview(string imageJsonName){UIMsgDto dto = new UIMsgDto();dto.Type = "PrintPreView";dto.NeedRet = true;dto.Paras = new List<string>();dto.Paras.Add(imageJsonName);PrintPreViewRetDto retDto = new PrintPreViewRetDto();//會阻塞等待返回UIMsgDto ret = SenMsgAndWait(dto);if (ret != null){if (ret.RetParas != null && ret.RetParas.Count > 0){retDto.printDialogResult = ret.RetParas[0];retDto.CurPage = Convert.ToInt32(ret.RetParas[1]);if(ret.RetParas[2]!=""){retDto.RangeStart = Convert.ToInt32(ret.RetParas[2]);}if(ret.RetParas[3]!=""){retDto.RangeEnd = Convert.ToInt32(ret.RetParas[3]);}return retDto;}}retDto.printDialogResult = "Yes";retDto.CurPage = 0;retDto.RangeStart = -1;retDto.RangeEnd = -1;return retDto;}/// <summary>/// 發送消息并且等待返回值/// </summary>/// <param name="dto">消息實體</param>/// <returns>返回結果</returns>private UIMsgDto SenMsgAndWait(UIMsgDto dto){dto.MsgID = id.ToString();id++;string msgStr = JsonConvert.SerializeObject(dto);if(Socket!=null){Socket.Send(msgStr);if(dto.NeedRet==true){//注冊等待UIMessageDeal.WaitReg(Socket.ConnectionInfo.Id.ToString(), dto);int waiteNum = 0;while (true){UIMsgDto ret=UIMessageDeal.GetUIMsgRet(dto.MsgID);if(ret!=null){return ret;}else{System.Threading.Thread.Sleep(200);}waiteNum++;if(waiteNum>40000){break;}}}}return null;}} }

界面electron對接層JS,處理服務發來的界面展示消息

//處理服務端后臺的消息 function DealMsgServer(data) {//保存文件對話框if (data.Type == "SaveFileDialog") {var filters = [];if (data.Paras[2] != "") {var arr = data.Paras[2].split('|');for (var i = 0; i < arr.length; i += 2) {var one = { name: arr[i], extensions: [arr[i + 1].split(".")[1]] };filters.push(one);}}dialog.showSaveDialog({title: data.Paras[0],defaultPath: data.Paras[1],filters: filters}).then(result => {data.RetParas = [];data.RetParas.push(result.filePath);console.log("UI->S", "uimsg#" + JSON.stringify(data));ws.send("uimsg#" + JSON.stringify(data));}).catch(err => {console.log(err)});}//選擇路徑對話框else if (data.Type == "SaveDirDialog") {dialog.showOpenDialog(mainWindow, {properties: ['openDirectory']}).then(result => {data.RetParas = result.filePaths;console.log("UI->S", "uimsg#" + JSON.stringify(data));ws.send("uimsg#" + JSON.stringify(data));}).catch(err => {console.log(err)});}//選擇模板文件對話框,多選一else if (data.Type == "SelectTmpFileDialog") {var path = data.Paras[0];var pathArr = path.split('|');var buttons = [];for (var i = 0; i < pathArr.length; i++) {var oneArr = pathArr[i].split("/");buttons.push(oneArr[oneArr.length-1]);}var choice = dialog.showMessageBoxSync(mainWindow, {type: "info",buttons: buttons,title: "選擇模板對話框",message: "請選擇要使用的導出模板",defaultId: -1,cancelId: -1});//執行菜單邏輯if (choice >= 0) {data.RetParas = [];data.RetParas.push(pathArr[choice]);console.log("UI->S", "uimsg#" + JSON.stringify(data));ws.send("uimsg#" + JSON.stringify(data));}else {data.RetParas = [];data.RetParas.push("");console.log("UI->S", "uimsg#" + JSON.stringify(data));ws.send("uimsg#" + JSON.stringify(data));}}//選擇模板文件對話框,多選一else if (data.Type == "MsgDialog") {var title = data.Paras[0];var msg = data.Paras[1];var buttonStr = data.Paras[2];var nameArr = buttonStr.split('|');var buttons = [];for (var i = 0; i < nameArr.length; i++) {buttons.push(nameArr[i]);}var choice = dialog.showMessageBoxSync(mainWindow, {type: "info",buttons: buttons,title: title,message: msg,defaultId: -1,cancelId: -1});data.RetParas = [];data.RetParas.push(choice);console.log("UI->S", "uimsg#" + JSON.stringify(data));ws.send("uimsg#" + JSON.stringify(data));}//打印預覽對話框else if (data.Type == "PrintPreView") {var JSONPath = data.Paras[0];//創建新的窗口var printViewWindow = new BrowserWindow({skipTaskbar: false,icon: __dirname + dirSplit + 'lis.ico',webPreferences: {nodeIntegration: true,contextIsolation: false}});//最大化printViewWindow.maximize();printViewWindow.loadFile('main/form/frmPrintView.html', { search: "Json=" + "http://127.0.0.1:8085/UI/" + JSONPath +"&MsgID="+data.MsgID });} }

主進程打開預覽界面后接收渲染進程消息

//接收渲染進程消息ipcMain.on('printview', (event, msgData) => {console.log(msgData);if (msgData.Type == "PrintPreView") {console.log("UI->S", "uimsg#" + JSON.stringify(msgData));ws.send("uimsg#" + JSON.stringify(msgData));}});

預覽界面,把用戶選擇通過消息發送給主進程,主進程再發送給服務端的websockt讓服務端接著執行邏輯

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /><title>打印預覽</title><script type="text/javascript">const ipcRenderer = require('electron').ipcRenderer;window.nodeRequire = require;delete window.require;delete window.exports;delete window.module;</script><script src="../../resource/common/js/lis-commonHISUI.js" type="text/javascript"></script><style type="text/css">.ar {text-align: right;padding-right: 8px;}.ar6 {text-align: right;padding-right: 6px;}.al {text-align: left;padding-right: 10px;}.sp {display: inline-block;width: 15px;}.sp4 {display: inline-block;width: 4px;}.sp6 {display: inline-block;width: 6px;}.sp10 {display: inline-block;width: 10px;}.sp20 {display: inline-block;width: 20px;}</style><script type="text/javascript">//得到傳入的Json路徑var Json = requestUrlParam(location.href, "Json").replace("#", "");var MsgID = requestUrlParam(location.href, "MsgID").replace("#", "");//document.write('<script type="text/javascript" href="' + Json + '"/>');var Align = requestUrlParam(location.href, "Align").replace("#", "");$(function () {if (Align == "Left") {$("#divOper").css("margin", "0 0 0 0");$("#divMian").css("margin", "0 0 0 0");}var CurPage = 0;var printDialogResult = "";var RangeStart = "";var RangeEnd = "";//默認第一頁$("#txtCurPage").val("1");//打印當前頁$("#btnPrintCur").click(function () {printDialogResult = "Ok";SendMsg();});//打印全部$("#btnPrintAll").click(function () {printDialogResult = "Yes";SendMsg();});//關閉$("#btnClose").click(function () {printDialogResult = "Cancel";});//打印奇數頁$("#btnPrintOdd").click(function () {printDialogResult = "OK";CurPage = -1;SendMsg();});//打印偶數頁$("#btnPrintEven").click(function () {printDialogResult = "OK";CurPage = -2;SendMsg();});//偶逆序$("#btnPrintEvenRevert").click(function () {printDialogResult = "OK";CurPage = -3;SendMsg();});//范圍打印$("#btnPrintRange").click(function () {printDialogResult = "OK";RangeStart = $("#txtRangeStart").val();RangeEnd = $("#txtRangeEnd").val();SendMsg();});//上一頁$("#btnPrev").click(function () {CurPage--;if (CurPage < 0) {CurPage = 0;}$("#txtCurPage").val(CurPage+1);DrawPage();});//下一頁$("#btnNext").click(function () {CurPage++;if (CurPage == MaxPageIndex) {CurPage = MaxPageIndex - 1;}$("#txtCurPage").val(CurPage+1);DrawPage();});if (Json == "") {$("#spPage").html("沒按要求傳入Json!");return;}var imgStr = '';$.ajax({type: "get",dataType: "json", //text, json, xmlcache: false, //async: false, //為true時,異步,不等待后臺返回值,為false時強制等待;-asirurl: Json,success: function (imageArr) {for (var i = 0; i < imageArr.length; i++) {if (i > 0) {imgStr += '<div style="font-weight:bold;color:#ff5252;">第' + (i + 1) + '頁</div><img src="' + "data:image/png;base64," + imageArr[i] + '" alt="報告" style="margin-bottom:10px;"/>';}else {imgStr += '<img src="' + "data:image/png;base64," + imageArr[i] + '" alt="報告" style="margin-bottom:10px;"/>';}}$("#spPage").html("當前報告共(" + imageArr.length + ")頁");$("#divMian").html(imgStr);}});//組裝消息function SendMsg() {var msg = {};msg.CurPage = CurPage;msg.printDialogResult = printDialogResult;msg.RangeStart = RangeStart;msg.RangeEnd = RangeEnd;msg.MsgID = MsgID;msg.Type = "PrintPreView";msg.NeedRet = true;msg.Paras = "";msg.RetParas = [printDialogResult, CurPage, RangeStart, RangeEnd];ipcRenderer.send('printview', msg);window.close();}//繪制當前頁function DrawPage() {$("#divMian").html('<img src="' + "data:image/png;base64," + imageArr[CurPage] + '" alt="報告" style="margin-bottom:10px;"/>');}});</script> </head> <body><div id="divOper" style="margin:auto auto;width: 100%;background-color:#F5F5F5; text-align: center; padding: 5px;"><a id="btnPrintCur" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">打印當前頁</a><a id="btnPrintAll" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">打印全部</a><a id="btnClose" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">關閉</a><a id="btnPrintOdd" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">打印奇數頁</a><a id="btnPrintEven" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">打印偶數頁</a><a id="btnPrintEvenRevert" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">偶逆序</a><input id="txtRangeStart" type="text" style="width:30px" class="hisui-validatebox" />-<input id="txtRangeEnd" type="text" style="width:30px" class="hisui-validatebox" /><a id="btnPrintRange" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">范圍打印</a><span id="spPage" style="font-weight: bold; color: #ff5252; font-size: 14px;"></span><input id="txtCurPage" type="text" style="width:30px" class="hisui-validatebox" /><a id="btnPrev" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">上一頁</a><a id="btnNext" href="#" class="hisui-linkbutton" data-options="iconCls:'icon-print',plain:true" style="margin-left:10px;">下一頁</a><span style="font-weight: bold; color: #AAAAAA; font-size: 14px;float:right;margin-right:10px;">打印預覽</span></div><div id="divMian" style="margin: auto auto; width: 850px; background-color: #DDDDDD; text-align: center; padding-top: 10px;"></div> </body> </html>

原來winform打印預覽代碼調整,原來的打印預覽彈窗改為PrintPreViewRetDto PrintPreview = Shell.ShowPrintPreview(jsonFile);驅動electron的ui。

//如果是預覽if (printFlag == "PrintPreviewOld" || printFlag == "PrintPreview"){//得到打印預覽的圖片JSONstring jsonFile=GetImageJsonFile();//顯示打印預覽PrintPreViewRetDto PrintPreview = Shell.ShowPrintPreview(jsonFile);//確定打印if (PrintPreview.printDialogResult == "Yes"){PrinterSettings setting = pdDocument.PrinterSettings;pdDocument = new PrintDocument();pdDocument.PrinterSettings = setting;iRow = 0;startPage = 0;//訂閱BeginPrint事件 pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);//定義打印內容pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);//訂閱EndPrint事件,釋放資源 pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);//打印PrintProxy();}//確定打印else if (PrintPreview.printDialogResult == "Ok"){//pdDocument = new PrintDocument();iRow = 0;startPage = 0;int curPage = 0;//當前頁開始int preStart = 0;pintPoints.Clear();//循環繪制每行數據for (int i = iRow; i < namesTable.Rows.Count; i++){if (PrintPreview.CurPage >= 0){if (curPage == PrintPreview.CurPage + 1){break;}}//取出當前行數據DataRow dr = namesTable.Rows[i];//打印類型string PrintType = dr["PrintType"].ToString();//換頁if (PrintType == "PAGE" || (i == (namesTable.Rows.Count - 1))){if (curPage < PrintPreview.CurPage){iRow = i + 1;}else{endRow = i + 1;}curPage++;//打印奇數頁if (PrintPreview.CurPage == -1){if (curPage % 2 != 0){if (PrintPreview.RangeStart > 0 && PrintPreview.RangeEnd > 0){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Add(new Point(preStart, i));}}else{pintPoints.Add(new Point(preStart, i));}}}//打印偶數頁else if (PrintPreview.CurPage == -2){if (curPage % 2 == 0){if (PrintPreview.RangeStart > 0 && PrintPreview.RangeEnd > 0){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Add(new Point(preStart, i));}}else{pintPoints.Add(new Point(preStart, i));}}}//打印偶數頁逆序else if (PrintPreview.CurPage == -3){if (curPage % 2 == 0){if (PrintPreview.RangeStart > 0 && PrintPreview.RangeEnd > 0){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Insert(0, new Point(preStart, i));}}else{pintPoints.Insert(0, new Point(preStart, i));}}}//范圍打印else if (PrintPreview.CurPage == -4){if (curPage >= PrintPreview.RangeStart && curPage <= PrintPreview.RangeEnd){pintPoints.Add(new Point(preStart, i));}}//當前頁開始位置preStart = i + 1;}}//訂閱BeginPrint事件 pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);//定義打印內容pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);//訂閱EndPrint事件,釋放資源 pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);//打印PrintProxy();}}

Excel導出從多個模板選一個對接,需要彈窗展示多個模板名稱讓用戶選擇用的模板。通過string fullName = MessageServer.shell.SelectFileDialog(tempExcelPath);驅動UI

驅動地方,

//導出Excelelse if (((inputStrArr[0] == "Export") || (inputStrArr[0] == "ExportFast")) && inputStrArr.Length > 2){string tempExcelPath = inputStrArr[6];//快速導出Excel標識if (inputStrArr[0] == "ExportFast"){ExportUtil.IsExportFast = true;}//選模板的模式if (tempExcelPath.Contains("|")){//選擇模板string fullName = MessageServer.shell.SelectFileDialog(tempExcelPath);if (fullName != ""){inputStrArr[6] = fullName;RealExport(inputStrArr);}}else{RealExport(inputStrArr);}}

發消息給UI層

/// <summary>/// 從多個文件選一個彈窗/// </summary>/// <param name="selectStr">用|分割的多個名稱</param>/// <returns></returns>public string SelectFileDialog(string selectStr){if (MessageServer.UIOper != null){return MessageServer.UIOper.ShowSelectTmpFileDialog(selectStr);}Console.WriteLine("沒有UI,默認選擇第一個:");string path = selectStr.Split('|')[0];return path;}

electron交互層,這里把組裝的UI消息推送給界面端,界面收到消息做響應

/// <summary>/// 顯示選擇文件對話框/// </summary>/// <param name="selectStr"></param>/// <returns></returns>public string ShowSelectTmpFileDialog(string selectStr){UIMsgDto dto = new UIMsgDto();dto.Type = "SelectTmpFileDialog";dto.NeedRet = true;dto.Paras = new List<string>();dto.Paras.Add(selectStr);//會阻塞等待返回UIMsgDto ret = SenMsgAndWait(dto);if (ret != null){if (ret.RetParas != null && ret.RetParas.Count > 0){return ret.RetParas[0];}}return "";}

js處理,處理選擇模板類型消息,展示模板選擇彈窗,把選擇結果發送給服務端。

//選擇模板文件對話框,多選一else if (data.Type == "SelectTmpFileDialog") {var path = data.Paras[0];var pathArr = path.split('|');var buttons = [];for (var i = 0; i < pathArr.length; i++) {var oneArr = pathArr[i].split("/");buttons.push(oneArr[oneArr.length-1]);}var choice = dialog.showMessageBoxSync(mainWindow, {type: "info",buttons: buttons,title: "選擇模板對話框",message: "請選擇要使用的導出模板",defaultId: -1,cancelId: -1});//執行菜單邏輯if (choice >= 0) {data.RetParas = [];data.RetParas.push(pathArr[choice]);console.log("UI->S", "uimsg#" + JSON.stringify(data));ws.send("uimsg#" + JSON.stringify(data));}else {data.RetParas = [];data.RetParas.push("");console.log("UI->S", "uimsg#" + JSON.stringify(data));ws.send("uimsg#" + JSON.stringify(data));}}

通過前后端精密的配合解決DotNetCore沒跨平臺ui的問題。同時實現CS界面和后端解耦合

完美,哈哈,多平臺可用,centos錄屏不好弄,彈窗風格沒windows好,總算實現了完全跨平臺了

總結

以上是生活随笔為你收集整理的跨平台桌面完全体的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产精品9999| 狠狠操综合网 | 在线成人免费电影 | 在线91色| 成人播放器 | 99国产精品久久久久老师 | 亚洲成免费 | 天天色棕合合合合合合 | 一区二区三区av在线 | 日本久久久久 | 久久久免费观看视频 | 成人免费一级片 | 久久久综合色 | 高清av免费看 | 成人午夜黄色 | 欧美日韩亚洲一 | av色网站 | 亚洲国产99| 伊人婷婷网 | 深爱激情婷婷网 | 人人草在线观看 | 天堂在线视频中文网 | 激情 婷婷 | 91视频3p| 日韩精品视频在线观看免费 | 玖玖玖影院 | 在线观看一级视频 | 在线欧美国产 | 欧美aa级 | 日韩三级视频在线观看 | 精品国产欧美一区二区三区不卡 | 黄色av网站在线观看免费 | 欧美激情精品久久久久久免费印度 | 黄色三级免费看 | 最近中文字幕免费 | 久久精品xxx | 国产精品成人一区二区三区 | 九九视频这里只有精品 | 丁香激情综合 | 激情视频在线观看网址 | 免费污片 | 亚洲香蕉在线观看 | 国产群p| 亚洲精品在线网站 | bbw av | 国产一区二区在线免费观看 | 伊人色综合网 | 中文字幕高清在线播放 | 在线看的av网站 | 日韩高清不卡一区二区三区 | 欧美日韩高清一区二区三区 | 97色国产 | 日韩av一卡二卡三卡 | 中文字幕在线观看三区 | 国产色视频网站2 | 久久精品这里精品 | 97成人精品视频在线观看 | 国产91精品一区二区麻豆亚洲 | 国产99久久99热这里精品5 | 国产中文字幕视频 | 深爱开心激情网 | 国产91精品高清一区二区三区 | 日韩在线观看一区二区 | 久久久久免费 | 中文字幕a∨在线乱码免费看 | www.激情五月.com | 亚洲精品一区二区三区高潮 | 2019中文字幕网站 | 国产亚洲婷婷免费 | 中文字幕永久 | 久草免费色站 | 成人一区不卡 | 九九视频免费在线观看 | 99精品观看 | 亚洲精品乱码久久久久久高潮 | 亚洲在线观看av | 四虎国产精 | 久热av在线| 四虎亚洲精品 | 国产亚州精品视频 | 日日日天天天 | 亚洲专区一二三 | 免费在线观看黄色网 | 丁香久久久| 欧美国产日韩在线观看 | 少妇bbb好爽 | 免费在线黄网 | 欧美一区二区三区在线 | 奇米网444| 亚洲日本va午夜在线影院 | 亚洲精品动漫成人3d无尽在线 | 国产午夜精品在线 | 天天干,天天射,天天操,天天摸 | 伊人久久在线观看 | 日韩在线观看 | 天天操天天干天天操天天干 | 中文字幕亚洲综合久久五月天色无吗'' | 亚洲国产精品小视频 | 久久精品免费 | 国产又粗又猛又黄视频 | 日日干天天射 | 欧美日韩91 | 特级毛片aaa| 欧美成人亚洲 | 亚洲国产影院av久久久久 | 中文字幕亚洲欧美日韩2019 | 超碰97免费| 91在线在线观看 | 日本不卡一区二区 | 久久久久国产精品视频 | 狠狠操综合网 | 91探花系列在线播放 | 久精品视频| 91九色在线视频 | 在线视频观看91 | 午夜视频在线观看一区二区三区 | 五月婷婷六月丁香激情 | 亚洲精品黄色 | 亚洲精品毛片一级91精品 | 日本不卡一区二区 | 人人爱人人射 | 成人黄色小说网 | 超碰97.com | 91九色精品女同系列 | 日韩特级黄色片 | 人人干网 | 91视频在线观看大全 | 九九久久精品视频 | 国内精品久久久久久久影视简单 | 亚洲色综合 | 国产亚洲综合在线 | 色播五月激情五月 | 久久99精品国产麻豆宅宅 | 91在线蜜桃臀 | 欧美男女爱爱视频 | 国产91精品高清一区二区三区 | 日韩在线观看一区二区三区 | 国产视频2区 | 久久国产色 | 在线观看的黄色 | 中文字幕黄色网址 | 亚洲天堂网在线视频 | 久久久精品一区二区 | 久久久人人爽 | 中文字幕一区二区在线观看 | 亚洲一区久久 | 成人午夜剧场在线观看 | 伊人国产在线播放 | 久久视频在线观看中文字幕 | av线上看 | 日本美女xx| 国产精品久久久久久久久久久久午 | 欧美日韩在线观看不卡 | 伊人成人激情 | 欧美日韩视频在线观看一区二区 | 欧美日韩国产一区二区三区 | 成人久久影院 | 国产又粗又猛又色又黄网站 | 免费在线观看的av网站 | 成人性生交视频 | 日韩三级视频在线看 | 国产精品久久久一区二区三区网站 | 欧美了一区在线观看 | 97超级碰碰碰碰久久久久 | 毛片激情永久免费 | 在线精品播放 | www.在线看片.com | 欧美怡红院视频 | wwwwwww黄 | 一区二区三区久久精品 | 久久影院精品 | 亚洲欧美日韩一级 | 国产午夜三级一二三区 | 亚色视频在线观看 | 国产精品中文久久久久久久 | 日本最大色倩网站www | 国产亚洲精品久久久久久久久久 | 韩国在线一区 | 日韩精品不卡在线观看 | 麻豆视频大全 | 日本大片免费观看在线 | 在线免费视频 你懂得 | 色老板在线 | 黄色软件在线观看 | 亚洲视频在线观看网站 | 国产丝袜网站 | 黄污在线观看 | 91私密视频 | 午夜精品麻豆 | 日本黄色免费网站 | 欧美国产日韩在线视频 | 日韩精品免费一区二区 | 五月婷婷视频在线 | 中文字幕黄色网 | 午夜视频在线观看一区二区 | 亚洲日韩精品欧美一区二区 | 日韩精品在线观看av | 超碰在线最新地址 | 中文国产字幕在线观看 | 人成在线免费视频 | 免费人成网ww44kk44 | 五月激情五月激情 | 婷婷六月天在线 | 免费在线观看成人av | 久久婷亚洲五月一区天天躁 | 久久 一区 | 欧美性生活免费 | 青春草国产视频 | 国产美女网 | 亚洲精品国偷拍自产在线观看 | 国产精品久久久久久久久费观看 | av资源免费看 | 欧美a在线看 | 久久一本综合 | 黄色福利网站 | 国产区第一页 | 国产一级二级在线 | 91大片网站 | 99精品久久久久久久 | 玖玖精品视频 | 国产精品一区二区免费视频 | www成人av | av片在线观看免费 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 久久久久女教师免费一区 | 四虎成人精品在永久免费 | aaa毛片视频 | 久久久九色精品国产一区二区三区 | 丁香一区二区 | 久久精品一二三区 | 久久国产精品一国产精品 | 国产色婷婷在线 | 久草在线看片 | 免费看一及片 | 国产手机在线视频 | 中文国产成人精品久久一 | 五月婷婷综合在线 | 国产精品亚洲片夜色在线 | 久久免费视频在线观看 | 国产精品不卡一区 | 国产亚洲婷婷免费 | 亚洲国产精品999 | 国产99久久久国产精品免费二区 | 在线高清av | 国产精品大片在线观看 | 伊人婷婷色 | 久久综合综合久久综合 | av一级片在线观看 | 国产在线观看一区 | 久久精品视频4 | 国产午夜精品一区二区三区 | 激情五月婷婷综合 | 黄在线免费看 | av中文字幕电影 | 玖玖玖国产精品 | 国产区在线看 | 成人午夜免费福利 | 五月天狠狠操 | 亚洲精品一区二区三区新线路 | avav99| 欧美人人 | 人人插人人搞 | 国产麻豆精品传媒av国产下载 | 日韩一级黄色片 | 中文国产字幕 | 日本99干网 | 久久草草热国产精品直播 | 青春草视频在线播放 | 亚洲无吗天堂 | 在线免费观看一区二区三区 | 99精品国自产在线 | 99久久久国产精品免费观看 | 天天做天天爱天天综合网 | 婷婷激情5月天 | 中文在线字幕免费观看 | 在线观看久久久久久 | 国产精品一区二区av | 成人在线视频一区 | 蜜臀av一区二区 | 中文字幕在线人 | 色狠狠狠 | 日本久久不卡视频 | 热久久国产 | 国产免费久久久久 | 九九九视频在线 | 日韩a在线 | 亚洲精品视频在线观看免费视频 | 成年人看片 | 亚洲日韩欧美视频 | 狠狠的干狠狠的操 | 欧美五月婷婷 | 亚洲男男gⅴgay双龙 | 亚洲日本国产精品 | 又黄又爽的视频在线观看网站 | 国产不卡在线播放 | www.91国产 | 天天色宗合 | 国产一级特黄电影 | 深爱激情五月综合 | 久久少妇免费视频 | 久久毛片网 | 久99久精品视频免费观看 | 精品在线观看国产 | 日韩区欧美久久久无人区 | 精品国产电影一区二区 | 免费视频久久 | 欧美日韩亚洲在线 | 欧美人人爱 | 美女福利视频 | 天天爽天天做 | 免费韩国av| 国产一级二级三级视频 | 色99视频 | 国产精品专区h在线观看 | 亚洲综合激情网 | 8x成人在线 | 综合亚洲视频 | 91精品国自产在线 | 国产在线精品一区二区三区 | 欧美一级免费 | 黄色一集片 | 中文字幕在线观看第二页 | 日韩专区在线播放 | 亚洲理论片 | 国产伦理一区二区 | 69视频在线 | 国产99久久久久久免费看 | 久草免费新视频 | 久操视频在线观看 | .精品久久久麻豆国产精品 亚洲va欧美 | 狠狠色综合网站久久久久久久 | 欧美视频18 | 亚洲久草网 | 久99久在线视频 | 69精品| 婷婷精品国产欧美精品亚洲人人爽 | 激情丁香久久 | 91网在线观看 | 日韩中文字幕a | 五月婷色| 人人干干人人 | 中文字幕资源网 | 国产精品va视频 | 成年人在线观看网站 | 日日夜夜噜 | 亚洲欧洲一区二区在线观看 | 在线观看视频在线观看 | 国产成人高清在线 | 超碰国产在线播放 | 国产亚州av | 亚洲精品视频www | 四虎影视国产精品免费久久 | japanese黑人亚洲人4k | 久99久久| 久久再线视频 | 高清av网 | 欧美成人一区二区 | 日本69hd | 国产成人久久久77777 | 久久综合亚洲鲁鲁五月久久 | 天天做天天射 | 欧美黑人性猛交 | 久久涩涩网站 | 成人在线一区二区三区 | 91视频在线网址 | 天天草视频 | 天天爽网站 | 五月婷婷一级片 | 99热99re6国产在线播放 | 国产精品高潮在线观看 | 亚洲最新av在线 | 中文字幕免费 | 日韩精品在线播放 | 久草资源在线观看 | 久久久久国产成人免费精品免费 | 亚洲aⅴ一区二区三区 | 三级动态视频在线观看 | 中文字幕在线免费97 | av成人资源 | 国产一区二区在线免费观看 | 午夜神马福利 | 久久久综合电影 | 91在线小视频 | 色香天天 | 探花视频在线观看免费 | 玖玖玖在线观看 | 手机在线观看国产精品 | 中日韩欧美精彩视频 | 亚洲国产99 | 国产成人一区二 | 国产成人一区二区三区免费看 | 九九热精品国产 | 成人av一区二区三区 | 亚洲另类视频在线观看 | 国模吧一区| 亚洲欧洲精品一区 | 国产精品丝袜久久久久久久不卡 | 黄色软件网站在线观看 | 欧美性色综合网 | 久久黄色免费视频 | 久久a v电影| 婷婷在线资源 | 亚洲黄色网络 | www.狠狠插.com| 久久福利电影 | 国产精品自产拍 | 超碰在线最新网址 | 四虎国产精 | 免费观看完整版无人区 | 在线精品视频免费播放 | 免费久久片 | 丁香婷婷在线 | 欧美精品在线视频 | 99视频精品免费观看, | 国产欧美高清 | 夜添久久精品亚洲国产精品 | 亚洲欧美视频一区二区三区 | www.国产在线视频 | 久久人人干| 久久久久久久亚洲精品 | 丁香激情五月婷婷 | 狠狠干综合| 国产一及片| 国内偷拍精品视频 | 91丨porny丨九色 | 午夜精品久久久久久久久久久久久久 | 免费精品视频在线观看 | 最近更新的中文字幕 | 亚洲自拍偷拍色图 | 中文字幕亚洲欧美日韩 | 999成人网| 一区二区中文字幕在线观看 | 久久久精品视频网站 | 少妇做爰k8经典 | 制服丝袜在线 | 日本精品一区二区在线观看 | 精品一二三四在线 | 日本黄色免费在线 | 成人动漫视频在线 | 久久久亚洲电影 | 国产在线欧美在线 | 1024手机基地在线观看 | 欧美影院久久 | 黄色av三级在线 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 久久草草热国产精品直播 | 国产在线高清精品 | 精品久久久久_ | 2022久久国产露脸精品国产 | 国内久久视频 | 国产电影一区二区三区四区 | 久久视频国产 | 成人中文字幕av | 国产精品美女久久久久久久久久久 | av福利在线导航 | 久久视频这里只有精品 | 日韩免费b | 五月婷婷色播 | 久久国产精品一区二区 | 91av电影| 久久免费毛片 | 欧美九九视频 | 免费在线观看日韩 | 久久免费视频4 | 久久国产精品99精国产 | 久草在线最新 | 一级片色播影院 | 中文在线免费观看 | 欧美不卡视频在线 | 亚洲国产中文字幕 | 久久一区二区免费视频 | 久久99久久99免费视频 | 免费91在线观看 | 中文字幕视频在线播放 | 久久精品人人做人人综合老师 | 色视频在线观看 | 久久久久久久亚洲精品 | 日韩精品在线看 | 国产精品午夜在线 | 日韩区欧美久久久无人区 | 亚洲精品视频在线 | 日韩av片在线 | 成片视频免费观看 | 亚洲激情一区二区三区 | 久久久久高清毛片一级 | 日韩av高清在线观看 | 99精品在这里| 99久久久久久久 | 久久精品国产一区二区 | 182午夜在线观看 | 亚洲高清精品在线 | 亚洲精品456在线播放乱码 | 久久精品免费观看 | 99re国产 | 人人揉人人揉人人揉人人揉97 | 手机av电影在线 | 欧美激情精品久久久久久免费 | 黄色在线观看污 | 97人人添人澡人人爽超碰动图 | 久草剧场| 成年在线观看 | 在线观看中文字幕一区 | 亚洲五月婷 | 六月丁香婷婷网 | 日韩成人邪恶影片 | 久久亚洲国产精品 | 久久草草影视免费网 | 亚洲精品影视在线观看 | 婷婷色中文| 三级av网 | 亚洲毛片一区二区三区 | 九九九九热精品免费视频点播观看 | 欧美另类v| 欧美日韩在线免费观看 | 西西www4444大胆视频 | 亚洲男女精品 | 午夜精品一区二区三区在线观看 | 久久国产电影院 | 国产精品乱码久久久久久1区2区 | 国产在线一区二区 | 国内精品久久久 | 日本在线观看中文字幕 | 在线电影av | 久久黄色网页 | 久久亚洲日本 | 五月婷婷网站 | 五月婷婷黄色网 | 91麻豆精品91久久久久同性 | 亚洲免费国产视频 | 久久99这里只有精品 | 国产婷婷精品 | 成人中文字幕在线 | 美女网站在线免费观看 | 免费av黄色 | 婷婷伊人综合亚洲综合网 | 日韩一区二区在线免费观看 | 在线韩国电影免费观影完整版 | 国产精品美女久久久 | 国产福利中文字幕 | 久久少妇免费视频 | 视频一区二区视频 | 一区二区视频播放 | 又黄又爽又无遮挡免费的网站 | 国精产品999国精产品视频 | 免费观看十分钟 | 欧美日韩国语 | 182午夜在线观看 | 丁香婷婷综合激情 | 国产手机精品视频 | 中文字幕在线观看第一页 | 综合网伊人 | 日韩成人av在线 | 精品视频在线免费 | 超碰在线亚洲 | 久久久久久高潮国产精品视 | 国产精品 久久 | 久久五月网 | 青青草在久久免费久久免费 | 日韩欧美区 | 国产超碰在线观看 | 91av中文| 人人澡澡人人 | 成人免费一级片 | 午夜在线观看影院 | 在线观看亚洲国产精品 | 在线观看网站你懂的 | 国产成人精品久久亚洲高清不卡 | 婷婷六月丁香激情 | 婷婷av色综合 | 婷婷九九| 91精品无人成人www | 日三级在线 | 四虎成人免费影院 | 欧美日韩一区二区在线观看 | 91x色| 人人舔人人 | 中文字幕一区二区三区久久 | 五月天色站| 日韩一级电影网站 | av一区在线 | 国产精品久久久999 国产91九色视频 | 久久久亚洲国产精品麻豆综合天堂 | 日韩中文字幕免费 | 在线 日韩 av | 97人人模人人爽人人喊中文字 | 人人盈棋牌 | 六月婷色| 日韩精品亚洲专区在线观看 | 亚洲欧美日韩一二三区 | 在线观看电影av | 国产精品一区二区久久精品 | 色美女在线 | 最新国产一区二区三区 | 午夜精品久久久久久久久久久 | 麻豆视频网址 | 精品美女久久 | 色婷婷99 | 深爱激情av| 国产美女免费看 | 99精品国产一区二区三区麻豆 | 国产做爰视频 | 玖玖在线资源 | 国产在线色视频 | 在线免费av网 | 国产一区二区在线免费视频 | 2020天天干天天操 | 福利视频一二区 | 在线播放国产一区二区三区 | 久久亚洲二区 | 一区二区三区免费在线播放 | 欧美最新大片在线看 | 日本爱爱免费视频 | 欧美福利精品 | 日日夜夜天天 | 免费a级黄色毛片 | 久久99中文字幕 | 亚洲综合在线五月 | 免费男女羞羞的视频网站中文字幕 | 国产在线精品国自产拍影院 | 日日操日日插 | 夜夜看av | 99精品一级欧美片免费播放 | 三级动图| 超碰97免费在线 | 国产高清无线码2021 | 日韩3区| 亚洲精品一区二区三区高潮 | 亚洲夜夜网 | 色偷偷88欧美精品久久久 | 亚州中文av | 国产日产精品一区二区三区四区的观看方式 | 欧美日韩在线免费观看视频 | 狠狠干天天射 | 天堂在线一区二区 | 日韩精品在线视频 | 亚洲精品视频二区 | 三级黄色在线 | 在线看国产日韩 | 最近日韩免费视频 | 视色网站 | 99精品免费 | 深夜免费小视频 | 中文字幕在线影院 | 99爱在线| 成人免费在线观看av | 狠色在线| 久久高清免费视频 | 久草新在线 | 天天草视频 | 色婷婷免费视频 | 国内视频一区二区 | 国产一区二区播放 | 99久久久成人国产精品 | 在线免费观看黄色小说 | 精品999| 国产精品永久久久久久久久久 | 久久久国产精品一区二区三区 | 欧美日韩一区二区三区视频 | 中文字幕二区在线观看 | 国产精品mv在线观看 | 久久电影国产免费久久电影 | 美女视频黄的免费的 | 天天干天天操天天入 | 国产在线精品区 | 丁香激情综合久久伊人久久 | 亚洲天堂社区 | 国产剧情一区 | 97在线观看免费高清完整版在线观看 | 色综合久久久久久久 | 摸bbb搡bbb搡bbbb| 精品婷婷 | 精品女同一区二区三区在线观看 | 久草国产视频 | 日韩精品一卡 | 黄色在线视频网址 | 91成人精品在线 | 97av在线视频 | 中文字幕资源网 国产 | 国产小视频你懂的在线 | 久久精品中文字幕免费mv | 久久午夜免费观看 | 最近更新的中文字幕 | 黄色毛片在线观看 | 91亚洲永久精品 | 国产美女视频一区 | 亚洲91精品 | av3级在线 | 欧美成人亚洲成人 | 亚洲一二视频 | 麻豆国产精品va在线观看不卡 | 999视频在线播放 | 国产三级午夜理伦三级 | 亚洲人人精品 | 国产高清网站 | 久久精品中文视频 | 六月激情 | 中文字幕亚洲欧美日韩 | 国产日韩精品视频 | 日韩av电影国产 | 欧美精品久久久久久久久久丰满 | 亚洲精品色视频 | 免费av的网站 | 中文字幕在线影视资源 | 超碰999 | 亚洲精品视 | 久久人人爽人人爽人人片av软件 | 美女免费视频网站 | 久久久久高清 | 欧美精品一区二区性色 | 999视频在线播放 | 久草网站 | 激情综合网天天干 | 六月丁香伊人 | 五月婷婷久久丁香 | 亚洲天堂香蕉 | 亚洲精品国产视频 | 欧美精品久久久久性色 | 四虎天堂 | 黄色网址中文字幕 | 色综合天天综合 | 伊人狠狠 | 开心色婷婷 | 五月婷在线观看 | 色吊丝在线永久观看最新版本 | 在线视频久久 | 在线观看国产日韩 | 日韩毛片久久久 | 亚洲综合在 | 亚洲国产精品久久久 | 国产成人久久精品77777 | 99在线热播精品免费 | 婷婷在线免费 | 人人爽人人舔 | 国产高清视频免费在线观看 | 日韩二区三区在线 | 国产精品久久久久久久久久久不卡 | 最新国产福利 | 亚洲天天看 | 免费观看视频的网站 | 91在线播放综合 | 国产在线a不卡 | 亚洲人在线 | 国产二区视频在线观看 | 99热九九这里只有精品10 | 蜜臀av在线一区二区三区 | 久草在线免费资源站 | 日日干日日色 | 日韩网站在线看片你懂的 | av免费电影网站 | av免费看在线| 人人澡人 | 亚一亚二国产专区 | 97精产国品一二三产区在线 | 狠狠狠色狠狠色综合 | 麻豆91精品91久久久 | 亚洲黄色一级视频 | 91久久精品一区 | 国产亚洲精品xxoo | 国产亚洲精品成人 | 亚洲精品免费在线观看 | 夜夜夜精品 | 久久久久久伊人 | 九九精品毛片 | 国产区av在线 | 中文字幕中文字幕在线中文字幕三区 | www.久久免费视频 | 国产69熟| 中文字幕日韩有码 | 久久精品婷婷 | 久久国产精品免费一区 | 日韩成年视频 | 国产美女久久 | 成片人卡1卡2卡3手机免费看 | 五月婷婷一区 | 日韩午夜电影院 | 日韩剧情 | 中文字幕在线免费观看 | 精品91久久久久 | 日一日操一操 | 91av社区 | 精品三级av | 这里只有精彩视频 | 国产自产高清不卡 | 日日干 天天干 | 在线观看91 | 美女很黄免费网站 | 高清有码中文字幕 | 国产3p视频 | av片一区二区 | 玖玖玖在线 | 91九色porny蝌蚪主页 | 婷婷丁香激情综合 | 中文字幕亚洲精品在线观看 | 国产裸体视频网站 | 色婷婷在线观看视频 | 成人av片免费观看app下载 | 玖玖精品在线 | 亚洲五月 | 日韩 在线a | 国产精品6999成人免费视频 | 91在线亚洲| 国产精品久久久久婷婷二区次 | 97色婷婷成人综合在线观看 | www.久草.com| 69国产盗摄一区二区三区五区 | 欧美日韩精品在线免费观看 | 国产99久久九九精品 | 久久久国产精华液 | 中文字幕观看视频 | 日韩成人精品一区二区三区 | 九九久久视频 | 婷婷电影网| 成人一区影院 | 狠狠综合久久av | 天天干天天干天天干 | 国产精品毛片一区二区 | 国产精品毛片一区视频播不卡 | 2023国产精品自产拍在线观看 | 亚洲精品在线免费播放 | 久久精品美女 | 久久久国产精品亚洲一区 | 国产精品久久久久久久电影 | 麻豆一区在线观看 | 91天堂影院| 人人干人人干人人干 | 天天干一干 | 免费91麻豆精品国产自产在线观看 | 久久综合久久综合久久 | 天天色天天操天天爽 | 欧美精品在线观看免费 | 久久综合色影院 | 高清av免费一区中文字幕 | 国产手机视频在线播放 | 五月色婷| 中文字幕av影院 | 成人国产精品一区 | 天天做天天爱夜夜爽 | 一级精品视频在线观看宜春院 | 天天色天天射天天综合网 | 久久久国产一区二区三区 | 色诱亚洲精品久久久久久 | 波多野结衣视频一区 | 欧美成年黄网站色视频 | 久久综合久久综合这里只有精品 | 懂色av一区二区三区蜜臀 | 国产粉嫩在线观看 | 午夜精品影院 | 免费手机黄色网址 | 国产手机在线精品 | 有码中文字幕在线观看 | 精品久久久久久久久久岛国gif | 婷婷久草| 欧美a视频在线观看 | 中文资源在线播放 | 免费在线观看污 | 免费在线观看成人小视频 | 911久久香蕉国产线看观看 | 成人免费看片网址 | 色.com| 国产午夜精品一区二区三区四区 | 久久99精品久久久久久清纯直播 | 又黄又爽又无遮挡的视频 | 国产精久久久久久妇女av | 成人在线观看你懂的 | 亚洲成av人片在线观看香蕉 | 日韩精品国产一区 | 日韩最新中文字幕 | 美女黄视频免费看 | 免费男女羞羞的视频网站中文字幕 | 四虎成人免费影院 | 久久99九九99精品 | 99中文字幕视频 | 成年人国产视频 | 在线日韩中文字幕 | 黄色av成人在线 | 国产精品久久久久永久免费观看 | 丁香资源影视免费观看 | 久久高清免费 | 久久视频这里有久久精品视频11 | 国产精品久久久久久久久久直播 | 懂色av懂色av粉嫩av分享吧 | 国产精品网站一区二区三区 | 中文av网站| 日韩精品久久久免费观看夜色 | 国产人免费人成免费视频 | 中文字幕人成乱码在线观看 | 在线免费亚洲 | av在线激情 | 在线观看免费国产小视频 | 久久国产精品电影 | 免费a网| 欧美日韩精品网站 | 国产精品 中文字幕 亚洲 欧美 | 日韩午夜视频在线观看 | 97超碰香蕉| 一性一交视频 | 麻豆精品在线 | 欧美成人h版 | 国产精品久久电影网 | 久久国产精品免费观看 | 日韩爱爱片| 国产精品自产拍在线观看网站 | 波多野结衣在线视频一区 | 中文字幕亚洲综合久久五月天色无吗'' | 亚洲成人一二三 | 日韩精品免费在线播放 | 天天操天天操天天爽 | 午夜久久久精品 | 四虎影视国产精品免费久久 | 国产精品系列在线观看 | 久久久久一区 | 免费成人在线电影 | 女人18精品一区二区三区 | 国产精品久久久久久久久久尿 | 深夜免费福利网站 | 欧美成人在线免费观看 | 91热爆视频 | 亚洲人天堂 | 99热在线网站| 色999在线 | 精品久久久久久亚洲综合网站 | 伊人久久国产精品 | 98超碰在线观看 | 成人av影视在线 | 在线看国产日韩 | 国外成人在线视频网站 | 欧美精品一区二区免费 | 国产精品1区2区3区在线观看 | 中文视频在线播放 | 日韩素人在线观看 | 一本一道波多野毛片中文在线 | 久久综合电影 | 天天添夜夜操 | 区一区二区三在线观看 | 九九视频在线播放 | 综合激情网... | 国产精品久久久久久久毛片 | 人人爽人人片 | 三级av在线免费观看 | 91尤物国产尤物福利在线播放 | 最新久久久 | 黄色在线观看污 | 国产福利在线 | 五月婷婷免费 | 超碰在线人 | 在线播放 一区 | av888av.com | 精品久久久精品 | 亚洲精品女 | 国产精品视频一二三 | 久久午夜免费视频 | 亚洲aⅴ在线观看 | 国产在线看 | 五月婷婷在线观看 | 亚洲区精品视频 | 欧美久久久久久久久久久久 | 久久精品伊人 | 欧美精品999 | 午夜精品久久久久久久99婷婷 | 国产中文字幕国产 | 在线观看日韩av | 欧美激情精品久久久久久 | 成人午夜电影网 | 波多野结衣在线观看一区二区三区 | 成人在线播放av | 免费观看日韩av | 国产黄色一级片在线 | 精品自拍sae8—视频 | 欧美在线视频日韩 | 91成人免费在线 | 99热手机在线 | 国产精品久久二区 | 丁香免费视频 | 一区二区三区国产欧美 | 国内精品久久久久影院男同志 | 91福利在线观看 | 福利视频导航网址 | 日日夜夜天天射 | 久久免费视频4 | 日本资源中文字幕在线 | 日韩欧美在线视频一区二区 | 日本精品xxxx | 日韩av成人在线观看 | 国产拍在线 | 99久久精品一区二区成人 | 激情中文在线 | 国产麻豆剧果冻传媒视频播放量 | 911精品美国片911久久久 | 一区二区三区三区在线 | 国产精品一区二区无线 | 999久久久免费精品国产 | 日本韩国在线不卡 | 最近中文字幕完整视频高清1 | 又黄又刺激视频 | 久久成人精品电影 | 日本精品午夜 | 国产精品久久久久久久久久直播 | 日韩一区二区三区不卡 |