ブログを書いてから久しぶりです。最近、以前に書いたコードを探しましたが、そのプロジェクトで何を書いたのかわかりません。もう見つかりません。最初からやり直す必要があります。そのため、書き込みプロセスを記録して、自分で確認してください。参照が必要な友達!
プロジェクトはspringboot2.0 + mybatisplus + mysqlによって構築されます
要件:ログインアカウントの操作記録を記録するためのメモを書き、主に追加、削除、および変更操作を記録します
以下に示す結果
1.最初にカスタム注釈@interfaceを追加します。その中の注釈タイプ要素(パラメーター)は特定の注釈に追加する必要があります。string 、int、arrayなどの多くのタイプがあります。パラメーターには次の要件があることに注意してください。
*アクセス修飾子はパブリックである必要があります。記述されていない場合、デフォルトはパブリックです。
*名前は一般的に名詞として定義されます。コメントに要素が1つしかない場合は、名前を値として使用してください(後で使用すると便利です)
*次のdefault
ようなデフォルト値を表します。intage()default 18;
*デフォルト値がない場合は、後で注釈を使用するときにタイプ要素に値を割り当てる必要があることを意味します
*定義されたすべての注釈は、java.lang.annotation.Annotationインターフェイスを自動的に継承します
@Targetアノテーションは、カスタムアノテーションを適用できるJava要素を制限するために特に使用されます。次のように定義された列挙型を使用します。
public enum ElementType {
/** 类,接口(包括注解类型)或枚举的声明 */
TYPE,
/** 属性的声明 */
FIELD,
/** 方法的声明 */
METHOD,
/** 方法形式参数声明 */
PARAMETER,
/** 构造方法的声明 */
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解类型声明 */
ANNOTATION_TYPE,
/** 包的声明 */
PACKAGE
}
@Retentionアノテーション、耐久性と保持として翻訳されます。カスタム注釈の活力を変更するために使用されます。
注釈のライフサイクルには、次の3つの段階があります。1。JavaソースファイルステージSOURCE; 2。クラスファイルステージCLASSにコンパイルされます; 3。ランタイムステージRUNTIME。
具体的なコードは次のとおりです。
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.次に、すべてのリクエストをインターセプトするスプリングインターセプターを追加するか、daoを挿入するメソッドを指定できます。そうしないと、nullポインターが報告されます。
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.ログインアカウント情報を保存します
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.対応するdaoレイヤー、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.対応するエンティティについて、getsetメソッドを置き換えることができる@Dataアノテーションを追加すると、自分で詳細を照会できます。
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特定のアプリケーションの場合、名前はカスタムアノテーションの名前であり、内部のパラメーターはカスタムアノテーションの3つのパラメーターです。
上記!!!