| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784 |
- <template>
- <view class="container">
- <wd-form ref="form" :model="formValue">
- <wd-cell-group border>
- <wd-input
- v-model="formValue.username"
- label="姓名"
- label-width="100px"
- prop="username"
- clearable
- placeholder="请输入姓名"
- :rules="[{ required: false, validator: validatorName, message: '请输入姓名' }]"
- />
- <wd-input
- v-if="cardType == '教师认证'"
- v-model="formValue.cardNumber"
- label="工号"
- label-width="100px"
- prop="cardNumber"
- clearable
- placeholder="请输入工号"
- :rules="[
- {
- required: false,
- message: '请输入工号'
- }
- ]"
- />
- <wd-input
- v-if="cardType == '暖心认证'"
- v-model="formValue.cardNumber"
- label="学号"
- label-width="100px"
- prop="cardNumber"
- clearable
- placeholder="请输入学号"
- :rules="[
- {
- required: false,
- message: '请输入学号'
- }
- ]"
- />
- <wd-input
- v-if="cardType == '教师认证'"
- v-model="formValue.college"
- label="所在院系"
- label-width="100px"
- prop="college"
- clearable
- placeholder="请输入所在院系"
- :rules="[
- {
- required: false,
- message: '请输入所在院系'
- }
- ]"
- />
- <wd-input
- v-if="cardType == '教师认证'"
- v-model="formValue.professor"
- label="职称"
- label-width="100px"
- prop="professor"
- clearable
- placeholder="请输入职称"
- :rules="[
- {
- required: false,
- message: '请输入职称'
- }
- ]"
- />
- <!-- <wd-input
- v-if="cardType == '暖心认证'"
- v-model="formValue.instructor"
- label="辅导员姓名"
- label-width="100px"
- prop="instructor"
- clearable
- placeholder="请输入辅导员姓名"
- :rules="[
- {
- required: false,
- message: '请输入辅导员姓名'
- }
- ]"
- /> -->
- <wd-input
- v-model="formValue.mobile"
- label="手机号"
- label-width="100px"
- prop="mobile"
- clearable
- placeholder="请输入手机号码"
- :rules="[
- {
- required: false,
- validator: validatorPhone,
- message: '请输入手机号码'
- }
- ]"
- />
- <wd-cell prop="imgurl" v-if="cardType == '教师认证'">
- <view class="form_title">上传证件:</view>
- <wd-upload :file-list="frontFileList" :custom-upload="customUpload1"
- :limit="1"
- :build-form-data="beforeChoose1"
- :formData="formData2"
- @change="handleFrontChange">
- <view class="upload">
- <wd-icon color="#ABA6A6" name="photo" size="27"></wd-icon>
- 身份证正面
- </view>
- </wd-upload>
- </wd-cell>
- <wd-cell prop="imgurlBack" v-if="cardType == '教师认证'">
- <wd-upload :file-list="backFileList"
- :custom-upload="customUpload"
- :limit="1"
- :build-form-data="beforeChoose"
- :formData="formData2"
- @change="handleFileChange"
- >
- <view class="upload">
- <wd-icon color="#ABA6A6" name="photo" size="27"></wd-icon>
- 身份证反面
- </view>
- </wd-upload>
- </wd-cell>
- </wd-cell-group>
- <view class="footer">
- <wd-button type="primary" size="large" block @click="handleSubmit">点击提交</wd-button>
- </view>
- </wd-form>
- </view>
- </template>
- <script setup>
- import { ref,computed,watch } from 'vue'
- import { onLoad } from '@dcloudio/uni-app'
- import { myRequest,myUploadFile } from '@/utils/api.ts'
- import getLessLimitSizeImage from '@/utils/imageCompress.js'
- const BASE_URL = 'https://car.meiyishuoo.com/ride-sharing/carBuy'; //
- const cardType = ref('')
- // 表格绑定数据
- const formValue = ref({
- id: uni.getStorageSync('carUserInfo').id ,
- username: '',
- cardNumber: '',
- college: '',
- professor: '',
- // instructor: '',
- mobile: '',
- file1: '',
- file2: '',
- })
- const info = ref({})
- // 存储两处上传的文件列表
- const frontFileList = ref([]); // 身份证正面
- const backFileList = ref([]); // 身份证反面
- // 上传额外参数(响应式)
- const formData2 = computed(() => ({
- type: 'idCardBack' // 身份证反面标识,固定参数
- }));
- // 表格DOM
- const form = ref(null)
- // 是否修改
- const ifXiu = ref(false)
- // 监听backFileList变化,同步到formValue.file1
- // watch(
- // backFileList,
- // (newList) => {
- // // 取最新上传的第一张图片的url(若存在)
- // if (newList.length > 0) {
- // formValue.value.file2 = newList[0] || '';
- // } else {
- // // 若列表为空,清空file2(可选)
- // formValue.value.file2 = '';
- // }
- // console.log('formValue.file2已同步:', formValue.value.file2,formValue.value);
- // },
- // { deep: true }, // 深度监听,确保数组内对象变化也能触发
-
- // frontFileList,
- // (newList) => {
- // // 取最新上传的第一张图片的url(若存在)
- // if (newList.length > 0) {
- // formValue.value.file1 = newList[0] || '';
- // } else {
- // // 若列表为空,清空file1(可选)
- // formValue.value.file1 = '';
- // }
- // console.log('formValue.file1已同步:', formValue.value.file1);
- // },
- // { deep: true }, // 深度监听,确保数组内对象变化也能触发
- // );
- onLoad((options) => {
- console.log(options)
- if (options.cardType) {
- cardType.value = options.cardType
- if (options.info) {
- ifXiu.value=true
- uni.setNavigationBarTitle({
- title: '修改认证'
- })
- formValue.value = JSON.parse(decodeURIComponent(options.info))
- console.log(formValue.value)
- // 同步已上传的图片到上传组件的文件列表
- if (formValue.value.file1) {
- frontFileList.value.push(formValue.value.file1)
- }
- if (formValue.value.file2) {
- backFileList.value.push(formValue.value.file2)
- }
- } else {
- ifXiu.value=false
- uni.setNavigationBarTitle({
- title: cardType.value
- })
- }
- }
- })
- // 处理身份证正面上传变化
- // 文件选择前的校验与参数处理
- const beforeChoose1 = async ({ file, formData, resolve }) => {
- // 1. 提取文件后缀(修复原代码中file.url的错误,小程序中临时路径用path)
- const tempPath = file.path || file.url; // 兼容H5和小程序
- const lastDotIndex = tempPath.lastIndexOf('.');
- const fileExt = lastDotIndex > -1 ? tempPath.slice(lastDotIndex + 1).toLowerCase() : '';
- console.log('文件信息:', file, '路径:', tempPath, '后缀:', fileExt);
- // 2. 校验文件是否已上传(通过文件名去重)
- if (frontFileList.value.some(item => item.name === file.name)) {
- uni.showToast({ title: '当前图片已上传,请选择其他照片', icon: 'none' });
- resolve(false); // 阻止上传
- return;
- }
- // 3. 校验文件大小(5M以内)
- if (file.size >= 5 * 1024 * 1024) {
- uni.showToast({ title: '请上传小于5M的图片', icon: 'none' });
- resolve(false); // 阻止上传
- return;
- }
- // 4. 校验文件类型
- if (!['png', 'jpg', 'jpeg'].includes(fileExt)) {
- uni.showToast({ title: '请上传png/jpg/jpeg格式的图片', icon: 'none' });
- resolve(false); // 阻止上传
- return;
- }
- // 校验通过:返回包含允许上传的标识(兼容组件要求)
- resolve({
- ...formData,
- allowUpload: true // 显式允许上传
- });
-
- try {
- // 调用封装的上传方法
- const res = await myUploadFile({
- url: '/filesload.action',
- filePath: file.path || file.url, // 临时文件路径
- name: 'myFile', // 后端接收文件的字段名
- formData: formData2.value // 额外参数
- });
-
- if (res.code === 200) {
- frontFileList.value.push(res.data.url);
- uni.showToast({ title: '上传成功', icon: 'none' });
- console.log('上传成功,图片链接:', res.data.url,frontFileList);
- } else {
- // 接口返回错误
- // onError(res.message || '上传失败1');
- uni.showToast({ title: res.message || '上传失败2', icon: 'none' });
- }
- } catch (err) {
- console.error('上传失败:', err);
- uni.showToast({ title: '网络异常,请重试', icon: 'none' });
- }
- };
- const handleFrontChange = async ({ fileList }) => {
- frontFileList.value = fileList; // 自动同步删除后的列表
- };
- // 处理身份证反面上传
- // 文件选择前的校验与参数处理
- const beforeChoose = async ({ file, formData, resolve }) => {
- // 1. 提取文件后缀(修复原代码中file.url的错误,小程序中临时路径用path)
- const tempPath = file.path || file.url; // 兼容H5和小程序
- const lastDotIndex = tempPath.lastIndexOf('.');
- const fileExt = lastDotIndex > -1 ? tempPath.slice(lastDotIndex + 1).toLowerCase() : '';
- console.log('文件信息:', file, '路径:', tempPath, '后缀:', fileExt);
- // 2. 校验文件是否已上传(通过文件名去重)
- if (backFileList.value.some(item => item.name === file.name)) {
- uni.showToast({ title: '当前图片已上传,请选择其他照片', icon: 'none' });
- resolve(false); // 阻止上传
- return;
- }
- // 3. 校验文件大小(5M以内)
- if (file.size >= 5 * 1024 * 1024) {
- uni.showToast({ title: '请上传小于5M的图片', icon: 'none' });
- resolve(false); // 阻止上传
- return;
- }
- // 4. 校验文件类型
- if (!['png', 'jpg', 'jpeg'].includes(fileExt)) {
- uni.showToast({ title: '请上传png/jpg/jpeg格式的图片', icon: 'none' });
- resolve(false); // 阻止上传
- return;
- }
- // 校验通过:返回包含允许上传的标识(兼容组件要求)
- resolve({
- ...formData,
- allowUpload: true // 显式允许上传
- });
- console.log('beforeChoose校验通过,允许上传');
-
- try {
- // 调用封装的上传方法
- const res = await myUploadFile({
- url: '/filesload.action',
- filePath: file.path || file.url, // 临时文件路径
- name: 'myFile', // 后端接收文件的字段名
- formData: formData2.value // 额外参数
- });
-
- if (res.code === 200) {
- console.log(122)
- // 上传成功:调用组件的onSuccess更新文件列表
- // onSuccess({
- // ...file,
- // url: res.data.url, // 后端返回的在线图片地址
- // status: 'success' // 标记为成功状态
- // });
- backFileList.value.push(res.data.url);
- uni.showToast({ title: '上传成功', icon: 'none' });
- console.log('上传成功,图片链接:', res.data.url,backFileList);
- } else {
- // 接口返回错误
- // onError(res.message || '上传失败1');
- uni.showToast({ title: res.message || '上传失败2', icon: 'none' });
- }
- } catch (err) {
- // 网络错误或其他异常
- // onError('网络异常,请重试');
- console.error('上传失败:', err);
- uni.showToast({ title: '网络异常,请重试', icon: 'none' });
- }
- };
- // 监听文件列表变化(删除后会触发)
- const handleFileChange = ({ fileList }) => {
- backFileList.value = fileList; // 自动同步删除后的列表
- // console.log('当前文件列表:', backFileList);
- };
- // // 自定义上传逻辑(覆盖默认action上传,更灵活控制)
- // const customUpload = async (options) => {
- // // 打印日志确认是否被调用
- // console.log('customUpload被触发,文件信息:', options.file);
- // console.log('kljlllll')
- // const { file, onSuccess, onError } = options;
- // try {
- // // 调用封装的上传方法
- // const res = await myUploadFile({
- // url: '/filesload.action',
- // filePath: file.path || file.url, // 临时文件路径
- // name: 'myFile', // 后端接收文件的字段名
- // formData: formData2.value // 额外参数
- // });
- // if (res.code === 200) {
- // // 上传成功:调用组件的onSuccess更新文件列表
- // onSuccess({
- // ...file,
- // url: res.data.url, // 后端返回的在线图片地址
- // status: 'success' // 标记为成功状态
- // });
- // console.log('上传成功,图片链接:', res.data.url);
- // } else {
- // // 接口返回错误
- // onError(res.message || '上传失败1');
- // uni.showToast({ title: res.message || '上传失败2', icon: 'none' });
- // }
- // } catch (err) {
- // // 网络错误或其他异常
- // onError('网络异常,请重试');
- // console.error('上传失败:', err);
- // uni.showToast({ title: '网络异常,请重试', icon: 'none' });
- // }
- // };
- // 保存按钮回调
- const handleSubmit = () => {
- console.log(cardType.value,'k')
-
- if(cardType.value == '教师认证'){
- form.value
- .validate()
- .then(({ valid, errors }) => {
- if (valid) {
- if (ifXiu.value) {
- // 修改请求
- submitEditReq()
- } else {
- // 新增请求
- submitAddReq()
- }
- }
- })
- .catch((error) => {
- console.log(error, 'error')
- })
- }else if(cardType.value == '暖心认证'){
- form.value
- .validate()
- .then(({ valid, errors }) => {
- if (valid) {
- if (ifXiu.value) {
- // 修改请求
- submitEditReqStu()
- } else {
- console.log(cardType.value,'k xxx')
- // 新增请求
- submitAddReqStu()
- }
- }
- })
- .catch((error) => {
- console.log(error, 'error')
- })
- }
- }
- //教师认证
- // 新增请求
- const submitAddReq = async () => {
- const leng=frontFileList.value.length-1
- const leng2=frontFileList.value.length-1
- if (frontFileList.value.length > 0) {
-
- formValue.value.file1 = frontFileList.value[leng];
- } else {
- // 若列表为空,清空file2(可选)
- formValue.value.file1 = '';
- uni.showToast({ title: '请上传身份证正面照片', icon: 'none' });
- }
- if (backFileList.value.length > 0) {
-
- formValue.value.file2 = backFileList.value[leng2];
- } else {
- // 若列表为空,清空file2(可选)
- formValue.value.file2 = '';
- uni.showToast({ title: '请上传身份证反面照片', icon: 'none' });
- }
-
- // 基础数据(必传字段)
- const requestData = {
- username: formValue.value.username,
- cardNumber: formValue.value.cardNumber,
- college: formValue.value.college,
- professor: formValue.value.professor,
- mobile: formValue.value.mobile,
- file1: formValue.value.file1,
- file2: formValue.value.file2
- // 先不包含 professor
- };
- console.log(formValue.value,'aaammmmm')
- const res = await myRequest({
- url: '/vertifyinsertTea.action',
- method: 'post',
- data: requestData
- })
- // console.log(res)
- if (res.code == 200) {
- uni.showToast({
- title: res.message,
- icon: 'success'
- })
- setTimeout(() => {
- uni.reLaunch({
- url: '/pages/transportation/transportation'
- })
- }, 1500)
- }
- }
- // 修改请求
- const submitEditReq = async () => {
- const leng=frontFileList.value.length-1
- const leng2=frontFileList.value.length-1
- // if (frontFileList.value.length > 0) {
-
- // formValue.value.file1 = frontFileList.value[leng];
- // } else {
- // // 若列表为空,清空file2(可选)
- // formValue.value.file1 = '';
- // uni.showToast({ title: '请上传身份证正面照片', icon: 'none' });
- // }
- // if (backFileList.value.length > 0) {
-
- // formValue.value.file2 = backFileList.value[leng2];
- // } else {
- // // 若列表为空,清空file2(可选)
- // formValue.value.file2 = '';
- // uni.showToast({ title: '请上传身份证反面照片', icon: 'none' });
- // }
-
- // 基础数据(必传字段)
- const requestData = {
- id: formValue.value.id,
- username: formValue.value.username,
- cardNumber: formValue.value.cardNumber,
- college: formValue.value.college,
- professor: formValue.value.professor,
- mobile: formValue.value.mobile,
- file1: formValue.value.file1,
- file2: formValue.value.file2
- // 先不包含 professor
- };
- console.log(formValue.value,'aaammmmmxiu')
- const res = await myRequest({
- url: '/vertifyupdateTea.action',
- method: 'post',
- data: requestData
- })
- // console.log(res)
- if (res.code == 200) {
- uni.showToast({
- title: res.message,
- icon: 'success'
- })
- setTimeout(() => {
- uni.reLaunch({
- url: '/pages/transportation/transportation'
- })
- }, 1500)
- }
- else{
- uni.showToast({
- title: res.message,
- icon: 'err'
- })
- }
- }
- //暖心认证
- // 新增请求
- const submitAddReqStu = async () => {
- const leng=frontFileList.value.length-1
- const leng2=frontFileList.value.length-1
- // if (frontFileList.value.length > 0) {
-
- // formValue.value.file1 = frontFileList.value[leng];
- // } else {
- // // 若列表为空,清空file2(可选)
- // formValue.value.file1 = '';
- // uni.showToast({ title: '请上传身份证正面照片', icon: 'none' });
- // }
- // if (backFileList.value.length > 0) {
-
- // formValue.value.file2 = backFileList.value[leng2];
- // } else {
- // // 若列表为空,清空file2(可选)
- // formValue.value.file2 = '';
- // uni.showToast({ title: '请上传身份证反面照片', icon: 'none' });
- // }
-
- // 基础数据(必传字段)
- const requestData = {
- username: formValue.value.username,
- cardNumber: formValue.value.cardNumber,
- // college: formValue.value.college,
- // instructor: formValue.value.instructor,
- mobile: formValue.value.mobile,
- // file1: formValue.value.file1,
- // file2: formValue.value.file2
- // 先不包含 professor
- };
- console.log(formValue.value,'aaammmmm')
- const res = await myRequest({
- url: '/vertifyinsertPtu.action',
- method: 'post',
- data: formValue.value
- })
- console.log(res,'lll',res.code == 200)
- if (res.code == 200) {
- uni.showToast({
- title: res.message,
- icon: 'success'
- })
- setTimeout(() => {
- uni.reLaunch({
- url: '/pages/transportation/transportation'
- })
- }, 1500)
- }else{
- console.log(res,'lll')
- uni.showToast({
- title: res.message,
- icon: 'err'
- })
- }
- }
- // 修改请求
- const submitEditReqStu = async () => {
- const leng=frontFileList.value.length-1
- const leng2=frontFileList.value.length-1
- if (frontFileList.value.length > 0) {
-
- formValue.value.file1 = frontFileList.value[leng];
- } else {
- // 若列表为空,清空file2(可选)
- formValue.value.file1 = '';
- uni.showToast({ title: '请上传身份证正面照片', icon: 'none' });
- }
- if (backFileList.value.length > 0) {
-
- formValue.value.file2 = backFileList.value[leng2];
- } else {
- // 若列表为空,清空file2(可选)
- formValue.value.file2 = '';
- uni.showToast({ title: '请上传身份证反面照片', icon: 'none' });
- }
-
- // 基础数据(必传字段)
- const requestData = {
- id: formValue.value.id,
- username: formValue.value.username,
- cardNumber: formValue.value.cardNumber,
- // college: formValue.value.college,
- // instructor: formValue.value.instructor,
- mobile: formValue.value.mobile,
- // file1: formValue.value.file1,
- // file2: formValue.value.file2
- // 先不包含 professor
- };
- console.log(formValue.value,'aaammmmm')
- const res = await myRequest({
- url: '/vertifyupdatePtu.action',
- method: 'post',
- data: formValue.value
- })
- // console.log(res)
- if (res.code == 200) {
- uni.showToast({
- title: res.message,
- icon: 'success'
- })
- setTimeout(() => {
- uni.reLaunch({
- url: '/pages/transportation/transportation'
- })
- }, 1500)
- }
- }
- // 姓名验证规则
- const validatorName = (val) => {
- const result = val.replace(/\s+/g, '')
- if (result) {
- if (result.length > 1 && result.length < 5) {
- return Promise.resolve()
- } else {
- return Promise.reject('姓名为2-4个字符')
- }
- }
- }
- // 身份证号码验证规则
- const validatorNum = (val) => {
- if (val) {
- // 去除空格
- const cleanedId = val.replace(/\s+/g, '')
- // 基本格式校验:18位,前17位数字,最后一位可以是数字或X
- const idReg = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/
- if (!idReg.test(cleanedId)) {
- return Promise.reject('请输入有效的18位身份证号码')
- }
- // 校验码验证
- // 加权因子
- const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
- // 校验码对应值
- const parityBits = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
- let sum = 0
- const code = cleanedId.toUpperCase() // 转为大写
- // 计算前17位与对应因子乘积的和
- for (let i = 0; i < 17; i++) {
- sum += parseInt(code.charAt(i)) * factors[i]
- }
- // 计算校验码
- const checkCode = parityBits[sum % 11]
- // 验证校验码
- if (code.charAt(17) !== checkCode) {
- return Promise.reject('身份证号码校验无效')
- }
- // 验证出生日期
- const year = parseInt(code.substr(6, 4))
- const month = parseInt(code.substr(10, 2))
- const day = parseInt(code.substr(12, 2))
- const birthDate = new Date(year, month - 1, day)
- if (birthDate.getFullYear() !== year || birthDate.getMonth() + 1 !== month || birthDate.getDate() !== day) {
- return Promise.reject('身份证号码中的出生日期无效')
- }
- return Promise.resolve()
- }
- }
- // 时间号码验证规则
- const validatorPhone = (val) => {
- const phoneReg = /^1[3-9]\d{9}$/
- if (val) {
- if (phoneReg.test(val)) {
- return Promise.resolve()
- } else {
- return Promise.reject('手机号码格式错误')
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .container {
- box-sizing: border-box;
- padding: 20rpx 0;
- height: 100vh;
- background-color: #fff;
- overflow-y: auto;
- .form_title {
- margin-bottom: 30rpx;
- font-size: 28rpx;
- text-align: left;
- }
- .upload {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- width: 690rpx;
- height: 316rpx;
- font-size: 28rpx;
- color: #bfbfbf;
- border-radius: 16rpx;
- border: 2rpx solid #707070;
- background-color: #fff;
- }
- .footer {
- margin: 50rpx auto 30rpx;
- width: 700rpx;
- :deep(.wd-button) {
- background-color: #ff8205;
- }
- }
- }
- </style>
|