三更app是啥软件(三更Blog项目总结(p1~p40))
视频地址:SpringBoot项目实战-前后端分离博客项目-Java项目_哔哩哔哩_bilibili
项目创建——多模块开发
整个系统分为前台模块(blog)和后台模块(admin) ,前端已给好 ,我们只需好些两套后端系统即可 。
多模块开发:
我们并不是直接在Blog模块(父模块)下直接开发,还是根据需求分为了前台模块和后台模块
但是两个模块很多代码和功能都是有重复的 ,就比如一些pom依赖 ,逻辑代码接口 ,统一的工具类 ,响应类等等 ,要是两个模块都这样写 ,那就造成了代码的大量重复冗余!
为此我们给父模块再创建一个模块 ,这个模块作为工作模块(framework公共子模块) ,让blog和admin模块享有它的资源 ,公共的代码 、类 、pom依赖等放在framework模块下,blog和admin模块到时自己特定的功能代码或者依赖等等 ,在自己放在自己的模块下即可 ,这样很多公共的代码就可以复用了!,那么我们主项目Blog下的src目录就可以删除去了 。
一个父模块三个子模块 ,通过maven的多模块管理建立关系 ,子模块共享(继承)父模块的pom(公共pom)依赖,子模块开发特定功能在特定添加pom依赖即可
主模块pom依赖:
<groupId>com.lwt</groupId> <artifactId>lwtBlog</artifactId> <packaging>pom</packaging> <version>0.0.1-SNAPSHOT</version> <!-- 管理子模块--> <modules> <module>lwt-framework</module> <module>lwt-admin</module> <module>lwt-blog</module> </modules>其他三个子模块继承父模块:
<parent> <artifactId>lwtBlog</artifactId> <groupId>com.lwt</groupId> <version>0.0.1-SNAPSHOT</version> </parent>功能业务逻辑总结
热门文章列表
进入首页后 ,热门文章一栏展示热门文章:
要求:
文章必须是正常状态的 ,不能为草稿 不能是已经删除的文章 展示浏览量前10的文章 用户点击后可以跳转到相应的文章进行浏览功能逻辑总结(service层):
调用mapper层查询数据库 ,条件如下:
文章正常状态 文章未删除 我们要浏览量前10——根据浏览量进行降序排序自此我们就得到了满足条件的所有文章 ,但我们只要前十条——分页查询拿到前十条数据
封装成VO对象响应给前端(Bean拷贝 、用于操作集合的stream流等)
分类列表
需求:
用户查看分类信息时 ,展示存在的分类
注意分类的名称有文章信息确定 ,必须先通过文章表拿到对应的分类id才能通过这些id去分表表查询获取对应的分类名称!
功能逻辑总结(service层):
先去查询文章表 ,获取到所有文章的分类id
分类id必须是正常状态文章对应的分类id 拿到分类id集合后对其进行去重(stream流操作)然后拿着这些分类ids去查询分类表 ,拿到对应的分类集合
要求必须是正常状态的分类信息(stream流filter操作)封装为VO对象响应给前端
分页文章查询
需求:在首页或者点击相关的分类后 ,展示文章(相当于后台管理系统的数据显示)
由于都是文章查询然后显示,因此我们可以统一写在一个功能接口下!
文章会有很多不可能完全展示 ,因此分页查询是必须的 ,又因为我们统一写的一个接口,当你点击分类名称后要展示该分类下的文章 ,为此函数参数可以带有个分类id ,在分页查询时有则加入条件,无则不加即可。
要求:
只能展示正式发布的文章 置顶的文章优先展示功能逻辑总结(service层):
调用mapper查询数据库 根据前端请求的参数 ,有分类id则加入条件 文章为正常状态的文章 对应isTop字段进行降序排序(优先展示置顶文章) 分页查询 ,拿到文章信息集合 由于展示要有该文章对应的分类名称 ,而这个文章集合中只有分类id 在文章实体类加上分类名称字段 ,由于数据库表中没有该字段因此注解做标记 对文字集合进行操作 ,通过分类id查询到对应的分类名称 ,将其注入文章对象的成员属性 封装成VO对象响应给前端文章详情
需求:
要求在文章列表点击阅读全文时能够跳转到文章详情页面 ,可以让用户阅读文章正文 。
前端的请求会带有文章id过来 ,通过文章id查询数据库 ,拿到信息即可
功能逻辑总结(service层):
调用mapper通过id查询文章表,拿到该文章 文章详情也要展示分类名称 ,因此还要通过分类id去拿到分类名称 封装成VO对象响应给前端注意:
由于是get请求 ,且请求的URL中带有参数,因此在controller中 ,通过@PathVariable 是从一个url中拿到文章id给后台
@GetMapping("/{id}") public ResponseResult getArticleDetail(@PathVariable("id") Long id){ }友链查询
需求:友链展示 ,在友链页面要查询出所有的审核通过的友链 。
功能逻辑总结(service层):
调用mapper去友链表查询友链 必须为审核通过的 封装成VO对象返回给前端登录功能
SpringSecurity登录认证流程的实现!
登录流程:
功能逻辑总结(service层):
一 、登录
1 、自定义登录接口(LoginImpl)
调用ProviderManager的方法进行认证 将我们传入的(初始带有用户名和密码)的Authentication对象与security自行去UserDetailsService 的实现类由load..ByName方法通过用户名从数据库查询数据封装得到一个UserDetails对象(包含用户的信息和相关权限等),UserDetails对象通过PasswordEncoder(加密后比对)对比UserDetails和Authentication中的密码是否正确 ,最终返回一个完整的Authentication对象 自定义UserDetailsService 在这个实现类中去查询数据库 认证通过后 ,从完整的Authentication对象中拿到userId生成token 将用户信息存入redis 封装成VO对象响应给前端二 、校验
所有请求都先经过jwt认证过滤器!
定义Jwt认证过滤器链
获取(请求头)token
解析token获取userId
从redis中获取用户信息
存入上下文SecurityContextHolder(loginUser 、权限集合等)
修改SecurityConfig ,将这个过滤器加到security过滤器链的最前面!
核心:
自定义登录接口 实现UserDetail接口 ,用于从数据库查询用户信息 ,返回UserDetail接口的实现类——LoginUser 生成token 存入redis退出登录
既然你要退出登录 ,说明你现在是一个登录的状态 ,我们通过token获取相关信息即可 ,然后从redis中删除即可
由于函数并没有携带HttpRequest...除了从request对象获取token外 ,我们可以从上下文中获取(因为我们之前是先经过Jwt认证过滤器的了)
从上下文获取token解析拿到userId 从redis中删除对应信息 响应前端创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!