diff --git a/app/controller/admin/auth.go b/app/controller/admin/auth.go index 629bd70..76ab82f 100644 --- a/app/controller/admin/auth.go +++ b/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, "获取用户角色数据失败") diff --git a/app/controller/admin/index.go b/app/controller/admin/index.go index e36412f..9f0653d 100644 --- a/app/controller/admin/index.go +++ b/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{ diff --git a/app/service/admin/auth_service/auth_rule.go b/app/service/admin/auth_service/auth_rule.go index 924f8f1..007fe31 100644 --- a/app/service/admin/auth_service/auth_rule.go +++ b/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 { - g.Log().Error(err) - return err, nil + return nil, err } - var gList = make(g.List, len(list)) - for k, v := range list { - tMap := gconv.Map(v) - gList[k] = tMap + var gList = make([]*auth_rule.Entity, 0, len(list)) + for _, v := range list { + if v.Ismenu == 1 { + gList = append(gList, v) + } } - return nil, gList + return gList, nil +} + +//获取isMenu=1且status=1的菜单列表 +func GetIsMenuStatusList() ([]*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 && 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 + } + //从数据库获取 + list, err = auth_rule.Model.Order("weigh desc,id asc").FindAll() + if err != nil { + return + } + //缓存菜单 + 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 } diff --git a/app/service/admin/user_service/user.go b/app/service/admin/user_service/user.go index 026b1a2..e5c58c8 100644 --- a/app/service/admin/user_service/user.go +++ b/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) diff --git a/app/service/cache_service/cache_values.go b/app/service/cache_service/cache_values.go new file mode 100644 index 0000000..f8c7a1f --- /dev/null +++ b/app/service/cache_service/cache_values.go @@ -0,0 +1,13 @@ +package cache_service + +//缓存前缀KEY +const ( + AdminMenu = iota + AdminRole +) + +//缓存TAG标签 +const ( + AdminAuthTag = iota + AdminCmsTag +)