GaugeChart.vue 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <template>
  2. <div :class="className" :style="{height:height,width:width}" />
  3. </template>
  4. <script>
  5. import * as echarts from 'echarts';
  6. require('echarts/theme/macarons') // echarts theme
  7. import resize from './mixins/resize'
  8. export default {
  9. mixins: [resize],
  10. props: {
  11. className: {
  12. type: String,
  13. default: 'chart'
  14. },
  15. width: {
  16. type: String,
  17. default: '104px'
  18. },
  19. height: {
  20. type: String,
  21. default: '104px'
  22. }
  23. },
  24. data() {
  25. return {
  26. chart: null,
  27. option: {
  28. series: [
  29. {
  30. name: 'hour',
  31. type: 'gauge',
  32. startAngle: 90,
  33. endAngle: -270,
  34. min: 0,
  35. max: 12,
  36. splitNumber: 12,
  37. clockwise: true,
  38. axisTick:{
  39. show:false,
  40. },
  41. axisLine: {
  42. lineStyle: {
  43. width: 2,
  44. color: [[1, 'rgba(0,0,0,0.7)']],
  45. shadowColor: 'rgba(0, 0, 0, 0.5)',
  46. shadowBlur: 2
  47. }
  48. },
  49. splitLine: {
  50. length: 3,
  51. distance: 3,
  52. lineStyle: {
  53. width: 1,
  54. shadowColor: 'rgba(0, 0, 0, 0.3)',
  55. shadowBlur: 1,
  56. shadowOffsetX: 1,
  57. shadowOffsetY: 2
  58. }
  59. },
  60. axisLabel: {
  61. fontSize: 11,
  62. distance: 3,
  63. formatter: function (value) {
  64. if (value === 0) {
  65. return '';
  66. }
  67. return value + '';
  68. }
  69. },
  70. anchor: {
  71. show: false,
  72. icon: 'path://M532.8,70.8C532.8,70.8,532.8,70.8,532.8,70.8L532.8,70.8C532.7,70.8,532.8,70.8,532.8,70.8z M456.1,49.6c-2.2-6.2-8.1-10.6-15-10.6h-37.5v10.6h37.5l0,0c2.9,0,5.3,2.4,5.3,5.3c0,2.9-2.4,5.3-5.3,5.3v0h-22.5c-1.5,0.1-3,0.4-4.3,0.9c-4.5,1.6-8.1,5.2-9.7,9.8c-0.6,1.7-0.9,3.4-0.9,5.3v16h10.6v-16l0,0l0,0c0-2.7,2.1-5,4.7-5.3h10.3l10.4,21.2h11.8l-10.4-21.2h0c6.9,0,12.8-4.4,15-10.6c0.6-1.7,0.9-3.5,0.9-5.3C457,53,456.7,51.2,456.1,49.6z M388.9,92.1h11.3L381,39h-3.6h-11.3L346.8,92v0h11.3l3.9-10.7h7.3h7.7l3.9-10.6h-7.7h-7.3l7.7-21.2v0L388.9,92.1z M301,38.9h-10.6v53.1H301V70.8h28.4l3.7-10.6H301V38.9zM333.2,38.9v10.6v10.7v31.9h10.6V38.9H333.2z M249.5,81.4L249.5,81.4L249.5,81.4c-2.9,0-5.3-2.4-5.3-5.3h0V54.9h0l0,0c0-2.9,2.4-5.3,5.3-5.3l0,0l0,0h33.6l3.9-10.6h-37.5c-1.9,0-3.6,0.3-5.3,0.9c-4.5,1.6-8.1,5.2-9.7,9.7c-0.6,1.7-0.9,3.5-0.9,5.3l0,0v21.3c0,1.9,0.3,3.6,0.9,5.3c1.6,4.5,5.2,8.1,9.7,9.7c1.7,0.6,3.5,0.9,5.3,0.9h33.6l3.9-10.6H249.5z M176.8,38.9v10.6h49.6l3.9-10.6H176.8z M192.7,81.4L192.7,81.4L192.7,81.4c-2.9,0-5.3-2.4-5.3-5.3l0,0v-5.3h38.9l3.9-10.6h-53.4v10.6v5.3l0,0c0,1.9,0.3,3.6,0.9,5.3c1.6,4.5,5.2,8.1,9.7,9.7c1.7,0.6,3.4,0.9,5.3,0.9h23.4h10.2l3.9-10.6l0,0H192.7z M460.1,38.9v10.6h21.4v42.5h10.6V49.6h17.5l3.8-10.6H460.1z M541.6,68.2c-0.2,0.1-0.4,0.3-0.7,0.4C541.1,68.4,541.4,68.3,541.6,68.2L541.6,68.2z M554.3,60.2h-21.6v0l0,0c-2.9,0-5.3-2.4-5.3-5.3c0-2.9,2.4-5.3,5.3-5.3l0,0l0,0h33.6l3.8-10.6h-37.5l0,0c-6.9,0-12.8,4.4-15,10.6c-0.6,1.7-0.9,3.5-0.9,5.3c0,1.9,0.3,3.7,0.9,5.3c2.2,6.2,8.1,10.6,15,10.6h21.6l0,0c2.9,0,5.3,2.4,5.3,5.3c0,2.9-2.4,5.3-5.3,5.3l0,0h-37.5v10.6h37.5c6.9,0,12.8-4.4,15-10.6c0.6-1.7,0.9-3.5,0.9-5.3c0-1.9-0.3-3.7-0.9-5.3C567.2,64.6,561.3,60.2,554.3,60.2z',
  73. showAbove: false,
  74. offsetCenter: [0, '-35%'],
  75. size: 10,
  76. keepAspect: true,
  77. itemStyle: {
  78. color: '#707177'
  79. }
  80. },
  81. pointer: {
  82. icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',
  83. width: 5,
  84. length: '55%',
  85. offsetCenter: [0, '8%'],
  86. itemStyle: {
  87. color: '#C0911F',
  88. shadowColor: 'rgba(0, 0, 0, 0.3)',
  89. shadowBlur: 1,
  90. shadowOffsetX: 2,
  91. shadowOffsetY: 4
  92. }
  93. },
  94. detail: {
  95. show: false
  96. },
  97. title: {
  98. offsetCenter: [0, '30%']
  99. },
  100. data: [
  101. {
  102. value: 0
  103. }
  104. ]
  105. },
  106. {
  107. name: 'minute',
  108. type: 'gauge',
  109. startAngle: 90,
  110. endAngle: -270,
  111. min: 0,
  112. max: 60,
  113. clockwise: true,
  114. axisLine: {
  115. show: false
  116. },
  117. splitLine: {
  118. show: false
  119. },
  120. axisTick: {
  121. show: false
  122. },
  123. axisLabel: {
  124. show: false
  125. },
  126. pointer: {
  127. icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',
  128. width: 3,
  129. length: '70%',
  130. offsetCenter: [0, '8%'],
  131. itemStyle: {
  132. color: '#C0911F',
  133. shadowColor: 'rgba(0, 0, 0, 0.3)',
  134. shadowBlur: 1,
  135. shadowOffsetX: 2,
  136. shadowOffsetY: 4
  137. }
  138. },
  139. anchor: {
  140. show: true,
  141. size: 8,
  142. showAbove: false,
  143. itemStyle: {
  144. borderWidth: 3,
  145. borderColor: '#C0911F',
  146. shadowColor: 'rgba(0, 0, 0, 0.3)',
  147. shadowBlur: 1,
  148. shadowOffsetX: 2,
  149. shadowOffsetY: 4
  150. }
  151. },
  152. detail: {
  153. show: false
  154. },
  155. title: {
  156. offsetCenter: ['0%', '-40%']
  157. },
  158. data: [
  159. {
  160. value: 0
  161. }
  162. ]
  163. },
  164. {
  165. name: 'second',
  166. type: 'gauge',
  167. startAngle: 90,
  168. endAngle: -270,
  169. min: 0,
  170. max: 60,
  171. animationEasingUpdate: 'bounceOut',
  172. clockwise: true,
  173. axisLine: {
  174. show: false
  175. },
  176. splitLine: {
  177. show: false
  178. },
  179. axisTick: {
  180. show: false
  181. },
  182. axisLabel: {
  183. show: false
  184. },
  185. pointer: {
  186. icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',
  187. width: 1,
  188. length: '85%',
  189. offsetCenter: [0, '8%'],
  190. itemStyle: {
  191. color: '#C0911F',
  192. shadowColor: 'rgba(0, 0, 0, 0.3)',
  193. shadowBlur: 1,
  194. shadowOffsetX: 2,
  195. shadowOffsetY: 4
  196. }
  197. },
  198. anchor: {
  199. show: true,
  200. size: 1,
  201. showAbove: true,
  202. itemStyle: {
  203. color: '#C0911F',
  204. shadowColor: 'rgba(0, 0, 0, 0.3)',
  205. shadowBlur: 1,
  206. shadowOffsetX: 2,
  207. shadowOffsetY: 4
  208. }
  209. },
  210. detail: {
  211. show: false
  212. },
  213. title: {
  214. offsetCenter: ['0%', '-40%']
  215. },
  216. data: [
  217. {
  218. value: 0
  219. }
  220. ]
  221. }
  222. ]
  223. },
  224. }
  225. },
  226. mounted() {
  227. this.$nextTick(() => {
  228. // this.initChart()
  229. this.time()
  230. this.chart = echarts.init(this.$el, 'macarons')
  231. this.chart.setOption(this.option)
  232. // return
  233. var that=this;
  234. setInterval(function () {
  235. var date = new Date();
  236. var y = date.getFullYear();
  237. var m = date.getMonth() + 1;
  238. var d = date.getDate();
  239. var h = date.getHours();
  240. var min = date.getMinutes();
  241. var s = date.getSeconds();
  242. var second = s;
  243. var minute = min + second / 60;
  244. var hour = (h % 12) + minute / 60;
  245. var timeStr = (h < 10 ? ('0' + h) : h) + ':' + (min < 10 ? ('0' + min) : min) + ':' + (s < 10 ? (
  246. '0' + s) : s);
  247. var day=m+'月'+d+'日'
  248. var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
  249. var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  250. var obj={
  251. time:timeStr,
  252. day:day,
  253. week:weeks[week]
  254. }
  255. // that.option.animationDurationUpdate = 300;
  256. that.$emit('getTime',obj)
  257. var optione={
  258. series: [
  259. {
  260. name: 'hour',
  261. animation: hour !== 0,
  262. data: [{ value: hour }]
  263. },
  264. {
  265. name: 'minute',
  266. animation: minute !== 0,
  267. data: [{ value: minute }]
  268. },
  269. {
  270. animation: second !== 0,
  271. name: 'second',
  272. data: [{ value: second }]
  273. }
  274. ]
  275. }
  276. that.chart.setOption(optione);
  277. }, 1000);
  278. })
  279. },
  280. beforeDestroy() {
  281. if (!this.chart) {
  282. return
  283. }
  284. this.chart.dispose()
  285. this.chart = null
  286. },
  287. methods: {
  288. time(){
  289. var date = new Date();
  290. var y = date.getFullYear();
  291. var m = date.getMonth() + 1;
  292. var d = date.getDate();
  293. var h = date.getHours();
  294. var min = date.getMinutes();
  295. var s = date.getSeconds();
  296. var timeStr = (h < 10 ? ('0' + h) : h) + ':' + (min < 10 ? ('0' + min) : min) + ':' + (s < 10 ? (
  297. '0' + s) : s);
  298. var day=m+'月'+d+'日'
  299. var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
  300. var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  301. var obj={
  302. time:timeStr,
  303. day:day,
  304. week:weeks[week]
  305. }
  306. this.$emit('getTime',obj)
  307. },
  308. initChart() {
  309. this.chart = echarts.init(this.$el, 'macarons')
  310. this.chart.setOption({
  311. })
  312. }
  313. }
  314. }
  315. </script>