做这个是一个系统的后台管理,进行系统级别操作,登陆时可用来验证什么角色,拥有什么角色,显示什么内容。
一、五个表,user ,user_role,role,role_menu,menu 。分别是 用户表,用户角色表,角色表,用户菜单表,菜单表
需求:
用户这块:
1.展示所有用户,并展示相应用户角色信息。(可以模糊查询,相应中心和相应部门查询,分页,10条一页)
这里相应中心和部门也是一个接口,可以List<Map>中的Map再放一个List来作为部门。
2.给批量用户添加一个角色,也就是对用户多选框后,进行添加角色。
3.给用户批量重置密码,主要给忘密码的人,重新重置。
4.用户功能导出(excel,有excel模板用excel模板导出)
5.能对某个用户角色进行操作,比如给某个用户批量增加角色,减少角色等。
角色这块:
![](/qrcode.jpg)
1.新增角色。
2.删除角色。
3.角色功能导出。
4.权限编辑(也就是给角色添加权限,删除权限等,也是批量的,就用上多选框)
菜单这块(权限): ---最需要思考部分
表设计:
1.展示出所有菜单,并且是树状结构,父子级关系,无限层级。
2.对某个节点进行新增子级。
3.编辑某个节点。
4.删除该节点,并删除该节点下所有子节点。
1和4需要比较难。
思路,因为无限,思考着用递归来做。
递归:1.自己调用自己,2.有个递归出口
有一个根节点,是一定有的,不然无法查找
Menu实体类中加有如下
1需求代码:
0作为pid,根节点。
/**
* 查询权限树
* @return
*/
@Override
public List<SysMenu> returnTree() {
Map<String, Object> params = new HashMap<String, Object>();
params.put("pid", "0");
params.put("delSign", BasicConstants.DEL_SIGN_ON);
List<SysMenu>list1 = menuDao.selectMenu(params);
log.info("pid:"+list1.get(0).getPid()+",size:"+list1.size());
List<SysMenu> lists = treeDigui(list1);
return lists;
}
//递归
public List<SysMenu> treeDigui(List<SysMenu>list){
List<SysMenu> returnList = list;
log.info("sizes:"+list.size());
if(list.size()==0){
return null;
}else{
for(int i=0; i<returnList.size();i++){
int size = returnList.size();
Map<String, Object> map = new HashMap<>();
map.put("pid", returnList.get(i).getId()+"");
map.put("delSign", BasicConstants.DEL_SIGN_ON);
List<SysMenu>lists = menuDao.selectMenu(map);//再去查是否有子集
returnList.get(i).setListMenu(lists); //都再加进去
treeDigui(lists); //递归实现树结构
}
}
return returnList;
}
2需求,删除
/**
* 新增,修改,删除一个菜单
*/
@Override
public int saveSysMenu(SysMenuDTO sysMenuDTO) {
String flag = sysMenuDTO.getFlag();
SysMenu sysMenu = sysMenuDTO.getSysMenu();
Date date=null;
try {
date = dateTimeUtil.dateTimeNow();
} catch (ParseException e) {
e.printStackTrace();
}
int result =0;
if(flag != null && flag.equals(flag) ){
if("1".equals(flag)){
//新增
sysMenu.setCreateDate(date);//创建时间
sysMenu.setPid(sysMenu.getId());
result = menuDao.saveSysMenu(sysMenu);
if(result>0){
result = 1;
}else{
result = -1;
}
}
if("2".equals(flag)){
//编辑
sysMenu.setModifyDate(date);
result = menuDao.updateSysMenu(sysMenu);
if(result >0){
result = 2;
}else{
result =-2;
}
}
if("3".equals(flag)){
//删除
List<SysMenu> listMap = new ArrayList<>();
listMap.add(sysMenu);
result = delDigui(listMap);
if(result >0){
result = 3;
}else{
result = -3;
}
}
}
return result;
}
/**
* 递归
* 条件
* 1.自己调用自己
* 2.有个递归出口
* @param list
* @return
*/
public Integer delDigui(List<SysMenu> list){
List<SysMenu> returnList = list;
log.info("sizes:"+list.size());
int result = 0;
if (returnList.size()==0){
return null;
}else{
for(int i=0; i<returnList.size();i++){
Map<String, Object> map = new HashMap<>();
map.put("pid", returnList.get(i).getId()+"");
map.put("delSign", BasicConstants.DEL_SIGN_ON);
List<SysMenu>lists = menuDao.selectMenu(map);//再去查是否有子集
log.info("进来id:"+returnList.get(i).getId());
Map<String, Object> params = new HashMap<>();
params.put("id", returnList.get(i).getId());
params.put("delSign", BasicConstants.DEL_SIGN_OFF);//删除标志
result = menuDao.delSysMenus(params);
log.info("出来id:"+returnList.get(i).getId());
delDigui(lists); //递归实现树结构
}
}
return result ;
}