【项目日记(三)】梦幻笔耕-博客模块

❣博主主页: 33的博客❣
▶️文章专栏分类:项目日记◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多项目内容

在这里插入图片描述

目录

  • 1.前言
  • 2.获取博客列表
  • 3.获取博客详情
  • 4.新增博客
  • 5.更新博客
  • 6.删除博客
  • 7.拦截器
  • 9.统一处理
    • 9.1统一结果返回
    • 9.2统一异常处理
  • 10.总结

1.前言

在上一篇文章中,我们已经完成了登录模块的后端逻辑,接下来就进入了博客页面,我们一起继续完成博客页面的相关逻辑吧

2.获取博客列表

BlogController类:

@RequestMapping("/getList")public List<BlogList> getList(){log.info("获取博客列表");return blogService.getList();}

BlogService类:

 public List<BlogList> getList(){return blogMapper.selectAll();}

3.获取博客详情

BlogController类:

@RequestMapping("/getBlogDetail")public BlogInfo getBlogDetail(Integer blogId){log.info("getBlogDetail, blogId+{}",blogId);BlogInfo blogInfo= blogService.getBlogDetail(blogId);             return blogInfo;}

BlogService类:

 public BlogInfo getBlogDetail(Integer blogId) {return blogMapper.selectById(blogId);}

4.新增博客

BlogController类:

@RequestMapping("/add")public Boolean addBook(BlogInfo blogInfo,HttpServletRequest request){log.info("添加图书,blogInfo.getTitle{}",blogInfo.getTitle());log.info("添加图书,blogInfo.getContent{}",blogInfo.getContent());if(!StringUtils.hasLength(blogInfo.getContent())||!StringUtils.hasLength(blogInfo.getTitle())){return false;}
String token=request.getHeader(Constants.REQUEST_HEADER_TOKEN);Integer userId=JwyUtils.getIdByToken(token);if(userId==null||userId<0){return false;}blogInfo.setUserId(userId);return blogService.insertBlog(blogInfo);}    

BlogService类:

public Boolean insertBlog(BlogInfo blogInfo) {Integer i = blogMapper.insertBlog(blogInfo);if(i>0){return true;}else {return false;}}

5.更新博客

BlogController类:

@RequestMapping("/update")public Boolean update(BlogInfo blogInfo){log.info("更新博客");if (blogInfo.getId()==null|| !StringUtils.hasLength(blogInfo.getTitle())|| !StringUtils.hasLength(blogInfo.getContent())){return false;}blogService.update(blogInfo);return true;}

BlogService类:

public Integer update(BlogInfo blogInfo) {return blogMapper.updateBlog(blogInfo);}

6.删除博客

BlogController类:

@RequestMapping("/delete")public Boolean delete(Integer blogId){log.info("删除博客, blogId:{}", blogId);if (blogId<=0){return false;}BlogInfo blogInfo = new BlogInfo();blogInfo.setId(blogId);blogInfo.setDeleteFlag(1); //删除blogService.update(blogInfo);return true;}

BlogService类:

public Integer update(BlogInfo blogInfo) {return blogMapper.updateBlog(blogInfo);}

7.拦截器

我们已经完成了博客页面的业务逻辑,但我们发现不管用户是否登录,我们前端直接请求后端的某一个逻辑如/blog/getBlogDetail,都可以获得对应的内容,显然这样是非常不合理的,我们希望只有用户登录,才能获得进行博客操作。因为之前,我们已经把用户的信息存入localStorage中,在后续请求中,并会携带这个信息。

 @RequestMapping("/getBlogDetail")public BlogInfo getBlogDetail(Integer blogId, HttpServletRequest request){log.info("getBlogDetail, blogId+{}",blogId);BlogInfo blogInfo= blogService.getBlogDetail(blogId);String token=request.getHeader(Constants.REQUEST_HEADER_TOKEN);Integer userId=JwyUtils.getIdByToken(token);if(userId!=null&&userId==blogInfo.getUserId()){blogInfo.setLoginUser(true);}else {blogInfo.setLoginUser(false);}return blogInfo;}

那么我们可以在每一条后端逻辑中判断用户是否登录的操作,再进行后续操作,可是如果在每一段逻辑中都手动去添加,非常的繁琐。那有什么进行统一处理的操作吗?当然是有的,就是拦截器。
设置拦截器内容:

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token=request.getHeader(Constants.REQUEST_HEADER_TOKEN);log.info("从header中获取token:{}", token);Claims claims= JwyUtils.parseToken(token);if(claims==null){response.setStatus(401);return false;}return true;}
}

