zhangzengfei
2023-09-05 63645d248c765244488cd34dbc1bb6528ca6b7c7
system-service/service/sysMenuService.go
@@ -1,152 +1,152 @@
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
}
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
}