1. 项目背景与核心价值
二手商品交易平台在当今社会已经成为一种刚需。根据Statista的数据,2022年全球二手电商市场规模已达960亿美元,预计到2027年将增长至2890亿美元。这种背景下,掌握一个完整的二手交易系统开发流程,对于开发者而言具有极高的实用价值。
这个基于Django的二手交易系统项目提供了完整的源码和详尽的部署文档,解决了开发者从零搭建交易平台的几个核心痛点:
- 完整的业务逻辑实现:包含用户认证、商品发布、交易流程、消息通知等电商核心功能模块
- 规范的Django项目结构:展示了大型Django项目应有的组织方式
- 生产级部署方案:不仅限于开发环境,还提供了真实服务器部署的完整指南
- 可扩展的架构设计:便于二次开发和功能扩展
提示:这个项目特别适合有一定Python基础,想进阶学习Django全栈开发的学习者,或者需要快速搭建二手交易平台原型的创业团队。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构与技术选型
2.1 整体架构设计
系统采用经典的三层架构:
code复制前端展示层 (HTML/CSS/JavaScript)
↓
业务逻辑层 (Django Views)
↓
数据访问层 (Django ORM)
↓
数据库层 (MySQL/PostgreSQL)
这种分层设计使得各模块职责清晰,便于维护和扩展。特别值得注意的是,项目采用了Django的MTV(Model-Template-View)模式,这是Django区别于其他框架的核心特点。
2.2 核心技术组件
- Django 3.2 LTS:选择长期支持版本确保稳定性
- Django REST framework:为未来API扩展预留接口
- Celery:异步任务处理(如邮件通知)
- Redis:缓存和Celery消息代理
- Bootstrap 5:响应式前端框架
- jQuery:简化DOM操作和AJAX请求
2.3 数据库设计
系统包含以下核心数据模型:
python复制class User(AbstractUser):
credit_score = models.IntegerField(default=100)
avatar = models.ImageField(upload_to='avatars/')
class Product(models.Model):
seller = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
description = models.TextField()
price = models.DecimalField(max_digits=10, decimal_places=2)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
status_choices = [
('available', '可交易'),
('sold', '已售出'),
('removed', '已下架')
]
status = models.CharField(max_length=20, choices=status_choices, default='available')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Order(models.Model):
buyer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders_bought')
seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders_sold')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
status_choices = [
('pending', '待付款'),
('paid', '已付款'),
('shipped', '已发货'),
('completed', '已完成'),
('cancelled', '已取消')
]
status = models.CharField(max_length=20, choices=status_choices, default='pending')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
这种设计充分考虑了二手交易的特殊性,比如:
- 用户信用评分机制
- 商品状态流转
- 交易流程控制
3. 核心功能实现详解
3.1 用户认证系统
项目扩展了Django内置的User模型,增加了信用评分和头像字段。认证系统包含以下关键功能:
- 注册与登录:使用Django的
django.contrib.auth视图 - 密码重置:通过邮件发送重置链接
- 个人资料编辑:支持头像上传和个人信息修改
- 信用评分机制:根据交易行为动态调整
关键代码片段:
python复制# accounts/views.py
from django.contrib.auth.views import LoginView, LogoutView
from django.contrib.auth.forms import UserCreationForm
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
class CustomLoginView(LoginView):
template_name = 'accounts/login.html'
class CustomLogoutView(LogoutView):
next_page = '/'
class SignUpView(CreateView):
form_class = UserCreationForm
success_url = reverse_lazy('login')
template_name = 'accounts/signup.html'
3.2 商品发布与管理
商品系统实现了以下功能:
- 多图上传:使用Django的
ImageField和django-cleanup自动处理图片 - 分类管理:支持多级商品分类
- 搜索功能:基于Django的Q对象实现多条件搜索
- 状态管理:商品上架、下架、标记已售出等状态流转
搜索功能实现示例:
python复制# products/views.py
from django.db.models import Q
def product_search(request):
query = request.GET.get('q', '')
category_id = request.GET.get('category', '')
products = Product.objects.filter(status='available')
if query:
products = products.filter(
Q(title__icontains=query) |
Q(description__icontains=query)
)
if category_id:
products = products.filter(category_id=category_id)
return render(request, 'products/search_results.html', {
'products': products,
'query': query
})
3.3 交易流程实现
交易系统是项目的核心,主要流程包括:
- 联系卖家:通过站内信系统发起咨询
- 创建订单:买家确认购买后生成订单
- 支付处理:集成支付宝/微信支付沙箱环境
- 物流跟踪:简单的物流状态更新
- 评价系统:交易完成后双方互评
订单状态机实现:
python复制# orders/models.py
from django_fsm import FSMField, transition
class Order(models.Model):
status = FSMField(default='pending', protected=True)
@transition(field=status, source='pending', target='paid')
def mark_as_paid(self):
pass
@transition(field=status, source='paid', target='shipped')
def mark_as_shipped(self):
pass
@transition(field=status, source='shipped', target='completed')
def mark_as_completed(self):
# 更新用户信用评分
self.buyer.profile.credit_score += 5
self.seller.profile.credit_score += 5
self.buyer.profile.save()
self.seller.profile.save()
4. 项目部署实战指南
4.1 开发环境配置
-
Python环境准备:
bash复制# 推荐使用Python 3.8+ python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows pip install -r requirements.txt -
数据库迁移:
bash复制
python manage.py makemigrations python manage.py migrate -
创建超级用户:
bash复制
python manage.py createsuperuser -
运行开发服务器:
bash复制
python manage.py runserver
4.2 生产环境部署
4.2.1 服务器准备
推荐使用Ubuntu 20.04 LTS,最小化安装后执行:
bash复制# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础依赖
sudo apt install -y nginx python3-pip python3-dev build-essential libpq-dev
4.2.2 PostgreSQL配置
-
安装PostgreSQL:
bash复制sudo apt install -y postgresql postgresql-contrib -
创建数据库用户:
bash复制sudo -u postgres psql CREATE DATABASE secondhand_db; CREATE USER secondhand_user WITH PASSWORD 'your_strong_password'; ALTER ROLE secondhand_user SET client_encoding TO 'utf8'; ALTER ROLE secondhand_user SET default_transaction_isolation TO 'read committed'; ALTER ROLE secondhand_user SET timezone TO 'UTC'; GRANT ALL PRIVILEGES ON DATABASE secondhand_db TO secondhand_user; \q
4.2.3 Gunicorn配置
-
安装Gunicorn:
bash复制
pip install gunicorn -
创建Gunicorn服务文件
/etc/systemd/system/gunicorn.service:ini复制[Unit] Description=gunicorn daemon After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/path/to/your/project ExecStart=/path/to/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock your_project.wsgi:application [Install] WantedBy=multi-user.target -
启动服务:
bash复制sudo systemctl start gunicorn sudo systemctl enable gunicorn
4.2.4 Nginx配置
创建Nginx配置文件/etc/nginx/sites-available/secondhand:
nginx复制server {
listen 80;
server_name your_domain.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /path/to/your/project;
}
location /media/ {
root /path/to/your/project;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
启用配置并重启Nginx:
bash复制sudo ln -s /etc/nginx/sites-available/secondhand /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
4.3 常见部署问题解决
-
静态文件404错误:
- 确保执行了
python manage.py collectstatic - 检查Nginx配置中的静态文件路径是否正确
- 确保执行了
-
数据库连接失败:
- 检查
settings.py中的数据库配置 - 确保PostgreSQL服务正在运行
- 验证数据库用户权限
- 检查
-
Gunicorn服务无法启动:
- 检查日志:
journalctl -u gunicorn - 确保虚拟环境路径正确
- 确认Django项目路径正确
- 检查日志:
注意:生产环境务必设置
DEBUG=False,并配置好ALLOWED_HOSTS和SECRET_KEY。
5. 项目扩展与二次开发
5.1 推荐的功能扩展
-
支付系统集成:
- 支付宝/微信支付正式环境接入
- 支付结果异步通知处理
-
即时通讯:
- 集成WebSocket实现实时聊天
- 使用Django Channels或第三方服务
-
推荐系统:
- 基于用户行为的简单推荐算法
- 使用协同过滤或内容相似度
-
移动端适配:
- 开发REST API接口
- 使用Django REST framework构建移动后端
5.2 性能优化建议
-
数据库优化:
python复制# 使用select_related/prefetch_related减少查询次数 products = Product.objects.select_related('seller').prefetch_related('images').all() -
缓存策略:
- 使用Redis缓存热门商品和分类
- 实现页面片段缓存
-
异步任务:
- 使用Celery处理耗时操作(如缩略图生成、邮件发送)
-
静态资源优化:
- 使用CDN分发静态文件
- 启用Gzip压缩和浏览器缓存
5.3 安全加固措施
-
Django安全中间件:
python复制MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -
HTTPS强制跳转:
python复制SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True -
敏感信息保护:
- 使用环境变量存储敏感配置
- 避免在版本控制中提交
settings.py
-
定期备份策略:
- 数据库自动备份
- 媒体文件备份到云存储
6. 源码结构与关键文件解析
6.1 项目目录结构
code复制secondhand/
├── accounts/ # 用户认证相关
│ ├── models.py # 扩展用户模型
│ ├── views.py # 登录/注册视图
│ └── templates/ # 认证相关模板
├── products/ # 商品管理
│ ├── models.py # 商品模型
│ ├── forms.py # 商品表单
│ └── views.py # 商品视图
├── orders/ # 订单管理
│ ├── models.py # 订单模型
│ └── views.py # 订单视图
├── static/ # 静态文件
│ ├── css/ # CSS文件
│ └── js/ # JavaScript文件
├── templates/ # 基础模板
│ └── base.html # 基础模板文件
├── media/ # 用户上传文件
├── secondhand/ # 项目配置
│ ├── settings.py # 项目设置
│ ├── urls.py # 主URL路由
│ └── wsgi.py # WSGI配置
└── manage.py # Django管理脚本
6.2 关键代码解析
商品详情页视图:
python复制# products/views.py
from django.views.generic import DetailView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import get_object_or_404
from .models import Product
class ProductDetailView(DetailView):
model = Product
template_name = 'products/detail.html'
context_object_name = 'product'
def get_object(self):
obj = get_object_or_404(Product, pk=self.kwargs['pk'])
# 记录商品浏览量
obj.view_count += 1
obj.save()
return obj
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# 获取同卖家其他商品
context['other_products'] = Product.objects.filter(
seller=self.object.seller
).exclude(pk=self.object.pk)[:4]
return context
订单创建逻辑:
python复制# orders/views.py
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from products.models import Product
from .models import Order
from .forms import OrderCreateForm
class OrderCreateView(LoginRequiredMixin, CreateView):
model = Order
form_class = OrderCreateForm
template_name = 'orders/create.html'
def get_initial(self):
product = get_object_or_404(Product, pk=self.kwargs['product_id'])
return {
'product': product,
'buyer': self.request.user,
'seller': product.seller
}
def form_valid(self, form):
product = form.cleaned_data['product']
if product.status != 'available':
form.add_error(None, '该商品已不可交易')
return self.form_invalid(form)
response = super().form_valid(form)
# 更新商品状态
product.status = 'reserved'
product.save()
# 发送通知给卖家
send_order_notification.delay(
seller_id=product.seller.id,
order_id=self.object.id
)
return response
def get_success_url(self):
return reverse_lazy('order_detail', kwargs={'pk': self.object.pk})
7. 开发经验与最佳实践
7.1 Django项目组织建议
-
App划分原则:
- 按功能模块划分(如accounts, products, orders)
- 每个App保持高内聚低耦合
- 共享代码放在core或utils App中
-
模板组织技巧:
- 基础模板放在项目级templates目录
- App特定模板放在各自App的templates目录
- 使用模板继承减少重复代码
-
静态文件管理:
- 开发时使用
STATICFILES_DIRS - 生产环境使用
collectstatic - 考虑使用WhiteNoise简化静态文件服务
- 开发时使用
7.2 性能优化实战
-
数据库查询优化:
- 使用
select_related优化外键查询 - 使用
prefetch_related优化多对多关系 - 避免在循环中执行查询
- 使用
-
缓存策略实施:
python复制from django.core.cache import cache def get_popular_products(): key = 'popular_products' products = cache.get(key) if not products: products = Product.objects.filter( status='available' ).order_by('-view_count')[:10] cache.set(key, products, timeout=3600) # 缓存1小时 return products -
异步任务实践:
python复制# tasks.py from celery import shared_task from django.core.mail import send_mail @shared_task def send_order_notification(seller_id, order_id): # 获取卖家和订单信息 # 发送邮件通知 send_mail( '您有新的订单', '您有一个新的订单待处理', 'noreply@example.com', [seller.email], fail_silently=False, )
7.3 安全防护要点
-
用户输入处理:
- 始终使用Django表单或序列化器
- 对用户上传内容进行严格过滤
- 避免直接拼接SQL查询
-
敏感信息保护:
- 使用环境变量管理敏感配置
- 密码必须哈希存储
- 生产环境禁用DEBUG模式
-
CSRF防护:
- 确保所有修改数据的请求都有CSRF token
- 对API端点使用适当的认证方式
-
文件上传安全:
- 限制上传文件类型
- 扫描上传文件中的恶意内容
- 不要直接执行用户上传的文件
8. 项目资源与学习路径
8.1 推荐学习资源
-
Django官方文档:
-
Python相关书籍:
- 《Python Crash Course》
- 《Fluent Python》
- 《Two Scoops of Django》
-
在线课程:
- Udemy: Python and Django Full Stack Web Developer Bootcamp
- Coursera: Web Applications for Everybody
8.2 开发工具推荐
-
代码编辑器:
- VS Code + Python扩展
- PyCharm专业版
-
数据库工具:
- pgAdmin (PostgreSQL)
- TablePlus (多数据库支持)
-
API测试工具:
- Postman
- Insomnia
-
版本控制:
- Git + GitHub/GitLab
- Sourcetree (Git GUI)
8.3 社区与支持
-
问答平台:
- Stack Overflow
- Django中文社区
-
开源项目参考:
- Django官方示例项目
- Awesome Django列表中的项目
-
问题排查技巧:
- 阅读错误日志和堆栈跟踪
- 使用Django调试工具栏
- 在开发环境复现问题
在实际开发中,我强烈建议从简单功能开始,逐步迭代。比如先实现基本的商品展示和用户注册,再逐步添加交易功能和支付集成。Django的admin界面是一个很好的起点,可以快速搭建后台管理系统。
