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

这一期继续编写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 Marshmallowdb = 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_blueprintapp.register_blueprint(main_blueprint)return app

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

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

2 后端模型

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

首先,新建app/models.py:

from . import dbclass 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 Tourclass TourSchema(ma.SQLAlchemyAutoSchema):class Meta:model = Tourload_instance = Truetour_schema = TourSchema()
tours_schema = TourSchema(many=True)

修改routes.py 文件:

from flask import Blueprint, jsonifyfrom app.models import Tour
from app.schemas import tours_schemamain = 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 jsonifydef 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.rhkb.cn/news/395323.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode70_爬楼梯

思路 动态规划 爬到第n阶楼梯的方法数为&#xff1a;第n-1阶楼梯的方法数 第n-2阶楼梯的方法数 func climbStairs(n int) int {if n < 2 {return 1}dp : make([]int, n1)dp[1] 1dp[2] 2for i:3; i<n; i {dp[i] dp[i-1] dp[i-2]}return dp[n] }

Kubernetes中的PV)和 PVC深度剖析

在容器化的世界里&#xff0c;持久化存储一直是一个重要且复杂的问题。Kubernetes&#xff08;以下简称K8s&#xff09;为了解决容器中的数据持久化问题&#xff0c;提出了Persistent Volume&#xff08;PV&#xff09;和Persistent Volume Claim&#xff08;PVC&#xff09;这…

大数据信用报告查询哪家平台的比较好?

相信在搜索大数据信用的你&#xff0c;已经因为大数据信用不好受到了挫折&#xff0c;想详细了解一下自己的大数据信用&#xff0c;但是找遍了网络上的平台之后才发现&#xff0c;很多平台都只提供查询服务&#xff0c;想要找一个专业的平台查询和讲解很困难。下面本文就为大家…

LeetCode 150.逆波兰表达式求值

LeetCode 150.逆波兰表达式求值 思路&#x1f9d0;&#xff1a; 用栈存储该字符串&#xff0c;如果遇到数字就入栈&#xff0c;遇到符号就将数字出栈计算后再入栈&#xff0c;当整个字符串遍历完后&#xff0c;栈顶值就是该表达式的值。 代码&#x1f50e;&#xff1a; class …

【OpenCV C++20 学习笔记】范围阈值操作

范围阈值操作 原理HSV颜色空间RGB与HSV颜色空间之间的转换 代码实现颜色空间的转换范围阈值操作 原理 HSV颜色空间 HSV(色相hue, 饱和度sarturation, 色明度value)颜色空间与RGB颜色空间相似。hue色相通道代表颜色类型&#xff1b;saturation饱和度通道代表颜色的饱和度&…

MySQL-MHA高可用配置及故障切换

目录 案例搭建 1&#xff1a;所有服务器关闭防火墙 2&#xff1a;设置hosts文件 3&#xff1a;安装 MySQL 数据库 4&#xff1a;修改参数 5&#xff1a;安装 MHA 软件 6&#xff1a;配置无密码认证 7&#xff1a;配置 MHA 8&#xff1a;模拟 master 故障 MHA(MasterHi…

【Python修改所有可执行程序的图标】

孩子还小&#xff0c;不懂事写着玩的 警告&#xff1a;请谨慎使用。该程序会修改全系统所有可执行文件图标(其实就是注册表)&#xff0c;在重新开机后生效 演示&#xff1a; 把应用程序图标改为记事本&#x1f5d2; 原理&#xff1a; Windows 操作系统通过注册表来存储和管…

不懂期权怎么交易?看这个例子就懂了

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;期权交易两个方向认购做多&#xff0c;认沽做空&#xff0c;双向t0交易没了&#xff0c;跟期货一样&#xff0c;对的&#xff0c;玩的也是合约&#xff0c;唯一区别没有保证金不会爆仓&#…

CAD二次开发IFoxCAD框架系列(15)- IFox的介绍和初始化

背景介绍 因为本人在光伏行业从事软件研发&#xff0c;最近我一直在做CAD方面技术的预研和探索。在研究CAD的SDK的时候&#xff0c;发现很多写法比较繁琐&#xff0c;所以一直想封装工具&#xff0c;提高开发效率&#xff0c;也做了很多的CAD工具的封装&#xff0c;大家可以看…

