package modules import ( "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/core/cbase" "go_dreamfactory/lego/sys/log" "go_dreamfactory/lego/sys/mgo" "go_dreamfactory/lego/sys/redis" "go_dreamfactory/sys/cache" "go_dreamfactory/sys/db" "reflect" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "google.golang.org/protobuf/proto" ) /* 基础组件 缓存组件 读写缓存数据 DB组件也封装进来 */ type Model_Comp struct { cbase.ModuleCompBase Redis redis.ISys DB mgo.ISys Prefix string //redis key前缀 } const ( DB_ModelTable core.SqlTable = "model_log" ) //组件初始化接口 func (this *Model_Comp) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { this.ModuleCompBase.Init(service, module, comp, options) this.Redis = cache.Redis() this.DB = db.Mgo() return } func (this *Model_Comp) Start() (err error) { err = this.ModuleCompBase.Start() return } func (this *Model_Comp) InsertModelLogs(table string, uID string, target interface{}) (err error) { data := &comm.Autogenerated{ ID: primitive.NewObjectID().Hex(), UID: uID, Act: string(comm.LogHandleType_Insert), } data.D = append(data.D, table) // D[0] data.D = append(data.D, target) // D[1] _, err = this.DB.InsertOne(DB_ModelTable, data) if err != nil { log.Errorf("insert model db err %v", err) } return err } func (this *Model_Comp) DeleteModelLogs(table string, uID string, where interface{}) (err error) { data := &comm.Autogenerated{ ID: primitive.NewObjectID().Hex(), UID: uID, Act: string(comm.LogHandleType_Delete), } data.D = append(data.D, table) // D[0] data.D = append(data.D, where) // D[1] _, err = this.DB.InsertOne(DB_ModelTable, data) if err != nil { log.Errorf("insert model db err %v", err) } return err } func (this *Model_Comp) UpdateModelLogs(table string, uID string, where bson.M, target interface{}) (err error) { data := &comm.Autogenerated{ ID: primitive.NewObjectID().Hex(), UID: uID, Act: string(comm.LogHandleType_Update), } data.D = append(data.D, table) // D[0] data.D = append(data.D, where) // D[1] data.D = append(data.D, target) // D[2] _, err = this.DB.InsertOne(DB_ModelTable, data) if err != nil { log.Errorf("insert model db err %v", err) } return err } func (this *Model_Comp) SetObj(uid string, data proto.Message, isnew, islog bool) error { err := this.Redis.Set(fmt.Sprintf("%s:%s", this.Prefix, uid), data, 0) if err != nil { log.Errorf("set err:%v", err) return err } if islog { if isnew { return this.InsertModelLogs(this.Prefix, uid, data) } else { return this.UpdateModelLogs(this.Prefix, uid, bson.M{"_id": uid}, data) } } return nil } //更新缓存字段 //isnew true insertlog , false updatelog func (this *Model_Comp) Set(uid string, v map[string]interface{}, isnew, islog bool) error { err := this.Redis.HMSet(fmt.Sprintf("%s:%s", this.Prefix, uid), v) if err != nil { log.Errorf("set err:%v", err) return err } if islog { if isnew { return this.InsertModelLogs(this.Prefix, uid, v) } else { return this.UpdateModelLogs(this.Prefix, uid, bson.M{"_id": uid}, v) } } return nil } func (this *Model_Comp) GetObj(uid string, v interface{}) error { return this.Redis.Get(fmt.Sprintf("%s:%s", this.Prefix, uid), v) } //获取对象数据 func (this *Model_Comp) Get(uid string, v reflect.Type, fields ...string) ([]interface{}, error) { return this.Redis.HMGet(fmt.Sprintf("%s:%s", this.Prefix, uid), v, fields...) } //获取字段数据 func (this *Model_Comp) GetField(uid string, field string, v interface{}) error { return this.Redis.HGet(fmt.Sprintf("%s:%s", this.Prefix, uid), field, v) } //删除一条数据 func (this *Model_Comp) Del(uid string) error { err := this.Redis.HDel(fmt.Sprintf("%s:%s", this.Prefix, uid)) if err != nil { log.Errorf("del err:%v", err) return err } return this.DeleteModelLogs(this.Prefix, uid, bson.M{"_id": uid}) }