Index.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <!-- 实名认证 -->
  2. <template>
  3. <app-view class="g-form account-certification">
  4. <template #header>
  5. <app-navbar :title="$t('user.authentication.title')" />
  6. </template>
  7. <Form ref="formRef" class="g-form__container" @submit="onSubmit">
  8. <CellGroup inset>
  9. <Field v-model="formData.username" name="username" :label="$t('user.authentication.customername')"
  10. :placeholder="$t('user.authentication.pleaseentertheusername')" :rules="formRules.username" />
  11. <Field name="cardtype" :label="$t('user.authentication.cardtype')" :rules="formRules.cardtype" is-link>
  12. <template #input>
  13. <app-select v-model="formData.cardtype"
  14. :placeholder="$t('user.authentication.pleaseselectthecardtype')"
  15. :options="cerTypePersonList" />
  16. </template>
  17. </Field>
  18. <Field v-model="formData.cardnum" name="cardnum" :label="$t('user.authentication.cardnum')"
  19. :placeholder="$t('user.authentication.pleaseenterthecardnum')" :rules="formRules.cardnum" />
  20. <Field v-if="formData.mobilephone != ''" name="mobilephone" v-model="formData.mobilephone"
  21. :label="$t('user.register.mobile')" readonly />
  22. <Field v-else v-model="formData.mobilephone" type="digit" name="mobilephone"
  23. :placeholder="$t('user.register.tips1')" :rules="formRules.mobilephone">
  24. <template #label>
  25. <span>{{ $t('user.register.mobile') }}</span>
  26. <span style="margin-left: 10px;" @click="show = true">{{ countryCode }}</span>
  27. <Popup v-model:show="show" position="bottom" teleport="body" round>
  28. <Picker :columns="datalist" @cancel="onCancel" @confirm="onConfirm"
  29. :confirm-button-text="$t('operation.confirm')"
  30. :cancel-button-text="$t('operation.cancel')">
  31. <template #option="{ text, index }">
  32. <slot name="option" :row="datalist[index]" :index="index">
  33. {{ text }}
  34. </slot>
  35. </template>
  36. </Picker>
  37. </Popup>
  38. </template>
  39. </Field>
  40. <Field name="bankid" :label="$t('banksign.OpenBankAccId')" :rules="formRules.bankid" is-link>
  41. <template #input>
  42. <app-select v-model="formData.bankid" :placeholder="$t('banksign.Pleaseselectyourbank')"
  43. :options="banklist" :optionProps="{ label: 'bankname', value: 'bankid' }" />
  44. </template>
  45. </Field>
  46. <Field :label="$t('banksign.bankno')" v-model="formData.bankaccount" name="bankaccount"
  47. :placeholder="$t('banksign.Pleaseenterbankno')" :rules="formRules.bankaccount" maxlength="30" />
  48. <Field name="cardfrontphotourl" :label="$t('user.authentication.cardfrontphoto')"
  49. :rules="formRules.cardfrontphotourl">
  50. <template #input>
  51. <app-uploader @success="b_afterRead" />
  52. </template>
  53. </Field>
  54. <Field name="cardbackphotourl" v-if="showCardBackPhoto === '1'"
  55. :label="$t('user.authentication.cardbackphoto')" :rules="formRules.cardbackphotourl">
  56. <template #input>
  57. <app-uploader @success="f_afterRead" />
  58. </template>
  59. </Field>
  60. <Field name="halfbodyphotourl" v-if="showHalfBodyPhoto === '1'" :label="halfBodyPhotoTitle"
  61. :rules="formRules.halfbodyphotourl">
  62. <template #input>
  63. <app-uploader @success="h_afterRead" />
  64. </template>
  65. </Field>
  66. <Field v-if="modifyremark != ''" v-model="modifyremark" readonly name="modifyremark"
  67. :label="$t('user.authentication.modifyremark')" />
  68. </CellGroup>
  69. </Form>
  70. <!-- <img v-if="oem != 'tss'" src="../../../assets/images/certification.png" /> -->
  71. <template #footer>
  72. <div class="g-form__footer inset">
  73. <Button type="danger" @click="formRef?.submit" round block>{{ $t('user.authentication.submit')
  74. }}</Button>
  75. </div>
  76. </template>
  77. </app-view>
  78. </template>
  79. <script lang="ts" setup>
  80. import { shallowRef, computed, ref, onMounted } from 'vue'
  81. import { CellGroup, Button, Field, Form, FormInstance, showFailToast, FieldRule, Popup, Picker, PickerConfirmEventParams } from 'vant'
  82. import { addAuthReq } from '@/business/user'
  83. import { fullloading, dialog } from '@/utils/vant'
  84. import { getCerTypePersonList } from "@/constants/account"
  85. import { useNavigation } from '@mobile/router/navigation'
  86. import { getIdCardAge } from '@/filters'
  87. import { validateRules } from '@/constants/regex'
  88. import { useRequest } from '@/hooks/request'
  89. import { getWskhOpenAccountConfigs } from '@/services/api/account'
  90. import { useQueryCusBankSignBank } from '@/business/bank'
  91. import { getCountryCodeList } from '@/constants/unit'
  92. import { i18n, useUserStore } from '@/stores'
  93. import AppUploader from '@mobile/components/base/uploader/index.vue'
  94. import AppSelect from '@mobile/components/base/select/index.vue'
  95. import service from '@/services'
  96. const formRef = shallowRef<FormInstance>()
  97. const { formData, formSubmit, modifyremark } = addAuthReq()
  98. const { router } = useNavigation()
  99. const { global: { t } } = i18n
  100. const userStore = useUserStore()
  101. const cerTypePersonList = getCerTypePersonList() // 证件类型列表
  102. // 是否弹出选择器
  103. const show = shallowRef(false)
  104. const datalist = computed(() => {
  105. return getCountryCodeList().map(e => {
  106. return { text: e.value, value: e.value }
  107. })
  108. })
  109. const countryCode = ref(datalist.value[0]?.value.toString() ?? '')
  110. const showHalfBodyPhoto = shallowRef('0')
  111. const showCardBackPhoto = shallowRef('0')
  112. const halfBodyPhotoTitle = shallowRef(t('user.authentication.halfbodyphoto'))
  113. const oem = service.getConfig('oem')
  114. const { banklist } = useQueryCusBankSignBank()
  115. const onCancel = () => {
  116. show.value = false
  117. }
  118. const onConfirm = ({ selectedValues: [value] }: PickerConfirmEventParams) => {
  119. show.value = false
  120. countryCode.value = value.toString()
  121. }
  122. // 获取网上开户配置
  123. useRequest(getWskhOpenAccountConfigs, {
  124. params: {
  125. configs: '53,54,78'
  126. },
  127. onSuccess: (res) => {
  128. /// 是否显示半身照和 证件背面照
  129. showCardBackPhoto.value = res.data.filter(e => e.configid === 53)[0].configvalue ?? '0'
  130. showHalfBodyPhoto.value = res.data.filter(e => e.configid === 54)[0].configvalue ?? '0'
  131. halfBodyPhotoTitle.value = res.data.filter(e => e.configid === 78)[0].configvalue ?? t('user.authentication.halfbodyphoto')
  132. }
  133. })
  134. const b_afterRead = (filePath: string) => {
  135. formData.cardfrontphotourl = filePath
  136. }
  137. const f_afterRead = (filePath: string) => {
  138. formData.cardbackphotourl = filePath
  139. }
  140. const h_afterRead = (filePath: string) => {
  141. formData.halfbodyphotourl = filePath
  142. }
  143. // 表单验证规则
  144. const formRules: { [key: string]: FieldRule[] } = {
  145. username: [{
  146. required: true,
  147. message: t("user.authentication.pleaseentertheusername"),
  148. }],
  149. cardnum: [{
  150. required: true,
  151. message: t("user.authentication.pleaseenterthecardnum"),
  152. validator: (val) => {
  153. // if (getIdCardAge(val)) {
  154. // return t("user.authentication.openfailure")
  155. // }
  156. // 待优化
  157. const enumItem = cerTypePersonList.find((e) => e.enumitemname === formData.cardtype)
  158. if (enumItem) {
  159. return new RegExp(enumItem.param1).test(val) || t('regex.cardno')
  160. }
  161. return t('regex.cardno')
  162. }
  163. }],
  164. cardbackphotourl: [{
  165. required: true,
  166. message: t("user.authentication.pleaseuploadthecardbackphoto"),
  167. }],
  168. cardfrontphotourl: [{
  169. required: true,
  170. message: t("user.authentication.pleaseuploadthecardfrontphoto"),
  171. }],
  172. bankid: [{
  173. message: t('banksign.Pleaseselectyourbank'),
  174. validator: () => {
  175. return !!formData.bankid
  176. }
  177. }],
  178. bankaccount: [{
  179. required: true,
  180. message: t('banksign.Pleaseenterbankno'),
  181. }],
  182. }
  183. const onSubmit = () => {
  184. fullloading((hideLoading) => {
  185. // 手机号+区号
  186. if (userStore.userInfo.mobile2 === '') {
  187. formData.mobilephone = countryCode.value + formData.mobilephone
  188. }
  189. formSubmit().then((res) => {
  190. /// 失败
  191. if (res.code.toString() != '0') {
  192. showFailToast(res.message)
  193. } else {
  194. hideLoading()
  195. dialog(t("user.authentication.opensuccess")).then(() => {
  196. router.back()
  197. })
  198. }
  199. }).catch((err) => {
  200. formData.cardnum = ''
  201. showFailToast(err)
  202. })
  203. })
  204. }
  205. onMounted(() => {
  206. formData.mobilephone = userStore.userInfo.mobile2
  207. })
  208. </script>