studentDetail.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from '@/views/classList/index.module.less';
  3. import {
  4. NButton,
  5. NDataTable,
  6. NForm,
  7. NFormItem,
  8. NImage,
  9. NSelect,
  10. NSpace,
  11. NTabPane,
  12. NTabs
  13. } from 'naive-ui';
  14. import {
  15. getStudentDetail,
  16. getTrainingStudentList
  17. } from '@/views/classList/api';
  18. import { useRoute } from 'vue-router';
  19. import CBreadcrumb from '/src/components/CBreadcrumb';
  20. import defultHeade from '@/components/layout/images/teacherIcon.png';
  21. import femaleIcon from '@/views/setting/images/femaleIcon.png';
  22. import maleIcon from '@/views/setting/images/maleIcon.png';
  23. import PracticeData from '@/views/studentList/components/practiceData';
  24. import EvaluationRecords from '@/views/studentList/components/evaluationRecords';
  25. import BaseInfo from '@/views/studentList/components/baseInfo';
  26. import StudentAfterWork from './components/studentAfterWork';
  27. import { getTabsCache, setTabsCaches } from '@/hooks/use-async';
  28. import dayjs from 'dayjs';
  29. export default defineComponent({
  30. name: 'studentDetail',
  31. setup(props, { emit }) {
  32. const state = reactive({
  33. studentInfo: {
  34. avatar: '',
  35. nickname: '',
  36. gender: null,
  37. subjectNames: '',
  38. classInstrumentName: '',
  39. classGroupName: ''
  40. }
  41. });
  42. const activeStudentTab = ref('baseInfo');
  43. const route = useRoute();
  44. console.log(route.meta.isClass);
  45. const routerList = ref(
  46. route.meta.isClass
  47. ? [
  48. { name: '班级管理', path: '/classList' },
  49. { name: route.query.name, path: '/classDetail' },
  50. { name: route.query.studentName, path: '/classStudentRecode' }
  51. ]
  52. : ([
  53. { name: '学生管理', path: '/studentList' },
  54. { name: route.query.studentName, path: '/classStudentRecode' }
  55. ] as any)
  56. );
  57. const getWorkInfo = async () => {
  58. console.log(route.query.studentId);
  59. try {
  60. const res = await getStudentDetail({
  61. id: route.query.studentId
  62. });
  63. state.studentInfo = { ...res.data };
  64. } catch (e) {
  65. console.log(e);
  66. }
  67. };
  68. onMounted(() => {
  69. getWorkInfo();
  70. });
  71. getTabsCache((val: any) => {
  72. if (val.form.tabName) {
  73. activeStudentTab.value = val.form.tabName;
  74. }
  75. });
  76. const setTabs = (val: any) => {
  77. setTabsCaches(val, 'tabName', route);
  78. };
  79. return () => (
  80. <div>
  81. <CBreadcrumb list={routerList.value}></CBreadcrumb>
  82. <div class={[styles.listWrap, styles.infoListWrap]}>
  83. <div class={styles.teacherList}>
  84. <div class={styles.teacherHeader}>
  85. <div class={styles.teacherHeaderBorder}>
  86. <NImage
  87. class={styles.teacherHeaderImg}
  88. src={
  89. state.studentInfo.avatar
  90. ? state.studentInfo.avatar
  91. : defultHeade
  92. }
  93. previewDisabled></NImage>
  94. </div>
  95. </div>
  96. <div class={styles.workafterInfo}>
  97. <h4 class={styles.studentGender}>
  98. {state.studentInfo.nickname}{' '}
  99. <NImage
  100. previewDisabled
  101. src={
  102. state.studentInfo.gender ? maleIcon : femaleIcon
  103. }></NImage>
  104. </h4>
  105. <p>
  106. {state.studentInfo.classGroupName}{' '}
  107. {state.studentInfo.classInstrumentName
  108. ? '| ' + state.studentInfo.classInstrumentName
  109. : ' '}
  110. </p>
  111. </div>
  112. </div>
  113. <NTabs
  114. onUpdate:value={(val: any) => setTabs(val)}
  115. class={styles.customTabs}
  116. v-model:value={activeStudentTab.value}
  117. size="large"
  118. animated={false}
  119. pane-wrapper-style="margin: 0 -4px"
  120. pane-style="padding-left: 4px; padding-right: 4px; box-sizing: border-box;">
  121. <NTabPane name="baseInfo" tab="基本信息">
  122. <BaseInfo studentInfo={state.studentInfo}></BaseInfo>
  123. </NTabPane>
  124. <NTabPane name="afterWork" tab="课后作业">
  125. <StudentAfterWork></StudentAfterWork>
  126. </NTabPane>
  127. <NTabPane name="textRcode" tab="练习记录">
  128. <PracticeData
  129. studentId={route.query.studentId as string}></PracticeData>
  130. </NTabPane>
  131. <NTabPane name="evaluatingRcode" tab="评测记录">
  132. <EvaluationRecords
  133. studentId={route.query.studentId as string}></EvaluationRecords>
  134. </NTabPane>
  135. </NTabs>
  136. </div>
  137. </div>
  138. );
  139. }
  140. });