fix: 修复系统模块TypeScript类型错误和组件功能问题

- 修复消息组件JSX.Element类型错误,改为React.ReactNode
- 完善审核历史页面类型定义和API接口调用
- 优化验证码组件,移除备用验证码逻辑避免无限循环
- 简化系统设置页面,仅保留基本设置和外观设置
- 修复用户管理页面编辑模态框数据加载和CRUD操作
- 移除废弃的作物推荐组件文件

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-12 17:28:11 +08:00
parent dcd7ddeb71
commit dfc29ce01f
21 changed files with 379 additions and 769 deletions

View File

@@ -2,24 +2,19 @@
import { useState, useEffect } from 'react'
import { Button } from '@/components/ui/button'
import { Card } from '@/components/ui/card'
import { Input } from '@/components/ui/input'
import { Textarea } from '@/components/ui/textarea'
import { Label } from '@/components/ui/label'
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
import { SystemSettings } from '@/types/system-params'
import { Save, RefreshCw, Info, Shield, Globe } from 'lucide-react'
import { Save, RefreshCw, Info, Palette, Settings } from 'lucide-react'
import { toast } from 'sonner'
// Import modular components
import {
PlatformInfoCard,
SystemAnnouncementCard,
CopyrightInfoCard,
FeatureToggleCard,
SessionManagementCard,
PasswordPolicyCard,
RegionalSettingsCard,
SettingsInfoCard
} from './components'
import { useTheme } from 'next-themes'
export default function SystemSettingsPage() {
const { setTheme } = useTheme()
const [settings, setSettings] = useState<SystemSettings>({
platformName: '智慧农业生产管理系统',
platformLogo: '',
@@ -27,23 +22,7 @@ export default function SystemSettingsPage() {
contactEmail: 'support@smart-agriculture.com',
contactPhone: '400-888-8888',
address: '北京市海淀区中关村大街1号',
companyName: '智慧农业科技有限公司',
icp: '京ICP备12345678号',
copyright: '© 2024 智慧农业科技有限公司 版权所有',
enableRegistration: true,
enableGuestAccess: false,
sessionTimeout: 30,
maxLoginAttempts: 5,
passwordPolicy: {
minLength: 8,
requireUppercase: true,
requireLowercase: true,
requireNumbers: true,
requireSpecialChars: false,
},
dateFormat: 'YYYY-MM-DD',
timezone: 'Asia/Shanghai',
language: 'zh-CN',
defaultTheme: 'light',
})
const [hasChanges, setHasChanges] = useState(false)
@@ -65,6 +44,12 @@ export default function SystemSettingsPage() {
localStorage.setItem('smart_agriculture_system_settings', JSON.stringify(newSettings))
setSettings(newSettings)
setHasChanges(false)
// 应用默认主题设置
if (newSettings.defaultTheme) {
setTheme(newSettings.defaultTheme)
}
toast.success('系统设置已保存')
}
@@ -110,59 +95,147 @@ export default function SystemSettingsPage() {
<Info className="w-4 h-4 mr-2" />
</TabsTrigger>
<TabsTrigger value="security">
<Shield className="w-4 h-4 mr-2" />
</TabsTrigger>
<TabsTrigger value="regional">
<Globe className="w-4 h-4 mr-2" />
<TabsTrigger value="appearance">
<Palette className="w-4 h-4 mr-2" />
</TabsTrigger>
</TabsList>
{/* 基本设置 */}
<TabsContent value="basic" className="space-y-4">
<PlatformInfoCard
settings={settings}
onSettingsChange={updateSettings}
/>
<SystemAnnouncementCard
settings={settings}
onSettingsChange={updateSettings}
/>
<CopyrightInfoCard
settings={settings}
onSettingsChange={updateSettings}
/>
<FeatureToggleCard
settings={settings}
onSettingsChange={updateSettings}
/>
<Card className="p-6">
<h3 className="mb-4"></h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<Label> *</Label>
<Input
value={settings.platformName}
onChange={(e) => updateSettings({ platformName: e.target.value })}
placeholder="请输入平台名称"
/>
<p className="text-xs text-muted-foreground mt-1">
</p>
</div>
<div>
<Label></Label>
<Input
type="email"
value={settings.contactEmail}
onChange={(e) => updateSettings({ contactEmail: e.target.value })}
placeholder="support@example.com"
/>
</div>
<div>
<Label></Label>
<Input
value={settings.contactPhone}
onChange={(e) => updateSettings({ contactPhone: e.target.value })}
placeholder="400-888-8888"
/>
</div>
<div>
<Label></Label>
<Input
value={settings.address}
onChange={(e) => updateSettings({ address: e.target.value })}
placeholder="请输入公司地址"
/>
</div>
</div>
</Card>
<Card className="p-6">
<h3 className="mb-4"></h3>
<Textarea
value={settings.systemAnnouncement}
onChange={(e) => updateSettings({ systemAnnouncement: e.target.value })}
placeholder="输入系统公告内容,将显示在登录页面"
rows={4}
/>
<p className="text-xs text-muted-foreground mt-2">
</p>
</Card>
</TabsContent>
{/* 安全设置 */}
<TabsContent value="security" className="space-y-4">
<SessionManagementCard
settings={settings}
onSettingsChange={updateSettings}
/>
<PasswordPolicyCard
settings={settings}
onSettingsChange={updateSettings}
/>
</TabsContent>
{/* 外观设置 */}
<TabsContent value="appearance" className="space-y-4">
<Card className="p-6">
<h3 className="mb-4"></h3>
<div className="space-y-4">
<div>
<Label></Label>
<Select
value={settings.defaultTheme}
onValueChange={(value: 'light' | 'dark') => updateSettings({ defaultTheme: value })}
>
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="light">
<div className="flex items-center gap-2">
<div className="w-4 h-4 rounded-full bg-white border-2 border-gray-300" />
<span></span>
</div>
</SelectItem>
<SelectItem value="dark">
<div className="flex items-center gap-2">
<div className="w-4 h-4 rounded-full bg-gray-900 border-2 border-gray-600" />
<span></span>
</div>
</SelectItem>
</SelectContent>
</Select>
<p className="text-xs text-muted-foreground mt-2">
</p>
</div>
</div>
</Card>
{/* 区域设置 */}
<TabsContent value="regional" className="space-y-4">
<RegionalSettingsCard
settings={settings}
onSettingsChange={updateSettings}
/>
<Card className="p-6 bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-900">
<h4 className="text-blue-900 dark:text-blue-400 mb-2">
<Palette className="w-4 h-4 inline mr-2" />
</h4>
<div className="grid grid-cols-2 gap-4">
<div className="p-4 rounded-lg bg-white border-2 border-gray-300">
<p className="text-sm mb-2"></p>
<div className="space-y-2">
<div className="h-2 bg-green-600 rounded" />
<div className="h-2 bg-gray-200 rounded" />
<div className="h-2 bg-gray-200 rounded w-3/4" />
</div>
</div>
<div className="p-4 rounded-lg bg-gray-900 border-2 border-gray-600">
<p className="text-sm text-white mb-2"></p>
<div className="space-y-2">
<div className="h-2 bg-green-500 rounded" />
<div className="h-2 bg-gray-700 rounded" />
<div className="h-2 bg-gray-700 rounded w-3/4" />
</div>
</div>
</div>
</Card>
</TabsContent>
</Tabs>
{/* 设置预览 */}
<SettingsInfoCard />
{/* 设置说明 */}
<Card className="p-4 bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-900">
<h4 className="text-blue-900 dark:text-blue-400 mb-2">
<Settings className="w-4 h-4 inline mr-2" />
</h4>
<ul className="space-y-1 text-sm text-blue-800 dark:text-blue-300">
<li> <strong></strong></li>
<li> <strong></strong>/</li>
<li> </li>
<li> </li>
<li> "保存设置"</li>
</ul>
</Card>
</div>
)
}