Java 實現左側菜單欄的數據層級結構

這是一個超級簡單的實現,未考慮代碼執行效率等因素,僅供參考。。。

數據庫設計: menu表,頂級菜單parentId默認爲-1,同一個頂級菜單下所有菜單的rootId爲頂級菜單的id。(若多個系統共用一個表,可增加一列:系統編碼,根據系統編碼查詢指定系統下的所有菜單)
在這裏插入圖片描述
Menu.java

@Data
public class Menu {
    private int id;
    private String name;
    private int parentId;
    private int rootId;
    private Date createTime;
    private List<Menu> childMenus;
}

MenuDao.java

@Mapper
@Repository
public interface MenuDao {
    @Select("select id, name, parentId, rootId, createTime " +
            "from menu where rootId=#{rootId} order by createTime")
    List<Menu> queryByRootId(int rootId);

    @Select("select id, name, parentId, rootId, createTime " +
            "from menu order by createTime")
    List<Menu> queryAll();
}

MenuService.java

public interface MenuService {
    Menu queryByRootId(int rootId);

    List<Menu> queryAll();
}

MenuServiceImpl.java

@Service
public class MenuServiceImpl implements MenuService {

    @Autowired
    private MenuDao menuDao;

    /**
     * 根據rootId查找其下所有菜單,然後遞歸遍歷出子菜單
     * @param rootId
     * @return
     */
    @Override
    public Menu queryByRootId(int rootId) {
        List<Menu> menus = menuDao.queryByRootId(rootId);
        Menu result = null;
        for (Menu menu : menus) {
            findChildMenu(menus, menu);
            if (menu.getParentId() == -1) {
                result = menu;
            }
        }
        return result;
    }

    /**
     * 查詢所有菜單,然後遞歸遍歷出子菜單
     * @return
     */
    @Override
    public List<Menu> queryAll() {
        List<Menu> menus = menuDao.queryAll();
        List<Menu> result = new ArrayList<>();
        for (Menu menu : menus) {
            findChildMenu(menus, menu);
            if (menu.getParentId() == -1) {
                result.add(menu);
            }
        }
        return result;
    }

    private void findChildMenu(List<Menu> menus, Menu parentMenu) {
       for (Menu menu : menus) {
            if (menu.getParentId() == parentMenu.getId()) {
                List<Menu> childMenus = parentMenu.getChildMenus();
                if (childMenus == null) {
                    childMenus = new ArrayList<>();
                }

                if (!childMenus.contains(menu)) {
                    childMenus.add(menu);
                }

                parentMenu.setChildMenus(childMenus);
            }
        }
    }
}

MenuController.java

@RestController
@RequestMapping("/")
public class MenuController {

    @Autowired
    private MenuService menuService;

    @GetMapping("/menu/{rootId}")
    public Menu query(@PathVariable("rootId") int rootId) {
        return menuService.queryByRootId(rootId);
    }

    @GetMapping("/menu/all")
    public List<Menu> queryAll() {
        return menuService.queryAll();
    }
}

請求 /menu/{rootId},rootId=1, 返回結果:

{
    "id": 1,
    "name": "設置",
    "parentId": -1,
    "rootId": 1,
    "createTime": "2020-03-14T09:14:35.000+0000",
    "childMenus": [
        {
            "id": 2,
            "name": "通用",
            "parentId": 1,
            "rootId": 1,
            "createTime": "2020-03-14T09:15:28.000+0000",
            "childMenus": [
                {
                    "id": 4,
                    "name": "聲音",
                    "parentId": 2,
                    "rootId": 1,
                    "createTime": "2020-03-14T09:15:57.000+0000",
                    "childMenus": null
                },
                {
                    "id": 5,
                    "name": "字體",
                    "parentId": 2,
                    "rootId": 1,
                    "createTime": "2020-03-14T09:16:44.000+0000",
                    "childMenus": [
                        {
                            "id": 6,
                            "name": "系統字體",
                            "parentId": 5,
                            "rootId": 1,
                            "createTime": "2020-03-14T10:21:17.000+0000",
                            "childMenus": null
                        },
                        {
                            "id": 7,
                            "name": "文本字體",
                            "parentId": 5,
                            "rootId": 1,
                            "createTime": "2020-03-14T10:22:18.000+0000",
                            "childMenus": null
                        }
                    ]
                }
            ]
        },
        {
            "id": 3,
            "name": "隱私",
            "parentId": 1,
            "rootId": 1,
            "createTime": "2020-03-14T09:15:30.000+0000",
            "childMenus": null
        }
    ]
}

請求 /menu/all 返回結果:

[
    {
        "id": 1,
        "name": "設置",
        "parentId": -1,
        "rootId": 1,
        "createTime": "2020-03-14T09:14:35.000+0000",
        "childMenus": [
            {
                "id": 2,
                "name": "通用",
                "parentId": 1,
                "rootId": 1,
                "createTime": "2020-03-14T09:15:28.000+0000",
                "childMenus": [
                    {
                        "id": 4,
                        "name": "聲音",
                        "parentId": 2,
                        "rootId": 1,
                        "createTime": "2020-03-14T09:15:57.000+0000",
                        "childMenus": null
                    },
                    {
                        "id": 5,
                        "name": "字體",
                        "parentId": 2,
                        "rootId": 1,
                        "createTime": "2020-03-14T09:16:44.000+0000",
                        "childMenus": [
                            {
                                "id": 6,
                                "name": "系統字體",
                                "parentId": 5,
                                "rootId": 1,
                                "createTime": "2020-03-14T10:21:17.000+0000",
                                "childMenus": null
                            },
                            {
                                "id": 7,
                                "name": "文本字體",
                                "parentId": 5,
                                "rootId": 1,
                                "createTime": "2020-03-14T10:22:18.000+0000",
                                "childMenus": null
                            }
                        ]
                    }
                ]
            },
            {
                "id": 3,
                "name": "隱私",
                "parentId": 1,
                "rootId": 1,
                "createTime": "2020-03-14T09:15:30.000+0000",
                "childMenus": null
            }
        ]
    },
    {
        "id": 8,
        "name": "相冊",
        "parentId": -1,
        "rootId": 8,
        "createTime": "2020-03-14T10:23:38.000+0000",
        "childMenus": null
    },
    {
        "id": 9,
        "name": "表情",
        "parentId": -1,
        "rootId": 9,
        "createTime": "2020-03-14T10:23:58.000+0000",
        "childMenus": null
    }
]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章