Gorm 实现无限树形菜单

打印 上一主题 下一主题

主题 539|帖子 539|积分 1617

原文链接:https://www.zhoubotong.site/post/91.html
通常树形菜单的实现基本就是递归调用,大部分场景毕竟这种数据不多,性能倒是并不突出, 下面给个demo,有兴趣的朋友可以看看: 新建一个city表:
  1. CREATE TABLE `city` (
  2.   `id` int NOT NULL AUTO_INCREMENT,
  3.   `pid` int NOT NULL DEFAULT '0' COMMENT '父级别id',
  4.   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '名称',
  5.   PRIMARY KEY (`id`) USING BTREE,
  6.   KEY `pid` (`pid`) USING BTREE
  7. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
复制代码
测试数据:
  1. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (1, 0, '广东省');
  2. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (2, 1, '广州市');
  3. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (3, 2, '广州天河区');
  4. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (4, 2, '海珠区');
  5. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (5, 0, '福建省');
  6. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (6, 5, '厦门市');
  7. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (7, 4, '新港');
  8. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (8, 4, '沙园');
  9. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (9, 7, '新港一区');
  10. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (10, 0, '湖北省');
  11. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (11, 10, '武汉市');
  12. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (12, 11, '黄陂区');
  13. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (13, 11, '洪山区');
  14. INSERT INTO `city` (`id`, `pid`, `name`) VALUES (14, 12, '黄陂天河街道');
复制代码
demo.go:
  1. package main
  2. import (
  3.     "encoding/json"
  4.     "fmt"
  5.     "gorm.io/driver/mysql"
  6.     "gorm.io/gorm"
  7. )
  8. var DB gorm.DB
  9. func (u TreeNode) TableName() string {
  10.     return "city"
  11. }
  12. type TreeNode struct {
  13.     Id       int         `json:"id"`
  14.     Pid      int         `json:"pid" gorm:"index"`
  15.     Name     string      `json:"name" gorm:"size:255"`
  16.     Children []*TreeNode `json:"children" gorm:"-"`
  17. }
  18. func init() {
  19.     dsn := "root:uos123456@tcp(11213:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
  20.     db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  21.     if err != nil {
  22.         panic("failed to connect database")
  23.     }
  24.     DB = *db
  25. }
  26. func main() {
  27.     data := TreeList(10) // 查询武汉市下的子节点
  28.     str, _ := json.Marshal(data)
  29.     fmt.Printf("%s\\n", str)
  30. }
  31. // TreeList 递归处理子节点list
  32. func TreeList(pid int) []*TreeNode {
  33.     var list []*TreeNode
  34.     DB.Model(TreeNode{}).Where("pid= ?", pid).Find(&list)
  35.     result := make([]*TreeNode, 0)
  36.     for _, v := range list {
  37.         if v.Pid == pid {
  38.             v.Children = TreeList(v.Id)
  39.             if v.Children == nil {
  40.                 v.Children = make([]*TreeNode, 0)
  41.             }
  42.             result = append(result, v)
  43.         }
  44.     }
  45.     return result
  46. }
复制代码
输出结果:
  1. [Running] go run "/media/uos/G/web/demo-go/demo.go"
  2. [{"id":11,"pid":10,"name":"武汉市","children":[{"id":12,"pid":11,"name":"黄陂区","children":[{"id":14,"pid":12,"name":"黄陂天河街道","children":[]}]},{"id":13,"pid":11,"name":"洪山区","children":[]}]}]
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表