1. 项目背景与需求分析
作为一名长期从事Web开发的程序员,我深知传统书店管理面临的痛点。记得去年帮朋友改造他经营的小书店时,亲眼目睹了手工登记书籍、人工记忆库存的混乱场景——漏记、错记时有发生,更别提精准推荐书籍了。这正是我选择开发这套Django书籍管理及推荐系统的初衷。
现代书店管理需要解决三个核心问题:
- 信息标准化:图书信息、用户数据需要结构化存储
- 流程自动化:采购、销售、库存需要闭环管理
- 推荐智能化:基于用户行为提供个性化书单
本系统采用Python+Django+MySQL的技术栈,主要面向中小型书店经营者,通过Web界面实现:
- 图书信息的CRUD管理
- 用户权限分级控制
- 基于规则的初级推荐系统
- 论坛社区互动功能
提示:虽然Django Admin能快速生成后台,但商业系统建议自定义管理界面,本文展示的正是二次开发后的效果
2. 系统架构设计
2.1 技术选型解析
选择Django框架主要基于以下考量:
- ORM支持:通过models.py定义数据结构,自动生成数据库表
- Admin后台:快速构建管理界面(基础版)
- MTV模式:清晰分离业务逻辑与展示层
- 生态成熟:丰富的第三方包(如django-filter、django-tables2)
数据库选用MySQL而非SQLite的原因:
- 并发性能更好(实测SQLite在20+并发时响应明显下降)
- 支持更复杂的事务处理
- 便于后期扩展分库分表
开发环境配置建议:
bash复制# 创建虚拟环境
python -m venv venv
source venv/bin/activate
# 安装核心依赖
pip install django==4.2 mysqlclient django-filter
2.2 功能模块拆解
系统主要分为6个功能模块(如图1所示),其核心交互逻辑如下:
mermaid复制graph TD
A[用户模块] -->|登录| B(图书管理)
B --> C[分类管理]
B --> D[库存管理]
A -->|发帖| E[论坛模块]
D -->|生成| F[订单模块]
E -->|数据| G[推荐系统]
图1 系统模块交互图(实际实现时需替换为文字描述)
关键模型关系设计:
python复制# models.py
class Book(models.Model):
title = models.CharField(max_length=100)
category = models.ForeignKey('Category', on_delete=models.PROTECT)
# 其他字段...
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
favorite_categories = models.ManyToManyField('Category')
3. 核心功能实现
3.1 用户管理系统
用户管理界面(如图2)采用Django Tables2+Filter实现高效查询:
python复制# admin.py
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'phone', 'gender')
list_filter = ('gender',)
search_fields = ('username', 'phone')
fieldsets = [
(None, {'fields': ['username', 'password']}),
('个人信息', {'fields': ['gender', 'phone']}),
]
图2 用户管理界面示意图
安全注意事项:
- 密码必须使用
make_password()加密存储 - 敏感操作需添加
@permission_required装饰器 - 批量导入用户时要验证数据合法性
3.2 图书管理模块
图书信息管理的关键实现:
python复制# views.py
class BookListView(LoginRequiredMixin, ListView):
model = Book
paginate_by = 20
filterset_class = BookFilter
def get_queryset(self):
queryset = super().get_queryset()
return self.filterset_class(self.request.GET, queryset=queryset).qs
配套的过滤器定义:
python复制# filters.py
class BookFilter(django_filters.FilterSet):
price__gt = django_filters.NumberFilter(field_name='price', lookup_expr='gt')
class Meta:
model = Book
fields = ['category', 'author']
4. 推荐系统实现
4.1 基于规则的推荐
初始版本采用简单规则:
- 根据用户常购分类推荐
- 结合销量排行榜补全
- 新书优先展示策略
python复制def get_recommendations(user):
# 获取用户偏好分类
fav_cates = user.profile.favorite_categories.all()
# 基础推荐:同分类高评分书籍
base_qs = Book.objects.filter(
category__in=fav_cates
).exclude(
purchases__user=user
).annotate(
avg_score=Avg('reviews__score')
).order_by('-avg_score')[:5]
# 补全逻辑...
return base_qs
4.2 性能优化方案
当数据量增大时推荐:
- 使用
django-denorm实现计数器缓存 - 对推荐结果进行celery异步计算
- 添加Redis缓存层
python复制# tasks.py
@app.task
def async_update_recommendations(user_id):
user = User.objects.get(id=user_id)
recommendations = get_recommendations(user)
cache.set(f'rec_{user_id}', recommendations, timeout=3600)
5. 部署与运维
5.1 生产环境部署
推荐使用Docker Compose部署:
yaml复制# docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
app:
build: .
command: gunicorn config.wsgi:application --bind 0.0.0.0:8000
depends_on:
- db
关键配置项:
- 设置
DEBUG=False - 配置ALLOWED_HOSTS
- 使用WhiteNoise处理静态文件
5.2 常见问题排查
问题1:数据库连接缓慢
- 检查MySQL的
wait_timeout设置 - 添加
CONN_MAX_AGE参数优化连接池
问题2:推荐结果不更新
- 检查Celery worker是否正常运行
- 验证Redis缓存是否过期
6. 项目扩展方向
在实际使用中可以考虑:
- 接入第三方书单API丰富数据
- 使用协同过滤改进推荐算法
- 添加微信小程序端入口
- 集成支付系统实现线上销售
这个项目让我深刻体会到,即使是标准的CRUD系统,在细节处理上也能体现工程能力。比如用户权限的细粒度控制、推荐系统的渐进式优化,都需要结合实际业务场景不断调整。建议初学者先实现基础功能,再逐步添加高级特性。