优化小程序
This commit is contained in:
1 parent
2e2b837a20
commit
727319a6eb
24 files changed
+1509
-200
No files matched your search
+87
-26
@@ -106,7 +106,6 @@
|
||||
.wechat-box img { width: 168px; height: 168px; object-fit: contain; }
|
||||
.wechat-box .scan-tip { font-size: 13px; color: var(--text-sub); margin-top: 8px; }
|
||||
.wechat-box .scan-tip.ok { color: #34b96f; font-weight: 600; }
|
||||
.wechat-box .mp-notice { font-size: 12px; color: #d08700; margin-top: 6px; }
|
||||
|
||||
/* 第二步:两个卡片 */
|
||||
.cards { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
|
||||
@@ -221,15 +220,14 @@
|
||||
<div class="field">
|
||||
<label>微信身份核验<span class="req">*</span></label>
|
||||
<div class="wechat-box" id="wechatBox">
|
||||
<img id="wechatQr" alt="公众号二维码" style="display:none">
|
||||
<img id="wechatQr" alt="微信核验二维码" style="display:none">
|
||||
<div class="scan-tip" id="scanTip">正在获取二维码…</div>
|
||||
<div class="mp-notice" id="mpNotice"></div>
|
||||
</div>
|
||||
<div class="input-row">
|
||||
<div class="input-row" id="codeRow">
|
||||
<input class="ipt" id="accountCode" maxlength="6" placeholder="公众号下发的 6 位验证码">
|
||||
<button class="btn code-btn" id="btnQr" type="button">获取二维码</button>
|
||||
</div>
|
||||
<div class="hint">用微信扫码关注公众号后,验证码将通过公众号自动发送;无法扫码时可在公众号内直接发送「注册」获取验证码。</div>
|
||||
<div class="hint" id="wxHint">点击「获取二维码」,用微信扫码完成身份核验。</div>
|
||||
</div>
|
||||
<button class="btn btn-primary" id="btnVerifyAccount" type="button">验证并下一步</button>
|
||||
</div>
|
||||
@@ -300,7 +298,8 @@
|
||||
var CLIENT_ID = app.getAttribute('data-client-id') || '';
|
||||
var REDIRECT = app.getAttribute('data-redirect') || '';
|
||||
|
||||
var state = { mode: 'phone', token: '', scene: '', qrTimer: null, selectedTid: 0 };
|
||||
// wxChannel:微信核验通道,mini=小程序码确认(优先)/ mp=公众号验证码(回退)
|
||||
var state = { mode: 'phone', token: '', scene: '', qrTimer: null, selectedTid: 0, wxChannel: '' };
|
||||
|
||||
// ---------- 工具 ----------
|
||||
function $(id) { return document.getElementById(id); }
|
||||
@@ -393,39 +392,76 @@
|
||||
});
|
||||
});
|
||||
|
||||
// ---------- 账号注册 ----------
|
||||
// ---------- 账号注册:微信身份核验(小程序优先,不可用时回退公众号) ----------
|
||||
$('btnQr').addEventListener('click', function () {
|
||||
var btn = this; btn.disabled = true;
|
||||
$('wechatBox').classList.add('show');
|
||||
$('wechatQr').style.display = 'none';
|
||||
$('scanTip').textContent = '正在获取二维码…';
|
||||
$('scanTip').className = 'scan-tip';
|
||||
$('mpNotice').textContent = '';
|
||||
startMiniVerify(function (ok) {
|
||||
btn.disabled = false;
|
||||
if (ok) return;
|
||||
startMpVerify(btn); // 小程序未配置 / 小程序码生成失败 → 回退公众号验证码通道
|
||||
});
|
||||
});
|
||||
|
||||
function showQr(qrURL, tip) {
|
||||
$('wechatQr').src = qrURL;
|
||||
$('wechatQr').style.display = '';
|
||||
$('scanTip').textContent = tip;
|
||||
}
|
||||
|
||||
// 小程序方案:展示小程序码,用户在小程序内确认后无需填验证码
|
||||
function startMiniVerify(next) {
|
||||
fetch('/auth/register/mini/start').then(function (r) { return r.json(); }).then(function (res) {
|
||||
if (res.code !== 200 || !res.data || !res.data.qr_url) { next(false); return; }
|
||||
state.wxChannel = 'mini';
|
||||
state.scene = res.data.scene || '';
|
||||
$('codeRow').style.display = 'none';
|
||||
$('wxHint').textContent = '用微信扫码,在小程序内确认后即可继续填写(无需验证码)。';
|
||||
showQr(res.data.qr_url, '请用微信扫码,在小程序内确认注册');
|
||||
next(true);
|
||||
startQrPolling();
|
||||
}).catch(function () { next(false); });
|
||||
}
|
||||
|
||||
// 公众号回退:优先带参二维码;生成失败时展示「关注二维码」,
|
||||
// 用户扫码关注后在公众号内发送「注册」照样能收到验证码
|
||||
function startMpVerify(btn) {
|
||||
fetch('/auth/register/wechat/start').then(function (r) { return r.json(); }).then(function (res) {
|
||||
btn.disabled = false;
|
||||
if (res.code !== 200) { $('scanTip').textContent = res.msg || '获取二维码失败'; return; }
|
||||
state.scene = res.data.scene || '';
|
||||
if (res.data.qr_url) {
|
||||
$('wechatQr').src = res.data.qr_url;
|
||||
$('wechatQr').style.display = '';
|
||||
$('scanTip').textContent = '请用微信扫码并关注公众号';
|
||||
var d = res.data || {};
|
||||
state.wxChannel = 'mp';
|
||||
state.scene = d.scene || '';
|
||||
$('codeRow').style.display = '';
|
||||
$('wxHint').textContent = '扫码关注公众号后,在公众号内发送「注册」即可收到 6 位验证码。';
|
||||
var qr = d.qr_url || d.follow_qrcode || '';
|
||||
if (qr) {
|
||||
showQr(qr, d.qr_url ? '请用微信扫码并关注公众号' : '扫码关注公众号后,在公众号内发送「注册」获取验证码');
|
||||
if (d.qr_url) startQrPolling(); // 关注二维码不带 scene,无需轮询
|
||||
} else if (res.code === 200) {
|
||||
$('scanTip').textContent = d.notice || '无法展示二维码:请在公众号内直接发送「注册」获取验证码';
|
||||
} else {
|
||||
$('scanTip').textContent = '无法展示二维码:请在公众号内直接发送「注册」获取验证码';
|
||||
$('scanTip').textContent = '微信核验暂不可用,请改用手机号验证码注册';
|
||||
}
|
||||
if (res.data.notice) { $('mpNotice').textContent = res.data.notice; }
|
||||
startQrPolling();
|
||||
}).catch(function () { btn.disabled = false; $('scanTip').textContent = '网络异常,请重试'; });
|
||||
});
|
||||
}
|
||||
|
||||
function startQrPolling() {
|
||||
if (state.qrTimer) clearInterval(state.qrTimer);
|
||||
if (!state.scene) return;
|
||||
state.qrTimer = setInterval(function () {
|
||||
fetch('/auth/register/wechat/status?scene=' + encodeURIComponent(state.scene))
|
||||
var mini = state.wxChannel === 'mini';
|
||||
var url = mini ? '/auth/register/mini/status' : '/auth/register/wechat/status';
|
||||
fetch(url + '?scene=' + encodeURIComponent(state.scene))
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
if (res.code === 200 && res.data && res.data.scanned) {
|
||||
$('scanTip').textContent = '已扫码,验证码已发送到公众号,请填入下方输入框';
|
||||
var ok = res.code === 200 && res.data && (mini ? res.data.confirmed : res.data.scanned);
|
||||
if (ok) {
|
||||
$('scanTip').textContent = mini
|
||||
? '已在小程序内确认,请继续填写下方信息'
|
||||
: '已扫码,验证码已发送到公众号,请填入下方输入框';
|
||||
$('scanTip').className = 'scan-tip ok';
|
||||
clearInterval(state.qrTimer);
|
||||
}
|
||||
@@ -439,9 +475,20 @@
|
||||
if (!/^[A-Za-z][A-Za-z0-9_-]{3,31}$/.test(account)) { showMsg('账号需 4-32 位,字母开头,仅含字母/数字/下划线/中划线'); return; }
|
||||
if (pwd.length < 6) { showMsg('密码长度不能少于6位'); return; }
|
||||
if (pwd !== pwd2) { showMsg('两次输入的密码不一致'); return; }
|
||||
if (!code) { showMsg('请输入公众号下发的验证码'); return; }
|
||||
if (!state.wxChannel) { showMsg('请先点击「获取二维码」完成微信核验'); return; }
|
||||
var mini = state.wxChannel === 'mini';
|
||||
// 小程序通道必须持有已确认的会话;公众号通道允许无 scene(用户手填公众号下发的验证码)
|
||||
if (mini && !state.scene) { showMsg('请重新获取二维码并在小程序内完成确认'); return; }
|
||||
if (!mini && !code) { showMsg('请输入公众号下发的验证码(在公众号内发送「注册」获取)'); return; }
|
||||
var btn = this; btn.disabled = true;
|
||||
post('/auth/register/verify', { mode: 'account', account: account, scene: state.scene, code: code, password: pwd, confirm: pwd2 }, function (res) {
|
||||
post('/auth/register/verify', {
|
||||
mode: mini ? 'mini' : 'account',
|
||||
account: account,
|
||||
scene: state.scene,
|
||||
code: code,
|
||||
password: pwd,
|
||||
confirm: pwd2
|
||||
}, function (res) {
|
||||
btn.disabled = false;
|
||||
if (res.code !== 200) { showMsg(res.msg || '验证失败'); return; }
|
||||
state.token = res.data.register_token;
|
||||
@@ -483,12 +530,24 @@
|
||||
}).catch(function () { list.innerHTML = '<div class="search-empty">搜索失败,请重试</div>'; });
|
||||
});
|
||||
|
||||
// 第二步提交失败:注册会话过期时退回第一步重新核验(此时账号尚未占用,可重新注册)
|
||||
function failStep2(res, fallback) {
|
||||
var msg = (res && res.msg) || fallback || '提交失败';
|
||||
if (/注册会话已过期|注册会话已失效/.test(msg)) {
|
||||
state.token = '';
|
||||
goStep(1);
|
||||
showMsg(msg + ',请重新完成身份核验');
|
||||
return;
|
||||
}
|
||||
showMsg(msg);
|
||||
}
|
||||
|
||||
$('btnJoin').addEventListener('click', function () {
|
||||
if (!state.selectedTid) { showMsg('请先选择企业'); return; }
|
||||
var btn = this; btn.disabled = true;
|
||||
post('/auth/register/apply-join', { token: state.token, tid: state.selectedTid }, function (res) {
|
||||
btn.disabled = false;
|
||||
if (res.code !== 200) { showMsg(res.msg || '提交失败'); return; }
|
||||
if (res.code !== 200) { failStep2(res, '提交失败'); return; }
|
||||
done('申请已提交', '加入企业的申请已提交,请等待企业管理员在后台审核,审核通过后即可登录。', res.redirect || buildLoginURL(''));
|
||||
});
|
||||
});
|
||||
@@ -516,7 +575,9 @@
|
||||
});
|
||||
|
||||
$('btnCreate').addEventListener('click', function () {
|
||||
if (!state.token) { failStep2({ msg: '注册会话已失效' }, '注册会话已失效'); return; }
|
||||
var form = {
|
||||
token: state.token,
|
||||
tenant_name: $('cName').value.trim(),
|
||||
credit_code: $('cCredit').value.trim(),
|
||||
legal_person: $('cLegal').value.trim(),
|
||||
@@ -541,7 +602,7 @@
|
||||
var btn = this; btn.disabled = true;
|
||||
post('/auth/register/apply-create', form, function (res) {
|
||||
btn.disabled = false;
|
||||
if (res.code !== 200) { showMsg(res.msg || '提交失败'); return; }
|
||||
if (res.code !== 200) { failStep2(res, '提交失败'); return; }
|
||||
done('申请已提交', '创建企业的申请已提交,请等待平台审核;审核通过后当前账号将成为企业管理员账号。', res.redirect || buildLoginURL(''));
|
||||
});
|
||||
});
|
||||
@@ -550,7 +611,7 @@
|
||||
$('btnSkip').addEventListener('click', function () {
|
||||
if (!confirm('暂不加入企业将直接完成注册,之后可在登录后申请加入。确定吗?')) return;
|
||||
post('/auth/register/finish', { token: state.token }, function (res) {
|
||||
if (res.code !== 200) { showMsg(res.msg || '操作失败'); return; }
|
||||
if (res.code !== 200) { failStep2(res, '操作失败'); return; }
|
||||
done('注册成功', '账号已创建。你当前未加入任何企业,可稍后申请加入。', res.redirect || buildLoginURL(''));
|
||||
});
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user