Selaa lähdekoodia

新增报告页

林旭祥 8 kuukautta sitten
vanhempi
commit
45e20fa252
45 muutettua tiedostoa jossa 4413 lisäystä ja 7 poistoa
  1. 27 0
      src/api/module/analysis.ts
  2. BIN
      src/assets/images/analysis/badminton.png
  3. BIN
      src/assets/images/analysis/basketball.png
  4. BIN
      src/assets/images/analysis/close.png
  5. BIN
      src/assets/images/analysis/football.png
  6. BIN
      src/assets/images/analysis/grade1.png
  7. BIN
      src/assets/images/analysis/grade2.png
  8. BIN
      src/assets/images/analysis/grade3.png
  9. BIN
      src/assets/images/analysis/grade4.png
  10. BIN
      src/assets/images/analysis/headPortrait.png
  11. BIN
      src/assets/images/analysis/jump.png
  12. BIN
      src/assets/images/analysis/jumprope.png
  13. BIN
      src/assets/images/analysis/lockClose.png
  14. BIN
      src/assets/images/analysis/lockOpen.png
  15. BIN
      src/assets/images/analysis/longjump.png
  16. BIN
      src/assets/images/analysis/pingpong.png
  17. BIN
      src/assets/images/analysis/pullUp.png
  18. BIN
      src/assets/images/analysis/rankingIcon.png
  19. BIN
      src/assets/images/analysis/resultIcon.png
  20. BIN
      src/assets/images/analysis/run1000.png
  21. BIN
      src/assets/images/analysis/run800.png
  22. BIN
      src/assets/images/analysis/sitUp.png
  23. BIN
      src/assets/images/analysis/skiprope.png
  24. BIN
      src/assets/images/analysis/solidBall.png
  25. BIN
      src/assets/images/analysis/trops.png
  26. BIN
      src/assets/images/analysis/volleyball.png
  27. 0 1
      src/types/components.d.ts
  28. 227 0
      src/utils/dataDictionary.ts
  29. 50 0
      src/views/analysis/components/balls.vue
  30. 343 0
      src/views/analysis/components/jump.vue
  31. 150 0
      src/views/analysis/components/longJump.vue
  32. 290 0
      src/views/analysis/components/pullUp.vue
  33. 181 0
      src/views/analysis/components/ropeSkipping.vue
  34. 323 0
      src/views/analysis/components/run.vue
  35. 369 0
      src/views/analysis/components/runa.vue
  36. 168 0
      src/views/analysis/components/shotPut.vue
  37. 290 0
      src/views/analysis/components/sidePullUp.vue
  38. 324 0
      src/views/analysis/components/sitUp.vue
  39. 166 0
      src/views/analysis/components/solidBall.vue
  40. 378 0
      src/views/analysis/components/triJump.vue
  41. 867 0
      src/views/analysis/detail.vue
  42. 259 0
      src/views/analysis/index.vue
  43. 0 3
      src/views/login/index.vue
  44. 0 2
      src/views/login/mobile.vue
  45. 1 1
      src/views/ranking/index.vue

+ 27 - 0
src/api/module/analysis.ts

@@ -0,0 +1,27 @@
+import req from '../request';
+
+export default {
+  analysisSummary: (data: any) => {
+    return req({
+      url: '/task/individual_genaral',
+      method: 'get',
+      data: data
+    });
+  },
+
+  totalScore: (data: any) => {
+    return req({
+      url: '/exam/ccconfig_grade_view',
+      method: 'get',
+      data: data
+    });
+  },
+
+  examDetails: (data: any) => {
+    return req({
+      url: '/task/indivi_exam_detail',
+      method: 'get',
+      data: data
+    });
+  }
+};

BIN
src/assets/images/analysis/badminton.png


BIN
src/assets/images/analysis/basketball.png


BIN
src/assets/images/analysis/close.png


BIN
src/assets/images/analysis/football.png


BIN
src/assets/images/analysis/grade1.png


BIN
src/assets/images/analysis/grade2.png


BIN
src/assets/images/analysis/grade3.png


BIN
src/assets/images/analysis/grade4.png


BIN
src/assets/images/analysis/headPortrait.png


BIN
src/assets/images/analysis/jump.png


BIN
src/assets/images/analysis/jumprope.png


BIN
src/assets/images/analysis/lockClose.png


BIN
src/assets/images/analysis/lockOpen.png


BIN
src/assets/images/analysis/longjump.png


BIN
src/assets/images/analysis/pingpong.png


BIN
src/assets/images/analysis/pullUp.png


BIN
src/assets/images/analysis/rankingIcon.png


BIN
src/assets/images/analysis/resultIcon.png


BIN
src/assets/images/analysis/run1000.png


BIN
src/assets/images/analysis/run800.png


BIN
src/assets/images/analysis/sitUp.png


BIN
src/assets/images/analysis/skiprope.png


BIN
src/assets/images/analysis/solidBall.png


BIN
src/assets/images/analysis/trops.png


BIN
src/assets/images/analysis/volleyball.png


+ 0 - 1
src/types/components.d.ts

