智慧水务管理系统 - 精河县供水工程综合管理平台

login.html 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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>登录 - CRM 系统</title>
  7. <script src="https://cdn.tailwindcss.com"></script>
  8. </head>
  9. <body class="bg-gray-100 min-h-screen flex items-center justify-center">
  10. <div class="bg-white p-8 rounded-lg shadow-lg w-full max-w-md">
  11. <div class="text-center mb-8">
  12. <h1 class="text-3xl font-bold text-gray-800">📊 CRM 系统</h1>
  13. <p class="text-gray-600 mt-2">中小企业轻量级 CRM</p>
  14. </div>
  15. <form id="loginForm" class="space-y-6">
  16. <div>
  17. <label class="block text-sm font-medium text-gray-700 mb-1">用户名</label>
  18. <input type="text" id="username" name="username" required
  19. class="w-full border border-gray-300 rounded-lg px-4 py-2 focus:ring-2 focus:ring-indigo-500 focus:border-transparent">
  20. </div>
  21. <div>
  22. <label class="block text-sm font-medium text-gray-700 mb-1">密码</label>
  23. <input type="password" id="password" name="password" required
  24. class="w-full border border-gray-300 rounded-lg px-4 py-2 focus:ring-2 focus:ring-indigo-500 focus:border-transparent">
  25. </div>
  26. <button type="submit"
  27. class="w-full bg-indigo-600 text-white py-3 rounded-lg hover:bg-indigo-700 transition font-medium">
  28. 登录
  29. </button>
  30. </form>
  31. <div class="mt-6 text-center">
  32. <p class="text-gray-600">
  33. 还没有账号?
  34. <a href="http://localhost:3005/register" target="_blank" class="text-indigo-600 hover:underline">立即注册</a>
  35. </p>
  36. </div>
  37. <div class="mt-4 p-4 bg-indigo-50 rounded-lg">
  38. <p class="text-sm text-indigo-800 font-medium">📋 测试账号:</p>
  39. <p class="text-sm text-indigo-700 mt-1">用户名:admin</p>
  40. <p class="text-sm text-indigo-700">密码:admin123</p>
  41. </div>
  42. </div>
  43. <script>
  44. const AUTH_SERVICE = 'http://localhost:3005';
  45. document.getElementById('loginForm').addEventListener('submit', async (e) => {
  46. e.preventDefault();
  47. const username = document.getElementById('username').value;
  48. const password = document.getElementById('password').value;
  49. try {
  50. const res = await fetch(`${AUTH_SERVICE}/api/auth/login`, {
  51. method: 'POST',
  52. headers: { 'Content-Type': 'application/json' },
  53. body: JSON.stringify({ username, password })
  54. });
  55. const result = await res.json();
  56. if (result.success) {
  57. localStorage.setItem('token', result.data.token);
  58. localStorage.setItem('user', JSON.stringify(result.data.user));
  59. alert('✅ 登录成功!');
  60. window.location.href = '/';
  61. } else {
  62. alert('❌ ' + result.error);
  63. }
  64. } catch (error) {
  65. alert('❌ 登录失败:' + error.message);
  66. }
  67. });
  68. // 检查是否已登录
  69. async function checkAuth() {
  70. const token = localStorage.getItem('token');
  71. if (token) {
  72. try {
  73. const res = await fetch(`${AUTH_SERVICE}/api/auth/verify`, {
  74. headers: { 'Authorization': 'Bearer ' + token }
  75. });
  76. const result = await res.json();
  77. if (result.success) {
  78. window.location.href = '/';
  79. }
  80. } catch (e) {}
  81. }
  82. }
  83. checkAuth();
  84. </script>
  85. </body>
  86. </html>