297 lines
7.6 KiB
JavaScript
297 lines
7.6 KiB
JavaScript
const auth = require('../../../utils/auth');
|
||
|
||
const PHONE_RE = /^1[3456789]\d{9}$/;
|
||
|
||
Page({
|
||
data: {
|
||
activeTab: 1, // 1=身份证 2=护照
|
||
|
||
// 上传图片(后端一般需要 url;若你有上传接口,把本地路径上传后替换这里即可)
|
||
idCardImageUrl: '',
|
||
idCardBackImageUrl: '',
|
||
passportImageUrl: '',
|
||
|
||
// 表单字段
|
||
name: '',
|
||
idCardNumber: '',
|
||
birthDate: '',
|
||
genderOptions: [
|
||
{ value: 'M', label: '男' },
|
||
{ value: 'F', label: '女' }
|
||
],
|
||
genderIndex: 0,
|
||
mobile: '',
|
||
verificationCode: '',
|
||
|
||
// UI 状态
|
||
readonlyName: false,
|
||
readonlyId: false,
|
||
submitting: false,
|
||
codeSending: false,
|
||
countdown: 0,
|
||
refresherTriggered: false
|
||
},
|
||
|
||
_timer: null,
|
||
|
||
onLoad() {
|
||
this.loadAuth();
|
||
},
|
||
|
||
onShow() {
|
||
const accessToken = wx.getStorageSync('accessToken') || '';
|
||
if (!accessToken) {
|
||
wx.redirectTo({ url: '/subpackages/mine/login/login' });
|
||
}
|
||
},
|
||
|
||
onUnload() {
|
||
this._clearTimer();
|
||
},
|
||
|
||
onPullDownRefresh() {
|
||
this.loadAuth().finally(() => wx.stopPullDownRefresh());
|
||
},
|
||
|
||
onRefresh() {
|
||
if (this.data.refresherTriggered) return;
|
||
this.setData({ refresherTriggered: true });
|
||
this.loadAuth().finally(() => this.setData({ refresherTriggered: false }));
|
||
},
|
||
|
||
onBack() {
|
||
if (getCurrentPages().length > 1) {
|
||
wx.navigateBack({ delta: 1 });
|
||
} else {
|
||
wx.switchTab({ url: '/pages/mine/mine' });
|
||
}
|
||
},
|
||
|
||
onSwitchTab(e) {
|
||
const tab = Number(e.currentTarget.dataset.tab);
|
||
if (tab === this.data.activeTab) return;
|
||
this.setData({
|
||
activeTab: tab,
|
||
verificationCode: ''
|
||
});
|
||
},
|
||
|
||
loadAuth() {
|
||
return auth
|
||
.fetchMyAuth()
|
||
.then((res) => {
|
||
const d = res && typeof res === 'object' ? res : {};
|
||
const name = d.name || d.realName || '';
|
||
const mobile = d.mobile || d.phone || '';
|
||
const idCardNumber = d.idCardNumber || d.idNumber || '';
|
||
const idCardImageUrl = d.idCardImageUrl || d.idCardFrontImageUrl || '';
|
||
const idCardBackImageUrl = d.idCardBackImageUrl || '';
|
||
const passportImageUrl = d.passportImageUrl || '';
|
||
const birthDate = d.birthDate || d.birthday || '';
|
||
const gender = (d.gender || d.sex || '').toString().toUpperCase();
|
||
const genderIndex = gender === 'F' || gender === '女' || gender === '2' ? 1 : 0;
|
||
|
||
// 有已提交信息时,按产品稿表现为“自动识别/灰色不可修改”
|
||
const readonlyName = Boolean(name);
|
||
const readonlyId = Boolean(idCardNumber);
|
||
|
||
this.setData({
|
||
name,
|
||
mobile,
|
||
idCardNumber,
|
||
idCardImageUrl,
|
||
idCardBackImageUrl,
|
||
passportImageUrl,
|
||
birthDate,
|
||
genderIndex,
|
||
readonlyName,
|
||
readonlyId
|
||
});
|
||
})
|
||
.catch(() => {});
|
||
},
|
||
|
||
onChooseImage(e) {
|
||
const kind = e.currentTarget.dataset.kind;
|
||
wx.chooseMedia({
|
||
count: 1,
|
||
mediaType: ['image'],
|
||
sourceType: ['album', 'camera'],
|
||
success: (res) => {
|
||
const tempFilePath = res.tempFiles && res.tempFiles[0] ? res.tempFiles[0].tempFilePath : '';
|
||
if (!tempFilePath) return;
|
||
if (kind === 'idFront') this.setData({ idCardImageUrl: tempFilePath });
|
||
else if (kind === 'idBack') this.setData({ idCardBackImageUrl: tempFilePath });
|
||
else if (kind === 'passport') this.setData({ passportImageUrl: tempFilePath });
|
||
}
|
||
});
|
||
},
|
||
|
||
onNameInput(e) {
|
||
this.setData({ name: (e.detail.value || '').trim() });
|
||
},
|
||
|
||
onIdInput(e) {
|
||
this.setData({ idCardNumber: (e.detail.value || '').trim() });
|
||
},
|
||
|
||
onBirthChange(e) {
|
||
this.setData({ birthDate: e.detail.value || '' });
|
||
},
|
||
|
||
onGenderChange(e) {
|
||
this.setData({ genderIndex: Number(e.detail.value || 0) });
|
||
},
|
||
|
||
onMobileInput(e) {
|
||
this.setData({ mobile: (e.detail.value || '').trim() });
|
||
},
|
||
|
||
onCodeInput(e) {
|
||
this.setData({ verificationCode: (e.detail.value || '').trim() });
|
||
},
|
||
|
||
onSendCodeTap() {
|
||
const { mobile, countdown, codeSending } = this.data;
|
||
if (codeSending || countdown > 0) return;
|
||
if (!PHONE_RE.test(mobile)) {
|
||
wx.showToast({ title: '请输入正确手机号', icon: 'none' });
|
||
return;
|
||
}
|
||
|
||
this.setData({ codeSending: true });
|
||
wx.showLoading({ title: '发送中...' });
|
||
auth
|
||
.sendVerificationCode(mobile)
|
||
.then(() => {
|
||
wx.showToast({ title: '验证码已发送', icon: 'success' });
|
||
this._startCountdown(60);
|
||
})
|
||
.catch(() => {
|
||
wx.showToast({ title: '发送失败', icon: 'none' });
|
||
})
|
||
.finally(() => {
|
||
this.setData({ codeSending: false });
|
||
wx.hideLoading();
|
||
});
|
||
},
|
||
|
||
_startCountdown(sec) {
|
||
this._clearTimer();
|
||
this.setData({ countdown: sec });
|
||
this._timer = setInterval(() => {
|
||
const next = this.data.countdown - 1;
|
||
if (next <= 0) {
|
||
this._clearTimer();
|
||
this.setData({ countdown: 0 });
|
||
} else {
|
||
this.setData({ countdown: next });
|
||
}
|
||
}, 1000);
|
||
},
|
||
|
||
_clearTimer() {
|
||
if (this._timer) {
|
||
clearInterval(this._timer);
|
||
this._timer = null;
|
||
}
|
||
},
|
||
|
||
onSubmitTap() {
|
||
if (this.data.submitting) return;
|
||
|
||
const {
|
||
activeTab,
|
||
idCardImageUrl,
|
||
idCardBackImageUrl,
|
||
passportImageUrl,
|
||
name,
|
||
idCardNumber,
|
||
birthDate,
|
||
genderOptions,
|
||
genderIndex,
|
||
mobile,
|
||
verificationCode
|
||
} = this.data;
|
||
|
||
if (!name) {
|
||
wx.showToast({ title: '请输入姓名', icon: 'none' });
|
||
return;
|
||
}
|
||
if (!PHONE_RE.test(mobile)) {
|
||
wx.showToast({ title: '请输入正确手机号', icon: 'none' });
|
||
return;
|
||
}
|
||
if (!verificationCode) {
|
||
wx.showToast({ title: '请输入验证码', icon: 'none' });
|
||
return;
|
||
}
|
||
|
||
if (activeTab === 1) {
|
||
if (!idCardImageUrl || !idCardBackImageUrl) {
|
||
wx.showToast({ title: '请上传身份证正反面', icon: 'none' });
|
||
return;
|
||
}
|
||
if (!idCardNumber) {
|
||
wx.showToast({ title: '请输入身份证号', icon: 'none' });
|
||
return;
|
||
}
|
||
} else {
|
||
if (!passportImageUrl) {
|
||
wx.showToast({ title: '请上传护照', icon: 'none' });
|
||
return;
|
||
}
|
||
if (!birthDate) {
|
||
wx.showToast({ title: '请选择出生日期', icon: 'none' });
|
||
return;
|
||
}
|
||
}
|
||
|
||
const genderValue = genderOptions[genderIndex] ? genderOptions[genderIndex].value : 'M';
|
||
|
||
// 说明:当前项目未发现通用“图片上传换 URL”的接口;这里会把本地路径直接提交。
|
||
// 如果你有上传接口(返回远程 url),把选择图片后先上传并把 url 写回 *ImageUrl 字段即可无缝对接。
|
||
const payload =
|
||
activeTab === 1
|
||
? {
|
||
authType: 'ID_CARD',
|
||
name,
|
||
mobile,
|
||
verificationCode,
|
||
gender: genderValue,
|
||
idCardNumber,
|
||
idCardImageUrl,
|
||
idCardBackImageUrl
|
||
}
|
||
: {
|
||
authType: 'PASSPORT',
|
||
name,
|
||
mobile,
|
||
verificationCode,
|
||
gender: genderValue,
|
||
birthDate,
|
||
passportImageUrl
|
||
};
|
||
|
||
this.setData({ submitting: true });
|
||
wx.showLoading({ title: '提交中...' });
|
||
|
||
auth
|
||
.submitMyAuth(payload)
|
||
.then(() => {
|
||
wx.showToast({ title: '提交成功', icon: 'success' });
|
||
setTimeout(() => {
|
||
wx.navigateBack({ delta: 1 });
|
||
}, 600);
|
||
})
|
||
.catch((err) => {
|
||
wx.showToast({ title: (err && err.message) || '提交失败', icon: 'none' });
|
||
})
|
||
.finally(() => {
|
||
this.setData({ submitting: false });
|
||
wx.hideLoading();
|
||
});
|
||
}
|
||
});
|
||
|