💕 基于Flask的珍爱网相亲数据可视化分析系统
一个集数据可视化、AI智能分析、用户管理于一体的现代化相亲数据分析平台

📋 目录
🎯 项目概述
项目背景
在当今数字化时代,相亲市场的数据分析变得越来越重要。本项目基于珍爱网的真实相亲数据,构建了一个功能完整的数据可视化分析系统,旨在为用户提供全面的相亲市场洞察和智能分析服务。
项目目标
- 📊 数据可视化: 多维度展示相亲数据特征
- 🤖 AI智能分析: 提供智能化的数据分析和建议
- 👥 用户管理: 完整的用户注册、登录、权限管理
- 🔍 数据探索: 支持高级搜索和数据筛选
- 📈 趋势分析: 实时数据统计和趋势分析
核心特性
- 🎨 现代化UI设计: 响应式布局,支持移动端访问
- 📊 丰富的数据可视化: 柱状图、饼图、词云、地图等
- 🤖 AI智能对话: 集成智谱AI ChatGLM模型
- 🔍 高级搜索功能: 多条件筛选和数据查询
- 📱 个性化推荐: 基于用户偏好的智能推荐
- 🔒 安全可靠: 完善的用户认证和数据保护
🏗️ 系统架构
技术栈
后端技术栈:
├── Python 3.8+
├── Flask 2.3+ (轻量级Web框架)
├── SQLAlchemy (ORM数据库操作)
├── SQLite (轻量级数据库)
├── 智谱AI ChatGLM (AI智能分析引擎)
├── jieba (中文分词处理)
├── pandas (数据分析处理)
├── numpy (数值计算)
└── matplotlib (数据可视化)
前端技术栈:
├── HTML5 + CSS3
├── JavaScript (ES6+)
├── Bootstrap 5.3 (响应式UI框架)
├── Chart.js 4.0 (数据可视化图表)
├── ECharts (高级图表库)
├── Font Awesome (图标库)
└── AOS (滚动动画库)
项目结构
code/
├── app/ # Flask应用核心
│ ├── __init__.py # 应用初始化配置
│ ├── ai_analyzer.py # AI智能分析模块
│ ├── extensions.py # Flask扩展配置
│ ├── models.py # 数据模型定义
│ └── routes/ # 路由模块
│ ├── admin.py # 管理员路由
│ ├── api.py # API接口
│ ├── auth.py # 认证路由
│ ├── main.py # 主页面路由
│ └── user.py # 用户路由
├── data/ # 数据文件和处理脚本
│ ├── dating_data.csv # 珍爱网相亲数据
│ ├── spider.py # 数据爬虫脚本
│ ├── city_extractor.py # 城市数据提取
│ └── process_wordcloud.py # 词云数据处理
├── static/ # 静态资源文件
│ ├── css/ # 样式文件
│ ├── js/ # JavaScript文件
│ └── image/ # 图片资源
├── templates/ # HTML模板
├── config.py # 配置文件
├── run.py # 启动文件
└── requirements.txt # 依赖包列表
项目演示
项目源码,码界筑梦坊,各大平台同名,欢迎咨询,文章底部含联系方式卡片哔哩哔哩个人主页
🚀 核心功能
1. 数据可视化功能
城市分布分析
python
@api.route('/stats/city')
def city_stats():
"""城市分布统计"""
try:
# 获取城市数据
city_data = db.session.query(
DatingData.city,
func.count(DatingData.id).label('count')
).filter(
DatingData.city.isnot(None),
DatingData.city != ''
).group_by(DatingData.city).order_by(
func.count(DatingData.id).desc()
).limit(20).all()
cities = [item.city for item in city_data]
counts = [item.count for item in city_data]
return jsonify({
'cities': cities,
'counts': counts
})
except Exception as e:
return jsonify({'error': str(e)}), 500
功能特点:
- 📍 展示各城市相亲数据量分布
- 🏆 Top 20城市排名展示
- 📈 动态柱状图交互
- 🔍 支持数据筛选和排序
人口统计学分析
年龄分布:
python
@api.route('/stats/age_distribution')
def age_distribution_stats():
"""年龄分布统计"""
try:
# 年龄区间统计
age_ranges = [
(18, 25), (26, 30), (31, 35),
(36, 40), (41, 45), (46, 50), (51, 60)
]
age_stats = []
for start, end in age_ranges:
count = DatingData.query.filter(
DatingData.age >= start,
DatingData.age <= end
).count()
age_stats.append({
'range': f'{start}-{end}岁',
'count': count
})
return jsonify(age_stats)
except Exception as e:
return jsonify({'error': str(e)}), 500
性别比例:
python
@api.route('/stats/gender')
def gender_stats():
"""性别比例统计"""
try:
male_count = DatingData.query.filter_by(gender='男').count()
female_count = DatingData.query.filter_by(gender='女').count()
return jsonify({
'male': male_count,
'female': female_count,
'total': male_count + female_count
})
except Exception as e:
return jsonify({'error': str(e)}), 500
2. AI智能分析功能
智能对话系统
python
class AIAnalyzer:
"""AI分析器,支持多种AI模型"""
def __init__(self):
self.logger = logging.getLogger(__name__)
self.chatglm_api_key = os.getenv('CHATGLM_API_KEY', '')
def chat_with_chatglm(self, text: str) -> str:
"""调用智谱AI ChatGLM接口"""
try:
if not self.chatglm_api_key:
return "抱歉,AI服务暂时不可用。"
url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self.chatglm_api_key}"
}
payload = {
"model": "glm-4",
"messages": [
{"role": "user", "content": text}
]
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
if response.status_code == 200:
result = response.json()
return result['choices'][0]['message']['content']
else:
return "抱歉,AI服务暂时不可用。"
except Exception as e:
self.logger.error(f"ChatGLM对话失败: {e}")
return "抱歉,AI服务暂时不可用。"
功能特点:
- 💬 集成智谱AI ChatGLM模型
- 🗣️ 支持自然语言查询
- 💡 提供个性化建议和分析
- 📝 对话历史记录保存
数据分析功能
- 📈 数据趋势分析
- 👤 用户画像生成
- 💕 匹配度评估
- 📊 市场洞察报告
3. 用户管理功能
用户认证系统
python
class User(UserMixin, db.Model):
"""用户模型"""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128))
created_at = db.Column(db.DateTime, default=datetime.utcnow)
is_active = db.Column(db.Boolean, default=True)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
用户注册/登录
python
@auth.route('/register', methods=['GET', 'POST'])
def register():
"""用户注册"""
if request.method == 'POST':
username = request.form.get('username')
email = request.form.get('email')
password = request.form.get('password')
# 验证用户信息
if User.query.filter_by(username=username).first():
flash('用户名已存在')
return redirect(url_for('auth.register'))
if User.query.filter_by(email=email).first():
flash('邮箱已被注册')
return redirect(url_for('auth.register'))
# 创建新用户
user = User(username=username, email=email)
user.set_password(password)
db.session.add(user)
db.session.commit()
flash('注册成功!请登录')
return redirect(url_for('auth.login'))
return render_template('auth/register.html')
📊 数据可视化
1. 图表展示
Chart.js 柱状图
javascript
// 城市分布图表
function renderCityChart(data) {
const ctx = document.getElementById('cityChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: data.cities,
datasets: [{
label: '用户数量',
data: data.counts,
backgroundColor: 'rgba(255, 107, 157, 0.8)',
borderColor: 'rgba(255, 107, 157, 1)',
borderWidth: 2
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
title: {
display: true,
text: '城市分布统计'
}
},
scales: {
y: {
beginAtZero: true
}
}
}
});
}
ECharts 词云图
javascript
// 自我介绍词云
function renderWordCloud(data) {
const chart = echarts.init(document.getElementById('wordcloud'));
const option = {
series: [{
type: 'wordCloud',
shape: 'circle',
left: 'center',
top: 'center',
width: '70%',
height: '80%',
right: null,
bottom: null,
sizeRange: [12, 60],
rotationRange: [-90, 90],
rotationStep: 45,
gridSize: 8,
drawOutOfBound: false,
textStyle: {
fontFamily: 'sans-serif',
fontWeight: 'bold',
color: function () {
return 'rgb(' + [
Math.round(Math.random() * 160),
Math.round(Math.random() * 160),
Math.round(Math.random() * 160)
].join(',') + ')';
}
},
emphasis: {
focus: 'self',
textStyle: {
shadowBlur: 10,
shadowColor: '#333'
}
},
data: data
}]
};
chart.setOption(option);
}
2. 数据统计
实时数据统计
python
@api.route('/stats/overview')
def stats_overview():
"""数据概览统计"""
try:
total_users = DatingData.query.count()
male_count = DatingData.query.filter_by(gender='男').count()
female_count = DatingData.query.filter_by(gender='女').count()
# 平均年龄
avg_age = db.session.query(func.avg(DatingData.age)).scalar()
# 平均身高
avg_height = db.session.query(func.avg(DatingData.height)).scalar()
return jsonify({
'total_users': total_users,
'male_count': male_count,
'female_count': female_count,
'male_ratio': round(male_count / total_users * 100, 1),
'female_ratio': round(female_count / total_users * 100, 1),
'avg_age': round(avg_age, 1),
'avg_height': round(avg_height, 1)
})
except Exception as e:
return jsonify({'error': str(e)}), 500
🤖 AI智能分析
1. 智能对话界面
前端实现
html
<!-- AI聊天页面 -->
<div class="chat-container">
<!-- 欢迎消息 -->
<div class="message-bubble message-ai">
<div class="d-flex align-items-center mb-2">
<i class="fas fa-robot me-2" style="color: #ff6b9d;"></i>
<strong>AI助手</strong>
</div>
<p class="mb-0">你好!我是你的AI情感助手 💕 我可以帮你分析相亲数据、提供情感建议,或者回答任何关于爱情的问题。</p>
</div>
<!-- 快速问题按钮 -->
<div class="mt-4">
<p class="text-muted mb-3">
<i class="fas fa-lightbulb me-2"></i>
快速问题:
</p>
<div class="d-flex flex-wrap gap-2">
<button class="btn btn-outline-primary btn-sm" onclick="askQuestion('如何提高相亲成功率?')">
<i class="fas fa-star me-1"></i>提高相亲成功率
</button>
<button class="btn btn-outline-primary btn-sm" onclick="askQuestion('数据分析显示什么?')">
<i class="fas fa-chart-bar me-1"></i>数据分析
</button>
</div>
</div>
<!-- 消息容器 -->
<div id="messages-container"></div>
</div>
JavaScript交互
javascript
// 发送消息
function sendMessage() {
const messageInput = document.getElementById('message-input');
const message = messageInput.value.trim();
if (message) {
appendMessage(message, 'user');
messageInput.value = '';
showWaitingMessage(true);
fetch('/api/ai/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
message: message,
model: 'chatglm'
})
})
.then(response => response.json())
.then(data => {
hideWaitingMessage();
if (data.response) {
appendMessage(data.response, 'ai');
} else {
appendMessage(data.error || '抱歉,我现在无法回答这个问题。', 'ai');
}
})
.catch(error => {
hideWaitingMessage();
appendMessage('网络错误,请检查连接后重试。', 'ai');
});
}
}
2. 数据分析功能
性格分析
python
def analyze_personality_text(text):
"""分析文本中的性格特点"""
if not text:
return {}
# 性格特征关键词字典
personality_keywords = {
'外向开朗': ['开朗', '外向', '活泼', '热情', '爱笑', '幽默'],
'内向稳重': ['稳重', '内向', '安静', '沉稳', '成熟', '理性'],
'积极乐观': ['乐观', '积极', '阳光', '正能量', '向上'],
'温柔体贴': ['温柔', '体贴', '善解人意', '细心', '关心'],
'独立自信': ['独立', '自信', '自强', '自主', '有主见']
}
# 统计各性格特征的出现次数
trait_scores = {}
text_lower = text.lower()
for trait, keywords in personality_keywords.items():
score = 0
for keyword in keywords:
if keyword in text_lower:
score += 1
if score > 0:
trait_scores[trait] = score
return trait_scores
👥 用户管理
1. 用户功能
用户注册/登录
- 🔐 安全的用户认证系统
- 📝 用户信息验证
- 🔒 密码加密存储
- 📧 邮箱验证(可选)
个人资料管理
- 👤 个人信息编辑
- 🔐 密码修改
- 📸 头像上传
- ⚙️ 偏好设置
2. 管理员功能
用户管理
python
@admin.route('/users')
@login_required
@admin_required
def manage_users():
"""用户管理"""
page = request.args.get('page', 1, type=int)
users = User.query.paginate(
page=page, per_page=20, error_out=False
)
return render_template('admin/users.html', users=users)
数据管理
- 📊 数据统计查看
- 🔄 数据更新管理
- 📈 系统监控
- 🛠️ 系统设置
🚀 部署指南
1. 环境准备
bash
# 克隆项目
git clone <repository-url>
cd code
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
venv\Scripts\activate # Windows
# 安装依赖
pip install -r requirements.txt
2. 数据库配置
python
# config.py
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
3. AI模型配置
bash
# 设置环境变量
export CHATGLM_API_KEY=your_chatglm_api_key_here
export SECRET_KEY=your_secret_key_here
4. 启动应用
bash
# 初始化数据库
flask db upgrade
# 启动应用
python run.py
🌟 项目亮点
1. 技术先进性
- 多模型AI集成: 支持Ollama、OpenAI、ChatGLM等多种AI模型
- 现代化UI设计: 采用玻璃拟态设计,用户体验优秀
- 响应式布局: 完美适配各种设备屏幕
- 实时数据更新: 动态数据展示和趋势分析
2. 功能完整性
- 数据可视化: 丰富的图表展示和交互功能
- AI智能分析: 智能对话和数据分析功能
- 用户管理: 完整的用户认证和权限管理
- 搜索功能: 高级搜索和数据筛选
3. 扩展性强
- 模块化设计: 清晰的代码结构和模块划分
- 插件化架构: 易于添加新功能和扩展
- API接口: 完善的RESTful API设计
- 配置灵活: 支持多种部署环境
4. 用户体验
- 直观的界面: 简洁明了的数据展示
- 流畅的交互: 响应迅速的页面操作
- 个性化服务: 基于用户偏好的智能推荐
- 移动端适配: 完美的移动端体验
📈 数据展示
1. 数据概览
- 总用户数: 10,000+
- 数据维度: 年龄、性别、身高、学历、薪资、城市等
- 数据来源: 珍爱网真实相亲数据
- 更新频率: 实时更新
2. 可视化效果
- 城市分布: 柱状图展示各城市用户分布
- 年龄分布: 饼图展示年龄区间分布
- 性别比例: 环形图展示男女比例
- 词云分析: 基于自我介绍的词云展示
3. AI分析能力
- 智能对话: 自然语言查询和回答
- 数据分析: 趋势分析和洞察报告
- 个性化建议: 基于数据的个性化推荐
- 情感分析: 文本情感倾向分析
🎯 总结与展望
项目成果
- 技术实现: 成功构建了完整的相亲数据可视化分析系统
- 功能完善: 涵盖了数据展示、AI分析、用户管理等核心功能
- 用户体验: 提供了现代化、直观的用户界面
- 扩展性: 具备良好的扩展性和维护性
技术收获
- Flask开发: 深入理解Flask框架的应用开发
- 数据可视化: 掌握了多种图表库的使用方法
- AI集成: 学会了多种AI模型的集成技术
- 前端开发: 提升了现代化前端开发技能
未来规划
- 功能扩展: 添加更多AI功能和数据分析能力
- 性能优化: 进一步提升系统性能和响应速度
- 用户体验: 持续改进用户界面和交互体验
- 数据安全: 加强数据保护和隐私安全
技术栈总结
- 后端: Flask + SQLAlchemy + AI模型集成
- 前端: HTML5 + CSS3 + JavaScript + Bootstrap
- 数据可视化: Chart.js + ECharts
- AI: 智谱AI ChatGLM + OpenAI + Ollama
- 数据库: SQLite/MySQL
- 部署: 支持Docker容器化部署
这个项目展示了如何将现代Web技术与AI技术相结合,为用户提供智能化的数据分析服务。通过模块化设计和良好的代码组织,项目具有良好的可维护性和扩展性,为相亲数据分析领域提供了一个完整的解决方案。
本文详细介绍了珍爱网相亲数据可视化分析系统的设计与实现,希望对读者有所帮助。如有疑问,欢迎交流讨论!
📚 参考资料
🔗 相关链接
- 项目GitHub仓库
- 在线演示地址
- 技术文档
- 后端: Flask + SQLAlchemy + AI模型集成
- 前端: HTML5 + CSS3 + JavaScript + Bootstrap
- 数据可视化: Chart.js + ECharts
- AI: 智谱AI ChatGLM + OpenAI + Ollama
- 数据库: SQLite/MySQL
- 部署: 支持Docker容器化部署
这个项目展示了如何将现代Web技术与AI技术相结合,为用户提供智能化的数据分析服务。通过模块化设计和良好的代码组织,项目具有良好的可维护性和扩展性,为相亲数据分析领域提供了一个完整的解决方案。
本文详细介绍了珍爱网相亲数据可视化分析系统的设计与实现,希望对读者有所帮助。如有疑问,欢迎交流讨论!