构建分类树(ElementPlus的二级数据模型)
今天在根据ElementPlus构建分类树时,写后端请求时,遇到了构建List<Map<String,Object>>模型;记录一下。
前端建级联选择器需要的数据格式:
const data = [{value: '1',label: 'Level one 1',children: [{value: '1-1',label: 'Level two 1-1',children: [{value: '1-1-1',label: 'Level three 1-1-1',},],},],},{value: '2',label: 'Level one 2',children: [{value: '2-1',label: 'Level two 2-1',children: [{value: '2-1-1',label: 'Level three 2-1-1',},],},{value: '2-2',label: 'Level two 2-2',children: [{value: '2-2-1',label: 'Level three 2-2-1',},],},],}
后端数据库信息格式:
UPDATE health_system.institution_category SET category_name = '国家级重点老年护理中心', category_alias = '医疗2', create_user = 10011, create_time = '2025-03-09 22:09:32', update_time = '2025-03-09 22:09:32', level = 1, level_name = '国家级养老机构', remark = '这是一个国家级养老机构' WHERE id = 1;
UPDATE health_system.institution_category SET category_name = '江苏省安宁疗护中心', category_alias = '医疗4', create_user = 10011, create_time = '2025-03-09 22:09:32', update_time = '2025-03-09 22:09:32', level = 2, level_name = '省级养老机构', remark = '这是一个省级养老机构' WHERE id = 2;
UPDATE health_system.institution_category SET category_name = '苏州市医养结合机构', category_alias = '医疗3333', create_user = 10011, create_time = '2025-03-09 22:09:32', update_time = '2025-03-09 22:09:32', level = 3, level_name = '市级养老机构', remark = '这是一个市级养老机构' WHERE id = 3;
UPDATE health_system.institution_category SET category_name = '工业园区医养结合机构', category_alias = '医疗6', create_user = 10011, create_time = '2025-03-09 22:09:32', update_time = '2025-03-09 22:09:32', level = 4, level_name = '社区养老机构', remark = '这是一个社区养老机构' WHERE id = 4;
UPDATE health_system.institution_category SET category_name = '省南京养老中心', category_alias = '医疗5', create_user = 10011, create_time = '2025-03-09 22:09:32', update_time = '2025-03-09 22:09:32', level = 2, level_name = '省级养老机构', remark = '这是一个省级养老机构' WHERE id = 5;
UPDATE health_system.institution_category SET category_name = '国家级养老院', category_alias = '1111', create_user = 1111, create_time = '2025-03-11 13:56:54', update_time = '2025-03-11 13:56:54', level = 1, level_name = '国家级养老机构', remark = '这是国家级养老机构' WHERE id = 7;
UPDATE health_system.institution_category SET category_name = '老年活动服务机构', category_alias = '11111', create_user = 11111, create_time = '2025-03-11 13:57:42', update_time = '2025-03-11 13:57:42', level = 5, level_name = '其它', remark = '其它养老机构' WHERE id = 8;
UPDATE health_system.institution_category SET category_name = '老年棋牌室', category_alias = '11111111', create_user = 110110, create_time = '2025-03-11 14:57:40', update_time = '2025-03-11 14:57:40', level = 5, level_name = '其它', remark = '老年棋牌室' WHERE id = 9;
UPDATE health_system.institution_category SET category_name = '家庭医疗', category_alias = '医疗', create_user = 1001, create_time = '2025-03-11 15:38:24', update_time = '2025-03-11 15:38:24', level = 6, level_name = '家庭医疗', remark = '家庭医疗备注' WHERE id = 10;
UPDATE health_system.institution_category SET category_name = '其它医疗', category_alias = '其它医疗', create_user = 1001, create_time = '2025-03-11 16:00:42', update_time = '2025-03-11 16:00:42', level = 6, level_name = '家庭医疗', remark = '家庭医疗备注' WHERE id = 11;
UPDATE health_system.institution_category SET category_name = '县级养老院', category_alias = '1234534', create_user = 1111111, create_time = '2025-03-11 21:30:00', update_time = '2025-03-11 21:30:00', level = 7, level_name = '县级', remark = '1111' WHERE id = 12;
后端实体:
@Data
@TableName("institution_category")
public class InstitutionCategory {private Long id; // 主键private String categoryName; // 分类名称private Integer level; // 层级private String levelName; // 层级名称
}
Controller:
@GetMapping("/tree")
public List<Map<String,Object>> getTree(){return institutionCategoryService.getTreeData();
}
Service:
public List<Map<String,Object> getTreeData(){List<InstitutionCategory> list = this.list();return buildTree(list);
}
ServiceImpl:
private List<Map<Integer,Object> buildTree(List<InstitutionCategory> list){List<Map<String,Object>> tree = new ArrayList<>();Map<Integer,Map<String,Object>> levelMap = new HashMap<>();for(InstitutionCategory item : list){Integer level = item.getLevel();String levelName = item.getLevelName();Integer id = item.getId();String categoryName = item.getCategoryName();if(!levelMap.constainKey(level)){Map<String,Object> rootNode = new HashMap<>();rootNode.put("value", "level" + level);rootNode.put("label", levelName);rootNode.put("children", new ArrayList<>());levelMap.put(level,rootNode);tree.add(rootNode);// 将当前节点添加到对应 level 的 children 中Map<String, Object> childNode = new HashMap<>();childNode.put("value", "id" + id);childNode.put("label", categoryName);((List<Map<String, Object>>) levelMap.get(level).get("children")).add(childNode);}
return tree;
}
}
levelMap
的作用
levelMap
是一个 Map<Integer, Map<String, Object>>
类型的数据结构:
- Key:
level
(层级,例如1
,2
,3
等)。 - Value:对应层级的根节点(
rootNode
),是一个Map<String, Object>
对象。
它的作用是:
- 快速查找:通过
level
可以快速找到对应的根节点。 - 避免重复创建:如果某个
level
的根节点已经存在,就不需要再创建,直接复用。
示例
假设有以下数据:
[{ id: 1, categoryName: "国家级重点老年护理中心", level: 1, levelName: "国家级养老机构" },{ id: 2, categoryName: "江苏省安宁疗护中心", level: 2, levelName: "省级养老机构" },{ id: 3, categoryName: "苏州市医养结合机构", level: 3, levelName: "市级养老机构" }
]
- 当处理
level: 1
时:-
检查
levelMap
,发现level: 1
不存在。 -
创建一个新的根节点
rootNode
,并将其存储到levelMap
中。 -
最终
levelMap
的内容为:{1: {value: "level1",label: "国家级养老机构",children: []} }
-
- 当处理
level: 2
时:-
检查
levelMap
,发现level: 2
不存在。 -
创建一个新的根节点
rootNode
,并将其存储到levelMap
中。 -
最终
levelMap
的内容为:{1: {value: "level1",label: "国家级养老机构",children: []},2: {value: "level2",label: "省级养老机构",children: []} }
-
- 当处理
level: 3
时:-
检查
levelMap
,发现level: 3
不存在。 -
创建一个新的根节点
rootNode
,并将其存储到levelMap
中。 -
最终
levelMap
的内容为:{1: {value: "level1",label: "国家级养老机构",children: []},2: {value: "level2",label: "省级养老机构",children: []},3: {value: "level3",label: "市级养老机构",children: []} }
-