从0开始搭建vue + flask 旅游景点数据分析系统(七):可视化前后端对接实现

news2024/11/14 8:47:20

这一期继续编写flask后端,并且完成echarts折线图、柱状图和饼图的对接。

1 新增一些依赖

pip install Flask-SQLAlchemy Flask-Marshmallow pymysql

修改 init.py文件,下面给出完整代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

db = SQLAlchemy()
ma = Marshmallow()

def create_app():
    app = Flask(__name__)
    app.config.from_object('app.config.Config')
    db.init_app(app)
    ma.init_app(app)
    
    from .routes import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

这里还加入了数据库的配置信息,需要修改app.config:

class Config:
    # scrapy_demo 就是之前旅游爬虫教程中建的数据库,如果不清楚,可以去看这个教程
    # 视频:https://www.bilibili.com/video/BV1Vx4y147wQ
    # 博客:https://blog.csdn.net/roccreed?type=blog
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:12345678@localhost/scrapy_demo?charset=utf8'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

2 后端模型

通过模型,可以在Flask后端系统里以面向对象的形式来操作数据库里的数据。

首先,新建app/models.py:

from . import db

class Tour(db.Model):
    __tablename__ = 'tb_tour'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255), nullable=False)
    title_en = db.Column(db.String(255))
    img = db.Column(db.String(255))
    score = db.Column(db.Float)
    comments = db.Column(db.Integer)
    comment_url = db.Column(db.String(255))
    rank_title = db.Column(db.String(255))
    ranks = db.Column(db.Integer)
    select_user = db.Column(db.String(255))
    select_comment = db.Column(db.Text)
    nation = db.Column(db.String(255))
    city = db.Column(db.String(255))

创建schemas.py 文件,作用是数据在发送给前端的时候进行序列化,新建app/schemas.py:

from . import ma
from .models import Tour

class TourSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Tour
        load_instance = True

tour_schema = TourSchema()
tours_schema = TourSchema(many=True)

修改routes.py 文件:

from flask import Blueprint, jsonify

from app.models import Tour
from app.schemas import tours_schema

main = Blueprint('main', __name__)

# 这个测试的后面就不需要了,可以删除
@main.route('/test', methods=['GET'])
def test():
    data = [{'id': 1, 'name': 'John'}, {'id': 2, 'name': 'Jane'}]
    return jsonify(data)

# 十大热门景点
@main.route('/commentsRank', methods=['GET'])
def getCommentsRank():
    top_tours = Tour.query.order_by(Tour.comments.desc()).limit(10).all()
    return tours_schema.jsonify(top_tours)

3 测试一下

在浏览器里输入 localhost:8080/commentsRank 访问,得到如下结果:

可以看到,访问后端是可以获取到数据的。
在这里插入图片描述

4 返回封装

在开始和前端对接前,先对后端的返回进行一定的优化

创建app/utils.py 文件

from flask import jsonify

def make_response(data=None, code=0, message='Success'):
    response = {
        'code': code,
        'message': message,
        'data': data if data is not None else []
    }
    return jsonify(response)

修改routes.py,之前测试的方法这边删除了:


# 十大热门景点(按照评论数排名)
@main.route('/top-tours', methods=['GET'])
def get_top_tours():
    try:
        top_tours = Tour.query.order_by(Tour.comments.desc()).limit(10).all()
        result = tours_schema.dump(top_tours)
        return make_response(data=result)
    except Exception as e:
        return make_response(code=1, message=str(e))

在测试一下,就可以发现结果封装在data里面了。

然后,下一步编写前端文件。

5 折线图的对接

上一小节已经写好了折线图的后端代码,现在开始写前端代码,修改LineChart.vue,这边我给出完整的源码了,另外两个图我只给出修改部分源码,因为原本的data部分不需要做任何修改:

<template>
  <div>
    <v-chart :option="chartOptions" style="width: 100%; height: 300px;"></v-chart>
  </div>
</template>

<script>
import {getCommentsRank} from "@/api/tour"

export default {
  name: 'TouristSpotRanking',
  data() {
    return {
      chartOptions: {
        title: {
          text: '旅游景点评论排名',
        },
        tooltip: {
          trigger: 'axis',
        },
        legend: {
          data: ['评论数'],
        },
        xAxis: {
          type: 'category',
          data: ['景点A', '景点B', '景点C', '景点D', '景点E'],
        },
        yAxis: {
          type: 'value',
        },
        series: [
          {
            name: '评论数',
            type: 'line',
            data: [820, 932, 901, 934, 1290],
          },
        ],
      },
    };
  },
  mounted() {
    getCommentsRank().then(res => {
      console.log(res.data.data);
      this.chartOptions.xAxis.data = res.data.data.map(item => item.title);
      this.chartOptions.series[0].data = res.data.data.map(item => item.comments);
    })
  }
};
</script>

<style scoped>
/* 添加一些样式使图表看起来更好 */
</style>

在tour.js中添加方法:

// 排名前十的景点
export function getCommentsRank() {
    return request({
        url:  '/commentsRank',
        method: 'get'
    })
}

