diff --git a/CalendarNotepad/Extends/DbContext.cs b/CalendarNotepad/Extends/DbContext.cs index 9cd1b78..440a368 100644 --- a/CalendarNotepad/Extends/DbContext.cs +++ b/CalendarNotepad/Extends/DbContext.cs @@ -20,7 +20,9 @@ namespace CalendarNotepad.Extends public void DbInit() { using var db = new DbContext(); - db.CodeFirst.InitTables(); + db.CodeFirst.InitTables(); + db.CodeFirst.InitTables(); + db.CodeFirst.InitTables(); } } } diff --git a/CalendarNotepad/Extends/PlusFile.cs b/CalendarNotepad/Extends/PlusFile.cs new file mode 100644 index 0000000..205bbcc --- /dev/null +++ b/CalendarNotepad/Extends/PlusFile.cs @@ -0,0 +1,66 @@ +using System.Security.Cryptography; +using System.Text; + +namespace CalendarNotepad.Extends +{ + /// + /// 附件操作 + /// + public static class PlusFile + { + /// + /// 获取MD5码 + /// + public static string GetMd5(string fileContent) { + var ibs = Encoding.UTF8.GetBytes(fileContent); + return GetMd5(ibs); + } + /// + /// 获取MD5码 + /// + public static string GetMd5(byte[] content) { + using var md5 = MD5.Create(); + var md5bs = md5.ComputeHash(content); + StringBuilder sb = new(md5bs.Length * 2); + for(int i = 0;i < md5bs.Length;i++) { + sb.Append(md5bs[i].ToString("X2")); + } + return sb.ToString(); + } + /// + /// 读取文件内容 + /// + /// + /// + public static byte[] LoadFile(string fullFilePath) { + if(!File.Exists(fullFilePath)) { + throw new FileNotFoundException(); + } + var fileInfo = new FileInfo(fullFilePath); + var fileSize = fileInfo.Length; + if(fileSize > 4 * 1024 * 1024) { + throw new OutOfMemoryException(); + } + using FileStream fs = fileInfo.OpenRead(); + using BinaryReader br = new BinaryReader(fs); + var length = (int)fs.Length; + var buf = br.ReadBytes(length); + return buf; + } + /// + /// 写入文件内容 + /// + /// + /// + public static void SaveFile(string fullFilePath,byte[] content) { + if(File.Exists(fullFilePath)) { + File.Delete(fullFilePath); + } + using var fs = new FileStream(fullFilePath,FileMode.CreateNew,FileAccess.Write); + using var bw = new BinaryWriter(fs); + bw.Write(content); + bw.Flush(); + bw.Close(); + } + } +} diff --git a/CalendarNotepad/Main.cs b/CalendarNotepad/Main.cs index d569742..616b726 100644 --- a/CalendarNotepad/Main.cs +++ b/CalendarNotepad/Main.cs @@ -45,7 +45,6 @@ namespace CalendarNotepad private void rtbMsg_TextChanged(object sender,EventArgs e) { var data = new WorkUnit { - DayRange = GetDateRange(), WorkDay = this.mcWorkDay.SelectionStart.ToString("yyyyMMdd"), WorkMessage = this.rtbMsg.Text, }; diff --git a/CalendarNotepad/Models/PlusFileUnit.cs b/CalendarNotepad/Models/PlusFileUnit.cs new file mode 100644 index 0000000..f679896 --- /dev/null +++ b/CalendarNotepad/Models/PlusFileUnit.cs @@ -0,0 +1,17 @@ +namespace CalendarNotepad.Models +{ + /// + /// 附件文件单元 + /// + public class PlusFileUnit + { + /// + /// 文件指纹ID + /// + public string? FileId { get; set; } + /// + /// 文件内容 + /// + public byte[]? FileContent { get; set; } + } +} diff --git a/CalendarNotepad/Models/WorkContext.cs b/CalendarNotepad/Models/WorkContext.cs index 4830644..6141dce 100644 --- a/CalendarNotepad/Models/WorkContext.cs +++ b/CalendarNotepad/Models/WorkContext.cs @@ -27,7 +27,7 @@ namespace CalendarNotepad.Models public void AddOrReplace(WorkUnit unit) { lock(_lockObj) { - var qu = this.WorkList.Where(a => a.WorkDay == unit.WorkDay && a.DayRange == unit.DayRange); + var qu = this.WorkList.Where(a => a.WorkDay == unit.WorkDay); if(qu.Any() && unit.WorkMessage.IsNullOrEmpty()) { qu.ToList().ForEach(a => this.WorkList.Remove(a)); return; @@ -53,8 +53,8 @@ namespace CalendarNotepad.Models /// 工作范围 /// public WorkUnit GetUnit(string workDay,string workRange) { - var qu = this.WorkList.Where(a => a.WorkDay == workDay && a.DayRange == workRange); - return qu.Any() ? qu.First() : new WorkUnit { DayRange = workRange,WorkDay = workDay,WorkMessage = "" }; + var qu = this.WorkList.Where(a => a.WorkDay == workDay); + return qu.Any() ? qu.First() : new WorkUnit { WorkDay = workDay,WorkMessage = "" }; } public void SaveToFile() { diff --git a/CalendarNotepad/Models/WorkUnit.cs b/CalendarNotepad/Models/WorkUnit.cs index d2cfa0b..d71168b 100644 --- a/CalendarNotepad/Models/WorkUnit.cs +++ b/CalendarNotepad/Models/WorkUnit.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace CalendarNotepad.Models { @@ -11,12 +12,9 @@ namespace CalendarNotepad.Models /// /// 工作日期 /// + [Key] public string? WorkDay { get; set; } /// - /// 时间段 - /// - public string? DayRange { get; set; } - /// /// 内容 /// public string? WorkMessage { get; set; } diff --git a/CalendarNotepad/Models/WorkUnitPlusFile.cs b/CalendarNotepad/Models/WorkUnitPlusFile.cs new file mode 100644 index 0000000..fb5d893 --- /dev/null +++ b/CalendarNotepad/Models/WorkUnitPlusFile.cs @@ -0,0 +1,21 @@ +namespace CalendarNotepad.Models +{ + /// + /// 工作单元附件对应关系 + /// + public class WorkUnitPlusFile + { + /// + /// 工作日期 + /// + public string? WorkDay { get; set; } + /// + /// 文件指纹 + /// + public string? FileKey { get; set; } + /// + /// 文件名称 + /// + public string? FileName { get; set; } + } +} diff --git a/CalendarNotepad/WorkMain.Designer.cs b/CalendarNotepad/WorkMain.Designer.cs index 0a54dea..fff0571 100644 --- a/CalendarNotepad/WorkMain.Designer.cs +++ b/CalendarNotepad/WorkMain.Designer.cs @@ -25,6 +25,7 @@ /// the contents of this method with the code editor. /// private void InitializeComponent() { + components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WorkMain)); tabControl1 = new TabControl(); tpWorkManage = new TabPage(); @@ -47,9 +48,15 @@ radioButton5 = new RadioButton(); mcWorkDay = new MonthCalendar(); rtbMsg = new RichTextBox(); + FileListView = new ListView(); + cms_FileList = new ContextMenuStrip(components); + 删除ToolStripMenuItem = new ToolStripMenuItem(); + 导入ToolStripMenuItem = new ToolStripMenuItem(); toolStrip1 = new ToolStrip(); tsp_Copy = new ToolStripButton(); tsb_palse = new ToolStripButton(); + OpenFileDlg = new OpenFileDialog(); + 下载ToolStripMenuItem = new ToolStripMenuItem(); tabControl1.SuspendLayout(); tpWorkManage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); @@ -61,6 +68,7 @@ flowLayoutPanel1.SuspendLayout(); gbWorkTypes.SuspendLayout(); C_WorkTypes.SuspendLayout(); + cms_FileList.SuspendLayout(); toolStrip1.SuspendLayout(); SuspendLayout(); // @@ -71,7 +79,7 @@ tabControl1.Location = new Point(0,0); tabControl1.Name = "tabControl1"; tabControl1.SelectedIndex = 0; - tabControl1.Size = new Size(695,490); + tabControl1.Size = new Size(717,443); tabControl1.TabIndex = 0; // // tpWorkManage @@ -80,7 +88,7 @@ tpWorkManage.Location = new Point(4,26); tpWorkManage.Name = "tpWorkManage"; tpWorkManage.Padding = new Padding(3); - tpWorkManage.Size = new Size(687,460); + tpWorkManage.Size = new Size(709,413); tpWorkManage.TabIndex = 1; tpWorkManage.Text = "录入记录"; tpWorkManage.UseVisualStyleBackColor = true; @@ -102,8 +110,9 @@ // splitContainer1.Panel2 // splitContainer1.Panel2.Controls.Add(rtbMsg); + splitContainer1.Panel2.Controls.Add(FileListView); splitContainer1.Panel2.Controls.Add(toolStrip1); - splitContainer1.Size = new Size(681,454); + splitContainer1.Size = new Size(703,407); splitContainer1.SplitterDistance = 236; splitContainer1.TabIndex = 9; // @@ -178,7 +187,7 @@ flowLayoutPanel1.AutoSize = true; flowLayoutPanel1.Controls.Add(btSave); flowLayoutPanel1.Controls.Add(btReset); - flowLayoutPanel1.Location = new Point(6,420); + flowLayoutPanel1.Location = new Point(6,373); flowLayoutPanel1.Name = "flowLayoutPanel1"; flowLayoutPanel1.Size = new Size(220,29); flowLayoutPanel1.TabIndex = 8; @@ -297,17 +306,51 @@ rtbMsg.EnableAutoDragDrop = true; rtbMsg.Location = new Point(0,25); rtbMsg.Name = "rtbMsg"; - rtbMsg.Size = new Size(441,429); + rtbMsg.Size = new Size(463,297); rtbMsg.TabIndex = 7; rtbMsg.Text = ""; rtbMsg.LinkClicked += rtbMsg_LinkClicked; + rtbMsg.TextChanged += rtbMsg_TextChanged_1; + // + // FileListView + // + FileListView.ContextMenuStrip = cms_FileList; + FileListView.Dock = DockStyle.Bottom; + FileListView.FullRowSelect = true; + FileListView.GridLines = true; + FileListView.Location = new Point(0,322); + FileListView.Name = "FileListView"; + FileListView.Size = new Size(463,85); + FileListView.TabIndex = 9; + FileListView.UseCompatibleStateImageBehavior = false; + FileListView.View = View.Details; + // + // cms_FileList + // + cms_FileList.Items.AddRange(new ToolStripItem[] { 删除ToolStripMenuItem,导入ToolStripMenuItem,下载ToolStripMenuItem }); + cms_FileList.Name = "contextMenuStrip1"; + cms_FileList.Size = new Size(181,92); + // + // 删除ToolStripMenuItem + // + 删除ToolStripMenuItem.Name = "删除ToolStripMenuItem"; + 删除ToolStripMenuItem.Size = new Size(180,22); + 删除ToolStripMenuItem.Text = "删除"; + 删除ToolStripMenuItem.Click += 删除ToolStripMenuItem_Click; + // + // 导入ToolStripMenuItem + // + 导入ToolStripMenuItem.Name = "导入ToolStripMenuItem"; + 导入ToolStripMenuItem.Size = new Size(180,22); + 导入ToolStripMenuItem.Text = "导入"; + 导入ToolStripMenuItem.Click += 导入ToolStripMenuItem_Click; // // toolStrip1 // toolStrip1.Items.AddRange(new ToolStripItem[] { tsp_Copy,tsb_palse }); toolStrip1.Location = new Point(0,0); toolStrip1.Name = "toolStrip1"; - toolStrip1.Size = new Size(441,25); + toolStrip1.Size = new Size(463,25); toolStrip1.TabIndex = 8; toolStrip1.Text = "toolStrip1"; // @@ -331,11 +374,22 @@ tsb_palse.Text = "粘贴"; tsb_palse.Click += tsb_palse_Click; // + // OpenFileDlg + // + OpenFileDlg.Multiselect = true; + // + // 下载ToolStripMenuItem + // + 下载ToolStripMenuItem.Name = "下载ToolStripMenuItem"; + 下载ToolStripMenuItem.Size = new Size(180,22); + 下载ToolStripMenuItem.Text = "下载"; + 下载ToolStripMenuItem.Click += 下载ToolStripMenuItem_Click; + // // WorkMain // AutoScaleDimensions = new SizeF(7F,17F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(695,490); + ClientSize = new Size(717,443); Controls.Add(tabControl1); Name = "WorkMain"; StartPosition = FormStartPosition.CenterScreen; @@ -357,6 +411,7 @@ gbWorkTypes.ResumeLayout(false); C_WorkTypes.ResumeLayout(false); C_WorkTypes.PerformLayout(); + cms_FileList.ResumeLayout(false); toolStrip1.ResumeLayout(false); toolStrip1.PerformLayout(); ResumeLayout(false); @@ -388,5 +443,11 @@ private ToolStrip toolStrip1; private ToolStripButton tsp_Copy; private ToolStripButton tsb_palse; + private ListView FileListView; + private ContextMenuStrip cms_FileList; + private ToolStripMenuItem 删除ToolStripMenuItem; + private ToolStripMenuItem 导入ToolStripMenuItem; + private OpenFileDialog OpenFileDlg; + private ToolStripMenuItem 下载ToolStripMenuItem; } } \ No newline at end of file diff --git a/CalendarNotepad/WorkMain.cs b/CalendarNotepad/WorkMain.cs index 5060e39..483385e 100644 --- a/CalendarNotepad/WorkMain.cs +++ b/CalendarNotepad/WorkMain.cs @@ -25,6 +25,16 @@ namespace CalendarNotepad rab.CheckedChanged += Rab_CheckedChanged; } } + var fieViewWidth = this.FileListView.Width; + this.FileListView.Columns.Add(new ColumnHeader { + Text = "附件",Width = fieViewWidth - 200,TextAlign = HorizontalAlignment.Left, + }); + this.FileListView.Columns.Add(new ColumnHeader { + Text = "类型",Width = 100,TextAlign = HorizontalAlignment.Left, + }); + this.FileListView.Columns.Add(new ColumnHeader { + Text = "文件指纹",Width = 100,TextAlign = HorizontalAlignment.Left, + }); } private void Rab_CheckedChanged(object? sender,EventArgs e) { @@ -44,18 +54,28 @@ namespace CalendarNotepad private void mcWorkDay_DateChanged(object sender,DateRangeEventArgs e) { var wd = this.mcWorkDay.SelectionStart.ToString("yyyyMMdd"); - var sr = "全天"; - var qu = this.Db.Queryable().Where(a => a.DayRange == sr && a.WorkDay == wd).ToList(); + this.FileListView.Items.Clear(); + var qu = this.Db.Queryable().Where(a => a.WorkDay == wd).ToList(); + if(!qu.Any()) { + this.rtbMsg.Text = ""; + this.SetWorkType("休假"); + this.SetWorkOut("无"); + } if(qu.Any()) { var fir = qu.First(); this.rtbMsg.Text = fir.WorkMessage; this.SetWorkType(fir.WorkType); this.SetWorkOut(fir.Workout ?? "无"); - } - else { - this.rtbMsg.Text = ""; - this.SetWorkType("休假"); - this.SetWorkOut("无"); + + var plsq = this.Db.Queryable().Where(a => a.WorkDay == wd).ToList(); + if(plsq.Any()) { + foreach(var i in plsq) { + var lit1 = new ListViewItem(i.FileName); + lit1.SubItems.Add(new ListViewItem.ListViewSubItem { Text = "已载入" }); + lit1.SubItems.Add(new ListViewItem.ListViewSubItem { Text = i.FileKey }); + this.FileListView.Items.Add(lit1); + } + } } this.DataReset(); Task.Factory.StartNew(() => { @@ -116,11 +136,10 @@ namespace CalendarNotepad private void btSave_Click(object sender,EventArgs e) { var wd = this.mcWorkDay.SelectionStart.ToString("yyyyMMdd"); - var dr = "全天"; var msg = this.rtbMsg.Text; var wt = GetWorkType(); var wo = this.GetWorkOut(); - var exp = Expressionable.Create().And(a => a.DayRange == dr && a.WorkDay == wd).ToExpression(); + var exp = Expressionable.Create().And(a => a.WorkDay == wd).ToExpression(); var qu = this.Db.Queryable().Where(exp).ToList(); if(qu.Any() && msg.IsNullOrEmpty()) { this.Db.Deleteable().Where(exp).ExecuteCommand(); @@ -138,7 +157,7 @@ namespace CalendarNotepad } if(!qu.Any() && msg.IsNotNullOrEmpty()) { this.Db.Insertable(new WorkUnit { - DayRange = dr,WorkDay = wd, + WorkDay = wd, WorkMessage = msg,WorkType = wt,Workout = wo, }).ExecuteCommand(); this.DataReset(); @@ -206,5 +225,85 @@ namespace CalendarNotepad private void tsb_palse_Click(object sender,EventArgs e) { this.rtbMsg.AppendText(Clipboard.GetText()); } + + private void rtbMsg_TextChanged_1(object sender,EventArgs e) { + + } + + private void 删除ToolStripMenuItem_Click(object sender,EventArgs e) { + var wd = this.mcWorkDay.SelectionStart.ToString("yyyyMMdd"); + var items = this.FileListView.SelectedItems; + if(items.Count == 0) { + MessageBox.Show("没有选择列表项!"); + return; + } + if(MessageBox.Show($"共选择了{items.Count}项,是否全部删除?","警告",MessageBoxButtons.OKCancel) == DialogResult.Cancel) { + return; + } + foreach(ListViewItem i in items) { + this.FileListView.Items.Remove(i); + this.Db.Deleteable() + .Where(a => a.WorkDay == wd && a.FileKey == i.SubItems[2].Text) + .ExecuteCommand(); + } + } + + private void 导入ToolStripMenuItem_Click(object sender,EventArgs e) { + var dlgFile = OpenFileDlg.ShowDialog(); + if(dlgFile == DialogResult.Cancel) { + return; + } + if(OpenFileDlg.SafeFileNames.Length == 0) { + return; + } + var wd = this.mcWorkDay.SelectionStart.ToString("yyyyMMdd"); + foreach(var f in OpenFileDlg.FileNames) { + var lit1 = new ListViewItem(Path.GetFileName(f)); + lit1.SubItems.Add(new ListViewItem.ListViewSubItem { Text = "导入中" }); + lit1.SubItems.Add(new ListViewItem.ListViewSubItem { Text = "" }); + this.FileListView.Items.Add(lit1); + + var fc = PlusFile.LoadFile(f); + var fk = PlusFile.GetMd5(fc); + lit1.SubItems[2].Text = fk; + var pfu = new PlusFileUnit { FileContent = fc,FileId = fk }; + var qu = this.Db.Queryable().Where(a => a.FileId == fk); + if(!qu.Any()) { + this.Db.Insertable(pfu).ExecuteCommand(); + } + this.Db.Insertable(new WorkUnitPlusFile { + FileKey = fk, + WorkDay = wd, + FileName = Path.GetFileName(f), + }).ExecuteCommand(); + } + } + + private void 下载ToolStripMenuItem_Click(object sender,EventArgs e) { + var items = this.FileListView.SelectedItems; + if(items.Count == 0) { + MessageBox.Show("没有选择文件"); + return; + } + foreach(ListViewItem i in items) { + var sdlg = new SaveFileDialog { + Title = "保存附件", + FileName = Path.GetFileName(i.Text), + }; + var dresult = sdlg.ShowDialog(); + if(dresult != DialogResult.OK) { + return; + } + var filePath = sdlg.FileName; + var fileKey = i.SubItems[2].Text; + var qu = this.Db.Queryable().Where(a => a.FileId == fileKey).ToList(); + if(qu.Any()) { + var fir = qu.First(); + if(fir.FileContent != null) { + PlusFile.SaveFile(filePath,fir.FileContent); + } + } + } + } } } diff --git a/CalendarNotepad/WorkMain.resx b/CalendarNotepad/WorkMain.resx index 7909714..82e70d6 100644 --- a/CalendarNotepad/WorkMain.resx +++ b/CalendarNotepad/WorkMain.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 127, 17 + 17, 17 @@ -130,4 +133,10 @@ AAAAAElFTkSuQmCC + + 248, 17 + + + 36 + \ No newline at end of file