detail.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <ie-page>
  3. <ie-navbar :title="prevData.name" transparent bg-color="#FFFFFF" title-color="black" keep-title-color/>
  4. <ie-image :src="baseInfo.bannerUrl||baseInfo.logo" custom-class="w-full h-360"/>
  5. <view class="-mt-60 z-1 rounded-t-3xl p-30 bg-white">
  6. <college-info :info="baseInfo" :loading="loading"/>
  7. </view>
  8. <uv-gap height="10" bg-color="#F6F8FA"/>
  9. <uv-sticky :offset-top="appStore.isH5?0:baseStickyTop">
  10. <view :style="{height: tabHeight + 'px'}">
  11. <ie-tabs-swiper v-model="current" :list="tabs" :scrollable="false">
  12. <swiper class="swiper h-full" :current="current" @change="handleChangeSwiper">
  13. <swiper-item v-for="(item, index) in tabs" :key="index" class="h-full">
  14. <scroll-view scroll-y :style="{height: (tabHeight-44) + 'px'}">
  15. <college-profile v-if="item.slot==='profile'&&item.visited" :loading="loading"/>
  16. <college-brochure v-if="item.slot==='brochure'&&item.visited"/>
  17. <college-exam v-if="item.slot==='exam'&&item.visited"/>
  18. </scroll-view>
  19. <plan-enroll-list v-if="item.slot==='plan'&&item.visited" mode="plan" :list="planList"/>
  20. <plan-enroll-list v-if="item.slot==='enroll'&&item.visited" mode="enroll" :list="enrollList"/>
  21. </swiper-item>
  22. </swiper>
  23. </ie-tabs-swiper>
  24. </view>
  25. </uv-sticky>
  26. </ie-page>
  27. </template>
  28. <script lang="ts" setup>
  29. import {useTransferPage} from "@/hooks/useTransferPage";
  30. import {UniversityDetail, University} from "@/types/university";
  31. import {MajorItem} from "@/types/major";
  32. import {universityDetail} from "@/api/modules/university";
  33. import {getMajorTree} from "@/api/modules/major";
  34. import CollegeInfo from "@/pagesOther/pages/university/detail/components/college-info.vue";
  35. import {SwiperTabItem} from "@/types";
  36. import {useNavbar} from "@/hooks/useNavbar";
  37. import {useAppStore} from "@/store/appStore";
  38. import {MAJOR_TREE, UNIVERSITY_DETAIL} from "@/types/injectionSymbols";
  39. import CollegeProfile from "@/pagesOther/pages/university/detail/components/college-profile.vue";
  40. import CollegeBrochure from "@/pagesOther/pages/university/detail/components/college-brochure.vue";
  41. import CollegeExam from "@/pagesOther/pages/university/detail/components/college-exam.vue";
  42. import PlanEnrollList from "@/pagesOther/pages/university/detail/components/plan-enroll-list.vue";
  43. const {prevData} = useTransferPage()
  44. const {baseStickyTop} = useNavbar()
  45. const detail = ref<UniversityDetail>({} as UniversityDetail)
  46. const baseInfo = computed<University>(() => detail.value.baseInfo || {} as University)
  47. const planList = computed(() => detail.value.planHistories || [])
  48. const enrollList = computed(() => detail.value.enrollHistories || [])
  49. const majorTree = ref<MajorItem[]>([])
  50. const loading = ref(true)
  51. const appStore = useAppStore()
  52. const current = ref(0)
  53. const tabHeight = computed(() => appStore.sysInfo.screenHeight - baseStickyTop.value)
  54. const tabs = ref<SwiperTabItem[]>([{
  55. name: '概况',
  56. slot: 'profile',
  57. visited: true
  58. }, {
  59. name: '简章',
  60. slot: 'brochure',
  61. visited: false
  62. }, {
  63. name: '计划',
  64. slot: 'plan',
  65. visited: false
  66. }, {
  67. name: '录取',
  68. slot: 'enroll',
  69. visited: false
  70. }, {
  71. name: '考试大纲',
  72. slot: 'exam',
  73. visited: false
  74. }])
  75. const handleChangeSwiper = function (e: any) {
  76. current.value = e.detail.current
  77. tabs.value[current.value].visited = true
  78. }
  79. provide(UNIVERSITY_DETAIL, detail)
  80. provide(MAJOR_TREE, majorTree)
  81. onMounted(() => {
  82. uni.$ie.showLoading()
  83. loading.value = true
  84. universityDetail({code: prevData.value.code})
  85. .then(res => {
  86. detail.value = res.data
  87. return getMajorTree({})
  88. })
  89. .then(res => majorTree.value = res.data)
  90. .finally(() => {
  91. uni.$ie.hideLoading()
  92. loading.value = false
  93. })
  94. })
  95. // 必须手动触发才能保证 navbar.transparent 正常工作
  96. onPageScroll(() => {
  97. })
  98. </script>
  99. <style lang="scss" scoped>
  100. ::v-deep .uv-tabs__wrapper__nav__item__text {
  101. white-space: nowrap;
  102. }
  103. </style>