Browse Source

添加项目文件。

master
胡超1 1 year ago
parent
commit
371601cc98
  1. 37
      AksWebBrowser.sln
  2. 49
      CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj
  3. 16
      CPF_Cef/AssistEntity.cs
  4. 173
      CPF_Cef/Common/COMUtils.cs
  5. 58
      CPF_Cef/Common/ChunkedUpload.cs
  6. 82
      CPF_Cef/Common/Log.cs
  7. 39
      CPF_Cef/CusWebBrowser.cs
  8. 154
      CPF_Cef/FrmMain.cs
  9. 491
      CPF_Cef/MainModel.cs
  10. 38
      CPF_Cef/Program.cs
  11. BIN
      CPF_Cef/Recent.ico
  12. 51
      CPF_Cef/SetTaskStatus.cs
  13. 473
      CPF_Cef/StyleSheet.css

37
AksWebBrowser.sln

@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34622.214
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AKS.EnterpriseLibrary.WebBrowser", "CPF_Cef\AKS.EnterpriseLibrary.WebBrowser.csproj", "{76142658-6E83-4A1C-8CC9-C2574865CA7D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Debug|x64.ActiveCfg = Debug|x64
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Debug|x64.Build.0 = Debug|x64
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Debug|x86.ActiveCfg = Debug|x86
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Debug|x86.Build.0 = Debug|x86
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Release|Any CPU.Build.0 = Release|Any CPU
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Release|x64.ActiveCfg = Release|x64
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Release|x64.Build.0 = Release|x64
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Release|x86.ActiveCfg = Release|x86
{76142658-6E83-4A1C-8CC9-C2574865CA7D}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BDDA2FFD-1C83-470F-82EE-DE0E448EEB6D}
EndGlobalSection
EndGlobal

49
CPF_Cef/AKS.EnterpriseLibrary.WebBrowser.csproj

@ -0,0 +1,49 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ApplicationIcon>Recent.ico</ApplicationIcon>
<StartupObject />
<AssemblyName>AksWebBrowser</AssemblyName>
<RootNamespace>AksWebBrowser</RootNamespace>
<Platforms>AnyCPU;x64;x86</Platforms>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants />
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants />
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<None Remove="StyleSheet.css" />
</ItemGroup>
<ItemGroup>
<Content Include="Recent.ico" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="StyleSheet.css" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
<PackageReference Include="Xhm.CPF" Version="0.9.6.7" />
<PackageReference Include="Xhm.CPF.Cef" Version="0.9.6.6" />
<PackageReference Include="Xhm.CPF.Windows" Version="0.9.6.7" />
<PackageReference Include="Xhm.CPF.Skia" Version="0.9.6.7" />
<PackageReference Include="Xhm.CPF.Mac" Version="0.9.6.7" />
<PackageReference Include="Xhm.CPF.Linux" Version="0.9.6.7" />
</ItemGroup>
</Project>

16
CPF_Cef/AssistEntity.cs

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AksWebBrowser
{
public enum LightTypeModel
{
FingerLight,
IDCardLight,
BottomLight,
BurnLight
}
}

173
CPF_Cef/Common/COMUtils.cs

