🎨 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:
t0ng7u
2025-08-30 21:15:10 +08:00
parent 41cf516ec5
commit 0d57b1acd4
274 changed files with 11025 additions and 7659 deletions

View File

@@ -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: () => (

View File

@@ -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('初始化系统')}

View File

@@ -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) => {

View File

@@ -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>

View File

@@ -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
/>

View File

@@ -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'

View File

@@ -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';