通過aop記錄日志,記錄修改前后的數據,精確到每個字段


package com.ak1ak1.common.shiro;

import java.lang.reflect.Field;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ak1ak1.annotation.PropertyName;
import com.ak1ak1.pojo.Record;
import com.ak1ak1.pojo.systemConfig.User;
import com.ak1ak1.service.IRecordService;


/**
 * @author hejie
 * @date 2019年9月20日
 * @desc 日志代理
 */
public class RecordProxy {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(RecordProxy.class);
    
    // 得到日志服務層對象
    private IRecordService recordService;
    // 獲取當前session
    private Session session;
    
    public RecordProxy(){}
    
    public RecordProxy(IRecordService recordService,Session session){
        this.recordService = recordService;
        this.session = session;
    }
    
    /**
     * @param oldObj 原數據對象
     * @param newObj 修改后數據對象
     */
    public void addRecord(Object oldObj, Object newObj){
        // 獲取到當前用戶
        User user = com.alibaba.fastjson.JSON.parseObject(session.getAttribute("User").toString(), User.class);
        try {
            // 得到類對象
            Class<? extends Object> class1 = oldObj.getClass();
            Class<? extends Object> class2 = newObj.getClass();
            if(!class1.equals(class2)){
                throw new RuntimeException("請傳入兩個相同的實體類對象");
            }
            // 得到屬性集合
            Field[] fields1 = class1.getDeclaredFields();
            Field[] fields2 = class2.getDeclaredFields();
            PropertyName model = class1.getAnnotation(PropertyName.class);
            int modelId = model.modelId();
            StringBuffer info = new StringBuffer();
            Integer id = null;
            for (Field field1 : fields1) {
                field1.setAccessible(true);    // 設置屬性是可以訪問的(私有的也可以)
                if(id == null && field1.getName().equals("id")){
                    id = (Integer)field1.get(oldObj);
                }
                for (Field field2 : fields2) {
                    field2.setAccessible(true);    // 設置屬性是可以訪問的(私有的也可以)
                    if(field1.equals(field2)){    // 比較屬性名是否一樣
                        if(field2.get(newObj) == null || StringUtils.isEmpty(field2.get(newObj) + "")){
                            break;    // 屬性名稱一樣就退出二級循環
                        }
                        System.out.println(field1.get(oldObj));
                        System.out.println(field2.get(newObj));
                        if(!field1.get(oldObj).equals(field2.get(newObj))){    // 比較屬性值是否一樣
                            // 得到注解
                            PropertyName pn = field1.getAnnotation(PropertyName.class);
                            if(pn != null){
                                info.append(pn.value() + ":\"" +  field1.get(oldObj) + "\" 改成 \"" + field2.get(newObj) + "\",");
                            }
                        }
                        break;    // 屬性名稱一樣就退出二級循環
                    }
                }
            }
            if(info.length() != 0){
                // 設置日志信息
                Record record = new Record();
                record.setUserID(user.getUserID() + "");
                record.setUserName(user.getUserName());
                record.setCreateDate(new Date());
                record.setRemark(info.length() == 0 ? info.toString() : info.substring(0, info.length() - 1));
                record.setType(modelId);            
                record.setMachineIP(session.getHost());
                record.setModelId(id);
                recordService.addRecord(record);
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("屬性內容更改前后驗證錯誤,日志無法被記錄!");
        }
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM