当前位置: 首页 > news >正文

浅谈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.initdocument.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) {// tooltipif (option.tooltip) {// 判断是否设置tooltip的位置if (option.tooltip.positionStatus) {option.tooltip.position = this.tooltipPosition()}// 判断是否格式化tooltipif (option.tooltip.formatterStatus) {option.tooltip.formatter = this.tooltipFormatter(option.tooltip.formatterUnit, option.tooltip.formatFloat2, option.tooltip.formatThousands)}}// 设置新的optionthis.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 H5result += '\n' + params[i].seriesName + ':' + value + ' ' + unit// #endif// #ifdef APP-PLUSresult += '<br/>' + params[i].marker + params[i].seriesName + ':' + value + ' ' + unit// #endif}return result}},/*** 保留两位小数* @param {Object} value*/formatFloat2(value) {let temp = Math.round(parseFloat(value) * 100) / 100let 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})+$)/glet 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.valueconsole.log(this.date1)},bindDateChangeEnd: function (e) {this.date2 = e.detail.valueconsole.log(this.date2)},moveAway: function (e) {this.codePrice = e.detail.valueconsole.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"}
}

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

相关文章:

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

浅谈APP之历史股票通过echarts绘图 需求描述 今天我们需要做一个简单的历史股票收盘价格通过echarts进行绘图&#xff0c;效果如下&#xff1a; 业务实现 代码框架 代码框架如下&#xff1a; . 依赖包下载 我们通过网站下载自己需要的涉及的图标&#xff0c;勾选之后进…...

Ubuntu 20.04 x64下 编译安装ffmpeg

试验的ffmpeg版本 4.1.3 本文使用的config命令 ./configure --prefixhost --enable-shared --disable-static --disable-doc --enable-postproc --enable-gpl --enable-swscale --enable-nonfree --enable-libfdk-aac --enable-decoderh264 --enable-libx265 --enable-libx…...

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥&#xff0c;能干嘛 我们经常会用es来实现一些关于检索&#xff0c;关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI&#xff0c;你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…...

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验&#xff0c;我自身也在不断的学习当中&#xff0c;如果文章有写的不对的地方&#xff0c;欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…...

三星手机人脸识别解锁需要点击一下电源键,能够不用点击直接解锁吗

三星手机的人脸识别解锁功能默认需要滑动或点击屏幕来解锁。这是为了增强安全性&#xff0c;防止误解锁的情况。如果希望在检测到人脸后直接进入主界面&#xff0c;可以通过以下设置调整&#xff1a; 打开设置&#xff1a; 进入三星手机的【设置】应用。 进入生物识别和安全&a…...

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

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

网络安全 | F5-Attack Signatures-Set详解

关注&#xff1a;CodingTechWork 创建和分配攻击签名集 可以通过两种方式创建攻击签名集&#xff1a;使用过滤器或手动选择要包含的签名。  基于过滤器的签名集仅基于在签名过滤器中定义的标准。基于过滤器的签名集的优点在于&#xff0c;可以专注于定义用户感兴趣的攻击签名…...

004 mybatis基础应用之全局配置文件

文章目录 配置内容properties标签typeAlias标签mappers标签 配置内容 SqlMapConfig.xml中配置的内容和顺序如下&#xff1a; properties&#xff08;属性&#xff09; settings&#xff08;全局配置参数&#xff09; typeAliases&#xff08;类型别名&#xff09; typeHandler…...

【岛屿个数——BFS / DFS,“外海”】

题目 推荐阅读 AcWing 4959. 岛屿个数&#xff08;两种解法&#xff0c;通俗解释&#xff09; - AcWing 1.岛屿个数 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second int dx4[4] {-1, 0, 1, 0}, dy4[4] …...

MySQL常用数据类型和表的操作

文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数&#xff0c;取值范围为1~64,若…...

2025_1_27 C语言内存,递归,汉诺塔问题

1.c程序在内存中的布局 代码段&#xff08;Code Segment&#xff09; 位置&#xff1a;通常位于内存的最低地址。 用途&#xff1a;存储程序的可执行指令。 特点&#xff1a;只读&#xff0c;防止程序运行时被修改。数据段&#xff08;Data Segment&#xff09; 位置&#xf…...

开源音乐管理软件Melody

本文软件由网友 heqiusheng 推荐。不过好像已经是一年前了 &#x1f602; 简介 什么是 Melody &#xff1f; Melody 是你的音乐精灵&#xff0c;旨在帮助你更好地管理音乐。目前的主要能力是帮助你将喜欢的歌曲或者音频上传到音乐平台的云盘。 主要功能包括&#xff1a; 歌曲…...

Nginx开发01:基础配置

一、下载和启动 1.下载、使用命令行启动&#xff1a;Web开发&#xff1a;web服务器-Nginx的基础介绍&#xff08;含AI文稿&#xff09;_nginx作为web服务器,可以承担哪些基本任务-CSDN博客 注意&#xff1a;我配置的端口是81 2.测试连接是否正常 访问Welcome to nginx! 如果…...

【TCP 协议】确认应答机制 超时重传 三次握手 四次挥手

TCP报文首部 确认应答机制 TCP 是可靠的&#xff0c;指的是它能够确保数据从源端准确无误地传输到目的端。 当客户端和服务器通信时&#xff0c;客户端向服务器发送报文&#xff0c;那么&#xff0c;客户端怎么知道服务器已经收到报文了呢&#xff1f; 服务器收到客户端发的报…...

jenkins-k8s pod方式动态生成slave节点

一. 简述&#xff1a; 使用 Jenkins 和 Kubernetes (k8s) 动态生成 Slave 节点是一种高效且灵活的方式来管理 CI/CD 流水线。通过这种方式&#xff0c;Jenkins 可以根据需要在 Kubernetes 集群中创建和销毁 Pod 来执行任务&#xff0c;从而充分利用集群资源并实现更好的隔离性…...

基于vue和elementui的简易课表

本文参考基于vue和elementui的课程表_vue实现类似课程表的周会议列表-CSDN博客&#xff0c;原程序在vue3.5.13版本下不能运行&#xff0c;修改两处&#xff1a; 1&#xff09;slot-cope改为v-slot 2&#xff09;return background-color:rgb(24 144 255 / 80%);color: #fff; …...

可用的IPv6公共DNS(2025年1月更新)

境内IPv6 DNS&#xff1a; 1. 腾讯DNS&#xff1a;2402:4e00:: 2. 阿里DNS&#xff1a;2400:3200::1、2400:3200:baba::1 3. ISP&#xff08;电信服务运营商&#xff09;的IPv6 DNS&#xff0c;请以各ISP实际下发的为准&#xff0c;或拨打10000、10010、10086等号码询问人工…...

c高级复习

c高级复习...

电子信息工程专业主要研究哪一方面东西?

序言&#xff1a; 如今科技发展那叫一个迅猛&#xff0c;电子信息专业可是站在这股浪潮的 C 位&#xff0c;狠狠推动着社会向前跑。这专业就像一座神奇桥梁&#xff0c;把虚拟数字和现实生活紧紧相连&#xff0c;把那些信号变成咱们看到的画面、听到的声音。你看&#xff0c;从…...

RU 19.26安装(手工安装各个补丁)

使用手工方式打RU19.26 参考文档&#xff1a; Supplemental Readme - Grid Infrastructure Release Update 12.2.0.1.x / 18c /19c (Doc ID 2246888.1) 操作步骤&#xff1a; 1 Stop the CRS managed resources running from DB homes. 2 Run the pre root script. 3 Patch GI…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...