import React, { useState } from 'react' import { Card, Form, Input, Button, Typography, Alert, Space, Steps, Row, Col, message } from 'antd' import { UserOutlined, LockOutlined, CheckCircleOutlined, SettingOutlined, SafetyOutlined } from '@ant-design/icons' import apiClient from '../services/apiClient' const { Title, Text, Paragraph } = Typography const { Step } = Steps interface InstallPageProps { onInstallComplete: () => void } /** * 系统安装页面组件 * 用于首次运行时设置管理员账号和密码 */ const InstallPage: React.FC = ({ onInstallComplete }) => { const [form] = Form.useForm() const [loading, setLoading] = useState(false) const [currentStep, setCurrentStep] = useState(0) const [error, setError] = useState(null) const [lockFilePath, setLockFilePath] = useState('') const handleInstall = async (values: { username: string; password: string; confirmPassword: string }) => { if (values.password !== values.confirmPassword) { setError('两次输入的密码不一致') return } setLoading(true) setError(null) try { const result = await apiClient.post('/api/auth/initialize', { username: values.username, password: values.password }) if (result.success) { setCurrentStep(2) message.success('系统初始化成功!') // 获取初始化信息以显示锁文件路径 try { const checkResult = await apiClient.get('/api/auth/check-initialization') if (checkResult.success && checkResult.lockFilePath) { setLockFilePath(checkResult.lockFilePath) } } catch (infoError) { console.warn('获取初始化信息失败:', infoError) } // 延迟跳转到登录页面 setTimeout(() => { onInstallComplete() }, 3000) } else { setError(result.message || '初始化失败') } } catch (error: any) { setError(error.message || '初始化失败,请稍后重试') } finally { setLoading(false) } } const validateUsername = (_: any, value: string) => { if (!value) { return Promise.reject(new Error('请输入用户名')) } if (value.length < 3) { return Promise.reject(new Error('用户名至少需要3个字符')) } if (!/^[a-zA-Z0-9_-]+$/.test(value)) { return Promise.reject(new Error('用户名只能包含字母、数字、下划线和横线')) } return Promise.resolve() } const validatePassword = (_: any, value: string) => { if (!value) { return Promise.reject(new Error('请输入密码')) } if (value.length < 6) { return Promise.reject(new Error('密码至少需要6个字符')) } return Promise.resolve() } const steps = [ { title: '欢迎', icon: , description: '系统初始化向导' }, { title: '设置账号', icon: , description: '创建管理员账号' }, { title: '完成', icon: , description: '初始化完成' } ] return (
🚀
远程控制系统 系统初始化向导
{steps.map((step, index) => ( ))} {currentStep === 0 && (
这是您首次运行本系统,需要进行初始化设置。 请为系统创建一个管理员账号,该账号将用于登录和管理系统。
安全的密码保护
个性化用户名
} type="info" showIcon style={{ marginBottom: '24px', textAlign: 'left' }} />
)} {currentStep === 1 && (
{error && ( setError(null)} style={{ marginBottom: '16px' }} /> )} } placeholder="请输入管理员用户名" style={{ borderRadius: '8px' }} /> } placeholder="请输入密码(至少6个字符)" style={{ borderRadius: '8px' }} /> ({ validator(_, value) { if (!value || getFieldValue('password') === value) { return Promise.resolve() } return Promise.reject(new Error('两次输入的密码不一致')) }, }), ]} > } placeholder="请再次输入密码" style={{ borderRadius: '8px' }} /> )} {currentStep === 2 && (
系统已成功初始化,管理员账号创建完成。 即将跳转到登录页面,请使用刚才设置的账号密码登录系统。 {lockFilePath && (
💡 重要提示:
系统已创建初始化锁文件,防止重复初始化。
{lockFilePath}
如需重新初始化,请先删除此文件。
)}
} type="success" showIcon style={{ textAlign: 'left' }} /> )} ) } export default InstallPage