统一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
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"
/>
<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 VERSION = "1.3.3";
const APP_VERSION = "1.0.2";
const VERSION = "1.3.4";
const APP_VERSION = "1.0.3";
const getInitialConfig = () => {
if (typeof window === 'undefined') {
+3 -3
View File
@@ -138,13 +138,13 @@ export default function ForwardPage() {
return () => window.removeEventListener('resize', checkMobile);
}, []);
// 显示模式状态 - 从localStorage读取,默认为分类显示
// 显示模式状态 - 从localStorage读取,默认为平铺显示
const [viewMode, setViewMode] = useState<'grouped' | 'direct'>(() => {
try {
const savedMode = localStorage.getItem('forward-view-mode');
return (savedMode as 'grouped' | 'direct') || 'grouped';
return (savedMode as 'grouped' | 'direct') || 'direct';
} catch {
return 'grouped';
return 'direct';
}
});
+59 -12
View File
@@ -58,6 +58,9 @@ export default function NodePage() {
const [dialogTitle, setDialogTitle] = useState('');
const [isEdit, setIsEdit] = 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>({
id: null,
name: '',
@@ -419,19 +422,29 @@ export default function NodePage() {
};
// 删除节点
const handleDelete = async (node: Node) => {
if (window.confirm(`确定要删除节点 "${node.name}" 吗?`)) {
try {
const res = await deleteNode(node.id);
if (res.code === 0) {
toast.success('删除成功');
setNodeList(prev => prev.filter(n => n.id !== node.id));
} else {
toast.error(res.msg || '删除失败');
}
} catch (error) {
toast.error('网络错误,请重试');
const handleDelete = (node: Node) => {
setNodeToDelete(node);
setDeleteModalOpen(true);
};
const confirmDelete = async () => {
if (!nodeToDelete) return;
setDeleteLoading(true);
try {
const res = await deleteNode(nodeToDelete.id);
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>
</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
isOpen={installCommandModal}
+2 -1
View File
@@ -878,7 +878,8 @@ export default function TunnelPage() {
<Modal
isOpen={deleteModalOpen}
onOpenChange={setDeleteModalOpen}
size="md"
size="sm"
scrollBehavior="outside"
>
<ModalContent>
{(onClose) => (