From 837fe41865834b7ac0398733f14919a3536274a6 Mon Sep 17 00:00:00 2001 From: Rogee Date: Wed, 23 Sep 2026 16:14:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(web):=20=E5=AE=98=E6=96=B9=20antd=20lint=20?= =?UTF-8?q?=E6=B8=85=E9=9B=B6=E2=80=94=E2=80=94Alert=20title=E3=80=81Flex?= =?UTF-8?q?=20vertical=20=E6=9B=BF=E4=BB=A3=E5=BC=83=E7=94=A8=20Space/List?= =?UTF-8?q?=E3=80=81App.useApp=20=E5=8C=85=E8=A3=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../accounts/AccountManagementList.tsx | 7 ++- web/src/layouts/index.tsx | 5 +- web/src/pages/accounts/$id/edit.tsx | 17 +++--- web/src/pages/accounts/$id/index.tsx | 15 ++--- web/src/pages/accounts/import.tsx | 2 +- web/src/pages/accounts/new.tsx | 2 +- web/src/pages/attempts/$id/index.tsx | 8 +-- web/src/pages/browsers/$id/index.tsx | 10 ++-- web/src/pages/browsers/index.tsx | 2 +- web/src/pages/creator/competitors/index.tsx | 22 +++---- web/src/pages/creator/settings/index.tsx | 2 +- web/src/pages/creator/workbench/index.tsx | 57 +++++++++++-------- web/src/pages/drafts/$id/index.tsx | 27 ++++----- web/src/pages/gateways/index.tsx | 6 +- web/src/pages/login/index.tsx | 2 +- web/src/pages/network-exits/$id/index.tsx | 8 +-- web/src/pages/network-exits/index.tsx | 6 +- web/src/pages/tasks/$id/index.tsx | 32 +++++------ web/src/pages/tasks/index.tsx | 2 +- 19 files changed, 125 insertions(+), 107 deletions(-) diff --git a/web/src/components/accounts/AccountManagementList.tsx b/web/src/components/accounts/AccountManagementList.tsx index eab3e44..301b3e8 100644 --- a/web/src/components/accounts/AccountManagementList.tsx +++ b/web/src/components/accounts/AccountManagementList.tsx @@ -1,6 +1,7 @@ import { useCallback, useEffect, useState } from 'react'; import { history } from '@umijs/max'; import { + Flex, Alert, Button, Card, @@ -172,12 +173,12 @@ export default function AccountManagementList({ mode }: { mode: 'owned' | 'monit dataIndex: 'status', render: (_, account) => account.source_type === 'owned' ? ( - + {account.runtime_status === 'active' ? '启用' : '暂停'} {account.authorization_status === 'authorized' ? '已授权' : '已撤销'} - + ) : ( {account.enabled ? '监控中' : '已暂停'} ), @@ -244,7 +245,7 @@ export default function AccountManagementList({ mode }: { mode: 'owned' | 'monit 共 {rows.length} 个{isMonitoring ? '监控' : '自有'}账号 {error ? ( - 重试} /> + 重试} /> ) : null} `${row.source_type}:${row.id}`} diff --git a/web/src/layouts/index.tsx b/web/src/layouts/index.tsx index 475790e..a53faee 100644 --- a/web/src/layouts/index.tsx +++ b/web/src/layouts/index.tsx @@ -2,7 +2,7 @@ import { useState } from 'react'; import type { ReactNode } from 'react'; import { history, Outlet, useLocation } from '@umijs/max'; import { PageContainer, ProLayout } from '@ant-design/pro-components'; -import { Dropdown, Typography } from 'antd'; +import { App, Dropdown, Typography } from 'antd'; import { LogoutOutlined } from '@ant-design/icons'; import { PageActionsContext } from '@/components/PageActions'; import { menu, menuSelectedKey, pageMetadata } from '@/utils/metadata'; @@ -59,6 +59,8 @@ export default function Layout() { }} > {/* 页面标题在卡片外(内容区左上角),动作按钮与标题同一行(右侧);卡片内不再重复渲染标题。 */} + {/* App 包裹:App.useApp() 的 message 等实例需要此上下文(component=false 不增加 DOM,避免破坏 ProLayout 布局)。 */} + + ); diff --git a/web/src/pages/accounts/$id/edit.tsx b/web/src/pages/accounts/$id/edit.tsx index 6828357..2dc2cd7 100644 --- a/web/src/pages/accounts/$id/edit.tsx +++ b/web/src/pages/accounts/$id/edit.tsx @@ -3,6 +3,7 @@ import { useCallback, useEffect, useState } from 'react'; import { history, useParams } from '@umijs/max'; import { + Flex, Alert, Button, Card, @@ -262,13 +263,13 @@ export default function Page() { if (error && !selected) return (
- +
); - if (!selected) return ; + if (!selected) return ; const smallAccounts = profiles.filter( (profile) => profile.id !== selected.id && profile.authorization_kind === 'owned' && profile.platform === selected.platform, @@ -276,7 +277,7 @@ export default function Page() { const profileTab = (
- +
@@ -371,13 +372,13 @@ export default function Page() {
-
+
); const strategyTab = selected.big_account ? (
- + 先绑定同平台小号,再保存单动作策略;没有平台执行证据时只记录为不确定。
@@ -418,8 +419,8 @@ export default function Page() { ) : null} - {strategyError ? : null} - {relationError ? : null} + {strategyError ? : null} + {relationError ? : null} {relations.map((relation) => (
@@ -470,7 +471,7 @@ export default function Page() { ))} {!strategies.length && !strategyError ? 尚未配置策略。 : null} - +
) : ( 开启大号模式后可配置有序自动响应策略。 diff --git a/web/src/pages/accounts/$id/index.tsx b/web/src/pages/accounts/$id/index.tsx index 2dba860..4eb8975 100644 --- a/web/src/pages/accounts/$id/index.tsx +++ b/web/src/pages/accounts/$id/index.tsx @@ -3,6 +3,7 @@ import { useCallback, useEffect, useState } from 'react'; import { history, useParams } from '@umijs/max'; import { + Flex, Alert, Button, Card, @@ -103,7 +104,7 @@ export default function Page() { } if (pending) return ; - if (error || !account) return ; + if (error || !account) return ; const statusTag = ( - +
{statusTag}
{account.authorization_status === 'authorized' ? '已授权' : '已撤销'} @@ -134,8 +135,8 @@ export default function Page() { 恢复账号
- -
+ +
), }, @@ -146,7 +147,7 @@ export default function Page() { 重试环境状态 @@ -181,7 +182,7 @@ export default function Page() { label: '文本草稿', children: (
- + 仅支持单用户 Phase A Mock 文本;内部 ID 与版本由系统生成。
))} -
+
), }, diff --git a/web/src/pages/accounts/import.tsx b/web/src/pages/accounts/import.tsx index f12a423..4e1e1a8 100644 --- a/web/src/pages/accounts/import.tsx +++ b/web/src/pages/accounts/import.tsx @@ -177,7 +177,7 @@ export default function Page() { {error ? ( - 重试} /> + 重试} /> ) : null}
diff --git a/web/src/pages/accounts/new.tsx b/web/src/pages/accounts/new.tsx index 64c5286..804e45c 100644 --- a/web/src/pages/accounts/new.tsx +++ b/web/src/pages/accounts/new.tsx @@ -45,7 +45,7 @@ export default function Page() { return ( {error ? ( - + ) : null} diff --git a/web/src/pages/attempts/$id/index.tsx b/web/src/pages/attempts/$id/index.tsx index ce2b7d5..9bd7b04 100644 --- a/web/src/pages/attempts/$id/index.tsx +++ b/web/src/pages/attempts/$id/index.tsx @@ -1,7 +1,7 @@ // Attempt 详情:语义对齐 web.archived TracePages.jsx 的 AttemptDetail。 import { useEffect, useState } from 'react'; import { history, useParams } from '@umijs/max'; -import { Alert, Button, Card, Descriptions, Space, Typography } from 'antd'; +import { Flex, Alert, Button, Card, Descriptions, Space, Typography } from 'antd'; import { getOne } from '@/services/api'; import { dateTime } from '@/utils/helpers'; @@ -31,7 +31,7 @@ export default function Page() { }, [id]); if (pending) return ; - if (error) return ; + if (error) return ; if (!attempt) return null; return ( @@ -42,7 +42,7 @@ export default function Page() { - + {attempt.outcome || '执行中'} {dateTime(attempt.started_at)} @@ -61,7 +61,7 @@ export default function Page() { ) : null} - + ); diff --git a/web/src/pages/browsers/$id/index.tsx b/web/src/pages/browsers/$id/index.tsx index 12f6328..e46e987 100644 --- a/web/src/pages/browsers/$id/index.tsx +++ b/web/src/pages/browsers/$id/index.tsx @@ -1,7 +1,7 @@ // 运行环境详情:语义对齐 web.archived BrowsersPage.jsx 的 BrowserDetail。 import { useEffect, useState } from 'react'; import { history, useParams } from '@umijs/max'; -import { Alert, Button, Card, Descriptions, Space, Tag, Typography, message } from 'antd'; +import { Flex, Alert, App, Button, Card, Descriptions, Space, Tag, Typography } from 'antd'; import { CopyOutlined } from '@ant-design/icons'; import { getOne } from '@/services/api'; @@ -19,6 +19,8 @@ const stateText: Record = { }; export default function Page() { + // 官方规范:静态 message 吃不到 ConfigProvider 上下文,用 App.useApp() 取实例。 + const { message } = App.useApp(); const { id = '' } = useParams<{ id: string }>(); const [runtime, setRuntime] = useState(null); const [pending, setPending] = useState(true); @@ -44,7 +46,7 @@ export default function Page() { }, [id]); if (pending) return ; - if (error || !runtime) return ; + if (error || !runtime) return ; return (
@@ -55,7 +57,7 @@ export default function Page() {
- + {stateText[runtime.state] ?? `未知状态:${runtime.state}`} @@ -104,7 +106,7 @@ export default function Page() { ) : null} - + ); diff --git a/web/src/pages/browsers/index.tsx b/web/src/pages/browsers/index.tsx index 20b767e..cc18264 100644 --- a/web/src/pages/browsers/index.tsx +++ b/web/src/pages/browsers/index.tsx @@ -170,7 +170,7 @@ export default function Page() { {contextHolder} {error ? ( - 重试} /> + 重试} /> ) : null}
{contextHolder} - + 调整条件后自动刷新}>
{workPageInfo.total > works.length ? ( @@ -314,7 +314,7 @@ export default function Page() { title={作品详情 {workDetail.work_key || workDetail.id}} extra={} > - + {workDetail.cover_url ? 作品封面 : null} {workDetail.body || workDetail.title || '暂无正文'} @@ -339,7 +339,7 @@ export default function Page() { ]} locale={{ emptyText: '暂无指标记录。' }} /> - + ) : null} {material ? ( @@ -348,13 +348,13 @@ export default function Page() { - + {statusTag(material.download_status === 'succeeded' ? 'success' : material.download_status === 'failed' ? 'error' : 'default', `下载:${material.download_status}`)} {statusTag(material.audio_status === 'succeeded' ? 'success' : material.audio_status === 'failed' ? 'error' : 'default', `音轨:${material.audio_status}`)} {statusTag(material.transcription_status === 'succeeded' ? 'success' : material.transcription_status === 'failed' ? 'error' : 'default', `转写:${material.transcription_status}`)} - {material.failure_reason ? : null} + {material.failure_reason ? : null}
仿写要求 必须先确认要求,才允许保存可编辑结果。 @@ -366,7 +366,7 @@ export default function Page() { style={{ marginBottom: 12 }} /> {material.rewrite_confirmed_at ? ( - + - + ) : ( )}
-
+ ) : null} -
+ ; - if (error) return 重试} />; + if (error) return 重试} />; return (
diff --git a/web/src/pages/creator/workbench/index.tsx b/web/src/pages/creator/workbench/index.tsx index 0ff3034..4140c06 100644 --- a/web/src/pages/creator/workbench/index.tsx +++ b/web/src/pages/creator/workbench/index.tsx @@ -2,7 +2,7 @@ // 六个页签:评论/线索/规则/事件监听/私信/操作记录;实时更新走 /creator/updates SSE;仅用 antd 默认组件。 import { useEffect, useRef, useState } from 'react'; import type { ReactNode } from 'react'; -import { Alert, Button, Card, Checkbox, Col, Empty, Input, List, Modal, Row, Select, Space, Spin, Table, Tabs, Tag, Typography, message } from 'antd'; +import { Flex, Alert, Button, Card, Checkbox, Col, Empty, Input, Modal, Row, Select, Space, Spin, Table, Tabs, Tag, Typography, message } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { create, creatorAction, creatorCreate, creatorGet, creatorSubscribe, creatorSyncConversation, creatorUpdate, getList } from '@/services/api'; import { conflictMessage, dateTime } from '@/utils/helpers'; @@ -82,7 +82,7 @@ function TabShell({ pending, error, onRetry, children }: { pending: boolean; err return (
{error ? ( - 重试} /> + 重试} /> ) : null} {children}
@@ -556,7 +556,7 @@ export default function Page() { const replyFormCard = reply.target_comment_id && replyTarget ? ( - +
发送账号 @@ -585,7 +585,7 @@ export default function Page() { {tab === 'comments' ? '回复' : ''}目标 UID:{reply.target_uid || '不可用,无法发送'} - + ) : null; @@ -609,7 +609,7 @@ export default function Page() { ) : ( <> - + {visibleData.map((comment: any) => (
@@ -655,7 +655,7 @@ export default function Page() {
))} -
+ )} @@ -668,7 +668,7 @@ export default function Page() { {!pending && !error && !visibleData.length ? ( ) : ( - + {visibleData.map((lead: any) => (
@@ -702,7 +702,7 @@ export default function Page() {
))} -
+ )} ); @@ -713,7 +713,7 @@ export default function Page() { ) : ( <> - + {visibleData.map((event: any) => (
@@ -739,7 +739,7 @@ export default function Page() { ))} - + )} @@ -750,7 +750,7 @@ export default function Page() {
- +
规则名称 @@ -800,7 +800,7 @@ export default function Page() { ) : null} - +
@@ -866,12 +866,21 @@ export default function Page() { - ( - + {visibleConversations.map((conversation: any) => ( + + ))} + @@ -910,14 +919,14 @@ export default function Page() { {messageError ? ( - setMessageRetry((value) => value + 1)}>重试} /> + setMessageRetry((value) => value + 1)}>重试} /> ) : null} {!messagePending && !messageError && !messages.length ? ( ) : ( <> - + {messages.map((msg: any) => (
))} -
+ )} diff --git a/web/src/pages/drafts/$id/index.tsx b/web/src/pages/drafts/$id/index.tsx index fd00ec2..a43d8a5 100644 --- a/web/src/pages/drafts/$id/index.tsx +++ b/web/src/pages/drafts/$id/index.tsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useState } from 'react'; import { history, useParams } from '@umijs/max'; import { + Flex, Alert, Button, Card, @@ -64,7 +65,7 @@ export default function Page() { }, [load]); if (pending) return ; - if (error || !draft) return ; + if (error || !draft) return ; const versions = draft.versions || []; const confirmations = draft.confirmations || []; @@ -119,14 +120,14 @@ export default function Page() { {browsersError ? ( - + ) : null} {!isLatest ? ( history.push(`/drafts/${versions[0]?.id}`)}> 打开最新版本 @@ -134,12 +135,12 @@ export default function Page() { } /> ) : null} - + {draft.content} - + {draft.account.version} {draft.version} @@ -147,10 +148,10 @@ export default function Page() { {browsersError ? '状态未知' : binding?.network_exit_id || '当前机器直连'} {readiness.label} - + - + {versions.map((item: any) => item.id === draft.id ? ( @@ -162,10 +163,10 @@ export default function Page() { ), )} - + - + setReviewed(e.target.checked)}> 我已核对当前账号、草稿内容、运行环境和网络出口 @@ -186,23 +187,23 @@ export default function Page() { ) : ( 保存有效确认后才可加入队列。 )} - + {tasks.length === 0 ? ( 尚未入队。 ) : ( - + {tasks.map((task: any) => ( {task.id} 任务状态:{task.state} ))} - + )} - + form.submit()} confirmLoading={busy} okText={busy ? (editing ? '保存中…' : '注册中…') : editing ? '保存' : '注册网关'}> - {error ? : null} + {error ? : null} 网关 {created.name} 已注册。令牌 {created.token} @@ -203,7 +203,7 @@ export default function Page() { /> ) : null} {error ? ( - 重试} /> + 重试} /> ) : null}
CreatorHub - {error ? : null} + {error ? : null} diff --git a/web/src/pages/network-exits/$id/index.tsx b/web/src/pages/network-exits/$id/index.tsx index 91027ff..66e1620 100644 --- a/web/src/pages/network-exits/$id/index.tsx +++ b/web/src/pages/network-exits/$id/index.tsx @@ -1,7 +1,7 @@ // 网络出口详情:语义对齐 web.archived NetworkExitsPage.jsx 的 NetworkExitDetail。 import { useEffect, useState } from 'react'; import { history, useParams } from '@umijs/max'; -import { Alert, Button, Card, Descriptions, Space, Tag, Typography } from 'antd'; +import { Flex, Alert, Button, Card, Descriptions, Space, Tag, Typography } from 'antd'; import { getOne } from '@/services/api'; import { dateTime } from '@/utils/helpers'; @@ -38,7 +38,7 @@ export default function Page() { }, [id]); if (pending) return ; - if (error || !exit) return ; + if (error || !exit) return ; const known = Object.hasOwn(healthText, exit.health_status ?? ''); return ( @@ -52,7 +52,7 @@ export default function Page() { - + {known ? healthText[exit.health_status] : `未知状态:${exit.health_status}`} @@ -68,7 +68,7 @@ export default function Page() { {exit.observed_public_ip || '尚无观测'} {exit.last_checked_at ? dateTime(exit.last_checked_at) : '未检测'} - + ); diff --git a/web/src/pages/network-exits/index.tsx b/web/src/pages/network-exits/index.tsx index 7da9022..cd1bd98 100644 --- a/web/src/pages/network-exits/index.tsx +++ b/web/src/pages/network-exits/index.tsx @@ -64,7 +64,7 @@ function ExitFormModal({ return ( form.submit()} confirmLoading={busy} okText={busy ? '保存中…' : submitLabel} width={640}> - {error ? : null} + {error ? : null} @@ -288,14 +288,14 @@ export default function Page() { {contextHolder} {error ? ( - 重试} /> + 重试} /> ) : null} {bindingsError ? ( 重试环境状态 diff --git a/web/src/pages/tasks/$id/index.tsx b/web/src/pages/tasks/$id/index.tsx index 292ce67..a618604 100644 --- a/web/src/pages/tasks/$id/index.tsx +++ b/web/src/pages/tasks/$id/index.tsx @@ -2,7 +2,7 @@ // 四卡改用 Tabs(当前状态 / 确认快照 / 执行关联 / 唯一安全动作)——antd 默认组件的信息组织方式。 import { useCallback, useEffect, useState } from 'react'; import { history, useParams } from '@umijs/max'; -import { Alert, Button, Card, Descriptions, Select, Space, Tabs, Tag, Typography, message } from 'antd'; +import { Flex, Alert, Button, Card, Descriptions, Select, Space, Tabs, Tag, Typography, message } from 'antd'; import { getOne, taskAction } from '@/services/api'; import { dateTime } from '@/utils/helpers'; @@ -100,7 +100,7 @@ export default function Page() { } if (pending) return ; - if (error || !task) return ; + if (error || !task) return ; const confirmation = task.confirmation || {}; const unknownHold = task.hold_reason && !holdText[task.hold_reason]; @@ -110,20 +110,20 @@ export default function Page() { key: 'status', label: '当前状态', children: ( - + {stateText[task.state] || `未知状态:${task.state}`} {holdLabel(task.hold_reason)} {task.verification_result || '尚未记录'} - + ), }, { key: 'confirmation', label: '确认快照', children: ( - + {confirmation.id || '未记录'} · v{confirmation.version || '—'} @@ -141,14 +141,14 @@ export default function Page() { 查看草稿 - + ), }, { key: 'execution', label: '执行关联', children: ( - + {task.browser_env_alias || '未记录'} {task.network_exit_id || '未记录'} @@ -168,18 +168,18 @@ export default function Page() { ) : null} - + ), }, { key: 'action', label: '唯一安全动作', children: ( - - {task.readiness_reason ? : null} + + {task.readiness_reason ? : null} {task.allowed_action === 'verify' ? ( <> - +