knowledge-practice.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <ie-page>
  3. <z-paging ref="pagingRef" v-model="treeData" :loading-more-enabled="false" :auto="false" @query="loadKnowledgeList">
  4. <template #top>
  5. <ie-navbar :title="pageTitle" />
  6. <uv-tabs :list="subjectList" key-name="subjectName" @click="handleChangeTab" :scrollable="true"></uv-tabs>
  7. <view class="px-30 py-16 bg-back">
  8. <view class="flex items-center justify-end gap-x-4" @click="handleViewHistory">
  9. <uv-icon name="clock" size="16" color="#31A0FC"></uv-icon>
  10. <text class="text-28 text-primary">查看记录</text>
  11. <uv-icon name="arrow-right" size="16" color="#31A0FC"></uv-icon>
  12. </view>
  13. </view>
  14. </template>
  15. <view class="px-40">
  16. <knowledgeTree :tree-data="treeData" @start-practice="handleStartPractice" />
  17. </view>
  18. </z-paging>
  19. </ie-page>
  20. </template>
  21. <script lang="ts" setup>
  22. import IePage from '@/components/ie-page/ie-page.vue';
  23. import { useTransferPage } from '@/hooks/useTransferPage';
  24. import { getSubjectList, getKnowledgeList } from '@/api/modules/study';
  25. import knowledgeTree from '@/pagesStudy/components/knowledge-tree.vue';
  26. import { Study } from '@/types';
  27. import { EnumPaperType, EnumUserRole } from '@/common/enum';
  28. import { useUserStore } from '@/store/userStore';
  29. import { useAuth } from '@/hooks/useAuth';
  30. const { prevData, transferTo } = useTransferPage();
  31. const currentSubjectIndex = ref<number>(-1);
  32. const userStore = useUserStore();
  33. const pagingRef = ref<ZPagingInstance>();
  34. const { hasPermission } = useAuth();
  35. const pageTitle = computed(() => {
  36. const { isVHS, directed, questionType } = prevData.value;
  37. if (isVHS) {
  38. if (questionType === 0) {
  39. return '知识点练习';
  40. } else if (questionType === 2) {
  41. return '必刷题';
  42. }
  43. } else {
  44. if (directed) {
  45. return '定向刷题';
  46. } else {
  47. return '全量刷题';
  48. }
  49. }
  50. });
  51. const currentSubjectId = computed(() => {
  52. if (subjectList.value.length > 0 && currentSubjectIndex.value >= 0) {
  53. return subjectList.value[currentSubjectIndex.value].subjectId;
  54. }
  55. return null;
  56. });
  57. const subjectList = ref<Study.Subject[]>([]);
  58. const treeData = ref<Study.KnowledgeNode[]>([]);
  59. const handleChangeTab = (item: any) => {
  60. currentSubjectIndex.value = item.index;
  61. }
  62. const handleViewHistory = () => {
  63. transferTo('/pagesStudy/pages/knowledge-practice-history/knowledge-practice-history', {
  64. data: {
  65. directed: prevData.value.directed
  66. }
  67. });
  68. }
  69. const loadKnowledgeList = async () => {
  70. if (!currentSubjectId.value) {
  71. return;
  72. }
  73. try {
  74. uni.$ie.showLoading();
  75. const { data } = await getKnowledgeList({
  76. subjectId: currentSubjectId.value,
  77. directed: prevData.value.directed
  78. });
  79. treeData.value = data as Study.KnowledgeNode[];
  80. if (data.length) {
  81. pagingRef.value?.complete(data);
  82. } else {
  83. pagingRef.value?.complete(false);
  84. }
  85. } catch (error) {
  86. console.log(error);
  87. pagingRef.value?.complete(false);
  88. } finally {
  89. uni.$ie.hideLoading();
  90. }
  91. }
  92. const handleStartPractice = async (node: Study.KnowledgeNode) => {
  93. const hasAuth = hasPermission([EnumUserRole.VIP, EnumUserRole.AGENT, EnumUserRole.TEACHER]);
  94. if (hasAuth) {
  95. transferTo('/pagesStudy/pages/exam-start/exam-start', {
  96. data: {
  97. name: '知识点练习-' + node.name,
  98. paperType: EnumPaperType.PRACTICE,
  99. practiceInfo: {
  100. name: node.name,
  101. relateId: node.id,
  102. directed: prevData.value.directed
  103. },
  104. }
  105. });
  106. }
  107. }
  108. watch(() => currentSubjectIndex.value, () => {
  109. pagingRef.value?.reload();
  110. }, {
  111. immediate: false
  112. });
  113. const loadData = async () => {
  114. const { isVHS, directed, subjectType } = prevData.value;
  115. try {
  116. const params = {} as Study.SubjectListRequestDTO;
  117. if (isVHS) {
  118. params.subjectType = subjectType;
  119. } else {
  120. params.directed = !!directed;
  121. }
  122. const { data } = await getSubjectList(params);
  123. subjectList.value = data.map(item => ({ subjectId: item.subjectId, subjectName: item.subjectName }));
  124. currentSubjectIndex.value = 0;
  125. } catch (error) { }
  126. }
  127. onLoad(() => {
  128. loadData();
  129. });
  130. onShow(() => {
  131. nextTick(() => {
  132. if (subjectList.value.length > 0) {
  133. pagingRef.value?.refresh();
  134. }
  135. });
  136. });
  137. </script>
  138. <style></style>