

Go项目实战之无限级结构树形数据格式(易扩展方式)【goshop开源项目 | 20220430更新...
source link: https://studygolang.com/articles/35623
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Go项目实战之无限级结构树形数据格式(易扩展方式)【goshop开源项目 | 20220430更新】
qiaoshuai951123 · 大约18小时之前 · 50 次点击 · 预计阅读时间 4 分钟 · 大约8小时之前 开始浏览goshop开源项目的更新
备注:前面项目中用到的代码已经分享到
GitHub
中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。地址
goshop
感兴趣的可以点个star
哦~goshop开源项目的更新
今天咱们做一个无限级结构树形数据格式
:
做一个菜单列表形式的一个树形结构,以满足后续的功能业务开发,类似于下图的功能
做成方便扩展的方式
接下来咱们就来实现以上的问题和功能:
- 先修改一下分页获取全部数据的方法
findAll
,将之前[]Roles
改为[]*Roles
,如果这里不明白的话,请看之前的的文章:Go项目实战之开发完善分页插件(易扩展方式)-------【goshop开源项目】【第12次更新】
// 根据检索条件,获取记录行,并获取总记录条数
func (Roles) FindAll(DB *gorm.DB, params map[string]interface{}) ([]*Roles, int64) {
var GoodResult []*Roles
page := params["page"].(string) // 对返回的interface类型进行转换成字符串
pageSize := params["pageSize"].(string) // 对返回的interface类型进行转换成字符串
// 这里使用了过滤,在下面使用Where条件时过滤掉page,pageSize
ParamsFilter := utils.ParamsFilter(params, "page,pageSize")
// 通过 Scopes 引用加载 分页类中返回的 DB指针
DB.Scopes(Paginate.Paginate(page, pageSize)).Where(ParamsFilter).Order("created_at desc").Find(&Result)
// 这里时查询全部数据,用于返回总记录条数
TotalCount := DB.Find(&Goods{})
return Result, TotalCount.RowsAffected
}
// 这是过滤的封装,一起贴出来了
func ParamsFilter(params map[string]interface{}, isFilterStr string) map[string]interface{} {
var data = make(map[string]interface{})
for key, value := range params {
if find := strings.Contains(isFilterStr, key); !find {
data[key] = value
}
}
return data
}
- 接下来就是重头戏了,将查询出来的
[]*Roles
结构体数据,处理成咱们预想的数据格式
// 对应的数据结构体
type Roles struct {
Model
Name string `json:"name" gorm:"size:100;index;default:'';not null;"` // 角色名称
Alias string `json:"alias" grom:"size:255;index;default:'';not nill;"` // 别名
ParentID uint `json:"parent_id" gorm:"size:10;index;default:0;not null;"` // 父级ID
Sort uint `json:"sort" gorm:"size:1;index;default:0;"` // 排序值
Remark string `json:"remark" gorm:"size:255;"` // 备注
Status uint `json:"status" gorm:"size:1;index;default:0;"` // 状态(1:启用 2:禁用)
Children *RoleTrees `json:"children"` // 这里是最关键的一步
}
// RoleTrees 二叉树列表
type RoleTrees []*Roles
// ToTree 转换为树形结构
func (Roles) ToTree(data RoleTrees) RoleTrees {
// 定义 HashMap 的变量,并初始化
TreeData := make(map[uint]*Roles)
// 先重组数据:以数据的ID作为外层的key编号,以便下面进行子树的数据组合
for _, item := range data {
TreeData[item.ID] = item
}
// 定义 RoleTrees 结构体
var TreeDataList RoleTrees
// 开始生成树形
for _, item := range TreeData {
// 如果没有根节点树,则为根节点
if item.ParentID == 0 {
// 追加到 TreeDataList 结构体中
TreeDataList = append(TreeDataList, item)
// 跳过该次循环
continue
}
// 通过 上面的 TreeData HashMap的组合,进行判断是否存在根节点
// 如果存在根节点,则对应该节点进行处理
if p_item, ok := TreeData[item.ParentID]; ok {
// 判断当次循环是否存在子节点,如果没有则作为子节点进行组合
if p_item.Children == nil {
// 写入子节点
children := RoleTrees{item}
// 插入到 当次结构体的子节点字段中,以指针的方式
p_item.Children = &children
// 跳过当前循环
continue
}
// 以指针地址的形式进行追加到结构体中
*p_item.Children = append(*p_item.Children, item)
}
}
return TreeDataList
}
- 到这里逻辑代码已经全部完成了,但是如何使用呢? 下面咱们就来说一下如何使用?在
controller
中进行调用:
// 查询数据
var roles model.Roles
Result, totalCount := roles.FindAll(DB, params)
TreeResult := roles.ToTree(Result)
走到这里就实现了无限级结构树形数据格式
~~~
更多功能请持续关注!!!!!
欢迎各位加我的微信(jobhandsome
)跟我一起完成并推动项目的发展!
有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077
Recommend
-
52
导读 今天小编来给分享Linux 系统下一个非常有用的命令的使用:tree命令可以以树形结构显示文件目录结构,它非常适合于我们给别人介绍我们的文件目录的组成框架,同时该命令使用适当的参数也可以将命令结果输出...
-
44
最近做数据收集工作,需要核对哪些数据已收到,哪些数据没有收到,一个个文件夹查看太麻烦了,想直观的看到这个数据收集文件夹下所有子文件夹内的文件情况。 尝试了 Windows 的预览窗格,发现只能预览文件,不能预览文件夹,通...
-
63
上篇文章我们主要介绍了线性数据结构,本篇233酱带大家看看 无所不在的非线性数据结构之一:树形结构的特点和应用。 树形结构,是指:...
-
8
vue+element中table树形结构懒加载发布于 今天 09:15 1.开发环境 vue+element2.电脑系统 windows10专业版3.在开发的过程中,我们会遇到树形结构的表格,...
-
5
联系我们:有道技术团队助手:ydtech01 / 邮箱:mailto:[email protected]前言树形结构,尤其是二叉树,在我们平时开发过程...
-
7
输出优美的目录结构仅仅只需要…一、安装 & 使用// 安装 brew install tree // 输出: 某文件下执行 tree 二、常用命令注意大小写// 查看更多命令 tree --help...
-
5
Go项目实战之给博客的文章实现标签功能(易扩展方式)[开源十年项目第10次更新] kaiyuan10nian
-
1
Go项目实战之开发完善分页插件(易扩展方式)-------【goshop开源项目】【第12次更新】 qia...
-
5
Go项目实战之验证码的生成和使用(易扩展方式)【goshop开源项目 | 20220516更新】 qiaos...
-
34
用html+css+js实现一个无限级树形控件 2022-11-20 19:16:00 http:...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK