第25周JavaSpringboot实战-电商项目 4.商品分类管理

商品分类模块开发笔记

模块功能概述

  • 实现分类数据的 增删改查 功能
  • 核心难点:
    • 分类的父子级目录结构
    • 递归实现多级分类查找
    • 列表展示顺序控制(从父级向子级递归)

接口说明

后台接口

1. 添加分类
  • 请求地址: /admin/category/add

  • 请求方法: POST

  • 参数:

    参数名类型说明
    nameString分类名称(如:新鲜水果)
    typeInt分类层级(1-3级)
    parentIdInt父级ID(0表示无父级)
    orderNumberInt同级目录排序号
  • 示例请求:

{
  "name": "进口水果",
  "type": 2,
  "parentId": 1,
  "orderNumber": 2
}
2. 更新分类
  • 请求地址: /admin/category/update
  • 请求方法: POST
  • 参数:
    • 包含id字段用于指定要修改的分类
    • 其他参数与添加接口相同
3. 删除分类
  • 请求地址: /admin/category/delete
  • 请求方法: POST
  • 参数:
    参数名类型说明
    idInt分类ID
4. 分类列表(平铺分页)
  • 请求地址: /admin/category/list
  • 请求方法: GET
  • 参数:
    参数名类型说明
    pageNumberInt当前页码
    pageSizeInt每页显示条数

前台接口

递归分类列表
  • 请求地址: /category/list
  • 请求方法: GET
  • 响应结构:
{
  "code": 200,
  "message": "成功",
  "data": [
    {
      "id": 1,
      "name": "新鲜水果",
      "childCategory": [
        {
          "id": 2,
          "name": "进口水果",
          "childCategory": [
            {
              "id": 3,
              "name": "车厘子"
            }
          ]
        }
      ]
    }
  ]
}

数据库设计

表名: category

字段名类型说明
idint(11)主键ID
namevarchar(64)分类名称
typeint(11)分类层级(1-3级)
parent_idint(11)父级分类ID
order_numberint(11)排序号
create_timedatetime创建时间
update_timedatetime最后更新时间

关键实现点

  1. 递归查询算法

    • 通过parent_id字段建立层级关系
    • 使用深度优先搜索实现树形结构构建
  2. 排序控制

    • 同级分类通过order_number字段排序
    • 层级间展示顺序为父级->子级
  3. 层级校验

    • 新增分类时校验层级不超过3级
    • 更新操作时防止循环引用

商品分类模块开发笔记 - 接口实现篇

Controller层实现

1. 创建Controller

@RestController
public class CategoryController {

    @Autowired
    private CategoryService categoryService;
    
    @Autowired
    private UserService userService;
}

2. 添加分类接口实现

@PostMapping("/admin/category/add")
@ResponseBody
public ApiRestResponse addCategory(HttpSession session,
                                  @RequestBody AddCategoryRequest addCategoryRequest) {
    // 参数校验
    if (addCategoryRequest.getName() == null 
        || addCategoryRequest.getType() == null
        || addCategoryRequest.getParentId() == null
        || addCategoryRequest.getOrderNumber() == null) {
        return ApiRestResponse.error(ExceptionEnum.PARAM_NOT_NULL);
    }

    // 用户登录校验
    User currentUser = (User) session.getAttribute(UserConstant.LOGIN_USER);
    if (currentUser == null) {
        return ApiRestResponse.error(ExceptionEnum.NEED_LOGIN);
    }

    // 管理员权限校验
    boolean isAdmin = userService.checkAdminRole(currentUser);
    if (!isAdmin) {
        return ApiRestResponse.error(ExceptionEnum.NEED_ADMIN);
    }

    // 创建分类对象
    Category category = new Category();
    BeanUtils.copyProperties(addCategoryRequest, category);
    
    // 调用Service层
    return categoryService.addCategory(category);
}

请求参数对象设计

public class AddCategoryRequest {
    private String name;
    private Integer type;
    private Integer parentId;
    private Integer orderNumber;

    // Getter & Setter
    // Lombok @Data 注解可替代
}

校验机制说明

1. 参数校验策略

  • 必要性校验:所有必要字段的非空检查
  • 安全校验:使用独立Request对象防止额外字段注入
  • 层级校验:通过type字段控制分类层级(1-3级)

