Files
FileShare/web/README.md
T
SKYMirror 157db0e9e5
Release 镜像 / 测试(推送前置门禁) (push) Successful in 45s
Release 镜像 / 多架构构建并推送 ACR (push) Successful in 1m40s
v3.2:上下行带宽限速 + 品牌更新 + 产品修复
亮点
- v3.2 带宽限速(upload_rate/download_rate,字节/秒,0=不限速;管理端立即生效)
  - middleware/bandwidth.go 时间窗对齐 sleep 算法 + 单元测试(400KB@100KB/s 4.00s 精度)
  - 下载:serveFile 包裹 storage.ReadCloser(统一覆盖 local/webdav/s3 代理下载)
  - 上传:UploadBandwidthMiddleware 包裹 Request.Body(shareFile/chunk/presign proxy)
  - S3 预签名直传不可服务端限速——UI/文档明示
  - 后台 SettingsView 增加 MB/s 友好输入;i18n zh-CN/en-US 双语
- v3.2 文档:新增 docs/api/13-bandwidth.md 专题;10-config 指针;00-overview changelog
  与限流表带宽行;openapi.yaml 三处 schema + description 更新
- README.md / web/README.md / server/README.md / deploy/README.md 全部覆盖

品牌(v3.1 收尾)
- 文件快递柜 → 文件快传(前端/后端默认值/文档/产物/运行 KV)
- 「复制取件码」按钮删除;取件码块点击即复制(保持原尺寸)
- 「复制链接」→「复制链接和提取码」(一并复制链接和提取码)

产品修复(v3.1.1)
- 文本分享 Content-Type text/plain + urlencoded body:前端显式声明 urlencoded 头根治;
  后端 bindJSONOrForm 兜底兼容 text/plain + JSON/urlencoded 嗅探
- Docker 部署文档校对到 v3.1 现状(热切换 + 端口/卷/健康检查)
2026-09-06 10:20:04 +08:00

