好久沒有寫博客了,最近找一些之前寫過的代碼,結果不知道在那個專案里面寫的,已經找不到了,又得從頭開始,所以記錄一下本次撰寫程序,之后自己查看,也可給需要的朋友一個參考!
專案為 springboot2.0+mybatisplus + mysql搭建
需求:撰寫一個注解,記錄 登錄賬戶的操作記錄,主要記錄增刪改操作
效果如下圖所示

1.首先添加一個自定義注解,@interface ,里面的注解型別元素(引數)是需要在具體注解里面添加的,可以有很多型別如string,int,array等,注意,對引數有一下要求:
*訪問修飾符必須為public,不寫默認為public;
*名稱一般定義為名詞,如果注解中只有一個元素,請把名字起為value(后面使用會帶來便利操作)
*default代表默認值 如這樣: int age() default 18;
*如果沒有默認值,代表后續使用注解時必須給該型別元素賦值
*所有定義的注解都會自動繼承java.lang.annotation.Annotation介面
@Target注解,是專門用來限定某個自定義注解能夠被應用在哪些Java元素上面的,它使用一個列舉型別定義如下:
public enum ElementType {
/** 類,介面(包括注解型別)或列舉的宣告 */
TYPE,
/** 屬性的宣告 */
FIELD,
/** 方法的宣告 */
METHOD,
/** 方法形式引數宣告 */
PARAMETER,
/** 構造方法的宣告 */
CONSTRUCTOR,
/** 區域變數宣告 */
LOCAL_VARIABLE,
/** 注解型別宣告 */
ANNOTATION_TYPE,
/** 包的宣告 */
PACKAGE
}
@Retention注解,翻譯為持久力、保持力,即用來修飾自定義注解的生命力,
注解的生命周期有三個階段:1、Java源檔案階段SOURCE;2、編譯到class檔案階段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. 然后添加一個spring攔截器,攔截所有請求,也可以指定到方法,將dao注入進去,否則報空指標
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.對應的物體,添加@Data注解,可以代替getset方法,具體可自行查詢
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 具體應用,名稱為自定義注解的名稱,里面的引數就是自定義注解里面的三個引數

以上!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131747.html
標籤:AI
