模块结构 & 分层说明

image

 这是一个典型的 Java 项目(基于 Maven/Gradle 结构),属于 sky-merchant 工程里的菜品模块(围绕菜品业务开发),遵循常见的 MVC 分层架构 设计。下面拆解每个包 / 类的作用,以及它们的关联关系:

1. 模块结构 & 分层说明

整体是标准的 Spring Boot 项目结构(也可能是普通 Java Web 项目,但分层逻辑通用),核心分 4 层:
  • controller:控制层(接收请求、返回响应)
  • domain:领域模型层(实体类,映射数据库表 / 业务对象)
  • mapper:数据访问层(操作数据库,MyBatis 常用)
  • service:业务逻辑层(处理复杂业务流程)
目标:围绕「菜品(Dish)」相关的 增删改查、业务逻辑 开发,比如 “查询菜品列表”“新增菜品”“修改菜品口味” 等功能。

2. 每个文件 / 包的作用

(1)controller/DishController.java

  • 作用:
    • 作为 控制层,负责接收前端(或其他服务)的 HTTP 请求(GET/POST 等)。
    • 调用 service 层完成业务逻辑,再返回 JSON 响应给前端。
    • 典型职责:参数校验、请求转发、统一响应封装。
  • 关键代码示例(伪代码):
    java
     
    运行
    @RestController
    @RequestMapping("/dish")
    public class DishController {
        @Autowired
        private IDishService dishService;
    
        // 示例:查询菜品列表
        @GetMapping("/list")
        public Result<List<Dish>> list(DishQueryDTO dto) {
            List<Dish> dishList = dishService.list(dto);
            return Result.success(dishList); // 返回给前端
        }
    
        // 示例:新增菜品
        @PostMapping
        public Result save(@RequestBody Dish dish) {
            dishService.save(dish);
            return Result.success();
        }
    }

(2)domain/Dish.java & DishFlavor.java

  • 作用:
    • Dish:菜品主表实体类,映射数据库的 dish 表(字段对应:菜品名称、价格、状态等)。
    • DishFlavor:菜品口味实体类,映射数据库的 dish_flavor 表(字段对应:菜品 ID、口味名称、是否默认等)。
    • 通常配合 ORM 框架(MyBatis/MyBatis-Plus),实现 “对象 ↔ 数据库表” 的映射。
  • 关键代码示例(伪代码):
    java
     
    运行
     
    // Dish.java
    @Data
    @TableName("dish") // 假设用 MyBatis-Plus
    public class Dish {
        private Long id;         // 菜品 ID
        private String name;     // 菜品名称
        private BigDecimal price;// 价格
        private Integer status;  // 状态(0:停售 1:在售)
        // ... 其他字段(分类 ID、描述、图片等)
    }
    
    // DishFlavor.java
    @Data
    @TableName("dish_flavor")
    public class DishFlavor {
        private Long id;         // 口味 ID
        private Long dishId;     // 关联的菜品 ID
        private String name;     // 口味名称(如“微辣”“不辣”)
        private Integer isDefault;// 是否默认口味
    }
    
     

(3)mapper/DishMapper.java

  • 作用:
    • 作为 数据访问层,定义 SQL 操作接口(MyBatis 核心)。
    • 直接操作数据库,实现 “菜品表” 的增删改查(比如 selectList insert update 等)。
    • 通常和 XML 文件(DishMapper.xml,可能在 resources 里)配合,写具体的 SQL。
  • 关键代码示例(伪代码):
    java
     
    运行
     
    @Mapper // 标记为 MyBatis Mapper
    public interface DishMapper {
        // 示例:根据条件查询菜品列表
        List<Dish> selectByCondition(DishQueryDTO dto);
    
        // 示例:新增菜品(返回自增 ID)
        @Insert("insert into dish(name, price, status) values(#{name}, #{price}, #{status})")
        @Options(useGeneratedKeys = true, keyProperty = "id")
        int insert(Dish dish);
    }
    
     

(4)service/IDishService.java & impl/DishServiceImpl.java

  • 作用:
    • IDishService:业务接口,定义菜品相关的业务方法(比如 list save updateStatus 等),规范业务行为。
    • DishServiceImpl:接口实现类,负责编写具体的 业务逻辑(比如校验参数、调用 mapper 操作数据库、处理复杂流程)。
  • 关键代码示例(伪代码):
    java
     
    运行
     
    // IDishService.java(接口)
    public interface IDishService {
        List<Dish> list(DishQueryDTO dto); // 查询菜品列表
        void save(Dish dish);              // 新增菜品
        void updateStatus(Integer status, List<Long> ids); // 批量修改状态
    }
    
    // DishServiceImpl.java(实现类)
    @Service
    public class DishServiceImpl implements IDishService {
        @Autowired
        private DishMapper dishMapper;
        @Autowired
        private DishFlavorMapper dishFlavorMapper; // 假设有关联口味 Mapper
    
        @Override
        public List<Dish> list(DishQueryDTO dto) {
            // 1. 可能做一些业务校验(如参数判空)
            // 2. 调用 Mapper 查询数据库
            return dishMapper.selectByCondition(dto);
        }
    
        @Override
        public void save(Dish dish) {
            // 1. 新增菜品主表
            dishMapper.insert(dish);
            // 2. 新增关联的口味(假设 dish 里包含 flavor 集合)
            List<DishFlavor> flavors = dish.getFlavors();
            if (CollectionUtils.isNotEmpty(flavors)) {
                flavors.forEach(flavor -> {
                    flavor.setDishId(dish.getId()); // 关联菜品 ID
                    dishFlavorMapper.insert(flavor);
                });
            }
        }
    }

3. 模块间的关联关系

流程遵循 “前端请求 → Controller → Service → Mapper → 数据库 → 反向返回”,以 “新增菜品” 为例:

 

  1. 前端调用:
    发送 POST /dish 请求,携带菜品信息(名称、价格、口味等)。
  2. DishController 接收:
    解析请求参数到 Dish 对象,调用 dishService.save(dish)
  3. DishServiceImpl 处理:
    • 先调用 dishMapper.insert(dish),往 dish 表插入主数据(获取自增 ID)。
    • 再遍历 dish.getFlavors(),调用 dishFlavorMapper.insert(flavor),往 dish_flavor 表插入口味数据(关联菜品 ID)。
  4. DishMapper 操作数据库:
    执行 XML 里的 insert SQL,完成数据写入。
  5. 返回响应:
    从 Service 到 Controller,最终返回 JSON 给前端(如 {"code": 200, "msg": "新增成功"})。

4. 总结

  • 分层职责清晰:
    • Controller 管 “请求 / 响应”,Service 管 “业务逻辑”,Mapper 管 “数据库操作”,domain 管 “数据结构”。
  • 协作流程闭环:
    前端(或其他服务)→ Controller → Service → Mapper → 数据库,反向同理。
  • 典型应用:
    这套结构常用于 餐饮系统(比如 “sky-merchant” 可能是 “商家端系统”,管理菜品、订单、库存等),你可以基于此扩展更多功能(如菜品分类、起售停售、口味管理)。
如果项目里有 DishFlavorMapper(当前截图没展示,但业务里大概率有),逻辑会更完整(关联菜品和口味表)。需要进一步扩展的话,可以补充 resources 里的 XML 映射文件、单元测试类等~

 

posted @ 2025-07-26 16:22  舒然  阅读(34)  评论(0)    收藏  举报