大事件-nwh-后端部分项目总结

概要

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

即可实现文件上传。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值