当前位置: 首页 > news >正文

【项目】星辰博客介绍

目录

一、项目背景

二、项目功能

1. 登录功能:

2. 列表页面:

3. 详情页面:

4. 写博客:

三、技术实现

四、功能页面展示

1. 用户登录

2. 博客列表页

3. 博客编辑更新页

4.博客发表页

5. 博客详情页

五.系统亮点

1.强制要求登陆

2.令牌技术


网站: 博客登陆页

账号: zhangsan 密码: 123456 或者 账号: lisi 密码: 123456

(欢迎大家登录测试,如果无法响应,请联系我重新部署,谢谢!)

一、项目背景


1. 星辰博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的个人博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客、以及强制登录等功能。


2. 但是该项目没有设计用户注册功能,只能提前在数据库中存储用户信息后经过校验登录;并且用户头像不能自己设定,在进行前端页面的书写过程中已经将头像的图片写为静态了;而用户信息中的文章数以及分类数也没有在后端中具体实现,直接在前端页面中写为了静态的。


3. 该博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看。


二、项目功能


该博客系统主要实现了以下几个功能:登录、注销、写博客以及删除博客等功能。

1. 登录功能:

用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。登录成功后就会跳转到列表页面。在右上角存在主页和写博客两个按钮,但是在未登录情况下按下均只会跳转到登录页面。


2. 列表页面:

可以在列表页查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。


3. 详情页面:

在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能:删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。


4. 写博客:

在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。

三、技术实现

星辰博客系统采用Spring Boot作为核心框架,同时集成了SpringMVC、MyBatis等相关技术组件,构建了一个功能完备、性能优异的博客系统。具体技术实现如下:

  1. 基于Spring Boot框架构建Web应用程序,实现快速开发和部署。
  2. 采用MyBatis作为数据访问层框架,实现对数据库的CRUD操作。
  3. 使用Thymeleaf作为视图模板引擎,生成动态的HTML页面。
  4. 利用Markdown解析器实现博客文章的富文本编辑和展示。
  5. 采用Maven进行项目管理和构建,实现依赖管理和自动化构建部署。

四、功能页面展示

1. 用户登录

2. 博客列表页

3. 博客编辑更新页

4.博客发表页

5. 博客详情页

五.系统亮点

1.强制要求登陆

当⽤⼾访问博客列表⻚和博客详情⻚时,如果⽤⼾当前尚未登陆,就⾃动跳转到登陆⻚⾯. 采⽤拦截器来完成,token通常由前端放在header中,我们从header中获取token,并校验 token是否合法

添加拦截器

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1. 从header中获取token//2. 校验token//3. 成功, 放行String userToken = request.getHeader(Constant.USER_TOKEN_HEADER);log.info("获得token, token:"+userToken);boolean result = JwtUtils.checkToken(userToken);if (result){return true;}else {response.setStatus(401);return false;}}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/**/*.html","/pic/**","/js/**","/css/**","/blog-editormd/**","/user/login"); //这里要排除登录页面}
}

1. 前端请求时,header中统⼀添加token,写在common.js中

$(document).ajaxSend(function (e, xhr, opt) { var user_token = localStorage.getItem("user_token"); xhr.setRequestHeader("user_token", user_token); });

效果展示

强制要求登陆展示

2.令牌技术

在我们实现登陆的时候

 传统思路:

• 登陆⻚⾯把⽤⼾名密码提交给服务器.

• 服务器端验证⽤⼾名密码是否正确,并返回校验结果给后端

• 如果密码正确,则在服务器端创建Session.通过Cookie把sessionId返回给浏览器.

有可能出现问题: 集群环境下无法直接使用Session.

如下场景:

1. 用户登录

用户登录请求,经过负载均衡,把请求转给了第⼀台服务器,第⼀台服务器进⾏账号密码 验证,验证成功后,把Session存在了第⼀台服务器上

2. 查询操作

用户登录成功之后,携带Cookie(里面有SessionId)继续执⾏查询操作,比如查询博客列表.此时请求转发到了第⼆台机器,第⼆台机器会先进⾏权限验证操作(通过SessionId验证⽤⼾是否 登录),此时第⼆台机器上没有该⽤⼾的Session,就会出现问题,提示用户登录,这是我们不能忍受的

问题出现的原因:

我们开发的项⽬,在企业中很少会部署在⼀台机器上,容易发⽣单点故障.(单点故障:⼀旦这台服务器挂 了,整个应⽤都没法访问了).所以通常情况下,⼀个Web应⽤会部署在多个服务器上,通过Nginx等进⾏ 负载均衡.此时,来⾃⼀个⽤⼾的请求就会被分发到不同的服务器上.

