- 通用问答
+ {pageTitle}
- 支持单轮RAG、多轮RAG、深度检索及结果对比
+ {pageSubtitle}
diff --git a/frontend-web/src/strategy-components/components/resource-management/KnowledgeBaseResourceManagement.tsx b/frontend-web/src/strategy-components/components/resource-management/KnowledgeBaseResourceManagement.tsx
new file mode 100644
index 00000000..10b4d741
--- /dev/null
+++ b/frontend-web/src/strategy-components/components/resource-management/KnowledgeBaseResourceManagement.tsx
@@ -0,0 +1,50 @@
+import React, { useEffect, useState } from "react";
+
+import {
+ getKnowledgeIframeApiUrl,
+ getKnowledgeIframeSkin,
+} from "@/core/strategy/external-links";
+import { requestCrudService } from "@/service/request-axios-service";
+import "@/strategy-components/components/task-components/css/strategy-data.css";
+
+const service = requestCrudService;
+
+const KnowledgeBaseResourceManagement: React.FC = () => {
+ const [iframeUrl, setIframeUrl] = useState("");
+
+ useEffect(() => {
+ const initIframeUrl = async () => {
+ const apiUrl = getKnowledgeIframeApiUrl();
+ if (!apiUrl) return;
+
+ const jsonStr = localStorage.getItem("userInfo");
+ if (!jsonStr) return;
+
+ try {
+ const userInfo = JSON.parse(jsonStr);
+ const token = userInfo.accessToken;
+ if (!token) return;
+
+ const res = (await service.post(apiUrl, {
+ token,
+ skin: getKnowledgeIframeSkin(),
+ })) as { iframeUrl?: string };
+ if (res?.iframeUrl) {
+ setIframeUrl(res.iframeUrl);
+ }
+ } catch (error) {
+ console.error("Failed to load knowledge iframe url:", error);
+ }
+ };
+
+ void initIframeUrl();
+ }, []);
+
+ return (
+
+
+
+ );
+};
+
+export default KnowledgeBaseResourceManagement;
diff --git a/frontend-web/src/strategy-components/components/resource-management/NetworkActorResourceManagement.tsx b/frontend-web/src/strategy-components/components/resource-management/NetworkActorResourceManagement.tsx
new file mode 100644
index 00000000..58f551e5
--- /dev/null
+++ b/frontend-web/src/strategy-components/components/resource-management/NetworkActorResourceManagement.tsx
@@ -0,0 +1,20 @@
+import React, { useEffect, useState } from "react";
+
+import { getNetworkActorIframeUrl } from "@/core/strategy/external-links";
+import "@/strategy-components/components/task-components/css/strategy-data.css";
+
+const NetworkActorResourceManagement: React.FC = () => {
+ const [iframeUrl, setIframeUrl] = useState("");
+
+ useEffect(() => {
+ setIframeUrl(getNetworkActorIframeUrl());
+ }, []);
+
+ return (
+
+
+
+ );
+};
+
+export default NetworkActorResourceManagement;
diff --git a/frontend-web/src/strategy-components/components/task-components/css/strategy-data.css b/frontend-web/src/strategy-components/components/task-components/css/strategy-data.css
index 047ca114..85bca3d6 100644
--- a/frontend-web/src/strategy-components/components/task-components/css/strategy-data.css
+++ b/frontend-web/src/strategy-components/components/task-components/css/strategy-data.css
@@ -175,10 +175,66 @@
}
/* ── TDesign overrides inside task pages ─────────────────────────────── */
+.strategy-data .t-loading,
.strategy-data .t-loading__parent {
min-height: 0;
}
+.strategy-data .t-loading--full {
+ position: absolute;
+ inset: 0;
+}
+
+.strategy-data .t-loading__overlay {
+ background: rgb(255 255 255 / 60%);
+}
+
+.dark .strategy-data .t-loading__overlay {
+ background: rgb(15 23 42 / 45%);
+}
+
.strategy-data .t-pagination {
justify-content: center;
}
+
+.strategy-data .t-date-range-picker,
+.strategy-data .t-date-picker,
+.strategy-data .t-input {
+ width: 100%;
+ max-width: 360px;
+}
+
+.strategy-data .t-input__wrap,
+.strategy-data .t-range-input {
+ background: var(--td-bg-color-container, #fff);
+}
+
+.dark .strategy-data .t-input__wrap,
+.dark .strategy-data .t-range-input {
+ background: var(--td-bg-color-container, #1e293b);
+ color: var(--td-text-color-primary, #e2e8f0);
+}
+
+.strategy-data .t-row,
+.strategy-data .t-col {
+ min-height: 0;
+}
+
+/* Popups are portaled to body — keep panels above app chrome */
+.t-popup,
+.t-date-picker__panel-container,
+.t-date-range-picker__panel-container {
+ z-index: 6500;
+}
+
+/* ── iframe embed pages (resource management, TY tasks, etc.) ─────────── */
+.strategy-data .iframe-container {
+ width: 100%;
+ height: calc(100vh - 100px);
+}
+
+.strategy-data .full-size-iframe {
+ width: 100%;
+ height: 100%;
+ border: none;
+}