vue前端框架应用案例(三)实现简单的echarts柱状图表

news2024/11/16 12:46:42

目录

  • 前端
    • 效果展示
    • 项目架构
      • Seller.vue
      • SellerPage.vue
      • index.js
      • App.vue
      • main.js
      • index.html
  • 后端
    • 源程序
    • 接口测试

本博客内容参考黑马课程,详细信息请参考以下网址

  • Bilibili官方黑马课程:【echarts数据可视化项目】

前端

效果展示

在这里插入图片描述

项目架构

在这里插入图片描述

Seller.vue

该部分主要实现业务逻辑,即决定/sellerpage的内容到底是什么样子的

<template>
  <!-- 商家销量统计柱状图 -->
  <div class="com-container">
    <div class="com-chart" ref="chart_area"></div>
  </div>
</template>

<script>
export default {
  name: "Seller",
  data() {
    return {
      chartInstance: null,
      allData: null,
    };
  },
  mounted() {
    this.initChart();
    this.getData();
  },

  methods: {
    //初始化图表,生成chartInstance对象
    initChart() {
      this.chartInstance = this.$echarts.init(this.$refs.chart_area);
    },
	//向后端获取数据并调用updatechart()进行图表更新
    async getData() {
      //异步请求获得数据
      const ret = await this.$http.get("seller");
      //获取数组
      this.allData = ret.data.data;
      //更新图表
      this.updateChart();
    },
	//配置echarts图标的option配置项,并调用setOption()函数进行配置
    updateChart() {
      //利用map函数分别提取出原数组中的姓名和value值
      const sellerName = this.allData.map((item) => {
        return item.name;
      });
      const sellerValue = this.allData.map((item) => {
        return item.value;
      });
      // console.log(sellerName, sellerValue);
      const option = {
        tooltip: {},
        xAxis: {
          type: "value",
        },
        yAxis: {
          type: "category",
          data: sellerName,
        },
        series: [
          {
            type: "bar",
            data: sellerValue,
          },
        ],
      };
      this.chartInstance.setOption(option);
    },
  },
};
</script>

SellerPage.vue

主要业务逻辑由子组件Seller.vue实现,该组件只关心/sellerpage路由的配置和现实问题

<template>
  <!-- 针对/sellerage路径而显示,在该组件中通过子组件注册
  来显示Seller.vue -->
  <div class="com-page">
    <seller></seller>
  </div>
</template>

<script>
import Seller from "../components/Seller.vue";
export default {
  name: "SellerPage",
  data() {
    return {};
  },
  methods: {},
  components: {
    seller: Seller,
  },
};
</script>

<style></style>

index.js

该文件主要内容是实例化一个VueRouter对象并向外暴露,供main.js引入配置。该文件需要将所有的路由组件引入并配置在VueRouter实例对象中

import Vue from "vue";
import VueRouter from "vue-router";
//引入单文件路由组件
import SellerPage from "@/views/SellerPage.vue";

Vue.use(VueRouter);
//设置VueRouter的路由配置项
const routes = [
  {
    path: "/sellerpage",
    component: SellerPage,
  },
];
//创建VueRouter实例对象
const router = new VueRouter({
  routes,
});
//向外暴露
export default router;

App.vue

由于本案例仅仅配置了一个路由:/sellerpage,项目运行后,localhost:8080/#/下并没有内容,localhost:8080/#/sellerpage路径下才显示图表,所以App.vue文件比较简单,只配置了<router-view>标签

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>
import Vue from "vue";
var vm = new Vue({
  name: "App",
});

export default vm;
</script>

main.js

项目的入口文件,主要内容是要生成一个Vue实例对象挂载到DOM元素上、同时要引入路由文件,并配置在Vue实例对象中。还有其他文件的引入和挂载

import Vue from "vue";
import App from "./App.vue";
//引入路由文件
import router from "./router";
import VueRouter from "vue-router";
//引入axios
import axios from "axios";
//引入样式文件
import "./assets/css/global.less";
//设置异步请求根目录
axios.defaults.baseURL = "http://127.0.0.1:8888/";
//将axios和echarts挂载到Vue原型对象上
Vue.prototype.$http = axios;
Vue.prototype.$echarts = window.echarts;
//关闭生产提示
Vue.config.productionTip = false;
//使用VueRouter插件
Vue.use(VueRouter);
//实例化Vue对象
new Vue({
  render: (h) => h(App),
  router: router,
}).$mount("#app");
  • 模块安装(切换到项目目录)
    vue-router:npm i vue-router@3
    axios:npm i axios
    less:npm install less less-loader --save-dev
    若不安装less就使用将会报错:Module not found: Error: Can’t resolve ‘less-loader’

index.html

