297 lines
7.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 === '1' ? 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();
});
}
});