提交 3863460e 编写于 作者: Mr.奇淼('s avatar Mr.奇淼(

email提为插件模式

上级 5a03870b
......@@ -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
......
......@@ -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)
......
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)
}
}
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
}
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"
)
......
## 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“,"测试邮件","测试邮件")
package api
type ApiGroup struct {
EmailApi
}
var ApiGroupApp = new(ApiGroup)
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 {
......
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
}
package global
import "github.com/flipped-aurora/gin-vue-admin/plugin/email/config"
var GlobalConfig = new(config.Email)
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"
}
package router
type RouterGroup struct {
EmailRouter
}
var RouterGroupApp = new(RouterGroup)
package system
package router
import (
v1 "github.com/flipped-aurora/gin-vue-admin/api/v1"
"github.com/flipped-aurora/gin-vue-admin/middleware"
"github.com/flipped-aurora/gin-vue-admin/plugin/email/api"
"github.com/gin-gonic/gin"
)
......@@ -10,9 +10,9 @@ type EmailRouter struct {
}
func (s *EmailRouter) InitEmailRouter(Router *gin.RouterGroup) {
emailRouter := Router.Group("email").Use(middleware.OperationRecord())
var systemApi = v1.ApiGroupApp.SystemApiGroup.SystemApi
emailRouter := Router.Use(middleware.OperationRecord())
var EmailApi = api.ApiGroupApp.EmailApi.EmailTest
{
emailRouter.POST("emailTest", systemApi.EmailTest) // 发送测试邮件
emailRouter.POST("emailTest", EmailApi) // 发送测试邮件
}
}
package service
type ServiceGroup struct {
EmailService
}
var ServiceGroupApp = new(ServiceGroup)
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 {
......
......@@ -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()
......
package example
package example_plugin
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{}
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")
})
......@@ -22,10 +26,3 @@ func (*pluginExample) Register(group *gin.RouterGroup) {
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)
}
}
......@@ -8,7 +8,6 @@ type RouterGroup struct {
CasbinRouter
DictionaryRouter
DictionaryDetailRouter
EmailRouter
InitRouter
JwtRouter
MenuRouter
......
......@@ -10,7 +10,6 @@ type ServiceGroup struct {
CasbinService
DictionaryService
DictionaryDetailService
EmailService
InitDBService
MenuService
OperationRecordService
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册