@ -0,0 +1,173 @@
using AKS.EnterpriseLibrary.WebBrowser;
using AKSWebBrowser.Commen;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using Timer = System.Timers.Timer;
namespace AKSWebBrowser.Common
{
public class COMUtils
{
private static SerialPort serialPort = new SerialPort();
public string jsonstr = string.Empty;
public string jsontemp = string.Empty;
public int maxCHunkSize = 1024;
public COMUtils()
{
try
{
if (!serialPort.IsOpen)
{
OpenCOM("/dev/ttyCH341USB0");
}
}
catch (Exception ex)
{
try
{
Log.Info("服务启动异常ex: " + ex.Message + "");
if (!serialPort.IsOpen)
{
OpenCOM("/dev/ttyCH341USB1");
}
}
catch (Exception ex1)
{
Log.Info("服务启动异常ex1: " + ex1.Message + "");
}
}
}
//打开COM口
public void OpenCOM(string comName)
{
// 设置COM口,波特率,奇偶校验,数据位,停止位
serialPort.PortName = comName; // 请替换为你的串口名称
serialPort.BaudRate = 115200; // 设置波特率
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.DtrEnable = true; //启用控制终端就续信号
serialPort.ReadTimeout = 50000;
//serialPort.RtsEnable = true; //启用请求发送信号
serialPort.NewLine = "\n";
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
if (!serialPort.IsOpen)
{
serialPort.Open();
}
Timer timer = new Timer(3000);//1秒钟的时间间隔
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true;//重复执行
timer.Enabled = true;//启动定时器
Log.Info("浏览器COM服务启动成功");
}
//接受数据
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = (SerialPort)sender;
string _jsonstr = sp.ReadExisting();
if (!string.IsNullOrEmpty(_jsonstr))
{
if (_jsonstr.Contains("\n"))
{
jsonstr = jsontemp + _jsonstr;
jsontemp = string.Empty;
}
else
{
jsontemp = jsontemp + _jsonstr;
}
}
}
catch (Exception ex)
{
Log.Error("接受数据数据异常: " + ex.Message + "");
jsonstr= MainModel.str2Base64("{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" +"接受数据异常:"+ ex.Message + "\"}");
}
}
// 处理接收到的数据
private void ProcessReceivedData(byte[] data)
{
// 例如,打印出每个字节的值
foreach (byte b in data)
{
Log.Info("串口接收byte数据:" + b.ToString());
}
}
//打开串口
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
try
{
if (!serialPort.IsOpen)
{
serialPort.Open();
}
}
catch (Exception ex)
{
Log.Error("打开串口异常: " + ex.Message + "");
}
}
//发送数据
public string SendData(string data)
{
try
{
if (serialPort.IsOpen)
{
jsonstr = string.Empty;
jsontemp = string.Empty;
//写入数据并以换行符结束
serialPort.WriteLine(data);
while (string.IsNullOrEmpty(jsonstr))
{
Task.Delay(10).Wait();
}
return jsonstr;
}
else
{
return "";
}
}
catch (Exception ex)
{
Log.Error("发送数据异常3: " + ex.Message + "");
return "";
}
}
//关闭
public void ClosePort()
{
try
{
if (serialPort.IsOpen)
{
serialPort.Close(); // 关闭串口
}
}
catch (Exception ex)
{
Log.Error("关闭异常: " + ex.Message + "");
}
}
}
}

58
CPF_Cef/Common/ChunkedUpload.cs

@ -0,0 +1,58 @@
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using CPF.Controls;
namespace AksWebBrowser.Common
{
public class ChunkedUpload
{
private readonly HttpClient _httpClient;
public ChunkedUpload(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<string> UploadFileAsync(string url, string filePath)
{
string ret = string.Empty;
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
FileInfo fileInfo = new FileInfo(filePath);
int totalParts = 1;
int chunkNumber = 1;
// 读取文件流其实位置
var fileStreamPos = 0;
var uploadUrl = $"{url}?partNumber={chunkNumber}&chunks={totalParts}&size={fileInfo.Length}&start={fileStreamPos}&end={fileInfo.Length}&total={fileInfo.Length}&FileName={Path.GetFileName(filePath)}";
using (var client = new HttpClient())
{
var formData = new MultipartFormDataContent();
formData.Add(new StreamContent(fileStream, (int)fileStream.Length), "file", Path.GetFileName(filePath) + ".partNumber-1");
var response = await client.PostAsync(uploadUrl, formData);
var responseString = await response.Content.ReadAsStringAsync();
fileStream.Close();
fileStream.Dispose();
ret = responseString;
JObject jo = (JObject)JsonConvert.DeserializeObject(ret);
if (Convert.ToBoolean(jo["IsSucceed"].ToString()) == true)
{
string result = jo["result"].ToString();
JObject jo1 = (JObject)JsonConvert.DeserializeObject(result);
ret = jo1["url"].ToString();
}
}
}
return ret;
}
}
}

82
CPF_Cef/Common/Log.cs

@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AKSWebBrowser.Commen
{
public class Log
{
private static StreamWriter streamWriter; //写文件
public static void Error(string message)
{
try
{
//DateTime dt = new DateTime();
string directPath = AppDomain.CurrentDomain.BaseDirectory + @"/logs/error"; //在获得文件夹路径
if (!Directory.Exists(directPath)) //判断文件夹是否存在,如果不存在则创建
{
Directory.CreateDirectory(directPath);
}
directPath += string.Format(@"/{0}.log", DateTime.Now.ToString("yyyy-MM-dd"));
if (streamWriter == null)
{
streamWriter = !File.Exists(directPath) ? File.CreateText(directPath) : File.AppendText(directPath);
}
streamWriter.WriteLine("***********************************************************************");
streamWriter.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
streamWriter.WriteLine("输出信息:错误信息");
if (message != null)
{
streamWriter.WriteLine("异常信息:\r\n" + message);
}
}
finally
{
if (streamWriter != null)
{
streamWriter.Flush();
streamWriter.Dispose();
streamWriter = null;
}
}
}
public static void Info(string message)
{
try
{
//DateTime dt = new DateTime();
string directPath = AppDomain.CurrentDomain.BaseDirectory + @"/logs/Info"; //在获得文件夹路径
if (!Directory.Exists(directPath)) //判断文件夹是否存在,如果不存在则创建
{
Directory.CreateDirectory(directPath);
}
directPath += string.Format(@"/{0}.log", DateTime.Now.ToString("yyyy-MM-dd"));
if (streamWriter == null)
{
streamWriter = !File.Exists(directPath) ? File.CreateText(directPath) : File.AppendText(directPath);
}
streamWriter.WriteLine("***********************************************************************");
streamWriter.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
streamWriter.WriteLine("输出信息:信息");
if (message != null)
{
streamWriter.WriteLine("信息:\r\n" + message);
}
}
finally
{
if (streamWriter != null)
{
streamWriter.Flush();
streamWriter.Dispose();
streamWriter = null;
}
}
}
}
}

