105-基于Flask的珍爱网相亲数据可视化分析系统

💕 基于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分析能力

  • 智能对话: 自然语言查询和回答
  • 数据分析: 趋势分析和洞察报告
  • 个性化建议: 基于数据的个性化推荐
  • 情感分析: 文本情感倾向分析

🎯 总结与展望

项目成果

  1. 技术实现: 成功构建了完整的相亲数据可视化分析系统
  2. 功能完善: 涵盖了数据展示、AI分析、用户管理等核心功能
  3. 用户体验: 提供了现代化、直观的用户界面
  4. 扩展性: 具备良好的扩展性和维护性

技术收获

  1. Flask开发: 深入理解Flask框架的应用开发
  2. 数据可视化: 掌握了多种图表库的使用方法
  3. AI集成: 学会了多种AI模型的集成技术
  4. 前端开发: 提升了现代化前端开发技能

未来规划

  1. 功能扩展: 添加更多AI功能和数据分析能力
  2. 性能优化: 进一步提升系统性能和响应速度
  3. 用户体验: 持续改进用户界面和交互体验
  4. 数据安全: 加强数据保护和隐私安全

技术栈总结

  • 后端: 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技术相结合,为用户提供智能化的数据分析服务。通过模块化设计和良好的代码组织,项目具有良好的可维护性和扩展性,为相亲数据分析领域提供了一个完整的解决方案。


本文详细介绍了珍爱网相亲数据可视化分析系统的设计与实现,希望对读者有所帮助。如有疑问,欢迎交流讨论!

📚 参考资料

🔗 相关链接

相关推荐
TDengine (老段)37 分钟前
TDengine IDMP 基本功能(1.界面布局和操作)
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
乔公子搬砖1 小时前
NLP 2025全景指南:从分词到128专家MoE模型,手撕BERT情感分析实战(第四章)
人工智能·ai·自然语言处理·nlp·aigc
何以问天涯1 小时前
K210人脸识别系统
人工智能·python·嵌入式硬件·ai编程
Juchecar1 小时前
TypeScript 中字符串与数值、日期时间的相互转换
javascript·python
还是大剑师兰特1 小时前
Python面试题及详细答案150道(41-55) -- 面向对象编程篇
python·大剑师·python面试题
袋鼠云数栈前端2 小时前
扣子 Coze 产品体验功能
大数据·ai·react
Juchecar2 小时前
在TypeScript中如何实现Python中常用的dict类型及操作
javascript·python
Juchecar2 小时前
TypeScript 中字符串格式化及数值对齐的实现
javascript·python
Juchecar2 小时前
TypeScript 中类似 Python 字符串的操作及代码示例
javascript·python
Juchecar2 小时前
TypeScript 中类似 Python list 的数组操作及示例
javascript·python