detail.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <template>
  2. <view class="page-content h-screen">
  3. <mx-nav-bar :title="baseInfo.name"/>
  4. <college-item :item="baseInfo" hidden-star hidden-name :address-lines="0" @tag="handleDoublePopup">
  5. <template #right>
  6. <college-item-collect :college="baseInfo"/>
  7. </template>
  8. </college-item>
  9. <college-detail-summary :college="baseInfo" class="pb-20" @star="handleStarPopup"/>
  10. <uv-gap height="10"/>
  11. <mx-tabs-swiper :tabs="tabs" :tab-options="tabOptions" border class="bg-white">
  12. <template #概况>
  13. <view v-if="introduction" class="p-30 text-content text-sm tabs-swiper-content">
  14. <uv-parse :content="introduction"/>
  15. </view>
  16. <uv-empty v-else margin-top="100"/>
  17. </template>
  18. <template #简章>
  19. <view v-if="enrollRuleBrochures.length" class="tabs-swiper-content">
  20. <uv-cell-group :border="false">
  21. <college-detail-brochure-cell v-for="b in enrollRuleBrochures" :item="b" :detail="detail"/>
  22. </uv-cell-group>
  23. </view>
  24. <uv-empty v-else margin-top="100"/>
  25. </template>
  26. <template #考试大纲>
  27. <view v-if="enrollTimeBrochures.length" class="tabs-swiper-content">
  28. <uv-cell-group :border="false">
  29. <college-detail-brochure-cell v-for="b in enrollTimeBrochures" :item="b" :detail="detail"/>
  30. </uv-cell-group>
  31. </view>
  32. <uv-empty v-else margin-top="100"/>
  33. </template>
  34. <template #计划>
  35. <plan-enroll-list v-if="planHistories.length" :list="planHistories" mode="plan"
  36. @rule="handleRulePopup"/>
  37. <uv-empty v-else margin-top="100"/>
  38. </template>
  39. <template #录取>
  40. <plan-enroll-list v-if="enrollHistories.length" :list="enrollHistories" mode="enroll"
  41. @rule="handleRulePopup"/>
  42. <uv-empty v-else margin-top="100"/>
  43. </template>
  44. </mx-tabs-swiper>
  45. <mx-popup-template ref="popup" v-bind="popupBinding"/>
  46. </view>
  47. </template>
  48. <script setup>
  49. import {ref, computed, onMounted, watch} from 'vue';
  50. import mxConfig from "@/common/mxConfig";
  51. import mxConst from "@/common/mxConst";
  52. import {object} from "@/uni_modules/uv-ui-tools/libs/function/test";
  53. import {useTransfer} from "@/hooks/useTransfer";
  54. import {useUserStore} from "@/hooks/useUserStore";
  55. import {useCacheStore} from "@/hooks/useCacheStore";
  56. import {universityDetail} from "@/api/webApi/collegemajor";
  57. import CollegeItem from "@/pages/college-library/components/college-item.vue";
  58. import CollegeItemCollect from "@/pages/college-library/components/college-item-collect.vue";
  59. import CollegeDetailSummary from "@/pages/college-library/components/college-detail-summary.vue";
  60. import CollegeDetailBrochureCell from "@/pages/college-library/components/college-detail-brochureCell.vue";
  61. import PlanEnrollList from "@/pages/college-library/components/plan-enroll-list.vue";
  62. const {prevData} = useTransfer()
  63. const {isCultural} = useUserStore()
  64. const {dispatchCache} = useCacheStore()
  65. const detail = ref({})
  66. const baseInfo = computed(() => detail.value.baseInfo || {})
  67. const planHistories = computed(() => detail.value.planHistories || [])
  68. const enrollHistories = computed(() => detail.value.enrollHistories || [])
  69. const tabs = ref([]) // NOTE: tabs申明为响应式的情况下,tabs切换才能保证缓存平滑响应,否则内部.show=true时不会触发重新渲染
  70. const tabOptions = {
  71. scrollable: false,
  72. inactiveStyle: {color: 'var(--main-color)', fontWeight: 500},
  73. activeStyle: {color: 'var(--primary-color)', fontWeight: 500}
  74. }
  75. watch(isCultural, (val) => {
  76. tabs.value = val
  77. ? [{name: '概况'}, {name: '简章'}, {name: '计划'}, {name: '录取'}]
  78. : [{name: '概况'}, {name: '简章'}, {name: '计划'}, {name: '录取'}, {name: '考试大纲'}]
  79. }, {immediate: true})
  80. const enumBrochureType = mxConst.enum.brochureType
  81. const enrollBrochures = computed(() => detail.value?.enrollBrochures || [])
  82. const renderedTypes = computed(() => [enumBrochureType.introduction, enumBrochureType.enrollRule, enumBrochureType.examTime])
  83. const enrollIntroBrochure = computed(() => enrollBrochures.value.find(b => b.type == enumBrochureType.introduction))
  84. const enrollRuleBrochures = computed(() => enrollBrochures.value.filter(b => b.type == enumBrochureType.enrollRule))
  85. const enrollTimeBrochures = computed(() => enrollBrochures.value.filter(b => b.type == enumBrochureType.examTime))
  86. const enrollOtherBrochures = computed(() => enrollBrochures.value.filter(b => !renderedTypes.value.includes(b.type)))
  87. const introduction = computed(() => enrollIntroBrochure.value?.content || baseInfo.value.introduction)
  88. const popup = ref(null)
  89. const popupType = ref('')
  90. const popupConfig = mxConfig.collegeDetailPopups
  91. const popupBinding = computed(() => {
  92. let cfg = popupConfig[popupType.value]
  93. if (!cfg && object(popupType.value)) cfg = popupType.value
  94. return {
  95. ...cfg,
  96. left: '',
  97. right: '我知道了',
  98. onRight: () => popup.value.close()
  99. }
  100. })
  101. const handleDoublePopup = () => {
  102. popupType.value = 'double'
  103. popup.value.open()
  104. }
  105. const handleStarPopup = () => {
  106. popupType.value = 'star'
  107. popup.value.open()
  108. }
  109. const handleMajorPopup = () => {
  110. popupType.value = 'major'
  111. popup.value.open()
  112. }
  113. const handleRulePopup = (rule) => {
  114. popupType.value = {title: '录取规则', content: rule || '暂无录取规则'}
  115. popup.value.open()
  116. }
  117. onMounted(async () => {
  118. const payload = {code: prevData.value.code}
  119. const res = await dispatchCache(universityDetail, payload)
  120. detail.value = res.data
  121. })
  122. </script>
  123. <style lang="scss">
  124. </style>