From be4c0b44f2962bf7bee228a7ec853f3669b18953 Mon Sep 17 00:00:00 2001 From: Snowykami Date: Thu, 25 Sep 2025 13:34:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=A0=8F=E7=BB=84=E4=BB=B6=EF=BC=8C=E5=90=88=E5=B9=B6=20NavMai?= =?UTF-8?q?n=20=E5=92=8C=20NavUserCenter=20=E4=B8=BA=20NavGroup=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=A8=E6=80=81=E6=BF=80=E6=B4=BB=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/console/app-sidebar.tsx | 11 ++-- web/src/components/console/data.ts | 12 ++++- .../console/{nav-main.tsx => nav-group.tsx} | 31 +++++------- web/src/components/console/nav-ucenter.tsx | 50 ------------------- web/src/locales/zh-CN.json | 2 +- 5 files changed, 32 insertions(+), 74 deletions(-) rename web/src/components/console/{nav-main.tsx => nav-group.tsx} (60%) delete mode 100644 web/src/components/console/nav-ucenter.tsx diff --git a/web/src/components/console/app-sidebar.tsx b/web/src/components/console/app-sidebar.tsx index 09546ca..a6788b0 100644 --- a/web/src/components/console/app-sidebar.tsx +++ b/web/src/components/console/app-sidebar.tsx @@ -4,7 +4,7 @@ import { IconInnerShadowTop, } from "@tabler/icons-react" -import { NavMain } from "@/components/console/nav-main" +import { NavGroup } from "@/components/console/nav-group" import { NavUser } from "@/components/console/nav-user" import { Sidebar, @@ -17,13 +17,16 @@ import { } from "@/components/ui/sidebar" import config from "@/config" import Link from "next/link" -import { NavUserCenter } from "./nav-ucenter" import { sidebarData } from "./data" import { ThemeModeToggle } from "../common/theme-toggle" +import { useState } from "react" +import { useTranslations } from "next-intl" export function AppSidebar({ ...props }: React.ComponentProps) { + const [activeId, setActiveId] = useState("dashboard") + const consoleT = useTranslations("Console") return ( @@ -42,8 +45,8 @@ export function AppSidebar({ ...props }: React.ComponentProps) { - - + ({...item, title: consoleT(item.title)}))} /> + ({...item, title: consoleT(item.title)}))} />
diff --git a/web/src/components/console/data.ts b/web/src/components/console/data.ts index 195281b..f965e06 100644 --- a/web/src/components/console/data.ts +++ b/web/src/components/console/data.ts @@ -6,6 +6,7 @@ import { Folder, Gauge, MessageCircle, Newspaper, Palette, Settings, ShieldCheck export interface SidebarItem { + id: string; title: string; url: string; icon: IconType; @@ -15,36 +16,42 @@ export interface SidebarItem { export const sidebarData: { navMain: SidebarItem[]; navUserCenter: SidebarItem[] } = { navMain: [ { + id: "dashboard", title: "dashboard.title", url: consolePath.dashboard, icon: Gauge, permission: isAdmin }, { + id: "post", title: "post.title", url: consolePath.post, icon: Newspaper, permission: isEditor }, { + id: "comment", title: "comment.title", url: consolePath.comment, icon: MessageCircle, permission: isEditor }, { + id: "file", title: "file.title", url: consolePath.file, icon: Folder, permission: () => true }, { + id: "user", title: "user.title", url: consolePath.user, icon: Users, permission: isAdmin }, { + id: "global", title: "global.title", url: consolePath.global, icon: Settings, @@ -53,19 +60,22 @@ export const sidebarData: { navMain: SidebarItem[]; navUserCenter: SidebarItem[] ], navUserCenter: [ { + id: "user_profile", title: "user_profile.title", url: consolePath.userProfile, icon: UserPen, permission: () => true }, { + id: "user_security", title: "user_security.title", url: consolePath.userSecurity, icon: ShieldCheck, permission: () => true }, { - title: "user-preference.title", + id: "user_preference", + title: "user_preference.title", url: consolePath.userPreference, icon: Palette, permission: () => true diff --git a/web/src/components/console/nav-main.tsx b/web/src/components/console/nav-group.tsx similarity index 60% rename from web/src/components/console/nav-main.tsx rename to web/src/components/console/nav-group.tsx index 94311bc..6fa6e25 100644 --- a/web/src/components/console/nav-main.tsx +++ b/web/src/components/console/nav-group.tsx @@ -10,39 +10,34 @@ import { } from "@/components/ui/sidebar" import Link from "next/link" import { usePathname } from "next/navigation"; -import { User } from "@/models/user"; import { useAuth } from "@/contexts/auth-context"; -import { IconType } from "@/types/icon"; -import { useTranslations } from "next-intl"; import { consolePath } from "@/hooks/use-route"; +import { SidebarItem } from "./data"; -export function NavMain({ +export function NavGroup({ items, + title, + activeId, + setActiveId }: { - items: { - title: string - url: string - icon?: IconType; - permission: ({ user }: { user: User }) => boolean - }[] + items: SidebarItem[], + title: string, + activeId: string, + setActiveId? :(id: string) => void }) { - const t = useTranslations("Console") const { user } = useAuth(); - const pathname = usePathname() ?? "/" - if (!user) return null; - return ( - {t("general")} + {title} {items.map((item) => ( item.permission({ user }) && - - + setActiveId && setActiveId(item.id)}> + {item.icon && } - {t(item.title)} + {item.title} diff --git a/web/src/components/console/nav-ucenter.tsx b/web/src/components/console/nav-ucenter.tsx deleted file mode 100644 index 0c61f3b..0000000 --- a/web/src/components/console/nav-ucenter.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client" - -import { - SidebarGroup, - SidebarGroupLabel, - SidebarMenu, - SidebarMenuButton, - SidebarMenuItem, -} from "@/components/ui/sidebar" -import { User } from "@/models/user" -import Link from "next/link" -import { usePathname } from "next/navigation" -import { useAuth } from "@/contexts/auth-context" -import { IconType } from "@/types/icon" -import { useTranslations } from "next-intl" - -export function NavUserCenter({ - items, -}: { - items: { - title: string - url: string - icon?: IconType; - permission: ({ user }: { user: User }) => boolean - }[] -}) { - const t = useTranslations("Console") - const { user } = useAuth(); - const pathname = usePathname() ?? "/" - - if (!user) return null; - - return ( - - {t("personal")} - - {items.map((item) => ( - item.permission({ user }) && - - - {item.icon && } - {t(item.title)} - - - - ))} - - - ) -} diff --git a/web/src/locales/zh-CN.json b/web/src/locales/zh-CN.json index c78e5a8..e1f0f01 100644 --- a/web/src/locales/zh-CN.json +++ b/web/src/locales/zh-CN.json @@ -133,7 +133,7 @@ "update_password_success": "密码已更新", "verify_code": "验证码" }, - "user-preference": { + "user_preference": { "title": "个性化" } },