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("屬性內容更改前后驗證錯誤,日志無法被記錄!"); } } }
