Springboot项目——博客平台

前言:为巩固之前学习的知识,同时锻炼自己的代码能力,项目经验,熟悉前后端交互方式等,特此完成一个博客平台系统。(总之,为了学习,为了进步)

博客平台:本项目实现了一个简单的博客系统,其主要功能包括用户登录,用户注册,用户修改头像,发布博客,查看博客详情,编辑博客,发布博客等功能,有助于用户学习和记录知识等。该项目大致分为两个模块:用户模块,博客模块,下面主要从这两个模块开始介绍本项目。

一、数据库设计

1. 创建数据库 java_blog_spring

2. 创建两张表 user 表和 blog 表;

其中 user 表中的字段及其含义为

{

id int(11)(用户id,主键 自增);user_name varchar(128)(用户名,unique,not null);password varchar(128)(用户密码,not null);github_url varchar(128)(用户github地址);deleteFlag tinyint(4)(删除字段,1表示已删除,0表示未删除);create_time datetime(表示创建时间);update_time datetime(表示更新时间);photo varchar(256)(用户头像地址)

}

blog表中的字段及其含义为

{

id int(11)(用户id,主键 自增);title varchar(200)(博客标题);content text(博客正文);user_id int(11)(博客作者 id);deleteFlag tinyint(4)(删除字段,1表示已删除,0表示未删除);create_time datetime(表示创建时间);update_time datetime(表示更新时间);

}

二、全局处理

1. 统一数据格式返回

方便前后端交互,方便前端对后端的响应进行处理。

1)自定义结果实体类Result,其属性包括 code(业务码),errMsg(错误信息),data(接口响应的数据,泛型);其静态方法有 success(T data),在请求成功时可调用,参数data,表示给前端返回的数据内容;fail(String errMsg),在请求非法时可调用,参数 errMsg,表示非法请求的错误信息。其中,Result 类中的属性 code 通过自定义枚举类来实现,保证 code 值的正确性。        

2)自定义响应通知类,实现 ResponseBodyAdvice 接口,并重写其 supports 方法和 beforeBodyWrite方法,supports方法:判断是否要执行beforeBodyWrite方法,true为执行,false不执行;beforeBodyWrite方法:对response方法进行的具体操作处理,如果返回的结果已经时Result类时,需直接返回,另外,如果返回的结果时String类型,需通过ObjectMapper进行特殊处理。

2. 拦截器

1)自定义登录拦截器实现 HandlerInterceptor 接口,并重写 preHandle方法,表示是否应该对请求进行拦截

2)自定义配置类实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法,表示拦截哪些请求重写 addResourceHandlers,指向静态资源的路径,(例如上传图片时会用到)。

3. 全局异常处理

自定义异常处理类,实现处理全局异常的方法,并添加 @ExceptionHandler 注解,使得在发生相应异常时,自动调用该方法来进行处理。

三、用户模块

用户模块的实现在 UserController 类中

1. 登录功能

1)前端页面

2) 后端实现

使用 JWT 令牌(Json Web Token)存储用户登录信息;后端首先校验用户信息的合法性,当校验成功时,为该用户生成令牌,将用户的 id 存储在 token 中(方便后续获取用户信息),并设置过期时间,客户端将令牌存储在 Local Storage 中;后续客户端的请求都会带着令牌,服务器会校验令牌,来决定是否拦截用户的请求。

2. 注册功能

1)前端页面

2)后端实现

使用 MD5 算法加密、UUID 加盐共同加密用户的密码,保证用户密码的安全性。服务器首先判断用户注册信息的合法性,用户名不能重复,两次密码需输入一致等;判断合法后,将用户的密码和UUID 生成的随机盐值,使用 MD5 算法进行加密后,存储在数据库中。

3. 获取当前登录用户信息(接口)

服务器根据用户的请求中的 token 是否存在判断用户登录状态,并根据 token 获取到存储在 token中的 登录用户 id,根据 id 从数据库中获取用户信息,并返回给前端。

4. 获取博客作者信息(接口)

服务器首先根据博客 id 在数据库中查询该博客对应的作者 id(在博客模块中实现),在判断作者 id 合法后,在数据库中,根据作者 id 获取作者信息并返回给前端。

5. 上传用户头像

1)前端页面(非常丑,还是不要看了,以实现功能为主(bushi)),通过 form 表单来实现图片的上传。

2)后端实现 

