Practice.tsx 4.0 KB

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