Django毕业设计推荐:旅游数据分析可视化系统Vue+MySQL完整实现

40 阅读5分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊

二、系统介绍

开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery

Django旅游数据分析可视化系统是一款基于Python Django框架开发的旅游行业数据管理与分析平台,采用Vue.js与ElementUI构建现代化前端界面,通过MySQL数据库实现数据持久化存储。系统整合了北京景点信息管理、用户评论分析、公告资讯发布等核心功能模块,支持管理员对旅游景点数据进行全方位管理和维护。平台提供直观的数据可视化大屏展示,能够将景点访问量、用户评论情绪、地区分布等关键指标以图表形式呈现,帮助管理者快速掌握旅游数据趋势。系统采用B/S架构设计,用户可通过浏览器便捷访问各项功能,支持个人中心管理、景点信息查询、评论互动等操作。整体技术栈成熟稳定,界面设计简洁美观,数据处理高效可靠,为旅游数据管理提供了完整的解决方案。

三、Django旅游数据分析可视化系统-视频解说

Django毕业设计推荐:旅游数据分析可视化系统Vue+MySQL完整实现

四、Django旅游数据分析可视化系统-功能展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、Django旅游数据分析可视化系统-代码展示



from pyspark.sql import SparkSession
from django.http import JsonResponse
from django.shortcuts import render
from .models import BeijingAttraction, AttractionComment, User
from django.db.models import Count, Avg
import json
from django.core.paginator import Paginator
from django.db.models import Q
from datetime import datetime, timedelta

def attraction_management(request):
    if request.method == 'GET':
        attractions = BeijingAttraction.objects.all()
        search_name = request.GET.get('name', '')
        search_type = request.GET.get('type', '')
        if search_name:
            attractions = attractions.filter(name__icontains=search_name)
        if search_type:
            attractions = attractions.filter(attraction_type=search_type)
        paginator = Paginator(attractions, 10)
        page_number = request.GET.get('page', 1)
        page_obj = paginator.get_page(page_number)
        attraction_list = []
        for attraction in page_obj:
            comment_count = AttractionComment.objects.filter(attraction=attraction).count()
            avg_rating = AttractionComment.objects.filter(attraction=attraction).aggregate(Avg('rating'))['rating__avg'] or 0
            attraction_data = {
                'id': attraction.id,
                'name': attraction.name,
                'location': attraction.location,
                'description': attraction.description,
                'attraction_type': attraction.attraction_type,
                'ticket_price': attraction.ticket_price,
                'opening_hours': attraction.opening_hours,
                'contact_phone': attraction.contact_phone,
                'comment_count': comment_count,
                'avg_rating': round(avg_rating, 2),
                'created_time': attraction.created_time.strftime('%Y-%m-%d %H:%M:%S'),
                'updated_time': attraction.updated_time.strftime('%Y-%m-%d %H:%M:%S')
            }
            attraction_list.append(attraction_data)
        return JsonResponse({
            'code': 200,
            'msg': '获取成功',
            'data': attraction_list,
            'total': paginator.count,
            'page': page_number,
            'total_pages': paginator.num_pages
        })
    elif request.method == 'POST':
        data = json.loads(request.body)
        attraction = BeijingAttraction.objects.create(
            name=data.get('name'),
            location=data.get('location'),
            description=data.get('description'),
            attraction_type=data.get('attraction_type'),
            ticket_price=data.get('ticket_price', 0),
            opening_hours=data.get('opening_hours'),
            contact_phone=data.get('contact_phone'),
            image_url=data.get('image_url', ''),
            longitude=data.get('longitude', 0),
            latitude=data.get('latitude', 0)
        )
        return JsonResponse({'code': 200, 'msg': '添加成功', 'data': {'id': attraction.id}})
    elif request.method == 'PUT':
        data = json.loads(request.body)
        attraction_id = data.get('id')
        try:
            attraction = BeijingAttraction.objects.get(id=attraction_id)
            attraction.name = data.get('name', attraction.name)
            attraction.location = data.get('location', attraction.location)
            attraction.description = data.get('description', attraction.description)
            attraction.attraction_type = data.get('attraction_type', attraction.attraction_type)
            attraction.ticket_price = data.get('ticket_price', attraction.ticket_price)
            attraction.opening_hours = data.get('opening_hours', attraction.opening_hours)
            attraction.contact_phone = data.get('contact_phone', attraction.contact_phone)
            attraction.save()
            return JsonResponse({'code': 200, 'msg': '更新成功'})
        except BeijingAttraction.DoesNotExist:
            return JsonResponse({'code': 404, 'msg': '景点不存在'})

