| | |
| | | } |
| | | userInfo := service.GetUserBaseCache(claims.UserId) |
| | | if userInfo == nil { |
| | | SyncUserInfo() |
| | | SyncUserInfo(claims.UserId) |
| | | userInfo = service.GetUserBaseCache(claims.UserId) |
| | | } |
| | | claims.CrmUserId = userInfo.UserId |
| | |
| | | return rsp.Result |
| | | } |
| | | |
| | | func SyncUserInfo() { |
| | | func SyncUserInfo(uuid string) { |
| | | cli := user.NewUserServiceClient(userConn) |
| | | |
| | | var users []*user.User |
| | | |
| | | var users = []*user.User{ |
| | | {Uuid: uuid}, |
| | | } |
| | | ctx, cancel := context.WithTimeout(context.Background(), time.Second) |
| | | defer cancel() |
| | | r, err := cli.SyncUser(ctx, &user.UserRequest{Users: users}) |
| | |
| | | fmt.Printf("Synced: %v, Message: %s", r.List, r.Message) |
| | | |
| | | for _, member := range r.List { |
| | | err = model.NewUserSearch(nil).FirstOrCreate(model.User{ |
| | | err = model.NewUserSearch(nil).Upsert(model.User{ |
| | | UUID: member.Uuid, |
| | | Username: member.Username, |
| | | UserType: constvar.UserType(member.Usertype), |
| | |
| | | "aps_crm/pkg/mysqlx" |
| | | "fmt" |
| | | "gorm.io/gorm" |
| | | "gorm.io/gorm/clause" |
| | | ) |
| | | |
| | | type ( |
| | | // User token里边把用户ID、父用户ID、角色都带上 |
| | | User struct { |
| | | ID int `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"` |
| | | UUID string `json:"uuid" gorm:"primaryKey;type:varchar(255);comment:用户ID"` |
| | | UUID string `json:"uuid" gorm:"unique;type:varchar(255);comment:用户ID"` |
| | | Username string `json:"username" gorm:"index;type:varchar(255);comment:用户登录名"` |
| | | UserType constvar.UserType `json:"userType" gorm:"type:int(11);comment:用户类型 1超级管理员 2主账户 3子账户"` |
| | | Password string `json:"-" gorm:"type:varchar(255);comment:用户登录密码"` |
| | |
| | | return records, nil |
| | | } |
| | | |
| | | func (slf *UserSearch) FirstOrCreate(record User) error { |
| | | func (slf *UserSearch) Upsert(record User) error { |
| | | var db = slf.build() |
| | | |
| | | if err := db.FirstOrCreate(&User{}, record).Error; err != nil { |
| | | if err := db.Clauses(clause.OnConflict{ |
| | | Columns: []clause.Column{{Name: "uuid"}}, |
| | | DoUpdates: clause.AssignmentColumns([]string{"uuid", "username", "user_type", "nick_name"}), |
| | | }).Create(&record).Error; err != nil { |
| | | return fmt.Errorf("first or create err: %v, record: %+v", err, record) |
| | | } |
| | | |
| | |
| | | "time" |
| | | ) |
| | | |
| | | type userBaseInfo struct { |
| | | type UserBaseInfo struct { |
| | | UserId int |
| | | NickName string |
| | | } |
| | | |
| | | var userCache *expirable.LRU[string, *userBaseInfo] |
| | | var userCache *expirable.LRU[string, *UserBaseInfo] |
| | | |
| | | func init() { |
| | | //make cache with 5 minutes TTL and 100 max keys |
| | | userCache = expirable.NewLRU[string, *userBaseInfo](100, nil, time.Minute*5) |
| | | userCache = expirable.NewLRU[string, *UserBaseInfo](100, nil, time.Minute*5) |
| | | } |
| | | |
| | | func GetUserBaseCache(adminUserId string) *userBaseInfo { |
| | | func GetUserBaseCache(adminUserId string) *UserBaseInfo { |
| | | userCache, ok := userCache.Get(adminUserId) |
| | | if !ok { |
| | | userService := UserService{} |
| | |
| | | if err != nil { |
| | | return nil |
| | | } |
| | | baseInfo := &userBaseInfo{ |
| | | baseInfo := &UserBaseInfo{ |
| | | UserId: userRecord.ID, |
| | | NickName: userRecord.NickName, |
| | | } |
| | |
| | | return userCache |
| | | } |
| | | |
| | | func SetUserBaseCache(adminUserId string, user *userBaseInfo) { |
| | | func SetUserBaseCache(adminUserId string, user *UserBaseInfo) { |
| | | _ = userCache.Add(adminUserId, user) |
| | | } |