perf(web): 优化大数据量页面切换与聚合性能
This commit is contained in:
@@ -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 });
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user