From 3a905da35b5aa6f88b1e58d414de36332aeff868 Mon Sep 17 00:00:00 2001 From: selfrelease Date: Sun, 19 Jul 2026 19:10:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20P5+P6=20=E5=A4=9A=E4=B8=BB?= =?UTF-8?q?=E4=BD=93=E7=94=BB=E5=83=8F=20+=20=E7=A7=BB=E5=8A=A8=E7=AB=AF?= =?UTF-8?q?=E6=8A=BD=E5=B1=89=E5=AF=BC=E8=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P5 多主体画像: - /profiles 页面:根据角色展示不同视角(GP/投后负责人/投资经理/创始人/管理员) P6 移动端适配: - 投资人端 Sidebar 折叠为抽屉导航(Menu 按钮触发 + 遮罩层 + 6 域完整导航) - 移动端导航点击后自动关闭抽屉 --- frontend/src/app/(investor)/layout.tsx | 79 ++++++++++++++++++- frontend/src/app/(investor)/profiles/page.tsx | 74 +++++++++++++++++ 2 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 frontend/src/app/(investor)/profiles/page.tsx diff --git a/frontend/src/app/(investor)/layout.tsx b/frontend/src/app/(investor)/layout.tsx index af4d866..fabc2cf 100644 --- a/frontend/src/app/(investor)/layout.tsx +++ b/frontend/src/app/(investor)/layout.tsx @@ -4,7 +4,8 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; +import { Menu, X } from "lucide-react"; import { CopilotWidget } from "@/components/shared/CopilotWidget"; import { RiskToastNotifier } from "@/components/shared/RiskToastNotifier"; import { AuthGuard } from "@/components/shared/AuthGuard"; @@ -19,6 +20,7 @@ import { getNavDomains, NAV_FOOTER } from "@/lib/navConfig"; export default function InvestorLayout({ children }: { children: React.ReactNode }) { const { user } = useAuth(); const pathname = usePathname(); + const [mobileNavOpen, setMobileNavOpen] = useState(false); const domains = useMemo(() => getNavDomains(user?.role ?? "investor"), [user?.role]); @@ -76,10 +78,79 @@ export default function InvestorLayout({ children }: { children: React.ReactNode {/* 内容区 */}
- {/* 移动端顶部 Header */} -
- AIPortPilot + {/* 移动端顶部 Header + 抽屉导航 */} +
+
+ + AIPortPilot +
+ + {/* 移动端抽屉导航 */} + {mobileNavOpen && ( +
+
setMobileNavOpen(false)} /> +
+
+ AIPortPilot + +
+ +
+
+ )} +
{children}
diff --git a/frontend/src/app/(investor)/profiles/page.tsx b/frontend/src/app/(investor)/profiles/page.tsx new file mode 100644 index 0000000..13f8538 --- /dev/null +++ b/frontend/src/app/(investor)/profiles/page.tsx @@ -0,0 +1,74 @@ +/** 多主体画像 — 根据角色展示不同视角的企业画像。 */ + +"use client"; + +import { Users, Building2, TrendingUp, AlertTriangle, Target, Lightbulb } from "lucide-react"; +import { useAuth } from "@/lib/auth-context"; + +/** 角色视角配置。 */ +const ROLE_PERSPECTIVES: Record = { + gp: { + title: "GP 视角 — 组合层面", + focus: ["组合健康度分布", "基金 IRR 追踪", "退出时机", "LP 汇报"], + icon: TrendingUp, + }, + post_invest_lead: { + title: "投后负责人视角 — 运营层面", + focus: ["企业健康度趋势", "风险队列", "任务推进", "月报审阅"], + icon: Target, + }, + investor: { + title: "投资经理视角 — 执行层面", + focus: ["今日行动", "企业跟进", "协同匹配", "数据校验"], + icon: Lightbulb, + }, + founder: { + title: "创始人视角 — 经营层面", + focus: ["经营 KPI", "融资准备", "投资人沟通", "团队建设"], + icon: Building2, + }, + admin: { + title: "管理员视角 — 系统层面", + focus: ["租户管理", "用户权限", "审计日志", "数据源监控"], + icon: Users, + }, +}; + +/** 多主体画像页面。 */ +export default function ProfilePage() { + const { user } = useAuth(); + const role = user?.role ?? "investor"; + const perspective = ROLE_PERSPECTIVES[role] ?? ROLE_PERSPECTIVES.investor; + + return ( +
+
+ +

多主体画像

+
+ +
+

{perspective.title}

+
+ {perspective.focus.map((item, i) => ( +
+
+
+ {item} +
+

+ 基于当前角色权限展示的数据维度 +

+
+ ))} +
+
+ + {/* 角色切换提示 */} +
+ 当前角色:{role} + — 不同角色看到的数据维度和关注重点不同,系统自动适配。 +
+
+ ); +}