1. 项目概述
这个基于Spring Boot的二手滑板交易系统是一个典型的B2C电子商务平台,专为滑板爱好者设计。作为一个完整的毕业设计项目,它涵盖了从用户注册、商品发布、交易管理到后台管理的全流程功能实现。
我在实际开发过程中发现,二手滑板交易平台有几个独特的需求点:首先,滑板作为特殊运动装备,其成色、配件完整度等属性需要特别关注;其次,滑板玩家社区属性强,用户间的互动需求较高;最后,交易安全性要求比一般二手商品更高。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构设计
系统采用经典的三层架构:
- 表现层:Vue.js + Element UI
- 业务逻辑层:Spring Boot + MyBatis Plus
- 数据持久层:MySQL 8.0
这种分层设计在实际开发中带来了几个明显优势:
- 前后端完全分离,便于团队协作
- 各层职责明确,代码可维护性高
- 技术栈成熟稳定,社区支持完善
2.2 技术选型考量
Spring Boot选型原因:
- 自动配置大幅减少XML配置
- 内嵌Tomcat简化部署
- 丰富的Starter依赖
- 完善的监控机制(Actuator)
Vue.js选型原因:
- 渐进式框架,学习曲线平缓
- 组件化开发模式
- 响应式数据绑定
- 丰富的生态系统(Vuex, Vue Router等)
MySQL选型原因:
- 开源免费
- 性能稳定
- 支持事务ACID特性
- 完善的索引机制
3. 核心功能实现
3.1 用户系统模块
3.1.1 注册登录实现
采用JWT+Spring Security实现认证授权:
java复制// JWT生成核心代码
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
安全注意事项:
- 密码必须加盐哈希存储
- JTT令牌有效期不宜过长
- 敏感操作需要二次验证
- 接口需要防CSRF攻击
3.1.2 权限管理系统
采用RBAC模型设计:
sql复制CREATE TABLE `sys_role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL COMMENT '角色名称',
`code` varchar(64) NOT NULL COMMENT '角色编码',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(1:正常;0:禁用)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 商品交易模块
3.2.1 商品发布功能
滑板商品特有属性设计:
java复制public class Skateboard {
private Long id;
private String title; // 商品标题
private String brand; // 品牌(如Baker, Element等)
private String deckSize; // 板面尺寸
private String truckBrand; // 桥品牌
private String wheelBrand; // 轮子品牌
private Integer condition; // 成色(1-10级)
private String description; // 详细描述
private BigDecimal price; // 价格
// 其他字段...
}
开发经验:
- 图片上传采用阿里云OSS存储
- 商品状态机设计(待审核/上架/下架/已售)
- 敏感词过滤机制
- 防XSS攻击处理
3.2.2 交易流程实现
订单状态流转设计:
code复制待支付 -> 已支付 -> 待发货 -> 已发货 -> 待收货 -> 已完成
↘ 已取消 ↗
支付对接支付宝沙箱环境:
java复制public String createPayOrder(Order order) {
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(returnUrl);
request.setNotifyUrl(notifyUrl);
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo(order.getOrderNo());
model.setTotalAmount(order.getAmount().toString());
model.setSubject("滑板商品订单:" + order.getOrderNo());
model.setProductCode("FAST_INSTANT_TRADE_PAY");
request.setBizModel(model);
return alipayClient.pageExecute(request).getBody();
}
4. 数据库设计
4.1 核心表结构
用户表(user):
sql复制CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`salt` varchar(20) NOT NULL COMMENT '盐值',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(1:正常;0:禁用)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
滑板商品表(skateboard):
sql复制CREATE TABLE `skateboard` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '发布用户ID',
`title` varchar(100) NOT NULL COMMENT '商品标题',
`brand` varchar(50) DEFAULT NULL COMMENT '品牌',
`deck_size` varchar(20) DEFAULT NULL COMMENT '板面尺寸',
`condition_level` int DEFAULT NULL COMMENT '成色等级',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`description` text COMMENT '详细描述',
`view_count` int DEFAULT '0' COMMENT '浏览数',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0:待审核;1:已上架;2:已下架;3:已售出)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 索引优化实践
在商品查询场景中,我们为以下字段建立了复合索引:
sql复制ALTER TABLE `skateboard` ADD INDEX `idx_query` (`status`, `brand`, `price`);
索引使用经验:
- 遵循最左前缀原则
- 区分度高的字段适合建索引
- 避免过度索引影响写入性能
- 定期使用EXPLAIN分析慢查询
5. 系统部署方案
5.1 开发环境配置
推荐使用Docker Compose搭建开发环境:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: skateboard
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
redis:
image: redis:6.0
ports:
- "6379:6379"
5.2 生产环境部署
采用Nginx + Docker Swarm集群部署:
code复制前端部署:
1. 构建Vue生产包:npm run build
2. 配置Nginx静态资源服务
后端部署:
1. 使用Maven打包:mvn clean package
2. 编写Dockerfile构建镜像
3. 配置Swarm集群服务
部署注意事项:
- 数据库需要定期备份
- 配置日志轮转策略
- 设置监控告警
- 做好压力测试
6. 常见问题解决
6.1 跨域问题处理
Spring Boot配置CORS:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
6.2 事务管理问题
使用@Transactional注解时的坑:
java复制@Service
public class OrderServiceImpl implements OrderService {
// 正确:事务方法必须public
@Transactional(rollbackFor = Exception.class)
public void createOrder(OrderDTO dto) {
// ...
}
// 错误:自调用事务失效
public void processOrder() {
this.createOrder(dto); // 事务不生效
}
}
6.3 性能优化技巧
- 启用MyBatis二级缓存
- 合理使用连接池配置
- 热点数据加入Redis缓存
- 分页查询优化
- 静态资源CDN加速
7. 项目扩展方向
在实际开发完成后,可以考虑以下几个扩展方向:
-
社区功能增强:
- 添加滑板技巧分享板块
- 实现用户间私信功能
- 开发线下活动组织模块
-
交易安全升级:
- 引入第三方担保交易
- 增加实名认证机制
- 实现物流跟踪对接
-
移动端适配:
- 开发微信小程序版本
- 适配React Native跨平台方案
- 优化PWA体验
-
智能推荐系统:
- 基于用户行为的商品推荐
- 价格趋势分析功能
- 个性化搜索排序
这个项目作为毕业设计,不仅完整涵盖了主流技术栈的应用,还针对垂直领域做了特色功能设计。在开发过程中,特别要注意交易系统的安全性和可靠性,同时保持良好的代码结构和文档规范。
