perf(web): 优化大数据量页面切换与聚合性能

This commit is contained in:
Script Generator
2026-07-03 09:43:36 +08:00
parent 554ab520d1
commit a509bb4922
32 changed files with 1087 additions and 360 deletions

View File

@@ -11,7 +11,7 @@ import {
} from '@/lib/member-system';
import { DEFAULT_ROLE_PERMISSIONS, DEFAULT_ROLE_PRESETS } from '@/lib/permissions';
import { mergePresetRolePermissions } from '@/lib/role-permission-migration';
import { loadServerData, saveServerData } from '@/lib/server-data';
import { loadServerData, saveServerData, SERVER_DATA_CACHE_MS } from '@/lib/server-data';
const PRESET_DEPARTMENTS: Department[] = [
{ id: 'dept-1', name: '产品部', order: 1, createdAt: '2024-01-01' },
@@ -28,6 +28,7 @@ const PRESET_ROLES: RoleItem[] = DEFAULT_ROLE_PRESETS;
const MOCK_MEMBERS: Member[] = [
SYSTEM_ADMIN_MEMBER,
];
let lastMembersFetchAt = 0;
interface MemberState {
departments: Department[];
@@ -35,7 +36,8 @@ interface MemberState {
roles: RoleItem[];
passwordRule: PasswordRule;
loading: boolean;
fetchMembers: () => void;
loaded: boolean;
fetchMembers: (options?: { force?: boolean }) => Promise<void>;
updatePasswordRule: (rule: PasswordRule) => void;
createDepartment: (data: Omit<Department, 'id' | 'createdAt'>) => void;
updateDepartment: (id: string, data: Partial<Department>) => void;
@@ -65,9 +67,13 @@ export const useMemberStore = create<MemberState>((set, get) => ({
roles: PRESET_ROLES,
passwordRule: DEFAULT_PASSWORD_RULE,
loading: false,
loaded: false,
fetchMembers: async () => {
fetchMembers: async (options) => {
if (!options?.force && get().loaded && Date.now() - lastMembersFetchAt < SERVER_DATA_CACHE_MS) return;
const cached = await loadStored();
if (!options?.force && get().loaded && Date.now() - lastMembersFetchAt < SERVER_DATA_CACHE_MS) return;
lastMembersFetchAt = Date.now();
if (cached) {
// 迁移:旧 RoleItem 没 permissions 字段,补默认值
const migratedRoles = cached.roles.map((r) => {
@@ -94,8 +100,10 @@ export const useMemberStore = create<MemberState>((set, get) => ({
roles,
passwordRule: cached.passwordRule || DEFAULT_PASSWORD_RULE,
};
set(next);
set({ ...next, loaded: true });
if (ensured.changed || usernameEnsured.changed || rolesChanged) saveStored(next);
} else {
set({ loaded: true });
}
},