当前位置: 首页 > news >正文

BigEvent项目后端学习笔记(二)文章分类模块 | 文章分类增删改查全流程解析(含优化)

📖 模块概述

  • 文章分类模块包括 新增文章分类、文章分类列表、获取文章分类详情、更新文章分类、删除文章分类 功能。
  • 本篇对于原项目进行了代码优化,将原先写在 Controller 层的业务逻辑代码迁移至了 Service 层。

🛠️ 技术实现要点

  • 分组校验
    • 定义分组:在实体类内部定义接口
    • 对校验项进行分组:通过 groups 属性指定
    • 校验时指定分组:给 @Validated 注解的 value 属性赋值
    • 校验项默认属于:Default 分组

⚙️ 各层职责与代码规范

🔗 Controller 层

@RestController
@RequiredArgsConstructor
@RequestMapping("/category")
public class CategoryController {
	...
}

🔗 Service 层

public interface CategoryService {
	...
}
@Service
@RequiredArgsConstructor
public class CategoryServiceImpl implements CategoryService {
	...
}

🔗 Mapper 层

@Mapper
public interface CategoryMapper {
	...
}

🔗 层间交互与依赖注入

@Service
@RequiredArgsConstructor
public class CategoryServiceImpl implements CategoryService {
	private final CategoryMapper categoryMapper;
	...
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/category")
public class CategoryController {
    private final CategoryService categoryService;
    ...
}

🔍 功能实现详解

🎯 新增文章分类

🧩 Controller 层

请求路径:/category
请求方式:POST
接口描述:该接口用于新增文章分类

@PostMapping
public Result addCategory(@RequestBody @Validated(Category.Add.class) Category category) {
    categoryService.addCategory(category);
    return Result.success();
}

🧩 Service 层

  • 接口
// 新增分类
void addCategory(Category category);

// 根据分类名称查询分类信息
Category findCategoryByName(String categoryName);

// 根据分类别名查询分类信息
Category findCategoryByAlias(String categoryAlias);
  • 实现
/**
 * 添加分类
 *
 * @param category 分类对象
 */
@Override
public void addCategory(Category category) {
    // 补充属性值
    category.setCreateTime(LocalDateTime.now());
    category.setUpdateTime(LocalDateTime.now());

    Map<String, Object> map = ThreadLocalUtil.get();
    Integer userId = (Integer) map.get("id");
    category.setCreateUser(userId);

    // 判断分类名称是否已存在
    Category categoryByName = findCategoryByName(category.getCategoryName());
    if (categoryByName != null) {
        throw new RuntimeException("分类名称已存在");
    }
    // 判断分类别名是否已存在
    Category categoryByAlias = findCategoryByAlias(category.getCategoryAlias());
    if (categoryByAlias != null) {
        throw new RuntimeException("分类别名已存在");
    }
    categoryMapper.addCategory(category);
}

/**
 * 根据分类名称查询分类对象
 *
 * @param categoryName 分类名称
 * @return 分类对象
 */
@Override
public Category findCategoryByName(String categoryName) {
    return categoryMapper.findCategoryByName(categoryName);
}

/**
 * 根据分类别名查询分类对象
 *
 * @param categoryAlias 分类别名
 * @return 分类对象
 */
@Override
public Category findCategoryByAlias(String categoryAlias) {
    return categoryMapper.findCategoryByAlias(categoryAlias);
}

Mapper 层

// 新增文章分类
@Insert("insert into category(category_name, category_alias, create_user, create_time, update_time) " +
        "values(#{categoryName}, #{categoryAlias}, #{createUser}, #{createTime}, #{updateTime})")
void addCategory(Category category);

// 根据分类名称查询分类
@Select("select * from category where category_name = #{categoryName}")
Category findCategoryByName(String categoryName);

// 根据分类别名查询分类
@Select("select * from category where category_alias = #{categoryAlias}")
Category findCategoryByAlias(String categoryAlias);

🎯 文章分类列表

🧩 Controller 层

请求路径:/category
请求方式:GET
接口描述:该接口用于获取当前已登录用户创建的所有文章分类

@GetMapping
public Result<List<Category>> getCategoryList() {
    List<Category> categoryList = categoryService.getCategoryList();
    return Result.success(categoryList);
}

🧩 Service 层

