基于Python的中国古诗词数据可视化分析系统 - 技术实现与架构设计
作者:码界筑梦坊
发布时间:2025年
技术栈:Python + Django + Vue.js + MySQL + 智谱AI
📖 目录
- 项目概述
- 技术架构
- 核心功能
- 数据库设计
- 前端实现
- 后端API设计
- AI智能写诗
- 数据可视化
- 部署与运维
- 项目特色
- 技术难点与解决方案
- 未来规划
- 项目目录结构
- API索引(已实现)
- 常见问题FAQ
- 最佳实践与总结
- 联系方式
- 致谢
🎯 项目概述
本项目是一个基于Python技术栈的中国古诗词数据可视化分析系统,集成了诗词浏览、AI智能写诗、数据可视化分析等功能。系统采用前后端分离架构,后端使用Django REST Framework提供API服务,前端使用Vue.js构建用户界面,数据库采用MySQL存储诗词数据。
项目背景
随着传统文化的复兴,古诗词作为中华文化的重要组成部分,其数字化展示和智能分析需求日益增长。本项目旨在构建一个现代化的古诗词数据平台,通过技术手段让传统文化焕发新的活力。
设计理念
- 文化传承:通过数字化手段保护和传承中华诗词文化
- 技术创新:结合AI技术,实现智能诗词创作
- 用户体验:提供直观友好的界面,让用户轻松浏览和交互
- 数据驱动:通过可视化分析,挖掘诗词数据的内在价值
项目演示
💭项目源码获取,码界筑梦坊各大平台同名,博客底部含联系方式卡片,欢迎咨询!
🏗️ 技术架构
技术栈详情
后端技术栈
python
# 核心框架
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 # 图像处理
前端技术栈
javascript
// 核心框架
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 // 项目脚手架
数据库设计
sql
-- 主要数据表结构
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)
);
系统架构图
展示层 数据层 后端层 前端层 数据可视化 MySQL数据库 智谱AI服务 Django REST API 后台管理 用户界面 Vue.js前端
🚀 核心功能
1. 用户管理系统
用户注册与登录
python
# 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 = '用户'
身份验证
python
# 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 None
return (user, None)
2. 诗词数据管理
数据模型设计
python
# 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集成
python
# ai_poetry/poem_generator.py
import requests
import json
def 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写诗界面
vue
<!-- 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 = true
try {
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. 数据可视化
高频词统计
python
# poetry/views.py
from collections import Counter
import jieba
class 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]
})
热门作者排行
python
@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配置
python
# 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'
}
]
}
]
}
📊 数据可视化展示
词云图示例
[词云图展示区域]
- 唐诗高频词云
- 宋词高频词云
- 元曲高频词云
作者作品统计
[柱状图展示区域]
- 热门作者作品数量排行
- 朝代分布统计
- 词牌使用频率
诗词风格分析
[雷达图展示区域]
- 不同朝代的诗词风格特征
- 作者创作风格对比
- 题材分布分析
🔧 部署与运维
环境要求
bash
# Python环境
Python 3.8+
pip 20.0+
# 数据库
MySQL 8.0+
# Node.js环境
Node.js 14.0+
npm 6.0+
快速部署
bash
# 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
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
🎨 项目特色
1. 文化传承与技术创新
- 结合传统文化与现代技术
- AI智能创作,让古诗词焕发新活力
- 数据可视化展示诗词之美
2. 用户体验优化
- 响应式设计,支持多端访问
- 直观友好的操作界面
- 丰富的交互功能
3. 技术架构先进
- 前后端分离架构
- RESTful API设计
- 模块化代码组织
4. 数据安全可靠
- 完善的用户权限管理
- 数据备份与恢复机制
- 安全的API调用
🚧 技术难点与解决方案
1. AI模型集成
难点:本地AI模型部署复杂,资源消耗大
解决方案:
- 采用智谱AI云服务
- 实现动态提示词构建
- 完善的错误处理机制
python
# 错误处理示例
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. 跨域认证问题
难点:前后端分离架构下的会话认证
解决方案:
python
# 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年以上)
- 构建诗词知识图谱
- 开发智能推荐系统
- 建立诗词创作比赛平台
- 拓展到其他文学体裁
📁 项目目录结构
text
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 等优秀开源项目
- 参与测试与反馈的每一位同学
📚 参考资料
感谢阅读!如果本文对您有帮助,请给个⭐️支持一下!