构建分类树(ElementPlus的二级数据模型)
构建分类树(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: [] } }
-