使用 Spring 框架下的 MultipartFile 类实现,设置图片的存储地址 filePath ,如果没有则创建一个,通过getContentType 方法获取图片类型和图片后缀名,通过 UUID 生成随机图片名拼接图片后缀名作为新的图片名 filename,通过 transferTo 方法将图片传输到 filePath/filename 下,即保存图片到指定目录,并通过 token 获取到用户 id,通过 id 将 filename 存储在数据库中,并返回成功与否的响应给前端。

四、博客模块

博客模块的实现在 BlogController 类中

1. 获取博客列表

1)前端页面

2)后端实现

 服务器直接从数据库中查询所有博客信息,并返回给前端,前端将每个博客信息拼接为相应的html 片段,并显示在页面上。

2. 查看博客详情

1)前端页面

2)后端实现

 后端根据前端传来的博客 id(通过 location.search 获取url中的参数),获取博客详情对象,然后拿到博客作者的 id,再通过 token 获取当前登录用户id,判断 id 是否一致,若一致,则说明当前用户是当前博客的作者,即当前用户具有对当前博客的编辑和删除权限,通过设置 该对象中的属性 isAuthor 为 true,来提供响应的编辑和删除的接口,最后返回该对象给前端。

3. 发布博客

1)前端页面

 2)后端实现

后端接收一个 blogInfo 对象,并判断该对象的合法性(某个属性为空等),然后通过 token 获取到当前登录用户的 id,并设置为该对象的作者 id,然后将该对象插入到数据库中,将插入的结果返回给前端。

4. 修改博客

1)前端页面

2)后端实现

首先需要前端将原博客信息显示到页面上,通过查看博客详情接口;然后后端对前端请求中传递的 blogInfo 对象进行合法性校验,此时就不需要再设置博客的作者 id 了,因为只能是博客作者编辑博客,直接更新数据库中对应的博客信息,并将结果返回给前端。

5. 删除博客

采用逻辑删除,服务器创建一个 blogInfo对象,并将前端传来的博客 id 设置为该对象的博客 id,再将 deleteFlag属性设置为 1,表示已删除, 最后将删除的结果返回给前端。

五、项目源码

java_R: 学习java之路 - Gitee.comicon-default.png?t=N7T8https://gitee.com/rcnhtin/java_-r/tree/master/project/blog_spring

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QQ名片满级会员装x助手HTML源码

源码介绍 QQ名片满级会员展示生成HTML源码,源码由HTMLCSSJS组成,双击html文件可以本地运行效果,也可以上传到服务器里面,保存素材去选择QQ个性名片-选择大图模板-把图上传照片墙即可 源码效果 源码下载 蓝奏云:http…

如何远程访问Redis?

远程访问Redis是一种常见的需求,特别是在分布式系统或跨地域网络中。通过远程访问,我们可以轻松地对远程的Redis数据库进行操作和管理。 天联保障数据安全 对于远程访问Redis的安全性问题,我们可以借助天联来保障数据的安全。天联是一种基于…

