发明内容
本发明针对上述技术问题,目的在于提供一种树形数据结构及分页加载方法。
为了解决上述问题,根据本发明的一个方面,提供了一种树形数据结构,包括若干节点,所述节点包括节点ID字段、节点名称字段、父节点ID字段,所述节点还包括:
节点级别字段,表示当前节点相对于根节点的层级关系;
排序值字段,表示当前节点在所述树形数据结构中的位置。
可选的,所述节点级别字段的数据类型为整数。
可选的,所述节点级别字段是以根节点开始排序,所述树形数据结构中父节点的节点级别字段比其下级节点的节点级别字段小1或大1。
可选的,所述排序值字段的数据类型为整数或字符串。
可选的,所述排序值字段是以根节点开始排序,且当前节点的排序值字段的ASCII码比上一节点的排序值字段的ASCII码大1或小1。
为了解决上述问题,根据本发明的另一个方面,提供了一种基于本发明上述所述树形数据结构的前端分页加载方法,包括:
S11,向后端发起分页数据请求,所述分页数据请求中包含有树参和分页参数;
S12,接收后端返回的反馈数据及符合所述树参对应的树形数据结构的总记录数;
S13,以排序值字段进行排序,对所述反馈数据内的每条数据对应一个树形节点的UI节点对象,进行页面渲染;
S14,根据所述总记录数及当前分页参数判断是否还有未加载完成的数据,若有,则修改当前分页参数,返回步骤S11。
可选的,步骤S13中,在进行页面渲染时:
根据节点级别字段对所述UI节点对象进行渲染。
可选的,步骤S13之后,还包括:
根据所述反馈数据构建前端的树形数据模型,进行缓存。
可选的,还包括S15,对树形数据结构的折叠:
S151,响应鼠标数据,获取所述鼠标数据对应的当前页面元素所在的节点的节点级别字段;
S152,从当前页面元素所在的节点向下查找节点级别字段小于等于步骤S151获取的节点级别字段的第一个节点;
S153,隐藏从当前页面元素所在的节点至所述第一个节点之间的其他节点。
可选的,还包括S16,对树形数据结构的展开:
S161,响应鼠标数据,获取所述鼠标数据对应的当前页面元素所在的节点的节点级别字段;
S162,从当前页面元素所在的节点向下查找节点级别字段小于等于步骤S161获取的节点级别字段的第一个节点;
S163,显示从当前页面元素所在的节点至所述第一个节点之间的其他节点。
为了解决上述问题,根据本发明的另一个方面,提供了一种基于本发明上述所述树形数据结构的后端分页加载方法,包括:
S21,接收前端的分页数据请求,所述分页数据请求中包含有树参和分页参数,根据所述分页数据请求进行数据检索;
S22,将所述树参对应的树形数据结构以排序值字段进行排序,根据所述树形数据结构中最小的排序值字段及最大的排序值字段,得到所述树形数据结构的总记录数,将所述分页参数对应的若干条数据作为反馈数据;
S23,将所述反馈数据及所述总记录数反馈给前端。
有益效果:本发明具有如下至少一项或多项优点:
1、本发明的树形数据结构,与传统的树形数据结构相比,数据的大小不再受限制。无论是数据量大还是小,只要能够确保平级数据的加载性能,都可以轻松加载任意大小的数据。这使得在处理大规模数据时不会出现性能问题,而且还能够轻松地进行数据的快速检索和处理。
2、本发明支持任意加载渲染树中的任意一段内容,因此用户可以根据自己的需求灵活选择要加载和渲染的数据部分。这项功能可以大大提高用户的工作效率和数据处理速度,同时还能够降低系统的资源占用率,提高整个系统的稳定性和可靠性。本发明为处理大规模数据和优化数据处理提供了强有力的支持。
实施方式
以下将结合附图对本发明的较佳实施例进行详细说明,以便更清楚理解本发明的目的、特点和优点。应理解的是,附图所示的实施例并不是对本发明范围的限制,而只是为了说明本发明技术方案的实质精神。
在下文的描述中,出于说明各种公开的实施例的目的阐述了某些具体细节以提供对各种公开实施例的透彻理解。但是,相关领域技术人员将认识到可在无这些具体细节中的一个或多个细节的情况下来实践实施例。在其它情形下,与本申请相关联的熟知的装置、结构和技术可能并未详细地示出或描述从而避免不必要地混淆实施例的描述。
在整个说明书中对“一个实施例”或“一实施例”的提及表示结合实施例所描述的特定特点、结构或特征包括于至少一个实施例中。因此,在整个说明书的各个位置“在一个实施例中”或“在一实施例”中的出现无需全都指相同实施例。另外,特定特点、结构或特征可在一个或多个实施例中以任何方式组合。
在以下描述中,为了清楚展示本发明的结构及工作方式,将借助诸多方向性词语进行描述,但是应当将“前”、“后”、“左”、“右”、“外”、“内”、“向外”、“向内”、“上”、“下”等词语理解为方便用语,而不应当理解为限定性词语。
树形数据结构是一类重要的非线性数据结构,树形数据结构可以表示数据表素之间一对多的关系,直观看来,树是以分支关系定义的层次结构。在计算机科学中,树是用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。
本发明的实施例一种树形数据结构,具有若干节点,包括根节点和其他节点。参照图1,节点包括现有技术中含有的节点ID字段(ID)、节点名称字段(name)、父节点ID字段(pid)。
其中,节点ID字段和父节点ID字段通常采用长整数数据类型,节点名称字段通常采用字符串数据类型。当然也有可能采用其他数据类型。
本发明的树形数据结构除了包括上述各字段外,为了解决树形数据结构在大数据量下加载问题,对树形数据结构进行了如图3所示的调整,增加了两条字段的定义,即:节点级别字段(level)和排序值字段(rank)。节点级别字段表示当前节点相对于根节点的层级关系。排序值字段表示当前节点在树形数据结构中的位置,该位置跟层级结构无关,是当前节点在整颗树上的绝对位置。
在一实施例中,节点级别字段的数据类型为整数。
在一实施例中,节点级别字段是以根节点开始排序,树形数据结构中父节点的节点级别字段比其下级节点的节点级别字段小1或大1。
根据习惯,通常采用父节点的节点级别字段比其下级节点的节点级别字段小1的方式,但是父节点的节点级别字段比其下级节点的节点级别字段大1的方式也是可以的。只要是按预设规律进行层级排序即可。
例如,根节点的节点级别字段为0,根节点的下级节点的节点级别字段为1,依此类推。
在一实施例中,排序值字段的数据类型为整数或字符串。排序值字段的数据类型要能实现对两个排序值字段内的排序值进行ASCII码大小的比较即可。例如可以为0,1,2……的整数,也可以为AAAAA,AAAAB,AAAAC……的字符串。
在一实施例中,为了便于确定树形数据结构的字节数量,排序值字段是从根节点开始从小到大或从大到小进行排序,且当前节点的排序值字段的ASCII码比上一节点(在树形数据结构中绝对位置的上一节点)的排序值字段的ASCII码大1或小1。
因此,相邻位置的两个节点的排序值字段的ASCII码相减的绝对值为1,则,若根节点的排序值字段是从例如0开始从小到大排序,则可直接以最大的排序值作为节点数量。若根节点的排序值字段不是从0开始排序,则可根据排序规则计算节点数量。例如,最后一个节点的排序值字段的ASCII码减去根节点的排序值字段的ASCII码,再加1并取绝对值,即为整个树形数据结构的节点数量。
本发明的实施例提供一种基于上述各实施例树形数据结构的前端分页加载方法,前端分页加载方法是前端进行的操作,包括如下步骤:
S11,向后端发起分页数据请求,分页数据请求中包含有树参和分页参数。
本步骤中的树参代表需要加载哪颗树,即告知后端数名,以便于后端通过树参查询到对应的树形数据结构。分页参数代表当前页需要加载多少条数据,一条数据对应一个UI节点对象,一条数据是指一个节点对应的若干节点字段。初始分页参数可根据树参对应的树形数据结构所在的根节点的排序值字段确定。
S12,接收后端返回的反馈数据及符合树参对应的树形数据结构的总记录数。
本步骤中的反馈数据是分页参数对应的若干条数据,而不是树形数据结构整个的数据集。总记录数是指树形数据结构的节点数量。
S13,以排序值字段进行排序,对反馈数据内的每条数据对应一个树形节点的UI节点对象,进行页面渲染。
在接收到反馈数据后,首先对每条数据以排序值进行ASCII从小到大或从大到小的规则进行排序,按排序后的数据进行逐条数据的页面渲染。排序的规则可以根据树形数据结构中排序值字段的排序规则对应一致。例如树形数据结构中的排序值字段是以根节点开始排序,当前节点的排序值字段的ASCII码比上一节点的排序值字段的ASCII码大1,则以排序后的排序值字段从小到大进行逐条数据的页面渲染。
在一实施例中,在进行页面渲染时根据节点级别字段对UI节点对象进行渲染。
在一实施例中,根据节点级别字段的level值渲染UI节点对象的缩进。
例如,level=0不进行缩进,level=1缩进2个空格,level=2缩进4个空格,依次类推,使前端页面呈现的数据展示成树形结构,并且对当前页面元素(DOM元素)添加level树形。
在一实施例中,步骤S13之后,还包括:
根据反馈数据构建前端的树形数据模型,进行缓存。
本实施例中,如图4所示,可根据节点的父节点ID字段的pid值,建立当前节点与上级节点的关系,构建树形数据模型,作为前端数据的缓存。这种树形数据模型也用于适应特定的前端框架,如vue,react等。
S14,根据总记录数及当前分页参数判断是否还有未加载完成的数据,若有,则修改当前分页参数,返回步骤S11。
由于分页参数通常只包含若干条数据,而整个树形数据结构的数据集内通常包含大于或等于分页参数对应的数据,因此,需要进行判断,当前分页参数对应的数据是否已经到达树形数据结构的最末数据了,即树形数据结构对应的数据是否全部已经加载完毕。
本步骤的判断,可以直接将当前分页参数与总记录数进行比较,当前分页参数内的数据是否大于等于总记录数,若大于或等于,则认为已加载完毕,若没有,则可根据预设的分页加载阈值修改当前分页参数,继续进行数据加载。此处的分页加载阈值可以根据前端页面的情况预先设置每次加载的数据条数,在当前分页参数上增加分页加载阈值,即为下一循环的当前分页参数。
例如,在使用mysql作为后端存储场景下,可以采用limit语法,该语法是limit(offset,size);offset表示当前数据相对于整个数据集的偏移量;size表示每次在数据集中提取数据的大小,也是指分页加载阈值或每页条数。
当size即分页加载阈值为3时,则初始分页参数需表示加载第0条至第2条的数据,可表示为limit0,3;而树形数据结构的节点数量为10,因此需要修改初始分页参数进行下一循环,此时可将初始分页参数修改为加载第3条至第5条数据,即offset =offset+size=0+3=3,可表示为limit3,3,以此类推。
在一实施例中,在修改当前分页参数时,会存在请求的数据超出总记录数的情况,此时针对超出部分,后端会返回空数据,可通过前端进行判断。判断方法为:
在每次向后端发起请求之前,前端还判断当前offset是否小于total(总记录数),若offset<total,则认为还有数据,向后端发起分页数据请求。
接收后端返回的反馈数据时,若反馈数据的数据条数m小于size,则判断offse+m是否小于total,若不是,则认为数据已经加载完成。若是,则认为还有数据,再次向后端发起分页数据请求。
在一实施例中,在反馈数据的数据条数m小于size且offse+m小于total情况下,若在预设请求次数内依然未收到对应的全部反馈数据,则可进行异常报警处理。
在一实施例中,在前端进行了页面渲染及显示后,前端还进行S15,对树形数据结构的折叠过程,以实现对前端页面展示的树形结构的折叠:
S151,响应鼠标数据,获取鼠标数据对应的当前页面元素的所在的节点的节点级别字段;
S152,从当前页面元素所在的节点向下查找节点级别字段小于等于步骤S151获取的节点级别字段的第一个节点;
S153,隐藏从当前页面元素所在的节点至第一个节点之间的其他节点。
在一实施例中,对前端页面展示的树形结构的折叠具体过程为:
1、用户点击鼠标,前端响应对应的鼠标数据,获取当前DOM元素的level值,比如获取到的level值为2。
2、从当前DOM元素对应的节点1开始往下查找level值小于等于2的第一个节点,标记为节点2。
3、隐藏从节点1到节点2之间的其他节点。
在一实施例中,在前端进行了页面渲染及显示后,前端还进行S16,对树形数据结构的展开,以实现对前端页面展示的树形结构的展开:
S161,响应鼠标数据,获取鼠标数据对应的当前页面元素所在的节点的节点级别字段;
S162,从当前页面元素所在的节点向下查找节点级别字段小于等于步骤S161获取的节点级别字段的第一个节点;
S163,显示从当前页面元素所在的节点至第一个节点之间的其他节点。
在一实施例中,对前端页面展示的树形结构的展开具体过程为:
1、用户点击鼠标,前端响应对应的鼠标数据,获取当前DOM元素的level值,比如获取到的level值为2。
2、从当前DOM元素对应的节点3开始往下查找level值小于等于2的第一个节点,标记为节点4。
3、显示从节点3到节点4之间的其他节点。
本发明的实施例提供一种基于上述各实施例树形数据结构的后端分页加载方法,后端分页加载方法是后端进行的操作,包括如下步骤:
S21,接收前端的分页数据请求,分页数据请求中包含有树参和分页参数,根据分页数据请求进行数据检索。
在进行数据检索时,可采用分页SQL进行数据查询,例如树参为“tree_node”,分页参数为limit 0,5,则认为查询第0条到第5条数据,则检索式为:SQL(select * from tree_node where [条件] limit 0,5)。
S22,将树参对应的树形数据结构以排序值字段进行排序,根据树形数据结构中最小的排序值字段及最大的排序值字段,得到树形数据结构的总记录数,将分页参数对应的若干条数据作为反馈数据。
在排序时与步骤S13相似的,可根据树形数据结构中排序值字段的排序规则对应一致。例如树形数据结构中的排序值字段是以根节点开始排序,当前节点的排序值字段的ASCII码比上一节点的排序值字段的ASCII码大1,则将树参对应的树形数据结构以排序值字段从小到大进行排序,最大的排序值字段减去最小的排序值字段再加1,得到总记录数。
S23,将反馈数据及总记录数反馈给前端。
实施例
以图5为例的树形数据结构,假设以阿拉伯数字作为排序值字段的排序值算法。首先确定根节点(Root)的rank值和level值,假定:
“Root”节点的rank值为0、level值为0;则:
“A”节点的rank值为1,level值为1;
“B”节点的rank值为2,level值为1;
“BA”节点的rank值为3,level值为2;
“BB”节点的rank值为4,level值为2;
“C”节点的rank值为5,level值为1。
汇总成如下表所示:
节点名称字段的name |
排序值字段的rank |
节点级别字段的level |
父节点ID字段的pid |
Root |
0 |
0 |
无 |
A |
1 |
1 |
Root |
B |
2 |
1 |
Root |
BA |
3 |
2 |
B |
BB |
4 |
2 |
B |
C |
5 |
1 |
Root |
基于该树形数据结构的分页加载方法,如下步骤:
1、前端向后端发起分页数据请求,分页数据请求中包含有树参和分页参数,其中树参为“tree_node”,初始分页参数为limit 0,4。
2、后端接收前端的分页数据请求,根据分页数据请求,创建检索式进行数据检索;后端检索到对应的树形数据结构,以排序值字典进行从小到大排序,将最大的排序值字段减去最小的排序值字段得到总记录数为6,后端将检索得到的第0条到第3条数据作为反馈数据;后端将反馈数据连同总记录数一起返回给前端。
4、前端接收后端返回的反馈数据和总记录数;前端对反馈数据内的每条数据以排序值字段从小到大进行排序后,进行逐条数据的页面渲染,渲染时,一条数据对应一个UI节点对象,且采用节点级别字段的level值渲染UI节点对象的缩进,形成前端页面树形结构;根据初始分页参数的特征,前端判断 “0+4”是否小于总记录数“6”,小于则认为还有未加载完成的数据,则将分页参数修改为“limit 4,4”后,继续返回第1步。
在下一个循环时,步骤4中,由于总记录数是6,因此,前端接收到后端返回的反馈数据只有2条,第6至7条数据是空数据。因此,前端还判断4+2是否小于6,由于 4+2=6,所以表示数据已经记载完成。
以上已详细描述了本发明的较佳实施例,但应理解到,在阅读了本发明的上述讲授内容之后,本领域技术人员可以对本发明作各种改动或修改。这些等价形式同样落于本申请所附权利要求书所限定的范围。