Refine some structs and handle cycle import

This commit is contained in:
Granty1
2020-04-05 09:18:25 +08:00
parent 6db275ca39
commit 1891c1bcbc
15 changed files with 146 additions and 293 deletions
-103
View File
@@ -1,103 +0,0 @@
package init
import (
"fmt"
"gin-vue-admin/global"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
type Config struct {
MysqlAdmin MysqlAdmin `json:"mysqlAdmin"`
Qiniu Qiniu `json:"qiniu"`
CasbinConfig CasbinConfig `json:"casbinConfig"`
RedisAdmin RedisAdmin `json:"redisAdmin"`
System System `json:"system"`
JWT JWT `json:"jwt"`
Captcha Captcha `json:"captcha"`
Log Log `json:"log"`
}
type System struct { // 系统配置
UseMultipoint bool `json:"useMultipoint"`
Env string `json:"env"`
Addr int `json:"addr"`
}
type JWT struct { // jwt签名
SigningKey string `json:"signingKey"`
}
type CasbinConfig struct { //casbin配置
ModelPath string `json:"modelPath"` // casbin model地址配置
}
type MysqlAdmin struct { // mysql admin 数据库配置
Username string `json:"username"`
Password string `json:"password"`
Path string `json:"path"`
Dbname string `json:"dbname"`
Config string `json:"config"`
MaxIdleConns int `json:"maxIdleConns"`
MaxOpenConns int `json:"maxOpenConns"`
LogMode bool `json:"maxOpenConns"`
}
type RedisAdmin struct { // Redis admin 数据库配置
Addr string `json:"addr"`
Password string `json:"password"`
DB int `json:"db"`
}
type Qiniu struct { // 七牛 密钥配置
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
}
type Captcha struct { // 验证码配置
KeyLong int `json:"keyLong"`
ImgWidth int `json:"imgWidth"`
ImgHeight int `json:"imgHeight"`
}
/**
Log Config
"CRITICAL"
"ERROR"
"WARNING"
"NOTICE"
"INFO"
"DEBUG"
*/
type Log struct {
// log 打印的前缀
Prefix string `json:"prefix"`
// 是否显示打印log的文件具体路径
LogFile bool `json:"logFile"`
// 在控制台打印log的级别, []默认不打印
Stdout []string `json:"stdout"`
// 在文件中打印log的级别 []默认不打印
File []string `json:"file"`
}
func init() {
v := viper.New()
v.SetConfigName("config") // 设置配置文件名 (不带后缀)
v.AddConfigPath("/") // 第一个搜索路径
v.SetConfigType("json")
err := v.ReadInConfig() // 搜索路径,并读取配置数据
if err != nil {
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file changed:", e.Name)
if err := v.Unmarshal(&global.GVA_CONFIG); err != nil {
fmt.Println(err)
}
})
if err := v.Unmarshal(&global.GVA_CONFIG); err != nil {
fmt.Println(err)
}
global.GVA_VP = v
}
@@ -1,12 +1,13 @@
package init
import (
"gin-vue-admin/global"
"gin-vue-admin/model"
"github.com/jinzhu/gorm"
)
//注册数据库表专用
func RegisterTable(db *gorm.DB) {
func DBTables() {
db := global.GVA_DB
db.AutoMigrate(model.SysUser{},
model.SysAuthority{},
model.SysMenu{},
@@ -20,5 +21,5 @@ func RegisterTable(db *gorm.DB) {
model.ExaFileChunk{},
model.ExaCustomer{},
)
L.Debug("register table success")
global.GVA_LOG.Debug("register table success")
}
-17
View File
@@ -1,17 +0,0 @@
package init
// Custom Logger
type Logger interface {
Debug(v ...interface{})
Info(v ...interface{})
Warning(v ...interface{})
Error(v ...interface{})
Critical(v ...interface{})
Fatal(v ...interface{})
}
var L Logger
func SetLogger(logger Logger) {
L = logger
}
+3 -2
View File
@@ -7,9 +7,10 @@ import (
)
//初始化数据库并产生数据库全局变量
func RegisterMysql(admin MysqlAdmin) {
func Mysql() {
admin := global.GVA_CONFIG.MysqlAdmin
if db, err := gorm.Open("mysql", admin.Username+":"+admin.Password+"@("+admin.Path+")/"+admin.Dbname+"?"+admin.Config); err != nil {
L.Error("DEFAULTDB数据库启动异常", err)
global.GVA_LOG.Error("DEFAULTDB数据库启动异常", err)
} else {
global.GVA_DB = db
global.GVA_DB.DB().SetMaxIdleConns(admin.MaxIdleConns)
-144
View File
@@ -1,144 +0,0 @@
package qmlog
// Register logger
import (
"errors"
"fmt"
"gin-vue-admin/init"
"gin-vue-admin/utils"
rotatelogs "github.com/lestrrat/go-file-rotatelogs"
oplogging "github.com/op/go-logging"
"io"
"os"
"strings"
"time"
)
const (
logDir = "log"
logSoftLink = "api.log"
module = "gin-vue-admin"
)
var (
configNotFound = errors.New("logger prefix not found")
defaultFormatter = `%{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
)
type Logger struct {
logger *oplogging.Logger
}
func NewLogger() error {
c := init.GinVueAdminconfig.Log
if c.Prefix == "" {
return configNotFound
}
logger := oplogging.MustGetLogger(module)
var backends []oplogging.Backend
backends = registerStdout(c, backends)
backends = registerFile(c, backends)
oplogging.SetBackend(backends...)
init.SetLogger(logger)
return nil
}
func registerStdout(c init.Log, backends []oplogging.Backend) []oplogging.Backend {
for _, v := range c.Stdout {
level, err := oplogging.LogLevel(v)
if err != nil {
fmt.Println(err)
continue
}
backends = append(backends, createBackend(os.Stdout, c, level))
}
return backends
}
func registerFile(c init.Log, backends []oplogging.Backend) []oplogging.Backend {
if len(c.File) > 0 {
if ok, _ := utils.PathExists(logDir); !ok {
// directory not exist
fmt.Println("create log directory")
_ = os.Mkdir(logDir, os.ModePerm)
}
apiLogPath := logDir + string(os.PathSeparator) + logSoftLink
fileWriter, err := rotatelogs.New(
apiLogPath+".%Y-%m-%d-%H-%M.log",
// generate soft link, point to latest log file
rotatelogs.WithLinkName(apiLogPath),
// maximum time to save log files
rotatelogs.WithMaxAge(7*24*time.Hour),
// time period of log file switching
rotatelogs.WithRotationTime(24*time.Hour),
)
if err != nil {
fmt.Println(err)
return backends
}
for _, v := range c.File {
level, err := oplogging.LogLevel(v)
if err != nil {
fmt.Println(err)
continue
}
backends = append(backends, createBackend(fileWriter, c, level))
}
}
return backends
}
func createBackend(w io.Writer, c init.Log, level oplogging.Level) oplogging.Backend {
backend := oplogging.NewLogBackend(w, c.Prefix, 0)
stdoutWriter := false
if w == os.Stdout {
stdoutWriter = true
}
format := getLogFormatter(c, stdoutWriter)
backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
backendLeveled.SetLevel(level, module)
return backendLeveled
}
func getLogFormatter(c init.Log, stdoutWriter bool) oplogging.Formatter {
pattern := defaultFormatter
if !stdoutWriter {
// Color is only required for console output
// Other writers don't need %{color} tag
pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
}
if !c.LogFile {
// Remove %{logfile} tag
pattern = strings.Replace(pattern, "%{longfile}", "", -1)
}
return oplogging.MustStringFormatter(pattern)
}
func (l Logger) Debug(v ...interface{}) {
l.logger.Debug(v)
}
func (l Logger) Info(v ...interface{}) {
l.logger.Info(v)
}
func (l Logger) Warning(v ...interface{}) {
l.logger.Warning(v)
}
func (l Logger) Error(v ...interface{}) {
l.logger.Error(v)
}
func (l Logger) Critical(v ...interface{}) {
l.logger.Critical(v)
}
func (l Logger) Fatal(v ...interface{}) {
l.logger.Fatal(v)
}
+7 -6
View File
@@ -5,17 +5,18 @@ import (
"github.com/go-redis/redis"
)
func RegisterRedis() {
func Redis() {
redisCfg := global.GVA_CONFIG.RedisAdmin
client := redis.NewClient(&redis.Options{
Addr: GinVueAdminconfig.RedisAdmin.Addr,
Password: GinVueAdminconfig.RedisAdmin.Password, // no password set
DB: GinVueAdminconfig.RedisAdmin.DB, // use default DB
Addr: redisCfg.Addr,
Password: redisCfg.Password, // no password set
DB: redisCfg.DB, // use default DB
})
pong, err := client.Ping().Result()
if err != nil {
L.Error(err)
global.GVA_LOG.Error(err)
} else {
L.Info("redis connect ping response:", pong)
global.GVA_LOG.Info("redis connect ping response:", pong)
global.GVA_REDIS = client
}
}
+5 -6
View File
@@ -2,6 +2,7 @@ package init
import (
_ "gin-vue-admin/docs"
"gin-vue-admin/global"
"gin-vue-admin/middleware"
"gin-vue-admin/router"
"github.com/gin-gonic/gin"
@@ -10,18 +11,16 @@ import (
)
//初始化总路由
func RegisterRouter() *gin.Engine {
func Routers() *gin.Engine {
var Router = gin.Default()
//Router.Use(middleware.LoadTls()) // 打开就能玩https了
// 如果不需要日志 请关闭这里
Router.Use(middleware.Logger())
L.Debug("use middleware logger")
global.GVA_LOG.Debug("use middleware logger")
// 跨域
Router.Use(middleware.Cors())
L.Debug("use middleware cors")
global.GVA_LOG.Debug("use middleware cors")
Router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
L.Debug("register swagger handler")
global.GVA_LOG.Debug("register swagger handler")
// 方便统一添加路由组前缀 多服务器上线使用
ApiGroup := Router.Group("")
router.InitUserRouter(ApiGroup) // 注册用户路由