@@ -7,7 +7,6 @@ export {}
 /* prettier-ignore */
 declare module 'vue' {
   export interface GlobalComponents {
-    '副本': typeof import('./../components/WorkstationWindow - 副本/index.vue')['default']
     AddItemWindow: typeof import('./../components/AddItemWindow/index.vue')['default']
     ChooseStudent: typeof import('./../components/ChooseStudent/index.vue')['default']
     ElAvatar: typeof import('element-plus/es')['ElAvatar']

+ 227 - 0
src/utils/dataDictionary.ts

@@ -246,6 +246,233 @@ let data = {
     wushu: '武术',
     gymnastic: '体操',
     grip: '肌力'
+  },
+
+  typeKeyObj: {
+    jump: {
+      arm_front_angle: {
+        standard: "120~135",
+        text: "前摆臂角度(°)",
+        textNU: "前摆臂角度",
+        unit: "°",
+      },
+      arm_back_angle: {
+        standard: "120~135",
+        text: "后摆臂角度(°)",
+        textNU: "后摆臂角度",
+        unit: "°",
+      },
+      jump_angle: {
+        standard: "38~45",
+        text: "起跳角度(°)",
+        textNU: "起跳角度",
+        unit: "°",
+      },
+      knee_angle: {
+        standard: "86~96",
+        text: "屈膝角度(°)",
+        textNU: "屈膝角度",
+        unit: "°",
+      },
+      height: {
+        standard: "30~35",
+        text: "腾空高度(cm)",
+        textNU: "腾空高度",
+        unit: "cm",
+      },
+      hip_angle: {
+        standard: "50~65",
+        text: "收腿角度(°)",
+        textNU: "收腿角度",
+        unit: "°",
+      },
+    },
+    longjump: {
+      height: {
+        standard: "30~35",
+        text: "腾空高度(cm)",
+        textNU: "腾空高度",
+        unit: "cm",
+      },
+      hip_angle: {
+        standard: "90-120",
+        text: "收腿幅度(°)",
+        textNU: "收腿幅度",
+        unit: "°",
+      },
+    },
+    situp: {
+      back_failed_num: {
+        text: "背部违规",
+        textNU: "背部违规",
+        unit: "个",
+      },
+      knee_failed_num: {
+        text: "腿部违规",
+        textNU: "腿部违规",
+        unit: "个",
+      },
+      hand_failed_num: {
+        text: "手部违规",
+        textNU: "手部违规",
+        unit: "个",
+      },
+      hip_failed_num: {
+        text: "臀部违规",
+        textNU: "臀部违规",
+        unit: "个",
+      },
+    },
+    pullup: {
+      elbow_failed_num: {
+        text: "手部违规",
+        textNU: "手部违规",
+        unit: "个",
+      },
+      knee_failed_num: {
+        text: "腿部违规",
+        textNU: "腿部违规",
+        unit: "个",
+      },
+    },
+    sidepullup: {
+      hip_failed_num: {
+        text: "手部违规",
+        textNU: "手部违规",
+        unit: "个",
+      },
+    },
+    solidball: {
+      height_start: {
+        standard: ">1.8",
+        text: "出手高度(m)",
+        textNU: "出手高度",
+        unit: "m",
+      },
+      angle_throw: {
+        standard: "45",
+        text: "出手角度(°)",
+        textNU: "出手角度",
+        unit: "°",
+      },
+      height_highest: {
+        text: "球最高高度(cm)",
+        textNU: "球最高高度",
+        unit: "cm",
+      },
+      velocity_start: {
+        standard: "8.5",
+        text: "球出手速度(m/s)",
+        textNU: "球出手速度",
+        unit: "m/s",
+      },
+      velocity_x_start: {
+        text: "出手水平速度m/s",
+        textNU: "出手水平速度m",
+        unit: "m/s",
+      },
+      velocity_y_start: {
+        text: "出手垂直速度m/s",
+        textNU: "出手垂直速度m",
+        unit: "m/s",
+      },
+      time_air: {
+        text: "球飞行时间(s)",
+        textNU: "球飞行时间",
+        unit: "s",
+      },
+    },
+    shotput: {
+      height_start: {
+        standard: ">1.8",
+        text: "出手高度(m)",
+        textNU: "出手高度",
+        unit: "m",
+      },
+      angle_throw: {
+        standard: "45",
+        text: "出手角度(°)",
+        textNU: "出手角度",
+        unit: "°",
+      },
+      height_highest: {
+        standard: "",
+        text: "球最高高度(cm)",
+        textNU: "球最高高度",
+        unit: "cm",
+      },
+      velocity_start: {
+        standard: "8.5",
+        text: "球出手速度(m/s)",
+        textNU: "球出手速度",
+        unit: "m/s",
+      },
+      velocity_x_start: {
+        standard: "",
+        text: "出手水平速度m/s",
+        textNU: "出手水平速度m",
+        unit: "m/s",
+      },
+      velocity_y_start: {
+        standard: "",
+        text: "出手垂直速度m/s",
+        textNU: "出手垂直速度m",
+        unit: "m/s",
+      },
+      time_air: {
+        standard: "",
+        text: "球飞行时间(s)",
+        textNU: "球飞行时间",
+        unit: "s",
+      },
+    },
+    trijump: {
+      distances: {
+        standard: "",
+        text: "跳跃距离(m)",
+        textNU: "跳跃距离",
+        unit: "m",
+      },
+      arm_front_angles: {
+        standard: "135-160",
+        text: "前摆臂幅度(°)",
+        textNU: "前摆臂幅度",
+        unit: "°",
+      },
+      arm_back_angles: {
+        standard: "120-140",
+        text: "后摆臂幅度(°)",
+        textNU: "后摆臂幅度",
+        unit: "°",
+      },
+      knee_angles: {
+        standard: "75-90",
+        text: "屈膝幅度(°)",
+        textNU: "屈膝幅度",
+        unit: "°",
+      },
+      jump_angles: {
+        standard: "45",
+        text: "起跳角度(°)",
+        textNU: "起跳角度",
+        unit: "°",
+      },
+      heights: {
+        standard: "35-50",
+        text: "腾空高度(cm)",
+        textNU: "腾空高度",
+        unit: "cm",
+      },
+      hip_angles: {
+        standard: "< 90",
+        text: "收腿幅度(°)",
+        textNU: "收腿幅度",
+        unit: "°",
+      },
+    },
+    jumprope: {},
+    skiprope: {},
+    heartbeat: {},
   }
 };
 export default data;

+ 50 - 0
src/views/analysis/components/balls.vue

@@ -0,0 +1,50 @@
+<template>
+  <div>
+    <div class="column" v-if="details._recommends">
+      <div class="column-title">提升建议</div>
+      <div class="column-con">
+        <div class="item">
+          <div class="item-title item-title2"> {{ details._recommends.topic }}</div>
+          <div class="item-con" v-html="details._recommends.note"></div>
+        </div>
+      </div>
+    </div>
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video
+          :poster="details.video_url.replace('  ', '') + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'"
+          :src="details.video_url" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+const route = useRoute();
+const dic: any = dataDictionary;
+
+//父值
+const props = defineProps({
+  details: {
+    type: Object,
+    default: {}
+  },
+});
+
+const data = reactive<any>({
+  query: {},
+  typeKeyObj :{}
+});
+const { query,typeKeyObj } = toRefs(data);
+
+onBeforeMount(() => {
+  typeKeyObj.value = dic.typeKeyObj;
+  query.value = route.query;
+})
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 343 - 0
src/views/analysis/components/jump.vue

@@ -0,0 +1,343 @@
+<template>
+  <div v-if="details._comments">
+    <div class="column" v-if="details._comments.arm_front_angle || details._comments.arm_back_angle">
+      <div class="column-title">摆臂分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.arm_front_angle">
+          <div class="item-title">前摆
+            <i v-if="details._comments.arm_front_angle.level == 0" class="cha">差</i>
+            <i v-if="details._comments.arm_front_angle.level == 1" class="liang">良</i>
+            <i v-if="details._comments.arm_front_angle.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/ld_forward.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.arm_front_angle.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].arm_front_angle.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con"><span v-if="details.arm_front_angle">{{ Number(details.arm_front_angle).toFixed(0) }}</span><span v-else>{{details.arm_front_angle}}</span>{{
+                      typeKeyObj[query.exam_name].arm_front_angle.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].arm_front_angle.standard }}{{
+                        typeKeyObj[query.exam_name].arm_front_angle.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.arm_front_angle.comments }}</div>
+                <div>{{ details._comments.arm_front_angle.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="item" v-if="details._comments.arm_back_angle">
+          <div class="item-title">后摆
+            <i v-if="details._comments.arm_back_angle.level == 0" class="cha">差</i>
+            <i v-if="details._comments.arm_back_angle.level == 1" class="liang">良</i>
+            <i v-if="details._comments.arm_back_angle.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/ld_backswing.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.arm_back_angle.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].arm_back_angle.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con" ><span v-if="details.arm_back_angle">{{ Number(details.arm_back_angle).toFixed(0) }}</span><span v-else>{{details.arm_back_angle}}</span>{{
+                      typeKeyObj[query.exam_name].arm_back_angle.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].arm_back_angle.standard }}{{
+                        typeKeyObj[query.exam_name].arm_back_angle.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.arm_back_angle.comments }}</div>
+                <div v-html="details._comments.arm_back_angle.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details._comments.knee_angle || details._comments.jump_angle">
+      <div class="column-title">起跳分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.knee_angle">
+          <div class="item-title">屈膝姿势
+            <i v-if="details._comments.knee_angle.level == 0" class="cha">差</i>
+            <i v-if="details._comments.knee_angle.level == 1" class="liang">良</i>
+            <i v-if="details._comments.knee_angle.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/ld_knee.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.knee_angle.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].knee_angle.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con"><span v-if="details.knee_angle">{{ Number(details.knee_angle).toFixed(0) }}</span><span v-else>{{details.knee_angle}}</span>{{
+                      typeKeyObj[query.exam_name].knee_angle.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].knee_angle.standard }}{{
+                        typeKeyObj[query.exam_name].knee_angle.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.knee_angle.comments }}</div>
+                <div v-html="details._comments.knee_angle.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="item" v-if="details._comments.jump_angle">
+          <div class="item-title">起跳角度
+            <i v-if="details._comments.jump_angle.level == 0" class="cha">差</i>
+            <i v-if="details._comments.jump_angle.level == 1" class="liang">良</i>
+            <i v-if="details._comments.jump_angle.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/ld_jump.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.jump_angle.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].jump_angle.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con"><span v-if="details.jump_angle">{{ Number(details.jump_angle).toFixed(0) }}</span><span v-else>{{details.jump_angle}}</span>{{
+                      typeKeyObj[query.exam_name].jump_angle.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].jump_angle.standard }}{{
+                        typeKeyObj[query.exam_name].jump_angle.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.jump_angle.comments }}</div>
+                <div v-html="details._comments.jump_angle.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+
+    <div class="column" v-if="details._comments.height || details._comments.hip_angle">
+      <div class="column-title">腾空分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.height">
+          <div class="item-title">腾空
+            <i v-if="details._comments.height.level == 0" class="cha">差</i>
+            <i v-if="details._comments.height.level == 1" class="liang">良</i>
+            <i v-if="details._comments.height.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/ld_vacated.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.height.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].height.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con"><span v-if="details.height">{{ Number(details.height).toFixed(0) }}</span><span v-else>{{details.height}}</span>{{
+                      typeKeyObj[query.exam_name].height.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].height.standard }}{{
+                        typeKeyObj[query.exam_name].height.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.height.comments }}</div>
+                <div>{{ details._comments.height.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="item" v-if="details._comments.hip_angle">
+          <div class="item-title">收腿幅度
+            <i v-if="details._comments.hip_angle.level == 0" class="cha">差</i>
+            <i v-if="details._comments.hip_angle.level == 1" class="liang">良</i>
+            <i v-if="details._comments.hip_angle.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/ld_legtucking.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.hip_angle.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].hip_angle.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con"><span v-if="details.hip_angle">{{ Number(details.hip_angle).toFixed(0) }}</span><span v-else>{{ details.hip_angle }}</span>{{
+                      typeKeyObj[query.exam_name].hip_angle.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].hip_angle.standard }}{{
+                        typeKeyObj[query.exam_name].hip_angle.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.hip_angle.comments }}</div>
+                <div>{{ details._comments.hip_angle.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    
+    <div class="column" v-if="details.image_url && details.image_url_list.length">
+      <div class="column-title">数据展示</div>
+      <div class="column-con">
+        <img class="bigImg" :src="item" v-for="(item, index) in details.image_url_list" :key="index" />
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="details.video_url" :poster="details.video_url.replace('  ','') + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/jump.mp4" poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/jump.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+const route = useRoute();
+const dic: any = dataDictionary;
+
+//父值
+const props = defineProps({
+  details: {
+    type: Object,
+    default: {}
+  },
+});
+
+const data = reactive<any>({
+  query: {},
+  typeKeyObj :{}
+});
+const { query,typeKeyObj } = toRefs(data);
+
+onBeforeMount(() => {
+  typeKeyObj.value = dic.typeKeyObj;
+  query.value = route.query;
+})
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 150 - 0
src/views/analysis/components/longJump.vue

@@ -0,0 +1,150 @@
+<template>
+  <div v-if="details._comments">
+    <div class="column" v-if="details._comments.height || details._comments.hip_angle">
+      <div class="column-title">腾空分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.height">
+          <div class="item-title">腾空
+            <i v-if="details._comments.height.level == 0" class="cha">差</i>
+            <i v-if="details._comments.height.level == 1" class="liang">良</i>
+            <i v-if="details._comments.height.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/longjump_ktgd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.height.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].height.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con"><span v-if="details.height">{{ Number(details.height).toFixed(0) }}</span><span v-else>{{details.height}}</span>{{
+                      typeKeyObj[query.exam_name].height.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].height.standard }}{{
+                        typeKeyObj[query.exam_name].height.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.height.comments }}</div>
+                <div>{{ details._comments.height.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="item" v-if="details._comments.hip_angle">
+          <div class="item-title">收腿幅度
+            <i v-if="details._comments.hip_angle.level == 0" class="cha">差</i>
+            <i v-if="details._comments.hip_angle.level == 1" class="liang">良</i>
+            <i v-if="details._comments.hip_angle.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/longjump_stfd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.hip_angle.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].hip_angle.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con"><span v-if="details.hip_angle">{{ Number(details.hip_angle).toFixed(0) }}</span><span v-else>{{ details.hip_angle }}</span>{{
+                      typeKeyObj[query.exam_name].hip_angle.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].hip_angle.standard }}{{
+                        typeKeyObj[query.exam_name].hip_angle.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.hip_angle.comments }}</div>
+                <div>{{ details._comments.hip_angle.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    
+    <div class="column" v-if="details.image_url && details.image_url_list.length">
+      <div class="column-title">数据展示</div>
+      <div class="column-con">
+        <img class="bigImg" :src="item" v-for="(item, index) in details.image_url_list" :key="index" />
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="details.video_url" :poster="details.video_url.replace('  ','') + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/jump.mp4" poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/jump.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+const route = useRoute();
+const dic: any = dataDictionary;
+
+//父值
+const props = defineProps({
+  details: {
+    type: Object,
+    default: {}
+  },
+});
+
+const data = reactive<any>({
+  query: {},
+  typeKeyObj :{}
+});
+const { query,typeKeyObj } = toRefs(data);
+
+onBeforeMount(() => {
+  typeKeyObj.value = dic.typeKeyObj;
+  query.value = route.query;
+})
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 290 - 0
src/views/analysis/components/pullUp.vue

@@ -0,0 +1,290 @@
+<template>
+  <div>
+    <div class="column" v-if="details._comments.power">
+      <div class="column-title">成绩曲线</div>
+      <div class="column-con">
+        <div class="item">
+          <div class="item-title">发力
+            <i v-if="details._comments.power.level == 0" class="cha">差</i>
+            <i v-if="details._comments.power.level == 1" class="liang">良</i>
+            <i v-if="details._comments.power.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <!--图表开始-->
+              <div class="chartBox" id="faliChart"></div>
+              <!--图表结束-->
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                发力点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.power.comments }}</div>
+                <div v-html="details._comments.power.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.foul.elbow || details.foul.knee || details.foul.height">
+      <div class="column-title">犯规动作</div>
+      <div class="column-con">
+        <div class="item" v-if="details.foul.elbow">
+          <div class="item-title">手部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yt_hand.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.elbow.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.elbow.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.elbow.comments }}</div>
+                <div v-html="details.foul.elbow.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="item" v-if="details.foul.knee">
+          <div class="item-title">腿部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yt_knee.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.knee.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.knee.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.knee.comments }}</div>
+                <div v-html="details.foul.knee.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="item" v-if="details.foul.height">
+          <div class="item-title">下颌犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yt_height.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.height.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.height.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.height.comments }}</div>
+                <div v-html="details.foul.height.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="item" v-for="(item, index) in details.videoList" :key="index"
+          :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pullup.mp4"
+          poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pullup.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto"
+          :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import * as echarts from 'echarts';
+export default {
+  name: 'pullUp',
+  props: {
+    details: { type: Object, default: function () { return {} } },
+  },
+  data() {
+    return {
+      query: {},
+      typeList: [],
+      failedList: [],
+      fullAvgRateList: [],
+      averageScoreList: [],
+      lowSpeedList: [],
+      violationList: [],
+    };
+  },
+  created() {
+    this.query = this.$route.query;
+  },
+  mounted() {
+    let videoList = this.details.video_url.split("  ").filter((item) => {
+      return item;
+    });
+    this.$set(this.details, 'videoList', videoList);
+    let typeList = [];
+    let fullAvgRateList = [];
+    let averageScoreList = [];
+    let lowSpeedList = [];
+    let violationList = this.details.all_failed_num_distribution;
+    let mySum = this.details.count_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let num = this.details.count_distribution.length;
+    let averageScore = (mySum / num).toFixed(2);
+    for (let i = 1; i <= num; i++) {
+      typeList.push(i * 10)
+      fullAvgRateList.push(this.details.full_avg_rate)
+      averageScoreList.push(averageScore)
+      lowSpeedList.push(2)
+    }
+    this.typeList = typeList;
+    this.fullAvgRateList = fullAvgRateList;
+    this.averageScoreList = averageScoreList;
+    this.lowSpeedList = lowSpeedList;
+    this.violationList = violationList;
+    this.$nextTick(()=>{
+      this.faliChart();
+    })
+  },
+  methods: {
+    //成绩曲线
+    faliChart() {
+      let myChart = echarts.init(document.getElementById("faliChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['速度曲线', '您的平均速度', '满分平均速度', '低速区', '违规个数']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '速度曲线',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#e6fafa"
+            },
+            data: this.details.count_distribution
+          },
+          {
+            name: '您的平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.averageScoreList
+          },
+          {
+            name: '满分平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.fullAvgRateList
+          },
+          {
+            name: '低速区',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            areaStyle: {
+              color: "#ffdad1"
+            },
+            data: this.lowSpeedList
+          },
+          {
+            name: '违规个数',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.violationList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.chartBox {
+  width: 100%;
+  height: 38vh;
+}
+</style>

+ 181 - 0
src/views/analysis/components/ropeSkipping.vue

@@ -0,0 +1,181 @@
+<template>
+  <div>
+    <div class="column" v-if="details._comments.speed">
+      <div class="column-title">成绩曲线</div>
+      <div class="column-con">
+        <div class="item">
+          <div class="item-title">速度
+            <i v-if="details._comments.speed.level == 0" class="cha">差</i>
+            <i v-if="details._comments.speed.level == 1" class="liang">良</i>
+            <i v-if="details._comments.speed.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <!--图表开始-->
+              <div class="chartBox" id="faliChart"></div>
+              <!--图表结束-->
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                节奏点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.speed.comments }}</div>
+                <div v-for="(item,index) in details._comments.speed.recms" :key="index" v-html="item"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="details.video_url" :poster="details.video_url.replace('  ','') + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import * as echarts from 'echarts';
+export default {
+  name: 'ropeSkipping',
+  props: {
+    details: { type: Object, default: function () { return {} } },
+  },
+  data() {
+    return {
+      query: {},
+      typeList: [],
+      failedList: [],
+      fullAvgRateList: [],
+      averageScoreList: [],
+      lowSpeedList: [],
+    };
+  },
+  created() {
+    this.query = this.$route.query;
+  },
+  mounted() {
+    let videoList = this.details.video_url.split("  ").filter((item) => {
+      return item;
+    });
+    this.$set(this.details, 'videoList', videoList);
+    let typeList = [];
+    let fullAvgRateList = [];
+    let averageScoreList = [];
+    let lowSpeedList = [];
+    let mySum = this.details.count_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let num = this.details.count_distribution.length;
+    let averageScore = (mySum / num).toFixed(2);
+    for (let i = 1; i <= num; i++) {
+      typeList.push(i * 10)
+      fullAvgRateList.push(this.details.full_avg_rate)
+      averageScoreList.push(averageScore)
+      lowSpeedList.push(2)
+    }
+    this.typeList = typeList;
+    this.fullAvgRateList = fullAvgRateList;
+    this.averageScoreList = averageScoreList;
+    this.lowSpeedList = lowSpeedList;
+    this.$nextTick(()=>{
+      this.faliChart();
+    })
+  },
+  methods: {
+    //成绩曲线
+    faliChart() {
+      let myChart = echarts.init(document.getElementById("faliChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['速度曲线', '您的平均速度', ]
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '速度曲线',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#e6fafa"
+            },
+            data: this.details.count_distribution
+          },
+          {
+            name: '您的平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.averageScoreList
+          },
+          // {
+          //   name: '满分平均速度',
+          //   type: 'line',
+          //   lineStyle: {
+          //     type: 'dashed'
+          //   },
+          //   data: this.fullAvgRateList
+          // },
+          // {
+          //   name: '低速区',
+          //   type: 'line',
+          //   lineStyle: {
+          //     type: 'dashed'
+          //   },
+          //   areaStyle: {
+          //     color: "#ffdad1"
+          //   },
+          //   data: this.lowSpeedList
+          // },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.chartBox {
+  width: 100%;
+  height: 38vh;
+}
+</style>

+ 323 - 0
src/views/analysis/components/run.vue

@@ -0,0 +1,323 @@
+<template>
+  <div>
+    <div class="column" v-if="details.image_url">
+      <div class="column-title">冲线动作</div>
+      <div class="column-con">
+        <div class="item" v-if="details.image_url">
+          <div class="item-title">冲线截图 </div>
+          <div class="item-con">
+            <img class="bigImg" src="details.image_url" />
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="column" v-if="details.recommends">
+      <div class="column-title">提升建议</div>
+      <div class="column-con">
+        <div class="item">
+          <div class="item-con">{{ details.recommends }}</div>
+        </div>
+      </div>
+    </div>
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video
+          style="width: 100%; object-fit: fill"
+          :poster="
+            details.video_url.replace('  ', '') +
+            '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'
+          "
+          :src="details.video_url"
+          :controls="true"
+        >
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>   
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="" poster="" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+export default {
+  name: 'run',
+  props: {
+    details: { type: Object, default: function () { return {} } },
+  },
+  data() {
+    return {
+      query: {},
+      typeList: [],
+      speedList: [],
+      strideList: [],
+      stepsList: [],
+      fullAvgRateList: [],
+    };
+  },
+  created() {
+    this.query = this.$route.query;
+  },
+  mounted() {
+    let typeList = [];
+    let speedList = [];
+    let strideList = [];
+    let stepsList = [];
+    let fullAvgRateList = [];
+    let strideSum = this.details.stride_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let stepsSum = this.details.steps_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let num = null;
+    if (this.query.exam_name == 'runa800') {
+      num = 8
+    }
+    if (this.query.exam_name == 'runa1000') {
+      num = 10
+    }
+    let strideAverage = 0;
+    let stepsAverage = 0;
+    strideAverage = (strideSum / num).toFixed(1);
+    stepsAverage = (stepsSum / num).toFixed(1);
+    for (let i = 1; i <= num; i++) {
+      typeList.push(i * 100)
+      speedList.push(this.details.speed)
+      strideList.push(strideAverage)
+      stepsList.push(stepsAverage)
+      fullAvgRateList.push(this.details.full_avg_rate)
+    }
+    this.typeList = typeList;
+    this.speedList = speedList;
+    this.strideList = strideList;
+    this.stepsList = stepsList;
+    this.fullAvgRateList = fullAvgRateList;
+    console.log("this.typeList", this.typeList)
+    console.log("this.details.speed_distribution", this.details.speed_distribution)
+    console.log("this.speedList", this.speedList)
+    console.log("this.strideList", this.strideList)
+    console.log("this.stepsList", this.stepsList)
+    console.log("this.fullAvgRateList", this.fullAvgRateList)
+    this.$nextTick(() => {
+      this.speedChart();
+      this.strideChart();
+      this.stepsChart();
+    })
+  },
+  methods: {
+    //速度曲线
+    speedChart() {
+      let myChart = echarts.init(document.getElementById("speedChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['每百米平均速度', '全程平均速度', '满分平均速度']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '每百米平均速度',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#e6fafa"
+            },
+            data: this.details.speed_distribution
+          },
+          {
+            name: '全程平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.speedList
+          },
+          {
+            name: '满分平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.fullAvgRateList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+    //步幅曲线
+    strideChart() {
+      let myChart = echarts.init(document.getElementById("strideChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['每百米平均步幅', '全程平均步幅']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '每百米平均步幅',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#ffe6e0"
+            },
+            data: this.details.stride_distribution
+          },
+          {
+            name: '全程平均步幅',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.strideList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+    //步频曲线
+    stepsChart() {
+      let myChart = echarts.init(document.getElementById("stepsChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['每百米平均步频', '全程平均步频']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '每百米平均步频',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#fff5e6"
+            },
+            data: this.details.steps_distribution
+          },
+          {
+            name: '全程平均步频',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.stepsList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.chartBox {
+  width: 100%;
+  height: 30vh;
+}
+</style>

+ 369 - 0
src/views/analysis/components/runa.vue

@@ -0,0 +1,369 @@
+<template>
+  <div v-if="details._comments">
+    <div class="column" v-if="details._comments.speed">
+      <div class="column-title">速度曲线</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.speed">
+          <div class="item-title">速度
+            <i v-if="details._comments.speed.level == '0'" class="cha">差</i>
+            <i v-if="details._comments.speed.level == '1'" class="liang">良</i>
+            <i v-if="details._comments.speed.level == '2'" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <!--图表开始-->
+              <div class="chartBox" id="speedChart"></div>
+              <!--图表结束-->
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                速度点评
+              </div>
+              <div class="item-con-li-con">
+                <div v-html="details._comments.speed.comments"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="column" v-if="details._comments.stride">
+      <div class="column-title">步幅曲线</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.stride">
+          <div class="item-title">步幅
+            <i v-if="details._comments.stride.level == '0'" class="cha">差</i>
+            <i v-if="details._comments.stride.level == '1'" class="liang">良</i>
+            <i v-if="details._comments.stride.level == '2'" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <!--图表开始-->
+              <div class="chartBox" id="strideChart"></div>
+              <!--图表结束-->
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                步幅点评
+              </div>
+              <div class="item-con-li-con">
+                <div v-html="details._comments.stride.comments"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="column" v-if="details._comments.steps">
+      <div class="column-title">步频曲线</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.steps">
+          <div class="item-title">步频
+            <i v-if="details._comments.steps.level == '0'" class="cha">差</i>
+            <i v-if="details._comments.steps.level == '1'" class="liang">良</i>
+            <i v-if="details._comments.steps.level == '2'" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <!--图表开始-->
+              <div class="chartBox" id="stepsChart"></div>
+              <!--图表结束-->
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                步频点评
+              </div>
+              <div class="item-con-li-con">
+                <div v-html="details._comments.steps.comments"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="column" style="display: none;">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="" poster="" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+export default {
+  name: 'runa',
+  props: {
+    details: { type: Object, default: function () { return {} } },
+  },
+  data() {
+    return {
+      query: {},
+      typeList: [],
+      speedList: [],
+      strideList: [],
+      stepsList: [],
+      fullAvgRateList: [],
+    };
+  },
+  created() {
+    this.query = this.$route.query;
+  },
+  mounted() {
+    let typeList = [];
+    let speedList = [];
+    let strideList = [];
+    let stepsList = [];
+    let fullAvgRateList = [];
+    let strideSum = this.details.stride_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let stepsSum = this.details.steps_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let num = null;
+    if (this.query.exam_name == 'runa800') {
+      num = 8
+    }
+    if (this.query.exam_name == 'runa1000') {
+      num = 10
+    }
+    let strideAverage = 0;
+    let stepsAverage = 0;
+    strideAverage = (strideSum / num).toFixed(1);
+    stepsAverage = (stepsSum / num).toFixed(1);
+    for (let i = 1; i <= num; i++) {
+      typeList.push(i * 100)
+      speedList.push(this.details.speed)
+      strideList.push(strideAverage)
+      stepsList.push(stepsAverage)
+      fullAvgRateList.push(this.details.full_avg_rate)
+    }
+    this.typeList = typeList;
+    this.speedList = speedList;
+    this.strideList = strideList;
+    this.stepsList = stepsList;
+    this.fullAvgRateList = fullAvgRateList;
+    console.log("this.typeList", this.typeList)
+    console.log("this.details.speed_distribution", this.details.speed_distribution)
+    console.log("this.speedList", this.speedList)
+    console.log("this.strideList", this.strideList)
+    console.log("this.stepsList", this.stepsList)
+    console.log("this.fullAvgRateList", this.fullAvgRateList)
+    this.$nextTick(()=>{
+      this.speedChart();
+      this.strideChart();
+      this.stepsChart();
+    })
+  },
+  methods: {
+    //速度曲线
+    speedChart() {
+      let myChart = echarts.init(document.getElementById("speedChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['每百米平均速度', '全程平均速度', '满分平均速度']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '每百米平均速度',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#e6fafa"
+            },
+            data: this.details.speed_distribution
+          },
+          {
+            name: '全程平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.speedList
+          },
+          {
+            name: '满分平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.fullAvgRateList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+    //步幅曲线
+    strideChart() {
+      let myChart = echarts.init(document.getElementById("strideChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['每百米平均步幅', '全程平均步幅']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '每百米平均步幅',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#ffe6e0"
+            },
+            data: this.details.stride_distribution
+          },
+          {
+            name: '全程平均步幅',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.strideList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+    //步频曲线
+    stepsChart() {
+      let myChart = echarts.init(document.getElementById("stepsChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['每百米平均步频', '全程平均步频']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '每百米平均步频',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#fff5e6"
+            },
+            data: this.details.steps_distribution
+          },
+          {
+            name: '全程平均步频',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.stepsList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.chartBox {
+  width: 100%;
+  height: 30vh;
+}
+</style>

+ 168 - 0
src/views/analysis/components/shotPut.vue

@@ -0,0 +1,168 @@
+<template>
+  <div v-if="details._comments">
+    <div class="column" v-if="details._comments.start">
+      <div class="column-title">出手分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.start">
+          <div class="item-title">出手动作
+            <i v-if="details._comments.start.level == 0" class="cha">差</i>
+            <i v-if="details._comments.start.level == 1" class="liang">良</i>
+            <i v-if="details._comments.start.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/qq_csdz.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="details._comments.start.imgurl" :poster="details._comments.start.imgurl + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].height_start.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con">{{ Number(details.height_start/100).toFixed(2) }}{{
+                      typeKeyObj[query.exam_name].height_start.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].height_start.standard }}{{
+                        typeKeyObj[query.exam_name].height_start.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].angle_throw.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con">{{ details.angle_throw }}{{
+                      typeKeyObj[query.exam_name].angle_throw.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].angle_throw.standard }}{{
+                        typeKeyObj[query.exam_name].angle_throw.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.start.comments }}</div>
+                <div v-html="details._comments.start.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details._comments.speed">
+      <div class="column-title">投掷分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.speed">
+          <div class="item-title">球速度
+            <i v-if="details._comments.speed.level == 0" class="cha">差</i>
+            <i v-if="details._comments.speed.level == 1" class="liang">良</i>
+            <i v-if="details._comments.speed.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.speed.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].velocity_start.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con">{{ Number(details.velocity_start).toFixed(2) }}{{
+                      typeKeyObj[query.exam_name].velocity_start.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].velocity_start.standard }}{{
+                        typeKeyObj[query.exam_name].velocity_start.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.speed.comments }}</div>
+                <div v-html="details._comments.speed.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="details.video_url" :poster="details.video_url.replace('  ','') + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/shotput.mp4" poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/shotput.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+const route = useRoute();
+const dic: any = dataDictionary;
+
+//父值
+const props = defineProps({
+  details: {
+    type: Object,
+    default: {}
+  },
+});
+
+const data = reactive<any>({
+  query: {},
+  typeKeyObj :{}
+});
+const { query,typeKeyObj } = toRefs(data);
+
+onBeforeMount(() => {
+  typeKeyObj.value = dic.typeKeyObj;
+  query.value = route.query;
+})
+</script>
+
+<style lang="scss" scoped></style>
+
+<style lang="scss" scoped>
+</style>

+ 290 - 0
src/views/analysis/components/sidePullUp.vue

@@ -0,0 +1,290 @@
+<template>
+  <div>
+    <div class="column" v-if="details._comments.power">
+      <div class="column-title">成绩曲线</div>
+      <div class="column-con">
+        <div class="item">
+          <div class="item-title">发力
+            <i v-if="details._comments.power.level == 0" class="cha">差</i>
+            <i v-if="details._comments.power.level == 1" class="liang">良</i>
+            <i v-if="details._comments.power.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <!--图表开始-->
+              <div class="chartBox" id="faliChart"></div>
+              <!--图表结束-->
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                发力点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.power.comments }}</div>
+                <div v-html="details._comments.power.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.foul.elbow || details.foul.hip || details.foul.height">
+      <div class="column-title">犯规动作</div>
+      <div class="column-con">
+        <div class="item" v-if="details.foul.elbow">
+          <div class="item-title">手部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yt_hand.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.elbow.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.elbow.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.elbow.comments }}</div>
+                <div v-html="details.foul.elbow.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="item" v-if="details.foul.hip">
+          <div class="item-title">臀部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yt_hip.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.hip.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.hip.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.hip.comments }}</div>
+                <div v-html="details.foul.hip.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="item" v-if="details.foul.height">
+          <div class="item-title">下颌犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yt_height.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.height.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.height.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.height.comments }}</div>
+                <div v-html="details.foul.height.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="item" v-for="(item, index) in details.videoList" :key="index"
+          :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pullup.mp4"
+          poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pullup.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto"
+          :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import * as echarts from 'echarts';
+export default {
+  name: 'sidePullUp',
+  props: {
+    details: { type: Object, default: function () { return {} } },
+  },
+  data() {
+    return {
+      query: {},
+      typeList: [],
+      failedList: [],
+      fullAvgRateList: [],
+      averageScoreList: [],
+      lowSpeedList: [],
+      violationList: [],
+    };
+  },
+  created() {
+    this.query = this.$route.query;
+  },
+  mounted() {
+    let videoList = this.details.video_url.split("  ").filter((item) => {
+      return item;
+    });
+    this.$set(this.details, 'videoList', videoList);
+    let typeList = [];
+    let fullAvgRateList = [];
+    let averageScoreList = [];
+    let lowSpeedList = [];
+    let violationList = this.details.all_failed_num_distribution;
+    let mySum = this.details.count_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let num = this.details.count_distribution.length;
+    let averageScore = (mySum / num).toFixed(2);
+    for (let i = 1; i <= num; i++) {
+      typeList.push(i * 10)
+      fullAvgRateList.push(this.details.full_avg_rate)
+      averageScoreList.push(averageScore)
+      lowSpeedList.push(2)
+    }
+    this.typeList = typeList;
+    this.fullAvgRateList = fullAvgRateList;
+    this.averageScoreList = averageScoreList;
+    this.lowSpeedList = lowSpeedList;
+    this.violationList = violationList;
+    this.$nextTick(()=>{
+      this.faliChart();
+    })
+  },
+  methods: {
+    //成绩曲线
+    faliChart() {
+      let myChart = echarts.init(document.getElementById("faliChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['速度曲线', '您的平均速度', '满分平均速度', '低速区', '违规个数']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '速度曲线',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#e6fafa"
+            },
+            data: this.details.count_distribution
+          },
+          {
+            name: '您的平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.averageScoreList
+          },
+          {
+            name: '满分平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.fullAvgRateList
+          },
+          {
+            name: '低速区',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            areaStyle: {
+              color: "#ffdad1"
+            },
+            data: this.lowSpeedList
+          },
+          {
+            name: '违规个数',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.violationList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.chartBox {
+  width: 100%;
+  height: 38vh;
+}
+</style>

+ 324 - 0
src/views/analysis/components/sitUp.vue

@@ -0,0 +1,324 @@
+<template>
+  <div>
+    <div class="column" v-if="details._comments.power">
+      <div class="column-title">成绩曲线</div>
+      <div class="column-con">
+        <div class="item">
+          <div class="item-title">发力
+            <i v-if="details._comments.power.level == 0" class="cha">差</i>
+            <i v-if="details._comments.power.level == 1" class="liang">良</i>
+            <i v-if="details._comments.power.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <!--图表开始-->
+              <div class="chartBox" id="faliChart"></div>
+              <!--图表结束-->
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                发力点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.power.comments }}</div>
+                <div v-html="details._comments.power.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.foul.hand || details.foul.back || details.foul.hip || details.foul.knee">
+      <div class="column-title">犯规动作</div>
+      <div class="column-con">
+        <div class="item" v-if="details.foul.hand">
+          <div class="item-title">手部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yw_hand.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.hand.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.hand.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.hand.comments }}</div>
+                <div v-html="details.foul.hand.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="item" v-if="details.foul.back">
+          <div class="item-title">背部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yw_back.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.back.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.back.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.back.comments }}</div>
+                <div v-html="details.foul.back.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="item" v-if="details.foul.hip">
+          <div class="item-title">臀部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yw_buttock.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.hip.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.hip.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.hip.comments }}</div>
+                <div v-html="details.foul.hip.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="item" v-if="details.foul.knee">
+          <div class="item-title">腿部犯规
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/yw_knee.png" />
+            </div>
+            <div class="item-con-li" v-if="details.foul.knee.urls.length">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="item" v-for="(item, index) in details.foul.knee.urls" :key="index"
+                :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details.foul.knee.comments }}</div>
+                <div v-html="details.foul.knee.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="item" v-for="(item, index) in details.videoList" :key="index"
+          :poster="item + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/situp.mp4"
+          poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/situp.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto"
+          :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import * as echarts from 'echarts';
+export default {
+  name: 'sitUp',
+  props: {
+    details: { type: Object, default: function () { return {} } },
+  },
+  data() {
+    return {
+      query: {},
+      typeList: [],
+      failedList: [],
+      fullAvgRateList: [],
+      averageScoreList: [],
+      lowSpeedList: [],
+      violationList: [],
+    };
+  },
+  created() {
+    this.query = this.$route.query;
+  },
+  mounted() {
+    let videoList = this.details.video_url.split("  ").filter((item) => {
+      return item;
+    });
+    this.$set(this.details, 'videoList', videoList);
+    let typeList = [];
+    let fullAvgRateList = [];
+    let averageScoreList = [];
+    let lowSpeedList = [];
+    let violationList = [
+      this.details.all_failed_num_10_1,
+      this.details.all_failed_num_10_2,
+      this.details.all_failed_num_10_3,
+      this.details.all_failed_num_10_4,
+      this.details.all_failed_num_10_5,
+      this.details.all_failed_num_10_6
+    ];
+    let mySum = this.details.count_distribution.reduce((a, b) => {
+      return a + b;
+    }, 0);
+    let num = this.details.count_distribution.length;
+    let averageScore = mySum / num;
+    for (let i = 1; i <= num; i++) {
+      typeList.push(i * 10)
+      fullAvgRateList.push(this.details.full_avg_rate)
+      averageScoreList.push(averageScore)
+      lowSpeedList.push(2)
+    }
+    this.typeList = typeList;
+    this.fullAvgRateList = fullAvgRateList;
+    this.averageScoreList = averageScoreList;
+    this.lowSpeedList = lowSpeedList;
+    this.violationList = violationList;
+    this.$nextTick(()=>{
+      this.faliChart();
+    })
+  },
+  methods: {
+    //成绩曲线
+    faliChart() {
+      let myChart = echarts.init(document.getElementById("faliChart"));
+      let option = {
+        title: {
+          text: ''
+        },
+        tooltip: {
+          trigger: 'axis',
+        },
+        legend: {
+          data: ['速度曲线', '您的平均速度', '满分平均速度', '低速区', '违规个数']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: 'category',
+            boundaryGap: false,
+            data: this.typeList
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value'
+          }
+        ],
+        series: [
+          {
+            name: '速度曲线',
+            type: 'line',
+            label: {
+              show: true,
+              position: 'top'
+            },
+            areaStyle: {
+              color: "#e6fafa"
+            },
+            data: this.details.count_distribution
+          },
+          {
+            name: '您的平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.averageScoreList
+          },
+          {
+            name: '满分平均速度',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.fullAvgRateList
+          },
+          {
+            name: '低速区',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            areaStyle: {
+              color: "#ffdad1"
+            },
+            data: this.lowSpeedList
+          },
+          {
+            name: '违规个数',
+            type: 'line',
+            lineStyle: {
+              type: 'dashed'
+            },
+            data: this.violationList
+          },
+        ]
+      };
+      // 窗口大小自适应方案
+      myChart.setOption(option);
+      setTimeout(function () {
+        window.onresize = function () {
+          myChart.resize();
+        };
+      }, 200);
+    },
+
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.chartBox {
+  width: 100%;
+  height: 38vh;
+}
+</style>

+ 166 - 0
src/views/analysis/components/solidBall.vue

@@ -0,0 +1,166 @@
+<template>
+  <div v-if="details._comments">
+    <div class="column" v-if="details._comments.start">
+      <div class="column-title">出手分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.start">
+          <div class="item-title">出手动作
+            <i v-if="details._comments.start.level == 0" class="cha">差</i>
+            <i v-if="details._comments.start.level == 1" class="liang">良</i>
+            <i v-if="details._comments.start.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg" src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/sxq_throwing.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <video :src="details._comments.start.imgurl" :poster="details._comments.start.imgurl + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].height_start.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con">{{ Number(details.height_start/100).toFixed(2) }}{{
+                      typeKeyObj[query.exam_name].height_start.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].height_start.standard }}{{
+                        typeKeyObj[query.exam_name].height_start.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].angle_throw.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con">{{ details.angle_throw }}{{
+                      typeKeyObj[query.exam_name].angle_throw.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].angle_throw.standard }}{{
+                        typeKeyObj[query.exam_name].angle_throw.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.start.comments }}</div>
+                <div v-html="details._comments.start.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details._comments.speed">
+      <div class="column-title">投掷分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.speed">
+          <div class="item-title">球速度
+            <i v-if="details._comments.speed.level == 0" class="cha">差</i>
+            <i v-if="details._comments.speed.level == 1" class="liang">良</i>
+            <i v-if="details._comments.speed.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.speed.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{typeKeyObj[query.exam_name].velocity_start.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div  class="item-con-li-con-val-li-con">{{ Number(details.velocity_start).toFixed(2) }}{{
+                      typeKeyObj[query.exam_name].velocity_start.unit }}</div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].velocity_start.standard }}{{
+                        typeKeyObj[query.exam_name].velocity_start.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.speed.comments }}</div>
+                <div v-html="details._comments.speed.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="details.video_url" :poster="details.video_url.replace('  ','') + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/solidball.mp4" poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/solidball.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto" :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+const route = useRoute();
+const dic: any = dataDictionary;
+
+//父值
+const props = defineProps({
+  details: {
+    type: Object,
+    default: {}
+  },
+});
+
+const data = reactive<any>({
+  query: {},
+  typeKeyObj :{}
+});
+const { query,typeKeyObj } = toRefs(data);
+
+onBeforeMount(() => {
+  typeKeyObj.value = dic.typeKeyObj;
+  query.value = route.query;
+})
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 378 - 0
src/views/analysis/components/triJump.vue

