Skip to content

Commit 7cdb16c

Browse files
authored
perf: permission index & model table collaborator context lazy mount (#5703)
1 parent d4c1e25 commit 7cdb16c

File tree

3 files changed

+45
-15
lines changed

3 files changed

+45
-15
lines changed

packages/service/support/permission/schema.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ ResourcePermissionSchema.virtual('org', {
7878
});
7979

8080
try {
81+
ResourcePermissionSchema.index({
82+
resourceType: 1,
83+
teamId: 1
84+
});
85+
8186
// Indexes for resourceId-based resources
8287
ResourcePermissionSchema.index(
8388
{

projects/app/src/components/core/ai/ModelTable/index.tsx

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ import dynamic from 'next/dynamic';
2626
import CopyBox from '@fastgpt/web/components/common/String/CopyBox';
2727
import MyIconButton from '@fastgpt/web/components/common/Icon/button';
2828
import { useTableMultipleSelect } from '@fastgpt/web/hooks/useTableMultipleSelect';
29-
import CollaboratorContextProvider from '@/components/support/permission/MemberManager/context';
3029
import { ReadRoleVal } from '@fastgpt/global/support/permission/constant';
3130
import { getModelCollaborators, updateModelCollaborators } from '@/web/common/system/api';
3231
import { useUserStore } from '@/web/support/user/useUserStore';
32+
import { LazyCollaboratorProvider } from '@/components/support/permission/MemberManager/context';
3333

3434
const MyModal = dynamic(() => import('@fastgpt/web/components/common/MyModal'));
3535

@@ -317,7 +317,7 @@ const ModelTable = () => {
317317
<Td fontSize={'sm'}>{item.priceLabel}</Td>
318318
{userInfo?.team.permission.hasManagePer && (
319319
<Td fontSize={'sm'}>
320-
<CollaboratorContextProvider
320+
<LazyCollaboratorProvider
321321
selectedHint={t('account_model:model_permission_config_hint')}
322322
defaultRole={ReadRoleVal}
323323
onGetCollaboratorList={() => getModelCollaborators(item.model)}
@@ -335,12 +335,10 @@ const ModelTable = () => {
335335
size="1rem"
336336
hoverColor={'blue.500'}
337337
w="min-content"
338-
onClick={() => {
339-
onOpenManageModal();
340-
}}
338+
onClick={onOpenManageModal}
341339
/>
342340
)}
343-
</CollaboratorContextProvider>
341+
</LazyCollaboratorProvider>
344342
</Td>
345343
)}
346344
</Tr>
@@ -351,7 +349,7 @@ const ModelTable = () => {
351349

352350
<FloatingActionBar
353351
Controler={
354-
<CollaboratorContextProvider
352+
<LazyCollaboratorProvider
355353
selectedHint={t('account_model:model_permission_config_hint')}
356354
defaultRole={ReadRoleVal}
357355
onGetCollaboratorList={() =>
@@ -368,16 +366,11 @@ const ModelTable = () => {
368366
permission={userInfo?.team.permission!}
369367
>
370368
{({ onOpenManageModal }) => (
371-
<Button
372-
variant={'whiteBase'}
373-
onClick={() => {
374-
onOpenManageModal();
375-
}}
376-
>
369+
<Button variant={'whiteBase'} onClick={onOpenManageModal}>
377370
{t('common:permission.Permission config')}
378371
</Button>
379372
)}
380-
</CollaboratorContextProvider>
373+
</LazyCollaboratorProvider>
381374
}
382375
></FloatingActionBar>
383376
</Flex>

projects/app/src/components/support/permission/MemberManager/context.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type {
1010
RoleListType,
1111
RoleValueType
1212
} from '@fastgpt/global/support/permission/type';
13-
import { type ReactNode, useCallback, useMemo } from 'react';
13+
import { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react';
1414
import { createContext } from 'use-context-selector';
1515
import dynamic from 'next/dynamic';
1616

@@ -230,3 +230,35 @@ const CollaboratorContextProvider = ({
230230
};
231231

232232
export default CollaboratorContextProvider;
233+
234+
export const LazyCollaboratorProvider = ({
235+
children,
236+
...props
237+
}: {
238+
children: (params: { onOpenManageModal: () => void }) => React.ReactNode;
239+
} & React.ComponentProps<typeof CollaboratorContextProvider>) => {
240+
const [isProviderMounted, setIsProviderMounted] = useState(false);
241+
242+
const handleOpen = useCallback(() => {
243+
setIsProviderMounted(true);
244+
}, []);
245+
246+
// 如果还未挂载 Provider,只渲染触发按钮
247+
if (!isProviderMounted) {
248+
return <>{children({ onOpenManageModal: handleOpen })}</>;
249+
}
250+
251+
// Provider 已挂载,渲染完整的协作者管理功能
252+
return (
253+
<CollaboratorContextProvider {...props}>
254+
{({ onOpenManageModal }) => {
255+
// 组件挂载后自动打开模态框
256+
useEffect(() => {
257+
onOpenManageModal();
258+
}, [onOpenManageModal]);
259+
260+
return <>{children({ onOpenManageModal })}</>;
261+
}}
262+
</CollaboratorContextProvider>
263+
);
264+
};

0 commit comments

Comments
 (0)