一、过滤敏感词

使用replace方法进行替换效率比较低。
前缀树使用空间换取时间,但是效率有很大的提高。
-
定义前缀树
根据敏感词构建前缀树,使用这个构建的前缀树来检测待测的字符串是不是敏感的字符串。
image.png
-
-
在util包中定义了一个过滤类
定义前缀树:
image.png
-

我们在下面加了一个注解,这是比较合理的,也就是在应用启动之后,树就已经完全构造完成了。

写在try中创建一个 对象,会在编译的时候自动加上finally。
在下面的部分,将字节流转换成了字符流,使用了转换流InputStreamReader,接着又转换成了缓冲流,为了提高读取效率。

构建树:

进行检索:


利用指针3进行循环更快一点,因为他会先到终点。
-
跳过一些干扰判断的特殊符号
东亚的文字范围,东亚的文字范围不是符号。中日韩。
image.png



测试如下:

二、发布帖子

当前网页不刷新,但是仍然访问服务器并且得到返回结果。并且返回结果还不是网页。但是能将结果反映在网页上。
那个验证码是吗???
处理json引入一些包:

-
添加一些处理json的工具方法:
json格式的返回结果是字符串:
code:编码
msg:提示信息
map:业务数据
image.png

测试:

结果:

浏览器将其转换成js对象可以得到每一个key对应的结果。
-
Ajax实例
image.png

jquery发送异步请求的格式是固定的。就是上面的格式。
测试:


在这个过程中,页面的内容和路径都没有进行刷新。但是访问了服务器,也得到了一些结果。
- 接下来开始进行帖子的发布
-
dao层
image.png
-
mapper
image.png
-进行测试
略
-
业务层
在业务层,需要进行敏感词过滤,标签处理,比如说js标签,这些标签可能会对结果造成一定的影响。spring的工具就有这个功能,可以进行敏感词过滤。
springmvc提供的工具HtmlUtils.htmlEscape()。会将标签进行转义。
image.png
浏览器会提交给我们很多数据,因此是post请求
403表示没有权限:
这里直接加上注解@LoginRequired不就行了吗?

$.post的三个参数:
- 访问路径
- 发送参数
-
回调函数
image.png
image.png
没有登陆的时候,将我要发布按钮进行隐藏。
测试:


三、帖子详情
在首页的帖子列表页面,点击帖子展示帖子的详情。


业务层:

通常根据id进行查询的时候都会将id拼到路径中。
@PathVariable(“discussPostId”)int id,int后面的这个变量名称是可以随意进行设置的。

这个方法目前是不完整的,后续还会添加帖子的回复等。
-
处理模板
image.png
utext可以显示出其原本表示的含义。

5、事务管理

添加评论会用到事务管理的功能。




我们今后的互联网项目主要关注的是中间两种,还要根据安全的要求来选择究竟使用哪一个。
数据库是如何保障事务的机制:

spring有一个专门的模块叫做springdataaccess用来进行事务的管理:
提供一整套API进行管理,数据库可以是关系型数据库或者是NoSql数据库,比如Reies,或者是MangoDB。

编程式事务和声明式事务都应该去学习,声明的毕竟简单,但是假如我们有一个方法,包含很多步骤,但是只有中间的一个小步骤需要进行事务管理,那么,使用声明的方法进行进行管理需要管理整个方法,不合理。
-
演示spring如何进行这两种事务管理
写在AlphaService中:
需求:增加一个用户和一个帖子,将这两个功能写在同一个事务中。
image.png
事务的传播机制 :
业务方法A()可能会调用业务方法B(),以谁的业务方法为准?

事务的传播机制,还是不明白。
-
测试
image.png
-
编程式事务管理
image.png
调用回调函数的时候回对方法进行事物的管理。
image.png
6、显示评论

套路就是先开发数据访问层,然后是业务层,最后是表现层。
comment类中有一个字段是entity_type,这表示我们针对什么进行的评论,我们是针对用户,还是评论。entity_id表示用户的id或者是帖子的id等信息。target_id指向的是某个人。
status 0:正常的,1:删除禁用的。

评论需要进行分页查询。
根据实体进行查询,判断属于课程的评论还是人的评论或者是评论的评论。






但是目前还不够完整,还需要进行target的说明,帖子的回复是不需要指明target_id的。






分页的逻辑居然可以复用:寻思一下

目前都只是显示评论,还没有讲添加评论呢吧~~
7、添加评论

- 对于增加评论的功能,我们需要使用事务,因为我们需要连带着更新帖子的评论数量。
两个dml操作,因此,我们需要使用事务。 -
数据层方法增进:
image.png

-
更新帖子数量,在discuss_post中进行更新。
image.png
这个信息虽然冗余了,但是方便查找。


数据访问层完事儿了,接着是业务层

- 增加评论的业务的方法来了~~这个方法是重点:
这个方法内部包含了两次的DML操作,我们对它进行事务管理。

接下来就是表现层:
在controller中处理表现层的请求,新增加一个controller。


(我有一个小小的疑问,帖子的访问路径,是/discuss/detail/discussPostId吗??忘了呢~~)
-
最后处理模板:
image.png
下面是自己补充的表单(回复评论):

下面是回复给某个人:

验证之后发现完全可以。
8、私信列表

和某个人之间的多次对话是一个会话。
111->112等价于112->111,因此按照顺序进行排序比较合理。

-
mapper文件
image.png




进行测试:

-
接下来开始开发业务组件:
image.png
-
接下来是表现层,他有两个功能,一个是展示私信列表,另一个是点开之后,展示聊天列表。
image.png
image.png
页面分别是letter和letter-detail。
-
处理表现层
选中一个会话,然后查看会话包含的消息。



返回操作:

9、发送私信

-
数据访问层:
image.png




- 设置已读状态
集合中未读的消息的id。

补充内容:

10、统一异常处理

对于出现的异常我们都向上抛出,因此对于服务器的三层架构,我们只需要统一处理表现层就好了。
错误页面的文件名称一定得是error,并且需要在template文件夹下面。
在下面添加一个错误:

错误页面也得进行模板的配置。

以上是springBoot对项目自动进行的处理。
但是不太符合我们的预期,服务端报错按理讲应该记录日志,方便我们进行排查。
下面是依靠spring来实现的。
写一个新的请求路径,在发生错误的时候可以统一进行重定向到这个页面。

以下这个注解只去扫描带有controller注解的类。
这个其实就是切面了啦,没有什么神秘的。
但是要区分浏览器向服务器请求的究竟是什么,是网页还是json数据。普通请求还是异步请求。
plain说明返回的是普通字符串,需要手动进行转换。



11、统一记录日志

拦截器只是针对控制器尽心拦截,但是我们的日志可以是针对所有的方法,因此不能使用拦截器。
很明显使用面向切面编程即可,千万不能将系统需求和业务需求混为一谈。


目标对象上可以有很多地方都能织入切面,构造器,成员方法等~~。

我们的userService没有实现接口,因此需要使用cglib。


前置通知:

一些小疑问:
- 验证码刷新算不算是异步请求,起码算是异步请求吧,页面也没有刷新。
- 重新加载当前页面,刷新页面是访问服务器吗?
- 事务的传播机制没明白,很懵逼。
4.回调函数表示由某个对象自动调用吗?
就像ajax中的function,或者
transactionalTemplate。 - 假如给某一个用户的回复比较多的时候该怎么办,它会自动折叠吗?
6.那个加载页面是重新向浏览器发出请求了吗??
网友评论