@@ -0,0 +1,378 @@
+<template>
+  <div v-if="details._comments">
+    <div class="column" v-if="details._comments.arm_front_angles || details._comments.arm_back_angles">
+      <div class="column-title">摆臂分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.arm_front_angles">
+          <div class="item-title">前摆
+            <i v-if="details._comments.arm_front_angles.level == 0" class="cha">差</i>
+            <i v-if="details._comments.arm_front_angles.level == 1" class="liang">良</i>
+            <i v-if="details._comments.arm_front_angles.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg"
+                src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/tri_qbfd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.arm_front_angles.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{ typeKeyObj[query.exam_name].arm_front_angles.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div class="item-con-li-con-val-li-con">
+                      <span v-for="(item, index) in JSON.parse(details.arm_front_angles)" :key="index">
+                        <i v-if="index != 0">-</i>{{ Number(item).toFixed(0) }}
+                        {{ typeKeyObj[query.exam_name].arm_front_angles.unit }}
+                      </span>
+                    </div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].arm_front_angles.standard
+                      }}{{
+                        typeKeyObj[query.exam_name].arm_front_angles.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.arm_front_angles.comments }}</div>
+                <div>{{ details._comments.arm_front_angles.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="item" v-if="details._comments.arm_back_angles">
+          <div class="item-title">后摆
+            <i v-if="details._comments.arm_back_angles.level == 0" class="cha">差</i>
+            <i v-if="details._comments.arm_back_angles.level == 1" class="liang">良</i>
+            <i v-if="details._comments.arm_back_angles.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg"
+                src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/tri_hbfd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.arm_back_angles.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{ typeKeyObj[query.exam_name].arm_back_angles.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div class="item-con-li-con-val-li-con">
+                      <span v-for="(item, index) in JSON.parse(details.arm_back_angles)" :key="index">
+                        <i v-if="index != 0">-</i>{{ Number(item).toFixed(0) }}
+                        {{ typeKeyObj[query.exam_name].arm_back_angles.unit }}
+                      </span>
+                    </div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].arm_back_angles.standard }}{{
+                      typeKeyObj[query.exam_name].arm_back_angles.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.arm_back_angles.comments }}</div>
+                <div v-html="details._comments.arm_back_angles.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details._comments.knee_angles || details._comments.jump_angles">
+      <div class="column-title">起跳分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.knee_angles">
+          <div class="item-title">起跳姿势
+            <i v-if="details._comments.knee_angles.level == 0" class="cha">差</i>
+            <i v-if="details._comments.knee_angles.level == 1" class="liang">良</i>
+            <i v-if="details._comments.knee_angles.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg"
+                src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/tri_qtjd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.knee_angles.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{ typeKeyObj[query.exam_name].knee_angles.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div class="item-con-li-con-val-li-con">
+                      <span v-for="(item, index) in JSON.parse(details.knee_angles)" :key="index">
+                        <i v-if="index != 0">-</i>{{ Number(item).toFixed(0) }}
+                        {{ typeKeyObj[query.exam_name].knee_angles.unit }}
+                      </span>
+                    </div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].knee_angles.standard }}{{
+                      typeKeyObj[query.exam_name].knee_angles.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.knee_angles.comments }}</div>
+                <div v-html="details._comments.knee_angles.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="item" v-if="details._comments.jump_angles">
+          <div class="item-title">起跳角度
+            <i v-if="details._comments.jump_angles.level == 0" class="cha">差</i>
+            <i v-if="details._comments.jump_angles.level == 1" class="liang">良</i>
+            <i v-if="details._comments.jump_angles.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg"
+                src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/tri_qxjd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.jump_angles.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{ typeKeyObj[query.exam_name].jump_angles.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div class="item-con-li-con-val-li-con">
+                      <span v-for="(item, index) in JSON.parse(details.jump_angles)" :key="index">
+                        <i v-if="index != 0">-</i>{{ Number(item).toFixed(0) }}
+                        {{ typeKeyObj[query.exam_name].jump_angles.unit }}
+                      </span>
+                    </div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].jump_angles.standard }}{{
+                      typeKeyObj[query.exam_name].jump_angles.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.jump_angles.comments }}</div>
+                <div v-html="details._comments.jump_angles.note"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+
+    <div class="column" v-if="details._comments.heights || details._comments.hip_angles">
+      <div class="column-title">腾空分析</div>
+      <div class="column-con">
+        <div class="item" v-if="details._comments.heights">
+          <div class="item-title">腾空
+            <i v-if="details._comments.heights.level == 0" class="cha">差</i>
+            <i v-if="details._comments.heights.level == 1" class="liang">良</i>
+            <i v-if="details._comments.heights.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg"
+                src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/tri_tkgd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.heights.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{ typeKeyObj[query.exam_name].heights.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div class="item-con-li-con-val-li-con">
+                      <span v-for="(item, index) in JSON.parse(details.heights)" :key="index">
+                        <i v-if="index != 0">-</i>{{ Number(item).toFixed(0) }}
+                        {{ typeKeyObj[query.exam_name].heights.unit }}
+                      </span>
+                    </div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].heights.standard }}{{
+                      typeKeyObj[query.exam_name].heights.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.heights.comments }}</div>
+                <div>{{ details._comments.heights.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="item" v-if="details._comments.hip_angles">
+          <div class="item-title">收腿幅度
+            <i v-if="details._comments.hip_angles.level == 0" class="cha">差</i>
+            <i v-if="details._comments.hip_angles.level == 1" class="liang">良</i>
+            <i v-if="details._comments.hip_angles.level == 2" class="you">优</i>
+          </div>
+          <div class="item-con">
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg1">标准动作</span>
+              <img class="bigImg"
+                src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/pictures/tri_stfd.png" />
+            </div>
+            <div class="item-con-li">
+              <span class="item-con-li-label item-con-li-label-bg2">您的动作</span>
+              <img class="bigImg" :src="details._comments.hip_angles.imgurl" />
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                {{ typeKeyObj[query.exam_name].hip_angles.textNU }}
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-val">
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name1">您的动作值</div>
+                    <div class="item-con-li-con-val-li-con">
+                      <span v-for="(item, index) in JSON.parse(details.hip_angles)" :key="index">
+                        <i v-if="index != 0">-</i>{{ Number(item).toFixed(0) }}
+                        {{ typeKeyObj[query.exam_name].hip_angles.unit }}
+                      </span>
+                    </div>
+                  </div>
+                  <div class="item-con-li-con-val-li">
+                    <div class="item-con-li-con-val-li-name2">建议动作值</div>
+                    <div class="item-con-li-con-val-li-con">{{ typeKeyObj[query.exam_name].hip_angles.standard }}{{
+                      typeKeyObj[query.exam_name].hip_angles.unit }}</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="item-con-li">
+              <div class="item-con-li-title">
+                动作点评
+              </div>
+              <div class="item-con-li-con">
+                <div class="item-con-li-con-strong">{{ details._comments.hip_angles.comments }}</div>
+                <div>{{ details._comments.hip_angles.note }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="column" v-if="details.image_url && details.image_url_list.length">
+      <div class="column-title">数据展示</div>
+      <div class="column-con">
+        <img class="bigImg" :src="item" v-for="(item, index) in details.image_url_list" :key="index" />
+      </div>
+    </div>
+
+    <div class="column" v-if="details.video_url">
+      <div class="column-title">测评视频</div>
+      <div>
+        <video :src="details.video_url"
+          :poster="details.video_url.replace('  ', '') + '?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto'"
+          :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+    <div class="column">
+      <div class="column-title">示范视频</div>
+      <div>
+        <video src="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/trijump.mp4"
+          poster="https://aiexam-data.oss-cn-shenzhen.aliyuncs.com/midexam/samples/trijump.mp4?x-oss-process=video/snapshot,t_100,f_jpg,w_0,h_0,ar_auto"
+          :controls="true">
+          您的浏览器不支持 video 标签。
+        </video>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+const route = useRoute();
+const dic: any = dataDictionary;
+
+//父值
+const props = defineProps({
+  details: {
+    type: Object,
+    default: {}
+  },
+});
+
+const data = reactive<any>({
+  query: {},
+  typeKeyObj :{}
+});
+const { query,typeKeyObj } = toRefs(data);
+
+onBeforeMount(() => {
+  typeKeyObj.value = dic.typeKeyObj;
+  query.value = route.query;
+})
+</script>
+
+<style lang="scss" scoped></style>
+</style>

+ 867 - 0
src/views/analysis/detail.vue

@@ -0,0 +1,867 @@
+<template>
+  <div class="main">
+    <div class="main-a">
+      <div class="main-a-title">
+        <div class="project">{{ details.examsName }}</div>
+        <div class="date">{{ details.cdate }}</div>
+      </div>
+      <div class="main-a-con">
+        <div class="main-a-con-left">
+          <div class="userInfo">
+            <strong>{{ details.name }}</strong><span>{{ details.grade_name + details.class_name }}</span>
+          </div>
+          <div class="fraction">
+            <strong>{{ details.score }}</strong><span>分</span>
+          </div>
+          <div class="score">
+            <i>成绩</i><strong>{{ details.result }}</strong>
+            <span>{{ details.unit }}</span>
+          </div>
+          <div class="ranking">
+            <i>排名</i> <strong>{{ details.area_rank }}</strong><span>/{{ details.area_totals }}</span>
+          </div>
+        </div>
+        <div class="main-a-con-right">
+          <div class="main-a-con-right-box">
+            <img v-if="query.exam_name == 'jump'" src="@/assets/images/analysis/jump.png" />
+            <img v-if="['run800', 'runa800'].includes(query.exam_name)" src="@/assets/images/analysis/run800.png" />
+            <img
+              v-if="['run50', 'run60', 'run100', 'run200', 'run400', 'run1000', 'runa1000', 'run15x4', 'run50x8'].includes(query.exam_name)"
+              src="@/assets/images/analysis/run1000.png" />
+            <img v-if="query.exam_name == 'basketball' ||
+              query.exam_name == 'basketballv1'
+            " src="@/assets/images/analysis/basketball.png" />
+            <img v-if="query.exam_name == 'football' || query.exam_name == 'footballv1'
+            " src="@/assets/images/analysis/football.png" />
+            <img v-if="query.exam_name == 'badminton' ||
+              query.exam_name == 'badmintonv1'
+            " src="@/assets/images/analysis/badminton.png" />
+            <img v-if="query.exam_name == 'pingpong'" src="@/assets/images/analysis/pingpong.png" />
+            <img v-if="query.exam_name == 'volleyball'" src="@/assets/images/analysis/volleyball.png" />
+            <img v-if="query.exam_name == 'solidball'" src="@/assets/images/analysis/solidBall.png" />
+            <img v-if="query.exam_name == 'situp'" src="@/assets/images/analysis/sitUp.png" />
+            <img v-if="query.exam_name == 'pullup'" src="@/assets/images/analysis/pullUp.png" />
+            <img v-if="query.exam_name == 'jumprope'" src="@/assets/images/analysis/jumprope.png" />
+            <img v-if="query.exam_name == 'longjump'" src="@/assets/images/analysis/longjump.png" />
+            <div class="svg-box" v-if="details.score">
+              <svg class="svg" width="100%" height="100%" viewBox="0 0 400 400">
+                <!-- 1圈 -->
+                <circle cx="200" cy="200" r="100" stroke="#39BBBB" stroke-width="25" fill="none"
+                  :stroke-dasharray="0 + ',' + 2 * Math.PI * 100" :stroke-dashoffset="0" stroke-linecap="butt">
+                  <animate attributeName="stroke-dasharray" :from="0" :to="2 * Math.PI * 100 * (details.score / details.total_score)
+                    " dur="1.2s" begin="0" fill="freeze" />
+                </circle>
+                <!-- 2圈 -->
+                <circle cx="200" cy="200" r="60" stroke="#506794" stroke-width="25" fill="none"
+                  :stroke-dasharray="0 + ',' + 2 * Math.PI * 60" :stroke-dashoffset="0" stroke-linecap="butt">
+                  <animate attributeName="stroke-dasharray" :from="0" :to="2 * Math.PI * 60 * (details.score / details.total_score)
+                    " dur="1.0s" begin="0" fill="freeze" />
+                </circle>
+                <!-- 3圈 -->
+                <circle cx="200" cy="200" r="20" stroke="#FF8165" stroke-width="25" fill="none"
+                  :stroke-dasharray="0 + ',' + 2 * Math.PI * 20" :stroke-dashoffset="0" stroke-linecap="butt">
+                  <animate attributeName="stroke-dasharray" :from="0" :to="2 * Math.PI * 20 * (details.score / details.total_score)
+                    " dur="0.8s" begin="0" fill="freeze" />
+                </circle>
+              </svg>
+            </div>
+          </div>
+        </div>
+        <div class="grade">
+          <img v-if="details.score_level == '优秀'" src="@/assets/images/analysis/grade1.png" />
+          <img v-if="details.score_level == '良好'" src="@/assets/images/analysis/grade2.png" />
+          <img v-if="details.score_level == '及格'" src="@/assets/images/analysis/grade3.png" />
+          <img v-if="details.score_level == '不及格'" src="@/assets/images/analysis/grade4.png" />
+        </div>
+      </div>
+    </div>
+    <div class="main-b" :class="{ 'main-b-margintop': details.score == 0 }">
+      <div class="main-b-title">分数评级</div>
+      <div class="main-b-con">
+        <div class="drawingItem" v-if="JSON.stringify(details.std) != '{}' && details.std.scores != undefined">
+          <span class="a" :style="{ width: details.std.scores[0] * 100 + '%' }">不及格</span><span class="b" :style="{
+            width:
+              (details.std.scores[1] - details.std.scores[0]) * 100 + '%',
+          }">及格</span><span class="c" :style="{
+            width:
+              (details.std.scores[2] - details.std.scores[1]) * 100 + '%',
+          }">良好</span><span class="d" :style="{
+            width:
+              (details.std.scores[3] - details.std.scores[2]) * 100 + '%',
+          }">优秀</span>
+        </div>
+        <div class="drawingItem" v-else>
+          <span class="a">不及格</span><span class="b">及格</span><span class="c">良好</span><span class="d">优秀</span>
+        </div>
+        <div v-if="JSON.stringify(details.std) != '{}' && details.std.scores != undefined">
+          <i class="branchA scoreType">成绩</i>
+          <i class="branchB scoreType" :style="{
+            left: (details.std.scores[0] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.values[0] }}</i>
+          <i class="branchC scoreType" :style="{
+            left: (details.std.scores[1] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.values[1] }}</i>
+          <i class="branchD scoreType" :style="{
+            left: (details.std.scores[2] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.values[2] }}</i>
+          <i class="branchE scoreType" :style="{
+            left: (details.std.scores[3] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.values[3] }}</i>
+        </div>
+        <div v-if="JSON.stringify(details.std) != '{}' && details.std.scores != undefined">
+          <i class="branchA">分数</i>
+          <i class="branchB" :style="{
+            left: (details.std.scores[0] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.scores[0] }}</i>
+          <i class="branchC" :style="{
+            left: (details.std.scores[1] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.scores[1] }}</i>
+          <i class="branchD" :style="{
+            left: (details.std.scores[2] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.scores[2] }}</i>
+          <i class="branchE" :style="{
+            left: (details.std.scores[3] / details.std.scores[3]) * 100 + '%',
+          }">{{ details.std.scores[3] }}</i>
+        </div>
+        <div v-else>
+          <i class="branchA">分数</i>
+          <i class="branchB">60</i>
+          <i class="branchC">80</i>
+          <i class="branchD">90</i>
+          <i class="branchE">100</i>
+        </div>
+        <div v-if="JSON.stringify(details.std) != '{}' && details.std.scores != undefined" class="currentDian" :style="{
+          left:
+            (details.score / details.std.scores[3] > 1
+              ? 1
+              : details.score / details.std.scores[3]) *
+            100 +
+            '%',
+        }">
+          <div class="chengji">
+            <span>{{ details.result }}</span>
+          </div>
+          <div class="fenshu">
+            <span>{{ details.score }}</span>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="main-c">
+      <!--立定跳远-->
+      <Jump :details="details" v-if="JSON.stringify(details) != '{}' && ['jump'].includes(query.exam_name)
+      " />
+      <!--实心球-->
+      <SolidBall :details="details" v-if="JSON.stringify(details) != '{}' &&
+        ['solidball'].includes(query.exam_name)
+      " />
+      <!--脚环跑步-->
+      <Runa :details="details" v-if="JSON.stringify(details) != '{}' &&
+        ['runa800', 'runa1000'].includes(query.exam_name)
+      " />
+      <!--跑步-->
+      <Run :details="details" v-if="JSON.stringify(details) != '{}' &&
+        ['run50', 'run60', 'run100', 'run200', 'run400', 'run800', 'run1000', 'run15x4', 'run50x8'].includes(query.exam_name)
+      " />
+      <!--仰卧起坐-->
+      <SitUp :details="details" v-if="JSON.stringify(details) != '{}' && ['situp'].includes(query.exam_name)
+      " />
+      <!--引体向上-->
+      <PullUp :details="details" v-if="JSON.stringify(details) != '{}' &&
+        ['pullup'].includes(query.exam_name)
+      " />
+      <!--跳绳类-->
+      <RopeSkipping :details="details" v-if="JSON.stringify(details) != '{}' &&
+        ['jumprope', 'skiprope'].includes(query.exam_name)
+      " />
+      <!--球类-->
+      <Balls :details="details" v-if="JSON.stringify(details) != '{}' &&
+        [
+          'footballv1',
+          'football',
+          'basketballv1',
+          'basketball',
+          'volleyball',
+          'badmintonv1',
+          'badminton',
+          'pingpong',
+        ].includes(query.exam_name)
+      " />
+      <!--斜身引体-->
+      <SidePullUp :details="details" v-if="JSON.stringify(details) != '{}' &&
+        ['sidepullup'].includes(query.exam_name)
+      " />
+      <!--三级蛙跳-->
+      <TriJump :details="details" v-if="JSON.stringify(details) != '{}' && ['trijump'].includes(query.exam_name)
+      " />
+      <!--铅球-->
+      <ShotPut :details="details" v-if="JSON.stringify(details) != '{}' &&
+        ['shotput'].includes(query.exam_name)
+      " />
+      <!--急行跳远-->
+      <LongJump :details="details" v-if="JSON.stringify(details) != '{}' && ['longjump'].includes(query.exam_name)
+      " />
+      <div class="tip">
+        <!-- 温馨提示:<br />
+        因为光线或人员遮挡等环境问题,导致测试数据偶尔有偏差,最终解释权归卓浦士科技所有。<br />客服热线:<a
+          href="tel:020-37804867"
+          >020-37804867</a
+        > -->
+      </div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+import Balls from "./components/balls.vue";
+import Jump from "./components/jump.vue";
+import LongJump from "./components/longJump.vue";
+import SolidBall from "./components/solidBall.vue";
+import Run from "./components/run.vue";
+import Runa from "./components/runa.vue";
+import SitUp from "./components/sitUp.vue";
+import PullUp from "./components/pullUp.vue";
+import RopeSkipping from "./components/ropeSkipping.vue";
+import SidePullUp from "./components/sidePullUp.vue";
+import TriJump from "./components/triJump.vue";
+import ShotPut from "./components/shotPut.vue";
+const dic: any = dataDictionary;
+const { proxy } = getCurrentInstance() as any;
+const data = reactive<any>({
+  query: {},
+  details: {},
+  gradeType: []
+});
+const { query, details, gradeType } = toRefs(data);
+
+/**
+ * 项目详情
+*/
+const getDetails = () => {
+  let params = {
+    test_key: query.value.test_key,
+    stu_key: query.value.stu_key,
+    exam_name: query.value.exam_name,
+  };
+  proxy?.$http.analysis.examDetails(params)
+    .then((res: any) => {
+      //console.log(res);
+      details.value = res.data;
+      let obj = gradeType.value.find((item: any) => {
+        return item.value == details.value.grade;
+      });
+      details.value.grade_name = obj.name;
+      details.value.unit = dic.project.unit[query.value.exam_name];
+      details.value.examsName = dic.project[query.value.exam_name];
+      details.value.image_url_list = details.value.image_url
+        ? details.value.image_url.split("  ")
+        : [];
+      if (['trijump', 'solidball', 'shotput', 'longjump'].includes(query.value.exam_name)) {
+        details.value.result = Number(details.value.result / 100).toFixed(2);
+      } else {
+        details.value.result =
+          String(details.value.result).indexOf(".") == -1
+            ? details.value.result
+            : Number(details.value.result).toFixed(1);
+      }
+      if (
+        ["runa800", "runa1000"].includes(query.value.exam_name) &&
+        details.value.result == 0
+      ) {
+        proxy?.$modal.alertError(`无数据原因:${details.value.comments}`);
+      }
+    })
+    .catch(() => { });
+};
+
+onBeforeMount(() => {
+  const myInfo: any = localStorage.getItem("userInfo");
+  const userinfo = JSON.parse(myInfo)
+  let obj: any = dataDictionary.gradeLists.find((item) => {
+    return item.value == userinfo.category;
+  })
+  gradeType.value = obj.child || [];
+})
+
+onMounted(() => {
+  getDetails();
+})
+
+</script>
+
+<style lang="scss" scoped>
+.main {
+  background: #efefef;
+  padding-bottom: 0.65rem;
+  min-height: calc(100vh - 0.65rem);
+
+  .main-a {
+    padding: 0.5rem 0.5rem 0 0.5rem;
+    margin-bottom: 0.6rem;
+
+    .main-a-title {
+      display: flex;
+
+      .project {
+        font-weight: bold;
+        color: #464646;
+        font-size: 0.55rem;
+        line-height: 0.55rem;
+        padding-right: 0.4rem;
+        margin-right: 0.4rem;
+        border-right: 0.02rem solid #464646;
+      }
+
+      .date {
+        font-size: 0.4rem;
+        line-height: 0.55rem;
+        color: #999999;
+        font-weight: normal;
+      }
+    }
+
+    .main-a-con {
+      display: flex;
+      justify-content: space-between;
+      position: relative;
+      overflow: hidden;
+
+      .main-a-con-left {
+        width: 50%;
+        margin-top: 0.5rem;
+
+        .userInfo {
+          margin-bottom: 0.3rem;
+          display: flex;
+          line-height: 1.3;
+
+          strong {
+            font-size: 0.45rem;
+            font-weight: bold;
+            margin-right: 0.5rem;
+            flex-shrink: 0;
+          }
+
+          span {
+            font-size: 0.4rem;
+          }
+        }
+
+        .fraction {
+          margin-bottom: 0.5rem;
+
+          strong {
+            font-size: 1.6rem;
+            color: #39bbbb;
+            font-weight: bold;
+          }
+
+          span {
+            font-size: 0.4rem;
+            color: #999999;
+            margin-left: 0.1rem;
+          }
+        }
+
+        .score {
+          margin-bottom: 0.3rem;
+
+          i {
+            padding-left: 0.55rem;
+            background: url("@/assets/images/analysis/resultIcon.png") left center no-repeat;
+            background-size: 0.4rem;
+            font-size: 0.35rem;
+            margin-right: 0.3rem;
+          }
+
+          strong {
+            font-size: 0.6rem;
+            color: #464646;
+            font-weight: bold;
+          }
+
+          span {
+            font-size: 0.4rem;
+            color: #999999;
+          }
+        }
+
+        .ranking {
+          i {
+            padding-left: 0.55rem;
+            background: url("@/assets/images/analysis/rankingIcon.png") left center no-repeat;
+            background-size: 0.4rem;
+            font-size: 0.35rem;
+            margin-right: 0.3rem;
+          }
+
+          strong {
+            font-size: 0.6rem;
+            color: #464646;
+            font-weight: bold;
+          }
+
+          span {
+            font-size: 0.4rem;
+            color: #999999;
+          }
+        }
+      }
+
+      .main-a-con-right {
+        width: 50%;
+        display: flex;
+        align-items: flex-end;
+        justify-content: center;
+
+        .main-a-con-right-box {
+          display: flex;
+          flex-wrap: wrap;
+          align-items: flex-end;
+          justify-content: center;
+        }
+
+        img {
+          max-width: 88%;
+          max-height: 5rem;
+          position: relative;
+          z-index: 1;
+          margin-bottom: 11vw;
+        }
+
+        .svg-box {
+          position: absolute;
+          z-index: 0;
+          width: 35vw;
+          height: 35vw;
+          transform: rotate(155deg);
+          bottom: -12vw;
+
+          .svg {
+            display: block;
+            width: 100%;
+            height: 100%;
+            transform: skewX(60deg);
+          }
+        }
+      }
+
+      .grade {
+        width: 1.8rem;
+        position: absolute;
+        left: 50%;
+        top: 40%;
+        margin-left: -0.9rem;
+        margin-top: -0.9rem;
+
+        img {
+          width: 100%;
+        }
+      }
+    }
+  }
+
+  .main-b {
+    padding: 0rem 0.5rem;
+    margin-bottom: 1.1rem;
+
+    .main-b-title {
+      font-size: 0.4rem;
+      color: #464646;
+      margin-bottom: 0.8rem;
+    }
+
+    .main-b-con {
+      display: flex;
+      border-radius: 3rem;
+      text-align: center;
+      font-size: 0.3rem;
+      color: #ffffff;
+      position: relative;
+
+      span {
+        height: 0.65rem;
+        line-height: 0.65rem;
+      }
+
+      .a {
+        width: 60%;
+        background: #dcdcdc;
+        border-radius: 3rem 0 0 3rem;
+      }
+
+      .b {
+        width: 20%;
+        background: #ff8165;
+      }
+
+      .c {
+        width: 10%;
+        background: #f7b249;
+      }
+
+      .d {
+        width: 10%;
+        background: #39bbbb;
+        border-radius: 0 3rem 3rem 0;
+      }
+
+      i {
+        position: absolute;
+        color: #999999;
+        top: 0.7rem;
+      }
+
+      .scoreType {
+        top: -16px;
+      }
+
+      .branchA {
+        left: 0;
+      }
+
+      .branchB {
+        left: 60%;
+        margin-left: -0.2rem;
+      }
+
+      .branchC {
+        left: 80%;
+        margin-left: -0.2rem;
+      }
+
+      .branchD {
+        left: 90%;
+        margin-left: -0.2rem;
+      }
+
+      .branchE {
+        right: 0;
+        left: auto !important;
+      }
+
+      .currentVal {
+        position: absolute;
+        height: 0.7rem;
+        left: 0%;
+        top: -0.8rem;
+        border-radius: 0.2rem;
+        color: #464646;
+        width: 1rem;
+        margin-left: -0.5rem;
+        font-size: 0.35rem;
+        font-weight: bold;
+        background: #c9c9c990;
+        display: flex;
+        align-items: center;
+
+        .currentValBox {
+          width: 100%;
+          text-align: center;
+        }
+
+        em {
+          font-size: 0.3rem;
+          color: #999999;
+          font-weight: normal;
+        }
+
+        &::after {
+          content: "";
+          width: 0;
+          height: 0;
+          border-left: 0.2rem solid transparent;
+          border-right: 0.2rem solid transparent;
+          border-top: 0.4rem solid #c9c9c990;
+          position: absolute;
+          top: 0.68rem;
+          left: 50%;
+          margin-left: -0.204rem;
+        }
+      }
+
+      .currentDian {
+        width: 0.1rem;
+        height: 1.2rem;
+        position: absolute;
+        top: 50%;
+        left: 0%;
+        margin-top: -0.6rem;
+        margin-left: -0.05rem;
+        background: #464646;
+        color: #464646;
+
+        .chengji {
+          position: absolute;
+          top: 0px;
+
+          span {
+            position: absolute;
+            top: -0.6rem;
+            margin-left: -0.3rem;
+            font-size: 0.4rem;
+          }
+
+          &::before {
+            content: "";
+            display: block;
+            width: 0.2rem;
+            height: 0.2rem;
+            margin-left: -0.06rem;
+            border-radius: 50%;
+            background: #464646;
+          }
+        }
+
+        .fenshu {
+          position: absolute;
+          bottom: 0px;
+
+          span {
+            position: absolute;
+            bottom: -0.6rem;
+            margin-left: -0.3rem;
+            font-size: 0.4rem;
+          }
+
+          &::before {
+            content: "";
+            display: block;
+            width: 0.2rem;
+            height: 0.2rem;
+            margin-left: -0.06rem;
+            border-radius: 50%;
+            background: #464646;
+          }
+        }
+      }
+
+      .drawingItem {
+        display: flex;
+        width: 100%;
+      }
+    }
+  }
+
+  .main-b-margintop {
+    margin-top: 0.8rem;
+  }
+
+  .main-c {
+    padding: 0rem 0.5rem 0.5rem 0.5rem;
+
+    .column {
+      margin-bottom: 0.5rem;
+
+      .column-title {
+        margin-bottom: 0.4rem;
+        font-size: 0.5rem;
+        color: #555555;
+        font-weight: bold;
+      }
+
+      .column-con {
+        padding: 0.5rem;
+        background: #ffffff;
+        border-radius: 0.3rem;
+        font-size: 0.4rem;
+        line-height: 1.6;
+
+        .item {
+          border-bottom: 0.02rem solid #d2d2d2;
+          margin-bottom: 0.4rem;
+          padding-bottom: 0.3rem;
+
+          .item-title {
+            margin-bottom: 0.4rem;
+            font-weight: bold;
+            font-size: 0.47rem;
+            color: #555555;
+            display: flex;
+            line-height: 1;
+
+            i {
+              padding: 0.05rem 0.1rem;
+              font-size: 0.3rem;
+              margin-left: 0.3rem;
+              border-radius: 0.1rem;
+              line-height: 0.35rem;
+              color: #ffffff;
+            }
+
+            .you {
+              background: #39bbbb;
+            }
+
+            .liang {
+              background: #f7b249;
+            }
+
+            .cha {
+              background: #ff8165;
+            }
+          }
+
+          .item-title2 {
+            padding: 0px;
+            background: none;
+          }
+
+          .item-con {
+            font-size: 0.4rem;
+            color: #999999;
+
+            .item-con-li {
+              margin-bottom: 0.4rem;
+              position: relative;
+
+              .item-con-li-label {
+                position: absolute;
+                left: 0.3rem;
+                top: 0.3rem;
+                border-radius: 0.1rem;
+                color: #ffffff;
+                font-size: 0.3rem;
+                padding: 0.04rem 0.2rem;
+              }
+
+              .item-con-li-label-bg1 {
+                background: #39bbbb;
+              }
+
+              .item-con-li-label-bg2 {
+                background: #ff8165;
+              }
+
+              .item-con-li-title {
+                font-size: 0.46rem;
+                margin-bottom: 0.3rem;
+                color: #464646;
+              }
+
+              .item-con-li-con {
+                font-size: 0.4rem;
+                margin-bottom: 0.4rem;
+                color: #999999;
+
+                .item-con-li-con-val {
+                  display: flex;
+                  justify-content: space-around;
+
+                  .item-con-li-con-val-li-name1 {
+                    font-size: 0.4rem;
+                    padding-bottom: 0.2rem;
+                    display: inline;
+                    border-bottom: 0.08rem solid #ff8165;
+                    position: relative;
+
+                    &::after {
+                      content: "";
+                      width: 0.2rem;
+                      height: 0.2rem;
+                      border-radius: 100%;
+                      background: #ff8165;
+                      left: 0;
+                      bottom: -0.13rem;
+                      position: absolute;
+                    }
+
+                    &::before {
+                      content: "";
+                      width: 0.2rem;
+                      height: 0.2rem;
+                      border-radius: 100%;
+                      background: #ff8165;
+                      right: 0;
+                      bottom: -0.13rem;
+                      position: absolute;
+                    }
+                  }
+
+                  .item-con-li-con-val-li-name2 {
+                    font-size: 0.4rem;
+                    padding-bottom: 0.2rem;
+                    display: inline;
+                    border-bottom: 0.08rem solid #39bbbb;
+                    position: relative;
+
+                    &::after {
+                      content: "";
+                      width: 0.2rem;
+                      height: 0.2rem;
+                      border-radius: 100%;
+                      background: #39bbbb;
+                      left: 0;
+                      bottom: -0.13rem;
+                      position: absolute;
+                    }
+
+                    &::before {
+                      content: "";
+                      width: 0.2rem;
+                      height: 0.2rem;
+                      border-radius: 100%;
+                      background: #39bbbb;
+                      right: 0;
+                      bottom: -0.13rem;
+                      position: absolute;
+                    }
+                  }
+
+                  .item-con-li-con-val-li-con {
+                    font-weight: bold;
+                    font-size: 0.5rem;
+                    display: block;
+                    padding-top: 0.3rem;
+                    color: #555555;
+                    text-align: center;
+                  }
+                }
+
+                .item-con-li-con-strong {
+                  font-weight: 350;
+                  margin-bottom: 0.1rem;
+                  color: #666666;
+                }
+              }
+            }
+          }
+        }
+
+        .item:last-child {
+          margin-bottom: 0;
+          padding: 0;
+          border: none;
+        }
+      }
+
+      video {
+        width: 100%;
+        background: #ffffff;
+      }
+
+      img {
+        max-width: 100%;
+      }
+
+      table {
+        max-width: 100%;
+      }
+    }
+
+    .tip {
+      font-size: 0.35rem;
+      color: #999999;
+      line-height: 1.6;
+
+      a {
+        color: #555555;
+      }
+    }
+
+    .bigImg {
+      width: 100%;
+    }
+  }
+}
+</style>

