mirror of
https://gitee.com/xiangheng/x_admin.git
synced 2025-10-18 14:10:52 +08:00
优化环境变量及配置
This commit is contained in:
22
server/config/app.go
Normal file
22
server/config/app.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type appConfig struct {
|
||||||
|
AppName string `mapstructure:"APP_NAME"` // 应用名称
|
||||||
|
Version string `mapstructure:"VERSION"` // 应用版本
|
||||||
|
Secret string `mapstructure:"SECRET"` // 应用系统加密字符
|
||||||
|
Port int `mapstructure:"PORT"` // 应用端口
|
||||||
|
|
||||||
|
OssDomain string `mapstructure:"OSS_DOMAIN"` // OSS域名
|
||||||
|
GinMode string `mapstructure:"GIN_MODE"` // 应用模式: debug,release
|
||||||
|
DisallowModify bool `mapstructure:"DISALLOW_MODIFY"` // 禁止修改操作 (演示功能,限制POST请求)
|
||||||
|
}
|
||||||
|
|
||||||
|
var AppConfig = appConfig{
|
||||||
|
AppName: "x_admin",
|
||||||
|
Version: "1.0.0",
|
||||||
|
Secret: "UVTIyzCy",
|
||||||
|
Port: 8080,
|
||||||
|
GinMode: "",
|
||||||
|
OssDomain: "",
|
||||||
|
DisallowModify: false,
|
||||||
|
}
|
@@ -1,120 +1,75 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Config = loadConfig(".")
|
type config struct {
|
||||||
|
APP *appConfig
|
||||||
// #region envConfig
|
DB *dbConfig
|
||||||
// envConfig 环境配置
|
REDIS *redisConfig
|
||||||
type envConfig struct {
|
FILE *fileConfig
|
||||||
RootPath string // 项目根目录
|
|
||||||
GinMode string `mapstructure:"GIN_MODE"` // gin运行模式
|
|
||||||
|
|
||||||
OssDomain string `mapstructure:"OSS_DOMAIN"` // OSS域名
|
|
||||||
ServerPort int `mapstructure:"SERVER_PORT"` // 服务运行端口
|
|
||||||
DisallowModify bool `mapstructure:"DISALLOW_MODIFY"` // 禁止修改操作 (演示功能,限制POST请求)
|
|
||||||
PublicPrefix string // 资源访问前缀
|
|
||||||
UploadDirectory string `mapstructure:"UPLOAD_DIRECTORY"` // 上传文件路径
|
|
||||||
RedisUrl string `mapstructure:"REDIS_URL"` // Redis源配置
|
|
||||||
// RedisPoolSize int // Redis连接池大小
|
|
||||||
RedisMaxIdleConns int // Redis空闲连接池最大值
|
|
||||||
RedisConnMaxLifetime time.Duration // Redis连接可复用的最大时间(秒:默认60秒)
|
|
||||||
DatabaseUrl string `mapstructure:"DATABASE_URL"` // 数据源配置
|
|
||||||
DbTablePrefix string // Mysql表前缀
|
|
||||||
DbDefaultStringSize uint // 数据库string类型字段的默认长度
|
|
||||||
DbMaxIdleConns int // 数据库空闲连接池最大值
|
|
||||||
DbMaxOpenConns int // 数据库连接池最大值
|
|
||||||
DbConnMaxLifetimeSeconds int16 // 连接可复用的最大时间(秒:默认28800秒),请根据这个sql查处的时间设置: show variables like 'wait_timeout'
|
|
||||||
Version string // 版本
|
|
||||||
Secret string // 系统加密字符
|
|
||||||
|
|
||||||
RedisPrefix string // Redis键前缀
|
|
||||||
UploadImageSize int64 // 上传图片限制
|
|
||||||
UploadVideoSize int64 // 上传视频限制
|
|
||||||
UploadImageExt []string // 上传图片扩展
|
|
||||||
UploadVideoExt []string // 上传视频扩展
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// #endregion envConfig
|
var Config = loadConfig(config{
|
||||||
|
APP: &AppConfig,
|
||||||
|
DB: &DBConfig,
|
||||||
|
REDIS: &RedisConfig,
|
||||||
|
FILE: &FileConfig,
|
||||||
|
})
|
||||||
|
|
||||||
// loadConfig 加载配置
|
func loadConfig(config config) config {
|
||||||
func loadConfig(envPath string) envConfig {
|
var envFilePath string
|
||||||
var cfgPath string
|
// flag.StringVar(&envFilePath, "env", "", "-env config file envPath.")
|
||||||
flag.StringVar(&cfgPath, "c", "", "config file envPath.")
|
// flag.Parse()
|
||||||
flag.Parse()
|
if envFilePath == "" {
|
||||||
if cfgPath == "" {
|
envFilePath = ".env"
|
||||||
viper.AddConfigPath(envPath)
|
|
||||||
viper.SetConfigFile(".env")
|
|
||||||
} else {
|
|
||||||
viper.SetConfigFile(cfgPath)
|
|
||||||
}
|
}
|
||||||
|
viper.AddConfigPath(".")
|
||||||
|
viper.SetConfigFile(envFilePath)
|
||||||
viper.AutomaticEnv()
|
viper.AutomaticEnv()
|
||||||
|
err := viper.ReadInConfig()
|
||||||
rootPath, err := os.Getwd()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Println("rootPath:", rootPath)
|
|
||||||
config := envConfig{
|
|
||||||
RootPath: rootPath,
|
|
||||||
GinMode: "debug",
|
|
||||||
// 服务运行端口
|
|
||||||
ServerPort: 8000,
|
|
||||||
|
|
||||||
OssDomain: "",
|
|
||||||
|
|
||||||
// 禁止修改操作 (演示功能,限制POST请求)
|
|
||||||
DisallowModify: false,
|
|
||||||
// 资源访问前缀
|
|
||||||
PublicPrefix: "/api/uploads",
|
|
||||||
// 上传文件路径
|
|
||||||
UploadDirectory: "/tmp/uploads/x_admin_go/",
|
|
||||||
// Redis源配置
|
|
||||||
RedisUrl: "redis://localhost:6379",
|
|
||||||
// RedisPoolSize: 100,
|
|
||||||
RedisMaxIdleConns: 80,
|
|
||||||
RedisConnMaxLifetime: 60 * time.Second,
|
|
||||||
// 数据源配置
|
|
||||||
DatabaseUrl: "x_admin:x_admin@tcp(localhost:3306)/x_admin?charset=utf8mb4&parseTime=True&loc=Local",
|
|
||||||
DbTablePrefix: "x_",
|
|
||||||
DbDefaultStringSize: 256,
|
|
||||||
DbMaxIdleConns: 10,
|
|
||||||
DbMaxOpenConns: 100,
|
|
||||||
// 连接可复用的最大时间(秒:默认28800秒)
|
|
||||||
DbConnMaxLifetimeSeconds: 28800,
|
|
||||||
// 全局配置
|
|
||||||
// 版本
|
|
||||||
Version: "v1.1.0",
|
|
||||||
// 系统加密字符
|
|
||||||
Secret: "UVTIyzCy",
|
|
||||||
|
|
||||||
// Redis键前缀
|
|
||||||
RedisPrefix: "x:",
|
|
||||||
// 上传图片限制
|
|
||||||
UploadImageSize: 1024 * 1024 * 10,
|
|
||||||
// 上传视频限制
|
|
||||||
UploadVideoSize: 1024 * 1024 * 30,
|
|
||||||
// 上传图片扩展
|
|
||||||
UploadImageExt: []string{"png", "jpg", "jpeg", "gif", "ico", "bmp", "webp", "avif"},
|
|
||||||
// 上传视频扩展
|
|
||||||
UploadVideoExt: []string{"mp4", "mp3", "avi", "flv", "rmvb", "mov"},
|
|
||||||
}
|
|
||||||
err = viper.ReadInConfig()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("loadConfig ReadInConfig err:", err)
|
log.Fatal("loadConfig ReadInConfig err:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = viper.Unmarshal(&config)
|
err = viper.Unmarshal(&config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("loadConfig Unmarshal err:", err)
|
log.Fatal("loadConfig Unmarshal err:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// fmt.Println(Config)
|
||||||
|
fmt.Println("AppConfig:", AppConfig)
|
||||||
|
fmt.Println("DBConfig:", DBConfig)
|
||||||
|
fmt.Println("RedisConfig:", RedisConfig)
|
||||||
|
fmt.Println("FileConfig:", FileConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadConfig 加载配置
|
||||||
|
// func loadConfig(envPath string) envConfig {
|
||||||
|
// var cfgPath string
|
||||||
|
// flag.StringVar(&cfgPath, "c", "", "config file envPath.")
|
||||||
|
// flag.Parse()
|
||||||
|
// if cfgPath == "" {
|
||||||
|
// viper.AddConfigPath(envPath)
|
||||||
|
// viper.SetConfigFile(".env")
|
||||||
|
// } else {
|
||||||
|
// viper.SetConfigFile(cfgPath)
|
||||||
|
// }
|
||||||
|
// viper.AutomaticEnv()
|
||||||
|
// err := viper.ReadInConfig()
|
||||||
|
// if err != nil {
|
||||||
|
// log.Fatal("loadConfig ReadInConfig err:", err)
|
||||||
|
// }
|
||||||
|
// err = viper.Unmarshal(&config)
|
||||||
|
// if err != nil {
|
||||||
|
// log.Fatal("loadConfig Unmarshal err:", err)
|
||||||
|
// }
|
||||||
|
// return config
|
||||||
|
// }
|
||||||
|
26
server/config/db.go
Normal file
26
server/config/db.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type dbConfig struct {
|
||||||
|
Type string `mapstructure:"TYPE"` // 数据库类型:MySQL, PostgreSQL, GaussDB, SQLite, SQLServer, TiDB
|
||||||
|
Dsn string `mapstructure:"DSN"` // 数据库
|
||||||
|
MaxOpenConns int `mapstructure:"MAX_OPEN_CONNS"` // 数据库连接池最大值
|
||||||
|
MaxIdleConns int `mapstructure:"MAX_IDLE_CONNS"` // 数据库空闲连接池最大值
|
||||||
|
ConnMaxLifetimeSeconds int `mapstructure:"CONN_MAX_LIFETIME_SECONDS"` // 连接可复用的最大时间(秒:默认28800秒)
|
||||||
|
TablePrefix string `mapstructure:"TABLE_PREFIX"` // 数据库表前缀
|
||||||
|
SlowThreshold time.Duration `mapstructure:"SLOW_THRESHOLD"` // 数据库慢查询阈值(秒:默认1秒)
|
||||||
|
LogLevel string `mapstructure:"LOG_LEVEL"` // 数据库日志级别
|
||||||
|
DefaultStringSize uint `mapstructure:"DEFAULT_STRING_SIZE"` // 数据库string类型字段的默认长度:256
|
||||||
|
}
|
||||||
|
|
||||||
|
var DBConfig = dbConfig{
|
||||||
|
Type: "mysql",
|
||||||
|
Dsn: "root:123456@tcp(127.0.0.1:3306)/x_admin?charset=utf8mb4&parseTime=True&loc=Local",
|
||||||
|
MaxOpenConns: 100,
|
||||||
|
MaxIdleConns: 10,
|
||||||
|
ConnMaxLifetimeSeconds: 60 * 60 * 24,
|
||||||
|
TablePrefix: "x_",
|
||||||
|
SlowThreshold: 1 * time.Second,
|
||||||
|
LogLevel: "info",
|
||||||
|
}
|
23
server/config/file.go
Normal file
23
server/config/file.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type fileConfig struct {
|
||||||
|
UploadDirectory string `mapstructure:"UPLOAD_DIRECTORY"` // 文件目录
|
||||||
|
PublicPrefix string `mapstructure:"PUBLIC_PREFIX"` // 资源访问前缀
|
||||||
|
UploadImageSize int64 `mapstructure:"UPLOAD_IMAGE_SIZE"` // 上传图片大小限制
|
||||||
|
UploadVideoSize int64 `mapstructure:"UPLOAD_VIDEO_SIZE"` // 上传视频大小限制
|
||||||
|
UploadImageExt []string `mapstructure:"UPLOAD_IMAGE_EXT"` // 上传图片扩展
|
||||||
|
UploadVideoExt []string `mapstructure:"UPLOAD_VIDEO_EXT"` // 上传视频扩展
|
||||||
|
}
|
||||||
|
|
||||||
|
var FileConfig = fileConfig{
|
||||||
|
// 资源访问前缀
|
||||||
|
PublicPrefix: "/api/uploads",
|
||||||
|
// 上传文件路径
|
||||||
|
UploadDirectory: "/tmp/uploads/x_admin_go/",
|
||||||
|
UploadImageSize: 10 * 1024 * 1024,
|
||||||
|
UploadVideoSize: 30 * 1024 * 1024,
|
||||||
|
// 上传图片扩展
|
||||||
|
UploadImageExt: []string{"png", "jpg", "jpeg", "gif", "ico", "bmp", "webp", "avif"},
|
||||||
|
// 上传视频扩展
|
||||||
|
UploadVideoExt: []string{"mp4", "mp3", "avi", "flv", "rmvb", "mov"},
|
||||||
|
}
|
20
server/config/redis.go
Normal file
20
server/config/redis.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type redisConfig struct {
|
||||||
|
Url string `mapstructure:"URL"` // Redis源配置: redis://:@127.0.0.1:6379/0
|
||||||
|
PoolSize int `mapstructure:"POOL_SIZE"` // Redis连接池大小
|
||||||
|
MaxIdleConns int `mapstructure:"MAX_IDLE_CONNS"` // Redis空闲连接池最大值
|
||||||
|
ConnMaxLifetime time.Duration `mapstructure:"CONN_MAX_LIFETIME"` // Redis连接可复用的最大时间(秒:默认60秒)
|
||||||
|
RedisPrefix string `mapstructure:"REDIS_PREFIX"` // Redis键前缀: x:
|
||||||
|
}
|
||||||
|
|
||||||
|
var RedisConfig = redisConfig{
|
||||||
|
Url: "redis://:@127.0.0.1:6379/0",
|
||||||
|
PoolSize: 100,
|
||||||
|
MaxIdleConns: 10,
|
||||||
|
ConnMaxLifetime: 60 * time.Second,
|
||||||
|
// 默认x:
|
||||||
|
RedisPrefix: "x:",
|
||||||
|
}
|
@@ -24,11 +24,14 @@ func initMysql() *gorm.DB {
|
|||||||
slowThreshold := time.Second
|
slowThreshold := time.Second
|
||||||
ignoreRecordNotFoundError := true
|
ignoreRecordNotFoundError := true
|
||||||
logLevel := logger.Warn
|
logLevel := logger.Warn
|
||||||
if config.Config.GinMode == "debug" {
|
if config.DBConfig.LogLevel == "info" {
|
||||||
logLevel = logger.Info
|
logLevel = logger.Info
|
||||||
slowThreshold = 200 * time.Millisecond
|
|
||||||
ignoreRecordNotFoundError = false
|
ignoreRecordNotFoundError = false
|
||||||
}
|
}
|
||||||
|
if config.DBConfig.SlowThreshold > 0 {
|
||||||
|
slowThreshold = config.DBConfig.SlowThreshold
|
||||||
|
}
|
||||||
|
|
||||||
logger := logger.New(
|
logger := logger.New(
|
||||||
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
|
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
|
||||||
logger.Config{
|
logger.Config{
|
||||||
@@ -40,13 +43,13 @@ func initMysql() *gorm.DB {
|
|||||||
)
|
)
|
||||||
// 初始化会话
|
// 初始化会话
|
||||||
db, err := gorm.Open(mysql.New(mysql.Config{
|
db, err := gorm.Open(mysql.New(mysql.Config{
|
||||||
DSN: config.Config.DatabaseUrl, // DSN data source name
|
DSN: config.DBConfig.Dsn, // DSN data source name
|
||||||
DefaultStringSize: config.Config.DbDefaultStringSize, // string 类型字段的默认长度
|
DefaultStringSize: config.DBConfig.DefaultStringSize, // string 类型字段的默认长度
|
||||||
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
|
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
|
||||||
}), &gorm.Config{
|
}), &gorm.Config{
|
||||||
SkipDefaultTransaction: true, // 禁用默认事务
|
SkipDefaultTransaction: true, // 禁用默认事务
|
||||||
NamingStrategy: schema.NamingStrategy{
|
NamingStrategy: schema.NamingStrategy{
|
||||||
TablePrefix: config.Config.DbTablePrefix, // 表名前缀
|
TablePrefix: config.DBConfig.TablePrefix, // 表名前缀
|
||||||
SingularTable: true, // 使用单一表名, eg. `User` => `user`
|
SingularTable: true, // 使用单一表名, eg. `User` => `user`
|
||||||
},
|
},
|
||||||
DisableForeignKeyConstraintWhenMigrating: true, // 禁用自动创建外键约束
|
DisableForeignKeyConstraintWhenMigrating: true, // 禁用自动创建外键约束
|
||||||
@@ -61,11 +64,11 @@ func initMysql() *gorm.DB {
|
|||||||
log.Fatal("initMysql db.DB err:", err)
|
log.Fatal("initMysql db.DB err:", err)
|
||||||
}
|
}
|
||||||
// 数据库空闲连接池最大值
|
// 数据库空闲连接池最大值
|
||||||
sqlDB.SetMaxIdleConns(config.Config.DbMaxIdleConns)
|
sqlDB.SetMaxIdleConns(config.DBConfig.MaxIdleConns)
|
||||||
// 数据库连接池最大值
|
// 数据库连接池最大值
|
||||||
sqlDB.SetMaxOpenConns(config.Config.DbMaxOpenConns)
|
sqlDB.SetMaxOpenConns(config.DBConfig.MaxOpenConns)
|
||||||
// 连接可复用的最大时间
|
// 连接可复用的最大时间
|
||||||
sqlDB.SetConnMaxLifetime(time.Duration(config.Config.DbConnMaxLifetimeSeconds) * time.Second)
|
sqlDB.SetConnMaxLifetime(time.Duration(config.DBConfig.ConnMaxLifetimeSeconds) * time.Second)
|
||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -13,13 +13,13 @@ var Redis = initRedis()
|
|||||||
|
|
||||||
// initRedis 初始化redis客户端
|
// initRedis 初始化redis客户端
|
||||||
func initRedis() *redis.Client {
|
func initRedis() *redis.Client {
|
||||||
opt, err := redis.ParseURL(config.Config.RedisUrl)
|
opt, err := redis.ParseURL(config.RedisConfig.Url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("initRedis redis.ParseURL err: ", err)
|
log.Fatal("initRedis redis.ParseURL err: ", err)
|
||||||
}
|
}
|
||||||
// opt.PoolSize = config.Config.RedisPoolSize
|
// opt.PoolSize = config.Config.RedisPoolSize
|
||||||
opt.MaxIdleConns = config.Config.RedisMaxIdleConns
|
opt.MaxIdleConns = config.RedisConfig.MaxIdleConns
|
||||||
opt.ConnMaxLifetime = config.Config.RedisConnMaxLifetime
|
opt.ConnMaxLifetime = config.RedisConfig.ConnMaxLifetime
|
||||||
|
|
||||||
client := redis.NewClient(opt)
|
client := redis.NewClient(opt)
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||||
|
@@ -27,11 +27,11 @@ var staticFs embed.FS
|
|||||||
// initRouter 初始化router
|
// initRouter 初始化router
|
||||||
func initRouter() *gin.Engine {
|
func initRouter() *gin.Engine {
|
||||||
// 初始化gin
|
// 初始化gin
|
||||||
gin.SetMode(config.Config.GinMode)
|
gin.SetMode(config.AppConfig.GinMode)
|
||||||
r := gin.New()
|
r := gin.New()
|
||||||
r.MaxMultipartMemory = 8 << 20 // 8 MiB
|
r.MaxMultipartMemory = 8 << 20 // 8 MiB
|
||||||
// 设置静态路径
|
// 设置静态路径
|
||||||
r.Static(config.Config.PublicPrefix, config.Config.UploadDirectory)
|
r.Static(config.FileConfig.PublicPrefix, config.FileConfig.UploadDirectory)
|
||||||
|
|
||||||
staticHttpFs := http.FS(staticFs)
|
staticHttpFs := http.FS(staticFs)
|
||||||
r.GET("/api/static/*filepath", func(c *gin.Context) {
|
r.GET("/api/static/*filepath", func(c *gin.Context) {
|
||||||
@@ -44,7 +44,7 @@ func initRouter() *gin.Engine {
|
|||||||
r.Use(gin.Logger(), middleware.Cors(), middleware.ErrorRecover())
|
r.Use(gin.Logger(), middleware.Cors(), middleware.ErrorRecover())
|
||||||
|
|
||||||
// 演示模式
|
// 演示模式
|
||||||
if config.Config.DisallowModify {
|
if config.AppConfig.DisallowModify {
|
||||||
r.Use(middleware.ShowMode())
|
r.Use(middleware.ShowMode())
|
||||||
}
|
}
|
||||||
// 特殊异常处理
|
// 特殊异常处理
|
||||||
@@ -61,7 +61,7 @@ func initRouter() *gin.Engine {
|
|||||||
// initServer 初始化server
|
// initServer 初始化server
|
||||||
func initServer(router *gin.Engine) *http.Server {
|
func initServer(router *gin.Engine) *http.Server {
|
||||||
return &http.Server{
|
return &http.Server{
|
||||||
Addr: ":" + strconv.Itoa(config.Config.ServerPort),
|
Addr: ":" + strconv.Itoa(config.AppConfig.Port),
|
||||||
Handler: router,
|
Handler: router,
|
||||||
ReadTimeout: 10 * time.Second,
|
ReadTimeout: 10 * time.Second,
|
||||||
WriteTimeout: 100 * time.Second,
|
WriteTimeout: 100 * time.Second,
|
||||||
@@ -104,7 +104,7 @@ func main() {
|
|||||||
fmt.Println("格式化文档注释:", "swag fmt")
|
fmt.Println("格式化文档注释:", "swag fmt")
|
||||||
fmt.Println("生成文档:", "swag init")
|
fmt.Println("生成文档:", "swag init")
|
||||||
|
|
||||||
fmt.Printf("文档: http://localhost:%v/swagger/index.html", config.Config.ServerPort)
|
fmt.Printf("文档: http://localhost:%v/swagger/index.html", config.AppConfig.Port)
|
||||||
// 初始化server
|
// 初始化server
|
||||||
s := initServer(router)
|
s := initServer(router)
|
||||||
// 运行服务
|
// 运行服务
|
||||||
|
@@ -109,7 +109,7 @@ func RecordLog(title string, reqTypes ...requestType) gin.HandlerFunc {
|
|||||||
}()
|
}()
|
||||||
// 执行方法
|
// 执行方法
|
||||||
c.Next()
|
c.Next()
|
||||||
if config.Config.GinMode != "release" {
|
if config.AppConfig.GinMode == "debug" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if len(c.Errors) > 0 {
|
if len(c.Errors) > 0 {
|
||||||
|
@@ -61,7 +61,7 @@ func (sd storageDriver) Upload(file *multipart.FileHeader, folder string, fileTy
|
|||||||
func (sd storageDriver) localUpload(file *multipart.FileHeader, key string, folder string) (e error) {
|
func (sd storageDriver) localUpload(file *multipart.FileHeader, key string, folder string) (e error) {
|
||||||
// TODO: 临时方法,后续调整
|
// TODO: 临时方法,后续调整
|
||||||
// 映射目录
|
// 映射目录
|
||||||
directory := config.Config.UploadDirectory
|
directory := config.FileConfig.UploadDirectory
|
||||||
// 打开源文件
|
// 打开源文件
|
||||||
src, err := file.Open()
|
src, err := file.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -113,19 +113,19 @@ func (sd storageDriver) checkFile(file *multipart.FileHeader, fileType int) (e e
|
|||||||
switch fileType {
|
switch fileType {
|
||||||
case 10:
|
case 10:
|
||||||
// 图片文件
|
// 图片文件
|
||||||
if !util.ToolsUtil.Contains(config.Config.UploadImageExt, fileExt) {
|
if !util.ToolsUtil.Contains(config.FileConfig.UploadImageExt, fileExt) {
|
||||||
return response.Failed.SetMessage("不被支持的图片扩展: " + fileExt)
|
return response.Failed.SetMessage("不被支持的图片扩展: " + fileExt)
|
||||||
}
|
}
|
||||||
if fileSize > config.Config.UploadImageSize {
|
if fileSize > config.FileConfig.UploadImageSize {
|
||||||
return response.Failed.SetMessage("上传图片不能超出限制: " + strconv.FormatInt(config.Config.UploadImageSize/1024/1024, 10) + "M")
|
return response.Failed.SetMessage("上传图片不能超出限制: " + strconv.FormatInt(config.FileConfig.UploadImageSize/1024/1024, 10) + "M")
|
||||||
}
|
}
|
||||||
case 20:
|
case 20:
|
||||||
// 视频文件
|
// 视频文件
|
||||||
if !util.ToolsUtil.Contains(config.Config.UploadVideoExt, fileExt) {
|
if !util.ToolsUtil.Contains(config.FileConfig.UploadVideoExt, fileExt) {
|
||||||
return response.Failed.SetMessage("不被支持的视频扩展: " + fileExt)
|
return response.Failed.SetMessage("不被支持的视频扩展: " + fileExt)
|
||||||
}
|
}
|
||||||
if fileSize > config.Config.UploadVideoSize {
|
if fileSize > config.FileConfig.UploadVideoSize {
|
||||||
return response.Failed.SetMessage("上传视频不能超出限制: " + strconv.FormatInt(config.Config.UploadVideoSize/1024/1024, 10) + "M")
|
return response.Failed.SetMessage("上传视频不能超出限制: " + strconv.FormatInt(config.FileConfig.UploadVideoSize/1024/1024, 10) + "M")
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
core.Logger.Errorf("storageDriver.checkFile fileType err: err=[unsupported fileType]")
|
core.Logger.Errorf("storageDriver.checkFile fileType err: err=[unsupported fileType]")
|
||||||
|
@@ -73,7 +73,7 @@ func (albSrv albumService) AlbumList(page request.PageReq, listReq commonSchema.
|
|||||||
engine := "local"
|
engine := "local"
|
||||||
for i := 0; i < len(albumResps); i++ {
|
for i := 0; i < len(albumResps); i++ {
|
||||||
if engine == "local" {
|
if engine == "local" {
|
||||||
albumResps[i].Path = path.Join(config.Config.PublicPrefix, albums[i].Uri)
|
albumResps[i].Path = path.Join(config.FileConfig.PublicPrefix, albums[i].Uri)
|
||||||
} else {
|
} else {
|
||||||
// TODO: 其他engine
|
// TODO: 其他engine
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,7 @@ func (iSrv indexService) Console() (res map[string]interface{}, e error) {
|
|||||||
}
|
}
|
||||||
version := map[string]interface{}{
|
version := map[string]interface{}{
|
||||||
"name": name,
|
"name": name,
|
||||||
"version": config.Config.Version,
|
"version": config.AppConfig.Version,
|
||||||
"website": "x.adtk.cn",
|
"website": "x.adtk.cn",
|
||||||
"based": "Vue3.x、ElementUI、MySQL",
|
"based": "Vue3.x、ElementUI、MySQL",
|
||||||
"channel": map[string]string{
|
"channel": map[string]string{
|
||||||
@@ -94,7 +94,7 @@ func (iSrv indexService) Config() (res map[string]interface{}, e error) {
|
|||||||
"webLogo": util.UrlUtil.ToAbsoluteUrl(website["logo"]),
|
"webLogo": util.UrlUtil.ToAbsoluteUrl(website["logo"]),
|
||||||
"webFavicon": util.UrlUtil.ToAbsoluteUrl(website["favicon"]),
|
"webFavicon": util.UrlUtil.ToAbsoluteUrl(website["favicon"]),
|
||||||
"webBackdrop": util.UrlUtil.ToAbsoluteUrl(website["backdrop"]),
|
"webBackdrop": util.UrlUtil.ToAbsoluteUrl(website["backdrop"]),
|
||||||
"ossDomain": config.Config.OssDomain,
|
"ossDomain": config.AppConfig.OssDomain,
|
||||||
"copyright": copyright,
|
"copyright": copyright,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@@ -273,7 +273,7 @@ func (genSrv generateService) EditTable(editReq generatorSchema.EditTableReq) (e
|
|||||||
}
|
}
|
||||||
convert_util.Copy(&genTable, editReq)
|
convert_util.Copy(&genTable, editReq)
|
||||||
err = genSrv.db.Transaction(func(tx *gorm.DB) error {
|
err = genSrv.db.Transaction(func(tx *gorm.DB) error {
|
||||||
genTable.SubTableName = strings.Replace(editReq.SubTableName, config.Config.DbTablePrefix, "", 1)
|
genTable.SubTableName = strings.Replace(editReq.SubTableName, config.DBConfig.TablePrefix, "", 1)
|
||||||
txErr := tx.Save(&genTable).Error
|
txErr := tx.Save(&genTable).Error
|
||||||
if te := response.CheckErr(txErr, "更新失败"); te != nil {
|
if te := response.CheckErr(txErr, "更新失败"); te != nil {
|
||||||
return te
|
return te
|
||||||
|
@@ -170,13 +170,13 @@ func (gu genUtil) InitColumn(tableId uint, column gen_model.GenTableColumn) gen_
|
|||||||
|
|
||||||
// ToModuleName 表名转业务名
|
// ToModuleName 表名转业务名
|
||||||
func (gu genUtil) ToModuleName(name string) string {
|
func (gu genUtil) ToModuleName(name string) string {
|
||||||
names := strings.Split(name, config.Config.DbTablePrefix)
|
names := strings.Split(name, config.DBConfig.TablePrefix)
|
||||||
return names[len(names)-1]
|
return names[len(names)-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToClassName 表名转类名
|
// ToClassName 表名转类名
|
||||||
func (gu genUtil) ToClassName(name string) string {
|
func (gu genUtil) ToClassName(name string) string {
|
||||||
tablePrefix := config.Config.DbTablePrefix
|
tablePrefix := config.DBConfig.TablePrefix
|
||||||
name = strings.TrimPrefix(name, tablePrefix)
|
name = strings.TrimPrefix(name, tablePrefix)
|
||||||
|
|
||||||
return util.StringUtil.ToCamelCase(name)
|
return util.StringUtil.ToCamelCase(name)
|
||||||
|
@@ -75,7 +75,7 @@ func (ru redisUtil) DBSize() int64 {
|
|||||||
// Set 设置键值对
|
// Set 设置键值对
|
||||||
func (ru redisUtil) Set(key string, value interface{}, timeSec int) bool {
|
func (ru redisUtil) Set(key string, value interface{}, timeSec int) bool {
|
||||||
err := ru.redis.Set(context.Background(),
|
err := ru.redis.Set(context.Background(),
|
||||||
config.Config.RedisPrefix+key, value, time.Duration(timeSec)*time.Second).Err()
|
config.RedisConfig.RedisPrefix+key, value, time.Duration(timeSec)*time.Second).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.Set err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.Set err: err=[%+v]", err)
|
||||||
return false
|
return false
|
||||||
@@ -85,7 +85,7 @@ func (ru redisUtil) Set(key string, value interface{}, timeSec int) bool {
|
|||||||
|
|
||||||
// Get 获取key的值
|
// Get 获取key的值
|
||||||
func (ru redisUtil) Get(key string) string {
|
func (ru redisUtil) Get(key string) string {
|
||||||
res, err := ru.redis.Get(context.Background(), config.Config.RedisPrefix+key).Result()
|
res, err := ru.redis.Get(context.Background(), config.RedisConfig.RedisPrefix+key).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.Get err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.Get err: err=[%+v]", err)
|
||||||
return ""
|
return ""
|
||||||
@@ -95,7 +95,7 @@ func (ru redisUtil) Get(key string) string {
|
|||||||
|
|
||||||
// SSet 将数据放入set缓存
|
// SSet 将数据放入set缓存
|
||||||
func (ru redisUtil) SSet(key string, values ...interface{}) bool {
|
func (ru redisUtil) SSet(key string, values ...interface{}) bool {
|
||||||
err := ru.redis.SAdd(context.Background(), config.Config.RedisPrefix+key, values...).Err()
|
err := ru.redis.SAdd(context.Background(), config.RedisConfig.RedisPrefix+key, values...).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.SSet err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.SSet err: err=[%+v]", err)
|
||||||
return false
|
return false
|
||||||
@@ -105,7 +105,7 @@ func (ru redisUtil) SSet(key string, values ...interface{}) bool {
|
|||||||
|
|
||||||
// SGet 根据key获取Set中的所有值
|
// SGet 根据key获取Set中的所有值
|
||||||
func (ru redisUtil) SGet(key string) []string {
|
func (ru redisUtil) SGet(key string) []string {
|
||||||
res, err := ru.redis.SMembers(context.Background(), config.Config.RedisPrefix+key).Result()
|
res, err := ru.redis.SMembers(context.Background(), config.RedisConfig.RedisPrefix+key).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.SGet err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.SGet err: err=[%+v]", err)
|
||||||
return []string{}
|
return []string{}
|
||||||
@@ -115,7 +115,7 @@ func (ru redisUtil) SGet(key string) []string {
|
|||||||
|
|
||||||
// HMSet 设置key, 通过字典的方式设置多个field, value对
|
// HMSet 设置key, 通过字典的方式设置多个field, value对
|
||||||
func (ru redisUtil) HMSet(key string, mapping map[string]string, timeSec int) bool {
|
func (ru redisUtil) HMSet(key string, mapping map[string]string, timeSec int) bool {
|
||||||
err := ru.redis.HSet(context.Background(), config.Config.RedisPrefix+key, mapping).Err()
|
err := ru.redis.HSet(context.Background(), config.RedisConfig.RedisPrefix+key, mapping).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.HMSet err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.HMSet err: err=[%+v]", err)
|
||||||
return false
|
return false
|
||||||
@@ -135,7 +135,7 @@ func (ru redisUtil) HSet(key string, field string, value string, timeSec int) bo
|
|||||||
|
|
||||||
// HGet 获取key中field域的值
|
// HGet 获取key中field域的值
|
||||||
func (ru redisUtil) HGet(key string, field string) string {
|
func (ru redisUtil) HGet(key string, field string) string {
|
||||||
res, err := ru.redis.HGet(context.Background(), config.Config.RedisPrefix+key, field).Result()
|
res, err := ru.redis.HGet(context.Background(), config.RedisConfig.RedisPrefix+key, field).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.HGet err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.HGet err: err=[%+v]", err)
|
||||||
return ""
|
return ""
|
||||||
@@ -145,7 +145,7 @@ func (ru redisUtil) HGet(key string, field string) string {
|
|||||||
|
|
||||||
// HExists 判断key中有没有field域名
|
// HExists 判断key中有没有field域名
|
||||||
func (ru redisUtil) HExists(key string, field string) bool {
|
func (ru redisUtil) HExists(key string, field string) bool {
|
||||||
res, err := ru.redis.HExists(context.Background(), config.Config.RedisPrefix+key, field).Result()
|
res, err := ru.redis.HExists(context.Background(), config.RedisConfig.RedisPrefix+key, field).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.HExists err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.HExists err: err=[%+v]", err)
|
||||||
return false
|
return false
|
||||||
@@ -155,7 +155,7 @@ func (ru redisUtil) HExists(key string, field string) bool {
|
|||||||
|
|
||||||
// HDel 删除hash表中的值
|
// HDel 删除hash表中的值
|
||||||
func (ru redisUtil) HDel(key string, fields ...string) bool {
|
func (ru redisUtil) HDel(key string, fields ...string) bool {
|
||||||
err := ru.redis.HDel(context.Background(), config.Config.RedisPrefix+key, fields...).Err()
|
err := ru.redis.HDel(context.Background(), config.RedisConfig.RedisPrefix+key, fields...).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.HDel err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.HDel err: err=[%+v]", err)
|
||||||
return false
|
return false
|
||||||
@@ -176,7 +176,7 @@ func (ru redisUtil) Exists(keys ...string) int64 {
|
|||||||
|
|
||||||
// Expire 指定缓存失效时间
|
// Expire 指定缓存失效时间
|
||||||
func (ru redisUtil) Expire(key string, timeSec int) bool {
|
func (ru redisUtil) Expire(key string, timeSec int) bool {
|
||||||
err := ru.redis.Expire(context.Background(), config.Config.RedisPrefix+key, time.Duration(timeSec)*time.Second).Err()
|
err := ru.redis.Expire(context.Background(), config.RedisConfig.RedisPrefix+key, time.Duration(timeSec)*time.Second).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.Expire err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.Expire err: err=[%+v]", err)
|
||||||
return false
|
return false
|
||||||
@@ -186,7 +186,7 @@ func (ru redisUtil) Expire(key string, timeSec int) bool {
|
|||||||
|
|
||||||
// TTL 根据key获取过期时间
|
// TTL 根据key获取过期时间
|
||||||
func (ru redisUtil) TTL(key string) int {
|
func (ru redisUtil) TTL(key string) int {
|
||||||
td, err := ru.redis.TTL(context.Background(), config.Config.RedisPrefix+key).Result()
|
td, err := ru.redis.TTL(context.Background(), config.RedisConfig.RedisPrefix+key).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger.Errorf("redisUtil.TTL err: err=[%+v]", err)
|
core.Logger.Errorf("redisUtil.TTL err: err=[%+v]", err)
|
||||||
return 0
|
return 0
|
||||||
@@ -208,7 +208,7 @@ func (ru redisUtil) Del(keys ...string) bool {
|
|||||||
// toFullKeys 为keys批量增加前缀
|
// toFullKeys 为keys批量增加前缀
|
||||||
func (ru redisUtil) toFullKeys(keys []string) (fullKeys []string) {
|
func (ru redisUtil) toFullKeys(keys []string) (fullKeys []string) {
|
||||||
for _, k := range keys {
|
for _, k := range keys {
|
||||||
fullKeys = append(fullKeys, config.Config.RedisPrefix+k)
|
fullKeys = append(fullKeys, config.RedisConfig.RedisPrefix+k)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,6 @@ func TestCheckSafeString(t *testing.T) {
|
|||||||
}
|
}
|
||||||
// 测试包含特殊字符的字符串
|
// 测试包含特殊字符的字符串
|
||||||
if !StringUtil.CheckSafeString("abc123!") {
|
if !StringUtil.CheckSafeString("abc123!") {
|
||||||
t.Log("包含特殊字符的字符串")
|
t.Errorf("CheckSafeString failed, input: %s", "abc123!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -49,7 +49,7 @@ func (tu toolsUtil) MakeMd5(data string) string {
|
|||||||
func (tu toolsUtil) MakeToken() string {
|
func (tu toolsUtil) MakeToken() string {
|
||||||
ms := time.Now().UnixMilli()
|
ms := time.Now().UnixMilli()
|
||||||
token := tu.MakeMd5(tu.MakeUuid() + strconv.FormatInt(ms, 10) + tu.RandomString(8))
|
token := tu.MakeMd5(tu.MakeUuid() + strconv.FormatInt(ms, 10) + tu.RandomString(8))
|
||||||
tokenSecret := token + config.Config.Secret
|
tokenSecret := token + config.AppConfig.Secret
|
||||||
return tu.MakeMd5(tokenSecret) + tu.RandomString(6)
|
return tu.MakeMd5(tokenSecret) + tu.RandomString(6)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@ import (
|
|||||||
var (
|
var (
|
||||||
UrlUtil = urlUtil{}
|
UrlUtil = urlUtil{}
|
||||||
|
|
||||||
publicPrefix = config.Config.PublicPrefix //"/api/uploads"
|
publicPrefix = config.FileConfig.PublicPrefix //"/api/uploads"
|
||||||
)
|
)
|
||||||
|
|
||||||
// urlUtil 文件路径处理工具
|
// urlUtil 文件路径处理工具
|
||||||
|
Reference in New Issue
Block a user