@Component
@Slf4j
public class NewAndOldValueUtil {
// 注入LogInfoDao
@Resource
private LogInfoDao logInfoDao;
/* // 初始化id
private static AtomicLong counter;
@PostConstruct
void InitId(){
// 获取最后一个id
long id=();
// 初始化AtomicLong
counter = new AtomicLong(id);
}*/
/**
* 获取变更内容
*
* @param old 更改前的Bean
* @param newBean 更改后的Bean
* @param logType 日志类型,修改和删除类型的日志
* @param <T>
* @return
*/
@Async
public <T> void getChangedFields(T old, T newBean, String logType) {
//TODO LoginUserContext
LoginUserRespVo user = ();
//获取当前时间,格式为yyyy-MM-dd HH:mm:ss
Date nowTime = new Date();
String date = (nowTime, "yyyy-MM-dd HH:mm:ss");
//随机生成long
// long logid = ();
long logid = ();
if ((newBean)||(old))
{
//记录删除日志,和新增日志
LogInfo logInfo = ().logid(logid)
.logType(logType).schoolId("d418b9cd-5e48-409e-9978-1efa9973604d")
.userName("系统管理员3").userId("9debfafc-a5a1-4a65-a887-1b4676a0d31b")
.logdate(date).logstamp(nowTime)
.build();
(logInfo);
return;
}
Class<?> newBean1 = ();
//通过newBean的到对象
Object oldBean = null;
try {
oldBean = ();
} catch (Exception e) {
("newInstance error");
}
(old, oldBean);
Field[] fields = ().getDeclaredFields();
StringBuilder oldVal = new StringBuilder();
("{");
//获取oldVal长度
List<Object> list = new ArrayList<>();
//创建TreeMap对象并制定value的升序规则
TreeMap<Integer, String> treeMap = new TreeMap<>();
String data1;
String data2;
for (Field field : fields) {
(true);
try {
Object oldValue = (oldBean);
Object newValue = (newBean);
String name = ();
if (("loginPassword")){
oldValue=((String) oldValue);
newValue=((String) newValue);
}
if (!(newValue, oldValue)) {
String s = ();
//TODO 日志数据权重
//判断字符串name包括字符串namStr
if (("NAME") != -1&& ((String) newValue)) {
(1, (String) newValue);
} else if (("IP") != -1&& ((String) newValue)) {
(2, (String) newValue);
} else if (("NOTE") != -1&& ((String) newValue)) {
(3, (String) newValue);
} else if (("URL") != -1&& ((String) newValue)) {
(4, (String) newValue);
} else if (("ID") != -1&& ((String) newValue)) {
(5, (String) newValue);
} else if (("TIME") != -1&& ((String) newValue)) {
(6, (String) newValue);
}else {
(7, " ");
}
if (oldValue != null&&oldValue!=""){
(name + ":" +
(("loginPassword")?((String) oldValue):oldValue));
(",");
}
}
} catch (Exception e) {
(e);
}
}
//获取前两个value值
Object[] values = ().toArray();
if (()==1){
(()-1,());
}else {
(()-1,());
("}");
}
LogInfo logInfo = ().logid(logid)
.logType(logType).schoolId("d418b9cd-5e48-409e-9978-1efa9973604d")
.userName("系统管理员3").userId("9debfafc-a5a1-4a65-a887-1b4676a0d31b")
.logdate(date).logstamp(nowTime)
.logdata1(()>=2?(String) values[0]:" ")
.logdata2(()>=2?(String) values[1]:" ")
.logdata3(())
.build();
(logInfo);
}
}
以上是所有代码,各位可抽取其中重要的部分,要注意的是,因为传进来的两个对象不同,在使用糊涂工具的
copyProperties
时候,属性名字一定要一样,不然无法进行属性值拷贝,例如:
@Data
public class UserInfo {
// 用户ID
private UUID userId;
// 学校ID
private UUID schoolId;
// 登录Key
private String loginKey;
// 登录密码
private String loginPassword;
// 用户名
private String userName;
// 邮箱
private String eMail;
// 是否使用
private Integer isUse;
// 手机号
private String phone;
// 电话号码
private String telNo;
// 地址
private String address;
// 用户IP
private String userIp;
// 角色ID
private Long roleId;
// 用户备注
private String userMemo;
// 创建时间
private Date createTime;
// 创建用户
private String createUser;
// 更新时间
private Date updateTime;
// 更新用户
private String updateUser;
}
@Data
public class UserInfoReqUpdVo {
// 用户ID
private String userId;
// 学校ID
private String schoolId;
// 登录Key
private String loginKey;
// 登录密码
private String loginPassword;
public void setLoginPassword(String loginPassword) throws Exception {
if (()>150){
= loginPassword;
return;
}
String encrypt = (loginPassword);
= encrypt;
}
// 用户名
private String userName;
// 邮箱
private String eMail;
// 是否使用
private Integer isUse;
// 手机号
private String phone;
// 电话号码
private String telNo;
// 地址
private String address;
// 用户IP
private String userIp;
// 角色ID
private Long roleId;
// 用户备注
private String userMemo;
// 更新时间
private Date updateTime;
// 更新用户
private String updateUser;
//角色名
private String roleName;
//学校名
private String schoolName;
}
这两个是传入是实体类,只有这种情况才能进行属性拷贝
SpringBoot实现权限校验,利用面向切面编程和自定义注解