Practice.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import { PropType, defineComponent, onMounted, ref, toRefs, watch } from 'vue';
  2. import styles from '../index.module.less';
  3. import icons from '../icons.json';
  4. import { Badge, Grid, GridItem, Icon, Image, Progress, Tab, Tabs } from 'vant';
  5. import iconLine from '../image/icon-line.png';
  6. import { IStudentLessons } from '../type';
  7. const colors = [
  8. {
  9. name: '正常',
  10. background: 'linear-gradient(180deg, #02E2DB 0%, #01C1B5 100%)'
  11. },
  12. {
  13. text: '迟到',
  14. background:
  15. 'linear-gradient(180deg, rgba(148, 194, 253, 0.85) 0%, rgba(91, 143, 249, 0.85) 100%)'
  16. },
  17. {
  18. text: '请假',
  19. background:
  20. 'linear-gradient(180deg, rgba(251,224,49,0.85) 0%, rgba(246,189,22,0.85) 100%)'
  21. },
  22. {
  23. text: '旷课',
  24. background:
  25. 'linear-gradient(180deg, rgba(245,161,129,0.85) 0%, rgba(232,104,74,0.85) 100%)'
  26. }
  27. ];
  28. export default defineComponent({
  29. name: 'Practice',
  30. props: {
  31. data: {
  32. type: Object as PropType<IStudentLessons>,
  33. default: () => ({})
  34. }
  35. },
  36. emits: ['change'],
  37. setup(props, { emit }) {
  38. const { data } = toRefs(props);
  39. const tab = ref('week')
  40. return () => (
  41. <div class={styles.item}>
  42. <div class={styles.top}>
  43. <Image class={styles.iconRight} src={icons.right} />
  44. <span>学员练习</span>
  45. <Image class={styles.iconLeft} src={icons.left} />
  46. </div>
  47. <div class={styles.tabsContainer}>
  48. <Tabs
  49. class={styles.practiceTabs}
  50. shrink
  51. v-model:active={tab.value}
  52. onChange={value => {
  53. console.log(value);
  54. emit('change', value);
  55. }}>
  56. <Tab name="week" title="本周"></Tab>
  57. <Tab name="month" title="本月"></Tab>
  58. <Tab name="term" title="本学期"></Tab>
  59. </Tabs>
  60. </div>
  61. <div class={styles.practiceContainer}>
  62. <Grid border={false}>
  63. <GridItem>
  64. {{
  65. icon: () => (
  66. <div>
  67. <span class={styles.tagNum}>
  68. {data.value.commitRate || 0}
  69. </span>
  70. <span class={[styles.tagNum, styles.fenHao]}>%</span>
  71. </div>
  72. ),
  73. text: () => <div>练习率</div>
  74. }}
  75. </GridItem>
  76. <Image class={styles.iconline} src={iconLine} fit="contain" />
  77. <GridItem>
  78. {{
  79. icon: () => (
  80. <div>
  81. <span class={styles.tagNum}>
  82. {data.value.passRate || 0}
  83. </span>
  84. <span class={[styles.tagNum, styles.fenHao]}>%</span>
  85. </div>
  86. ),
  87. text: () => <div>合格率</div>
  88. }}
  89. </GridItem>
  90. </Grid>
  91. <div class={styles.progressItem}>
  92. <Progress
  93. percentage={data.value.expectNum || 1}
  94. strokeWidth={8}
  95. trackColor="transparent"
  96. showPivot={false}
  97. color="linear-gradient(to right, #9AC6FF, #5C91FF)"></Progress>
  98. <div>
  99. 应提交{' '}
  100. <span
  101. style={{ color: '#5C91FF' }}
  102. class={[styles.tagNum, styles.numDes]}>
  103. {data.value.expectNum || 0}
  104. </span>
  105. </div>
  106. </div>
  107. <div class={styles.progressItem}>
  108. <Progress
  109. percentage={data.value.actualNum || 1}
  110. strokeWidth={8}
  111. trackColor="transparent"
  112. showPivot={false}
  113. color="linear-gradient(to right, #91F4DA, #01C1B5)"></Progress>
  114. <div>
  115. 实际提交{' '}
  116. <span
  117. style={{ color: '#01C1B5' }}
  118. class={[styles.tagNum, styles.numDes]}>
  119. {data.value.actualNum || 0}
  120. </span>
  121. </div>
  122. </div>
  123. <div class={styles.progressItem}>
  124. <Progress
  125. percentage={data.value.passNum || 1}
  126. strokeWidth={8}
  127. trackColor="transparent"
  128. showPivot={false}
  129. color="linear-gradient(to right, #FFDCAC, #FFA724)"></Progress>
  130. <div>
  131. 合格提交{' '}
  132. <span
  133. style={{ color: '#FFA724' }}
  134. class={[styles.tagNum, styles.numDes]}>
  135. {data.value.passNum || 0}
  136. </span>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. );
  142. }
  143. });