1. 项目概述
这个二手交易系统采用前后端分离架构,前端使用Vue.js框架,后端基于SpringBoot技术栈实现。系统主要解决校园或社区场景下的二手物品流转需求,相比传统二手群聊或贴吧交易,提供了更规范的交易流程和更安全的支付保障机制。
我在实际开发中发现,这类系统最核心的价值在于解决二手交易中的信任问题。通过实名认证、交易评价、在线支付等功能模块的有机结合,能有效降低交易风险。下面从技术选型到功能实现,详细拆解这个项目的关键设计点。
2. 技术架构解析
2.1 后端技术栈
SpringBoot 2.7.x + MyBatis-Plus组合构成了后端核心框架。选择这个组合主要基于三个考量:
- 快速开发:SpringBoot的自动配置特性大幅减少XML配置
- 高效数据库操作:MyBatis-Plus的Wrapper条件构造器比传统MyBatis节省30%以上的SQL编写量
- 社区支持:遇到问题时能快速找到解决方案
数据库选用MySQL 8.0,关键配置如下:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/second_hand?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 加密存储
driver-class-name: com.mysql.cj.jdbc.Driver
2.2 前端技术栈
Vue 3.x + Element Plus构建管理后台,Vant构建移动端H5页面。这种组合方案的优势在于:
- 组件丰富:Element Plus提供完备的后台组件,Vant有优质的移动端组件
- 性能优化:Vue3的Composition API使代码组织更灵活
- 开发体验:Vite构建工具实现秒级热更新
3. 核心功能实现
3.1 商品发布模块
采用富文本编辑器(wangEditor)处理商品描述,关键实现逻辑:
java复制// 商品实体类
public class Goods {
private Long id;
private String title;
@Column(type = "text") // 大文本字段
private String detail;
private BigDecimal price;
private Integer categoryId;
// 其他字段...
}
// 控制器
@PostMapping("/goods")
public Result publishGoods(@Valid Goods goods,
@RequestParam MultipartFile[] images) {
// 1. 图片上传OSS
// 2. 保存商品信息
// 3. 返回操作结果
}
注意:图片存储建议使用阿里云OSS等对象存储服务,本地存储会导致服务器磁盘快速耗尽
3.2 交易流程设计
状态机控制交易流程:
code复制待支付 -> 已支付 -> 待发货 -> 已发货 -> 待收货 -> 已完成
↘ ↘
申请退款 -> 退款中 -> 退款完成
对应数据库设计:
sql复制CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '订单编号',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0待支付 1已支付...',
`pay_amount` decimal(10,2) NOT NULL,
`pay_time` datetime DEFAULT NULL,
`buyer_id` bigint NOT NULL,
`seller_id` bigint NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_order_no` (`order_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 安全与性能优化
4.1 安全防护措施
- 接口防刷:Guava RateLimiter实现限流
java复制// 每秒钟最多5次请求
private final RateLimiter limiter = RateLimiter.create(5.0);
@GetMapping("/api")
public Result sensitiveApi() {
if (!limiter.tryAcquire()) {
throw new BusinessException("操作过于频繁");
}
// 业务逻辑...
}
- XSS防护:Jackson自定义序列化
java复制public class XssStringJsonSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen,
SerializerProvider provider) {
// 使用Jsoup清理HTML标签
String safe = Jsoup.clean(value, Whitelist.basic());
gen.writeString(safe);
}
}
4.2 性能优化实践
- 缓存策略:Redis缓存热点商品
java复制@Cacheable(value = "goods", key = "#id")
public Goods getGoodsById(Long id) {
return goodsMapper.selectById(id);
}
- 数据库优化:
- 商品表添加复合索引:
INDEX idx_category_status (category_id, status) - 大文本字段单独分表存储
- 定期归档已完成订单
5. 部署方案
5.1 后端部署
推荐使用Docker Compose编排:
dockerfile复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
redis:
image: redis:6-alpine
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
5.2 前端部署
Nginx配置示例:
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
}
}
6. 常见问题排查
6.1 跨域问题
解决方案:SpringBoot添加配置类
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
6.2 文件上传大小限制
SpringBoot默认限制1MB,需要调整:
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
6.3 Vue路由刷新404
需配置Nginx重定向:
nginx复制location / {
try_files $uri $uri/ /index.html;
}
7. 扩展建议
- 消息推送:集成WebSocket实现实时聊天
- 智能推荐:基于用户行为使用协同过滤算法
- 物流跟踪:对接快递鸟API
- 信用体系:构建用户信用评分模型
我在实际开发中最大的体会是:二手交易系统的核心不是技术复杂度,而是对交易场景的深入理解。比如在商品详情页需要突出卖家信用信息,在支付环节需要提供担保交易选项,这些细节往往比技术实现更能决定项目成败。