实现日志功能的思路

需求

客户希望实现下面的详情操作日志功能
在这里插入图片描述

思路

这样 只要修改数据库的地方,比如增,删,改的地方就要保存日志记录,增加和删除好做,麻烦的就是修改,怎么弄呢,整理了下:

参考链接

参考链接:
https://blog.csdn.net/liu_ling1216/article/details/80207985
//获取属性上的注解
https://blog.csdn.net/shidebin/article/details/86593949

步骤1

前提,根据id 获取 旧的对象, 传参获取新对象

步骤2

获取2个对象 同一个属性,不同的值,

   将 属性名,新值 ,旧值 放入一个 list集合中
    by the way 中文名: 根据注解获取
    list = [
        {
          'name':,
           'old':'',
           'new':'',
           comment:''
         }
    ]
    list中的每个对象,最好建一张表

保存到 日志表中去

测试代码

测试实体 student.java

	package com.platform.utils;
import com.platform.annotation.Comment;
public class Student {
    @Comment(value = "编号")
    private Integer id;
    @Comment(value = "姓名")
    private String username;
    @Comment(value = "年龄")
    private Integer age;

    public Student() {
    }
    public Student(Integer id, String username) {
        this.id = id;
        this.username = username;
    }
    public Student(Integer id, String username, Integer age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
       return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

自定义注解

/**
 * 注解实体
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Comment {
    String value() default "";
}

工具类 LogUtil.java

	package com.platform.utils;
	import com.platform.annotation.Comment;
	import java.lang.reflect.Field;
	import java.util.*;
	
	public class LogUtil {
	    /**
	     * 获取两个对象同名属性内容不相同的列表
	     */
	    public static List<Map<String, Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException {
	        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
	        //获取对象的class
	        Class<?> clazz1 = class1.getClass();
	        Class<?> clazz2 = class2.getClass();
	        //获取对象的属性列表
	        Field[] field1 = clazz1.getDeclaredFields();
	        Field[] field2 = clazz2.getDeclaredFields();
	        //遍历属性列表field1
	        for (int i = 0; i < field1.length; i++) {
	            //遍历属性列表field2
	            for (int j = 0; j < field2.length; j++) {
	                //如果field1[i]属性名与field2[j]属性名内容相同
	                if (field1[i].getName().equals(field2[j].getName())) {
	                    field1[i].setAccessible(true);
	                    field2[j].setAccessible(true);
	                    //如果field1[i]属性值与field2[j]属性值内容不相同
	                    if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
	                        Map<String, Object> map2 = new HashMap<String, Object>();
	                        Comment comment = field1[i].getDeclaredAnnotation(Comment.class);
	                        if(comment!=null){
	                            map2.put("name", comment.value()); //注解名字
	                            map2.put("old", field1[i].get(class1));
	                            map2.put("new", field2[j].get(class2));
	                            list.add(map2);
	                        }
	                    }
	                    break;
	                }
	            }
	        }
	        return list;
	    }
	    
	    //对比两个数据是否内容相同
	    public static boolean compareTwo(Object object1, Object object2) {
	        if (object1 == null && object2 == null) {
	            return true;
	        }
	        //以下注掉代码,看具体需求。因有时会出现源数据是没有进行赋值,因此是null;而通过EditText获取值的时候,虽然没有值,但是会变成"",但是本质是没有赋值的。
	        //if (object1 == "" && object2 == null) {
	        //    return true;
	        //}
	        //if (object1 == null && object2 == "") {
	        //    return true;
	        // }
	        if (object1 == null && object2 != null) {
	            return false;
	        }
	        if (object1.equals(object2)) {
	            return true;
	        }
	        return false;
	    }
	
	    public static void main(String[] args) throws IllegalAccessException, ClassNotFoundException {
	        Student s1 = new Student(1, "张三", 29);
	        Student s2 = new Student(2, "李四",29);
	        List<Map<String, Object>>  maps = compareTwoClass(s1, s2);
	        for (Map<String, Object> m : maps){
	            System.out.println(m.get("name")+"===="+m.get("old")+"===="+m.get("new"));
	        }
	    }
	}


测试结果:
在这里插入图片描述


自此 测试完毕,下面就是 无脑码代码了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怒放de生命2010

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值