feat: 我的志愿表页面编写中
parent
3c753725db
commit
207c569505
|
|
@ -18,6 +18,7 @@
|
|||
</button>
|
||||
<button
|
||||
class="w-[350rpx]! h-[88rpx]! text-[#fff]! text-[28rpx]! bg-[#1580FF]! font-normal flex! items-center! justify-center! rounded-[8rpx]!"
|
||||
@click="navigatorToAi"
|
||||
>
|
||||
智能填报
|
||||
</button>
|
||||
|
|
@ -39,4 +40,10 @@ const navigatorTo = () => {
|
|||
url: '/pages-sub/home/autoFill/index',
|
||||
})
|
||||
}
|
||||
|
||||
const navigatorToAi = () => {
|
||||
uni.navigateTo({
|
||||
url: '/pages-evaluation-sub/aiAutoFill/index',
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -1,20 +1,4 @@
|
|||
import {
|
||||
getUniversityType,
|
||||
getRegionInfo,
|
||||
getUniversityLevel,
|
||||
getNature,
|
||||
} from '@/service/index/api'
|
||||
|
||||
export const useUniversityLevel = () => {
|
||||
const phaseList = ref([])
|
||||
getUniversityLevel().then((res) => {
|
||||
if (res.code === 200) {
|
||||
phaseList.value = res.result as { code: number; name: string }[]
|
||||
}
|
||||
})
|
||||
|
||||
return { phaseList }
|
||||
}
|
||||
import { getUniversityType, getRegionInfo, getNature } from '@/service/index/api'
|
||||
|
||||
interface Region {
|
||||
code: string
|
||||
|
|
|
|||
|
|
@ -0,0 +1,82 @@
|
|||
export const renderEchart = ({ echart, echarts, pieChartData }) => {
|
||||
const typeColorMap = {
|
||||
需冲刺: { color: '#EB5241', simpleName: '冲' },
|
||||
较稳妥: { color: '#F0BA16', simpleName: '稳' },
|
||||
可保底: { color: '#15C496', simpleName: '保' },
|
||||
}
|
||||
const formattedData = pieChartData.value.map((item) => ({
|
||||
...item,
|
||||
|
||||
itemStyle: {
|
||||
color: typeColorMap[item.name]?.color,
|
||||
},
|
||||
label: {
|
||||
formatter: (params) => typeColorMap[params.name]?.simpleName || params.name,
|
||||
},
|
||||
}))
|
||||
echart.value.init(echarts, (chart) => {
|
||||
let option = {
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: '{b}: {c} ({d}%)',
|
||||
},
|
||||
legend: {
|
||||
orient: 'horizontal',
|
||||
bottom: 0,
|
||||
left: 'center',
|
||||
icon: 'circle',
|
||||
itemWidth: 10,
|
||||
itemHeight: 10,
|
||||
itemGap: 20,
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
data: formattedData,
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
shadowBlur: 10,
|
||||
shadowOffsetX: 0,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.5)',
|
||||
},
|
||||
},
|
||||
label: {
|
||||
formatter: (params) => typeColorMap[params.name]?.simpleName || params.name,
|
||||
},
|
||||
},
|
||||
],
|
||||
graphic: {
|
||||
elements: [
|
||||
{
|
||||
type: 'text',
|
||||
left: 'center',
|
||||
top: '40%',
|
||||
|
||||
style: {
|
||||
text: '适合的大学',
|
||||
fontSize: 12,
|
||||
fill: '#1F2329',
|
||||
textAlign: 'center',
|
||||
textVerticalAlign: 'middle',
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
left: 'center',
|
||||
top: '50%',
|
||||
style: {
|
||||
text: formattedData.reduce((acc, curr) => acc + curr.value, 0),
|
||||
fontSize: 24,
|
||||
fill: '#1F2329',
|
||||
textAlign: 'center',
|
||||
textVerticalAlign: 'middle',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
chart.setOption(option)
|
||||
})
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
<route lang="json5" type="page">
|
||||
{
|
||||
style: {
|
||||
navigationBarTitleText: 'AI智能填报',
|
||||
},
|
||||
needLogin: true,
|
||||
}
|
||||
</route>
|
||||
<template>
|
||||
<view class="bg-[#FAFAFA]">
|
||||
<view class="text-[#000] text-[24rpx] p-[32rpx]">
|
||||
{{ userInfo.estimatedAchievement.expectedScore }}分{{
|
||||
userInfo.estimatedAchievement.subjectGroup.split(',').join('/')
|
||||
}}
|
||||
</view>
|
||||
<view class="mx-[32rpx] h-[426rpx] bg-[#fff] rounded-[16rpx]">
|
||||
<l-echart ref="echart"></l-echart>
|
||||
</view>
|
||||
<view class="mt-[32rpx] mx-[32rpx] bg-[#fff] rounded-[16rpx] p-[32rpx]">
|
||||
<text class="text-[#000] text-[24rpx]">
|
||||
{{ pieChartData.reduce((total, cur) => total + cur.value, 0) }}所适合我的大学
|
||||
</text>
|
||||
<view class="pl-[30rpx] mt-[22rpx] grid grid-cols-3 gap-x-[150rpx] gap-y-[30rpx]">
|
||||
<view
|
||||
class="flex flex-col items-center gap-[8rpx]"
|
||||
v-for="item in universities"
|
||||
:key="item.name"
|
||||
>
|
||||
<text class="text-[56rpx] text-[#1F2329] font-semibold">{{ item.count }}</text>
|
||||
<text class="text-[24rpx] text-[#B6B6B6]">{{ item.name }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="mt-[32rpx] mx-[32rpx] bg-[#FEF0F0] rounded-[16rpx] p-[32rpx]">
|
||||
<view class="text-[#F56C6C] text-[28rpx] flex items-center gap-[8rpx]">
|
||||
<view class="i-carbon-volume-down text-[32rpx]"></view>
|
||||
说明
|
||||
</view>
|
||||
<view class="text-[20rpx] text-[#F56C6C] flex flex-col">
|
||||
<text>
|
||||
1.
|
||||
本平台基于历史分数及等效位次进行志愿推荐和风险评估,由于志愿填报本身存在不确定性,请谨慎参考。
|
||||
</text>
|
||||
<text>
|
||||
2.在正式填报时,院校/专业名称及代码请务必与官方信息平台核对,若发现差异则以官方数据为准,本平台数据仅供参考。
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="mt-[32rpx] bg-[#fff] rounded-[16rpx] p-[32rpx] box-shadow px-[32rpx] pt-[32rpx]">
|
||||
<view
|
||||
class="text-[#fff] text-[32rpx] rounded-[8rpx] bg-[#1580FF] text-center py-[26rpx]"
|
||||
@click="navigatorTo"
|
||||
>
|
||||
智能选校
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useUserStore } from '@/store/user'
|
||||
import { aiPreview, getBatchData } from '@/service/index/api'
|
||||
|
||||
import lEchart from '@/pages-evaluation-sub/uni_modules/lime-echart/components/l-echart/l-echart.vue'
|
||||
import { renderEchart } from './echartRender'
|
||||
const echarts = require('../uni_modules/lime-echart/static/echarts.min')
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
const userInfo = computed(() => userStore.userInfo)
|
||||
|
||||
const echart = ref(null)
|
||||
|
||||
const pieChartData = ref([])
|
||||
const universities = ref([])
|
||||
onLoad(() => {
|
||||
aiPreview({
|
||||
location: userInfo.value.estimatedAchievement.provinceCode,
|
||||
p: userInfo.value.estimatedAchievement.sp,
|
||||
score: userInfo.value.estimatedAchievement.expectedScore,
|
||||
subjects: userInfo.value.estimatedAchievement.subjectGroup.split(','),
|
||||
}).then((res) => {
|
||||
let _result = res.result as {
|
||||
pieChats: { name: string; value: number }[]
|
||||
universities: { name: string; count: number }[]
|
||||
}
|
||||
pieChartData.value = _result.pieChats
|
||||
universities.value = _result.universities
|
||||
renderEchart({ echart, echarts, pieChartData })
|
||||
})
|
||||
})
|
||||
|
||||
const navigatorTo = () => {
|
||||
uni.navigateTo({
|
||||
url: '/pages-sub/home/wishesList/index',
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.box-shadow {
|
||||
box-shadow: 0rpx -8rpx 8rpx 0rpx rgba(225, 225, 225, 0.2);
|
||||
}
|
||||
</style>
|
||||
|
|
@ -11,8 +11,6 @@ const echarts = require('./uni_modules/lime-echart/static/echarts.min')
|
|||
const echart = ref(null)
|
||||
|
||||
onMounted(() => {
|
||||
console.log(echarts, echart.value)
|
||||
|
||||
echart.value.init(echarts, (chart) => {
|
||||
let option = {
|
||||
title: {
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
<view class="action-sheet-header" v-if="title">
|
||||
<text class="action-sheet-title">{{ title }}</text>
|
||||
</view>
|
||||
<view class="action-sheet-content">
|
||||
<scroll-view class="action-sheet-content" :scroll-y="true">
|
||||
<slot></slot>
|
||||
</view>
|
||||
</scroll-view>
|
||||
<view class="action-sheet-footer" v-if="$slots.footer">
|
||||
<slot name="footer"></slot>
|
||||
</view>
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@ const emitValueChange = () => {
|
|||
|
||||
border: 2px solid v-bind('activeColor');
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
|
||||
z-index: 1;
|
||||
z-index: 0;
|
||||
top: 50%;
|
||||
transition:
|
||||
transform 0.2s,
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
<view class="table-row">
|
||||
<view class="table-cell" :class="[`text-${indexColumn.align || 'center'} w-full`]">
|
||||
<TableCol
|
||||
v-if="index"
|
||||
:prop="indexColumn.prop"
|
||||
:label="indexColumn.label"
|
||||
:width="indexColumn.width"
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
@click="handleRowClick(index)"
|
||||
:style="cellStyle"
|
||||
>
|
||||
{{ $slots.value }}
|
||||
<slot name="value" v-if="$slots.value" :row="getScope(index)" :index="index"></slot>
|
||||
<text :class="`table-value`" v-else>{{ row }}</text>
|
||||
</view>
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
<route lang="json5" type="page">
|
||||
{
|
||||
style: {
|
||||
navigationStyle: 'custom',
|
||||
},
|
||||
}
|
||||
</route>
|
||||
<template></template>
|
||||
|
||||
<script setup lang="ts"></script>
|
||||
|
|
@ -40,6 +40,23 @@
|
|||
custom-header-class="text-[36rpx]! text-[#303030]! font-medium!"
|
||||
>
|
||||
<FilterMenu />
|
||||
<template #footer>
|
||||
<view class="flex items-center">
|
||||
<button
|
||||
plain
|
||||
class="border-[#f5f5f5]! flex-auto bg-[#f5f5f5]! rounded-[8rpx]! text-[#1580FF]! text-[32rpx]! font-normal! mr-[22rpx]"
|
||||
@click="close"
|
||||
>
|
||||
清空
|
||||
</button>
|
||||
<button
|
||||
class="border-[#1580FF]! flex-auto bg-[#1580FF]! rounded-[8rpx]! text-[#fff]! text-[32rpx]! font-normal!"
|
||||
@click="handleResult"
|
||||
>
|
||||
查看结果
|
||||
</button>
|
||||
</view>
|
||||
</template>
|
||||
</ActionSheet>
|
||||
</view>
|
||||
</template>
|
||||
|
|
@ -61,6 +78,12 @@ const badgeValue = ref(12)
|
|||
const close = () => {
|
||||
show.value = false
|
||||
}
|
||||
|
||||
const handleResult = () => {
|
||||
uni.navigateTo({
|
||||
url: `/pages-sub/home/wishesList/index`,
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
@open="handleOpenSubMenu(item.id)"
|
||||
custom-class="flex items-center"
|
||||
>
|
||||
<view class="">
|
||||
<view class="mx-[24rpx] my-[16rpx]">
|
||||
<Region v-if="currentMenu === 1" @changeName="handleRegionChange" />
|
||||
<Nature v-if="currentMenu === 2" @changeName="handleNatureChange" />
|
||||
<UniType v-if="currentMenu === 3" @changeName="handleUniTypeChange" />
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
<template>
|
||||
<CheckGroup
|
||||
:list="infoList"
|
||||
@change="handleChange"
|
||||
:default-value="defaultInfo"
|
||||
value-key="id"
|
||||
label-key="name"
|
||||
v-bind="$attrs"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { getUniversityFeature } from '@/service/index/api'
|
||||
import CheckGroup from '@/pages-sub/components/check-group/CheckGroup.vue'
|
||||
|
||||
const infoList = ref()
|
||||
|
||||
getUniversityFeature().then((res) => {
|
||||
if (res.code === 200) {
|
||||
infoList.value = res.result as { id: number; name: string }[]
|
||||
}
|
||||
})
|
||||
|
||||
const defaultInfo = ref<string[]>([])
|
||||
|
||||
const emits = defineEmits(['changeName'])
|
||||
|
||||
const handleChange = (val: any) => {
|
||||
const names = infoList.value.filter((item) => val.includes(item.id)).map((item) => item.name)
|
||||
emits('changeName', names)
|
||||
}
|
||||
</script>
|
||||
|
|
@ -11,8 +11,16 @@
|
|||
{{ item.name }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex-1 pb-[24rpx] h-[50vh] overflow-y-auto mt-[32rpx] mx-[32rpx]">
|
||||
<Phase v-show="currentMenu === 1 && showPhase" />
|
||||
<scroll-view class="flex-1 pb-[24rpx] h-[50vh] mt-[32rpx] mx-[32rpx]" :scroll-y="true">
|
||||
<Phase v-show="currentMenu === 1" />
|
||||
<CollegeFeature
|
||||
v-show="currentMenu === 5"
|
||||
width="240rpx"
|
||||
height="60rpx"
|
||||
class="justify-center!"
|
||||
:defaultValue="defaultCollegeFeature"
|
||||
@change-name="handleCollegeFeatureChange"
|
||||
/>
|
||||
<Region
|
||||
width="240rpx"
|
||||
height="60rpx"
|
||||
|
|
@ -35,10 +43,10 @@
|
|||
v-show="currentMenu === 4"
|
||||
:defaultValue="defaultNature"
|
||||
/>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<view class="pt-[32rpx] px-[32rpx] wei-xin-pt box-shadow">
|
||||
<!-- <view class="flex items-center flex-wrap gap-[24rpx]">
|
||||
<!-- <view class="pt-[32rpx] px-[32rpx] wei-xin-pt box-shadow">
|
||||
<view class="flex items-center flex-wrap gap-[24rpx]">
|
||||
<view
|
||||
class="px-[20rpx] py-[12rpx] bg-[#f8f8f8] rounded-[8rpx]"
|
||||
v-for="item in 4"
|
||||
|
|
@ -48,23 +56,8 @@
|
|||
<view class="i-carbon-close-filled"></view>
|
||||
|
||||
</view>
|
||||
</view> -->
|
||||
<view class="flex items-center">
|
||||
<button
|
||||
plain
|
||||
class="border-[#f5f5f5]! flex-auto bg-[#f5f5f5]! rounded-[8rpx]! text-[#1580FF]! text-[32rpx]! font-normal! mr-[22rpx]"
|
||||
@click="close"
|
||||
>
|
||||
清空
|
||||
</button>
|
||||
<button
|
||||
class="border-[#1580FF]! flex-auto bg-[#1580FF]! rounded-[8rpx]! text-[#fff]! text-[32rpx]! font-normal!"
|
||||
@click="handleResult"
|
||||
>
|
||||
查看结果
|
||||
</button>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
|
|
@ -73,33 +66,29 @@ import Phase from './Phase.vue'
|
|||
import Region from './Region.vue'
|
||||
import UniType from './UniType.vue'
|
||||
import Nature from './Nature.vue'
|
||||
import CollegeFeature from './CollegeFeature.vue'
|
||||
|
||||
const props = defineProps({
|
||||
showPhase: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
menuBit: {
|
||||
type: Number,
|
||||
default: 15, // 默认显示 (01111)
|
||||
},
|
||||
})
|
||||
|
||||
const close = () => {
|
||||
defaultRegion.value = []
|
||||
defaultNature.value = []
|
||||
defaultUniType.value = []
|
||||
}
|
||||
|
||||
const menus = [
|
||||
{ id: 1, name: '阶段' },
|
||||
{ id: 2, name: '院校省份' },
|
||||
{ id: 5, name: '院校特色' },
|
||||
{ id: 3, name: '院校类型' },
|
||||
{ id: 4, name: '办学性质' },
|
||||
]
|
||||
|
||||
const splitMenus = computed(() => {
|
||||
let _menus = menus
|
||||
if (!props.showPhase) {
|
||||
_menus = menus.filter((item) => item.id !== 1)
|
||||
}
|
||||
return _menus
|
||||
let effectiveBitMask = props.menuBit
|
||||
return menus.filter((item) => {
|
||||
const bitMask = 1 << (item.id - 1)
|
||||
return (effectiveBitMask & bitMask) !== 0
|
||||
})
|
||||
})
|
||||
|
||||
const currentMenu = ref(splitMenus.value[0].id)
|
||||
|
|
@ -110,10 +99,12 @@ const changeMenu = (item: { id: number; name: string }) => {
|
|||
const defaultRegion = ref([])
|
||||
const defaultNature = ref([])
|
||||
const defaultUniType = ref([])
|
||||
const defaultCollegeFeature = ref([])
|
||||
|
||||
const chooseRegion = ref([])
|
||||
const chooseNature = ref([])
|
||||
const chooseUniType = ref([])
|
||||
const chooseCollegeFeature = ref([])
|
||||
|
||||
const handleRegionChange = (val: string[]) => {
|
||||
chooseRegion.value = val
|
||||
|
|
@ -126,11 +117,23 @@ const handleNatureChange = (val: string[]) => {
|
|||
const handleUniTypeChange = (val: string[]) => {
|
||||
chooseUniType.value = val
|
||||
}
|
||||
const handleResult = () => {
|
||||
uni.navigateTo({
|
||||
url: `/pages-sub/home/wishesList/index?province=${chooseRegion.value.join(',')}&nature=${chooseNature.value.join(',')}&uniType=${chooseUniType.value.join(',')}`,
|
||||
})
|
||||
|
||||
const handleCollegeFeatureChange = (val: string[]) => {
|
||||
chooseCollegeFeature.value = val
|
||||
}
|
||||
|
||||
const handleConfirm = () => {
|
||||
console.log(
|
||||
chooseRegion.value,
|
||||
chooseNature.value,
|
||||
chooseUniType.value,
|
||||
chooseCollegeFeature.value,
|
||||
)
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
handleConfirm,
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<template>
|
||||
<view class="">
|
||||
<RadioGroup v-model="choosePhase" class="custom-radio-group">
|
||||
<RadioGroup v-model="choosePhase" class="custom-radio-group" @change="handleChange">
|
||||
<Radio v-for="item in phaseList" :key="item.batch" :name="item.batch" class="custom-radio">
|
||||
{{ item.batch }}
|
||||
</Radio>
|
||||
|
|
@ -34,6 +34,8 @@ const phaseList = ref([])
|
|||
|
||||
const choosePhase = ref('')
|
||||
|
||||
const emits = defineEmits(['changeName', 'change'])
|
||||
|
||||
const fetchBatchData = () => {
|
||||
getBatchData(userStore.userInfo.batchDataUrl).then((res) => {
|
||||
if (res.code === 200) {
|
||||
|
|
@ -65,6 +67,12 @@ onLoad(() => {
|
|||
})
|
||||
}
|
||||
})
|
||||
|
||||
const handleChange = (val: string) => {
|
||||
choosePhase.value = val
|
||||
emits('changeName', val)
|
||||
emits('change', val)
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
|
|
|||
|
|
@ -25,26 +25,32 @@
|
|||
:title="searchParams.locationName || '省份'"
|
||||
custom-class="flex items-center"
|
||||
>
|
||||
<Region
|
||||
:defaultValue="searchParams.locationCode ? [searchParams.locationCode] : []"
|
||||
:max="1"
|
||||
@changeName="handleRegionChange"
|
||||
@change="handleRegionChangeCode"
|
||||
/>
|
||||
<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"
|
||||
>
|
||||
<Nature @changeName="handleNatureChange" />
|
||||
<view class="pl-[32rpx] pb-[32rpx]">
|
||||
<Nature @changeName="handleNatureChange" />
|
||||
</view>
|
||||
</drop-menu-item>
|
||||
<drop-menu-item :key="3" title="类别" custom-class="flex items-center">
|
||||
<UniType
|
||||
@change="handleUniTypeChange"
|
||||
:max="1"
|
||||
:default-value="searchParams.type ? [searchParams.type] : []"
|
||||
/>
|
||||
<view class="pl-[32rpx] pb-[32rpx]">
|
||||
<UniType
|
||||
@change="handleUniTypeChange"
|
||||
:max="1"
|
||||
:default-value="searchParams.type ? [searchParams.type] : []"
|
||||
/>
|
||||
</view>
|
||||
</drop-menu-item>
|
||||
</drop-menu>
|
||||
|
||||
|
|
|
|||
|
|
@ -20,38 +20,40 @@
|
|||
<view class="custom-background h-[200rpx] w-full absolute top-0 left-0 z-[-1]"></view>
|
||||
</view>
|
||||
<drop-menu>
|
||||
<drop-menu-item
|
||||
:key="1"
|
||||
:title="searchParams.locationName || '省份'"
|
||||
custom-class="flex items-center"
|
||||
>
|
||||
<Region
|
||||
:defaultValue="searchParams.locationCode ? [searchParams.locationCode] : []"
|
||||
:max="1"
|
||||
@changeName="handleRegionChange"
|
||||
@change="handleRegionChangeCode"
|
||||
/>
|
||||
<drop-menu-item :key="1" :title="searchParams.locationName || '省份'">
|
||||
<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.year || '年份'"
|
||||
custom-class="flex items-center"
|
||||
>
|
||||
<CheckGroup
|
||||
:list="checkYearList"
|
||||
:default-value="searchParams.year ? [searchParams.year] : []"
|
||||
@change="handleYearChange"
|
||||
labelKey="year"
|
||||
valueKey="year"
|
||||
:max="1"
|
||||
/>
|
||||
<view class="pl-[32rpx] pb-[32rpx]">
|
||||
<CheckGroup
|
||||
:list="checkYearList"
|
||||
:default-value="searchParams.year ? [searchParams.year] : []"
|
||||
@change="handleYearChange"
|
||||
labelKey="year"
|
||||
valueKey="year"
|
||||
:max="1"
|
||||
/>
|
||||
</view>
|
||||
</drop-menu-item>
|
||||
<drop-menu-item :key="3" title="类别" custom-class="flex items-center">
|
||||
<UniType
|
||||
@change="handleUniTypeChange"
|
||||
:max="1"
|
||||
:default-value="searchParams.type ? [searchParams.type] : []"
|
||||
/>
|
||||
<view class="pl-[32rpx] pb-[32rpx]">
|
||||
<UniType
|
||||
@change="handleUniTypeChange"
|
||||
:max="1"
|
||||
:default-value="searchParams.type ? [searchParams.type] : []"
|
||||
/>
|
||||
</view>
|
||||
</drop-menu-item>
|
||||
</drop-menu>
|
||||
<WXXTable :data="lineList" class="px-[32rpx] mt-[16rpx] pb-safe">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
<template>
|
||||
<view class="w-full">
|
||||
<!-- 头部 -->
|
||||
<view class="flex gap-[22rpx]">
|
||||
<view v-for="item in columns" :key="item.prop" class="text-[#505050] text-[22rpx]">
|
||||
{{ item.label }}
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view>
|
||||
<view v-for="dataItem in data" :key="dataItem._id" class="flex gap-[22rpx]">
|
||||
<view v-for="item in columns" :key="item.prop" class="text-[#505050] text-[22rpx]">
|
||||
{{ dataItem[item.prop] }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
const props = defineProps<{
|
||||
columns: any[]
|
||||
data: any[]
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
||||
|
|
@ -59,11 +59,8 @@
|
|||
</view>
|
||||
|
||||
<view class="flex gap-[10rpx] px-[32rpx] border-top">
|
||||
<view
|
||||
@click="handleShow(3)"
|
||||
class="flex justify-between items-center text-[28rpx] line-height-none"
|
||||
>
|
||||
全部(15)
|
||||
<view class="flex justify-between items-center text-[28rpx] line-height-none">
|
||||
全部({{ total }})
|
||||
<view class="i-carbon-caret-down"></view>
|
||||
</view>
|
||||
|
||||
|
|
@ -88,10 +85,72 @@
|
|||
:key="item.zp_index"
|
||||
v-for="(item, index) in schoolList"
|
||||
@click="itemClick(item, item.zp_index)"
|
||||
></view>
|
||||
>
|
||||
<view class="flex items-start p-[32rpx]">
|
||||
<view class="flex flex-col items-center gap-[16rpx]">
|
||||
<image :src="item.logo" mode="scaleToFill" class="w-[112rpx] h-[112rpx]" />
|
||||
<view
|
||||
class="w-[52rpx] h-[52rpx] rounded-[8rpx] font-semibold text-[28rpx] flex items-center justify-center"
|
||||
:style="calcTypeName(item.type).style"
|
||||
>
|
||||
{{ calcTypeName(item.type).text }}
|
||||
</view>
|
||||
<text class="text-[32rpx] font-semibold">
|
||||
{{
|
||||
Math.round(
|
||||
item.items.reduce((a, b) => a + Number(b.percentAge.replace('%', '')), 0) /
|
||||
item.items.length,
|
||||
)
|
||||
}}
|
||||
%
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex flex-col ml-[24rpx] justify-between flex-1">
|
||||
<view class="flex justify-between mb-[14rpx]">
|
||||
<view class="flex justify-between flex-col gap-[6rpx]">
|
||||
<text class="text-[32rpx] font-semibold">{{ item.name }}</text>
|
||||
<text class="text-[22rpx] text-[#505050]">
|
||||
{{ item.city }}·{{ item.educationCategory }}
|
||||
</text>
|
||||
<view class="text-[22rpx] text-[#8F959E] flex items-center">
|
||||
<text class="truncate max-w-[300rpx]" v-show="item.features.length > 0">
|
||||
{{ item.features.slice(0, 3).join('/') }}/
|
||||
</text>
|
||||
<text>排名{{ item.rank }}</text>
|
||||
</view>
|
||||
<view class="text-[22rpx] text-[#1F2329] mt-[8rpx]">
|
||||
<text class="">代码{{ item.collegeCode }}</text>
|
||||
<text>
|
||||
{{ item.year }}计划{{ item.items.reduce((a, b) => a + b.planCount, 0) }}人
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="flex flex-col gap-[8rpx] items-center">
|
||||
<view
|
||||
class="text-[24rpx] px-[16rpx] py-[12rpx] rounded-[8rpx] border-[2rpx] border-[#1580FF] border-solid"
|
||||
>
|
||||
专业{{ item.items.length }}
|
||||
</view>
|
||||
<text class="text-[20rpx] text-[#8F959E]">已填 1</text>
|
||||
</view>
|
||||
</view>
|
||||
<WXXTable :data="item.childItems">
|
||||
<WXXTableCol label="年份" prop="year" />
|
||||
<WXXTableCol label="录取" prop="planCount" />
|
||||
<WXXTableCol label="线差" prop="lineDiff" />
|
||||
<WXXTableCol label="最低分" prop="score" />
|
||||
<WXXTableCol label="最低位次" prop="rankLine" />
|
||||
<WXXTableCol label="位次差" prop="rankLine">
|
||||
<template>hello</template>
|
||||
</WXXTableCol>
|
||||
</WXXTable>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<ActionSheet v-model:show="show" :title="actionTitle">
|
||||
<view class="py-[16rpx]">
|
||||
<view class="px-[36rpx]">
|
||||
<Region
|
||||
v-if="actionTitle === '地域'"
|
||||
width="210rpx"
|
||||
|
|
@ -99,12 +158,19 @@
|
|||
class="px-[32rpx]"
|
||||
@change-name="handleRegionName"
|
||||
/>
|
||||
<FilterMenu v-if="actionTitle === '院校'" :show-phase="false" />
|
||||
</view>
|
||||
<view class="flex items-center justify-between px-[32rpx]" v-show="actionTitle === '地域'">
|
||||
<view class="cancel-btn" @click="show = false">取消</view>
|
||||
<view class="submit-btn" @click="handleConfirm">确认</view>
|
||||
</view>
|
||||
<FilterMenu
|
||||
v-if="actionTitle === '院校'"
|
||||
:show-phase="false"
|
||||
ref="filterMenuRef"
|
||||
:menuBit="28"
|
||||
/>
|
||||
<template #footer>
|
||||
<view class="flex items-center justify-between gap-[30rpx]">
|
||||
<view class="cancel-btn" @click="show = false">取消</view>
|
||||
<view class="submit-btn" @click="handleConfirm">确认</view>
|
||||
</view>
|
||||
</template>
|
||||
</ActionSheet>
|
||||
</z-paging>
|
||||
</template>
|
||||
|
|
@ -115,18 +181,67 @@ import ActionSheet from '@/pages-sub/components/ActionSheet.vue'
|
|||
import Region from '@/pages-sub/home/components/Region.vue'
|
||||
import FilterMenu from '@/pages-sub/home/components/FilterMenu.vue'
|
||||
import Slider from '@/pages-sub/components/Slider.vue'
|
||||
import { getPlanProListByFilter } from '@/service/index/api'
|
||||
import WXXTable from '@/pages-sub/components/table/Table.vue'
|
||||
import WXXTableCol from '@/pages-sub/components/table/TableCol.vue'
|
||||
// import DataTable from './DataTable.vue'
|
||||
|
||||
import { useUserStore } from '@/store/user'
|
||||
|
||||
const columns = ref([
|
||||
{
|
||||
label: '年份',
|
||||
prop: 'year',
|
||||
},
|
||||
{
|
||||
label: '录取',
|
||||
prop: 'planCount',
|
||||
},
|
||||
{
|
||||
label: '线差',
|
||||
prop: 'lineDiff',
|
||||
},
|
||||
{
|
||||
label: '最低分',
|
||||
prop: 'score',
|
||||
},
|
||||
{
|
||||
label: '最低位次',
|
||||
prop: 'rankLine',
|
||||
},
|
||||
{
|
||||
label: '位次差',
|
||||
prop: 'rankLine',
|
||||
},
|
||||
])
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
const sliderValue = ref([550, 590])
|
||||
|
||||
const schoolList = ref([])
|
||||
const paging = ref(null)
|
||||
const filterMenuRef = ref(null)
|
||||
|
||||
const location = ref(userStore.userInfo.estimatedAchievement.provinceCode)
|
||||
|
||||
const total = ref(0)
|
||||
|
||||
const queryList = (page: number, pageSize: number) => {
|
||||
paging.value.complete([])
|
||||
getPlanProListByFilter({
|
||||
pageIndex: page,
|
||||
pageSize: pageSize,
|
||||
location: userStore.userInfo.estimatedAchievement.provinceCode,
|
||||
p: userStore.userInfo.estimatedAchievement.sp,
|
||||
subjects: userStore.userInfo.estimatedAchievement.subjectGroup.split(','),
|
||||
score: +userStore.userInfo.estimatedAchievement.expectedScore,
|
||||
batchName: userStore.userInfo.batchName,
|
||||
}).then((resp) => {
|
||||
if (resp.code === 200) {
|
||||
paging.value.complete((resp.result as { rows: any[] }).rows)
|
||||
total.value = (resp.result as { totalRows: number }).totalRows
|
||||
}
|
||||
})
|
||||
}
|
||||
const virtualListChange = (_vList) => {
|
||||
schoolList.value = _vList
|
||||
|
|
@ -146,6 +261,9 @@ const show = ref(false)
|
|||
const actionTitle = ref('')
|
||||
const handleConfirm = () => {
|
||||
show.value = false
|
||||
if (actionTitle.value === '院校') {
|
||||
filterMenuRef.value.handleConfirm()
|
||||
}
|
||||
}
|
||||
|
||||
const handleShow = (type: number) => {
|
||||
|
|
@ -165,6 +283,34 @@ const handleRegionName = (val: string[]) => {
|
|||
const handleSliderChange = (val) => {
|
||||
console.log('滑块值变化:', val)
|
||||
}
|
||||
|
||||
const calcTypeName = (type: number) => {
|
||||
const style = {
|
||||
0: {
|
||||
text: '冲',
|
||||
color: '#EB5241',
|
||||
bgColor: 'rgba(235,82,65,0.15)',
|
||||
},
|
||||
1: {
|
||||
text: '稳',
|
||||
color: '#FA8E23',
|
||||
bgColor: 'rgba(250,142,35,0.15)',
|
||||
},
|
||||
2: {
|
||||
text: '保',
|
||||
color: '#15C496',
|
||||
bgColor: 'rgba(21,196,150,0.15)',
|
||||
},
|
||||
}[type] || { text: '保', color: '#15C496', bgColor: 'rgba(21,196,150,0.15)' }
|
||||
|
||||
return {
|
||||
text: style.text,
|
||||
style: {
|
||||
color: style.color,
|
||||
backgroundColor: style.bgColor,
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
import { getBatchData } from '@/service/index/api'
|
||||
import { useUserStore } from '@/store/user'
|
||||
|
||||
export const getPhaseLine = () => {
|
||||
let phaseLine = ref(0)
|
||||
const userStore = useUserStore()
|
||||
getBatchData(userStore.userInfo.batchDataUrl).then((res) => {
|
||||
if (res.code === 200) {
|
||||
phaseLine.value = res.result[0].batches.find(
|
||||
(item) => item.batch === userStore.userInfo.batchName,
|
||||
).score
|
||||
}
|
||||
})
|
||||
|
||||
return { phaseLine }
|
||||
}
|
||||
|
|
@ -118,13 +118,6 @@
|
|||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "home/aiAutoFill/index",
|
||||
"type": "page",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "home/autoFill/index",
|
||||
"type": "page",
|
||||
|
|
@ -246,6 +239,10 @@
|
|||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "home/wishesList/DataTable",
|
||||
"type": "page"
|
||||
},
|
||||
{
|
||||
"path": "home/wishesList/index",
|
||||
"type": "page",
|
||||
|
|
@ -275,6 +272,14 @@
|
|||
"path": "index",
|
||||
"type": "page"
|
||||
},
|
||||
{
|
||||
"path": "aiAutoFill/index",
|
||||
"type": "page",
|
||||
"style": {
|
||||
"navigationBarTitleText": "AI智能填报"
|
||||
},
|
||||
"needLogin": true
|
||||
},
|
||||
{
|
||||
"path": "rank/index",
|
||||
"type": "page",
|
||||
|
|
|
|||
|
|
@ -25,6 +25,10 @@ export const getUniversityLevel = () => {
|
|||
return http.get('/api/v1/base/un_level.json', { staticType: 'static' })
|
||||
}
|
||||
|
||||
export const getUniversityFeature = () => {
|
||||
return http.get('/api/v1/base/features.json', { staticType: 'static' })
|
||||
}
|
||||
|
||||
export const getRegionInfo = () => {
|
||||
return http.get('/api/v1/base/regions.json', { staticType: 'static' })
|
||||
}
|
||||
|
|
@ -236,3 +240,39 @@ export interface filterParams {
|
|||
export const getFilterData = (params: filterParams) => {
|
||||
return http.get('/api/PlanPro/planList', params)
|
||||
}
|
||||
|
||||
export interface AutoFillParams {
|
||||
batchName?: null | string
|
||||
endscore?: number | null
|
||||
feature?: string[] | null
|
||||
keyword?: null | string
|
||||
location?: null | string
|
||||
majors?: string[] | null
|
||||
nature?: string[] | null
|
||||
ownership?: string[] | null
|
||||
p?: number | null
|
||||
pageIndex?: number
|
||||
pageSize?: number
|
||||
province?: string[] | null
|
||||
score?: number | null
|
||||
startscore?: number | null
|
||||
subjects?: string[] | null
|
||||
subjectType?: string[] | null
|
||||
type?: number | null
|
||||
}
|
||||
export const getUniversityListByFilter = (params: AutoFillParams) => {
|
||||
return http.post('/api/PlanPro/v2/oneKey', params)
|
||||
}
|
||||
|
||||
export const aiPreview = (params: {
|
||||
location: string
|
||||
p: number
|
||||
score: string | number
|
||||
subjects: string[]
|
||||
}) => {
|
||||
return http.post('/api/PlanPro/aiPerview', params)
|
||||
}
|
||||
|
||||
export const getPlanProListByFilter = (params: AutoFillParams) => {
|
||||
return http.post('/api/PlanPro/aiUniversity', params)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -218,7 +218,6 @@ declare module 'vue' {
|
|||
readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
|
||||
readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
|
||||
readonly useUnSortType: UnwrapRef<typeof import('../hooks/useUnSortType')['useUnSortType']>
|
||||
readonly useUniversityLevel: UnwrapRef<typeof import('../hooks/useFilterSchool')['useUniversityLevel']>
|
||||
readonly useUniversityRank: UnwrapRef<typeof import('../hooks/useUnSortType')['useUniversityRank']>
|
||||
readonly useUniversityType: UnwrapRef<typeof import('../hooks/useFilterSchool')['useUniversityType']>
|
||||
readonly useUpload: UnwrapRef<typeof import('../hooks/useUpload')['default']>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ interface NavigateToOptions {
|
|||
"/pages/expert/index/index" |
|
||||
"/pages/ucenter/index/index" |
|
||||
"/pages-sub/customerService/index/index" |
|
||||
"/pages-sub/home/aiAutoFill/index" |
|
||||
"/pages-sub/home/autoFill/index" |
|
||||
"/pages-sub/home/career/index" |
|
||||
"/pages-sub/home/career/info" |
|
||||
|
|
@ -28,9 +27,11 @@ interface NavigateToOptions {
|
|||
"/pages-sub/home/news/index" |
|
||||
"/pages-sub/home/news/newsList" |
|
||||
"/pages-sub/home/schoolRank/index" |
|
||||
"/pages-sub/home/wishesList/DataTable" |
|
||||
"/pages-sub/home/wishesList/index" |
|
||||
"/login-sub/index" |
|
||||
"/pages-evaluation-sub/index" |
|
||||
"/pages-evaluation-sub/aiAutoFill/index" |
|
||||
"/pages-evaluation-sub/rank/index";
|
||||
}
|
||||
interface RedirectToOptions extends NavigateToOptions {}
|
||||
|
|
|
|||
Loading…
Reference in New Issue