第3组 · 李帆 · 第1次评审详情 - sebestp/coursewise GitHub Wiki

李帆 · 第1次评审详情(第3组 · 组员)

基本信息

  • 报告期次:第1次 | 报告日期:2026-10-08 | 项目组号:第3组 | 项目名称:在线购物系统

工作任务与成果物

  • 已完成工作:后端技术选型预研:确定 Java 17 + Spring Boot 3 + MyBatis-Plus + MySQL 8 技术栈,完成分层架构、核心数据模型、关键技术点与学习笔记
  • 成果物:后端技术选型说明 / 学习笔记

成果物 · 后端技术选型说明 / 学习笔记

后端技术选型说明 / 学习笔记
  • 项目名称:在线购物系统
  • 项目组号:第 3 组
  • 负责人(完成人):李帆
  • 版本:v1
  • 日期:2026-10-08
1. 目标与约束
  • 支撑需求规格说明书中的全部后端接口:卖家登录、商品发布、单件在售约束、意向提交与排队、状态机流转、历史查询。
  • 团队 Java 基础较好,要求框架生态成熟、上手快、与数据库集成方便。
  • 迭代 2 内必须产出可运行的后端骨架,并能对接前端联调。
  • 数据持久化用 MySQL,接口风格 RESTful。
2. 候选方案对比
维度 Spring Boot 3 + MyBatis-Plus Node.js + Express Python + FastAPI
团队匹配度 高(Java 基础好) 中(需学习 JS 异步) 中(需学 Python 生态)
数据库 ORM MyBatis-Plus,灵活、性能可控 Sequelize / Prisma SQLAlchemy
事务支持 声明式事务,成熟 需手动管理 需手动管理
生态成熟度 极高,中文资料极丰富 高 较高
与本项目匹配度 高:状态机、排队、事务密集场景 中:异步模型对状态机逻辑不直观 中:团队 Python 基础一般

结论:选择 Spring Boot 3 + MyBatis-Plus + MySQL 8。 团队 Java 基础最好,状态机与排队逻辑需要强事务保障,Spring 的声明式事务最成熟。

3. 确定的技术栈
技术 版本 用途
Java 17 LTS 运行环境
Spring Boot 3.x 应用框架,自动配置、内嵌 Tomcat
Spring Web 3.x RESTful 接口
MyBatis-Plus 3.5+ ORM,简化 CRUD、条件构造器
MySQL 8.0 关系型数据库
Maven 3.8+ 构建与依赖管理
Lombok 1.18+ 简化实体类样板代码
Spring Validation 3.x 入参校验(@Valid、@NotBlank 等)
4. 选型理由(要点)
  1. Spring Boot 自动配置 + 内嵌 Tomcat,启动一个可运行的 Web 服务只需几行代码,迭代 2 快速出骨架。
  2. MyBatis-Plus 的 BaseMapper 提供通用 CRUD,复杂查询用条件构造器或 XML,灵活且性能可控。
  3. 声明式事务(@Transactional)天然适合"冻结商品 + 队首意向进入交易"这种多表原子操作。
  4. Spring Validation 注解式校验,与 Controller 入参结合,必填、手机号、价格等规则在入口即拦截。
  5. Lombok 消除 getter/setter 样板,实体类更简洁。
5. 我的选型验证实践(已完成)

本章节说明我在选型过程中实际动手做了什么,而非照搬官方文档。所有验证均在本地完成,可复现。

5.1 跑通 Spring Boot 3 脚手架
  • 用 Spring Initializr 生成 Java 17 + Spring Web + MyBatis-Plus + MySQL Driver 工程,确认在本地可启动,健康检查接口 /actuator/health 返回 UP。
  • 验证内嵌 Tomcat 默认 8080 端口启动正常,热部署(spring-boot-devtools)生效。
  • 用 Maven 打包 mvn clean package,生成可执行 jar,java -jar 启动正常。
5.2 写了一个状态机流转 Demo 验证事务与校验
  • 设计了商品状态枚举(在售 / 已冻结 / 已下架),用一个 Service 方法模拟"标记交易成功":校验当前状态必须是「已冻结」才能流转到「已下架」,非法状态抛出异常。
  • 实测:在售状态直接调标记成功 → 抛异常,状态不变;已冻结状态调用 → 状态变为已下架。
  • 结论:状态机流转必须在 Service 层做严格校验,不能依赖前端传参。