  • 接口
// 列表查询
List<Category> getCategoryList();
  • 实现
/**
 * 查询分类列表
 *
 * @return 分类列表
 */
@Override
public List<Category> getCategoryList() {
    Map<String, Object> map = ThreadLocalUtil.get();
    Integer userId = (Integer) map.get("id");
    return categoryMapper.getCategoryList(userId);
}

🧩 Mapper 层

// 查询某用户的所有文章分类
@Select("select * from category where create_user = #{userId}")
List<Category> getCategoryList(Integer userId);

🎯 获取文章分类详情

🧩 Controller 层

请求路径:/category/detail
请求方式:GET
接口描述:该接口用于根据ID获取文章分类详情

@GetMapping("/detail")
public Result<Category> getCategoryDetail(Integer id) {
    Category category = categoryService.findCategoryById(id);
    return Result.success(category);
}

🧩 Service 层

  • 接口
// 根据 id 查询分类信息
Category findCategoryById(Integer id);
  • 实现
/**
 * 根据id查询分类对象
 *
 * @param id 分类id
 * @return 分类对象
 */
@Override
public Category findCategoryById(Integer id) {
    Category category = categoryMapper.findCategoryById(id);
    return category;
}

🧩 Mapper 层

// 根据 id 查询文章分类
@Select("select * from category where id = #{id}")
Category findCategoryById(Integer id);

🎯 更新文章分类

🧩 Controller 层

请求路径:/category
请求方式:PUT
接口描述:该接口用于更新文章分类

@PutMapping
public Result updateCategory(@RequestBody @Validated(Category.Update.class) Category category) {
    categoryService.updateCategory(category);
    return Result.success();
}

🧩 Service 层

  • 接口
// 更新文章分类
void updateCategory(Category category);
  • 实现
/**
 * 修改分类
 *
 * @param category 分类对象
 */
@Override
public void updateCategory(Category category) {
    category.setUpdateTime(LocalDateTime.now());
    categoryMapper.updateCategory(category);
}

🧩 Mapper 层

@Update("update category " +
        "set category_name = #{categoryName}, category_alias = #{categoryAlias}, update_time = #{updateTime} " +
        "where id = #{id}")
void updateCategory(Category category);

🎯 删除文章分类

请求路径:/category
请求方式:DELETE
接口描述:该接口用于根据ID删除文章分类

🧩 Controller 层

@DeleteMapping
public Result deleteCategory(Integer id){
    categoryService.deleteCategoryById(id);
    return Result.success();
}

🧩 Service 层

  • 接口
// 删除文章分类
void deleteCategoryById(Integer id);
  • 实现
/**
 * 根据id删除分类
 *
 * @param id 分类id
 */
@Override
public void deleteCategoryById(Integer id) {
    categoryMapper.deleteCategoryById(id);
}

🧩 Mapper 层

@Delete("delete from category where id = #{id}")
void deleteCategoryById(Integer id);

相关文章:

  • 3.milvus索引-HNSW
  • SpringBoot集成Flyway
  • java八股文之并发编程
  • JSON Web Token (JWT) 完整指南
  • 决策树调参技巧
  • 数据库操作练习
  • 计算机网络——物理层设备
  • 深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法
  • Unity-AI-Deepseek生成的生成模型代码
  • 内存取证之windows-Volatility 3
  • SQL Optimization
  • uboot 编译过程
  • 蓝桥杯贪心
  • js逆向之断点调试和python补环境
  • Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!
  • [c语言日寄]数据输出
  • 【FPGA开发】Cordic原理推导、Xilinx PG105手册解读
  • 【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解
  • 一文读懂Python之json模块(33)
  • ABAP Core Data Services (SAP PRESS) (First Edition)
  • 商务部:今年前3月自贸试验区进出口总额达2万亿元
  • 外交部介绍对巴西、阿根廷、智利、秘鲁、乌拉圭等5国试行免签政策
  • “三个集中”之后:图说浦东新区28次撤乡并镇
  • 泽连斯基:正在等待俄方确认参加会谈的代表团组成
  • 为何选择上海?两家外企提到营商环境、人才资源……
  • “远践”项目启动公益生态圈,上海青少年公益力量蓬勃生长