java实现ztree树形,ztree实现中国省市区树形,可多选

首先表

CREATE TABLE `sys_area` (

`id` INT(11) NOT NULL COMMENT '编号',

`parent_id` INT(11) NOT NULL COMMENT '父级编号',

`parent_ids` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '所有父级编号',

`code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '区域编码',

`name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '区域名称',

`type` VARCHAR(1) NOT NULL DEFAULT '' COMMENT '区域类型',

`is_municipality` VARCHAR(1) NOT NULL DEFAULT 'N' COMMENT '是否直辖市',

`active_flag` VARCHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标记',

`remarks` VARCHAR(255) NULL DEFAULT NULL COMMENT '备注信息',

`create_by` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建者',

`create_date` DATETIME NULL DEFAULT NULL COMMENT'创建时间',

`update_by` VARCHAR(64) NULL DEFAULT NULL COMMENT '更新者',

`update_date` DATETIME NULL DEFAULT NULL COMMENT'更新时间',

PRIMARY KEY (`id`),

INDEX `sys_area_parent_id` (`parent_id`),

INDEX `sys_area_parent_ids` (`parent_ids`),

INDEX `sys_area_code` (`code`),

INDEX `type_name` (`type`, `name`(2))

)

COMMENT='区域表'

f2d2e10c0997d546f4f8c60c3c165c26.png

24e679ba1565dfaa080899db3baff87e.png

后台写SQL组装省市区树形结构

select id,parent_id,name,code,type from (

select t1.id,t1.parent_id,t1.name,t1.code,t1.type,if(find_in_set(parent_id, @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild

from (

select id,parent_id,name,code,type from sys_area t order by parent_id, id

) t1,

(select @pids := 1) t2

) t3 where ischild!= 0;

楼主起先用的resultMap里面返回一个父级和子级,数据量小的时候完全没问题,但是省市区将近4000条数据,用这种查询差不多要100秒,GG

所以改为递归查询,看下查询用时

536d40386faebd6fe947d315887b90c0.png

只需要0.671秒对比下100秒

然后就是前台接收数据,用ztree形成树

loadTree();

});

function loadTree(){

var data =[];

data=data.concat(${templateAreaList});

loadTreeData(data);

}

function loadTreeData(data) {

var setting={

check: {

enable:true,

chkStyle:"checkbox",

chkboxType: { "Y": "p", "N": "s" }//勾选操作,只影响父级节点;取消勾选操作,只影响子级节点

},

view: {

dblClickExpand:false,

},

data: {

simpleData: {

enable:true}

},

callback: {

onClick: onTreeClick,

}

};

$.fn.zTree.init($("#ztree"), setting, data);

var zTree= $.fn.zTree.getZTreeObj("ztree");

// 业务,默认不展开节点

// 实现,先展开节点,在关闭,否则取不到子节点信息//展开全部节点

zTree.expandAll(true);//关闭全部节点

zTree.expandAll(false);//node:树形节点//expandFlag:是否展开节点//sonSign:是否展开其子孙节点//focus:展开或折叠节点后是否设置焦点//callbackFlag:这行该方法是否触发回调函数//zTree的expandNode (node, expandFlag, sonSign, focus, callbackFlag)

zTree.expandNode(zTree.getNodeByTId(""), true, true, true, false);}

function onTreeClick(event, treeId, treeNode, clickFlag){

}

function getData() {

}

省市区多选数据回显

思路:假如我选择了河北省石家庄市长安区,福建省厦门市,浙江省,这三个地址,那么我只需要获取长安区,厦门市,以及浙江省,这三个地址的code,再根据code去查找他们的父级,也就是根据勾选数据中的子节点,来获取他们的父节点信息。

function getData() {//获取树对象

var zTree = $.fn.zTree.getZTreeObj("ztree");if (null !=zTree) {//获取选中节点的值,遍历

treeArray = zTree.getCheckedNodes(true);if (treeArray.length != 0) {

var tree=[];for (var i = 0; i < treeArray.length; i++) {

var childrenNodes=treeArray[i].children;

var parentNodes=treeArray[i].getParentNode();if(null == childrenNodes || childrenNodes == "" || childrenNodes == "undefined"){//区县

tree.push(treeArray[i]);continue;

}else if(null == parentNodes || parentNodes == "" || parentNodes == "undefined"){//省

var provinceFlag = true;for (var j = 0; j < childrenNodes.length; j++) {if(childrenNodes[j].checked != "undefined" && childrenNodes[j].checked == true){//子节点被勾选

provinceFlag = false;continue;

}

}if(provinceFlag == true){

tree.push(treeArray[i]);

}

}else{//市

var cityflag = true;for (var k = 0; k < childrenNodes.length; k++) {if(childrenNodes[k].checked != "undefined" && childrenNodes[k].checked == true){//子节点被勾选

cityflag = false;continue;

}

}if(cityflag == true){

tree.push(treeArray[i]);

}

}

}returntree;

}

}

}

看下效果

ffd44747827e95b1384c86bebe9dce60.png

5b8a9c2bc1e2b6736cdc00bab49994e8.png

接着就是再点击行政区划地址信息回显,并勾选

function loadTreeData(data) {

......

// loadTreeDate增加数据回显方法//数据勾选回显

var treeCode = '${treeCode}';//参数if(null != treeCode && treeCode != ""){

var treeCodeArr= treeCode.split(",");for(var data of treeCodeArr) {//获取回传的参数

var nodes = zTree.getNodesByParam("allIdx", data, null);//根据回传参数勾选数据

zTree.checkNode(nodes[0], true, true);

}

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值