统一ui显示效果

This commit is contained in:
qaq
2025-08-29 09:38:04 +08:00
parent 414a3a2c91
commit 7984129b4c
6 changed files with 68 additions and 20 deletions
+1 -1
View File
@@ -1 +1 @@
VITE_API_BASE=http://192.168.31.126:6365 VITE_API_BASE=http://192.168.100.11:6365
+1 -1
View File
@@ -148,7 +148,7 @@
/> />
<meta <meta
key="viewport" key="viewport"
content="viewport-fit=cover, width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" content="viewport-fit=cover, width=device-width, initial-scale=1.0, user-scalable=no"
name="viewport" name="viewport"
/> />
<link href="/favicon.ico" rel="icon" /> <link href="/favicon.ico" rel="icon" />
+2 -2
View File
@@ -4,8 +4,8 @@ export type SiteConfig = typeof siteConfig;
// 缓存相关常量 // 缓存相关常量
const CACHE_PREFIX = 'vite_config_'; const CACHE_PREFIX = 'vite_config_';
const VERSION = "1.3.3"; const VERSION = "1.3.4";
const APP_VERSION = "1.0.2"; const APP_VERSION = "1.0.3";
const getInitialConfig = () => { const getInitialConfig = () => {
if (typeof window === 'undefined') { if (typeof window === 'undefined') {
+3 -3
View File
@@ -138,13 +138,13 @@ export default function ForwardPage() {
return () => window.removeEventListener('resize', checkMobile); return () => window.removeEventListener('resize', checkMobile);
}, []); }, []);
// 显示模式状态 - 从localStorage读取,默认为分类显示 // 显示模式状态 - 从localStorage读取,默认为平铺显示
const [viewMode, setViewMode] = useState<'grouped' | 'direct'>(() => { const [viewMode, setViewMode] = useState<'grouped' | 'direct'>(() => {
try { try {
const savedMode = localStorage.getItem('forward-view-mode'); const savedMode = localStorage.getItem('forward-view-mode');
return (savedMode as 'grouped' | 'direct') || 'grouped'; return (savedMode as 'grouped' | 'direct') || 'direct';
} catch { } catch {
return 'grouped'; return 'direct';
} }
}); });
+59 -12
View File
@@ -58,6 +58,9 @@ export default function NodePage() {
const [dialogTitle, setDialogTitle] = useState(''); const [dialogTitle, setDialogTitle] = useState('');
const [isEdit, setIsEdit] = useState(false); const [isEdit, setIsEdit] = useState(false);
const [submitLoading, setSubmitLoading] = useState(false); const [submitLoading, setSubmitLoading] = useState(false);
const [deleteModalOpen, setDeleteModalOpen] = useState(false);
const [deleteLoading, setDeleteLoading] = useState(false);
const [nodeToDelete, setNodeToDelete] = useState<Node | null>(null);
const [form, setForm] = useState<NodeForm>({ const [form, setForm] = useState<NodeForm>({
id: null, id: null,
name: '', name: '',
@@ -419,19 +422,29 @@ export default function NodePage() {
}; };
// 删除节点 // 删除节点
const handleDelete = async (node: Node) => { const handleDelete = (node: Node) => {
if (window.confirm(`确定要删除节点 "${node.name}" 吗?`)) { setNodeToDelete(node);
try { setDeleteModalOpen(true);
const res = await deleteNode(node.id); };
if (res.code === 0) {
toast.success('删除成功'); const confirmDelete = async () => {
setNodeList(prev => prev.filter(n => n.id !== node.id)); if (!nodeToDelete) return;
} else {
toast.error(res.msg || '删除失败'); setDeleteLoading(true);
} try {
} catch (error) { const res = await deleteNode(nodeToDelete.id);
toast.error('网络错误,请重试'); if (res.code === 0) {
toast.success('删除成功');
setNodeList(prev => prev.filter(n => n.id !== nodeToDelete.id));
setDeleteModalOpen(false);
setNodeToDelete(null);
} else {
toast.error(res.msg || '删除失败');
} }
} catch (error) {
toast.error('网络错误,请重试');
} finally {
setDeleteLoading(false);
} }
}; };
@@ -883,6 +896,40 @@ export default function NodePage() {
</ModalContent> </ModalContent>
</Modal> </Modal>
{/* 删除确认模态框 */}
<Modal
isOpen={deleteModalOpen}
onOpenChange={setDeleteModalOpen}
size="sm"
scrollBehavior="outside"
>
<ModalContent>
{(onClose) => (
<>
<ModalHeader className="flex flex-col gap-1">
<h2 className="text-xl font-bold">确认删除</h2>
</ModalHeader>
<ModalBody>
<p>确定要删除节点 <strong>"{nodeToDelete?.name}"</strong> 吗?</p>
<p className="text-small text-default-500">此操作不可恢复,请谨慎操作。</p>
</ModalBody>
<ModalFooter>
<Button variant="light" onPress={onClose}>
取消
</Button>
<Button
color="danger"
onPress={confirmDelete}
isLoading={deleteLoading}
>
{deleteLoading ? '删除中...' : '确认删除'}
</Button>
</ModalFooter>
</>
)}
</ModalContent>
</Modal>
{/* 安装命令模态框 */} {/* 安装命令模态框 */}
<Modal <Modal
isOpen={installCommandModal} isOpen={installCommandModal}
+2 -1
View File
@@ -878,7 +878,8 @@ export default function TunnelPage() {
<Modal <Modal
isOpen={deleteModalOpen} isOpen={deleteModalOpen}
onOpenChange={setDeleteModalOpen} onOpenChange={setDeleteModalOpen}
size="md" size="sm"
scrollBehavior="outside"
> >
<ModalContent> <ModalContent>
{(onClose) => ( {(onClose) => (