基于 AI 辅助开发电商系统核心模块实战指南
在传统电商系统开发中,商品管理、购物车及订单流程往往涉及大量重复代码。利用 AI 编程助手可以显著降低开发门槛,将精力集中在业务逻辑设计上。本文将演示如何使用 AI 工具快速构建商品管理、购物车和订单系统的核心功能。
一、AI 编程助手的优势
相比传统手写代码,AI 辅助开发在以下方面表现突出:
- 业务理解:能够根据自然语言描述生成符合业务场景的代码,例如 Redis 存储购物车、幂等校验防止重复提交。
- 代码规范:生成的代码通常包含必要的注释、异常处理和日志记录,结构清晰。
- 可维护性:生成的代码并非'死'的,可根据需求调整实体类、表结构或接口逻辑。
二、环境准备与需求定义
1. 基础环境
确保已安装 JDK、IDEA 及相关插件。集成 AI 编程助手后,无需编写复杂的 PRD 文档,直接通过对话明确需求即可。
2. 需求描述
向 AI 描述清楚功能点、约束条件及技术栈。例如:
- 商品管理:新增、列表查询(模糊搜索、排序、分页)、上下架。
- 购物车:加购、改数量、删除、计算总价,需校验库存。
- 订单系统:创建订单(扣减库存、防重)、查询列表/明细、修改支付状态。
- 技术栈:Spring Boot 2.7.x + MyBatis Plus + MySQL 8.0 + Redis。
三、核心功能实现
第一步:数据库设计
AI 会根据需求拆解并生成表结构。以下是核心的三张表 SQL 脚本:
-- 商品表
CREATE TABLE product (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '商品 ID',
product_name VARCHAR(255) NOT NULL COMMENT '商品名称',
price DECIMAL(10,2) NOT NULL CHECK(price >= 0) COMMENT '商品价格',
stock INT NOT NULL DEFAULT 0 CHECK(stock >= 0) COMMENT '库存数量',
category_id BIGINT NOT NULL COMMENT '商品分类 ID',
product_img VARCHAR(512) COMMENT '商品图片 URL',
status TINYINT NOT NULL DEFAULT 1 COMMENT '商品状态(1=上架,0=下架)',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_product_name (product_name),
INDEX idx_category_id (category_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
-- 订单表
CREATE TABLE order_info (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '订单 ID',
order_no VARCHAR(64) NOT NULL UNIQUE COMMENT '订单编号',
user_id BIGINT NOT NULL COMMENT '用户 ID',
total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
pay_status TINYINT NOT NULL DEFAULT 0 COMMENT '支付状态',
order_status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
pay_time DATETIME,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_order_no (order_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
-- 订单项表
CREATE TABLE order_item (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '订单项 ID',
order_id BIGINT NOT NULL COMMENT '关联订单 ID',
order_no VARCHAR(64) NOT NULL COMMENT '关联订单编号',
product_id BIGINT NOT NULL COMMENT '商品 ID',
product_name VARCHAR(255) NOT NULL COMMENT '商品名称',
product_price DECIMAL(10,2) NOT NULL COMMENT '购买价格',
buy_num INT NOT NULL COMMENT '购买数量',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_order_id (order_id),
INDEX idx_product_id (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单项表';
第二步:接口与业务逻辑
AI 会自动生成 Controller、Service、Mapper 层代码。以下是部分核心接口的实现示例。
1. 商品管理接口
Controller 层负责参数校验与结果封装,Service 层处理具体业务。
@RestController
@RequestMapping("/api/product")
@Slf4j
public class ProductController {
@Resource
private ProductService productService;
@PostMapping("/add")
public Result<?> addProduct(@RequestBody Product product) {
if (product.getPrice().compareTo(BigDecimal.ZERO) < 0) {
return Result.fail("商品价格不能为负");
}
if (product.getStock() < 0) {
return Result.fail("商品库存不能为负");
}
product.setStatus(1);
boolean success = productService.save(product);
if (success) {
log.info("新增商品成功,商品 ID:{}", product.getId());
return Result.success("新增商品成功", product.getId());
}
return Result.fail("新增商品失败");
}
@GetMapping("/list")
public Result<?> getProductList(
@RequestParam(required = false) String productName,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
Page<Product> page = new Page<>(pageNum, pageSize);
List<Product> productList = productService.getProductList(page, productName);
page.setRecords(productList);
return Result.success("查询成功", page);
}
}
2. 购物车接口(Redis 存储)
使用 Redis 缓存购物车数据以提升性能,并在添加前进行库存校验。
@RestController
@RequestMapping("/api/cart")
@Slf4j
public class CartController {
@Resource
private CartService cartService;
@PostMapping("/add")
public Result<?> addToCart(@RequestParam Long userId, @RequestParam Long productId, @RequestParam Integer buyNum) {
String checkMsg = cartService.checkBeforeAdd(userId, productId, buyNum);
if (checkMsg != null) {
return Result.fail(checkMsg);
}
boolean success = cartService.addCart(userId, productId, buyNum);
return success ? Result.success("添加购物车成功") : Result.fail("添加购物车失败");
}
@GetMapping("/list")
public Result<?> getCartList(@RequestParam Long userId) {
List<CartVO> cartVOList = cartService.getCartList(userId);
BigDecimal totalAmount = cartVOList.stream()
.map(CartVO::getSubtotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
Map<String, Object> data = new HashMap<>();
data.put("cartList", cartVOList);
data.put("totalAmount", totalAmount);
return Result.success("查询购物车成功", data);
}
}
3. 订单核心逻辑
订单创建涉及事务控制、库存扣减及幂等性校验,是电商系统的核心难点。
@Service
public class OrderServiceImpl implements OrderService {
@Resource
private OrderInfoMapper orderInfoMapper;
@Resource
private ProductMapper productMapper;
@Resource
private CartService cartService;
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Override
@Transactional(rollbackFor = Exception.class)
public String createOrder(Long userId, String productIds) {
// 1. 防重复提交校验
String requestId = userId + "_" + System.currentTimeMillis();
String redisKey = "order:repeat:" + requestId;
if (Boolean.TRUE.equals(redisTemplate.hasKey(redisKey))) {
throw new RuntimeException("请勿重复提交订单");
}
redisTemplate.opsForValue().set(redisKey, "1", 5, TimeUnit.MINUTES);
// 2. 查询购物车选中商品
List<CartVO> cartVOList = cartService.getCheckedCartList(userId, productIds);
if (cartVOList.isEmpty()) {
throw new RuntimeException("购物车中无选中商品");
}
// 3. 扣减库存(行锁防止超卖)
for (CartVO cartVO : cartVOList) {
Long productId = cartVO.getProductId();
Integer buyNum = cartVO.getBuyNum();
Product product = productMapper.selectByIdForUpdate(productId);
if (product == null || product.getStatus() == 0) {
throw new RuntimeException("商品已下架或不存在");
}
if (product.getStock() < buyNum) {
throw new RuntimeException("库存不足");
}
product.setStock(product.getStock() - buyNum);
productMapper.updateById(product);
}
// 4. 生成订单
String orderNo = generateOrderNo();
OrderInfo orderInfo = new OrderInfo();
orderInfo.setOrderNo(orderNo);
orderInfo.setUserId(userId);
orderInfoMapper.insert(orderInfo);
// 5. 插入订单项
for (CartVO cartVO : cartVOList) {
OrderItem item = new OrderItem();
item.setOrderId(orderInfo.getId());
item.setOrderNo(orderNo);
item.setProductId(cartVO.getProductId());
item.setProductName(cartVO.getProductName());
item.setProductPrice(cartVO.getProductPrice());
item.setBuyNum(cartVO.getBuyNum());
itemMapper.insert(item);
}
// 6. 清空购物车
cartService.clearCheckedCart(userId, productIds);
return orderNo;
}
private String generateOrderNo() {
String timeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
String randomStr = String.format("%06d", new Random().nextInt(1000000));
return timeStr + randomStr;
}
}
第三步:测试与优化建议
1. 接口测试
启动项目后,可使用 Postman 验证接口。例如调用 POST /api/cart/add,传入 userId, productId, buyNum。若库存不足,应返回明确的错误提示。
2. 持续优化
在实际运行中,可结合 AI 建议进一步优化系统:
- 库存预热:高并发下将热门商品库存缓存至 Redis。
- 订单超时取消:使用定时任务扫描未支付订单,自动取消并恢复库存。
- 接口限流:对创建订单接口增加限流保护,防止恶意请求。
四、总结
利用 AI 编程助手进行电商系统开发,主要流程包括:需求描述、SQL 生成、代码生成、人工审查与测试。虽然 AI 能完成大部分样板代码编写,但关键业务逻辑(如事务一致性、并发控制)仍需开发者仔细审查。这种方式将开发效率提升了数倍,让开发者能更专注于架构设计与业务创新。


