<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><meta name="theme-color" content="#4F46E5"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="无铭客服"><meta name="apple-mobile-web-app-status-bar-style" content="default"><link rel="manifest" href="/manifest.webmanifest"><link rel="apple-touch-icon" href="/图标.png"><meta name="description" content="无铭在线客服平台"><meta name="keywords" content="客服,咨询,服务,无铭"><meta name="author" content="无铭"><meta name="robots" content="noindex, nofollow"><link rel="icon" href="/favicon.ico"><title>无铭客服 - 在线咨询平台</title><script defer="defer" src="/js/chunk-vendors.bdeec3b5.js"></script><script defer="defer" src="/js/app.4933b561.js"></script><link href="/css/app.5b687b48.css" rel="stylesheet"><link href="/css/ui.css" rel="stylesheet"><script>
(function() {
  // Math captcha generator
  var captchaAnswer = null;
  function generateCaptcha() {
    var a = Math.floor(Math.random() * 15) + 1;
    var b = Math.floor(Math.random() * 15) + 1;
    var ops = ['+', '-', '*'];
    var op = ops[Math.floor(Math.random() * ops.length)];
    var question = a + ' ' + op + ' ' + b + ' = ?';
    if (op === '+') captchaAnswer = a + b;
    else if (op === '-') captchaAnswer = a - b;
    else captchaAnswer = a * b;
    return question;
  }

  function injectCaptchaHTML(container) {
    // Check if already injected
    if (container.querySelector('.captcha-row')) return;

    var formGroups = container.querySelectorAll('div');
    var insertBefore = null;
    // Find the login button container to insert captcha before it
    var allDivs = container.querySelectorAll('div');
    for (var i = 0; i < allDivs.length; i++) {
      var hasButton = allDivs[i].querySelector('button');
      if (hasButton && hasButton.textContent.trim() === '确定') {
        insertBefore = allDivs[i];
        break;
      }
    }

    var question = generateCaptcha();

    var captchaRow = document.createElement('div');
    captchaRow.className = 'captcha-row';
    captchaRow.innerHTML =
      '<span class="captcha-label">验证码</span>' +
      '<input class="captcha-input" type="text" inputmode="numeric" autocomplete="off" placeholder="请输入计算结果" maxlength="5">' +
      '<span class="captcha-question">' + question + '</span>' +
      '<button class="captcha-refresh" title="刷新验证码">↻</button>';

    if (insertBefore && insertBefore.parentNode) {
      insertBefore.parentNode.insertBefore(captchaRow, insertBefore);
    } else {
      container.appendChild(captchaRow);
    }

    // Refresh button handler
    captchaRow.querySelector('.captcha-refresh').addEventListener('click', function(e) {
      e.preventDefault();
      e.stopPropagation();
      var newQ = generateCaptcha();
      captchaRow.querySelector('.captcha-question').textContent = newQ;
      captchaRow.querySelector('.captcha-input').value = '';
      captchaRow.querySelector('.captcha-input').classList.remove('captcha-error');
    });

    return captchaRow;
  }

  // Intercept fetch to validate captcha before login
  var _origFetch = window.fetch;
  window.fetch = function(url, options) {
    var urlStr = typeof url === 'string' ? url : (url.url || '');
    if (urlStr.indexOf('/api/auth/login') > -1) {
      var captchaRow = document.querySelector('.captcha-row');
      if (captchaRow) {
        var input = captchaRow.querySelector('.captcha-input');
        var userAnswer = parseInt(input.value, 10);
        if (isNaN(userAnswer) || userAnswer !== captchaAnswer) {
          // Wrong captcha - show error
          input.classList.add('captcha-error');
          input.value = '';
          var newQ = generateCaptcha();
          captchaRow.querySelector('.captcha-question').textContent = newQ;
          setTimeout(function() {
            input.classList.remove('captcha-error');
          }, 500);
          alert('验证码错误，请重新输入');
          return Promise.reject(new Error('验证码错误'));
        }
      }
    }
    return _origFetch.apply(this, arguments);
  };

  // Watch for login page to render
  function watchForLogin() {
    var observer = new MutationObserver(function(mutations) {
      for (var i = 0; i < mutations.length; i++) {
        var addedNodes = mutations[i].addedNodes;
        for (var j = 0; j < addedNodes.length; j++) {
          var node = addedNodes[j];
          if (node.nodeType === 1) {
            // Check if this is or contains the login container
            var container = node.querySelector && node.querySelector('[class*="login-container"]');
            if (container) {
              injectCaptchaHTML(container);
            }
            // Also check if this node itself has login-container
            if (node.className && typeof node.className === 'string' && node.className.indexOf('login-container') > -1) {
              injectCaptchaHTML(node);
            }
            // Check for login form inputs
            if (node.querySelector && node.querySelector('input[type="password"]') && node.querySelector('button')) {
              var parent = node;
              while (parent) {
                if (parent.className && typeof parent.className === 'string' && parent.className.indexOf('login-container') > -1) {
                  injectCaptchaHTML(parent);
                  break;
                }
                parent = parent.parentElement;
              }
            }
          }
        }
      }
    });
    observer.observe(document.body, { childList: true, subtree: true });
  }

  // Start watching when DOM is ready
  if (document.body) {
    watchForLogin();
  } else {
    document.addEventListener('DOMContentLoaded', watchForLogin);
  }

  // Also try immediately after a short delay (in case login renders before observer starts)
  setTimeout(function() {
    var container = document.querySelector('[class*="login-container"]');
    if (container) {
      injectCaptchaHTML(container);
    }
  }, 2000);
})();
</script></head><body><noscript><strong>请启用 JavaScript 以继续使用在线咨询服务</strong></noscript><div id="app"></div></body></html>

