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 }