108-基于Python的中国古诗词数据可视化分析系统
基于Python的中国古诗词数据可视化分析系统 - 技术实现与架构设计
作者:码界筑梦坊
发布时间:2025年
技术栈:Python + Django + Vue.js + MySQL + 智谱AI
📖 目录
- 项目概述
- 技术架构
- 核心功能
- 数据库设计
- 前端实现
- 后端API设计
- AI智能写诗
- 数据可视化
- 部署与运维
- 项目特色
- 技术难点与解决方案
- 未来规划
- 项目目录结构
- API索引(已实现)
- 常见问题FAQ
- 最佳实践与总结
- 联系方式
- 致谢
🎯 项目概述
本项目是一个基于Python技术栈的中国古诗词数据可视化分析系统,集成了诗词浏览、AI智能写诗、数据可视化分析等功能。系统采用前后端分离架构,后端使用Django REST Framework提供API服务,前端使用Vue.js构建用户界面,数据库采用MySQL存储诗词数据。
项目背景
随着传统文化的复兴,古诗词作为中华文化的重要组成部分,其数字化展示和智能分析需求日益增长。本项目旨在构建一个现代化的古诗词数据平台,通过技术手段让传统文化焕发新的活力。
设计理念
- 文化传承:通过数字化手段保护和传承中华诗词文化
- 技术创新:结合AI技术,实现智能诗词创作
- 用户体验:提供直观友好的界面,让用户轻松浏览和交互
- 数据驱动:通过可视化分析,挖掘诗词数据的内在价值
项目演示
💭项目源码获取,码界筑梦坊各大平台同名,博客底部含联系方式卡片,欢迎咨询!
🏗️ 技术架构
技术栈详情
后端技术栈
# 核心框架
Django==4.2.7 # Web框架
Django REST Framework==3.14.0 # API框架
django-simpleui==2024.4.1 # 后台管理美化
django-cors-headers==4.3.1 # 跨域处理# 数据库
MySQL==8.0 # 关系型数据库
mysqlclient==2.2.0 # MySQL驱动# AI集成
requests==2.31.0 # HTTP客户端,用于调用智谱AI
python-decouple==3.8 # 环境变量管理# 其他工具
Pillow==10.1.0 # 图像处理
前端技术栈
// 核心框架
Vue.js 3.x // 渐进式JavaScript框架
Vue Router 4.x // 路由管理
Vuex 4.x // 状态管理// UI组件库
Element Plus 2.x // Vue 3 UI组件库// 样式处理
SCSS // CSS预处理器
Axios // HTTP客户端// 构建工具
Vue CLI // 项目脚手架
数据库设计
-- 主要数据表结构
CREATE TABLE poetry_author (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,dynasty VARCHAR(50),avatar_url TEXT,famous_quotes_count INT DEFAULT 0,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE poetry_poetry (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(200) NOT NULL,content TEXT NOT NULL,author_id INT,cipai_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (author_id) REFERENCES poetry_author(id),FOREIGN KEY (cipai_id) REFERENCES poetry_cipai(id)
);
系统架构图
🚀 核心功能
1. 用户管理系统
用户注册与登录
# users/models.py
class User(AbstractUser):"""自定义用户模型"""avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)bio = models.TextField(max_length=500, blank=True)created_at = models.DateTimeField(auto_now_add=True)class Meta:verbose_name = '用户'verbose_name_plural = '用户'
身份验证
# poetry_system/authentication.py
class SessionAuthentication(authentication.SessionAuthentication):"""自定义会话认证"""def authenticate(self, request):user = getattr(request, 'user', None)if not user or not user.is_active:return Nonereturn (user, None)
2. 诗词数据管理
数据模型设计
# poetry/models.py
class Author(models.Model):"""作者模型"""name = models.CharField(max_length=100, verbose_name='姓名')dynasty = models.CharField(max_length=50, verbose_name='朝代')avatar_url = models.TextField(blank=True, verbose_name='头像URL')famous_quotes_count = models.IntegerField(default=0, verbose_name='名句数量')class Meta:verbose_name = '作者'verbose_name_plural = '作者'ordering = ['-famous_quotes_count']class Poetry(models.Model):"""诗词模型"""title = models.CharField(max_length=200, verbose_name='标题')content = models.TextField(verbose_name='内容')author = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='作者')cipai = models.ForeignKey('CiPai', on_delete=models.SET_NULL, null=True, verbose_name='词牌')class Meta:verbose_name = '诗词'verbose_name_plural = '诗词'ordering = ['-id']
3. AI智能写诗
智谱AI集成
# ai_poetry/poem_generator.py
import requests
import jsondef generate_poem_zhipuai(prompt, model_type, line_type):"""调用智谱AI生成诗词"""api_key = "your_zhipuai_api_key"url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"# 根据参数构建提示词if model_type == "Tang":style = "唐诗"elif model_type == "Song":style = "宋词"else:style = "元曲"if line_type == "5":line_style = "五言"else:line_style = "七言"system_prompt = f"你是一位精通{style}的诗人,请根据关键词'{prompt}'创作一首{line_style}{style}。要求:1. 符合{style}的格律要求 2. 意境优美,用词精炼 3. 体现关键词的意境"headers = {"Authorization": f"Bearer {api_key}","Content-Type": "application/json"}data = {"model": "glm-4","messages": [{"role": "system", "content": system_prompt},{"role": "user", "content": f"请以'{prompt}'为主题创作一首{line_style}{style}"}],"temperature": 0.8,"max_tokens": 200}try:response = requests.post(url, headers=headers, json=data)response.raise_for_status()result = response.json()if 'choices' in result and len(result['choices']) > 0:content = result['choices'][0]['message']['content']return {'success': True,'content': content,'model_type': model_type,'line_type': line_type}else:return {'success': False, 'error': 'AI生成失败'}except Exception as e:return {'success': False, 'error': str(e)}
前端AI写诗界面
<!-- frontend/src/views/AiPoetry.vue -->
<template><div class="ai-poetry-container"><div class="hero-section"><h1>AI智能写诗</h1><p>输入关键词,选择体裁,让AI为您创作优美的古诗词</p></div><div class="form-section"><el-form :model="form" label-width="100px"><el-form-item label="关键词"><el-input v-model="form.keywords" placeholder="请输入创作关键词"class="custom-input"/></el-form-item><el-form-item label="诗体类型"><el-select v-model="form.model_type" placeholder="选择诗体"><el-option label="唐诗" value="Tang" /><el-option label="宋词" value="Song" /><el-option label="元曲" value="Yuan" /></el-select></el-form-item><el-form-item label="句式类型"><el-select v-model="form.line_type" placeholder="选择句式"><el-option label="五言" value="5" /><el-option label="七言" value="7" /></el-select></el-form-item><el-form-item><el-button type="primary" @click="generatePoem":loading="loading":disabled="!isLoggedIn">开始创作</el-button></el-form-item></el-form></div><div v-if="result" class="result-section"><h3>创作结果</h3><div class="poem-card"><h4>{{ result.title }}</h4><p class="poem-content">{{ result.content }}</p><div class="poem-meta"><span>体裁:{{ getModelTypeName(form.model_type) }}</span><span>句式:{{ getLineTypeName(form.line_type) }}</span></div></div></div></div>
</template><script>
import axios from 'axios'export default {name: 'AiPoetry',data() {return {form: {keywords: '',model_type: 'Tang',line_type: '7'},result: null,loading: false,isLoggedIn: false}},methods: {async generatePoem() {if (!this.form.keywords.trim()) {this.$message.warning('请输入关键词')return}this.loading = truetry {const response = await axios.post('/api/ai/ai-poems/generate_zhipuai/', {prompt: this.form.keywords,model_type: this.form.model_type,line_type: this.form.line_type}, {withCredentials: true})if (response.data.success) {this.result = {title: this.form.keywords,content: response.data.content}this.$message.success('诗词创作成功!')} else {this.$message.error(response.data.error || '创作失败')}} catch (error) {this.$message.error('网络错误,请稍后重试')} finally {this.loading = false}}}
}
</script>
4. 数据可视化
高频词统计
# poetry/views.py
from collections import Counter
import jiebaclass PoetryAnalysisViewSet(viewsets.ModelViewSet):"""诗词分析视图集"""@action(detail=False, methods=['get'])def word_frequency(self, request):"""获取高频词统计"""# 获取所有诗词内容poems = Poetry.objects.all()all_text = ' '.join([poem.content for poem in poems])# 使用jieba分词words = jieba.cut(all_text)# 过滤停用词和短词stop_words = {'的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这'}filtered_words = [word for word in words if len(word) > 1 and word not in stop_words]# 统计词频word_count = Counter(filtered_words)top_words = word_count.most_common(50)return Response({'words': [word for word, count in top_words],'counts': [count for word, count in top_words]})
热门作者排行
@action(detail=False, methods=['get'])
def popular_authors(self, request):"""获取热门作者排行"""authors = Author.objects.annotate(poem_count=Count('poetry')).order_by('-poem_count')[:20]return Response({'authors': [author.name for author in authors],'counts': [author.poem_count for author in authors]})
5. 后台管理系统
Django SimpleUI配置
# poetry_system/settings.py
INSTALLED_APPS = ['simpleui', # 必须在django.contrib.admin之前'django.contrib.admin',# ... 其他应用
]# SimpleUI配置
SIMPLEUI_CONFIG = {'system_keep': False,'menu_display': ['诗词管理', '用户管理', 'AI写诗管理'],'dynamic': True,'menus': [{'name': '诗词管理','icon': 'fas fa-book','models': [{'name': '作者管理','url': 'poetry/author/','icon': 'fas fa-user'},{'name': '诗词管理','url': 'poetry/poetry/','icon': 'fas fa-file-alt'},{'name': '词牌管理','url': 'poetry/cipai/','icon': 'fas fa-tags'}]}]
}
📊 数据可视化展示
词云图示例
[词云图展示区域]
- 唐诗高频词云
- 宋词高频词云
- 元曲高频词云
作者作品统计
[柱状图展示区域]
- 热门作者作品数量排行
- 朝代分布统计
- 词牌使用频率
诗词风格分析
[雷达图展示区域]
- 不同朝代的诗词风格特征
- 作者创作风格对比
- 题材分布分析
🔧 部署与运维
环境要求
# Python环境
Python 3.8+
pip 20.0+# 数据库
MySQL 8.0+# Node.js环境
Node.js 14.0+
npm 6.0+
快速部署
# 1. 克隆项目
git clone https://github.com/your-repo/chinese-poetry-system.git
cd chinese-poetry-system# 2. 安装后端依赖
pip install -r requirements.txt# 3. 配置数据库
python manage.py migrate# 4. 创建超级用户
python manage.py createsuperuser# 5. 安装前端依赖
cd frontend
npm install# 6. 启动服务
# 后端
python manage.py runserver# 前端
npm run serve
Docker部署
# Dockerfile
FROM python:3.9-slimWORKDIR /appCOPY requirements.txt .
RUN pip install -r requirements.txtCOPY . .EXPOSE 8000CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
🎨 项目特色
1. 文化传承与技术创新
- 结合传统文化与现代技术
- AI智能创作,让古诗词焕发新活力
- 数据可视化展示诗词之美
2. 用户体验优化
- 响应式设计,支持多端访问
- 直观友好的操作界面
- 丰富的交互功能
3. 技术架构先进
- 前后端分离架构
- RESTful API设计
- 模块化代码组织
4. 数据安全可靠
- 完善的用户权限管理
- 数据备份与恢复机制
- 安全的API调用
🚧 技术难点与解决方案
1. AI模型集成
难点:本地AI模型部署复杂,资源消耗大
解决方案:
- 采用智谱AI云服务
- 实现动态提示词构建
- 完善的错误处理机制
# 错误处理示例
try:response = requests.post(url, headers=headers, json=data, timeout=30)response.raise_for_status()result = response.json()if 'choices' in result and len(result['choices']) > 0:content = result['choices'][0]['message']['content']return {'success': True, 'content': content}else:return {'success': False, 'error': 'AI生成失败'}except requests.exceptions.Timeout:return {'success': False, 'error': '请求超时'}
except requests.exceptions.RequestException as e:return {'success': False, 'error': f'网络错误: {str(e)}'}
except Exception as e:return {'success': False, 'error': f'未知错误: {str(e)}'}
2. 跨域认证问题
难点:前后端分离架构下的会话认证
解决方案:
# settings.py
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = ["http://localhost:8080","http://127.0.0.1:8080",
]# 前端配置
axios.defaults.withCredentials = true
3. 数据可视化性能
难点:大量诗词数据的实时分析
解决方案:
- 使用缓存机制
- 异步处理大数据
- 分页加载优化
🔮 未来规划
短期目标(3-6个月)
- 增加更多AI模型支持
- 优化移动端体验
- 增加诗词朗读功能
- 完善用户反馈系统
中期目标(6-12个月)
- 开发诗词创作社区
- 增加诗词翻译功能
- 支持多语言界面
- 开发移动端APP
长期目标(1年以上)
- 构建诗词知识图谱
- 开发智能推荐系统
- 建立诗词创作比赛平台
- 拓展到其他文学体裁
📁 项目目录结构
chinese-poetry-master/
├── poetry_system/ # Django项目配置与入口(settings/urls/asgi/wsgi)
├── poetry/ # 诗词模块:模型、序列化、视图、路由
├── ai_poetry/ # AI写诗模块:智谱AI集成与生成接口
├── users/ # 用户模块:注册/登录/资料
├── frontend/ # Vue3前端:页面、组件、路由、状态、样式
├── data/ # 原始数据:唐诗/宋诗/元曲/五代/千家诗等
├── spider/ # 爬虫脚本:作者/词牌抓取
├── spider_output/ # 爬虫输出
├── static/ # 静态资源:logo/截图/可视化图片
├── images/ # 其他图片资源(支付等)
├── requirements.txt # 后端依赖
├── start_system.bat # 一键启动(Windows)
└── README.md # 项目说明
🧭 API索引(已实现)
- 基础说明:所有接口基于REST风格,统一前缀与路由如下
- 后端主路由:
poetry_system/urls.py
- 统一前缀:
- 诗词模块:
/api/poetry/
- 用户模块:
/api/users/
- AI模块:
/api/ai/
- 诗词模块:
- 后端主路由:
1) AI写诗模块 ai_poetry/urls.py
- POST
/api/ai/ai-poems/generate_zhipuai/
:生成诗词(参数:prompt
、model_type
、line_type
) - GET
/api/ai/ai-poems/
:AI生成诗词列表 - GET
/api/ai/ai-poems/{id}/
:AI生成诗词详情 - GET
/api/ai/configs/
:生成配置列表 - GET
/api/ai/configs/active/
:获取激活配置
2) 诗词模块 poetry/urls.py
- GET
/api/poetry/
:诗词列表(支持search
、ordering
、分页) - GET
/api/poetry/{id}/
:诗词详情 - GET
/api/poetry/random/?count=10
:随机诗词 - GET
/api/poetry/popular/
:热门诗词 - GET
/api/poetry/authors/
:作者列表 - GET
/api/poetry/authors/hot/
:热门作者 - GET
/api/poetry/cipai/
:词牌列表 - GET
/api/poetry/comments/?poetry_id={id}
:评论列表 - POST
/api/poetry/comments/add/
:新增评论(需登录) - GET
/api/poetry/favorites/
:我的收藏(需登录) - POST
/api/poetry/favorites/toggle/
:收藏/取消收藏(需登录) - GET
/api/poetry/dynasties/
:朝代列表 - GET
/api/poetry/categories/
:分类列表 - GET
/api/poetry/chart_data/
:数据概览(用于可视化) - GET
/api/poetry/analysis/{poetry_id}/
:单篇诗词深度分析 - GET
/api/poetry/authors/{author_id}/works/
:某作者作品 - GET
/api/poetry/dynasty_stats/
:朝代统计 - GET
/api/poetry/word_frequency/
:高频词统计(支持按朝代/作者筛选)
3) 用户模块 users/urls.py
- POST
/api/users/register/
:注册 - POST
/api/users/login/
:登录(会话) - POST
/api/users/logout/
:退出 - GET
/api/users/profile/
:个人资料 - POST
/api/users/profile/update/
:更新资料
提示:部分接口需登录;前端需设置
axios
的withCredentials: true
;后端需开启CORS_ALLOW_CREDENTIALS=True
并设置白名单。
❓ 常见问题FAQ
- 401未授权(已登录仍提示未登录)
- 后端:
CORS_ALLOW_ALL_ORIGINS=False
、配置CORS_ALLOWED_ORIGINS
与CORS_ALLOW_CREDENTIALS=True
- 前端:所有请求添加
{ withCredentials: true }
- 后端:
- AI返回结构解析失败(取不到
data
)- 智谱AI返回在
choices[0].message.content
,不是data
字段
- 智谱AI返回在
- 管理后台访问404或权限问题
- 使用自定义AdminSite:访问
http://localhost:8000/admin/
- 确保注册了
Group
、Permission
模型到自定义站点
- 使用自定义AdminSite:访问
- Element Plus 输入框样式不一致
- 使用
::v-deep
覆盖内层.el-input__inner
背景、边框、阴影
- 使用
- 分页总数与前端展示不一致
- 前端走后端分页参数:
page
、page_size
;后端用DRF分页器或自定义分页
- 前端走后端分页参数:
🧠 最佳实践与总结
- 配置管理:敏感信息使用环境变量(如
ZHIPUAI_API_KEY
) - 会话认证:统一使用Session Auth,前端全局
withCredentials
- API一致性:保持请求参数与返回结构稳定,定义统一的错误码/消息
- 可视化性能:聚合统计尽量在后端完成,前端只做渲染
- AI提示词工程:根据体裁/句式动态拼装Prompt并限制
max_tokens
- 数据质量:导入前做去重、清洗;字符集统一使用
utf8mb4
- 前端UX:表单与搜索框样式统一,分页置底居中;移动端适配
- 日志与排错:后端统一日志;关键路径加监控(AI调用、收藏/评论)
📞 联系方式
- 各大平台同名:码界筑梦坊
- 欢迎在任一平台私信/留言交流合作与技术问题
🙏 致谢
- 开源社区与数据集贡献者
- 智谱AI开放平台(GLM系列)
- Django / DRF / Vue3 / Element Plus / ECharts 等优秀开源项目
- 参与测试与反馈的每一位同学
📚 参考资料
- Django官方文档
- Vue.js官方文档
- 智谱AI开放平台
- Element Plus组件库
- MySQL官方文档
感谢阅读!如果本文对您有帮助,请给个⭐️支持一下!