实战项目——智慧社区(四)之 系统管理

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);
        }
    }

}

提供日志搜索查看和删除功能,界面如下

相关推荐
沈韶珺16 分钟前
Visual Basic语言的云计算
开发语言·后端·golang
沈韶珺23 分钟前
Perl语言的函数实现
开发语言·后端·golang
美味小鱼1 小时前
Rust 所有权特性详解
开发语言·后端·rust
我的K84091 小时前
Spring Boot基本项目结构
java·spring boot·后端
慕璃嫣2 小时前
Haskell语言的多线程编程
开发语言·后端·golang
晴空๓2 小时前
Spring Boot项目如何使用MyBatis实现分页查询
spring boot·后端·mybatis
Hello.Reader6 小时前
深入浅出 Rust 的强大 match 表达式
开发语言·后端·rust
customer089 小时前
【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
计算机-秋大田12 小时前
基于微信小程序的电子竞技信息交流平台设计与实现(LW+源码+讲解)
spring boot·后端·微信小程序·小程序·课程设计