fix(账号): 固化超级管理员身份

This commit is contained in:
Script Generator
2026-06-26 11:18:00 +08:00
parent 56e0fe562d
commit 4cda624dc7
13 changed files with 419 additions and 80 deletions

View File

@@ -3,17 +3,10 @@
import { create } from 'zustand';
import { loadServerData } from '@/lib/server-data';
import type { Member } from '@/lib/members';
import { SYSTEM_ADMIN_MEMBER, ensureSystemAdminMember } from '@/lib/member-system';
import { resolveAuthUserFromMembers, toAuthUser, type AuthUser } from '@/lib/auth-user';
import { useMemberStore } from './useMemberStore';
interface AuthUser {
id: string;
name: string;
roleId: string;
departmentId: string;
phone: string;
email: string;
}
interface AuthState {
user: AuthUser | null;
isAuthenticated: boolean;
@@ -30,38 +23,42 @@ interface StoredMembersData {
const SESSION_KEY = 'ftb_auth_session';
const PERSIST_KEY = 'ftb_auth_persist';
const FALLBACK_MEMBERS: Member[] = [
{
id: 'm-8',
name: '\u8d85\u7ea7\u7ba1\u7406\u5458',
departmentId: 'dept-1',
roleId: 'role-admin',
phone: '13200132008',
email: 'chenshi@company.com',
password: 'Ftb@2024',
createdAt: '2024-01-01',
},
];
const FALLBACK_MEMBERS: Member[] = [SYSTEM_ADMIN_MEMBER];
function writeAuthStorage(user: AuthUser, remember: boolean) {
sessionStorage.setItem(SESSION_KEY, JSON.stringify(user));
if (remember) {
localStorage.setItem(PERSIST_KEY, JSON.stringify(user));
}
}
function clearAuthStorage() {
sessionStorage.removeItem(SESSION_KEY);
localStorage.removeItem(PERSIST_KEY);
}
async function loadMembersForAuth(): Promise<Member[]> {
try {
const stored = await loadServerData<StoredMembersData>('members');
if (stored?.members?.length) return stored.members;
if (stored?.members?.length) return ensureSystemAdminMember(stored.members).members;
} catch {}
const inMemoryMembers = useMemberStore.getState().members;
return inMemoryMembers.length > 0 ? inMemoryMembers : FALLBACK_MEMBERS;
return inMemoryMembers.length > 0 ? ensureSystemAdminMember(inMemoryMembers).members : FALLBACK_MEMBERS;
}
function toAuthUser(member: Member): AuthUser {
return {
id: member.id,
name: member.name,
roleId: member.roleId,
departmentId: member.departmentId,
phone: member.phone,
email: member.email,
};
async function refreshStoredAuthUser(user: AuthUser, remember: boolean, set: (state: Partial<AuthState>) => void) {
try {
const members = await loadMembersForAuth();
const next = resolveAuthUserFromMembers(user, members);
if (!next) {
clearAuthStorage();
set({ user: null, isAuthenticated: false });
return;
}
set({ user: next, isAuthenticated: true });
writeAuthStorage(next, remember);
} catch {}
}
export const useAuthStore = create<AuthState>((set) => ({
@@ -75,30 +72,29 @@ export const useAuthStore = create<AuthState>((set) => ({
const user = toAuthUser(member);
set({ user, isAuthenticated: true });
sessionStorage.setItem(SESSION_KEY, JSON.stringify(user));
if (remember) {
localStorage.setItem(PERSIST_KEY, JSON.stringify(user));
}
writeAuthStorage(user, remember);
return true;
},
logout: () => {
set({ user: null, isAuthenticated: false });
sessionStorage.removeItem(SESSION_KEY);
localStorage.removeItem(PERSIST_KEY);
clearAuthStorage();
},
checkAuth: () => {
const session = sessionStorage.getItem(SESSION_KEY);
if (session) {
set({ user: JSON.parse(session), isAuthenticated: true });
const user = JSON.parse(session);
set({ user, isAuthenticated: true });
void refreshStoredAuthUser(user, !!localStorage.getItem(PERSIST_KEY), set);
return;
}
const persist = localStorage.getItem(PERSIST_KEY);
if (persist) {
const user = JSON.parse(persist);
set({ user, isAuthenticated: true });
sessionStorage.setItem(SESSION_KEY, JSON.stringify(user));
writeAuthStorage(user, true);
void refreshStoredAuthUser(user, true, set);
return;
}
},
@@ -114,10 +110,7 @@ export const useAuthStore = create<AuthState>((set) => ({
const next = toAuthUser(member);
useAuthStore.setState({ user: next });
sessionStorage.setItem(SESSION_KEY, JSON.stringify(next));
if (localStorage.getItem(PERSIST_KEY)) {
localStorage.setItem(PERSIST_KEY, JSON.stringify(next));
}
writeAuthStorage(next, !!localStorage.getItem(PERSIST_KEY));
} catch {}
},
}));