feat: 扩缩招接口对接

master
xjs 2025-03-21 14:09:16 +08:00
parent 6078950093
commit e20ecf787a
10 changed files with 475 additions and 157 deletions

View File

@ -1,7 +1,10 @@
<template> <template>
<Overlay :show="show"> <Overlay :show="show">
<view class="w-[90%] bg-white wrapper flex flex-col rounded-[16rpx]"> <view class="bg-white wrapper flex flex-col rounded-[16rpx]" :style="{ width: defaultWidth }">
<view class="relative flex items-center w-full justify-center py-[26rpx] title"> <view
class="relative flex items-center w-full justify-center py-[26rpx] title"
v-show="title"
>
<text class="text-[36rpx] text-[#303030] font-bold text-center"> <text class="text-[36rpx] text-[#303030] font-bold text-center">
{{ title }} {{ title }}
</text> </text>
@ -9,9 +12,13 @@
<view <view
class="i-carbon-close absolute right-[40rpx] text-[40rpx]" class="i-carbon-close absolute right-[40rpx] text-[40rpx]"
@click="emits('update:show', false)" @click="emits('update:show', false)"
v-if="showClose"
></view> ></view>
</view> </view>
<view class="min-h-[200rpx] h-max-content overflow-y-auto px-[32rpx]"> <view
class="min-h-[200rpx] h-max-content overflow-y-auto"
:class="{ 'px-[32rpx]': defaultPadding }"
>
<slot></slot> <slot></slot>
</view> </view>
</view> </view>
@ -30,6 +37,18 @@ defineProps({
type: String, type: String,
default: '提示', default: '提示',
}, },
showClose: {
type: Boolean,
default: true,
},
defaultPadding: {
type: Boolean,
default: true,
},
defaultWidth: {
type: String,
default: '90%',
},
}) })
const emits = defineEmits(['update:show']) const emits = defineEmits(['update:show'])

View File

