import { useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import { Alert, Button, Card, Form, Input, Result, Select, Space, Spin, Typography, message } from 'antd' import { initApi } from '@/lib/api' import { useAuthStore } from '@/store/auth' import type { InitCheckResult, InitDBPayload } from '@/types/system' const dbTypeOptions: Array<{ label: string; value: InitDBPayload['dbType'] }> = [ { label: 'MySQL', value: 'mysql' }, { label: 'PostgreSQL', value: 'pgsql' }, { label: 'SQLite', value: 'sqlite' }, { label: 'MSSQL', value: 'mssql' }, ] type InitState = 'checking' | 'required' | 'ready' const dbDefaults: Record> = { mysql: { host: '127.0.0.1', port: '3306', }, pgsql: { host: '127.0.0.1', port: '5432', template: 'template1', }, sqlite: { dbPath: 'db', }, mssql: { host: '127.0.0.1', port: '1433', }, } function applyDbDefaults(currentValues: InitDBPayload, nextDbType: InitDBPayload['dbType']): InitDBPayload { return { ...currentValues, ...dbDefaults[nextDbType], dbType: nextDbType, } } export function InitPage() { const navigate = useNavigate() const token = useAuthStore((state) => state.token) const [form] = Form.useForm() const [state, setState] = useState('checking') const [checkingError, setCheckingError] = useState(null) const [submitting, setSubmitting] = useState(false) const dbType = Form.useWatch('dbType', form) ?? 'mysql' const checkInitialization = async () => { try { const response = await initApi.checkDB() const data: InitCheckResult = response.data if (data.needInit) { setState('required') } else { setState('ready') } setCheckingError(null) } catch (error) { const messageText = error instanceof Error ? error.message : '初始化状态检测失败' setCheckingError(messageText) } } useEffect(() => { void checkInitialization() }, []) const helperText = useMemo(() => { switch (dbType) { case 'mysql': return '将创建数据库并写回 MySQL 连接配置。' case 'pgsql': return '默认使用 PostgreSQL 公共库建库,可按需指定 template。' case 'sqlite': return '将创建本地 SQLite 数据库文件,并写回 sqlite 配置。' case 'mssql': return '将按当前连接信息接入 MSSQL,并写回 mssql 配置。' default: return '' } }, [dbType]) const onDbTypeChange = (nextDbType: InitDBPayload['dbType']) => { const currentValues = form.getFieldsValue() form.setFieldsValue(applyDbDefaults(currentValues, nextDbType)) } const submit = async () => { const values = await form.validateFields() setSubmitting(true) try { await initApi.initDB(values) message.success('初始化完成,请使用 admin 账户登录') navigate('/login', { replace: true }) } finally { setSubmitting(false) } } if (state === 'checking') { return (
Project Bootstrap
正在检测
项目初始化状态
初始化页只在数据库尚未建立、配置尚未回写时使用。检测完成后会自动切换到对应状态。
正在检测初始化状态... {checkingError ? ( void checkInitialization()}> 重试 } /> ) : null}
) } if (state === 'ready') { return (
Project Bootstrap
项目已经完成
首次初始化
当前服务已经具备数据库连接和基础管理员账号,不需要再次执行初始化。
navigate(token ? '/' : '/login', { replace: true })}> {token ? '进入后台' : '前往登录'} , , ]} />
) } return (
Project Bootstrap
首次启动先完成
项目初始化
这里负责创建主业务数据库、写回当前服务配置,并生成默认管理员账号。初始化完成后,再进入后台登录。
初始化项目 默认管理员账号固定为 `admin`,密码使用下面填写的管理员密码。 {checkingError ? ( ) : null}
) : ( <> )} {dbType === 'pgsql' ? ( ) : (
)}
) }