From a9f01bec79948078f6c1551cfeed11dc940dbff2 Mon Sep 17 00:00:00 2001 From: fengxiangdebaozi <10845145+fengxiangdebaozi@user.noreply.gitee.com> Date: Fri, 19 Jun 2026 16:08:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(task-buttons):=20=E5=A4=96=E9=93=BE?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E6=96=B0=E5=A2=9E=E3=80=8C=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E3=80=8D=EF=BC=88=E6=96=B0=E7=AA=97=E5=8F=A3?= =?UTF-8?q?/=E5=BD=93=E5=89=8D=E7=AA=97=E5=8F=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按钮管理(/page/strategy/admin/task-buttons)的 url 外链按钮可配置打开方式: - blank=新窗口(默认,window.open(_blank),行为同改前) - self=当前窗口(window.location.assign,嵌入态即当前 iframe) 新增 TaskButton.openMode 字段贯通前后端:前端 task-buttons.ts 类型+种子+ runTaskButton 打开逻辑、api 客户端 snake⇄camel 映射、TaskButtonsPage 下拉; 后端 router schema + ORM open_mode 列(可空默认 blank,启动自动 ALTER 补列, 无需手动迁移)+ sql/memory store 归一化。仅 url 类型生效。 Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend-web/src/core/auth/task-buttons.ts | 17 ++++++++++++++++- frontend-web/src/pages/TaskButtonsPage.tsx | 14 ++++++++++++++ .../src/strategy-components/api/task-buttons.ts | 4 ++++ .../backend/app/gateway/routers/task_buttons.py | 2 ++ .../deerflow/persistence/task_buttons/memory.py | 1 + .../deerflow/persistence/task_buttons/model.py | 2 ++ .../deerflow/persistence/task_buttons/sql.py | 2 ++ 7 files changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend-web/src/core/auth/task-buttons.ts b/frontend-web/src/core/auth/task-buttons.ts index e7f10d42..edc31642 100644 --- a/frontend-web/src/core/auth/task-buttons.ts +++ b/frontend-web/src/core/auth/task-buttons.ts @@ -59,6 +59,9 @@ export type TaskButtonLinkType = "url" | "business" | "purpose"; /** 追加的 id 取哪种:``task``=任务id(默认)/ ``action``=行动id(仅 xdfx 二者不同)。 */ export type TaskButtonIdKind = "task" | "action"; +/** ``url`` 外链打开方式:``blank``=新窗口(默认)/ ``self``=当前窗口(嵌入态即当前 iframe)。 */ +export type TaskButtonOpenMode = "blank" | "self"; + /** 一个可配置跳转按钮。 */ export interface TaskButton { id: string; @@ -76,6 +79,8 @@ export interface TaskButton { * 实为行动id,任务id 由 action 接口解析。其它业务两者相同。 */ idKind: TaskButtonIdKind; + /** ``url`` 外链打开方式:``blank``=新窗口(默认)/ ``self``=当前窗口。仅 ``url`` 类型有意义。 */ + openMode: TaskButtonOpenMode; enabled: boolean; sortOrder: number; } @@ -109,6 +114,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] { appendTaskId: false, idParam: "id", idKind: "task", + openMode: "blank", enabled: true, sortOrder, }); @@ -122,6 +128,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] { appendTaskId: false, idParam: "id", idKind: "task", + openMode: "blank", enabled: true, sortOrder, }); @@ -136,6 +143,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] { appendTaskId: true, idParam: "id", idKind: "task", + openMode: "blank", enabled: true, sortOrder: 0, }, @@ -148,6 +156,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] { appendTaskId: true, idParam: "id", idKind: "task", + openMode: "blank", enabled: true, sortOrder: 1, }, @@ -160,6 +169,7 @@ export function defaultTaskButtons(cfg: TaskDeeplinkConfig): TaskButton[] { appendTaskId: true, idParam: "id", idKind: "task", + openMode: "blank", enabled: true, sortOrder: 2, }, @@ -227,7 +237,12 @@ export async function runTaskButton(btn: TaskButton, ctx: RunTaskButtonCtx): Pro const id = btn.idKind === "action" ? ctx.actionId || ctx.taskId : ctx.taskId; const param = (btn.idParam || "id").trim() || "id"; const url = btn.appendTaskId && id ? appendQueryParam(base, param, id) : base; - window.open(url, "_blank", "noopener,noreferrer"); + // 打开方式:self=当前窗口(嵌入态即当前 iframe);否则 blank=新窗口(默认)。 + if (btn.openMode === "self") { + window.location.assign(url); + } else { + window.open(url, "_blank", "noopener,noreferrer"); + } return; } // business:内部切换到另一业务 diff --git a/frontend-web/src/pages/TaskButtonsPage.tsx b/frontend-web/src/pages/TaskButtonsPage.tsx index dfd5f47e..59d8373b 100644 --- a/frontend-web/src/pages/TaskButtonsPage.tsx +++ b/frontend-web/src/pages/TaskButtonsPage.tsx @@ -104,6 +104,7 @@ export default function TaskButtonsPage() { appendTaskId: true, idParam: "id", idKind: "task", + openMode: "blank", enabled: true, sortOrder: maxSort + 1, }, @@ -305,6 +306,19 @@ export default function TaskButtonsPage() { )} )} + + ) : (