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

305 lines
8.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<route lang="json5" type="page">
{
style: {
navigationStyle: 'custom',
},
needLogin: true,
}
</route>
<template>
<view class="h-screen overflow-hidden flex flex-col bg-[#F8F8F8]" :bordered="false">
<Navbar
title="成绩填写"
left-arrow
@click-left="navigatorBack"
safeAreaInsetTop
:bordered="false"
/>
<view class="px-[32rpx] pt-[47rpx] flex flex-col" hover-class="none">
<text class="text-[24rpx] text-[#636363] text-normal" :selectable="false" :decode="false">
为了使推荐更准确请您认真填写
</text>
<text
class="text-[28rpx] text-[#000] text-medium mt-[47rpx]"
:selectable="false"
:decode="false"
>
预估总分
</text>
<view class="mt-[24rpx] rounded-[16rpx] bg-white flex items-center px-[32rpx] py-[24rpx]">
<input
v-model="score"
placeholder="请输入分数"
@confirm="handleChange"
input-mode="numeric"
type="number"
:focus="true"
class="flex-1"
confirm-type="done"
/>
<text class="" :selectable="false" :decode="false">分</text>
</view>
<view
class="mt-[24rpx] rounded-[16rpx] bg-white flex items-center px-[32rpx] py-[24rpx] justify-between"
@click="show = true"
>
<view>{{ term }}</view>
<view class="i-carbon-chevron-down rotate-270"></view>
</view>
</view>
<view class="mt-[32rpx] px-[32rpx]" hover-class="none" v-if="requireSubjectList.length > 0">
<view class="mb-[16rpx]" hover-class="none">
<text class="" :selectable="false" :decode="false">首选科目</text>
<text class="text-[24rpx] text-gray">({{ requireSubjectList.length }}选1)</text>
</view>
<RadioGroup
v-model="requireSubject"
cell
inline
class="custom-radio-group"
checked-color="#1580FF"
>
<Radio
v-for="item in requireSubjectList"
:key="item.code"
:name="item.code"
shape="button"
class="custom-radio"
>
{{ item.name }}
</Radio>
</RadioGroup>
</view>
<view class="mt-[32rpx] px-[32rpx]" hover-class="none">
<view class="mb-[16rpx]" hover-class="none" v-if="requireSubjectList.length > 0">
<text class="" :selectable="false" :decode="false">次选科目</text>
<text class="text-[24rpx] text-gray">
({{ optionalSubjectList.length }}选{{ requireSubjectList.length > 0 ? 2 : 3 }})
</text>
</view>
<CheckboxGroup v-model="optionalSubject" :max="3">
<Checkbox
v-for="item in optionalSubjectList"
:key="item.code"
:name="item.code"
class="custom-checkbox"
>
{{ item.name }}
</Checkbox>
</CheckboxGroup>
</view>
<button
block
:class="`mt-auto mb-[32rpx] rounded-[8rpx] mx-[32rpx] text-[32rpx] text-[#fff]! font-normal ${btnFlag < 3 ? 'bg-[#BFBFBF]!' : 'bg-[#1580FF]!'}`"
@click="saveScore"
:disabled="btnFlag < 3"
>
保存
</button>
<view class="pb-safe" hover-class="none"></view>
<ActionSheet v-model:show="show" title="">
<view class="px-[32rpx]">
<CustomPickerView
:list="termList"
v-model:modelValue="term"
value-key="code"
label-key="name"
/>
</view>
<view class="flex items-center justify-between px-[32rpx]">
<view class="cancel-btn" @click="show = false">取消</view>
<view class="submit-btn" @click="handleConfirm"></view>
</view>
</ActionSheet>
</view>
</template>
<script lang="ts" setup>
import { useUserStore } from '@/store/user'
import Navbar from '@/pages-sub/components/navbar/Navbar.vue'
import CheckboxGroup from '@/pages-sub/components/check-group/CheckboxGroup.vue'
import Checkbox from '@/pages-sub/components/check-group/Checkbox.vue'
import RadioGroup from '@/pages-sub/components/radio-group/RadioGroup.vue'
import Radio from '@/pages-sub/components/radio-group/Radio.vue'
import CustomPickerView from '@/pages-sub/components/CustomPickerView.vue'
import ActionSheet from '@/pages-sub/components/ActionSheet.vue'
import {
useRules,
requireSubjectList,
optionalSubjectList,
} from '@/pages-sub/home/inputScore/useRules'
import { savePerfectInfo } from '@/service/index/api'
const userStore = useUserStore()
const show = ref(false)
const handleConfirm = () => {
show.value = false
}
// 学期
const term = ref(userStore.userInfo.estimatedAchievement.year || new Date().getFullYear())
const termList = ref<{ name: string; code: number }[]>(userStore.userInfo.city.lizations)
const navigatorBack = () => {
uni.navigateBack()
}
// 输入成绩
const score = ref<number | string>(userStore.userInfo.estimatedAchievement.expectedScore || '')
const handleChange = (e: any) => {
const _score = Number(score.value) || 0
if (_score > userStore.userInfo.city.allscore) {
score.value = userStore.userInfo.city?.allscore
}
}
// 单选 必选学科
const requireSubject = ref<number | string>('')
// 任意选择科目
const optionalSubject = ref<any[]>([])
// 判断是否关闭按钮
const btnFlag = computed(() => {
let num = 0
if (requireSubject.value !== '') {
num++
}
num = num + optionalSubject.value.length
return num
})
onShow(() => {
userStore.$subscribe(() => {
requireSubject.value = userStore.userInfo.estimatedAchievement.requireSubject[0].code ?? ''
optionalSubject.value = userStore.userInfo.estimatedAchievement.optionalSubject.map(
(item) => item.code,
)
})
useRules()
})
const saveScore = () => {
if (score.value === '') {
uni.showToast({
title: '请检查分数',
})
return
}
const data = {
year: term.value, // 学期
expectedScore: score.value, // 成绩
optionalSubject: optionalSubjectList.value.filter((item) =>
optionalSubject.value.includes(item.code),
), // 任意选择科目
requireSubject: requireSubjectList.value.filter((item) => requireSubject.value === item.code), // 必选科目
cityCode: userStore.userInfo.city.code, // 城市code
}
const subjects = data.optionalSubject
.map((item) => item.simplename)
.concat(data.requireSubject ? data.requireSubject[0].simplename : [])
.join(',')
console.log(subjects, data.requireSubject)
userStore.setEstimatedAchievement({
...data,
subjectGroup: subjects,
provinceName: userStore.userInfo.city.provincename,
provinceCode: userStore.userInfo.city.code,
})
savePerfectInfo({
year: term.value,
score: Number(score.value),
subjectGroup: subjects,
provinceCode: userStore.userInfo.city.code,
provinceName: userStore.userInfo.city.provincename,
}).then((res) => {
if (res.code === 200) {
uni.showToast({
title: '保存成功',
icon: 'none',
})
setTimeout(() => {
uni.navigateBack({
fail: () => {
// 如果无法返回,说明可能已在首页
uni.switchTab({
url: '/pages/home/index/index',
})
},
})
}, 500)
}
})
}
</script>
<style lang="scss" scoped>
@import '@/pages-sub/home/styles/picker-view-btn.scss';
:deep(.custom-checkbox) {
.checkbox {
width: 152rpx;
height: 76rpx;
background-color: #fff;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
border: 2rpx solid #fff;
}
.checkbox__icon {
display: none;
}
}
:deep(.checkbox-active) {
background-color: rgba(21, 128, 255, 0.1) !important;
border-color: #1580ff !important;
.checkbox__label,
.radio__label {
color: #1580ff !important;
}
}
:deep(.custom-radio-group) {
display: flex;
flex-wrap: wrap;
gap: 32rpx;
justify-items: center;
background-color: #f8f8f8;
}
:deep(.custom-radio) {
width: 152rpx;
height: 76rpx;
background-color: #fff;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
border: 2rpx solid #fff;
.radio__icon {
display: none;
}
.radio-active {
background-color: rgba(21, 128, 255, 0.1) !important;
border-color: #1580ff !important;
border: 2rpx solid #1580ff;
border-radius: 8rpx;
}
}
</style>