3133 字
16 分钟

OSS Hub 前端实现:文件工作台、上传队列与移动端

OSS Hub 前端实现:文件工作台、上传队列与移动端#

对象存储管理后台的难点不是把 API 数据放进表格,而是让用户始终知道:

  • 当前正在操作哪个 Bucket。
  • 自己对这个 Bucket 是只读还是管理员。
  • 页面展示的是远端实时对象,还是数据库搜索结果。
  • 上传是否真正写入对象存储并完成登记。
  • 删除、对账和标签操作会影响哪一层数据。

OSS Hub 前端使用 Vue 3、Pinia、Vue Router 和 Tailwind CSS,把这些状态集中到一个统一工作台中。

前端目录#

frontend/src/
├── layouts/ # 桌面端布局
├── layouts-mobile/ # 移动端布局
├── views/ # 桌面端页面
├── views-mobile/ # 移动端页面
├── components/ # 通用与桌面端组件
├── components-mobile/ # 移动端组件
├── composables/ # 文件选择、操作、标签等逻辑
├── services/ # API、SSO、上传、路径记忆
├── stores/ # 登录、云存储、设置
├── router/
├── styles/
└── types/

项目没有只依赖响应式 CSS 把桌面页面压缩到手机宽度,而是为关键移动端流程提供独立页面和布局。

登录态管理#

auth store 保存:

  • access token。
  • token 来源:SSO 或 local。
  • 当前用户。
  • 权限列表。
  • 初始化完成状态。

页面刷新后,前端从本地恢复 token,并请求 /api/me 加载用户。如果接口返回未授权,API 层会清理失效 token 并引导重新登录。

SSO 模式下,前端使用授权码 + PKCE:

  1. 生成 verifier、challenge 和 state。
  2. 跳转到 SSO 授权端点。
  3. 回调页校验 state。
  4. 使用 code 和 verifier 换取 token。
  5. 保存 token 并加载当前用户。

内置登录则直接提交用户名和密码到 OSS Hub 后端。

当前云存储上下文#

cloudStorage store 是整个前端最关键的全局状态之一。

它负责:

  • 加载用户可访问的云存储列表。
  • 记住当前 cloudStorageId
  • 当旧选择不再可访问时自动回退到第一项。
  • 暴露当前存储是否已配置、是否可管理、使用何种 SDK 协议。

当前存储 ID 会随 API 请求发送给后端。这样文件、搜索、上传、标签和管理页都不需要各自维护一份 Bucket 选择逻辑。

路由与权限守卫#

桌面端主要路由包括:

