Compare commits

..

7 Commits

Author SHA1 Message Date
ayflying
4741a0bd93 增加file驱动 2025-05-22 18:11:26 +08:00
ayflying
f22c9df605 分离websocket模块 2025-05-20 10:43:10 +08:00
ayflying
82cffdfe29 没有配置数据库,不执行计划任务,预防报错 2025-05-19 11:31:39 +08:00
ayflying
9da1a3bf25 读取配置有问题 2025-05-14 17:52:41 +08:00
ayflying
2cb005e8ed 未读取到配置报错提示 2025-05-14 16:41:53 +08:00
ayflying
374fdac477 进行主机查找配置文件,最高5级目录 2025-05-14 16:22:07 +08:00
ayflying
595ababfde 更新路径拼接 2025-05-14 16:17:00 +08:00
11 changed files with 237 additions and 85 deletions

View File

@@ -27,26 +27,26 @@ type Cfg struct {
// Deprecated : pkg.Config().GetDbFile(name) // Deprecated : pkg.Config().GetDbFile(name)
func (c *Cfg) GetDbFile(name string) (res *g.Var, err error) { func (c *Cfg) GetDbFile(name string) (res *g.Var, err error) {
pkg.Config().GetDbFile(name) res, err = pkg.Config().GetDbFile(name)
return return
} }
// Deprecated : pkg.Config().GetFile(name, obj...) // Deprecated : pkg.Config().GetFile(name, obj...)
func (c *Cfg) GetFile(filename string, obj ...Load) (jsonObj *gjson.Json, err error) { func (c *Cfg) GetFile(filename string, obj ...Load) (jsonObj *gjson.Json, err error) {
pkg.Config().GetFile(filename) jsonObj, err = pkg.Config().GetFile(filename)
return return
} }
// getUrlFile 获取远程配置 // getUrlFile 获取远程配置
// Deprecated : pkg.Config().GetUrlFile(name) // Deprecated : pkg.Config().GetUrlFile(name)
func (c *Cfg) GetUrlFile(name string) (jsonObj *gjson.Json, err error) { func (c *Cfg) GetUrlFile(name string) (jsonObj *gjson.Json, err error) {
pkg.Config().GetUrlFile(name) jsonObj, err = pkg.Config().GetUrlFile(name)
return return
} }
// Deprecated : pkg.Config().GetApollo(name, obj) // Deprecated : pkg.Config().GetApollo(name, obj)
func (c *Cfg) GetApollo(name string, obj Load) (jsonObj *gjson.Json, err error) { func (c *Cfg) GetApollo(name string, obj Load) (jsonObj *gjson.Json, err error) {
pkg.Config().GetApollo(name, obj) jsonObj, err = pkg.Config().GetApollo(name, obj)
return return
} }

4
go.mod
View File

@@ -4,7 +4,7 @@ go 1.24.0
require ( require (
github.com/apolloconfig/agollo/v4 v4.4.0 github.com/apolloconfig/agollo/v4 v4.4.0
github.com/ayflying/excel2json v1.1.7 github.com/ayflying/excel2json v1.1.8
github.com/elastic/go-elasticsearch/v8 v8.18.0 github.com/elastic/go-elasticsearch/v8 v8.18.0
github.com/go-pay/crypto v0.0.1 github.com/go-pay/crypto v0.0.1
github.com/go-pay/gopay v1.5.109 github.com/go-pay/gopay v1.5.109
@@ -12,7 +12,6 @@ require (
github.com/goccy/go-json v0.10.5 github.com/goccy/go-json v0.10.5
github.com/gogf/gf/contrib/config/apollo/v2 v2.9.0 github.com/gogf/gf/contrib/config/apollo/v2 v2.9.0
github.com/gogf/gf/v2 v2.9.0 github.com/gogf/gf/v2 v2.9.0
github.com/gorilla/websocket v1.5.3
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20241220152942-06eb5c6e8230 github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20241220152942-06eb5c6e8230
github.com/minio/minio-go/v7 v7.0.91 github.com/minio/minio-go/v7 v7.0.91
github.com/prometheus/client_golang v1.22.0 github.com/prometheus/client_golang v1.22.0
@@ -45,6 +44,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect github.com/golang/protobuf v1.5.4 // indirect
github.com/google/uuid v1.6.0 // indirect github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/gax-go/v2 v2.0.5 // indirect github.com/googleapis/gax-go/v2 v2.0.5 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/compress v1.18.0 // indirect

1
go.sum
View File

@@ -52,6 +52,7 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/ayflying/excel2json v1.1.7 h1:gp4Ls6hNXd1EuT2MEiDQ6yPLaSKIFWkGyaNajMTc59c= github.com/ayflying/excel2json v1.1.7 h1:gp4Ls6hNXd1EuT2MEiDQ6yPLaSKIFWkGyaNajMTc59c=
github.com/ayflying/excel2json v1.1.7/go.mod h1:GjXYP2cDzeTgQxssQ3ba8QRa9JsScAeJMwCrZ7QTlQo= github.com/ayflying/excel2json v1.1.7/go.mod h1:GjXYP2cDzeTgQxssQ3ba8QRa9JsScAeJMwCrZ7QTlQo=
github.com/ayflying/excel2json v1.1.8/go.mod h1:GjXYP2cDzeTgQxssQ3ba8QRa9JsScAeJMwCrZ7QTlQo=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=

View File

@@ -136,6 +136,10 @@ func (s *sSystemCron) AddCronV2(typ v1.CronType, _func func(context.Context) err
// @receiver s // @receiver s
// @return err // @return err
func (s *sSystemCron) StartCron() (err error) { func (s *sSystemCron) StartCron() (err error) {
//如果没有数据库配置,跳过计划任务执行
if g.Cfg().MustGet(gctx.New(), "database") == nil {
return
}
//预防重复启动 //预防重复启动
if startTime != nil { if startTime != nil {
return return

5
modules/websocket/go.mod Normal file
View File

@@ -0,0 +1,5 @@
module github.com/ayflying/utility_go/modules/websocket
go 1.24.0
require github.com/ayflying/utility_go v1.2.26

2
modules/websocket/go.sum Normal file
View File

@@ -0,0 +1,2 @@
github.com/ayflying/utility_go v1.2.26/go.mod h1:y6qwRUmYk73cH/dTRSzj2mnaQdtrAfFNH4wRFewxlIc=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=

View File

@@ -3,120 +3,251 @@ package drive
import ( import (
"context" "context"
"github.com/gogf/gf/v2/container/gvar" "github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gconv"
"path" "path"
"strconv"
"strings" "strings"
"sync"
"time" "time"
) )
var (
fileIndex = "index.txt"
)
type FileIndex struct {
File string `json:"file"`
Duration time.Duration `json:"duration"`
}
type FileData struct {
Data interface{} `json:"data"`
Time int64 `json:"time"`
}
type AdapterFile struct { type AdapterFile struct {
FilePath string FilePath string
Lock sync.Mutex
} }
func (a AdapterFile) Set(ctx context.Context, key interface{}, value interface{}, duration time.Duration) error { func (a *AdapterFile) Key2Name(key interface{}) string {
arr := strings.Split(":", gconv.String(key)) md5Str, _ := gmd5.Encrypt(key)
fileName := path.Join(arr...) fileName := path.Join(md5Str[0:2], md5Str[2:4], md5Str[4:6], md5Str[16:])
return gfile.PutBytes(fileName, gconv.Bytes(value)) fileNameAll := path.Join(a.FilePath, fileName)
return fileNameAll
} }
func (a AdapterFile) SetMap(ctx context.Context, data map[interface{}]interface{}, duration time.Duration) error { func (a *AdapterFile) AddIndex(FileName interface{}, duration time.Duration) {
var isEdit bool
var setTime int64
if duration == 0 {
setTime = 0
} else {
setTime = gtime.Now().Add(duration).Unix()
}
saveArr := []string{
gconv.String(FileName),
strconv.FormatInt(setTime, 10),
}
saveStr := strings.Join(saveArr, "|")
gfile.ReadLines(fileIndex, func(text string) (err error) {
arr := strings.Split(text, "|")
if arr[0] == FileName {
isEdit = true
gfile.ReplaceFile(text, saveStr, fileIndex)
return
}
return
})
if isEdit {
return
}
gfile.PutContentsAppend(fileIndex, saveStr+"\n")
}
func (a *AdapterFile) DelIndex(FileName interface{}) {
//var save bool
gfile.ReadLines(fileIndex, func(text string) (err error) {
arr := strings.Split(text, "|")
if arr[0] == FileName {
//save = true
err = gfile.ReplaceFile(text, "", fileIndex)
return
}
return
})
}
func (a *AdapterFile) Set(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (err error) {
fileNameAll := a.Key2Name(key)
var send = &FileData{
Data: value,
Time: gtime.Now().Add(duration).Unix(),
}
err = gfile.PutBytes(fileNameAll, gjson.MustEncode(send))
if err != nil {
return
}
a.AddIndex(key, duration)
return
}
func (a *AdapterFile) SetMap(ctx context.Context, data map[interface{}]interface{}, duration time.Duration) (err error) {
for k, v := range data {
//fileNameAll := a.Key2Name(k)
//var send = &FileData{
// Data: v,
// Time: gtime.Now().Add(duration).Unix(),
//}
//
//err = gfile.PutBytes(fileNameAll, gconv.Bytes(send))
a.Set(ctx, k, v, duration)
}
return
}
func (a *AdapterFile) SetIfNotExist(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (ok bool, err error) {
err = a.Set(ctx, key, value, duration)
return
}
func (a *AdapterFile) SetIfNotExistFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) {
//TODO implement me //TODO implement me
panic("implement me") panic("implement me")
} }
func (a AdapterFile) SetIfNotExist(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (ok bool, err error) { func (a *AdapterFile) SetIfNotExistFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) {
//TODO implement me //TODO implement me
panic("implement me") panic("implement me")
} }
func (a AdapterFile) SetIfNotExistFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { func (a *AdapterFile) Get(ctx context.Context, key interface{}) (res *gvar.Var, err error) {
var data *FileData
name := a.Key2Name(key)
if !gfile.IsFile(name) {
return
}
file := gfile.GetBytes(name)
gjson.DecodeTo(file, &data)
if data.Time < time.Now().Unix() {
a.Remove(ctx, key)
return
}
res = gvar.New(data.Data)
return
}
func (a *AdapterFile) GetOrSet(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (result *gvar.Var, err error) {
a.Set(ctx, key, value, duration)
result, err = a.Get(ctx, key)
return
}
func (a *AdapterFile) GetOrSetFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) {
value := f
a.Set(ctx, key, value, duration)
result, err = a.Get(ctx, key)
return
}
func (a *AdapterFile) GetOrSetFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) {
a.Lock.Lock()
defer a.Lock.Unlock()
result, err = a.GetOrSetFunc(ctx, key, f, duration)
return
}
func (a *AdapterFile) Contains(ctx context.Context, key interface{}) (bool, error) {
return gfile.IsFile(a.FilePath), nil
}
func (a *AdapterFile) Size(ctx context.Context) (size int, err error) {
size = int(gfile.Size(a.FilePath))
return
}
func (a *AdapterFile) Data(ctx context.Context) (data map[interface{}]interface{}, err error) {
//TODO implement me //TODO implement me
panic("implement me") panic("implement me")
} }
func (a AdapterFile) SetIfNotExistFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { func (a *AdapterFile) Keys(ctx context.Context) (keys []interface{}, err error) {
gfile.ReadLines(fileIndex, func(text string) (err error) {
return
})
return
}
func (a *AdapterFile) Values(ctx context.Context) (values []interface{}, err error) {
//TODO implement me //TODO implement me
panic("implement me") panic("implement me")
} }
func (a AdapterFile) Get(ctx context.Context, key interface{}) (*gvar.Var, error) { func (a *AdapterFile) Update(ctx context.Context, key interface{}, value interface{}) (oldValue *gvar.Var, exist bool, err error) {
fileNameAll := a.Key2Name(key)
getFile := gfile.GetBytes(fileNameAll)
var data *FileData
gconv.Scan(getFile, &data)
oldValue.Set(data.Data)
var send = &FileData{
Data: value,
Time: data.Time,
}
err = gfile.PutBytes(fileNameAll, gconv.Bytes(send))
if err != nil {
return
}
a.AddIndex(key, time.Duration(data.Time-gtime.Now().Unix()))
return
}
func (a *AdapterFile) UpdateExpire(ctx context.Context, key interface{}, duration time.Duration) (oldDuration time.Duration, err error) {
//TODO implement me //TODO implement me
panic("implement me") panic("implement me")
} }
func (a AdapterFile) GetOrSet(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (result *gvar.Var, err error) { func (a *AdapterFile) GetExpire(ctx context.Context, key interface{}) (time.Duration, error) {
//TODO implement me //TODO implement me
panic("implement me") panic("implement me")
} }
func (a AdapterFile) GetOrSetFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { func (a *AdapterFile) Remove(ctx context.Context, keys ...interface{}) (lastValue *gvar.Var, err error) {
//TODO implement me for _, v := range keys {
panic("implement me") fileNameAll := a.Key2Name(v)
lastValue, err = a.Get(ctx, fileNameAll)
err = gfile.RemoveFile(fileNameAll)
//删除索引文件
a.DelIndex(v)
}
return nil, nil
} }
func (a AdapterFile) GetOrSetFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { func (a *AdapterFile) Clear(ctx context.Context) error {
//TODO implement me return gfile.RemoveAll(a.FilePath)
panic("implement me")
} }
func (a AdapterFile) Contains(ctx context.Context, key interface{}) (bool, error) { func (a *AdapterFile) Close(ctx context.Context) error {
//TODO implement me return nil
panic("implement me")
}
func (a AdapterFile) Size(ctx context.Context) (size int, err error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) Data(ctx context.Context) (data map[interface{}]interface{}, err error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) Keys(ctx context.Context) (keys []interface{}, err error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) Values(ctx context.Context) (values []interface{}, err error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) Update(ctx context.Context, key interface{}, value interface{}) (oldValue *gvar.Var, exist bool, err error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) UpdateExpire(ctx context.Context, key interface{}, duration time.Duration) (oldDuration time.Duration, err error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) GetExpire(ctx context.Context, key interface{}) (time.Duration, error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) Remove(ctx context.Context, keys ...interface{}) (lastValue *gvar.Var, err error) {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) Clear(ctx context.Context) error {
//TODO implement me
panic("implement me")
}
func (a AdapterFile) Close(ctx context.Context) error {
//TODO implement me
panic("implement me")
} }
func NewAdapterFile(filePath string) gcache.Adapter { func NewAdapterFile(filePath string) gcache.Adapter {
fileIndex = path.Join(filePath, fileIndex)
return &AdapterFile{ return &AdapterFile{
FilePath: filePath, FilePath: filePath,
} }

View File

@@ -9,6 +9,7 @@ import (
"github.com/gogf/gf/v2/container/gvar" "github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gres" "github.com/gogf/gf/v2/os/gres"
"github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/text/gstr"
@@ -86,14 +87,22 @@ func (c *Cfg) GetFile(filename string, _pathStr ...string) (jsonObj *gjson.Json,
bytes = gres.GetContent(filePath) // 从打包资源中获取内容 bytes = gres.GetContent(filePath) // 从打包资源中获取内容
} }
//如果还是没有读取到配置,从当前目录返回上级读取 for range 5 {
if bytes == nil { //如果还是没有读取到配置,从当前目录返回上级读取
// 拼接完整的文件路径 if bytes == nil {
filePath = "../../" + pathStr + filename + ".json" // 上级拼接完整的文件路径
if gfile.IsFile(filePath) { filePath = "../" + filePath
bytes = gfile.GetBytes(filePath) // 读取物理文件内容 if gfile.IsFile(filePath) {
bytes = gfile.GetBytes(filePath) // 读取物理文件内容
//找到配置了,跳过
break
}
} }
} }
if bytes == nil {
g.Log().Errorf(gctx.New(), "未读取到配置文件:%v", filePath)
}
// 解析 JSON 内容并返回结果 // 解析 JSON 内容并返回结果
jsonObj, err = gjson.DecodeToJson(bytes) jsonObj, err = gjson.DecodeToJson(bytes)
return return

View File

@@ -8,7 +8,7 @@ import (
"github.com/ayflying/utility_go/pkg/notice" "github.com/ayflying/utility_go/pkg/notice"
"github.com/ayflying/utility_go/pkg/rank" "github.com/ayflying/utility_go/pkg/rank"
"github.com/ayflying/utility_go/pkg/s3" "github.com/ayflying/utility_go/pkg/s3"
"github.com/ayflying/utility_go/pkg/websocket" //"github.com/ayflying/utility_go/pkg/websocket"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
) )
@@ -32,9 +32,9 @@ func Rank() *rank.Mod {
return rank.New() return rank.New()
} }
func Websocket() *websocket.SocketV1 { //func Websocket() *websocket.SocketV1 {
return websocket.NewV1() // return websocket.NewV1()
} //}
func Config() *config.Cfg { func Config() *config.Cfg {
return config.NewV1() return config.NewV1()