Quellcode durchsuchen

流程页优化:登录成功兜底判断、订阅到期回跳、验证码回车/满6位自动提交与防重复提交

gangvy vor 2 Monaten
Ursprung
Commit
be54d010f5

+ 23 - 6
claude-code/claude-code-qiwe-assistant/mcp/src/core/login-flow-server.js

@@ -157,9 +157,18 @@ function poll() {
     const s = String(r.data.status);
     const s = String(r.data.status);
     const el = document.getElementById('poll-status');
     const el = document.getElementById('poll-status');
     if (!r.ok || r.data.status === undefined) {
     if (!r.ok || r.data.status === undefined) {
-      // 二维码过期或上游瞬时异常:未提交验证码时自动重新生成二维码
+      // 登录成功后上游会销毁二维码会话:先用设备在线状态判断是否已成功
       checkErrors++;
       checkErrors++;
+      const st = await api('/flow/state');
+      if (st.data.online) { clearInterval(pollTimer); renderSuccess(st.data.detail || {}); return; }
+      if (st.data.subscribed === false) { clearInterval(pollTimer); renderSubscribe(st.data.subscribeDetail || '订阅已到期'); return; }
+      // 二维码过期或上游瞬时异常:未提交验证码时自动重新生成二维码
       if (!codeSubmitted && checkErrors >= 2) { clearInterval(pollTimer); startLogin(); return; }
       if (!codeSubmitted && checkErrors >= 2) { clearInterval(pollTimer); startLogin(); return; }
+      if (codeSubmitted && checkErrors >= 10) {
+        clearInterval(pollTimer);
+        showMsg('err', '登录确认异常。<br><button class="main" onclick="startLogin()">重新生成二维码</button>');
+        return;
+      }
       if (el) el.textContent = '状态检测异常,重试中…';
       if (el) el.textContent = '状态检测异常,重试中…';
       return;
       return;
     }
     }
@@ -186,19 +195,27 @@ function poll() {
 function renderVerify() {
 function renderVerify() {
   setStep(3);
   setStep(3);
   panel.innerHTML = '<div class="center"><div class="section-title">已扫码确认,请输入手机企业微信上显示的 6 位验证码</div>' +
   panel.innerHTML = '<div class="center"><div class="section-title">已扫码确认,请输入手机企业微信上显示的 6 位验证码</div>' +
-    '<input id="code" maxlength="6" placeholder="······" inputmode="numeric">' +
-    '<br><button class="main" id="verify">提交验证码</button></div>';
-  document.getElementById('verify').onclick = async () => {
-    const code = document.getElementById('code').value.trim();
+    '<input id="code" maxlength="6" placeholder="······" inputmode="numeric" autocomplete="one-time-code">' +
+    '<br><button class="main" id="verify">提交验证码</button>' +
+    '<div class="hint">验证码在手机企业微信确认登录后显示,输完 6 位自动提交</div></div>';
+  const input = document.getElementById('code');
+  input.focus();
+  const submit = async () => {
+    const code = input.value.trim();
     if (!/^\\d{6}$/.test(code)) { showMsg('err', '请输入 6 位数字验证码。'); return; }
     if (!/^\\d{6}$/.test(code)) { showMsg('err', '请输入 6 位数字验证码。'); return; }
+    const btn = document.getElementById('verify');
+    btn.disabled = true;
     showMsg('ok', '正在校验…');
     showMsg('ok', '正在校验…');
     const r = await api('/flow/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code }) });
     const r = await api('/flow/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code }) });
-    if (!r.ok) { showMsg('err', '<b>[' + (r.data.errorCode || 'QW-UP-502') + ']</b> ' + (r.data.message || '验证码校验失败') + ',请重试。'); return; }
+    if (!r.ok) { btn.disabled = false; showMsg('err', '<b>[' + (r.data.errorCode || 'QW-UP-502') + ']</b> ' + (r.data.message || '验证码校验失败') + ',请重试。'); return; }
     codeSubmitted = true;
     codeSubmitted = true;
     verifyWaits = 0;
     verifyWaits = 0;
     panel.innerHTML = '<div class="center"><div class="section-title">验证码已提交,正在确认登录…</div><div class="hint" id="poll-status">确认中,每 3 秒自动检测…</div></div>';
     panel.innerHTML = '<div class="center"><div class="section-title">验证码已提交,正在确认登录…</div><div class="hint" id="poll-status">确认中,每 3 秒自动检测…</div></div>';
     poll();
     poll();
   };
   };
+  document.getElementById('verify').onclick = submit;
+  input.onkeydown = (e) => { if (e.key === 'Enter') submit(); };
+  input.oninput = () => { if (/^\\d{6}$/.test(input.value.trim())) submit(); };
 }
 }
 
 
 function renderSuccess(detail) {
 function renderSuccess(detail) {