page.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. "use client";
  2. import { useState, type FormEvent } from "react";
  3. import { useRouter } from "next/navigation";
  4. import { apiUrl } from "@/lib/config";
  5. import { Button } from "@/components/ui/button";
  6. import { Input } from "@/components/ui/input";
  7. export default function AgentLoginPage() {
  8. const [username, setUsername] = useState("");
  9. const [password, setPassword] = useState("");
  10. const [loading, setLoading] = useState(false);
  11. const [error, setError] = useState("");
  12. const router = useRouter();
  13. // 客服登录
  14. async function handleLogin(e: FormEvent<HTMLFormElement>) {
  15. e.preventDefault(); // 阻止默认行为
  16. if (!username || !password) {
  17. setError("用户名和密码不能为空");
  18. return;
  19. }
  20. setLoading(true);
  21. setError("");
  22. try {
  23. const res = await fetch(apiUrl("/login"), {
  24. method: "POST",
  25. headers: { "Content-Type": "application/json" },
  26. body: JSON.stringify({ username, password }),
  27. });
  28. const data = await res.json();
  29. if (res.ok) {
  30. // 登录成功,保存用户信息到 localStorage
  31. localStorage.setItem("agent_user_id", String(data.user_id));
  32. localStorage.setItem("agent_username", data.username);
  33. localStorage.setItem("agent_role", data.role);
  34. // 跳转到客服工作台(三栏布局)
  35. router.push("/agent/dashboard");
  36. } else {
  37. // 登录失败,显示错误信息
  38. setError(data.error || data.message || "登录失败");
  39. }
  40. } catch (error) {
  41. console.error("登录失败:", error);
  42. setError("登录失败,请检查网络连接");
  43. } finally {
  44. setLoading(false);
  45. }
  46. }
  47. return (
  48. <div className="flex justify-center items-center min-h-screen bg-background">
  49. <div className="bg-card p-8 rounded-lg border shadow-lg w-full sm:w-96">
  50. <h1 className="text-center text-2xl font-bold mb-2 text-gray-800">
  51. 客服登录
  52. </h1>
  53. <p className="text-center text-sm text-gray-500 mb-6">
  54. 管理员和客服请在此登录
  55. </p>
  56. <form onSubmit={handleLogin}>
  57. <Input
  58. type="text"
  59. placeholder="用户名"
  60. value={username}
  61. onChange={(e) => setUsername(e.target.value)}
  62. className="w-full mb-4"
  63. disabled={loading}
  64. />
  65. <Input
  66. type="password"
  67. placeholder="密码"
  68. value={password}
  69. onChange={(e) => setPassword(e.target.value)}
  70. className="w-full mb-4"
  71. disabled={loading}
  72. />
  73. {error && (
  74. <div className="mb-4 p-3 bg-red-50 border border-red-200 rounded-md text-red-600 text-sm">
  75. {error}
  76. </div>
  77. )}
  78. <Button
  79. type="submit"
  80. disabled={loading}
  81. variant="default"
  82. size="default"
  83. className="w-full"
  84. >
  85. {loading ? "登录中..." : "登录"}
  86. </Button>
  87. </form>
  88. <div className="mt-4 text-center text-xs text-gray-400">
  89. <p>默认管理员账号:admin / admin123</p>
  90. </div>
  91. </div>
  92. </div>
  93. );
  94. }