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

@@ -2,6 +2,13 @@
import { create } from 'zustand';
import type { Department, Member, RoleItem, PasswordRule } from '@/lib/members';
import { DEFAULT_PASSWORD_RULE, generatePassword } from '@/lib/members';
import {
SYSTEM_ADMIN_MEMBER,
SYSTEM_ADMIN_ROLE_ID,
canDeleteSystemMember,
ensureSystemAdminMember,
sanitizeSystemAdminPatch,
} from '@/lib/member-system';
import { DEFAULT_ROLE_PERMISSIONS } from '@/lib/permissions';
import { loadServerData, saveServerData } from '@/lib/server-data';
@@ -24,7 +31,7 @@ const PRESET_ROLES: RoleItem[] = [
];
const MOCK_MEMBERS: Member[] = [
{ id: 'm-8', name: '超级管理员', departmentId: 'dept-1', roleId: 'role-admin', phone: '13200132008', email: 'chenshi@company.com', password: 'Ftb@2024', createdAt: '2024-01-01' },
SYSTEM_ADMIN_MEMBER,
];
interface MemberState {
@@ -74,7 +81,22 @@ export const useMemberStore = create<MemberState>((set, get) => ({
}
return r;
});
set({ departments: cached.departments, members: cached.members, roles: migratedRoles, passwordRule: cached.passwordRule || DEFAULT_PASSWORD_RULE });
const adminRole = PRESET_ROLES.find((r) => r.id === SYSTEM_ADMIN_ROLE_ID)!;
const roles = migratedRoles.some((r) => r.id === SYSTEM_ADMIN_ROLE_ID)
? migratedRoles.map((r) => r.id === SYSTEM_ADMIN_ROLE_ID ? { ...adminRole, ...r, isSystem: true, permissions: DEFAULT_ROLE_PERMISSIONS[SYSTEM_ADMIN_ROLE_ID] } : r)
: [adminRole, ...migratedRoles];
const rolesChanged =
roles.length !== migratedRoles.length ||
roles.some((role, index) => JSON.stringify(role) !== JSON.stringify(migratedRoles[index]));
const ensured = ensureSystemAdminMember(cached.members);
const next = {
departments: cached.departments,
members: ensured.members,
roles,
passwordRule: cached.passwordRule || DEFAULT_PASSWORD_RULE,
};
set(next);
if (ensured.changed || rolesChanged) saveStored(next);
}
},
@@ -107,11 +129,14 @@ export const useMemberStore = create<MemberState>((set, get) => ({
saveStored({ departments: get().departments, members, roles: get().roles, passwordRule: get().passwordRule });
},
updateMember: (id, data) => {
const members = get().members.map((m) => m.id === id ? { ...m, ...data } : m);
set({ members });
saveStored({ departments: get().departments, members, roles: get().roles, passwordRule: get().passwordRule });
const safeData = sanitizeSystemAdminPatch(id, data);
const updatedMembers = get().members.map((m) => m.id === id ? { ...m, ...safeData } : m);
const ensured = ensureSystemAdminMember(updatedMembers);
set({ members: ensured.members });
saveStored({ departments: get().departments, members: ensured.members, roles: get().roles, passwordRule: get().passwordRule });
},
deleteMember: (id) => {
if (!canDeleteSystemMember(id)) return;
const members = get().members.filter((m) => m.id !== id);
set({ members });
saveStored({ departments: get().departments, members, roles: get().roles, passwordRule: get().passwordRule });
@@ -142,6 +167,7 @@ export const useMemberStore = create<MemberState>((set, get) => ({
saveStored({ departments: get().departments, members: get().members, roles, passwordRule: get().passwordRule });
},
deleteRole: (id) => {
if (id === SYSTEM_ADMIN_ROLE_ID) return;
const roles = get().roles.filter((r) => r.id !== id);
set({ roles });
saveStored({ departments: get().departments, members: get().members, roles, passwordRule: get().passwordRule });