golang无限树分类

whyme_7ac2 · · 1182 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1. 数据库结构

图片.png

2.数据库结构体

type Menu struct {
    Id       int64  //id
    SiteId   int64  //站点id
    MenuName string //目录名称
    PmenuId  int64  //父级id
    MenuUrl  string //链接地址
    IconId   string //目录图标
    Sorts    int64  //排序
    Child    []*Menu //多个子级目录
}

3.查询所有菜单函数

func GetMenu()  []*Menu{

    //定义指针切片用来存储所有菜单
    var menus []*Menu

    //定义指针切片返回控制器
    var res []*Menu

    //查询所有pmenu_id为0的数据,也就是一级菜单,site_id是站点,可以忽略
    Db.Table("hb_menu").Where("pmenu_id=?",0).Where("site_id=?",1).Order("id desc").Find(&menus)

    //判断是否存在数据,存在进行树状图重构
    if reflect.ValueOf(menus).IsValid() {
        //将一级菜单传递给回调函数
        res=tree(menus)
    }
    return res
}

4.生成树结构

//生成树结构
func tree(menus []*Menu) []*Menu {
    //定义子节点目录
    var nodes []*Menu
    if reflect.ValueOf(menus).IsValid() {
        //循环所有一级菜单
        for k,v:=range menus{
                //查询所有该菜单下的所有子菜单
                Db.Table("hb_menu").Where("pmenu_id= ?",v.Id).Find(&nodes)

                //将子菜单的数据循环赋值给父菜单
                for kk,_:=range nodes{
                    menus[k].Child=append(menus[k].Child,nodes[kk])
                }
                //将刚刚查询出来的子菜单进行递归,查询出三级菜单和四级菜单
                tree(nodes)
        }
    }
    return menus
}

5.在树循环里面需要注意,因为child用的是指针,所以赋值不能用v,要用nodes[kk],这点需要注意,关于目录的修改也是同样的道理


6.生成的树状图

图片.png

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:whyme_7ac2

查看原文:golang无限树分类

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1182 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传