updates
This commit is contained in:
parent
deb900da7b
commit
f5b479468b
|
|
@ -183,7 +183,7 @@ onUnmounted(() => {
|
|||
<input
|
||||
v-model="searchQuery"
|
||||
type="text"
|
||||
class="h-9 w-50 rounded-l border border-gray-300 py-2 pl-9 pr-4 text-gray-700 placeholder-gray-400 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-200 dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:placeholder-slate-500 dark:focus:ring-blue-900"
|
||||
class="h-9 w-50 rounded-l border border-gray-300 py-2 pl-9 pr-4 bg-white text-gray-700 placeholder-gray-400 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-200 dark:bg-slate-800 dark:border-slate-700 dark:text-slate-200 dark:placeholder-slate-500 dark:focus:ring-blue-900"
|
||||
placeholder="输入院校名称"
|
||||
>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@ const scores = ref({
|
|||
english: '', // 英语
|
||||
})
|
||||
|
||||
// Dynamic sub-major scores
|
||||
const subMajorScores = ref<Record<string, string>>({})
|
||||
|
||||
// Errors state
|
||||
const errors = ref({
|
||||
examType: '',
|
||||
|
|
@ -54,6 +57,7 @@ const errors = ref({
|
|||
chinese: '',
|
||||
english: '',
|
||||
},
|
||||
subMajorScores: {} as Record<string, string>,
|
||||
})
|
||||
|
||||
// --- Computed Properties using Dict System ---
|
||||
|
|
@ -85,15 +89,15 @@ function getSubMajorOptions() {
|
|||
switch (majorCategory.value) {
|
||||
case '表演类':
|
||||
return [
|
||||
{ label: '服装表演', value: '服装表演' },
|
||||
{ label: '戏剧影视导演', value: '戏剧影视导演' },
|
||||
{ label: '戏剧影视表演', value: '戏剧影视表演' },
|
||||
{ label: '服装表演', value: '服装表演', formKey: '服装表演' },
|
||||
{ label: '戏剧影视导演', value: '戏剧影视导演', formKey: '戏剧影视导演' },
|
||||
{ label: '戏剧影视表演', value: '戏剧影视表演', formKey: '戏剧影视表演' },
|
||||
]
|
||||
case '音乐类':
|
||||
return [
|
||||
{ label: '音乐表演声乐', value: '音乐表演声乐', disabled: selectedSubMajors.value.includes('音乐表演器乐') },
|
||||
{ label: '音乐表演器乐', value: '音乐表演器乐', disabled: selectedSubMajors.value.includes('音乐表演声乐') },
|
||||
{ label: '音乐教育', value: '音乐教育' },
|
||||
{ label: '音乐表演声乐', value: '音乐表演声乐', formKey: '音乐表演声乐', disabled: selectedSubMajors.value.includes('音乐表演器乐') },
|
||||
{ label: '音乐表演器乐', value: '音乐表演器乐', formKey: '音乐表演器乐', disabled: selectedSubMajors.value.includes('音乐表演声乐') },
|
||||
{ label: '音乐教育', value: '音乐教育', formKey: '音乐教育' },
|
||||
]
|
||||
default:
|
||||
return []
|
||||
|
|
@ -122,10 +126,35 @@ function handleMajorCategoryChange(val: any) {
|
|||
errors.value.majorCategory = ''
|
||||
}
|
||||
|
||||
function getSubMajorFormKey(subMajorValue: string): string {
|
||||
const options = getSubMajorOptions()
|
||||
const option = options.find(opt => opt.value === subMajorValue)
|
||||
return option?.formKey || ''
|
||||
}
|
||||
|
||||
function handleSubMajorChange(val: any) {
|
||||
// 可以在这里处理额外的逻辑
|
||||
console.warn(val)
|
||||
errors.value.subMajors = ''
|
||||
|
||||
// 获取当前选中的子专业选项
|
||||
const options = getSubMajorOptions()
|
||||
const selectedOptions = options.filter(opt => val.includes(opt.value))
|
||||
|
||||
// 初始化新选中的子专业成绩输入框
|
||||
selectedOptions.forEach(opt => {
|
||||
if (!subMajorScores.value[opt.formKey]) {
|
||||
subMajorScores.value[opt.formKey] = ''
|
||||
}
|
||||
})
|
||||
|
||||
// 移除未选中的子专业成绩
|
||||
const currentFormKeys = selectedOptions.map(opt => opt.formKey)
|
||||
Object.keys(subMajorScores.value).forEach(key => {
|
||||
if (!currentFormKeys.includes(key)) {
|
||||
delete subMajorScores.value[key]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- Validation Logic ---
|
||||
|
|
@ -209,6 +238,11 @@ function validateForm() {
|
|||
// --- Submit ---
|
||||
async function handleSubmit() {
|
||||
if (validateForm()) {
|
||||
if (getSubMajorOptions().length == 0){
|
||||
selectedSubMajors.value = []
|
||||
subMajorScores.value = {}
|
||||
}
|
||||
|
||||
// 组装数据
|
||||
const formData: ScoreFormData = {
|
||||
examType: examType.value,
|
||||
|
|
@ -224,7 +258,7 @@ async function handleSubmit() {
|
|||
subjectList: selectedElectives.value,
|
||||
professionalCategory: majorCategory.value,
|
||||
professionalCategoryChildren: selectedSubMajors.value,
|
||||
professionalCategoryChildrenScore: {},
|
||||
professionalCategoryChildrenScore: subMajorScores.value,
|
||||
professionalScore: Number(scores.value.unified) || 0,
|
||||
culturalScore: Number(scores.value.culture) || 0,
|
||||
englishScore: Number(scores.value.english) || 0,
|
||||
|
|
@ -262,6 +296,11 @@ function initForm() {
|
|||
scores.value.culture = info.culturalScore?.toString() || ''
|
||||
scores.value.chinese = info.chineseScore?.toString() || ''
|
||||
scores.value.english = info.englishScore?.toString() || ''
|
||||
|
||||
// 回显子专业成绩
|
||||
if (info.professionalCategoryChildrenScore) {
|
||||
subMajorScores.value = { ...info.professionalCategoryChildrenScore }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -297,6 +336,7 @@ defineExpose({
|
|||
majorCategory.value = ''
|
||||
selectedSubMajors.value = []
|
||||
scores.value = { unified: '', culture: '', chinese: '', english: '' }
|
||||
subMajorScores.value = {}
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
|
@ -386,6 +426,30 @@ defineExpose({
|
|||
成绩输入
|
||||
</h3>
|
||||
|
||||
<!-- Dynamic Sub-Major Scores -->
|
||||
<div v-if="selectedSubMajors.length > 0" class="mb-4">
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div
|
||||
v-for="subMajor in selectedSubMajors"
|
||||
:key="subMajor"
|
||||
class="mb-4"
|
||||
>
|
||||
<label class="mb-2 block text-sm font-medium">{{ subMajor }}成绩</label>
|
||||
<input
|
||||
v-model="subMajorScores[getSubMajorFormKey(subMajor)]"
|
||||
type="number"
|
||||
min="0"
|
||||
max="300"
|
||||
placeholder="0-300"
|
||||
class="w-full border border-gray-300 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
>
|
||||
<div v-if="errors.subMajorScores[getSubMajorFormKey(subMajor)]" class="mt-2 text-sm text-red-600">
|
||||
{{ errors.subMajorScores[getSubMajorFormKey(subMajor)] }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Unified Exam Score -->
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div class="mb-4">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,74 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, onMounted, onUnmounted } from 'vue'
|
||||
// --- 类型定义 ---
|
||||
interface Ranking {
|
||||
label: string
|
||||
value: number
|
||||
trend?: 'up' | 'down' | 'flat'
|
||||
}
|
||||
|
||||
interface Major {
|
||||
college: string
|
||||
majors: string[]
|
||||
}
|
||||
|
||||
// --- 状态数据 ---
|
||||
const route = useRoute('/major/[majorCode]')
|
||||
const majorCode = ref('')
|
||||
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
|
||||
})
|
||||
|
||||
watchEffect(() => {
|
||||
majorCode.value = route.params.majorCode
|
||||
})
|
||||
useHead({
|
||||
title: () => { return `${majorCode.value}|艺体志愿宝` },
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="mx-auto max-w-7xl min-h-screen bg-gray-50 px-4 transition-colors duration-300 dark:bg-slate-900 lg:px-8 sm:px-6">
|
||||
<!-- 顶部导航 & Header sticky -->
|
||||
<header class="top-0 z-50 shadow-sm">
|
||||
</header>
|
||||
|
||||
<!-- 主要内容区域 -->
|
||||
<!-- mx-auto max-w-7xl px-4 py-6 lg:px-8 sm:px-6 -->
|
||||
<main class="mx-auto max-w-7xl">
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* 隐藏滚动条但保留滚动功能 */
|
||||
.scrollbar-hide::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.scrollbar-hide {
|
||||
-ms-overflow-style: none;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
|
||||
/* 自定义滚动条样式 */
|
||||
.custom-scrollbar::-webkit-scrollbar {
|
||||
width: 4px;
|
||||
}
|
||||
.custom-scrollbar::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
.custom-scrollbar::-webkit-scrollbar-thumb {
|
||||
background: #cbd5e1;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.dark .custom-scrollbar::-webkit-scrollbar-thumb {
|
||||
background: #475569;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -153,6 +153,7 @@ async function loadMore(reset = false) {
|
|||
const res = await getUserMajorList({
|
||||
page: page.value,
|
||||
size: size.value,
|
||||
keyword: currentKeyword.value,
|
||||
probability,
|
||||
batch: currentBatchTab.value,
|
||||
batch2: currentBatch2Tab.value,
|
||||
|
|
@ -455,6 +456,7 @@ function handleDataChange(data: { keyword: string, filters: FilterState }) {
|
|||
console.warn('发起请求:', data.keyword, data.filters)
|
||||
currentKeyword.value = data.keyword
|
||||
currentFilters.value = data.filters
|
||||
loadMore(true)
|
||||
}
|
||||
|
||||
// 用于记录当前鼠标是否悬停在手柄上,悬停时该行的索引存入这里
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ declare module 'vue-router/auto-routes' {
|
|||
'/demo/pop-confirm': RouteRecordInfo<'/demo/pop-confirm', '/demo/pop-confirm', Record<never, never>, Record<never, never>>,
|
||||
'/dict-demo': RouteRecordInfo<'/dict-demo', '/dict-demo', Record<never, never>, Record<never, never>>,
|
||||
'/hi/[name]': RouteRecordInfo<'/hi/[name]', '/hi/:name', { name: ParamValue<true> }, { name: ParamValue<false> }>,
|
||||
'/major/[majorCode]': RouteRecordInfo<'/major/[majorCode]', '/major/:majorCode', { majorCode: ParamValue<true> }, { majorCode: ParamValue<false> }>,
|
||||
'/majors': RouteRecordInfo<'/majors', '/majors', Record<never, never>, Record<never, never>>,
|
||||
'/privacy-policy': RouteRecordInfo<'/privacy-policy', '/privacy-policy', Record<never, never>, Record<never, never>>,
|
||||
'/README': RouteRecordInfo<'/README', '/README', Record<never, never>, Record<never, never>>,
|
||||
|
|
|
|||
Loading…
Reference in New Issue