|
@@ -4,13 +4,14 @@ import { useTranslation } from 'react-i18next';
|
|
|
import { Shield, Zap, Lock, User, Eye, EyeOff, ArrowRight, Activity, Radio, Layers, Building2, Globe } from 'lucide-react';
|
|
import { Shield, Zap, Lock, User, Eye, EyeOff, ArrowRight, Activity, Radio, Layers, Building2, Globe } from 'lucide-react';
|
|
|
import { authApi } from '../api';
|
|
import { authApi } from '../api';
|
|
|
import { toast } from 'sonner';
|
|
import { toast } from 'sonner';
|
|
|
|
|
+import { env } from '../config/env';
|
|
|
|
|
|
|
|
export default function Login() {
|
|
export default function Login() {
|
|
|
const navigate = useNavigate();
|
|
const navigate = useNavigate();
|
|
|
const { t, i18n } = useTranslation();
|
|
const { t, i18n } = useTranslation();
|
|
|
- const [tenant, setTenant] = useState('博士安全');
|
|
|
|
|
- const [username, setUsername] = useState('admin');
|
|
|
|
|
- const [password, setPassword] = useState('123');
|
|
|
|
|
|
|
+ const [tenant, setTenant] = useState(env.defaultLogin.tenant);
|
|
|
|
|
+ const [username, setUsername] = useState(env.defaultLogin.username);
|
|
|
|
|
+ const [password, setPassword] = useState(env.defaultLogin.password);
|
|
|
const [showPassword, setShowPassword] = useState(false);
|
|
const [showPassword, setShowPassword] = useState(false);
|
|
|
const [rememberMe, setRememberMe] = useState(false);
|
|
const [rememberMe, setRememberMe] = useState(false);
|
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
@@ -80,12 +81,14 @@ export default function Login() {
|
|
|
setIsLoading(true);
|
|
setIsLoading(true);
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- const response = await authApi.login({ tenant, username, password });
|
|
|
|
|
|
|
+ // 如果未启用租户功能,使用默认租户
|
|
|
|
|
+ const loginTenant = env.tenantEnable ? tenant : env.defaultLogin.tenant;
|
|
|
|
|
+ const response = await authApi.login({ tenant: loginTenant, username, password });
|
|
|
|
|
|
|
|
// 保存 token 和租户信息
|
|
// 保存 token 和租户信息
|
|
|
if (response.token) {
|
|
if (response.token) {
|
|
|
localStorage.setItem('token', response.token);
|
|
localStorage.setItem('token', response.token);
|
|
|
- localStorage.setItem('tenant', tenant);
|
|
|
|
|
|
|
+ localStorage.setItem('tenant', loginTenant);
|
|
|
|
|
|
|
|
if (rememberMe) {
|
|
if (rememberMe) {
|
|
|
localStorage.setItem('rememberMe', 'true');
|
|
localStorage.setItem('rememberMe', 'true');
|
|
@@ -239,7 +242,7 @@ export default function Login() {
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div>
|
|
<div>
|
|
|
- <h1 className="text-2xl text-gray-900">{t('login.title')}</h1>
|
|
|
|
|
|
|
+ <h1 className="text-2xl text-gray-900">{env.appTitle}</h1>
|
|
|
<p className="text-xs text-blue-600 tracking-widest mt-0.5">{t('login.subtitle')}</p>
|
|
<p className="text-xs text-blue-600 tracking-widest mt-0.5">{t('login.subtitle')}</p>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -349,21 +352,23 @@ export default function Login() {
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<form onSubmit={handleSubmit} className="space-y-5">
|
|
<form onSubmit={handleSubmit} className="space-y-5">
|
|
|
- <div>
|
|
|
|
|
- <div className="relative">
|
|
|
|
|
- <div className="absolute left-4 top-1/2 -translate-y-1/2 text-gray-400">
|
|
|
|
|
- <Building2 className="w-5 h-5" />
|
|
|
|
|
|
|
+ {env.tenantEnable && (
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div className="relative">
|
|
|
|
|
+ <div className="absolute left-4 top-1/2 -translate-y-1/2 text-gray-400">
|
|
|
|
|
+ <Building2 className="w-5 h-5" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <input
|
|
|
|
|
+ type="text"
|
|
|
|
|
+ placeholder={t('login.tenant')}
|
|
|
|
|
+ value={tenant}
|
|
|
|
|
+ onChange={(e) => setTenant(e.target.value)}
|
|
|
|
|
+ className="w-full h-13 pl-12 pr-4 bg-white border-2 border-gray-200 rounded-xl outline-none focus:border-blue-400 focus:ring-4 focus:ring-blue-100 transition-all"
|
|
|
|
|
+ required
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
- <input
|
|
|
|
|
- type="text"
|
|
|
|
|
- placeholder={t('login.tenant')}
|
|
|
|
|
- value={tenant}
|
|
|
|
|
- onChange={(e) => setTenant(e.target.value)}
|
|
|
|
|
- className="w-full h-13 pl-12 pr-4 bg-white border-2 border-gray-200 rounded-xl outline-none focus:border-blue-400 focus:ring-4 focus:ring-blue-100 transition-all"
|
|
|
|
|
- required
|
|
|
|
|
- />
|
|
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
+ )}
|
|
|
|
|
|
|
|
<div>
|
|
<div>
|
|
|
<label className="block text-sm text-gray-700 mb-2 ml-1">
|
|
<label className="block text-sm text-gray-700 mb-2 ml-1">
|