login.html 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>登录 - 后台管理系统</title>
  7. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
  8. <style>
  9. body {
  10. background-color: #f8f9fa;
  11. }
  12. .login-container {
  13. max-width: 400px;
  14. margin: 100px auto;
  15. padding: 20px;
  16. background-color: white;
  17. border-radius: 10px;
  18. box-shadow: 0 0 10px rgba(0,0,0,0.1);
  19. }
  20. .login-title {
  21. text-align: center;
  22. margin-bottom: 30px;
  23. color: #333;
  24. }
  25. .form-control:focus {
  26. border-color: #80bdff;
  27. box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);
  28. }
  29. .btn-login {
  30. width: 100%;
  31. padding: 10px;
  32. font-size: 16px;
  33. }
  34. .alert {
  35. display: none;
  36. margin-top: 20px;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <div class="container">
  42. <div class="login-container">
  43. <h2 class="login-title">后台管理系统</h2>
  44. <form id="loginForm">
  45. <div class="mb-3">
  46. <label for="username" class="form-label">用户名</label>
  47. <input type="text" class="form-control" id="username" name="username" required>
  48. </div>
  49. <div class="mb-3">
  50. <label for="password" class="form-label">密码</label>
  51. <input type="password" class="form-control" id="password" name="password" required>
  52. </div>
  53. <button type="submit" class="btn btn-primary btn-login">登录</button>
  54. <div class="alert alert-danger" role="alert" id="errorAlert"></div>
  55. </form>
  56. </div>
  57. </div>
  58. <script>
  59. document.getElementById('loginForm').addEventListener('submit', async (e) => {
  60. e.preventDefault();
  61. const username = document.getElementById('username').value;
  62. const password = document.getElementById('password').value;
  63. const errorAlert = document.getElementById('errorAlert');
  64. try {
  65. const response = await fetch('/api/users/login', {
  66. method: 'POST',
  67. headers: {
  68. 'Content-Type': 'application/json'
  69. },
  70. body: JSON.stringify({ username, password })
  71. });
  72. const data = await response.json();
  73. if (response.ok) {
  74. // 保存 token 到 localStorage
  75. localStorage.setItem('token', data.token);
  76. // 跳转到仪表板
  77. window.location.href = '/dashboard.html';
  78. } else {
  79. errorAlert.textContent = data.message || '登录失败';
  80. errorAlert.style.display = 'block';
  81. }
  82. } catch (error) {
  83. console.error('登录错误:', error);
  84. errorAlert.textContent = '服务器错误,请稍后重试';
  85. errorAlert.style.display = 'block';
  86. }
  87. });
  88. </script>
  89. </body>
  90. </html>