1. 项目概述
最近在做一个挺有意思的环保类项目 - 基于SpringBoot和微信小程序的旧衣回收系统。这个系统主要解决城市居民旧衣物处理难的问题,通过线上预约回收的方式,让环保变得更便捷。系统采用了前后端分离架构,后端用SpringBoot,前端小程序用uni-app开发,管理后台用了Vue.js。
在实际开发过程中,我发现这种O2O模式的回收系统有几个特别值得注意的技术点:微信小程序与后端API的安全交互、回收订单的状态流转设计、以及积分系统的防刷机制。这些我都会在后面详细展开。
2. 技术选型与架构设计
2.1 后端技术栈
选择SpringBoot作为后端框架主要考虑以下几点:
- 快速开发:SpringBoot的自动配置和起步依赖大大减少了配置工作量
- 生态丰富:整合MyBatis、Redis等组件非常方便
- 性能稳定:Tomcat容器+SpringMVC的组合经过大量项目验证
数据库选用MySQL 5.7版本是因为:
- JSON字段支持(5.7+版本特性)
- 对空间数据的良好支持
- 相比新版MySQL,5.7在中小型项目中的性能表现更稳定
注意:一定要用MySQL 5.7,因为项目中用到了5.7特有的JSON函数处理一些扩展字段。
2.2 前端技术栈
微信小程序端采用uni-app框架,主要优势:
- 一套代码多端发布(微信、支付宝、百度小程序等)
- 丰富的组件库和插件生态
- 与Vue.js相似的开发体验,学习成本低
管理后台使用Vue.js + Element UI,这是目前中后台系统的经典组合,开发效率高,组件丰富。
3. 核心功能实现
3.1 用户端功能实现
用户端主要功能模块:
- 旧衣信息浏览:分页加载、分类筛选、搜索功能
- 回收预约:选择衣物类型、数量、预约时间
- 订单跟踪:实时查看回收状态
- 积分系统:兑换商品、积分记录
预约功能的实现要点:
java复制// 预约接口核心逻辑
@PostMapping("/appointment")
public Result createAppointment(@RequestBody AppointmentDTO dto) {
// 1. 校验用户当日预约次数(防刷)
int todayCount = appointmentMapper.countByUserAndDate(dto.getUserId(), new Date());
if(todayCount >= 3) {
return Result.error("每日最多预约3次");
}
// 2. 生成预约单
Appointment appointment = new Appointment();
BeanUtils.copyProperties(dto, appointment);
appointment.setAppointmentNo(generateOrderNo());
appointment.setStatus(0); // 待接单
// 3. 分配回收人员(基于地理位置)
assignRecycler(appointment);
appointmentMapper.insert(appointment);
return Result.success(appointment);
}
3.2 管理后台功能
管理员主要工作:
- 回收人员管理:审核、分配区域
- 订单监控:查看各状态订单数据
- 数据统计:回收量、用户增长等报表
- 系统配置:积分规则、公告管理等
订单状态机设计:
code复制待接单 → 已接单 → 回收中 → 已完成
↓ ↓
取消订单 异常上报
4. 数据库设计
4.1 核心表结构
用户表(user)
sql复制CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`openid` varchar(64) NOT NULL COMMENT '微信openid',
`nickname` varchar(64) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`address` json DEFAULT NULL COMMENT '地址信息',
`integral` int(11) DEFAULT '0' COMMENT '积分',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_openid` (`openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
回收订单表(recycle_order)
sql复制CREATE TABLE `recycle_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL,
`user_id` bigint(20) NOT NULL,
`recycler_id` bigint(20) DEFAULT NULL,
`clothes_type` varchar(20) NOT NULL,
`weight` decimal(10,2) DEFAULT NULL,
`appointment_time` datetime NOT NULL,
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0-待接单 1-已接单 2-回收中 3-已完成',
`integral` int(11) DEFAULT '0' COMMENT '获得积分',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_recycler` (`recycler_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 索引优化
针对查询频繁的字段建立了索引:
- 用户表的openid(唯一索引)
- 订单表的user_id、recycler_id、status
- 预约时间范围查询加了联合索引
5. 关键技术实现
5.1 微信登录集成
小程序端登录流程:
- 调用wx.login获取code
- 将code传给后端
- 后端用code向微信服务器换取openid
- 注册/登录用户并返回token
安全注意事项:
- 不要在前端存储敏感信息
- 接口需要校验token
- 敏感操作需要二次验证
5.2 订单状态同步
使用WebSocket实现订单状态实时推送:
- 小程序连接WebSocket服务
- 订单状态变更时推送消息
- 前端根据消息更新UI
java复制@ServerEndpoint("/ws/order/{userId}")
@Component
public class OrderWebSocket {
private static final Map<Long, Session> sessions = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session, @PathParam("userId") Long userId) {
sessions.put(userId, session);
}
public static void sendOrderUpdate(Long userId, OrderVO order) {
Session session = sessions.get(userId);
if(session != null) {
session.getAsyncRemote().sendText(JSON.toJSONString(order));
}
}
}
5.3 积分防刷策略
- 每日积分获取上限
- 敏感操作需要验证码
- 重要操作记录日志
- 异常行为检测(如同IP频繁操作)
6. 部署与运维
6.1 服务器环境
推荐配置:
- CPU: 2核+
- 内存: 4G+
- 带宽: 3M+
- 系统: CentOS 7+
6.2 部署步骤
- 数据库初始化
- 后端服务打包部署
- Nginx配置
- SSL证书配置
- 微信小程序提审发布
6.3 监控与日志
建议配置:
- Spring Boot Actuator健康检查
- ELK日志收集
- Prometheus + Grafana监控
7. 踩坑与解决方案
7.1 微信支付回调问题
问题:微信支付回调有时收不到
解决:
- 检查服务器是否在微信白名单
- 回调接口要做幂等处理
- 添加日志记录所有回调请求
- 实现主动查询订单状态作为补偿
7.2 高并发下的订单状态
问题:多个回收人员同时抢单导致状态混乱
解决方案:
java复制@Transactional
public boolean acceptOrder(Long orderId, Long recyclerId) {
// 使用乐观锁控制并发
int updated = orderMapper.updateStatus(
orderId,
0, // 原状态:待接单
1, // 新状态:已接单
recyclerId
);
return updated > 0;
}
7.3 小程序性能优化
- 图片懒加载
- 分页加载数据
- 减少setData数据量
- 使用自定义组件
8. 扩展与改进方向
- 智能调度算法:基于回收人员位置和负载的智能派单
- 衣物识别:接入AI识别衣物材质和成色
- 区块链溯源:衣物回收处理的全流程追溯
- 社交功能:环保积分排行榜、分享奖励
这个项目从技术实现到业务逻辑都有不少值得深挖的点,特别是在处理线上线下结合的业务流程时,需要考虑各种异常情况和用户体验。我在开发过程中最大的体会是:一定要先理清核心业务流程的状态流转,把状态图画出来再开始编码,否则后期改动的成本会很高。