Agregar anotaciones de registro personalizadas a nivel mundial

Ha pasado mucho tiempo desde que escribí un blog. Recientemente busqué un código que escribí antes, pero no sé lo que escribí en ese proyecto. Ya no puedo encontrarlo. Tengo que empezar desde cero. Así que registre el proceso de escritura y compruébelo yo mismo. ¡Un amigo que necesita una referencia!

El proyecto está construido por springboot2.0 + mybatisplus + mysql

Requisito: escriba una nota para registrar el registro de operaciones de la cuenta de inicio de sesión, principalmente registre las operaciones de adición, eliminación y modificación

Resultados como se muestra a continuación

1. Primero agregue una anotación personalizada, @interface, el elemento de tipo de anotación ( parámetro) debe agregarse en la anotación específica, puede haber muchos tipos como cadena, int, matriz, etc. Tenga en cuenta que existen los siguientes requisitos para los parámetros:

* El modificador de acceso debe ser público, si no está escrito, el valor predeterminado es público;

* El nombre generalmente se define como un sustantivo. Si solo hay un elemento en el comentario, use el nombre como valor (el uso posterior traerá comodidad)

* defaultRepresenta el valor predeterminado de esta manera: int age () default 18;

* Si no hay un valor predeterminado, significa que debe asignar un valor al elemento de tipo cuando use la anotación más adelante

* Todas las anotaciones definidas heredarán automáticamente la interfaz java.lang.annotation.Annotation

La anotación @Target se usa específicamente para limitar a qué elementos Java se puede aplicar una anotación personalizada. Utiliza un tipo enumerado definido de la siguiente manera:

public enum ElementType {
    /** 类,接口(包括注解类型)或枚举的声明 */
    TYPE,

    /** 属性的声明 */
    FIELD,

    /** 方法的声明 */
    METHOD,

    /** 方法形式参数声明 */
    PARAMETER,

    /** 构造方法的声明 */
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注解类型声明 */
    ANNOTATION_TYPE,

    /** 包的声明 */
    PACKAGE
}

@Anotación de retención, traducida como resistencia y retención. Se utiliza para modificar la vitalidad de las anotaciones personalizadas.
El ciclo de vida de la anotación tiene tres etapas: 1. etapa del archivo fuente Java SOURCE, 2. compilado en la etapa del archivo de clase CLASS, 3. etapa del tiempo de ejecución RUNTIME.

El código específico es el siguiente:

package com.zdxf.server.component.security.oplog.annotation;

import com.zdxf.server.component.security.oplog.service.impl.OperationLogAnnotation;

import javax.validation.Constraint;
import java.lang.annotation.*;

/**
 * 操作日志注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
// 可以出现在java文档中
@Documented
// 可以被子注解继承
@Inherited
public @interface AddOperationLog {

    /**
     * 功能
     * @return
     */
    String resource() default "";

    /**
     * 操作
     * @return
     */
    String operation() default "";

    /**
     * 模块
     * @return
     */
    String module() default "";
}

2. Luego agregue un interceptor de resorte para interceptar todas las solicitudes, o puede especificar el método para inyectar dao en él, de lo contrario, informará un puntero nulo

package com.zdxf.server.component.security.oplog.config;

import com.zdxf.server.component.security.oplog.dao.IOperationLogDao;
import com.zdxf.server.component.security.oplog.service.impl.OperationLogAnnotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AnnotationConfig implements WebMvcConfigurer {
    @Autowired
    private IOperationLogDao dao;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        OperationLogAnnotation oper=new OperationLogAnnotation(dao);
        registry.addInterceptor(oper)
                .addPathPatterns("/**");
    }
}

3. Guarde la información de la cuenta de inicio de sesión

