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

本文详细介绍了基于RBAC模型的权限管理系统实现,包括角色、模块管理及权限分配流程。通过Spring框架整合PageHelper分页插件,实现角色与模块的CRUD操作,并利用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
内容概要:本文围绕“光伏-储能-数据中心”系统的容量优化配置展开研究,旨在通过构建数学模型并结合Matlab编程实现,对园区内光伏发电、储能设备与数据中心算力负荷之间的多能互补关系进行协同优化。研究综合考虑可再生能源出力的波动性、储能系统的充放电特性以及数据中心的动态用电需求与算力调度特性,建立以最小化综合成本、降低碳排放强度、提升能源自给率等为目标的多目标优化模型,并采用先进的智能优化算法(如粒子群、灰狼、鲸鱼等)进行求解,从而确定光伏装机容量与储能系统配置的最优方案。文中提供了完整的Matlab代码实现流程,涵盖数据预处理、模型构建、算法求解与结果可视化全过程,属于综合能源系统与信息基础设施深度融合的前沿交叉课题。; 适合人群:具备电力系统、能源工程、自动化或计算机等相关专业背景,熟悉Matlab编程与基本优化算法原理,从事新能源利用、绿色数据中心、综合能源系统规划与低碳调度等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握光伏-储能-数据中心耦合系统的建模思路与多能流协同机制;② 学习基于Matlab的多目标容量优化配置方法与智能算法应用技巧;③ 为工业园区、数字经济园区及绿色数据中心的能源系统规划、节能减排与可持续运行提供科学决策依据和技术解决方案。; 阅读建议:建议结合所提供的Matlab代码,深入理解目标函数设计、约束条件设定及算法实现细节,可通过调整负荷参数、改变气候数据、引入新的优化目标或约束条件等方式进行拓展性实验,以深化对系统特性的认知并提升实际科研与工程应用能力。
内容概要:本文档聚焦于“考虑源网荷储协调的主动配电网优化调度方法”的Matlab代码复现研究,属于电力系统与综合能源系统领域的高水平科研资源。文档系统阐述了融合电源侧、电网侧、负荷侧及储能系统(源-网-荷-储)协同优化的主动配电网调度模型,旨在通过先进的数学优化方法提升电力系统的经济性、可靠性与低碳化水平。研究内容涵盖多时间尺度调度架构、不确定性建模(如新能源出力波动)、鲁棒优化或分布鲁棒优化(DRO)等核心技术,并依托Matlab平台完成模型构建与仿真验证。同时,文档列举了多个前沿研究方向,如光储充一体化、主从博弈、微电网双层优化、电氢耦合系统、电动汽车集群调度等,体现出其在现代智能电网与综合能源系统优化调度中的代表性与前瞻性。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事能源、电气工程、自动化、可再生能源等方向研究的研究生、科研人员及工程技术人员,特别适合致力于优化建模、智能算法应用与综合能源系统仿真的研究人员。; 使用场景及目标:① 复现高水平期刊论文中的主动配电网优化调度模型;② 掌握源网荷储协同优化的建模方法与Matlab实现技术;③ 借助所提供的完整代码资源开展二次开发、算法改进或新场景拓展,服务于科研创新、项目申报与学术论文撰写。; 阅读建议:建议结合文档中提及的相关文献与案例,按照目录结构循序渐进地学习,重点理解模型构建的逻辑框架与代码实现的关键细节,并利用附带的百度网盘资源获取全部代码与数据文件,通过动手实践加深对优化算法与工程应用的理解。
内容概要:本文围绕《考虑光伏-储能-数据中心多能互补的园区容量优化配置(Matlab代码实现)》这一技术资源,系统研究了工业园区内光伏发电、储能系统与数据中心之间的能量协同与容量优化问题。通过构建融合可再生能源出力不确定性、负荷波动及数据中心算力负荷特性的数学优化模型,采用Matlab编程实现多能互补系统的容量配置求解,旨在提升能源利用效率、降低运营成本与碳排放,并增强园区能源系统的稳定性与经济性。文中综合运用分布鲁棒机会约束(DRCC)、N-1安全准则、鲁棒优化等先进建模方法,确保方案在复杂运行环境下的可行性与可靠性,适用于综合能源系统(IES)的规划与调度研究。; 适合人群:面向具备电力系统、能源系统或优化算法基础的研究生、科研人员及工程技术人员,尤其适合熟悉Matlab编程及YALMIP、CPLEX等优化工具的专业人士;对于从事智慧园区、绿色数据中心或低碳能源系统研究的人员亦具有较高参考价值。; 使用场景及目标:①支撑科研项目中对含数据中心的智慧园区进行多能互补建模与仿真分析;②用于撰写学位论文、期刊投稿中的案例验证与算法对比;③指导实际工程中光伏与储能容量的科学规划与配置决策;④深入学习分布鲁棒优化、N-1安全约束等高级方法在能源系统中的集成应用。; 阅读建议:建议结合提供的Matlab代码逐模块解析模型实现过程,重点关注目标函数构建、约束条件设定及求解器接口调用逻辑。推荐对照“顶级EI复现”案例,掌握工业级建模规范,并尝试复现关键结果以加深理解。同时可延伸学习文中关联的多时间尺度调度与协同优化策略,全面提升综合能源系统的研究与实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值