Просмотр исходного кода

系统优化,加入数据缓存

yxh 6 лет назад
Родитель
Сommit
f0a8bc938c

+ 40 - 11
app/controller/admin/auth.go

@@ -7,6 +7,7 @@ import (
 	"gfast/app/model/admin/user"
 	"gfast/app/service/admin/auth_service"
 	"gfast/app/service/admin/user_service"
+	"gfast/app/service/cache_service"
 	"gfast/app/service/casbin_adapter_service"
 	"gfast/library/response"
 	"gfast/library/utils"
@@ -23,11 +24,12 @@ type Auth struct{}
 //菜单列表
 func (c *Auth) MenuList(r *ghttp.Request) {
 	//获取菜单信息
-	err, list := auth_service.GetMenuList("")
+	listEntities, err := auth_service.GetMenuList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取数据失败")
 	}
+	list := gconv.SliceMap(listEntities)
 	list = utils.PushSonToParent(list)
 	response.SusJson(true, r, "成功", g.Map{
 		"list": list,
@@ -64,13 +66,16 @@ func (c *Auth) AddMenu(r *ghttp.Request) {
 			g.Log().Error(err)
 			response.FailJson(true, r, "添加菜单失败")
 		}
+		//清除TAG缓存
+		cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
 		response.SusJson(true, r, "添加菜单成功")
 	}
 	//获取父级菜单信息
-	err, list := auth_service.GetMenuList("ismenu=?", 1)
+	listEntities, err := auth_service.GetIsMenuList()
 	if err != nil {
 		response.FailJson(true, r, "获取数据失败")
 	}
+	list := gconv.SliceMap(listEntities)
 	list = utils.ParentSonSort(list)
 	response.SusJson(true, r, "成功", g.Map{"parentList": list})
 }
@@ -93,6 +98,8 @@ func (c *Auth) EditMenu(r *ghttp.Request) {
 			g.Log().Error(err)
 			response.FailJson(true, r, "修改菜单失败")
 		}
+		//清除TAG缓存
+		cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
 		response.SusJson(true, r, "修改菜单成功")
 	}
 	menuEntity, err := auth_rule.Model.Where("id=?", id).One()
@@ -101,10 +108,11 @@ func (c *Auth) EditMenu(r *ghttp.Request) {
 		response.FailJson(true, r, "获取数据失败")
 	}
 	//获取父级菜单信息
-	err, list := auth_service.GetMenuList("ismenu=?", 1)
+	listEntities, err := auth_service.GetIsMenuList()
 	if err != nil {
 		response.FailJson(true, r, "获取数据失败")
 	}
+	list := gconv.SliceMap(listEntities)
 	list = utils.ParentSonSort(list)
 	response.SusJson(true, r, "成功", g.Map{
 		"parentList": list,
@@ -123,17 +131,20 @@ func (c *Auth) DeleteMenu(r *ghttp.Request) {
 		g.Log().Error(err)
 		response.FailJson(true, r, "删除失败")
 	}
+	//清除TAG缓存
+	cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
 	response.SusJson(true, r, "删除成功")
 }
 
 //角色列表
 func (c *Auth) RoleList(r *ghttp.Request) {
 	//获取角色列表
-	err, list := auth_service.GetRoleList("")
+	listEntities, err := auth_service.GetRoleList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取数据失败")
 	}
+	list := gconv.SliceMap(listEntities)
 	list = utils.PushSonToParent(list, 0, "parent_id", "id", "children", "", nil, false)
 	response.SusJson(true, r, "成功", g.Map{
 		"list": list,
@@ -166,21 +177,25 @@ func (c *Auth) AddRole(r *ghttp.Request) {
 			response.FailJson(true, r, "添加用户组失败")
 		}
 		tx.Commit()
+		//清除TAG缓存
+		cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
 		response.SusJson(true, r, "添加用户组成功")
 	}
 	//获取父级组
-	err, pList := auth_service.GetRoleList("")
+	pListEntities, err := auth_service.GetRoleList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取父级数据失败")
 	}
+	pList := gconv.SliceMap(pListEntities)
 	pList = utils.ParentSonSort(pList, 0, 0, "parent_id", "id", "flg", "name")
 	//获取菜单信息
-	err, mList := auth_service.GetMenuList("")
+	mListEntities, err := auth_service.GetMenuList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取菜单数据失败")
 	}