实现效果如下,可以看到景点按照评论数的折线图:
在这里插入图片描述

6 柱状图的对接

tour.js中添加方法:

// 按照城市排名
export function getCityRank() {
    return request({
        url:  '/cityRank',
        method: 'get'
    })
}

修改routes.py:

# 景点按照评分排名
@main.route('/scoreRank', methods=['GET'])
def getScoreRank():
    try:
        top_tours = Tour.query.filter(Tour.comments>1000).order_by(Tour.score.desc()).limit(5).all()
        result = tours_schema.dump(top_tours)
        return make_response(data=result)
    except Exception as e:
        return make_response(code=1, message=str(e))

修改BarChart.vue:

import {getScoreRank} from "@/api/tour";

  mounted() {
    getScoreRank().then(res => {
      // console.log(res.data.data);
      this.chartOptions.xAxis.data = res.data.data.map(item => item.title);
      this.chartOptions.series[0].data = res.data.data.map(item => item.score);
    })
  }

效果:
在这里插入图片描述

7 饼图的对接

tour.js中添加方法:

// 按照评分排名 
export function getScoreRank() {
    return request({
        url:  '/scoreRank',
        method: 'get'
    })
}

修改routes.py:

# 由于评分都很近,因此这边限制了评论数超过1000的景点再按照评分来排名
# 这样区分度大,不至于前端的柱状图都是10分
# 景点按照城市统计
@main.route('/cityRank', methods=['GET'])
def getCityRank():
    try:
        ret = db.session.query(Tour.city.label('name'),
                               db.func.count(Tour.id).label('value')).group_by(Tour.city).order_by(db.desc('value')).all()
        result = chart_schema.dump(ret)
        return make_response(data=result)
    except Exception as e:
        return make_response(code=1, message=str(e))

修改schemas.py,用来封装饼图数据的,添加:

class ChartData(ma.Schema):
    class Meta:
        fields = ('name', 'value')

chart_schema = ChartData(many=True)

修改PieChart.vue:

import {getCityRank} from "@/api/tour";

mounted() {
    getCityRank().then(res => {
      // console.log(res.data);
      this.chartOptions.series[0].data = res.data.data
    })
  }

效果:

在这里插入图片描述

8 小结

这期完成了对三个echarts图形的前后端对接,后端实现了从数据库获取数据(利用sqlalchemy + pymsyql 方式),并且对返回也是对了封装的,总的来说成果斐然 👍🏻。
三个图都实现了前后端对接:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Studying-代码随想录训练营day57| prim算法精讲、kruskal算法精讲

第57天&#xff0c;图论07&#xff0c;两个最小生成树算法的讲解&#x1f4aa;(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 题目&#xff1a;53. 寻宝&#xff08;第七期模拟笔试&#xff09; (kamacoder.com) prim算法精讲 拓展 总结&#xff1a; …

新手小白嵌入式单片机教程,ESP32

1.什么是ESP32。 ESP32是一款由乐鑫信息科技&#xff08;Espressif Systems&#xff09;推出的高度集成的低功耗系统级芯片&#xff08;SoC&#xff09;&#xff0c;它结合了双核处理器、无线通信、低功耗特性和丰富的外设&#xff0c;特别适用于各种物联网&#xff08;IoT&am…

RabbitMQ如何保证可靠性

在RabbitMQ中可以将消息传递的链路简化成如下图&#xff1a; 从上图可以发现&#xff0c;主要分为三个角色&#xff1a;Producer、Consumer、RabbitMQ Broker 正常情况下&#xff0c;Producer生产消息&#xff0c;安全的到打Broker的Exchange&#xff0c;然后根据转发规则&…

springboot新农村综合展示平台-计算机毕业设计源码41793

摘 要 新农村综合展示平台是利用微信小程序开发的一种新型农村信息展示和交流平台&#xff0c;旨在通过数字化技术手段推动乡村振兴&#xff0c;促进农村资源整合和信息共享。本论文通过对新农村发展现状和需求进行分析&#xff0c;结合微信小程序开发技术&#xff0c;设计并实…

【Tessent】【Command】set_design_level Design Level

UsageDescriptionphysical_block vs. sub_blockinstrument_block set_design_level 命令的基本内容&#xff0c;以及不同 design level 之间的区分。 Usage 该命令的用法比较简单&#xff0c;主要是区分不同的 design level。 set_design_level {chip | physical_block | sub…

C++三种继承方式-公共/保护/私有继承

public、protected和private的区别在于&#xff1a; public在子类和类外都可以随意访问。 protected在子类中可以访问&#xff0c;但是在类外无法访问。 private在子类和类外都无法访问。 注意&#xff1a;父类中的所有非静态成员属性都会被子类继承下去&#xff0c;包括私有…

项目比赛项目负责人的汇报艺术:清晰、有条理地反映问题

项目比赛项目负责人的汇报艺术&#xff1a;清晰、有条理地反映问题 前言1. 现状-问题-建议&#xff1a;三步走策略2. 成绩-问题-改进&#xff1a;展示与提升3. 事实-影响-请求&#xff1a;客观与明确结语 前言 在项目管理的世界里&#xff0c;沟通不仅仅是信息的传递&#xff0…

