From d0126e6986c4ac49c29154c39a8923721c87d209 Mon Sep 17 00:00:00 2001 From: callmeyan Date: Mon, 3 Feb 2025 23:01:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/AIProofread/v17/.suo | Bin 2469376 -> 2129408 bytes AIProofread/AIProofread.csproj | 9 ++ AIProofread/Bridge.cs | 10 ++ AIProofread/Config.cs | 1 + AIProofread/Controls/BaseWinForm.cs | 33 +++++ AIProofread/Controls/FormLexicon.Designer.cs | 66 ++++++++++ AIProofread/Controls/FormLexicon.cs | 21 ++++ AIProofread/Controls/FormLexicon.resx | 120 +++++++++++++++++++ AIProofread/Controls/FormLogin.cs | 3 + AIProofread/Model/DocumentInfo.cs | 8 ++ AIProofread/Ribbon1.cs | 1 + AIProofread/ThisAddIn.cs | 26 ++++ AIProofread/core/Tools.cs | 18 +++ 13 files changed, 316 insertions(+) create mode 100644 AIProofread/Controls/FormLexicon.Designer.cs create mode 100644 AIProofread/Controls/FormLexicon.cs create mode 100644 AIProofread/Controls/FormLexicon.resx diff --git a/.vs/AIProofread/v17/.suo b/.vs/AIProofread/v17/.suo index 7b027b3ec5009867f53b9f9edc7352e3fc77b32f..835cfbdb40b59d2c097b8d45e51eecec2d7ae294 100644 GIT binary patch delta 37735 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 FormDialog.cs + + Form + + + FormLexicon.cs + Form @@ -400,6 +406,9 @@ FormDialog.cs + + FormLexicon.cs + FormLoading.cs diff --git a/AIProofread/Bridge.cs b/AIProofread/Bridge.cs index 2035f31..9027df1 100644 --- a/AIProofread/Bridge.cs +++ b/AIProofread/Bridge.cs @@ -154,6 +154,7 @@ namespace AIProofread data["version"] = Config.APP_VERSION; data["platform"] = Config.IS_WPS ? "wps" : "word"; data["environment"] = Config.APP_ENV.ToString(); + data["deviceId"] = Config.DeviceId; return JsonConvert.SerializeObject(data); } public void SetBtnStatus(string key, bool status) @@ -280,6 +281,11 @@ namespace AIProofread { Globals.ThisAddIn.ShowLoginForm(action); } + public void ShowLexiconForm() + { + //Globals.ThisAddIn.ShowLoginForm(action); + (new FormLexicon()).Show(); + } public void Logout(string action) { // web同步注销到ribbon @@ -508,6 +514,10 @@ namespace AIProofread public void ClearCurrentDocumentMarks() => Globals.ThisAddIn.ActiveDocument?.ClearAllProofreadMark(); public void removeBookmark(string markId) => DocumentUtil.RemoveBookmark(markId); + public string GetDeviceId() + { + return Config.DeviceId; + } public string getAllBookmark() { diff --git a/AIProofread/Config.cs b/AIProofread/Config.cs index 7470762..b65e1af 100644 --- a/AIProofread/Config.cs +++ b/AIProofread/Config.cs @@ -21,6 +21,7 @@ namespace AIProofread /// 文本背景色 /// public static readonly string TextBackgroundColor = "#D6AA69"; + public static string DeviceId = ""; #if DEBUG /// /// 网页访问地址 diff --git a/AIProofread/Controls/BaseWinForm.cs b/AIProofread/Controls/BaseWinForm.cs index 5f0c960..c2da513 100644 --- a/AIProofread/Controls/BaseWinForm.cs +++ b/AIProofread/Controls/BaseWinForm.cs @@ -1,8 +1,10 @@ using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.WinForms; +using NPOI.SS.Util; using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; @@ -123,6 +125,7 @@ namespace AIProofread.Controls var eventForwarder = new EventForwarder(this); webView.CoreWebView2.AddHostObjectToScript("event", eventForwarder); + webView.CoreWebView2.AddHostObjectToScript("host", this); webView.CoreWebView2.AddHostObjectToScript("bridge", Bridge.bridge); if(callaback != null) { @@ -135,5 +138,35 @@ namespace AIProofread.Controls Logger.Log("\ninit webview error:" + ex.Message + "\n" + ex.StackTrace); } } + public void Download(string url) + { + Globals.ThisAddIn.ActiveDocument.RunInMainThread(() => + { + var sfd = new SaveFileDialog(); + sfd.Filter = "Excel文件|*.xlsx"; + sfd.DefaultExt = ".xlsx"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + var fileName = sfd.FileName; + Download(url, fileName); + } + }); + } + public void Download(string url, string fileName) + { + // 现在url对应文件并保存到fileName + try + { + using (var client = new WebClient()) + { + client.DownloadFile(url, fileName); + } + } + catch (Exception ex) + { + Logger.Log("\nDownload error:" + ex.Message + "\n" + ex.StackTrace); + } + } } } diff --git a/AIProofread/Controls/FormLexicon.Designer.cs b/AIProofread/Controls/FormLexicon.Designer.cs new file mode 100644 index 0000000..9142d8d --- /dev/null +++ b/AIProofread/Controls/FormLexicon.Designer.cs @@ -0,0 +1,66 @@ +namespace AIProofread.Controls +{ + partial class FormLexicon + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.MainWebView = new Microsoft.Web.WebView2.WinForms.WebView2(); + ((System.ComponentModel.ISupportInitialize)(this.MainWebView)).BeginInit(); + this.SuspendLayout(); + // + // MainWebView + // + this.MainWebView.AllowExternalDrop = true; + this.MainWebView.CreationProperties = null; + this.MainWebView.DefaultBackgroundColor = System.Drawing.Color.White; + this.MainWebView.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainWebView.Location = new System.Drawing.Point(0, 0); + this.MainWebView.Name = "MainWebView"; + this.MainWebView.Size = new System.Drawing.Size(1000, 640); + this.MainWebView.TabIndex = 0; + this.MainWebView.ZoomFactor = 1D; + // + // FormLexicon + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1000, 640); + this.Controls.Add(this.MainWebView); + this.Name = "FormLexicon"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FormLexicon"; + this.Load += new System.EventHandler(this.FormLexicon_Load); + ((System.ComponentModel.ISupportInitialize)(this.MainWebView)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private Microsoft.Web.WebView2.WinForms.WebView2 MainWebView; + } +} \ No newline at end of file diff --git a/AIProofread/Controls/FormLexicon.cs b/AIProofread/Controls/FormLexicon.cs new file mode 100644 index 0000000..94af12a --- /dev/null +++ b/AIProofread/Controls/FormLexicon.cs @@ -0,0 +1,21 @@ +using System; +using System.Runtime.InteropServices; + +namespace AIProofread.Controls +{ + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public partial class FormLexicon : BaseWinForm + { + public FormLexicon() + { + InitializeComponent(); + } + + private void FormLexicon_Load(object sender, EventArgs e) + { + // 初始化 + InitWebView(MainWebView, Config.WebPath("lexicon"), "lexicon"); + } + } +} diff --git a/AIProofread/Controls/FormLexicon.resx b/AIProofread/Controls/FormLexicon.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/AIProofread/Controls/FormLexicon.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/AIProofread/Controls/FormLogin.cs b/AIProofread/Controls/FormLogin.cs index e9ef85e..803d46e 100644 --- a/AIProofread/Controls/FormLogin.cs +++ b/AIProofread/Controls/FormLogin.cs @@ -1,8 +1,11 @@ using System; +using System.Runtime.InteropServices; using System.Windows.Forms; namespace AIProofread.Controls { + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] public partial class FormLogin : BaseWinForm { diff --git a/AIProofread/Model/DocumentInfo.cs b/AIProofread/Model/DocumentInfo.cs index 6e48a42..0f314aa 100644 --- a/AIProofread/Model/DocumentInfo.cs +++ b/AIProofread/Model/DocumentInfo.cs @@ -107,6 +107,14 @@ namespace AIProofread.Model } } + public void RunInMainThread(Action action) + { + if (null != TaskPane) + { + TaskPane.Control.BeginInvoke(action); + } + } + public void ShowDialog(string message, string confirmText, string confirmAction) { TaskPane.Control.BeginInvoke(new Action(() => diff --git a/AIProofread/Ribbon1.cs b/AIProofread/Ribbon1.cs index adf3893..9871436 100644 --- a/AIProofread/Ribbon1.cs +++ b/AIProofread/Ribbon1.cs @@ -171,6 +171,7 @@ namespace AIProofread private void btnOpenLexicon_Click(object sender, RibbonControlEventArgs e) { Globals.ThisAddIn.SendMessageToWeb("show-lexicon", null); + //(new FormLexicon()).Show(); } private void btnSetting_Click(object sender, RibbonControlEventArgs e) diff --git a/AIProofread/ThisAddIn.cs b/AIProofread/ThisAddIn.cs index 1e68d51..211e1af 100644 --- a/AIProofread/ThisAddIn.cs +++ b/AIProofread/ThisAddIn.cs @@ -106,6 +106,7 @@ namespace AIProofread { try { + InitDeviceId(); AppInitialize(); //formCommonsenseDetection.ShowInTaskbar = false; //formCommonsenseDetection.Show(); @@ -141,6 +142,31 @@ namespace AIProofread Logger.Log("Startup", ex1.ToString()); } } + + // 异步获取设备唯一标识 + public void InitDeviceId() + { + System.Threading.Tasks.Task.Run(() => + { + try + { + var deviceId = Tools.GetDeviceId(); + if (string.IsNullOrEmpty(deviceId)) + { + deviceId = Tools.GetDeviceId(); + } + if (!string.IsNullOrEmpty(deviceId)) + { + Config.DeviceId = deviceId; + Logger.Log("设备唯一标识:" + deviceId); + } + } + catch (Exception ex) + { + Logger.Log("InitDeviceId", ex.ToString()); + } + }); + } public void CheckDocumentClosed(object sender, System.Timers.ElapsedEventArgs e) diff --git a/AIProofread/core/Tools.cs b/AIProofread/core/Tools.cs index 71cd2f1..4d0a47b 100644 --- a/AIProofread/core/Tools.cs +++ b/AIProofread/core/Tools.cs @@ -234,5 +234,23 @@ namespace AIProofread { return JsonConvert.SerializeObject(data, Formatting.Indented); } + + /// + /// 生成设备唯一标识 + /// + /// + public static string GetDeviceId() + { + string devicePath = Config.APP_DATA_PATH + "\\deviceId.txt"; + // 如果存在则直接返回 + if (File.Exists(devicePath)) + { + return File.ReadAllText(devicePath); + } + string deviceId = Guid.NewGuid().ToString().ToLower(); + // 将deviceId保存为纯文本文件到程序目录 + File.WriteAllText(devicePath, deviceId); + return deviceId; + } } }