39
CPF_Cef/CusWebBrowser.cs

@ -0,0 +1,39 @@
using CPF;
using CPF.Cef;
using CPF.Reflection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AKS.EnterpriseLibrary.WebBrowser
{
public class CusWebBrowser : CPF.Cef.WebBrowser
{
public CusCefRequestHandler CusRequest = new CusCefRequestHandler();
public CusWebBrowser() { }
protected override CpfCefClient OnCreateWebBrowser(CefBrowserSettings settings)
{
CpfCefClient cefClient = base.OnCreateWebBrowser(settings);
cefClient.RequestHandler = CusRequest;
return cefClient;
}
}
public class CusCefRequestHandler : CpfCefRequestHandler
{
public delegate void CusResquestDelegate(CefPostData postData, CefRequest request);
public event CusResquestDelegate CusResquestEvent;
public CusCefRequestHandler() { }
protected override CefResourceRequestHandler GetResourceRequestHandler(CefBrowser browser, CefFrame frame, CefRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
CusResquestEvent(request.PostData, request);
return null;
}
}
}

154
CPF_Cef/FrmMain.cs

@ -0,0 +1,154 @@
using AksWebBrowser;
using AKSWebBrowser.Commen;
using CPF;
using CPF.Animation;
using CPF.Cef;
using CPF.Charts;
using CPF.Controls;
using CPF.Drawing;
using CPF.Platform;
using CPF.Shapes;
using CPF.Styling;
using CPF.Svg;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AKS.EnterpriseLibrary.WebBrowser
{
public class FrmMain : Window
{
protected override void InitializeComponent()
{
LoadStyleFile("res://AksWebBrowser/StyleSheet.css");
//加载样式文件,文件需要设置为内嵌资源
Title = "控申业务专用浏览器";
CanResize = false;
ShowInTaskbar = true;
WindowState = WindowState.Maximized;
Children.Add(
new Border
{
Width = "100%",
Height = "100%",
Child = new Panel
{
Size = SizeField.Fill,
Children =
{
new CusWebBrowser
{
PresenterFor = this,
Name = nameof(webBrowser),
Bindings =
{
{
nameof(CusWebBrowser.Title),
"Title",
this,
BindingMode.OneWayToSource
},
},
MarginTop=0,
MarginLeft=0,
MarginRight=0,
MarginBottom=0,
},
}
}
}
);
}
private TextBox textBox;
private CusWebBrowser webBrowser;
protected override async void OnInitialized()
{
//窗体大小
this.Width = 1080;
this.Height = 1920;
//SetTaskStatus.Hidetask();
base.OnInitialized();
webBrowser = FindPresenterByName<CusWebBrowser>(nameof(webBrowser));
textBox = FindPresenterByName<TextBox>(nameof(textBox));
webBrowser.CusRequest.CusResquestEvent += CusRequest_CusResquestEvent;
//浏览器大小
webBrowser.Width = 1080;
webBrowser.Height = 1920;
webBrowser.Url = "http://192.168.0.57:5173/";
//webBrowser.Url = Application.StartupPath + @"\html\index.html";
//开发者工具暂时只能支持Windows
//webBrowser.ShowDev();
//SetTaskStatus.Showtask();
webBrowser.LoadEnd += WebBrowser_LoadEnd;
this.Closing += MainWindow_Closing;
}
//关闭事件
private void MainWindow_Closing(object sender, ClosingEventArgs e)
{
MainModel.KillProcessByName("AksWebBrowser");
new MainModel().CLoseCOM();
}
bool showDev = true;
private void WebBrowser_LoadEnd(object sender, LoadEndEventArgs e)
{
if (!showDev)
{
showDev = true;
webBrowser.ShowDev();
}
}
public void Writelog(string str, string dirName = @"logs")
{
try
{
if (string.IsNullOrEmpty(str)) return;
var baseDir = AppDomain.CurrentDomain.BaseDirectory + dirName;
if (!Directory.Exists(baseDir))
{
Directory.CreateDirectory(baseDir);
}
string filePath = System.IO.Path.Combine(baseDir, DateTime.Now.ToString("yyyy-MM-dd") + "_log.txt");
using (StreamWriter sw = File.AppendText(filePath))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "[" + str + "]" + "\r\n");
sw.Flush();
}
}
catch { }
}
private void CusRequest_CusResquestEvent(CefPostData postData, CefRequest request)
{
string postParams = string.Empty;
if (postData != null)
{
//取提交的参数
CefPostData cefPostData = postData;
var elements = cefPostData.GetElements();
foreach (var element in elements)
{
if (element.ElementType == CefPostDataElementType.Bytes)
{
var bytes = element.GetBytes();
postParams = Encoding.UTF8.GetString(bytes);
Console.WriteLine("请求参数:" + postParams);
}
}
}
Console.WriteLine("请求地址:" + request.Url.ToString());
}
//调用JS内的JS方法
async void InvokeJS(CpfObject obj, RoutedEventArgs eventArgs)
{
var r = await webBrowser.ExecuteJavaScript("callback('调用绑定到JS里的C#方法')");
}
}
}

