package service import ( "iot_manager_service/app/system/dao" "iot_manager_service/app/system/model" "iot_manager_service/util" ) var MenuService = new(menuService) type menuService struct{} func (s *menuService) Get(id int64) (*dao.Menu, error) { menu := &dao.Menu{ ID: id, } err := menu.Get() if err != nil { return nil, err } return menu, nil } func (s *menuService) Submit(req dao.Menu) *util.Errors { role := &req if role.ID == 0 { err := role.Save() if err != nil { return util.FailResponse(err.Error(), nil) } return util.SuccessResponse(util.Succeeded, nil) } err := role.Update() if err != nil { return util.FailResponse(err.Error(), nil) } return util.SuccessResponse(util.Succeeded, nil) } func (s *menuService) GetAll() []dao.Menu { menu := &dao.Menu{} menus, err := menu.GetAll() if err != nil { return nil } return menus } func (s *menuService) Routes(roleId int64) (*model.RsqMenuRoutes, error) { allMenus := MenuService.GetAll() menuMap := make(map[int64]dao.Menu) for _, menu := range allMenus { menuMap[menu.ID] = menu } roleMenus := RoleMenuService.GetMenuByRole(roleId) rsp := &model.RsqMenuRoutes{} //上级角色——多个下级角色数组 tmp := make(map[int64][]dao.Menu) for _, roleMenu := range roleMenus { if menu, isExist := menuMap[roleMenu.MenuId]; isExist { childes, isExist := tmp[menu.ParentId] if isExist { childes = append(childes, menu) tmp[menu.ParentId] = childes } else { tmp[menu.ParentId] = []dao.Menu{menu} } } } if len(tmp) == 0 { return nil, nil } roots, _ := tmp[0] rsp.MenuRouteDetails = menuDfs(rsp.MenuRouteDetails, roots, tmp) return rsp, nil } func menuDfs(result []model.MenuRouteDetail, menus []dao.Menu, tmp map[int64][]dao.Menu) []model.MenuRouteDetail { if len(menus) == 0 { return nil } for _, child := range menus { detail := model.MenuRouteDetail{} detail.Menu = child childes, isExist := tmp[child.ID] if isExist { detail.HasChildren = true detail.Children = menuDfs([]model.MenuRouteDetail{}, childes, tmp) result = append(result, detail) } else { detail.HasChildren = false result = append(result, detail) } } return result }