+	mList := gconv.SliceMap(mListEntities)
 	mList = utils.PushSonToParent(mList)
 	res := g.Map{
 		"parentList": pList,
@@ -214,6 +229,8 @@ func (c *Auth) EditRole(r *ghttp.Request) {
 			response.FailJson(true, r, "添加用户组失败")
 		}
 		tx.Commit()
+		//清除TAG缓存
+		cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
 		response.SusJson(true, r, "修改用户组成功")
 	}
 	//获取角色信息
@@ -222,14 +239,15 @@ func (c *Auth) EditRole(r *ghttp.Request) {
 		response.FailJson(true, r, "获取角色数据失败")
 	}
 	//获取父级组
-	err, pList := auth_service.GetRoleList("")
+	pListEntities, err := auth_service.GetRoleList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取父级数据失败")
 	}
+	pList := gconv.SliceMap(pListEntities)
 	pList = utils.ParentSonSort(pList, 0, 0, "parent_id", "id", "flg", "name")
 	//获取菜单信息
-	err, mList := auth_service.GetMenuList("")
+	mListEntities, err := auth_service.GetMenuList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取菜单数据失败")
@@ -245,6 +263,7 @@ func (c *Auth) EditRole(r *ghttp.Request) {
 	for k, v := range gp {
 		gpSlice[k] = gconv.Int(gstr.SubStr(v[1], 2))
 	}
+	mList := gconv.SliceMap(mListEntities)
 	mList = utils.PushSonToParent(mList)
 	res := g.Map{
 		"parentList":   pList,
@@ -282,6 +301,8 @@ func (c *Auth) DeleteRole(r *ghttp.Request) {
 		}
 	}
 	tx.Commit()
+	//清除TAG缓存
+	cache_service.New().RemoveByTag(cache_service.AdminAuthTag)
 	response.SusJson(true, r, "删除成功")
 }
 
@@ -302,11 +323,12 @@ func (c *Auth) AddUser(r *ghttp.Request) {
 		response.SusJson(true, r, "添加管理员成功")
 	}
 	//获取角色信息
-	err, roleList := auth_service.GetRoleList("")
+	roleListEntities, err := auth_service.GetRoleList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取角色数据失败")
 	}
