浅谈APP之历史股票通过echarts绘图

浅谈APP之历史股票通过echarts绘图

需求描述

今天我们需要做一个简单的历史股票收盘价格通过echarts进行绘图,效果如下:
在这里插入图片描述

业务实现

代码框架

代码框架如下:
.在这里插入图片描述

依赖包下载

我们通过网站下载自己需要的涉及的图标,勾选之后进行下载:echarts
下载的依赖包echarts.min.js我们放到static/echarts下

代码实现

echarts.vue实现

实现代码如下:

<template>
    <view>
        <view class="echarts" :prop="option" :change:prop="echarts.update"></view>
    </view>
</template>
  
<script>
    export default {
        name: 'Echarts',
        props: {
            option: {
                type: Object,
                required: true
            }
        }
    }
</script>
  
<script module="echarts" lang="renderjs">
    export default {
        data() {
            return {
                chart: null
            }
        },
        mounted() {
            if (typeof window.echarts === 'object') {
                this.init()
            } else {
                // 动态引入类库
                const script = document.createElement('script')
                // script.src = './static/echarts/echarts.min.js'
                // script.src = './static/echarts/echarts.min.js'
                script.src = './static/echarts/echarts.min.js'
                script.onload = this.init
                document.head.appendChild(script)
            }
        },
        methods: {
            /**
             * 初始化echarts
             */
            init() {
                this.chart = echarts.init(this.$el)
                this.update(this.option)
            },
            /**
             * 监测数据更新
             * @param {Object} option
             */
            update(option) {
                if (this.chart) {
                    // 因App端,回调函数无法从renderjs外传递,故在此自定义设置相关回调函数
                    if (option) {
                        // tooltip
                        if (option.tooltip) {
                            // 判断是否设置tooltip的位置
                            if (option.tooltip.positionStatus) {
                                option.tooltip.position = this.tooltipPosition()
                            }
                            // 判断是否格式化tooltip
                            if (option.tooltip.formatterStatus) {
                                option.tooltip.formatter = this.tooltipFormatter(option.tooltip.formatterUnit, option.tooltip.formatFloat2, option.tooltip.formatThousands)
                            }
                        }
                    // 设置新的option
                    this.chart.setOption(option, option.notMerge)
                    }
                     
                }
            },
            /**
             * 设置tooltip的位置,防止超出画布
             */
            tooltipPosition() {
                return (point, params, dom, rect, size) => {
                    //其中point为当前鼠标的位置,size中有两个属性:viewSize和contentSize,分别为外层div和tooltip提示框的大小
                    let x = point[0]
                    let y = point[1]
                    let viewWidth = size.viewSize[0]
                    let viewHeight = size.viewSize[1]
                    let boxWidth = size.contentSize[0]
                    let boxHeight = size.contentSize[1]
                    let posX = 0 //x坐标位置
                    let posY = 0 //y坐标位置
                    if (x < boxWidth) { //左边放不开
                        posX = 5
                    } else { //左边放的下
                        posX = x - boxWidth
                    }
                    if (y < boxHeight) { //上边放不开
                        posY = 5
                    } else { //上边放得下
                        posY = y - boxHeight
                    }
                    return [posX, posY]
                }
            },
            /**
             * tooltip格式化
             * @param {Object} unit 数值后的单位
             * @param {Object} formatFloat2 是否保留两位小数
             * @param {Object} formatThousands 是否添加千分位
             */
            tooltipFormatter(unit, formatFloat2, formatThousands) {
                return params => {
                    let result = ''
                    unit = unit ? unit : ''
                    for (let i in params) {
                        if (i == 0) {
                            result += params[i].axisValueLabel
                        }
                        let value = '--'
                        if (params[i].data !== null) {
                            value = params[i].data
                            // 保留两位小数
                            if (formatFloat2) {
                                value = this.formatFloat2(value)
                            }
                            // 添加千分位
                            if (formatThousands) {
                                value = this.formatThousands(value)
                            }
                        }
                        // #ifdef H5
                        result += '\n' + params[i].seriesName + ':' + value + ' ' + unit
                        // #endif
                         
                        // #ifdef APP-PLUS
                        result += '<br/>' + params[i].marker + params[i].seriesName + ':' + value + ' ' + unit
                        // #endif
                    }
                    return result
                }
            },
            /**
             * 保留两位小数
             * @param {Object} value
             */
            formatFloat2(value) {
                let temp = Math.round(parseFloat(value) * 100) / 100
                let xsd = temp.toString().split('.')
                if (xsd.length === 1) {
                    temp = (isNaN(temp) ? '0' : temp.toString()) + '.00'
                    return temp
                }
                if (xsd.length > 1) {
                    if (xsd[1].length < 2) {
                        temp = temp.toString() + '0'
                    }
                    return temp
                }
            },
            /**
             * 添加千分位
             * @param {Object} value
             */
            formatThousands(value) {
                if (value === undefined || value === null) {
                    value = ''
                }
                if (!isNaN(value)) {
                    value = value + ''
                }
                let re = /\d{1,3}(?=(\d{3})+$)/g
                let n1 = value.replace(/^(\d+)((\.\d+)?)$/, function(s, s1, s2) {
                    return s1.replace(re, '$&,') + s2
                })
                return n1
            }
        }
    }