/
/files
/search
/upload
/tags
/management/*
/guide/*
/settings/*

路由元信息表达页面要求:

  • 是否必须有可用云存储。
  • 是否需要当前云存储管理权限。
  • 是否只支持阿里云 OSS。
  • 是否需要平台管理员权限。

守卫会先确认登录态,再加载可访问云存储,并根据权限和协议做跳转。隐藏菜单只是体验优化,真正的安全检查仍然在后端。

概览工作台#

概览页负责给用户建立上下文:

  • 当前用户和登录身份。
  • 有效权限数量。
  • 当前云存储、供应商和 SDK 协议。
  • 当前访问角色。
  • 根目录文件夹和文件数量。
  • 数据库登记文件数量。
  • 最近上传文件。
  • 常用功能快捷入口。

它不是复杂报表,而是用户进入系统后判断“我在哪里、能做什么”的起点。

文件浏览器#

文件浏览页直接呈现对象存储的层级结构。

路径导航#

面包屑根据当前对象前缀生成。目录过深时,中间层级会折叠,避免工具栏被路径挤满。

前端还会按云存储记忆最后访问路径。用户在多个 Bucket 之间切换时,可以回到各自上次浏览的位置。

列表与图标视图#

文件可以用列表或图标方式展示:

  • 列表适合查看完整文件名、大小、时间和状态。
  • 图标适合浏览图片和媒体素材。
  • 图标模式支持小、中、大三档尺寸。
  • 排序方向可以切换。

已登记与未登记#

远端对象如果没有数据库索引,会标记为未登记。它仍然可以被浏览、下载或导入,但不会自动拥有系统标签和完整业务元数据。

文件选择#

选择逻辑被抽到 composable 中,支持:

  • 单选和多选。
  • 当前页全选。
  • Ctrl/Cmd + A 切换全选。
  • Delete 快捷删除并二次确认。
  • 批量标签、Object 标签、下载和删除。

OSS Hub 文件浏览器(待补图)

文件上下文操作#

桌面端提供右键菜单,移动端提供 Action Sheet。两者承载相同的核心能力:

  • 打开预览。
  • 添加或删除系统标签。
  • 管理 Object 标签。
  • 复制访问链接。
  • 下载。
  • 删除。
  • 对异常对象重新检查。

把操作入口放在文件上下文中,比让用户先进入详情页再操作更适合高频管理场景。

文件预览抽屉#

预览采用抽屉和全屏两种模式。

图片#

  • 使用短期签名 URL 加载原图。
  • 展示尺寸、EXIF、大小、类型和对象信息。
  • 阿里云 OSS 可以配置图片处理参数并复制处理后链接。

视频#

  • 使用浏览器原生视频控件。
  • 对不支持的编码提示下载查看。

文本#

  • 支持 TXT、JSON、Markdown 和常见配置文件。
  • 内容只读,避免把对象存储管理后台变成在线编辑器。
  • JSON 使用 CodeMirror 提升可读性。
  • 后端限制预览大小,避免一次读取超大文本。

OSS Hub 图片预览(待补图)

搜索页面#

搜索页和文件浏览页看起来相似,但数据来源不同。

搜索页支持:

  • 文件名、原文件名和 ObjectKey 关键字。
  • 路径前缀。
  • 系统标签范围和命名空间。
  • 多标签组合。
  • 创建时间排序。
  • 列表和图标视图。

如果搜索时开启远端检查,结果中会直接标记:

  • 远端对象缺失。
  • 对象大小或 ETag 变化。
  • 需要重新检查的问题。

这让用户在搜索结果中就能看到索引是否可信。

OSS Hub 搜索与标签筛选(待补图)

上传页面#

上传页不是一个简单的文件选择框,而是一套队列状态机。

每个待上传文件会经历:

waiting -> preparing -> uploading -> completing -> success
\-> failed

页面展示:

  • 原文件名和目标 ObjectKey。
  • 文件大小。
  • 总进度。
  • 当前状态和失败原因。
  • ACL、存储类型、Object 标签和是否登记。
  • 重试、取消、移除和清理成功项。

小文件上传#

小文件请求后端创建直传会话,然后使用 XHR PUT 到预签名 URL。XHR 比 fetch 更方便获得上传进度事件。

大文件上传#

大文件切换到 multipart:

  • 按设置切分 Blob。
  • 限制并行分片数量。
  • 合并所有分片进度。
  • 读取 ETag。
  • 失败分片自动重试。
  • 保存恢复状态。
  • 最后提交完成请求。

用户可以调整分片大小和并行数,但 UI 会限制到安全范围,避免把浏览器或网络压垮。

标签管理#

标签页负责系统标签,不直接混入 Object 标签。

系统标签支持:

  • 全局范围和当前云存储范围。
  • 命名空间。
  • 颜色、名称和描述。
  • 创建、编辑、软删除和恢复。
  • 是否同时删除文件关联的系统设置。

Object 标签则在文件抽屉或预设管理面板中操作,保持概念边界清晰。

管理中心#

管理中心按当前云存储展示多个面板。

团队#

存储管理员可以为用户分配:

  • 当前云存储只读权限。
  • 当前云存储管理权限。

平台管理员还可以在设置中管理用户状态和平台权限。

OSS Hub 团队权限配置(待补图)

数据问题#

显示同步任务和差异问题,提供:

  • 分步执行同步。
  • 查看运行进度和统计。
  • 重新检查缺失对象。
  • 导入未登记对象。
  • 清理确认缺失的索引。
  • 重试失败文件操作。

生命周期#

使用结构化表单管理 Bucket 生命周期规则。阿里云 OSS 还支持更多扩展字段,S3 模式则只显示兼容能力。

CORS 与防盗链#

CORS 面板帮助配置浏览器直传所需的方法、请求头和暴露头。阿里云 OSS 防盗链面板只在兼容协议下开放。

文件命名和 Object 标签预设#

这些设置更接近日常业务规则,因此放在当前云存储的管理上下文中,而不是平台全局设置。

桌面端与移动端分离#

移动端不只是桌面表格的缩窄版本。

项目会在启动时检测设备,选择桌面或移动路由:

  • 移动端首页直接进入文件浏览。
  • 文件列表使用适合触摸的卡片和底部操作栏。
  • 右键菜单替换为 Action Sheet。
  • 预览使用移动端全屏交互。
  • 上传和搜索使用独立移动页面。
  • 不适合手机维护的复杂管理能力会提示切换桌面端。

OSS Hub 移动端文件管理(待补图)

状态与错误体验#

前端为页面统一处理:

  • 首次加载。
  • 空数据。
  • 权限不足。
  • 没有可访问云存储。
  • 云存储尚未配置。
  • API 失败与重试。
  • 操作成功 Toast。
  • 高风险操作确认框。

这些状态看起来不如主功能显眼,但决定了系统在异常情况下是否仍然可理解。

演示流程#

下面是一条可以完整展示项目价值的演示路线。

第一步:登录与切换云存储#

使用 SSO 或内置管理员登录,在顶部切换两条不同协议的云存储,展示页面内容随当前 Bucket 更新。

第二步:浏览和新建目录#

进入文件页:

  1. 打开一个多层目录。
  2. 切换列表和图标模式。
  3. 调整图标大小。
  4. 新建一个演示目录。

第三步:上传#

准备两个文件:

  • 一个小图片,用于演示预签名 PUT。
  • 一个超过当前阈值的大文件,用于演示分片上传。

观察上传队列、进度、完成登记和文件列表刷新。

第四步:预览与标签#

打开图片预览,展示元数据和复制链接。给文件添加一个系统标签和一个 Object 标签。

第五步:搜索#

在搜索页组合文件名和系统标签,找到刚刚上传的文件。

第六步:制造并修复数据偏差#

在云控制台或测试脚本中直接删除一个已登记对象,再回到 OSS Hub 运行同步:

  1. 查看 MISSING_OBJECT 问题。
  2. 执行重新检查。
  3. 确认后清理数据库索引。

也可以直接在 Bucket 中上传一个对象,再展示未登记对象导入。

第七步:权限差异#

切换到只读用户:

  • 可以浏览、搜索和下载。
  • 不能上传、删除或进入存储管理面板。
  • 看不到未授权的云存储。

第八步:移动端#

使用手机或浏览器设备模拟器打开文件页,展示触摸操作、底部工具栏、Action Sheet 和全屏预览。

前端实现总结#

OSS Hub 前端围绕三个上下文展开:

  • 身份上下文:我是谁,有哪些平台权限。
  • 云存储上下文:我当前在操作哪个 Bucket,具有什么角色。
  • 文件上下文:这是远端对象还是数据库索引,当前操作会影响哪一层。

当这三个上下文保持清晰时,多云、标签、直传、对账和权限才不会变成一组互相冲突的按钮。

OSS Hub 前端实现:文件工作台、上传队列与移动端
https://march7th.online/blog/posts/0041-oss-hub-前端实现文件工作台上传队列与移动端/
作者
Yiguo
发布于
2026-07-28
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-07-28,距今已过 2 天

部分内容可能已过时

所属合集

OSS Hub 对象存储管理平台

记录 OSS Hub 从项目定位、多云对象存储适配、浏览器直传、索引对账,到 Vue 管理后台、部署和工程化收尾的完整实现。

查看完整合集

目录