runa.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. <template>
  2. <div v-if="details._comments">
  3. <div class="column" v-if="details._comments.speed">
  4. <div class="column-title">速度曲线</div>
  5. <div class="column-con">
  6. <div class="item" v-if="details._comments.speed">
  7. <div class="item-title">速度
  8. <i v-if="details._comments.speed.level == '0'" class="cha">差</i>
  9. <i v-if="details._comments.speed.level == '1'" class="liang">良</i>
  10. <i v-if="details._comments.speed.level == '2'" class="you">优</i>
  11. </div>
  12. <div class="item-con">
  13. <div class="item-con-li">
  14. <!--图表开始-->
  15. <div class="chartBox" id="speedChart"></div>
  16. <!--图表结束-->
  17. </div>
  18. <div class="item-con-li">
  19. <div class="item-con-li-title">
  20. 速度点评
  21. </div>
  22. <div class="item-con-li-con">
  23. <div v-html="details._comments.speed.comments"></div>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. <div class="column" v-if="details._comments.stride">
  31. <div class="column-title">步幅曲线</div>
  32. <div class="column-con">
  33. <div class="item" v-if="details._comments.stride">
  34. <div class="item-title">步幅
  35. <i v-if="details._comments.stride.level == '0'" class="cha">差</i>
  36. <i v-if="details._comments.stride.level == '1'" class="liang">良</i>
  37. <i v-if="details._comments.stride.level == '2'" class="you">优</i>
  38. </div>
  39. <div class="item-con">
  40. <div class="item-con-li">
  41. <!--图表开始-->
  42. <div class="chartBox" id="strideChart"></div>
  43. <!--图表结束-->
  44. </div>
  45. <div class="item-con-li">
  46. <div class="item-con-li-title">
  47. 步幅点评
  48. </div>
  49. <div class="item-con-li-con">
  50. <div v-html="details._comments.stride.comments"></div>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. <div class="column" v-if="details._comments.steps">
  58. <div class="column-title">步频曲线</div>
  59. <div class="column-con">
  60. <div class="item" v-if="details._comments.steps">
  61. <div class="item-title">步频
  62. <i v-if="details._comments.steps.level == '0'" class="cha">差</i>
  63. <i v-if="details._comments.steps.level == '1'" class="liang">良</i>
  64. <i v-if="details._comments.steps.level == '2'" class="you">优</i>
  65. </div>
  66. <div class="item-con">
  67. <div class="item-con-li">
  68. <!--图表开始-->
  69. <div class="chartBox" id="stepsChart"></div>
  70. <!--图表结束-->
  71. </div>
  72. <div class="item-con-li">
  73. <div class="item-con-li-title">
  74. 步频点评
  75. </div>
  76. <div class="item-con-li-con">
  77. <div v-html="details._comments.steps.comments"></div>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. <div class="column" style="display: none;">
  85. <div class="column-title">示范视频</div>
  86. <div>
  87. <video src="" poster="" :controls="true">
  88. 您的浏览器不支持 video 标签。
  89. </video>
  90. </div>
  91. </div>
  92. </div>
  93. </template>
  94. <script setup lang="ts">
  95. import * as echarts from 'echarts';
  96. const route = useRoute();
  97. //父值
  98. const props = defineProps({
  99. detailsData: {
  100. type: Object,
  101. default: {}
  102. },
  103. });
  104. const data = reactive<any>({
  105. details: {},
  106. query: {},
  107. typeList: [],
  108. speedList: [],
  109. strideList: [],
  110. stepsList: [],
  111. fullAvgRateList: [],
  112. });
  113. const { details, query, typeList, speedList, strideList, stepsList, fullAvgRateList } = toRefs(data);
  114. //速度曲线
  115. const speedChart = () => {
  116. let myChart = echarts.init(document.getElementById("speedChart"));
  117. let option = {
  118. title: {
  119. text: ''
  120. },
  121. tooltip: {
  122. trigger: 'axis',
  123. },
  124. legend: {
  125. data: ['每百米平均速度', '全程平均速度', '满分平均速度']
  126. },
  127. grid: {
  128. left: '3%',
  129. right: '4%',
  130. bottom: '3%',
  131. containLabel: true
  132. },
  133. xAxis: [
  134. {
  135. type: 'category',
  136. boundaryGap: false,
  137. data: typeList.value
  138. }
  139. ],
  140. yAxis: [
  141. {
  142. type: 'value'
  143. }
  144. ],
  145. series: [
  146. {
  147. name: '每百米平均速度',
  148. type: 'line',
  149. label: {
  150. show: true,
  151. position: 'top'
  152. },
  153. areaStyle: {
  154. color: "#e6fafa"
  155. },
  156. data: details.value.speed_distribution
  157. },
  158. {
  159. name: '全程平均速度',
  160. type: 'line',
  161. lineStyle: {
  162. type: 'dashed'
  163. },
  164. data: speedList.value
  165. },
  166. {
  167. name: '满分平均速度',
  168. type: 'line',
  169. lineStyle: {
  170. type: 'dashed'
  171. },
  172. data: fullAvgRateList.value
  173. },
  174. ]
  175. };
  176. // 窗口大小自适应方案
  177. myChart.setOption(option);
  178. setTimeout(function () {
  179. window.onresize = function () {
  180. myChart.resize();
  181. };
  182. }, 200);
  183. };
  184. //步幅曲线
  185. const strideChart = () => {
  186. let myChart = echarts.init(document.getElementById("strideChart"));
  187. let option = {
  188. title: {
  189. text: ''
  190. },
  191. tooltip: {
  192. trigger: 'axis',
  193. },
  194. legend: {
  195. data: ['每百米平均步幅', '全程平均步幅']
  196. },
  197. grid: {
  198. left: '3%',
  199. right: '4%',
  200. bottom: '3%',
  201. containLabel: true
  202. },
  203. xAxis: [
  204. {
  205. type: 'category',
  206. boundaryGap: false,
  207. data: typeList.value
  208. }
  209. ],
  210. yAxis: [
  211. {
  212. type: 'value'
  213. }
  214. ],
  215. series: [
  216. {
  217. name: '每百米平均步幅',
  218. type: 'line',
  219. label: {
  220. show: true,
  221. position: 'top'
  222. },
  223. areaStyle: {
  224. color: "#ffe6e0"
  225. },
  226. data: details.value.stride_distribution
  227. },
  228. {
  229. name: '全程平均步幅',
  230. type: 'line',
  231. lineStyle: {
  232. type: 'dashed'
  233. },
  234. data: strideList.value
  235. },
  236. ]
  237. };
  238. // 窗口大小自适应方案
  239. myChart.setOption(option);
  240. setTimeout(function () {
  241. window.onresize = function () {
  242. myChart.resize();
  243. };
  244. }, 200);
  245. };
  246. //步频曲线
  247. const stepsChart = () => {
  248. let myChart = echarts.init(document.getElementById("stepsChart"));
  249. let option = {
  250. title: {
  251. text: ''
  252. },
  253. tooltip: {
  254. trigger: 'axis',
  255. },
  256. legend: {
  257. data: ['每百米平均步频', '全程平均步频']
  258. },
  259. grid: {
  260. left: '3%',
  261. right: '4%',
  262. bottom: '3%',
  263. containLabel: true
  264. },
  265. xAxis: [
  266. {
  267. type: 'category',
  268. boundaryGap: false,
  269. data: typeList.value
  270. }
  271. ],
  272. yAxis: [
  273. {
  274. type: 'value'
  275. }
  276. ],
  277. series: [
  278. {
  279. name: '每百米平均步频',
  280. type: 'line',
  281. label: {
  282. show: true,
  283. position: 'top'
  284. },
  285. areaStyle: {
  286. color: "#fff5e6"
  287. },
  288. data: details.value.steps_distribution
  289. },
  290. {
  291. name: '全程平均步频',
  292. type: 'line',
  293. lineStyle: {
  294. type: 'dashed'
  295. },
  296. data: stepsList.value
  297. },
  298. ]
  299. };
  300. // 窗口大小自适应方案
  301. myChart.setOption(option);
  302. setTimeout(function () {
  303. window.onresize = function () {
  304. myChart.resize();
  305. };
  306. }, 200);
  307. };
  308. //初始化
  309. const getInitialize = () => {
  310. let typeLists = [];
  311. let speedLists = [];
  312. let strideLists = [];
  313. let stepsLists = [];
  314. let fullAvgRateLists = [];
  315. let strideSum = details.value.stride_distribution.reduce((a:any, b:any) => {
  316. return a + b;
  317. }, 0);
  318. let stepsSum = details.value.steps_distribution.reduce((a:any, b:any) => {
  319. return a + b;
  320. }, 0);
  321. let num: any = null;
  322. if (query.value.exam_name == 'runa800') {
  323. num = 8
  324. }
  325. if (query.value.exam_name == 'runa1000') {
  326. num = 10
  327. }
  328. let strideAverage: any = 0;
  329. let stepsAverage: any = 0;
  330. strideAverage = (strideSum / num).toFixed(1);
  331. stepsAverage = (stepsSum / num).toFixed(1);
  332. for (let i = 1; i <= num; i++) {
  333. typeLists.push(i * 100)
  334. speedLists.push(details.value.speed)
  335. strideLists.push(strideAverage)
  336. stepsLists.push(stepsAverage)
  337. fullAvgRateLists.push(details.value.full_avg_rate)
  338. }
  339. typeList.value = typeLists;
  340. speedList.value = speedLists;
  341. strideList.value = strideLists;
  342. stepsList.value = stepsLists;
  343. fullAvgRateList.value = fullAvgRateLists;
  344. };
  345. onBeforeMount(() => {
  346. query.value = route.query;
  347. details.value = JSON.parse(JSON.stringify(props.detailsData));
  348. getInitialize();
  349. })
  350. onMounted(() => {
  351. speedChart();
  352. strideChart();
  353. stepsChart();
  354. })
  355. </script>
  356. <style lang="scss" scoped>
  357. .chartBox {
  358. width: 100%;
  359. height: 30vh;
  360. }
  361. </style>