在最近工作中,博主手头上的Web项目提了一个新的需求,这个需求大体上就是希望系统能够记录用户做了哪些操作,包括这些操作的细节。
大家都知道,用户的操作无非就是增,删,改,查。因为我现在做的这个项目对用户的查询操作不敏感,所以只需记录增,删,改。
在做之前呢,我的leader给了我一个建议:你要不写一个公共方法吧,到时候哪一个模块需要这个功能就让他自己去调用。这当然是一个方法,而且相对省事,因为我只需要将公共的逻辑抽象出来,之后就算有新的模块添加进项目来,只要这块的功能逻辑不发生大的改变,也就没我啥事了。但是我的内心是拒绝的,因为我早就听说AOP十分适合权限,日志等功能的实现,而且我之前从没有用AOP的机会,现在菜都给送到眼前了,难道还有不吃的道理吗?所以我跟Leader说:这块很适合用AOP来做啊。然后一副我很精通AOP的样子看着Leader。Leader:我还是建议你用公共方法......
OK, 没有完全拒绝那就是认同了,好的,就让我们用AOP的方法来实现这个功能吧。
1.表字段的设计
既然是做记录,而且我打算将这些操作记录放在一张表里,那么先将操作公共的字段定下来。作为主键的ID肯定是必须的,但是这个主键不适合再使用自增ID,很快就会被消耗完。所以这里使用随机字符串。下面是实现随机字符串的工具类和记录实体部分的code。
public class UUIDGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
}
@Id
@GeneratedValue(generator = "system-uuid")
// xx部分是UUIDGenerator类的绝对地址
@GenericGenerator(name = "system-uuid", strategy = "xx.xx.xx.xxxx.xx.UUIDGenerator")
private String id;
除此之外还需要有用户操作的模块名(实体名), 用户操作的模块id(实体id),实体名,操作类型,操作人(用户),操作时间。</