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业务中心")}