Parcourir la source

university detail - plan

abpcoder il y a 15 heures
Parent
commit
b496cc27c0

+ 47 - 8
src/pagesOther/pages/university/detail/components/plan-enroll-list.vue

@@ -47,9 +47,15 @@
                                                     :value="item[d.prop]" :title-only="d.titleOnly"
                                                     @click="handleRuleClick(d, item)"/>
                         </view>
-                        <view v-if="mode=='plan'" class="mt-20 flex justify-between items-center">
-                            <ie-button>加入志愿表</ie-button>
-                            <ie-button>测录取概率</ie-button>
+                        <view v-if="mode=='plan'" class="mt-20 flex justify-between items-center gap-30">
+                            <view class="h-80 flex-1 border border-solid border-primary rounded-full text-primary
+                            text-30 flex justify-center items-center" @click="handleAddVoluntary(item)">
+                                加入志愿表
+                            </view>
+                            <view class="h-80 flex-1 bg-gradient-to-r from-primary-500 to-primary rounded-full text-white
+                            text-30 flex justify-center items-center" @click="handleRateVoluntary(item)">
+                                测录取概率
+                            </view>
                         </view>
                     </view>
                 </view>
@@ -60,8 +66,13 @@
 
 <script setup lang="ts">
 import _ from 'lodash';
-import {HistoryMode, IPlanEnrollDescriptor, IPlanEnrollHistory} from "@/types/university";
+import {HistoryMode, IPlanEnrollDescriptor, IPlanEnrollHistory, University, UniversityDetail} from "@/types/university";
 import PlanEnrollDescriptor from "@/pagesOther/pages/university/detail/components/plus/plan-enroll-descriptor.vue";
