LineChart.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: LineChart.vue
  4. * @Description: 买家之声-详情页-折线图
  5. * @Author: xinyan
  6. */
  7. import * as echarts from 'echarts';
  8. import { onBeforeUnmount, onMounted, ref } from 'vue';
  9. import { getChartData } from '/@/views/customers-voice/api';
  10. const props: any = defineProps({
  11. rowData: Object,
  12. });
  13. const { rowData } = props;
  14. const week = ref('8');
  15. let chartObj: any;
  16. const chartRef = ref(null);
  17. const loading = ref(false);
  18. // 初始化 ECharts 图表
  19. onMounted(() => {
  20. addResize();
  21. initLine();
  22. });
  23. // 组件卸载前清理
  24. onBeforeUnmount(() => {
  25. if (chartObj) {
  26. chartObj.dispose();
  27. chartObj = null;
  28. }
  29. removeResize();
  30. });
  31. // ECharts 配置项
  32. const option: any = {
  33. // dataset: {
  34. // dimensions: ['date', 'ncx_rate'],
  35. // source: chartData.value,
  36. // },
  37. // title: {
  38. // left: '-0.2%',
  39. // text: '每月平均评分',
  40. // textStyle: {
  41. // fontSize: '16px',
  42. // fontWeight: '500',
  43. // },
  44. // },
  45. tooltip: {
  46. trigger: 'axis',
  47. formatter: (params) => {
  48. // console.log(params);
  49. let relVal = params[0].name;
  50. for (let i = 0, l = params.length; i < l; i++) {
  51. relVal += '<br/>' + params[i].marker + ' ' + params[i].seriesName + ' ' + (params[i].value * 100).toFixed(2) + ' %'; // 修正为 toFixed
  52. }
  53. return relVal;
  54. },
  55. },
  56. // legend: {
  57. // top: '10%',
  58. // align: 'right',
  59. // },
  60. grid: {
  61. top: '18%',
  62. left: '5%',
  63. right: '5%',
  64. bottom: '5%',
  65. containLabel: true,
  66. },
  67. xAxis: {
  68. type: 'category',
  69. data: [],
  70. },
  71. yAxis: [
  72. {
  73. type: 'value',
  74. name: 'NCX Rate',
  75. position: 'left',
  76. axisLine: {
  77. show: true,
  78. lineStyle: {
  79. color: '#70b6e3',
  80. },
  81. },
  82. axisLabel: {
  83. formatter: function (value) {
  84. return (value * 100).toFixed(2)+ ' %'; // 将值乘以100并保留两位小数
  85. },
  86. },
  87. },
  88. ],
  89. series: [
  90. {
  91. id: 0,
  92. name: '28 天平均值',
  93. type: 'line',
  94. yAxisIndex: 0,
  95. itemStyle: {
  96. color: '#70b6e3', //改变折线点的颜色
  97. lineStyle: {
  98. color: '#70b6e3', //改变折线颜色
  99. },
  100. },
  101. data: [],
  102. },
  103. ],
  104. };
  105. // 初始化 ECharts 图表的函数
  106. async function initLine() {
  107. await loadData();
  108. chartObj = echarts.init(chartRef.value);
  109. chartObj.setOption(option, true);
  110. }
  111. // 加载数据
  112. async function loadData() {
  113. try {
  114. loading.value = true;
  115. const query = {
  116. asin: rowData.asin,
  117. week: week.value,
  118. sku: rowData.sku,
  119. channel: rowData.fulfillment_channel,
  120. };
  121. const res = await getChartData(query);
  122. if (res.code === 2000 && res.data) {
  123. option.xAxis.data = res.data.map((item) => item.date);
  124. option.series[0].data = res.data.map((item) => item.ncx_rate);
  125. }
  126. } catch (e) {
  127. ElMessage.error('加载数据失败,请稍后再试');
  128. } finally {
  129. loading.value = false;
  130. }
  131. }
  132. // 处理窗口大小变化
  133. function resizeChart() {
  134. chartObj.resize();
  135. }
  136. // 添加窗口大小变化事件监听
  137. function addResize() {
  138. window.addEventListener('resize', resizeChart);
  139. }
  140. // 移除窗口大小变化事件监听
  141. function removeResize() {
  142. window.removeEventListener('resize', resizeChart);
  143. }
  144. </script>
  145. <template>
  146. <el-card v-loading="loading" class="border-none mt-5" shadow="hover">
  147. <!--<div class=" flex items-center">-->
  148. <span class="font-semibold italic mr-2">时间范围:</span>
  149. <el-select v-model="week" style="width: 100px" @change="initLine">
  150. <el-option label="一周" value="1"></el-option>
  151. <el-option label="两周" value="2"></el-option>
  152. <el-option label="四周" value="4"></el-option>
  153. <el-option label="六周" value="6"></el-option>
  154. <el-option label="八周" value="8"></el-option>
  155. <el-option label="十二周" value="12"></el-option>
  156. </el-select>
  157. <!--</div>-->
  158. <!-- 图表区域 -->
  159. <div ref="chartRef" style="width: 100%; height: 500px; background: #fff"></div>
  160. </el-card>
  161. </template>
  162. <style scoped></style>