请选择 进入手机版 | 继续访问电脑版
虚位以待    招租QQ:244594752    尺寸:960x60
加入我们,年会VIP只需139元,全站下载
查看: 318|回复: 1

EasyUiTreeGrid封装控件源码(三级联动+数据字典)

[复制链接]

该用户从未签到

2175

主题

2207

帖子

7461

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7461
发表于 2018-3-17 23:13:19 | 显示全部楼层 |阅读模式
树型实体的抽象与封装
  所谓树型实体,就是具有树型结构关系的实体,比如省、市、区。对于初学者,可能会创建三张表进行存储,有经验的开发者通过引入ParentId将设计简化为一张表,但是基于ParentId的设计也不够完美,主要问题是查找某个节点的所有上级或所有下级时,都需要进行递归,这是一个低效而复杂的操作。
  更有经验的开发者会引入物化路径Path,物化路径是对节点关系的记录,一般格式为:当前节点Path = 父节点Path + 当前节点Id + “,”,注意物化路径的最后一定是某个符号,一般为逗号。
  一旦物化路径设置完成,查找所有上级和下级就非常简单,查找所有上级只需要从当前节点的Path中,用逗号分隔出Id即可,查找所有下级,通过StartsWith查询Path列,也就是Sql中的Like ‘xxx%’。
  虽然物化路径在查询节点关系方面非常高效,但也不是没有成本的,主要成本在于修改节点关系之后,该节点的所有下级节点的物化路径都需要更新。比如某个节点修改了父节点,那么除了当前节点的Path需要更新外,它的所有下级节点也需要更新,这是一个代价高昂的操作。想像一下,当一个节点下面有数千个,甚至数万个节点,修改一下节点关系将带来多么严重的后果。不过一般树型结构的数据量都不会很大,所以这个问题也不用太多考虑,你只需要了解用这种设计方案有什么弊端即可。
  当使用了EasyUi的TreeGrid这种控件以后,可以在表格上随意编辑和修改,甚至可以通过拖拽的方式修改父节点,仅在最后一刻进行保存,而保存的时候使用工作单元DbContext进行操作,这时候你会发现物化路径的更新将是一个非常棘手的问题。
  树型结构也有规律可循,甚至TreeGrid上的操作都可以进行抽象,我在领域层定义了ITreeEntity、TreeEntityBase、ITreeEntityQuery、TreeEntityQuery等几个类和接口,应用层定义ITreeBatchService、TreeBatchService,表现层定义基控制器TreeGridControllerBase。通过这几个类进行抽象,树型结构的基本操作都内置到框架中,业务类通过继承基类就完成了大部分工作。
  值得一提的是, TreeGridControllerBase提供了一个加载模式LoadMode,默认为异步加载模式,每次只查询一级节点。具体控制器通过重写加载模式,可以切换为同步加载,即一次加载全部节点,另外还提供了一种根节点异步加载模式,即根节点异步加载,下级节点同步加载,通俗的说就是第一次只加载根节点,点击根节点查询出全部子节点。当然,这些功能都不需要你手写代码,全部内置。
  由于本篇只是简介,后续文章再详细介绍。
EasyUi TreeGrid抽象与封装
  对于树型实体的编辑操作,一般可以使用Tree控件,再配合一个表单或表格进行,但TreeGrid是更好的选择。
  Easyui treegrid 有很多小bug,比如getChanges方法获取的结果不正确,分页总行数错误等,这些问题都需要自己解决。
  我对treegrid的封装,除了修复一些bug外,另外对树型表格上的操作进行了抽象,将基本操作都内置到框架中。
  大体功能如下:
1.表格编辑
2.添加根节点
3.添加下级节点
4.插入同级节点(上方)、
5.插入同级节点(下方)
6.自动创建连续的排序号(服务端+客户端配合完成)
7.上移
8.下移
9.拖拽排序
10.修正排序号
11.拖拽修改父节点
12.限制可拖拽的层级
13.批量修改,一次保存
14.冻结节点
15.启用节点
16.支持不同加载模式
?同步加载模式
?异步加载模式
?根节点异步加载模式
  17. 支持对根节点(第一级节点)分页
  18. 支持查询时显示所有上级节点
  19. 支持右键菜单

  对于表格上的编辑操作,我是用官方提供的edatagrid扩展,复制了一份来改造的,拖拽使用的是官方提供的treegrid.dnd扩展,也简单改了下 。
  关于easyui的性能,如果使用datagrid控件很慢,一般是因为没有设置列宽,这是必须设置的,不然奇慢。Treegrid虽然从datagrid控件派生,但行为上很多不同,datagrid操作行索引index,而treegrid操作的是id。
  我在封装treegrid的时候发现,40个节点左右,treegrid提供的所有操作id的方法都非常慢,断点调试能明显感觉卡一下。由于没有源码,无法调优,所以你在使用我提供的拖拽排序和修正排序号这些功能时,发现性能很差不要惊讶,为何纯客户端操作会如此之慢,那是easyui底层的问题,因为需要调用它的相关方法。
  至于你担心我封装的服务端控件解析可能存在性能问题,一般不需要太紧张,我目前没有考虑性能,一旦服务端控件解析成为性能瓶颈,我会优化它。
  另外一点,由于是一次性保存,可能会批量更新很多节点,对此我没有进行性能优化,使用的是EF的对象一个个的更新,可能会比较慢,不过考虑到这些操作一般是管理员干的,慢一点就让他忍忍好了。
  封装以后,业务代码就非常简单了。
115100280107074.jpg
游客,如果您要查看本帖隐藏内容请回复

回复

使用道具 举报

该用户从未签到

0

主题

181

帖子

368

积分

禁止发言

积分
368
发表于 2018-8-23 09:30:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

QQ|Archiver|手机版|妙想源码社区 积分提现

GMT+8, 2018-9-23 06:38 , Processed in 1.103265 second(s), 27 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2020 Comsenz Inc.

快速回复 返回顶部 返回列表
 
FDGDF
客服QQ 妙想科技 244594752
【旺旺】 点击这里给我发消息
【邮箱】
244594752@qq.com
【地址】 湖南省常德市武陵区三姑巷77
【妙想科技】 【9188qhl.com】