优化环境变量及配置

This commit is contained in:
xh
2025-07-27 15:17:38 +08:00
parent c662dac9ca
commit 0305cb7970
18 changed files with 190 additions and 141 deletions

22
server/config/app.go Normal file
View 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,
}

View File

@@ -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
View 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
View 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
View 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:",
}

View File

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

View File

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

View File

@@ -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)
// 运行服务 // 运行服务

View File

@@ -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 {

View File

@@ -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]")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 文件路径处理工具