You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

224 lines
5.4 KiB

package userService
import (
"GoBanpen/core/comm"
"GoBanpen/models"
"GoBanpen/modeluis"
"encoding/json"
"fmt"
"github.com/go-macaron/cache"
ruisUtil "github.com/mgr9525/go-ruisutil"
"github.com/xormplus/builder"
"gopkg.in/macaron.v1"
"strings"
)
func FindTreePermission() []*modeluis.TreePermssion {
rets := make([]*modeluis.TreePermssion, 0)
err := comm.DbMain.Where("parent is null or parent=''").OrderBy("sort ASC,id ASC").Find(&rets)
if err != nil {
println("findPermChilds err:" + err.Error())
return nil
}
for _, v := range rets {
findPermChilds(v, nil)
}
return rets
}
func findPermChilds(parent *modeluis.TreePermssion, upms map[string]bool) {
if parent == nil {
return
}
childs := make([]*modeluis.TreePermssion, 0)
err := comm.DbMain.Where("parent=?", parent.Uuid).OrderBy("sort ASC,id ASC").Find(&childs)
if err != nil {
println("findPermChilds err:" + err.Error())
return
}
for _, v := range childs {
findPermChilds(v, upms)
}
if len(childs) > 0 && len(parent.Value) > 0 {
t := *parent
ts := []*modeluis.TreePermssion{&t}
childs = append(ts, childs...)
parent.Uuid = ""
}
parent.Childs = childs
}
func FindUPermissions(uid string) []*modeluis.SysPermssion {
if len(uid) <= 0 {
return nil
}
perms := make(map[string]*modeluis.SysPermssion)
userRole := FindUserRole(uid)
//comm.DbMain.SqlTemplateClient("role.stpl")
//rids:=strings.Split(userRole.RoleCodes,",")
ses := comm.DbMain.Where("uuid='common'")
if len(userRole.RoleCodes) > 0 {
rcds := strings.Split(userRole.RoleCodes, ",")
ses.Or(builder.In("uuid", rcds))
}
roles := make([]*models.SysRole, 0)
err := ses.Find(&roles)
if err != nil {
println("FindUserPermission err:" + err.Error())
return nil
}
for _, role := range roles {
if len(role.Perms) <= 0 {
continue
}
permssions := make([]*modeluis.SysPermssion, 0)
ses := comm.DbMain.Where(builder.In("uuid", strings.Split(role.Perms, ",")))
err := ses.Find(&permssions)
if err != nil {
println("FindUserPermission err:" + err.Error())
continue
}
limids := map[string]bool{}
if len(userRole.Limits) > 0 {
rcds := strings.Split(userRole.Limits, ",")
for _, v := range rcds {
limids[v] = true
}
}
for _, perm := range permssions {
if len(perm.Value) > 0 {
if limids[perm.Uuid] == true {
perm.Had = true
}
perms[perm.Value] = perm
}
}
}
rets := make([]*modeluis.SysPermssion, 0)
for _, v := range perms {
rets = append(rets, v)
}
return rets
}
func FindUserRole(uid string) *models.SysUserRole {
userRole := new(models.SysUserRole)
ok, err := comm.DbMain.Where("user_code=?", uid).Get(userRole)
if err != nil {
println("FindUserPermission err:" + err.Error())
} else if !ok {
userRole.UserCode = uid
comm.DbMain.Insert(userRole)
}
return userRole
}
func FindUserRoles(uid string) []*modeluis.SysURole {
userRole := FindUserRole(uid)
rcds := make(map[string]bool)
if len(userRole.RoleCodes) > 0 {
rids := strings.Split(userRole.RoleCodes, ",")
for _, v := range rids {
rcds[v] = true
}
}
roles := make([]*modeluis.SysURole, 0)
err := comm.DbMain.Where("uuid!='common'").Find(&roles)
if err != nil {
println("FindUserRoles:" + err.Error())
}
for _, v := range roles {
v.Had = rcds[v.Uuid] == true
v.Permls = sysService.FindPermissions(v.Perms)
}
return roles
}
func FindUserPermission(uid string) map[string]bool {
perms := make(map[string]bool)
userRole := FindUserRole(uid)
//comm.DbMain.SqlTemplateClient("role.stpl")
//rids:=strings.Split(userRole.RoleCodes,",")
ses := comm.DbMain.Where("uuid='common'")
if len(userRole.RoleCodes) > 0 {
rcds := strings.Split(userRole.RoleCodes, ",")
ses.Or(builder.In("uuid", rcds))
}
roles := make([]*models.SysRole, 0)
err := ses.Find(&roles)
if err != nil {
println("FindUserPermission err:" + err.Error())
return perms
}
for _, role := range roles {
if len(role.Perms) <= 0 {
continue
}
permssions := make([]*models.SysPermssion, 0)
ses := comm.DbMain.Where(builder.In("uuid", strings.Split(role.Perms, ",")))
if len(userRole.Limits) > 0 {
rcds := strings.Split(userRole.Limits, ",")
ses.And(builder.NotIn("uuid", rcds))
}
err := ses.Find(&permssions)
if err != nil {
println("FindUserPermission err:" + err.Error())
continue
}
for _, perm := range permssions {
if len(perm.Value) > 0 {
perms[perm.Value] = true
}
}
}
return perms
}
func FindUserPermissionCache(uid string, ch cache.Cache) map[string]bool {
key := fmt.Sprintf("user-permission:%s", uid)
perms := make(map[string]bool)
if ch.IsExist(key) {
bts := ch.Get(key).([]byte)
json.Unmarshal(bts, &perms)
} else {
perms = FindUserPermission(uid)
bts, err := json.Marshal(perms)
if err == nil {
err = ch.Put(key, bts, 3600*10)
if err != nil {
println("cache put err:" + err.Error())
}
}
}
return perms
}
func CheckPermission(uid, perm string, ch cache.Cache) (rb bool) {
key := fmt.Sprintf("user-permission:%s", uid)
defer ruisUtil.Recovers("CheckPermmsion", func(errs string) {
rb = false
ch.Delete(key)
})
if len(perm) <= 0 {
return false
}
perms := FindUserPermissionCache(uid, ch)
return perms[perm]
}
func CheckUPermission(perm string, c *macaron.Context, ch cache.Cache) (rb bool) {
defer ruisUtil.Recovers("CheckUPermmsion", func(errs string) {
rb = false
})
lguser := GetCurrentUser(c)
if lguser == nil {
return false
}
return CheckPermission(lguser.Uuid, perm, ch)
}