目录
概要
2024年10月黑马程序员大事件项目
整体架构流程
。
技术栈
- Springboot
- Mybatis
- redis(登录优化)
- JWT(登录验证)
- validation
模块分化
- 用户模块
- 文章类型模块
- 文章模块
用户模块

注册功能:
controller层

@Pattern校验参数确保username和password为5到16位
判断用户是否占用,把service方法查找的username赋值给u,判断u是否存在,为空则可以创建,否则用户名被占用
service层

将Password进行加密处理
mapper运用add方法
mapper层

注意这里的password为md5加密过后的密文
登录功能:
controller层:

登录模块直接在controller层完成,先查找username是否存在,后判断密码是否正确:先在条件中把password进行加密处理,用.equals()进行比较确认,后进行JWT令牌制作,获取id username加入claims,将claims制作成token令牌,顺便将token存储到redis中,设定redis中的令牌过期时间
获取用户详细信息:
controller:

从请求头的token中,获取到数据,后面将获取的数据放到map集合中,在从map中的username键获得值,强转成String格式,通过这个username查询当前用户详细信息
service:

传递用户名
mapper:

更新用户基本信息:
controller:

数据更新,要加 @Validated 进行数据校验 @RequestBody来接收实体user(前提是有user类,接收数据多的时候用这个方法)
service:

增加更新时间
mapper:
更新用户头像:
controller:
@RequestParam 是从 request 里面获取参数值,即这种风格的 url: http://localhost:8080/user?id=1 。 @URL规定参数为url风格
service:
获取更新用户的用户ID(从token里面获取ID,因为更新 的是本用户的头像,所以token不变,就不用再从request里面再加一个id),记得从map里强转成int,后面传递参数
mapper:
更新用户密码:
controller:
@RequestBody 存储为map集合类型 的params里面,后面命名3个变量
if验证变量是否为空
从token里面获得当前用户的用户名,通过这个用户名调用findbyusername方法获得数据存入loginuser中
从loginuser里面get password后用.equals()比较加密后的old密码是否相等,不相等返回信息

验证变量repwd是否和newpwd相等,不相等返回错误(分开验证三个变量是否相等,允许3个相等)
service:
传递新密码参数,并且从token中获取id,后面将新密码加密传给mapper
mapper:
文章类型模块
新增文章分类
controller:
分组校验后面讲
service:
补充创建时间和更新时间
强转获取id,直接set创建用户的id
mapper:
文章分类列表
controller:
定义泛型对象List<Category> 调用list()方法 返回cs
service:
获取id
mapper:
根据用户id查询用户所创建的文章分类 (注意:每个用户的文章分类和文章根据userid区别开)
获取文章分类 详情
controller:
根据id查询数据,返回c
service:

传递id ,返回c
mapper:
更新文章分类
controller:
service:
mapper:
删除文章分类
controller:

service:
mapper:
文章管理模块
新增文章
controller
service
mapper
文章列表(条件分页)
controller
返回pagebean类型的article pb
service
业务逻辑层创建pb对象封装分页数据
增加pagehelper坐标,后开启分页功能
从token获取用户id后调用list方法获取数据到as
将as数据赋值给p对象(强转为page)
填充数据到pb,返回pb值
mapper(xml方式)


路径需要相对
获取文章详情
controller

service
mapper
更新文章
controller
service
mapper
删除文章
controller
service
mapper
统一响应结果

分组数据校验




分组情形:add的时候id自动创建,但是update的时候id不能为NULL,则需要分组校验
创建interfacce 名 然后在注解上加(groups=名.class)则分组成功
简化,因为没有分组的注解属于default,将add继承default,和update继承default,则可以默认全部分组
然后在controller中,的@Validation后面加上(Category.Update.class)则指定这个组的注解生效,即@NOTNULL生效,不指定,则不生效。
全局异常处理

注意:这个处理为全局处理,因为对象的参数为(Exception e)即所有的异常都被这个对象捕捉
JWT身份验证

引进依赖jwt,这个是工具类,
这个为令牌过期时间
genToken为生成token,parseToken为解析token,出现异常即token有问题。
拦截器与redis登录优化
逻辑,一个用户每进入一个页面都要验证token,所以用拦截器拦截用户验证用户携带的token是否正确,除了拦截登录和注册页面。

从请求头中获取token,通过try catch验证token是否出现异常,期间将token存储到redis中,加入if语句来判断redis中的token是否为空,是则抛出异常
期间将token存放到threadlocal中,方便后面获取业务数据。


注册拦截器
redis登录优化原理
在登录的时候就将token存进redis里面

这是redis里面存的operations泛型<>键值对
然后在拦截器里面
如图所示:
能用浏览器的token在最新的键值对里面获取到值就说明token是最新的,而不是旧的token
防止修改密码重新登录后,旧的token仍然可以使用的问题。
自定义注解(数据校验)

先创建



修改validatedBy 指向我们新建的提供校验规则的类

这个类需要继承ConstraintValidator接口并重写isValid方法,后面在这个方法中写你的校验规则即可。
ThreadLocal
可以用来多线程存储静态的数据,可以简化获取数据操作
比如将token存储到theadlocal里面,可以用
Map<String,Object> map = ThreadLocalUtil.get();获取数据,并且
Integer userId =(Integer) map.get("id");可以强转为你需要的数据,在项目里是可以获取当前用户的id username。
而且,可以多线程,用户一与用户二互不干扰。
阿里云OSS文件上传
首先引入阿里云工具类
然后修改
这三个变量,
之后建立controller

即可实现文件上传。

2393

被折叠的 条评论
为什么被折叠?



