# springboot-quicky **Repository Path**: htboy/springboot-quicky ## Basic Information - **Project Name**: springboot-quicky - **Description**: springboot jwt redis 认证后台登入 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-21 - **Last Updated**: 2025-01-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Getting Started ### 1、环境 * springBoot3.x * jdk17 * mysql5.7以上 * redis4.0以上 mysql-connector-j 数据库连接 mybatis数据层 validation对接口参数进行校验 pagehelper分页插件 ### 2、实体+注解校验参数 ``` @NotNull(groups =Update.class) private Integer id;// 'ID', @NotEmpty @Pattern(regexp="^\\S{1,100}$") private String title;//'文章标题', @NotEmpty private String content;//'文章内容', private Integer createUser;//'创建人id', @NotNull @URL//必须符合url形式才行 private String coverImg;// '文章封面', @State //针对类型 性别 特性之类的自定义注解 private String state;// '已发布或草稿', @NotNull private Integer categoryId;// '分类id', @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //日期格式输出 private Date createTime;// '创建时间', @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") //日期格式输出 private Date updateTime;//'更新时间', private String categoryName; /** * 检验分组:方便区别哪个方法不用校验哪些参数 * 不添加分组就是默认不管是新增还是修改都要校验 * 前提是在调用的方法中加上@Validated,如:@Validated(Category.Update.class),表明只有在update组中才会校验这个参数是否有值 */ public interface Add extends Default {} public interface Update extends Default{} ``` ### 自定义注解 ``` @Documented//元注解 @Target({ElementType.FIELD})//元注解,在哪里使用,方法还是类 @Constraint(validatedBy = SateValidation.class)//指定提供校验规则的类,是自定义规则的类 @Retention(RetentionPolicy.RUNTIME)//元注解,使用到什么时候 public @interface State { //提供校验失败后的提示值 String message() default "state的值只能是:'已发布'或者'草稿'"; //指定分组 Class[] groups() default {}; //负载,获取到State注解的附加信息 Class[] payload() default {}; } public class SateValidation implements ConstraintValidator {...} ``` ### 3、Mapper,简单sql操作直接编写接口上, ``` @Mapper//@Repository、@Service、@Controller、@Component添加注解扫描以便交付spring容器管理 public interface ArticleMapper { /** * 添加新的文章 * @param article */ @Insert("insert into article (title,content,create_user,cover_img,state,category_id,create_time,update_time)" + " values(#{title},#{content},#{createUser},#{coverImg},#{state},#{categoryId},#{createTime},#{updateTime})") void add(Article article); /** * 查询列表数据 * @param article * @return */ List
list(Article article); /** * 更新文章 * @param article */ @Update("update article set title =#{title},content=#{content},state=#{state},create_user=#{createUser},cover_img=#{coverImg}" + ",category_id=#{categoryId},update_time=#{updateTime} where id=#{id}") void update(Article article); /** * 更新状态 * @param id * @param state */ @Update("update article set state=#{state} where id=#{id}") void updateState(Integer id, String state); @Delete("delete from article where id=#{id}") void delete(Integer id); } ``` ### 4、Controller传参校验 ``` /** * 更新文章 * @param article @Validated(Article.Update.class) Article article 更新时校验参数id,其他的参数在其它方法都要校验 * @return */ @PutMapping("/update") public Result update(@RequestBody @Validated(Article.Update.class) Article article){ articleService.update(article); return Result.success("更新成功"); } /** * 更新状态 @Validated(Article.Update.class) Integer id 更新时校验参数id,其他的参数在其它方法都要校验 * @param id * @param state * @return */ @PutMapping("/updateState") public Result updateState(@Validated(Article.Update.class) Integer id,@Validated(Article.Update.class)String state){ articleService.updateState(id,state); return Result.success("更新成功"); } ``` ### 5、工具类 * 使用jwt生成token,传入用户名与用户id * 暂时使用MD5加密密码,开始使用,后期可换成国密SM2\SM3\SM4 或者 RSA与AES结合 * redis存储token,默认2小时 * 统一返回数据格式: Result * 当前线程存储当前登入者用户名与id:ThreadLocalUtil * 统一错误返回: GlobalExceptionHandler * 统一分页格式:PageBean ### 6、登录TestUserController 登录不做拦截,登录成功后,将生的token返回,并同时存储到redis中,默认两小时 ### 7、拦截器LoginInterceptor 在拦截器中校验每次请求是否带有token(注册,登录方法不用校验),并将用户信息存储到当前线程中,否则错误时统一返回401信息 ### 8、WebConfig配置 加入拦截器对象,并释放不需要校验的请求路径,同时配置允许跨域请求