mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-06 01:56:37 +08:00
统一ui显示效果
This commit is contained in:
@@ -1 +1 @@
|
|||||||
VITE_API_BASE=http://192.168.31.126:6365
|
VITE_API_BASE=http://192.168.100.11:6365
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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') {
|
||||||
|
|||||||
@@ -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';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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) => (
|
||||||
|
|||||||
Reference in New Issue
Block a user