83 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 文件快传 前端(web/
Vue 3 + Vite + TypeScript 单页应用:分享 / 取件 / 管理后台(文件管理、审计日志、系统设置)/ 站内文档。
v2(任务 t3):液态玻璃主题(亮/暗/跟随系统)、中英双语(vue-i18n)、本地 Logo/favicon 打包资源、
背景图 / 页脚自定义 / 系统通知(读 `GET /api/v1/config` 下发的 v2 字段)、上传页策略动态渲染、
管理设置页全量策略表单(PATCH `/admin/config/update`)。
v3.2 起在管理设置「上传频率限制」卡底部新增**上下行带宽限速**字段(MB/s,0=不限速,
提交后换算为字节/秒写入 `upload_rate`/`download_rate` KV)。
## 页面
| 路由 | 说明 |
|---|---|
| `/` | 首页:文本/文件分享 Tab + 快速取件(有效期选项/大小/类型过滤按 config 动态渲染) |
| `/s/:code` | 取件页:文本展示 / 文件下载(带进度) |
| `/admin/login` | 管理员登录 |
| `/admin/files` | 文件管理:列表/搜索/编辑/删除/批量删除 |
| `/admin/audit` | 审计日志:动作/结果/IP/时间范围过滤 |
| `/admin/settings` | 系统设置:站点名称、Logo/favicon、背景图、页脚、通知、保存/存储策略、上传频率、管理员密码 |
| `/docs` | 站内 API 文档(渲染 `docs/api/*.md`,构建时内嵌 + 运行时回退) |
| `/openapi` | Swagger UI(渲染 `docs/openapi.yaml` |
## 主题与语言
- 主题三态(导航栏切换 + `localStorage``fcb_theme_mode`):浅色 / 深色 / 跟随系统(默认,`prefers-color-scheme`)。
实际主题写入 `<html data-theme>`Naive UI 组件接收 `darkTheme``index.html` 内联脚本做首帧防闪烁。
- 语言(导航栏切换 + `localStorage``fcb_locale`):默认 `navigator.language`(zh 开头 → zh-CN,其余 → en-US)。
文案在 `src/locales/`,新增文案先加 zh-CN 再同步 en-US。
## v2 配置字段(消费 `GET /api/v1/config`,管理端经 `PATCH /admin/config/update` 写回)
`background_url``footer_text``footer_beian``notify_enabled/notify_title/notify_content`
`max_file_size``max_save_seconds``max_save_count``allowedFileTypes``expireStyle`
`uploadSize``uploadCount/uploadMinute``site_name/logo_url/favicon_url`
策略最终由服务端强制(403/400 中文错误);前端只做体验层提示与动态选项渲染。
## 命令
```bash
npm ci # 安装依赖
npm run dev # 开发服务器(默认代理 /api /share /chunk /presign /admin 到 http://127.0.0.1:8466
npm run build # 类型检查 + 产出 dist/(后端 embed 用)
npm run preview # 预览构建产物
```
## 环境变量(.env.local
| 变量 | 说明 |
|---|---|
| `VITE_API_BASE` | 后端 API 根地址;默认空 = 同源(embed 部署)。如 `http://127.0.0.1:8466` |
| `VITE_MOCK` | 置 `1` 启用内置 mock(无需后端) |
| `VITE_ROUTER_MODE` | `history`(默认,后端 NoRoute 已做 SPA 回退)/ `hash`(后端无回退时) |
## API 契约(最终版,经队长终审裁定)
**业务 API 挂根路径;公共端点 `/api/v1/health`、`/api/v1/config` 例外。** 权威依据:`docs/api/*.md`tech-writer 13 篇,概述 00-overview.md)与 `docs/openapi.yaml`,本节与其 100% 对齐;变更须同步文档并知会 go-api + tech-writer。
- 统一响应 `{"code":200,"msg":"ok","data":...}`HTTP 状态 = code401 未登录(连续失败 423)、423 限流、428 未初始化。
- 取件:`GET /share/metadata?code=` 不消耗次数;`GET /share/select?code=` 会**消耗**取件次数(文本 text/plain,文件流 200/206 支持 Range),文件名读 Content-Disposition。前端只在真正取件时调用 select。
- 分片:`POST /chunk/upload/init`JSON)→ `POST /chunk/upload/{uploadID}/{chunkIndex}`multipart 仅 chunk 字段)→ `GET /chunk/upload/status/{uploadID}``POST /chunk/upload/complete/{uploadID}`;取消 `DELETE /chunk/upload/{uploadID}`
- 管理端:`POST /admin/login``GET /admin/verify``DELETE /admin/file/delete``POST /admin/file/batch-delete``PATCH /admin/file/update``PATCH|POST /admin/config/update``GET /admin/audit/list`(参数 page/size/action/result/ip/start_time/end_timeISO 8601)、`PATCH /admin/settings/password`
## 嵌入约定(go:embed
- 构建产物输出到 `web/dist/`(入口 `web/dist/index.html`)。**注意**`web/` 在 Go moduleserver/)之外,go:embed 无法直接引用 —— go-api 需在构建脚本中拷贝(如 `cp -a web/dist server/web/dist`)或以 `os.DirFS` 方式挂载;`base: '/'` + history 路由配合其 NoRoute SPA 回退(静态资源优先、GET+text/html 回 index.html、/api/* JSON 404)。
- 如需改输出目录,调整 `vite.config.ts``build.outDir`
## Logo 自定义(v2:本地资源兜底)
- 默认导航 Logo`src/assets/brand/logo.svg`(构建内嵌;`DEFAULT_LOGO_URL`
- 默认 favicon`src/assets/brand/favicon.png``index.html` + `DEFAULT_FAVICON_URL`
- 运行时优先读取公共配置 `logo_url` / `favicon_url` / `site_name`(管理端「系统设置」保存后立即全站生效),空值回退本地默认;不再依赖远程 URL。
## API 客户端
统一封装见 `src/api/paths.ts`(全部路径一处可改)与 `src/api/http.ts``{code,msg,data}` 解包、Bearer 认证、超时、401/428 处理)。
## 文档页约定(与 tech-writer
- `docs/api/*.md`:每个文件一个章节,**一级标题(`# 标题`)即侧边栏章节名**;文件名(去掉 .md)作为路由 slug。构建时通过 `import.meta.glob` 内嵌原文,后端如挂载 `/docs/api/index.json``[{slug,title}]`)可补充远端章节。
- `docs/openapi.yaml`:构建时内嵌给 Swagger UI;后端也可直接静态托管 `/docs/openapi.yaml`