评查文件列表的查询查看、文档列表的查询查看修改删除都添加了user_id去限制用户操作。

This commit is contained in:
2025-07-21 09:41:20 +08:00
parent e80b6b7da3
commit e7ffbe875e
8 changed files with 177 additions and 88 deletions
+19 -3
View File
@@ -122,12 +122,21 @@ const formatFileSize = (bytes: number) => {
// 处理表单提交和删除等操作
export const action = async ({ request }: ActionFunctionArgs) => {
try {
// 获取用户会话信息
const { getUserSession } = await import("~/api/login/auth.server");
const { userInfo } = await getUserSession(request);
if (!userInfo?.user_id) {
return Response.json({ result: false, message: "用户身份验证失败" }, { status: 401 });
}
const userId = userInfo.user_id.toString();
const formData = await request.formData();
const action = formData.get("_action");
if (action === "delete") {
const id = formData.get("id") as string;
const response = await deleteDocument(id);
const response = await deleteDocument(id, userId);
if (response.error) {
return Response.json({ result: false, message: response.error }, { status: response.status || 500 });
@@ -139,7 +148,7 @@ export const action = async ({ request }: ActionFunctionArgs) => {
const ids = formData.getAll("ids") as string[];
// 批量删除处理
const results = await Promise.all(ids.map(id => deleteDocument(id)));
const results = await Promise.all(ids.map(id => deleteDocument(id, userId)));
const failures = results.filter(r => r.error);
if (failures.length > 0) {
@@ -652,8 +661,15 @@ export default function DocumentsIndex() {
// 检查audit_status是否为0,如果是则更新为2
if (auditStatus === 0 || auditStatus === null) {
try {
// 从loader data中获取用户ID
const userId = loaderData.userInfo?.user_id?.toString();
if (!userId) {
toastService.error('用户身份验证失败');
return;
}
// console.log('开始审核',fileId,auditStatus)
const response = await updateDocumentAuditStatus(fileId.toString(), 2);
const response = await updateDocumentAuditStatus(fileId.toString(), 2, userId);
if (response.error) {
console.error('更新文件审核状态失败:', response.error);
toastService.error('更新文件审核状态失败:' + (response.error || '未知错误'));
+22 -2
View File
@@ -80,6 +80,16 @@ function formatFileSize(bytes: number): string {
// Loader函数
export async function loader({ request }: LoaderFunctionArgs) {
try {
// 获取用户会话信息
const { getUserSession } = await import("~/api/login/auth.server");
const { userInfo } = await getUserSession(request);
if (!userInfo?.user_id) {
throw new Response("用户身份验证失败", { status: 401 });
}
const userId = userInfo.user_id.toString();
// 从URL查询参数获取文档ID
const url = new URL(request.url);
const id = url.searchParams.get("id");
@@ -90,7 +100,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
// 并行获取文档详情和文档类型列表
const [documentResponse, documentTypesResponse] = await Promise.all([
getDocument(id),
getDocument(id, userId),
getDocumentTypes({ pageSize: 500 })
]);
@@ -114,6 +124,16 @@ export async function loader({ request }: LoaderFunctionArgs) {
// Action函数处理表单提交
export async function action({ request }: ActionFunctionArgs) {
// 获取用户会话信息
const { getUserSession } = await import("~/api/login/auth.server");
const { userInfo } = await getUserSession(request);
if (!userInfo?.user_id) {
return Response.json({ error: "用户身份验证失败" }, { status: 401 });
}
const userId = userInfo.user_id.toString();
// 从URL查询参数获取文档ID
const url = new URL(request.url);
const id = url.searchParams.get("id");
@@ -153,7 +173,7 @@ export async function action({ request }: ActionFunctionArgs) {
auditStatus,
isTest,
remark
});
}, userId);
if (updateResponse.error) {
console.error('更新文档失败:', updateResponse.error);
+22 -3
View File
@@ -214,11 +214,21 @@ type LoaderData = {
documents: Document[];
documentTypes: DocumentType[];
mode: string;
userInfo?: {
user_id?: number;
username?: string;
nick_name?: string;
[key: string]: unknown;
} | null;
};
// 添加 loader 函数
export async function loader({ request }: LoaderFunctionArgs) {
try {
// 获取用户会话信息
const { getUserSession } = await import("~/api/login/auth.server");
const { userInfo } = await getUserSession(request);
// console.log('loader: 开始加载数据...');
const url = new URL(request.url);
const mode = url.searchParams.get("mode") || "create";
@@ -240,13 +250,15 @@ export async function loader({ request }: LoaderFunctionArgs) {
return Response.json({
mode,
documents: documentsResponse.data || [],
documentTypes: typesResponse.data || []
documentTypes: typesResponse.data || [],
userInfo // 传递用户信息到客户端
});
} catch (error) {
console.error('loader: 加载数据失败:', error);
return Response.json({
documents: [],
documentTypes: []
documentTypes: [],
userInfo: null
});
}
}
@@ -1439,8 +1451,15 @@ export default function FilesUpload() {
// 检查audit_status是否为0,如果是则更新为2
if (record.audit_status === 0 || record.audit_status === null) {
try {
// 从loader data中获取用户ID
const userId = loaderData.userInfo?.user_id?.toString();
if (!userId) {
toastService.error('用户身份验证失败');
return;
}
// console.log('【调试-handleViewFile】更新文件审核状态,文件ID:', record.id);
const response = await updateDocumentAuditStatus(record.id.toString(), 2);
const response = await updateDocumentAuditStatus(record.id.toString(), 2, userId);
if (response.error) {
console.error('【调试-handleViewFile】更新文件审核状态失败:', response.error);
toastService.error('更新文件审核状态失败:' + (response.error || '未知错误'));
+22 -4
View File
@@ -58,6 +58,10 @@ export const REVIEW_STATUS_LABELS: Record<string, string> = {
// 加载评查文件列表
export async function loader({ request }: LoaderFunctionArgs) {
// 获取用户会话信息
const { getUserSession } = await import("~/api/login/auth.server");
const { userInfo } = await getUserSession(request);
// 获取分页参数
const url = new URL(request.url);
const currentPage = parseInt(url.searchParams.get("page") || "1", 10);
@@ -75,6 +79,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
totalCount: 0,
currentPage,
pageSize,
userInfo, // 传递用户信息到客户端
initialLoad: true
});
} catch (error) {
@@ -85,7 +90,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
export default function RulesFiles() {
const navigate = useNavigate();
const { files: initialFiles, documentTypes: allDocumentTypes, totalCount: initialTotal, currentPage, pageSize, result, message } = useLoaderData<typeof loader>();
const { files: initialFiles, documentTypes: allDocumentTypes, totalCount: initialTotal, currentPage, pageSize, userInfo, result, message } = useLoaderData<typeof loader>();
const [searchParams, setSearchParams] = useSearchParams();
const dateFrom = searchParams.get('dateFrom') || '';
const dateTo = searchParams.get('dateTo') || '';
@@ -134,8 +139,11 @@ export default function RulesFiles() {
searchParams.fileType = params.fileType;
}
// 从loader data中获取用户ID
const userId = userInfo?.user_id?.toString();
// 获取文件列表
const filesResponse = await getReviewFiles(searchParams);
const filesResponse = await getReviewFiles(searchParams, null, userId);
if (filesResponse.error) {
throw new Error(filesResponse.error);
}
@@ -198,8 +206,11 @@ export default function RulesFiles() {
// 设置加载状态
setIsLoading(true);
// 从loader data中获取用户ID
const userId = userInfo?.user_id?.toString();
// 获取文件列表
getReviewFiles(apiSearchParams)
getReviewFiles(apiSearchParams, null, userId)
.then(filesResponse => {
if (filesResponse.error) {
throw new Error(filesResponse.error);
@@ -281,7 +292,14 @@ export default function RulesFiles() {
// 检查audit_status是否为0,如果是则更新为2
if (auditStatus === 0 || auditStatus === null) {
try {
const response = await updateDocumentAuditStatus(fileId, 2);
// 从loader data中获取用户ID
const userId = userInfo?.user_id?.toString();
if (!userId) {
toastService.error('用户身份验证失败');
return;
}
const response = await updateDocumentAuditStatus(fileId, 2, userId);
if (response.error) {
throw new Error(response.error);
}