/** * @Author: zou.yingbin * @Create : 2021/1/13 10:51 * @Modify : 2021/1/13 10:51 */ package mtpcache import ( "mtp2_if/db" "mtp2_if/logger" "mtp2_if/utils" "sync" "time" ) var vUser userName type userName struct { mtx sync.RWMutex // 锁 data map[int64]userData // 数据[loginId]userData last time.Time } type userData struct { USERID int64 `json:"userid" xorm:"'USERID'"` // 用户id RELATEDUSERID int64 `json:"relateduserid" xorm:"'RELATEDUSERID'"` // 关联用户id LOGINID int64 `json:"LOGINID" xorm:"'LOGINID'"` // 登录ID LOGINCODE string `json:"LOGINCODE" xorm:"'LOGINCODE'"` // 登录代码 ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 用户名字 } // 加载数据 func (r *userName) load() { now := time.Now() // 间隔3秒以上才重新加载 if d := now.Sub(r.last); d.Seconds() < 3 { return } r.mtx.Lock() defer r.mtx.Unlock() e := db.GetEngine() if e == nil { return } var sqlId utils.SQLVal = "select t.userid, t.relateduserid, t.loginid, t.logincode, t.accountname" + " from loginaccount t" + " where 1 = 1" sData := make([]userData, 0) s := e.SQL(sqlId) if err := s.Find(&sData); err != nil { logger.GetLogger().Errorf("cache load usrname, %v", err) } else { r.data = make(map[int64]userData) for i := range sData { r.data[sData[i].LOGINID] = sData[i] } r.last = time.Now() } } func (r *userName) name(loginId int64) string { r.mtx.RLock() defer r.mtx.RUnlock() if r.data == nil { return "" } if v, ok := r.data[loginId]; ok { return v.ACCOUNTNAME } return "" } func (r *userName) loginCode(loginId int64) string { r.mtx.RLock() defer r.mtx.RUnlock() if r.data == nil { return "" } if v, ok := r.data[loginId]; ok { return v.LOGINCODE } return "" } func (r *userName) logincodeByUserId(userId int64) string { // 只取一个 r.mtx.RLock() defer r.mtx.RUnlock() for _, v := range r.data { if v.USERID == userId { return v.LOGINCODE } } return "" } // GetLoginCodeByLoginId 根据登录ID获取登录代码 func GetLoginCodeByLoginId(loginId int64) string { if v := vUser.loginCode(loginId); v != "" { return v } else { vUser.load() } return vUser.loginCode(loginId) } // GetLoginCodeByUserId 获取登录代码 func GetLoginCodeByUserId(userId int64) string { if v := vUser.logincodeByUserId(userId); v != "" { return v } else { vUser.load() } return vUser.logincodeByUserId(userId) }