一文读懂如何选择视频孪生三维建模方式及建模精度等级

导言/INTRODUCTION 三维模型是视频孪生应用的基础&#xff0c;建模方式与模型精度将直接影响到最终孪生场景的呈现和应用效果。各种建模方式和模型精度在成本、场景还原真实度、实施周期方面都有自己的特点&#xff0c;因而有着各自的优劣势和适用场景&#xff0c;同一场景可能…

鸿蒙开发5.0【应用异常处理】运维

应用异常处理 介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法&#xff0c;主要分为应用崩溃、应用卡死两种。 效果图预览 使用说明 点击构建应用崩溃事件&#xff0c;3s之后应用退出&#xff0c;然后打开应用进入应用异常页面&#xff0c;隔1mi…

pdf怎么加密码怎么设置密码?pdf加密码的几种设置方法

在数字化时代&#xff0c;信息的保密性与安全性日益成为我们不可忽视的重要环节。尤其对于包含敏感信息或个人隐私的PDF文档而言&#xff0c;保护其免受未授权访问的侵扰显得尤为重要。通过为PDF文档设置密码保护&#xff0c;我们能够筑起一道坚实的防线&#xff0c;确保只有拥…

Java常见面试题-13-FastDFS

文章目录 FastDFS 是什么&#xff1f;FastDFS 组成FastDFS 的流程FastDFS 如何现在组内的多个 storage server 的数据同步&#xff1f; FastDFS 是什么&#xff1f; FastDFS 是一个开源的轻量级分布式文件系统&#xff0c;它可以对文件进行管理&#xff0c;功能包括&#xff1…

创意指南丨VR游览沉浸式空间体验

欢迎来到我们制作的VR幻想世界。玩家的起点是一条蓝色水晶大道&#xff0c;让我们一起探索这个如梦似幻的境地。 在这条大道的两侧&#xff0c;漂浮着半透明的大水晶水母。它们轻盈地在空中飘动&#xff0c;仿佛在欢迎我们的到来。这条道路上方&#xff0c;一个个半圆环不停地…

【数据结构】Map与Set

前言 前两篇文章我们研究了二叉搜索树与哈希表的结构与特点&#xff0c;他们二者是Map与Set这两个接口实现的底层结构&#xff0c;他们利用了搜索树与哈希表查找效率高这一特点&#xff0c;是一种专门用来进行搜索操作的容器或数据结构。本篇文章就让我们一起来梳理这两个接口的…

基于Hadoop的国内手机销售大数据分析与可视化研究【百万数据集】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍 绪论研究背景研究目的研究意义 相关技术理论介绍Hadoop相关理论HIve数据仓库flume组件介绍sqoop组件介绍Pyecharts介绍 数据来源及处理数据介绍数据预处理 Hadoop集群搭建Hadoop全…

开源wiki知识库工具zyplayer-doc

zyplayer-doc是一款适合团队和个人私有化部署使用的在线知识库、笔记、WIKI文档管理工具。它不仅提供了知识库管理的基本功能&#xff0c;还包含了数据库管理、API接口管理等模块&#xff0c;能够满足用户多样化的需求。 体验地址&#xff1a;文档管理系统 仓库地址&#xff…

Together规则引擎 金融解决方案

目录 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革&#xff01;2.抵押贷款功能集&#xff08;MFS&#xff09;3.MFS 示例模型4.MFS 知识特点5.MFS特定功能 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革&#xff01; ogether规则引擎使金融机构能够简…

NAT、服务代理、内网穿透

文章目录 NAT技术NAT IP转换过程NATPNAT的优点NAT的缺点 代理服务器正向代理反向代理 内网穿透和内网打洞内网穿透内网穿透 NAT技术 NAT技术即网络地址转换技术。用于将私有IP地址转换为公共IP地址&#xff0c;以便在互联网或其他外部网络中通信。为了解决IPv4协议下IP地址不足…

[matlab] 鲸鱼优化算法优化KNN分类器的特征选择

目录 引言 智能优化算法概述 智能优化算法在KNN特征选择中的应用 应用步骤 UCI数据集 鲸鱼优化算法 一、算法背景与原理 二、算法组成与步骤 三、算法特点与优势 四、应用与挑战 代码实现 鲸鱼优化算法 主程序 打印结果 引言 智能优化算法在优化KNN&#xff08;…