美文网首页
第三章(nk)

第三章(nk)

作者: 全麦土司 | 来源:发表于2020-02-03 13:37 被阅读0次

    一、过滤敏感词

    image.png

    使用replace方法进行替换效率比较低。
    前缀树使用空间换取时间,但是效率有很大的提高。

      1. 定义前缀树
        根据敏感词构建前缀树,使用这个构建的前缀树来检测待测的字符串是不是敏感的字符串。


        image.png
      1. 在util包中定义了一个过滤类
        定义前缀树:


        image.png
    image.png

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


    image.png

    写在try中创建一个 对象,会在编译的时候自动加上finally。

    在下面的部分,将字节流转换成了字符流,使用了转换流InputStreamReader,接着又转换成了缓冲流,为了提高读取效率。


    image.png

    构建树:


    image.png

    进行检索:


    image.png
    image.png

    利用指针3进行循环更快一点,因为他会先到终点。

    • 跳过一些干扰判断的特殊符号
      东亚的文字范围,东亚的文字范围不是符号。中日韩。


      image.png
    image.png
    image.png
    image.png

    测试如下:


    image.png

    二、发布帖子

    image.png

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

    处理json引入一些包:


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


      image.png
    image.png

    测试:


    image.png

    结果:


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


      image.png
    image.png

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


    image.png
    image.png

    在这个过程中,页面的内容和路径都没有进行刷新。但是访问了服务器,也得到了一些结果。

    • 接下来开始进行帖子的发布
    • dao层


      image.png
    • mapper


      image.png

    -进行测试

    • 业务层
      在业务层,需要进行敏感词过滤,标签处理,比如说js标签,这些标签可能会对结果造成一定的影响。spring的工具就有这个功能,可以进行敏感词过滤。
      springmvc提供的工具HtmlUtils.htmlEscape()。会将标签进行转义。


      image.png

    浏览器会提交给我们很多数据,因此是post请求
    403表示没有权限:
    这里直接加上注解@LoginRequired不就行了吗?


    image.png

    $.post的三个参数:

    1. 访问路径
    2. 发送参数
    3. 回调函数


      image.png
      image.png

    没有登陆的时候,将我要发布按钮进行隐藏。
    测试:


    image.png image.png

    三、帖子详情

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


    image.png image.png

    业务层:


    image.png

    通常根据id进行查询的时候都会将id拼到路径中。

    @PathVariable(“discussPostId”)int id,int后面的这个变量名称是可以随意进行设置的。

    image.png

    这个方法目前是不完整的,后续还会添加帖子的回复等。

    • 处理模板


      image.png

    utext可以显示出其原本表示的含义。


    image.png

    5、事务管理

    image.png

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

    image.png image.png image.png image.png

    我们今后的互联网项目主要关注的是中间两种,还要根据安全的要求来选择究竟使用哪一个。

    数据库是如何保障事务的机制:


    image.png

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


    image.png

    编程式事务和声明式事务都应该去学习,声明的毕竟简单,但是假如我们有一个方法,包含很多步骤,但是只有中间的一个小步骤需要进行事务管理,那么,使用声明的方法进行进行管理需要管理整个方法,不合理。


    • 演示spring如何进行这两种事务管理
      写在AlphaService中:
      需求:增加一个用户和一个帖子,将这两个功能写在同一个事务中。


      image.png

    事务的传播机制 :
    业务方法A()可能会调用业务方法B(),以谁的业务方法为准?


    image.png

    事务的传播机制,还是不明白。

    • 测试


      image.png

    • 编程式事务管理


      image.png

      调用回调函数的时候回对方法进行事物的管理。


      image.png

    6、显示评论

    image.png

    套路就是先开发数据访问层,然后是业务层,最后是表现层。


    comment类中有一个字段是entity_type,这表示我们针对什么进行的评论,我们是针对用户,还是评论。entity_id表示用户的id或者是帖子的id等信息。target_id指向的是某个人。
    status 0:正常的,1:删除禁用的。

    image.png

    评论需要进行分页查询。

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


    image.png image.png image.png image.png
    image.png image.png

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

    image.png image.png image.png image.png
    image.png image.png

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


    image.png

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

    7、添加评论

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


      image.png
    image.png
    • 更新帖子数量,在discuss_post中进行更新。


      image.png

      这个信息虽然冗余了,但是方便查找。

    image.png
    image.png

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


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

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


    image.png image.png

    (我有一个小小的疑问,帖子的访问路径,是/discuss/detail/discussPostId吗??忘了呢~~)

    • 最后处理模板:


      image.png

    下面是自己补充的表单(回复评论):


    image.png

    下面是回复给某个人:


    image.png

    验证之后发现完全可以。

    8、私信列表

    image.png

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

    image.png
    • mapper文件


      image.png
    image.png image.png image.png image.png

    进行测试:

    image.png
    • 接下来开始开发业务组件:


      image.png
    • 接下来是表现层,他有两个功能,一个是展示私信列表,另一个是点开之后,展示聊天列表。


      image.png
      image.png

      页面分别是letter和letter-detail。


    • 处理表现层


    选中一个会话,然后查看会话包含的消息。


    image.png
    image.png image.png

    返回操作:


    image.png

    9、发送私信

    image.png
    • 数据访问层:


      image.png
    image.png image.png image.png image.png
    • 设置已读状态

    集合中未读的消息的id。


    image.png

    补充内容:


    image.png

    10、统一异常处理

    image.png

    对于出现的异常我们都向上抛出,因此对于服务器的三层架构,我们只需要统一处理表现层就好了。

    错误页面的文件名称一定得是error,并且需要在template文件夹下面。
    在下面添加一个错误:


    image.png

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


    image.png
    以上是springBoot对项目自动进行的处理。
    但是不太符合我们的预期,服务端报错按理讲应该记录日志,方便我们进行排查。

    下面是依靠spring来实现的。
    写一个新的请求路径,在发生错误的时候可以统一进行重定向到这个页面。


    image.png

    以下这个注解只去扫描带有controller注解的类。
    这个其实就是切面了啦,没有什么神秘的。
    但是要区分浏览器向服务器请求的究竟是什么,是网页还是json数据。普通请求还是异步请求。

    plain说明返回的是普通字符串,需要手动进行转换。


    image.png
    image.png image.png

    11、统一记录日志

    image.png

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


    image.png image.png

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

    image.png

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


    image.png image.png

    前置通知:


    image.png

    一些小疑问:

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

    相关文章

      网友评论

          本文标题:第三章(nk)

          本文链接:https://www.haomeiwen.com/subject/zhffxhtx.html