本项目面向企业内部文件分发与外部分享场景,解决本地磁盘网盘难以弹性扩容、分享入口缺少门禁的问题。目标是基于 Node.js 从零构建一套管理端与访客端分离的对象存储网盘,文件落在阿里云 OSS,目录、权限和提取码等业务数据落在 MySQL。
核心功能包括:多租户切换与账号密码登录;文件夹树管理,新建文件夹自动生成四位字母数字提取码,明文仅展示一次并以哈希存储;文件上传下载,写入 OSS 后以预签名 URL 下载;访客凭分享短链输入提取码后才能列表展示和下载,并做失败次数限制;同步中心记录出站/入站事件、冲突决议与未认领对象,支持对账。
业务流程为:管理员登录选择租户 → 创建文件夹获得提取码和分享链接 → 上传文件到对应目录并同步对象存储 → 将链接与提取码交给访客 → 访客校验通过后只读访问该文件夹子树。删除为软删除,对象由后台任务异步清理。系统将元数据与二进制分离,保证列表查询走数据库、字节以 OSS 为准。
整体采用 npm monorepo:apps/web 为 Vue 3 + Vite + TypeScript + Vue Router + Pinia + Element Plus,界面按高保真原型还原管理端(登录、文件管理、同步中心、分享、审计)与访客提取码页;apps/api 为 NestJS + TypeORM + MySQL,使用 AWS SDK 以 S3 兼容协议对接阿里云 OSS(虚拟主机风格)。无 Redis 时,限流、登录锁定与同步队列在 API 进程内实现。对象 Key 采用 t/{租户}/o/{文件ID},避免重命名级联改路径。
本人负责从系统设计到前后端落地:存储适配与上传下载、文件夹提取码门禁、租户与 JWT 鉴权、同步 Worker 与对账、以及按原型实现的管理端/访客端交互。已打通「建夹得码 → 上传 → 访客输码下载」主路径,并处理中文文件名乱码、同名唯一索引冲突、OSS Path-Style 被拒等问题。