</script>
  
<style lang="scss" scoped>
    .echarts {
        width: 100%;
        height: 100%;
    }
</style>
index.vue实现

实现代码如下:

<template>
  <view>
    <view class="uni-list">
      <view class="uni-list-cell">
        <view class="uni-list-cell-db">
      <input class="uni-input" type="number" placeholder="请输入股票代码" @blur="moveAway"/>
          <picker class="pickerDate" mode="date" :value="date1" :start="startDate" :end="endDate"
            @change="bindDateChangeStart">
            <view class="uni-input">开始时间:{{date1}}</view>
          </picker>
      <picker class="pickerDate" mode="date" :value="date2" :start="startDate" :end="endDate"
        @change="bindDateChangeEnd">
        <view class="uni-input">结束时间:{{date2}}</view>
      </picker>
        </view>
    <button type="primary" @click="searchHistoryPrice">查询</button>
      </view>
    </view>
    <view class="content">
        <echarts :option="option3" style="height: 400px;"></echarts>
    </view>
  </view>
  
</template>

<script>
      function getDate() {
          const date = new Date();
          let year = date.getFullYear();
          let month = date.getMonth() + 1;
          let day = date.getDate() - 1;
          month = month > 9 ? month : '0' + month;  
          day = day > 9 ? day : '0' + day;
          return `${year}-${month}-${day}`;
      }
      
      function getStartDate() {
          const date = new Date();
          let year = date.getFullYear() - 10;
          let month = date.getMonth() + 1;
          let day = date.getDate() - 1;
          month = month > 9 ? month : '0' + month;  
          day = day > 9 ? day : '0' + day;
          return `${year}-${month}-${day}`;
      }
      
      export default {
        data() {
    return {
    index: 0,
    codePrice: '',
    date1: getDate(),
    date2: getDate(),
    startDate: getStartDate(),
    endDate:  getDate(),
    option3: {
        xAxis: {
            type: 'category',
            data: []
        },
        yAxis: {
            type: 'value'
        },
        series: [
            {
                data: [],
                type: 'line'
            }
        ]
    },
    }
        },
     
        methods: {
          bindDateChangeStart: function (e) {
            this.date1 = e.detail.value
    console.log(this.date1)
          },
      
          bindDateChangeEnd: function (e) {
            this.date2 = e.detail.value
    console.log(this.date2)
          },
      
      moveAway: function (e) {
      this.codePrice = e.detail.value
      console.log(e.detail.value)
      },
      
    
      
      searchHistoryPrice: function (e) {
      uni.request({
          url: 'https://route.showapi.com/131-47?appKey=key&begin=' + this.date1 + '&type=bfq&end=' + this.date2 + '&code=' + this.codePrice,
          method:'GET',
          success: (res) => {
          if(res.statusCode === 200){
          const dataList = res.data.showapi_res_body.list;
    const datePrice = dataList.map(datePrice => datePrice.date);
    const closePrice = dataList.map(closePirce => closePirce.close_price);
    this.option3.series[0].data = closePrice;
    this.option3.xAxis.data = datePrice;    
          }
          else{
          console.error('请求失败',res);
          }
          },
          fail: (err) => {
          console.error('请求出错',err);
          }
      });
      }
        }
      }
