From 3af54fdb142cb868744accb9d3b37e546102102b Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 13 Jul 2022 14:14:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0gm=E6=A8=A1=E5=9D=97=E8=A1=A5?= =?UTF-8?q?=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lego/sys/gin/core.go | 43 ++++++++++++++++++++++++++ lego/utils/crypto/base64/base64.go | 13 ++++++++ lego/utils/crypto/md5/md5.go | 47 +++++++++++++++++++++++++++++ modules/{web => gm}/api.go | 10 +++--- modules/gm/api_createnotify.go | 46 ++++++++++++++++++++++++++++ modules/{web => gm}/api_register.go | 4 +-- modules/{web => gm}/api_srvlist.go | 4 +-- modules/{web => gm}/config.go | 2 +- modules/gm/core.go | 9 ++++++ modules/gm/modelNotify.go | 42 ++++++++++++++++++++++++++ modules/{web => gm}/module.go | 27 +++++++++-------- modules/{web => gm}/options.go | 3 +- modules/notify/modelNotify.go | 8 +++-- services/comp_gateroute.go | 2 +- 14 files changed, 233 insertions(+), 27 deletions(-) create mode 100644 lego/utils/crypto/base64/base64.go create mode 100644 lego/utils/crypto/md5/md5.go rename modules/{web => gm}/api.go (78%) create mode 100644 modules/gm/api_createnotify.go rename modules/{web => gm}/api_register.go (89%) rename modules/{web => gm}/api_srvlist.go (71%) rename modules/{web => gm}/config.go (98%) create mode 100644 modules/gm/core.go create mode 100644 modules/gm/modelNotify.go rename modules/{web => gm}/module.go (55%) rename modules/{web => gm}/options.go (91%) diff --git a/lego/sys/gin/core.go b/lego/sys/gin/core.go index bd388b0ad..c35264623 100644 --- a/lego/sys/gin/core.go +++ b/lego/sys/gin/core.go @@ -1,9 +1,14 @@ package gin import ( + "fmt" "net/http" + "reflect" + "sort" + "strings" "go_dreamfactory/lego/sys/gin/engine" + "go_dreamfactory/lego/utils/crypto/md5" ) type ISys interface { @@ -71,3 +76,41 @@ func Static(relativePath string, root string) engine.IRoutes { func StaticFS(relativePath string, fs http.FileSystem) engine.IRoutes { return defsys.StaticFS(relativePath, fs) } + +//签名接口 +func ParamSign(key string, param map[string]interface{}) (sign string) { + var keys []string + for k, _ := range param { + keys = append(keys, k) + } + sort.Strings(keys) + builder := strings.Builder{} + for _, v := range keys { + builder.WriteString(v) + builder.WriteString("=") + switch reflect.TypeOf(param[v]).Kind() { + case reflect.Int, + reflect.Int8, + reflect.Int16, + reflect.Int32, + reflect.Int64, + reflect.Uint, + reflect.Uint8, + reflect.Uint16, + reflect.Uint32, + reflect.Uint64, + reflect.Uintptr, + reflect.Float32, + reflect.Float64: + builder.WriteString(fmt.Sprintf("%d", param[v])) + break + default: + builder.WriteString(fmt.Sprintf("%s", param[v])) + break + } + builder.WriteString("&") + } + builder.WriteString("key=" + key) + sign = md5.MD5EncToLower(builder.String()) + return +} diff --git a/lego/utils/crypto/base64/base64.go b/lego/utils/crypto/base64/base64.go new file mode 100644 index 000000000..5bb52dc95 --- /dev/null +++ b/lego/utils/crypto/base64/base64.go @@ -0,0 +1,13 @@ +package base64 + +import "encoding/base64" + +///编码 +func EncodeToString(src []byte) string { + return base64.StdEncoding.EncodeToString(src) +} + +///解码 +func DecodeString(s string) ([]byte, error) { + return base64.StdEncoding.DecodeString(s) +} diff --git a/lego/utils/crypto/md5/md5.go b/lego/utils/crypto/md5/md5.go new file mode 100644 index 000000000..5d9650ced --- /dev/null +++ b/lego/utils/crypto/md5/md5.go @@ -0,0 +1,47 @@ +package md5 + +import ( + "crypto/md5" + "encoding/hex" + "fmt" + "sort" + "strings" +) + +/* +MD5加密 +*/ + +//MD5加密 大写 +func MD5EncToUpper(str string) string { + h := md5.New() + h.Write([]byte(str)) + return strings.ToUpper(hex.EncodeToString(h.Sum(nil))) +} + +//MD5加密 小写 +func MD5EncToLower(str string) string { + h := md5.New() + h.Write([]byte(str)) + return strings.ToLower(hex.EncodeToString(h.Sum(nil))) +} + +//参数签名 +func ParamSign(param map[string]interface{}, key string) (orsign, sign string) { + a := sort.StringSlice{} + for k, _ := range param { + a = append(a, k) + } + sort.Sort(a) + orsign = "" + for _, k := range a { + switch param[k].(type) { //只签名基础数据 + case bool, byte, int8, int16, uint16, int32, uint32, int, int64, uint64, float64, float32, string: + orsign = orsign + fmt.Sprintf("%s=%v&", k, param[k]) + break + } + } + orsign = orsign + fmt.Sprintf("key=%s", key) + sign = MD5EncToLower(orsign) + return +} diff --git a/modules/web/api.go b/modules/gm/api.go similarity index 78% rename from modules/web/api.go rename to modules/gm/api.go index bf8cb3cd1..5ee8a6734 100644 --- a/modules/web/api.go +++ b/modules/gm/api.go @@ -1,4 +1,4 @@ -package web +package gm import ( "go_dreamfactory/lego/core" @@ -11,16 +11,16 @@ import ( */ type Api_Comp struct { cbase.ModuleCompBase - options *Options //模块参数 - moduleWeb *Web //当前模块对象 - gin gin.ISys //gin 框架 web的热门框架 + options *Options //模块参数 + module *GM //当前模块对象 + gin gin.ISys //gin 框架 web的热门框架 } //组件初始化接口 启动web服务 并注册api func (this *Api_Comp) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { err = this.ModuleCompBase.Init(service, module, comp, options) this.options = options.(*Options) - this.moduleWeb = module.(*Web) + this.module = module.(*GM) this.gin, err = gin.NewSys(gin.SetListenPort(this.options.Port)) this.gin.POST("/register", this.Register) this.gin.GET("/serverlist", this.ServerList) diff --git a/modules/gm/api_createnotify.go b/modules/gm/api_createnotify.go new file mode 100644 index 000000000..b98a73a05 --- /dev/null +++ b/modules/gm/api_createnotify.go @@ -0,0 +1,46 @@ +package gm + +import ( + "go_dreamfactory/lego/sys/gin" + "go_dreamfactory/lego/sys/gin/engine" + "go_dreamfactory/lego/sys/log" + "go_dreamfactory/pb" + "net/http" +) + +type CreateNotifyReq struct { + pb.DBSystemNotify + Sign string `json:"sign"` +} + +//服务列表 +func (this *Api_Comp) CreateNotify(c *engine.Context) { + req := &CreateNotifyReq{} + c.BindJSON(&req) + defer log.Debugf("CreateNotify:%+v", req) + var ( + code pb.ErrorCode + msg string + data interface{} + err error + ) + c.JSON(http.StatusOK, &Respond{Code: code, Message: msg, Data: data}) + if sign := gin.ParamSign(this.options.Key, map[string]interface{}{"Title": req.Title, "Ctime": req.Ctime, "Rtime": req.Rtime}); sign != req.Sign { + log.Errorf("LoginByCaptchaReq SignError sgin:%s", sign) + code = pb.ErrorCode_SignError + msg = pb.GetErrorCodeMsg(code) + return + } + if len(req.Title) == 0 { + code = pb.ErrorCode_ReqParameterError + msg = pb.GetErrorCodeMsg(code) + return + } + if err = this.module.modelNotify.CreateSystemNotify(&req.DBSystemNotify); err != nil { + log.Errorf("LoginByCaptchaReq CreateSystemNotify err:%v", err) + code = pb.ErrorCode_DBError + msg = pb.GetErrorCodeMsg(code) + return + } + msg = pb.GetErrorCodeMsg(code) +} diff --git a/modules/web/api_register.go b/modules/gm/api_register.go similarity index 89% rename from modules/web/api_register.go rename to modules/gm/api_register.go index 2e191c4c6..424d72c9b 100644 --- a/modules/web/api_register.go +++ b/modules/gm/api_register.go @@ -1,4 +1,4 @@ -package web +package gm import ( "go_dreamfactory/lego/sys/gin/engine" @@ -13,7 +13,7 @@ func (this *Api_Comp) Register(c *engine.Context) { rsp := &pb.UserRegisterResp{} err := c.BindJSON(&req) if err == nil { - err := this.moduleWeb.modelUser.User_Create(&pb.DBUser{ + err := this.module.modelUser.User_Create(&pb.DBUser{ Binduid: req.Account, Sid: req.Sid, }) diff --git a/modules/web/api_srvlist.go b/modules/gm/api_srvlist.go similarity index 71% rename from modules/web/api_srvlist.go rename to modules/gm/api_srvlist.go index 96d2ed429..b4be53916 100644 --- a/modules/web/api_srvlist.go +++ b/modules/gm/api_srvlist.go @@ -1,4 +1,4 @@ -package web +package gm import ( "go_dreamfactory/lego/sys/gin/engine" @@ -7,7 +7,7 @@ import ( //服务列表 func (this *Api_Comp) ServerList(c *engine.Context) { - conf := this.moduleWeb.configure.getServerListConf() + conf := this.module.configure.getServerListConf() c.JSON(http.StatusOK, conf) } diff --git a/modules/web/config.go b/modules/gm/config.go similarity index 98% rename from modules/web/config.go rename to modules/gm/config.go index b714579a9..a3dff571f 100644 --- a/modules/web/config.go +++ b/modules/gm/config.go @@ -1,4 +1,4 @@ -package web +package gm import ( "fmt" diff --git a/modules/gm/core.go b/modules/gm/core.go new file mode 100644 index 000000000..27fdba7a7 --- /dev/null +++ b/modules/gm/core.go @@ -0,0 +1,9 @@ +package gm + +import "go_dreamfactory/pb" + +type Respond struct { + Code pb.ErrorCode `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data"` +} diff --git a/modules/gm/modelNotify.go b/modules/gm/modelNotify.go new file mode 100644 index 000000000..3a2704918 --- /dev/null +++ b/modules/gm/modelNotify.go @@ -0,0 +1,42 @@ +package gm + +import ( + "go_dreamfactory/lego/core" + "go_dreamfactory/lego/sys/log" + "go_dreamfactory/modules" + "go_dreamfactory/pb" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/x/bsonx" +) + +///论坛 数据组件 +type modelNotifyComp struct { + modules.MCompModel + module *GM +} + +//组件初始化接口 +func (this *modelNotifyComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, opt core.IModuleOptions) (err error) { + this.MCompModel.Init(service, module, comp, opt) + this.module = module.(*GM) + this.TableName = "notify" + //创建uid索引 + this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{ + Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}}, + }) + return +} + +//创建系统公告 +func (this *modelNotifyComp) CreateSystemNotify(notify *pb.DBSystemNotify) (err error) { + if _, err = this.DB.InsertOne(core.SqlTable(this.TableName), notify); err != nil { + log.Errorf("CreateSystemNotify err:%v", err) + return + } + if err = this.Redis.HSet(this.TableName, notify.Id, notify); err != nil { + log.Errorf("CreateSystemNotify err:%v", err) + return + } + return +} diff --git a/modules/web/module.go b/modules/gm/module.go similarity index 55% rename from modules/web/module.go rename to modules/gm/module.go index aff0f40df..e901e6b83 100644 --- a/modules/web/module.go +++ b/modules/gm/module.go @@ -1,4 +1,4 @@ -package web +package gm import ( "go_dreamfactory/comm" @@ -9,40 +9,41 @@ import ( ) /* -模块名:web -描述:为服务集群提供一些http服务接口 方便测试和后期运维实现 +模块名:gm +描述:提供管理员相关的http接口 开发:李伟 */ func NewModule() core.IModule { - m := new(Web) + m := new(GM) return m } -type Web struct { +type GM struct { cbase.ModuleBase - options *Options - api_comp *Api_Comp //提供weba pi服务的组件 - modelUser *user.ModelUser - configure *configureComp + options *Options + api_comp *Api_Comp //提供weba pi服务的组件 + modelUser *user.ModelUser + modelNotify *modelNotifyComp + configure *configureComp } //模块名 -func (this *Web) GetType() core.M_Modules { +func (this *GM) GetType() core.M_Modules { return comm.ModuleWeb } //模块自定义参数 -func (this *Web) NewOptions() (options core.IModuleOptions) { +func (this *GM) NewOptions() (options core.IModuleOptions) { return new(Options) } -func (this *Web) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) { +func (this *GM) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) { err = this.ModuleBase.Init(service, module, options) this.options = options.(*Options) return } -func (this *Web) OnInstallComp() { +func (this *GM) OnInstallComp() { this.ModuleBase.OnInstallComp() this.api_comp = this.RegisterComp(new(Api_Comp)).(*Api_Comp) this.modelUser = this.RegisterComp(new(user.ModelUser)).(*user.ModelUser) diff --git a/modules/web/options.go b/modules/gm/options.go similarity index 91% rename from modules/web/options.go rename to modules/gm/options.go index 3750894b2..7dabbd4fd 100644 --- a/modules/web/options.go +++ b/modules/gm/options.go @@ -1,4 +1,4 @@ -package web +package gm import ( "go_dreamfactory/lego/utils/mapstructure" @@ -7,6 +7,7 @@ import ( type ( Options struct { Port int + Key string } ) diff --git a/modules/notify/modelNotify.go b/modules/notify/modelNotify.go index bd3d19954..4c690b8f5 100644 --- a/modules/notify/modelNotify.go +++ b/modules/notify/modelNotify.go @@ -6,6 +6,7 @@ import ( "go_dreamfactory/lego/sys/log" "go_dreamfactory/modules" "go_dreamfactory/pb" + "time" "github.com/go-redis/redis/v8" "go.mongodb.org/mongo-driver/bson" @@ -56,10 +57,13 @@ func (this *modelNotifyComp) GetFullNotify() (result []*pb.DBSystemNotify, err e } if len(notifys) > 0 { n := 0 + now := time.Now().Unix() result = make([]*pb.DBSystemNotify, len(notifys)) for _, v := range notifys { - result[n] = v - n++ + if now >= v.Rtime { + result[n] = v + n++ + } } } return diff --git a/services/comp_gateroute.go b/services/comp_gateroute.go index fba2e0cbd..1d03552f4 100644 --- a/services/comp_gateroute.go +++ b/services/comp_gateroute.go @@ -99,7 +99,7 @@ func (this *SCompGateRoute) ReceiveMsg(ctx context.Context, args *pb.AgentMessag l := runtime.Stack(buf, false) reply.Code = pb.ErrorCode_Exception reply.ErrorMessage = fmt.Sprintf("%v: %s", r, buf[:l]) - log.Errorf("HandleUserMsg:[%s-%s] err:%s", args.MainType, args.SubType, reply.ErrorMessage) + log.Errorf("[Handle Api]:[%s-%s] err:%s", args.MainType, args.SubType, reply.ErrorMessage) } }() method := fmt.Sprintf("%s.%s", args.MainType, args.SubType)