trainData.tsx 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. import { Ref, defineComponent, reactive, ref } from 'vue';
  2. import styles from '../index.module.less';
  3. import { NNumberAnimation } from 'naive-ui';
  4. import numeral from 'numeral';
  5. import { useECharts } from '@/hooks/web/useECharts';
  6. export default defineComponent({
  7. name: 'home-trainData',
  8. setup() {
  9. const chartRef = ref<HTMLDivElement | null>(null);
  10. const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
  11. const qualifiedFlag = ref(true);
  12. const unqualifiedFlag = ref(true);
  13. const payForm = reactive({
  14. height: '360px',
  15. width: '100%',
  16. studentNum: 0,
  17. paymentAmount: 0,
  18. dateList: [
  19. '2022-10-10',
  20. '2022-10-11',
  21. '2022-10-12',
  22. '2022-10-13',
  23. '2022-10-14',
  24. '2022-10-15',
  25. '2022-10-16'
  26. ],
  27. studentList: [50, 100, 80, 180, 70, 99, 300],
  28. payInfoList: [100, 200, 300, 450, 330, 200, 10]
  29. });
  30. const setChart = () => {
  31. setOptions({
  32. tooltip: {
  33. trigger: 'axis',
  34. axisPointer: {
  35. lineStyle: {
  36. width: 2,
  37. color: '#A9C7FF'
  38. }
  39. }
  40. },
  41. legend: {
  42. show: false,
  43. selected: {
  44. //在这里设置默认展示就ok了
  45. 合格人数: qualifiedFlag.value,
  46. 不合格人数: unqualifiedFlag.value
  47. }
  48. },
  49. xAxis: {
  50. type: 'category',
  51. boundaryGap: false,
  52. axisLabel: {
  53. show: true,
  54. interval: 0
  55. },
  56. data: payForm.dateList
  57. // splitLine: {
  58. // show: true,
  59. // lineStyle: {
  60. // width: 2,
  61. // type: 'solid',
  62. // color: 'rgba(226,226,226,0.5)'
  63. // }
  64. // }
  65. // axisTick: {
  66. // show: false
  67. // }
  68. },
  69. yAxis: [
  70. {
  71. type: 'value',
  72. axisTick: {
  73. show: false
  74. },
  75. splitArea: {
  76. show: false,
  77. areaStyle: {
  78. color: ['rgba(255,255,255,0.2)']
  79. }
  80. }
  81. }
  82. ],
  83. grid: {
  84. left: '1%',
  85. right: '1%',
  86. top: '2 %',
  87. bottom: 0,
  88. containLabel: true
  89. },
  90. series: [
  91. {
  92. data: payForm.payInfoList,
  93. type: 'line',
  94. name: '合格人数',
  95. symbolSize: 10,
  96. symbol: 'circle',
  97. smooth: true,
  98. itemStyle: {
  99. color: '#198CFE',
  100. borderColor: '#fff',
  101. borderWidth: 3
  102. },
  103. lineStyle: {
  104. width: 2 //设置线条粗细
  105. },
  106. areaStyle: {
  107. color: {
  108. type: 'linear',
  109. x: 0,
  110. y: 0,
  111. x2: 0,
  112. y2: 1,
  113. colorStops: [
  114. {
  115. offset: 0,
  116. color: 'rgba(212, 231, 255, 1)'
  117. // 0% 处的颜色
  118. },
  119. {
  120. offset: 1,
  121. color: 'rgba(221, 235, 254, 0)' // 100% 处的颜色
  122. }
  123. ]
  124. }
  125. },
  126. emphasis: {
  127. disabled: true
  128. }
  129. },
  130. {
  131. // smooth: true,
  132. data: payForm.studentList,
  133. symbolSize: 10,
  134. type: 'line',
  135. name: '不合格人数',
  136. symbol: 'circle',
  137. smooth: true,
  138. itemStyle: {
  139. color: '#FF7AA7',
  140. borderColor: '#fff',
  141. borderWidth: 3
  142. },
  143. lineStyle: {
  144. width: 3 //设置线条粗细
  145. },
  146. areaStyle: {
  147. color: {
  148. type: 'linear',
  149. x: 0,
  150. y: 0,
  151. x2: 0,
  152. y2: 1,
  153. colorStops: [
  154. {
  155. offset: 0,
  156. color: 'rgba(255, 243, 246, 1)'
  157. // 0% 处的颜色
  158. },
  159. {
  160. offset: 1,
  161. // 100% 处的颜色
  162. color: 'rgba(255, 246, 248, 0)'
  163. }
  164. ]
  165. }
  166. },
  167. emphasis: {
  168. disabled: true
  169. }
  170. }
  171. ],
  172. formatter: (item: any) => {
  173. if (Array.isArray(item)) {
  174. return [
  175. item[0].axisValueLabel,
  176. ...item.map(
  177. (d: any) =>
  178. `<br/>${
  179. d.marker
  180. }<span style="margin-top:10px;margin-left:5px;font-size: 13px;font-weight: 500;
  181. color: #333333;
  182. line-height: 18px;">${d.seriesName}: ${
  183. d.value
  184. }${'人'} </span>`
  185. )
  186. ].join('');
  187. } else {
  188. return item;
  189. }
  190. }
  191. // dataZoom: [
  192. // {
  193. // type: 'slider',
  194. // start: 5,
  195. // end: 100,
  196. // filterMode: 'empty'
  197. // }
  198. // ]
  199. });
  200. };
  201. setChart();
  202. return () => (
  203. <>
  204. <div class={styles.homeTrainData}>
  205. <div class={styles.TrainDataTop}>
  206. <div class={styles.TrainDataTopLeft}>
  207. <div class={styles.TrainDataItem}>
  208. <p class={styles.TrainDataItemTitle}>
  209. <span>
  210. <NNumberAnimation from={0} to={6}></NNumberAnimation>
  211. </span>
  212. </p>
  213. <p class={styles.TrainDataItemsubTitle}>训练次数</p>
  214. </div>
  215. <div class={styles.TrainDataItem}>
  216. <p class={styles.TrainDataItemTitle}>
  217. <span>
  218. <NNumberAnimation from={0} to={100}></NNumberAnimation>
  219. </span>
  220. 人次
  221. </p>
  222. <p class={styles.TrainDataItemsubTitle}>应交总人次</p>
  223. </div>
  224. <div class={styles.TrainDataItem}>
  225. <p class={styles.TrainDataItemTitle}>
  226. <span>
  227. <NNumberAnimation from={0} to={40}></NNumberAnimation>
  228. </span>
  229. 人次
  230. </p>
  231. <p class={styles.TrainDataItemsubTitle}>提交总人次</p>
  232. </div>
  233. <div class={styles.TrainDataItem}>
  234. <p class={styles.TrainDataItemTitle}>
  235. <span>
  236. {' '}
  237. <NNumberAnimation from={0} to={30}></NNumberAnimation>
  238. </span>
  239. 人次
  240. </p>
  241. <p class={styles.TrainDataItemsubTitle}>合格总人次</p>
  242. </div>
  243. <div class={styles.TrainDataItem}>
  244. <p class={styles.TrainDataItemTitle}>
  245. <span>
  246. <NNumberAnimation from={0} to={40}></NNumberAnimation>%
  247. </span>
  248. </p>
  249. <p class={styles.TrainDataItemsubTitle}>训练提交率</p>
  250. </div>
  251. <div class={styles.TrainDataItem}>
  252. <p class={styles.TrainDataItemTitle}>
  253. <span>
  254. <NNumberAnimation from={0} to={30}></NNumberAnimation>%
  255. </span>
  256. </p>
  257. <p class={styles.TrainDataItemsubTitle}>训练合格率</p>
  258. </div>
  259. </div>
  260. <div class={styles.TrainDataTopRight}>
  261. <div
  262. onClick={() => {
  263. qualifiedFlag.value = !qualifiedFlag.value;
  264. setChart();
  265. }}
  266. class={[
  267. styles.DataTopRightItem,
  268. qualifiedFlag.value ? '' : styles.DataTopRightItemDis
  269. ]}>
  270. <div class={styles.DataTopRightDot}></div>
  271. <p>合格人数</p>
  272. </div>
  273. <div
  274. onClick={() => {
  275. unqualifiedFlag.value = !unqualifiedFlag.value;
  276. setChart();
  277. }}
  278. class={[
  279. styles.DataTopRightItem,
  280. unqualifiedFlag.value ? '' : styles.DataTopRightItemDis
  281. ]}>
  282. <div class={[styles.DataTopRightDot, styles.red]}></div>
  283. <p>不合格人数</p>
  284. </div>
  285. </div>
  286. </div>
  287. <div class={styles.chatrs}>
  288. <div
  289. ref={chartRef}
  290. style={{ height: payForm.height, width: payForm.width }}></div>
  291. </div>
  292. </div>
  293. </>
  294. );
  295. }
  296. });