diff --git a/vite-frontend/src/App.tsx b/vite-frontend/src/App.tsx index d3b6e67..bc19000 100644 --- a/vite-frontend/src/App.tsx +++ b/vite-frontend/src/App.tsx @@ -15,7 +15,6 @@ import ProfilePage from "@/pages/profile"; import LimitPage from "@/pages/limit"; import ConfigPage from "@/pages/config"; import PanelSharingPage from "@/pages/panel-sharing"; -import { SettingsPage } from "@/pages/settings"; import AdminLayout from "@/layouts/admin"; import H5Layout from "@/layouts/h5"; import H5SimpleLayout from "@/layouts/h5-simple"; @@ -243,7 +242,6 @@ function App() { } path="/panel-sharing" /> - } path="/settings" /> ); diff --git a/vite-frontend/src/components/navbar.tsx b/vite-frontend/src/components/navbar.tsx index a3e51b6..ae1f470 100644 --- a/vite-frontend/src/components/navbar.tsx +++ b/vite-frontend/src/components/navbar.tsx @@ -81,7 +81,7 @@ export const Navbar = () => { navigate("/settings")} + onClick={() => navigate("/config")} > - typeof value === "string" ? value === "true" : defaultValue; - -export const SettingsPage = () => { - const navigate = useNavigate(); - const [panelAddresses, setPanelAddresses] = useState([]); - const [newName, setNewName] = useState(""); - const [newAddress, setNewAddress] = useState(""); - const [updateChannel, setUpdateChannel] = useState( - getUpdateReleaseChannel(), - ); - const [forwardCompactMode, setForwardCompactMode] = useState(false); - const [forwardCompactModeSaving, setForwardCompactModeSaving] = - useState(false); - - const admin = isAdmin(); - - const setPanelAddressesFunc = (newAddress: PanelAddress[]) => { - setPanelAddresses(newAddress); - }; - - useEffect(() => { - (window as any).setPanelAddresses = setPanelAddressesFunc; - - return () => { - delete (window as any).setPanelAddresses; - }; - }, []); - - // 加载面板地址列表 - const loadPanelAddresses = async () => { - getPanelAddresses(); - }; - - // 添加新面板地址 - const addPanelAddress = async () => { - if (!newName.trim() || !newAddress.trim()) { - toast.error("请输入名称和地址"); - - return; - } - - // 验证地址格式 - if (!validatePanelAddress(newAddress.trim())) { - toast.error( - "地址格式不正确,请检查:\n• 必须是完整的URL格式\n• 必须以 http:// 或 https:// 开头\n• 支持域名、IPv4、IPv6 地址\n• 端口号范围:1-65535\n• 示例:http://192.168.1.100:3000", - ); - - return; - } - savePanelAddress(newName.trim(), newAddress.trim()); - setNewName(""); - setNewAddress(""); - toast.success("添加成功"); - }; - - // 设置当前面板地址 - const setCurrentPanel = async (name: string) => { - setCurrentPanelAddress(name); - reinitializeBaseURL(); - }; - - // 删除面板地址 - const handleDeletePanelAddress = async (name: string) => { - deletePanelAddress(name); - reinitializeBaseURL(); - toast.success("删除成功"); - }; - - // 页面加载时获取数据 - useEffect(() => { - loadPanelAddresses(); - loadForwardCompactMode(); - }, []); - - const loadForwardCompactMode = async () => { - try { - const res = await getConfigByName(FORWARD_COMPACT_MODE_CONFIG_KEY); - setForwardCompactMode(parseBooleanConfig(res.data?.value, false)); - } catch { - setForwardCompactMode(false); - } - }; - - const handleForwardCompactModeChange = async (enabled: boolean) => { - if (!admin || forwardCompactModeSaving) { - return; - } - - const previous = forwardCompactMode; - - setForwardCompactMode(enabled); - setForwardCompactModeSaving(true); - try { - const response = await updateConfig( - FORWARD_COMPACT_MODE_CONFIG_KEY, - enabled ? "true" : "false", - ); - - if (response.code === 0) { - toast.success(`规则页面精简模式已${enabled ? "开启" : "关闭"}`); - window.dispatchEvent( - new CustomEvent("forwardCompactModeChanged", { - detail: { enabled }, - }), - ); - } else { - setForwardCompactMode(previous); - toast.error(response.msg || "保存精简模式失败"); - } - } catch { - setForwardCompactMode(previous); - toast.error("保存精简模式失败"); - } finally { - setForwardCompactModeSaving(false); - } - }; - - const handleUpdateChannelChange = (channel: UpdateReleaseChannel) => { - setUpdateChannel(channel); - setUpdateReleaseChannel(channel); - toast.success( - `更新通道已切换为${channel === "stable" ? "稳定版" : "开发版"}`, - ); - }; - - return ( - - {/* 顶部导航 */} - - - - navigate(-1)} - > - - - - 面板设置 - - - - - - {/* 内容区域 */} - - - - - - 更新设置 - - - { - const selected = - (Array.from(keys)[0] as UpdateReleaseChannel) || "stable"; - - handleUpdateChannelChange(selected); - }} - > - - 稳定版(纯数字版本,如 2.1.4) - - - 开发版(含 alpha / beta / rc) - - - - 版本提示会根据该通道检查最新版本。 - - - - - - - - - 显示设置 - - - - - - - 规则页面精简模式 - - - 开启后,规则页面列表使用 2.1.6-alpha8 样式。{" "} - - - - - {!admin && ( - - 仅管理员可修改该全局配置。 - - )} - - - - - - {/* 添加新地址 */} - - - - 添加新面板地址 - - - - setNewName(e.target.value)} - /> - setNewAddress(e.target.value)} - /> - - - 添加 - - - - - - {/* 地址列表 */} - - - - 已保存的面板地址 - - {panelAddresses.length === 0 ? ( - - 暂无保存的面板地址 - - ) : ( - - {panelAddresses.map((panel, index) => ( - - - - - - {panel.name} - - {panel.inx && ( - - 当前 - - )} - - - {panel.address} - - - - {!panel.inx && ( - setCurrentPanel(panel.name)} - > - 设为当前 - - )} - handleDeletePanelAddress(panel.name)} - > - 删除 - - - - - ))} - - )} - - - - - - ); -};
- 版本提示会根据该通道检查最新版本。 -
- 规则页面精简模式 -
- 开启后,规则页面列表使用 2.1.6-alpha8 样式。{" "} -
- 仅管理员可修改该全局配置。 -
- 暂无保存的面板地址 -
- {panel.address} -