diff --git a/web/src/app/(admin)/admin/layout.tsx b/web/src/app/(admin)/admin/layout.tsx index aeaebf7..9624646 100644 --- a/web/src/app/(admin)/admin/layout.tsx +++ b/web/src/app/(admin)/admin/layout.tsx @@ -2,7 +2,6 @@ import { FileTextOutlined, HomeOutlined, LogoutOutlined, PictureOutlined, SettingOutlined } from "@ant-design/icons"; import { Button, Flex, Layout, Menu, Typography, theme } from "antd"; -import { LogOut } from "lucide-react"; import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import type { ReactNode } from "react"; @@ -70,10 +69,7 @@ export default function AdminLayout({ children }: { children: ReactNode }) { {pageTitle} - , label: "退出登录", onClick: logout }]} - /> + {children} diff --git a/web/src/app/(user)/canvas/[id]/canvas-client-page.tsx b/web/src/app/(user)/canvas/[id]/canvas-client-page.tsx index 1effa67..bc7218a 100644 --- a/web/src/app/(user)/canvas/[id]/canvas-client-page.tsx +++ b/web/src/app/(user)/canvas/[id]/canvas-client-page.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; import type { ChangeEvent as ReactChangeEvent, DragEvent as ReactDragEvent, MouseEvent as ReactMouseEvent, PointerEvent as ReactPointerEvent } from "react"; import { useParams, useRouter } from "next/navigation"; -import { Home, ImageIcon, Images, Keyboard, List, LogOut, Menu, MessageSquare, Plus, Redo2, Settings2, Trash2, Undo2, Upload } from "lucide-react"; +import { Home, ImageIcon, Images, List, Menu, MessageSquare, Plus, Redo2, Settings2, Trash2, Undo2, Upload } from "lucide-react"; import { requestEdit, requestGeneration, requestImageQuestion } from "@/services/api/image"; import { defaultConfig, type AiConfig, useConfigStore, useEffectiveConfig } from "@/stores/use-config-store"; @@ -11,10 +11,9 @@ import { resolveImageUrl, uploadImage, type UploadedImage } from "@/services/ima import { nanoid } from "nanoid"; import { getDataUrlByteSize, readImageMeta } from "@/lib/image-utils"; import { canvasThemes, type CanvasBackgroundMode } from "@/lib/canvas-theme"; -import { useThemeStore } from "@/stores/use-theme-store"; -import { useAssetStore } from "@/stores/use-asset-store"; -import { useUserStore } from "@/stores/use-user-store"; import { UserStatusActions } from "@/components/layout/user-status-actions"; +import { useAssetStore } from "@/stores/use-asset-store"; +import { useThemeStore } from "@/stores/use-theme-store"; import { cropDataUrl } from "../utils/canvas-image-data"; import { App, Button, Dropdown, Modal } from "antd"; import { NODE_DEFAULT_SIZE, getNodeSpec } from "../constants"; @@ -243,8 +242,6 @@ function InfiniteCanvasPage() { const renameProject = useCanvasStore((state) => state.renameProject); const deleteProjects = useCanvasStore((state) => state.deleteProjects); const currentProject = useCanvasStore((state) => state.projects.find((project) => project.id === projectId)); - const user = useUserStore((state) => state.user); - const logout = useUserStore((state) => state.clearSession); const theme = canvasThemes[useThemeStore((state) => state.theme)]; const [nodes, setNodes] = useState([]); const [connections, setConnections] = useState([]); @@ -1764,7 +1761,6 @@ function InfiniteCanvasPage() { title={currentProject?.title || "未命名画布"} titleDraft={titleDraft} isTitleEditing={titleEditing} - userName={user?.username || "访客"} onTitleDraftChange={setTitleDraft} onStartTitleEditing={startTitleEditing} onFinishTitleEditing={finishTitleEditing} @@ -1778,8 +1774,6 @@ function InfiniteCanvasPage() { onImportImage={() => handleUploadRequest()} onUndo={undoCanvas} onRedo={redoCanvas} - onOpenConfig={() => openConfigDialog(false)} - onLogout={logout} assistantCollapsed={assistantCollapsed} onExpandAssistant={() => { setAssistantMounted(true); @@ -2051,7 +2045,6 @@ function CanvasTopBar({ title, titleDraft, isTitleEditing, - userName, onTitleDraftChange, onStartTitleEditing, onFinishTitleEditing, @@ -2065,15 +2058,12 @@ function CanvasTopBar({ onImportImage, onUndo, onRedo, - onOpenConfig, - onLogout, assistantCollapsed, onExpandAssistant, }: { title: string; titleDraft: string; isTitleEditing: boolean; - userName: string; onTitleDraftChange: (value: string) => void; onStartTitleEditing: () => void; onFinishTitleEditing: () => void; @@ -2087,14 +2077,11 @@ function CanvasTopBar({ onImportImage: () => void; onUndo: () => void; onRedo: () => void; - onOpenConfig: () => void; - onLogout: () => void; assistantCollapsed: boolean; onExpandAssistant: () => void; }) { const colorTheme = useThemeStore((state) => state.theme); const theme = canvasThemes[colorTheme]; - const initial = (userName.trim()[0] || "U").toUpperCase(); const titleRef = useRef(null); const accountRef = useRef(null); const [shortcutsOpen, setShortcutsOpen] = useState(false); @@ -2173,26 +2160,16 @@ function CanvasTopBar({
node.parentElement || document.body} + onOpenShortcuts={() => { setShortcutsOpen(true); setAccountOpen(false); }} iconStyle={{ color: theme.node.text }} gitHubClassName="size-11 text-base" gitHubStyle={{ color: theme.node.text }} versionStyle={{ color: theme.node.text }} avatarStyle={{ borderColor: theme.toolbar.border, color: theme.node.text }} - userLabel={initial} - menuItems={[ - { key: "user", disabled: true, label: {userName} }, - { type: "divider" }, - { key: "shortcuts", icon: , label: "快捷键", onClick: () => { setShortcutsOpen(true); setAccountOpen(false); } }, - { type: "divider" }, - { key: "logout", icon: , label: "退出登录", onClick: () => { setAccountOpen(false); onLogout(); } }, - ]} /> {assistantCollapsed ? ( <> diff --git a/web/src/app/(user)/layout.tsx b/web/src/app/(user)/layout.tsx index 2266e14..0fb23f4 100644 --- a/web/src/app/(user)/layout.tsx +++ b/web/src/app/(user)/layout.tsx @@ -4,7 +4,7 @@ import type { ReactNode } from "react"; import { usePathname } from "next/navigation"; import { AppTopNav } from "@/components/layout/app-top-nav"; -import { type NavigationToolSlug, navigationTools } from "@/lib/navigation-tools"; +import { type NavigationToolSlug, navigationTools } from "@/constant/navigation-tools"; import { useConfigStore } from "@/stores/use-config-store"; export default function UserLayout({ children }: { children: ReactNode }) { diff --git a/web/src/app/(user)/page.tsx b/web/src/app/(user)/page.tsx index a260289..e8a30b4 100644 --- a/web/src/app/(user)/page.tsx +++ b/web/src/app/(user)/page.tsx @@ -5,7 +5,7 @@ import { type ReactNode, useEffect, useState } from "react"; import { App, Button, Image, Tag } from "antd"; import { fetchPrompts, type Prompt } from "@/services/api/prompts"; -import { navigationTools } from "@/lib/navigation-tools"; +import { navigationTools } from "@/constant/navigation-tools"; import { cn } from "@/lib/utils"; function Highlighter({ diff --git a/web/src/components/layout/app-top-nav.tsx b/web/src/components/layout/app-top-nav.tsx index a75c753..a0bc124 100644 --- a/web/src/components/layout/app-top-nav.tsx +++ b/web/src/components/layout/app-top-nav.tsx @@ -1,16 +1,16 @@ "use client"; -import { LogOut, Menu, Settings2, Shield } from "lucide-react"; +import { Menu, Settings2 } from "lucide-react"; import Link from "next/link"; import { App, Button, Drawer, Form, Input, Modal, Segmented } from "antd"; import { ModelPicker } from "@/components/model-picker"; import { AnimatedThemeToggler } from "@/components/ui/animated-theme-toggler"; +import { navigationTools, type NavigationToolSlug } from "@/constant/navigation-tools"; import { GitHubLink } from "@/components/layout/github-link"; import { UserStatusActions } from "@/components/layout/user-status-actions"; import { VersionReleaseModal } from "@/components/layout/version-release-modal"; import { useConfigStore, useEffectiveConfig, type AiConfig } from "@/stores/use-config-store"; -import { navigationTools, type NavigationToolSlug } from "@/lib/navigation-tools"; import { fetchImageModels } from "@/services/api/image"; import { useThemeStore } from "@/stores/use-theme-store"; import { useUserStore } from "@/stores/use-user-store"; @@ -37,7 +37,6 @@ export function AppTopNav({ activeToolSlug, config, onConfigChange, hideHeader = const setTheme = useThemeStore((state) => state.setTheme); const user = useUserStore((state) => state.user); const isReady = useUserStore((state) => state.isReady); - const logout = useUserStore((state) => state.clearSession); const publicSettings = useConfigStore((state) => state.publicSettings); const effectiveConfig = useEffectiveConfig(); const modelChannel = publicSettings?.modelChannel; @@ -132,13 +131,7 @@ export function AppTopNav({ activeToolSlug, config, onConfigChange, hideHeader =
{isReady && user ? ( - openConfigDialog(false)} - menuItems={[ - ...(user.role === "admin" ? [{ key: "admin", icon: , label: 管理后台 }] : []), - { key: "logout", icon: , label: "退出登录", onClick: logout }, - ]} - /> + ) : ( <>
diff --git a/web/src/lib/navigation-tools.ts b/web/src/constant/navigation-tools.ts similarity index 100% rename from web/src/lib/navigation-tools.ts rename to web/src/constant/navigation-tools.ts