权限树

// XMSCategory _
type XMSCategory struct {
    ID         int64  `json:"id"`
    Name       string `json:"name"`
    Level      int64  `json:"level"`
    ParentID   int64  `json:"parentId"`
    SerialType string `json:"serialType"`
}
type XMSCategoryChild struct {
    ID            int64  `json:"id"`
    Name          string `json:"name"`
    Level         int64  `json:"level"`
    ParentID      int64  `json:"parentId"`
    SerialType    string `json:"serialType"`
    CategoryChild []*XMSCategoryChild
}
// 获取所有分类
func GetAllCategory() (perms []XMSCategoryChild) {
    child := XMSCategoryChild{0, "all category", 0, -1, "", []*XMSCategoryChild{}}
    err := getTreeNode(0, &child)
    if err != nil {
        return
    }
    perms = append(perms, child)
    return perms
}

// 递归获取子节点
func getTreeNode(pId int64, treeNode *XMSCategoryChild) error {
    perms, err := getDataByPid(pId) //根据父结点Id查询数据表,获取相应的子结点信息(使用gorm)
    if err != nil {
        return err
    }
    for i := 0; i < len(perms); i++ {
        child := XMSCategoryChild{
            perms[i].ID,
            perms[i].Name,
            perms[i].Level,
            perms[i].ParentID,
            perms[i].SerialType,
            []*XMSCategoryChild{},
        }
        treeNode.CategoryChild = append(treeNode.CategoryChild, &child)
        _ = getTreeNode(perms[i].ID, &child)
    }
    return err
}

func getDataByPid(pid int64) (result []*XMSCategoryChild, err error) {
    data, err := getCategoryChildData()
    if err != nil {
        return
    }

    for _, val := range data {
        if pid == val.ParentID {
            result = append(result, val)
        }
    }
    return
}

func getCategoryChildData() (tmpSliceData []*XMSCategoryChild, err error) {
    _, data, err1 := Category()
    if err1 != nil {
        err = err1.ToError()
        return
    }
    for _, value := range data {
        tmpData := &XMSCategoryChild{
            ParentID:   value.ParentID,
            ID:         value.ID,
            Name:       value.Name,
            Level:      value.Level,
            SerialType: value.SerialType,
        }

        tmpSliceData = append(tmpSliceData, tmpData)
    }
    return
}