7-实现无限级菜单

[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 = child
        treeList = 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等于本级的pid
		if 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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值