+import {UNIVERSITY_DETAIL} from "@/types/injectionSymbols";
+import {addVoluntary} from "@/api/modules/voluntary";
+import {SelectedUniversityMajor} from "@/types/voluntary";
+import {useTransferPage} from "@/hooks/useTransferPage";
+import {routes} from "@/common/routes";
 
 
 const props = withDefaults(defineProps<{
@@ -73,6 +84,9 @@ const props = withDefaults(defineProps<{
 })
 const emits = defineEmits(['rule'])
 
+const {transferTo} = useTransferPage()
+const detail = inject(UNIVERSITY_DETAIL, ref({} as UniversityDetail))
+const baseInfo = computed<University>(() => detail.value.baseInfo)
 const paging = ref<ZPagingInstance>()
 const isCultural = ref(false) // 河南文化类遗留结构
 const tag = computed(() => isCultural.value && '') // examMajorName 河南文化类遗留结构
@@ -117,6 +131,7 @@ const handleGroupChange = () => {
 }
 
 const handleQuery = () => {
+    // console.log('plan enroll list: query', props.mode, queryParams.value)
     // 到这里时listOfLevel应该已经动态计算完毕了
     // onSearch, results结构都是多余的,这里只是为了实验z-paging的虚拟列表
     paging.value?.completeByNoMore(listOfGroup.value, true)
@@ -126,8 +141,30 @@ const handleRuleClick = (descriptor: IPlanEnrollDescriptor, history: IPlanEnroll
     if (descriptor.titleOnly) emits('rule', history.totalRule)
 }
 
-watch(props.list, async (list) => {
-    console.log('plan enroll list: watch', list)
+const handleAddVoluntary = async (item: IPlanEnrollHistory) => {
+    const {code} = baseInfo.value
+    const {majorCode} = item
+    if (!majorCode) return uni.$ie.showError('缺少专业编码')
+    await addVoluntary({universityId: code, majorId: majorCode})
+}
+
+const handleRateVoluntary = (item: IPlanEnrollHistory) => {
+    if (!item.majorCode) return uni.$ie.showError('缺少专业编码')
+    const selected: SelectedUniversityMajor = {
+        universityId: baseInfo.value.code,
+        universityLogo: baseInfo.value.logo,
+        universityName: baseInfo.value.name,
+        majorId: item.majorCode,
+        majorName: item.majorName,
+        majorGroup: item.majorGroup,
+        majorAncestors: '', // 测算部分这个字段不重要
+        info: baseInfo.value
+    }
+    transferTo(routes.voluntaryIndex, {bigData: {selected}})
+}
+
+watch(() => props.list, async (list) => {
+    // console.log('plan enroll list: watch', props.mode, list)
     if (list.length) {
         queryParams.value.year = years.value[0].value
         queryParams.value.level = levels.value[0].value
@@ -137,6 +174,8 @@ watch(props.list, async (list) => {
 }, {immediate: true})
 </script>
 
-<style scoped>
-
+<style scoped lang="scss">
+::v-deep .uv-button-wrapper {
+    flex: 1
+}
 </style>

+ 26 - 33
src/pagesOther/pages/university/detail/detail.vue

@@ -8,27 +8,22 @@
         <uv-gap height="10" bg-color="#F6F8FA"/>
         <uv-sticky :offset-top="appStore.isH5 ? 0 : baseStickyTop">
             <view :style="{ height: tabHeight + 'px' }">
-                <ie-tabs-swiper v-model="current" :list="tabs" :scrollable="false">
-                    <!-- #ifdef WEB -->
-                    <template v-for="item in tabs" #[item.slot]>
-                        <college-profile v-if="item.slot === 'profile' && item.visited" :loading="loading"/>
-                        <college-brochure v-if="item.slot === 'brochure' && item.visited"/>
-                        <plan-enroll-list v-if="item.slot === 'plan' && item.visited" mode="plan" :list="planList"/>
-                        <plan-enroll-list v-if="item.slot === 'plan' && item.visited" mode="enroll" :list="enrollList"/>
-                        <college-exam v-if="item.slot === 'enroll' && item.visited"/>
+                <ie-tabs-swiper v-model="current" :cache-count="1" :list="tabs" :scrollable="false">
+                    <template #profile>
+                        <college-profile :loading="loading"/>
+                    </template>
+                    <template #brochure>
+                        <college-brochure />
+                    </template>
+                    <template #plan>
+                        <plan-enroll-list mode="plan" :list="planList" @rule="handleRulePopup"/>
+                    </template>
+                    <template #enroll>
+                        <plan-enroll-list mode="enroll" :list="enrollList" @rule="handleRulePopup"/>
+                    </template>
+                    <template #exam>
+                        <college-exam/>
                     </template>
-                    <!-- #endif -->
-                    <!-- #ifdef MP-WEIXIN -->
-                    <block v-for="item in tabs">
-                        <template #[item.slot]>
-                            <college-profile v-if="item.slot === 'profile' && item.visited" :loading="loading"/>
-                            <college-brochure v-if="item.slot === 'brochure' && item.visited"/>
-                            <plan-enroll-list v-if="item.slot === 'plan' && item.visited" mode="plan" :list="planList"/>
-                            <plan-enroll-list v-if="item.slot === 'plan' && item.visited" mode="enroll" :list="enrollList"/>
-                            <college-exam v-if="item.slot === 'exam' && item.visited"/>
-                        </template>
-                    </block>
-                    <!-- #endif -->
                 </ie-tabs-swiper>
             </view>
         </uv-sticky>
@@ -65,29 +60,27 @@ const current = ref(0)
 const tabHeight = computed(() => appStore.sysInfo.screenHeight - baseStickyTop.value)
 const tabs = ref<SwiperTabItem[]>([{
     name: '概况',
-    slot: 'profile',
-    visited: true
+    slot: 'profile'
 }, {
     name: '简章',
-    slot: 'brochure',
-    visited: false
+    slot: 'brochure'
 }, {
     name: '计划',
-    slot: 'plan',
-    visited: false
+    slot: 'plan'
 }, {
     name: '录取',
-    slot: 'enroll',
-    visited: false
+    slot: 'enroll'
 }, {
     name: '考试大纲',
-    slot: 'exam',
-    visited: false
+    slot: 'exam'
 }])
 
-const handleChangeSwiper = function (e: any) {
-    current.value = e.detail.current
-    tabs.value[current.value].visited = true
+const handleRulePopup = (rule: string) => {
+    uni.$ie.showConfirm({
+        title: '录取规则',
+        content: rule || '暂无录取规则',
+        showCancel: false
+    })
 }
 
 provide(UNIVERSITY_DETAIL, detail)

+ 13 - 3
src/pagesOther/pages/voluntary/index/index.vue

@@ -41,7 +41,7 @@ const form = ref<InstanceType<typeof VoluntaryForm>>()
 const target = ref<SelectedUniversityMajor>({} as SelectedUniversityMajor)
 const rules = ref<EnrollRule[]>([])
 const model = ref<VoluntaryModel>({})
-const {transferTo} = useTransferPage()
+const {prevData, transferTo} = useTransferPage()
 
 const handleSelect = async () => {
     const option: UniversityPickerPageOptions = {
@@ -52,7 +52,11 @@ const handleSelect = async () => {
     }
     const picked = await transferTo(routes.targetPicker, {data: option})
     if (!picked) return
-    target.value = picked as SelectedUniversityMajor
+    await processSelected(picked as SelectedUniversityMajor)
+}
+
+const processSelected = async (picked: SelectedUniversityMajor) => {
+    target.value = picked
     uni.$ie.showLoading()
     try {
         // reset
@@ -79,7 +83,7 @@ const handleSelect = async () => {
 }
 
 const handleSubmit = async () => {
-    if (!target.value.universityId||!target.value.majorId) return uni.$ie.showToast('请选择院校专业')
+    if (!target.value.universityId || !target.value.majorId) return uni.$ie.showToast('请选择院校专业')
     if (!rules.value.length) return uni.$ie.showToast('由于官方未公布历年录取分数或计划变更,暂时无法计算录取概率')
     await form.value?.validate()
     // make request
@@ -92,6 +96,12 @@ provide(VOLUNTARY_TARGET, target)
 provide(VOLUNTARY_RULES, rules)
 provide(VOLUNTARY_MODEL, model)
 
+onLoad(() => {
+    if (prevData.value.selected) {
+        processSelected(prevData.value.selected as SelectedUniversityMajor)
+    }
+})
+
 // 为了让子组件触发页面滚动
 onPageScroll(() => {
 })