From 40305bd4ca209ac96067d4f0d259a956bbeb473f Mon Sep 17 00:00:00 2001 From: "LUOJIE\\coolp" Date: Fri, 16 Jan 2026 18:07:42 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=9E=E7=AE=A1=E7=90=86=E5=91=98=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E5=A4=B4=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/base/iframe-postmessage.tsx | 34 +++++++++++++++++-- .../app/components/header/header-wrapper.tsx | 11 +++++- .../web/context/global-public-context.tsx | 14 +++++++- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/dify_1.11.1/web/app/components/base/iframe-postmessage.tsx b/dify_1.11.1/web/app/components/base/iframe-postmessage.tsx index 4a2f3b88..e21dbf05 100644 --- a/dify_1.11.1/web/app/components/base/iframe-postmessage.tsx +++ b/dify_1.11.1/web/app/components/base/iframe-postmessage.tsx @@ -1,13 +1,15 @@ 'use client' import { useEffect, useRef } from 'react' +import { useSelector } from '@/context/app-context' /** * IframePostMessage * 页面加载完成后向父页面发送一次消息,并每 5 秒发送一次。 - * 仅当当前窗口运行在 iframe 中时才发送。 + * 仅当当前窗口运行在 iframe 中时才发送本地缓存消息。 */ const IframePostMessage = () => { const initializedRef = useRef(false) + const isCurrentWorkspaceManager = useSelector(s => s.isCurrentWorkspaceManager) /** * sendMessage @@ -47,6 +49,27 @@ const IframePostMessage = () => { } } + /** + * applyHeaderVisibility + * 使用原生 JS 根据管理员状态隐藏或显示头部容器: + * - 非管理员(owner/admin 之外)隐藏 + * - 管理员显示 + * 不区分是否在 iframe 中,统一处理。 + */ + const applyHeaderVisibility = () => { + try { + if (typeof document === 'undefined') return + const headerEl = document.querySelector('.app-global-header') as HTMLElement | null + if (!headerEl) return + if (!isCurrentWorkspaceManager) + headerEl.style.display = 'none' + else + headerEl.style.display = '' + } catch { + // 忽略可能的运行时错误 + } + } + useEffect(() => { if (initializedRef.current) return initializedRef.current = true @@ -74,7 +97,14 @@ const IframePostMessage = () => { } }, []) + /** + * 根据管理员状态应用头部可见性 + */ + useEffect(() => { + applyHeaderVisibility() + }, [isCurrentWorkspaceManager]) + return null } -export default IframePostMessage \ No newline at end of file +export default IframePostMessage diff --git a/dify_1.11.1/web/app/components/header/header-wrapper.tsx b/dify_1.11.1/web/app/components/header/header-wrapper.tsx index 3458888e..c7ce1818 100644 --- a/dify_1.11.1/web/app/components/header/header-wrapper.tsx +++ b/dify_1.11.1/web/app/components/header/header-wrapper.tsx @@ -3,12 +3,19 @@ import React, { useState } from 'react' import { usePathname } from 'next/navigation' import s from './index.module.css' import { useEventEmitterContextContext } from '@/context/event-emitter' +import { useSelector } from '@/context/app-context' import classNames from '@/utils/classnames' type HeaderWrapperProps = { children: React.ReactNode } +/** + * HeaderWrapper + * 负责包裹并渲染全局头部区域。 + * - 在工作流画布最大化时隐藏头部 + * - 当当前用户非管理员(owner/admin 之外)时隐藏头部(不区分是否在 iframe) + */ const HeaderWrapper = ({ children, }: HeaderWrapperProps) => { @@ -20,6 +27,7 @@ const HeaderWrapper = ({ const workflowCanvasMaximize = localStorage.getItem('workflow-canvas-maximize') === 'true' const [hideHeader, setHideHeader] = useState(workflowCanvasMaximize) const { eventEmitter } = useEventEmitterContextContext() + const isCurrentWorkspaceManager = useSelector(s => s.isCurrentWorkspaceManager) eventEmitter?.useSubscription((v: any) => { if (v?.type === 'workflow-canvas-maximize') @@ -29,9 +37,10 @@ const HeaderWrapper = ({ return (
{children} diff --git a/dify_1.11.1/web/context/global-public-context.tsx b/dify_1.11.1/web/context/global-public-context.tsx index 324ac019..273815e4 100644 --- a/dify_1.11.1/web/context/global-public-context.tsx +++ b/dify_1.11.1/web/context/global-public-context.tsx @@ -22,6 +22,10 @@ export const useGlobalPublicStore = create(set => ({ setSystemFeatures: (systemFeatures: SystemFeatures) => set(() => ({ systemFeatures })), })) +/** + * GlobalPublicStoreProvider + * 初始化并提供系统特性(systemFeatures),统一设置品牌标题为“智能体平台”以用于页面标题拼接 + */ const GlobalPublicStoreProvider: FC = ({ children, }) => { @@ -32,7 +36,15 @@ const GlobalPublicStoreProvider: FC = ({ const { setSystemFeatures, setIsGlobalPending: setIsPending } = useGlobalPublicStore() useEffect(() => { if (data) - setSystemFeatures({ ...defaultSystemFeatures, ...data }) + setSystemFeatures({ + ...defaultSystemFeatures, + ...data, + branding: { + ...defaultSystemFeatures.branding, + ...(data.branding || {}), + application_title: '智能体平台', + }, + }) }, [data, setSystemFeatures]) useEffect(() => {