diff --git a/frontend/src/pages/Dashboard/components/PendingApprovalModal.tsx b/frontend/src/pages/Dashboard/components/PendingApprovalModal.tsx index 6fa3b313..ce13de52 100644 --- a/frontend/src/pages/Dashboard/components/PendingApprovalModal.tsx +++ b/frontend/src/pages/Dashboard/components/PendingApprovalModal.tsx @@ -39,12 +39,16 @@ interface PendingApprovalModalProps { open: boolean; onOpenChange: (open: boolean) => void; workflowDefinitionKeys?: string[]; // 工作流定义键列表 + teamId?: number; // 团队ID,用于筛选指定团队的审批任务 + environmentId?: number; // 环境ID,用于筛选指定环境的审批任务 } export const PendingApprovalModal: React.FC = ({ open, onOpenChange, workflowDefinitionKeys, + teamId, + environmentId, }) => { const { toast } = useToast(); const [loading, setLoading] = useState(false); @@ -61,7 +65,7 @@ export const PendingApprovalModal: React.FC = ({ const loadApprovalList = async () => { try { setLoading(true); - const response = await getMyApprovalTasks(workflowDefinitionKeys); + const response = await getMyApprovalTasks(workflowDefinitionKeys, teamId, environmentId); if (response) { setApprovalList(response || []); } diff --git a/frontend/src/pages/Dashboard/hooks/usePendingApproval.ts b/frontend/src/pages/Dashboard/hooks/usePendingApproval.ts index 2be0c69e..ca925613 100644 --- a/frontend/src/pages/Dashboard/hooks/usePendingApproval.ts +++ b/frontend/src/pages/Dashboard/hooks/usePendingApproval.ts @@ -4,6 +4,8 @@ import type { DeployTeam } from '../types'; interface UsePendingApprovalOptions { teams: DeployTeam[]; + currentTeamId?: number | null; // 当前选中的团队ID + currentEnvId?: number | null; // 当前选中的环境ID pollingEnabled?: boolean; pollingInterval?: number; // 轮询间隔,默认30秒 } @@ -12,9 +14,12 @@ interface UsePendingApprovalOptions { * 待审批数据管理 Hook * 负责管理待审批任务的加载和刷新 * 优化:添加智能轮询,与部署数据同步刷新 + * 支持按团队和环境筛选待审批任务 */ export function usePendingApproval({ teams, + currentTeamId, + currentEnvId, pollingEnabled = true, pollingInterval = 30000 // 默认30秒 }: UsePendingApprovalOptions) { @@ -41,7 +46,12 @@ export function usePendingApproval({ } try { - const response = await getMyApprovalTasks(workflowDefinitionKeys); + // 传递 teamId 和 environmentId 参数精确筛选 + const response = await getMyApprovalTasks( + workflowDefinitionKeys, + currentTeamId || undefined, + currentEnvId || undefined + ); if (response) { setPendingApprovalCount(response.length || 0); } @@ -49,7 +59,7 @@ export function usePendingApproval({ // 静默失败,不影响主页面 console.error('Failed to load pending approval count:', error); } - }, [workflowDefinitionKeys, pollingEnabled]); + }, [workflowDefinitionKeys, currentTeamId, currentEnvId, pollingEnabled]); // 轮询待审批数量 useEffect(() => { diff --git a/frontend/src/pages/Dashboard/index.tsx b/frontend/src/pages/Dashboard/index.tsx index 4bbf4af1..cc946564 100644 --- a/frontend/src/pages/Dashboard/index.tsx +++ b/frontend/src/pages/Dashboard/index.tsx @@ -49,6 +49,8 @@ const Dashboard: React.FC = () => { const approvalData = usePendingApproval({ teams: deploymentData.teams, + currentTeamId: deploymentData.currentTeamId, + currentEnvId: deploymentData.currentEnvId, pollingEnabled: !deploymentData.loading }); @@ -60,6 +62,14 @@ const Dashboard: React.FC = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [deploymentData.teams.length]); + // 监听团队/环境切换,自动刷新待审批数量 + useEffect(() => { + if (deploymentData.currentTeamId && deploymentData.currentEnvId) { + approvalData.loadPendingApprovalCount(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [deploymentData.currentTeamId, deploymentData.currentEnvId]); + // 计算当前环境是否应该显示待审批按钮 // 逻辑:当前环境需要审批 且 用户是该环境的审批人 const shouldShowApprovalButton = React.useMemo(() => { @@ -160,6 +170,8 @@ const Dashboard: React.FC = () => { open={approvalData.approvalModalOpen} onOpenChange={approvalData.setApprovalModalOpen} workflowDefinitionKeys={approvalData.workflowDefinitionKeys} + teamId={deploymentData.currentTeamId || undefined} + environmentId={deploymentData.currentEnvId || undefined} /> ); diff --git a/frontend/src/pages/Dashboard/service.ts b/frontend/src/pages/Dashboard/service.ts index e3c50ff0..64420085 100644 --- a/frontend/src/pages/Dashboard/service.ts +++ b/frontend/src/pages/Dashboard/service.ts @@ -26,11 +26,28 @@ export const getDeployRecordFlowGraph = (deployRecordId: number) => /** * 获取我的待审批任务列表 * @param workflowDefinitionKeys 工作流定义键列表(可选) + * @param teamId 团队ID,用于筛选指定团队的审批任务(可选) + * @param environmentId 环境ID,用于筛选指定环境的审批任务(可选) */ -export const getMyApprovalTasks = (workflowDefinitionKeys?: string[]) => { - const params = workflowDefinitionKeys && workflowDefinitionKeys.length > 0 - ? { workflowDefinitionKeys: workflowDefinitionKeys.join(',') } - : {}; +export const getMyApprovalTasks = ( + workflowDefinitionKeys?: string[], + teamId?: number, + environmentId?: number +) => { + const params: Record = {}; + + if (workflowDefinitionKeys && workflowDefinitionKeys.length > 0) { + params.workflowDefinitionKeys = workflowDefinitionKeys.join(','); + } + + if (teamId !== undefined) { + params.teamId = teamId; + } + + if (environmentId !== undefined) { + params.environmentId = environmentId; + } + return request.get(`${DEPLOY_URL}/my-approval-tasks`, { params }); }; diff --git a/frontend/src/pages/Deploy/Team/List/components/TeamApplicationManageDialog.tsx b/frontend/src/pages/Deploy/Team/List/components/TeamApplicationManageDialog.tsx index 87999e36..a3b51a19 100644 --- a/frontend/src/pages/Deploy/Team/List/components/TeamApplicationManageDialog.tsx +++ b/frontend/src/pages/Deploy/Team/List/components/TeamApplicationManageDialog.tsx @@ -32,7 +32,7 @@ import { createTeamApplication, updateTeamApplication, } from '../service'; -import { getRepositoryBranches } from '@/pages/Resource/Git/List/service'; +import { getRepositoryBranchesList } from '@/pages/Resource/Git/List/service'; import TeamApplicationDialog from './TeamApplicationDialog'; interface TeamApplicationManageDialogProps { @@ -167,12 +167,13 @@ export const TeamApplicationManageDialog: React.FC< if (!app.repoProjectId || !app.externalSystemId) { return []; } - const result = await getRepositoryBranches({ + // 使用不分页的列表接口 + const result = await getRepositoryBranchesList({ externalSystemId: app.externalSystemId, repoProjectId: app.repoProjectId, }); - // getRepositoryBranches 返回 Page 类型,需要提取 content - return Array.isArray(result) ? result : (result as any).content || []; + // getRepositoryBranchesList 直接返回数组,不需要提取 content + return Array.isArray(result) ? result : []; }; const handleLoadJenkinsJobs = async (systemId: number) => { diff --git a/frontend/src/pages/Error/NoPermission.tsx b/frontend/src/pages/Error/NoPermission.tsx new file mode 100644 index 00000000..78a6129f --- /dev/null +++ b/frontend/src/pages/Error/NoPermission.tsx @@ -0,0 +1,109 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useDispatch } from 'react-redux'; +import { ShieldOff, LogOut, RefreshCw, Mail } from 'lucide-react'; +import { logout } from '@/store/userSlice'; + +/** + * 无权限欢迎页 + * 当用户登录成功但没有分配任何菜单权限时显示 + */ +const NoPermission: React.FC = () => { + const navigate = useNavigate(); + const dispatch = useDispatch(); + + const handleLogout = () => { + dispatch(logout()); + navigate('/login', { replace: true }); + }; + + const handleRefresh = () => { + window.location.reload(); + }; + + return ( +
+
+ {/* 图标 */} +
+
+ +
+
+ + {/* 标题 */} +
+

+ 欢迎使用链宇Deploy Ease平台 +

+

+ 您的账户已成功创建 +

+
+ + {/* 描述 */} +
+

+ 您的账户暂时没有分配任何权限,无法访问系统功能。 +

+

+ 请联系系统管理员为您分配角色和权限后,即可开始使用。 +

+
+ + {/* 信息卡片 */} +
+

+ 下一步操作 +

+
    +
  • + + 联系系统管理员为您分配角色权限 +
  • +
  • + + 通过企业内部通讯工具联系管理员 +
  • +
  • + + 权限分配完成后,点击下方"刷新权限"按钮 +
  • +
+ +
+ + + 企业微信联系 杨帆宋伟 开通 + +
+
+ + {/* 操作按钮 */} +
+ + +
+ + {/* 提示文本 */} +

+ 提示:权限分配后需要刷新页面或重新登录生效 +

+
+
+ ); +}; + +export default NoPermission;