权限管理项目实现

private void addRole(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        List<Menu> menuList = menuService.getMenuList();
        PageUtil pageUtil = new PageUtil();
        pageUtil.setDataList(menuList);
        //3.存值到页面
        resp.setContentType("text/html;charset=utf-8");
        req.setAttribute("p",pageUtil);
        req.getRequestDispatcher("list.jsp").forward(req,resp);

为了实现不同角色的权限需求, 就需要用到权限管理的功能。

权限管理需要有三张关键的表,分别为角色表(Role)、用户表(Users)以及角色权限表(Menu),并且为了关联角色表以及角色权限表,还需要一个中间表(Middle)。

在角色表中新建几个角色,并且在角色权限表中分配相应的权限,表示能访问的菜单有哪些,以下表示角色id为1的角色可以访问所有菜单,而角色id为2的仅可以访问菜单id为1、3的菜单。

角色表中设置四种角色,分别为管理员(必备)、班主任、老师、学生

用户表中添加相应的字段,roleid代表自己的角色


用户列表

在Users的Dao层以及Service层中创建对应的函数,从前端接收对应参数,并以此以获取对应的列表数据

Dao层:

@Override
    public List<Users> getUsersList(int pageIndex, int pageSize) {

        List<Users> usersList = new ArrayList();
        try {
            String sql = "SELECT USERID,LOGINNAME,REALNAME,ROLENAME FROM USERS U,ROLE R WHERE U.ROLEID = R.ROLEID LIMIT ?,?";
            List params = new ArrayList();
            params.add((pageIndex-1)*pageSize);
            params.add(pageSize);
            resultSet = query(sql, params);
            while(resultSet.next()){
                Users users = new Users();
                users.setUserid(resultSet.getInt("userid"));
                users.setLoginName(resultSet.getString("loginname"));
                users.setRealName(resultSet.getString("realname"));

                Role role = new Role();
                role.setRoleName(resultSet.getString("rolename"));
                users.setRole(role);
                usersList.add(users);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return usersList;
    }

    @Override
    public int total() {
        int total = 0;
        try {
            String sql = "SELECT COUNT(1) FROM USERS U,ROLE R " +
                    "WHERE U.ROLEID = R.ROLEID ";
            resultSet = query(sql, null);
            while(resultSet.next()){
                total = resultSet.getInt(1);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return total;
    }

Servlet层(Service层略):

@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        if("select".equals(method)){
            select(req, resp);
        }
    }
    //查询数据(分页)
    protected void select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String index = req.getParameter("index");

        int pageIndex = (index==null||index.length()==0)?1:Integer.parseInt(index);
        //调取service方法(1.查询数据列表方法 2.查询总条数的方法)
        PageUtil pageUtil = new PageUtil();

        List<Users> usersList = usersService.getUsersList(pageIndex, pageUtil.getPageSize());
        int total = usersService.total();
        pageUtil.setTotal(total);
        pageUtil.setPageIndex(pageIndex);
        pageUtil.setDataList(usersList);
        //3.存值到页面
        resp.setContentType("text/html;charset=utf-8");

        req.setAttribute("p",pageUtil);
        req.getRequestDispatcher("list.jsp").forward(req,resp);

    }

为了实现角色管理显示的视图,需要再Servlet层、service层以及Dao层创建相应的方法,代码如下:

Servlet层:

private void addRole(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        List<Menu> menuList = menuService.getMenuList();
        PageUtil pageUtil = new PageUtil();
        pageUtil.setDataList(menuList);
        //3.存值到页面
        resp.setContentType("text/html;charset=utf-8");
        req.setAttribute("p",pageUtil);
        req.getRequestDispatcher("list.jsp").forward(req,resp);

Service层:

public MenuDaoImpl menuDao = new MenuDaoImpl();

    @Override
        public List<Menu> getMenuList() {
        List<Menu> menuList = menuDao.getMenuList();//未分级
        System.out.println(menuList);
        List<Menu> newMenuList = new ArrayList<>();
        for (Menu menu:menuList) {
            if(menu.getUpMenuId()==0){
                ArrayList<Menu> secondList = new ArrayList<>();
                for(Menu second : menuList){
                    if(second.getUpMenuId()==menu.getMenuId()){
                        secondList.add(second);
                    }
                }
                menu.setSecondMenuList(secondList);
                newMenuList.add(menu);
            }
        }

Dao层:

 public List<Menu> getMenuList() {
        ArrayList<Menu> menus = null;
        try {
            String sql = "SELECT * FROM MENU";
            resultSet = query(sql, null);
            menus = new ArrayList<>();
            while(resultSet.next()){
                Menu menu = new Menu();
                menu.setMenuId(resultSet.getInt("menuId"));
                menu.setMenuName(resultSet.getString("menuName"));
                menu.setUpMenuId(resultSet.getInt("upMenuId"));
                menu.setDesc(resultSet.getString("desc"));
                menu.setState(resultSet.getInt("state"));
                menu.setUrl(resultSet.getString("url"));
                menus.add(menu);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return menus;

jsp界面代码(部分):

 <tr  width="120px;">
                    <td>菜单资源<span style="color:red">*</span>:</td>
                    <td>
                        <c:forEach items="${menuList}" var="m">
						<ul>
                        	<li><input type="checkbox" name="menu"  />${m.menuName}
                            	<ul>
                                    <c:forEach items="${m.secondMenuList}" var="m2">
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="menu"  />${m2.menuName}</li>
                                    </c:forEach>
                                </ul>
                            </li>
                        </ul>
                        </c:forEach>
					</td>
                </tr>

界面呈现如下:(可以动态显示新增用户界面的菜单选项)


用户新增

Servlet层:

private void insertRole(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String roleName = req.getParameter("role");
        String state = req.getParameter("state");
        String[] menuids = req.getParameterValues("menuId");
        RoleServiceImpl roleService = new RoleServiceImpl();
        int i = roleService.insertRole(roleName, Integer.parseInt(state), menuids);
        if(i>0){
            resp.sendRedirect("/power/role/role?method=select");
        }else{
            resp.sendRedirect("/power/role/role?method=addRole");
        }

    }

Service层:

@Override
    public int insertRole(String rolename, int state, String[] ids) {
        int k1 = 0;
        //新增角色表
        try {
            Role role = new Role();
            role.setRoleName(rolename);
            role.setRoleState(state);
            int k = roleDao.insertRole(role);
            //新增中间表
            int i = middleDao.insertMiddle(k,ids);
            k1 = 1;
        } catch (Exception exception) {
            exception.printStackTrace();
        }

        return k1;
    }

RoleDao层:

@Override
    public int insertRole(Role role) {
        int key = 0;//新增数据的id
        try {
            String sql = "INSERT INTO ROLE VALUES (null,?,?)";
            List param = new ArrayList();
            param.add(role.getRoleName());
            param.add(role.getRoleState());
            update(sql, param);//返回受影响的行数
            ResultSet generatedKeys = pps.getGeneratedKeys();
            if(generatedKeys.next()){
                key = generatedKeys.getInt(1);
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            closeAll();
        }
        return key;
    }

MiddleDao层:

@Override
    public int insertMiddle(int roleid, String[] ids) {
        int k = 0;
        try {
            String sql = "INSERT INTO MIDDLE VALUES(NULL,?,?)";
            //批量新增
            pps = getPps(sql);
            for (String id : ids) {
                pps.setInt(1,roleid);
                pps.setString(2,id);
            }
            pps.executeBatch();
            k=1;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return k;
    }

用户修改

RoleDao层:

@Override
    public Role findbyid(String id) {
        Role role = new Role();
        try {
            String sql = "SELECT * FROM ROLE WHERE ROLEID = ?";
            ArrayList param = new ArrayList();
            param.add(id);
            ResultSet query = query(sql, param);
            while(query.next()){

                int roleId = query.getInt("roleId");
                String rolename = query.getString("rolename");
                int state = query.getInt("state");
                role.setRoleId(roleId);
                role.setRoleState(state);
                role.setRoleName(rolename);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return role;
    }
@Override
    public List<Menu> getMenu(String id) {
        Menu menu = new Menu();
        List<Menu> menus = new ArrayList<>();
        try {
            String sql = "SELECT * FROM MIDDLE WHERE ROLEID = ?";
            ArrayList params = new ArrayList();
            params.add(id);
            ResultSet resultSet = query(sql, params);
            while(resultSet.next()){
                int menuid = resultSet.getInt("menuid");
                menu.setMenuId(menuid);
                menus.add(menu);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
        closeAll();
        }
        return menus;
    }

@Override
    public int updateRole(Role role) {
        int update = 0;
        try {
            String sql = "UPDATE ROLE SET ROLENAME = ?,STATE = ? WHERE ROLEID = ?";
            ArrayList params = new ArrayList();
            params.add(role.getRoleName());
            params.add(role.getRoleState());
            params.add(role.getRoleId());
            update = update(sql, params);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            closeAll();
        }

        return update;
    }

MiddleDao层:

@Override
    public int deleteMiddle(int roleId) {
        int delete = 0;
        try {
            String sql = "DELETE ROLE WHERE ROLEID = ?";
            List params = new ArrayList();
            params.add(roleId);
            delete = update(sql, params);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            closeAll();
        }
        return delete;
    }

Service层:

 @Override
    public Role findbyid(String id) {
        List<Menu> menu = roleDao.getMenu(id);
        Role role = roleDao.findbyid(id);
        role.setMenuList(menu);
        return role;
    }
 @Override
public int updateRole(Role role,String[] menuIds) {
        int update = roleDao.updateRole(role);
        int delete = middleDao.deleteMiddle(role.getRoleId());
        int insert = middleDao.insertMiddle(role.getRoleId(), menuIds);
        if(update > 0 && delete > 0 && insert > 0){
            return -1;
        }
        return 1;
    }

Servlet层:

private void findbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        String role = req.getParameter("roleId");
        RoleService roleService = new RoleServiceImpl();
        Role findbyid = roleService.findbyid(role);
        req.setAttribute("role",findbyid);
        List<Menu> menuList = menuService.getMenuList();
        //3.存值到页面
        resp.setContentType("text/html;charset=utf-8");
        req.setAttribute("menuList",menuList);
        req.getRequestDispatcher("adit.jsp").forward(req,resp);
    }
private void updateRole(HttpServletRequest req, HttpServletResponse resp) throws IOException{
        String roleId = req.getParameter("roleId");
        String roleName = req.getParameter("roleName");
        String[] menuIds = req.getParameterValues("menuId");
        String state = req.getParameter("state");
        Role role = new Role();
        role.setRoleName(roleName);
        role.setRoleId(Integer.parseInt(roleId));
        role.setRoleState(Integer.parseInt(state));
        RoleService roleService = new RoleServiceImpl();
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        int update = roleService.updateRole(role, menuIds);
        if (update > 0){
            writer.println("<script>alert('更新成功');location.href='/power/role/role?method=select'</script>");
        }else{
            writer.println("<script>alert('更新失败');location.href='/power/role/role?method=select'</script>");
        }
    }

删除角色

middleDao层:

@Override
    public int deleteMiddle(int roleId) {
        int delete = 0;
        try {
            String sql = "DELETE FROM MIDDLE WHERE ROLEID = ?";
            List params = new ArrayList();
            params.add(roleId);
            delete = update(sql, params);
            System.out.println("delete:"+delete);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            closeAll();
        }
        return delete;
    }

RoleDaoImpl层:

@Override
    public int deleteRole(int roleId) {
        int delete = 0;
        try {
            String sql = "DELETE FROM ROLE WHERE ROLEID = ?";
            List params = new ArrayList();
            params.add(roleId);
            delete = update(sql,params);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            closeAll();
        }
        return delete;
    }

RoleServiceImpl层:

@Override
public int deletebyid(String roleid) {
        int deleteMiddle = middleDao.deleteMiddle(Integer.parseInt(roleid));
        int deleteRole = roleDao.deleteRole(Integer.parseInt(roleid));
        if(deleteRole>1 && deleteMiddle > 1){
            return 1;
        }
        return 0;

RoleServlet层:

private void deletebyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        String roleId = req.getParameter("roleId");
        RoleService roleService = new RoleServiceImpl();
        int deletebyid = roleService.deletebyid(roleId);
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if(deletebyid>0){
            writer.println("<script>alert('删除成功');location.href='/power/role/role?method=select'</script>");
        }else{
            writer.println("<script>alert('删除失败');location.href='/power/role/role?method=select'</script>");
        }
    }

动态页面实现

dao层:

@Override
    public Users login(String username, String password) {
        ResultSet resultSet = null;
        Users users = null;
        try {
            String sql = "select * from users where loginName = ? and password = ?";
            ArrayList arrayList = new ArrayList();
            arrayList.add(username);
            arrayList.add(password);
            resultSet = query(sql, arrayList);
            if(resultSet==null){
                return null;
            }
            while(resultSet.next()){
                users = new Users();
                users.setLoginName("username");
                users.setRealName(resultSet.getString("realname"));
                users.setUserid(resultSet.getInt("userid"));
                users.setRoleid(resultSet.getInt("roleid"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return users;
    }

@Override
    public List<Users> getUsersList(int pageIndex, int pageSize) {
        ResultSet resultSet = null;
        List<Users> usersList = new ArrayList();
        try {
            String sql = "SELECT USERID,LOGINNAME,REALNAME,ROLENAME FROM USERS U,ROLE R WHERE U.ROLEID = R.ROLEID LIMIT ?,?";
            List params = new ArrayList();
            params.add((pageIndex-1)*pageSize);
            params.add(pageSize);
            resultSet = query(sql, params);
            while(resultSet.next()){
                Users users = new Users();
                users.setUserid(resultSet.getInt("userid"));
                users.setLoginName(resultSet.getString("loginname"));
                users.setRealName(resultSet.getString("realname"));

                Role role = new Role();
                role.setRoleName(resultSet.getString("rolename"));
                users.setRole(role);
                usersList.add(users);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return usersList;
    }

Service层:

@Override
    public Users login(String username, String password) {
        Users users = usersDao.login(username, password);
        if(users == null){
            return null;
        }
        //根据角色id查询角色,菜单信息(三表联查)
        Integer roleid = users.getRoleid();
        Role role = roleDao.findbyid(roleid.toString());
        //需要对菜单进行分级
        List<Menu> menuList = role.getMenuList();
        List<Menu> newMenuList = new ArrayList<>();
        for (Menu menu:menuList) {
            if(menu.getUpMenuId()==0){
                ArrayList<Menu> secondList = new ArrayList<>();
                for(Menu second : menuList){
                    if(second.getUpMenuId()==menu.getMenuId()){
                        secondList.add(second);
                    }
                }
                menu.setSecondMenuList(secondList);
                newMenuList.add(menu);
            }
        }
        role.setMenuList(newMenuList);
        users.setRole(role);
        return users;
    }

Servlet层:

@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.接收参数
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");

        //2.调取service
        UsersServiceImpl usersService = new UsersServiceImpl();
        Users users = usersService.login(userName, password);
        System.out.println(users);

        if (users==null){
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter writer = resp.getWriter();
            writer.println("<script>location.href='login.jsp';alert('用户名或者密码错误');</script>");
        }else{
            //3.跳转页面
            //保存用户信息
            req.getSession().setAttribute("u1",users);
            resp.sendRedirect("index.jsp");
        }
    }

猜你喜欢

转载自blog.csdn.net/qq152521766/article/details/118974510