/* ============ 手机端管理页面美化 v3 ============ */

.page-wrapper {
    background: linear-gradient(180deg, #f8fafc 0%, #eef2ff 50%, #f0f4ff 100%) !important;
    min-height: 100vh !important;
}

.page-title {
    font-size: 20px !important;
    font-weight: 700 !important;
    color: #1e293b !important;
    text-align: center !important;
    padding: 20px 16px 12px !important;
    letter-spacing: 0.5px !important;
}

/* 信息卡片 */
.info-card {
    background: #fff !important;
    border-radius: 14px !important;
    margin: 10px 14px !important;
    padding: 4px 0 !important;
    box-shadow: 0 1px 3px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.04) !important;
    border: none !important;
}

.info-row {
    padding: 13px 16px !important;
    border-bottom: 1px solid #f1f5f9 !important;
}

.info-row:last-child {
    border-bottom: none !important;
}

.info-label {
    color: #64748b !important;
    font-size: 13px !important;
}

.info-value {
    color: #1e293b !important;
    font-size: 13px !important;
    font-weight: 500 !important;
}

.admin-badge {
    background: linear-gradient(135deg, #818cf8, #6366f1) !important;
    color: #fff !important;
    font-size: 10px !important;
    padding: 2px 8px !important;
    border-radius: 10px !important;
    font-weight: 600 !important;
}

.expire-days {
    background: #ecfdf5 !important;
    color: #059669 !important;
    font-size: 11px !important;
    padding: 2px 8px !important;
    border-radius: 10px !important;
    font-weight: 600 !important;
}

.refresh-hint {
    color: #6366f1 !important;
    font-size: 11px !important;
}

.arrow {
    color: #cbd5e1 !important;
    font-size: 16px !important;
}

/* TG 公告 */
.tg-notice {
    background: linear-gradient(135deg, #eef2ff, #faf5ff) !important;
    border: 1px solid #e8ecf4 !important;
    border-radius: 14px !important;
    margin: 14px !important;
    padding: 14px !important;
    text-align: center !important;
}

.tg-title {
    color: #475569 !important;
    font-size: 13px !important;
    font-weight: 600 !important;
    margin-bottom: 6px !important;
}

.tg-desc {
    color: #94a3b8 !important;
    font-size: 11px !important;
    line-height: 1.7 !important;
}

/* 底部导航 */
.custom-tabbar {
    background: rgba(255,255,255,0.95) !important;
    backdrop-filter: blur(12px) !important;
    border-top: 1px solid #e2e8f0 !important;
}