令牌技术可以解决如上场景:

1. 用户登录 用户登录请求,经过负载均衡,把请求转给了第⼀台服务器,第⼀台服务器进⾏账号密码 验证,验证成功后,⽣成⼀个令牌,并返回给客⼾端.

2. 客⼾端收到令牌之后,把令牌存储起来.可以存储在Cookie中,也可以存储在其他的存储空间.

3. 查询操作 用户登录成功之后,携带令牌继续执⾏查询操作,⽐如查询博客列表.此时请求转发到了 第⼆台机器,第⼆台机器会先进⾏权限验证操作.服务器验证令牌是否有效,如果有效,就说明用户已 经执行了登录操作,如果令牌是⽆效的,就说明用户之前未执⾏登录操作.

下面是JWT令牌⽣成和校验的部分源码:

1. 引⼊JWT令牌的依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is
preferred --><version>0.11.5</version><scope>runtime</scope></dependency>
public static String genToken(Map<String, Object> claim){return Jwts.builder().setClaims(claim).setExpiration(new Date(System.currentTimeMillis()+EXPIRATION_DATE)).signWith(key).compact();
}//生成keypublic static Claims parseToken(String token) {JwtParser build = Jwts.parserBuilder().setSigningKey(key).build();Claims body = null;try {body = build.parseClaimsJws(token).getBody();}catch (ExpiredJwtException e){log.error("token过期,校验失败,token:",token);} catch (Exception e) {log.error("token校验失败,token:",token);}return body;
}
public static boolean checkToken(String token) {Claims body = parseToken(token);if (body == null){return false;}return true;
}

相关文章:

【项目】星辰博客介绍

目录 一、项目背景 二、项目功能 1. 登录功能&#xff1a; 2. 列表页面&#xff1a; 3. 详情页面&#xff1a; 4. 写博客&#xff1a; 三、技术实现 四、功能页面展示 1. 用户登录 2. 博客列表页 3. 博客编辑更新页 4.博客发表页 5. 博客详情页 五.系统亮点 1.强…...

从0开始的STM32HAL库学习6

外部时钟源选择 配置环境 选择TIM2 配置红色框图中的各种配置 时钟源选择外部时钟 2 1. 预分频器 Prescaler &#xff0c;下面填0&#xff0c;不分频 2. 计数模式 CounterModer &#xff0c;计数模式选择为向上计数 3. 自动重装寄存器 CouterPeriod &#xff0c;自动重…...

Elasticsearch ILM 热节点迁移至冷节点 IO 打满、影响读写解决方案探讨

1、实战问题 ILM&#xff08;索引生命周期管理&#xff09; 遇到热数据迁移至冷节点时造成 IO 打满影响读写的情况。 现在采取的方案是调整索引生命周期策略&#xff0c;定时的将Cold phase 开启/关闭。低峰开启&#xff0c;高峰关闭。 就是不知道这里面会有啥坑。 热节点&…...

STM32中PC13引脚可以当做普通引脚使用吗?如何配置STM32的TAMPER?

1.STM32中PC13引脚可以当做普通引脚使用吗&#xff1f; 在STM32单片机中&#xff0c;PC13引脚可以作为普通IO使用&#xff0c;但需要进行一定的配置。PC13通常与RTC侵入检测功能&#xff08;TAMPER&#xff09;复用&#xff0c;因此需要关闭TAMPER功能才能将其作为普通IO使用。…...

k8s学习——创建测试镜像

创建一个安装了ifconfig、telnet、curl、nc、traceroute、ping、nslookup等网络工具的镜像&#xff0c;便于集群中的测试。 创建一个Dockerfile文件 # 使用代理下载 Ubuntu 镜像作为基础 FROM docker.m.daocloud.io/library/ubuntu:latest# 设置环境变量 DEBIAN_FRONTEND 为 …...

重塑水资源管理的新篇章:深度剖析智慧水利解决方案的前沿技术与应用,探索其如何推动水利行业向智能化、高效化、可持续化方向迈进

目录 一、引言 二、智慧水利的核心技术 1、物联网技术 2、大数据与云计算 3、人工智能与机器学习 4、数字孪生技术 三、智慧水利的应用实践 1、智慧河湖长制信息平台 2、智能灌溉系统 3、城市防洪排涝智慧管理系统 4、智慧水库建设 四、智慧水利的推动作用 1、提升…...

C#实现数据采集系统-查询报文处理和响应报文分析处理

