1. 更新用户基本信息
路由:
@PutMapping("/user/update")前端传递
nickname、email等字段封装到 DTO后端用
@Validated开启参数校验使用
ThreadLocal(或 JWT 拦截器)获取当前登录用户 IDService 层只更新该用户自己的信息,避免越权
2. 更新信息时的参数校验
DTO 中字段如
nickname、email上加@NotBlank、@EmailController 方法使用
@Validated @RequestBody出现校验异常时,统一由
@RestControllerAdvice全局异常处理器捕获,返回格式化错误信息
3. 更新用户头像(本地存储)
前端通过
FormData上传图片,后端用MultipartFile接收使用
UUID生成唯一文件名,保留原扩展名保存到本地固定目录(如
/upload/)把文件访问 URL 存入用户表
avatar字段
4. 修改用户密码
前端提交原密码 + 新密码
后端先通过用户 ID 查询出旧密码(MD5 加密)
使用工具类
DigestUtils.md5Hex()对比原密码验证通过则更新为新密码(同样 MD5 加密后存储)
5. 新增文章分类
路由:
@PostMapping("/category")接收 DTO(如
name、alias)对 DTO 使用
@Valid+ 分组@Validated校验字段不能为空Service 层调用 Mapper 插入数据库
返回
Result.success()
6. 查询分类列表
路由:
@GetMapping("/category")无需参数或带条件分页(可选)
Service 层调用 Mapper 查询
List<CategoryVO>VO 可使用
@JsonFormat格式化时间字段(如createTime、updateTime)
7. 获取分类详情
路由:
@GetMapping("/category/{id}")根据 URL 路径参数接收
idService 调用 Mapper 根据主键查询分类
返回前端用于回显
8. 修改文章分类
路由:
@PutMapping("/category")DTO 除了
name、alias还需带id启用分组校验(
@Validated(Update.class))Service 调用 Mapper 更新数据
返回
Result.success()
9. 分类新增/修改 + 分组校验
同一个 DTO 既可用于新增也可用于修改
使用分组接口区分校验规则:
```java
public interface Add {}
public interface Update {}
```
@NotNull(groups = Update.class)表示仅在更新时必须带idController 根据操作调用对应分组
10. 新增文章
路由:
@PostMapping("/article")前端提交
title、content、coverImg、categoryId、stateDTO 使用
@NotBlank、@NotNull、@URL、@Size限制长度、合法性自定义
@State校验字段只能是“已发布”或“草稿”Service 中自动填充
createUser(当前登录用户)、createTime调用 Mapper 插入文章表
11. 自定义注解 @State
新建注解
@State配套写校验器
StateValidation implements ConstraintValidator校验器逻辑:如果
state不在允许列表则抛异常在 DTO
state字段上加@State启用校验
12. 文章分页查询 + 条件查询
路由:
@GetMapping("/article")参数:
pageNum、pageSize、可选categoryId、stateService 中使用
PageHelper.startPage(pageNum, pageSize)Mapper 按条件动态 SQL 查询文章列表
返回封装好的
PageBean<ArticleVO>包含列表和总条数
13. 文件上传(本地)
路由:
@PostMapping("/upload")接收前端
FormData,参数名需一致使用
UUID生成唯一文件名避免覆盖file.transferTo(new File(uploadPath))存到本地返回访问 URL,前端可回显图片