# 回顾
角色管理
模块管理
分配权限( ztree, 构造ztree的json数据,分配权限 )
1 分配角色
1.1 进入分配页面
实现步骤:
- 根据用户id查询用户数据
- 查询所有的角色数据
- 根据用户id查询此用户的所有角色数据
- 循环构造用户所有角色的id字符串
controller
service
dao
1.2 实现角色分配
- 当传递同名参数的时候,在controller中直接获取数组
controller
service
dao
2 用户登录
使用邮箱和密码进行登录
登录的步骤
web:
-
获取登录的用户邮箱和密码
-
判断用户的邮箱和密码是否为空
-
根据邮箱查询用户
-
判断用户是否存在以及数据库密码是否和用户登录密码一致
4.1 如果一致 : 将用户数据保存到session,跳转到主页
4.2 如果不一致: 跳转到登录页面重新登录
2.1 代码实现
2.2 登录密码
密码需要加密处理 : 使用MD5算法加密
将今天资料中的工具类Encrypt.java
导入到export_common工程中,在用户登录的时候,需要对用户的密码进行加密
3 动态构造菜单数据
3.1 数据说明
用户数据
1.sass管理员
2.企业管理员
3.企业的普通员工
菜单数据
1.saas管理访问的saas系统的内部菜单
2.企业用户访问的业务菜单
菜单的权限数据
1.sass管理员 : 可以访问所有的sass系统的内部菜单
2.企业管理员 : 可以访问所有的企业的业务菜单
3.企业的普通员工 : 根据rbac的数据规则查询对应的菜单权限
3.2 数据库表的字段
用户数据库表
用户表中的degree字段:
degree==0 : saas管理员
degree==1: 企业管理员
degree==其他: 企业的普通员工
模块数据库表
模块表中的belong字段:
belong==0 : saas的内部菜单
belong==1: 企业的业务菜单
3.3 操作步骤
3.4 代码实现
service
dao
4 日志管理
4.1 日志的列表展示
常规操作
4.2 动态的保存日志
使用spring中的AOP完成日志部分的增强
Aop的切面类
AOP的配置 (基于xml结合注解的配置方式)
- 开启对AOP注解的支持
- aop的注解( @Aspect, @Around )
package cn.itcast.web.aspect;
import cn.itcast.domain.system.SysLog;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.SysLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Date;
/**
* 1.创建对象
* 2.声明切面类
*/
@Component
@Aspect
public class LogAspect {
@Autowired
private SysLogService sysLogService;
@Autowired
private HttpSession session;
@Autowired
private HttpServletRequest request;
/**
* 环绕通知
*/
@Around(value="execution(* cn.itcast.web.controller.*.*.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//1.获取方法标记对象
MethodSignature ms = (MethodSignature)pjp.getSignature();
//2.从标记对象中获取当前执行的method对象
Method method = ms.getMethod();
if(method.isAnnotationPresent(RequestMapping.class)) {
RequestMapping annotation = method.getAnnotation(RequestMapping.class);
String path = annotation.value()[0];
String name = annotation.name();
//保存日志
SysLog log = new SysLog();
//对日志的属性赋值
log.setIp(request.getLocalAddr());
log.setTime(new Date());
Object obj = session.getAttribute("loginUser");
if(obj != null) {
User user = (User) obj;
log.setUserName(user.getUserName());
log.setCompanyId(user.getCompanyId());
log.setCompanyName(user.getCompanyName());
}else{
log.setUserName("匿名");
}
log.setMethod(method.getName());
log.setAction(path + "--" + name);
sysLogService.save(log);
}
//调用被代理对象的方法
return pjp.proceed();
}
}
作业:
1. 代码同步
2. 预习第六天!!!!!!!!!!!!!!!!!!!!!