|
|
package main
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
)
|
|
|
|
|
|
/**
|
|
|
功能:部门实体Struct
|
|
|
*/
|
|
|
type OrgNode struct {
|
|
|
OrgId int `json:"org_id"`
|
|
|
ParentId int `json:"parent_id"`
|
|
|
SortId int `json:"sort_id"`
|
|
|
OrgName string `json:"org_name"`
|
|
|
Children []*OrgNode `json:"children,omitempty"`
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
功能:从指定节点开始构建树状结构
|
|
|
作者:黄海
|
|
|
时间:2020-06-03
|
|
|
*/
|
|
|
func makeTree(allNode []*OrgNode, node *OrgNode) {
|
|
|
children, _ := haveChild(allNode, node) //是不是有子节点
|
|
|
if children != nil {
|
|
|
node.Children = append(node.Children, children[0:]...) //添加子节点
|
|
|
for _, v := range children { //查询子节点的子节点,并添加到子节点
|
|
|
_, has := haveChild(allNode, v)
|
|
|
if has {
|
|
|
makeTree(allNode, v) //递归添加节点
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
功能:判断是不是有子节点
|
|
|
作者:黄海
|
|
|
时间:2020-06-03
|
|
|
*/
|
|
|
func haveChild(AllNode []*OrgNode, node *OrgNode) (children []*OrgNode, yes bool) {
|
|
|
for _, v := range AllNode {
|
|
|
if v.ParentId == node.OrgId {
|
|
|
children = append(children, v)
|
|
|
}
|
|
|
}
|
|
|
if children != nil {
|
|
|
yes = true
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
功能:json转TreeStruct
|
|
|
作者:黄海
|
|
|
时间:2020-06-04
|
|
|
*/
|
|
|
func jsonToStruct(jsonData []byte) *OrgNode {
|
|
|
var treeNode *OrgNode
|
|
|
err := json.Unmarshal(jsonData, &treeNode)
|
|
|
if err != nil {
|
|
|
fmt.Println(err)
|
|
|
}
|
|
|
return treeNode
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
功能:递归输出结构体
|
|
|
作者:黄海
|
|
|
时间:2020-06-04
|
|
|
*/
|
|
|
func printTree(treeNode *OrgNode) {
|
|
|
for _, v := range treeNode.Children {
|
|
|
fmt.Printf("%d,%d,%s", v.OrgId, v.ParentId, v.OrgName)
|
|
|
if len(v.Children) != 0 {
|
|
|
printTree(v)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func main() {
|
|
|
//申请数组的内存空间
|
|
|
ListOrgNode := make([]*OrgNode, 0)
|
|
|
|
|
|
//添加数据
|
|
|
a := OrgNode{
|
|
|
OrgId: 0,
|
|
|
ParentId: -1,
|
|
|
SortId: 1,
|
|
|
OrgName: "长春市第一中学",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &a)
|
|
|
|
|
|
b := OrgNode{
|
|
|
OrgId: 1,
|
|
|
ParentId: 0,
|
|
|
SortId: 1,
|
|
|
OrgName: "一年级组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &b)
|
|
|
|
|
|
c := OrgNode{
|
|
|
OrgId: 2,
|
|
|
ParentId: 1,
|
|
|
SortId: 1,
|
|
|
OrgName: "一年级语文组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &c)
|
|
|
|
|
|
d := OrgNode{
|
|
|
OrgId: 3,
|
|
|
ParentId: 1,
|
|
|
SortId: 2,
|
|
|
OrgName: "一年级数学组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &d)
|
|
|
|
|
|
e := OrgNode{
|
|
|
OrgId: 4,
|
|
|
ParentId: 0,
|
|
|
SortId: 2,
|
|
|
OrgName: "二年级组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &e)
|
|
|
|
|
|
f := OrgNode{
|
|
|
OrgId: 5,
|
|
|
ParentId: 4,
|
|
|
SortId: 1,
|
|
|
OrgName: "二年级语文组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &f)
|
|
|
|
|
|
g := OrgNode{
|
|
|
OrgId: 6,
|
|
|
ParentId: 4,
|
|
|
SortId: 2,
|
|
|
OrgName: "二年级数学组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &g)
|
|
|
|
|
|
h := OrgNode{
|
|
|
OrgId: 7,
|
|
|
ParentId: 6,
|
|
|
SortId: 1,
|
|
|
OrgName: "二年级数学(奥数)组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &h)
|
|
|
|
|
|
i := OrgNode{
|
|
|
OrgId: 8,
|
|
|
ParentId: 4,
|
|
|
SortId: 3,
|
|
|
OrgName: "二年级化学组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &i)
|
|
|
|
|
|
j := OrgNode{
|
|
|
OrgId: 9,
|
|
|
ParentId: 0,
|
|
|
SortId: 3,
|
|
|
OrgName: "三年级组",
|
|
|
}
|
|
|
ListOrgNode = append(ListOrgNode, &j)
|
|
|
/*************************===================================******/
|
|
|
//结构体的SortId根据数据库获取时,使用order by方法获取有序的子元素集合,这里就不在代码中进行排序了。
|
|
|
|
|
|
//从根节点开始进行构建,递归调用生成tree
|
|
|
startOrgNode := ListOrgNode[0]
|
|
|
makeTree(ListOrgNode, startOrgNode)
|
|
|
//1、根据结构体生成json数据
|
|
|
jsonByte, _ := json.MarshalIndent(startOrgNode, "", "\t")
|
|
|
fmt.Println(string(jsonByte))
|
|
|
|
|
|
//2、将得到的json转回struct
|
|
|
s1 := jsonToStruct(jsonByte)
|
|
|
printTree(s1)
|
|
|
/*************************===================================******/
|
|
|
}
|