蒋吉兆 пре 3 година
родитељ
комит
3863460eaa

+ 0 - 1
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

+ 1 - 0
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)

+ 13 - 0
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)
+	}
+}

+ 17 - 6
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
 }

+ 1 - 1
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"
 )

+ 51 - 0
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(
+    "[email protected]",
+    "[email protected]",
+    "smtp.qq.com",
+    "global.GVA_CONFIG.Email.Secret",
+    "登录密钥",
+    465,
+    true,
+    ))
+
+#### 2. 配置说明
+
+    //其中 Form 和 Secret 通常来说就是用户名和密码
+
+    type Email struct {
+	    To       string  // 收件人:多个以英文逗号分隔 例:[email protected] [email protected] 正式开发中请把此项目作为参数使用 此处配置主要用于发送错误监控邮件
+	    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“,"测试邮件","测试邮件")

+ 7 - 0
server/plugin/email/api/enter.go

@@ -0,0 +1,7 @@
+package api
+
+type ApiGroup struct {
+	EmailApi
+}
+
+var ApiGroupApp = new(ApiGroup)

+ 7 - 3
server/api/v1/system/sys_email.go → 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 {

+ 11 - 0
server/plugin/email/config/email.go

@@ -0,0 +1,11 @@
+package config
+
+type Email struct {
+	To       string `mapstructure:"to" json:"to" yaml:"to"`                   // 收件人:多个以英文逗号分隔 例:[email protected] [email protected] 正式开发中请把此项目作为参数使用
+	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
+}

+ 5 - 0
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)

+ 37 - 0
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"
+}

+ 7 - 0
server/plugin/email/router/enter.go

@@ -0,0 +1,7 @@
+package router
+
+type RouterGroup struct {
+	EmailRouter
+}
+
+var RouterGroupApp = new(RouterGroup)

+ 18 - 0
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) // 发送测试邮件
+	}
+}

+ 7 - 0
server/plugin/email/service/enter.go

@@ -0,0 +1,7 @@
+package service
+
+type ServiceGroup struct {
+	EmailService
+}
+
+var ServiceGroupApp = new(ServiceGroup)

+ 2 - 2
server/service/system/sys_email.go → 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 {

+ 11 - 11
server/utils/email.go → 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()

+ 28 - 0
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"
+}

+ 0 - 31
server/router/example/plugin.go

@@ -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)
-	}
-}

+ 0 - 1
server/router/system/enter.go

@@ -8,7 +8,6 @@ type RouterGroup struct {
 	CasbinRouter
 	DictionaryRouter
 	DictionaryDetailRouter
-	EmailRouter
 	InitRouter
 	JwtRouter
 	MenuRouter

+ 0 - 18
server/router/system/sys_email.go

@@ -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) // 发送测试邮件
-	}
-}

+ 0 - 1
server/service/system/enter.go

@@ -10,7 +10,6 @@ type ServiceGroup struct {
 	CasbinService
 	DictionaryService
 	DictionaryDetailService
-	EmailService
 	InitDBService
 	MenuService
 	OperationRecordService