index.tsx 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from './index.module.less';
  3. import { NIcon, NSpin, NScrollbar, NModal } from 'naive-ui';
  4. import {
  5. lessonCoursewareDetail,
  6. lessonCoursewarePage,
  7. tagUseCourseware
  8. } from '../../api';
  9. import SelectLessonware from './select-lessonware';
  10. import TheEmpty from '/src/components/TheEmpty';
  11. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  12. import { useUserStore } from '/src/store/modules/users';
  13. export default defineComponent({
  14. name: 'directory-main',
  15. setup() {
  16. const prepareStore = usePrepareStore();
  17. const userStore = useUserStore();
  18. const show = ref(true);
  19. const forms = reactive({
  20. showSelectBookStatus: false,
  21. coursewareStatus: false
  22. });
  23. const getLessonCourseware = async () => {
  24. try {
  25. const { data } = await lessonCoursewarePage({
  26. page: 1,
  27. rows: 99,
  28. type: 'COURSEWARE',
  29. enableFlag: 1
  30. });
  31. const result = data.rows || [];
  32. if (result.length > 0) {
  33. // 判断是否有默认数据
  34. const selectItem = result.find(
  35. (item: any) =>
  36. item.id === userStore.getUserInfo?.lastUseCoursewareId
  37. );
  38. let id: any = null;
  39. // console.log(userStore.getUserInfo?.lastUseCoursewareId, result);
  40. if (selectItem) {
  41. prepareStore.setBaseCourseware(selectItem);
  42. id = selectItem.id;
  43. } else {
  44. prepareStore.setBaseCourseware(result[0]);
  45. id = result[0]?.id;
  46. }
  47. setLastUseCoursewareId(id);
  48. }
  49. forms.showSelectBookStatus = true;
  50. } catch {
  51. //
  52. }
  53. };
  54. const getLessonCoursewareDetail = async () => {
  55. try {
  56. const baseCourseware: any = prepareStore.getBaseCourseware;
  57. if (!baseCourseware.id) return;
  58. const { data } = await lessonCoursewareDetail({
  59. id: baseCourseware.id
  60. });
  61. const tempList: any = data.lessonList || [];
  62. tempList.forEach((item: any, index: number) => {
  63. item.selected = false;
  64. if (index === 0) {
  65. item.selected = true;
  66. const temp = item['knowledgeList'][0];
  67. prepareStore.setSelectKey(temp?.id);
  68. prepareStore.setLessonCoursewareId(temp?.lessonCoursewareId);
  69. prepareStore.setLessonCoursewareDetailId(
  70. temp?.lessonCoursewareDetailId
  71. );
  72. }
  73. });
  74. prepareStore.setTreeList(tempList);
  75. } catch {
  76. //
  77. }
  78. };
  79. const setLastUseCoursewareId = async (id: any) => {
  80. try {
  81. await tagUseCourseware({ coursewareId: id });
  82. userStore.getInfo();
  83. } catch {
  84. //
  85. }
  86. };
  87. onMounted(async () => {
  88. show.value = true;
  89. await getLessonCourseware();
  90. await getLessonCoursewareDetail();
  91. show.value = false;
  92. });
  93. return () => (
  94. <div class={styles.directoryList}>
  95. {forms.showSelectBookStatus && (
  96. <div
  97. id='lessons-0'
  98. class={styles['select-directory']}
  99. onClick={() => (forms.coursewareStatus = true)}>
  100. <span
  101. class={['cr-ellipsis']}
  102. title={prepareStore.getBaseCourseware.name}>
  103. {prepareStore.getBaseCourseware.name || '请选择教材'}
  104. </span>
  105. <NIcon class={styles.iconArrow}>
  106. <svg
  107. width="11px"
  108. height="15px"
  109. viewBox="0 0 11 15"
  110. version="1.1"
  111. xmlns="http://www.w3.org/2000/svg">
  112. <g
  113. stroke="none"
  114. stroke-width="1"
  115. fill="none"
  116. fill-rule="evenodd"
  117. opacity="0.699999988">
  118. <g
  119. transform="translate(-445.000000, -137.000000)"
  120. fill="#131415">
  121. <g transform="translate(152.000000, 120.000000)">
  122. <path
  123. d="M299.326227,20.2118001 L304.934089,28.4366632 C305.245211,28.8929759 305.127511,29.515105 304.671198,29.8262273 C304.505147,29.9394437 304.308836,30 304.107861,30 L292.892139,30 C292.339854,30 291.892139,29.5522847 291.892139,29 C291.892139,28.7990254 291.952695,28.6027139 292.065911,28.4366632 L297.673773,20.2118001 C297.984895,19.7554873 298.607024,19.6377872 299.063337,19.9489096 C299.16663,20.0193364 299.255801,20.1085074 299.326227,20.2118001 Z"
  124. id="三角形"
  125. transform="translate(298.500000, 24.500000) rotate(-270.000000) translate(-298.500000, -24.500000) "></path>
  126. </g>
  127. </g>
  128. </g>
  129. </svg>
  130. </NIcon>
  131. </div>
  132. )}
  133. <NScrollbar class={styles.scrollBar}>
  134. <NSpin show={show.value}>
  135. <div
  136. class={[
  137. styles.listSection,
  138. !show.value && prepareStore.getTreeList.length <= 0
  139. ? styles.emptySection
  140. : ''
  141. ]}>
  142. {prepareStore.getTreeList.map((item: any, index: number) => (
  143. <div class={styles.treeParent} key={'parent' + index}>
  144. <div
  145. class={[styles.treeItem, styles.parentItem]}
  146. onClick={() => {
  147. prepareStore.getTreeList.forEach((child: any) => {
  148. if (item.id !== child.id) {
  149. child.selected = false;
  150. }
  151. });
  152. item.selected = item.selected ? false : true;
  153. }}>
  154. {item.knowledgeList && item.knowledgeList.length > 0 && (
  155. <span
  156. class={[
  157. styles.arrow,
  158. item.selected ? styles.arrowSelect : ''
  159. ]}></span>
  160. )}
  161. <p
  162. class={[
  163. styles.title,
  164. item.selected ? styles.titleSelect : ''
  165. ]}>
  166. {item.name}
  167. </p>
  168. </div>
  169. {item.selected &&
  170. item.knowledgeList &&
  171. item.knowledgeList.map((child: any, j: number) => (
  172. <div
  173. key={'child' + j}
  174. class={[
  175. styles.treeItem,
  176. styles.childItem,
  177. styles.animation,
  178. prepareStore.getSelectKey === child.id
  179. ? styles.childSelect
  180. : ''
  181. ]}
  182. onClick={() => {
  183. prepareStore.setSelectKey(child.id);
  184. prepareStore.setLessonCoursewareId(
  185. child.lessonCoursewareId
  186. );
  187. prepareStore.setLessonCoursewareDetailId(
  188. child.lessonCoursewareDetailId
  189. );
  190. }}>
  191. <span class={styles.childArrow}></span>
  192. <p class={styles.title}>{child.name}</p>
  193. </div>
  194. ))}
  195. </div>
  196. ))}
  197. </div>
  198. {!show.value && prepareStore.getTreeList.length <= 0 && (
  199. <TheEmpty />
  200. )}
  201. </NSpin>
  202. </NScrollbar>
  203. {/* 选择教材 */}
  204. <NModal
  205. v-model:show={forms.coursewareStatus}
  206. preset="card"
  207. showIcon={false}
  208. class={['modalTitle background', styles.coursewareModal]}
  209. title={'选择教材'}
  210. blockScroll={false}>
  211. <SelectLessonware
  212. onClose={() => (forms.coursewareStatus = false)}
  213. onConfirm={(item: any) => {
  214. prepareStore.setBaseCourseware(item);
  215. getLessonCoursewareDetail();
  216. setLastUseCoursewareId(item.id);
  217. }}
  218. />
  219. </NModal>
  220. </div>
  221. );
  222. }
  223. });