diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx index fdf0390..a9cbbc2 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx @@ -66,7 +66,8 @@ function Directory({ for (const folder of files.items) { const foundItem = folder.items.find((file) => file.id === itemId); if (foundItem) { - toRemove.push(`${folder.name}/${foundItem.name}`); + // toRemove.push(`${folder.name}/${foundItem.name}`); + toRemove.push(`${foundItem.relativePath}`); break; } } diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/index.jsx index fdd7371..508fae8 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/index.jsx @@ -151,8 +151,7 @@ export default function UploadFile({
- 这些文件将被上传到运行于此的文档处理器上 - AnythingLLM实例。这些文件不会发送或与第三方共享 + 这些文件不会发送或与第三方共享,请放心使用。
); diff --git a/server/downloaded_localFile b/server/downloaded_localFile new file mode 100644 index 0000000..984cb36 Binary files /dev/null and b/server/downloaded_localFile differ diff --git a/server/endpoints/system.js b/server/endpoints/system.js index 9d4af42..4521ba7 100644 --- a/server/endpoints/system.js +++ b/server/endpoints/system.js @@ -391,17 +391,40 @@ function systemEndpoints(app) { } ); + // app.delete( + // "/system/remove-documents", + // [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])], + // async (request, response) => { + // try { + // const { names } = reqBody(request); + // console.log("names", names); + // for await (const name of names) await purgeDocument(name); + // response.sendStatus(200).end(); + // } catch (e) { + // console.error(e.message, e); + // response.sendStatus(500).end(); + // } + // } + // ); + app.delete( "/system/remove-documents", [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])], async (request, response) => { try { - const { names } = reqBody(request); - for await (const name of names) await purgeDocument(name); - response.sendStatus(200).end(); + const { names } = reqBody(request); // 获取请求体中的文件名列表 + console.log("names", names); + + // 遍历文件名列表,调用 purgeDocument 方法 + for (const name of names) { + await purgeDocument(name); + } + + // 返回成功响应 + response.status(200).json({ success: true, message: "Documents removed successfully." }); } catch (e) { console.error(e.message, e); - response.sendStatus(500).end(); + response.status(500).json({ success: false, error: e.message }); } } ); diff --git a/server/endpoints/workspaces.js b/server/endpoints/workspaces.js index b74379a..5888e8a 100644 --- a/server/endpoints/workspaces.js +++ b/server/endpoints/workspaces.js @@ -39,6 +39,7 @@ const { DeptUsers } = require("../models/deptUsers"); const { DeptDocument } = require("../models/deptDocument"); const { v4: uuidv4 } = require("uuid"); const { moveAndRenameFile } = require("../utils/files/index"); +const moment = require('moment'); // 引入时间格式化库 function workspaceEndpoints(app) { if (!app) return; @@ -288,11 +289,6 @@ function workspaceEndpoints(app) { fs.mkdirSync(targetDir, { recursive: true }); // 递归创建目录 } - // 保存文件 - const filePath = path.join(targetDir, originalname); // 使用原始文件名 - const fileBuffer = Buffer.from(fileContent, "base64"); - fs.writeFileSync(filePath, fileBuffer); - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 假设路径字符串 const location = documents[0].location; @@ -303,7 +299,14 @@ function workspaceEndpoints(app) { // 提取文件名 const parsedFileName = unixStylePath.substring(lastIndex + 1); const fileExtension = path.extname(request.file.path).toLowerCase(); - const newFileName = uuidv4() + fileExtension; // 新文件名 + // const newFileName = uuidv4() + fileExtension; // 新文件名 + const newFileName = `${uuidv4()}_${moment().format('YYYYMMDD_HHmmss')}${fileExtension}`; // 生成唯一文件名 + + // 保存文件 + const filePath = path.join(targetDir, newFileName); // 使用原始文件名 + const fileBuffer = Buffer.from(fileContent, "base64"); + fs.writeFileSync(filePath, fileBuffer); + const deptDocData = { deptId: deptUserRecord.deptUser.deptId, parsedFileName: parsedFileName, diff --git a/server/models/deptDocument.js b/server/models/deptDocument.js index 0fbf534..e26a911 100644 --- a/server/models/deptDocument.js +++ b/server/models/deptDocument.js @@ -220,6 +220,44 @@ const DeptDocument = { throw error; } }, + /** + * 根据 parsedFilePath 模糊查询数据,并将 delTag 更新为 true + * @param {string} parsedFilePath - 模糊查询的路径 + * @returns {Promise<{ success: boolean, error: string | null, count: number }>} + */ + softDeleteByParsedFilePath: async function (parsedFilePath) { + try { + if (!parsedFilePath) { + throw new Error("parsedFilePath is required"); + } + + // 模糊查询 parsedFilePath + const result = await prisma.dept_document.updateMany({ + where: { + parsedFilePath: { + contains: parsedFilePath, // 模糊匹配 + }, + }, + data: { + delTag: true, // 将 delTag 更新为 true + lastUpdatedAt: new Date(), // 更新最后修改时间 + }, + }); + + return { + success: true, + error: null, + count: result.count, // 返回更新的记录数 + }; + } catch (error) { + console.error("FAILED TO SOFT DELETE BY PARSED FILE PATH.", error.message); + return { + success: false, + error: error.message, + count: 0, + }; + } + }, }; module.exports = { DeptDocument }; diff --git a/server/storage/localFile/cebc49a6-9df4-46cc-8ba5-672b5d72de0e.txt b/server/storage/localFile/cebc49a6-9df4-46cc-8ba5-672b5d72de0e.txt deleted file mode 100644 index f3ca610..0000000 --- a/server/storage/localFile/cebc49a6-9df4-46cc-8ba5-672b5d72de0e.txt +++ /dev/null @@ -1 +0,0 @@ -你好 \ No newline at end of file diff --git a/server/storage/localFile/f51243b3-13e6-4374-8b64-a7fa4ba38ed9.txt b/server/storage/localFile/f51243b3-13e6-4374-8b64-a7fa4ba38ed9.txt deleted file mode 100644 index 43a1c3f..0000000 --- a/server/storage/localFile/f51243b3-13e6-4374-8b64-a7fa4ba38ed9.txt +++ /dev/null @@ -1,20 +0,0 @@ -一、数字驼乡 - -1、政策类型修改增删改查接口的逻辑 -2、服务事项主题分类增删改查逻辑修改,信息发布修改数据库字段类型 -3、政策内容id改成UUID, 行业资讯id修改为UUID,政策解读ID修改为UUID,用户注册校验用户名是否重复, 商家信息新增和更新时校验商家名称和统一社会信用代码 -4、商家信息添加字段:其他证照,商家信息添加字段:审核状态,审核时间,审核人,审核反馈; 商家资质添加字段:审核人 -5、添加商家信息图标 -7、政企服务建表,页面和路由生成,后端新开一个微服务 -8、配合赵洋做商家信息相关的问题 -9、 添加5个图标供参考 -10、生成提问和反馈的页面和路由 -11、商家信息修改时校验审核状态 -12、提问反馈的页面字段错误问题和提问反馈的关联用户ID问题 -13、修复商家信息和行业类型,行政区划实体里面的对应混乱问题 -二、盟林草-森林保险管理系统 - -1、修改上次测出问题,部署 -三、社会治理联动指挥平台(一期) - -1、修复导航权限问题,部署 \ No newline at end of file diff --git a/server/utils/files/purgeDocument.js b/server/utils/files/purgeDocument.js index b0c295a..186854d 100644 --- a/server/utils/files/purgeDocument.js +++ b/server/utils/files/purgeDocument.js @@ -9,10 +9,42 @@ const { } = require("."); const { Document } = require("../../models/documents"); const { Workspace } = require("../../models/workspace"); +const { DeptDocument } = require("../../models/deptDocument"); + +// async function purgeDocument(filename = null) { +// if (!filename || !normalizePath(filename)) return; +// +// await purgeVectorCache(filename); +// await purgeSourceDocument(filename); +// const workspaces = await Workspace.where(); +// for (const workspace of workspaces) { +// await Document.removeDocuments(workspace, [filename]); +// } +// return; +// } async function purgeDocument(filename = null) { if (!filename || !normalizePath(filename)) return; + // 根据环境转换分隔符 + let normalizedFilename = filename; + if (process.env.NODE_ENV === "development") { + // 开发环境:将路径分隔符转换为 Windows 风格(\) + normalizedFilename = filename.replace(/\//g, "\\"); + } else { + // 生产环境:将路径分隔符转换为 Unix 风格(/) + normalizedFilename = filename.replace(/\\/g, "/"); + } + + // 标记匹配的文件为逻辑删除 + const { success, error, count } = await DeptDocument.softDeleteByParsedFilePath(normalizedFilename); + if (!success) { + console.error("Failed to soft delete documents:", error); + return; + } + console.log(`Successfully marked ${count} documents as deleted.`); + + // 继续执行原有的清理逻辑 await purgeVectorCache(filename); await purgeSourceDocument(filename); const workspaces = await Workspace.where();