当前位置: 代码迷 >> 综合 >> 7-实现无限级菜单
  详细解决方案

7-实现无限级菜单

热度:23   发布时间:2023-10-16 11:44:24.0

[toc]

第一种方法

数据表如下-- ----------------------------
-- Table structure for `auth_menu`
-- ----------------------------
DROP TABLE IF EXISTS `auth_menu`;
CREATE TABLE `auth_menu` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL COMMENT '父级菜单id',
`name` char(20) NOT NULL COMMENT '菜单名单',
`sort` tinyint(4) DEFAULT '0' COMMENT '排序值',
`route` varchar(60) DEFAULT '' COMMENT '跳转链接',
PRIMARY KEY (`id`),
KEY `pid` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COMMENT='权限管理_菜单表';-- ----------------------------
-- Records of auth_menu
-- ----------------------------
INSERT INTO `auth_menu` VALUES ('14', '0', '设置', '1', '');
INSERT INTO `auth_menu` VALUES ('15', '14', '权限管理', '1', '');
INSERT INTO `auth_menu` VALUES ('16', '14', '我的设置', '2', '');
INSERT INTO `auth_menu` VALUES ('18', '15', '角色列表', '2', '/auth/role');
INSERT INTO `auth_menu` VALUES ('19', '15', '权限列表', '3', '/auth/permission');
INSERT INTO `auth_menu` VALUES ('20', '15', '行为列表', '4', '/auth/action');
INSERT INTO `auth_menu` VALUES ('21', '15', '菜单列表', '5', '/auth/menu');
INSERT INTO `auth_menu` VALUES ('22', '16', '基本信息', '1', '/administrator/adminInfo');
INSERT INTO `auth_menu` VALUES ('23', '15', '管理员列表', '8', '/auth/administrator');
文件 menu.go (使用beego orm)type Menu struct {Id int			`json:"id"`Pid int			`json:"pid"`Name string 	`json:"name"`Sort int 		`json:"sort"`Route string	`json:"route"`
}type TreeList struct {Id int			`json:"id"`Name string		`json:"name"`Pid int			`json:"pid"`Sort int 		`json:"sort"`Route string	`json:"route"`Children []*TreeList	`json:"children"`
}func init()  {// 注册模型orm.RegisterModel(new(Menu))
}func (m *Menu)TableName() string {return "auth_menu"
}/**
菜单列表
*/
func (m *Menu)MenuList() []*TreeList{return m.getMenu(0)
}/**
递归获取树形菜单
*/
func (m *Menu)getMenu(pid int) []*TreeList {o := orm.NewOrm()var menu []Menu_,_ = o.QueryTable("auth_menu").Filter("pid", pid).OrderBy("sort").All(&menu)treeList := []*TreeList{}for _, v := range menu{child := v.getMenu(v.Id)node := &TreeList{Id:v.Id,Name:v.Name,Sort:v.Sort,Route:v.Route,Pid:v.Pid,}node.Children = childtreeList = append(treeList, node)}return treeList
}

第二种方法

// getNodeObj 从数据库中查询全部对象
func (view ProductViewSet) getNodeObj() (objs []ProductModel, err error) {if err = db.GetDbClient().Where("company_id = ? AND level <= ? ", view.companyId, limitLevel).Find(&objs).Error; err != nil {return}return
}// v1 版本
func (view ProductViewSet) buildNode(obj ProductModel) (nodeObj NodeV2) {nodeObj = NodeV2{Label: obj.Name,ID:    obj.ID,PID:   obj.PID,}return
}// v1 版本
func (view ProductViewSet) getChildNode(id uint) (v []NodeV2) {for _, obj := range view.objs {if obj.PID == id {nodeObj := view.buildNode(obj)if obj.Level < limitLevel {nodeObj.Children = view.getChildNode(obj.ID)}v = append(v, nodeObj)}}return
}// getNodeTree 循环数据库查询出来的对象
func (view ProductViewSet) getNodeTree(statistics bool) (data []*NodeV2) {var (atNodeData *NodeV2)for _, v := range view.objs {atNodeData = &NodeV2{ID:    v.ID,PID:   v.PID,Label: v.Name,}// 上一级的id等于本级的pidif v.PID == 0 {data = append(data, atNodeData)continue}view.getChildNode2(v.PID, data, atNodeData)//for _, v1 := range data {//	if v.PID == v1.ID {//		v1.Children = append(v1.Children, atNodeData)//	}//	for _, v2 := range v1.Children {//		if v.PID == v2.ID {//			v2.Children = append(v2.Children, atNodeData)//		}//		for _, v3 := range v2.Children {//			if v.PID == v3.ID {//				v3.Children = append(v3.Children, atNodeData)//			}//			for _, v4 := range v3.Children {//				if v.PID == v4.ID {//					v4.Children = append(v4.Children, atNodeData)//				}//				for _, v5 := range v4.Children {//					if v5.ID == v.PID {//						v5.Children = append(v5.Children, atNodeData)//						fmt.Println("v5::::", atNodeData, v.PID)//					}//					fmt.Println(atNodeData, v.PID)//				}//			}//		}//	}//}}return data
}// buildData 递归添加数据
func (view ProductViewSet) getChildNode2(pid uint, data []*NodeV2, atNodeData *NodeV2) {for _, v := range data {if v.ID == pid {v.Children = append(v.Children, atNodeData)}view.getChildNode(pid, v.Children, atNodeData)}return
}
  相关解决方案