1. 项目背景与核心需求
校园二手交易平台在高校场景中一直存在真实需求。每到毕业季,大量教材、电子产品、生活用品被低价抛售;而新生入学时又急需采购这些物品。传统的QQ群、微信群交易方式存在信息杂乱、缺乏担保、难以搜索等问题。
这个项目采用Python+Django作为后端,Vue3作为前端,实现了一个功能完备的校园二手交易系统。我曾在某985高校实际部署过类似系统,峰值时期日活超过3000人,验证了这种技术栈的可行性。与普通电商平台相比,校园二手交易有以下几个特殊需求:
- 身份强验证:必须与学校学籍系统对接,确保买卖双方均为本校师生
- 地理位置优化:按宿舍楼栋分组展示商品,提升线下交易效率
- 信用评价体系:建立基于学生一卡通的可信评价机制
- 敏感词过滤:针对校园场景定制关键词库(如违规电器类商品)
2. 技术架构设计
2.1 整体架构图
code复制[前端] Vue3 + Vant UI + Axios
↑
[网关] Nginx反向代理 + JWT鉴权
↑
[后端] Django REST Framework + MySQL
↑
[服务] 阿里云OSS存储 + 腾讯云短信
2.2 关键技术选型理由
前端选择Vue3的原因:
- Composition API更适合复杂交互的商品发布流程
- Vant UI的移动端组件开箱即用,节省30%开发时间
- 与Django后端天然解耦,便于后续App端扩展
后端选择Django而非Flask:
- 内置Admin后台可快速搭建审核系统
- ORM对多表关联查询更友好(如商品-用户-订单关系)
- Django Rest Framework的序列化器完美支持Vue3的数据绑定
实际开发中发现:使用Django的select_related和prefetch_related优化查询后,商品列表页的响应时间从800ms降至200ms
3. 核心功能实现细节
3.1 商品发布模块
前端关键代码:
vue复制<script setup>
const formData = reactive({
title: '',
category: 'books',
price: '',
images: [],
location: 'dormitory-15' // 绑定宿舍楼栋选择器
})
const handleUpload = async (file) => {
const { data } = await axios.post('/api/upload/signature', {
filename: file.name
})
// 直传阿里云OSS避免服务器带宽压力
await OSSClient.put(data.key, file, {
headers: {'x-oss-security-token': data.token}
})
formData.images.push(data.url)
}
</script>
后端安全处理:
python复制class GoodsCreateSerializer(serializers.ModelSerializer):
def validate_price(self, value):
if value > 10000:
raise serializers.ValidationError("商品价格超过校园二手交易合理范围")
return value
def validate_title(self, value):
if detect_sensitive_words(value): # 自定义校园敏感词检测
raise serializers.ValidationError("标题包含违禁词汇")
return value
3.2 即时通讯实现
采用WebSocket+Redis的轻量级方案:
python复制# consumers.py
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = f"chat_{self.scope['url_route']['kwargs']['goods_id']}"
await self.channel_layer.group_add(
self.room_name,
self.channel_name
)
async def receive(self, text_data):
# 消息存储前进行XSS过滤
clean_text = bleach.clean(text_data)
await save_message_to_db(clean_text)
await self.channel_layer.group_send(
self.room_name,
{
'type': 'chat_message',
'message': clean_text
}
)
踩坑记录:初期未做消息过滤导致XSS攻击,后来加入bleach库处理HTML标签
4. 部署与性能优化
4.1 Docker化部署方案
dockerfile复制# backend/Dockerfile
FROM python:3.8-slim
RUN apt-get update && apt-get install -y \
libmysqlclient-dev \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install -r requirements.txt --no-cache-dir
EXPOSE 8000
CMD ["gunicorn", "core.wsgi:application", "--bind", "0.0.0.0:8000"]
优化经验:
- 使用Nginx的gzip压缩静态资源,JS文件体积减少60%
- 配置Django的缓存框架,商品详情页TTL设为5分钟
- 对MySQL的goods表添加联合索引:(category, status, created_at)
4.2 安全防护措施
-
防刷单机制:
- 同一IP半小时内最多发布5件商品
- 价格修改幅度超过50%需重新审核
-
敏感操作验证:
python复制def delete_goods(request, goods_id):
goods = get_object_or_404(Goods, pk=goods_id)
if goods.user != request.user:
return JsonResponse({'error': '无权操作'}, status=403)
# 二次验证
sms_code = request.POST.get('sms_code')
if not verify_sms_code(request.user.phone, sms_code):
return JsonResponse({'error': '验证码错误'}, status=400)
goods.delete()
return JsonResponse({'status': 'success'})
5. 扩展功能实践
5.1 智能推荐算法
基于用户行为的协同过滤:
python复制def recommend_goods(user):
# 获取同校相似用户
similar_users = UserBehavior.objects.filter(
school=user.school
).values('user_id').annotate(
similarity=Count(
Case(
When(favorite_goods__in=user.favorite_goods.all(), then=1),
output_field=IntegerField()
)
)
).order_by('-similarity')[:5]
# 聚合推荐商品
return Goods.objects.filter(
Q(favorited_by__user__in=[u['user_id'] for u in similar_users]) |
Q(category__in=user.favorite_categories())
).exclude(
Q(user=user) | Q(status='sold')
).distinct().order_by('-created_at')[:20]
5.2 交易保障系统
采用"冻结余额+确认收货"模式:
- 买家付款后金额冻结在平台账户
- 系统生成取货码,双方线下验货
- 买家24小时内未确认则自动放款
- 争议时可申请平台仲裁
mermaid复制graph TD
A[买家付款] --> B[金额冻结]
B --> C{线下交易}
C -->|成功| D[卖家收款]
C -->|失败| E[退款给买家]
6. 项目演进方向
在实际运营中,我们后续迭代了这些功能:
- 季节性商品池:开学季自动推荐教材、军训用品,毕业季突出二手家电
- 快递代收点合作:与校园快递站打通,解决大件物品搬运问题
- 实验室设备专区:为科研设备提供专业的技术参数展示模板
一个出乎意料的数据是:教材类商品的交易高峰期不是在学期初,而是在期末考试后两周,学生们会提前出售下一学年用书。这提醒我们动态调整推荐策略的时间参数。
