• 码神之路项目总结(三)


    目录

    一、评论列表

    二、评论

    三、发布文章--所有文章分类

    四、发布文章--所有文章标签

    五、发布文章

    六、AOP记录日志



     

    一、评论列表

    请求接口:

     数据库表结构解析:

     思路:
    1、首先接收前端的文章id,通过文章id和level=1查出第一层评论列表

    2、然后将查询出来的第一级评论列表遍历转换为它的vo形式返回给前端页面,遍历出来的评论对象还需再转换vo

    3、遍历出来的评论对象转换vo时,需要将现在评论对象的id当做parentid以及level=2来查询有没有匹配的二级评论对象列表

    4、如果有二级评论对象列表,好再重复第2步骤,重复过程中标红的改为对应的层级即可

    5、如果不进行改进只能查出两层评论

    总结:这个地方很绕,需要你把数据库的每个字段弄明白什么意思,再仔细揣摩一下即可明白含义。

    改进:我想的是加个计数器进行累加第三步的level,具体能不能行还没取测试,如果小伙伴们有想法可以打在评论区交流

    二、评论

    请求接口:

    思路:

    评论分为一级评论和二级评论,一级评论即正常发的评论,二级评论即为评论的评论

    1、接收前端传过来的评论相关的参数

    2、如果是一级评论,则需要将实体类的level设置为1,parentid设置为0,touid设置为0;如果是二级评论,则前端会传过parentid和touid,我们将level设置为2,parentid和touid设置为前端传递过来的参数即可 

    3、将设置好参数的实体类存入数据库

    4、最后将评论的请求路径添加到WebMvcConfigurer的addInterCeptors方法中,实现评论的登录拦截

    三、发布文章--所有文章分类

    请求接口:

    思路:

    1、前端是get请求,也没带什么参数,直接去分类表里面查出所有的分类返回前端即可

    四、发布文章--所有文章标签

    请求接口:

    思路:

    1、直接在标签表里面查出所有的文章标签返回给前端页面即可 

    五、发布文章

     请求接口:

     思路:

    发布文章涉及到三个表:文章表、文章标签表、文章体表

    1、我们接收前端发过来的发布请求,获取请求体中的参数以及当前线程的用户信息

    2、将相应信息插入文章表、文章标签表、文章体表

    3、最后将插入文章的文章id返回到前端页面

    六、AOP记录日志

    1、自定义日志注解

    1. /**
    2. * 日志注解
    3. */
    4. //Type代表可以放在类上面,Method代表可以放在方法上
    5. @Target(ElementType.METHOD)
    6. @Retention(RetentionPolicy.RUNTIME)
    7. @Documented
    8. public @interface LogAnnotation {
    9. //自定义的参数
    10. String module() default "";
    11. String operation() default "";
    12. }

    2、定义切面,绑定切入点和通知,切入点就是自定义注解

    1. @Aspect
    2. @Component
    3. @Slf4j
    4. public class LogAspect {
    5. //1、切入点
    6. @Pointcut("@annotation(com.mszlu.blog.common.aop.LogAnnotation)")
    7. public void logPointCut() {
    8. }
    9. //2、通知中记录日志
    10. @Around("logPointCut()")
    11. public Object around(ProceedingJoinPoint point) throws Throwable {
    12. long beginTime = System.currentTimeMillis();
    13. //执行方法
    14. Object result = point.proceed();
    15. //执行时长(毫秒)
    16. long time = System.currentTimeMillis() - beginTime;
    17. //保存日志
    18. recordLog(point, time);
    19. return result;
    20. }
    21. private void recordLog(ProceedingJoinPoint joinPoint, long time) throws Exception {
    22. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    23. Method method = signature.getMethod();
    24. LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
    25. log.info("=====================log start================================");
    26. log.info("module:{}",logAnnotation.module());
    27. log.info("operation:{}",logAnnotation.operation());
    28. //请求的方法名
    29. String className = joinPoint.getTarget().getClass().getName();
    30. String methodName = signature.getName();
    31. log.info("request method:{}",className + "." + methodName + "()");
    32. // //请求的参数
    33. // Object[] args = joinPoint.getArgs();
    34. // String params = JSON.toJSONString(args[0]);
    35. // log.info("params:{}",params);
    36. //获取request 设置IP地址
    37. HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
    38. log.info("ip:{}", IpUtils.getIpAddr(request));
    39. log.info("excute time : {} ms",time);
    40. log.info("=====================log end================================");
    41. }
    42. }

    3、在想记录日志的方法上,添加自定义日志注解即可实现记录日志

  • 相关阅读:
    java Spring Boot生成图片二维码
    记录一次错误---想让U-net网络输入大小不一致的图片
    数据结构与算法:排序算法(1)
    【C语言经典100例题-68】有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
    正厚软件 | App测试面试题及参考答案
    开始第一个vue项目,环境搭建+html项目运行
    MySQL深度剖析及面试秘籍(必知必会30题全)
    【计算机网络】Cookie、Session和上传文件重点知识汇总
    Redis篇
    如何在复现LaneNet车道线检测项目时,采用网上博主制作数据集的方法来只做自己的数据集,当把此数据集投喂进网络训练时(采用Pytorch库)会报如下的错误?
  • 原文地址:https://blog.csdn.net/weixin_51930617/article/details/127871911