发送报文处理 增加一个功能码映射关系 //功能码映射关系public readonly Dictionary<string, byte> ReadFuncCodes = new Dictionary<string, byte>();<...

【音视频】AAC编码器与ffmpeg生成AAC数据

文章目录 前言为什么使用AAC&#xff1f;AAC规格常见的AAC规格规格之间的区别 ffmpeg生成AAC数据 总结 前言 在音频压缩技术不断发展的过程中&#xff0c;AAC&#xff08;Advanced Audio Coding&#xff09;编码器因其出色的音质和压缩效率&#xff0c;逐渐成为数字音频领域的…...

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册 前言: 什么是 MySQL? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,…...

【Elasticsearch7】3-基本操作

目录 RESTful 数据格式 HTTP操作 索引操作 倒排索引 创建索引 查看所有索引 查看单个索引 删除索引 文档操作 创建文档 查看文档 ​编辑 全量修改 ​编辑局部修改 删除文档 条件删除文档 高级查询 条件查询 URL带参查询 请求体带参查询 带请求体方式的查…...

给定一整数数组,其中有p种数出现了奇数次,其他数都出现了偶数次,怎么找到这p个数?

给定一长度为m的整数数组 &#xff0c;其中有p种不为0的数出现了奇数次&#xff0c;其他数都出现了偶数次&#xff0c;找到这p个数。 要求&#xff1a;时间复杂度不大于O(n)&#xff0c;空间复杂度不大于O(1)。 由于时间复杂度不大于O(n)&#xff0c;则不能在遍历数组中嵌套遍…...

RICHTEK立锜科技 WIFI 7电源参考设计

什么是WIFI 7? WiFi 7&#xff08;Wi-Fi 7&#xff09;是下一代Wi-Fi标准&#xff0c;对应的是IEEE 802.11将发布新的修订标准IEEE 802.11be –极高吞吐量EHT&#xff08;Extremely High Throughput &#xff09;。Wi-Fi 7是在Wi-Fi 6的基础上引入了320MHz带宽、4096-QAM、Mu…...

CUDA编程00 - 配置CUDA开发环境

第一步&#xff1a; 在一台装有Nvidia显卡和驱动的机器上&#xff0c;用nvidia-smi命令查看显卡所支持cuda版本 第二步&#xff1a; 到Nvidia官网下载CUDA Toolkit并安装&#xff0c;CUDA Toolkit Archive | NVIDIA Developer 安装时按提示下一步即可&#xff0c;安装完成用 …...

HTML5大作业三农有机,农产品,农庄,农旅网站源码

文章目录 1.设计来源1.1 轮播图页面头部效果1.2 栏目列表页面效果1.3 页面底部导航效果 2.效果和源码2.1 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…...

Spark的动态资源分配算法

文章目录 前言基于任务需求进行资源请求的整体过程资源申请的生成过程详解资源申请的生成过程的简单例子资源调度算法的代码解析 申请资源以后的处理&#xff1a;Executor的启动或者结束对于新启动的Container的处理对于结束的Container的处理 基于资源分配结果进行任务调度Pen…...

Python 爬虫技术 第06节 HTTP协议与Web基础知识

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是用于从Web服务器传输超文本到本地浏览器的传输协议。它是互联网上应用最为广泛的一种网络协议&#xff0c;几乎所有的网页数据都是通过HTTP协议进行传输的。下面&#xff0c;我将结合一个简单的Python案例来详细讲解…...

js | 原型链

为什么前者会输出Lucas 后者不会&#xff1f;call动作具体干了什么? http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ function Foo(){this.bar"Lucas" } let obj{}; obj.__proto__Foo.prototype; Foo.call(obj) console.log(obj.bar); // 输出Lucas/…...

Volatility:分析MS10-061攻击

1、概述 # 1&#xff09;什么是 Volatility Volatility是开源的Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android的内存取证分析工具。基于Python开发而成&#xff0c;可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…...

水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)

水表数字识别3&#xff1a;Pytorch CRNN实现水表数字识别(含训练代码和数据集) 目录 水表数字识别3&#xff1a;Pytorch CRNN实现水表数字识别(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 5. 水表数字识别模型训…...

oracle数据文件损坏和误删dbf文件处理方法

加油&#xff0c;新时代打工人&#xff01; 打开sqlplus sqlplus> “/as sysdba” &#xff08;命令行登录sqlplus&#xff09; SQL>shutdown abort; &#xff08;关闭oracle数据库服务器&#xff09; SQL>startup mount ;&#xff08;挂载oracle数据库&#xff0c;这…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...