1. 项目概述
这个基于SSM框架的二手物品交易网站系统,是我在指导计算机专业学生完成课程设计时开发的一个典型电商类项目。它完整实现了二手交易平台的核心功能链:从商品发布、分类展示到订单处理的完整业务流程。对于计算机相关专业的学生而言,这类项目既能巩固SSM框架的实际应用能力,又能学习到电商系统的典型架构设计。
系统采用经典的MVC分层架构:
- 前端使用JSP+JSTL+EL表达式实现动态页面渲染
- 控制层采用SpringMVC处理请求路由和参数绑定
- 服务层通过Spring容器管理业务组件
- 持久层使用MyBatis操作MySQL数据库
这种技术组合既保证了开发效率,又便于学生理解各层之间的协作关系。我在项目中特别注重异常处理机制的设计,比如商品库存的乐观锁控制、事务边界的合理划分等企业级开发必须掌握的技能点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能实现
2.1 商品发布模块
商品发布流程采用多步骤表单设计:
- 基础信息(标题、分类、价格)
- 详情描述(富文本编辑器)
- 图片上传(限制5张以内)
- 交易方式选择(自提/邮寄)
技术实现要点:
java复制// 商品实体类关键字段
public class Item {
private Integer id;
private String title;
private BigDecimal price;
private Integer categoryId;
private String description;
private Integer sellerId;
private Integer status; // 0-未审核 1-已上架 2-已下架
private Date createTime;
// getters/setters...
}
// 图片上传处理
@PostMapping("/upload")
public JsonResult uploadImages(@RequestParam("files") MultipartFile[] files) {
List<String> urls = new ArrayList<>();
for (MultipartFile file : files) {
if (!file.isEmpty()) {
String filename = UUID.randomUUID() +
file.getOriginalFilename().substring(
file.getOriginalFilename().lastIndexOf("."));
file.transferTo(new File(uploadPath + filename));
urls.add("/uploads/" + filename);
}
}
return JsonResult.success(urls);
}
注意事项:文件上传需配置Spring MultipartResolver,并在application.properties中设置最大上传大小:
spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=10MB
2.2 分类检索系统
分类体系采用三级树形结构:
- 一级分类(如电子产品、服饰)
- 二级分类(如手机、电脑)
- 三级分类(如iPhone、华为)
前端实现两种检索方式:
- 分类导航树(左侧固定区域)
- 综合搜索框(支持关键词+分类筛选)
后端SQL示例:
sql复制SELECT i.*, u.username as sellerName
FROM items i
JOIN users u ON i.seller_id = u.id
WHERE i.status = 1
AND i.category_id IN (
SELECT id FROM categories
WHERE path LIKE '1,3,%' -- 查找三级分类下的所有商品
)
ORDER BY i.create_time DESC
LIMIT 0, 20
性能优化点:
- 分类表使用path字段存储层级路径(如"1,3,5")
- 建立复合索引(category_id, status, create_time)
- 使用Redis缓存热门分类数据
2.3 订单处理流程
状态机设计:
mermaid复制stateDiagram
[*] --> 待付款
待付款 --> 已取消: 超时未支付
待付款 --> 待发货: 支付成功
待发货 --> 待收货: 发货操作
待收货 --> 已完成: 确认收货
待收货 --> 退款中: 发起退款
退款中 --> 已取消: 退款成功
核心业务逻辑:
java复制@Transactional
public Order createOrder(Integer userId, Integer itemId, Integer quantity) {
// 1. 校验商品状态
Item item = itemMapper.selectById(itemId);
if (item == null || item.getStatus() != 1) {
throw new BusinessException("商品已下架");
}
// 2. 扣减库存(乐观锁)
int affected = itemMapper.reduceStock(itemId, quantity);
if (affected == 0) {
throw new BusinessException("库存不足");
}
// 3. 生成订单
Order order = new Order();
order.setOrderNo(generateOrderNo());
order.setItemId(itemId);
order.setBuyerId(userId);
order.setSellerId(item.getSellerId());
order.setPaymentAmount(item.getPrice().multiply(new BigDecimal(quantity)));
order.setStatus(OrderStatus.UNPAID.getCode());
orderMapper.insert(order);
return order;
}
3. 数据库设计
主要表结构说明:
3.1 用户表(users)
| 字段 | 类型 | 描述 |
|---|---|---|
| id | INT | 主键 |
| username | VARCHAR(50) | 登录账号 |
| password | VARCHAR(100) | BCrypt加密 |
| real_name | VARCHAR(20) | 实名认证 |
| phone | VARCHAR(20) | 联系方式 |
| avatar | VARCHAR(255) | 头像URL |
| credit_score | INT | 信用分 |
3.2 商品表(items)
| 字段 | 类型 | 描述 |
|---|---|---|
| id | INT | 主键 |
| title | VARCHAR(100) | 商品标题 |
| category_id | INT | 分类ID |
| price | DECIMAL(10,2) | 售价 |
| original_price | DECIMAL(10,2) | 原价 |
| description | TEXT | 详情 |
| images | VARCHAR(1000) | 图片URL,逗号分隔 |
| seller_id | INT | 卖家ID |
| status | TINYINT | 状态 |
| view_count | INT | 浏览量 |
| stock | INT | 库存 |
3.3 订单表(orders)
| 字段 | 类型 | 描述 |
|---|---|---|
| id | INT | 主键 |
| order_no | VARCHAR(32) | 订单编号 |
| item_id | INT | 商品ID |
| buyer_id | INT | 买家ID |
| seller_id | INT | 卖家ID |
| payment_amount | DECIMAL(10,2) | 实付金额 |
| status | TINYINT | 订单状态 |
| create_time | DATETIME | 下单时间 |
| pay_time | DATETIME | 支付时间 |
| shipping_time | DATETIME | 发货时间 |
| complete_time | DATETIME | 完成时间 |
4. 部署与测试
4.1 环境准备
- JDK 1.8+
- Apache Tomcat 9.x
- MySQL 5.7+
- Maven 3.6+
4.2 项目配置
- 数据库初始化:
sql复制CREATE DATABASE second_hand DEFAULT CHARACTER SET utf8mb4;
USE second_hand;
SOURCE init.sql; -- 导入提供的SQL文件
- 修改数据库连接配置:
properties复制# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/second_hand
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- 构建项目:
bash复制mvn clean package
cp target/secondhand.war /path/to/tomcat/webapps/
4.3 常见问题排查
- 中文乱码问题:
- 确保MySQL字符集为utf8mb4
- 在JDBC连接串后添加参数:?useUnicode=true&characterEncoding=UTF-8
- Tomcat的server.xml中Connector添加URIEncoding="UTF-8"
- 图片上传失败:
- 检查upload.path配置的目录是否存在
- Linux系统注意目录权限:chmod -R 777 /upload
- 检查Spring multipart配置是否生效
- 事务不生效:
- 确保@Transactional注解添加到public方法上
- 检查是否配置了@EnableTransactionManagement
- 确认数据库引擎为InnoDB
5. 项目扩展建议
- 增加即时通讯功能:
- 集成WebSocket实现买卖家实时沟通
- 消息记录存入MongoDB
- 引入支付接口:
- 对接支付宝沙箱环境
- 实现支付结果异步通知
- 添加推荐系统:
- 基于用户行为的协同过滤
- 使用Redis实现实时推荐
- 性能优化方向:
- 商品详情页静态化
- 引入Elasticsearch实现全文检索
- 使用Redis缓存热点数据
这个项目在实际教学中发现,学生最容易在以下环节出现问题:
- MyBatis关联查询的结果映射
- Spring事务的传播机制理解
- 前端表单的验证逻辑
- 并发场景下的库存控制
建议在开发过程中:
- 先完成核心业务流程(发布-浏览-下单)
- 再逐步添加辅助功能(搜索、评论)
- 最后进行系统优化(缓存、异步)
