返回

Spring Boot + vue-element博客系统 - 完善项目日志功能

后端

Spring Boot + vue-element 个人博客项目实战教程(十八、操作日志功能实现)

一、前言

上一节课我们完成了博客的增删改查功能,今天我们来将操作日志和登录日志实现一下,这样我们项目基本就完成了,前端的页面做一下,我们的项目就搞定啦。注意:项目标题已经改了。

二、操作日志表创建

CREATE TABLE operation_log (
  id BIGINT(20) NOT NULL AUTO_INCREMENT,
  method VARCHAR(20) DEFAULT NULL COMMENT '请求方式',
  path VARCHAR(255) DEFAULT NULL COMMENT '请求路径',
  ip VARCHAR(15) DEFAULT NULL COMMENT 'ip地址',
  operation VARCHAR(255) DEFAULT NULL COMMENT '操作',
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

三、操作日志插入

@PostMapping("/operationLog")
public Result operationLog(@RequestBody OperationLog operationLog) {
    operationLogService.save(operationLog);
    return Result.success();
}

四、记录操作日志

@AfterReturning(returning = "returnValue", pointcut = "execution(* com.mc.blog.controller..*.*(..))")
public void saveLog(JoinPoint joinPoint, Object returnValue) {
    try {
        // 判断当前用户
        SysUser sysUser = (SysUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        // 获取请求参数
        Object[] args = joinPoint.getArgs();
        // 获取方法名
        String methodName = joinPoint.getSignature().getName();
        // 获取包名+方法名
        String targetName = joinPoint.getSignature().getDeclaringTypeName() + "." + methodName;
        // 获取入参对象
        Object[] requestObjects = getRequestObjects(args);
        // 创建操作日志对象
        OperationLog operationLog = new OperationLog();
        operationLog.setMethod(request.getMethod());
        operationLog.setPath(request.getRequestURI());
        operationLog.setIp(request.getRemoteAddr());
        // 用户名
        operationLog.setUsername(sysUser.getUsername());
        // 类名+方法名
        operationLog.setOperation(targetName);
        // 入参
        operationLog.setParameter(gson.toJson(requestObjects));
        // 返回值
        operationLog.setResult(gson.toJson(returnValue));
        // 保存操作日志
        operationLogService.save(operationLog);
    } catch (Exception e) {
        logger.error("保存操作日志失败", e);
    }
}

五、登录日志记录

@RequestMapping(value = "/login", method = RequestMethod.POST)
public Result login(HttpServletRequest request, HttpServletResponse response, @RequestBody SysUser user) {
    // 获取用户登录信息
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
    Authentication authentication = authenticationManager.authenticate(token);
    SecurityContextHolder.getContext().setAuthentication(authentication);
    // 获取用户角色信息
    List<SysRole> roles = sysRoleService.selectRoleByUser(user.getUsername());
    SysUser sysUser = sysUserService.selectUserByUserName(user.getUsername());
    sysUser.setRoles(roles);
    // 获取令牌
    String jwtToken = jwtTokenUtil.generateToken(sysUser);
    // 将令牌存入cookie
    Cookie cookie = new Cookie("token", jwtToken);
    cookie.setMaxAge(7 * 24 * 60 * 60);
    cookie.setPath("/");
    response.addCookie(cookie);
    // 记录登录日志
    OperationLog operationLog = new OperationLog();
    operationLog.setMethod("POST");
    operationLog.setPath("/login");
    operationLog.setIp(request.getRemoteAddr());
    operationLog.setUsername(sysUser.getUsername());
    operationLog.setOperation("用户登录");
    operationLog.setParameter(gson.toJson(user));
    operationLogService.save(operationLog);
    // 返回登录信息
    return Result.success(sysUser);
}

六、测试

运行项目,然后登录,然后执行一些操作,然后查看数据库中的日志表,就可以看到日志了。

至此,操作日志和登录日志就完成了,明天我们写个前端页面,然后我们的项目就搞定啦。

七、总结

本指南详细介绍了如何在 Spring Boot + vue-element 个人博客项目中实现操作日志和登录日志的功能,提升了项目的安全性与可靠性。通过采用适当的数据库结构和代码逻辑,我们可以轻松记录和保存用户操作信息,为系统审计和故障排除提供 valuable的证据。同时,文中还提供了有味、有用的细节和实例代码,助力开发者轻松完成项目构建。