用户、角色、权限管理系统(一)

作者: 根艮哏艮根 | 来源:发表于2018-05-27 07:56 被阅读815次

    本文版权归作者和简书共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    最近一直在练习java后台开发,感觉后台开发需要的知识点有点杂,比如你的会java开发,数据库开发(SQL语句的编写),JSP页面的编写(HTML),JS等等,但是也不是太难,只要认真去学习,相信聪明的你们都会学会的。
    在学习的过程中我是在做每个小项目中去具体的去应用,我做的练习是java里面经典的《用户,角色,权限管理系统》。

    用到的知识/框架

    这个小项目采用的是JFinal框架,,前台框架使用的是layui前台框架,数据库采用的是MySql,前后台交互使用jQuery。

    JFinal框架:http://www.jfinal.com/doc/2-3
    layui框架:http://www.layui.com/
    MySQL教程:http://www.runoob.com/mysql/mysql-tutorial.html
    jQuery教程:http://www.w3school.com.cn/jquery/index.asp
    JSTL教程:http://www.runoob.com/jsp/jsp-jstl.html
    EL表达式教程:http://www.runoob.com/jsp/jsp-expression-language.html

    数据库设计了五张表:


    数据库.png

    下面先奉上系统内的截图:

    首页.png
    用户管理界面.png
    角色管理界面.png
    菜单管理界面.png
    分配角色.png
    分配菜单.png

    部分代码

    JFinal基本配置

    /**
     * 
     */
    package com.gengen.manager.config;
    
    import java.io.File;
    
    import com.gengen.manager.controller.LoginController;
    import com.gengen.manager.controller.MainController;
    import com.gengen.manager.controller.MenuController;
    import com.gengen.manager.controller.RoleController;
    import com.gengen.manager.controller.UserController;
    import com.gengen.manager.interceptor.LoginInterceptor;
    import com.gengen.manager.model.User;
    import com.gengen.manager.model._MappingKit;
    import com.jfinal.config.Constants;
    import com.jfinal.config.Handlers;
    import com.jfinal.config.Interceptors;
    import com.jfinal.config.JFinalConfig;
    import com.jfinal.config.Plugins;
    import com.jfinal.config.Routes;
    import com.jfinal.json.FastJsonFactory;
    import com.jfinal.kit.PathKit;
    import com.jfinal.kit.PropKit;
    import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
    import com.jfinal.plugin.druid.DruidPlugin;
    import com.jfinal.render.ViewType;
    import com.jfinal.template.Engine;
    
    /**
     * @ClassName: MyConfig
     * @author Liu_xg
     * @date 2018年5月4日
     * @Description: TODO
     */
    public class MyConfig extends JFinalConfig {
    
        /**
         * 通用配置
         */
        @Override
        public void configConstant(Constants me) {
            // TODO Auto-generated method stub
            me.setDevMode(true);
            me.setEncoding("utf-8");
            me.setViewType(ViewType.JSP);
            
    
            me.setError404View("/WEB-INF/common/error404.jsp");
            me.setError500View("");
            // 指定json工具jar包为fastjson
            me.setJsonFactory(new FastJsonFactory());
            // 上传图片的路径
            me.setBaseUploadPath(PathKit.getWebRootPath()+File.separator+"upload"+File.separator);
        }
    
        /**
         * 配置路由
         * 
         * @param me
         */
        @Override
        public void configRoute(Routes me) {
    
            // 配置拦截器
            me.addInterceptor(new LoginInterceptor());
    
            me.add("/", LoginController.class, "/WEB-INF/views/login");
            me.add("/main", MainController.class, "/WEB-INF/views/main");
            me.add("/menu", MenuController.class, "/WEB-INF/views/menu");
            me.add("/user", UserController.class, "/WEB-INF/views/user");
            me.add("/role", RoleController.class, "/WEB-INF/views/role");
    
        }
    
        @Override
        public void configEngine(Engine me) {
            // TODO Auto-generated method stub
    
        }
    
        /**
         * 配置插件
         */
        @Override
        public void configPlugin(Plugins me) {
    
            // 配置D3p0数据库连接池
            DruidPlugin plugin = createDruidPlugin();
            me.add(plugin);
    
            // 配置ActiveRecord插件
            ActiveRecordPlugin arp = new ActiveRecordPlugin(plugin);
            _MappingKit.mapping(arp);
            me.add(arp);
            arp.addMapping("t_user", User.class);
        }
    
        @Override
        public void configInterceptor(Interceptors me) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void configHandler(Handlers me) {
            // TODO Auto-generated method stub
    
        }
    
        /**
         * 连接数据库
         * 
         * @return
         */
        public static DruidPlugin createDruidPlugin() {
            PropKit.use("jdbc.properties");
            return new DruidPlugin(PropKit.get("db.url"), PropKit.get("db.username"), PropKit.get("db.password"));
        }
    
    }
    

    通过登陆用户的ID来查询此用户对应角色所分配的权限信息,用于在登陆后菜单的展示.

    首先根据登陆用户id来查询此用户对应的一级目录信息,然后在根据一级目录id和用户id来查询此用户在该一级目录下的二级目录信息。

    Controller层代码

    /**
         * 展示权限管理系统后台页
         */
        @SuppressWarnings("unchecked")
        public void mainMenu() {
            User user=getSessionAttr("user");
            menus = (List<Map<String, Object>>) mainService.mainMenuByUserIdFromMain(user.getId());
            if (menus != null) {
                if(user.getImagePath()==null){
                    setAttr("iconName","/upload/defult.jpg");
                }else{
                    setAttr("iconName",user.getImagePath());
                }
                setAttr("user",user);
                setAttr("menus", menus);
                // 显示欢迎界面
                setAttr("url", "/main/welcome");
                // 将数据库中查询到的main路径动态添加到布局中
                renderJsp("mainMenu.jsp");
            }
    
        }
    

    Service层代码

    /**
         * 菜单展示(通过用户id来查询菜单、权限)
         * 
         * @param userId
         * @return
         */
        @SuppressWarnings("unchecked")
        public List<?> mainMenuByUserIdFromMain(int userId) {
    
            menus = new ArrayList<>();
            // 查到父item的信息
            menusParent = (List<Menu>) menuDao.queryMenuParent(-1);
            if (menusParent != null) {
                for (int i = 0; i < menusParent.size(); i++) {
                    // 查到该父item关联的子item信息
                    menusChild = (List<Menu>) menuDao.queryMenuchildByUserId(menusParent.get(i).getId(), userId);
                    if (menusChild.size()>0) {
                        maps = new HashMap<>();
                        maps.put("menusParent", menusParent.get(i));
                        maps.put("menusChild", menusChild);
                        menus.add(maps);
                    } 
                }
            }
            return menus;
        }
    

    Dao层代码

    /**
         * 查询父菜单item的相关信息
         */
        public List<?> queryMenuParent(int menuId) {
            String sql = "select id,menu_name,parent_id from t_menu where  statue=1 and parent_id=0 ";
            prarms = new ArrayList<Object>();
            try {
                if (menuId > 0) {
                    sql += " and id=?";
                    prarms.add(menuId);
                }
                List<?> menus = dao.find(sql, prarms.toArray());
                return menus;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
        }
    
        /**
         * 查询子菜单item(根据根目录id和用户id)
         */
        public List<?> queryMenuchildByUserId(int parent_id, int user_id) {
            String sql = "select m.menu_name,m.parent_id,m.child_path,m.id " + "from t_menu m,t_user_role u,t_role_menu r "
                    + "where m.statue=1 and u.role_id=r.role_id and r.menu_id=m.id ";
            prarms = new ArrayList<Object>();
            if (parent_id > 0) {
                sql += " and m.parent_id=?";
                prarms.add(parent_id);
            }
            if (user_id > 0) {
    
                sql += " and u.user_id=?";
                prarms.add(user_id);
            }
            try {
                List<?> menus = dao.find(sql, prarms.toArray());
                return menus;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
        }
    

    JSP页面代码

     <div class="layui-side layui-bg-black" lay-filter="demo">
        <div class="layui-side-scroll">
          <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
          <ul class="layui-nav layui-nav-tree"  lay-filter="test">
            <c:forEach  items="${menus }" var ="menus" step="1" varStatus="i">
                <li class="layui-nav-item">
                     <a class="" href="javascript:;">${menus.menusParent.menu_name }</a>
                      <dl class="layui-nav-child">
                           <c:forEach items="${menus.menusChild }" var ="menusChild" step="1">
                                <dd><a href="javascript:void(0)" data-id="${menusChild.id }" 
                                data-url="${menusChild.child_path }"  
                                data-title="${menusChild.menu_name }" class="site-demo-active">
                                <%-- onclick="setContent('${menusChild.child_path }');" --%>
                                    ${menusChild.menu_name }
                                </a></dd>
                           </c:forEach>
                      </dl>
                </li>
            </c:forEach>
          </ul>
        </div>
      </div>
    

    请接下篇:用户、角色、权限管理系统(二)

    相关文章

      网友评论

      本文标题:用户、角色、权限管理系统(一)

      本文链接:https://www.haomeiwen.com/subject/azovjftx.html