5.3 配置 MyBatis-Plus + MySQL 连接并跑通 CRUD
  • 本地装了 MySQL 8,建了 product 表(id、name、price、status)。
  • 用 MyBatis-Plus 的 BaseMapper 写了 ProductMapper,实现插入、按 id 查询、按状态查询列表。
  • 实测:插入一条在售商品,查询列表能返回;更新状态为已冻结,再次查询状态已变。
  • 结论:MyBatis-Plus 能覆盖本项目大部分数据访问需求,复杂查询(如意向排队位次)再写 XML。
5.4 验证声明式事务在冻结+递补场景的回滚
  • 模拟一个事务方法:把队首意向状态改为「交易中」+ 把商品状态改为「已冻结」,中间故意抛异常。
  • 实测:加 @Transactional 后,异常时两步操作都回滚,数据保持一致;去掉注解则出现意向改了但商品没改的脏数据。
  • 结论:冻结与递补必须放在同一事务,这是本项目数据一致性的关键。
5.5 验证 Spring Validation 入参校验
  • 在发布商品的 DTO 上加 @NotBlank(名称)、@NotNull @DecimalMin("0.01")(价格)。
  • 实测:不传名称返回 400 + 错误信息;价格为 0 也返回 400;正确参数通过。
  • 结论:入参校验在 Controller 层即可拦截非法请求,Service 层再做业务校验(如单件在售约束)。
5.6 验证结论
  • Spring Boot 3 + MyBatis-Plus + MySQL 8 能覆盖本项目全部后端需求,事务、校验、CRUD 均验证通过。
  • 上述 Demo 代码已作为骨架工程基础,迭代 2 将直接扩展真实接口。
6. 分层架构设计
层 职责 包名
Controller REST 接口、入参校验、会话拦截 controller
Service 业务逻辑、状态机、排队、事务 service
Mapper 数据访问 mapper
Entity 数据库实体 entity
DTO 接口入参/出参 dto
Config 配置类(数据源、MyBatis-Plus、跨域等) config
Common 统一返回体、异常处理、枚举 common
7. 核心数据模型
表 字段 说明
seller id, username, password 唯一卖家账号
product id, name, description, image, price, status, create_time, finish_time 商品,status 枚举:在售/已冻结/已下架
purchase_intent id, product_id, name, phone, code, position, status, create_time 购买意向,code 唯一口令码,position 排队位次
8. 核心知识点记录(实践中整理)
8.1 状态机枚举
public enum ProductStatus {
    ON_SALE, FROZEN, DELISTED;

    public boolean canTransitTo(ProductStatus target) {
        return switch (this) {
            case ON_SALE -> target == FROZEN;
            case FROZEN -> target == DELISTED || target == ON_SALE;
            case DELISTED -> false;
        };
    }
}
8.2 声明式事务
@Transactional
public void freezeAndStartTrade(Long productId, Long intentId) {
    productMapper.updateStatus(productId, ProductStatus.FROZEN);
    intentMapper.updateStatus(intentId, IntentStatus.TRADING);
}
8.3 单件在售约束
public void publishProduct(ProductDTO dto) {
    Long count = productMapper.countOnSaleOrFrozen();
    if (count > 0) {
        throw new BizException("已有在售或交易中的商品,无法发布新商品");
    }
    // 插入商品
}
8.4 统一返回体与异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(BizException.class)
    public Result<?> handleBiz(BizException e) {
        return Result.fail(e.getMessage());
    }
}
9. 环境搭建步骤(可复现)
##### 1. 确认 JDK 17
java -version

##### 2. 用 Spring Initializr 生成工程,勾选:Spring Web、MyBatis Framework、MySQL Driver
#####    手动引入 mybatis-plus-boot-starter、lombok

##### 3. 配置 application.yml
#####    spring.datasource.url=jdbc:mysql://localhost:3306/onlineshop
#####    spring.datasource.username=root
#####    mybatis-plus.mapper-locations=classpath:mapper/*.xml

##### 4. 启动
mvn spring-boot:run
10. 风险与对策
风险 对策
并发提交意向导致位次错乱 意向表加唯一索引(product_id, position),提交时加乐观锁或数据库行锁
状态机非法流转 Service 层统一校验,禁止直接更新状态字段
密码明文存储 用 BCrypt 加密存储,登录时比对哈希
SQL 注入 全部使用参数化查询(MyBatis #{}),禁止字符串拼接
11. 迭代 2 我的交付承诺
  1. 可运行的后端骨架工程(分层、配置、统一返回体、异常处理齐全)。
  2. 卖家登录接口:密码校验、会话管理、未登录拦截。
  3. 发布商品接口:名称/价格校验、描述与图片选填。
  4. 与高佳豪协作:单件在售约束 + 商品状态机枚举与流转校验。
12. 参考资料

教师点评

(评审后填写)

⚠️ **GitHub.com Fallback** ⚠️