完善权限获取机制

This commit is contained in:
2026-03-31 11:59:00 +08:00
parent 12b60e74df
commit 61b766d939
7 changed files with 56 additions and 53 deletions

View File

@@ -14,13 +14,12 @@ import Image from "next/image"
import Link from "next/link"
import { usePathname, useRouter } from "next/navigation"
import { useEffect, useRef, useState } from "react"
import { getProfile, logout } from "@/actions/auth"
import { logout } from "@/actions/auth"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import type { User } from "@/models/user"
import type { Admin } from "@/models/admin"
export default function Appbar() {
const [currentUser, setCurrentUser] = useState<User>()
export default function Appbar(props: { admin: Admin }) {
const router = useRouter()
const [showDropdown, setShowDropdown] = useState(false)
const [showNotifications, setShowNotifications] = useState(false)
@@ -122,28 +121,6 @@ export default function Appbar() {
}
}
useEffect(() => {
async function fetchUserProfile() {
try {
const resp = await getProfile()
console.log(resp, "resp")
if (resp.success) {
setCurrentUser(resp.data)
} else {
console.error("获取用户信息失败:", resp.message)
if (resp.status === 401) {
router.replace("/login")
}
}
} catch (error) {
console.error("获取用户信息时出错:", error)
}
}
fetchUserProfile()
}, [router])
return (
<header className="bg-white h-16 border-b border-gray-200 flex items-center justify-between px-6">
{/* 面包屑导航 */}
@@ -259,10 +236,10 @@ export default function Appbar() {
aria-label="用户菜单"
>
<div className="h-8 w-8 rounded-full bg-blue-100 text-blue-800 flex items-center justify-center overflow-hidden border-2 border-white shadow-sm">
{currentUser ? (
currentUser.avatar ? (
{props.admin ? (
props.admin.avatar ? (
<Image
src={currentUser.avatar}
src={props.admin.avatar}
alt="用户头像"
width={32}
height={32}
@@ -271,8 +248,8 @@ export default function Appbar() {
const target = e.target as HTMLImageElement
target.style.display = "none"
const parent = target.parentElement
if (parent && currentUser?.name) {
parent.textContent = currentUser.name
if (parent && props.admin?.name) {
parent.textContent = props.admin.name
.charAt(0)
.toUpperCase()
}
@@ -281,7 +258,7 @@ export default function Appbar() {
) : (
// 如果没有头像,直接显示用户名首字母
<span className="text-sm font-semibold">
{currentUser.name.charAt(0).toUpperCase()}
{props.admin.name?.charAt(0).toUpperCase()}
</span>
)
) : (
@@ -290,12 +267,14 @@ export default function Appbar() {
)}
</div>
<div className="hidden md:block text-left">
{currentUser && (
{props.admin && (
<div>
<p className="text-sm font-medium text-gray-800">
{currentUser.name}
{props.admin.name}
</p>
<p className="text-xs text-gray-500">
{props.admin.username}
</p>
<p className="text-xs text-gray-500">{currentUser.username}</p>
</div>
)}
</div>
@@ -305,13 +284,13 @@ export default function Appbar() {
{/* 用户下拉内容 */}
{showDropdown && (
<div className="absolute right-0 mt-2 w-56 bg-white rounded-lg shadow-lg py-2 z-20 border border-gray-200">
{currentUser && (
{props.admin && (
<div className="px-4 py-2 border-b border-gray-100 md:hidden">
<p className="font-medium text-gray-800">
{currentUser.name}
{props.admin.name}
</p>
<p className="text-xs text-gray-500">{currentUser.name}</p>
<p className="text-xs text-gray-500">{props.admin.name}</p>
</div>
)}