Aop在项目中的使用(日志操作)
1.数据库建表
SELECT * FROM md_item WHERE id = 85
CREATE TABLE `sys_log` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`log_time` DATETIME DEFAULT NULL,
`log` VARCHAR(255) DEFAULT NULL,
`ip` VARCHAR(255) DEFAULT NULL,
`name` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
导入数据
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (1, '2024-09-29 11:08:53', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (2, '2024-09-29 11:10:56', '计量单位的添加', '10.8.152.27', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (3, '2024-09-29 11:11:40', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (4, '2024-09-29 11:11:47', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (5, '2024-09-29 11:11:50', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (6, '2024-09-29 11:12:13', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (7, '2024-09-29 11:12:16', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (8, '2024-09-29 11:12:18', '计量单位的添加', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (9, '2024-09-29 11:12:18', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (10, '2024-09-29 11:12:19', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (11, '2024-09-29 11:12:21', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (12, '2024-09-29 11:12:21', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (13, '2024-09-29 11:12:22', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (14, '2024-09-29 11:12:23', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (15, '2024-09-29 11:12:27', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (16, '2024-09-29 11:12:31', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (17, '2024-09-29 11:12:33', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (18, '2024-09-29 11:12:34', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (19, '2024-09-29 11:12:34', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (20, '2024-09-29 11:12:34', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (21, '2024-09-29 11:12:36', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (22, '2024-09-29 11:12:36', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (23, '2024-09-29 11:12:37', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (24, '2024-09-29 11:12:39', '计量单位的添加', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (25, '2024-09-29 11:12:39', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (26, '2024-09-29 11:12:39', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (27, '2024-09-29 11:12:39', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (28, '2024-09-29 11:12:40', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (29, '2024-09-29 11:12:40', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (30, '2024-09-29 11:12:40', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (31, '2024-09-29 11:12:41', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (32, '2024-09-29 11:12:41', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (33, '2024-09-29 11:12:42', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (34, '2024-09-29 11:12:42', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (35, '2024-09-29 11:12:43', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (36, '2024-09-29 11:12:44', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (37, '2024-09-29 11:12:44', '分页查询计量单位', '127.0.0.1', 'admin');
INSERT INTO `sys_log`(`id`, `log_time`, `log`, `ip`, `name`) VALUES (38, '2024-09-29 11:12:45', '分页查询计量单位', '127.0.0.1', 'admin');
2.建实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @Author yhf
* @Date 2024/9/29
* @Desc 200不是二百
*/
@Data
public class SysLog {
private Integer id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date logTime;
private String log;
private String ip;
private String name;
}
3.自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
String value();
}
4.自定义注解去修饰controller中的方法(例!)
//写在方法上 @MyLog("分页查询计量单位")
import com.github.pagehelper.PageInfo;
import com.qf.mesadmin.annotation.MyLog;
import com.qf.mesadmin.md.unit.param.UnitSearchParam;
import com.qf.mesadmin.md.unit.service.MdUnitMeasureService;
import com.qf.mescommon.common.R;
import com.qf.mescommon.entity.md.unit.MdUnitMeasure;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* @Author yhf
* @Date 2024/9/24
* @Desc 200不是二百
*/
//跨域
@CrossOrigin
@RestController
@RequestMapping("/md/unit")
public class MdUnitMeasureController {
@Resource
private MdUnitMeasureService mdUnitMeasureService;
@GetMapping("/list")
@MyLog("分页查询计量单位")
public R pageUnit( UnitSearchParam unitSearchParam){
PageInfo<MdUnitMeasure> mdUnitMeasurePageInfo = mdUnitMeasureService.unitMeasurePage(unitSearchParam);
// System.out.println("打印一下"+unitSearchParam);
return R.ok(mdUnitMeasurePageInfo);
}
@GetMapping("/list/primaryUnit")
public R findPrimaryUnit(){
List<MdUnitMeasure> unitMeasures = mdUnitMeasureService.getPrimaryUnit();
return R.ok(unitMeasures);
}
@GetMapping("/del")
@MyLog("计量单位的删除")
private R delById(Integer id){
System.out.println(id);
Integer i = mdUnitMeasureService.unitMeasureDeleteById(id);
return R.ok(i);
}
@PostMapping("/delBatch")
@MyLog("计量单位的批量删除")
private R delBatch(@RequestBody List<Integer> ids){
System.out.println(ids);
Integer i = mdUnitMeasureService.unitMeasureDeleteBatch(ids);
return R.ok(i);
}
@PostMapping("/add")
@MyLog("计量单位的添加")
private R addMeasure(@RequestBody MdUnitMeasure mdUnitMeasure){
System.out.println(mdUnitMeasure);
int i = mdUnitMeasureService.unitAddMeasure(mdUnitMeasure);
return R.ok(i);
}
@PostMapping("/update")
@MyLog("计量单位的修改")
private R updateMeasure(@RequestBody MdUnitMeasure mdUnitMeasure){
int i = mdUnitMeasureService.updateMeasure(mdUnitMeasure);
return R.ok(i);
}
/**
* 上传excel表格
* @return
*/
@PostMapping("/upload/excel")
@MyLog("计量单位的批量上传")
//MultipartFile 见文件封装成了 对象 MultipartFile
public R uploadExcel(MultipartFile file) {
mdUnitMeasureService.importUnit(file);
return R.ok();
}
@GetMapping("/download/excel")
@MyLog("计量单位的批量导出")
public R downloadExcel(HttpServletResponse response) {
mdUnitMeasureService.exportUnit(response);
return R.ok();
}
/**
* 查询指定id的信息
*
* @param id
* @return
*/
@GetMapping("/info")
public R unitInfo(Integer id) {
System.out.println(id);
MdUnitMeasure unit = mdUnitMeasureService.unitInfo(id);
return R.ok(unit);
}
}
5.写一个切面类【目的 切入到咱们的自定义注解修饰的方法,然后通过反射看谁访问的】
先在pom文件导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
import com.qf.mesadmin.annotation.MyLog;
import com.qf.mesadmin.log.LogDao;
import com.qf.mescommon.entity.sys.SysLog;
import com.qf.mescommon.entity.sys.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ServletConfigAware;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.util.WebUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
/**
* @Author yhf
* @Date 2024/9/24
* @Desc 200不是二百
*/
@Component
@Aspect
@Slf4j
public class MyLogAspect {
@Resource
private LogDao logDao;
//找到目标注解
@Before("@annotation(com.qf.mesadmin.annotation.MyLog)")
public void mesLog(JoinPoint joinPoint) {
//主要的目的是 插入数据到数据库
//id log_time log ip name
//log_time 当前的时间 ip 远程主机的地址(s谁访问的)
//log 日志信息 @MyLog("计量单位的批量删除")
//name 谁登陆的!!!
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String ip = request.getRemoteAddr();
//WebUtils.getSessionAttribute(request, "userInfo")
SysUser sysUser = (SysUser)request.getSession().getAttribute("userInfo");
String name = sysUser.getUsername();
String log = getAnnotationVal(joinPoint);
SysLog sysLog = new SysLog();
sysLog.setIp(ip);
sysLog.setName(name);
sysLog.setLog(log);
sysLog.setLogTime(new Date());
//插入数据库
logDao.insertLog(sysLog);
}
private String getAnnotationVal(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
log.info("infosignature:"+signature);
//获取目标对象
Method method = signature.getMethod();
//获取目标方法对象(所有的方法)上面的注解对象
MyLog myLog = method.getDeclaredAnnotation(MyLog.class);
String value = myLog.value();
log.info("value:" + value);
return value;
}
}
6.写dao
void insertLog(SysLog sysLog);
7、写sql
<insert id="insertLog"> insert into sys_log(log_time, log,ip,name) values (#{logTime},#{log},#{ip},#{name}) </insert>