package repo import ( appModel "busniess-user-center/internal/models/application" "sort" "github.com/jinzhu/copier" ) func convertMenu(menu Menu) appModel.Menu { aMenu := appModel.Menu{} copier.Copy(aMenu, menu) return aMenu } func makeTreeStructure(menuArr []Menu) []appModel.Menu { // 1、组装树形结构 // 数组转map var levelOneMenuArr []appModel.Menu parentCodeMenuMap := make(map[string][]appModel.Menu) for _, menu := range menuArr { // 一级菜单不处理 if len(menu.ParentCode) == 0 { levelOneMenuArr = append(levelOneMenuArr, convertMenu(menu)) continue } // 二级菜单以下按照parentCode分组 parentCode := menu.ParentCode if _, ok := parentCodeMenuMap[parentCode]; !ok { parentCodeMenuMap[parentCode] = []appModel.Menu{convertMenu(menu)} } else { parentCodeMenuMap[parentCode] = append(parentCodeMenuMap[parentCode], convertMenu(menu)) } } // 2、处理子级并排序 for _, subMenuArr := range parentCodeMenuMap { for _, menu := range subMenuArr { children := parentCodeMenuMap[menu.Code] sort.Slice(children, func(i, j int) bool { return children[i].Order < children[j].Order }) menu.Children = children } } for _, menu := range levelOneMenuArr { children := parentCodeMenuMap[menu.Code] sort.Slice(children, func(i, j int) bool { return children[i].Order < children[j].Order }) menu.Children = children } sort.Slice(levelOneMenuArr, func(i, j int) bool { return levelOneMenuArr[i].Order < levelOneMenuArr[j].Order }) return levelOneMenuArr }