用户、角色、权限管理系统(一)
本文版权归作者和简书共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
最近一直在练习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>
请接下篇:用户、角色、权限管理系统(二)