进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待

目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么&#xff1f; 2、进程终止&#xff0c;有三种情况 3、进程如何终止&#xff1f; 三…

变电站的瞬态过电压和雷击保护

瞬态过电压是电力系统的典型现象。过电压的来源是直接或附近的雷击、开关操作、电磁脉冲和静电放电。保护变电站设备免受瞬态过电压影响的经典装置是避雷器。 变电站常见的暂态过电压来自于开关操作&#xff0c;可怕的是雷电&#xff0c;它会带来较大的扰动。 雷击引起的瞬态…

ClickHouse 进阶【建表、查询优化】

1、ClickHouse 进阶 因为上一节部署了集群模式&#xff0c;所以需要启动 Zookeeper 和 ck 集群&#xff1b; 1.1、Explain 基本语法 EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting value, ...] SELECT ... [FORMAT ...] AST&#xff1a;用于查看语法树SYNTAX&#…

Moretl 同步设备日志到服务器

使用咨询: 扫码添加QQ 永久免费: Gitee下载最新版本 使用说明: CSDN查看使用说明 功能: 定时(全量采集or增量采集) SCADA,MES等系统采集工控机,办公电脑文件. 优势1: 开箱即用. 解压直接运行.插件集成下载. 优势2: 批管理设备. 配置均在后台配置管理. 优势3: 无人值守 采集端…

注意!!可能这是系统分析师旧教程最后一次考试,赶紧学起来

系统分析师考试是全国计算机技术与软件专业技术资格考试的高级水平考试之一&#xff0c;它是一项专业考试&#xff0c;旨在通过对计算机系统的规划、分析和设计来培养行业内的专业技术人才。近日在国家版本数据中心&#xff0c;查到系统分析师已经有2024最新版的教程出来了&…

JAVA毕业设计156—基于Java+Springboot+vue的电子招投标管理系统(源代码+数据库+万字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的电子招投标管理系统(源代码数据库万字论文)156 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为供应商、单位、管理员三种角色 1、供应…

PMP报考条件真的需要做项目达到3年时间吗?

很多朋友想报考项目管理资格证书的时候&#xff0c;上网一看报考资格&#xff0c;一般会是这样&#xff1a; 第一类&#xff1a;拥有学士学位或同等学历以下者&#xff0c;申请者必须具备至少7500个小时的项目管理经验&#xff0c;并且在申请之日前8年内&#xff0c;累计项目管…

AI大模型加速落地 “新蓝海”如何开拓

【编者按】 当前&#xff0c;生成式人工智能技术在多个领域展现出广泛的应用潜力&#xff0c;逐渐成为科技领域的关注焦点。 国家互联网信息办公室最新数据显示&#xff0c;截至目前&#xff0c;我国已经完成备案并上线、能为公众提供服务的生成式人工智能服务大模型已达180多…

ABeam 德硕| FY25 Kickoff MeetingDinner 回顾

自律 Self-discipline 7月一整月&#xff0c;ABeam中国各office相继举办了新财年的Kickoff会议。Kickoff意为启动&#xff0c;在这个场合&#xff0c;所有员工将一同参会&#xff0c;作为新财年的启幕仪式。 今年ABeam中国以“自律”作为年度主题&#xff0c;本次全站Kickoff…

Java获取exe文件详细信息:产品名称,产品版本等

使用Maven项目&#xff0c;在pom.xml文件中注入&#xff1a; <dependency><groupId>com.kichik.pecoff4j</groupId><artifactId>pecoff4j</artifactId><version>0.4.1</version></dependency> 程序代码&#xff1a; import …

电脑技巧:9个免费的AI图片无损放大工具和网站

今天小编给大家介绍9款免费的AI图片放大工具和网站&#xff0c;帮助你提高图片清晰度&#xff0c;感兴趣的朋友可以自己试一试&#xff01; 电脑技巧&#xff1a;9个免费的AI图片无损放大工具和网站 美图设计室 美图设计室是美图秀秀公司推出的一款在线图片编辑和设计工具箱&…

基于ESP32的遥控小车

目录 1.ESP32简介 2.项目构思 3.项目所需材料 4.代码示例 5.实物运行 1.ESP32简介 ESP32是一个集成天线和射频巴伦、功率放大器、低噪声放大器、滤波器和电源管理模块。整个解决方案占用的印刷电路板面积最少。该板采用台积电40nm低功耗技术的2.4GHz双模Wi-Fi和蓝牙芯片&…

计算机网络基础 - 计算机网络和因特网(2)

计算机网络基础 计算机网络和因特网Internet 结构和 ISP分组延时、丢失和吞吐量四种分组延时分组丢失吞吐量 协议层次及其服务模型概念数据单元&#xff08;DU&#xff09;协议栈TCP/IP 协议各层次的协议数据单元IOS/OSI 参考模型 计算机网络和因特网的历史早期计算机网路&…