1. 项目概述
这个二手物品交易管理系统采用前后端分离架构,前端使用Vue.js框架,后端基于SpringBoot技术栈,数据库选用MySQL,ORM层采用MyBatis实现数据持久化。系统实现了用户注册登录、商品发布、交易撮合、订单管理等核心功能模块,为校园或社区内的二手物品流转提供了完整的线上解决方案。
我在实际开发中发现,这种技术组合特别适合中小型交易平台:SpringBoot的自动配置特性大幅减少了XML配置工作量,Vue的组件化开发让前端功能模块可以高效复用,而MyBatis的灵活SQL编写能力则很好地满足了交易系统复杂的查询需求。
2. 技术选型解析
2.1 后端技术栈
选择SpringBoot 2.7.x版本作为基础框架,主要考虑因素包括:
- 内嵌Tomcat服务器简化部署
- 自动配置减少样板代码
- 完善的Starter生态(整合Redis、RabbitMQ等中间件)
- 与MyBatis的天然兼容性
数据库选用MySQL 8.0,关键配置参数:
spring: datasource: url: jdbc:mysql://localhost:3306/bootpf?useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver2.2 前端技术栈
Vue 3组合式API开发带来以下优势:
- Composition API使逻辑关注点更集中
- Vite构建工具实现秒级热更新
- Element Plus组件库快速搭建管理界面
- Axios处理RESTful API请求
典型页面组件结构:
src/ ├── views/ │ ├── GoodsList.vue # 商品列表 │ ├── GoodsDetail.vue # 商品详情 │ └── Order.vue # 订单页面 ├── api/ │ └── goods.js # 商品相关API └── store/ └── goods.js # Pinia状态管理3. 核心功能实现
3.1 商品模块设计
商品实体ER图核心字段:
public class Goods { private Long id; private String title; private String description; private BigDecimal price; private Integer categoryId; private List<String> images; private Integer status; // 0-未售出 1-已售出 private LocalDateTime createTime; }MyBatis动态SQL示例:
<select id="selectByCondition" resultType="Goods"> SELECT * FROM goods <where> <if test="categoryId != null"> AND category_id = #{categoryId} </if> <if test="minPrice != null"> AND price >= #{minPrice} </if> <if test="status != null"> AND status = #{status} </if> </where> ORDER BY create_time DESC </select>3.2 交易流程实现
订单状态机设计:
public enum OrderStatus { UNPAID(0, "待支付"), PAID(1, "已支付"), SHIPPED(2, "已发货"), COMPLETED(3, "已完成"), CANCELLED(4, "已取消"); // 省略转换逻辑... }分布式事务处理方案:
- 本地消息表+定时任务补偿
- 使用Seata AT模式
- 基于RocketMQ的事务消息
4. 安全与性能优化
4.1 安全防护措施
JWT认证实现流程:
- 用户登录成功后生成Token
- 前端存储Token在localStorage
- 每次请求携带Authorization头
- 后端通过拦截器校验Token
关键安全配置:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())); } }4.2 性能优化实践
缓存策略设计:
- 商品详情:Redis缓存 + 本地Caffeine二级缓存
- 热点数据:预加载机制
- 缓存失效:LFU淘汰策略
SQL优化示例:
-- 原始查询 SELECT * FROM goods WHERE title LIKE '%手机%'; -- 优化后 SELECT id,title,price FROM goods WHERE title LIKE '手机%' ORDER BY create_time DESC LIMIT 20;5. 部署与监控
5.1 容器化部署
Docker Compose配置示例:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 ports: - "3306:3306" redis: image: redis:alpine ports: - "6379:6379" backend: build: ./backend ports: - "8080:8080" depends_on: - mysql - redis5.2 监控方案
SpringBoot Actuator配置:
management.endpoints.web.exposure.include=* management.endpoint.health.show-details=alwaysPrometheus监控指标采集:
@Bean MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() { return registry -> registry.config().commonTags( "application", "bootpf-system" ); }6. 开发经验总结
在项目开发过程中,有几个关键点值得特别注意:
接口版本控制:建议从项目开始就建立/v1/api/的URL规范,避免后期接口变更导致客户端兼容性问题
枚举使用技巧:所有状态字段都应该使用枚举而非魔术数字,MyBatis中可以通过TypeHandler实现自动转换
图片存储方案:实际测试发现,使用MinIO对象存储比直接存数据库性能提升3倍以上
事务边界控制:在商品发布等复杂操作中,建议将大事务拆分为多个小事务,避免长事务锁表
前端性能陷阱:Vue中大量使用v-for渲染列表时,务必添加:key属性,否则会导致组件异常更新
这个项目完整源码已托管在Gitee平台,包含详细的部署文档和API文档。通过这个项目的实践,可以系统掌握现代Web应用的全栈开发流程,特别适合作为毕业设计或全栈能力提升的练手项目。