index.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <ie-page bg-color="#F6F8FA">
  3. <ie-navbar title="测录取概率" transparent bg-color="#FFFFFF" title-color="black" keep-title-color/>
  4. <!-- #ifdef MP-WEIXIN -->
  5. <view class="h-90 bg-gradient-to-r from-white to-cyan-100"/>
  6. <!-- #endif -->
  7. <ie-image is-oss src="/volunteer/voluntary/index/banner.png" custom-class="w-full h-483"/>
  8. <view class="mx-30 -mt-180 z-1 bg-white rounded-xl p-35">
  9. <view class="flex justify-between items-center">
  10. <view class="text-lg text-fore-title">报考院校专业</view>
  11. <view class="text-base text-fore-placeholder flex items-center" @click="handleSelect">
  12. <text>请选择</text>
  13. <uv-icon name="arrow-right" color="info"/>
  14. </view>
  15. </view>
  16. <ie-empty v-if="!rules.length" :image="emptyImg" text="请选择你的报考院校专业~"/>
  17. <voluntary-form v-else ref="form"/>
  18. </view>
  19. <ie-safe-toolbar :height="84" :shadow="false">
  20. <view class="px-30 py-16">
  21. <ie-button @click="handleSubmit">测录取概率</ie-button>
  22. </view>
  23. </ie-safe-toolbar>
  24. </ie-page>
  25. </template>
  26. <script setup lang="ts">
  27. import config from "@/config";
  28. import VoluntaryForm from "@/pagesOther/pages/voluntary/index/components/voluntary-form.vue";
  29. import {EnrollRule, VoluntaryDto, VoluntaryModel, SelectedUniversityMajor} from "@/types/voluntary";
  30. import {VOLUNTARY_MODEL, VOLUNTARY_RULES, VOLUNTARY_TARGET} from "@/types/injectionSymbols";
  31. import {useTransferPage} from "@/hooks/useTransferPage";
  32. import {routes} from "@/common/routes";
  33. import {UniversityPickerPageOptions} from "@/types/transfer";
  34. import {getRenderRules, postRenderRules} from "@/api/modules/voluntary";
  35. import { useAuth } from "@/hooks/useAuth";
  36. import { EnumUserRole } from "@/common/enum";
  37. const { hasPermission } = useAuth();
  38. const emptyImg = computed(() => config.ossUrl + '/volunteer/voluntary/index/empty_data.png')
  39. const form = ref<InstanceType<typeof VoluntaryForm>>()
  40. const target = ref<SelectedUniversityMajor>({} as SelectedUniversityMajor)
  41. const rules = ref<EnrollRule[]>([])
  42. const model = ref<VoluntaryModel>({})
  43. const {prevData, transferTo} = useTransferPage()
  44. const handleSelect = async () => {
  45. const option: UniversityPickerPageOptions = {
  46. title: '选择你的报考院校专业',
  47. fromVoluntary: true,
  48. selectedUniversityId: target.value?.universityId,
  49. selectedMajorId: target.value?.majorId
  50. }
  51. const picked = await transferTo(routes.targetPicker, {data: option})
  52. if (!picked) return
  53. await processSelected(picked as SelectedUniversityMajor)
  54. }
  55. const processSelected = async (picked: SelectedUniversityMajor) => {
  56. target.value = picked
  57. uni.$ie.showLoading()
  58. try {
  59. // reset
  60. model.value = {}
  61. rules.value = []
  62. // request render rules
  63. const res = await getRenderRules(target.value)
  64. rules.value = res.data
  65. // init model
  66. rules.value.forEach((r) => {
  67. r.details?.forEach((d) => {
  68. if (d.options?.length) {
  69. model.value[d.fieldName] = d.defaultValue ? d.defaultValue : ''
  70. model.value[d.fieldName + 'Total'] = d.options ? d.options[0] : null
  71. }
  72. })
  73. })
  74. } catch (e) {
  75. console.log('getRenderRules ex', e, target.value)
  76. target.value = {} as SelectedUniversityMajor // clear for re-pick
  77. } finally {
  78. uni.$ie.hideLoading()
  79. }
  80. }
  81. const handleSubmit = async () => {
  82. const hasAuth = hasPermission([EnumUserRole.VIP]);
  83. if (!hasAuth) {
  84. return;
  85. }
  86. if (!target.value.universityId || !target.value.majorId) return uni.$ie.showToast('请选择院校专业')
  87. if (!rules.value.length) return uni.$ie.showToast('由于官方未公布历年录取分数或计划变更,暂时无法计算录取概率')
  88. await form.value?.validate()
  89. // make request
  90. const {data: result} = await postRenderRules(target.value, model.value)
  91. const bigData: VoluntaryDto = {target: target.value, rules: rules.value, model: model.value, result}
  92. transferTo(routes.voluntaryResult, {bigData})
  93. }
  94. provide(VOLUNTARY_TARGET, target)
  95. provide(VOLUNTARY_RULES, rules)
  96. provide(VOLUNTARY_MODEL, model)
  97. onLoad(() => {
  98. if (prevData.value.selected) {
  99. processSelected(prevData.value.selected as SelectedUniversityMajor)
  100. }
  101. })
  102. // 为了让子组件触发页面滚动
  103. onPageScroll(() => {
  104. })
  105. </script>
  106. <style lang="scss">
  107. </style>