knowledge-practice.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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 * as Study from '@/types/study';
  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();
  34. const { hasPermission } = useAuth();
  35. const pageTitle = computed(() => {
  36. if (prevData.value.directed) {
  37. return '定向刷题';
  38. }
  39. return '全量刷题';
  40. });
  41. const currentSubjectId = computed(() => {
  42. if (subjectList.value.length > 0 && currentSubjectIndex.value >= 0) {
  43. return subjectList.value[currentSubjectIndex.value].subjectId;
  44. }
  45. return null;
  46. });
  47. const subjectList = ref<Study.Subject[]>([]);
  48. const treeData = ref<Study.KnowledgeNode[]>([]);
  49. const handleChangeTab = (item: any) => {
  50. currentSubjectIndex.value = item.index;
  51. }
  52. const handleViewHistory = () => {
  53. transferTo('/pagesStudy/pages/knowledge-practice-history/knowledge-practice-history', {
  54. data: {
  55. directed: prevData.value.directed
  56. }
  57. });
  58. }
  59. const loadKnowledgeList = async () => {
  60. if (!currentSubjectId.value) {
  61. return;
  62. }
  63. try {
  64. uni.$ie.showLoading();
  65. const { data } = await getKnowledgeList({
  66. subjectId: currentSubjectId.value,
  67. directed: prevData.value.directed
  68. });
  69. treeData.value = data as Study.KnowledgeNode[];
  70. pagingRef.value.complete(data, data.length);
  71. } catch (error) {
  72. console.log(error);
  73. pagingRef.value.complete(false);
  74. } finally {
  75. uni.$ie.hideLoading();
  76. }
  77. }
  78. const handleStartPractice = async (node: Study.KnowledgeNode) => {
  79. const hasAuth = hasPermission([EnumUserRole.VIP, EnumUserRole.AGENT, EnumUserRole.TEACHER]);
  80. if (hasAuth) {
  81. transferTo('/pagesStudy/pages/exam-start/exam-start', {
  82. data: {
  83. name: '知识点练习-' + node.name,
  84. paperType: EnumPaperType.PRACTICE,
  85. practiceInfo: {
  86. name: node.name,
  87. relateId: node.id,
  88. directed: prevData.value.directed
  89. },
  90. }
  91. });
  92. }
  93. }
  94. watch(() => currentSubjectIndex.value, () => {
  95. pagingRef.value.reload();
  96. }, {
  97. immediate: false
  98. });
  99. const loadData = async () => {
  100. try {
  101. const { data } = await getSubjectList({
  102. directed: !!prevData.value.directed
  103. });
  104. subjectList.value = data.map(item => ({ subjectId: item.subjectId, subjectName: item.subjectName }));
  105. currentSubjectIndex.value = 0;
  106. } catch (error) { }
  107. }
  108. onLoad(() => {
  109. loadData();
  110. });
  111. onShow(() => {
  112. nextTick(() => {
  113. if (subjectList.value.length > 0) {
  114. pagingRef.value.refresh();
  115. }
  116. });
  117. });
  118. </script>
  119. <style></style>