该文件主要设置了一个div容器用于挂载Vue实例对象,同时引入了echarts的js文件,这样在window下就有了一个全局echarts对象

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
  <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
</html>

后端

本案例后端由python的Flask库完成,主要作用是为前端提供一个接口以获得图表数据

源程序

from flask import Flask
import json
import random
from flask_cors import CORS

app = Flask(__name__)
# 用于配置跨域,防止前端报出跨域错误
CORS(app, resources=r'/*')

# 该函数返回随机数组,每个数组元素都是一个字典,每个字典包括name和value两个属性
def get_seller_info():
    first_name = ['张', '王', '李', '赵']
    last_name = ['三', '颜', '明', '栋', '超', '月']
    info_list = []
    for i in range(15):
        name = random.choice(first_name) + random.choice(last_name)
        value = random.randint(500, 9999)
        info_list.append({'name': name, 'value': value})
    return info_list


@app.route("/seller", methods=["GET"])
def return_seller_data():
    seller_info = get_seller_info()
    return_dict = {'return_code': '200',
                   'return_info': '处理成功',
                   'data': seller_info}
    return json.dumps(return_dict, ensure_ascii=False)

if __name__ == '__main__':
    app.run(debug=False, host='0.0.0.0', port=8888)

注意:若不设置跨域,前端将会报错:has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is

接口测试

接下来我们使用apifox进行接口测试,返回结果如下(接口测试成功!)

在这里插入图片描述

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

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

相关文章

点云双边滤波

双边滤波&#xff08;Bilateral filter&#xff09;是一种非线性的滤波方法&#xff0c;是结合图像的空间邻近度和像素值相似度的一种折中处理&#xff0c;同时考虑空域信息和灰度相似性&#xff0c;达到保边去噪的目的。具有简单、局部的特点。双边滤波器的好处是可以做边缘保…

rootlogger 和 logger的关系

你是不是经常看到日志框架&#xff08;log4j、log4j2、logback等&#xff09;配置文件中有类似配置&#xff0c;但是始终搞不清楚啥意思&#xff1f;<root level"INFO"><appender-ref ref"CONSOLE" /><appender-ref ref"FILE" /&…

3.9.1Cache的基本概念和原理

文章目录一、引子二、工作原理三、局部性原理&#xff08;1&#xff09;空间局部性&#xff08;2&#xff09;时间局部性&#xff08;3&#xff09;总结四、性能分析&#xff08;1&#xff09;方案一&#xff08;2&#xff09;方案二&#xff08;3&#xff09;考题五、块&#…

LeetCode 212. 单词搜索 II 【字典树+回溯】

题目链接&#xff1a;https://leetcode.cn/problems/word-search-ii/ 给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元格 内的字母构成&am…

VC+VB开发CAD重生记:CADEditorX 15.X Crack

CADEditorX是一个 ActiveX 组件&#xff0c;用于在任何支持 ActiveX 和 COM 技术的开发环境&#xff08;例如 C#、Visual C、Delphi、VB、JavaScript 等&#xff09;中向网页或正在开发的应用程序添加 CAD 功能。它可以查看、编辑、转换、打印和测量DWG、DXF、SVG、HPGL、PDF、…

python设计模式-构建器(Builder)设计模式,原型设计模式

构建器(Builder)设计模式构建器(Builder)模式是一种独特的设计模式&#xff0c;它有助于使用简单对象构建复杂对象并使用算法。 这种设计模式属于创建型模式。 在这种设计模式中&#xff0c;构建器类逐步构建最终对象。 该构建器独立于其他对象。构建器(Builder)模式的优点它提…

Anolis Os linux U盘 安装

Anolis OS系统8.4安装|U盘安装Anolis OS(龙蜥)8.4系统_白云一键重装系统 (baiyunxitong.com)https://www.baiyunxitong.com/jiaocheng/7092.html#:~:textAnolis%20OS%E7%B3%BB%E7%BB%9F8.4%E5%AE%89%E8%A3%85%E6%AD%A5%E9%AA%A4%EF%BC%9A%20%28%E5%88%B6%E4%BD%9CU%E7%9B%98%E5…

深度解读 python 实现 dbscan算法

DBScan (密度基于空间聚类) 是一种聚类算法&#xff0c;它通过找到图像中的密度峰值来对数据进行聚类。 文章目录DBScan 算法解释说明DBScan 算法的应用场景Python 实现的 DBScan 算法Python 实现 dbscan 高级算法再演示一种 python 实现 dbscan 算法的代码总结DBScan 算法解释…

共享模型之内存(二)

1.有序性 1>.JVM会在不影响正确性的前提下调整语句的执行顺序,思考下面一段代码: static int i; static int j; // 在某个线程内执行如下赋值操作 i ...; j ...;可以看到,至于是先执行i还是先执行j,对最终的结果不会产生影响.所以,上面代码真正执行时,既可以是: i ..…