</script>

<style>
  .uni-picker-tips {
    font-size: 20px;
    color: #666;
    margin-bottom: 15px;
    padding: 0 15px;
  }
  
  view,input{
      font-size: 20px;
      color: #666;
      margin-bottom: 15px;
      padding: 0 15px;
  }
  input{
     border: #4CD964;
  }
</style>
pages.json实现

实现代码如下:

{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
    {
    "path": "pages/index/index",
    "style": {
    "navigationBarTitleText": "历史股价查询"
    }
    }
    ],
    "globalStyle": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "历史股价查询",
    "navigationBarBackgroundColor": "#F8F8F8",
    "backgroundColor": "#F8F8F8"
    }
}

至此,我们的业务实现完成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【音视频处理】FFmpeg for Windows 安装教程

FFmpeg 是一个强大的多媒体处理工具&#xff0c;可以处理音视频的各种任务&#xff0c;包括格式转换、裁剪、合并等操作&#xff0c;市面上你可以看到的几乎所有的音视频的处理工具内部都离不开FFmpeg的身影。 本文将详细介绍如何在 Windows 系统上安装 FFmpeg。 1. 下载 FFmp…

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先

&#xff08;一&#xff09;问题描述 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09;236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…

【28】Word:石油化工设备技术❗

目录 题目 NO1.2 NO3 NO4 题目 NO1.2 F12&#xff1a;另存为将“Word素材.docx”文件另存为“Word. docx”&#xff08;“docx”为文件扩展名&#xff09; 光标来到表格上方→插入→形状→新建画布→单击选中→格式→高度/宽度&#xff08;格式→大小对话框→取消勾选✔锁定…

总线、UART、IIC、SPI

一图流 总线 概念 连接多个部件的信息传输线&#xff0c;是各部件共享的传输介质 类型 片内总线&#xff1a;连接处理器内核和外设的总线&#xff0c;在芯片内部 片外总线&#xff1a;连接芯片和其他芯片或者模块的总线 总线的通信 总线通信的方式 串行通信 数据按位顺序传…

【Postman接口测试】接口用例设计实战—以聚合数据的新闻头条接口为例

在接口测试中&#xff0c;精心设计测试用例是确保接口质量的关键。本文将以聚合数据的新闻头条接口&#xff08;新闻详情查询&#xff09;为例&#xff0c;深入运用多种测试用例设计方法&#xff0c;打造全面且细致的测试用例集。 一、等价类划分法 &#xff08;一&#xff…

Frida使用指南(三)- Frida-Native-Hook

1.Process、Module、Memory基础 1.Process Process 对象代表当前被Hook的进程,能获取进程的信息,枚举模块,枚举范围等 2.Module Module 对象代表一个加载到进程的模块(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件), 能查询模块的信息,如模块的基址、名…

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…

数字化转型的核心是什么,企业该如何实施?

一、数字化转型的必要性 传统企业在推进业务创新和IT系统建设时&#xff0c;常采用项目式方法&#xff0c;虽经典但易引发“系统烟囱”与“数据孤岛”问题&#xff0c;困扰管理层。 数字化转型是企业战略层面的变革&#xff0c;其核心是利用数字化技术重构业务、流程与组织。…

力扣206题——反转链表

#题目 #代码 既然要反转&#xff0c;那么头结点如果不为空最后会成为尾结点&#xff0c;所以我们把头结点的后继指向null&#xff1b; 接着就是对头结点的下一个节点进行置换操作&#xff0c;大家可多思考一下代码

深入MapReduce——引入

