diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx
index ad7e097..39f9bf5 100644
--- a/apps/web/src/App.tsx
+++ b/apps/web/src/App.tsx
@@ -19,20 +19,100 @@ function PrivateRoute({ children }: { children: React.ReactNode }) {
return isAuthenticated ? <>{children}> : ;
}
+const themeConfig = {
+ token: {
+ colorPrimary: '#4F46E5',
+ colorSuccess: '#059669',
+ colorWarning: '#D97706',
+ colorError: '#DC2626',
+ colorInfo: '#2563EB',
+ colorBgLayout: '#F1F5F9',
+ colorBgContainer: '#FFFFFF',
+ colorBgElevated: '#FFFFFF',
+ colorBorder: '#E2E8F0',
+ colorBorderSecondary: '#F1F5F9',
+ borderRadius: 8,
+ borderRadiusLG: 12,
+ borderRadiusSM: 6,
+ fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', 'Microsoft YaHei', 'Hiragino Sans GB', 'Helvetica Neue', Helvetica, Arial, sans-serif",
+ fontSize: 14,
+ fontSizeHeading4: 20,
+ controlHeight: 36,
+ controlHeightLG: 40,
+ controlHeightSM: 28,
+ boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.06), 0 1px 2px -1px rgba(0, 0, 0, 0.06)',
+ boxShadowSecondary: '0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.07)',
+ },
+ components: {
+ Button: {
+ primaryShadow: '0 1px 2px 0 rgba(79, 70, 229, 0.3)',
+ fontWeight: 500,
+ },
+ Card: {
+ paddingLG: 20,
+ },
+ Table: {
+ headerBg: '#F8FAFC',
+ headerColor: '#475569',
+ rowHoverBg: '#F5F3FF',
+ fontSize: 14,
+ },
+ Menu: {
+ itemBorderRadius: 8,
+ itemMarginInline: 8,
+ itemHeight: 40,
+ },
+ Modal: {
+ borderRadiusLG: 16,
+ },
+ Tag: {
+ borderRadiusSM: 6,
+ },
+ },
+};
+
+const darkThemeConfig = {
+ ...themeConfig,
+ token: {
+ ...themeConfig.token,
+ colorBgLayout: '#0B0F1A',
+ colorBgContainer: '#111827',
+ colorBgElevated: '#1E293B',
+ colorBorder: '#1E293B',
+ colorBorderSecondary: '#1E293B',
+ boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.3)',
+ boxShadowSecondary: '0 4px 6px -1px rgba(0, 0, 0, 0.4)',
+ },
+ components: {
+ ...themeConfig.components,
+ Table: {
+ headerBg: '#1E293B',
+ headerColor: '#94A3B8',
+ rowHoverBg: '#1E293B',
+ },
+ },
+};
+
export default function App() {
const loadFromStorage = useAuthStore((s) => s.loadFromStorage);
- const theme = useAppStore((s) => s.theme);
+ const themeMode = useAppStore((s) => s.theme);
- // Restore auth state from localStorage on app load
useEffect(() => {
loadFromStorage();
}, [loadFromStorage]);
+ useEffect(() => {
+ document.documentElement.setAttribute('data-theme', themeMode);
+ }, [themeMode]);
+
+ const isDark = themeMode === 'dark';
+
return (
diff --git a/apps/web/src/pages/Settings.tsx b/apps/web/src/pages/Settings.tsx
index 719f283..7fa38ac 100644
--- a/apps/web/src/pages/Settings.tsx
+++ b/apps/web/src/pages/Settings.tsx
@@ -1,4 +1,13 @@
import { Tabs } from 'antd';
+import {
+ BookOutlined,
+ GlobalOutlined,
+ MenuOutlined,
+ NumberOutlined,
+ SettingOutlined,
+ BgColorsOutlined,
+ AuditOutlined,
+} from '@ant-design/icons';
import DictionaryManager from './settings/DictionaryManager';
import LanguageManager from './settings/LanguageManager';
import MenuConfig from './settings/MenuConfig';
@@ -8,17 +17,93 @@ import ThemeSettings from './settings/ThemeSettings';
import AuditLogViewer from './settings/AuditLogViewer';
const Settings: React.FC = () => {
- const items = [
- { key: 'dictionaries', label: '数据字典', children: },
- { key: 'languages', label: '语言管理', children: },
- { key: 'menus', label: '菜单配置', children: },
- { key: 'numbering', label: '编号规则', children: },
- { key: 'settings', label: '系统参数', children: },
- { key: 'theme', label: '主题设置', children: },
- { key: 'audit-log', label: '审计日志', children: },
- ];
+ return (
+
+
+
+
系统设置
+
管理系统参数、字典、菜单、主题等配置
+
+
- return
;
+
+
+ 数据字典
+
+ ),
+ children: ,
+ },
+ {
+ key: 'languages',
+ label: (
+
+
+ 语言管理
+
+ ),
+ children: ,
+ },
+ {
+ key: 'menus',
+ label: (
+
+
+ 菜单配置
+
+ ),
+ children: ,
+ },
+ {
+ key: 'numbering',
+ label: (
+
+
+ 编号规则
+
+ ),
+ children: ,
+ },
+ {
+ key: 'settings',
+ label: (
+
+
+ 系统参数
+
+ ),
+ children: ,
+ },
+ {
+ key: 'theme',
+ label: (
+
+
+ 主题设置
+
+ ),
+ children: ,
+ },
+ {
+ key: 'audit-log',
+ label: (
+
+
+ 审计日志
+
+ ),
+ children: ,
+ },
+ ]}
+ />
+
+ );
};
export default Settings;