1. 數(shù)據(jù)庫結(jié)構(gòu)
圖片.png
2.數(shù)據(jù)庫結(jié)構(gòu)體
type Menu struct {
Id int64 //id
SiteId int64 //站點(diǎn)id
MenuName string //目錄名稱
PmenuId int64 //父級(jí)id
MenuUrl string //鏈接地址
IconId string //目錄圖標(biāo)
Sorts int64 //排序
Child []*Menu //多個(gè)子級(jí)目錄
}
3.查詢所有菜單函數(shù)
func GetMenu() []*Menu{
//定義指針切片用來存儲(chǔ)所有菜單
var menus []*Menu
//定義指針切片返回控制器
var res []*Menu
//查詢所有pmenu_id為0的數(shù)據(jù),也就是一級(jí)菜單,site_id是站點(diǎn),可以忽略
Db.Table("hb_menu").Where("pmenu_id=?",0).Where("site_id=?",1).Order("id desc").Find(&menus)
//判斷是否存在數(shù)據(jù),存在進(jìn)行樹狀圖重構(gòu)
if reflect.ValueOf(menus).IsValid() {
//將一級(jí)菜單傳遞給回調(diào)函數(shù)
res=tree(menus)
}
return res
}
4.生成樹結(jié)構(gòu)
//生成樹結(jié)構(gòu)
func tree(menus []*Menu) []*Menu {
//定義子節(jié)點(diǎn)目錄
var nodes []*Menu
if reflect.ValueOf(menus).IsValid() {
//循環(huán)所有一級(jí)菜單
for k,v:=range menus{
//查詢所有該菜單下的所有子菜單
Db.Table("hb_menu").Where("pmenu_id= ?",v.Id).Find(&nodes)
//將子菜單的數(shù)據(jù)循環(huán)賦值給父菜單
for kk,_:=range nodes{
menus[k].Child=append(menus[k].Child,nodes[kk])
}
//將剛剛查詢出來的子菜單進(jìn)行遞歸,查詢出三級(jí)菜單和四級(jí)菜單
tree(nodes)
}
}
return menus
}
5.在樹循環(huán)里面需要注意,因?yàn)閏hild用的是指針,所以賦值不能用v,要用nodes[kk],這點(diǎn)需要注意,關(guān)于目錄的修改也是同樣的道理
6.生成的樹狀圖
圖片.png