Browse Source

feat:用户信息锁异常处理

wangshan 2 years ago
parent
commit
dea1851e91
2 changed files with 40 additions and 24 deletions
  1. 28 22
      entity/user.go
  2. 12 2
      entity/workDesktop.go

+ 28 - 22
entity/user.go

@@ -21,12 +21,19 @@ const (
 	UserEntIdKey            = "jy_userentid_%s_%d_%s"
 )
 
+type UserInfo struct {
+	Capitals    map[string]int
+	Permissions map[string]int
+	Lock        *sync.Mutex
+}
+
 var (
 	CapitalRetention = "capital_retention"
-	UserCapitals     = map[string]map[string]int{}
-	UserPermissions  = map[string]map[string]int{}
-	UserLock         = map[string]*sync.Mutex{}
-	OverallLock      = &sync.Mutex{}
+	//UserCapitals     = map[string]map[string]int{}
+	//UserPermissions  = map[string]map[string]int{}
+	//UserLock         = map[string]*sync.Mutex{}
+	OverallLock = &sync.Mutex{}
+	UserInfoMap = map[string]*UserInfo{}
 )
 
 /*
@@ -198,15 +205,17 @@ func UserRolePowerInit(strs []string) {
 //
 func CheckCapitalResources(menu *JYMenu, baseUserId, appId string, entId, entUserId int64, b bool) (title, content, confirmUrl, confirmText, appType, openType string, isShowCancel, usable bool) {
 	OverallLock.Lock()
-	if UserCapitals[baseUserId] == nil {
-		UserCapitals[baseUserId] = map[string]int{}
-	}
-	if UserPermissions[baseUserId] == nil {
-		UserPermissions[baseUserId] = map[string]int{}
+	userInfo := UserInfoMap[baseUserId]
+	if userInfo == nil {
+		userInfo = &UserInfo{}
+		userInfo.Lock = &sync.Mutex{}
+		userInfo.Capitals = map[string]int{}
+		userInfo.Permissions = map[string]int{}
+		UserInfoMap[baseUserId] = userInfo
 	}
-	UserLock[baseUserId] = &sync.Mutex{}
 	OverallLock.Unlock()
-	UserLock[baseUserId].Lock()
+	userInfo.Lock.Lock()
+	defer userInfo.Lock.Unlock()
 	var (
 		capitalBool    = false
 		permissionBool = false
@@ -215,15 +224,14 @@ func CheckCapitalResources(menu *JYMenu, baseUserId, appId string, entId, entUse
 	if menu.CapitalCode != "" {
 		capitalBool = false
 		for _, cv := range strings.Split(menu.CapitalCode, ",") {
-			userCapital := UserCapitals[baseUserId]
-			if userCapital[cv] == 0 {
+			if userInfo.Capitals[cv] == 0 {
 				if c := BaseMysql.CountBySql(`SELECT COUNT(id) FROM `+CapitalRetention+` WHERE  source = ? AND user_id = ? AND appid = ?`, cv, baseUserId, appId); c > 0 {
-					userCapital[cv] = 1
+					userInfo.Capitals[cv] = 1
 				} else {
-					userCapital[cv] = -1
+					userInfo.Capitals[cv] = -1
 				}
 			}
-			if userCapital[cv] < 0 {
+			if userInfo.Capitals[cv] < 0 {
 				//留资弹窗信息
 				title = menu.CapitalInfo.Title
 				content = menu.CapitalInfo.Content
@@ -248,17 +256,16 @@ func CheckCapitalResources(menu *JYMenu, baseUserId, appId string, entId, entUse
 			permissionBool = false
 			if menu.CapitalCode != "" && capitalBool {
 				for _, pv := range strings.Split(menu.PermissionCode, ",") {
-					userPermission := UserPermissions[baseUserId]
-					if userPermission[pv] == 0 {
-						userPermission[pv] = -1
+					if userInfo.Permissions[pv] == 0 {
+						userInfo.Permissions[pv] = -1
 						powerList := GetResources(appId, baseUserId, entId, entUserId)
 						if len(powerList) > 0 {
 							for _, plv := range powerList {
-								userPermission[plv] = 1
+								userInfo.Permissions[plv] = 1
 							}
 						}
 					}
-					if userPermission[pv] < 0 {
+					if userInfo.Permissions[pv] < 0 {
 						//自定义弹窗
 						title = menu.AdditionalInfo.Title
 						content = menu.AdditionalInfo.Content
@@ -279,6 +286,5 @@ func CheckCapitalResources(menu *JYMenu, baseUserId, appId string, entId, entUse
 		}
 	}
 	usable = capitalBool && permissionBool
-	UserLock[baseUserId].Unlock()
 	return
 }

+ 12 - 2
entity/workDesktop.go

@@ -223,8 +223,18 @@ func (m *WorkDesktopMenu) WorkMenuFormat() ([]*pb.MenuList, error) {
 		}
 		menuList = append(menuList, oneLevel)
 	}
-	UserPermissions[m.NewUserId] = map[string]int{}
-	UserCapitals[m.NewUserId] = map[string]int{}
+	//清用户内存信息
+	go func(baseUserid string) {
+		OverallLock.Lock()
+		defer OverallLock.Unlock()
+		userInfo := UserInfoMap[baseUserid]
+		if userInfo != nil {
+			userInfo.Lock.Lock()
+			defer userInfo.Lock.Unlock()
+			userInfo.Permissions = map[string]int{}
+			userInfo.Capitals = map[string]int{}
+		}
+	}(m.NewUserId)
 	//bytes, _ := json.MarshalIndent(menuList, "", "   ")
 	//fmt.Printf("%s\n", bytes)
 	return menuList, nil