2. 权限校验流程

失败
成功
未登录
已登录
非管理员
管理员
请求入口
参数校验
返回参数错误
登录状态
返回登录提示
管理员校验
返回权限不足
执行添加操作

IntelliJ IDEA 调试技巧课程笔记

目录

  1. 断点统一开关
  2. 条件断点
  3. 单步调试
  4. 表达式求值

1. 断点统一开关

  • 场景:项目存在大量断点时快速禁用/启用
  • 操作
    • 点击左侧工具栏的「断点开关按钮」
    • 红色断点变灰表示全部失效
  • 特点:一键管理所有断点状态

2. 条件断点

  • 设置方法
    1. 右键点击目标断点
    2. 选择 Condition
    3. 输入布尔表达式(自动生效)
  • 典型场景
    map != null      // 对象非空时触发
    i == 0           // 循环变量过滤
    
  • 标识:带问号图标的断点

3. 单步调试

操作按钮功能描述
Step Into(F7)进入当前方法内部
Step Over(F8)执行当前行并跳到下一行
Step Out(Shift+F8)跳出当前方法返回调用处

4. 表达式求值

  • 调用方式
    • 调试时点击 Evaluate Expression 按钮
    • 或使用快捷键 Alt + F8
  • 功能特点
    • 实时查看任意变量值
    • 执行自定义代码片段
    • 支持对象属性/方法探查
使用示例
// 查看循环变量
i → 显示当前值(如:2// 查看Mapper对象
categoryMapper → 展开查看内部结构

// 执行简单运算
list.size() + 5 → 显示计算结果

最佳实践:结合条件断点和表达式求值,可在复杂循环/嵌套调用中精准定位问题

### 创建2024 Java Spring Boot 实战项目的示例 #### 使用Spring Initializr在线生成项目结构 访问 https://start.spring.io/ 在线生成项目结构,选择合适的Java版本、打包类型(Maven或Gradle)以及需要的Spring Boot starter依赖[^1]。 下载生成的项目压缩包后解压,导入到IDEA或Eclipse等开发工具中。这一步骤确保了基础环境搭建完成并准备好进一步开发。 #### 主启动类配置 主启动类是一个标准的Spring Boot应用程序入口点: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这段代码展示了如何通过`@SpringBootApplication`注解来简化配置,并调用`run`方法启动应用实例。 #### 添加功能模块 为了使该项目更贴近实际应用场景,在此提供几个常见的扩展方向及其对应的starter dependencies: - **RESTful Web服务**: `spring-boot-starter-web` REST API允许客户端与服务器之间交换数据。可以构建资源导向的服务端接口供前端或其他微服务调用。 - **数据库集成 (MySQL)**: `spring-boot-starter-data-jpa`, `mysql:mysql-connector-java` 利用JPA实现对象关系映射,方便操作关系型数据库中的表单记录;而MySQL驱动则用于连接特定类型的SQL数据库。 - **安全认证机制**: `spring-boot-starter-security` 提供开箱即用的安全特性,包括但不限于登录验证、权限控制等功能。 #### 数据库实体类设计 假设要管理用户信息,则可定义如下Entity Bean: ```java @Entity @Table(name="users") public class User { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @Column(nullable=false, unique=true) private String username; // Getters and Setters... } ``` 这里使用了Hibernate框架下的注解来描述持久化属性和行为。 #### 控制器层编写 接下来为上述User Entity创建相应的Controller以便处理HTTP请求: ```java @RestController @RequestMapping("/api/users") public class UserController { @Autowired UserService userService; @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable(value = "id") Long userId){ Optional<User> userOpt = userService.findById(userId); if (!userOpt.isPresent()){ return new ResponseEntity<>(HttpStatus.NOT_FOUND); } return new ResponseEntity<>(userOpt.get(), HttpStatus.OK); } // More CRUD operations... } ``` 该控制器负责接收来自客户端API调用并将它们转发给业务逻辑组件进行处理。 #### 测试与部署 最后不要忘记单元测试和服务发布环节。对于前者来说JUnit配合Mockito模拟外部依赖非常适合做白盒检验工作;至于后者Docker容器技术加上Kubernetes集群编排能够极大提高运维效率和支持弹性伸缩能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值