From 4a59da7ff0157e33e72236bd18c077a180ac10a8 Mon Sep 17 00:00:00 2001 From: fengxiangdebaozi <10845145+fengxiangdebaozi@user.noreply.gitee.com> Date: Thu, 16 Jul 2026 09:48:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=BE=A7=E6=A0=8F?= =?UTF-8?q?=E5=B9=B6=E6=8E=A5=E5=85=A5=E5=93=81=E7=89=8C=E8=84=B1=E6=95=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/page-sidebar-dark.tsx | 37 +------------------ .../components/workspace/compact-welcome.tsx | 7 +++- .../src/components/workspace/welcome.tsx | 8 ++-- .../use-display-desensitizer.ts | 19 ++++++++++ frontend-web/src/pages/PageRoutes.tsx | 19 ++++------ .../src/strategy-components/Header.tsx | 8 ++-- 6 files changed, 43 insertions(+), 55 deletions(-) create mode 100644 frontend-web/src/core/sensitive-words/use-display-desensitizer.ts diff --git a/frontend-web/src/components/page-sidebar-dark.tsx b/frontend-web/src/components/page-sidebar-dark.tsx index 4851a5d5..2670f137 100644 --- a/frontend-web/src/components/page-sidebar-dark.tsx +++ b/frontend-web/src/components/page-sidebar-dark.tsx @@ -1,6 +1,5 @@ import { useEffect, useRef, useState } from "react"; import { useNavigate, useLocation } from "react-router-dom"; -import { PanelLeftOpen, PanelLeftClose } from "lucide-react"; import { getStoredAuth } from "@/core/auth"; import { isWujieEnv } from "@/core/embed/wujie"; @@ -13,13 +12,7 @@ import { import { useSidebarMenuItems } from "@/core/page-layout/use-sidebar-menu"; import './page-sdebar.css' -type PageSidebarDarkProps = { - /** 是否收起(true 时只渲染左下角浮动入口,sidebar 主体隐藏) */ - collapsed: boolean; - onToggleCollapsed: () => void; -}; - -export function PageSidebarDark({ collapsed, onToggleCollapsed }: PageSidebarDarkProps) { +export function PageSidebarDark() { const isAdmin = getStoredAuth()?.system_role === "admin"; const visibleMenuItems = useSidebarMenuItems(!!isAdmin); const inWujieEnv = isWujieEnv(); @@ -196,22 +189,6 @@ export function PageSidebarDark({ collapsed, onToggleCollapsed }: PageSidebarDar ); - // collapsed 状态:sidebar 主体完全消失(包括占据的宽度),只渲染左下角浮动入口 - if (collapsed) { - return ( - - ); - } - return ( ); diff --git a/frontend-web/src/components/workspace/compact-welcome.tsx b/frontend-web/src/components/workspace/compact-welcome.tsx index 9bd26eb3..1b840da3 100644 --- a/frontend-web/src/components/workspace/compact-welcome.tsx +++ b/frontend-web/src/components/workspace/compact-welcome.tsx @@ -1,6 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; +import { useDisplayDesensitizer } from "@/core/sensitive-words/use-display-desensitizer"; /** * 紧凑模式(正常 App)新对话落地页的品牌欢迎块 —— 按 CM-assistant 参考图重画。 @@ -8,6 +9,8 @@ import { cn } from "@/lib/utils"; * 非紧凑模式仍用 ,本组件不参与。 */ export function CompactWelcome({ className }: { className?: string }) { + const desensitizeText = useDisplayDesensitizer(); + return (
- CM + {desensitizeText("CM")}

- 欢迎使用CM助手 + {desensitizeText("欢迎使用CM助手")}

基于先进深度推理模型,为您提供高效的市场分析、专业报告撰写、调研设计与协同脑暴支持。 diff --git a/frontend-web/src/components/workspace/welcome.tsx b/frontend-web/src/components/workspace/welcome.tsx index 4e8aae3b..c72bbcd4 100644 --- a/frontend-web/src/components/workspace/welcome.tsx +++ b/frontend-web/src/components/workspace/welcome.tsx @@ -3,7 +3,8 @@ import { useSearchParams } from "next/navigation"; import { useMemo } from "react"; -import { useI18n } from "@/core/i18n/hooks"; +import { useI18n } from "@/core/i18n/hooks"; +import { useDisplayDesensitizer } from "@/core/sensitive-words/use-display-desensitizer"; import { cn } from "@/lib/utils"; import { AuroraText } from "../ui/aurora-text"; @@ -15,7 +16,8 @@ export function Welcome({ className?: string; mode?: "ultra" | "pro" | "thinking" | "flash"; }) { - const { t } = useI18n(); + const { t } = useI18n(); + const desensitizeText = useDisplayDesensitizer(); const searchParams = useSearchParams(); const isUltra = useMemo(() => mode === "ultra", [mode]); const colors = useMemo(() => { @@ -36,7 +38,7 @@ export function Welcome({ t.welcome.createYourOwnSkill ) : (

- {t.welcome.greeting} + {desensitizeText(t.welcome.greeting)}
)} diff --git a/frontend-web/src/core/sensitive-words/use-display-desensitizer.ts b/frontend-web/src/core/sensitive-words/use-display-desensitizer.ts new file mode 100644 index 00000000..41008979 --- /dev/null +++ b/frontend-web/src/core/sensitive-words/use-display-desensitizer.ts @@ -0,0 +1,19 @@ +import { useMemo } from "react"; + +import { desensitize, makeDesensitizer } from "@/lib/desensitize"; +import { useSensitiveWords, wordsToMap } from "@/strategy-components/api/sensitive-words"; + +/** + * 返回用于界面静态文本的脱敏函数。 + * + * 与导航菜单使用同一份敏感词查询:后台存在配置时以后台为准,未配置时回退到内置种子。 + * Hook 订阅 React Query 缓存,管理员保存敏感词后,使用它的导航/欢迎区会自动重新渲染。 + */ +export function useDisplayDesensitizer(): (text: string) => string { + const { data: words = [] } = useSensitiveWords(); + + return useMemo( + () => (words.length > 0 ? makeDesensitizer(wordsToMap(words)) : desensitize), + [words], + ); +} diff --git a/frontend-web/src/pages/PageRoutes.tsx b/frontend-web/src/pages/PageRoutes.tsx index 208f82bc..54b98a5c 100644 --- a/frontend-web/src/pages/PageRoutes.tsx +++ b/frontend-web/src/pages/PageRoutes.tsx @@ -31,6 +31,8 @@ function PageLayout() { const location = useLocation(); const { theme } = useTheme(); const isDark = theme === "dark"; + // 深色导航侧栏不提供收起入口,始终保持展开,避免切换主题后沿用浅色模式的收起状态。 + const sidebarCollapsed = isDark ? false : collapsed; // 浅色非嵌入:侧边栏为新版「二级导航图标卡片」窄栏(96px);wujie 嵌入仍走旧版手风琴(64/256px)。 const inWujie = useMemo(() => isWujieEnv(), []); const lightNarrowSidebar = !isDark && !inWujie; @@ -74,17 +76,14 @@ function PageLayout() { return (
- {pageSidebarAllowed &&
} + {pageSidebarAllowed &&
}
{pageSidebarAllowed && ( isDark ? ( - setCollapsed((prev) => !prev)} - /> + ) : ( setCollapsed((prev) => !prev)} /> ) @@ -94,10 +93,8 @@ function PageLayout() { !pageSidebarAllowed ? "" : isDark - // 深色 sidebar:展开 118px(10 + 98 + 10 gap),收起 = 0 sidebar 完全消失, - // 只剩左下角浮动按钮(fixed,叠在 main 上不影响布局)。 - // 不加 transition:transition + sidebar 立刻 unmount 不同步会抽搐 - ? (collapsed ? "pl-0" : "pl-[118px]") + // 深色 sidebar 固定展开 118px(10 + 98 + 10 gap)。 + ? "pl-[118px]" : lightNarrowSidebar // 浅色新版窄栏:展开三级列时 96→236px,主内容左内边距随之过渡 ? `transition-[padding] duration-300 ${lightExpanded ? "pl-[236px]" : "pl-[96px]"}` @@ -111,7 +108,7 @@ function PageLayout() { path="workspace/*" element={ { const auth = getStoredAuth(); const isAdmin = auth?.system_role === "admin"; const visibleMenuItems = useSidebarMenuItems(!!isAdmin); + const desensitizeText = useDisplayDesensitizer(); const { data: myPosition } = useMyPosition(); const positionName = myPosition?.name?.trim() || ""; @@ -236,7 +238,7 @@ const Header = ({ collapsed }: HeaderProps) => {
{/* 中:CM助手(落在背景图发光基座上,纯文字无图标) */} -
CM业务中心
+
{desensitizeText("CM业务中心")}
{/* 右分区(flex-1):菜单靠左贴近中间基座,操作区靠最右 */}
@@ -262,7 +264,7 @@ const Header = ({ collapsed }: HeaderProps) => {
- CM业务中心 + {desensitizeText("CM业务中心")}