index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <view class="wrap" v-if="isValidQrCode">
  3. <image class="bg-image" src="/static/images/welcome/eye-examine-bg.png" mode="widthFix"></image>
  4. <view class="content">
  5. <view class="form-box">
  6. <view class="school-name" v-if="schoolName">
  7. <text>{{ schoolName }}</text>
  8. </view>
  9. <van-field v-model="formData.name" label="姓名" placeholder="请输入姓名" required label-align="left" />
  10. <van-field v-model="formData.phone" label="电话" placeholder="请输入电话" type="tel" required label-align="left" />
  11. <van-field v-model="formData.organization" label="机构" placeholder="请输入机构" required label-align="left" />
  12. </view>
  13. <view class="btn-box">
  14. <van-button type="primary" block round @click="handleEnter" :disabled="!isFormValid">进入体检</van-button>
  15. </view>
  16. </view>
  17. </view>
  18. <view v-else class="error-page">
  19. <view class="error-text">当前二维码无效</view>
  20. </view>
  21. </template>
  22. <script setup>
  23. import { getSchoolInfo } from '@/services/common'
  24. const STORAGE_KEY = 'eye_examine_user_info'
  25. const isValidQrCode = ref(true)
  26. const schoolName = ref('')
  27. const formData = ref({
  28. name: '',
  29. phone: '',
  30. organization: '',
  31. schoolId: ''
  32. })
  33. const isFormValid = computed(() => {
  34. const phoneReg = /^1[3-9]\d{9}$/
  35. return formData.value.name && phoneReg.test(formData.value.phone) && formData.value.organization
  36. })
  37. onLoad(async (options) => {
  38. const savedData = uni.getStorageSync(STORAGE_KEY)
  39. if (options.schoolId) {
  40. formData.value.schoolId = options.schoolId
  41. }
  42. if (savedData) {
  43. const saved = JSON.parse(savedData)
  44. formData.value.name = saved.name || ''
  45. formData.value.phone = saved.phone || ''
  46. formData.value.organization = saved.organization || ''
  47. if (options.schoolId && saved.schoolId !== options.schoolId) {
  48. formData.value.schoolId = options.schoolId
  49. } else if (saved.schoolId) {
  50. formData.value.schoolId = saved.schoolId
  51. }
  52. }
  53. if (!formData.value.schoolId) {
  54. isValidQrCode.value = false
  55. uni.showToast({
  56. title: '当前二维码无效',
  57. icon: 'none',
  58. duration: 3000
  59. })
  60. return
  61. }
  62. try {
  63. const res = await getSchoolInfo(formData.value.schoolId)
  64. if (res && res.code === 200) {
  65. schoolName.value = res.data.name || ''
  66. }
  67. } catch (error) {
  68. console.error('获取学校信息失败', error)
  69. }
  70. })
  71. const handleEnter = async () => {
  72. if (!formData.value.name || !formData.value.phone || !formData.value.organization) {
  73. return uni.showToast({
  74. title: '请填写完整信息',
  75. icon: 'none'
  76. })
  77. }
  78. if (!formData.value.schoolId) {
  79. return uni.showToast({
  80. title: '缺少学校ID',
  81. icon: 'none'
  82. })
  83. }
  84. uni.setStorageSync(STORAGE_KEY, JSON.stringify(formData.value))
  85. uni.navigateTo({
  86. url: '/pages/index/eye-examine-index'
  87. })
  88. }
  89. </script>
  90. <style lang="scss" scoped>
  91. .wrap {
  92. width: 100%;
  93. min-height: 100vh;
  94. position: relative;
  95. overflow: hidden;
  96. background: linear-gradient(180deg, #4A9FF5 0%, #FFFFFF 100%);
  97. }
  98. .bg-image {
  99. width: 100%;
  100. height: 200rpx;
  101. display: block;
  102. }
  103. .content {
  104. padding: 0 30rpx;
  105. margin-top: -300rpx;
  106. position: relative;
  107. z-index: 2;
  108. }
  109. .school-name {
  110. text-align: center;
  111. font-size: 36rpx;
  112. font-weight: bold;
  113. font-family: 'SimHei', 'Microsoft YaHei', sans-serif;
  114. color: #000;
  115. padding: 40rpx 30rpx 30rpx;
  116. border-bottom: 1px solid #eee;
  117. word-wrap: break-word;
  118. word-break: break-all;
  119. line-height: 1.5;
  120. }
  121. .form-box {
  122. background: #fff;
  123. border-radius: 20rpx;
  124. overflow: hidden;
  125. margin-bottom: 60rpx;
  126. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
  127. }
  128. .form-box :deep(.van-cell) {
  129. font-size: 36rpx;
  130. padding: 30rpx 16px;
  131. flex-direction: column;
  132. align-items: flex-start;
  133. }
  134. .form-box :deep(.van-field__label) {
  135. font-size: 36rpx;
  136. margin-bottom: 20rpx;
  137. width: 100%;
  138. }
  139. .form-box :deep(.van-field__control) {
  140. font-size: 36rpx;
  141. width: 100%;
  142. }
  143. .btn-box {
  144. padding: 0;
  145. }
  146. .btn-box :deep(.van-button) {
  147. height: 100rpx;
  148. font-size: 36rpx;
  149. }
  150. .error-page {
  151. width: 100%;
  152. height: 100vh;
  153. display: flex;
  154. align-items: center;
  155. justify-content: center;
  156. background: #f5f5f5;
  157. }
  158. .error-text {
  159. font-size: 32rpx;
  160. color: #999;
  161. }
  162. </style>