- 全项目版本号统一:v3.x 迭代号(26.9/26.9/26.9/26.9 及裸 v2/v3)→ 26.9, 覆盖 Go 注释 / 文档 / openapi.yaml / README×4 / 前端源码(80+ 处) - v31_test.go 更名 custom_code_test.go;TestV2AccessorDefaults → TestKVAccessorDefaults - docs/api/00-overview.md 更新日志合并为单条 26.9 条目(修复错位拼接) - .goreleaser.yaml 头部注释与实际一致(Pro 2.18.1 / GITEA_TOKEN / semver tag 要求) - CI:release-image.yml → ci.yml,仅保留 vet+test 门禁; 镜像发布移交 GoReleaser Pro(原 build-push 的 tag 校验与 26.9 版本方案冲突,历史 9 次失败) - 前端重建:server/web/dist 与 web-embed 同步(docs 文案嵌入更新)
5.8 KiB
文件快传 前端(web/)
Vue 3 + Vite + TypeScript 单页应用:分享 / 取件 / 管理后台(文件管理、审计日志、系统设置)/ 站内文档。
26.9(任务 t3):液态玻璃主题(亮/暗/跟随系统)、中英双语(vue-i18n)、本地 Logo/favicon 打包资源、
背景图 / 页脚自定义 / 系统通知(读 GET /api/v1/config 下发的 26.9 字段)、上传页策略动态渲染、
管理设置页全量策略表单(PATCH /admin/config/update)。
26.9 起在管理设置「上传频率限制」卡底部新增上下行带宽限速字段(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。
26.9 配置字段(消费 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 中文错误);前端只做体验层提示与动态选项渲染。
命令
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 状态 = code;401 未登录(连续失败 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_time,ISO 8601)、PATCH /admin/settings/password。
嵌入约定(go:embed)
- 构建产物输出到
web/dist/(入口web/dist/index.html)。注意:web/在 Go module(server/)之外,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 自定义(26.9:本地资源兜底)
- 默认导航 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。