添加拦截器:

@Component
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;private final List excludes =  Arrays.asList("/**/*.html","/blog-editormd/**","/css/**","/js/**","/pic/**","/user/login","/user/register");@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(excludes);}
}

9.统一处理

9.1统一结果返回

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {if (body instanceof Result){return body;}if (body instanceof String){return objectMapper.writeValueAsString(Result.sucess(body));}return Result.sucess(body);}
}

9.2统一异常处理

@Slf4j
@ResponseBody
@ControllerAdvice
public class ExceptionHandle {@ExceptionHandlerpublic Result handle(Exception e){log.error("发生异常, e:", e);return Result.fail("内部错误, 请联系管理员");}@ExceptionHandlerpublic Result handle(NoResourceFoundException e){log.error("文件不存在:{}", e.getResourcePath());return Result.fail("内部错误, 请联系管理员");}
}

10.总结

我们已经完成了基本的业务逻辑,接下来,就只剩下前端模块,在下一篇文章中,我们再进行完善。

下期预告:博客前端模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日常开发记录分享-SQL中的partition分区功能使用

文章目录 需求来源实现思路实施SQL 语句结构内部查询&#xff08;子查询&#xff09;外部查询 结果 partition的升级使用解释 验证一下看看分区 分区的一些操作1. 普通查询2. 分区表上的查询优化3. 插入数据4. 删除分区中的数据5. 分区维护操作添加新的分区删除分区重组分区 6.…

银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030

原文链接&#xff1a;银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030 Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇关于在银河麒麟服务器V10 SP3上安装人大金仓V009R001C001B0030的文章。人大金仓是国内知名的数据库管理系统&#xff0c;它在高性能、高可靠…

AWS全服务历史年表:发布日期、GA和服务概述一览 (全)

我一直在尝试从各种角度撰写关于Amazon Web Services&#xff08;AWS&#xff09;的信息和魅力。由于我喜欢技术历史&#xff0c;这次我总结了AWS服务发布的历史年表。 虽然AWS官方也通过“Whats New”发布了官方公告&#xff0c;但我一直希望能有一篇文章将公告日期、GA日期&…

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数&#xff08;constructor&#xff09;2.析构函数&#xff08;destructor&#xff09;3.运算符重载&#xff08;operator&#xff09;1.operator2.operator[]3.operator4.operator 4.string的四…

算法从零到精通 (一) ~ 快慢双指针

1. 前言 快慢双指针是一种常用的算法技巧&#xff0c;通常用于解决涉及链表或数组的问题。它的基本思想是使用两个指针&#xff0c;一个移动速度快&#xff08;快指针&#xff09;&#xff0c;一个移动速度慢&#xff08;慢指针&#xff09;&#xff0c;来解决特定的问题。这两…

计算机软考之计算机网络知识详解

目录 计算机网络概述计算机网络体系结构 OSI参考模型TCP/IP模型 物理层 传输介质信号传输 数据链路层 数据帧错误检测与纠正 网络层 IP协议路由协议 传输层 TCP协议UDP协议 应用层 常见应用层协议 网络安全 常见安全威胁安全措施 实战案例分析总结 计算机网络概述 计算机网络…

Docker搭建群晖

Docker搭建群晖 本博客介绍在docker下搭建群晖 1.编辑docker-compose.yml文件 version: "3" services:dsm:container_name: dsmimage: vdsm/virtual-dsm:latestenvironment:DISK_SIZE: "16G"cap_add:- NET_ADMIN ports:- 8080:50…

在未来有可能实现无药无手术可以治病吗?

在未来&#xff0c;随着科技的不断进步和人类对健康的追求&#xff0c;无药无手术治病的可能性是存在的。虽然目前的技术水平和医疗手段还无法完全实现这一目标&#xff0c;但是我们可以从多个方面推论出未来可能出现的无药无手术治病的情景。 首先&#xff0c;随着生物科技的发…

基于NER、触发词与依存句法分析的言论抽取

言论抽取技术简介 言论抽取&#xff08;Opinion Mining&#xff09;&#xff0c;是自然语言处理&#xff08;NLP&#xff09;领域中的一个重要分支&#xff0c;主要用于从文本中自动提取和分析情感信息。随着社交媒体、电子商务和在线评论的兴起&#xff0c;言论抽取技术变得越…