引入 前面我们已经深入了HDFS的设计与实现&#xff0c;对于分布式系统也有了不错的理解。 但HDFS仅仅解决了海量数据存储和读写的问题。要想让数据产生价值&#xff0c;一定是需要从数据中挖掘出价值才行&#xff0c;这就需要我们拥有海量数据的计算处理能力。 下面我们还是…

.NET MAUI进行UDP通信(二)

上篇文章有写过一个简单的demo&#xff0c;本次对项目进行进一步的扩展&#xff0c;添加tabbar功能。 1.修改AppShell.xaml文件&#xff0c;如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <Shellx:Class"mauiDemo.AppShel…

SOME/IP服务接口

本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟&#xff0c;并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理&#xff0c;并结合实际代码展示 SOME/IP 的使用&#xff0c;旨在自我复习并与大家交流。文中引用了一些例图&#xff0c;但由于未能找到原作…

大厂案例——腾讯蓝鲸DevOps类应用的设计与实践

蓝鲸体系架构图 蓝鲸CICD应用功能架构 降低DEVOPS门槛—开发者中心 CICD应用需要的后台服务 系列阅读 12306亿级流量架构分析&#xff08;史上最全&#xff09;实现电商平台从业务到架构的治理体系基于主数据驱动的数据治理什么时候需要分表分库&#xff1f;-CSDN博客

【Uniapp-Vue3】动态设置页面导航条的样式

1. 动态修改导航条标题 uni.setNavigationBarTitle({ title:"标题名称" }) 点击修改以后顶部导航栏的标题会从“主页”变为“动态标题” 2. 动态修改导航条颜色 uni.setNavigationBarColor({ backgroundColor:"颜色" }) 3. 动态添加导航加载动画 // 添加加…

ubuntu20.04安装使用direct_visual_lidar_calibration标定雷达和相机

官方链接GitHub - koide3/direct_visual_lidar_calibration: A toolbox for target-less LiDAR-camera calibration [ROS1/ROS2] 官方安装方式 Installation - direct_visual_lidar_calibration 安装依赖 sudo apt install libomp-dev libboost-all-dev libglm-dev libglfw…

C++从入门到实战(二)C++命名空间

C从入门到实战&#xff08;二&#xff09;C命名空间 前言一、C的第一个程序二、命名空间&#xff08;一&#xff09;为什么需要命名空间&#xff08;二&#xff09;定义命名空间&#xff08;三&#xff09;使用命名空间1.通过命名空间限定符&#xff1a;2.使用 using 声明&…

单片机基础模块学习——按键

一、按键原理图 当把跳线帽J5放在右侧&#xff0c;属于独立按键模式&#xff08;BTN模式&#xff09;&#xff0c;放在左侧为矩阵键盘模式&#xff08;KBD模式&#xff09; 整体结构是一端接地&#xff0c;一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…

数学大模型MAmmoTH:通过混合说明调整建立数学通才模型

向悦和陈文虎是该项目的主要作者。他们这个项目推出 MAmmoTH&#xff0c;这是一系列专为解决一般数学问题而定制的开源大型语言模型 (LLM)。 MAmmoTH 模型在 MathInstruct 上进行训练&#xff0c;MathInstruct 是我们精心策划的指令调整数据集。 MathInstruct 已编译 来自 13 个…

网络编程 | UDP组播通信

1、什么是组播 在上一篇博客中&#xff0c;对UDP的广播通信进行了由浅入深的总结梳理&#xff0c;本文继续对UDP的知识体系进行探讨&#xff0c;旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间&#xff0c;在一个局域网内&#xff0c;将某些主机添加到组中…

如何确保Spring单例Bean在高并发环境下的安全性?

在Spring中&#xff0c;单例Bean就像是一个“公共的水杯”&#xff0c;整个应用程序中的所有线程都会共享这一个实例。在大部分情况下&#xff0c;这没什么问题&#xff0c;但如果多个线程同时想要修改这个“水杯”里的内容&#xff0c;就可能会出现问题了。 想象一下&#xff…