feat: 1. 添加企查查的按钮。新增相关组件和对接接口进行显示。

2. 为51707端口添加只存在交叉评查入口的项目启动配置。入口页添加相关的区分。
3. 完善文档列表的权限功能控制。
4. 隐藏系统概览中高风险用户的统计模块。
fix: 1. 修复合同起草无权访问却生成了新的模板文件的问题。
2. 修复文档类型无法编辑入口模块的问题。
This commit is contained in:
2025-12-13 02:59:34 +08:00
parent 5c47b20e1d
commit daa53289af
23 changed files with 3370 additions and 183 deletions
+26 -2
View File
@@ -1,6 +1,6 @@
import type { MetaFunction, LoaderFunctionArgs, ActionFunctionArgs } from '@remix-run/node';
import { redirect } from '@remix-run/node';
import { useLoaderData, useNavigate, useSubmit } from '@remix-run/react';
import { useLoaderData, useNavigate, useSubmit, useActionData } from '@remix-run/react';
import { useState, useEffect } from 'react';
import { getContractTemplate } from '~/api/contract-template/templates';
import type { ContractTemplate } from '~/api/contract-template/templates';
@@ -9,6 +9,7 @@ import filePreviewStyles from '~/styles/components/file-preview-isolation.css?ur
import { getUserSession } from '~/api/login/auth.server';
import { createDraftContract } from '~/api/contracts/draft-service.server';
import { apiRequest, downloadFile } from '~/api/axios-client';
import { checkRoutePermission } from '~/api/auth/check-route-permission.server';
// 导入FilePreview组件
import { FilePreview } from '~/components/reviews';
@@ -76,11 +77,20 @@ export async function action({ request, params }: ActionFunctionArgs) {
}
// 获取用户信息和JWT
const { userInfo, frontendJWT } = await getUserSession(request);
const { userInfo, frontendJWT, userRole } = await getUserSession(request);
if (!userInfo?.sub) {
return Response.json({ error: '未登录' }, { status: 401 });
}
// 🔒 在执行任何操作之前,先检查用户是否有权限访问目标路由
const targetPath = '/contract-draft';
const permissionCheck = await checkRoutePermission(targetPath, userRole, frontendJWT || undefined);
if (!permissionCheck.allowed) {
console.warn(`[Action] 用户无权访问 ${targetPath}:`, permissionCheck.error);
return Response.json({ error: permissionCheck.error || '您没有权限使用起草合同功能' }, { status: 403 });
}
try {
// 解析表单数据
const formData = await request.formData();
@@ -148,8 +158,14 @@ export async function action({ request, params }: ActionFunctionArgs) {
}
}
// Action 返回的数据类型
interface ActionData {
error?: string;
}
export default function ContractTemplateDetail() {
const { template }: { template: ContractTemplate } = useLoaderData<typeof loader>();
const actionData = useActionData<ActionData>();
const navigate = useNavigate();
const submit = useSubmit();
const [isCreatingDraft, setIsCreatingDraft] = useState(false);
@@ -162,6 +178,14 @@ export default function ContractTemplateDetail() {
window.scrollTo({ top: 0, behavior: 'instant' });
}, []);
// 处理 action 返回的错误
useEffect(() => {
if (actionData?.error) {
toastService.error(actionData.error);
setIsCreatingDraft(false);
}
}, [actionData]);
const handleBack = () => {
navigate('/contract-template/list');
};