You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
333 lines
7.5 KiB
333 lines
7.5 KiB
<template>
|
|
<div id="chart122" :prop="config" :change:prop="highstock.changeConfig" class="chart-box"></div>
|
|
</template>
|
|
<script>
|
|
import { mapState } from "vuex";
|
|
export default {
|
|
props: {
|
|
tradeList: {
|
|
default() {
|
|
return [];
|
|
},
|
|
type: Array,
|
|
required: false,
|
|
},
|
|
query: {
|
|
default: {},
|
|
type: Object,
|
|
required: false,
|
|
},
|
|
},
|
|
computed: {
|
|
...mapState({
|
|
serveTheme: "theme",
|
|
}),
|
|
},
|
|
watch: {},
|
|
data() {
|
|
return {
|
|
config: {},
|
|
};
|
|
},
|
|
methods: {
|
|
resetData(){
|
|
this.config = '';
|
|
this.$nextTick(()=>{
|
|
this.config = {
|
|
type:'resetList',
|
|
list:this.tradeList,
|
|
date:new Date()
|
|
}
|
|
})
|
|
},
|
|
addPoint(data){
|
|
this.config = {
|
|
type:'addPoint',
|
|
point:data,
|
|
date:new Date()
|
|
}
|
|
},
|
|
getConfig() {
|
|
return {
|
|
type: "initPage",
|
|
list: this.tradeList,
|
|
theme:this.serveTheme
|
|
};
|
|
},
|
|
},
|
|
created() {
|
|
this.config = this.getConfig();
|
|
},
|
|
};
|
|
</script>
|
|
<script module="highstock" lang="renderjs">
|
|
import highstock from "highcharts/highstock";
|
|
export default {
|
|
|
|
computed: {
|
|
list() {
|
|
return this.chartTradList.map((item) => {
|
|
return [item.ts, item.price*1];
|
|
});
|
|
},
|
|
|
|
},
|
|
watch: {},
|
|
data() {
|
|
return {
|
|
chart: undefined,
|
|
chartTradList:[],
|
|
theme:'light'
|
|
};
|
|
},
|
|
methods: {
|
|
changeConfig(config){
|
|
this.task(config)
|
|
},
|
|
task(config){
|
|
switch (config.type) {
|
|
case 'resetList':
|
|
this.chartTradList = config.list;
|
|
this.setData(this.list)
|
|
break;
|
|
case 'addPoint':
|
|
this.webAddPoint(config.point)
|
|
break;
|
|
case 'initPage':
|
|
this.chartTradList = config.list;
|
|
this.theme = config.theme;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
},
|
|
isDSTByRules() {
|
|
const now = new Date();
|
|
const year = now.getUTCFullYear();
|
|
// 计算夏令时开始时间(3月第二个周日 2:00 AM EDT)
|
|
const dstStart = this.getNthSunday(year, 2, 2, 2); // 月份从 0 开始(2=3月)
|
|
|
|
// 计算夏令时结束时间(11月第一个周日 2:00 AM EST)
|
|
const dstEnd = this.getNthSunday(year, 10, 1, 2); // 月份从 0 开始(10=11月)
|
|
|
|
return now >= dstStart && now < dstEnd;
|
|
},
|
|
|
|
// 辅助函数:获取某年第n个月的第m个周日(月份从0开始)
|
|
getNthSunday(year, month, occurrence, hour) {
|
|
let date = new Date(year, month, 1);
|
|
let count = 0;
|
|
|
|
while (true) {
|
|
if (date.getDay() === 0) {
|
|
if (++count === occurrence) {
|
|
date.setHours(hour);
|
|
return date;
|
|
}
|
|
}
|
|
date.setDate(date.getDate() + 1);
|
|
}
|
|
},
|
|
intiChart($box) {
|
|
let timeData = this.isDSTByRules()
|
|
highstock.setOptions({
|
|
global: {
|
|
timezoneOffset: timeData ? 16 * 60 : 16 * 60,
|
|
},
|
|
});
|
|
|
|
this.chart = highstock.stockChart($box, {
|
|
chart: {
|
|
marginTop: 0,
|
|
// marginLeft: 0,
|
|
marginBottom: 20,
|
|
padding: 0,
|
|
panning: false, //禁用放大
|
|
pinchType: "", //禁用手势操作
|
|
zoomType: "",
|
|
panKey: "shift",
|
|
backgroundColor: "transparent",
|
|
borderColor: "transparent",
|
|
borderWidth: "1",
|
|
plotBackgroundColor: "transparent",
|
|
Point: {
|
|
visible: !1,
|
|
},
|
|
},
|
|
rangeSelector: {
|
|
enabled: false,
|
|
},
|
|
navigator: {
|
|
enabled: false,
|
|
},
|
|
scrollbar: {
|
|
enabled: false,
|
|
},
|
|
exporting: {
|
|
enabled: !0,
|
|
},
|
|
credits: {
|
|
enabled: !1,
|
|
},
|
|
mapNavigation: {
|
|
enabled: !1,
|
|
enableButtons: !1,
|
|
},
|
|
navigation: {
|
|
enabled: !1,
|
|
buttonOptions: {},
|
|
},
|
|
title: {
|
|
text: null,
|
|
},
|
|
yAxis: {
|
|
gridLineWidth: 1,
|
|
tickWidth: 0,
|
|
tickColor: "#22222d",
|
|
tickAmount: 7,
|
|
// lineWidth: 1,
|
|
lineColor: "#1E2E3F",
|
|
labels: {
|
|
align: "center",
|
|
x: 0,
|
|
style: {
|
|
color: this.theme=='light'?"#333":"#dcdee0",
|
|
fontSize: "8px",
|
|
},
|
|
useHTML: !0,
|
|
formatter: (ev) => {
|
|
return this.nFormatter(ev.value, 3);
|
|
},
|
|
},
|
|
opposite: false,
|
|
gridLineColor: "transparent",
|
|
},
|
|
xAxis: {
|
|
type: "datetime",
|
|
dateTimeLabelFormats: {
|
|
millisecond: "%H:%M:%S.%L",
|
|
second: "%H:%M:%S",
|
|
minute: "%H:%M",
|
|
hour: "%H:%M",
|
|
day: "%m-%d",
|
|
week: "%m-%d",
|
|
month: "%Y-%m",
|
|
year: "%Y",
|
|
},
|
|
tickWidth: 0,
|
|
lineWidth: "0",
|
|
tickLength: 0,
|
|
labels: {
|
|
style: {
|
|
color: this.theme=='light'?"#333":"#dcdee0",
|
|
fontSize: "10px",
|
|
},
|
|
y: 10,
|
|
},
|
|
},
|
|
tooltip: {
|
|
enabled: false,
|
|
dateTimeLabelFormats: {
|
|
millisecond: "%H:%M:%S.%L",
|
|
second: "%H:%M:%S",
|
|
minute: "%H:%M",
|
|
hour: "%H:%M",
|
|
day: "%Y-%m-%d",
|
|
week: "%m-%d",
|
|
month: "%Y-%m",
|
|
year: "%Y",
|
|
},
|
|
},
|
|
legend: {
|
|
enabled: !1,
|
|
},
|
|
plotOptions: {
|
|
areaspline: {
|
|
allowPointSelect:false,
|
|
fillColor: {
|
|
linearGradient: {
|
|
x1: 0,
|
|
y1: 0,
|
|
x2: 0,
|
|
y2: 1,
|
|
},
|
|
stops: [
|
|
[0, "rgba(192,96,194,.58)"],
|
|
[1, "rgba(90,99,251,.13)"],
|
|
],
|
|
},
|
|
marker: {
|
|
radius: 2,
|
|
},
|
|
lineWidth: 2,
|
|
threshold: null,
|
|
},
|
|
},
|
|
series: [
|
|
{
|
|
marker: {
|
|
radius: 0,
|
|
lineWidth: 0,
|
|
lineColor: "#fba845",
|
|
fillColor: "#fba845",
|
|
states: {},
|
|
},
|
|
type: "areaspline",
|
|
name: "",
|
|
data: this.list,
|
|
color: {
|
|
linearGradient:{
|
|
x1:'0%',
|
|
y1:'0%',
|
|
x2:'100%',
|
|
y2:'100%'
|
|
},
|
|
stops:[
|
|
[0, '#C060C2'],
|
|
[1, '#5A63FB'],
|
|
]
|
|
},
|
|
},
|
|
],
|
|
});
|
|
},
|
|
nFormatter(num, digits) {
|
|
const si = [
|
|
{ value: 1, symbol: "" },
|
|
{ value: 1e3, symbol: "K" },
|
|
{ value: 1e6, symbol: "M" },
|
|
{ value: 1e9, symbol: "G" },
|
|
{ value: 1e12, symbol: "T" },
|
|
{ value: 1e15, symbol: "P" },
|
|
{ value: 1e18, symbol: "E" },
|
|
];
|
|
const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
|
|
let i;
|
|
for (i = si.length - 1; i > 0; i--) {
|
|
if (num >= si[i].value) {
|
|
break;
|
|
}
|
|
}
|
|
return (
|
|
(num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol
|
|
);
|
|
},
|
|
setData(arr) {
|
|
if(this.chart) this.chart.series[0].setData(arr);
|
|
},
|
|
webAddPoint(obj){
|
|
if(this.chart) this.chart.series[0].addPoint(obj,true,true)
|
|
}
|
|
},
|
|
mounted() {
|
|
this.task(this.config)
|
|
this.intiChart(document.getElementById("chart122"));
|
|
},
|
|
destroyed() {},
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.chart-box {
|
|
height: 100%;
|
|
}
|
|
</style>
|