目标很明确:让 AI 直接产出一个可运行、可构建、可部署的「多格式文件批量哈希校验与重复检测」在线工具。它适合用在日常交付与素材管理:你下载了一堆素材包、合同附件、压缩包解压后的文件树、或同一份资源在多个渠道重复保存,想快速做一致性校验、找出重复项、导出审计报告,并把流程标准化。
你将得到的不只是页面原型,而是完整项目代码、清晰的文件结构、可复现的运行命令、可上线的部署说明,以及可以照着走的测试用例或 QA checklist。所有处理以“校验/检测/对比/导出”为核心,避免任何生成图片/渲染图导向。
常见的使用场景包括:素材包下载后做去重与归档;甲方给的多批附件做一致性校验;交付前后对比文件树是否被替换;多人协作时做增量复检;把哈希与文件清单作为审计留档;在本地/内网环境部署一套无需联网的校验工作台。
核心能力:拖拽或选择文件/文件夹(浏览器支持时)批量导入;计算 SHA-256(必要时补充 SHA-1/MD5 仅作兼容提示);按“大小+哈希”聚类重复文件;生成差异报告(同名不同内容、同内容不同名、空文件、疑似损坏);支持增量扫描(保存 manifest,二次导入时只对变更项重算);导出 CSV/JSON;可选生成一份可打印的 HTML 报告。
工程能力:大文件分片读取、并发控制、Web Worker 防卡顿、进度条与可取消任务、错误重试与失败原因提示。安全与隐私:默认在浏览器本地计算(WebCrypto/SubtleCrypto 或 JS 实现),不上传文件内容;如提供服务端模式,则明确“仅上传哈希与元数据/或按开关上传”,并给出部署与访问控制建议。
前端可用 Next.js/React/Vite 任一;推荐把哈希计算放到 Worker,UI 负责队列与展示。服务端可选:Node.js(Express/Fastify)提供报告持久化与下载、任务历史、以及对 manifest 的存储;同时提供无服务端的纯前端模式,便于离线使用。
角色:你是资深全栈工程师与测试负责人。请一次性输出一个可运行的在线工具项目,主题是「多格式文件批量哈希校验与重复检测工作台」。
硬性交付物(必须全部给出):
1) 完整项目源码(用文本形式给出关键文件内容)
2) 文件树(tree 形式,标注每个文件用途)
3) 本地运行命令(开发模式与生产构建)
4) Docker 部署(Dockerfile + 可选 docker-compose.yml)
5) 配置说明(环境变量、端口、存储路径、最大并发、最大文件大小策略)
6) 测试用例或 QA checklist(覆盖边界条件与性能)
功能需求:
- 支持批量导入文件(拖拽/选择)。如果浏览器支持目录选择,请同时支持文件夹导入。
- 计算 SHA-256 哈希。对大文件采用分片读取,UI 显示进度、耗时、速率;提供“暂停/继续/取消”。
- 重复检测规则:以(文件大小 + SHA-256)为主键分组;额外输出“同名不同内容”“同内容不同名”的统计。
- 增量校验:允许用户导出 manifest(JSON),下次导入时可读取 manifest,对未变更文件跳过重算(依据 size + lastModified + 可选 quick-hash)。
- 报告导出:CSV 与 JSON;CSV 字段至少包含:path/name,size,sha256,groupId,duplicateCount,firstSeen,notes。
- 可选服务端模式(开关):服务端只接收文件元数据与哈希(默认不上传文件内容);提供任务历史列表、报告下载;实现简单鉴权(如 basic auth 或 token)。如果实现服务端模式,请同时保留纯前端离线模式。
非功能需求:
- 性能:默认并发 2-4(可配置),避免内存暴涨;大文件用流式读取;计算放到 Web Worker。
- 可靠性:失败要有可读错误;任务可重试;manifest 解析失败要有提示。
- 安全:清晰说明“默认不上传文件内容”;如果有服务端模式,提供 CORS/CSRF/限流/最大 body 限制建议。
- 体验:列表可搜索/筛选(只看重复项/只看失败项/按大小排序);提供一键复制摘要(总文件数、重复组数、可节省空间估算)。
输出格式要求:
- 先给出 8-12 行「项目概览」
- 再给出文件树
- 然后按文件依次给出代码(用 Markdown 代码块包裹)
- 最后给出运行命令、Docker 部署、以及测试用例或 QA checklist
验收时建议按以下路径走:先用一组小文件验证正确性(不同内容同名、同内容不同名、空文件、中文文件名);再用 1-2GB 级别的大文件验证分片与进度;最后用两次导入验证增量校验是否真正跳过重算,并检查 CSV/JSON 字段是否齐全。
浏览器侧哈希计算容易卡 UI,所以一定要用 Worker;同时注意拖拽导入时的路径信息并不总是可用,需要用相对路径或用户自定义标签替代。增量校验不要只靠 lastModified,一旦来源不同会漂移,建议加 quick-hash(例如前后各读取 64KB 参与)作为折中。