package com.zdxf.server.component.security.oplog.service.impl;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zdxf.server.common.base.context.RequestContext;
import com.zdxf.server.common.base.model.UserPriciple;
import com.zdxf.server.component.common.util.SecurityUserUtil;
import com.zdxf.server.component.govern.model.TplUserT;
import com.zdxf.server.component.security.oplog.annotation.AddOperationLog;
import com.zdxf.server.component.security.oplog.dao.IOperationLogDao;
import com.zdxf.server.component.security.oplog.model.OperationLogVO;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Date;

@Aspect
@Component
public class OperationLogAnnotation implements HandlerInterceptor {

    private IOperationLogDao dao;
    public OperationLogAnnotation(IOperationLogDao dao){
        this.dao=dao;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        boolean isAnn=handler.getClass().isAssignableFrom(HandlerMethod.class);

        if(isAnn) {
            //根据当前方法获取类的注解
            AddOperationLog olog=((HandlerMethod)handler).getMethodAnnotation(AddOperationLog.class);
            if(null!=olog){
                OperationLogVO op=createOperationLog(olog);
                int result=dao.insert(op);
                System.out.println("保存操作记录:"+result);
            }
        }
    }

    private OperationLogVO createOperationLog(AddOperationLog operationLog) {
        String moduleStr = operationLog.module();
        String resourceStr = operationLog.resource();
        String operationStr = operationLog.operation();
        OperationLogVO opLog = new OperationLogVO();

        UserPriciple user = RequestContext.getCurrent().getUser();
        if(null != user){
            opLog.setUserId(RequestContext.getCurrent().getUser().getId());
            opLog.setUsername(RequestContext.getCurrent().getUser().getUsername());
            opLog.setPhone(RequestContext.getCurrent().getUser().getPhone());
        }

        TplUserT tuser= SecurityUserUtil.obtainUser();
        if(null != tuser){
            opLog.setUserId(SecurityUserUtil.obtainUser().getAgencyUserId());
            opLog.setUsername(SecurityUserUtil.obtainUser().getUsername());
            opLog.setPhone(SecurityUserUtil.obtainUser().getPhone());
        }

        opLog.setOpDate(new Date());
        opLog.setIp(RequestContext.getCurrent().getRequest().getRemoteAddr());
        //    opLog.setLocalIp(RequestContext.getCurrent().getRequest().getLocalAddr());
        opLog.setModule(moduleStr);
        opLog.setResource(resourceStr);
        opLog.setOperation(operationStr);
//        opLog.setCreationDate(new Date());
        opLog.setOpCode("操作成功");
        return opLog;
    }

}

4. Capa de dao correspondiente, utilice el método predeterminado de mybatis

package com.zdxf.server.component.security.oplog.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zdxf.server.component.security.oplog.model.OperationLogVO;

public interface IOperationLogDao extends BaseMapper<OperationLogVO> {
}

5. Para la entidad correspondiente, agregue la anotación @Data, que puede reemplazar el método getset, y puede consultar los detalles usted mismo

package com.zdxf.server.component.security.oplog.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tpl_operation_log_t")
@ApiModel(value="操作日志对象", description="")
public class OperationLogVO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "ID(操作日志)")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "用户ID")
    private Long userId;

    @ApiModelProperty(value = "操作结果")
    private String opCode;

    @ApiModelProperty(value = "手机")
    private String phone;

    @ApiModelProperty(value = "姓名")
    private String username;

    @ApiModelProperty(value = "角色")
    private String role;

    @ApiModelProperty(value = "IP")
    private String ip;

    @ApiModelProperty(value = "操作日期")
    private Date opDate;

    @ApiModelProperty(value = "模块")
    private String module;

    @ApiModelProperty(value = "资源")
    private String resource;

    @ApiModelProperty(value = "操作")
    private String operation;

    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date creationDate;
}

6 Para aplicaciones específicas, el nombre es el nombre de la anotación personalizada y los parámetros dentro son los tres parámetros en la anotación personalizada

¡lo anterior! ! !

Supongo que te gusta

Origin blog.csdn.net/Amos_liu/article/details/108792383
Recomendado
Clasificación