def comment_analysis_management(request):
    if request.method == 'GET':
        comments = AttractionComment.objects.select_related('attraction', 'user').all()
        attraction_id = request.GET.get('attraction_id', '')
        rating_filter = request.GET.get('rating', '')
        date_start = request.GET.get('date_start', '')
        date_end = request.GET.get('date_end', '')
        if attraction_id:
            comments = comments.filter(attraction_id=attraction_id)
        if rating_filter:
            comments = comments.filter(rating=rating_filter)
        if date_start:
            comments = comments.filter(created_time__gte=date_start)
        if date_end:
            comments = comments.filter(created_time__lte=date_end)
        paginator = Paginator(comments, 15)
        page_number = request.GET.get('page', 1)
        page_obj = paginator.get_page(page_number)
        comment_list = []
        for comment in page_obj:
            sentiment_score = 0
            if '好' in comment.content or '棒' in comment.content or '推荐' in comment.content:
                sentiment_score = 1
            elif '差' in comment.content or '不好' in comment.content or '失望' in comment.content:
                sentiment_score = -1
            comment_data = {
                'id': comment.id,
                'attraction_name': comment.attraction.name,
                'user_name': comment.user.username,
                'content': comment.content,
                'rating': comment.rating,
                'sentiment_score': sentiment_score,
                'like_count': comment.like_count,
                'reply_count': getattr(comment, 'reply_count', 0),
                'created_time': comment.created_time.strftime('%Y-%m-%d %H:%M:%S'),
                'is_verified': comment.is_verified
            }
            comment_list.append(comment_data)
        rating_stats = AttractionComment.objects.values('rating').annotate(count=Count('rating')).order_by('rating')
        monthly_stats = AttractionComment.objects.extra(
            select={'month': "DATE_FORMAT(created_time, '%%Y-%%m')"}
        ).values('month').annotate(count=Count('id')).order_by('month')
        return JsonResponse({
            'code': 200,
            'msg': '获取成功',
            'data': comment_list,
            'total': paginator.count,
            'rating_stats': list(rating_stats),
            'monthly_stats': list(monthly_stats)
        })
    elif request.method == 'DELETE':
        comment_id = request.GET.get('id')
        try:
            comment = AttractionComment.objects.get(id=comment_id)
            comment.delete()
            return JsonResponse({'code': 200, 'msg': '删除成功'})
        except AttractionComment.DoesNotExist:
            return JsonResponse({'code': 404, 'msg': '评论不存在'})

def data_visualization_dashboard(request):
    spark = SparkSession.builder.appName("TourismDataAnalysis").getOrCreate()
    attractions = BeijingAttraction.objects.all()
    total_attractions = attractions.count()
    total_comments = AttractionComment.objects.count()
    total_users = User.objects.count()
    avg_rating = AttractionComment.objects.aggregate(Avg('rating'))['rating__avg'] or 0
    attraction_type_stats = BeijingAttraction.objects.values('attraction_type').annotate(
        count=Count('id')
    ).order_by('-count')
    top_attractions = BeijingAttraction.objects.annotate(
        comment_count=Count('attractioncomment')
    ).order_by('-comment_count')[:10]
    recent_comments = AttractionComment.objects.filter(
        created_time__gte=datetime.now() - timedelta(days=7)
    ).count()
    rating_distribution = AttractionComment.objects.values('rating').annotate(
        count=Count('rating')
    ).order_by('rating')
    monthly_visit_data = []
    for i in range(12):
        month = datetime.now().replace(month=i+1) if i < datetime.now().month else datetime.now().replace(year=datetime.now().year-1, month=i+1)
        visit_count = AttractionComment.objects.filter(
            created_time__month=month.month,
            created_time__year=month.year
        ).count()
        monthly_visit_data.append({
            'month': month.strftime('%Y-%m'),
            'visit_count': visit_count
        })
    location_stats = BeijingAttraction.objects.values('location').annotate(
        count=Count('id'),
        avg_rating=Avg('attractioncomment__rating')
    ).order_by('-count')
    price_range_stats = []
    price_ranges = [(0, 50), (50, 100), (100, 200), (200, 500), (500, float('inf'))]
    for min_price, max_price in price_ranges:
        if max_price == float('inf'):
            count = BeijingAttraction.objects.filter(ticket_price__gte=min_price).count()
            label = f'{min_price}元以上'
        else:
            count = BeijingAttraction.objects.filter(
                ticket_price__gte=min_price,
                ticket_price__lt=max_price
            ).count()
            label = f'{min_price}-{max_price}元'
        price_range_stats.append({'label': label, 'count': count})
    dashboard_data = {
        'overview': {
            'total_attractions': total_attractions,
            'total_comments': total_comments,
            'total_users': total_users,
            'avg_rating': round(avg_rating, 2),
            'recent_comments': recent_comments
        },
        'attraction_type_stats': list(attraction_type_stats),
        'top_attractions': [{'name': a.name, 'comment_count': a.comment_count} for a in top_attractions],
        'rating_distribution': list(rating_distribution),
        'monthly_visit_data': monthly_visit_data,
        'location_stats': list(location_stats),
        'price_range_stats': price_range_stats
    }
    spark.stop()
    return JsonResponse({
        'code': 200,
        'msg': '获取成功',
        'data': dashboard_data
    })

六、Django旅游数据分析可视化系统-文档展示

在这里插入图片描述

七、END

💕💕文末获取源码联系计算机编程果茶熊