springboot+thymeleaf把菜单栏存放到数据库

在把基本的一个功能实现了之后,发现了一个新的问题.就是菜单栏需要在html中一直写真的是超级麻烦,无限的复制粘贴让我干到疲惫,而懒惰是人类进步的最大动力.所以驱使我要把一级菜单二级菜单存放到数据库中,让他自己遍历就好了.想了一下,会用到关联查询,然后需要js给当前的菜单增加css效果.

所以
一级菜单 我给的属性有id menu_img(菜单前的小图标) menu_name(菜单名称) menu_value(用来让二级菜单关联的)

二级菜单我给的属性有id menu_name menu_url(跳转链接) menu_value

然后对应的建立实体类 代码如下

package com.emp.manage.pc.menu.domain;

import java.util.List;

public class FirstMenu {
    private String id;

    private String menuImg;

    private String menuName;

    private Integer menuValue;

    private List<SecondMenu> secondMenus;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id == null ? null : id.trim();
    }

    public String getMenuImg() {
        return menuImg;
    }

    public void setMenuImg(String menuImg) {
        this.menuImg = menuImg == null ? null : menuImg.trim();
    }

    public String getMenuName() {
        return menuName;
    }

    public void setMenuName(String menuName) {
        this.menuName = menuName == null ? null : menuName.trim();
    }

    public Integer getMenuValue() {
        return menuValue;
    }

    public void setMenuValue(Integer menuValue) {
        this.menuValue = menuValue;
    }

    public List<SecondMenu> getSecondMenus() {
        return secondMenus;
    }

    public void setSecondMenus(List<SecondMenu> secondMenus) {
        this.secondMenus = secondMenus;
    }

    @Override
    public String toString() {
        return "FirstMenu{" +
                "id='" + id + '\'' +
                ", menuImg='" + menuImg + '\'' +
                ", menuName='" + menuName + '\'' +
                ", menuValue=" + menuValue +
                ", secondMenus=" + secondMenus +
                '}';
    }
}
package com.emp.manage.pc.menu.domain;

/**
 * @author employeeeee
 * @Descriotion:
 * @date 2019/1/10 10:12
 */
public class SecondMenu {
    private String id;

    private String menuName;

    private Integer menuValue;

    private String menuUrl;

    public String getId() {
        return id;
    }

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

    public String getMenuName() {
        return menuName;
    }

    public void setMenuName(String menuName) {
        this.menuName = menuName;
    }

    public Integer getMenuValue() {
        return menuValue;
    }

    public void setMenuValue(Integer menuValue) {
        this.menuValue = menuValue;
    }

    public String getMenuUrl() {
        return menuUrl;
    }

    public void setMenuUrl(String menuUrl) {
        this.menuUrl = menuUrl;
    }

    @Override
    public String toString() {
        return "SecondMenu{" +
                "id='" + id + '\'' +
                ", menuName='" + menuName + '\'' +
                ", menuValue=" + menuValue +
                ", menuUrl='" + menuUrl + '\'' +
                '}';
    }
}

因为需要关联查询,所以在以及菜单实体类中 是有了一个list的属性的.
xml配置我就不占了 关联查询已经写过好多次了.
然后因为是测试 我只是把这个在一个网页中进行了测试,
正常应该写在你的登录的controller中.
然后把你取到的菜单list 给存放到session中.
我就比较懒惰的给写在了一个随便找的url中.

    @GetMapping("/{userid}/queryInfo")
    public  String queryInfo(Model model, HttpSession session, @PathVariable("userid") String userid){
        UsersVo usersVo = userService.queryUsersVoInfo(userid);
        List<FirstMenu> firstMenuList = menuService.selectAllMenu();
        model.addAttribute("userVo", usersVo);
        session.setAttribute("menuList",firstMenuList);
        return "user/userInfo";
    }

这样已经是可以去到你的list了 然后在html中 把他遍历出来.

 <ul class="page-sidebar-menu  page-header-fixed " data-keep-expanded="false" data-auto-scroll="true"
            data-slide-speed="200"  th:each="firstMenu:${session.menuList}" >
            <!-- DOC: To remove the sidebar toggler from the sidebar you just need to completely remove the below "sidebar-toggler-wrapper" LI element -->
            <li th:id="${firstMenu.id}" class="nav-item">
                <a href="javascript:;" class="nav-link nav-toggle">
                    <i th:class="${firstMenu.menuImg}"></i>
                    <span class="title" th:text="${firstMenu.menuName}">用户管理</span>
                    <span class="arrow"></span>
                </a>
                <ul class="sub-menu">
                    <!--active open-->
                    <li class="nav-item " th:each="secondMenu:${firstMenu.secondMenus}" th:id="${secondMenu.id}">
                        <a th:href="@{${secondMenu.menuUrl}}" class="nav-link ">
                            <span class="title selected" th:text="${secondMenu.menuName}">用户列表</span>
                        </a>
                    </li>
                </ul>
            </li>
        </ul>

菜单栏部分就这样变得这么简短.不需要那么一大堆写死的代码了.

当然 总是要给人家加上css效果的,写一个js就ok了

    <script>
        jQuery(document).ready(function () {
            initMenueTile();
        });

        function initMenueTile() {
//这里放的是你的一级菜单 和 二级菜单id
            initTitile('userMenu','userMenu_list');
        }

        function initTitile(first,second) {
            //1级菜单
            var $li = $('#'+first);
            //2级菜单
            var $subli = $('#' + second);

            $li.addClass("active open selected");
            $subli.addClass("active");

        }
    </script>

最后就这样了


image.png

因为这里的菜单id还是通过手写的,接下来会给他变为自动的一个传参和判断 在用户点击的时候把id和index的下标值传一下应该就可以了.
因为也不算特别大的突破 所以准备先写一下文件上传和用户编辑

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...
    哇哈哈E阅读 8,560评论 0 38
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,711评论 0 17
  • 1.服务是什么:服务是Android四大组件之一,是实现android程序后台运行的解决方案,适合执行不需要交互并...
    在下陈小村阅读 1,313评论 0 0
  • 天气越来越冷,每日的夜晚也来的越来越早,遇上阴沉的天气,不到六点,天就已经黑尽。 曾经,我最害怕黑夜。小时候住在乡...
    栗子颜阅读 3,816评论 0 6
  • 屏幕前的女孩子,也许你现在很累,但请保持你的微笑,因为爱笑的女生运气不会太差,最近心里压力很大,身边朋友也...
    人人笑我太可爱阅读 3,486评论 1 6