00:00
各位同学大家好,下面呢,我们来实现操作日志,就记录当前用户的操作,比如说他当前做了是用户管理中的那个操作,是添加修改还是删除等等,咱们在里边进行记录,那下面咱们看一下怎么来做,按照课件中的过程,首先第一个我们在common里边呢,先创建一个模块,这个模块我们就叫common-logo,那我现在在里边我们来做一个创建。咱们写到这里。我建一个模块。他的名字叫to-logo。这是我们的第一部分,然后这个创建之后,我们的第二部分在里边引入相关的依赖,这个依赖我们给它都引入进去。然后引入之后呢,我们看一下啊,其中里边有这么一个依赖,咱们等到先加载完,然后咱们做个查看。
01:02
大家看一遍啊,首先有model,有common u条,然后这是web啊,大家看这个。这是什么?是不是a op啊,这个过程中我们想通过AO来实现这个日添加,而不用之前方式加,通过AOB不改变源码而增强类中的方法功能,这是我们要做的事情,然后这个之后我们继续往下来看,下面咱怎么做呢?咱们就可以自定一个注解进实现,对这个注解咱之前一直在用,但是注解我也可以自定义,那咱们看怎么来定义。咱们现在这么来做,首先我在里边呢,咱们先建个包,这个包我们就叫就是注解,那咱们这里边。我把这个打开。咱们建个包。Com硅谷systemno,这个咱们完成创建。然后创建之后呢,在里边啊,我们创建一个什么,一个注解就是annotation,咱给注解起个名字就叫log,然后大家看啊,这就是注解的创建方式,叫自定义注解,咱用它进行实现,实现AOP的思想,然后创建之后,在注解上面咱们加一些原注解,首先第一个叫target,它指的就是这注解能用在什么地方,我们加上一个叫element type,然后里边加上它的值,比如我们写第一个,大家看这个啊。
02:32
这是什么?是不是叫pres,表示用在我们的参数位置,那咱看这个啊,这是一个什么?是不是一个枚举呢?如果你写的是type,那表示注解能用在类上边,接口上边,如果你是field,用在属性上,Method方法上,Perimters,那就是参数上等等,所以咱们现在让它可以用在我们的参数里边,另外可以用在我们的方法上,咱加上一个叫element type。点,这个叫method,这是我们写的一个圆柱。
03:04
然后第二个选项注解的作用范围,我们加上这么一个叫。Retention retention。应该是这个re。Ten retention,然后里边加上这个叫retention。这个policy加上它就是它的作用范围,咱就加上一个叫runtime,在运行时它里边起作用,然后你看里边有很多source源码、class类,包括runtime运行,然后最后我们再加上里边的另外一个注解。这个。Document。把这个咱给它加上以上,咱就完成了一个自定义注解的创建,然后完成之后在里边呢,加上它相关的属性,这个属性呢,我就从课件中,咱就直接复制一下,我们这里边有这么多属性来给大家复制过来,咱们来看一下啊。
04:05
首先里边的第一个代表你的,比如说我们后面用注解中有一个你的模块名称,第二个是它的功能,包括第三是操作人的类型,比如说我做添加、修改、删除,操作人表示你是手机用户还是网易用户,然后这里边我们请求的参数,包括想的参数,在这里边我们都给它。进行这么一个属性,这是我们加上的,然后这个位置呢,其实我们要加的有两个枚举类,然后为了后面编写方便,那我把枚举类我们给它继续加上,我在里边做个创建。首先我在里边呢,建上这么一个包。我放到这里。咱们这个包就是枚举。然后创建之后,在里边我们创建就是两个枚举类,首先第一个类表示操作人的类型,就是你是后台用户,手机用户还是其他用户,把这个创建,然后我把这个。
05:08
直接就复制过来啊,这是第一个微聚类,呃,咱后面使用方便。然后这个枚举呢,咱提到特别说一句啊,各位要清楚什么叫枚举,它指的是在我们固定范围中取值,只能取里边的这个值,而不能取这个以外的值,这叫枚举,那咱们再写一个,就是我们的这个业务类型,你是添加修改,删除还是其他的什么操作。这个我们继续创建。悲剧。然后在里边把这个复制一下,呃,这里边比较多啊,咱这些都给他拿过来,代表我们的业务类型。放到这里,然后再回到这个自定义注解中,把这个依赖我们给它引入,首先功能中默认是其他,然后类型默认是这个,嗯,包括其他的是否保存请求参数,是否保存想参数等等,这是我们写的一个自定义注解,咱一会儿通过它进行实现。
06:06
然后这个之后呢,我们继续往下来做啊,下面咱要做什么,因为咱要用到这个定义注解来记录你的这个操作日志,所以我们下面咱们写一个a op一个类,通过它来做,最终实现a op,各位之前应该提到过,是我们死文中的基础知识,在不改变源代码情况下,增强立中方法,它里面分成你的前置,后置,环绕,异常,最终通知类型,所以咱们通过a up来在里边加上一个操作日志的一个处理,那这里边给各位写一下啊。首先我在里边呢,我们先还是创建一个包,叫这个aspect aspect啊就是它里边这种方式,Aspect的方式做这个a op的操作。讲到这里。然后加上之后在里边创建一个a up的这么一个类,我把这个类给大家复制过来。
07:04
咱们那到这里。然后创建类之后,在类上边我们加上它相关的内容,那咱来加一下啊,首先我们加上第一个注点,就是这个叫aspect。表示要使用到a op这个操作,然后第二个加上一个comment交给spring应管理,这样的话我们就完成,完成之后呢,我们最后在里边写上它的具体的操作方法,在a op中各位应该知道啊,它有不同的通知类型,那咱们来写一下啊,比如现在我写个方法,咱叫public word,这个方法呢,我就从里边咱就直接复制一下啊。咱写核心部分。我先拿过来啊,然后这些咱一会儿再给他找到啊,先把这个拿过来。这个引入。就咱们刚才写的这个log,然后写完之后在上面呢,我们加上一个注解,大家看这注解啊,我这里写一下。
08:05
叫after returning什么意思啊,After是不是最后它就表示啊,在我操作方法执行,最后来执行,执行之后来执行,这叫后置通知,那这里边我们在里边加上一些相关内容,比如说这里边point card切入点,包括returning啊,它返回的结果。把这个咱都加进去,所以现在啊,写了一个最基本的一个方法结构,它会在我们这个操作方法执行之后,最终进行执行,这个我们讲到这里,然后后面呢,我们再继续往下来完成。这个方式呢,就表示后置通知在咱们操作方法之后来执行,然后这里边呢,有一个方法叫handle,这个log,咱在里边是要我们最终这个添加功能,那这部分给各位我就直接复制过来了,就是里边的这么一个结构啊,那咱们做这么一个复制,把这拿过来,然后咱们详细看一下这个写法,这个代码具体的写法。
09:07
我把这个给各位复制过来,然后咱们看一下啊,当然过程中最终咱要添加,这咱一会儿来实现,先把这个结构先看明白,最后我们再写它的其他部分,那咱看啊,首先我这个方法叫后置通知,表示在我操作执行之后,它会执行用的是after returning,然后在里边我们调用一个方法叫handle logo,在里边做我们的具体内容,那它做什么,咱们具体看一下啊,首先第一部分咱通过这个叫request contest handle,就是表示里边这个上下文,这个请求对象。然后通过它呢,得到一个叫蕊request对象,因为咱们把request对象得到,那我请求内容应该都可以得到,得到之后呢,下一个操作咱们new上这个对象,就是我们的操作日志,向里边来S它的各种数据,那这数据我们来一个一个看一下啊。
10:06
首先第一个当前的状态,然后第二个有一个IP地址。这个IP地址呢,咱之前应该有这个工具类啊,但是当时我们应该是放到了里边,咱给他换个位置来放啊,为了咱们都能用到,给他换个位置。把它放到我们的common u里边,为了咱们都能进行使用啊,放到这里。这个位置啊,然后在里边我们来引入依赖。获取当前的IP地址,这是我们的第二部分,我这里写下啊,是我们这个操作的状态,然后这个是IP地址,然后下面就是ton,从JWP里边工具类中把这个名称取到设置,然后再来看,然后下面呢,就是通过这个就是叫draw point这个参数得到你看得到什么,大家看这是什么类的名字,包括你方法的名字等内容,然后再用它给它set进去,这是设置名字,包括往下来看。
11:10
这里边来得到当前的提交方式,以及处理注解上参数,里边这个参数咱们写了一个方法,在里边我们做了一个实现啊,通过它我们来做到这个依赖给它引入啊,包括里边开就是等内容。然后最后呢,我们就是调用service里边的方法,把这个操作日志的数据。给它最终保存到数据库中,这个咱们一会儿进行实现,我先放到这里。啊这些啊,我就不需要了,给他直接就去掉了。也就是说以上就是咱们一个基本结构,然后咱最后呢,写的其实就是写这个service部分,通过service把这数据最终加到我们的数据库中。这个过程呢,给各位同学啊,再重复一遍我们的做法啊,咱是基于这个自定义注解,基于a up的方式进行实现,我们的做法就是建立一个新的模块,里边先建立一个自定义注解,后面咱用注解来用里面这个内容,然后咱们建立一个a op的这个类,在a op中呢,我们加了一个后置通知,就是在我方法执行之后执行,然后在里边得到我们需要的相关的数据,最终把数据加到我们的数据库中,咱主要基于两个技术,自定义注解和a op做到。
12:33
这是我们做到的啊,然后这里边我们最后那就是写这个service部分,那怎么做,咱肯定要创建service,然后创建map,最终我们进行实现,那咱们最后把这个我们来写下,咱们进行一个实现。首先我在里边呢,咱们先建个包,这个包呢就叫service。然后里边呢,我们创建一个interface这么一个接口,那我们写一下啊,这个名字我们就叫这个。
13:05
咱就简写or。Logo。Service把这个做创建,然后创建之后在里边呢,我们创建我们操作这个方法,这个方法就是添加你的日志信息,咱们起个名字就叫system log,那我给它写到这里,我这里来写一下。加上我们这个方法,然后里边加上我们这个对象。这个logo。所以现在这个方法我们就完成了定义,然后定义之后呢,下面咱们把service给它就注入进来,注入到我们里面来,然后最终进行操作,那咱们做个注入。加上啊,加上这么一个接口。把依赖我们给它引入,所以现在这个就完成了,后面咱就调里面的方法进行实现,所以现在完成这么一个定义,然后定义之后呢,最后我们在这个service system里边来最终完成这个service的实现,包括它的map,因为咱要操作数据库,然后最终把这实现,那在里边我们来写一下啊。
14:22
咱们写这里。Service里边的实现类中,我们进行这么一个实现。就是operator。Log。Service m PL,让它实现我们这个接口。就是我们的。应该是这个啊,我写一下or log。咱们做这么一个实现。但是咱们发现啊,这里边好像不能用,所以咱需要给它做一个引入,就是它里面这个依赖关系,那咱们引入呢,我们这么来做啊,咱们就是来到这个service里边,因为最终这个service里边已经引到了我们这个相关的模块中,是不是已经引入,所以咱把这个commonlo就引入到这个service u里边来,那我现在把它做一个引入,我这里写一下啊,它叫做common。
15:22
Logo。咱们给他引入。等它加载完成。然后引入之后,我们再来到实验类中,大家看啊,这个依赖目前就有了,然后在上面我们加上注解。Service最终来实现里边这个具体方法啊,就是一个添加的方法,这个咱就完成,完成之后呢,下面我们来编写它这个map,在map中做到最终的添加,咱们写一下map,参考之前的把它复制一下,然后咱们给它改一下就可以了。
16:00
Operator。把这个做修改,然后里边的这个。改一下我当前这个实体类。现在完成完成之后呢,最后咱们把map注入,然后做一个最终的添加。我这个叫operator。Log。Map。然后咱们把它。注入。注之后最后调map中的方法,我们做一个添加音色的方法,然后传入对象,这样的话就可以了,所以以上咱们把这方法我们就最终完成了,就咱们用这个自定义注解加a op,我们做的一个最终实现,咱们再看一遍啊,然后最后在CTRL中来给它做一个具体使用。注意这个过程啊,虽然不难,但是里面要做了很多步骤,首先第一个我们是写了一个自定义注解,咱们叫log,指定它的圆注解,包括里边有一些相关的属性,这是第一部分。然后第二个呢,我们写了一个a op的这个类,A op中写了一个后置通知,在方法执行之后去执行,然后在里边我们有一个方法叫handle log,来得到它的相关参数,把参数最终封装到这个对象中,然后封装之后,最后我们调方法把这数据加到咱的数据库中,这里边我把这个注释给它打开。
17:32
Operator log service调方法,最终做添加,然后这过程中我们有其他方法,就是得到注解,得到里面相关内容啊,咱重点写这个基本过程,然后这个完成之后,我们在这个项目的service里边写了方法,最终调了map,在map中insert方法,把数据最终加到了数据库中,以上这过程就完成了,这就叫up,也就是说不改变源码,增强一个功能,咱现在通过a up里面这个类实现了一个后置通知,让咱们操作信息可以加到我们的数据库中。
18:07
写现在这个我们就写到这里,然后写到这里之后呢,最后咱们把它做一个具体的使用,那怎么使用给大家来写一下啊,咱们看我的课件中的这个地方,做法很简单,咱们在CTRL的方法上边加上一个注解,然后指定它的相关属性就可以了,那咱们给他加一下,我们用一个功能,咱给他具体来测试一下。咱们写一下啊,比如说我现在这些先都关掉,找到我这个CTRL里边,咱就以这个角色为例,找到角色,然后在角色中呢,我们找到一个那个添加啊,当然找别的也可以啊,我就以添加为例,在添加的上边咱们加上一个注解,这注解名字就叫log,注意啊,别导错包是我们这个,然后在log里边加上属性,首先第一个就是它这个名称,或者说模块名称,我们叫这个。
19:06
角色管理,然后第二个是它里面那个操作的类型叫business type,咱们有一个枚举类,我直接用一下啊,比如这里边做的应该是这个添加,就是insert,现在把这做了一个使用,然后这个方法当咱们执行之后,会执行我们刚才那个a op那个方法,也就是这个方法,最终把数据可以加到我们的数据库中。所以现在我们做了一个使用,然后这些都完成之后,最后呢,咱把服务器启动,然后看一下最终效果啊,当然你可以加更多,我就以这个为例,咱们等服务器启动。服务器已经启动,然后咱们来到我的项目中,最终我们做测试。首先啊,我先退出去,然后为了明确咱把那个表打开,就是这个操作日表,同样把表中数据我们先给它删掉,为了咱们一会儿看起来方便。
20:03
我先给它删除。删除之后,目前里边什么都没有,然后咱们做一个角色的添加,我们先登录进去。等他登录,登录之后找到角色,那咱们做一个添加,比如说我随便写一个啊,咱就来一个。太子。测试。Test测试,然后我点确定,大家看添加肯定是成功的,这功能没有错,关键咱看表里面数据到底有没有加进去,也是我们这个a up这个添加操作日志到底有没有生效。现在我们来到表里边,咱们刷新找到大家看数据是不加进去了,咱们看啊,角色管理insert,这是我们操作的方法,然后这是提交方式,包括其他信息,包括IP等等,所以咱们目前就完成这个操作日志的添加功能,这个咱们就出来了。
我来说两句