diff --git a/README.md b/README.md index 17017b6..e5d3f18 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# HotGO-V2 +# HotGo-V2
-
@@ -74,7 +74,7 @@ ## 环境要求 - node版本 >= v16.0.0 - golang版本 >= v1.18 -- gf版本 >=2.1 +- gf版本 >=v2.2.4 (会保持同步gf最新版本,gf小版本更新可能存在兼容问题,旧版本需自行处理,如非必要不建议更新!) - IDE推荐:Goland - mysql版本 >=5.7 - redis版本 >=3.0 @@ -130,6 +130,9 @@ VITE_PROXY=[["/admin","http://你的IP:8000/admin"]] ```shell script cd server + # 设置国内代理,如果已经设置好了代理可以跳过 + go env -w GOPROXY=https://goproxy.io,direct + # 更新包 go mod tidy @@ -137,7 +140,7 @@ VITE_PROXY=[["/admin","http://你的IP:8000/admin"]] go run main.go # 启动所有服务 - gf run main.go --args "all" + go run main.go all # 如果顺利,至此到浏览器打开:http://你的IP:8000/admin,即可看到后台登录地址 # 登录账号:admin, 密码:123456 @@ -155,7 +158,7 @@ web端: yarn install # 启动web项目 - npm run dev + yarn dev # 如果顺利,至此到浏览器打开:http://你的IP:8001/admin ``` @@ -203,7 +206,7 @@ web端: ## 交流QQ群 -交流群①:190966648 +交流群①:190966648 > diff --git a/server/go.mod b/server/go.mod index 826bfea..fa6c0ce 100644 --- a/server/go.mod +++ b/server/go.mod @@ -11,12 +11,11 @@ require ( github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/go-resty/resty/v2 v2.7.0 github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.0-beta2 - github.com/gogf/gf/v2 v2.2.0-beta2 + github.com/gogf/gf/v2 v2.2.4 github.com/golang/mock v1.6.0 // indirect github.com/gomodule/redigo v1.8.8 github.com/google/btree v1.1.2 // indirect github.com/gorilla/websocket v1.5.0 - github.com/h2non/filetype v1.1.3 github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794 github.com/mattn/go-colorable v0.1.12 // indirect github.com/mojocn/base64Captcha v1.3.5 diff --git a/server/go.sum b/server/go.sum index cb700c4..c7b9645 100644 --- a/server/go.sum +++ b/server/go.sum @@ -127,8 +127,8 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.0-beta2 h1:QgVPXrGp8wJx18HIOsNATaIiHjXsd/Rk1F1QyxfWv+g= github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.0-beta2/go.mod h1:z+/0qiOwMroAnj5ESuobTv0l5P83rf+XR3r6Fj8WJyk= github.com/gogf/gf/v2 v2.0.0/go.mod h1:apktt6TleWtCIwpz63vBqUnw8MX8gWKoZyxgDpXFtgM= -github.com/gogf/gf/v2 v2.2.0-beta2 h1:XDx9dzUf3/9HRkSSZdW7XnI3gvtgpoKpDkP2ZsKlf/4= -github.com/gogf/gf/v2 v2.2.0-beta2/go.mod h1:thvkyb43RWUu/m05sRm4CbH9r7t7/FrW2M56L9Ystwk= +github.com/gogf/gf/v2 v2.2.4 h1:Y2c0F4dDDYlQswHPtoGJ0l9kvQjE0a9jmM02qCAZoqo= +github.com/gogf/gf/v2 v2.2.4/go.mod h1:thvkyb43RWUu/m05sRm4CbH9r7t7/FrW2M56L9Ystwk= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= @@ -208,8 +208,6 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0= github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= -github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= -github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= diff --git a/server/internal/cmd/cmd.go b/server/internal/cmd/cmd.go index 1d7d9f5..938bddd 100644 --- a/server/internal/cmd/cmd.go +++ b/server/internal/cmd/cmd.go @@ -10,7 +10,7 @@ import ( "context" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gcmd" - "github.com/gogf/gf/v2/os/grpool" + "hotgo/utility/simple" ) var ( @@ -20,13 +20,13 @@ var ( 欢迎使用HotGo! --------------------------------------------------------------------------------- 启动服务 - >> HTTP服务 [gf run main.go --args "http"] - >> 消息队列 [gf run main.go --args "queue"] - >> 所有服务 [gf run main.go --args "all"] + >> HTTP服务 [go run main.go http] + >> 消息队列 [go run main.go queue] + >> 所有服务 [go run main.go all] --------------------------------------------------------------------------------- 工具 - >> 释放casbin权限,用于清理无效的权限设置 [gf run main.go --args "tools -m=casbin -a1=refresh"] + >> 释放casbin权限,用于清理无效的权限设置 [go run main.go tools -m=casbin -a1=refresh] `, } @@ -46,22 +46,17 @@ var ( Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { g.Log().Info(ctx, "start all server") - if err = grpool.AddWithRecover(ctx, func(ctx context.Context) { + simple.SafeGo(ctx, func(ctx context.Context) { if err := Http.Func(ctx, parser); err != nil { g.Log().Fatal(ctx, "http server start fail:", err) } - }); err != nil { - return - } + }) - if err = grpool.AddWithRecover(ctx, func(ctx context.Context) { + simple.SafeGo(ctx, func(ctx context.Context) { if err := Queue.Func(ctx, parser); err != nil { g.Log().Fatal(ctx, "queue consumer start fail:", err) } - }); err != nil { - g.Log().Fatal(ctx, "queue consumer start fail2:", err) - return - } + }) // 信号监听 signalListen(ctx, signalHandlerForOverall) diff --git a/server/internal/cmd/handler_shutdown.go b/server/internal/cmd/handler_shutdown.go index 2940dfd..2c62eee 100644 --- a/server/internal/cmd/handler_shutdown.go +++ b/server/internal/cmd/handler_shutdown.go @@ -8,11 +8,10 @@ package cmd import ( "context" - "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gproc" - "github.com/gogf/gf/v2/os/grpool" "hotgo/internal/crons" "hotgo/internal/websocket" + "hotgo/utility/simple" "os" ) @@ -29,12 +28,9 @@ func signalHandlerForOverall(sig os.Signal) { } func signalListen(ctx context.Context, handler ...gproc.SigHandler) { - err := grpool.AddWithRecover(ctx, func(ctx context.Context) { + simple.SafeGo(ctx, func(ctx context.Context) { gproc.AddSigHandlerShutdown(handler...) gproc.Listen() }) - if err != nil { - g.Log().Fatal(ctx, "signalListen Fatal:", err) - return - } + } diff --git a/server/internal/controller/backend/admin/monitor.go b/server/internal/controller/backend/admin/monitor.go index 4259464..23246db 100644 --- a/server/internal/controller/backend/admin/monitor.go +++ b/server/internal/controller/backend/admin/monitor.go @@ -10,11 +10,11 @@ import ( "context" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/grpool" "hotgo/api/backend/monitor" "hotgo/internal/consts" "hotgo/internal/model/input/form" "hotgo/internal/websocket" + "hotgo/utility/simple" "hotgo/utility/useragent" "sort" ) @@ -36,13 +36,11 @@ func (c *cMonitor) Offline(ctx context.Context, req *monitor.OfflineReq) (res *m return } - err = grpool.AddWithRecover(ctx, func(ctx context.Context) { + simple.SafeGo(ctx, func(ctx context.Context) { websocket.SendSuccess(client, "kick") websocket.Close(client) }) - if err != nil { - return nil, err - } + return res, nil } diff --git a/server/internal/global/init.go b/server/internal/global/init.go index e2a8a20..9db809e 100644 --- a/server/internal/global/init.go +++ b/server/internal/global/init.go @@ -9,10 +9,9 @@ package global import ( "context" "fmt" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/grpool" "github.com/gogf/gf/v2/os/gtime" "hotgo/internal/library/location" + "hotgo/utility/simple" "os" ) @@ -29,14 +28,9 @@ func Init(ctx context.Context) { } func loadMonitor(ctx context.Context) { - err := grpool.AddWithRecover(ctx, func(ctx context.Context) { + simple.SafeGo(ctx, func(ctx context.Context) { MonitorData.STartTime = gtime.Now() MonitorData.IntranetIP, _ = location.GetLocalIP() MonitorData.PublicIP, _ = location.GetPublicIP() - }) - if err != nil { - g.Log().Fatal(ctx, "global loadMonitor Fatal:", err) - return - } } diff --git a/server/internal/logic/admin/notice.go b/server/internal/logic/admin/notice.go index 37124e8..84cc2be 100644 --- a/server/internal/logic/admin/notice.go +++ b/server/internal/logic/admin/notice.go @@ -9,7 +9,6 @@ package admin import ( "context" "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/os/grpool" "github.com/gogf/gf/v2/os/gtime" "hotgo/internal/consts" "hotgo/internal/dao" @@ -18,6 +17,7 @@ import ( "hotgo/internal/websocket" "hotgo/utility/charset" "hotgo/utility/convert" + "hotgo/utility/simple" "strings" ) @@ -75,7 +75,7 @@ func (s *sAdminNotice) Edit(ctx context.Context, in adminin.NoticeEditInp) (err Event: "notice", Data: in, } - grpool.AddWithRecover(ctx, func(ctx context.Context) { + simple.SafeGo(ctx, func(ctx context.Context) { if len(memberIds) == 0 { websocket.SendToAll(response) } else { diff --git a/server/utility/simple/simple.go b/server/utility/simple/simple.go new file mode 100644 index 0000000..3765d2b --- /dev/null +++ b/server/utility/simple/simple.go @@ -0,0 +1,76 @@ +// Package simple +// @Link https://github.com/bufanyun/hotgo +// @Copyright Copyright (c) 2022 HotGo CLI +// @Author Ms <133814250@qq.com> +// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE +// +package simple + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/util/gconv" +) + +func SafeGo(ctx context.Context, f func(ctx context.Context), level ...interface{}) { + go func() { + defer func() { + if err := recover(); err != nil { + var newLevel = glog.LEVEL_ERRO + if len(level) > 0 { + newLevel = gconv.Int(level[0]) + } + Logf(newLevel, ctx, "SafeGo failed err:%+v", err) + } + }() + + f(ctx) + }() +} + +func Logf(level int, ctx context.Context, format string, v ...interface{}) { + switch level { + case glog.LEVEL_DEBU: + g.Log().Debugf(ctx, format, v) + case glog.LEVEL_INFO: + g.Log().Infof(ctx, format, v) + case glog.LEVEL_NOTI: + g.Log().Noticef(ctx, format, v) + case glog.LEVEL_WARN: + g.Log().Warningf(ctx, format, v) + case glog.LEVEL_ERRO: + g.Log().Errorf(ctx, format, v) + case glog.LEVEL_CRIT: + g.Log().Critical(ctx, format, v) + case glog.LEVEL_PANI: + g.Log().Panicf(ctx, format, v) + case glog.LEVEL_FATA: + g.Log().Fatalf(ctx, format, v) + default: + g.Log().Error(ctx, "Logf level not find") + } +} + +func Log(level int, ctx context.Context, v ...interface{}) { + switch level { + case glog.LEVEL_DEBU: + g.Log().Debug(ctx, v) + case glog.LEVEL_INFO: + g.Log().Info(ctx, v) + case glog.LEVEL_NOTI: + g.Log().Notice(ctx, v) + case glog.LEVEL_WARN: + g.Log().Warning(ctx, v) + case glog.LEVEL_ERRO: + g.Log().Error(ctx, v) + case glog.LEVEL_CRIT: + g.Log().Critical(ctx, v) + case glog.LEVEL_PANI: + g.Log().Panic(ctx, v) + case glog.LEVEL_FATA: + g.Log().Fatal(ctx, v) + default: + g.Log().Error(ctx, "Logf level not find") + } +}