From ae1e58a5959f3b75713b4de39251364cc51b9ce5 Mon Sep 17 00:00:00 2001
From: aiyimickey <39365912+aiyimickey@users.noreply.github.com>
Date: Mon, 18 May 2026 18:14:17 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20/api/auth/me=20=E4=BB=8E=20LLDAP=20?=
=?UTF-8?q?=E5=AE=9E=E6=97=B6=E8=AF=BB=E5=8F=96=20displayName=EF=BC=88?=
=?UTF-8?q?=E9=9D=9E=20JWT=20=E7=BC=93=E5=AD=98=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修改显示名后右上角个人信息即时更新
- RoleManager 支持 onUserUpdated 回调刷新用户信息
---
src/app/admin/create-user/page.tsx | 2 +-
src/app/admin/create-user/role-manager.tsx | 6 +++---
src/app/api/auth/me/route.ts | 15 ++++++++-------
3 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/src/app/admin/create-user/page.tsx b/src/app/admin/create-user/page.tsx
index c84438d..a807d66 100644
--- a/src/app/admin/create-user/page.tsx
+++ b/src/app/admin/create-user/page.tsx
@@ -264,7 +264,7 @@ export default function AdminUsersPage() {
)}
{/* ====== 权限管理 ====== */}
- {tab === 'roles' && }
+ {tab === 'roles' && }
diff --git a/src/app/admin/create-user/role-manager.tsx b/src/app/admin/create-user/role-manager.tsx
index 4526192..bafe5b8 100644
--- a/src/app/admin/create-user/role-manager.tsx
+++ b/src/app/admin/create-user/role-manager.tsx
@@ -9,7 +9,7 @@ interface RoleData {
emails: Record
}
-interface Props { setResult: (ok: boolean, msg: string) => void }
+interface Props { setResult: (ok: boolean, msg: string) => void; onUserUpdated?: () => void }
const ss = {
bar: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } as React.CSSProperties,
@@ -23,7 +23,7 @@ const ss = {
miniBtn: (primary: boolean) => ({ padding: '4px 12px', borderRadius: 5, border: primary ? 'none' : '1px solid var(--border)', background: primary ? '#2563eb' : 'var(--bg-card)', color: primary ? '#fff' : 'var(--text-secondary)', fontSize: 11, cursor: 'pointer', fontWeight: 500 } as React.CSSProperties),
}
-export default function RoleManager({ setResult }: Props) {
+export default function RoleManager({ setResult, onUserUpdated }: Props) {
const [roleData, setRoleData] = useState(null)
const [pending, setPending] = useState>({})
const [saving, setSaving] = useState(false)
@@ -69,7 +69,7 @@ export default function RoleManager({ setResult }: Props) {
assetsUsers: prev.assetsUsers.map(u => u.username === target ? { ...u, display_name: d.displayName } : u),
issueUsers: prev.issueUsers.map(u => u.username === target ? { ...u, display_name: d.displayName } : u),
} : null)
- setEditingDisplayName(null); setResult(true, `${target} 显示名已更新`)
+ setEditingDisplayName(null); setResult(true, `${target} 显示名已更新`); onUserUpdated?.()
} else { setResult(false, d.error || '修改失败') }
} catch { setResult(false, '网络错误') }
finally { setSavingDisplayName(false) }
diff --git a/src/app/api/auth/me/route.ts b/src/app/api/auth/me/route.ts
index 5ef8da0..642e4a8 100644
--- a/src/app/api/auth/me/route.ts
+++ b/src/app/api/auth/me/route.ts
@@ -7,15 +7,16 @@ import { isLldapAdmin } from '@/lib/ldap'
const execAsync = promisify(exec)
-async function getLldapEmail(username: string): Promise {
+async function getLldapInfo(username: string): Promise<{ email: string; displayName: string }> {
try {
const safeUser = username.replace(/'/g, "''")
const { stdout } = await execAsync(
- `docker exec lldap /bin/sh -c "echo 'SELECT email FROM users WHERE user_id='\\''${safeUser}'\\'';' | sqlite3 /data/users.db"`,
+ `docker exec lldap /bin/sh -c "echo 'SELECT email, display_name FROM users WHERE user_id='\\''${safeUser}'\\'';' | sqlite3 /data/users.db"`,
{ timeout: 3000 }
)
- return stdout.trim() || ''
- } catch { return '' }
+ const parts = stdout.trim().split('|')
+ return { email: parts[0] || '', displayName: parts[1] || username }
+ } catch { return { email: '', displayName: username } }
}
export async function GET() {
@@ -27,13 +28,13 @@ export async function GET() {
const payload = verifySharedJwt(token)
if (!payload) return NextResponse.json({ error: '会话已过期' }, { status: 401 })
- const [admin, email] = await Promise.all([
+ const [admin, info] = await Promise.all([
isLldapAdmin(payload.username),
- getLldapEmail(payload.username),
+ getLldapInfo(payload.username),
])
return NextResponse.json({
- user: { username: payload.username, displayName: payload.displayName, email, isAdmin: admin },
+ user: { username: payload.username, displayName: info.displayName, email: info.email, isAdmin: admin },
})
} catch {
return NextResponse.json({ error: '获取用户信息失败' }, { status: 500 })