原文地址  http://www.niu12.com/article/37

golang实现无限级菜单(beego框架下)

数据表如下

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

最新文章

  1. jQuery模仿人类打字效果插件typetype
  2. 删除 QQ 最新版右键菜单 通过QQ发送文件到手机
  3. Read N Characters Given Read4 I & II
  4. Python基础2- Hello,world
  5. lintcode: k Sum 解题报告
  6. alert,confirm和prompt
  7. C语言中随机数相关问题
  8. Paying for upgrades, by Bob Arnson
  9. 重装eclipse要做的事(二)---设置工作空间默认编码
  10. git clone 远程分支
  11. kali虚拟机安装提示安装系统步骤失败
  12. akoj-1153-p次方求和
  13. 解决苹果电脑(mac)管理员账户变成了普通用户后不能解锁用户与群组的问题
  14. ng-book札记——依赖注入
  15. Python_sniffer(网络嗅探器)
  16. rabbitmq应用
  17. 【js】js声明与数据类型
  18. 微信小程序:首页设置方法(开发模式,使用模式)与其他相关设置
  19. linux中查看http各种状态数量
  20. Verilog HDL中的运算符关系

热门文章

  1. java文件夹上传下载组件
  2. 【mysql】知识点
  3. 【JQuery】操作前端控件知识笔记
  4. aix 10代oracle zabbix2.4.4 日志监控
  5. AtCoder Grand Contest 009 题解
  6. ELK教程1:ElasticSearch集群的部署ELK
  7. golang-flag - 命令行参数解析
  8. vue-cli3配置多页面入口
  9. Java枚举类接口实战
  10. C# 使用大漠插件, 源码在Github和码云 ..希望对大家有所帮助