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

发布于:2025-08-10 ⋅ 阅读:(30) ⋅ 点赞:(0)

💕 基于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. 数据可视化功能

城市分布分析
@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城市排名展示
  • 📈 动态柱状图交互
  • 🔍 支持数据筛选和排序
人口统计学分析

年龄分布:

@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

性别比例:

@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智能分析功能

智能对话系统
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. 用户管理功能

用户认证系统
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)
用户注册/登录
@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 柱状图
// 城市分布图表
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 词云图
// 自我介绍词云
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. 数据统计

实时数据统计
@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. 智能对话界面

前端实现
<!-- 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交互
// 发送消息
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. 数据分析功能

性格分析
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. 管理员功能

用户管理
@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. 环境准备

# 克隆项目
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. 数据库配置

# 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模型配置

# 设置环境变量
export CHATGLM_API_KEY=your_chatglm_api_key_here
export SECRET_KEY=your_secret_key_here

4. 启动应用

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


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

📚 参考资料

🔗 相关链接


网站公告

今日签到

点亮在社区的每一天
去签到