+	roleList := gconv.SliceMap(roleListEntities)
 	roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name")
 	res := g.Map{
 		"roleList": roleList,
@@ -338,11 +360,12 @@ func (c *Auth) EditUser(r *ghttp.Request) {
 		response.FailJson(true, r, "获取用户数据失败")
 	}
 	//获取角色信息
-	err, roleList := auth_service.GetRoleList("")
+	roleListEntities, err := auth_service.GetRoleList()
 	if err != nil {
 		g.Log().Error(err)
 		response.FailJson(true, r, "获取角色数据失败")
 	}
+	roleList := gconv.SliceMap(roleListEntities)
 	roleList = utils.ParentSonSort(roleList, 0, 0, "parent_id", "id", "flg", "name")
 	//获取已选择的角色信息
 	checkedRoleIds, err := user_service.GetAdminRoleIds(id)
@@ -375,9 +398,15 @@ func (c *Auth) UserList(r *ghttp.Request) {
 		response.FailJson(true, r, "获取用户列表数据失败")
 	}
 	users := make([]g.Map, len(userList))
+	//获取所有角色信息
+	allRoles, err := auth_service.GetRoleList()
+	if err != nil {
+		g.Log().Error(err)
+		response.FailJson(true, r, "获取用户角色数据失败")
+	}
 	for k, u := range userList {
 		users[k] = gconv.Map(u)
-		roles, err := user_service.GetAdminRole(u.Id)
+		roles, err := user_service.GetAdminRole(u.Id, allRoles)
 		if err != nil {
 			g.Log().Error(err)
 			response.FailJson(true, r, "获取用户角色数据失败")

+ 20 - 12
app/controller/admin/index.go

@@ -1,6 +1,7 @@
 package admin
 
 import (
+	"gfast/app/service/admin/auth_service"
 	"gfast/app/service/admin/user_service"
 	"gfast/library/response"
 	"github.com/gogf/gf/frame/g"
@@ -14,31 +15,38 @@ type Index struct{}
 //后台首页接口数据
 func (c *Index) Index(r *ghttp.Request) {
 	//获取用户信息
-	userInfo := user_service.GetCacheAdminInfo(r)
+	userInfo := user_service.GetLoginAdminInfo(r)
 	//菜单列表
 	var menuList g.List
 	if userInfo != nil {
 		userId := gconv.Int(userInfo["id"])
 		delete(userInfo, "user_password")
 		//获取用户角色信息
-		roles, err := user_service.GetAdminRole(userId)
+		allRoles, err := auth_service.GetRoleList()
 		if err == nil {
-			name := make([]string, len(roles))
-			roleIds := make([]int, len(roles))
-			for k, v := range roles {
-				name[k] = v.Name
-				roleIds[k] = v.Id
-			}
-			userInfo["roles"] = strings.Join(name, ",")
-			//获取菜单信息
-			menuList, err = user_service.GetAdminMenusByRoleIds(roleIds)
-			if err != nil {
+			roles, err := user_service.GetAdminRole(userId, allRoles)
+			if err == nil {
+				name := make([]string, len(roles))
+				roleIds := make([]int, len(roles))
+				for k, v := range roles {
+					name[k] = v.Name
+					roleIds[k] = v.Id
+				}
+				userInfo["roles"] = strings.Join(name, ",")
+				//获取菜单信息
+				menuList, err = user_service.GetAdminMenusByRoleIds(roleIds)
+				if err != nil {
+					g.Log().Error(err)
+				}
+			} else {
 				g.Log().Error(err)
+				userInfo["roles"] = ""
 			}
 		} else {
 			g.Log().Error(err)
 			userInfo["roles"] = ""
 		}
+
 	}
 
 	result := g.Map{

+ 56 - 31
app/service/admin/auth_service/auth_rule.go

@@ -7,6 +7,7 @@ import (
 	"gfast/app/model/admin/auth_rule"
 	"gfast/app/model/admin/role"
 	"gfast/app/model/admin/user"
+	"gfast/app/service/cache_service"
 	"gfast/app/service/casbin_adapter_service"
 	"gfast/library/utils"
 	"github.com/gogf/gf/database/gdb"
@@ -17,25 +18,53 @@ import (
 	"github.com/gogf/gf/util/gvalid"
 )
 
-//获取菜单列表
-func GetMenuList(where string, params ...interface{}) (error, g.List) {
-	var err error
-	var list []*auth_rule.Entity
-	if where != "" {
-		list, err = auth_rule.Model.Where(where, params...).Order("weigh desc,id asc").FindAll()
-	} else {
-		list, err = auth_rule.Model.Order("weigh desc,id asc").FindAll()
+//获取isMenu==1菜单列表
+func GetIsMenuList() ([]*auth_rule.Entity, error) {
+	list, err := GetMenuList()
+	if err != nil {
+		return nil, err
+	}
+	var gList = make([]*auth_rule.Entity, 0, len(list))
+	for _, v := range list {
+		if v.Ismenu == 1 {
+			gList = append(gList, v)
+		}
 	}
+	return gList, nil
+}
+
+//获取isMenu=1且status=1的菜单列表
+func GetIsMenuStatusList() ([]*auth_rule.Entity, error) {
+	list, err := GetMenuList()
 	if err != nil {
-		g.Log().Error(err)
-		return err, nil
+		return nil, err
+	}
+	var gList = make([]*auth_rule.Entity, 0, len(list))
+	for _, v := range list {
+		if v.Ismenu == 1 && v.Status == 1 {
+			gList = append(gList, v)
+		}
+	}
+	return gList, nil
+}
+
+//获取所有菜单
+func GetMenuList() (list []*auth_rule.Entity, err error) {
+	cache := cache_service.New()
+	//从缓存获取
+	iList := cache.Get(cache_service.AdminMenu)
+	if iList != nil {
+		list = iList.([]*auth_rule.Entity)
+		return
 	}
-	var gList = make(g.List, len(list))
-	for k, v := range list {
-		tMap := gconv.Map(v)
-		gList[k] = tMap
+	//从数据库获取
+	list, err = auth_rule.Model.Order("weigh desc,id asc").FindAll()
+	if err != nil {
+		return
 	}
-	return nil, gList
+	//缓存菜单
+	cache.Set(cache_service.AdminMenu, list, 0, cache_service.AdminAuthTag)
+	return
 }
 
 //检查菜单规则是否存在
@@ -75,23 +104,19 @@ func EditMenu(req *auth_rule.MenuReq, id int) (err error, rows int64) {
 	return
 }
 
-//获取用户组列表
-func GetRoleList(where string, params ...interface{}) (err error, list g.List) {
-	var rl []*role.Entity
-	if where != "" {
-		rl, err = role.Model.Where(where, params).OrderBy("list_order asc,id asc").All()
-	} else {
-		rl, err = role.Model.OrderBy("list_order asc,id asc").All()
-	}
-	if err != nil {
-		g.Log().Error(err)
-		return err, nil
-	}
-	list = make(g.List, len(rl))
-	for k, v := range rl {
-		tMap := gconv.Map(v)
-		list[k] = tMap
+//获取用户组(角色)列表
+func GetRoleList() (list []*role.Entity, err error) {
+	cache := cache_service.New()
+	//从缓存获取
+	iList := cache.Get(cache_service.AdminRole)
+	if iList != nil {
+		list = iList.([]*role.Entity)
+		return
 	}
+	//从数据库获取
+	list, err = role.Model.OrderBy("list_order asc,id asc").All()
+	//缓存数据
+	cache.Set(cache_service.AdminRole, list, 0, cache_service.AdminAuthTag)
 	return
 }
 

+ 15 - 10
app/service/admin/user_service/user.go

@@ -16,7 +16,7 @@ import (
 
 //获取登陆用户ID
 func GetLoginID(r *ghttp.Request) (userId int) {
-	userInfo := GetCacheAdminInfo(r)
+	userInfo := GetLoginAdminInfo(r)
 	if userInfo != nil {
 		userId = gconv.Int(userInfo["id"])
 	}
@@ -24,7 +24,7 @@ func GetLoginID(r *ghttp.Request) (userId int) {
 }
 
 //获取缓存的用户信息
-func GetCacheAdminInfo(r *ghttp.Request) (userInfo g.Map) {
+func GetLoginAdminInfo(r *ghttp.Request) (userInfo g.Map) {
 	resp := boot.AdminGfToken.GetTokenData(r)
 	userInfo = gconv.Map(resp.Get("data"))
 	return
@@ -47,14 +47,18 @@ func GetAdminList(where g.Map, page int) (total int, userList []*user.Entity, er
 }
 
 //获取管理员的角色信息
-func GetAdminRole(userId int) (roles []*role.Entity, err error) {
+func GetAdminRole(userId int, allRoleList []*role.Entity) (roles []*role.Entity, err error) {
 	roleIds, err := GetAdminRoleIds(userId)
 	if err != nil {
 		return
 	}
-	if roleIds != nil {
-		//获取角色信息
-		roles, err = role.Model.Where("id in(?)", roleIds).All()
+	roles = make([]*role.Entity, 0, len(allRoleList))
+	for _, v := range allRoleList {
+		for _, id := range roleIds {
+			if id == v.Id {
+				roles = append(roles, v)
+			}
+		}
 	}
 	return
 }
@@ -110,15 +114,16 @@ func GetAdminMenusByRoleIds(roleIds []int) (menus g.List, err error) {
 		}
 	}
 	//获取所有开启的菜单
-	err, allMenus := auth_service.GetMenuList("status=? and ismenu=?", 1, 1)
+	allMenus, err := auth_service.GetIsMenuStatusList()
 	if err != nil {
 		return
 	}
 	roleMenus := make(g.List, 0, 100)
 	for _, v := range allMenus {
-		if _, ok := menuIds[gconv.Int64(v["id"])]; ok {
-			v["index"] = v["name"]
-			roleMenus = append(roleMenus, v)
+		if _, ok := menuIds[gconv.Int64(v.Id)]; ok {
+			roleMenu := gconv.Map(v)
+			roleMenu["index"] = v.Name
+			roleMenus = append(roleMenus, roleMenu)
 		}
 	}
 	menus = utils.PushSonToParent(roleMenus, 0, "pid", "id", "subs", "", nil, false)

+ 13 - 0
app/service/cache_service/cache_values.go

@@ -0,0 +1,13 @@
+package cache_service
+
+//缓存前缀KEY
+const (
+	AdminMenu = iota
+	AdminRole
+)
+
+//缓存TAG标签
+const (
+	AdminAuthTag = iota
+	AdminCmsTag
+)