递归实现菜单列表(无限级菜单Java实现)

文章目录

概要

菜单是方便展示系统整体功能,菜单也有多样比如城市XXX省XXX市XXX县XXX街道等等商城也是展示了商品的分类更好让用户筛选商品。例如淘宝:

技术说明

代码使用java实现为了各种与我不同类名的菜单实现采用了泛型封装成了类可以按照我使用的方法使用即可,菜单列表使用自相关表父菜单和子菜单在相同表中父子相关联采用parentId关联例如:

注:可以不把表导入库我有演示样例这里只是让你导入后更清楚结构


CREATE TABLE `message`  (
  `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  `like_num` bigint(0) NULL DEFAULT NULL COMMENT '喜欢数',
  `reply` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '回复',
  `parent_id` bigint(0) NULL DEFAULT NULL COMMENT '回复父ID',
  `view` int(0) NULL DEFAULT NULL COMMENT '是否查看',
  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '回复人',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '回复时间',
  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '修改人',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `message` VALUES (1,NULL, '手机', 0, NULL, '小牛', '2024-12-09 14:15:49', '小牛', '2024-12-09 14:15:49');
INSERT INTO `message` VALUES (2, NULL, '智能手机', 1,  NULL, '小牛', '2024-12-13 10:28:23', '小牛', '2024-12-13 10:28:29');
INSERT INTO `message` VALUES (3, NULL, '非智能手机', 1,  NULL, '小牛', '2024-12-13 10:29:02', '小牛', '2024-12-13 10:29:08');
INSERT INTO `message` VALUES (4, NULL, '电脑', 0, NULL, '小牛', '2024-12-13 10:29:40', '小牛', '2024-12-13 10:29:46');

代码演示

1、创建TreeNode<T>节点方便封装

public interface TreeNode<T> {

  public Long getId();

  public Long getParentId();

  public void setChildren(List<T> children);

  public List<T> gteChildren();

}

2、创建菜单messageDto这里我使用消息类回复消息也是菜单某某评论某某某某回复某某

public class MessageDto extends BaseEntity implements TreeNode<MessageDto>
{
    private static final long serialVersionUID = 1L;

    /** 消息ID */
    private Long id;

    /** 用户ID */
    private Long userId;

    @Override
    public Long getId() {
        return id;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getLikeNum() {
        return likeNum;
    }

    public void setLikeNum(Long likeNum) {
        this.likeNum = likeNum;
    }

    public String getReply() {
        return reply;
    }

    public void setReply(String reply) {
        this.reply = reply;
    }

    @Override
    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public Long getView() {
        return view;
    }

    public void setView(Long view) {
        this.view = view;
    }

    public List<MessageDto> getChildren() {
        return children;
    }

    public void setId(Long id) {
        this.id = id;
    }

    /** 喜欢数 */

    private Long likeNum;

    /** 回复 */

    private String reply;

    /** 回复父ID */

    private Long parentId;

    /** 是否查看 */

    private Long view;

    private List<MessageDto> children;

    @Override
    public void setChildren(List<MessageDto> children) {
        this.children = children;
    }

    @Override
    public List<MessageDto> gteChildren() {
        return this.children;
    }

}

3、构建菜单

注:我是以parentId等于0作为根节点当然你也可以等于其他看你数据库怎么设计

public class BuildTree {

  public static <T extends TreeNode<T>> List<T> buildTree(List<T> messageList) {
    List<T> tree=new ArrayList<>();
    for (T message : messageList) {
      if(message.getParentId()==0l){
        tree.add(message);
      }
    }
    for (T message : tree) {
      message.setChildren(buildTree(messageList, message.getId()));
    }
    return tree;
  }
  public static <T extends TreeNode<T>> List<T>  buildTree(List<T> messageList,Long id) {
    List<T> tree=new ArrayList<>();
    for (T message : messageList) {
       if(message.getParentId()==id){
         message.setChildren(buildTree(messageList, message.getId()));
         tree.add(message);
       }
    }
    return tree;
  }

  public static void main(String[] args) {
   List<MessageDto> messageList=new ArrayList<>();
    MessageDto message=new MessageDto();
   message.setId(1l);
   message.setParentId(0l);
   message.setReply("你好");
    MessageDto message1=new MessageDto();
    message1.setId(2l);
    message1.setParentId(1l);
    message1.setReply("你好去");
    MessageDto message2=new MessageDto();
    message2.setId(3l);
    message2.setParentId(2l);
    message2.setReply("你好是");
    MessageDto message3=new MessageDto();
    message3.setId(4l);
    message3.setParentId(0l);
    message3.setReply("你好是");
    messageList.add(message);
    messageList.add(message1);
    messageList.add(message2);
    messageList.add(message3);
    List<MessageDto> messageList1 = buildTree(messageList);
    System.out.println(buildTree(messageList1));
  }

}

小结

这里可以从数据库遍历好所有菜单列表直接调用方法即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值