perf: permission index & model table collaborator context lazy mount (#5703)

This commit is contained in:
Finley Ge
2025-09-25 14:11:05 +08:00
committed by GitHub
parent d4c1e25598
commit 7cdb16c816
3 changed files with 45 additions and 15 deletions

View File

@@ -78,6 +78,11 @@ ResourcePermissionSchema.virtual('org', {
});
try {
ResourcePermissionSchema.index({
resourceType: 1,
teamId: 1
});
// Indexes for resourceId-based resources
ResourcePermissionSchema.index(
{

View File

@@ -26,10 +26,10 @@ import dynamic from 'next/dynamic';
import CopyBox from '@fastgpt/web/components/common/String/CopyBox';
import MyIconButton from '@fastgpt/web/components/common/Icon/button';
import { useTableMultipleSelect } from '@fastgpt/web/hooks/useTableMultipleSelect';
import CollaboratorContextProvider from '@/components/support/permission/MemberManager/context';
import { ReadRoleVal } from '@fastgpt/global/support/permission/constant';
import { getModelCollaborators, updateModelCollaborators } from '@/web/common/system/api';
import { useUserStore } from '@/web/support/user/useUserStore';
import { LazyCollaboratorProvider } from '@/components/support/permission/MemberManager/context';
const MyModal = dynamic(() => import('@fastgpt/web/components/common/MyModal'));
@@ -317,7 +317,7 @@ const ModelTable = () => {
<Td fontSize={'sm'}>{item.priceLabel}</Td>
{userInfo?.team.permission.hasManagePer && (
<Td fontSize={'sm'}>
<CollaboratorContextProvider
<LazyCollaboratorProvider
selectedHint={t('account_model:model_permission_config_hint')}
defaultRole={ReadRoleVal}
onGetCollaboratorList={() => getModelCollaborators(item.model)}
@@ -335,12 +335,10 @@ const ModelTable = () => {
size="1rem"
hoverColor={'blue.500'}
w="min-content"
onClick={() => {
onOpenManageModal();
}}
onClick={onOpenManageModal}
/>
)}
</CollaboratorContextProvider>
</LazyCollaboratorProvider>
</Td>
)}
</Tr>
@@ -351,7 +349,7 @@ const ModelTable = () => {
<FloatingActionBar
Controler={
<CollaboratorContextProvider
<LazyCollaboratorProvider
selectedHint={t('account_model:model_permission_config_hint')}
defaultRole={ReadRoleVal}
onGetCollaboratorList={() =>
@@ -368,16 +366,11 @@ const ModelTable = () => {
permission={userInfo?.team.permission!}
>
{({ onOpenManageModal }) => (
<Button
variant={'whiteBase'}
onClick={() => {
onOpenManageModal();
}}
>
<Button variant={'whiteBase'} onClick={onOpenManageModal}>
{t('common:permission.Permission config')}
</Button>
)}
</CollaboratorContextProvider>
</LazyCollaboratorProvider>
}
></FloatingActionBar>
</Flex>

View File

@@ -10,7 +10,7 @@ import type {
RoleListType,
RoleValueType
} from '@fastgpt/global/support/permission/type';
import { type ReactNode, useCallback, useMemo } from 'react';
import { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react';
import { createContext } from 'use-context-selector';
import dynamic from 'next/dynamic';
@@ -230,3 +230,35 @@ const CollaboratorContextProvider = ({
};
export default CollaboratorContextProvider;
export const LazyCollaboratorProvider = ({
children,
...props
}: {
children: (params: { onOpenManageModal: () => void }) => React.ReactNode;
} & React.ComponentProps<typeof CollaboratorContextProvider>) => {
const [isProviderMounted, setIsProviderMounted] = useState(false);
const handleOpen = useCallback(() => {
setIsProviderMounted(true);
}, []);
// 如果还未挂载 Provider只渲染触发按钮
if (!isProviderMounted) {
return <>{children({ onOpenManageModal: handleOpen })}</>;
}
// Provider 已挂载,渲染完整的协作者管理功能
return (
<CollaboratorContextProvider {...props}>
{({ onOpenManageModal }) => {
// 组件挂载后自动打开模态框
useEffect(() => {
onOpenManageModal();
}, [onOpenManageModal]);
return <>{children({ onOpenManageModal })}</>;
}}
</CollaboratorContextProvider>
);
};