mybatisplus填充公共字段MetaObjectHandler后不生效解决方式

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component;import java.util.Date;/*** 拦截处理公共字…

开发一个comfyui的自定义节点

文章目录 目标功能开发环境comfyui自定义节点的实现原理仓库地址完整代码目标功能 开发一个comfyui的自定义节点,该节点的功能是:可以对comfyui工作流中最终输出的图像添加一些自定义文案,且可以指定文案在图像上的位置、文案的字体样式、字体大小、字体颜色等。最终效果如…

全网讲的最详细的Docker镜像分层存储原理

先说结论,容器镜像分层存储图示 欢迎关注 实验环境准备 当前实验docker版本24.0.7如下,当前docker版本使用overlay2机制存储镜像 Client: Docker Engine - CommunityVersion: 24.0.7API version: 1.43Go version: go1.20.10…

YOLOv8+PyQt5西红柿成熟度检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

西红柿成熟度检测(https://mbd.pub/o/bread/mbd-ZpWbk5ly)_哔哩哔哩_bilibili 资源包含可视化的西红柿成熟度检测系统,基于最新的YOLOv8训练的西红柿成熟度检测模型,和基于PyQt5制作的可视化西红柿成熟度检测系统,包含…

系统思考—战略沙盘推演咨询服务

今日与JSTO团队一起学习了《战略沙盘推演咨询服务》。通过沙盘体验,我深刻感受到组织与战略就像一张皮的正反两面。在转型过程中,即使战略非常明确,团队成员由于恐惧和顾虑,往往不愿意挑战新的业务,从而难以实现战略目…

创新实训2024.05.28日志:记忆化机制、基于MTPE与CoT技术的混合LLM对话机制

1. 带有记忆的会话 1.1. 查询会话历史记录 在利用大模型自身能力进行对话与解答时,最好对用户当前会话的历史记录进行还原,大模型能够更好地联系上下文进行解答。 在langchain chat chat的chat函数中,通过实现langchain框架提供的ChatMemo…

虚拟化技术 分布式资源调度

一、实验内容 实现分布式资源调度 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑,建议4C8G或以上配置已安装VMware Workstation Pro已安装Windows Server 2008 R2 x64已安装vCenter Server 三、实验步骤 将主机esxi1和esxi2加入…

【找出缺失的观测数据】python

思路: 主要在于分配剩余的部分分配问题 代码: class Solution:def missingRolls(self, rolls: List[int], mean: int, n: int) -> List[int]:m len(rolls)total_sum (n m) * meantoset total_sum - sum(rolls)# 检查 toset 是否在可能的范围内i…

R可视化:可发表的prism点图

介绍 可发表的prism点图 加载R包 knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE) library(tidyverse) library(ggpubr) library(ggprism)rm(list = ls()) options(stringsAsFactors = F)导入数据 data("iris")head(iris)处理数据 plotd…

git stash 命令

线上版本出现了bug,我们应该放下手头上的开发工作先将线上的bug修复,这个时候dev分支下的改动怎么处理? 是向分支行上提交代码还是直接切换到master分支下? 首先我们的开发工作还未完成,就把代码提交到分支上&#xf…

安装ROS 2 Jazzy Jalisco

参考: https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debians.html 先要安装一个ubuntu,对老旧硬件最友好的版本Lubuntu: 安装Lubuntu24.04-CSDN博客 过程: 按文档一步步走下去: 遇到问题查找通用案…

(三)MobaXterm、VSCode、Pycharm ssh连接服务器并使用

背景:根据前两篇文章操作完成后, 手把手教学,一站式安装ubuntu及配置服务器-CSDN博客 手把手教学,一站式教你实现服务器(Ubuntu)Anaconda多用户共享-CSDN博客 课题组成员每人都有自己的帐号了&#xff0…

linux文件编程api: creat

1.基本信息 功能 创建新文件 头文件 #include<fcntl.h> 函数形式 int creat(const char *pathname, mode_t mode); 返回值 如果成功&#xff0c;则返回文件描述符号 如果失败&#xff0c;则返回-1 参数 pathname: 创建的文件名 mode: 新建文件时&#xff0c;文件权限…

企业微信hook接口协议,ipad协议http,已读消息

已读消息 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人idisRoom是bool是否是群消息 请求示例 {"uuid":"1753cdff-0501-42fe-bb5a-2a4b9629f7fb","send_userid":788130255…

C++入门3——类与对象(2)

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。可是空类中真的什么都没有吗&#xff1f; 其实并不是的&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xf…

《Java数据结构》--单链表详解

一.单链表的概念 1.概念 单链表是一种物理存储结构是非连续&#xff0c;非线性的但是在逻辑结构上是连续且线性的&#xff0c;链表是通过一个个结点来实现的&#xff0c;使每个相邻结点之间存在一定关系来将所有结点串起来&#xff0c;在物理存储上像是一条链子。 2.链表的原…

《Ai企业知识库》-rasa X安装使用

背景&#xff1a; Rasa X 是一个为构建、改进和管理对话式AI助手而设计的工具。它是Rasa开源机器学习框架的一个扩展&#xff0c;旨在实现“对话驱动开发”&#xff08;Conversation-Driven Development&#xff09;。Rasa X 主要特点包括&#xff1a; 交互式学习&#xff1a;…

二叉树的实现(递归实现)

前言&#xff1a;本文讲解通过递归的方式实现二叉树的一些基本接口。 目录 通过左右子树的方式实现二叉树&#xff1a; 二叉树的遍历&#xff1a; 求二叉树结点的个数&#xff1a; 二叉树所有节点的个数&#xff1a; 二叉树叶子节点的个数&#xff1a; 求第k层节点的节点…