项目一 4 角色管理 模块管理 ztree树 对角色分配权限

# 回顾

- PageHelper 分页插件

​	1.引入坐标

​	2.在mybatis和sprig整合的时候配置方言

​	3.在service中使用PageHelper( 设置分页参数,查询全部,构造PageInfo的返回值 )

- 部门管理

  1.子部门和父部门的一对一

- RBAC权限模型

  用户,角色,模块(权限菜单)

  用户和角色多对多(中间表),角色和模块的多对多(中间表)

- 用户管理

1.角色管理

角色管理 : 对不同的租用企业进行角色的CRUD
在这里插入图片描述
在这里插入图片描述

<1> roleController相关代码

package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {

	@Autowired
	private RoleService roleService;

	/**
	 * 分页查询所有的角色
	 */
	@RequestMapping("/list")
	public String list(
			@RequestParam(defaultValue = "1") int page,
			@RequestParam(defaultValue = "5") int size) {
		//1.调用service
		PageInfo info = roleService.findAll(page, size, getLoginCompanyId());
		//2.将数据保存到request域
		request.setAttribute("page",info);
		//3.跳转页面
		return "system/role/role-list";
	}

	/**
	 * 跳转到添加页面
	 */
	@RequestMapping("/toAdd")
	public String toAdd() {
		return "system/role/role-add";
	}


	/**
	 * 保存或者更新角色
	 *      保存:
	 */
	@RequestMapping("/edit")
	public String edit(Role role) {
		//1.设置企业id
		role.setCompanyId(getLoginCompanyId());
		role.setCompanyName(getLoginCompanyName());
		//2.判断是否具有id
		if (StringUtils.isEmpty(role.getId())){
			//2.1 没id:保存
			roleService.save(role);
		}else{
			//2.2 有id:更新
			roleService.update(role);
		}
		return "redirect:/system/role/list.do";
	}

	/**
	 * 进入到修改的页面
	 *      1.根据id查询
	 */
	@RequestMapping("/toUpdate")
	public String toUpdate(String id) {
		Role role = roleService.findById(id);
		request.setAttribute("role",role);
		return "system/role/role-update";
	}

	/**
	 * 根据id删除
	 */
	@RequestMapping("/delete")
	public String delete(String id) {
		roleService.delete(id);
		return "redirect:/system/role/list.do";
	}

	/**
	 * 进入到分配权限的页面
	 */
	@RequestMapping("/roleModule")
	public String roleModule(String roleid) {
		//根据id查询角色
		Role role = roleService.findById(roleid);
		request.setAttribute("role",role);
		return "system/role/role-module";
	}



	@Autowired
	private ModuleService moduleService;
	/**
	 *  构造树形菜单数据 : 接收ajax请求
	 *  响应 : json数据
	 *  数据格式:
	 *       [
	 *           { id:11, pId:1, name:"随意勾选 1-1"},
	 *           { id:111, pId:11, name:"随意勾选 1-1-1"}
	 *       ]
	 *  注解: @ResponseBody 配置方法返回值上 ,将对象自动的转化为json
	 *  返回值: List
	 *  List中的每一个元素 :  自定义新的对象, Map集合
	 *  参数:
	 *      角色的id
	 */
	@RequestMapping("/getZtreeNodes")
	public @ResponseBody List<Map> getZtreeNodes(String roleId) {
		List<Map> list = new ArrayList();
		//查询所有的模块数据
		List<Module> modules = moduleService.findAll();
		//根据roleid查询角色所具有的所有的模块
		List<Module> roleModules = moduleService.findByRoleId(roleId);  //系统管理,用户管理,角色管理
		//循环模块
		for (Module module : modules) {
			//将每个模块构造为一个Map集合
			Map map = new HashMap();            //系统管理
			map.put("id",module.getId());
			map.put("pId",module.getParentId());
			map.put("name",module.getName());
			if(roleModules.contains(module)) {
				map.put("checked", true);
			}
			list.add(map);
		}
		return list;
	}


	/**
	 * 分配权限
	 *  roleid
	 *  moduleIds
	 */
	@RequestMapping("/updateRoleModule")
	public String updateRoleModule(String roleid,String moduleIds) {
		roleService.updateRoleModule(roleid,moduleIds);
		return "redirect:/system/role/list.do";
	}
}

<2> roleService相关代码

package cn.itcast.service.system.impl;

import cn.itcast.dao.system.RoleDao;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.RoleService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

@Service
public class RoleServiceImpl implements RoleService {

	@Autowired
	private RoleDao roleDao;

	@Override
	public void save(Role role) {
		//1.设置id
		role.setId(UUID.randomUUID().toString());
		roleDao.save(role);
	}

	@Override
	public void update(Role role) {
		roleDao.update(role);
	}

	@Override
	public void delete(String id) {
		roleDao.delete(id);
	}

	@Override
	public Role findById(String id) {
		return roleDao.findById(id);
	}

	@Override
	public PageInfo findAll(int page, int size, String companyId) {
		//1.设置参数
		PageHelper.startPage(page,size);
		//2.查询全部
		List list = roleDao.findAll(companyId);
		//3.构造pageinfo返回值
		return new PageInfo(list);
	}

	//分配权限
	public void updateRoleModule(String roleId, String moduleIds) {
		//1.获取所有的模块id的数组
		String[] mids = moduleIds.split(",");
		//2.根据角色id删除所有的中间表数据
		roleDao.deleteRoleModule(roleId);
		//3.循环保存中间表数据
		for (String moduleId : mids) {
			roleDao.saveRoleModule(roleId,moduleId);
		}
	}
}

