1、用户管理
提供查询和搜索用户、根据id查询用户信息、添加用户、修改用户、删除用户的功能
界面
添加用户
修改用户信息
2、角色管理
提供查询和搜索角色、根据id查询角色信息、添加角色、修改角色、删除角色的功能
界面
添加角色
修改角色
3、菜单管理
提供查询和搜索菜单、根据id查询菜单信息、添加菜单、删除菜单的功能
界面
添加菜单
4、日志管理
日志(log)数据表设计
存储操作的日志信息
添加日志的注解类
旨在提供一种声明式的方式来表示某个方法可能需要特定的日志记录行为
package com.qcby.community.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD) //这个元注解表示LogAnnotation只能被用于方法上。
@Retention(RetentionPolicy.RUNTIME) //这个元注解表示LogAnnotation的生命周期是运行时。也就是说,这个注解不仅会被保留在类文件中,还会在JVM加载类时保留,因此可以在运行时通过反射读取它。
@Documented //这个元注解表示如果某个元素(类、方法、变量等)使用了LogAnnotation,那么在使用javadoc生成API文档时,这个注解也会被包含在生成的文档中。
public @interface LogAnnotation {
String value() default "";
}
方法上添加日志注解
当方法上添加日志注解后,该方法在调用时就会生成相应的日志信息。当在人脸采集的方法上添加日志注解后,如果调用人脸采集这个方法,就会生成相应的人脸采集的日志信息,如:
@LogAnnotation("人脸采集")
@PostMapping("/addPerson")
public Result addPerson(@RequestBody PersonFaceForm personFaceForm){
...
}
Log切面类
自动记录带有@LogAnnotation注解的方法的日志信息。
package com.qcby.community.aspect;
import com.google.gson.Gson;
import com.qcby.community.annotation.LogAnnotation;
import com.qcby.community.entity.Log;
import com.qcby.community.entity.User;
import com.qcby.community.service.LogService;
import com.qcby.community.util.HttpContextUtil;
import com.qcby.community.util.IPUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
@Aspect
@Component
public class LogAspect {
@Autowired
private LogService logService;
public static User user;
@Pointcut("@annotation(com.qcby.community.annotation.LogAnnotation)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
//执行方法
Object result = point.proceed();
//执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
//保存日志
saveLog(point, (int) time);
return result;
}
private void saveLog(ProceedingJoinPoint joinPoint, int time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Log log = new Log();
LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
if (logAnnotation != null) {
//注解上的描述
log.setOperation(logAnnotation.value());
}
//请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
log.setMethod(className + "." + methodName + "()");
//请求的参数
Object[] args = joinPoint.getArgs();
try {
String params = new Gson().toJson(args[0]);
log.setParams(params);
} catch (Exception e) {
}
HttpServletRequest request = HttpContextUtil.getHttpServletRequest();
log.setIp(IPUtil.getIpAddr(request));
log.setTime(time);
//登录用户信息
if (user != null) {
log.setUsername(user.getUsername());
this.logService.save(log);
}
}
}
提供日志搜索查看和删除功能,界面如下