userIdCard.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <template>
  2. <ay-container>
  3. <div class="form">
  4. <uni-forms ref="form" :modelValue="data" :rules="rules" validateTrigger="blur">
  5. <div class="font-bold bs-fz mb-spacd2">上传并提交您的证件照片</div>
  6. <div class="s-fz gray-color mb-spac">为配合国家监管要求,请上传身份证正反面照片</div>
  7. <!-- <div class="p-fz mt-spac mb-spac">身份证照片</div> -->
  8. <div class="center flex-col">
  9. <uni-forms-item name="idCardFront">
  10. <div class="chunk id-card id-card-front" @click="methods.upload(0)">
  11. <image
  12. class="image"
  13. v-show="data.idCardFront"
  14. :src="ay.getResourceUrl(data.idCardFront)"
  15. mode="scaleToFill"
  16. />
  17. <div class="desc">点击上传身份证人像面</div>
  18. </div>
  19. </uni-forms-item>
  20. <uni-forms-item name="idCardBack">
  21. <div class="chunk id-card id-card-back" @click="methods.upload(1)">
  22. <image
  23. class="image"
  24. v-show="data.idCardBack"
  25. :src="ay.getResourceUrl(data.idCardBack)"
  26. mode="scaleToFill"
  27. />
  28. <div class="desc">点击上传身份证国徽面</div>
  29. </div>
  30. </uni-forms-item>
  31. </div>
  32. <uni-forms-item>
  33. <div class="p-fz mb-spac">拍摄要求</div>
  34. <div class="center justify-between">
  35. <image class="error-img" src="@img/idCard/idCard0.png" />
  36. <image class="error-img" src="@img/idCard/idCard1.png" />
  37. <image class="error-img" src="@img/idCard/idCard_error2.png" />
  38. <image class="error-img" src="@img/idCard/idCard_error3.png" />
  39. </div>
  40. </uni-forms-item>
  41. <uni-forms-item label="姓名" name="realname">
  42. <template #label>
  43. <uni-icons type="person" color="" size="32" class="mr-spac" />
  44. </template>
  45. <uni-easyinput v-model="data.realname" placeholder="请输入姓名" />
  46. </uni-forms-item>
  47. <uni-forms-item label="身份证号" name="idcardNo">
  48. <template #label>
  49. <uni-icons type="auth" color="" size="32" class="mr-spac" />
  50. </template>
  51. <uni-easyinput v-model="data.idcardNo" placeholder="请输入身份证号" />
  52. </uni-forms-item>
  53. <uni-forms-item name="idcardValidity">
  54. <div class="s-fz mb-spac">身份证有效期</div>
  55. <div class="center justify-start">
  56. <uni-datetime-picker
  57. v-model="data.idcardValidityStart"
  58. type="date"
  59. :clearIcon="false"
  60. placeholder="开始日期"
  61. :end="safeDate"
  62. class="flex-auto"
  63. />
  64. <div class="ml-spacd2 mr-spacd2">--</div>
  65. <checkbox-group @change="methods.checkChange" class="mr-spacd4">
  66. <label class="center">
  67. <checkbox value="check" :checked="data.idcardValidityLong" class="checkbox" />
  68. <span>长期</span>
  69. </label>
  70. </checkbox-group>
  71. <uni-datetime-picker
  72. v-model="data.idcardValidityEnd"
  73. type="date"
  74. :clearIcon="false"
  75. placeholder="结束时间"
  76. :start="safeDate"
  77. :style="{ visibility: data.idcardValidityLong ? 'hidden' : '' }"
  78. />
  79. </div>
  80. <!-- <uni-easyinput v-model="data.idcardValidity" placeholder="请输入身份证有效期" /> -->
  81. </uni-forms-item>
  82. </uni-forms>
  83. </div>
  84. <div class="btns">
  85. <button
  86. type="primary"
  87. @click="methods.auth"
  88. :disabled="store.webapi.user.idcard_auth.ios"
  89. :loading="store.webapi.user.idcard_auth.ing"
  90. >
  91. 开始认证
  92. </button>
  93. </div>
  94. </ay-container>
  95. </template>
  96. <script lang="ts" setup>
  97. import { Loading } from 'vant'
  98. const form = ref()
  99. const rules = {
  100. idCardFront: {
  101. rules: [
  102. {
  103. required: true,
  104. errorMessage: '请上传身份证正面照片',
  105. validateFunction() {
  106. return !!data.idCardFront
  107. },
  108. },
  109. ],
  110. },
  111. idCardBack: {
  112. rules: [
  113. {
  114. required: true,
  115. errorMessage: '请上传身份证反面照片',
  116. validateFunction() {
  117. return !!data.idCardBack
  118. },
  119. },
  120. ],
  121. },
  122. realname: {
  123. rules: [
  124. {
  125. required: true,
  126. errorMessage: '请输入姓名',
  127. },
  128. ],
  129. },
  130. idcardNo: {
  131. rules: [
  132. {
  133. required: true,
  134. errorMessage: '请输入身份证号',
  135. },
  136. ],
  137. },
  138. idcardValidity: {
  139. rules: [
  140. {
  141. required: true,
  142. errorMessage: '请选择有效期限',
  143. validateFunction() {
  144. return !!(data.idcardValidityStart && (data.idcardValidityEnd || data.idcardValidityLong))
  145. },
  146. },
  147. ],
  148. },
  149. }
  150. const data = reactive({
  151. idCardFront: '',
  152. idCardBack: '',
  153. realname: '',
  154. idcardNo: '',
  155. idcardValidityStart: '',
  156. idcardValidityEnd: '',
  157. idcardValidityLong: false,
  158. // 定义这个属性默认值:-, 是为了激活验证,否则idCard对应的validateFunction验证不生效
  159. idcardValidity: '-',
  160. })
  161. const safeDate = computed(() => {
  162. const rv: any = Date.now()
  163. // if (data.idcardValidityEnd) {
  164. // rv = data.idcardValidityEnd
  165. // }
  166. return rv
  167. })
  168. const methods = {
  169. upload(type) {
  170. if (store.webapi.message.file.ing) {
  171. return
  172. }
  173. webapi.message
  174. .file(
  175. {},
  176. {
  177. showLoading: true,
  178. loadingText: '上传中...',
  179. },
  180. )
  181. .then((res) => {
  182. if (type === 0) {
  183. data.idCardFront = res
  184. }
  185. if (type === 1) {
  186. data.idCardBack = res
  187. }
  188. console.log(res)
  189. })
  190. },
  191. checkChange(e) {
  192. data.idcardValidityLong = !!e.detail.value.length
  193. },
  194. auth() {
  195. form.value
  196. .validate()
  197. .then(() => {
  198. const startDate = func.getDate(data.idcardValidityStart).format(enums.FormatType.YMDNC)
  199. let endDate = '长期'
  200. if (!data.idcardValidityLong) {
  201. endDate = func.getDate(data.idcardValidityEnd).format(enums.FormatType.YMDNC)
  202. }
  203. const param = {
  204. idcardFaceUrl: data.idCardFront,
  205. idcardBackUrl: data.idCardBack,
  206. realname: data.realname,
  207. idcardNo: data.idcardNo,
  208. idcardValidity: `${startDate}~${endDate}`,
  209. }
  210. webapi.user.idcard_auth(param).then((res) => {
  211. if (res) {
  212. func.native.showToast('实名认证成功!').then(() => {
  213. ay.navigateBack({ aceas: {} })
  214. })
  215. }
  216. })
  217. })
  218. .catch((err) => {
  219. if (['realname', 'idcardNo', 'idcardValidity'].includes(err[0].key)) {
  220. uni.pageScrollTo({
  221. scrollTop: config.common.SystemInfo.screenHeight + 100,
  222. })
  223. }
  224. })
  225. },
  226. }
  227. ay.entrance(() => {})
  228. </script>
  229. <style lang="scss" scoped>
  230. .form {
  231. padding-bottom: 200rpx;
  232. }
  233. .id-card {
  234. width: 668rpx;
  235. height: 434rpx;
  236. padding: 0;
  237. background-repeat: no-repeat;
  238. background-position: center 50px;
  239. background-size: contain;
  240. background-size: 50%;
  241. & .image {
  242. position: relative;
  243. z-index: 1;
  244. width: 100%;
  245. height: 100%;
  246. }
  247. & .desc {
  248. position: absolute;
  249. bottom: $p-spac * 3;
  250. width: 100%;
  251. font-size: $p-fz;
  252. color: $gray-color;
  253. text-align: center;
  254. }
  255. }
  256. .id-card-front {
  257. background-image: url('@img/idCard/idCard_front.png');
  258. }
  259. .id-card-back {
  260. background-image: url('@img/idCard/idCard_back.png');
  261. }
  262. .error-img {
  263. position: relative;
  264. width: 160rpx;
  265. height: 100rpx;
  266. }
  267. .chunk {
  268. margin: 0;
  269. overflow: unset;
  270. }
  271. </style>