package service
|
|
import (
|
"basic.com/valib/logger.git"
|
"errors"
|
"sort"
|
"strings"
|
"vamicro/extend/util"
|
"vamicro/system-service/models"
|
"vamicro/system-service/vo"
|
)
|
|
type SysMenuService struct {
|
|
}
|
|
func (sms *SysMenuService) Save(menu models.SysMenu) (bool,models.SysMenu){
|
if menu.ParentId == "" || menu.ParentId == "0" {
|
menu.ParentId = "0"
|
menu.ParentIds= "0"
|
} else {
|
var pMenu models.SysMenu
|
|
rows,_ := pMenu.SelectById(menu.ParentId)
|
if rows > 0 {
|
menu.ParentIds = pMenu.ParentIds+","+pMenu.Id
|
} else {
|
menu.ParentId = "0"
|
menu.ParentIds= "0"
|
}
|
}
|
if menu.Id == "" {
|
menu.Id = util.PseudoUuid()
|
if menu.Insert() {
|
return true,menu
|
} else {
|
return false,menu
|
}
|
} else {
|
if menu.Update() {
|
return true,menu
|
} else {
|
return false,menu
|
}
|
}
|
}
|
|
/*
|
默认应用可以具体到内部的按钮权限
|
可选应用只控制到菜单的显示
|
*/
|
func (sms *SysMenuService) GetMenuTree(userId string, myMenuIds map[string]string) ([]vo.SysMenuTree,error) {
|
var user models.SysUser
|
rows, _ := user.SelectById(userId)
|
if rows >0 {
|
var menuE models.SysMenu
|
allMenus := menuE.FindAll()
|
|
var menuM = make(map[string]models.SysMenu, 0)
|
if allMenus !=nil {
|
for _,mu :=range allMenus {
|
menuM[mu.Id] = mu
|
}
|
}
|
|
var role models.SysRole
|
roles := role.FindByUserId(user.Id)
|
logger.Debug("len(roles):", len(roles))
|
if roles !=nil && len(roles) >0 {
|
var userMenus []models.SysMenu
|
if roles[0].Name == "超级管理员" {
|
userMenus = allMenus
|
} else if roles[0].Name == "管理员" || roles[0].Name == "普通用户" {
|
//查本人可以看到的菜单
|
userMenus = menuE.FindByUserId(user.Id)
|
if len(userMenus) == 0 {
|
userMenus = menuE.FindByRoleId(roles[0].Id)
|
}
|
//userMenus = allMenus
|
}
|
logger.Debug("len(userMenus):", len(userMenus))
|
var uM = make(map[string]models.SysMenu,0)
|
if len(userMenus) >0 {
|
for _,srmE := range userMenus{
|
if _,ok :=uM[srmE.Id];!ok{
|
menuModel := menuM[srmE.Id]
|
uM[menuModel.Id] = menuModel
|
|
pidArr := strings.Split(menuModel.ParentIds, ",")
|
for _,pid :=range pidArr {
|
if pid !="" && pid !="0" {
|
if _,k :=uM[pid];!k{
|
uM[pid] = menuM[pid]
|
}
|
}
|
}
|
}
|
}
|
|
var allUserMenus []models.SysMenu
|
for _,v :=range uM {
|
allUserMenus = append(allUserMenus, v)
|
}
|
uS := menuFormat(&allUserMenus,"0", myMenuIds)
|
var sUs uMenuT
|
sUs = uS
|
sort.Sort(sUs)
|
return sUs,nil
|
} else {
|
return []vo.SysMenuTree{},nil
|
}
|
} else {
|
return nil,errors.New("user role wrong")
|
}
|
} else {
|
return nil,errors.New("user not found")
|
}
|
}
|
|
func menuFormat(dbArr *[]models.SysMenu, parentId string, myMenuIds map [string]string) []vo.SysMenuTree {
|
var arr []vo.SysMenuTree
|
for _, m := range *dbArr {
|
if parentId == m.ParentId {
|
tmp := vo.SysMenuTree{}
|
tmp.Id = m.Id
|
tmp.Name = m.Name
|
tmp.Sort = m.Sort
|
_,ok := myMenuIds[m.Id]
|
tmp.Selected = ok
|
|
children := menuFormat(dbArr, m.Id, myMenuIds)
|
tmp.Children = children
|
arr = append(arr, tmp)
|
}
|
}
|
var sUs uMenuT
|
sUs = arr
|
sort.Sort(sUs)
|
return sUs
|
}
|
|
type uMenuT []vo.SysMenuTree
|
|
func (ul uMenuT) Len()int {
|
return len(ul)
|
}
|
func (ul uMenuT) Swap(i,j int) {
|
ul[i],ul[j] = ul[j],ul[i]
|
}
|
func (ul uMenuT) Less(i,j int) bool {
|
return ul[i].Sort < ul[j].Sort
|
}
|