From e8c18e6eb802f218e73b6587360959976f78f80d Mon Sep 17 00:00:00 2001 From: callmeyan Date: Fri, 28 Mar 2025 09:34:03 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=F0=9F=93=9C=EF=B8=8F=E5=BC=BA=E5=8C=96?= =?UTF-8?q?=E5=B8=B8=E8=AF=86=E6=80=A7=E6=A3=80=E6=B5=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- .vs/AIProofread/v17/.suo | Bin 3049984 -> 2867200 bytes AIProofread/Bridge.cs | 18 ++++--- AIProofread/Config.cs | 29 ++++++++++- .../FormCommonsenseDetection.Designer.cs | 1 + .../Controls/FormCommonsenseDetection.cs | 24 +++++---- AIProofread/ThisAddIn.cs | 3 ++ AIProofread/core/Tools.cs | 7 ++- updater/Form1.Designer.cs | 47 ++++++++++++++---- updater/Form1.cs | 14 +++++- 10 files changed, 116 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 06ba399..1842436 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,7 @@ TestConsoleApp obj **/obj/Debug/** **/obj/Release/** -**/obj/Test/** \ No newline at end of file +**/obj/Test/** +**/**/obj/Debug/** +**/**/obj/Release/** +**/**/obj/Test/** \ No newline at end of file diff --git a/.vs/AIProofread/v17/.suo b/.vs/AIProofread/v17/.suo index d4d7a0370302e8df8b6ad7f9a54289f0855268cb..478234477018062b481d68dd53ee2441ebc8e57c 100644 GIT binary patch delta 26008 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 diff --git a/AIProofread/Bridge.cs b/AIProofread/Bridge.cs index ae17d92..1d10e62 100644 --- a/AIProofread/Bridge.cs +++ b/AIProofread/Bridge.cs @@ -3,23 +3,16 @@ using AIProofread.core; using AIProofread.Model; using AIProofread.Util; using Microsoft.Office.Interop.Word; -using Microsoft.Office.Tools.Word; using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.WinForms; using Newtonsoft.Json; using NPOI; -using NPOI.SS.Formula; -using NPOI.XSSF.UserModel; -using NPOI.XWPF.UserModel; -using Org.BouncyCastle.Asn1.Crmf; using System; using System.Collections.Generic; using System.Diagnostics; -using System.Drawing; using System.IO; using System.Runtime.InteropServices; using System.Text.RegularExpressions; -using System.Threading; using System.Windows.Forms; using UtilLib; using Document = Microsoft.Office.Interop.Word.Document; @@ -336,6 +329,17 @@ namespace AIProofread var documentInfo = documentId > 0 ? Globals.ThisAddIn.GetDocumentById(documentId) : Globals.ThisAddIn.ActiveDocument; var doc = documentInfo.CurrentDocument; + // 判断是否处理修订模式 + if (doc.TrackRevisions) + { + //data.Add("code", 1); + //data.Add("message", "文档存在未处理的修订,请处理后再进行校对"); + var ret = MessageBox.Show("文档当前处于修订模式,是否关闭此模式?","提示",MessageBoxButtons.YesNo); + if(ret == DialogResult.Yes) + { + doc.TrackRevisions = false; + } + } if (ShouldUpgradeForced()) { data.Add("code", 2); diff --git a/AIProofread/Config.cs b/AIProofread/Config.cs index 4172a7b..832c043 100644 --- a/AIProofread/Config.cs +++ b/AIProofread/Config.cs @@ -9,6 +9,30 @@ namespace AIProofread Test, Prod } + + public class AppServer + { + /// + /// 开发环境 + /// + public const string DEV = "http://localhost:5173/"; + /// + /// 测试环境 + /// + public const string TEST = "http://gm2-plugin.zverse.group/"; + /// + /// 果麦预发布-灰度 + /// + public const string PRE = "https://pre-gm-plugin.gachafun.com/"; + /// + /// 果麦生产 + /// + public const string PROD = "https://gm-plugin.gachafun.com/"; + /// + /// 果麦金融 + /// + public const string GM_FN = "https://gm-plugin-fn.gachafun.com/"; + } public class Config { public static readonly string APP_NAME = "AI校对王"; @@ -23,15 +47,16 @@ namespace AIProofread /// public static readonly string TextBackgroundColor = "#E9DABB"; // e9dabb D6AA69 public static string DeviceId = ""; + #if DEBUG /// /// 网页访问地址 /// - public static string WEB_PATH = "http://localhost:5173/"; //pre-gm-plugin.gachafun.com localhost:5173 gm2-plugin.zverse.group + public static string WEB_PATH = AppServer.DEV; //pre-gm-plugin.gachafun.com localhost:5173 gm2-plugin.zverse.group public static bool RUN_IN_DEBUG = true; public static AppEnvironment APP_ENV = AppEnvironment.Dev; #else - public static string WEB_PATH = "https://gm-plugin.gachafun.com/"; // gm-plugin.gachafun.com pre-gm-plugin.gachafun.com + public static string WEB_PATH = AppServer.PROD; // gm-plugin.gachafun.com pre-gm-plugin.gachafun.com public static bool RUN_IN_DEBUG = false; public static AppEnvironment APP_ENV = AppEnvironment.Prod; #endif diff --git a/AIProofread/Controls/FormCommonsenseDetection.Designer.cs b/AIProofread/Controls/FormCommonsenseDetection.Designer.cs index a333e82..e38ac2e 100644 --- a/AIProofread/Controls/FormCommonsenseDetection.Designer.cs +++ b/AIProofread/Controls/FormCommonsenseDetection.Designer.cs @@ -55,6 +55,7 @@ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormCommonsenseDetection"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "常识性检测"; this.Load += new System.EventHandler(this.FormCommonsenseDetection_Load); ((System.ComponentModel.ISupportInitialize)(this.MainWebView)).EndInit(); this.ResumeLayout(false); diff --git a/AIProofread/Controls/FormCommonsenseDetection.cs b/AIProofread/Controls/FormCommonsenseDetection.cs index 3cfcdb9..bee784d 100644 --- a/AIProofread/Controls/FormCommonsenseDetection.cs +++ b/AIProofread/Controls/FormCommonsenseDetection.cs @@ -1,8 +1,8 @@ using AIProofread.core; using Newtonsoft.Json; using System; +using System.Collections.Generic; using System.Runtime.InteropServices; -using System.Threading; using UtilLib; namespace AIProofread.Controls @@ -13,8 +13,7 @@ namespace AIProofread.Controls { private bool initialized = false; - private string action; - private object data; + private List actions = new List(); public FormCommonsenseDetection() { @@ -45,17 +44,24 @@ namespace AIProofread.Controls return; } // 添加到队列 - this.action = action; - this.data = data; + actions.Add(new WebMessage(action, data)); + //this.action = action; + //this.data = data; } public void InitializationCompleted() { - if (!this.initialized && !string.IsNullOrEmpty(this.action)) + if (!this.initialized && actions.Count > 0) // !string.IsNullOrEmpty(this.action) { - SendToWeb(this.action, this.data); - this.action = null; - this.data = null; + actions.ForEach(item => + { + SendToWeb(item.Message, item.Data); + }); + // clear + actions.Clear(); + //SendToWeb(this.action, this.data); + //this.action = null; + //this.data = null; } this.initialized = true; } diff --git a/AIProofread/ThisAddIn.cs b/AIProofread/ThisAddIn.cs index 6840c63..4850380 100644 --- a/AIProofread/ThisAddIn.cs +++ b/AIProofread/ThisAddIn.cs @@ -348,6 +348,9 @@ namespace AIProofread ActiveDocument = documentList.SetActiveDocument(CurrentWordApplication.ActiveDocument); ActiveDocument.CheckBtnStatus(); CheckDocumentClosed(null, null); + if (formCommonsenseDetection != null) { + formCommonsenseDetection.SendMessageToWeb("document-change", null); + } Logger.Log("Application_DocumentChange -- " + ActiveDocument.fileName); } diff --git a/AIProofread/core/Tools.cs b/AIProofread/core/Tools.cs index 29c642b..0541279 100644 --- a/AIProofread/core/Tools.cs +++ b/AIProofread/core/Tools.cs @@ -57,7 +57,6 @@ namespace AIProofread // DocumentReader.ReadByVSTO(doc, Globals.ThisAddIn.Application, list); //} } - var map = new Dictionary { { "list", list }, @@ -79,7 +78,11 @@ namespace AIProofread if (bodyElement is XWPFParagraph p) { // 处理普通段落 - list.Add(new DocumentText(p.ParagraphText.Replace("\u0002", ""), paragraphNumber)); + var text = p.ParagraphText.Replace("\u0002", ""); + if(text.Trim().Length > 0) + { + list.Add(new DocumentText(text, paragraphNumber)); + } paragraphNumber++; } // table -- vsto对于每个单元格的分段也会有 diff --git a/updater/Form1.Designer.cs b/updater/Form1.Designer.cs index efab7d7..64c771f 100644 --- a/updater/Form1.Designer.cs +++ b/updater/Form1.Designer.cs @@ -35,24 +35,29 @@ this.panel1 = new System.Windows.Forms.Panel(); this.IconClose = new System.Windows.Forms.PictureBox(); this.label1 = new System.Windows.Forms.Label(); + this.panelLog = new System.Windows.Forms.Panel(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.IconClose)).BeginInit(); + this.panelLog.SuspendLayout(); this.SuspendLayout(); // // LabelLog // - this.LabelLog.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.LabelLog.Location = new System.Drawing.Point(40, 57); + this.LabelLog.Font = new System.Drawing.Font("微软雅黑", 10F); + this.LabelLog.Location = new System.Drawing.Point(2, 2); + this.LabelLog.MaximumSize = new System.Drawing.Size(296, 0); + this.LabelLog.MinimumSize = new System.Drawing.Size(296, 0); this.LabelLog.Name = "LabelLog"; - this.LabelLog.Size = new System.Drawing.Size(300, 71); + this.LabelLog.Size = new System.Drawing.Size(296, 21); this.LabelLog.TabIndex = 0; - this.LabelLog.Text = "正在检测。。。"; + this.LabelLog.Text = "版本检测中 ..."; this.LabelLog.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.LabelLog.Click += new System.EventHandler(this.LabelLog_Click); // // progressBar1 // - this.progressBar1.Location = new System.Drawing.Point(40, 136); + this.progressBar1.Location = new System.Drawing.Point(40, 180); this.progressBar1.Name = "progressBar1"; this.progressBar1.Size = new System.Drawing.Size(300, 14); this.progressBar1.TabIndex = 3; @@ -64,7 +69,7 @@ this.ButtonProcess.DefaultBack = System.Drawing.Color.FromArgb(((int)(((byte)(201)))), ((int)(((byte)(160)))), ((int)(((byte)(99))))); this.ButtonProcess.Font = new System.Drawing.Font("微软雅黑", 10F); this.ButtonProcess.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); - this.ButtonProcess.Location = new System.Drawing.Point(122, 158); + this.ButtonProcess.Location = new System.Drawing.Point(122, 202); this.ButtonProcess.Name = "ButtonProcess"; this.ButtonProcess.Radius = 4; this.ButtonProcess.Size = new System.Drawing.Size(136, 44); @@ -107,19 +112,40 @@ this.label1.TabIndex = 0; this.label1.Text = "温馨提示"; // + // panelLog + // + this.panelLog.AutoScroll = true; + this.panelLog.Controls.Add(this.LabelLog); + this.panelLog.Location = new System.Drawing.Point(40, 58); + this.panelLog.Name = "panelLog"; + this.panelLog.Size = new System.Drawing.Size(300, 114); + this.panelLog.TabIndex = 8; + // + // richTextBox1 + // + this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBox1.Location = new System.Drawing.Point(237, 149); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.ReadOnly = true; + this.richTextBox1.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.richTextBox1.Size = new System.Drawing.Size(100, 96); + this.richTextBox1.TabIndex = 9; + this.richTextBox1.Text = ""; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(380, 216); + this.ClientSize = new System.Drawing.Size(380, 260); + this.Controls.Add(this.richTextBox1); + this.Controls.Add(this.panelLog); this.Controls.Add(this.panel1); this.Controls.Add(this.ButtonProcess); this.Controls.Add(this.progressBar1); - this.Controls.Add(this.LabelLog); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; - this.MaximumSize = new System.Drawing.Size(380, 216); + this.MaximumSize = new System.Drawing.Size(380, 260); this.MinimizeBox = false; this.MinimumSize = new System.Drawing.Size(380, 216); this.Name = "Form1"; @@ -129,6 +155,7 @@ this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.IconClose)).EndInit(); + this.panelLog.ResumeLayout(false); this.ResumeLayout(false); } @@ -141,6 +168,8 @@ private System.Windows.Forms.PictureBox IconClose; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panelLog; + private System.Windows.Forms.RichTextBox richTextBox1; } } diff --git a/updater/Form1.cs b/updater/Form1.cs index 91b3cd1..ab9bf1c 100644 --- a/updater/Form1.cs +++ b/updater/Form1.cs @@ -159,6 +159,7 @@ namespace updater | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(UpgradeInfoURI + "api/v1/common/download/version"); + httpWebRequest.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse(); // 获取响应内容 if (resp.StatusCode == HttpStatusCode.OK) @@ -174,18 +175,27 @@ namespace updater resp.Close(); UpgradeModel update = JsonConvert.DeserializeObject(updateSource); ProcessUpdate(update); + return; } } catch (Exception) { - LabelLog.Text = "获取更新信息失败,请稍后重试"; } + LabelLog.Text = "获取更新信息失败,请稍后重试"; } private void ProcessUpdate(UpgradeModel update) { this.upgradeInfo = update.Info; - LabelLog.Text = update.Info.Message; + //richTextBox1.Text + richTextBox1.Text = update.Info.Message + + @"Com加载项勾选 +重新安装插件 +升级office或wps的版本 +注册表检测 +Com加载项勾选 +重新安装插件 +补充:无论windowS10或11。在安装插件时,需要先装wps在安装插件,在安装插件。否则菜单中不会显示校对王插件入口"; if (localVersion == null || update.Info.NeedUpgrade(localVersion.Version)) {