authenticate.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <template>
  2. <view class="container">
  3. <wd-form ref="form" :model="formValue">
  4. <wd-cell-group border>
  5. <wd-input
  6. v-model="formValue.username"
  7. label="姓名"
  8. label-width="100px"
  9. prop="username"
  10. clearable
  11. placeholder="请输入姓名"
  12. :rules="[{ required: false, validator: validatorName, message: '请输入姓名' }]"
  13. />
  14. <wd-input
  15. v-if="cardType == '教师认证'"
  16. v-model="formValue.num"
  17. label="工号"
  18. label-width="100px"
  19. prop="num"
  20. clearable
  21. placeholder="请输入工号"
  22. :rules="[
  23. {
  24. required: false,
  25. validator: validatorNum,
  26. message: '请输入工号'
  27. }
  28. ]"
  29. />
  30. <wd-input
  31. v-if="cardType == '暖心认证'"
  32. v-model="formValue.studentNum"
  33. label="学号"
  34. label-width="100px"
  35. prop="studentNum"
  36. clearable
  37. placeholder="请输入学号"
  38. :rules="[
  39. {
  40. required: false,
  41. validator: validatorNum,
  42. message: '请输入学号'
  43. }
  44. ]"
  45. />
  46. <wd-input
  47. v-model="formValue.faculty"
  48. label="所在院系"
  49. label-width="100px"
  50. prop="faculty"
  51. clearable
  52. placeholder="请输入所在院系"
  53. :rules="[
  54. {
  55. required: false,
  56. validator: validatorNum,
  57. message: '请输入所在院系'
  58. }
  59. ]"
  60. />
  61. <wd-input
  62. v-if="cardType == '教师认证'"
  63. v-model="formValue.worker"
  64. label="职称"
  65. label-width="100px"
  66. prop="worker"
  67. clearable
  68. placeholder="请输入职称"
  69. :rules="[
  70. {
  71. required: false,
  72. validator: validatorNum,
  73. message: '请输入职称'
  74. }
  75. ]"
  76. />
  77. <wd-input
  78. v-if="cardType == '暖心认证'"
  79. v-model="formValue.teacherName"
  80. label="辅导员姓名"
  81. label-width="100px"
  82. prop="teacherName"
  83. clearable
  84. placeholder="请输入辅导员姓名"
  85. :rules="[
  86. {
  87. required: false,
  88. validator: validatorNum,
  89. message: '请输入辅导员姓名'
  90. }
  91. ]"
  92. />
  93. <wd-input
  94. v-model="formValue.mobile"
  95. label="手机号"
  96. label-width="100px"
  97. prop="mobile"
  98. clearable
  99. placeholder="请输入手机号码"
  100. :rules="[
  101. {
  102. required: false,
  103. validator: validatorPhone,
  104. message: '请输入手机号码'
  105. }
  106. ]"
  107. />
  108. <wd-cell prop="imgurl">
  109. <view class="form_title">上传证件:</view>
  110. <wd-upload :file-list="formValue.imgurl" action="https://ftf.jd.com/api/uploadImg" @change="handleFileChange">
  111. <view class="upload">
  112. <wd-icon color="#ABA6A6" name="photo" size="27"></wd-icon>
  113. 身份证正面
  114. </view>
  115. </wd-upload>
  116. </wd-cell>
  117. <wd-cell prop="imgurlBack">
  118. <wd-upload :file-list="formValue.imgurlBack" action="https://ftf.jd.com/api/uploadImg" @change="handleFileChange">
  119. <view class="upload">
  120. <wd-icon color="#ABA6A6" name="photo" size="27"></wd-icon>
  121. 身份证反面
  122. </view>
  123. </wd-upload>
  124. </wd-cell>
  125. </wd-cell-group>
  126. <view class="footer">
  127. <wd-button type="primary" size="large" block @click="handleSubmit">点击提交</wd-button>
  128. </view>
  129. </wd-form>
  130. </view>
  131. </template>
  132. <script setup>
  133. import { ref } from 'vue'
  134. import { onLoad } from '@dcloudio/uni-app'
  135. const cardType = ref('')
  136. // 表格绑定数据
  137. const formValue = ref({
  138. username: '',
  139. num: '',
  140. studentNum: '',
  141. faculty: '',
  142. worker: '',
  143. teacherName: '',
  144. mobile: '',
  145. imgurl: [],
  146. imgurlBack: []
  147. })
  148. // 表格DOM
  149. const form = ref(null)
  150. onLoad((options) => {
  151. if (options.cardType) {
  152. cardType.value = options.cardType
  153. uni.setNavigationBarTitle({
  154. title: cardType.value
  155. })
  156. }
  157. })
  158. const handleFileChange = () => {}
  159. // 保存按钮回调
  160. const handleSubmit = () => {
  161. form.value
  162. .validate()
  163. .then(({ valid, errors }) => {
  164. if (valid) {
  165. if (formValue.value.id) {
  166. // 修改请求
  167. // submitEditReq()
  168. } else {
  169. // 新增请求
  170. // submitAddReq()
  171. }
  172. }
  173. })
  174. .catch((error) => {
  175. console.log(error, 'error')
  176. })
  177. }
  178. // 姓名验证规则
  179. const validatorName = (val) => {
  180. const result = val.replace(/\s+/g, '')
  181. if (result) {
  182. if (result.length > 1 && result.length < 5) {
  183. return Promise.resolve()
  184. } else {
  185. return Promise.reject('姓名为2-4个字符')
  186. }
  187. }
  188. }
  189. // 身份证号码验证规则
  190. const validatorNum = (val) => {
  191. if (val) {
  192. // 去除空格
  193. const cleanedId = val.replace(/\s+/g, '')
  194. // 基本格式校验:18位,前17位数字,最后一位可以是数字或X
  195. const idReg = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  196. if (!idReg.test(cleanedId)) {
  197. return Promise.reject('请输入有效的18位身份证号码')
  198. }
  199. // 校验码验证
  200. // 加权因子
  201. const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
  202. // 校验码对应值
  203. const parityBits = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
  204. let sum = 0
  205. const code = cleanedId.toUpperCase() // 转为大写
  206. // 计算前17位与对应因子乘积的和
  207. for (let i = 0; i < 17; i++) {
  208. sum += parseInt(code.charAt(i)) * factors[i]
  209. }
  210. // 计算校验码
  211. const checkCode = parityBits[sum % 11]
  212. // 验证校验码
  213. if (code.charAt(17) !== checkCode) {
  214. return Promise.reject('身份证号码校验无效')
  215. }
  216. // 验证出生日期
  217. const year = parseInt(code.substr(6, 4))
  218. const month = parseInt(code.substr(10, 2))
  219. const day = parseInt(code.substr(12, 2))
  220. const birthDate = new Date(year, month - 1, day)
  221. if (birthDate.getFullYear() !== year || birthDate.getMonth() + 1 !== month || birthDate.getDate() !== day) {
  222. return Promise.reject('身份证号码中的出生日期无效')
  223. }
  224. return Promise.resolve()
  225. }
  226. }
  227. // 时间号码验证规则
  228. const validatorPhone = (val) => {
  229. const phoneReg = /^1[3-9]\d{9}$/
  230. if (val) {
  231. if (phoneReg.test(val)) {
  232. return Promise.resolve()
  233. } else {
  234. return Promise.reject('手机号码格式错误')
  235. }
  236. }
  237. }
  238. </script>
  239. <style lang="scss" scoped>
  240. .container {
  241. box-sizing: border-box;
  242. padding: 20rpx 0;
  243. height: 100vh;
  244. background-color: #fff;
  245. overflow-y: auto;
  246. .form_title {
  247. margin-bottom: 30rpx;
  248. font-size: 28rpx;
  249. text-align: left;
  250. }
  251. .upload {
  252. display: flex;
  253. flex-direction: column;
  254. align-items: center;
  255. justify-content: center;
  256. width: 690rpx;
  257. height: 316rpx;
  258. font-size: 28rpx;
  259. color: #bfbfbf;
  260. border-radius: 16rpx;
  261. border: 2rpx solid #707070;
  262. background-color: #fff;
  263. }
  264. .footer {
  265. margin: 50rpx auto 30rpx;
  266. width: 700rpx;
  267. :deep(.wd-button) {
  268. background-color: #ff8205;
  269. }
  270. }
  271. }
  272. </style>