mysql:日志,redo,undo,为什么使用日志?

mysql日志 mysql事务的隔离性是通过锁来实现的 而原子性&#xff0c;一致性&#xff0c;持久性就是通过日志来实现的。 REDO LOG 称为 重做日志 &#xff0c;提供再写入操作&#xff0c;恢复提交事务修改的页操作&#xff0c;用来保证事务的持 久性。 UNDO LOG 称为 回滚日志 …

凑个小热闹:python采集《狂飙》评论

前言 昨晚&#xff0c;2023年首部爆款剧集《狂飙》迎来大结局&#xff0c;一度冲上热搜第一 “是非面前稍不留神&#xff0c;就会步入万丈深渊&#xff0c;唯有坚守信仰&#xff0c;才能守得初心” 面对这么多广大网友的讨论&#xff0c;我也来凑上一个热闹 用python采集一下…

Mybatis框架(三)深入Mybatis之Mybatis注解开发与分页的实现

本文是本人专栏【Java开发后端系列框架】里的文章&#xff0c;文章根据各框架官网与网上资料加上本人工作经验&#xff0c;进行修改总结发布在这个专栏&#xff0c;主要目的是用于自我提升&#xff0c;不用于获取利益。如果系列文章能到帮到您本人将感到荣幸&#xff0c;如果有…

docker学习(四):DockerFile微服务实战及docker端口映射

文章目录前言1.Dockerfile介绍2.微服务实战案例3.docker端口映射3.1查看docker网络模式命令3.2docker网络模式前言 大家好&#xff0c;这是我学习docker系列的笔记文章&#xff0c;目标是掌握docker,为后续学习K8s做准备。本文记录了springBoot微服务项目通过DockerFile生成镜…

基于Android的租车app

需求信息&#xff1a; 1.用户中心 进行登陆注销、修改信息、修改密码、上传用户信息:身份证、驾驶证等&#xff0c;并提供基本的验证真伪功能。2.租车交易 用户可以查看可以根据条件查看可以租用的汽车车辆信,息。完成租用车辆功能&#xff0c;(包括登记汽车使用的位置范围) 车…

基于数字孪生的智慧电网3D可视化运维系统

十四五规划提出&#xff1a;“加快推动数字产业化&#xff0c;培育壮大人工智能、大数据、区块链、云计算、网络安全等新兴数字产业”&#xff0c;这是深化电网领域以新能源为主体的国家新型电力系统战略。建设背景在2020年的联合国气候峰会上&#xff0c;我国正式提出了“3060…

听说,这届飞桨社区的框架贡献者真的很“卷”

飞桨平台的快速发展&#xff0c;与开源开放密不可分。飞桨框架建设并非只靠百度工程师&#xff0c;也离不开热爱飞桨、热爱开源的开发者们&#xff0c;他们用自己的方式参与飞桨框架建设&#xff0c;与飞桨共同成长。 为了鼓励更多的开发者参与到飞桨社区的开源建设中&#xff…

前端利器——炫酷的CodePen

前言众所周知&#xff0c;前端是一个很容易将自己的劳动成果呈现出来的一个职位&#xff0c;无论是写1行代码还是写100行代码&#xff0c;都可以通过页面来进行呈现&#xff0c;在工作中的劳作成果也是可以一眼就呈现给客户、用户的。比如一些精美的页面&#xff0c;炫酷的特效…

C++智能指针auto_ptr、unique_ptr、shared_ptr、weak_prt详解

目录 一.为什么要使用智能指针 二.auto_ptr 三.unique_ptr 四.shared_ptr 五.weak_ptr 智能指针均定义在头文件<memory>中&#xff1a; #include<memory> 同时每种智能指针都是以类模板的方式实现 一.为什么要使用智能指针 C的内存管理中&#xff0c;每当…

如何使用ArcGIS拼接栅格

1、概述数据的来源是多种多样的&#xff0c;特别是从网上下载的各种数据往往是分块的数据&#xff0c;在使用的时候需要进行数据的拼接&#xff0c;这里为大家介绍一下ArcGIS进行栅格拼接的方法&#xff0c;希望能对你有所帮助。2、直接拼接在ArcToolbox中点击“数据管理工具\栅…

某书x-s和web_session

开工发现某书web更新了,目前笔记信息接口: /api/sns/web/v1/feed 请求时headers中需要x-s、x-t,cookie中需要有web_session。 文章目录 web_sessionX-SJS代码Python代码web_session web_session和当前环境绑定,重新注册后浏览器中的ID也会更新。 其主要依赖的参数是webI…