yalasuo

分享模块调试全记录,分享模块:最优标准架构实施总结

分享模块:最优标准架构实施总结

从传统文件代理到应用服务器仅做“签发官”的蜕变

http----to--https

分享并邮件通知功能实现

分享并邮件通知功能实现emailshare.html

deepseek_html_20260314_e53014.html

最终解决可生成s的分享deepseek_html_20260313_80324f.html

deepseek_html_20260312_c5be20.html

deepseek_html_20260311_7b4bb3.html

最终成果及之后的具体最优方案实施计划

deepseek_html_20260311_4be1dc.html

 

接下来目标依次一步一步再优化:
1.生成分享时屏幕一闪一闪的。有没有更好的处理方法,独立出来而不是用模态框?

2.密码验证:给分享加个锁

3.分享管理页面:查看、延长、撤销自己的分享

4.预览支持:图片、PDF 等直接预览

先给出思路,然后再新开一次对话继续优化


1. 分享模态框闪烁问题 → 独立分享创建页面
现状:当前分享功能是通过 Files.jsx 中的 ShareModal 模态框实现的。由于状态变化和动画,可能导致闪烁或体验不佳。

优化思路:将创建分享独立为一个单独的页面(路由),而不是内嵌模态框。

前端:新增路由 /share/create,并携带文件 ID 作为查询参数(例如 /share/create?fileId=xxx)。

组件:新建 CreateShare.jsx 页面,从 URL 获取 fileId,并展示表单(与现有模态框类似,但更稳定)。

操作:用户填写选项后提交,成功后跳转到分享结果页或文件列表,并可复制链接。

好处:避免了模态框在父组件中的渲染抖动,逻辑更清晰,也方便后续扩展(如批量分享)。

2. 密码验证 → 给分享加个锁
现状:后端已经支持密码验证(verifyPassword 端点),但前端 SharePublic 页面还未处理密码输入。

优化思路:在 SharePublic 组件中,当获取分享信息返回 403 且错误码为 PASSWORD_REQUIRED 时,显示密码输入表单。

前端:

在 fetchShare 中捕获 err.response?.status === 403 且 err.response?.data?.code === 'PASSWORD_REQUIRED' 时,设置 needsPassword = true。

渲染密码输入框,用户提交后调用后端 /s/:code/verify-password 接口(注意使用短链路由,与 getPublicShare 类似)。

验证成功后,将返回的 accessToken 存入 cookie(与正常访问一致),然后重新调用 fetchShare(此时无需再传密码)。

后端:确保 /s/:code/verify-password 端点已存在(我们在 ShortShareController 中已经添加),并且返回 accessToken 并设置 cookie。

3. 分享管理页面 → 查看、延长、撤销自己的分享
现状:目前用户创建分享后无法统一管理,只能通过文件列表重新分享。

优化思路:新建一个“我的分享”页面,展示当前用户创建的所有分享,并提供操作按钮。

前端:

新增路由 /shares(受保护),对应组件 ShareManagement.jsx。

在组件中调用 fileService.getShares()(后端已有 GET /shares 接口)获取列表,展示为表格,包含分享标题、分享码、有效期、访问次数、状态等。

每行操作:延长有效期(弹窗输入天数)、撤销(软删除)、复制链接、删除(永久)。

使用现有 shareService 中的 extendShareExpiry、revokeShare、deleteShare 等方法。

后端:接口已存在,无需额外开发。

4. 预览支持 → 图片、PDF 等直接预览
现状:目前所有文件点击下载都强制下载,对于图片、PDF 等用户可能希望直接预览。

优化思路:在分享文件列表中,对于可预览的文件(如图片、PDF)显示“预览”按钮,点击后打开预览组件。

后端:

在 MinioService 中增加生成预览 URL 的方法,调用 presignedGetObject 时设置 response-content-disposition=inline。

在 FileController 增加 @Get(':id/preview-url') 端点,返回预签名预览 URL。

注意权限:对于公开分享,仍需要通过 share_token 验证,复用现有的 getFileDetails 双认证逻辑。

前端:

在 SharePublic 组件中,渲染文件列表时,根据 file.isPreviewable 判断是否显示预览按钮。

点击预览时,调用 fileService.getPreviewUrl(fileId) 获取预览 URL,然后打开 FilePreview 组件(已存在),传入 URL 和文件信息。

FilePreview 需要能接受外部 URL 作为源,目前它可能依赖 previewUrl 字段,需要稍作调整。

接下来,我们按这个顺序逐个实现。你希望我先从哪一步开始?我们可以新开一个对话,专注于第一个优化点,完成后继续下一个。

 

本文档详细记录了 smart-upload-backend-v2 项目中 分享模块(Share Module) 的调试与修复过程。从模块完全不可用(创建分享返回 401/403/500)到最终实现创建、查询、公开访问等功能,所有核心接口均通过测试。本次修复涵盖了 数据库结构修正、认证授权完善、路由冲突解决、数据格式错误处理 等多个方面。

 

经验总结

  • 调试步骤的重要性:从简单端点(/ping)开始,逐步扩展,结合日志定位问题。
  • 数据库与实体的一致性:TypeORM 的 array: true 要求数据库列类型正确,否则会引发序列化错误。
  • 角色授权:JWT 返回的用户对象必须包含角色字段,否则守卫无法通过。
  • 路由顺序:动态路由(:id)应放在静态路由之后,避免冲突。
  • 参数传递:服务层接口应清晰定义,避免传递拼接字符串,应使用 DTO 携带结构化数据。

📎 后续建议

  • 恢复并完善重复文件检查逻辑(已提供正确查询)。
  • 对接文件下载服务(MinIO 预签名 URL)。
  • 增加单元测试和集成测试,覆盖核心流程。
  • 添加 Swagger 文档注释,便于前端对接。

JTBC