红狮金业解读:分析高价位黄金的后续投资吸引力

在全球经济格局不断变化的背景下&#xff0c;黄金作为传统的避险资产一直备受投资者关注。近期&#xff0c;金价持续走高&#xff0c;引发了市场对黄金是否仍然是优质资产配置的讨论。本文红狮启富将从长期需求、价格驱动因素的变化以及汇率影响三个角度&#xff0c;深入分析黄…

开发语言的基本构成。

许多人都对设计一套自有知识产权的开发语言感兴趣。那么&#xff0c;如何按照功能模块设计开发语言&#xff1f; 开发语言必须提供以下基本功能&#xff1a; 数据存储组织和管理&#xff1b;数据定位和访问&#xff1b;数据定义和解释方案&#xff1b;通用算法包&#xff1b;迭…

关于线性代数(考研)

1.AE的特征值的问题 若λ是A的特征值&#xff0c;对应的特征向量是x&#xff0c;则Axλx&#xff0c;所以(AE)xAxExλxx(λ1)x&#xff0c;所以λ1是AE的特征值。所以若A的特征值是1&#xff0c;1&#xff0c;0&#xff0c;则AE的特征值就是11&#xff0c;11&#xff0c;01&am…

c# 端口监控 Helper 以及写一个端口监控工具

c# 端口监控 Helper 以及写一个端口监控工具 介绍核心代码&#xff1a;工具完整编码&#xff1a;1、编写界面2、打开定时控件的属性设置。3、编写定时控件的 Tick 事件结果&#xff08;运行效果&#xff09; 介绍 由于最近做上架比较多&#xff0c;会经常来确保服务器的服务&a…

VUE 子组件可以直接改变父组件的数据吗

子组件不可以直接改变父组件的数据。‌在Vue中&#xff0c;‌数据流是单向的&#xff0c;‌即父组件通过props向子组件传递数据&#xff0c;‌而子组件不能直接修改父组件的数据。‌这是为了维护数据流动的单向性和数据的可维护性。‌ 如果子组件需要修改父组件的数据&#xf…

Flink时间和窗口

目录 时间语义 水位线&#xff08;Watermarks&#xff09; 并行流中的水位线 窗口 滚动窗口—Tumbling Windows 滑动窗口—Sliding Windows 会话窗口—Session Windows 全局窗口—Global Windows 例子 时间语义 如图所示&#xff0c;由事件生成器&#xff08;Event Pr…

萤石举办2024夏季新品发布会,全力推进“2+5+N”智能家居新生态

7月24日&#xff0c;“智动新生&#xff0c;尽在掌控”2024萤石夏季新品发布会在杭州成功举办。本次发布会上&#xff0c;“智慧生活守护者”萤石深入挖掘应用场景&#xff0c;重磅发布了包括智能健康手表、智能家居AI主机、生态控制器、智家APP等多款创新性的产品及应用&#…

【JavaScript】`Map` 数据结构

文章目录 一、Map 的基本概念二、常见操作三、与对象的对比四、实际应用场景 在现代 JavaScript 中&#xff0c;Map 是一种非常重要且强大的数据结构。与传统的对象&#xff08;Object&#xff09;不同&#xff0c;Map 允许您使用各种类型的值作为键&#xff0c;不限于字符串或…

mysql 如何实现重复数据取创建时间的最后一条记录?

重复数据去重&#xff0c;取创建时间最晚的一条。 思路&#xff1a;按重复的字段通过group by 去重&#xff0c;重复的数据通过GROUP_CONCAT(&#xff09;函数收集&#xff0c;再通过SUBSTRING_INDEX(&#xff09;函数截取即可。 实例&#xff1a; SELECTUserName,//字段值按…

基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)

构建监控平台数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 监控平台的数据可视化对于实时掌握系统状态、快速响应问题至关重要。通过直观的数据展示&#xff0c;运维团队可以迅速发现异常&#xff0c;优化资源配置。本文将详细介绍如何利用 HTML 和 ECharts 实现一个…

关于 夜莺n9e 的简易部署

一、部署夜莺n9e 1.找一个服务器机器 #创建并进入目录 mkdir -p /data/n9e && cd /data/n9e2.准备n9e安装包 (如果存在&#xff0c;跳过) #下载并解压n9e wget https://download.flashcat.cloud/n9e-v6.7.3-linux-amd64.tar.gz tar -zxvf n9e-v6.7.3-linux-amd64.ta…