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

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

}

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

相关推荐
Java技术小馆6 分钟前
打印高质量日志的10条军规
java·后端·面试
陈随易2 小时前
Element Plus 2.10.0 重磅发布!新增Splitter组件
前端·后端·程序员
陈随易2 小时前
2025年100个产品计划之第11个(哆啦工具箱) - 像哆啦A梦口袋一样丰富的工具箱
前端·后端·程序员
PetterHillWater2 小时前
Automa-RPA实现京东商品自动搜索
后端
肖笙XiaoSheng2 小时前
用Gemini调整我的定时任务代码
后端·aigc·ai编程
WindSearcher2 小时前
OAuth协议
后端
LanLance2 小时前
ES101系列09 | 运维、监控与性能优化
java·运维·后端·elasticsearch·云原生·性能优化·golang
Piper蛋窝3 小时前
我所理解的 Go 的 `panic` / `defer` / `recover` 异常处理机制
后端·go
clk66073 小时前
Spring Boot
java·spring boot·后端
皮皮高4 小时前
itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程
android·前端·后端·开源·tv