volunteer-4/src/pages-sub/home/expand/index.vue

253 lines
8.8 KiB
Vue

<route lang="json5" type="page">
{
style: {
navigationStyle: 'custom',
},
}
</route>
<template>
<z-paging
ref="paging"
use-virtual-list
:force-close-inner-list="true"
cell-height-mode="dynamic"
@virtualListChange="virtualListChange"
@query="queryList"
:auto-show-system-loading="true"
:safe-area-inset-bottom="true"
>
<template #top>
<view class="relative">
<Navbar
safeAreaInsetTop
bg-color="transparent"
:bordered="false"
left-arrow
title="查扩缩招"
@click-left="navigatorBack"
/>
<view class="custom-background h-[200rpx] w-full absolute top-0 left-0 z-[-1]"></view>
</view>
<drop-menu ref="dropMenuRef">
<drop-menu-item
:key="item.id"
:title="item.title"
custom-class="flex items-center"
v-for="item in subMenu"
:activation="item.activation"
>
<Region
:defaultValue="regionKeyInfo"
@changeName="handleRegionChange"
@change="handleRegionChangeCode"
class="custom-check-group"
v-if="item.id === 1"
/>
<Nature
:defaultValue="natureKeyInfo"
@changeName="handleNatureChange"
@change="handleNatureChangeCode"
class="custom-check-group"
v-if="item.id === 2"
/>
<UniType
:defaultValue="uniTypeKeyInfo"
@change-name="handleUniTypeChange"
@change="handleUniTypeChangeCode"
class="custom-check-group"
v-if="item.id === 3"
/>
<view class="flex items-center justify-between px-[16rpx] pb-[32rpx]">
<view class="cancel-btn" @click="handleClear">清空</view>
<view class="submit-btn" @click="handleCheck">查看</view>
</view>
</drop-menu-item>
</drop-menu>
<view class="px-32rpx">
<view class="flex items-center justify-between input-wrapper-class">
<input
v-model="searchParams.collegeName"
placeholder="请输入院校名称"
confirm-type="done"
input-mode="numeric"
class="flex-auto"
/>
<view class="text-[#1580FF] text-[24rpx] search-text" @click="handleConfirm">查询</view>
</view>
</view>
<view class="bg-[#F8F8F8] h-[16rpx] mt-[40rpx]"></view>
</template>
<view class="px-[32rpx] pt-[32rpx]">
<view
class="bg-[#F7F7F7] flex items-center justify-between text-[20rpx] text-[#333] px-[28rpx] py-[16rpx] sticky top-0"
>
<view class="flex-auto text-[24rpx] font-semibold">院校</view>
<view class="w-[96rpx] text-center px-[16rpx] text-[24rpx] font-semibold">招生专业</view>
<view class="w-[116rpx] text-center px-[16rpx] text-[24rpx] font-semibold">
{{ tModel.year }}计划
</view>
<view class="w-[86rpx] text-center pl-[16rpx] text-[24rpx] font-semibold">
较{{ tModel.year - 1 }}
</view>
</view>
<view
class="item-wrapper"
:id="`zp-id-${item.zp_index}`"
:key="item.zp_index"
v-for="(item, index) in lineList"
>
<view class="flex items-center justify-between text-[20rpx] text-[#333] py-[16rpx]">
<view class="flex-1 flex items-center">
<image :src="item.logo" mode="scaleToFill" class="w-[72rpx] h-[72rpx] mr-[6rpx]" />
<view class="ml-[6rpx]">
<view class="text-[32rpx] font-semibold truncate max-w-[200rpx]">
{{ item.name }}
</view>
<view class="mt-[6rpx] text-[22rpx]">
<text class="mr-[16rpx]">{{ item.provinceName }}</text>
<text>排名:{{ item.rank }}</text>
</view>
</view>
</view>
<view class="w-[96rpx] text-center px-[16rpx] text-[24rpx]">{{ item.planCount }}</view>
<view class="w-[116rpx] text-center px-[16rpx] text-[24rpx]">{{ item.newPlan }}人</view>
<view class="w-[86rpx] text-center pl-[16rpx] pr-[28rpx] text-[24rpx]">
<text v-if="item.newPlan - item.oldPlan === 0">相同</text>
<view v-else class="flex items-center justify-center gap-[10rpx]">
<text>{{ item.newPlan - item.oldPlan }}</text>
<image
v-if="item.newPlan - item.oldPlan < 0"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAARRJREFUSEu91EFOhDAYhuH370TXHGGOwMaEuNJM4jnKCYwnEE4yeAoTE0LcsZwb6BE8wFC1OBBGO6UmZboikPTJ9/Uvkj3rtbqkMUqK9nb7xEJLrmv9Bqzt/kaJXgqTrNZawXYIshQmFjgH1kPnwEboP9jVi05XkLZ3VRU6O0dQCGaRixUNkBgo2k1VhmB/IB82RcbhCcSckBMzlEpxb5MckI/hOSTZSciFTVLkXcduqLC/gzPJvJAzGeTt5mcIflfpw2ah6YYGHgZkSBeKBUFzU+XDslo/YniNAp2q0b5XUNCRR4Nc2NiEoYwKebAqOmTPpK/reMU7o8NVcCH203vURDeNTvZ7UhGS7pMUIUFI5ftv8gVvqo+bwdfwaAAAAABJRU5ErkJggg=="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
<image
v-if="item.newPlan - item.oldPlan > 0"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAATCAYAAACORR0GAAAAAXNSR0IArs4c6QAAATlJREFUSEu11eFNwzAQBeB3gQEyAIV2g67QDewJgBGYgHYCRmhH8AbABHSDRhSJvxmA5sEFtTKuk7jIza9EivP57l0SQcZjY8z0ApgSGAtwI0ApInpdSkYH78bcicjy6JnkOiukQAwj8Jod+rD29qd1K78qkqusUAxRsCEX2aAQIXmviGam58mQTtTEuXVseGLItXNt+zSzAkgbhq0xjxCZg5yPnFv4WB/i3zdY0QHZr/KwAKlB2pFzL7Gqe6EjxMNEpPKmqxZydtXR2jarrhc2QGoNtBB50rc+WDOIdEIhst/tpzHjncizhyUhUagL2VfhYeVQuzqHYQj5gwFlXyZhJIeMUpH/foRb6NxIm5GPEKgK0p7SktQKZWvtG35/VtWOnE2cq1IXn3KfbIwpL4ti+dU0D+dCdEPf+I3M1u2H9e8AAAAASUVORK5CYII="
mode="scaleToFill"
class="w-[16rpx] h-[16rpx]"
/>
</view>
</view>
</view>
</view>
</view>
</z-paging>
</template>
<script lang="ts" setup>
import Navbar from '@/pages-sub/components/navbar/Navbar.vue'
import { useUserStore } from '@/store'
import DropMenu from '@/pages-sub/components/drop-menu/DropMenu.vue'
import DropMenuItem from '@/pages-sub/components/drop-menu/DropMenuItem.vue'
import Region from '@/pages-sub/home/components/Region.vue'
import UniType from '@/pages-sub/home/components/UniType.vue'
import Nature from '@/pages-sub/home/components/Nature.vue'
import { getAdmissionTrends } from '@/service/index/api'
const userStore = useUserStore()
const searchParams = ref({
locationName: [],
type: [],
searchNature: [],
collegeName: '',
})
const handleConfirm = () => {
paging.value.reload()
}
const navigatorBack = () => {
uni.navigateBack()
}
const handleNatureChangeCode = (val) => {
natureKeyInfo.value = val
}
const handleUniTypeChangeCode = (val) => {
uniTypeKeyInfo.value = val
}
const handleRegionChangeCode = (val) => {
regionKeyInfo.value = val
}
const handleRegionChange = (val) => {
searchParams.value.locationName = val
subMenu.value[0].activation = val.length !== 0
}
const handleNatureChange = (val) => {
searchParams.value.searchNature = val
subMenu.value[1].activation = val.length !== 0
}
const handleUniTypeChange = (val) => {
searchParams.value.type = val
subMenu.value[2].activation = val.length !== 0
}
const lineList = ref([])
const tModel = ref({ year: 0 })
const paging = ref(null)
const queryList = (page: number, pageSize: number) => {
getAdmissionTrends({
pageIndex: page,
pageSize,
locationCode: userStore.userInfo.estimatedAchievement.provinceCode,
provinceName: searchParams.value.locationName,
utype: searchParams.value.type,
nature: searchParams.value.searchNature,
keyword: searchParams.value.collegeName,
}).then((res) => {
if (res.code === 200) {
paging.value.complete((res.result as { rows: any[] }).rows)
tModel.value.year = (res.result as { tModel: { year: number } }).tModel.year
} else {
paging.value.complete([])
}
})
}
const virtualListChange = (_vList) => {
lineList.value = _vList
}
const subMenu = ref([
{ id: 1, title: '省份', activation: false },
{ id: 2, title: '层次', activation: false },
{ id: 3, title: '类别', activation: false },
])
const dropMenuRef = ref()
const regionKeyInfo = ref([]) // 省份信息
const uniTypeKeyInfo = ref([]) // 层次信息
const natureKeyInfo = ref([]) // 类型信息
const handleClear = () => {
regionKeyInfo.value = []
uniTypeKeyInfo.value = []
natureKeyInfo.value = []
subMenu.value.forEach((item) => {
item.activation = false
})
dropMenuRef.value.closeDropMenu()
}
const handleCheck = () => {
dropMenuRef.value.closeDropMenu()
handleConfirm()
}
</script>
<style lang="scss" scoped>
@import '@/pages-sub/home/styles/navbar-background.scss';
@import '@/pages-sub/home/styles/search-input.scss';
@import '@/pages-sub/home/styles/grid-checkbox.scss';
@import '@/pages-sub/home/styles/picker-view-btn.scss';
</style>