@ -1,13 +1,6 @@
<template> <template>
<view class="flex flex-col pt-[32rpx] px-[32rpx] bg-[#fff]"> <view class="flex flex-col pt-[32rpx] px-[32rpx] bg-[#fff]">
<view class="flex flex-wrap justify-between items-center"> <view class="flex flex-wrap justify-between items-center">
<view
@click="handleShow(1)"
class="px-[24rpx] py-[8rpx] bg-[#f8f8f8] rounded-[8rpx] flex justify-between items-center text-[24rpx]"
>
{{ year }}
<view class="i-carbon-chevron-down"></view>
</view>
<view <view
@click="handleShow(2)" @click="handleShow(2)"
class="px-[24rpx] py-[8rpx] bg-[#f8f8f8] rounded-[8rpx] flex justify-between items-center text-[24rpx]" class="px-[24rpx] py-[8rpx] bg-[#f8f8f8] rounded-[8rpx] flex justify-between items-center text-[24rpx]"
@ -18,14 +11,30 @@
</view> </view>
<scroll-view class="mt-[38rpx] flex-1 pb-safe"> <scroll-view class="mt-[38rpx] flex-1 pb-safe">
<WXXTable :data="tableData"> <view
<WXXTableCol prop="years" label="年份" width="10%"></WXXTableCol> class="bg-[#F7F7F7] flex items-center justify-between text-[20rpx] text-[#333] sticky top-0 th-border"
<WXXTableCol prop="batchName" label="院校/批次" width="19%"></WXXTableCol> >
<WXXTableCol prop="selectsubject" label="选考要求" width="16%"></WXXTableCol> <view class="px-[20rpx] w-[40rpx] td">代码</view>
<WXXTableCol prop="plancount" label="录取数" width="13%"></WXXTableCol> <view class="flex-auto px-[25rpx] td">院校/专业名称</view>
<WXXTableCol prop="lowscore" label="分数" width="24%"></WXXTableCol> <view class="w-[88rpx] text-center px-[22rpx] td">{{ year }}招生</view>
<WXXTableCol prop="lowscorerank" label="最低位次" width="18%"></WXXTableCol> <view class="w-[88rpx] text-center px-[22rpx] td">{{ +year - 1 }}招生</view>
</WXXTable> </view>
<view
class="item-wrapper flex items-center justify-between tbody-custom"
:key="index"
v-for="(item, index) in tableData"
>
<view class="px-[20rpx] w-[40rpx] td">{{ item.majorCode }}</view>
<view class="flex-1 p-[24rpx] td max-w-[400rpx]">
<view class="text-[22rpx] font-bold text-[#333]">{{ item.majorName }}</view>
<view class="text-[20rpx] text-[#636363]">
定向生录取分数要求按我校招生章程执行,可在统招线下20分内优录取:{{ item.selectsubject }}
</view>
</view>
<view class="w-[88rpx] text-center px-[22rpx] td">{{ item.newPlan }}</view>
<view class="w-[88rpx] text-center px-[22rpx] td">{{ item.oldPlan }}</view>
</view>
</scroll-view> </scroll-view>
<ActionSheet v-model:show="show" title=""> <ActionSheet v-model:show="show" title="">
@ -38,7 +47,7 @@
v-show="pickType === 2" v-show="pickType === 2"
@change="handleRegionChange" @change="handleRegionChange"
@change-name="handleRegionChangeName" @change-name="handleRegionChangeName"
:defaultValue="[provinceCode]" :defaultValue="provinceCode"
:max="1" :max="1"
/> />
</view> </view>
@ -51,9 +60,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import WXXTable from '@/pages-sub/components/table/Table.vue' import { getAdmissionTrendsByCollege } from '@/service/index/api'
import WXXTableCol from '@/pages-sub/components/table/TableCol.vue'
import { getPlanProList } from '@/service/index/api'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import Region from '@/pages-sub/home/components/Region.vue' import Region from '@/pages-sub/home/components/Region.vue'
import CustomPickerView from '@/pages-sub/components/CustomPickerView.vue' import CustomPickerView from '@/pages-sub/components/CustomPickerView.vue'
@ -69,10 +76,9 @@ const props = defineProps({
const userStore = useUserStore() const userStore = useUserStore()
const provinceName = ref(userStore.userInfo.city.provincename) const provinceName = ref(userStore.userInfo.city.provincename)
const provinceCode = userStore.userInfo.city.code const provinceCode = ref([userStore.userInfo.city.code])
const year = ref('') const year = ref(0)
const yearList = ref([])
const pickList = ref([]) const pickList = ref([])
const pickValue = ref('') const pickValue = ref('')
@ -80,7 +86,6 @@ let pickType = 1
const tableData = ref([]) const tableData = ref([])
let isFirst = true
watch( watch(
() => props.id, () => props.id,
(newVal) => { (newVal) => {
@ -93,42 +98,34 @@ const handleShow = (type: number) => {
show.value = true show.value = true
pickType = type pickType = type
if (type === 1) { if (type === 2) {
pickList.value = yearList.value
pickValue.value = year.value
} else if (type === 2) {
pickList.value = [] pickList.value = []
} }
} }
const getPlanProListData = async (newVal) => { const getPlanProListData = async (newVal) => {
getPlanProList({ getAdmissionTrendsByCollege({
years: year.value === '全部年份' ? '' : year.value, year: year.value,
_uid: newVal, uid: newVal,
batchName: '', locationCode: provinceCode.value[0],
locationCode: userStore.userInfo.estimatedAchievement.provinceCode,
}).then((resp) => { }).then((resp) => {
if (resp.code === 200) { if (resp.code === 200) {
const _res = resp.result as { const _res = resp.result as {
batches: { batchName: string }[] items: { batchName: string }[]
yearsDtos: string[] year: number
plans: any[]
} }
yearList.value = ['全部年份', ..._res.yearsDtos]
// tableData.value = _res.plans tableData.value = _res.items
if (_res.year !== year.value) {
if (isFirst) { year.value = _res.year
year.value = yearList.value[0] // getPlanProListData(props.id)
} }
isFirst = false
} }
}) })
} }
const handleConfirm = () => { const handleConfirm = () => {
if (pickType === 1) { if (pickType === 1) {
year.value = pickValue.value
} else if (pickType === 2) { } else if (pickType === 2) {
} }
show.value = false show.value = false
@ -136,14 +133,43 @@ const handleConfirm = () => {
} }
const handleRegionChange = (val) => { const handleRegionChange = (val) => {
console.log(val) provinceCode.value = val
getPlanProListData(props.id)
} }
const handleRegionChangeName = (val) => { const handleRegionChangeName = (val) => {
console.log(val)
provinceName.value = val.join(',') provinceName.value = val.join(',')
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '@/pages-sub/home/styles/picker-view-btn.scss'; @import '@/pages-sub/home/styles/picker-view-btn.scss';
.th-border {
border: 2rpx solid #eeeeee;
.td:not(:last-child) {
border-right: 2rpx solid #eeeeee;
}
.td {
padding-top: 16rpx;
padding-bottom: 16rpx;
}
}
.tbody-custom {
border-left: 2rpx solid #eee;
border-right: 2rpx solid #eee;
border-bottom: 2rpx solid #eee;
align-items: stretch;
.td:not(:last-child) {
border-right: 2rpx solid #eeeeee;
}
.td {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
}
</style> </style>

View File

@ -7,70 +7,116 @@
</route> </route>
<template> <template>
<view class="flex flex-col h-screen"> <z-paging
<view class="relative"> ref="paging"
<Navbar use-virtual-list
safeAreaInsetTop :force-close-inner-list="true"
bg-color="transparent" cell-height-mode="dynamic"
:bordered="false" @virtualListChange="virtualListChange"
left-arrow @query="queryList"
title="查扩缩招" :auto-show-system-loading="true"
@click-left="navigatorBack" >
/> <template #top>
<view class="custom-background h-[200rpx] w-full absolute top-0 left-0 z-[-1]"></view> <view class="relative">
</view> <Navbar
<drop-menu> safeAreaInsetTop
<drop-menu-item bg-color="transparent"
:key="1" :bordered="false"
:title="searchParams.locationName || '省份'" left-arrow
custom-class="flex items-center" title="查扩缩招"
> @click-left="navigatorBack"
<view class="pl-[32rpx] pb-[32rpx]">
<Region
:defaultValue="searchParams.locationCode ? [searchParams.locationCode] : []"
:max="1"
@changeName="handleRegionChange"
@change="handleRegionChangeCode"
/>
</view>
</drop-menu-item>
<drop-menu-item
:key="2"
:title="searchParams.searchNature || '层次'"
custom-class="flex items-center"
>
<view class="pl-[32rpx] pb-[32rpx]">
<Nature @changeName="handleNatureChange" />
</view>
</drop-menu-item>
<drop-menu-item :key="3" title="类别" custom-class="flex items-center">
<view class="pl-[32rpx] pb-[32rpx]">
<UniType
@change="handleUniTypeChange"
:max="1"
:default-value="searchParams.type ? [searchParams.type] : []"
/>
</view>
</drop-menu-item>
</drop-menu>
<view class="px-32rpx">
<view class="flex items-center justify-between input-wrapper-class">
<input
v-model="searchParams.Score"
type="number"
placeholder="请输入你的高考分数"
confirm-type="done"
input-mode="numeric"
class="flex-auto"
/> />
<view class="text-[#1580FF] text-[24rpx] search-text" @click="handleConfirm"></view> <view class="custom-background h-[200rpx] w-full absolute top-0 left-0 z-[-1]"></view>
</view> </view>
<view class="text-[#636363] text-[20rpx] mt-[24rpx]">分数范围{{ betweenScores }}</view> <drop-menu>
</view> <drop-menu-item :key="1" :title="'省份'" custom-class="flex items-center">
<view class="pl-[32rpx] pb-[32rpx]">
<Region
:defaultValue="searchParams.locationCode"
@changeName="handleRegionChange"
@change="handleRegionChangeCode"
/>
</view>
</drop-menu-item>
<drop-menu-item :key="2" :title="'层次'" custom-class="flex items-center">
<view class="pl-[32rpx] pb-[32rpx]">
<Nature @changeName="handleNatureChange" />
</view>
</drop-menu-item>
<drop-menu-item :key="3" title="类别" custom-class="flex items-center">
<view class="pl-[32rpx] pb-[32rpx]">
<UniType @change-name="handleUniTypeChange" />
</view>
</drop-menu-item>
</drop-menu>
<view class="bg-[#F8F8F8] h-[16rpx] mt-[40rpx]"></view> <view class="px-32rpx">
</view> <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">院校</view>
<view class="w-[80rpx] text-center px-[25rpx]">招生专业</view>
<view class="w-[86rpx] text-center px-[25rpx]">{{ tModel.year }}计划</view>
<view class="w-[66rpx] text-center pl-[25rpx]">{{ 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">
{{ 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-[80rpx] text-center px-[25rpx]">{{ item.planCount }}</view>
<view class="w-[86rpx] text-center px-[25rpx]">{{ item.newPlan }}</view>
<view class="w-[66rpx] text-center pl-[25rpx] pr-[28rpx]">
<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> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -82,81 +128,69 @@ import Region from '@/pages-sub/home/components/Region.vue'
import UniType from '@/pages-sub/home/components/UniType.vue' import UniType from '@/pages-sub/home/components/UniType.vue'
import Nature from '@/pages-sub/home/components/Nature.vue' import Nature from '@/pages-sub/home/components/Nature.vue'
import { getBatchList } from '@/service/index/api' import { getAdmissionTrends } from '@/service/index/api'
const userStore = useUserStore() const userStore = useUserStore()
const searchParams = ref({ const searchParams = ref({
locationCode: userStore.userInfo.estimatedAchievement.provinceCode || '370000', locationCode: [userStore.userInfo.estimatedAchievement.provinceCode || '370000'],
locationName: userStore.userInfo.estimatedAchievement.provinceName || '山东省', locationName: [userStore.userInfo.estimatedAchievement.provinceName || '山东省'],
type: '', type: [],
searchNature: '', searchNature: [],
Score: '', collegeName: '',
}) })
const handleConfirm = () => { const handleConfirm = () => {
getBatchListData() paging.value.reload()
} }
const betweenScores = ref('')
const checkYearList = ref([])
const navigatorBack = () => { const navigatorBack = () => {
uni.navigateBack() uni.navigateBack()
} }
const handleRegionChange = (val) => { const handleRegionChange = (val) => {
searchParams.value.locationName = val.join(',') searchParams.value.locationName = val
} }
const handleRegionChangeCode = (val) => { const handleRegionChangeCode = (val) => {
searchParams.value.locationCode = val[0] searchParams.value.locationCode = val
getBatchListData() paging.value.reload()
} }
const handleUniTypeChange = (val) => { const handleUniTypeChange = (val) => {
searchParams.value.type = val[0] searchParams.value.type = val
getBatchListData() paging.value.reload()
} }
const handleNatureChange = (val) => {} const handleNatureChange = (val) => {
searchParams.value.searchNature = val
type LineItem = { paging.value.reload()
batch_id: number
batch_name: string
province_code: number
province_name: string
score: string
subject_id: number
subject_name: string
year: number
} }
const lineList = ref<LineItem[]>([]) const lineList = ref([])
const tModel = ref({ year: 0 })
const getBatchListData = () => { const paging = ref(null)
getBatchList({ const queryList = (page: number, pageSize: number) => {
locationCode: searchParams.value.locationCode, getAdmissionTrends({
year: '', pageIndex: page,
type: searchParams.value.type, pageSize,
}).then((resp) => { locationCode: userStore.userInfo.estimatedAchievement.provinceCode,
if (resp.code === 200 && resp.result !== '暂无数据') { provinceName: searchParams.value.locationName,
const _result = resp.result as { utype: searchParams.value.type,
configList: { yearList: { year: string; check: boolean }[] } nature: searchParams.value.searchNature,
list: LineItem[] keyword: searchParams.value.collegeName,
} }).then((res) => {
checkYearList.value = _result.configList.yearList if (res.code === 200) {
paging.value.complete((res.result as { rows: any[] }).rows)
lineList.value = _result.list tModel.value.year = (res.result as { tModel: { year: number } }).tModel.year
} else if (resp.code === 200 && resp.result === '暂无数据') { } else {
lineList.value = [] paging.value.complete([])
} }
}) })
} }
const virtualListChange = (_vList) => {
onBeforeMount(() => { lineList.value = _vList
getBatchListData() }
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 B

File diff suppressed because one or more lines are too long

View File

@ -256,6 +256,13 @@
"navigationBarTitleText": "当前志愿表" "navigationBarTitleText": "当前志愿表"
} }
}, },
{
"path": "ucenter/active/activePage",
"type": "page",
"style": {
"navigationStyle": "custom"
}
},
{ {
"path": "ucenter/appointment/appointment", "path": "ucenter/appointment/appointment",
"type": "page", "type": "page",

View File

@ -85,7 +85,7 @@
<text>我的预约</text> <text>我的预约</text>
<view class="i-carbon-chevron-down rotate-270 text-[#BFBFBF]"></view> <view class="i-carbon-chevron-down rotate-270 text-[#BFBFBF]"></view>
</view> </view>
<view class="flex items-center justify-between mx-[32rpx] py-[28rpx]"> <view class="flex items-center justify-between mx-[32rpx] py-[28rpx]" @click="goActive">
<text>激活记录</text> <text>激活记录</text>
<view class="i-carbon-chevron-down rotate-270 text-[#BFBFBF]"></view> <view class="i-carbon-chevron-down rotate-270 text-[#BFBFBF]"></view>
</view> </view>
@ -155,6 +155,12 @@ const goAppointment = () => {
url: '/pages-sub/ucenter/appointment/appointment', url: '/pages-sub/ucenter/appointment/appointment',
}) })
} }
const goActive = () => {
uni.navigateTo({
url: '/pages-sub/ucenter/active/activePage',
})
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -326,3 +326,39 @@ export const getWishList = () => {
export const deleteWishList = (params: { id: number }) => { export const deleteWishList = (params: { id: number }) => {
return http.post('/api/volunTb/delete', params) return http.post('/api/volunTb/delete', params)
} }
export const activeCard = (params: { cardCode: string; cardPwd: string }) => {
return http.post('/api/Zyvip/bind', params)
}
export const getAdmissionTrends = (params: {
ascription?: string[] | null
/**
* 985211
*/
feature?: string[] | null
keyword?: null | string
/**
* 01
*/
level?: number | null
/**
*
*/
locationCode?: null | string
nature?: string[] | null
pageIndex?: number
pageSize?: number
provinceName?: string[] | null
utype?: string[] | null
}) => {
return http.post('/api/admissionstreds/university', params)
}
export const getAdmissionTrendsByCollege = (params: {
uid: number
year: number
locationCode: string
}) => {
return http.get('/api/admissionstreds/major', params)
}

View File

@ -29,6 +29,7 @@ interface NavigateToOptions {
"/pages-sub/home/schoolRank/index" | "/pages-sub/home/schoolRank/index" |
"/pages-sub/home/wishesList/index" | "/pages-sub/home/wishesList/index" |
"/pages-sub/home/wishesList/wishesList" | "/pages-sub/home/wishesList/wishesList" |
"/pages-sub/ucenter/active/activePage" |
"/pages-sub/ucenter/appointment/appointment" | "/pages-sub/ucenter/appointment/appointment" |
"/pages-sub/ucenter/evaluate/evaluateList" | "/pages-sub/ucenter/evaluate/evaluateList" |
"/pages-sub/ucenter/star/myStar" | "/pages-sub/ucenter/star/myStar" |