1. 程式人生 > 實用技巧 >許可權管理系統 - 3 對於不同許可權使用者 進行選單控制

許可權管理系統 - 3 對於不同許可權使用者 進行選單控制

使用者登入模組 - 3 對於不同許可權使用者 進行選單控制

  • 動態選單 - 基本流程

    • UserServlet - login

      • 查詢該使用者對應的角色對應的所有模組
    • UserService + UserServiceImpl

      • findModuleById方法
    • ModuleDao - findModuleByUserId方法

    • ModuleDao.xml

    • /WEB-INF/pages/home/aside.jsp

      • 新增使用者選單的展示

(1)在使用者登陸的時候需要去查詢該使用者對應的角色對應的所有模組,因此需要在後臺的UserServlet中修改使用者登陸的方法,新增資料的查詢

private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String email = request.getParameter("email");
    String pwd = request.getParameter("password");
    User user = userService.login(email,pwd);
    if(user != null) {
        request.getSession().setAttribute("loginUser", user);
        //如果登入成功,載入該使用者對應的角色對應的所有模組
        List<Module> moduleList = userService.findModuleById(user.getId());
        request.setAttribute("moduleList",moduleList);
        //跳轉頁面
        request.getRequestDispatcher("/WEB-INF/pages/home/main.jsp").forward(request, response);
    }else{
        response.sendRedirect(request.getContextPath()+"/login.jsp");
    }
}

(2)在UserService介面中新增方法findModuleById

/**
     * 根據使用者id查詢所有可以操作的選單物件
     * @param id 使用者的id
     * @return
     */
    List<Module> findModuleById(String id);

(3)在實現類中去實現該方法

@Override
public List<Module> findModuleById(String id) {
    SqlSession sqlSession = null;
    try{
        //1.獲取SqlSession
        sqlSession = MapperFactory.getSqlSession();
        //2.獲取Dao
        ModuleDao moduleDao = MapperFactory.getMapper(sqlSession,ModuleDao.class);
        //3.呼叫Dao層操作
        return moduleDao.findModuleByUserId(id);
    }catch (Exception e){
        throw new RuntimeException(e);
        //記錄日誌
    }finally {
        try {
            TransactionUtil.close(sqlSession);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

(4)在ModuleDao介面中新增查詢方法findModuleByUserId

List<Module> findModuleByUserId(String id);

(5)在ModuleDao.xml中新增對應的查詢

<select id="findModuleByUserId" parameterType="java.lang.String" resultMap="BaseResultMap">
        /*userid->使用者角色關係表->roleid->角色模組關係表->moduleid->module資訊*/
        SELECT DISTINCT
          m.module_id, m.parent_id, m.name, m.ctype, m.state, m.curl, m.remark
        FROM
            ss_module AS m,
            ss_role_module AS rm,
            ss_role_user AS ru
        WHERE
            m.module_id = rm.module_id
        AND	rm.role_id = ru.role_id
        AND	ru.user_id = #{id,jdbcType=VARCHAR}
    </select>

(6)找到/WEB-INF/pages/home/aside.jsp頁面,新增使用者選單的展示

<!-- sidebar menu: : style can be found in sidebar.less -->
<ul class="sidebar-menu">
    <li class="header">選單</li>

    <c:forEach items="${moduleList}" var="item">
        <c:if test="${item.ctype==0}">
            <li class="treeview">
                <a href="#">
                    <i class="fa fa-cube"></i> <span>${item.name}</span>
                    <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>
                </a>
                <ul class="treeview-menu">
                    <c:forEach items="${moduleList}" var="item2">
                        <c:if test="${item2.ctype==1 && item2.parentId == item.id}">
                            <li id="${item2.id}">
                                <a onclick="setSidebarActive(this)" href="${ctx}/${item2.curl}" target="iframe">
                                    <i class="fa fa-circle-o"></i>${item2.name}
                                </a>
                            </li>
                        </c:if>
                    </c:forEach>
                </ul>
            </li>
        </c:if>
    </c:forEach>