1. 项目概述
去年参与了一个旧衣回收平台的开发项目,团队采用Django+微信小程序的技术栈,打造了一个完整的旧衣回收交易系统。这个项目最让我印象深刻的是如何将环保理念与技术实现完美结合,下面就把整个开发过程中的关键设计和实现细节分享给大家。
旧衣回收系统本质上是一个O2O(线上到线下)的电商平台,但相比传统电商有几个显著特点:
- 商品具有非标品特性(每件旧衣状态不同)
- 交易流程包含线下交付环节
- 需要建立用户激励机制
- 涉及公益属性与商业模式的平衡
2. 技术架构设计
2.1 整体架构
我们采用典型的前后端分离架构:
code复制微信小程序(前端) ↔ Django REST Framework(API层) ↔ MySQL(主库)+Redis(缓存)
选择这套技术栈主要基于以下考虑:
- 微信小程序覆盖用户广,无需安装,适合轻量级服务
- Django开发效率高,自带Admin等实用组件
- RESTful API便于后期扩展多端接入
- Redis应对高并发场景下的缓存需求
2.2 数据库设计
核心表结构设计(简化版):
| 表名 | 主要字段 | 说明 |
|---|---|---|
| user | openid, nickname, points | 用户表 |
| clothing | title, category, condition, images | 衣物表 |
| order | order_no, status, pickup_code | 订单表 |
| location | name, address, coordinates | 回收点表 |
特别注意的点:
- 使用MySQL的GIS扩展存储地理位置数据
- 衣物图片采用七牛云对象存储
- 订单状态机设计包含10余种状态流转
3. 核心功能实现
3.1 微信小程序端
3.1.1 用户认证流程
python复制# Django后端示例代码
class WeChatLogin(APIView):
def post(self, request):
code = request.data.get('code')
# 调用微信接口获取openid
wx_res = requests.get(
f"https://api.weixin.qq.com/sns/jscode2session?appid={APPID}&secret={SECRET}&js_code={code}&grant_type=authorization_code"
)
openid = wx_res.json().get('openid')
user, created = User.objects.get_or_create(openid=openid)
# 生成JWT token
token = generate_jwt(user)
return Response({'token': token})
3.1.2 衣物发布功能
关键技术点:
- 微信图片上传临时路径转永久存储
- 多图压缩上传策略
- 基于EXIF的图片自动旋转校正
3.2 后端核心逻辑
3.2.1 订单状态机
python复制class OrderStatus:
DRAFT = 'draft'
PAID = 'paid'
SCHEDULED = 'scheduled'
PICKED_UP = 'picked_up'
COMPLETED = 'completed'
CANCELLED = 'cancelled'
TRANSITIONS = {
DRAFT: [PAID, CANCELLED],
PAID: [SCHEDULED, CANCELLED],
SCHEDULED: [PICKED_UP, CANCELLED],
PICKED_UP: [COMPLETED],
}
3.2.2 智能推荐算法
基于用户行为的协同过滤改进算法:
- 构建用户-衣物评分矩阵
- 加入时间衰减因子(近期行为权重更高)
- 结合衣物品类偏好
- 地理位置过滤
4. 关键问题与解决方案
4.1 并发订单处理
使用Django的select_for_update解决:
python复制with transaction.atomic():
order = Order.objects.select_for_update().get(pk=order_id)
if order.status == OrderStatus.DRAFT:
order.status = OrderStatus.PAID
order.save()
4.2 地理位置查询优化
sql复制-- 查找5公里内的回收点
SELECT id, name,
ST_Distance_Sphere(
point(%s, %s),
point(longitude, latitude)
) as distance
FROM location
WHERE ST_Distance_Sphere(
point(%s, %s),
point(longitude, latitude)
) < 5000
ORDER BY distance;
4.3 微信支付集成
注意事项:
- 需要企业资质认证
- 支付回调要做签名验证
- 做好对账机制
- 处理重复通知问题
5. 性能优化实践
5.1 缓存策略
- 使用Redis缓存热门衣物列表
- 用户信息本地缓存
- 数据库查询结果缓存
5.2 数据库优化
- 为常用查询字段建立索引
- 读写分离配置
- 慢查询监控
5.3 前端性能
- 图片懒加载
- 分页加载策略
- 本地数据缓存
6. 安全防护措施
- 接口防刷:限制同一openid的请求频率
- SQL注入防护:始终使用ORM或参数化查询
- XSS防护:前端做输入过滤
- 数据加密:敏感字段AES加密存储
- 权限控制:RBAC模型实现
7. 测试方案
我们建立了三级测试体系:
- 单元测试:覆盖核心业务逻辑
- 接口测试:Postman自动化测试集
- UI测试:小程序真机测试矩阵
特别关注:
- 支付流程的异常测试
- 网络不稳定的场景测试
- 不同机型兼容性测试
8. 部署架构
采用Docker-compose部署方案:
code复制version: '3'
services:
web:
build: .
command: gunicorn config.wsgi:application --bind 0.0.0.0:8000
volumes:
- static:/app/static
depends_on:
- redis
- db
redis:
image: redis:alpine
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
9. 运营数据分析
我们埋点了几个关键指标:
- 衣物发布转化率
- 订单完成率
- 用户留存率
- 热门回收点分析
基于这些数据持续优化产品:
- 调整推荐算法权重
- 优化回收点分布
- 改进用户激励策略
10. 项目反思
这个项目给我最深的体会是:技术方案要服务于业务本质。旧衣回收系统看似简单,但实际开发中遇到了很多特殊场景:
- 非标品带来的评估难题 → 引入AI图像识别辅助定价
- 线下交接的信任问题 → 设计取件码+拍照确认流程
- 用户激励持续性 → 建立积分商城+环保证书体系
如果重做这个项目,我会在以下方面改进:
- 采用微服务架构拆分订单和用户系统
- 引入消息队列处理异步任务
- 增加更丰富的数据分析维度
这个项目的完整源码我已经整理到GitHub,包含全套部署文档和测试用例。对于想学习Django实战开发的同学,这个项目涵盖了微信生态开发、支付集成、地图服务等典型场景,是个很好的学习案例。