From 8cf4273bd34dec4e8c8c1ad9a167009ee4541b1d Mon Sep 17 00:00:00 2001
From: izory <791736813@qq.com>
Date: Tue, 28 Sep 2021 18:17:31 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9D=83=E9=99=90=E5=88=A4=E6=96=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Infrastructure/Model/SendEmailDto.cs | 18 ++
ZR.Common/MailHelper.cs | 165 ++++++++++++++++++
.../src/views/{system => tool}/file/index.vue | 33 +---
ZR.Vue/src/views/tool/gen/index.vue | 8 +-
document/admin-mysql.sql | 12 +-
document/admin-sqlserver.sql | Bin 105644 -> 100480 bytes
6 files changed, 199 insertions(+), 37 deletions(-)
create mode 100644 Infrastructure/Model/SendEmailDto.cs
create mode 100644 ZR.Common/MailHelper.cs
rename ZR.Vue/src/views/{system => tool}/file/index.vue (84%)
diff --git a/Infrastructure/Model/SendEmailDto.cs b/Infrastructure/Model/SendEmailDto.cs
new file mode 100644
index 0000000..749bbb8
--- /dev/null
+++ b/Infrastructure/Model/SendEmailDto.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Infrastructure.Model
+{
+ public class SendEmailDto
+ {
+ public string FileUrl { get; set; } = "";
+ public string Subject { get; set; }
+ public string ToUser { get; set; }
+ public string Content { get; set; } = "";
+ public string HtmlContent { get; set; }
+ public DateTime AddTime { get; set; }
+ }
+}
diff --git a/ZR.Common/MailHelper.cs b/ZR.Common/MailHelper.cs
new file mode 100644
index 0000000..c5299a2
--- /dev/null
+++ b/ZR.Common/MailHelper.cs
@@ -0,0 +1,165 @@
+using MailKit.Net.Smtp;
+using MimeKit;
+using MimeKit.Text;
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace ZR.Common
+{
+ public class MailHelper
+ {
+ ///
+ /// 发送人邮箱
+ ///
+ public string FromEmail { get; set; } = "";
+ ///
+ /// 发送人密码
+ ///
+ public string FromPwd { get; set; } = "";
+ ///
+ /// 发送协议
+ ///
+ public string Smtp { get; set; } = "smtp.qq.com";
+ ///
+ /// 协议端口
+ ///
+ public int Port { get; set; } = 587;
+ ///
+ /// 是否使用SSL协议
+ ///
+ public bool UseSsl { get; set; } = false;
+ public string mailSign = @"";
+
+ public MailHelper(string fromEmail, string smtp, int port, string fromPwd)
+ {
+ FromEmail = fromEmail;
+ Smtp = smtp;
+ FromPwd = fromPwd;
+ Port = port;
+ }
+
+ public MailHelper(string fromEmail, string fromPwd)
+ {
+ FromEmail = fromEmail;
+ FromPwd = fromPwd;
+ }
+
+ ///
+ /// 发送一个人
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendMail(string toAddress, string subject, string text, string path = "", string html = "")
+ {
+ IEnumerable mailboxes = new List() {
+ new MailboxAddress(toAddress)
+ };
+
+ SendMail(mailboxes, subject, text, path, html);
+ }
+
+ ///
+ /// 发送多个邮箱
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendMail(string[] toAddress, string subject, string text, string path = "", string html = "")
+ {
+ IList mailboxes = new List() { };
+ foreach (var item in toAddress)
+ {
+ mailboxes.Add(new MailboxAddress(item));
+ }
+
+ SendMail(mailboxes, subject, text, path, html);
+ }
+
+ ///
+ /// 发送邮件
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// 附件url地址
+ private void SendMail(IEnumerable toAddress, string subject, string text, string path = "", string html = "")
+ {
+ MimeMessage message = new MimeMessage();
+ //发件人
+ message.From.Add(new MailboxAddress(FromEmail, FromEmail));
+
+ //收件人
+ //message.To.Add(new MailboxAddress(toAddress));
+ //IList internets = null;
+ //internets.Add(new MailboxAddress(toAddress));
+
+ message.To.AddRange(toAddress);
+ message.Subject = subject;
+ message.Date = DateTime.Now;
+
+ //创建附件Multipart
+ Multipart multipart = new Multipart("mixed");
+
+ //html内容
+ if (!string.IsNullOrEmpty(html))
+ {
+ var Html = new TextPart(TextFormat.Html)
+ {
+ Text = html
+ };
+ multipart.Add(Html);
+ }
+ //文本内容
+ if (!string.IsNullOrEmpty(text))
+ {
+ var plain = new TextPart(TextFormat.Plain)
+ {
+ Text = text + "\r\n\n\n" + mailSign
+ };
+ multipart.Add(plain);
+ }
+
+ //附件
+ if (!string.IsNullOrEmpty(path))
+ {
+ MimePart attachment = new MimePart()
+ {
+ Content = new MimeContent(File.OpenRead(path), ContentEncoding.Default),
+ //读取文件,只能用绝对路径
+ ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
+ ContentTransferEncoding = ContentEncoding.Base64,
+ //文件名字
+ FileName = Path.GetFileName(path)
+ };
+ multipart.Add(attachment);
+ }
+
+ //赋值邮件内容
+ message.Body = multipart;
+
+ //开始发送
+ using (var client = new SmtpClient())
+ {
+ client.ServerCertificateValidationCallback = (s, c, h, e) => true;
+
+ //Smtp服务器
+ //client.Connect("smtp.qq.com", 587, false);
+ client.Connect(Smtp, Port, true);
+ //登录,发送
+ //特别说明,对于服务器端的中文相应,Exception中有编码问题,显示乱码了
+ client.Authenticate(FromEmail, FromPwd);
+
+ client.Send(message);
+ //断开
+ client.Disconnect(true);
+ Console.WriteLine($"发送邮件成功{DateTime.Now}");
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/ZR.Vue/src/views/system/file/index.vue b/ZR.Vue/src/views/tool/file/index.vue
similarity index 84%
rename from ZR.Vue/src/views/system/file/index.vue
rename to ZR.Vue/src/views/tool/file/index.vue
index 86d6824..ef152d8 100644
--- a/ZR.Vue/src/views/system/file/index.vue
+++ b/ZR.Vue/src/views/tool/file/index.vue
@@ -43,16 +43,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -108,20 +98,10 @@ export default {
dictLabel: "本地",
},
],
- uploadUrl: process.env.VUE_APP_BASE_API + "/upload/SaveFile?token=zr",
+ uploadUrl: process.env.VUE_APP_BASE_API + "/upload/SaveFile",
// 数据列表
dataList: [
- {
- id: 1,
- photo:
- "https://ss1.baidu.com/-4o3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/d788d43f8794a4c2b124d0000df41bd5ad6e3991.jpg",
- name: "你好",
- userId: 1000001,
- sortId: 1,
- address: "浙江省杭州市西湖区",
- content: "我是一个超长超长的文字啊",
- addtime: "2021-8-7 23:00:00",
- },
+
],
// 总记录数
total: 0,
@@ -129,8 +109,6 @@ export default {
btnSubmitVisible: true,
// 表单校验
rules: {
- name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
- userId: [{ required: true, message: "id不能为空", trigger: "blur" }],
},
};
},
@@ -223,14 +201,9 @@ export default {
this.title = "详情";
// TODO 给表单赋值
this.form = {
- content: row.content,
- userId: row.userId,
- name: row.name,
- sortId: row.sortId,
+
};
},
- handleImport() {},
- handleExport() {},
},
};
diff --git a/ZR.Vue/src/views/tool/gen/index.vue b/ZR.Vue/src/views/tool/gen/index.vue
index 77f0796..cbdba71 100644
--- a/ZR.Vue/src/views/tool/gen/index.vue
+++ b/ZR.Vue/src/views/tool/gen/index.vue
@@ -16,7 +16,7 @@
导入
- 删除
+ 删除
@@ -33,9 +33,9 @@
- 预览
- 编辑
- 删除
+ 预览
+ 编辑
+ 删除
生成代码
diff --git a/document/admin-mysql.sql b/document/admin-mysql.sql
index 720e652..4ec413d 100644
--- a/document/admin-mysql.sql
+++ b/document/admin-mysql.sql
@@ -251,7 +251,7 @@ INSERT INTO sys_menu VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/ind
INSERT INTO sys_menu VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', 0, 0, 'C', '0', '0', 'system:post:list', 'post', '', SYSDATE(), '', NULL, '岗位管理菜单');
INSERT INTO sys_menu VALUES (108, '日志管理', 1, 9, 'log', '', 0, 0, 'M', '0', '0', '', 'log', '', SYSDATE(), '', NULL, '日志管理菜单');
INSERT INTO sys_menu VALUES (105, '字典管理', 1, 5, 'dict', 'system/dict/index', 0, 0, 'C', '0', '0', 'system:dict:list', 'dict', '', SYSDATE(), '', NULL, '');
-INSERT INTO sys_menu VALUES (106, '分配用户', 1, 3, 'roleusers', 'system/roleusers/index', 0, 0, 'C', '0', '0', 'system:role:list', 'people', '', SYSDATE(), '', NULL, NULL);
+INSERT INTO sys_menu VALUES (106, '权限分配', 1, 3, 'roleusers', 'system/roleusers/index', 0, 0, 'C', '0', '0', 'system:role:list', 'people', '', SYSDATE(), '', NULL, NULL);
-- 一级菜单 缓存监控
INSERT INTO sys_menu VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', 0, 0, 'C', '1', '1', 'monitor:cache:list', 'redis', '', SYSDATE(), '', NULL, '缓存监控菜单');
@@ -260,8 +260,7 @@ INSERT INTO sys_menu VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/
INSERT INTO sys_menu VALUES (114, '表单构建', 3, 1, 'build', 'tool/build/index', 0, 0, 'C', '0', '0', 'tool:build:list', 'build', '', SYSDATE(), '', NULL, '表单构建菜单');
INSERT INTO sys_menu VALUES (115, '代码生成', 3, 1, 'gen', 'tool/gen/index', 0, 0, 'C', '0', '0', 'tool:gen:list', 'code', '', SYSDATE(), '', NULL, '代码生成菜单');
INSERT INTO sys_menu VALUES (116, '系统接口', 3, 3, 'swagger', 'tool/swagger/index', 0, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', '', SYSDATE(), '', NULL, '系统接口菜单');
-INSERT INTO sys_menu VALUES (117, '编辑表格', 3, 3, 'editTable', 'tool/gen/editTable', 0, 0, 'C', '1', '0', 'tool:gen:edittable', '', '', SYSDATE(), '', NULL, '代码生成编辑表格菜单');
-
+INSERT INTO sys_menu VALUES (117, '发送邮件', 3, 4, '/sendEmail', 'tool/email/sendEmail', 0, 0, 'C', '0', '0', 'tool:email:send', 'message', '', GETDATE(), '', NULL, '发送邮件菜单');
-- 日志管理
INSERT INTO sys_menu VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', 0, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', '', SYSDATE(), '', NULL, '操作日志菜单');
@@ -324,6 +323,13 @@ INSERT INTO sys_menu VALUES (2062, '新增', 2057, 1, '#', NULL, 0, 0, 'F', '0',
INSERT INTO sys_menu VALUES (2063, '修改', 2057, 2, '#', NULL, 0, 0, 'F', '0', '0', 'system:article:update', '', '', SYSDATE(), '', NULL, NULL);
INSERT INTO sys_menu VALUES (2064, '删除', 2057, 3, '#', NULL, 0, 0, 'F', '0', '0', 'system:article:delete', '', '', SYSDATE(), '', NULL, NULL);
+--代码生成页面权限
+INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (2070, '编辑', 115, 1, '#', NULL, 0, 0, 'F', '0', '0', 'tool:ten:edit', '', '', GETDATE());
+INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (2071, '预览', 115, 1, '#', NULL, 0, 0, 'F', '0', '0', 'tool:ten:preview', '', '', GETDATE());
+INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (2072, '删除', 115, 1, '#', NULL, 0, 0, 'F', '0', '0', 'tool:ten:remove', '', '', GETDATE());
+INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (2073, '导入', 115, 1, '#', NULL, 0, 0, 'F', '0', '0', 'tool:ten:import', '', '', GETDATE());
+INSERT INTO sys_menu(menuId, menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by,create_time) VALUES (2074, '生成代码', 115, 1, '#', NULL, 0, 0, 'F', '0', '0', 'tool:ten:code', '', '', GETDATE());
+
-- ----------------------------
-- Table structure for sys_oper_log
diff --git a/document/admin-sqlserver.sql b/document/admin-sqlserver.sql
index 28ac3d6e474386bc1bef82c887ef8ddbebed06a3..1dc23ef6fd0f129eec2fb90ea98accbaf5a14dc6 100644
GIT binary patch
delta 1950
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