From 3863460eaa97d907934a2cd848dc068c101d358a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E5=90=89=E5=85=86?= <303176530@qq.com> Date: Sun, 22 Aug 2021 12:21:32 +0800 Subject: [PATCH] =?UTF-8?q?email=E6=8F=90=E4=B8=BA=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/v1/system/enter.go | 1 - server/core/server.go | 1 + server/initialize/plugin.go | 13 +++++ server/initialize/router.go | 23 ++++++--- server/middleware/email.go | 2 +- server/plugin/email/README.MD | 51 +++++++++++++++++++ server/plugin/email/api/enter.go | 7 +++ .../system => plugin/email/api}/sys_email.go | 10 ++-- server/plugin/email/config/email.go | 11 ++++ server/plugin/email/global/gloabl.go | 5 ++ server/plugin/email/main.go | 37 ++++++++++++++ server/plugin/email/router/enter.go | 7 +++ server/plugin/email/router/sys_email.go | 18 +++++++ server/plugin/email/service/enter.go | 7 +++ .../email/service}/sys_email.go | 4 +- server/{ => plugin/email}/utils/email.go | 22 ++++---- server/plugin/example_plugin/main.go | 28 ++++++++++ server/router/example/plugin.go | 31 ----------- server/router/system/enter.go | 1 - server/router/system/sys_email.go | 18 ------- server/service/system/enter.go | 1 - 21 files changed, 223 insertions(+), 75 deletions(-) create mode 100644 server/initialize/plugin.go create mode 100644 server/plugin/email/README.MD create mode 100644 server/plugin/email/api/enter.go rename server/{api/v1/system => plugin/email/api}/sys_email.go (72%) create mode 100644 server/plugin/email/config/email.go create mode 100644 server/plugin/email/global/gloabl.go create mode 100644 server/plugin/email/main.go create mode 100644 server/plugin/email/router/enter.go create mode 100644 server/plugin/email/router/sys_email.go create mode 100644 server/plugin/email/service/enter.go rename server/{service/system => plugin/email/service}/sys_email.go (79%) rename server/{ => plugin/email}/utils/email.go (76%) create mode 100644 server/plugin/example_plugin/main.go delete mode 100644 server/router/example/plugin.go delete mode 100644 server/router/system/sys_email.go diff --git a/server/api/v1/system/enter.go b/server/api/v1/system/enter.go index 83d261c6..2c618c70 100644 --- a/server/api/v1/system/enter.go +++ b/server/api/v1/system/enter.go @@ -25,7 +25,6 @@ var autoCodeService = service.ServiceGroupApp.SystemServiceGroup.AutoCodeService var autoCodeHistoryService = service.ServiceGroupApp.SystemServiceGroup.AutoCodeHistoryService var dictionaryService = service.ServiceGroupApp.SystemServiceGroup.DictionaryService var dictionaryDetailService = service.ServiceGroupApp.SystemServiceGroup.DictionaryDetailService -var emailService = service.ServiceGroupApp.SystemServiceGroup.EmailService var initDBService = service.ServiceGroupApp.SystemServiceGroup.InitDBService var jwtService = service.ServiceGroupApp.SystemServiceGroup.JwtService var baseMenuService = service.ServiceGroupApp.SystemServiceGroup.BaseMenuService diff --git a/server/core/server.go b/server/core/server.go index 57f63062..eb40ce0c 100644 --- a/server/core/server.go +++ b/server/core/server.go @@ -19,6 +19,7 @@ func RunWindowsServer() { initialize.Redis() } Router := initialize.Routers() + Router.Static("/form-generator", "./resource/page") address := fmt.Sprintf(":%d", global.GVA_CONFIG.System.Addr) diff --git a/server/initialize/plugin.go b/server/initialize/plugin.go new file mode 100644 index 00000000..55c14236 --- /dev/null +++ b/server/initialize/plugin.go @@ -0,0 +1,13 @@ +package initialize + +import ( + "github.com/flipped-aurora/gin-vue-admin/utils/plugin" + "github.com/gin-gonic/gin" +) + +func PluginInit(group *gin.RouterGroup, Plugin ...plugin.Plugin) { + for i := range Plugin { + PluginGroup := group.Group(Plugin[i].RouterPath()) + Plugin[i].Register(PluginGroup) + } +} diff --git a/server/initialize/router.go b/server/initialize/router.go index dde69a1c..d60acce1 100644 --- a/server/initialize/router.go +++ b/server/initialize/router.go @@ -1,14 +1,14 @@ package initialize import ( + "github.com/flipped-aurora/gin-vue-admin/plugin/email" + "github.com/flipped-aurora/gin-vue-admin/plugin/example_plugin" "net/http" _ "github.com/flipped-aurora/gin-vue-admin/docs" "github.com/flipped-aurora/gin-vue-admin/global" "github.com/flipped-aurora/gin-vue-admin/middleware" "github.com/flipped-aurora/gin-vue-admin/router" - "github.com/flipped-aurora/gin-vue-admin/router/example" - "github.com/gin-gonic/gin" "github.com/swaggo/gin-swagger" "github.com/swaggo/gin-swagger/swaggerFiles" @@ -37,9 +37,6 @@ func Routers() *gin.Engine { systemRouter.InitBaseRouter(PublicGroup) // 注册基础功能路由 不做鉴权 systemRouter.InitInitRouter(PublicGroup) // 自动初始化相关 } - - example.PluginInit(PublicGroup) - PrivateGroup := Router.Group("") PrivateGroup.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler()) { @@ -47,7 +44,6 @@ func Routers() *gin.Engine { systemRouter.InitJwtRouter(PrivateGroup) // jwt相关路由 systemRouter.InitUserRouter(PrivateGroup) // 注册用户路由 systemRouter.InitMenuRouter(PrivateGroup) // 注册menu路由 - systemRouter.InitEmailRouter(PrivateGroup) // 邮件相关路由 systemRouter.InitSystemRouter(PrivateGroup) // system相关路由 systemRouter.InitCasbinRouter(PrivateGroup) // 权限相关路由 systemRouter.InitAutoCodeRouter(PrivateGroup) // 创建自动化代码 @@ -64,6 +60,21 @@ func Routers() *gin.Engine { autocodeRouter.InitSysAutoCodeExampleRouter(PrivateGroup) // Code generated by github.com/flipped-aurora/gin-vue-admin End; DO NOT EDIT. } + + // 添加开放权限的插件 示例 + PluginInit(PublicGroup, example_plugin.ExamplePlugin) + + // 添加跟角色挂钩权限的插件 示例 + PluginInit(PrivateGroup, email.CreateEmailPlug( + global.GVA_CONFIG.Email.To, + global.GVA_CONFIG.Email.From, + global.GVA_CONFIG.Email.Host, + global.GVA_CONFIG.Email.Secret, + global.GVA_CONFIG.Email.Nickname, + global.GVA_CONFIG.Email.Port, + global.GVA_CONFIG.Email.IsSSL, + )) + global.GVA_LOG.Info("router register success") return Router } diff --git a/server/middleware/email.go b/server/middleware/email.go index e6c0102c..df2468c4 100644 --- a/server/middleware/email.go +++ b/server/middleware/email.go @@ -1,6 +1,7 @@ package middleware import ( + "github.com/flipped-aurora/gin-vue-admin/plugin/email/utils" "io/ioutil" "strconv" "time" @@ -9,7 +10,6 @@ import ( "github.com/flipped-aurora/gin-vue-admin/model/system" "github.com/flipped-aurora/gin-vue-admin/model/system/request" "github.com/flipped-aurora/gin-vue-admin/service" - "github.com/flipped-aurora/gin-vue-admin/utils" "github.com/gin-gonic/gin" "go.uber.org/zap" ) diff --git a/server/plugin/email/README.MD b/server/plugin/email/README.MD new file mode 100644 index 00000000..646b24f2 --- /dev/null +++ b/server/plugin/email/README.MD @@ -0,0 +1,51 @@ +## GVA 邮件发送功能插件 + +### 使用步骤 + +#### 1. 前往GVA主程序下的initialize/router.go 在Routers 方法最末尾按照你需要的及安全模式添加本插件 + 例: + 本插件可以采用gva的配置文件 也可以直接写死内容作为配置 建议为gva添加配置文件结构 然后将配置传入 + PluginInit(PrivateGroup, email.CreateEmailPlug( + global.GVA_CONFIG.Email.To, + global.GVA_CONFIG.Email.From, + global.GVA_CONFIG.Email.Host, + global.GVA_CONFIG.Email.Secret, + global.GVA_CONFIG.Email.Nickname, + global.GVA_CONFIG.Email.Port, + global.GVA_CONFIG.Email.IsSSL, + )) + + 同样也可以再传入时写死 + + PluginInit(PrivateGroup, email.CreateEmailPlug( + "a@qq.com", + "b@qq.com", + "smtp.qq.com", + "global.GVA_CONFIG.Email.Secret", + "登录密钥", + 465, + true, + )) + +#### 2. 配置说明 + + //其中 Form 和 Secret 通常来说就是用户名和密码 + + type Email struct { + To string // 收件人:多个以英文逗号分隔 例:a@qq.com b@qq.com 正式开发中请把此项目作为参数使用 此处配置主要用于发送错误监控邮件 + From string // 发件人 你自己要发邮件的邮箱 + Host string // 服务器地址 例如 smtp.qq.com 请前往QQ或者你要发邮件的邮箱查看其smtp协议 + Secret string // 密钥 用于登录的密钥 最好不要用邮箱密码 去邮箱smtp申请一个用于登录的密钥 + Nickname string // 昵称 发件人昵称 自定义即可 可以不填 + Port int // 端口 请前往QQ或者你要发邮件的邮箱查看其smtp协议 大多为 465 + IsSSL bool // 是否SSL 是否开启SSL + } + +### 方法API + + utils.EmailTest(邮件标题,邮件主体) 发送测试邮件 + 例:utils.EmailTest("测试邮件","测试邮件") + utils.ErrorToEmail(邮件标题,邮件主体) 错误监控 + 例:utils.ErrorToEmail("测试邮件","测试邮件") + utils.Email(目标邮箱多个的话用逗号分隔,邮件标题,邮件主体) 发送测试邮件 + 例:utils.Email(”a.qq.com,b.qq.com“,"测试邮件","测试邮件") diff --git a/server/plugin/email/api/enter.go b/server/plugin/email/api/enter.go new file mode 100644 index 00000000..353404d2 --- /dev/null +++ b/server/plugin/email/api/enter.go @@ -0,0 +1,7 @@ +package api + +type ApiGroup struct { + EmailApi +} + +var ApiGroupApp = new(ApiGroup) diff --git a/server/api/v1/system/sys_email.go b/server/plugin/email/api/sys_email.go similarity index 72% rename from server/api/v1/system/sys_email.go rename to server/plugin/email/api/sys_email.go index 4ec35717..337eea57 100644 --- a/server/api/v1/system/sys_email.go +++ b/server/plugin/email/api/sys_email.go @@ -1,20 +1,24 @@ -package system +package api import ( "github.com/flipped-aurora/gin-vue-admin/global" "github.com/flipped-aurora/gin-vue-admin/model/common/response" + "github.com/flipped-aurora/gin-vue-admin/plugin/email/service" "github.com/gin-gonic/gin" "go.uber.org/zap" ) +type EmailApi struct { +} + // @Tags System // @Summary 发送测试邮件 // @Security ApiKeyAuth // @Produce application/json // @Success 200 {string} string "{"success":true,"data":{},"msg":"发送成功"}" // @Router /email/emailTest [post] -func (s *SystemApi) EmailTest(c *gin.Context) { - if err := emailService.EmailTest(); err != nil { +func (s *EmailApi) EmailTest(c *gin.Context) { + if err := service.ServiceGroupApp.EmailTest(); err != nil { global.GVA_LOG.Error("发送失败!", zap.Any("err", err)) response.FailWithMessage("发送失败", c) } else { diff --git a/server/plugin/email/config/email.go b/server/plugin/email/config/email.go new file mode 100644 index 00000000..c535348c --- /dev/null +++ b/server/plugin/email/config/email.go @@ -0,0 +1,11 @@ +package config + +type Email struct { + To string `mapstructure:"to" json:"to" yaml:"to"` // 收件人:多个以英文逗号分隔 例:a@qq.com b@qq.com 正式开发中请把此项目作为参数使用 + From string `mapstructure:"from" json:"from" yaml:"from"` // 发件人 你自己要发邮件的邮箱 + Host string `mapstructure:"host" json:"host" yaml:"host"` // 服务器地址 例如 smtp.qq.com 请前往QQ或者你要发邮件的邮箱查看其smtp协议 + Secret string `mapstructure:"secret" json:"secret" yaml:"secret"` // 密钥 用于登录的密钥 最好不要用邮箱密码 去邮箱smtp申请一个用于登录的密钥 + Nickname string `mapstructure:"nickname" json:"nickname" yaml:"nickname"` // 昵称 发件人昵称 通常为自己的邮箱 + Port int `mapstructure:"port" json:"port" yaml:"port"` // 端口 请前往QQ或者你要发邮件的邮箱查看其smtp协议 大多为 465 + IsSSL bool `mapstructure:"is-ssl" json:"isSSL" yaml:"is-ssl"` // 是否SSL 是否开启SSL +} diff --git a/server/plugin/email/global/gloabl.go b/server/plugin/email/global/gloabl.go new file mode 100644 index 00000000..f099a2e3 --- /dev/null +++ b/server/plugin/email/global/gloabl.go @@ -0,0 +1,5 @@ +package global + +import "github.com/flipped-aurora/gin-vue-admin/plugin/email/config" + +var GlobalConfig = new(config.Email) diff --git a/server/plugin/email/main.go b/server/plugin/email/main.go new file mode 100644 index 00000000..b15ce24a --- /dev/null +++ b/server/plugin/email/main.go @@ -0,0 +1,37 @@ +package email + +import ( + "github.com/flipped-aurora/gin-vue-admin/plugin/email/global" + "github.com/flipped-aurora/gin-vue-admin/plugin/email/router" + "github.com/gin-gonic/gin" +) + +type emailPlugin struct { + To string + From string + Host string + Secret string + Nickname string + Port int + IsSsl bool +} + +func CreateEmailPlug(To, From, Host, Secret, Nickname string, Port int, IsSSL bool) *emailPlugin { + global.GlobalConfig.To = To + global.GlobalConfig.From = From + global.GlobalConfig.Host = Host + global.GlobalConfig.Secret = Secret + global.GlobalConfig.Nickname = Nickname + global.GlobalConfig.Port = Port + global.GlobalConfig.IsSSL = IsSSL + return &emailPlugin{} + +} + +func (*emailPlugin) Register(group *gin.RouterGroup) { + router.RouterGroupApp.InitEmailRouter(group) +} + +func (*emailPlugin) RouterPath() string { + return "email" +} diff --git a/server/plugin/email/router/enter.go b/server/plugin/email/router/enter.go new file mode 100644 index 00000000..e081a54c --- /dev/null +++ b/server/plugin/email/router/enter.go @@ -0,0 +1,7 @@ +package router + +type RouterGroup struct { + EmailRouter +} + +var RouterGroupApp = new(RouterGroup) diff --git a/server/plugin/email/router/sys_email.go b/server/plugin/email/router/sys_email.go new file mode 100644 index 00000000..e3d7abd7 --- /dev/null +++ b/server/plugin/email/router/sys_email.go @@ -0,0 +1,18 @@ +package router + +import ( + "github.com/flipped-aurora/gin-vue-admin/middleware" + "github.com/flipped-aurora/gin-vue-admin/plugin/email/api" + "github.com/gin-gonic/gin" +) + +type EmailRouter struct { +} + +func (s *EmailRouter) InitEmailRouter(Router *gin.RouterGroup) { + emailRouter := Router.Use(middleware.OperationRecord()) + var EmailApi = api.ApiGroupApp.EmailApi.EmailTest + { + emailRouter.POST("emailTest", EmailApi) // 发送测试邮件 + } +} diff --git a/server/plugin/email/service/enter.go b/server/plugin/email/service/enter.go new file mode 100644 index 00000000..e96e267f --- /dev/null +++ b/server/plugin/email/service/enter.go @@ -0,0 +1,7 @@ +package service + +type ServiceGroup struct { + EmailService +} + +var ServiceGroupApp = new(ServiceGroup) diff --git a/server/service/system/sys_email.go b/server/plugin/email/service/sys_email.go similarity index 79% rename from server/service/system/sys_email.go rename to server/plugin/email/service/sys_email.go index 32975414..30bcee29 100644 --- a/server/service/system/sys_email.go +++ b/server/plugin/email/service/sys_email.go @@ -1,7 +1,7 @@ -package system +package service import ( - "github.com/flipped-aurora/gin-vue-admin/utils" + "github.com/flipped-aurora/gin-vue-admin/plugin/email/utils" ) type EmailService struct { diff --git a/server/utils/email.go b/server/plugin/email/utils/email.go similarity index 76% rename from server/utils/email.go rename to server/plugin/email/utils/email.go index c530d2d2..a4c7ec9f 100644 --- a/server/utils/email.go +++ b/server/plugin/email/utils/email.go @@ -6,7 +6,7 @@ import ( "net/smtp" "strings" - "github.com/flipped-aurora/gin-vue-admin/global" + "github.com/flipped-aurora/gin-vue-admin/plugin/email/global" "github.com/jordan-wright/email" ) @@ -17,8 +17,8 @@ import ( //@param: subject string, body string //@return: error -func Email(subject string, body string) error { - to := strings.Split(global.GVA_CONFIG.Email.To, ",") +func Email(To, subject string, body string) error { + to := strings.Split(To, ",") return send(to, subject, body) } @@ -29,7 +29,7 @@ func Email(subject string, body string) error { //@return: error func ErrorToEmail(subject string, body string) error { - to := strings.Split(global.GVA_CONFIG.Email.To, ",") + to := strings.Split(global.GlobalConfig.To, ",") if to[len(to)-1] == "" { // 判断切片的最后一个元素是否为空,为空则移除 to = to[:len(to)-1] } @@ -43,7 +43,7 @@ func ErrorToEmail(subject string, body string) error { //@return: error func EmailTest(subject string, body string) error { - to := []string{global.GVA_CONFIG.Email.From} + to := []string{global.GlobalConfig.From} return send(to, subject, body) } @@ -54,12 +54,12 @@ func EmailTest(subject string, body string) error { //@return: error func send(to []string, subject string, body string) error { - from := global.GVA_CONFIG.Email.From - nickname := global.GVA_CONFIG.Email.Nickname - secret := global.GVA_CONFIG.Email.Secret - host := global.GVA_CONFIG.Email.Host - port := global.GVA_CONFIG.Email.Port - isSSL := global.GVA_CONFIG.Email.IsSSL + from := global.GlobalConfig.From + nickname := global.GlobalConfig.Nickname + secret := global.GlobalConfig.Secret + host := global.GlobalConfig.Host + port := global.GlobalConfig.Port + isSSL := global.GlobalConfig.IsSSL auth := smtp.PlainAuth("", from, secret, host) e := email.NewEmail() diff --git a/server/plugin/example_plugin/main.go b/server/plugin/example_plugin/main.go new file mode 100644 index 00000000..1fa6831f --- /dev/null +++ b/server/plugin/example_plugin/main.go @@ -0,0 +1,28 @@ +package example_plugin + +import ( + "github.com/gin-gonic/gin" +) + +var ExamplePlugin = new(pluginExample) + +type pluginExample struct { +} + +func (*pluginExample) Register(group *gin.RouterGroup) { + //如需细分权限 可以在此处use中间件 gva项目包名已改为github模式 + //所以整个plugin可以直接独立到外层开启为新的项目 然后用包的形式导入也是可以完整运行的 + // 例: + /* + group.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler()).GET("hello", func(context *gin.Context) { + context.JSON(200, "hello world") + }) + */ + group.GET("hello", func(context *gin.Context) { + context.JSON(200, "hello world") + }) +} + +func (*pluginExample) RouterPath() string { + return "group" +} diff --git a/server/router/example/plugin.go b/server/router/example/plugin.go deleted file mode 100644 index d5400fbf..00000000 --- a/server/router/example/plugin.go +++ /dev/null @@ -1,31 +0,0 @@ -package example - -import ( - "github.com/flipped-aurora/gin-vue-admin/utils/plugin" - - "github.com/gin-gonic/gin" -) - -var Plugin []plugin.Plugin = []plugin.Plugin{&PluginExample} - -var PluginExample = pluginExample{} - -type pluginExample struct { -} - -func (*pluginExample) Register(group *gin.RouterGroup) { - group.GET("hello", func(context *gin.Context) { - context.JSON(200, "hello world") - }) -} - -func (*pluginExample) RouterPath() string { - return "group" -} - -func PluginInit(group *gin.RouterGroup) { - for i := range Plugin { - PluginGroup := group.Group(Plugin[i].RouterPath()) - Plugin[i].Register(PluginGroup) - } -} diff --git a/server/router/system/enter.go b/server/router/system/enter.go index d608b364..6231e776 100644 --- a/server/router/system/enter.go +++ b/server/router/system/enter.go @@ -8,7 +8,6 @@ type RouterGroup struct { CasbinRouter DictionaryRouter DictionaryDetailRouter - EmailRouter InitRouter JwtRouter MenuRouter diff --git a/server/router/system/sys_email.go b/server/router/system/sys_email.go deleted file mode 100644 index 5765dcf6..00000000 --- a/server/router/system/sys_email.go +++ /dev/null @@ -1,18 +0,0 @@ -package system - -import ( - v1 "github.com/flipped-aurora/gin-vue-admin/api/v1" - "github.com/flipped-aurora/gin-vue-admin/middleware" - "github.com/gin-gonic/gin" -) - -type EmailRouter struct { -} - -func (s *EmailRouter) InitEmailRouter(Router *gin.RouterGroup) { - emailRouter := Router.Group("email").Use(middleware.OperationRecord()) - var systemApi = v1.ApiGroupApp.SystemApiGroup.SystemApi - { - emailRouter.POST("emailTest", systemApi.EmailTest) // 发送测试邮件 - } -} diff --git a/server/service/system/enter.go b/server/service/system/enter.go index 028f392c..836cf6fe 100644 --- a/server/service/system/enter.go +++ b/server/service/system/enter.go @@ -10,7 +10,6 @@ type ServiceGroup struct { CasbinService DictionaryService DictionaryDetailService - EmailService InitDBService MenuService OperationRecordService -- GitLab