springboot构造树形结构数据并查询的方法是什么
发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,本篇内容主要讲解"springboot构造树形结构数据并查询的方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"springboot构造树形结构数据
千家信息网最后更新 2024年11月17日springboot构造树形结构数据并查询的方法是什么
本篇内容主要讲解"springboot构造树形结构数据并查询的方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"springboot构造树形结构数据并查询的方法是什么"吧!
因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。
我这里用的是springboot+mybatis-plus+mysql,示例的接口是查询一级权限以及二级权限、三级权限整个权限树…
下面是导入的maven依赖
org.springframework.boot spring-boot-starter-web com.alibaba druid-spring-boot-starter 1.1.21 mysql mysql-connector-java com.baomidou mybatis-plus-boot-starter 3.4.0 org.projectlombok lombok true cn.hutool hutool-all 5.0.6
下面是实体类Permission
@Datapublic class Permission implements Serializable { @TableId private String permissionId; @NotNull(message = "权限名称不能为空") private String permissionName; /** * 权限标识 */ @NotNull(message = "权限标识不能为空") private String permissionCode; /** * 父菜单ID,如果是-1就表示是一级权限菜单。 */ @NotBlank(message = "父菜单ID不能为空") private String parentId; /** * 前端URL访问接口路径 */ private String path; /** * 排序值 */ private Integer sort; /** * 创建时间 */ private LocalDateTime createTime; /** * 更新时间 */ private LocalDateTime updateTime; /** * 0--正常 1--删除 */ private String delFlag; public Permission() { this.permissionId = IdUtil.simpleUUID(); }
树形结点类
@Datapublic class TreeNode { protected String id; protected String parentId; protected Listchildren = new ArrayList (); protected boolean hasChildren; public void addTreeNode(TreeNode node){ children.add(node); }}
树形结点详细信息类
@Data@EqualsAndHashCode(callSuper = true)public class PermissionTree extends TreeNode implements Serializable { private String permissionName; private String permissionCode; private String path; private Integer sort; private String label; private boolean hasChildren; public PermissionTree() { }}
构建树形结点工具类(关键),在这里我用@UtilityClass
注解就表示这个类中的方法都是静态方法:
@UtilityClasspublic class TreeUtil { publicList build(List treeNodes, String root) { List trees = new ArrayList<>(); for (T treeNode : treeNodes) { if (root.equals(treeNode.getParentId())) { trees.add(treeNode); } for (T node : treeNodes) { if (node.getParentId().equals(treeNode.getId())) { treeNode.addTreeNode(node); treeNode.setHasChildren(true); } } } return trees; } /** * 通过permission创建树形节点 * * @param permissionList * @param root * @return */ public List buildTree(List permissionList, String root) { System.out.println(Arrays.toString(permissionList.toArray())); List treeNodeList = new ArrayList<>(); PermissionTree treeNode = null; for (Permission permission : permissionList) { treeNode = new PermissionTree(); treeNode.setId(permission.getPermissionId()); treeNode.setPermissionName(permission.getPermissionName()); treeNode.setPath(permission.getPath()); treeNode.setSort(permission.getSort()); treeNode.setParentId(permission.getParentId()); treeNode.setLabel(permission.getPermissionName()); treeNode.setHasChildren(false); treeNodeList.add(treeNode); } return TreeUtil.build(treeNodeList, root); } }
响应消息主体类
/** * 响应信息主体 * * @param*/@ToString@NoArgsConstructor@AllArgsConstructor@Accessors(chain = true)public class R implements Serializable { private static final long serialVersionUID = 1L; private int code; private String msg; private T data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } public static R ok() { return restResult(null, CommonConstants.SUCCESS, CommonConstants.MSG_SUCCESS); } public static R ok(T data) { return restResult(data, CommonConstants.SUCCESS, CommonConstants.MSG_SUCCESS); } public static R ok(T data, String msg) { return restResult(data, CommonConstants.SUCCESS, msg); } public static R failed() { return restResult(null, CommonConstants.FAIL, null); } public static R failed(String msg) { return restResult(null, CommonConstants.FAIL, msg); } public static R failed(T data) { return restResult(data, CommonConstants.FAIL, null); } public static R failed(T data, String msg) { return restResult(data, CommonConstants.FAIL, msg); } private static R restResult(T data, int code, String msg) { R apiResult = new R<>(); apiResult.setCode(code); apiResult.setData(data); apiResult.setMsg(msg); return apiResult; }}
数据查询接口mapper类
@Mapperpublic interface PermissionMapper extends BaseMapper{ }
数据逻辑处理业务接口
public interface PermissionService extends IService{ /** * 构建权限树 * * @param lazy * @param parentId * @return */ List treePermission(boolean lazy, String parentId);}
数据逻辑处理业务接口实现类
@Servicepublic class PermissionServiceImpl extends ServiceImplimplements PermissionService {/** * 构建权限树:1、不是懒加载情况,查询全部 * 2、是懒加载,根据parentId查询 * * @param lazy * @param parentId * @return */ @Override public List treePermission(boolean lazy, String parentId) { if (!lazy) { return TreeUtil.buildTree( baseMapper.selectList(Wrappers. lambdaQuery().orderByAsc(Permission::getSort)), CommonConstants.PERMISSION_ROOT_ID); } String parent = parentId == null ? CommonConstants.PERMISSION_ROOT_ID : parentId; return TreeUtil.buildTree( baseMapper.selectList(Wrappers. lambdaQuery().eq(Permission::getParentId, parent).orderByAsc(Permission::getSort)), parent ); }}
查询权限树请求接口类
@RestController@RequestMapping("/permission")public class PermissionController { @Autowire private PermissionService permissionService; /** * 查询权限列表,并以树状结构显示 * * @param lazy 懒加载: false时, parentId这个参数失效, 加载所有的权限; true时, 根据parentId加载 * @param parentId * @return */ @RequestMapping(value = "/getTree", method = RequestMethod.GET) public R getTree(boolean lazy, String parentId) { return R.ok(permissionService.treePermission(lazy, parentId)); } }
表中测试数据如下(注意它的parent_id)
测试一:不是懒加载,查询整个权限树。 结果如下。
{ "code": 0, "msg": "SUCCESS", "data": [ { "id": "1", "parentId": "-1", "children": [ { "id": "2", "parentId": "1", "children": [ { "id": "3", "parentId": "2", "children": [], "hasChildren": false, "permissionName": "update", "permissionCode": null, "path": null, "sort": 3, "label": "update", "owned": false }, { "id": "4", "parentId": "2", "children": [], "hasChildren": false, "permissionName": "insert_role", "permissionCode": null, "path": null, "sort": 4, "label": "insert_role", "owned": false } ], "hasChildren": true, "permissionName": "delete", "permissionCode": null, "path": null, "sort": 2, "label": "delete", "owned": false } ], "hasChildren": true, "permissionName": "add", "permissionCode": null, "path": null, "sort": 1, "label": "add", "owned": false }, { "id": "5", "parentId": "-1", "children": [], "hasChildren": false, "permissionName": "role:saveRole", "permissionCode": null, "path": "/role/saveRole", "sort": 5, "label": "role:saveRole", "owned": false } ]}
测试二:是懒加载,根据parent_id查询当前分支。 结果如下。
{ "code": 0, "msg": "SUCCESS", "data": [ { "id": "3", "parentId": "2", "children": [], "hasChildren": false, "permissionName": "update", "permissionCode": null, "path": null, "sort": 3, "label": "update", "owned": false }, { "id": "4", "parentId": "2", "children": [], "hasChildren": false, "permissionName": "insert_role", "permissionCode": null, "path": null, "sort": 4, "label": "insert_role", "owned": false } ]}
到此,相信大家对"springboot构造树形结构数据并查询的方法是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
权限
查询
数据
树形
方法
接口
结构
结点
菜单
测试
业务
主体
信息
内容
时间
标识
结果
逻辑
处理
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库挂不上怎么办
王者荣耀9月4日服务器崩溃
数据库DDL to file
新川科技园互联网
国家网络安全宣传周的演讲稿
网络安全宣传活动周时间
虚拟电话软件开发
原创网络安全小短剧
谈谈你对网络安全的理解
sql数据库语句手册
演化模式 软件开发
计算机网络技术基础阚宝朋ppt
长春市双阳软件开发公司电话
为什么数据库要设置保留字段
防火禁毒网络安全黑板报
数据库建立视图编码模板
系统软件开发进度管理软件
洛奇数据库
黑龙江特种网络技术资费
设计数据库用什么格式表格
cif数据库
海南通用软件开发近期价格
教育部青少年网络安全
hp380g6服务器
湖州桌面软件开发工程师
华为服务器光纤连接浪潮存储
网络安全宣传周线下活动
不符合网络安全法是
天文数字底片数据库第一批
软件开发响应时间周期