🎨 chore(web): apply ESLint and Prettier auto-fixes (baseline)
- Ran: bun run eslint:fix && bun run lint:fix - Inserted AGPL license header via eslint-plugin-header - Enforced no-multiple-empty-lines and other lint rules - Formatted code using Prettier v3 (@so1ve/prettier-config) - No functional changes; formatting-only baseline across JS/JSX files
This commit is contained in:
@@ -130,7 +130,11 @@ const SetupWizard = () => {
|
||||
return true; // 如果已经初始化,可以继续
|
||||
}
|
||||
// 检查必填字段
|
||||
if (!formData.username || !formData.password || !formData.confirmPassword) {
|
||||
if (
|
||||
!formData.username ||
|
||||
!formData.password ||
|
||||
!formData.confirmPassword
|
||||
) {
|
||||
showError(t('请填写完整的管理员账号信息'));
|
||||
return false;
|
||||
}
|
||||
@@ -226,12 +230,7 @@ const SetupWizard = () => {
|
||||
const getStepContent = (step) => {
|
||||
switch (step) {
|
||||
case 0:
|
||||
return (
|
||||
<DatabaseStep
|
||||
setupStatus={setupStatus}
|
||||
t={t}
|
||||
/>
|
||||
);
|
||||
return <DatabaseStep setupStatus={setupStatus} t={t} />;
|
||||
case 1:
|
||||
return (
|
||||
<AdminStep
|
||||
@@ -252,11 +251,7 @@ const SetupWizard = () => {
|
||||
);
|
||||
case 3:
|
||||
return (
|
||||
<CompleteStep
|
||||
setupStatus={setupStatus}
|
||||
formData={formData}
|
||||
t={t}
|
||||
/>
|
||||
<CompleteStep setupStatus={setupStatus} formData={formData} t={t} />
|
||||
);
|
||||
default:
|
||||
return null;
|
||||
@@ -275,21 +270,25 @@ const SetupWizard = () => {
|
||||
|
||||
return (
|
||||
<div className='min-h-screen flex items-center justify-center px-4'>
|
||||
<div className="w-full max-w-4xl">
|
||||
<Card className="!rounded-2xl shadow-sm border-0">
|
||||
<div className="mb-4">
|
||||
<div className="text-xl font-semibold">{t('系统初始化')}</div>
|
||||
<div className="text-xs text-gray-600">
|
||||
<div className='w-full max-w-4xl'>
|
||||
<Card className='!rounded-2xl shadow-sm border-0'>
|
||||
<div className='mb-4'>
|
||||
<div className='text-xl font-semibold'>{t('系统初始化')}</div>
|
||||
<div className='text-xs text-gray-600'>
|
||||
{t('欢迎使用,请完成以下设置以开始使用系统')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="px-2 py-2">
|
||||
<Steps type="basic" current={currentStep}>
|
||||
<div className='px-2 py-2'>
|
||||
<Steps type='basic' current={currentStep}>
|
||||
{steps.map((item, index) => (
|
||||
<Steps.Step
|
||||
key={item.title}
|
||||
title={<span className={currentStep === index ? 'shine-text' : ''}>{item.title}</span>}
|
||||
title={
|
||||
<span className={currentStep === index ? 'shine-text' : ''}>
|
||||
{item.title}
|
||||
</span>
|
||||
}
|
||||
description={item.description}
|
||||
/>
|
||||
))}
|
||||
@@ -306,9 +305,12 @@ const SetupWizard = () => {
|
||||
initValues={formData}
|
||||
>
|
||||
{/* 步骤内容:保持所有字段挂载,仅隐藏非当前步骤 */}
|
||||
<div className="steps-content">
|
||||
<div className='steps-content'>
|
||||
{[0, 1, 2, 3].map((idx) => (
|
||||
<div key={idx} style={{ display: currentStep === idx ? 'block' : 'none' }}>
|
||||
<div
|
||||
key={idx}
|
||||
style={{ display: currentStep === idx ? 'block' : 'none' }}
|
||||
>
|
||||
{React.cloneElement(getStepContent(idx), {
|
||||
...stepNavigationProps,
|
||||
renderNavigationButtons: () => (
|
||||
|
||||
@@ -32,29 +32,22 @@ const StepNavigation = ({
|
||||
next,
|
||||
onSubmit,
|
||||
loading,
|
||||
t
|
||||
t,
|
||||
}) => {
|
||||
return (
|
||||
<div className="flex justify-between items-center pt-4">
|
||||
<div className='flex justify-between items-center pt-4'>
|
||||
{/* 上一步按钮 */}
|
||||
{currentStep > 0 && (
|
||||
<Button
|
||||
onClick={prev}
|
||||
className="!rounded-lg"
|
||||
>
|
||||
<Button onClick={prev} className='!rounded-lg'>
|
||||
{t('上一步')}
|
||||
</Button>
|
||||
)}
|
||||
|
||||
<div className="flex-1"></div>
|
||||
<div className='flex-1'></div>
|
||||
|
||||
{/* 下一步按钮 */}
|
||||
{currentStep < steps.length - 1 && (
|
||||
<Button
|
||||
type="primary"
|
||||
onClick={next}
|
||||
className="!rounded-lg"
|
||||
>
|
||||
<Button type='primary' onClick={next} className='!rounded-lg'>
|
||||
{t('下一步')}
|
||||
</Button>
|
||||
)}
|
||||
@@ -62,10 +55,10 @@ const StepNavigation = ({
|
||||
{/* 完成按钮 */}
|
||||
{currentStep === steps.length - 1 && (
|
||||
<Button
|
||||
type="primary"
|
||||
type='primary'
|
||||
onClick={onSubmit}
|
||||
loading={loading}
|
||||
className="!rounded-lg"
|
||||
className='!rounded-lg'
|
||||
icon={<IconCheckCircleStroked />}
|
||||
>
|
||||
{t('初始化系统')}
|
||||
|
||||
@@ -31,7 +31,7 @@ const AdminStep = ({
|
||||
setFormData,
|
||||
formRef,
|
||||
renderNavigationButtons,
|
||||
t
|
||||
t,
|
||||
}) => {
|
||||
return (
|
||||
<>
|
||||
@@ -40,11 +40,11 @@ const AdminStep = ({
|
||||
type='info'
|
||||
closeIcon={null}
|
||||
description={
|
||||
<div className="flex items-center">
|
||||
<div className='flex items-center'>
|
||||
<span>{t('管理员账号已经初始化过,请继续设置其他参数')}</span>
|
||||
</div>
|
||||
}
|
||||
className="!rounded-lg"
|
||||
className='!rounded-lg'
|
||||
/>
|
||||
) : (
|
||||
<>
|
||||
@@ -55,7 +55,7 @@ const AdminStep = ({
|
||||
prefix={<IconUser />}
|
||||
showClear
|
||||
noLabel={false}
|
||||
validateStatus="default"
|
||||
validateStatus='default'
|
||||
rules={[{ required: true, message: t('请输入管理员用户名') }]}
|
||||
initValue={formData.username || ''}
|
||||
onChange={(value) => {
|
||||
@@ -70,11 +70,11 @@ const AdminStep = ({
|
||||
prefix={<IconLock />}
|
||||
showClear
|
||||
noLabel={false}
|
||||
mode="password"
|
||||
validateStatus="default"
|
||||
mode='password'
|
||||
validateStatus='default'
|
||||
rules={[
|
||||
{ required: true, message: t('请输入管理员密码') },
|
||||
{ min: 8, message: t('密码长度至少为8个字符') }
|
||||
{ min: 8, message: t('密码长度至少为8个字符') },
|
||||
]}
|
||||
initValue={formData.password || ''}
|
||||
onChange={(value) => {
|
||||
@@ -89,8 +89,8 @@ const AdminStep = ({
|
||||
prefix={<IconLock />}
|
||||
showClear
|
||||
noLabel={false}
|
||||
mode="password"
|
||||
validateStatus="default"
|
||||
mode='password'
|
||||
validateStatus='default'
|
||||
rules={[
|
||||
{ required: true, message: t('请确认管理员密码') },
|
||||
{
|
||||
@@ -102,8 +102,8 @@ const AdminStep = ({
|
||||
}
|
||||
}
|
||||
return Promise.resolve();
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
]}
|
||||
initValue={formData.confirmPassword || ''}
|
||||
onChange={(value) => {
|
||||
|
||||
@@ -31,29 +31,39 @@ const CompleteStep = ({
|
||||
setupStatus,
|
||||
formData,
|
||||
renderNavigationButtons,
|
||||
t
|
||||
t,
|
||||
}) => {
|
||||
return (
|
||||
<div className="text-center">
|
||||
<Avatar color="green" className="mx-auto mb-4 shadow-lg">
|
||||
<div className='text-center'>
|
||||
<Avatar color='green' className='mx-auto mb-4 shadow-lg'>
|
||||
<CheckCircle size={24} />
|
||||
</Avatar>
|
||||
<Title heading={3} className="mb-2">{t('准备完成初始化')}</Title>
|
||||
<Text type="secondary" className="mb-6 block">
|
||||
<Title heading={3} className='mb-2'>
|
||||
{t('准备完成初始化')}
|
||||
</Title>
|
||||
<Text type='secondary' className='mb-6 block'>
|
||||
{t('请确认以下设置信息,点击"初始化系统"开始配置')}
|
||||
</Text>
|
||||
|
||||
<Descriptions>
|
||||
<Descriptions.Item itemKey={t('数据库类型')}>
|
||||
{setupStatus.database_type === 'sqlite' ? 'SQLite' :
|
||||
setupStatus.database_type === 'mysql' ? 'MySQL' : 'PostgreSQL'}
|
||||
{setupStatus.database_type === 'sqlite'
|
||||
? 'SQLite'
|
||||
: setupStatus.database_type === 'mysql'
|
||||
? 'MySQL'
|
||||
: 'PostgreSQL'}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item itemKey={t('管理员账号')}>
|
||||
{setupStatus.root_init ? t('已初始化') : (formData.username || t('未设置'))}
|
||||
{setupStatus.root_init
|
||||
? t('已初始化')
|
||||
: formData.username || t('未设置')}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item itemKey={t('使用模式')}>
|
||||
{formData.usageMode === 'external' ? t('对外运营模式') :
|
||||
formData.usageMode === 'self' ? t('自用模式') : t('演示站点模式')}
|
||||
{formData.usageMode === 'external'
|
||||
? t('对外运营模式')
|
||||
: formData.usageMode === 'self'
|
||||
? t('自用模式')
|
||||
: t('演示站点模式')}
|
||||
</Descriptions.Item>
|
||||
</Descriptions>
|
||||
|
||||
|
||||
@@ -40,14 +40,16 @@ const DatabaseStep = ({ setupStatus, renderNavigationButtons, t }) => {
|
||||
'您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!',
|
||||
)}
|
||||
</p>
|
||||
<p className="mt-1">
|
||||
<strong>{t(
|
||||
'建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。',
|
||||
)}</strong>
|
||||
<p className='mt-1'>
|
||||
<strong>
|
||||
{t(
|
||||
'建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。',
|
||||
)}
|
||||
</strong>
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
className="!rounded-lg"
|
||||
className='!rounded-lg'
|
||||
fullMode={false}
|
||||
bordered
|
||||
/>
|
||||
@@ -68,7 +70,7 @@ const DatabaseStep = ({ setupStatus, renderNavigationButtons, t }) => {
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
className="!rounded-lg"
|
||||
className='!rounded-lg'
|
||||
fullMode={false}
|
||||
bordered
|
||||
/>
|
||||
@@ -89,7 +91,7 @@ const DatabaseStep = ({ setupStatus, renderNavigationButtons, t }) => {
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
className="!rounded-lg"
|
||||
className='!rounded-lg'
|
||||
fullMode={false}
|
||||
bordered
|
||||
/>
|
||||
|
||||
@@ -28,7 +28,7 @@ const UsageModeStep = ({
|
||||
formData,
|
||||
handleUsageModeChange,
|
||||
renderNavigationButtons,
|
||||
t
|
||||
t,
|
||||
}) => {
|
||||
return (
|
||||
<>
|
||||
@@ -37,9 +37,9 @@ const UsageModeStep = ({
|
||||
onChange={handleUsageModeChange}
|
||||
type='card'
|
||||
direction='horizontal'
|
||||
className="mt-4"
|
||||
aria-label="使用模式选择"
|
||||
name="usage-mode-selection"
|
||||
className='mt-4'
|
||||
aria-label='使用模式选择'
|
||||
name='usage-mode-selection'
|
||||
>
|
||||
<Radio
|
||||
value='external'
|
||||
|
||||
@@ -26,4 +26,4 @@ export { default as StepNavigation } from './components/StepNavigation';
|
||||
export { default as DatabaseStep } from './components/steps/DatabaseStep';
|
||||
export { default as AdminStep } from './components/steps/AdminStep';
|
||||
export { default as UsageModeStep } from './components/steps/UsageModeStep';
|
||||
export { default as CompleteStep } from './components/steps/CompleteStep';
|
||||
export { default as CompleteStep } from './components/steps/CompleteStep';
|
||||
|
||||
Reference in New Issue
Block a user