2.模块管理

在这里插入图片描述
模块 : 一级菜单,二级菜单,按钮,超链接

字段:

module_id   : 主键
parent_id   : 父菜单的id
parent_name : 父菜单名称
name        : 模块名
curl        : 菜单的访问路径url
ctype       : 模块的类型 , 0:一级,1:二级,2:按钮,3:超链接
state    	: 状态 0:不可用,1:可用   
belong      : 菜单的从属关系 0 : 属于saas管理模块  ,1: 企业的业务模块  

在这里插入图片描述
<1>在这里插入图片描述

在这里插入图片描述
<2>

ModuleController相关代码:

package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.service.system.ModuleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
@RequestMapping("/system/module")
public class ModuleController extends BaseController {

	@Autowired
	private ModuleService moduleService;

	/**
	 * 分页查询
	 */
	@RequestMapping("/list")
	public String list(
			@RequestParam(defaultValue = "1") int page,
			@RequestParam(defaultValue = "5") int size) {
		//1.调用service
		PageInfo info = moduleService.findAll(page, size);
		request.setAttribute("page",info);
		//2.跳转页面
		return "system/module/module-list";
	}


	/**
	 * 跳转到添加页面
	 */
	@RequestMapping("/toAdd")
	public String toAdd() {
		//查询全部的模块
		List menus = moduleService.findAll();
		request.setAttribute("menus",menus);
		return "system/module/module-add";
	}

	/**
	 * 跳转到修改页面
	 */
	@RequestMapping("/toUpdate")
	public String toUpdate(String id) {
		//查询全部的模块
		List menus = moduleService.findAll();
		request.setAttribute("menus",menus);
		//根据id查询模块
		Module module = moduleService.findById(id);
		request.setAttribute("module",module);
		return "system/module/module-update";
	}

	/**
	 * 保存或者更新
	 */
	@RequestMapping("/edit")
	public String edit(Module module) {
		if(StringUtils.isEmpty(module.getId())){
			moduleService.save(module);
		}else{
			moduleService.update(module);
		}
		return "redirect:/system/module/list.do";
	}

	/**
	 * 删除
	 */
	@RequestMapping("/delete")
	public String delete(String id) {
		moduleService.delete(id);
		return "redirect:/system/module/list.do";
	}


}

<3>
ModuleServiceImpl相关代码:

package cn.itcast.service.system.impl;

import cn.itcast.dao.system.ModuleDao;
import cn.itcast.domain.system.Module;
import cn.itcast.service.system.ModuleService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

@Service
public class ModuleServiceImpl implements ModuleService {

	@Autowired
	private ModuleDao moduleDao;

	@Override
	public void save(Module module) {
		module.setId(UUID.randomUUID().toString());
		moduleDao.save(module);
	}

	@Override
	public void update(Module module) {
		moduleDao.update(module);
	}

	@Override
	public void delete(String id) {
		moduleDao.delete(id);
	}

	@Override
	public List findAll() {
		return moduleDao.findAll();
	}

	@Override
	public PageInfo findAll(int page, int size) {
		PageHelper.startPage(page,size);
		List<Module> list = moduleDao.findAll();
		return new PageInfo(list);
	}

	@Override
	public Module findById(String id) {
		return moduleDao.findById(id);
	}

	//根据角色id查询所有的模块
	public List<Module> findByRoleId(String roleId) {
		return moduleDao.findByRoleId(roleId);
	}
}

3.分配权限(重点)

3.1 ztree树形组件

在前端展示树形结构的数据: 使用的方案(公共的开源的js插件,dtree,tdtree,ztree)

ztree : 是国内开源的前端的树形插件

1.ztree的配置 :setting

2.ztree的数据:json字符串

3.调用init方法构造ztree树

3.2 使用ztree展示模块的树形菜单

前端页面

<SCRIPT type="text/javascript">
    //1.Ztree的配置
    var setting = {
        check: {
            enable: true
        },
        data: {
            simpleData: {
                enable: true
            }
        }
    };


    var zTreeObj ; //整个ztree树
    //在页面加载的时候,调用init的方法展示ztree树
    $(document).ready(function(){
        $.get( "/system/role/getZtreeNodes.do?roleId=${role.id}", function( data ) {
            //回调函数 : 查询成功之后,需要执行的js内容
            //树展示的位置,树的基本配置,树的数据
            zTreeObj =  $.fn.zTree.init($("#treeDemo"), setting, data);
            zTreeObj.expandAll(true);//展开所有
        });
    });

    function submitCheckedNodes() {
        var nodes =  zTreeObj.getCheckedNodes(true);//获取 被勾选 的节点集合
        var moduleIds = "";
        for(var i=0;i<nodes.length;i++) {
            var node = nodes[i];
            moduleIds += node.id;
            if(i != nodes.length-1) {
                moduleIds += ",";
            }
        }
        //将拼接的字符串赋值到input中
        $("#moduleIds").val(moduleIds)
        //使用js的形式提交form表单即可
        $("#icform").submit();
    }
    //-->
</SCRIPT>

后端java

controller

在这里插入图片描述
在这里插入图片描述

service

在这里插入图片描述

dao

在这里插入图片描述

映射文件

在这里插入图片描述

3.3 分配权限

在这里插入图片描述

前端页面

controller

在这里插入图片描述

service

在这里插入图片描述

dao

在这里插入图片描述

作业

  1. 尝试分配用户
  2. 完成代码
  3. 回顾aop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值