1. 项目背景与核心价值
校园二手交易一直是个高频刚需场景,但传统线下交易存在信息不对称、交易效率低等问题。去年我在帮学校计算机协会优化他们的二手交易群时,发现群内每天有上百条交易信息,但成交率不足30%。最典型的问题是:同一本教材,有人挂50元无人问津,有人标价80元却被秒拍——价格发现机制完全失灵。
这个基于SpringBoot+Vue的在线拍卖系统,正是为了解决以下痛点:
- 价格透明化:通过竞拍机制让商品回归真实市场价值
- 交易安全:校内实名认证+在线支付避免线下交易风险
- 资源复用:特别适合教材、实验设备等可循环使用物品
系统上线三个月后,某学院专业课教材的流通率提升了210%,这是让我最意外的数据反馈。下面分享具体实现方案。
2. 技术架构设计
2.1 前后端分离架构
采用经典的前后端分离模式:
code复制前端:Vue 3 + Element Plus + Axios
后端:SpringBoot 2.7 + MyBatis-Plus + Redis
数据库:MySQL 8.0
选择这套技术栈主要基于:
- 开发效率:Element Plus的组件库能快速搭建管理后台
- 性能考量:Redis应对高并发竞价请求(实测每秒可处理300+次出价)
- 扩展性:SpringBoot的starter机制方便后期添加短信通知等功能
2.2 核心业务流程设计
系统包含5个关键状态机:
- 商品发布(需审核)
- 竞价阶段(含延时竞价逻辑)
- 订单生成
- 线下交付确认
- 交易评价
特别注意:竞价结束前5分钟若有新出价,自动延长竞价时间——这个逻辑让平均竞价次数提升了4倍。
3. 关键实现细节
3.1 竞价同步方案
解决WebSocket全双工通信的三大难点:
java复制// 竞价消息处理核心逻辑
@Transactional
public void handleBid(BidDTO dto) {
// 1. 校验出价有效性(需高于当前价)
// 2. 写入数据库(MySQL)
// 3. 更新Redis缓存最新价格
// 4. 通过WebSocket广播消息
// 所有操作在一个事务内完成
}
实测中发现的问题及解决方案:
- 问题:Chrome浏览器一个Tab页崩溃会导致WS连接中断
- 解决:前端增加心跳检测+自动重连机制
- 教训:必须处理WS的Error和Close事件
3.2 支付对接方案
采用校园一卡通支付接口(非第三方支付),关键流程:
- 冻结买家账户金额
- 生成待确认订单
- 线下交付后卖家确认收款
- 实际金额划转
特别注意:必须处理网络超时情况,我们通过定时任务扫描"支付中"状态的订单,15分钟未确认自动解除冻结。
4. 安全防护措施
4.1 防刷单机制
实现组合策略:
- 同一IP限频(Guava RateLimiter)
- 出价必须比当前价高5%以上
- 最后10分钟出价需短信验证
4.2 敏感操作审计
所有关键操作记录操作日志:
sql复制CREATE TABLE operation_log (
id BIGINT PRIMARY KEY,
user_id INT NOT NULL,
operation_type VARCHAR(20),
ip_address VARCHAR(39),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
5. 性能优化实践
5.1 缓存策略
采用多级缓存架构:
- 热点商品信息:Redis缓存
- 静态资源:Nginx本地缓存
- 列表查询结果:MyBatis二级缓存
5.2 数据库优化
针对商品查询的复合索引:
sql复制ALTER TABLE goods
ADD INDEX idx_category_status (category_id, status, create_time);
实测使列表查询响应时间从1200ms降至80ms。
6. 部署方案
6.1 容器化部署
使用Docker Compose编排:
yaml复制version: '3'
services:
backend:
image: auction-backend:1.2
ports:
- "8080:8080"
depends_on:
- redis
- mysql
frontend:
image: nginx:1.21
ports:
- "80:80"
volumes:
- ./dist:/usr/share/nginx/html
6.2 监控配置
Prometheus监控指标包含:
- 活跃WS连接数
- 竞价请求QPS
- 订单创建成功率
7. 踩坑实录
-
时间同步问题
初期服务器时间未同步,导致竞价结束时间显示异常
解决方案:所有服务强制使用NTP同步 -
微信浏览器兼容性
微信内置浏览器缓存策略特殊,导致更新不及时
解决方案:给静态资源URL添加版本号参数 -
并发出价冲突
测试时模拟100人同时出价出现价格覆盖
最终方案:采用SELECT FOR UPDATE实现悲观锁
8. 扩展方向
-
推荐系统
基于用户历史交易记录推荐相关商品 -
物流跟踪
对接校园快递柜系统实现自助交接 -
信用体系
建立买卖双方信用评分机制
这个项目最让我意外的收获是:学生们对拍卖形式的接受度远超预期。一个有趣的发现是:晚上10点后的竞价活跃度是白天时段的3倍——看来大学生都是夜猫子。如果重新设计,我会更强化移动端体验,毕竟90%的访问来自手机。