1. 程式人生 > 其它 >java專案,記錄頁面修改值,內部打“官司”用

java專案,記錄頁面修改值,內部打“官司”用

java專案,記錄頁面修改值,內部打"官司“用

1、問題描述

業務需求:專案中的配置資訊,關係到程式跑出來資料準確性,需要記錄下什麼人、什麼時間、修改了什麼欄位,原來值、最新值,以便回溯,防止扯皮,內部打“官司”用。

2、解決方案

通過java反射,後臺程式比對前端傳入值與資料庫中值,並記錄下來;

2.1 測試實體類

import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class User {

    private  String name;
    private String des;
}

簡要說明:建立測試類User,兩個屬性;

2.2 工具類

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Utils {
    public static<T> String compareObject(Object oldBean, Object newBean) {
        String str = "";
        T pojo1 = (T) oldBean;
        T pojo2 = (T) newBean;
        try {
            Class clazz = pojo1.getClass();
            Field[] fields = pojo1.getClass().getDeclaredFields();
            int i = 1;
            for (Field field : fields) {
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = pd.getReadMethod();
                Object o1 = getMethod.invoke(pojo1);
                Object o2 = getMethod.invoke(pojo2);

                if (o1 == null || o2 == null) {
                    continue;
                }
                if (!o1.toString().equals(o2.toString())) {
                    if (i != 1) {
                        str += ";";
                    }
                    str += i + "、欄位:" + field.getName() + ",舊值:" + o1 + ",新值:" + o2;
                    i++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }

    public static void main(String[] args) {

        User  user1 = new User();
        user1.setName("老王");
        user1.setDes("帥哥");

        User  user2 = new User();
        user2.setName("老王");
        user2.setDes("靚仔");

        String result = compareObject(user1,user2);
        System.out.println(result);
    }
}

簡要說明:

(1)入參,物件型別要一致;

(2)其中的invoke是獲取具體比對值,pojo1和pojo2是傳入物件;

2.3 效果圖

從效果圖可以看出來,已經可以記錄變更值了;

需求補充:因為從前端過來的是json格式的資料,欄位是都是英文的,例如截圖中的des,對應頁面的展示欄位,不一定能對的上,使用自定義註解,轉成中文備註記錄;

2.4 自定義註解

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ColumnConf {
    String value() default "";
}

自定義註解;

2.5 自定義註解使用到實體類上

@Setter
@Getter
public class User {

    @ColumnConf("名字")
    private  String name;

    @ColumnConf("描述")
    private String des;
}

2.6 工具方法稍微做下改動,增加一行,修改下取值,其他不動

ColumnConf columnConf = field.getAnnotation(ColumnConf.class);
                   
str += i + "、欄位:" + columnConf.value() + ",舊值:" + o1 + ",新值:" + o2;

2.7 改造後效果圖:

2.8 說明

至於儲存log,就不多說了,建立個log表存一下就好了。。


多資訊請關注公眾號:「軟體老王」,關注不迷路,軟體老王和他的IT朋友們,分享一些他們的技術見解和生活故

更多資訊請關注公眾號:「軟體老王」,關注不迷路,IT技術與相關乾貨分享,回覆關鍵字獲取對應乾貨,本文版權歸作者軟體老王所有,轉載需註明作者、超連結,否則保留追究法律責任的權利。