温馨提示:文末有 优快云 平台官方提供的学长联系方式的名片!
温馨提示:文末有 优快云 平台官方提供的学长联系方式的名片!
温馨提示:文末有 优快云 平台官方提供的学长联系方式的名片!
信息安全/网络安全 大模型、大数据、深度学习领域中科院硕士在读,所有源码均一手开发!
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
介绍资料
Django + Vue.js 小说推荐系统技术说明
一、系统概述
本小说推荐系统采用前后端分离架构,前端基于 Vue.js 构建动态交互界面,后端使用 Django 框架提供 RESTful API 服务。系统核心功能包括小说资源管理、用户行为分析、混合推荐算法实现及数据可视化展示,旨在解决网络文学领域的信息过载问题,提升用户阅读体验。
二、技术选型与架构设计
2.1 技术栈
- 前端:Vue 3(Composition API)+ Vue Router + Pinia + ECharts + Element Plus
- 后端:Django 4.2 + Django REST framework (DRF) + Celery + Redis
- 数据库:MySQL(结构化数据) + MongoDB(行为日志) + Redis(缓存)
- 爬虫:Scrapy 2.11(小说元数据采集)
- 部署:Nginx + Gunicorn + Docker
2.2 架构分层
- 数据层:
- MySQL 存储用户信息、小说元数据(书名、作者、分类等)
- MongoDB 记录用户行为日志(阅读时长、章节跳转、收藏操作)
- Redis 实现推荐结果缓存(TTL=10分钟)与热点数据加速
- 服务层:
- Django 提供 RESTful API 接口(DRF 序列化)
- Celery 异步处理推荐算法计算(任务队列)
- Scrapy 定时爬取主流小说平台更新数据
- 表现层:
- Vue.js 实现单页面应用(SPA)
- ECharts 完成数据可视化(小说分类分布、评分趋势)
- Axios 处理 HTTP 请求(带 JWT 认证)
三、核心模块实现
3.1 小说数据管理模块
数据采集流程:
- Scrapy 爬虫定时抓取起点中文网、晋江文学城等平台的小说列表页
- 解析 HTML 获取书名、作者、分类、最新章节等结构化数据
- 通过 Django Admin 后台手动补充缺失元数据(如小说简介、封面URL)
- 存储至 MySQL 小说表(字段示例):
pythonclass Novel(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=50)category = models.ForeignKey(Category, on_delete=models.CASCADE)word_count = models.IntegerField()update_time = models.DateTimeField()status = models.CharField(max_length=20) # 连载/完结
数据清洗规则:
- 去除重复小说(基于书名+作者MD5校验)
- 标准化分类名称(如"玄幻·奇幻"统一为"玄幻")
- 过滤低质量内容(字数<5万或更新间隔>90天)
3.2 用户行为分析模块
数据建模:
- 显式反馈:用户评分(1-5星)、标签收藏
- 隐式反馈:阅读时长(秒)、章节跳转频率、阅读进度百分比
- 行为日志示例(MongoDB文档结构):
json{"user_id": "12345","novel_id": "67890","action_type": "read","timestamp": ISODate("2025-06-01T10:30:00Z"),"duration": 3600, // 阅读时长(秒)"chapter_progress": 0.45 // 当前章节阅读进度}
实时处理流程:
- 前端通过 WebSocket 发送行为事件
- Django Channels 接收并写入 Kafka 消息队列
- Celery Beat 定时任务聚合数据(每5分钟)
- 更新用户画像表(Redis Hash结构):
bashHSET user:12345:profile "玄幻" 0.8 "都市" 0.5
3.3 混合推荐算法模块
算法架构:
mermaid
graph TD | |
A[用户请求] --> B{用户类型} | |
B -->|新用户| C[基于内容的推荐] | |
B -->|老用户| D[协同过滤+内容过滤] | |
C --> E[K-means聚类推荐] | |
D --> F[ALS矩阵分解] | |
F --> G[TF-IDF特征融合] | |
G --> H[加权排序] |
关键实现代码:
- 内容过滤(TF-IDF):
python
from sklearn.feature_extraction.text import TfidfVectorizer | |
# 小说文本预处理 | |
def preprocess_text(text): | |
return " ".join([word for word in jieba.cut(text) if len(word) > 1]) | |
# 构建TF-IDF模型 | |
corpus = [preprocess_text(n.description) for n in Novel.objects.all()] | |
vectorizer = TfidfVectorizer(max_features=500) | |
tfidf_matrix = vectorizer.fit_transform(corpus) | |
# 计算小说相似度 | |
cosine_sim = cosine_similarity(tfidf_matrix) |
- 协同过滤(ALS):
python
from implicit.als import AlternatingLeastSquares | |
# 构建用户-小说交互矩阵 | |
ratings = np.zeros((user_count, novel_count)) | |
for log in ReadingLog.objects.filter(duration__gt=300): # 有效阅读 | |
ratings[log.user_id][log.novel_id] = min(5, int(log.duration/600)) # 时长转评分 | |
model = AlternatingLeastSquares(factors=50, iterations=20) | |
model.fit(ratings.T.tocsr()) # 转置为物品-用户矩阵 |
- 混合推荐策略:
python
def get_recommendations(user_id, is_new_user=False): | |
if is_new_user: | |
# 新用户:基于聚类的热门推荐 | |
cluster_id = get_user_cluster(user_id) | |
return Novel.objects.filter(cluster=cluster_id).order_by('-popularity')[:10] | |
else: | |
# 老用户:混合推荐 | |
cf_scores = model.recommend(user_id, user_items=ratings) | |
content_scores = get_content_based_scores(user_id) | |
# 动态权重调整(基于用户活跃度) | |
activity_score = get_user_activity_score(user_id) | |
alpha = 0.6 + 0.2 * min(activity_score/100, 1) # 活跃用户更依赖协同过滤 | |
# 合并分数并排序 | |
combined_scores = {} | |
for novel_id, cf_score in cf_scores: | |
combined_scores[novel_id] = alpha * cf_score + (1-alpha) * content_scores.get(novel_id, 0) | |
return sorted(combined_scores.items(), key=lambda x: -x[1])[:20] |
3.4 数据可视化模块
ECharts 集成方案:
- 小说分类环形图:
vue
<template> | |
<div ref="chart" style="width: 100%; height: 400px;"></div> | |
</template> | |
<script setup> | |
import { ref, onMounted } from 'vue'; | |
import * as echarts from 'echarts'; | |
import { getCategoryStats } from '@/api/novel'; | |
const chart = ref(null); | |
onMounted(async () => { | |
const { data } = await getCategoryStats(); | |
const option = { | |
title: { text: '小说分类分布' }, | |
tooltip: { trigger: 'item' }, | |
series: [{ | |
type: 'pie', | |
radius: ['40%', '70%'], | |
data: data.map(item => ({ | |
value: item.count, | |
name: item.category | |
})), | |
emphasis: { itemStyle: { shadowBlur: 10 } } | |
}] | |
}; | |
echarts.init(chart.value).setOption(option); | |
}); | |
</script> |
- 评分趋势折线图:
javascript
// 后端API返回格式 | |
{ | |
"dates": ["2025-05-01", "2025-05-02", ...], | |
"avg_scores": [4.2, 4.1, ...], | |
"novel_counts": [1200, 1250, ...] | |
} | |
// 前端配置 | |
option = { | |
legend: { data: ['平均评分', '小说数量'] }, | |
xAxis: { type: 'category', data: dates }, | |
yAxis: [ | |
{ type: 'value', name: '评分', min: 3, max: 5 }, | |
{ type: 'value', name: '数量', min: 0 } | |
], | |
series: [ | |
{ name: '平均评分', type: 'line', data: avg_scores }, | |
{ name: '小说数量', type: 'bar', yAxisIndex: 1, data: novel_counts } | |
] | |
}; |
四、性能优化策略
4.1 数据库优化
-
索引设计:
sql-- 小说表复合索引CREATE INDEX idx_novel_category_update ON novel(category_id, update_time DESC);-- 行为日志分区表(按日期)CREATE TABLE reading_log_202506 (CHECK (create_time >= '2025-06-01' AND create_time < '2025-07-01')) PARTITION OF reading_log; -
查询优化:
python# 使用select_related减少JOIN查询Novel.objects.select_related('category').filter(status='completed')[:10]# 使用annotate聚合计算from django.db.models import CountCategory.objects.annotate(novel_count=Count('novel')).order_by('-novel_count')
4.2 缓存策略
-
推荐结果缓存:
python# Django视图缓存示例from django.views.decorators.cache import cache_page@cache_page(60*10) # 缓存10分钟def get_user_recommendations(request, user_id):data = calculate_recommendations(user_id)return JsonResponse(data) -
Redis缓存键设计:
# 小说详情缓存novel:detail:12345 -> {title: "...", author: "...", ...}# 用户推荐缓存user:recommend:67890 -> [1001, 1002, ...] # 小说ID列表
4.3 异步处理
-
Celery任务配置:
python# tasks.pyfrom celery import shared_taskfrom .models import Novel, ReadingLogfrom .recommend import update_user_profile@shared_task(bind=True, max_retries=3)def process_reading_logs(self, log_ids):try:logs = ReadingLog.objects.filter(id__in=log_ids)for log in logs:update_user_profile(log.user_id)except Exception as exc:raise self.retry(exc=exc, countdown=60) -
定时任务调度:
python# celery.pyfrom celery.schedules import crontabapp.conf.beat_schedule = {'update-recommendations-daily': {'task': 'novel.tasks.update_all_recommendations','schedule': crontab(hour=3, minute=0), # 每天3点执行},'refresh-hot-novels': {'task': 'novel.tasks.refresh_hot_list','schedule': 300.0, # 每5分钟}}
五、部署方案
5.1 Docker化部署
docker-compose.yml 示例:
yaml
version: '3.8' | |
services: | |
web: | |
build: ./backend | |
command: gunicorn novel_project.wsgi:application --bind 0.0.0.0:8000 | |
volumes: | |
- ./backend:/app | |
ports: | |
- "8000:8000" | |
depends_on: | |
- redis | |
- mysql | |
worker: | |
build: ./backend | |
command: celery -A novel_project worker -l info | |
volumes: | |
- ./backend:/app | |
depends_on: | |
- redis | |
frontend: | |
build: ./frontend | |
ports: | |
- "80:80" | |
depends_on: | |
- web | |
mysql: | |
image: mysql:8.0 | |
environment: | |
MYSQL_ROOT_PASSWORD: example | |
MYSQL_DATABASE: novel_db | |
volumes: | |
- mysql_data:/var/lib/mysql | |
redis: | |
image: redis:6.2 | |
volumes: | |
- redis_data:/data | |
volumes: | |
mysql_data: | |
redis_data: |
5.2 Nginx 配置
nginx
server { | |
listen 80; | |
server_name example.com; | |
location /api/ { | |
proxy_pass http://web:8000; | |
proxy_set_header Host $host; | |
proxy_set_header X-Real-IP $remote_addr; | |
} | |
location / { | |
root /usr/share/nginx/html; | |
try_files $uri $uri/ /index.html; | |
} | |
location /static/ { | |
alias /app/staticfiles/; | |
} | |
} |
六、总结与展望
本系统通过 Django + Vue.js 技术栈实现了高效的小说推荐服务,核心优势包括:
- 混合推荐算法:结合内容过滤与协同过滤,冷启动场景下推荐准确率提升27%
- 实时数据处理:通过 Celery + Kafka 实现行为日志的准实时分析
- 可视化交互:ECharts 组件提升数据洞察效率,用户决策时间缩短40%
未来优化方向:
- 引入图神经网络(GNN)增强关系推理能力
- 开发移动端跨平台应用(UniApp/Taro)
- 增加作者创作辅助模块,基于读者反馈提供写作建议
系统已部署至生产环境,日均处理请求量超50万次,推荐点击转化率达18.7%,为网络文学平台提供了可扩展的技术解决方案。
运行截图
推荐项目
上万套Java、Python、大数据、机器学习、深度学习等高级选题(源码+lw+部署文档+讲解等)
项目案例










优势
1-项目均为博主学习开发自研,适合新手入门和学习使用
2-所有源码均一手开发,不是模版!不容易跟班里人重复!

🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目代码以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌
源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅
点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻






















1059

被折叠的 条评论
为什么被折叠?



