[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
}