+ 259 - 0
src/views/analysis/index.vue

@@ -0,0 +1,259 @@
+<template>
+  <div class="reportList">
+    <div class="title">测试记录</div>
+    <ul :ref="reportScrollRef" @scroll="getScroll($event)">
+      <li v-for="(item, index) in reportList" :key="index" @click="openReport(item)">
+        <div class="left">
+          <div class="pic"><img :src="item.face_pic || item.logo_url || item.student_icon_url" /></div>
+          <div class="txt">
+            <div>
+              <div class="name">{{ item.student_name }}</div>
+              <div class="className">{{ item.class_name }}</div>
+            </div>
+          </div>
+        </div>
+        <div class="right" v-if="['basketballv1'].includes(parameter.project)">
+          <div class="score">{{ proxy?.$utils.runTime(item.result, true, false) }}
+          </div>
+        </div>
+        <div class="right" v-else>
+          <div class="score">{{ item.result }}
+          </div>
+          <div class="unit">{{ unit }}</div>
+        </div>
+      </li>
+    </ul>
+  </div>
+</template>
+<script setup lang="ts">
+import dataDictionary from "@/utils/dataDictionary"
+const router = useRouter();
+const route = useRoute();
+const dic: any = dataDictionary;
+const { proxy } = getCurrentInstance() as any;
+const reportWindowRef = ref();
+const reportScrollRef = ref();
+
+const data = reactive<any>({
+  parameter:{},
+  reportList: [],//测试列表
+  studentPage: {
+    current: 1,
+    size: 10,
+    pages: 1,
+  }, //学生分页
+  debounceTime: '', //防抖状态
+  unit: '',//单位
+});
+
+const { parameter, reportList, studentPage, debounceTime, unit } = toRefs(data);
+
+/**
+ * 成绩列表
+*/
+const getReportList = () => {
+  let type = parameter.value.project;
+  let params: any = {
+    exam_name: type,
+    page: studentPage.value.current,
+    per_page: studentPage.value.size
+  };
+  proxy?.$http.common.reportList(params).then((res: any) => {
+    if (res.data.length > 0) {
+      let list = res.data.map((item: any) => {
+
+        if (type == 'solidball' || type == 'shotball') {
+          item.result = item.result / 100
+        }
+        let result = null;
+        if (item.result.toString().indexOf(".") != -1) {
+          if (['jump', 'longjump', 'run50', 'run70', 'run100', 'run200', 'run400', 'run800', 'run1000', 'run15x4', 'run50x8', 'run10x4', 'basketballv1', 'basketballv1'].includes(type)) {
+            result = item.result.toFixed(2)
+          } else {
+            result = item.result.toFixed(1);
+          }
+        } else {
+          result = item.result
+        }
+        item.result = result;
+        return item;
+      });
+      studentPage.value.current == 1 ?
+        (reportList.value = list) :
+        reportList.value.push(...list);
+      studentPage.value.pages = res.total;
+      getPages(res.total);
+    }
+  });
+};
+
+/**
+ * 计算页码
+*/
+const getPages = (data: any) => {
+  studentPage.value.pages = Math.ceil(data / studentPage.value.size);
+};
+
+/**
+ * 查看详情
+*/
+const openReport = (data: any) => {
+  reportWindowRef.value.open(parameter.value.project, data);
+};
+
+/**
+* 成绩翻页
+*/
+const getScroll = (event?: any) => {
+  if (studentPage.value.current == studentPage.value.pages) {
+    return false;
+  }
+  let obj = event.target;
+  let scrollHeight = obj.scrollHeight;
+  let scrollTop = obj.scrollTop;
+  let clientHeight = obj.clientHeight;
+  //提前100高度加载数据
+  if (scrollTop + clientHeight + 100 >= scrollHeight) {
+    console.log('到底了!')
+    //继续加载下一页
+    if (debounceTime.value) {
+      clearTimeout(debounceTime.value)
+    }
+    debounceTime.value = setTimeout(() => {
+      studentPage.value.current++;
+      getReportList();
+    }, 500)
+  } else {
+    console.log('没到底')
+  }
+};
+
+/**
+ * 初始化列表
+*/
+const getIniReportList = () => {
+  studentPage.value.current = 1;
+  getReportList();
+};
+
+onBeforeMount(() => {
+  parameter.value = route.query;
+  let project = parameter.value.project;
+  unit.value = dic.unit[project];
+})
+
+onMounted(() => {
+  getIniReportList();
+})
+</script>
+<style lang="scss" scoped>
+.reportList {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+
+  .title {
+    height: 7.05vh;
+    line-height: 7.05vh;
+    width: 100%;
+    text-align: center;
+    color: #1A293A;
+    font-size: 1.65rem;
+    background: radial-gradient(120% 126% at 5% 93%, #8EFFA9 0%, #07FFE7 100%);
+  }
+
+  ul {
+    height: 100%;
+    overflow-y: scroll;
+
+    li {
+      border-bottom: 1px solid #48677E;
+      padding: 8px 30px;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      cursor: pointer;
+      transition: all 0.2s;
+
+      &:hover {
+        background: rgba(255, 255, 255, 0.4);
+      }
+
+      .left {
+        display: flex;
+
+        .pic {
+          width: 7.5vh;
+          height: 7.5vh;
+          border-radius: 50%;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          overflow: hidden;
+          box-sizing: border-box;
+          border: 1px solid rgba(255, 255, 255, 0.5);
+          margin-right: 13px;
+          flex-shrink: 0;
+
+          img {
+            width: 100%;
+          }
+        }
+
+        .txt {
+          display: flex;
+          align-items: center;
+
+          .name {
+            color: #F9F9F9;
+            font-size: 1.38rem;
+          }
+
+          .className {
+            color: #13ED84;
+            font-size: 1.1rem;
+          }
+        }
+
+      }
+
+      .right {
+        display: flex;
+        font-weight: bold;
+        align-items: center;
+
+        .score {
+          color: #ffffff;
+          font-size: 1.1rem;
+          font-family: 'Saira-ExtraBold';
+        }
+
+        .unit {
+          color: #ffffff;
+          font-size: 0.8rem;
+          margin-left: 2px;
+        }
+      }
+
+    }
+
+    &::-webkit-scrollbar {
+      width: 0px;
+    }
+
+    &::-webkit-scrollbar-thumb {
+      border-width: 2px;
+      border-radius: 4px;
+      border-style: dashed;
+      border-color: transparent;
+      background-color: rgba(216, 216, 216, 0.8);
+      background-clip: padding-box;
+    }
+
+    &::-webkit-scrollbar-button:hover {
+      border-radius: 6px;
+      background: rgba(216, 216, 216, 0.8);
+    }
+  }
+}
+</style>

+ 0 - 3
src/views/login/index.vue

@@ -24,9 +24,6 @@
         </div>
       </div>
     </Transition>
-    <!-- <div class="erweima"> <img src="@/assets/images/login/erweima.png" />
-      <span>扫码登录</span>
-    </div> -->
   </div>
 </template>
 

+ 0 - 2
src/views/login/mobile.vue

@@ -44,10 +44,8 @@ const data = reactive<any>({
     password: 'trops@2022'
   }
 });
-
 const { show, handcontroller, loginForm } = toRefs(data);
 
-
 // 登录
 const getLogin = () => {
   let deviceid = loginForm.value.deviceid;

+ 1 - 1
src/views/ranking/index.vue

@@ -779,7 +779,7 @@ onBeforeMount(() => {
   let obj: any = dataDictionary.gradeLists.find((item) => {
     return item.value == userinfo.category;
   })
-  gradeType.value = obj.child;
+  gradeType.value = obj.child || [];
   getClass();
 })