classRecord.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { defineComponent, onMounted, reactive } from 'vue';
  2. import { NAvatar, NButton, NForm, NFormItem, NSpace, NTag } from 'naive-ui';
  3. import Pagination from '@/components/pagination';
  4. import { courseSchedulePage } from '../api';
  5. import { useRoute } from 'vue-router';
  6. import CDatePicker from '/src/components/CDatePicker';
  7. import styles from './classRecord.module.less';
  8. import teacherIcon from '@components/layout/images/teacherIcon.png';
  9. import dayjs from 'dayjs';
  10. import { getTimes } from '/src/utils';
  11. import TheEmpty from '/src/components/TheEmpty';
  12. export default defineComponent({
  13. name: 'class-record',
  14. setup() {
  15. const route = useRoute();
  16. const formatDefaultTime = () => {
  17. const gradeYear: any = route.query.gradeYear;
  18. if (gradeYear) {
  19. const yearStr = `${gradeYear}-9-1`;
  20. const yearStrEnd = `${Number(gradeYear) + 1}-8-31`;
  21. return [dayjs(yearStr).valueOf(), dayjs(yearStrEnd).valueOf()];
  22. } else {
  23. const nowTime = dayjs().format('YYYY-MM-DD');
  24. return [
  25. dayjs(nowTime).subtract(1, 'month').valueOf(),
  26. dayjs(nowTime).valueOf()
  27. ];
  28. }
  29. };
  30. const state = reactive({
  31. searchForm: {
  32. createTimer: formatDefaultTime() as any
  33. },
  34. loading: false,
  35. pagination: {
  36. page: 1,
  37. rows: 10,
  38. pageTotal: 0
  39. },
  40. tableList: [] as any
  41. });
  42. const search = () => {
  43. state.pagination.page = 1;
  44. getList();
  45. };
  46. const onReset = () => {
  47. state.searchForm = {
  48. createTimer: formatDefaultTime() as any
  49. };
  50. search();
  51. };
  52. const getList = async () => {
  53. state.loading = true;
  54. try {
  55. const { data } = await courseSchedulePage({
  56. classGroupId: route.query.id,
  57. ...getTimes(
  58. state.searchForm.createTimer,
  59. ['startTime', 'endTime'],
  60. 'YYYY-MM-DD'
  61. ),
  62. ...state.pagination
  63. });
  64. const rows = data.rows || [];
  65. rows.forEach((row: any) => {
  66. row.lessonCourseware = row.lessonCoursewareJson
  67. ? JSON.parse(row.lessonCoursewareJson)
  68. : {};
  69. });
  70. state.tableList = rows;
  71. state.pagination.pageTotal = data.total;
  72. state.loading = false;
  73. } catch (e) {
  74. state.loading = false;
  75. }
  76. };
  77. onMounted(() => {
  78. getList();
  79. });
  80. return () => (
  81. <div>
  82. <div class={styles.searchList}>
  83. <NForm label-placement="left" inline>
  84. <NFormItem>
  85. <CDatePicker
  86. v-model:value={state.searchForm.createTimer}
  87. timerValue={state.searchForm.createTimer}
  88. separator={'至'}
  89. type="daterange"></CDatePicker>
  90. </NFormItem>
  91. <NFormItem>
  92. <NSpace justify="end">
  93. <NButton type="primary" class="searchBtn" onClick={search}>
  94. 搜索
  95. </NButton>
  96. <NButton
  97. type="primary"
  98. ghost
  99. class="resetBtn"
  100. onClick={onReset}>
  101. 重置
  102. </NButton>
  103. </NSpace>
  104. </NFormItem>
  105. </NForm>
  106. </div>
  107. <div class={styles.tableWrap}>
  108. <NSpace class={styles.tableSpace}>
  109. {state.tableList.map((item: any) => (
  110. <div class={styles.tableContainer}>
  111. <div class={styles.header}>
  112. <div class={styles.time}>
  113. {dayjs(item.startTime).format('YYYY-MM-DD HH:mm')}
  114. </div>
  115. {route.query.name && (
  116. <NTag type="primary" class={styles.ntag} strong>
  117. {route.query.name}
  118. </NTag>
  119. )}
  120. </div>
  121. <div class={styles.content}>
  122. <NAvatar
  123. class={styles.navatar}
  124. round
  125. src={item.teacherAvatar || teacherIcon}
  126. />
  127. <div class={styles.userInfo}>
  128. <h2>{item.teacherName}</h2>
  129. <p>
  130. {item.subjectName && (
  131. <span class={styles.subjectName}>
  132. {item.subjectName}
  133. </span>
  134. )}
  135. {item.lessonCourseware.lessonCoursewareName} |{' '}
  136. {item.lessonCourseware.lessonCoursewareDetailName}|{' '}
  137. {
  138. item.lessonCourseware
  139. .lessonCoursewareKnowledgeDetailName
  140. }
  141. </p>
  142. </div>
  143. </div>
  144. </div>
  145. ))}
  146. </NSpace>
  147. {state.tableList.length > 0 && (
  148. <Pagination
  149. v-model:page={state.pagination.page}
  150. v-model:pageSize={state.pagination.rows}
  151. v-model:pageTotal={state.pagination.pageTotal}
  152. onList={getList}
  153. sync
  154. saveKey="classRecord-key"
  155. />
  156. )}
  157. {state.tableList.length <= 0 && <TheEmpty class={styles.nowEmpty} />}
  158. </div>
  159. </div>
  160. );
  161. }
  162. });