491
CPF_Cef/MainModel.cs

@ -0,0 +1,491 @@
using AksWebBrowser.Common;
using AKSWebBrowser.Commen;
using AKSWebBrowser.Common;
using CPF.Cef;
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
namespace AKS.EnterpriseLibrary.WebBrowser
{
public class MainModel : CPF.CpfObject
{
public COMUtils com = new COMUtils();
/// <summary>
/// 读取身份证卡号
/// </summary>
/// <param name="paramsString"></param>
/// <returns></returns>
[JSFunction]
public string IDCardRead(string paramsString)
{
try
{
paramsString = "{\"type\":\"1\",\"param\":{\"data\":\"" + "" + "\"}}";
Log.Info("读取身份证卡号: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "获取数据失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("读取身份证卡号异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 打印排队票据
/// </summary>
/// <param name="ph">排号</param>
/// <param name="ddrs">等待人数</param>
/// <param name="qrcode">二维码</param>
/// <param name="ywmc">办理业务名称</param>
/// <returns></returns>
[JSFunction]
public string SendByPrint(string ph, string ddrs, string qrcode, string ywmc)
{
try
{
string paramsString = "{\"type\":\"2\",\"param\":{\"ph\":\"" + ph + "\",\"ddrs\":\"" + ddrs + "\",\"qrcode\":\"" + qrcode + "\",\"ywmc\":\"" + ywmc + "\"}}";
Log.Info("打印排队票据: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打印排队票据失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("打印排队票据异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 文字语音播报
/// </summary>
/// <param name="text"></param>
/// <param name="ispaye"></param>
/// <returns></returns>
[JSFunction]
public string payleText(string text, bool ispaye)
{
try
{
if (text.Length > 65535)
{
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":" + "文字太长" + "}";
}
string paramsString = "{\"type\":\"3\",\"param\":{\"text\":\"" + text + "\",\"ispaye\":\"" + ispaye + "\"}}";
Log.Info("文字语音播报: " + paramsString + "");
string base64 = str2Base64(paramsString);
if (base64.Length > 1024)
{
string url = "http://192.168.0.34:92/api/UploadFP/UploadFP";
Task.Run(async () =>
{
DateTime dateTime = DateTime.Now;
string time = DateTime.Now.ToString(
"yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo);
var dirpath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "TempFile");
if (!Directory.Exists(dirpath))
{
Directory.CreateDirectory(dirpath);
}
var filepath = Path.Combine(dirpath, time);
string path = dirpath + @"/" + time + ".txt";
base64 = str2Base64(text);
byte[] bytes = Convert.FromBase64String(base64);
System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.CreateNew);
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
writer.Write(bytes, 0, bytes.Length);
writer.Close();
Log.Info("文字语音播报临时文件: " + path + "");
UploadInfo(url, path);
});
@event2.WaitOne();
Regex re = new Regex(@"(((?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)");
MatchCollection mc = re.Matches(url);//获取的是一个数组
string pdfurl = mc[0].ToString() + "://" + mc[1].ToString() + urlpath;
paramsString = "{\"type\":\"3\",\"param\":{\"text\":\"" + pdfurl + "\",\"ispaye\":\"" + ispaye + "\"}}";
Log.Info("文字语音播报: " + paramsString + "");
base64 = str2Base64(paramsString);
}
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "文字语音播报失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("文字语音播报异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 发送短信
/// </summary>
/// <param name="content"></param>
/// <param name="phone"></param>
/// <returns></returns>
[JSFunction]
public string SendSSM(string content, string phone)
{
try
{
string paramsString = "{\"type\":\"4\",\"param\":{\"content\":\"" + content + "\",\"phone\":\"" + phone + "\"}}";
Log.Info("发送短信: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "发送短信失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("发送短信异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 打开高拍仪并且进行快速扫描文件
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
[JSFunction]
public string openCamera(string url)
{
try
{
string paramsString = "{\"type\":\"5\",\"param\":{\"url\":\"" + url + "\"}}";
Log.Info("打开高拍仪并且进行快速扫描文件: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打开高拍仪并且进行快速扫描文件失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("打开高拍仪并且进行快速扫描文件异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 打开签字版
/// </summary>
/// <param name="paramsString"></param>
/// <returns></returns>
[JSFunction]
public string OpenSign(string paramsString)
{
try
{
paramsString = "{\"type\":\"6\",\"param\":{\"data\":\"" + "" + "\"}}";
Log.Info("打开签字版: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "打开签字版失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("打开签字版异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 关闭签字版
/// </summary>
/// <param name="paramsString"></param>
/// <returns></returns>
[JSFunction]
public string CloseSign(string paramsString)
{
try
{
paramsString = "{\"type\":\"7\",\"param\":{\"data\":\"" + "" + "\"}}";
Log.Info("关闭签字版: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "关闭签字版失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("关闭签字版异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 获取签字版数据
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
[JSFunction]
public string GetSignData(string url)
{
try
{
string paramsString = "{\"type\":\"8\",\"param\":{\"url\":\"" + url + "\"}}";
Log.Info("获取签字版数据: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "获取签字版数据失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("获取签字版数据异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 开始录音、取消录音、结束录音
/// </summary>
/// <param name="isopen"></param>
/// <param name="url"></param>
/// <returns></returns>
[JSFunction]
public string SoundRecording(bool isopen, string url)
{
try
{
string paramsString = "{\"type\":\"11\",\"param\":{\"isopen\":\"" + isopen + "\",\"url\":\"" + url + "\"}}";
Log.Info("开始录音、取消录音、结束录音: " + paramsString + "");
string base64 = str2Base64(paramsString);
string str = com.SendData(base64);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "开始录音、取消录音、结束录音失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("开始录音、取消录音、结束录音异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 根据文件地址在线打印
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
[JSFunction]
public string PrintFile(string url, string ext)
{
try
{
string paramsString = "{\"type\":\"9\",\"param\":{\"url\":\"" + url + "\",\"ext\":\"" + ext + "\"}}";
Log.Info("根据文件地址在线打印: " + paramsString + "");
string base64_1 = str2Base64(paramsString);
string str = com.SendData(base64_1);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "根据文件地址在线打印失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("根据文件地址在线打印异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 根据文件base64打印
/// </summary>
/// <param name="base64"></param>
/// <param name="ext"></param>
/// <returns></returns>
[JSFunction]
public string PrintBase64(string url, string base64, string ext)
{
try
{
Task.Run(async () =>
{
DateTime dateTime = DateTime.Now;
string time = DateTime.Now.ToString(
"yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo);
var dirpath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "PrintFile");
if (!Directory.Exists(dirpath))
{
Directory.CreateDirectory(dirpath);
}
var filepath = Path.Combine(dirpath, time);
string path = dirpath + @"/" + time + "." + ext;
byte[] bytes = Convert.FromBase64String(base64);
System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.CreateNew);
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
writer.Write(bytes, 0, bytes.Length);
writer.Close();
Log.Info("根据文件base64打印: " + path + "");
UploadInfo(url, path);
});
@event2.WaitOne();
Regex re = new Regex(@"(((?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)");
MatchCollection mc = re.Matches(url);//获取的是一个数组
string pdfurl = mc[0].ToString() + "://" + mc[1].ToString() + urlpath;
Log.Info("根据文件base64打印: " + pdfurl + "");
try
{
string paramsString = "{\"type\":\"9\",\"param\":{\"url\":\"" + pdfurl + "\",\"ext\":\"" + ext + "\"}}";
Log.Info("根据文件base64打印: " + paramsString + "");
string base64_1 = str2Base64(paramsString);
string str = com.SendData(base64_1);
if (string.IsNullOrEmpty(str))
{
return "{\"message\":\"success\",\"code\":\"400\",\"status\":false,\"data\":\"" + "根据文件base64打印失败" + "\"}";
}
else
{
return Base64str2(str);
}
}
catch (Exception ex)
{
Log.Error("根据文件base64打印异常: " + ex.Message + "");
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
catch (Exception ex)
{
return "{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + ex.Message + "\"}";
}
}
/// <summary>
/// 初始文件上传
/// </summary>
private string urlpath = string.Empty;
private AutoResetEvent @event2 = new AutoResetEvent(false);
private async void UploadInfo(string url, string srpath)
{
var httpClient = new HttpClient();
var uploader = new ChunkedUpload(httpClient);
urlpath = await uploader.UploadFileAsync(url, srpath);
@event2.Set();
}
/// <summary>
/// string 转换为 base64
/// </summary>
/// <returns></returns>
public static string str2Base64(string str)
{
byte[] b = System.Text.Encoding.UTF8.GetBytes(str);
string result = Convert.ToBase64String(b);
return result;
}
/// <summary>
/// base64 转换为 string
/// </summary>
/// <param name="data"></param>
public static string Base64str2(string data)
{
byte[] c = Convert.FromBase64String(data);
string result = System.Text.Encoding.UTF8.GetString(c);
Log.Info("接收返回数据:" + result);
return result;
}
/// <summary>
/// 根据程序名称杀死进程
/// </summary>
/// <param name="processName"></param>
public static void KillProcessByName(string processName)
{
Process[] processes = Process.GetProcessesByName(processName);
foreach (Process process in processes)
{
try
{
process.Kill();
process.WaitForExit(); // 等待进程退出
}
catch (Exception ex) { }
}
}
/// <summary>
/// 关闭串口
/// </summary>
public void CLoseCOM()
{
com.ClosePort();
}
}
}

38
CPF_Cef/Program.cs

@ -0,0 +1,38 @@
using CPF.Cef;
using CPF.Linux;//如果需要支持Linux才需要
using CPF.Mac;//如果需要支持Mac才需要
using CPF.Platform;
using CPF.Skia;
using CPF.Windows;
using System;
namespace AKS.EnterpriseLibrary.WebBrowser
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Application.Initialize(
(OperatingSystemType.Windows, new WindowsPlatform(), new SkiaDrawingFactory())
, (OperatingSystemType.OSX, new MacPlatform(), new SkiaDrawingFactory())//如果需要支持Mac才需要
, (OperatingSystemType.Linux, new LinuxPlatform(), new SkiaDrawingFactory())//如果需要支持Linux才需要
);
CefRuntime.Load();
var mainArgs = new CpfCefMainArgs(args);
var app = new CpfCefApp();
var exitCode = CefRuntime.ExecuteProcess(mainArgs, app, IntPtr.Zero);
if (exitCode != -1)
{
return;
}
CefRuntime.Initialize(mainArgs, new CefSettings { }, app, IntPtr.Zero);
var model = new MainModel();
Application.Run(new FrmMain { DataContext = model, CommandContext = model });
CefRuntime.Shutdown();
}
}
}

BIN
CPF_Cef/Recent.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

51
CPF_Cef/SetTaskStatus.cs

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace AksWebBrowser
{
public class SetTaskStatus
{
private const int SW_HIDE = 0; //隐藏任务栏
private const int SW_RESTORE = 9;//显示任务栏
[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
/// <summary>
/// 显示任务栏
/// </summary>
public static void Showtask()
{
ShowWindow(FindWindow("Shell_TrayWnd", null), SW_RESTORE);
}
/// <summary>
/// 隐藏任务栏
/// </summary>
public static void Hidetask()
{
ShowWindow(FindWindow("Shell_TrayWnd", null), SW_HIDE);
}
// 设置窗体的显示状态
[DllImport("user32.dll", SetLastError = true)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
int X, int Y, int cx, int cy, uint uFlags);
// 窗体的句柄
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
public const uint SWP_SHOWWINDOW = 0x0040;
public const uint SWP_NOSIZE = 0x0001;
public const uint SWP_NOMOVE = 0x0002;
public const uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW;
}
}

473
CPF_Cef/StyleSheet.css

@ -0,0 +1,473 @@

@media windows {
* {
FontFamily: '微软雅黑'; /*不同系统的字体不同,自己根据情况改或者使用内嵌字体*/
}
}
@media osx {
* {
FontFamily: '苹方-简';
}
}
@media linux {
* {
FontFamily: '文泉驿正黑';
}
}
/*设置窗体标题栏背景颜色圆角*/
/*#caption {
IsAntiAlias: true;
Background: #2c2c2c;
CornerRadius:5,5,0,0;
}
#frame {
CornerRadius: 5;
IsAntiAlias: true;
}*/
Button {
BorderFill: #DCDFE6;
IsAntiAlias: True;
CornerRadius: 4,4,4,4;
Background: #FFFFFF;
}
Button[IsMouseOver=true] {
BorderFill: rgb(198,226,255);
Background: rgb(236,245,255);
Foreground: rgb(64,158,255);
}
Button[IsPressed=true] {
BorderFill: rgb(58,142,230);
}
Button.primary {
BorderFill: rgb(64,158,255);
CornerRadius: 4,4,4,4;
Background: rgb(64,158,255);
Foreground: #FFFFFF;
}
Button.primary[IsMouseOver=true] {
BorderFill: rgb(102,177,255);
Background: rgb(102,177,255);
Foreground: #FFFFFF;
}
Button.primary[IsPressed=true] {
BorderFill: rgb(58,142,230);
Background: rgb(58,142,230);
}
Button.success {
BorderFill: rgb(103,194,58);
CornerRadius: 4,4,4,4;
Background: rgb(103,194,58);
Foreground: #FFFFFF;
}
Button.success[IsMouseOver=true] {
BorderFill: rgb(133,206,97);
Background: rgb(133,206,97);
Foreground: #FFFFFF;
}
Button.success[IsPressed=true] {
BorderFill: rgb(93,175,52);
Background: rgb(93,175,52);
}
Button.danger {
BorderFill: rgb(245,108,108);
Background: rgb(245,108,108);
CornerRadius: 4,4,4,4;
Foreground: #FFFFFF;
}
Button.danger[IsMouseOver=true] {
BorderFill: rgb(247,137,137);
Background: rgb(247,137,137);
Foreground: #FFFFFF;
}
Button.danger[IsPressed=true] {
BorderFill: rgb(221,97,97);
Background: rgb(221,97,97);
}
TextBox, .textBox, DatePicker {
Background: #fff;
IsAntiAlias: true;
BorderFill: #DCDFE6;
CornerRadius: 4,4,4,4;
BorderStroke: 1;
}
.groupPanel TextBox, DatePicker TextBox, .textBox TextBox {
BorderStroke: 0;
}
.textBox[IsKeyboardFocusWithin=true] {
BorderFill: #1E9FFF;
}
.singleLine { /*单行文本框*/
AcceptsReturn: false;
HScrollBarVisibility: Hidden;
VScrollBarVisibility: Hidden;
}
.singleLine #contentPresenter {
Padding: 3;
}
.multiline { /*多行文本框*/
}
.slotLeft {
CornerRadius: 0,4,4,0;
BorderFill: #DCDFE6;
Background: #F5F7FA;
BorderThickness: 1,0,0,0;
BorderType: BorderThickness;
MarginTop: 0;
MarginBottom: 0;
MarginRight: 0;
}
RadioButton #radioButtonBorder {
StrokeFill: rgb(220,223,230);
}
RadioButton[IsChecked=true] #radioButtonBorder {
StrokeFill: #1E9FFF;
Fill: #1E9FFF;
}
RadioButton #optionMark {
StrokeFill: #1E9FFF;
Fill: #fff;
}
CheckBox #indeterminateMark {
Fill: #1E9FFF;
}
CheckBox #checkBoxBorder {
Background: #fff;
BorderFill: rgb(220,223,230);
}
CheckBox[IsChecked=true] #checkBoxBorder {
Background: #1E9FFF;
BorderFill: #1E9FFF;
}
CheckBox Polyline {
StrokeFill: #fff;
}
.radioGroup {
BorderType: BorderThickness;
BorderFill: rgb(220,223,230);
BorderThickness: 1,1,0,1;
}
.radioGroup RadioButton {
BorderType: BorderThickness;
BorderFill: rgb(220,223,230);
BorderThickness: 0,0,1,0;
}
.radioGroup RadioButton #markPanel {
Visibility: Collapsed;
}
.radioGroup RadioButton TextBlock {
Margin: 5;
}
.radioGroup RadioButton[IsChecked=true] {
Background: rgb(64,158,255);
Foreground: #fff;
}
.error {
Foreground: #f00;
Visibility: Collapsed;
}
.error[DesignMode=true] {
Visibility: Visible;
}
.twoLine[AttachedExtenstions.IsError=true] .error {
Visibility: Visible;
}
.twoLine[AttachedExtenstions.IsError=true] .textBox {
BorderFill: #f00;
}
ScrollBar {
Background: null;
}
ScrollBar Thumb {
IsAntiAlias: true;
CornerRadius: 5;
}
ScrollBar[Orientation=Horizontal] {
Height: 12;
}
ScrollBar[Orientation=Vertical] {
Width: 12;
}
ScrollBar #PART_LineUpButton, ScrollBar #PART_LineDownButton {
Visibility: Collapsed;
}
ComboBox {
Background: #fff;
IsAntiAlias: true;
BorderFill: #DCDFE6;
CornerRadius: 4,4,4,4;
BorderStroke: 1;
}
ComboBox[IsKeyboardFocusWithin=true] {
BorderFill: #1E9FFF;
}
#DropDownPanel TextBlock {
MarginLeft: 5;
MarginTop: 2;
MarginBottom: 2;
font-size: 14;
}
#dropDownBorder {
ShadowBlur: 2;
ShadowColor: rgba(0, 0, 0, 0.4);
BorderStroke: 0;
}
#DropDownPanel[IsMouseOver=false] ScrollBar {
Visibility: Collapsed;
}
#DropDownPanel ScrollBar[Orientation=Horizontal] {
Height: 10;
}
#DropDownPanel ScrollBar[Orientation=Vertical] {
Width: 10;
}
Slider {
IsAntiAlias: true;
}
Slider Thumb {
IsAntiAlias: true;
Width: 16;
Height: 16;
CornerRadius: 7;
BorderFill: rgb(64,158,255);
BorderStroke: 2;
Background: #fff;
ZIndex: 1;
}
Slider Thumb[IsMouseOver=true] {
animation-name: sliderMouseOver;
animation-duration: 0.1s;
animation-iteration-count: 1;
animation-fill-mode: forwards;
}
Slider #TrackBackground {
CornerRadius: 2;
Background: rgb(228,231,237);
BorderStroke: 0;
}
Slider #decreaseRepeatButton {
Background: rgb(64,158,255);
CornerRadius: 2;
}
Slider[Orientation=Horizontal] #decreaseRepeatButton {
Height: 4;
MarginLeft: 5;
}
Slider[Orientation=Vertical] #decreaseRepeatButton {
Width: 4;
MarginBottom: 5;
}
ProgressBar {
CornerRadius: 5;
IsAntiAlias: true;
BorderFill: null;
Background: rgb(235,238,245);
}
ProgressBar #Indicator, ProgressBar #Animation {
CornerRadius: 5;
}
NumericUpDown {
Background: #fff;
IsAntiAlias: true;
BorderFill: #DCDFE6;
CornerRadius: 4,4,4,4;
BorderStroke: 1;
}
NumericUpDown RepeatButton {
Width: 20;
Background: rgb(245,247,250);
}
NumericUpDown #decreaseBtn {
CornerRadius: 4,0,0,4;
}
NumericUpDown #increaseBtn {
CornerRadius: 0,4,4,0;
}
NumericUpDown #textBoxBorder {
BorderFill: #DCDFE6;
}
NumericUpDown TextBox {
BorderStroke: 0;
}
.widget {
IsAntiAlias: true;
BorderFill: #DCDFE6;
CornerRadius: 4,4,4,4;
BorderStroke: 1;
}
.widgetHead {
Background: linear-gradient(0 0,0 100%,#F7F7F7 0,#F0F0F0 1);
BorderType: BorderThickness;
BorderThickness: 0,0,0,1;
BorderFill: #DCDFE6;
}
DataGrid {
Foreground: #7a7a7a;
}
DataGridCellTemplate, DataGridRow, DataGrid, .DataGridCell {
BorderFill: rgb(235,238,245);
}
DataGridRow {
Height: 36;
}
DataGridRow[IsMouseOver=true] {
Background: rgb(245,247,250);
}
DataGridRow[IsSelected=true] {
Background: rgb(245,247,250);
}
DataGridColumnTemplate {
Height: 38;
FontSize: 15;
FontStyle: Bold;
Background: #fff;
BorderFill: rgb(235,238,245);
}
TabControl #headBorder {
Background: #fff;
}
TabItem > Border {
BorderThickness: 0,0,0,2;
}
TabItem[IsSelected=true] > Border {
BorderFill: #1E9FFF;
}
TabItem[IsSelected=true] {
Foreground: #1E9FFF;
}
TabControl[TabStripPlacement=Left] TabItem, TabControl[TabStripPlacement=Right] TabItem {
Width: 100%;
BorderType: BorderThickness;
BorderThickness: 0,0,0,1;
BorderFill: #e8e8e8;
}
TabControl[TabStripPlacement=Left] TabItem TextBlock {
MarginRight: 0;
}
TabControl[TabStripPlacement=Left] TabItem > Border {
Width: 100%;
}
TabControl[TabStripPlacement=Left] #headerPanel, TabControl[TabStripPlacement=Right] #headerPanel {
Width: 100;
Background: rgb(245,247,250);
}
.closeBtn[IsMouseOver=true] {
Fill: #171717;
}
.placeholder {
IsHitTestVisible: false;
Foreground: "192,196,204";
Visibility: Collapsed;
}
.textBox[AttachedExtenstions.IsEmpty=true] .placeholder {
Visibility: Visible;
}
.loginBox TextBox, .loginBox .placeholder {
FontSize: 16;
}
.loginBox CheckBox {
Foreground: #757575;
}
.searchBox Button {
CornerRadius: 0,4,4,0,
}
#MenuPop #menuPanel > Border, #MenuPop ContextMenu > Border {
Background: #fff;
ShadowColor: rgba(0, 0, 0, 0.4);
}
#MenuPop MenuItem[IsMouseOver=true] {
Background: #DCDFE6;
}
ListBoxItem {
Width: 100%;
}
Loading…
Cancel
Save