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" "go.mongodb.org/mongo-driver/mongo" "google.golang.org/protobuf/proto" ) /* 基础组件 缓存组件 读写缓存数据 DB组件也封装进来 */ type Model_Comp struct { cbase.ModuleCompBase Redis redis.ISys DB mgo.ISys TableName 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 } //设置缓存JSON格式数据 func (this *Model_Comp) SetObj(uid string, data proto.Message, isnew, islog bool) error { err := this.Redis.Set(fmt.Sprintf("%s:%s", this.TableName, uid), data, 0) if err != nil { log.Errorf("set err:%v", err) return err } if islog { if isnew { return this.InsertModelLogs(this.TableName, uid, data) } else { return this.UpdateModelLogs(this.TableName, 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.TableName, uid), v) if err != nil { log.Errorf("set err:%v", err) return err } if islog { if isnew { return this.InsertModelLogs(this.TableName, uid, v) } else { return this.UpdateModelLogs(this.TableName, uid, bson.M{"uid": uid}, v) } } return nil } //获取缓存JSON数据 func (this *Model_Comp) GetObj(uid string, v proto.Message) error { err := this.Redis.Get(fmt.Sprintf("%s:%s", this.TableName, uid), v) if err != nil { if err == redis.RedisNil { //query from mgo err = this.DB.FindOne(core.SqlTable(this.TableName), bson.M{"_id": uid}).Decode(v) if err != nil { //no record if err == mongo.ErrNoDocuments { _, err = this.DB.InsertOne(core.SqlTable(this.TableName), v) if err != nil { log.Errorf("insert err: %v", err) return err } //set cache return this.SetObj(uid, v, true, false) } } } else { log.Errorf("get cache err: %v", err) } } return err } //获取对象数据 func (this *Model_Comp) Get(uid string, v reflect.Type, fields ...string) ([]interface{}, error) { return this.Redis.HMGet(fmt.Sprintf("%s:%s", this.TableName, uid), v, fields...) } //获取字段数据 func (this *Model_Comp) GetField(uid string, field string, v interface{}) error { return this.Redis.HGet(fmt.Sprintf("%s:%s", this.TableName, uid), field, v) } //删除一条数据 func (this *Model_Comp) Del(uid string) error { err := this.Redis.HDel(fmt.Sprintf("%s:%s", this.TableName, uid)) if err != nil { log.Errorf("del err:%v", err) return err } return this.DeleteModelLogs(this.TableName, uid, bson.M{"_id": uid}) }