26.9:品牌统一(fileshare)+ 版本号改为日期式
Release 镜像 / 测试(推送前置门禁) (push) Failing after 12s
Release 镜像 / 多架构构建并推送 ACR (push) Skipped

- 数据库默认文件 filecodebox.db → fileshare.db(config.go 默认值与全部文档/编排同步)
- Go module filecodebox → fileshare(全部 import 同步,build/vet/test 全绿)
- 应用版本 APP_VERSION 2.5.6 → 26.9(health 接口已验证返回 26.9)
- deploy 编排统一:compose 项目名、Postgres 默认凭据、minio 桶名、env 注释
- JWT issuer、存储临时目录前缀、web 包名同步 fileshare
- CI:镜像 tag 以 APP_VERSION 为唯一版本源,main/tag 推送即发布
  ${VER} + latest;tag 触发时校验 tag 名与 APP_VERSION 一致,防错版
- 本地开发库文件已改名 fileshare.db(含 -shm/-wal 清理)
This commit is contained in:
SKYMirror committed 2026-09-05 06:32:18 +08:00
1 parent b5f06d09b3
commit 6f1a925833
63 files changed
+172 -167

No files matched your search

+17 -12
View File
@@ -3,7 +3,7 @@ name: Release 镜像
on:
push:
branches: [main]
tags: ["v*"]
tags: ["v*", "26.*", "27.*"]
workflow_dispatch:
env:
@@ -57,20 +57,21 @@ jobs:
- name: 安装 Docker CLI(挂宿主 daemon)
run: apk add --no-cache docker-cli buildx >/dev/null
- name: 计算 tag 与平台
- name: 计算 tag(以 APP_VERSION 为唯一版本源)
id: meta
env:
REF: ${{ gitea.ref }}
run: |
case "$REF" in
refs/tags/v*)
VER="${REF#refs/tags/v}"
echo "tags=${IMAGE}:${VER} ${IMAGE}:latest" >> "$GITHUB_OUTPUT"
echo "发布 tag: ${VER} + latest" ;;
*)
echo "tags=${IMAGE}:latest" >> "$GITHUB_OUTPUT"
echo "main 构建: latest" ;;
esac
VER=$(sed -n 's/.*APP_VERSION = "\(.*\)".*/\1/p' server/cmd/server/main.go | head -1)
[ -n "$VER" ] || { echo "无法从 main.go 解析 APP_VERSION" >&2; exit 1; }
echo "APP_VERSION=$VER"
if [[ "$REF" == refs/tags/* ]]; then
# tag 触发:要求 tag 名与 APP_VERSION 一致,防错版发布
TAG_VER="${REF#refs/tags/}"
TAG_VER="${TAG_VER#v}"
[ "$TAG_VER" = "$VER" ] || { echo "tag($TAG_VER) != APP_VERSION($VER),拒绝发布" >&2; exit 1; }
fi
echo "tags=${IMAGE}:${VER} ${IMAGE}:latest" >> "$GITHUB_OUTPUT"
- name: 登录阿里云 ACR
env:
@@ -99,4 +100,8 @@ jobs:
.
- name: 校验远程 manifest(双架构)
run: docker buildx imagetools inspect "${IMAGE}:latest" | grep -E "linux/amd64|linux/arm64"
env:
VERSION: ${{ steps.meta.outputs.version }}
run: |
docker buildx imagetools inspect "${IMAGE}:${VERSION}" | grep -E "linux/amd64|linux/arm64"
echo "推送完成: ${IMAGE}:${VERSION} + ${IMAGE}:latest"
+4 -4
View File
@@ -2,7 +2,7 @@
文件快传
数据库**默认 SQLite 零依赖**(modernc.org/sqlite 纯 Go 驱动,数据文件 `./data/filecodebox.db`),
数据库**默认 SQLite 零依赖**(modernc.org/sqlite 纯 Go 驱动,数据文件 `./data/fileshare.db`),
可选切换 Postgres(`FCB_DB_DRIVER=postgres` + DSN);Redis 为**可选**增强(未配置时自动降级为进程内存缓存)。
存储引擎支持 **本地 / S3 / WebDAV**(运行时热切换,健康检查通过才生效;WebDAV 重点优化:流式、Range、重试、连接复用)。
@@ -37,7 +37,7 @@ docker compose up -d --build
```
- **数据库双路径**:默认 SQLite 零依赖——`docker compose up -d --build` 即可(无需 postgres profile,
数据落 `serverdata` 卷 `/app/data/filecodebox.db`);Postgres 模式——`.env` 设
数据落 `serverdata` 卷 `/app/data/fileshare.db`);Postgres 模式——`.env` 设
`FCB_DB_DRIVER=postgres` 与 `FCB_DB_DSN` 后 `docker compose --profile postgres up -d --build`。
- Redis 可选:`--profile redis` 并在 `.env` 设 `FCB_REDIS_ADDR=redis:6379`;未配置时自动降级为内存缓存。
- 存储引擎切换:`.env` 改 `FCB_STORAGE_ENGINE=s3|webdav` 并带对应 profile 启动:
@@ -51,7 +51,7 @@ docker compose up -d --build
```bash
# 1) 后端(:8466)——默认 SQLite 零依赖,无需任何数据库
cd server
go run ./cmd/server # 数据落 ./data/filecodebox.db;go test ./... 运行单测
go run ./cmd/server # 数据落 ./data/fileshare.db;go test ./... 运行单测
# 2) 后端 Postgres 模式(可选)
docker run -d --name fcb-pg -p 5432:5432 \
@@ -89,7 +89,7 @@ npm run build # 产出 web/dist/,构建时按 deploy/Dockerfil
| 变量 | 必需 | 默认 | 说明 |
|---|---|---|---|
| `FCB_DB_DRIVER` | ❌ | `sqlite` | 数据库驱动:`sqlite` \| `postgres`(v2 需求 ⑧) |
| `FCB_DB_DSN` | 视驱动 | - | postgres:连接串(**必需**);sqlite:文件路径(可空,默认 `./data/filecodebox.db`) |
| `FCB_DB_DSN` | 视驱动 | - | postgres:连接串(**必需**);sqlite:文件路径(可空,默认 `./data/fileshare.db`) |
| `FCB_REDIS_ADDR` | ❌ | 空 | 为空时缓存降级为内存实现;支持 `redis://[:password@]host:port[/db]` / `rediss://` URL 形式 |
| `FCB_REDIS_DB` | ❌ | `0` | Redis 逻辑库号 0-15(URL 显式 `/N` 时以 URL 为准) |
| `FCB_LISTEN` | ❌ | `:8466` | 监听地址 |
+6 -6
View File
@@ -5,17 +5,17 @@
WEB_PORT=8466
# ---- 数据库(需求 ⑧)----
# 默认 SQLite:零依赖,无需任何下方 Postgres 变量(数据落 serverdata 卷 /app/data/filecodebox.db)
# 默认 SQLite:零依赖,无需任何下方 Postgres 变量(数据落 serverdata 卷 /app/data/fileshare.db)
FCB_DB_DRIVER=sqlite
FCB_DB_DSN=
# Postgres 模式(可选):先 `docker compose --profile postgres up -d --build`,再改为:
# FCB_DB_DRIVER=postgres
# FCB_DB_DSN=postgres://filecodebox:filecodebox@postgres:5432/filecodebox?sslmode=disable
# FCB_DB_DSN=postgres://fileshare:fileshare@postgres:5432/fileshare?sslmode=disable
# ---- Postgres(仅 --profile postgres 时使用;生产务必修改默认口令并启用 TLS)----
POSTGRES_USER=filecodebox
POSTGRES_PASSWORD=filecodebox
POSTGRES_DB=filecodebox
POSTGRES_USER=fileshare
POSTGRES_PASSWORD=fileshare
POSTGRES_DB=fileshare
# ---- 存储引擎切换:local | s3 | webdav ----
FCB_STORAGE_ENGINE=local
@@ -47,7 +47,7 @@ FCB_TRUSTED_PROXIES=
# 注意:minioadmin/minioadmin 仅为本机冒烟默认值,对外部署必须修改
# (并在 compose 中删除 minio 的 ports 发布或仅绑定 127.0.0.1)
FCB_S3_ENDPOINT_URL=http://minio:9000
FCB_S3_BUCKET_NAME=filecodebox
FCB_S3_BUCKET_NAME=fileshare
FCB_S3_ACCESS_KEY_ID=minioadmin
FCB_S3_SECRET_ACCESS_KEY=minioadmin
FCB_S3_REGION_NAME=us-east-1
+4 -4
View File
@@ -30,7 +30,7 @@ docker compose up -d --build
# 打开 http://localhost:8466(.env 可用 WEB_PORT 改端口)→ 自动跳转 /setup 完成初始化
```
- 数据落 **`serverdata` 卷**:容器内 `/app/data/filecodebox.db`(WAL 模式,父目录自动创建)。
- 数据落 **`serverdata` 卷**:容器内 `/app/data/fileshare.db`(WAL 模式,父目录自动创建)。
- `.env` 中 Postgres 段变量(`POSTGRES_USER/PASSWORD/DB`)在此模式下不生效,无需修改。
### 路径 ②:Postgres 模式(可选)
@@ -39,7 +39,7 @@ docker compose up -d --build
```dotenv
FCB_DB_DRIVER=postgres
FCB_DB_DSN=postgres://filecodebox:filecodebox@postgres:5432/filecodebox?sslmode=disable
FCB_DB_DSN=postgres://fileshare:fileshare@postgres:5432/fileshare?sslmode=disable
```
2. 带 postgres profile 启动(server 会等 postgres 健康检查通过后再启动):
@@ -65,7 +65,7 @@ docker compose up -d --build
```bash
# S3 引擎(MinIO 冒烟)
docker compose --profile minio up -d --build # .env: FCB_STORAGE_ENGINE=s3
# minio-init 一次性任务自动建桶(mc mb filecodebox)
# minio-init 一次性任务自动建桶(mc mb fileshare)
# WebDAV 引擎(dufs 冒烟,Basic 认证 admin/admin123@/:rw)
docker compose --profile webdav up -d --build # .env: FCB_STORAGE_ENGINE=webdav
@@ -125,7 +125,7 @@ curl -I http://localhost:8466/docs # 200(SPA 回退)
或在 `.env` 设 `FCB_ADMIN_PASSWORD`(≥8 位)让服务启动即自动初始化,
消除「公网上被抢先访问 /setup 接管」的窗口。初始化完成后建议从 `.env` 移除该变量。
3. **修改组件默认凭据**:minio(`minioadmin/minioadmin`)、webdav(`admin/admin123`)、
Postgres(`filecodebox/filecodebox`)默认凭据仅限本机冒烟;对外部署必须修改,
Postgres(`fileshare/fileshare`)默认凭据仅限本机冒烟;对外部署必须修改,
且不建议把 9000/9001/5005 端口发布到公网(compose 中删除对应 `ports` 或仅绑 127.0.0.1)。
4. **Postgres 建议启用 TLS**:默认示例 DSN 为 `sslmode=disable`,生产请改为
`sslmode=require` 及以上。
+9 -9
View File
@@ -5,10 +5,10 @@
# docker compose --profile minio up -d # 可选:S3 引擎冒烟(FCB_STORAGE_ENGINE=s3)
# docker compose --profile webdav up -d # 可选:WebDAV 引擎冒烟(FCB_STORAGE_ENGINE=webdav)
#
# 数据库默认 SQLite(modernc.org/sqlite 纯 Go 驱动,数据落 serverdata 卷 /app/data/filecodebox.db);
# 数据库默认 SQLite(modernc.org/sqlite 纯 Go 驱动,数据落 serverdata 卷 /app/data/fileshare.db);
# postgres 为可选 profile 服务,启用时 server 经 FCB_DB_DRIVER/FCB_DB_DSN 自动接入;
# Redis 同为可选,未配置时服务端内存降级。
name: filecodebox
name: fileshare
services:
postgres:
@@ -18,13 +18,13 @@ services:
# 需要时 docker compose --profile postgres up -d --build
profiles: ["postgres"]
environment:
POSTGRES_USER: ${POSTGRES_USER:-filecodebox}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-filecodebox}
POSTGRES_DB: ${POSTGRES_DB:-filecodebox}
POSTGRES_USER: ${POSTGRES_USER:-fileshare}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-fileshare}
POSTGRES_DB: ${POSTGRES_DB:-fileshare}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-filecodebox}"]
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-fileshare}"]
interval: 5s
timeout: 3s
retries: 20
@@ -52,7 +52,7 @@ services:
start_period: 5s
environment:
# 需求 ⑧:数据库驱动 sqlite(默认,零依赖)| postgres(需 --profile postgres)
# 默认 SQLite:DSN 留空 → 数据库文件落 /app/data/filecodebox.db(serverdata 卷)
# 默认 SQLite:DSN 留空 → 数据库文件落 /app/data/fileshare.db(serverdata 卷)
# postgres 模式:在 .env 设 FCB_DB_DRIVER=postgres 与 FCB_DB_DSN(模板见 deploy/.env.example)
FCB_DB_DRIVER: ${FCB_DB_DRIVER:-sqlite}
FCB_DB_DSN: ${FCB_DB_DSN:-}
@@ -67,7 +67,7 @@ services:
FCB_LOCAL_STORAGE_PATH: /app/data
# S3 引擎(MinIO profile)
FCB_S3_ENDPOINT_URL: ${FCB_S3_ENDPOINT_URL:-}
FCB_S3_BUCKET_NAME: ${FCB_S3_BUCKET_NAME:-filecodebox}
FCB_S3_BUCKET_NAME: ${FCB_S3_BUCKET_NAME:-fileshare}
FCB_S3_ACCESS_KEY_ID: ${FCB_S3_ACCESS_KEY_ID:-minioadmin}
FCB_S3_SECRET_ACCESS_KEY: ${FCB_S3_SECRET_ACCESS_KEY:-minioadmin}
FCB_S3_REGION_NAME: ${FCB_S3_REGION_NAME:-us-east-1}
@@ -122,7 +122,7 @@ services:
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 ${FCB_S3_ACCESS_KEY_ID:-minioadmin} ${FCB_S3_SECRET_ACCESS_KEY:-minioadmin} &&
mc mb --ignore-existing local/${FCB_S3_BUCKET_NAME:-filecodebox} &&
mc mb --ignore-existing local/${FCB_S3_BUCKET_NAME:-fileshare} &&
echo 'MinIO 桶已就绪'"
# WebDAV 冒烟服务器(dufs,简单读写 + Basic 认证)
+1 -1
View File
@@ -1,6 +1,6 @@
# API 概述
文件快传 Go 版(v2.5.6)对外提供一套 REST API,覆盖文本/文件分享、分片上传、
文件快传 Go 版(26.9)对外提供一套 REST API,覆盖文本/文件分享、分片上传、
预签名直传、管理后台与审计日志查询。本文档与 `server/internal/api/` 实际实现逐一对齐,
交互式规范见站内 `/openapi`(源文件 `docs/openapi.yaml`)。
+1 -1
View File
@@ -9,7 +9,7 @@
## 管理员令牌
- 由 `POST /admin/login` 用管理员密码换取,HS256 JWT,默认有效期 **7 天**(`adminSessionExpire`,1~365 整天,v2.5.6 起由 30 天缩短)。
- 由 `POST /admin/login` 用管理员密码换取,HS256 JWT,默认有效期 **7 天**(`adminSessionExpire`,1~365 整天,26.9 起由 30 天缩短)。
- 请求头格式:`Authorization: Bearer <token>`。
- **改密/重置管理员密码会轮换 `jwt_secret`,所有已签发令牌立即失效**(401)。
- 密码存储为 bcrypt(cost 12);历史 `sha256$`/明文格式在登录成功后自动升级重哈希,无需手动迁移。
+1 -1
View File
@@ -52,7 +52,7 @@ curl -s -X POST http://localhost:8466/presign/upload/init \
"code": 200, "msg": "ok",
"data": {
"upload_id": "6a1e…",
"upload_url": "https://minio:9000/filecodebox/share/data/2025/06/01/6a1e…/backup.zip?X-Amz-…",
"upload_url": "https://minio:9000/fileshare/share/data/2025/06/01/6a1e…/backup.zip?X-Amz-…",
"mode": "direct",
"expires_in": 900,
"file_path": "share/data/2025/06/01/6a1e…"
+1 -1
View File
@@ -13,7 +13,7 @@
| 客户端 | `ip` | 可信代理场景解析 XFF 后的真实 IP |
| 终端信息 | `user_agent` | 原始 UA |
| 设备解析 | `device_os` / `device_browser` / `device_type` | 由 UA 解析(如 Windows/Chrome/desktop) |
| 动作 | `action` | `upload`(上传类) / `download`(取件/下载类) / `admin`(管理端敏感操作,v2.5.6 新增) |
| 动作 | `action` | `upload`(上传类) / `download`(取件/下载类) / `admin`(管理端敏感操作,26.9 新增) |
| 结果 | `result` | `success` / `denied`(拒绝:401/403/423/428)/ `failed`(失败:其余 4xx/5xx 或业务报错) |
| 字节数 | `size_bytes` | 文件总大小;`transferred_bytes` 实际传输(**Range 下载只计实际区间字节**;下载由中间件自动统计,上传由各 handler 填充) |
| 耗时 | `duration_ms` | 毫秒 |
+5 -5
View File
@@ -2,14 +2,14 @@
配置分三层:**默认值 → `FCB_*` 环境变量 → 数据库 settings KV(管理端运行时修改)**。
v2 起进程必需的环境变量为空集:数据库默认 **SQLite**(modernc.org/sqlite 纯 Go 驱动,零外部依赖,
DSN 缺省落 `./data/filecodebox.db`);`FCB_DB_DRIVER=postgres` 时 `FCB_DB_DSN` 必需(需求 ⑧)。
DSN 缺省落 `./data/fileshare.db`);`FCB_DB_DRIVER=postgres` 时 `FCB_DB_DSN` 必需(需求 ⑧)。
## 环境变量(进程级)
| 变量 | 必需 | 默认 | 说明 |
|---|---|---|---|
| `FCB_DB_DRIVER` | ❌ | `sqlite` | 数据库驱动:`sqlite` / `postgres`(需求 ⑧) |
| `FCB_DB_DSN` | 视驱动 | `./data/filecodebox.db` | postgres:连接串(**必需**,如 `postgres://user:pass@host:5432/filecodebox?sslmode=disable`);sqlite:数据库文件路径(可空,父目录自动创建) |
| `FCB_DB_DSN` | 视驱动 | `./data/fileshare.db` | postgres:连接串(**必需**,如 `postgres://user:pass@host:5432/filecodebox?sslmode=disable`);sqlite:数据库文件路径(可空,父目录自动创建) |
| `FCB_REDIS_ADDR` | ❌ | 空 | Redis 地址(如 `redis:6379`),也支持 `redis://[:password@]host:port[/db]` / `rediss://`(TLS)URL 形式;**空则缓存降级为进程内存实现**(缓存故障时自动降级为进程内限流计数) |
| `FCB_REDIS_DB` | ❌ | `0` | Redis 逻辑库号 0-15;URL 形式地址显式携带 `/N` 时以 URL 为准 |
| `FCB_ADMIN_PASSWORD` | ❌ | 空 | 设置后服务首次启动即自动初始化管理员(≥8 位,不足告警跳过),消除 `/setup` 被抢占窗口;初始化完成后建议移除 |
@@ -26,7 +26,7 @@ DSN 缺省落 `./data/filecodebox.db`);`FCB_DB_DRIVER=postgres` 时 `FCB_DB_
`FCB_WEBDAV_URL`、`FCB_WEBDAV_USERNAME`、`FCB_WEBDAV_PASSWORD`、`FCB_WEBDAV_ROOT_PATH`。
部署用编排变量(`deploy/.env.example`):`WEB_PORT`(默认 8466)、
`POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB`(默认 filecodebox,仅 `--profile postgres` 时使用)。
`POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB`(默认 fileshare,仅 `--profile postgres` 时使用)。
## 配置项(settings KV,默认值对齐参考实现)
@@ -161,7 +161,7 @@ DSN 缺省落 `./data/filecodebox.db`);`FCB_DB_DRIVER=postgres` 时 `FCB_DB_
"openUpload": true
},
"meta": {
"version": "2.5.6",
"version": "26.9",
"features": { "chunkUpload": false, "guestUpload": true }
}
}
@@ -182,7 +182,7 @@ curl -s http://localhost:8466/api/v1/health
"code": 200, "msg": "ok",
"data": {
"status": "ok",
"version": "2.5.6",
"version": "26.9",
"storage": "local",
"time": "2025-06-01T12:00:00+08:00"
}
+4 -4
View File
@@ -27,7 +27,7 @@ server/
| 变量 | 必需 | 默认 | 说明 |
|---|---|---|---|
| `FCB_DB_DRIVER` | ❌ | `sqlite` | 数据库驱动:`sqlite` \| `postgres`(需求 ⑧) |
| `FCB_DB_DSN` | 视驱动 | `./data/filecodebox.db` | postgres:连接串(**必需**),如 `postgres://user:pass@host:5432/filecodebox?sslmode=disable`;sqlite:数据库文件路径(可空,自动创建 `data/` 目录) |
| `FCB_DB_DSN` | 视驱动 | `./data/fileshare.db` | postgres:连接串(**必需**),如 `postgres://user:pass@host:5432/fileshare?sslmode=disable`;sqlite:数据库文件路径(可空,自动创建 `data/` 目录) |
| `FCB_REDIS_ADDR` | ❌ | 空 | 为空时缓存降级为内存实现 |
| `FCB_LISTEN` | ❌ | `:8466` | 监听地址 |
| `FCB_STORAGE_ENGINE` | ❌ | `local` | `local` \| `s3` \| `webdav` |
@@ -36,7 +36,7 @@ server/
### 数据库模式(需求 ⑧)
- **SQLite(默认)**:`FCB_DB_DRIVER=sqlite`(或缺省)。零 DSN 零依赖启动,数据库文件
默认 `./data/filecodebox.db`(`FCB_DB_DSN` 可覆盖路径;父目录自动创建)。
默认 `./data/fileshare.db`(`FCB_DB_DSN` 可覆盖路径;父目录自动创建)。
连接参数:`busy_timeout=10s` + `WAL` 日志模式 + `foreign_keys=1`(通过 DSN pragma 注入)。
- **Postgres(可选)**:`FCB_DB_DRIVER=postgres` 且必须提供 `FCB_DB_DSN`,否则启动报错。
连接池沿用 v1 参数(32/8、1h 轮换)。
@@ -144,13 +144,13 @@ middleware.AuditRecordRequest(c, auditSvc, model.AuditResultSuccess, "")
## 本地开发
```bash
# 默认 SQLite 模式:零依赖,数据库落 ./data/filecodebox.db
# 默认 SQLite 模式:零依赖,数据库落 ./data/fileshare.db
go run ./cmd/server # 启动于 :8466
curl localhost:8466/api/v1/health
# Postgres 模式(可选)
export FCB_DB_DRIVER=postgres
export FCB_DB_DSN='postgres://postgres:postgres@localhost:5432/filecodebox?sslmode=disable'
export FCB_DB_DSN='postgres://postgres:postgres@localhost:5432/fileshare?sslmode=disable'
go run ./cmd/server
# 双方言单测:sqlite 始终执行;postgres 需真实实例(FCB_TEST_PG_DSN 指向测试库)
+10 -10
View File
@@ -15,19 +15,19 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/api"
"filecodebox/internal/audit"
"filecodebox/internal/cache"
"filecodebox/internal/config"
"filecodebox/internal/database"
"filecodebox/internal/janitor"
"filecodebox/internal/middleware"
"filecodebox/internal/settings"
"filecodebox/internal/storage"
"fileshare/internal/api"
"fileshare/internal/audit"
"fileshare/internal/cache"
"fileshare/internal/config"
"fileshare/internal/database"
"fileshare/internal/janitor"
"fileshare/internal/middleware"
"fileshare/internal/settings"
"fileshare/internal/storage"
)
// APP_VERSION 版本号,对齐参考仓库 VERSION。
const APP_VERSION = "2.5.6"
const APP_VERSION = "26.9"
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
+1 -1
View File
@@ -1,4 +1,4 @@
module filecodebox
module fileshare
go 1.27.1
+6 -6
View File
@@ -12,12 +12,12 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"filecodebox/internal/config"
"filecodebox/internal/middleware"
"filecodebox/internal/model"
"filecodebox/internal/response"
"filecodebox/internal/settings"
"filecodebox/internal/storage"
"fileshare/internal/config"
"fileshare/internal/middleware"
"fileshare/internal/model"
"fileshare/internal/response"
"fileshare/internal/settings"
"fileshare/internal/storage"
)
// minutesDuration 分钟数转 Duration(0 回退 1 分钟,对齐 main.go 语义)。
+4 -4
View File
@@ -16,10 +16,10 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"filecodebox/internal/middleware"
"filecodebox/internal/model"
"filecodebox/internal/response"
"filecodebox/internal/storage"
"fileshare/internal/middleware"
"fileshare/internal/model"
"fileshare/internal/response"
"fileshare/internal/storage"
)
// chunkExpireTTL 分片会话保留时长(M5:预留窗口由 24h 缩短为 2h;
+6 -6
View File
@@ -30,12 +30,12 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"filecodebox/internal/audit"
"filecodebox/internal/config"
"filecodebox/internal/middleware"
"filecodebox/internal/model"
"filecodebox/internal/response"
"filecodebox/internal/storage"
"fileshare/internal/audit"
"fileshare/internal/config"
"fileshare/internal/middleware"
"fileshare/internal/model"
"fileshare/internal/response"
"fileshare/internal/storage"
)
// apiError 统一的业务错误:handler 返回该错误并由 respondError 映射 HTTP 状态。
+2 -2
View File
@@ -6,8 +6,8 @@ import (
"testing"
"time"
"filecodebox/internal/config"
"filecodebox/internal/storage"
"fileshare/internal/config"
"fileshare/internal/storage"
)
// newTestConfig 构造测试配置(defaults 基线,无 KV 覆盖;需求 ⑧ 默认 sqlite,无需真实数据库)。
+7 -7
View File
@@ -15,13 +15,13 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/audit"
"filecodebox/internal/cache"
"filecodebox/internal/config"
"filecodebox/internal/database"
"filecodebox/internal/middleware"
"filecodebox/internal/settings"
"filecodebox/internal/storage"
"fileshare/internal/audit"
"fileshare/internal/cache"
"fileshare/internal/config"
"fileshare/internal/database"
"fileshare/internal/middleware"
"fileshare/internal/settings"
"fileshare/internal/storage"
)
// ============ 测试环境装配(真实 sqlite + 内存缓存 + 本地存储)============
+4 -4
View File
@@ -9,10 +9,10 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"filecodebox/internal/middleware"
"filecodebox/internal/model"
"filecodebox/internal/response"
"filecodebox/internal/storage"
"fileshare/internal/middleware"
"fileshare/internal/model"
"fileshare/internal/response"
"fileshare/internal/storage"
)
// presignSessionExpires 预签名会话有效期(对齐参考 PRESIGN_SESSION_EXPIRES=900 秒)。
+6 -6
View File
@@ -6,12 +6,12 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"filecodebox/internal/audit"
"filecodebox/internal/config"
"filecodebox/internal/middleware"
"filecodebox/internal/response"
"filecodebox/internal/settings"
"filecodebox/internal/storage"
"fileshare/internal/audit"
"fileshare/internal/config"
"fileshare/internal/middleware"
"fileshare/internal/response"
"fileshare/internal/settings"
"fileshare/internal/storage"
)
// Deps API 层共享依赖(main.go 装配后注入)。
+2 -2
View File
@@ -15,8 +15,8 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/model"
"filecodebox/internal/settings"
"fileshare/internal/model"
"fileshare/internal/settings"
)
// postJSON 以 JSON body 调用 POST 端点。
+2 -2
View File
@@ -7,8 +7,8 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/response"
"filecodebox/internal/settings"
"fileshare/internal/response"
"fileshare/internal/settings"
)
// fileSizeUnits 文件大小单位(对齐参考 FILE_SIZE_UNITS)。
+5 -5
View File
@@ -12,11 +12,11 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"filecodebox/internal/audit"
"filecodebox/internal/middleware"
"filecodebox/internal/model"
"filecodebox/internal/response"
"filecodebox/internal/storage"
"fileshare/internal/audit"
"fileshare/internal/middleware"
"fileshare/internal/model"
"fileshare/internal/response"
"fileshare/internal/storage"
)
// nowRFC3339 当前时间的 RFC3339 表示。
+2 -2
View File
@@ -8,8 +8,8 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/response"
web "filecodebox/web"
"fileshare/internal/response"
web "fileshare/web"
)
// registerWeb 注册前端静态资源与 SPA 回退(必须最后注册):
+1 -1
View File
@@ -12,7 +12,7 @@ import (
"gorm.io/gorm"
"filecodebox/internal/model"
"fileshare/internal/model"
)
// Service 审计日志服务。
+1 -1
View File
@@ -18,7 +18,7 @@ const (
AdminSessionExpireMax = 365 * 24 * 60 * 60 // 最大 365 天
// DefaultSQLitePath SQLite 模式默认数据库文件路径(相对运行目录,自动创建 data/)。
DefaultSQLitePath = "./data/filecodebox.db"
DefaultSQLitePath = "./data/fileshare.db"
)
// 数据库驱动常量(需求 ⑧:SQLite 默认、Postgres 可选)。
+2 -2
View File
@@ -19,8 +19,8 @@ import (
"gorm.io/gorm"
"gorm.io/gorm/logger"
"filecodebox/internal/config"
"filecodebox/internal/model"
"fileshare/internal/config"
"fileshare/internal/model"
)
// Options 连接选项(main.go 从 config.Env 装配)。
+2 -2
View File
@@ -18,8 +18,8 @@ import (
"gorm.io/gorm"
"filecodebox/internal/database"
"filecodebox/internal/model"
"fileshare/internal/database"
"fileshare/internal/model"
)
// pgTestDSN 返回 Postgres 测试连接串;未设置 FCB_TEST_PG_DSN 时返回空。
+2 -2
View File
@@ -12,8 +12,8 @@ import (
"gorm.io/gorm"
"filecodebox/internal/model"
"filecodebox/internal/storage"
"fileshare/internal/model"
"fileshare/internal/storage"
)
// chunkSessionMaxAge 未完成分片会话的最大保留时长(预留 TTL 为 2h,
+3 -3
View File
@@ -7,9 +7,9 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/audit"
"filecodebox/internal/model"
"filecodebox/internal/response"
"fileshare/internal/audit"
"fileshare/internal/model"
"fileshare/internal/response"
)
// auditHooks 审计钩子:由 API 层在响应前后填充与落库。
+2 -2
View File
@@ -10,8 +10,8 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/audit"
"filecodebox/internal/model"
"fileshare/internal/audit"
"fileshare/internal/model"
)
type captureSink struct {
+2 -2
View File
@@ -9,8 +9,8 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/audit"
"filecodebox/internal/model"
"fileshare/internal/audit"
"fileshare/internal/model"
)
// memSink 测试用内存落库实现。
+2 -2
View File
@@ -8,7 +8,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt/v5"
"filecodebox/internal/response"
"fileshare/internal/response"
)
// jwtClaims 自定义声明:对齐参考实现(payload 含 is_admin 与 exp)。
@@ -36,7 +36,7 @@ func SignAdminToken(secret string, expires time.Duration) (string, time.Time, er
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(expiresAt),
IssuedAt: jwt.NewNumericDate(time.Now()),
Issuer: "filecodebox",
Issuer: "fileshare",
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/response"
"fileshare/internal/response"
)
const testSecret = "unit-test-secret-0123456789abcdef"
+2 -2
View File
@@ -11,8 +11,8 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/cache"
"filecodebox/internal/response"
"fileshare/internal/cache"
"fileshare/internal/response"
)
// 限流类别(对齐参考 apps/base/utils.py 的 ip_limit)。
@@ -8,7 +8,7 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/cache"
"fileshare/internal/cache"
)
// failingCache 模拟缓存故障(Get/Incr 均返回非 ErrNotFound 错误)。
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/gin-gonic/gin"
"filecodebox/internal/cache"
"fileshare/internal/cache"
)
func rateLimitRouter(rl *RateLimiter, kind string) *gin.Engine {
+3 -3
View File
@@ -10,9 +10,9 @@ import (
"gorm.io/gorm"
"filecodebox/internal/config"
"filecodebox/internal/database"
"filecodebox/internal/settings"
"fileshare/internal/config"
"fileshare/internal/database"
"fileshare/internal/settings"
)
// pgTestDSN 返回 Postgres 测试连接串;未设置 FCB_TEST_PG_DSN 时跳过。
+1 -1
View File
@@ -9,7 +9,7 @@
// 4. schema 同步测试(config schema_test / settings schema_test)
package settings
import "filecodebox/internal/config"
import "fileshare/internal/config"
// —— 键名 re-export(与 config 包保持同一字符串,避免魔法值散落)——
const (
+2 -2
View File
@@ -12,8 +12,8 @@ import (
"gorm.io/gorm"
"filecodebox/internal/config"
"filecodebox/internal/model"
"fileshare/internal/config"
"fileshare/internal/model"
)
// settingsKey 数据库中的配置键(对齐参考实现)。
+2 -2
View File
@@ -30,10 +30,10 @@ type LocalStorage struct {
rootReal string
}
// NewLocalStorage 构造本地引擎。root 为空时使用系统临时目录下的 filecodebox_storage。
// NewLocalStorage 构造本地引擎。root 为空时使用系统临时目录下的 fileshare_storage。
func NewLocalStorage(root string) (*LocalStorage, error) {
if strings.TrimSpace(root) == "" {
root = filepath.Join(os.TempDir(), "filecodebox_storage")
root = filepath.Join(os.TempDir(), "fileshare_storage")
}
abs, err := filepath.Abs(root)
if err != nil {
+1 -1
View File
@@ -32,7 +32,7 @@ func sha256Hex(b []byte) string {
func TestLocalSaveOpenRange(t *testing.T) {
st := newTestLocal(t)
ctx := context.Background()
data := []byte("hello filecodebox 本地引擎 0123456789")
data := []byte("hello fileshare 本地引擎 0123456789")
n, err := st.SaveFile(ctx, bytes.NewReader(data), "2025/08/测试文件.bin")
if err != nil {
@@ -1 +1 @@
import{d as p,u as v,i as h,I as g,c as w,G as s,b as e,t as n,f as t,A as d,w as k,F as y,O as r,q as m,B as R,o as V}from"./index-DYsKpclu.js";import{_ as x}from"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";import{u as A}from"./auth-B7MDTgxJ.js";import"./admin-DEOkRyTC.js";const B={class:"admin-shell"},C={class:"admin-aside"},b={class:"aside-title"},L=["aria-label"],N={class:"admin-main"},q=p({__name:"AdminLayout",setup(S){const{t:a}=v(),u=R(),o=A(),l=h();g(async()=>{o.isAuthed&&!o.checked&&await o.verify()});async function _(){await o.logout(),l.success(a("admin.nav.loggedOut")),u.replace({name:"admin-login"})}return(F,c)=>{const i=r("RouterLink"),f=r("RouterView");return V(),w(y,null,[s(x),e("div",B,[e("aside",C,[e("div",b,n(t(a)("admin.nav.title")),1),e("nav",{class:"aside-menu","aria-label":t(a)("admin.nav.menu")},[s(i,{to:{name:"admin-files"}},{default:d(()=>[m("📁 "+n(t(a)("admin.nav.files")),1)]),_:1}),s(i,{to:{name:"admin-audit"}},{default:d(()=>[m("🛡 "+n(t(a)("admin.nav.audit")),1)]),_:1}),s(i,{to:{name:"admin-settings"}},{default:d(()=>[m("⚙️ "+n(t(a)("admin.nav.settings")),1)]),_:1}),c[0]||(c[0]=e("div",{class:"aside-sep"},null,-1)),e("a",{href:"#",onClick:k(_,["prevent"])},"🚪 "+n(t(a)("admin.nav.logout")),1)],8,L)]),e("div",N,[s(f)])])],64)}}});export{q as default};
import{d as p,u as v,i as h,I as g,c as w,G as s,b as e,t as n,f as t,A as d,w as k,F as y,O as r,q as m,B as R,o as V}from"./index-BKnWAKao.js";import{_ as x}from"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";import{u as A}from"./auth-Cp2GGuZy.js";import"./admin-KnbIpHLF.js";const B={class:"admin-shell"},C={class:"admin-aside"},b={class:"aside-title"},L=["aria-label"],N={class:"admin-main"},q=p({__name:"AdminLayout",setup(S){const{t:a}=v(),u=R(),o=A(),l=h();g(async()=>{o.isAuthed&&!o.checked&&await o.verify()});async function _(){await o.logout(),l.success(a("admin.nav.loggedOut")),u.replace({name:"admin-login"})}return(F,c)=>{const i=r("RouterLink"),f=r("RouterView");return V(),w(y,null,[s(x),e("div",B,[e("aside",C,[e("div",b,n(t(a)("admin.nav.title")),1),e("nav",{class:"aside-menu","aria-label":t(a)("admin.nav.menu")},[s(i,{to:{name:"admin-files"}},{default:d(()=>[m("📁 "+n(t(a)("admin.nav.files")),1)]),_:1}),s(i,{to:{name:"admin-audit"}},{default:d(()=>[m("🛡 "+n(t(a)("admin.nav.audit")),1)]),_:1}),s(i,{to:{name:"admin-settings"}},{default:d(()=>[m("⚙️ "+n(t(a)("admin.nav.settings")),1)]),_:1}),c[0]||(c[0]=e("div",{class:"aside-sep"},null,-1)),e("a",{href:"#",onClick:k(_,["prevent"])},"🚪 "+n(t(a)("admin.nav.logout")),1)],8,L)]),e("div",N,[s(f)])])],64)}}});export{q as default};
@@ -1 +1 @@
import{d as U,u as I,i as M,I as S,c as u,b as t,t as a,f as l,C as r,Z as w,D as v,w as $,q as x,F as E,r as F,G as q,j as g,R as T,H as R,K as j,e as B,$ as H,s as _,o as c,_ as L}from"./index-DYsKpclu.js";import{e as O}from"./admin-DEOkRyTC.js";import{_ as G}from"./Pager.vue_vue_type_script_setup_true_lang-B3GeH0mY.js";const K={class:"toolbar"},P={class:"page-title"},Z={class:"page-sub"},J={value:""},Q={value:"upload"},W={value:"download"},X={value:""},Y={value:"success"},tt={value:"failed"},et={value:"denied"},at={class:"btn",type:"submit"},nt={key:0,class:"loading-block"},lt={key:1,class:"card empty"},st={key:2,class:"table-wrap"},it={class:"table"},ot=["title"],dt={class:"code-cell"},ut={class:"ip-cell"},ct=["title"],rt=U({__name:"AuditView",setup(mt){const{t:n}=I(),z=M(),p=g([]),b=g(0),f=g(!1),o=T({action:"",result:"",ip:"",start:"",end:""}),d=T({page:1,size:20});function h(s,i=!1){if(!s)return"";const e=new Date(s);return Number.isNaN(e.getTime())?"":(i&&e.setHours(23,59,59,999),e.toISOString())}async function m(){f.value=!0;try{const s=await O({page:d.page,size:d.size,action:o.action||void 0,result:o.result||void 0,ip:o.ip.trim()||void 0,startTime:h(o.start)||void 0,endTime:h(o.end,!0)||void 0});p.value=s.data,b.value=s.total}catch(s){z.error(s instanceof R?s.msg:n("admin.audit.loadFailed"))}finally{f.value=!1}}function D(){d.page=1,m()}function V(){o.action="",o.result="",o.ip="",o.start="",o.end="",d.page=1,m()}function k(s,i){d.page=s,d.size=i,m()}function A(s){return s==="upload"?n("admin.audit.actionUpload"):s==="download"?n("admin.audit.actionDownload"):s||"-"}function y(s){return s==="success"?{cls:"badge-success",text:n("common.success")}:s==="denied"?{cls:"badge-warn",text:n("common.denied")}:s==="failed"?{cls:"badge-danger",text:n("common.failed")}:{cls:"badge-muted",text:s||"-"}}function C(s){const i=[s.deviceOs,s.deviceBrowser].filter(Boolean),e=s.deviceType?` · ${s.deviceType}`:"";return i.length?i.join(" · ")+e:"-"}function N(s){const i=s.transferredBytes;if(i==null)return"-";const e=s.sizeBytes;return e!=null&&e!==i?`${_(i)} / ${_(e)}`:_(i)}return S(m),(s,i)=>(c(),u("div",null,[t("div",K,[t("div",null,[t("h2",P,a(l(n)("admin.audit.title")),1),t("p",Z,a(l(n)("admin.audit.subtitle")),1)])]),t("form",{class:"filter-bar",onSubmit:$(D,["prevent"])},[t("label",null,[t("span",null,a(l(n)("admin.audit.action")),1),r(t("select",{"onUpdate:modelValue":i[0]||(i[0]=e=>o.action=e),class:"select"},[t("option",J,a(l(n)("common.all")),1),t("option",Q,a(l(n)("admin.audit.actionUpload")),1),t("option",W,a(l(n)("admin.audit.actionDownload")),1)],512),[[w,o.action]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.result")),1),r(t("select",{"onUpdate:modelValue":i[1]||(i[1]=e=>o.result=e),class:"select"},[t("option",X,a(l(n)("common.all")),1),t("option",Y,a(l(n)("common.success")),1),t("option",tt,a(l(n)("common.failed")),1),t("option",et,a(l(n)("common.denied")),1)],512),[[w,o.result]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterIp")),1),r(t("input",{"onUpdate:modelValue":i[2]||(i[2]=e=>o.ip=e),class:"input",placeholder:"10.0.0.1",style:{"max-width":"150px"}},null,512),[[v,o.ip]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterStart")),1),r(t("input",{"onUpdate:modelValue":i[3]||(i[3]=e=>o.start=e),class:"input",type:"datetime-local"},null,512),[[v,o.start]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterEnd")),1),r(t("input",{"onUpdate:modelValue":i[4]||(i[4]=e=>o.end=e),class:"input",type:"datetime-local"},null,512),[[v,o.end]])]),t("button",at,a(l(n)("common.query")),1),t("button",{class:"btn btn-ghost",type:"button",onClick:V},a(l(n)("common.reset")),1)],32),f.value?(c(),u("div",nt,[i[5]||(i[5]=t("span",{class:"spin","aria-hidden":"true"},null,-1)),x(" "+a(l(n)("common.loading")),1)])):p.value.length?(c(),u("div",st,[t("table",it,[t("thead",null,[t("tr",null,[t("th",null,a(l(n)("admin.audit.colTime")),1),t("th",null,a(l(n)("admin.audit.colAction")),1),t("th",null,a(l(n)("admin.audit.colResult")),1),t("th",null,a(l(n)("admin.audit.colFile")),1),t("th",null,a(l(n)("admin.audit.colCode")),1),t("th",null,a(l(n)("admin.audit.colBytes")),1),t("th",null,a(l(n)("admin.audit.colIp")),1),t("th",null,a(l(n)("admin.audit.colDevice")),1),t("th",null,a(l(n)("admin.audit.colDuration")),1),t("th",null,a(l(n)("admin.audit.colUaError")),1)])]),t("tbody",null,[(c(!0),u(E,null,F(p.value,e=>(c(),u("tr",{key:e.id},[t("td",null,a(l(j)(e.createdAt)),1),t("td",null,[t("span",{class:B(["badge",e.action==="upload"?"":"badge-muted"])},a(A(e.action)),3)]),t("td",null,[t("span",{class:B(["badge",y(e.result).cls])},a(y(e.result).text),3)]),t("td",{class:"wrap",title:e.fileName},a(e.fileName||"-"),9,ot),t("td",dt,a(e.fileCode||"-"),1),t("td",null,a(N(e)),1),t("td",ut,a(e.ip||"-"),1),t("td",null,a(C(e)),1),t("td",null,a(l(H)(e.durationMs)),1),t("td",{class:"wrap ua-cell",title:e.errorMsg||e.userAgent},a(e.errorMsg||e.userAgent||"-"),9,ct)]))),128))])])])):(c(),u("div",lt,[i[6]||(i[6]=t(Line truncated
import{d as U,u as I,i as M,I as S,c as u,b as t,t as a,f as l,C as r,Z as w,D as v,w as $,q as x,F as E,r as F,G as q,j as g,R as T,H as R,K as j,e as B,$ as H,s as _,o as c,_ as L}from"./index-BKnWAKao.js";import{e as O}from"./admin-KnbIpHLF.js";import{_ as G}from"./Pager.vue_vue_type_script_setup_true_lang-DZv_x-2P.js";const K={class:"toolbar"},P={class:"page-title"},Z={class:"page-sub"},J={value:""},Q={value:"upload"},W={value:"download"},X={value:""},Y={value:"success"},tt={value:"failed"},et={value:"denied"},at={class:"btn",type:"submit"},nt={key:0,class:"loading-block"},lt={key:1,class:"card empty"},st={key:2,class:"table-wrap"},it={class:"table"},ot=["title"],dt={class:"code-cell"},ut={class:"ip-cell"},ct=["title"],rt=U({__name:"AuditView",setup(mt){const{t:n}=I(),z=M(),p=g([]),b=g(0),f=g(!1),o=T({action:"",result:"",ip:"",start:"",end:""}),d=T({page:1,size:20});function h(s,i=!1){if(!s)return"";const e=new Date(s);return Number.isNaN(e.getTime())?"":(i&&e.setHours(23,59,59,999),e.toISOString())}async function m(){f.value=!0;try{const s=await O({page:d.page,size:d.size,action:o.action||void 0,result:o.result||void 0,ip:o.ip.trim()||void 0,startTime:h(o.start)||void 0,endTime:h(o.end,!0)||void 0});p.value=s.data,b.value=s.total}catch(s){z.error(s instanceof R?s.msg:n("admin.audit.loadFailed"))}finally{f.value=!1}}function D(){d.page=1,m()}function V(){o.action="",o.result="",o.ip="",o.start="",o.end="",d.page=1,m()}function k(s,i){d.page=s,d.size=i,m()}function A(s){return s==="upload"?n("admin.audit.actionUpload"):s==="download"?n("admin.audit.actionDownload"):s||"-"}function y(s){return s==="success"?{cls:"badge-success",text:n("common.success")}:s==="denied"?{cls:"badge-warn",text:n("common.denied")}:s==="failed"?{cls:"badge-danger",text:n("common.failed")}:{cls:"badge-muted",text:s||"-"}}function C(s){const i=[s.deviceOs,s.deviceBrowser].filter(Boolean),e=s.deviceType?` · ${s.deviceType}`:"";return i.length?i.join(" · ")+e:"-"}function N(s){const i=s.transferredBytes;if(i==null)return"-";const e=s.sizeBytes;return e!=null&&e!==i?`${_(i)} / ${_(e)}`:_(i)}return S(m),(s,i)=>(c(),u("div",null,[t("div",K,[t("div",null,[t("h2",P,a(l(n)("admin.audit.title")),1),t("p",Z,a(l(n)("admin.audit.subtitle")),1)])]),t("form",{class:"filter-bar",onSubmit:$(D,["prevent"])},[t("label",null,[t("span",null,a(l(n)("admin.audit.action")),1),r(t("select",{"onUpdate:modelValue":i[0]||(i[0]=e=>o.action=e),class:"select"},[t("option",J,a(l(n)("common.all")),1),t("option",Q,a(l(n)("admin.audit.actionUpload")),1),t("option",W,a(l(n)("admin.audit.actionDownload")),1)],512),[[w,o.action]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.result")),1),r(t("select",{"onUpdate:modelValue":i[1]||(i[1]=e=>o.result=e),class:"select"},[t("option",X,a(l(n)("common.all")),1),t("option",Y,a(l(n)("common.success")),1),t("option",tt,a(l(n)("common.failed")),1),t("option",et,a(l(n)("common.denied")),1)],512),[[w,o.result]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterIp")),1),r(t("input",{"onUpdate:modelValue":i[2]||(i[2]=e=>o.ip=e),class:"input",placeholder:"10.0.0.1",style:{"max-width":"150px"}},null,512),[[v,o.ip]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterStart")),1),r(t("input",{"onUpdate:modelValue":i[3]||(i[3]=e=>o.start=e),class:"input",type:"datetime-local"},null,512),[[v,o.start]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterEnd")),1),r(t("input",{"onUpdate:modelValue":i[4]||(i[4]=e=>o.end=e),class:"input",type:"datetime-local"},null,512),[[v,o.end]])]),t("button",at,a(l(n)("common.query")),1),t("button",{class:"btn btn-ghost",type:"button",onClick:V},a(l(n)("common.reset")),1)],32),f.value?(c(),u("div",nt,[i[5]||(i[5]=t("span",{class:"spin","aria-hidden":"true"},null,-1)),x(" "+a(l(n)("common.loading")),1)])):p.value.length?(c(),u("div",st,[t("table",it,[t("thead",null,[t("tr",null,[t("th",null,a(l(n)("admin.audit.colTime")),1),t("th",null,a(l(n)("admin.audit.colAction")),1),t("th",null,a(l(n)("admin.audit.colResult")),1),t("th",null,a(l(n)("admin.audit.colFile")),1),t("th",null,a(l(n)("admin.audit.colCode")),1),t("th",null,a(l(n)("admin.audit.colBytes")),1),t("th",null,a(l(n)("admin.audit.colIp")),1),t("th",null,a(l(n)("admin.audit.colDevice")),1),t("th",null,a(l(n)("admin.audit.colDuration")),1),t("th",null,a(l(n)("admin.audit.colUaError")),1)])]),t("tbody",null,[(c(!0),u(E,null,F(p.value,e=>(c(),u("tr",{key:e.id},[t("td",null,a(l(j)(e.createdAt)),1),t("td",null,[t("span",{class:B(["badge",e.action==="upload"?"":"badge-muted"])},a(A(e.action)),3)]),t("td",null,[t("span",{class:B(["badge",y(e.result).cls])},a(y(e.result).text),3)]),t("td",{class:"wrap",title:e.fileName},a(e.fileName||"-"),9,ot),t("td",dt,a(e.fileCode||"-"),1),t("td",null,a(N(e)),1),t("td",ut,a(e.ip||"-"),1),t("td",null,a(C(e)),1),t("td",null,a(l(H)(e.durationMs)),1),t("td",{class:"wrap ua-cell",title:e.errorMsg||e.userAgent},a(e.errorMsg||e.userAgent||"-"),9,ct)]))),128))])])])):(c(),u("div",lt,[i[6]||(i[6]=t(Line truncated
@@ -1 +1 @@
import{d as R,u as V,i as z,j as y,I,J as $,z as E,A as O,N as W,b as c,C as j,D as G,f as h,c as l,q as x,t as u,F as C,r as A,w as T,e as M,g as S,h as H,B as K,o as r}from"./index-DYsKpclu.js";import{P as U}from"./PageShell-D87JkPkG.js";import{d as B,a as J,l as Q}from"./docsSource-BXkkn0HE.js";import{k as X}from"./markdown-B5D8JARp.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";function Y(m,o){const n=m.toLowerCase().replace(/[^\p{L}\p{N}\s-]/gu,"").trim().replace(/\s+/g,"-")||"section";let d=n,i=2;for(;o.has(d);)d=`${n}-${i++}`;return o.add(d),d}const Z=new Set(["script","style","iframe","object","embed","form","link","meta","base","svg","math","frame","frameset","applet","template","noscript","title"]),tt=new Set(["srcdoc","sandbox","formaction","action","xlink:href","srcset","poster","background","dynsrc","lowsrc","data"]);function et(m,o){const n=m.trim();return o&&/^data:image\//i.test(n)?!0:/^(https?:|mailto:|\/|#|\.\/)/i.test(n)||!/^[a-z][a-z0-9+.-]*:/i.test(n)}function st(m){const o=new DOMParser().parseFromString(m,"text/html");for(const n of[...o.body.querySelectorAll("*")]){const d=n.tagName.toLowerCase();if(Z.has(d)){n.remove();continue}for(const i of[...n.attributes]){const e=i.name.toLowerCase();if(e.startsWith("on")||tt.has(e)){n.removeAttribute(i.name);continue}(e==="href"||e==="src"||e.endsWith(":src")||e.endsWith(":href"))&&!et(i.value,e==="src")&&n.removeAttribute(i.name)}}return o.body.innerHTML}function ot(m){const o=X.parse(m,{gfm:!0,breaks:!1}),n=new DOMParser().parseFromString(o,"text/html");for(const e of[...n.body.querySelectorAll("a[href]")]){const f=e.getAttribute("href")??"";/^https?:\/\//i.test(f)&&(e.setAttribute("target","_blank"),e.setAttribute("rel","noopener noreferrer"))}const d=new Set,i=[];for(const e of[...n.body.querySelectorAll("h1, h2, h3")]){const f=Number(e.tagName.substring(1)),p=(e.textContent??"").trim();if(!p)continue;const v=Y(p,d);e.setAttribute("id",v),f>=2&&i.push({id:v,text:p,level:f})}return{html:st(n.body.innerHTML),toc:i}}const nt={class:"docs-shell"},at={class:"docs-sidebar"},rt=["placeholder"],lt={key:0,class:"empty",style:{padding:"20px 8px"}},ct={class:"hint"},it=["aria-label"],ut=["onClick"],dt={key:0,class:"badge badge-muted",style:{"margin-left":"6px"}},ht={key:0,class:"hint",style:{padding:"0 11px"}},mt={key:1,class:"doc-toc"},ft={class:"toc-title"},pt=["href","onClick"],vt={class:"docs-content"},gt={key:0,class:"loading-block"},yt={key:1,class:"empty"},_t={style:{"font-weight":"600",color:"var(--c-text)"}},bt={class:"hint",style:{"max-width":"420px",margin:"0 auto"}},kt={key:2,class:"empty"},wt=["innerHTML"],At=R({__name:"DocsView",setup(m){const{t:o}=V(),n=W(),d=K(),i=z(),e=y([...B]),f=y(""),p=y(""),v=y(""),_=y([]),k=y(!1),b=y("");I(async()=>{const a=await J();a.length&&(e.value=[...B,...a]),L()});const N=()=>{if(typeof n.params.slug=="string")return n.params.slug;const a=n.query.p;return typeof a=="string"?a:""};async function L(){const a=N(),s=e.value;if(!s.length)return;const t=s.find(g=>g.slug===a)??s[0];if(t&&!(t.slug===f.value&&p.value)){f.value=t.slug,k.value=!0;try{p.value=await Q(t);const{html:g,toc:P}=ot(p.value);v.value=g,_.value=P}catch{v.value="",_.value=[],i.error(o("docs.loadFailed",{title:t.title}))}finally{k.value=!1}}}$(()=>n.fullPath,()=>{L()});function F(a){d.push({name:"docs-detail",params:{slug:a}})}function q(a){document.getElementById(a)?.scrollIntoView({behavior:"smooth"})}const D=H(()=>{const a=b.value.trim().toLowerCase();return a?e.value.map(s=>{const g=(s.embedded??"").toLowerCase().split(a).length-1+(s.title.toLowerCase().includes(a)?1:0);return{doc:s,hits:g}}).filter(s=>s.hits>0).sort((s,t)=>t.hits-s.hits):e.value.map(s=>({doc:s,hits:-1}))}),w=H(()=>b.value.trim().length>0);return(a,s)=>(r(),E(U,null,{default:O(()=>[c("div",nt,[c("aside",at,[j(c("input",{"onUpdate:modelValue":s[0]||(s[0]=t=>b.value=t),class:"input docs-search",placeholder:h(o)("docs.searchPlaceholder")},null,8,rt),[[G,b.value]]),e.value.length?(r(),l(C,{key:1},[c("nav",{class:"doc-list","aria-label":h(o)("docs.sidebar")},[(r(!0),l(C,null,A(D.value,t=>(r(),l("a",{key:t.doc.slug,class:M({active:t.doc.slug===f.value}),href:"#",onClick:T(g=>F(t.doc.slug),["prevent"])},[x(u(t.doc.title)+" ",1),w.value&&t.hits>0?(r(),l("span",dt,u(t.hits),1)):S("",!0)],10,ut))),128))],8,it),w.value&&!D.value.length?(r(),l("p",ht,u(h(o)("docs.noMatch")),1)):S("",!0),_.value.length&&!w.value?(r(),l("div",mt,[c("div",ft,u(h(o)("docs.tocTitle")),1),(r(!0),l(C,null,A(_.value,t=>(r(),l("a",{key:t.id,href:`#${t.id}`,class:M({"lvl-3":t.level>=3}),onClick:T(g=>q(t.id),["prevent"])},u(t.text),11,pt))),128))])):S("",!0)],64)):(r(),l("div",lt,[x(u(h(o)("docs.notGenerated")),1),s[1]||(s[1]=c("br",null,null,-1)),c("span",ct,u(h(o)("docs.buildHint")),1)]))]),c("article",vt,[k.value?(r(),l("div",gt,[s[2]||(s[2]=c("span",{class:"spin","aria-hidden":"true"},null,-1)),x(" "+u(h(o)("docs.loading")),1)])):e.value.length?v.value?(r(),l("div",{key:3,class:"markdoLine truncated
import{d as R,u as V,i as z,j as y,I,J as $,z as E,A as O,N as W,b as c,C as j,D as G,f as h,c as l,q as x,t as u,F as C,r as A,w as T,e as M,g as S,h as H,B as K,o as r}from"./index-BKnWAKao.js";import{P as U}from"./PageShell-CBo29Oot.js";import{d as B,a as J,l as Q}from"./docsSource-Df5ur5C4.js";import{k as X}from"./markdown-B5D8JARp.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";function Y(m,o){const n=m.toLowerCase().replace(/[^\p{L}\p{N}\s-]/gu,"").trim().replace(/\s+/g,"-")||"section";let d=n,i=2;for(;o.has(d);)d=`${n}-${i++}`;return o.add(d),d}const Z=new Set(["script","style","iframe","object","embed","form","link","meta","base","svg","math","frame","frameset","applet","template","noscript","title"]),tt=new Set(["srcdoc","sandbox","formaction","action","xlink:href","srcset","poster","background","dynsrc","lowsrc","data"]);function et(m,o){const n=m.trim();return o&&/^data:image\//i.test(n)?!0:/^(https?:|mailto:|\/|#|\.\/)/i.test(n)||!/^[a-z][a-z0-9+.-]*:/i.test(n)}function st(m){const o=new DOMParser().parseFromString(m,"text/html");for(const n of[...o.body.querySelectorAll("*")]){const d=n.tagName.toLowerCase();if(Z.has(d)){n.remove();continue}for(const i of[...n.attributes]){const e=i.name.toLowerCase();if(e.startsWith("on")||tt.has(e)){n.removeAttribute(i.name);continue}(e==="href"||e==="src"||e.endsWith(":src")||e.endsWith(":href"))&&!et(i.value,e==="src")&&n.removeAttribute(i.name)}}return o.body.innerHTML}function ot(m){const o=X.parse(m,{gfm:!0,breaks:!1}),n=new DOMParser().parseFromString(o,"text/html");for(const e of[...n.body.querySelectorAll("a[href]")]){const f=e.getAttribute("href")??"";/^https?:\/\//i.test(f)&&(e.setAttribute("target","_blank"),e.setAttribute("rel","noopener noreferrer"))}const d=new Set,i=[];for(const e of[...n.body.querySelectorAll("h1, h2, h3")]){const f=Number(e.tagName.substring(1)),p=(e.textContent??"").trim();if(!p)continue;const v=Y(p,d);e.setAttribute("id",v),f>=2&&i.push({id:v,text:p,level:f})}return{html:st(n.body.innerHTML),toc:i}}const nt={class:"docs-shell"},at={class:"docs-sidebar"},rt=["placeholder"],lt={key:0,class:"empty",style:{padding:"20px 8px"}},ct={class:"hint"},it=["aria-label"],ut=["onClick"],dt={key:0,class:"badge badge-muted",style:{"margin-left":"6px"}},ht={key:0,class:"hint",style:{padding:"0 11px"}},mt={key:1,class:"doc-toc"},ft={class:"toc-title"},pt=["href","onClick"],vt={class:"docs-content"},gt={key:0,class:"loading-block"},yt={key:1,class:"empty"},_t={style:{"font-weight":"600",color:"var(--c-text)"}},bt={class:"hint",style:{"max-width":"420px",margin:"0 auto"}},kt={key:2,class:"empty"},wt=["innerHTML"],At=R({__name:"DocsView",setup(m){const{t:o}=V(),n=W(),d=K(),i=z(),e=y([...B]),f=y(""),p=y(""),v=y(""),_=y([]),k=y(!1),b=y("");I(async()=>{const a=await J();a.length&&(e.value=[...B,...a]),L()});const N=()=>{if(typeof n.params.slug=="string")return n.params.slug;const a=n.query.p;return typeof a=="string"?a:""};async function L(){const a=N(),s=e.value;if(!s.length)return;const t=s.find(g=>g.slug===a)??s[0];if(t&&!(t.slug===f.value&&p.value)){f.value=t.slug,k.value=!0;try{p.value=await Q(t);const{html:g,toc:P}=ot(p.value);v.value=g,_.value=P}catch{v.value="",_.value=[],i.error(o("docs.loadFailed",{title:t.title}))}finally{k.value=!1}}}$(()=>n.fullPath,()=>{L()});function F(a){d.push({name:"docs-detail",params:{slug:a}})}function q(a){document.getElementById(a)?.scrollIntoView({behavior:"smooth"})}const D=H(()=>{const a=b.value.trim().toLowerCase();return a?e.value.map(s=>{const g=(s.embedded??"").toLowerCase().split(a).length-1+(s.title.toLowerCase().includes(a)?1:0);return{doc:s,hits:g}}).filter(s=>s.hits>0).sort((s,t)=>t.hits-s.hits):e.value.map(s=>({doc:s,hits:-1}))}),w=H(()=>b.value.trim().length>0);return(a,s)=>(r(),E(U,null,{default:O(()=>[c("div",nt,[c("aside",at,[j(c("input",{"onUpdate:modelValue":s[0]||(s[0]=t=>b.value=t),class:"input docs-search",placeholder:h(o)("docs.searchPlaceholder")},null,8,rt),[[G,b.value]]),e.value.length?(r(),l(C,{key:1},[c("nav",{class:"doc-list","aria-label":h(o)("docs.sidebar")},[(r(!0),l(C,null,A(D.value,t=>(r(),l("a",{key:t.doc.slug,class:M({active:t.doc.slug===f.value}),href:"#",onClick:T(g=>F(t.doc.slug),["prevent"])},[x(u(t.doc.title)+" ",1),w.value&&t.hits>0?(r(),l("span",dt,u(t.hits),1)):S("",!0)],10,ut))),128))],8,it),w.value&&!D.value.length?(r(),l("p",ht,u(h(o)("docs.noMatch")),1)):S("",!0),_.value.length&&!w.value?(r(),l("div",mt,[c("div",ft,u(h(o)("docs.tocTitle")),1),(r(!0),l(C,null,A(_.value,t=>(r(),l("a",{key:t.id,href:`#${t.id}`,class:M({"lvl-3":t.level>=3}),onClick:T(g=>q(t.id),["prevent"])},u(t.text),11,pt))),128))])):S("",!0)],64)):(r(),l("div",lt,[x(u(h(o)("docs.notGenerated")),1),s[1]||(s[1]=c("br",null,null,-1)),c("span",ct,u(h(o)("docs.buildHint")),1)]))]),c("article",vt,[k.value?(r(),l("div",gt,[s[2]||(s[2]=c("span",{class:"spin","aria-hidden":"true"},null,-1)),x(" "+u(h(o)("docs.loading")),1)])):e.value.length?v.value?(r(),l("div",{key:3,class:"markdoLine truncated
@@ -1 +1 @@
import{d as N,I as V,P as Y,z as J,c as f,w as $,b as e,t as a,Q as X,n as Z,g as L,T as ee,o as p,u as te,a as ne,i as ie,f as l,C as S,D as T,q as z,F as se,r as le,G as D,A as ae,j as _,R as A,H as x,e as B,s as oe,K as E,k as w,p as de,M as ce}from"./index-DYsKpclu.js";import{a as ue,b as re,c as me,d as pe}from"./admin-DEOkRyTC.js";import{p as fe}from"./share-CqDDLJWI.js";import{_ as he}from"./Pager.vue_vue_type_script_setup_true_lang-B3GeH0mY.js";const be=["aria-label"],ve={class:"modal-title"},ge=N({__name:"AppModal",props:{open:{type:Boolean},title:{},width:{}},emits:["close"],setup(h,{emit:t}){const k=h,d=t;function r(b){b.key==="Escape"&&k.open&&d("close")}return V(()=>document.addEventListener("keydown",r)),Y(()=>document.removeEventListener("keydown",r)),(b,g)=>(p(),J(ee,{to:"body"},[h.open?(p(),f("div",{key:0,class:"modal-overlay",onClick:g[0]||(g[0]=$(m=>d("close"),["self"]))},[e("div",{class:"modal",style:Z(h.width?{maxWidth:h.width}:void 0),role:"dialog","aria-modal":"true","aria-label":h.title},[e("h3",ve,a(h.title),1),X(b.$slots,"default")],12,be)])):L("",!0)]))}}),ye={class:"toolbar"},_e={class:"page-title"},xe={class:"page-sub"},ke=["placeholder"],Ce={class:"btn",type:"submit"},Se=["disabled","title"],Te={key:0,class:"loading-block"},$e={key:1,class:"card empty"},Fe={key:2,class:"table-wrap"},ze={class:"table"},De={style:{width:"36px"}},Ae=["checked"],Be={style:{"min-width":"210px"}},Ee=["checked","onChange"],we={class:"code-cell"},Ne=["title"],Ve={class:"row-actions"},Le=["onClick"],Me=["onClick"],Ue=["onClick"],Ie=["onClick"],Re=["onClick"],He={class:"field"},Pe={class:"field"},Oe={class:"field"},je=["value"],qe={class:"modal-actions"},Ke=["disabled"],Je=N({__name:"FilesView",setup(h){const{t}=te(),k=ne(),d=ie(),r=_([]),b=_(0),g=_(!1),m=A({page:1,size:10,keyword:""}),c=_(new Set);async function v(){g.value=!0;try{const n=await ue({...m});r.value=n.data,b.value=n.total,c.value=new Set}catch(n){d.error(n instanceof x?n.msg:t("admin.files.loadFailed"))}finally{g.value=!1}}function M(){m.page=1,v()}function U(n,i){m.page=n,m.size=i,v()}function I(n){const i=new Set(c.value);i.has(n)?i.delete(n):i.add(n),c.value=i}const F=()=>r.value.length>0&&r.value.every(n=>c.value.has(n.id));function R(){c.value=F()?new Set:new Set(r.value.map(n=>n.id))}async function H(n){if(window.confirm(t("admin.files.confirmDelete",{name:n.name||n.code})))try{await me(n.id),d.success(t("admin.files.deleteSuccess")),v()}catch(i){d.error(i instanceof x?i.msg:t("admin.files.deleteFailed"))}}async function P(){if(c.value.size&&window.confirm(t("admin.files.confirmBatchDelete",{count:c.value.size})))try{await re([...c.value]),d.success(t("admin.files.batchDeleteSuccess")),v()}catch(n){d.error(n instanceof x?n.msg:t("admin.files.batchDeleteFailed"))}}const y=_(!1),C=_(!1),o=A({id:0,code:"",expired_at:"",expired_count:null,original:null});function O(n){o.id=n.id,o.code=n.code,o.original=n,o.expired_at=n.expiredAt?j(n.expiredAt):"",o.expired_count=n.expiredCount,y.value=!0}function j(n){const i=new Date(n);if(Number.isNaN(i.getTime()))return"";const s=u=>`${u}`.padStart(2,"0");return`${i.getFullYear()}-${s(i.getMonth()+1)}-${s(i.getDate())}T${s(i.getHours())}:${s(i.getMinutes())}`}async function q(){const n=o.original;if(!n)return;const i={id:o.id};o.code.trim()&&o.code.trim()!==n.code&&(i.code=o.code.trim());const s=o.expired_count;if(s!==null&&s!==n.expiredCount&&(i.expired_count=s),o.expired_at){const u=new Date(o.expired_at).toISOString();u!==n.expiredAt&&(i.expired_at=u)}if(Object.keys(i).length===1){d.info(t("admin.files.nothingChanged")),y.value=!1;return}C.value=!0;try{await pe(i),d.success(t("admin.files.updateSuccess")),y.value=!1,v()}catch(u){d.error(u instanceof x?u.msg:t("admin.files.updateFailed"))}finally{C.value=!1}}async function K(n){await w(de(n.code,k.shareLinkBase))?d.success(t("admin.files.linkCopied")):d.error(t("common.copyFailed"))}async function W(n){await w(n.code)?d.success(t("admin.files.codeCopied")):d.error(t("common.copyFailed"))}async function G(n){try{const i=await fe(n.code);ce(new Blob([i],{type:"text/plain;charset=utf-8"}),n.name||`${n.code}.txt`)}catch(i){d.error(i instanceof x?i.msg:t("admin.files.fetchTextFailed"))}}function Q(n){return n.expiredCount===null||n.expiredCount<0?t("admin.files.remainingUnlimited"):t("admin.files.remainingCount",{n:n.expiredCount})}return V(v),(n,i)=>(p(),f("div",null,[e("div",ye,[e("div",null,[e("h2",_e,a(l(t)("admin.files.title")),1),e("p",xe,a(l(t)("admin.files.totalRecords",{total:b.value})),1)]),e("form",{class:"toolbar-actions",onSubmit:$(M,["prevent"])},[S(e("input",{"onUpdate:modelValue":i[0]||(i[0]=s=>m.keyword=s),class:"input",placeholder:l(t)("admin.files.searchPlaceholder"),style:{"max-width":"220px"}},null,8,ke),[[T,m.keyword]]),e("button",Ce,a(l(t)("common.search")),1),e("button",{class:"btn btn-ghost",type:"button",onClick:v},a(l(t)("common.refresh")),1),e("button",{class:"btn btn-danger-ghost",type:"button",disabled:!c.value.size,title:cLine truncated
import{d as N,I as V,P as Y,z as J,c as f,w as $,b as e,t as a,Q as X,n as Z,g as L,T as ee,o as p,u as te,a as ne,i as ie,f as l,C as S,D as T,q as z,F as se,r as le,G as D,A as ae,j as _,R as A,H as x,e as B,s as oe,K as E,k as w,p as de,M as ce}from"./index-BKnWAKao.js";import{a as ue,b as re,c as me,d as pe}from"./admin-KnbIpHLF.js";import{p as fe}from"./share-B-zR67vw.js";import{_ as he}from"./Pager.vue_vue_type_script_setup_true_lang-DZv_x-2P.js";const be=["aria-label"],ve={class:"modal-title"},ge=N({__name:"AppModal",props:{open:{type:Boolean},title:{},width:{}},emits:["close"],setup(h,{emit:t}){const k=h,d=t;function r(b){b.key==="Escape"&&k.open&&d("close")}return V(()=>document.addEventListener("keydown",r)),Y(()=>document.removeEventListener("keydown",r)),(b,g)=>(p(),J(ee,{to:"body"},[h.open?(p(),f("div",{key:0,class:"modal-overlay",onClick:g[0]||(g[0]=$(m=>d("close"),["self"]))},[e("div",{class:"modal",style:Z(h.width?{maxWidth:h.width}:void 0),role:"dialog","aria-modal":"true","aria-label":h.title},[e("h3",ve,a(h.title),1),X(b.$slots,"default")],12,be)])):L("",!0)]))}}),ye={class:"toolbar"},_e={class:"page-title"},xe={class:"page-sub"},ke=["placeholder"],Ce={class:"btn",type:"submit"},Se=["disabled","title"],Te={key:0,class:"loading-block"},$e={key:1,class:"card empty"},Fe={key:2,class:"table-wrap"},ze={class:"table"},De={style:{width:"36px"}},Ae=["checked"],Be={style:{"min-width":"210px"}},Ee=["checked","onChange"],we={class:"code-cell"},Ne=["title"],Ve={class:"row-actions"},Le=["onClick"],Me=["onClick"],Ue=["onClick"],Ie=["onClick"],Re=["onClick"],He={class:"field"},Pe={class:"field"},Oe={class:"field"},je=["value"],qe={class:"modal-actions"},Ke=["disabled"],Je=N({__name:"FilesView",setup(h){const{t}=te(),k=ne(),d=ie(),r=_([]),b=_(0),g=_(!1),m=A({page:1,size:10,keyword:""}),c=_(new Set);async function v(){g.value=!0;try{const n=await ue({...m});r.value=n.data,b.value=n.total,c.value=new Set}catch(n){d.error(n instanceof x?n.msg:t("admin.files.loadFailed"))}finally{g.value=!1}}function M(){m.page=1,v()}function U(n,i){m.page=n,m.size=i,v()}function I(n){const i=new Set(c.value);i.has(n)?i.delete(n):i.add(n),c.value=i}const F=()=>r.value.length>0&&r.value.every(n=>c.value.has(n.id));function R(){c.value=F()?new Set:new Set(r.value.map(n=>n.id))}async function H(n){if(window.confirm(t("admin.files.confirmDelete",{name:n.name||n.code})))try{await me(n.id),d.success(t("admin.files.deleteSuccess")),v()}catch(i){d.error(i instanceof x?i.msg:t("admin.files.deleteFailed"))}}async function P(){if(c.value.size&&window.confirm(t("admin.files.confirmBatchDelete",{count:c.value.size})))try{await re([...c.value]),d.success(t("admin.files.batchDeleteSuccess")),v()}catch(n){d.error(n instanceof x?n.msg:t("admin.files.batchDeleteFailed"))}}const y=_(!1),C=_(!1),o=A({id:0,code:"",expired_at:"",expired_count:null,original:null});function O(n){o.id=n.id,o.code=n.code,o.original=n,o.expired_at=n.expiredAt?j(n.expiredAt):"",o.expired_count=n.expiredCount,y.value=!0}function j(n){const i=new Date(n);if(Number.isNaN(i.getTime()))return"";const s=u=>`${u}`.padStart(2,"0");return`${i.getFullYear()}-${s(i.getMonth()+1)}-${s(i.getDate())}T${s(i.getHours())}:${s(i.getMinutes())}`}async function q(){const n=o.original;if(!n)return;const i={id:o.id};o.code.trim()&&o.code.trim()!==n.code&&(i.code=o.code.trim());const s=o.expired_count;if(s!==null&&s!==n.expiredCount&&(i.expired_count=s),o.expired_at){const u=new Date(o.expired_at).toISOString();u!==n.expiredAt&&(i.expired_at=u)}if(Object.keys(i).length===1){d.info(t("admin.files.nothingChanged")),y.value=!1;return}C.value=!0;try{await pe(i),d.success(t("admin.files.updateSuccess")),y.value=!1,v()}catch(u){d.error(u instanceof x?u.msg:t("admin.files.updateFailed"))}finally{C.value=!1}}async function K(n){await w(de(n.code,k.shareLinkBase))?d.success(t("admin.files.linkCopied")):d.error(t("common.copyFailed"))}async function W(n){await w(n.code)?d.success(t("admin.files.codeCopied")):d.error(t("common.copyFailed"))}async function G(n){try{const i=await fe(n.code);ce(new Blob([i],{type:"text/plain;charset=utf-8"}),n.name||`${n.code}.txt`)}catch(i){d.error(i instanceof x?i.msg:t("admin.files.fetchTextFailed"))}}function Q(n){return n.expiredCount===null||n.expiredCount<0?t("admin.files.remainingUnlimited"):t("admin.files.remainingCount",{n:n.expiredCount})}return V(v),(n,i)=>(p(),f("div",null,[e("div",ye,[e("div",null,[e("h2",_e,a(l(t)("admin.files.title")),1),e("p",xe,a(l(t)("admin.files.totalRecords",{total:b.value})),1)]),e("form",{class:"toolbar-actions",onSubmit:$(M,["prevent"])},[S(e("input",{"onUpdate:modelValue":i[0]||(i[0]=s=>m.keyword=s),class:"input",placeholder:l(t)("admin.files.searchPlaceholder"),style:{"max-width":"220px"}},null,8,ke),[[T,m.keyword]]),e("button",Ce,a(l(t)("common.search")),1),e("button",{class:"btn btn-ghost",type:"button",onClick:v},a(l(t)("common.refresh")),1),e("button",{class:"btn btn-danger-ghost",type:"button",disabled:!c.value.size,title:cLine truncated
@@ -1 +1 @@
import{d as W,u as Y,a as G,o as m,c as h,b as t,n as L,e as K,t as i,f as n,g as B,F as H,r as ne,h as $,E as q,_ as Z,i as ee,j as w,k as le,p as ae,l as se,w as O,m as ie,q as P,s as R,v as I,x as A,y as ue,z as re,A as ce,B as de,C as N,D as j,G as X,H as ve}from"./index-DYsKpclu.js";import{P as pe}from"./PageShell-D87JkPkG.js";import{s as me,a as he}from"./share-CqDDLJWI.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";const fe={class:"field-row"},ye={class:"field-sub"},xe=["max","value"],be={class:"field-sub"},ke=["value"],_e=["value"],Se={key:0,class:"hint",style:{color:"var(--c-warn)"}},ge={key:1,class:"hint"},Ce={key:2,class:"hint"},$e={key:3,class:"hint"},ze=W({__name:"ExpirePicker",props:{value:{},style:{},compact:{type:Boolean}},emits:["update:value","update:style"],setup(a,{emit:e}){const o=a,c=e,{t:r,te:C}=Y(),f=G(),z=$(()=>{const g=f.expireStyle.length?f.expireStyle:["day","hour","minute","forever","count"],d=q.filter(x=>g.includes(x.value)),v=g.filter(x=>!q.some(E=>E.value===x)).map(x=>({value:x,label:x}));return[...d,...v]}),S=$(()=>o.style==="forever"),y=$(()=>o.style==="count"),p=$(()=>f.maxSaveCount>0?f.maxSaveCount:9999),b=$(()=>f.maxSaveSeconds>0?f.maxSaveSeconds:0),V={day:86400,hour:3600,minute:60};function u(g){const d=b.value,v=V[g];return v?d<=0?9999:Math.max(1,Math.floor(d/v)):g==="count"?p.value:9999}const l=$(()=>{if(y.value&&f.maxSaveCount>0&&o.value>f.maxSaveCount)return r("expire.maxCountHint",{n:f.maxSaveCount});if(!S.value&&!y.value&&b.value>0){const g=u(o.style);if(o.value>g){const d=q.find(v=>v.value===o.style)?.label??o.style;return r("expire.maxSecondsHint",{value:`${g} ${d}`})}}return""}),T=$(()=>q.find(g=>g.value===o.style)?.label??o.style);function M(g,d){const v=`expireStyle.${g}`;return C(v)?r(v):d}function F(g){const d=g.target.value;c("update:style",d),d==="count"&&o.value>p.value&&c("update:value",1),d==="minute"&&o.value<1&&c("update:value",10)}return(g,d)=>(m(),h(H,null,[t("div",fe,[S.value?B("",!0):(m(),h("label",{key:0,class:K(["expire-value",{compact:a.compact}]),style:L(a.compact?"flex:0 0 110px":"")},[t("span",ye,i(n(r)("expire.value")),1),t("input",{class:"input",type:"number",min:1,max:u(a.style),value:a.value,onInput:d[0]||(d[0]=v=>c("update:value",Math.max(1,Number(v.target.value)||1)))},null,40,xe)],6)),t("label",{style:L(S.value?"flex:1":"")},[t("span",be,i(n(r)("expire.label")),1),t("select",{class:"select",value:a.style,onChange:F},[(m(!0),h(H,null,ne(z.value,v=>(m(),h("option",{key:v.value,value:v.value},i(S.value&&v.value==="forever"?n(r)("expire.foreverOption"):v.value==="count"?n(r)("expire.countOption"):M(v.value,v.label)),9,_e))),128))],40,ke)],4)]),l.value?(m(),h("p",Se,i(l.value),1)):a.style==="count"?(m(),h("p",ge,i(n(r)("expire.countHint")),1)):S.value?(m(),h("p",$e,i(n(r)("expire.foreverHint")),1)):(m(),h("p",Ce,i(n(r)("expire.timeHint",{value:a.value,unit:T.value})),1))],64))}}),Q=Z(ze,[["__scopeId","data-v-d049fcf9"]]),we={class:"card result-card"},Te={class:"result-head"},Ve={class:"badge badge-success"},Ee={key:0,class:"result-name"},Me={class:"field"},Be=["title"],De={class:"field"},Fe={class:"link-row"},Pe=["value"],Ue={class:"result-meta"},Le={key:0},He={class:"hint",style:{"margin-top":"10px"}},Oe=W({__name:"ResultCard",props:{code:{},name:{},expireValue:{},expireStyle:{}},setup(a){const e=a,{t:o}=Y(),c=ee(),r=G(),C=w(null),f=$(()=>ae(e.code,r.shareLinkBase));async function z(y){const p=y==="link"?f.value:e.code;await le(p)?(C.value=y,c.success(o(y==="link"?"result.linkCopied":"result.codeCopied")),setTimeout(()=>C.value=null,1600)):c.error(o("result.copyFailed"))}const S=$(()=>e.expireStyle==="forever"?o("result.forever"):`${e.expireValue??"-"} ${se(e.expireStyle??"")}`);return(y,p)=>(m(),h("div",we,[t("div",Te,[t("span",Ve,i(n(o)("result.badge")),1),a.name?(m(),h("span",Ee,i(a.name),1)):B("",!0)]),t("div",Me,[t("label",null,i(n(o)("result.code")),1),t("button",{class:"code-display code-copy",type:"button",title:n(o)("result.clickCopyCode"),onClick:p[0]||(p[0]=b=>z("code"))},i(a.code),9,Be)]),t("div",De,[t("label",null,i(n(o)("result.link")),1),t("div",Fe,[t("input",{class:"input input-mono",value:f.value,readonly:"",onFocus:p[1]||(p[1]=b=>b.target.select())},null,40,Pe),t("button",{class:"btn btn-ghost",type:"button",onClick:p[2]||(p[2]=b=>z("link"))},i(C.value==="link"?n(o)("common.copied"):n(o)("result.copyLink")),1)])]),t("div",Ue,[a.expireStyle?(m(),h("span",Le,i(n(o)("result.expires",{value:S.value})),1)):B("",!0)]),t("p",He,i(n(o)("result.hint")),1)]))}}),Re=Z(Oe,[["__scopeId","data-v-8bebf3d9"]]),Ie=["aria-label"],Ae={class:"dz-main"},qe={class:"dz-sub"},Ne={key:1,class:"file-chip"},je={class:"fc-name"},Xe={class:"fc-size"},Ke=["title"],We={key:2,class:"hint",style:{color:"var(--c-danger)"}},Ye=["accept"],Ge=W({__name:"FileDrop",props:{modelValue:{},maxSize:{},disabled:{type:Boolean},acceptTypes:{}},emits:["update:modelValue"],setup(a,{emit:e}){const o=a,c=e,{t:r}=Y(),C=w(null),f=w(!1),z=w(""),S=$(Line truncated
import{d as W,u as Y,a as G,o as m,c as h,b as t,n as L,e as K,t as i,f as n,g as B,F as H,r as ne,h as $,E as q,_ as Z,i as ee,j as w,k as le,p as ae,l as se,w as O,m as ie,q as P,s as R,v as I,x as A,y as ue,z as re,A as ce,B as de,C as N,D as j,G as X,H as ve}from"./index-BKnWAKao.js";import{P as pe}from"./PageShell-CBo29Oot.js";import{s as me,a as he}from"./share-B-zR67vw.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";const fe={class:"field-row"},ye={class:"field-sub"},xe=["max","value"],be={class:"field-sub"},ke=["value"],_e=["value"],Se={key:0,class:"hint",style:{color:"var(--c-warn)"}},ge={key:1,class:"hint"},Ce={key:2,class:"hint"},$e={key:3,class:"hint"},ze=W({__name:"ExpirePicker",props:{value:{},style:{},compact:{type:Boolean}},emits:["update:value","update:style"],setup(a,{emit:e}){const o=a,c=e,{t:r,te:C}=Y(),f=G(),z=$(()=>{const g=f.expireStyle.length?f.expireStyle:["day","hour","minute","forever","count"],d=q.filter(x=>g.includes(x.value)),v=g.filter(x=>!q.some(E=>E.value===x)).map(x=>({value:x,label:x}));return[...d,...v]}),S=$(()=>o.style==="forever"),y=$(()=>o.style==="count"),p=$(()=>f.maxSaveCount>0?f.maxSaveCount:9999),b=$(()=>f.maxSaveSeconds>0?f.maxSaveSeconds:0),V={day:86400,hour:3600,minute:60};function u(g){const d=b.value,v=V[g];return v?d<=0?9999:Math.max(1,Math.floor(d/v)):g==="count"?p.value:9999}const l=$(()=>{if(y.value&&f.maxSaveCount>0&&o.value>f.maxSaveCount)return r("expire.maxCountHint",{n:f.maxSaveCount});if(!S.value&&!y.value&&b.value>0){const g=u(o.style);if(o.value>g){const d=q.find(v=>v.value===o.style)?.label??o.style;return r("expire.maxSecondsHint",{value:`${g} ${d}`})}}return""}),T=$(()=>q.find(g=>g.value===o.style)?.label??o.style);function M(g,d){const v=`expireStyle.${g}`;return C(v)?r(v):d}function F(g){const d=g.target.value;c("update:style",d),d==="count"&&o.value>p.value&&c("update:value",1),d==="minute"&&o.value<1&&c("update:value",10)}return(g,d)=>(m(),h(H,null,[t("div",fe,[S.value?B("",!0):(m(),h("label",{key:0,class:K(["expire-value",{compact:a.compact}]),style:L(a.compact?"flex:0 0 110px":"")},[t("span",ye,i(n(r)("expire.value")),1),t("input",{class:"input",type:"number",min:1,max:u(a.style),value:a.value,onInput:d[0]||(d[0]=v=>c("update:value",Math.max(1,Number(v.target.value)||1)))},null,40,xe)],6)),t("label",{style:L(S.value?"flex:1":"")},[t("span",be,i(n(r)("expire.label")),1),t("select",{class:"select",value:a.style,onChange:F},[(m(!0),h(H,null,ne(z.value,v=>(m(),h("option",{key:v.value,value:v.value},i(S.value&&v.value==="forever"?n(r)("expire.foreverOption"):v.value==="count"?n(r)("expire.countOption"):M(v.value,v.label)),9,_e))),128))],40,ke)],4)]),l.value?(m(),h("p",Se,i(l.value),1)):a.style==="count"?(m(),h("p",ge,i(n(r)("expire.countHint")),1)):S.value?(m(),h("p",$e,i(n(r)("expire.foreverHint")),1)):(m(),h("p",Ce,i(n(r)("expire.timeHint",{value:a.value,unit:T.value})),1))],64))}}),Q=Z(ze,[["__scopeId","data-v-d049fcf9"]]),we={class:"card result-card"},Te={class:"result-head"},Ve={class:"badge badge-success"},Ee={key:0,class:"result-name"},Me={class:"field"},Be=["title"],De={class:"field"},Fe={class:"link-row"},Pe=["value"],Ue={class:"result-meta"},Le={key:0},He={class:"hint",style:{"margin-top":"10px"}},Oe=W({__name:"ResultCard",props:{code:{},name:{},expireValue:{},expireStyle:{}},setup(a){const e=a,{t:o}=Y(),c=ee(),r=G(),C=w(null),f=$(()=>ae(e.code,r.shareLinkBase));async function z(y){const p=y==="link"?f.value:e.code;await le(p)?(C.value=y,c.success(o(y==="link"?"result.linkCopied":"result.codeCopied")),setTimeout(()=>C.value=null,1600)):c.error(o("result.copyFailed"))}const S=$(()=>e.expireStyle==="forever"?o("result.forever"):`${e.expireValue??"-"} ${se(e.expireStyle??"")}`);return(y,p)=>(m(),h("div",we,[t("div",Te,[t("span",Ve,i(n(o)("result.badge")),1),a.name?(m(),h("span",Ee,i(a.name),1)):B("",!0)]),t("div",Me,[t("label",null,i(n(o)("result.code")),1),t("button",{class:"code-display code-copy",type:"button",title:n(o)("result.clickCopyCode"),onClick:p[0]||(p[0]=b=>z("code"))},i(a.code),9,Be)]),t("div",De,[t("label",null,i(n(o)("result.link")),1),t("div",Fe,[t("input",{class:"input input-mono",value:f.value,readonly:"",onFocus:p[1]||(p[1]=b=>b.target.select())},null,40,Pe),t("button",{class:"btn btn-ghost",type:"button",onClick:p[2]||(p[2]=b=>z("link"))},i(C.value==="link"?n(o)("common.copied"):n(o)("result.copyLink")),1)])]),t("div",Ue,[a.expireStyle?(m(),h("span",Le,i(n(o)("result.expires",{value:S.value})),1)):B("",!0)]),t("p",He,i(n(o)("result.hint")),1)]))}}),Re=Z(Oe,[["__scopeId","data-v-8bebf3d9"]]),Ie=["aria-label"],Ae={class:"dz-main"},qe={class:"dz-sub"},Ne={key:1,class:"file-chip"},je={class:"fc-name"},Xe={class:"fc-size"},Ke=["title"],We={key:2,class:"hint",style:{color:"var(--c-danger)"}},Ye=["accept"],Ge=W({__name:"FileDrop",props:{modelValue:{},maxSize:{},disabled:{type:Boolean},acceptTypes:{}},emits:["update:modelValue"],setup(a,{emit:e}){const o=a,c=e,{t:r}=Y(),C=w(null),f=w(!1),z=w(""),S=$(Line truncated
@@ -1 +1 @@
import{d as w,u as b,a as y,z as x,A as k,b as e,f as t,t as a,w as V,C as B,D as C,c as m,g as _,q as N,j as r,N as S,B as q,o as d,H as L,_ as P}from"./index-DYsKpclu.js";import{P as A}from"./PageShell-D87JkPkG.js";import{u as D}from"./auth-B7MDTgxJ.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";import"./admin-DEOkRyTC.js";const E={class:"card",style:{"max-width":"380px",margin:"8vh auto 0"}},I={class:"login-head"},M=["src"],R={class:"card-title"},T={class:"card-sub"},U={class:"field"},j={for:"admin-password"},z=["placeholder"],H={key:0,class:"hint",style:{color:"var(--c-danger)","margin-bottom":"12px"}},F=["disabled"],G={key:0,class:"spin","aria-hidden":"true"},J={class:"hint",style:{"margin-top":"16px"}},K=w({__name:"LoginView",setup(O){const{t:s}=b(),c=S(),g=q(),h=D(),u=y(),i=r(""),l=r(!1),n=r("");async function f(){if(!i.value){n.value=s("admin.login.required");return}l.value=!0,n.value="";try{await h.login(i.value);const o=typeof c.query.redirect=="string"?c.query.redirect:"/admin/files";g.replace(o)}catch(o){n.value=o instanceof L?o.code===401?s("admin.login.wrongPassword"):o.msg:s("admin.login.failed"),i.value=""}finally{l.value=!1}}return(o,p)=>(d(),x(A,null,{default:k(()=>[e("section",E,[e("div",I,[e("img",{src:t(u).displayLogoUrl,alt:"Logo",class:"login-logo"},null,8,M),e("h1",R,a(t(s)("admin.login.title")),1),e("p",T,a(t(s)("admin.login.subtitle",{name:t(u).displayName})),1)]),e("form",{onSubmit:V(f,["prevent"])},[e("div",U,[e("label",j,a(t(s)("admin.login.password")),1),B(e("input",{id:"admin-password","onUpdate:modelValue":p[0]||(p[0]=v=>i.value=v),class:"input",type:"password",placeholder:t(s)("admin.login.passwordPlaceholder"),autocomplete:"current-password",autofocus:""},null,8,z),[[C,i.value]])]),n.value?(d(),m("p",H,a(n.value),1)):_("",!0),e("button",{class:"btn btn-block",type:"submit",disabled:l.value},[l.value?(d(),m("span",G)):_("",!0),N(" "+a(t(s)("admin.login.submit")),1)],8,F)],32),e("p",J,a(t(s)("admin.login.hint")),1)])]),_:1}))}}),$=P(K,[["__scopeId","data-v-26e7f2a4"]]);export{$ as default};
import{d as w,u as b,a as y,z as x,A as k,b as e,f as t,t as a,w as V,C as B,D as C,c as m,g as _,q as N,j as r,N as S,B as q,o as d,H as L,_ as P}from"./index-BKnWAKao.js";import{P as A}from"./PageShell-CBo29Oot.js";import{u as D}from"./auth-Cp2GGuZy.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";import"./admin-KnbIpHLF.js";const E={class:"card",style:{"max-width":"380px",margin:"8vh auto 0"}},I={class:"login-head"},M=["src"],R={class:"card-title"},T={class:"card-sub"},U={class:"field"},j={for:"admin-password"},z=["placeholder"],H={key:0,class:"hint",style:{color:"var(--c-danger)","margin-bottom":"12px"}},F=["disabled"],G={key:0,class:"spin","aria-hidden":"true"},J={class:"hint",style:{"margin-top":"16px"}},K=w({__name:"LoginView",setup(O){const{t:s}=b(),c=S(),g=q(),h=D(),u=y(),i=r(""),l=r(!1),n=r("");async function f(){if(!i.value){n.value=s("admin.login.required");return}l.value=!0,n.value="";try{await h.login(i.value);const o=typeof c.query.redirect=="string"?c.query.redirect:"/admin/files";g.replace(o)}catch(o){n.value=o instanceof L?o.code===401?s("admin.login.wrongPassword"):o.msg:s("admin.login.failed"),i.value=""}finally{l.value=!1}}return(o,p)=>(d(),x(A,null,{default:k(()=>[e("section",E,[e("div",I,[e("img",{src:t(u).displayLogoUrl,alt:"Logo",class:"login-logo"},null,8,M),e("h1",R,a(t(s)("admin.login.title")),1),e("p",T,a(t(s)("admin.login.subtitle",{name:t(u).displayName})),1)]),e("form",{onSubmit:V(f,["prevent"])},[e("div",U,[e("label",j,a(t(s)("admin.login.password")),1),B(e("input",{id:"admin-password","onUpdate:modelValue":p[0]||(p[0]=v=>i.value=v),class:"input",type:"password",placeholder:t(s)("admin.login.passwordPlaceholder"),autocomplete:"current-password",autofocus:""},null,8,z),[[C,i.value]])]),n.value?(d(),m("p",H,a(n.value),1)):_("",!0),e("button",{class:"btn btn-block",type:"submit",disabled:l.value},[l.value?(d(),m("span",G)):_("",!0),N(" "+a(t(s)("admin.login.submit")),1)],8,F)],32),e("p",J,a(t(s)("admin.login.hint")),1)])]),_:1}))}}),$=P(K,[["__scopeId","data-v-26e7f2a4"]]);export{$ as default};
@@ -1 +1 @@
import{d as c,u as i,z as d,A as a,b as t,t as e,f as s,G as l,q as p,O as u,o as _}from"./index-DYsKpclu.js";import{P as m}from"./PageShell-D87JkPkG.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";const f={class:"card empty",style:{"max-width":"480px",margin:"10vh auto 0"}},h={style:{"font-weight":"600",color:"var(--c-text)"}},x={class:"hint"},F=c({__name:"NotFoundView",setup(y){const{t:o}=i();return(g,n)=>{const r=u("RouterLink");return _(),d(m,null,{default:a(()=>[t("div",f,[n[0]||(n[0]=t("div",{class:"empty-icon"},"🧭",-1)),t("p",h,e(s(o)("notFound.title")),1),t("p",x,e(s(o)("notFound.desc")),1),l(r,{class:"btn",to:"/",style:{"margin-top":"10px"}},{default:a(()=>[p(e(s(o)("notFound.back")),1)]),_:1})])]),_:1})}}});export{F as default};
import{d as c,u as i,z as d,A as a,b as t,t as e,f as s,G as l,q as p,O as u,o as _}from"./index-BKnWAKao.js";import{P as m}from"./PageShell-CBo29Oot.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";const f={class:"card empty",style:{"max-width":"480px",margin:"10vh auto 0"}},h={style:{"font-weight":"600",color:"var(--c-text)"}},x={class:"hint"},F=c({__name:"NotFoundView",setup(y){const{t:o}=i();return(g,n)=>{const r=u("RouterLink");return _(),d(m,null,{default:a(()=>[t("div",f,[n[0]||(n[0]=t("div",{class:"empty-icon"},"🧭",-1)),t("p",h,e(s(o)("notFound.title")),1),t("p",x,e(s(o)("notFound.desc")),1),l(r,{class:"btn",to:"/",style:{"margin-top":"10px"}},{default:a(()=>[p(e(s(o)("notFound.back")),1)]),_:1})])]),_:1})}}});export{F as default};
@@ -1,4 +1,4 @@
import{d as jU,u as PU,I as NU,ax as Xw,z as TU,A as IU,j as rA,b as Lc,t as Km,f as Gm,e as MU,c as RU,g as DU,h as nA,o as aA,_ as FU}from"./index-DYsKpclu.js";import{P as LU}from"./PageShell-D87JkPkG.js";import{g as $U}from"./swagger-CqkleIqs.js";import{e as oA}from"./docsSource-BXkkn0HE.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";var Qw={exports:{}};var iA;function BU(){return iA||(iA=1,(()=>{var eE={67526(w,N){N.byteLength=function(_){var T=m(_),I=T[0],j=T[1];return 3*(I+j)/4-j},N.toByteArray=function(_){var T,I,j=m(_),M=j[0],z=j[1],K=new v((function(te,ie,se){return 3*(ie+se)/4-se})(0,M,z)),Y=0,B=z>0?M-4:M;for(I=0;I<B;I+=4)T=h[_.charCodeAt(I)]<<18|h[_.charCodeAt(I+1)]<<12|h[_.charCodeAt(I+2)]<<6|h[_.charCodeAt(I+3)],K[Y++]=T>>16&255,K[Y++]=T>>8&255,K[Y++]=255&T;return z===2&&(T=h[_.charCodeAt(I)]<<2|h[_.charCodeAt(I+1)]>>4,K[Y++]=255&T),z===1&&(T=h[_.charCodeAt(I)]<<10|h[_.charCodeAt(I+1)]<<4|h[_.charCodeAt(I+2)]>>2,K[Y++]=T>>8&255,K[Y++]=255&T),K},N.fromByteArray=function(_){for(var T,I=_.length,j=I%3,M=[],z=16383,K=0,Y=I-j;K<Y;K+=z)M.push(g(_,K,K+z>Y?Y:K+z));return j===1?(T=_[I-1],M.push(s[T>>2]+s[T<<4&63]+"==")):j===2&&(T=(_[I-2]<<8)+_[I-1],M.push(s[T>>10]+s[T>>4&63]+s[T<<2&63]+"=")),M.join("")};for(var s=[],h=[],v=typeof Uint8Array<"u"?Uint8Array:Array,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",y=0;y<64;++y)s[y]=f[y],h[f.charCodeAt(y)]=y;function m(S){var _=S.length;if(_%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var T=S.indexOf("=");return T===-1&&(T=_),[T,T===_?0:4-T%4]}function g(S,_,T){for(var I,j,M=[],z=_;z<T;z+=3)I=(S[z]<<16&16711680)+(S[z+1]<<8&65280)+(255&S[z+2]),M.push(s[(j=I)>>18&63]+s[j>>12&63]+s[j>>6&63]+s[63&j]);return M.join("")}h[45]=62,h[95]=63},48287(w,N,s){const h=s(67526),v=s(251),f=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;N.Buffer=g,N.SlowBuffer=function(U){return+U!=U&&(U=0),g.alloc(+U)},N.INSPECT_MAX_BYTES=50;const y=2147483647;function m(pe){if(pe>y)throw new RangeError('The value "'+pe+'" is invalid for option "size"');const U=new Uint8Array(pe);return Object.setPrototypeOf(U,g.prototype),U}function g(pe,U,Z){if(typeof pe=="number"){if(typeof U=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return T(pe)}return S(pe,U,Z)}function S(pe,U,Z){if(typeof pe=="string")return(function(Fe,St){if(typeof St=="string"&&St!==""||(St="utf8"),!g.isEncoding(St))throw new TypeError("Unknown encoding: "+St);const Bt=0|z(Fe,St);let Qe=m(Bt);const $t=Qe.write(Fe,St);return $t!==Bt&&(Qe=Qe.slice(0,$t)),Qe})(pe,U);if(ArrayBuffer.isView(pe))return(function(Fe){if(Gt(Fe,Uint8Array)){const St=new Uint8Array(Fe);return j(St.buffer,St.byteOffset,St.byteLength)}return I(Fe)})(pe);if(pe==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof pe);if(Gt(pe,ArrayBuffer)||pe&&Gt(pe.buffer,ArrayBuffer)||typeof SharedArrayBuffer<"u"&&(Gt(pe,SharedArrayBuffer)||pe&&Gt(pe.buffer,SharedArrayBuffer)))return j(pe,U,Z);if(typeof pe=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');const ne=pe.valueOf&&pe.valueOf();if(ne!=null&&ne!==pe)return g.from(ne,U,Z);const ye=(function(Fe){if(g.isBuffer(Fe)){const St=0|M(Fe.length),Bt=m(St);return Bt.length===0||Fe.copy(Bt,0,0,St),Bt}if(Fe.length!==void 0)return typeof Fe.length!="number"||Sr(Fe.length)?m(0):I(Fe);if(Fe.type==="Buffer"&&Array.isArray(Fe.data))return I(Fe.data)})(pe);if(ye)return ye;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof pe[Symbol.toPrimitive]=="function")return g.from(pe[Symbol.toPrimitive]("string"),U,Z);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof pe)}function _(pe){if(typeof pe!="number")throw new TypeError('"size" argument must be of type number');if(pe<0)throw new RangeError('The value "'+pe+'" is invalid for option "size"')}function T(pe){return _(pe),m(pe<0?0:0|M(pe))}function I(pe){const U=pe.length<0?0:0|M(pe.length),Z=m(U);for(let ne=0;ne<U;ne+=1)Z[ne]=255&pe[ne];return Z}function j(pe,U,Z){if(U<0||pe.byteLength<U)throw new RangeError('"offset" is outside of buffer bounds');if(pe.byteLength<U+(Z||0))throw new RangeError('"length" is outside of buffer bounds');let ne;return ne=U===void 0&&Z===void 0?new Uint8Array(pe):Z===void 0?new Uint8Array(pe,U):new Uint8Array(pe,U,Z),Object.setPrototypeOf(ne,g.prototype),ne}function M(pe){if(pe>=y)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+y.toString(16)+" bytes");return 0|pe}function z(pe,U){if(g.isBuffer(pe))return pe.length;if(ArrayBuffer.isView(pe)||Gt(pe,ArrayBuffer))return pe.byteLength;if(typeof pe!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof peLine truncated
import{d as jU,u as PU,I as NU,ax as Xw,z as TU,A as IU,j as rA,b as Lc,t as Km,f as Gm,e as MU,c as RU,g as DU,h as nA,o as aA,_ as FU}from"./index-BKnWAKao.js";import{P as LU}from"./PageShell-CBo29Oot.js";import{g as $U}from"./swagger-CqkleIqs.js";import{e as oA}from"./docsSource-Df5ur5C4.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";var Qw={exports:{}};var iA;function BU(){return iA||(iA=1,(()=>{var eE={67526(w,N){N.byteLength=function(_){var T=m(_),I=T[0],j=T[1];return 3*(I+j)/4-j},N.toByteArray=function(_){var T,I,j=m(_),M=j[0],z=j[1],K=new v((function(te,ie,se){return 3*(ie+se)/4-se})(0,M,z)),Y=0,B=z>0?M-4:M;for(I=0;I<B;I+=4)T=h[_.charCodeAt(I)]<<18|h[_.charCodeAt(I+1)]<<12|h[_.charCodeAt(I+2)]<<6|h[_.charCodeAt(I+3)],K[Y++]=T>>16&255,K[Y++]=T>>8&255,K[Y++]=255&T;return z===2&&(T=h[_.charCodeAt(I)]<<2|h[_.charCodeAt(I+1)]>>4,K[Y++]=255&T),z===1&&(T=h[_.charCodeAt(I)]<<10|h[_.charCodeAt(I+1)]<<4|h[_.charCodeAt(I+2)]>>2,K[Y++]=T>>8&255,K[Y++]=255&T),K},N.fromByteArray=function(_){for(var T,I=_.length,j=I%3,M=[],z=16383,K=0,Y=I-j;K<Y;K+=z)M.push(g(_,K,K+z>Y?Y:K+z));return j===1?(T=_[I-1],M.push(s[T>>2]+s[T<<4&63]+"==")):j===2&&(T=(_[I-2]<<8)+_[I-1],M.push(s[T>>10]+s[T>>4&63]+s[T<<2&63]+"=")),M.join("")};for(var s=[],h=[],v=typeof Uint8Array<"u"?Uint8Array:Array,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",y=0;y<64;++y)s[y]=f[y],h[f.charCodeAt(y)]=y;function m(S){var _=S.length;if(_%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var T=S.indexOf("=");return T===-1&&(T=_),[T,T===_?0:4-T%4]}function g(S,_,T){for(var I,j,M=[],z=_;z<T;z+=3)I=(S[z]<<16&16711680)+(S[z+1]<<8&65280)+(255&S[z+2]),M.push(s[(j=I)>>18&63]+s[j>>12&63]+s[j>>6&63]+s[63&j]);return M.join("")}h[45]=62,h[95]=63},48287(w,N,s){const h=s(67526),v=s(251),f=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;N.Buffer=g,N.SlowBuffer=function(U){return+U!=U&&(U=0),g.alloc(+U)},N.INSPECT_MAX_BYTES=50;const y=2147483647;function m(pe){if(pe>y)throw new RangeError('The value "'+pe+'" is invalid for option "size"');const U=new Uint8Array(pe);return Object.setPrototypeOf(U,g.prototype),U}function g(pe,U,Z){if(typeof pe=="number"){if(typeof U=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return T(pe)}return S(pe,U,Z)}function S(pe,U,Z){if(typeof pe=="string")return(function(Fe,St){if(typeof St=="string"&&St!==""||(St="utf8"),!g.isEncoding(St))throw new TypeError("Unknown encoding: "+St);const Bt=0|z(Fe,St);let Qe=m(Bt);const $t=Qe.write(Fe,St);return $t!==Bt&&(Qe=Qe.slice(0,$t)),Qe})(pe,U);if(ArrayBuffer.isView(pe))return(function(Fe){if(Gt(Fe,Uint8Array)){const St=new Uint8Array(Fe);return j(St.buffer,St.byteOffset,St.byteLength)}return I(Fe)})(pe);if(pe==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof pe);if(Gt(pe,ArrayBuffer)||pe&&Gt(pe.buffer,ArrayBuffer)||typeof SharedArrayBuffer<"u"&&(Gt(pe,SharedArrayBuffer)||pe&&Gt(pe.buffer,SharedArrayBuffer)))return j(pe,U,Z);if(typeof pe=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');const ne=pe.valueOf&&pe.valueOf();if(ne!=null&&ne!==pe)return g.from(ne,U,Z);const ye=(function(Fe){if(g.isBuffer(Fe)){const St=0|M(Fe.length),Bt=m(St);return Bt.length===0||Fe.copy(Bt,0,0,St),Bt}if(Fe.length!==void 0)return typeof Fe.length!="number"||Sr(Fe.length)?m(0):I(Fe);if(Fe.type==="Buffer"&&Array.isArray(Fe.data))return I(Fe.data)})(pe);if(ye)return ye;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof pe[Symbol.toPrimitive]=="function")return g.from(pe[Symbol.toPrimitive]("string"),U,Z);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof pe)}function _(pe){if(typeof pe!="number")throw new TypeError('"size" argument must be of type number');if(pe<0)throw new RangeError('The value "'+pe+'" is invalid for option "size"')}function T(pe){return _(pe),m(pe<0?0:0|M(pe))}function I(pe){const U=pe.length<0?0:0|M(pe.length),Z=m(U);for(let ne=0;ne<U;ne+=1)Z[ne]=255&pe[ne];return Z}function j(pe,U,Z){if(U<0||pe.byteLength<U)throw new RangeError('"offset" is outside of buffer bounds');if(pe.byteLength<U+(Z||0))throw new RangeError('"length" is outside of buffer bounds');let ne;return ne=U===void 0&&Z===void 0?new Uint8Array(pe):Z===void 0?new Uint8Array(pe,U):new Uint8Array(pe,U,Z),Object.setPrototypeOf(ne,g.prototype),ne}function M(pe){if(pe>=y)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+y.toString(16)+" bytes");return 0|pe}function z(pe,U){if(g.isBuffer(pe))return pe.length;if(ArrayBuffer.isView(pe)||Gt(pe,ArrayBuffer))return pe.byteLength;if(typeof pe!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof peLine truncated
https://github.com/highlightjs/highlight.js/issues/2277`),Nn=sr,Mr=br);const nn={code:Mr,language:Nn};ds("before:highlight",nn);const fn=nn.result?nn.result:An(nn.language,nn.code,tn,Cr);return fn.code=nn.code,ds("after:highlight",fn),fn}function An(sr,br,tn,Cr){function Mr(Yt,gr){const mr=ea.case_insensitive?gr[0].toLowerCase():gr[0];return Object.prototype.hasOwnProperty.call(Yt.keywords,mr)&&Yt.keywords[mr]}function Nn(){Rr.subLanguage!=null?(function(){if(xn==="")return;let gr=null;if(typeof Rr.subLanguage=="string"){if(!ye[Rr.subLanguage])return void Nr.addText(xn);gr=An(Rr.subLanguage,xn,!0,ko[Rr.subLanguage]),ko[Rr.subLanguage]=gr.top}else gr=Wr(xn,Rr.subLanguage.length?Rr.subLanguage:null);Rr.relevance>0&&(fi+=gr.relevance),Nr.addSublanguage(gr.emitter,gr.language)})():(function(){if(!Rr.keywords)return void Nr.addText(xn);let gr=0;Rr.keywordPatternRe.lastIndex=0;let mr=Rr.keywordPatternRe.exec(xn),Vr="";for(;mr;){Vr+=xn.substring(gr,mr.index);const Gr=Mr(Rr,mr);if(Gr){const[sa,Sa]=Gr;if(Nr.addText(Vr),Vr="",fi+=Sa,sa.startsWith("_"))Vr+=mr[0];else{const Ja=ea.classNameAliases[sa]||sa;Nr.addKeyword(mr[0],Ja)}}else Vr+=mr[0];gr=Rr.keywordPatternRe.lastIndex,mr=Rr.keywordPatternRe.exec(xn)}Vr+=xn.substr(gr),Nr.addText(Vr)})(),xn=""}function nn(Yt){return Yt.className&&Nr.openNode(ea.classNameAliases[Yt.className]||Yt.className),Rr=Object.create(Yt,{parent:{value:Rr}}),Rr}function fn(Yt,gr,mr){let Vr=(function(sa,Sa){const Ja=sa&&sa.exec(Sa);return Ja&&Ja.index===0})(Yt.endRe,mr);if(Vr){if(Yt["on:end"]){const Gr=new v(Yt);Yt["on:end"](gr,Gr),Gr.isMatchIgnored&&(Vr=!1)}if(Vr){for(;Yt.endsParent&&Yt.parent;)Yt=Yt.parent;return Yt}}if(Yt.endsWithParent)return fn(Yt.parent,gr,mr)}function Ln(Yt){return Rr.matcher.regexIndex===0?(xn+=Yt[0],1):(ms=!0,0)}function Hr(Yt){const gr=Yt[0],mr=Yt.rule,Vr=new v(mr),Gr=[mr.__beforeBegin,mr["on:begin"]];for(const sa of Gr)if(sa&&(sa(Yt,Vr),Vr.isMatchIgnored))return Ln(gr);return mr&&mr.endSameAsBegin&&(mr.endRe=(function(Sa){return new RegExp(Sa.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")})(gr)),mr.skip?xn+=gr:(mr.excludeBegin&&(xn+=gr),Nn(),mr.returnBegin||mr.excludeBegin||(xn=gr)),nn(mr),mr.returnBegin?0:gr.length}function ia(Yt){const gr=Yt[0],mr=br.substr(Yt.index),Vr=fn(Rr,Yt,mr);if(!Vr)return U;const Gr=Rr;Gr.skip?xn+=gr:(Gr.returnEnd||Gr.excludeEnd||(xn+=gr),Nn(),Gr.excludeEnd&&(xn=gr));do Rr.className&&Nr.closeNode(),Rr.skip||Rr.subLanguage||(fi+=Rr.relevance),Rr=Rr.parent;while(Rr!==Vr.parent);return Vr.starts&&(Vr.endSameAsBegin&&(Vr.starts.endRe=Vr.endRe),nn(Vr.starts)),Gr.returnEnd?0:gr.length}let za={};function fs(Yt,gr){const mr=gr&&gr[0];if(xn+=Yt,mr==null)return Nn(),0;if(za.type==="begin"&&gr.type==="end"&&za.index===gr.index&&mr===""){if(xn+=br.slice(gr.index,gr.index+1),!St){const Vr=new Error("0 width match regex");throw Vr.languageName=sr,Vr.badRule=za.rule,Vr}return 1}if(za=gr,gr.type==="begin")return Hr(gr);if(gr.type==="illegal"&&!tn){const Vr=new Error('Illegal lexeme "'+mr+'" for mode "'+(Rr.className||"<unnamed>")+'"');throw Vr.mode=Rr,Vr}if(gr.type==="end"){const Vr=ia(gr);if(Vr!==U)return Vr}if(gr.type==="illegal"&&mr==="")return 1;if(Jo>1e5&&Jo>3*gr.index)throw new Error("potential infinite loop, way more iterations than matches");return xn+=mr,mr.length}const ea=Fn(sr);if(!ea)throw Sr(Qe.replace("{}",sr)),new Error('Unknown language: "'+sr+'"');const di=we(ea,{plugins:Fe});let Va="",Rr=Cr||di;const ko={},Nr=new Pt.__emitter(Pt);(function(){const gr=[];for(let mr=Rr;mr!==ea;mr=mr.parent)mr.className&&gr.unshift(mr.className);gr.forEach((mr=>Nr.openNode(mr)))})();let xn="",fi=0,ta=0,Jo=0,ms=!1;try{for(Rr.matcher.considerAll();;){Jo++,ms?ms=!1:Rr.matcher.considerAll(),Rr.matcher.lastIndex=ta;const Yt=Rr.matcher.exec(br);if(!Yt)break;const gr=fs(br.substring(ta,Yt.index),Yt);ta=Yt.index+gr}return fs(br.substr(ta)),Nr.closeAllNodes(),Nr.finalize(),Va=Nr.toHTML(),{relevance:Math.floor(fi),value:Va,language:sr,illegal:!1,emitter:Nr,top:Rr}}catch(Yt){if(Yt.message&&Yt.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:Yt.message,context:br.slice(ta-100,ta+100),mode:Yt.mode},sofar:Va,relevance:0,value:Zt(br),emitter:Nr};if(St)return{illegal:!1,relevance:0,value:Zt(br),emitter:Nr,language:sr,top:Rr,errorRaised:Yt};throw Yt}}function Wr(sr,br){br=br||Pt.languages||Object.keys(ye);const tn=(function(Hr){const ia={relevance:0,emitter:new Pt.__emitter(Pt),value:Zt(Hr),illegal:!1,top:$t};return ia.emitter.addText(Hr),ia})(sr),Cr=br.filter(Fn).filter(Vo).map((Ln=>An(Ln,sr,!1)));Cr.unshift(tn);const Mr=Cr.sort(((Ln,Hr)=>{if(Ln.relevance!==Hr.relevance)return Hr.relevance-Ln.relevance;if(Ln.language&&Hr.language){if(Fn(Ln.language).supersetOf===Hr.language)return 1;if(Fn(Hr.language).supersetOf===Ln.language)return-1}return 0})),[Nn,nn]=Mr,fn=Nn;return fn.second_best=nn,fn}const Jn={"before:highlightElement":({el:sr})=>{Pt.useBR&&(sr.innerHTML=sr.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,`
`))},"after:highlightElement":({result:sr})=>{Pt.useBR&&(sr.value=sr.value.replace(/\n/g,"<br>"))}},Ea=/^(<[^>]+>|\t)+/gm,Zn={"after:highlightElement":({result:sr})=>{Pt.tabReplace&&(sr.value=sr.value.replace(Ea,(br=>br.replace(/\t/g,Pt.tabReplace))))}};function un(sr){let br=null;const tn=(function(nn){let fn=nn.className+" ";fn+=nn.parentNode?nn.parentNode.className:"";const Ln=Pt.languageDetectRe.exec(fn);if(Ln){const Hr=Fn(Ln[1]);return Hr||(kt(Qe.replace("{}",Ln[1])),kt("Falling back to no-highlight mode for this block.",nn)),Hr?Ln[1]:"no-highlight"}return fn.split(/\s+/).find((Hr=>rn(Hr)||Fn(Hr)))})(sr);if(rn(tn))return;ds("before:highlightElement",{el:sr,language:tn}),br=sr;const Cr=br.textContent,Mr=tn?kr(Cr,{language:tn,ignoreIllegals:!0}):Wr(Cr);ds("after:highlightElement",{el:sr,result:Mr,text:Cr}),sr.innerHTML=Mr.value,(function(nn,fn,Ln){const Hr=fn?Ee[fn]:Ln;nn.classList.add("hljs"),Hr&&nn.classList.add(Hr)})(sr,tn,Mr.language),sr.result={language:Mr.language,re:Mr.relevance,relavance:Mr.relevance},Mr.second_best&&(sr.second_best={language:Mr.second_best.language,re:Mr.second_best.relevance,relavance:Mr.second_best.relevance})}const ti=()=>{ti.called||(ti.called=!0,yt("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead."),document.querySelectorAll("pre code").forEach(un))};let Oo=!1;function Li(){if(document.readyState==="loading")return void(Oo=!0);document.querySelectorAll("pre code").forEach(un)}function Fn(sr){return sr=(sr||"").toLowerCase(),ye[sr]||ye[Ee[sr]]}function zo(sr,{languageName:br}){typeof sr=="string"&&(sr=[sr]),sr.forEach((tn=>{Ee[tn.toLowerCase()]=br}))}function Vo(sr){const br=Fn(sr);return br&&!br.disableAutodetect}function ds(sr,br){const tn=sr;Fe.forEach((function(Cr){Cr[tn]&&Cr[tn](br)}))}typeof window<"u"&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function(){Oo&&Li()}),!1),Object.assign(ne,{highlight:kr,highlightAuto:Wr,highlightAll:Li,fixMarkup:function(br){return yt("10.2.0","fixMarkup will be removed entirely in v11.0"),yt("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),(function(Cr){return Pt.tabReplace||Pt.useBR?Cr.replace(Bt,(Mr=>Mr===`
`?Pt.useBR?"<br>":Mr:Pt.tabReplace?Mr.replace(/\t/g,Pt.tabReplace):Mr)):Cr})(br)},highlightElement:un,highlightBlock:function(br){return yt("10.7.0","highlightBlock will be removed entirely in v12.0"),yt("10.7.0","Please use highlightElement now."),un(br)},configure:function(br){br.useBR&&(yt("10.3.0","'useBR' will be removed entirely in v11.0"),yt("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),Pt=pe(Pt,br)},initHighlighting:ti,initHighlightingOnLoad:function(){yt("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),Oo=!0},registerLanguage:function(br,tn){let Cr=null;try{Cr=tn(ne)}catch(Mr){if(Sr("Language definition for '{}' could not be registered.".replace("{}",br)),!St)throw Mr;Sr(Mr),Cr=$t}Cr.name||(Cr.name=br),ye[br]=Cr,Cr.rawDefinition=tn.bind(null,ne),Cr.aliases&&zo(Cr.aliases,{languageName:br})},unregisterLanguage:function(br){delete ye[br];for(const tn of Object.keys(Ee))Ee[tn]===br&&delete Ee[tn]},listLanguages:function(){return Object.keys(ye)},getLanguage:Fn,registerAliases:zo,requireLanguage:function(br){yt("10.4.0","requireLanguage will be removed entirely in v11."),yt("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const tn=Fn(br);if(tn)return tn;throw new Error("The '{}' language is required, but not loaded.".replace("{}",br))},autoDetection:Vo,inherit:pe,addPlugin:function(br){(function(Cr){Cr["before:highlightBlock"]&&!Cr["before:highlightElement"]&&(Cr["before:highlightElement"]=Mr=>{Cr["before:highlightBlock"](Object.assign({block:Mr.el},Mr))}),Cr["after:highlightBlock"]&&!Cr["after:highlightElement"]&&(Cr["after:highlightElement"]=Mr=>{Cr["after:highlightBlock"](Object.assign({block:Mr.el},Mr))})})(br),Fe.push(br)},vuePlugin:mt(ne).VuePlugin}),ne.debugMode=function(){St=!1},ne.safeMode=function(){St=!0},ne.versionString="10.7.3";for(const sr in at)typeof at[sr]=="object"&&s(at[sr]);return Object.assign(ne,at),ne.addPlugin(Jn),ne.addPlugin(ur),ne.addPlugin(Zn),ne})({});w.exports=Z},35344(w){function N(...s){return s.map((h=>(function(f){return f?typeof f=="string"?f:f.source:null})(h))).join("")}w.exports=function(h){const v={},f={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[v]}]};Object.assign(v,{className:"variable",variants:[{begin:N(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},f]});const y={className:"subst",begin:/\$\(/,end:/\)/,contains:[h.BACKSLASH_ESCAPE]},m={begin:/<<-?\s*(?=\w+)/,starts:{contains:[h.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},g={className:"string",begin:/"/,end:/"/,contains:[h.BACKSLASH_ESCAPE,v,y]};y.contains.push(g);const S={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},h.NUMBER_MODE,v]},_=h.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),T={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[h.inherit(h.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[_,h.SHEBANG(),T,S,h.HASH_COMMENT_MODE,m,g,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},v]}}},73402(w){function N(...s){return s.map((h=>(function(f){return f?typeof f=="string"?f:f.source:null})(h))).join("")}w.exports=function(h){const v="HTTP/(2|1\\.[01])",f={className:"attribute",begin:N("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},y=[f,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+v+" \\d{3})",end:/$/,contains:[{className:"meta",begin:v},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:y}},{begin:"(?=^[A-Z]+ (.*?) "+v+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:v},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:y}},h.inherit(f,{relevance:0})]}}},95089(w){const N="[A-Za-z$_][0-9A-Za-z$_]*",s=["as","in","of", Line truncated
@@ -1 +1 @@
import{d as h,u as g,a as k,c as n,G as i,b as t,Q as y,e as v,f as e,t as a,g as c,q as r,A as d,F as x,h as B,O as C,o as l,_ as b}from"./index-DYsKpclu.js";import{_ as w}from"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";const N={class:"site-footer"},S={class:"footer-left"},F={key:0,class:"footer-text"},P={key:1,class:"footer-beian"},T={key:2},V=["aria-label"],$=h({__name:"PageShell",setup(D){const{t:s}=g(),o=k(),m=new Date().getFullYear(),u=B(()=>!!(o.footerText.trim()||o.footerBeian.trim()));return(p,_)=>{const f=C("RouterLink");return l(),n(x,null,[i(w),t("main",{class:v(["page",{"page-wide":p.$route.meta.wide}])},[y(p.$slots,"default",{},void 0,!0)],2),t("footer",N,[t("div",S,[e(o).footerText.trim()?(l(),n("span",F,a(e(o).footerText),1)):c("",!0),e(o).footerBeian.trim()?(l(),n("span",P,a(e(o).footerBeian),1)):c("",!0),u.value?c("",!0):(l(),n("span",T,a(e(s)("footer.copyright",{year:e(m),name:e(o).displayName})),1))]),_[0]||(_[0]=t("span",{class:"footer-powered"},[r(" Powered by "),t("a",{href:"https://skymirror.top",target:"_blank",rel:"noopener noreferrer"},"SKYMirror"),r(" 26.9 ")],-1)),t("nav",{"aria-label":e(s)("footer.linkNav")},[i(f,{to:"/docs"},{default:d(()=>[r(a(e(s)("footer.docs")),1)]),_:1}),i(f,{to:"/openapi"},{default:d(()=>[r(a(e(s)("footer.openapi")),1)]),_:1}),i(f,{to:"/admin/files"},{default:d(()=>[r(a(e(s)("footer.admin")),1)]),_:1})],8,V)])],64)}}}),R=b($,[["__scopeId","data-v-80685d6f"]]);export{R as P};
import{d as h,u as g,a as k,c as n,G as i,b as t,Q as y,e as v,f as e,t as a,g as c,q as r,A as d,F as x,h as B,O as C,o as l,_ as b}from"./index-BKnWAKao.js";import{_ as w}from"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";const N={class:"site-footer"},S={class:"footer-left"},F={key:0,class:"footer-text"},P={key:1,class:"footer-beian"},T={key:2},V=["aria-label"],$=h({__name:"PageShell",setup(D){const{t:s}=g(),o=k(),m=new Date().getFullYear(),u=B(()=>!!(o.footerText.trim()||o.footerBeian.trim()));return(p,_)=>{const f=C("RouterLink");return l(),n(x,null,[i(w),t("main",{class:v(["page",{"page-wide":p.$route.meta.wide}])},[y(p.$slots,"default",{},void 0,!0)],2),t("footer",N,[t("div",S,[e(o).footerText.trim()?(l(),n("span",F,a(e(o).footerText),1)):c("",!0),e(o).footerBeian.trim()?(l(),n("span",P,a(e(o).footerBeian),1)):c("",!0),u.value?c("",!0):(l(),n("span",T,a(e(s)("footer.copyright",{year:e(m),name:e(o).displayName})),1))]),_[0]||(_[0]=t("span",{class:"footer-powered"},[r(" Powered by "),t("a",{href:"https://skymirror.top",target:"_blank",rel:"noopener noreferrer"},"SKYMirror"),r(" 26.9 ")],-1)),t("nav",{"aria-label":e(s)("footer.linkNav")},[i(f,{to:"/docs"},{default:d(()=>[r(a(e(s)("footer.docs")),1)]),_:1}),i(f,{to:"/openapi"},{default:d(()=>[r(a(e(s)("footer.openapi")),1)]),_:1}),i(f,{to:"/admin/files"},{default:d(()=>[r(a(e(s)("footer.admin")),1)]),_:1})],8,V)])],64)}}}),R=b($,[["__scopeId","data-v-80685d6f"]]);export{R as P};
@@ -1 +1 @@
import{d as b,u as p,c as r,b as o,t as i,f as c,h,o as f}from"./index-DYsKpclu.js";const v={class:"pager"},x={class:"pager-info"},k=["disabled"],M=["disabled"],y=b({__name:"Pager",props:{page:{},size:{},total:{}},emits:["change"],setup(t,{emit:m}){const a=t,d=m,{t:n}=p(),s=h(()=>Math.max(1,Math.ceil(a.total/a.size)));function g(l){const e=Math.min(Math.max(1,l),s.value);e!==a.page&&d("change",e,a.size)}return(l,e)=>(f(),r("div",v,[o("span",x,i(c(n)("common.pagerInfo",{total:t.total,page:t.page,pages:s.value})),1),o("button",{class:"btn btn-ghost btn-sm",type:"button",disabled:t.page<=1,onClick:e[0]||(e[0]=u=>g(t.page-1))},i(c(n)("common.previousPage")),9,k),o("button",{class:"btn btn-ghost btn-sm",type:"button",disabled:t.page>=s.value,onClick:e[1]||(e[1]=u=>g(t.page+1))},i(c(n)("common.nextPage")),9,M)]))}});export{y as _};
import{d as b,u as p,c as r,b as o,t as i,f as c,h,o as f}from"./index-BKnWAKao.js";const v={class:"pager"},x={class:"pager-info"},k=["disabled"],M=["disabled"],y=b({__name:"Pager",props:{page:{},size:{},total:{}},emits:["change"],setup(t,{emit:m}){const a=t,d=m,{t:n}=p(),s=h(()=>Math.max(1,Math.ceil(a.total/a.size)));function g(l){const e=Math.min(Math.max(1,l),s.value);e!==a.page&&d("change",e,a.size)}return(l,e)=>(f(),r("div",v,[o("span",x,i(c(n)("common.pagerInfo",{total:t.total,page:t.page,pages:s.value})),1),o("button",{class:"btn btn-ghost btn-sm",type:"button",disabled:t.page<=1,onClick:e[0]||(e[0]=u=>g(t.page-1))},i(c(n)("common.previousPage")),9,k),o("button",{class:"btn btn-ghost btn-sm",type:"button",disabled:t.page>=s.value,onClick:e[1]||(e[1]=u=>g(t.page+1))},i(c(n)("common.nextPage")),9,M)]))}});export{y as _};
@@ -1 +1 @@
import{d as N,u as U,i as q,I,J as b,z as L,A as R,H as C,h as T,j as p,b as t,c as u,q as z,t as s,f as n,w as E,C as H,D as $,F as y,s as _,g as w,K as j,L as J,n as K,M as B,k as W,N as G,B as O,o as l}from"./index-DYsKpclu.js";import{P as Q}from"./PageShell-D87JkPkG.js";import{g as X,p as Y,b as Z}from"./share-CqDDLJWI.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js";const ee={class:"card",style:{"max-width":"640px",margin:"12px auto 0"}},te={key:0,class:"loading-block"},ae={class:"empty"},oe={style:{"font-weight":"600",color:"var(--c-text)"}},ne={class:"hint"},se=["placeholder"],ie={class:"btn",type:"submit"},le={style:{display:"flex","align-items":"center",gap:"10px","flex-wrap":"wrap","margin-bottom":"4px"}},ue={class:"badge"},re={style:{"font-size":"16px","word-break":"break-all"}},ce={key:0,class:"hint",style:{margin:"0"}},pe={class:"hint",style:{"margin-bottom":"18px"}},de={key:0,class:"loading-block"},me={class:"text-view"},ve={style:{display:"flex",gap:"10px","margin-top":"14px","flex-wrap":"wrap"}},ye={class:"file-summary"},ke={style:{"font-weight":"600","word-break":"break-all"}},fe={class:"hint",style:{margin:"0"}},ge={key:0,style:{margin:"16px 0 6px"}},he={class:"progress"},xe={class:"hint"},_e=["disabled"],Be=N({__name:"PickupView",setup(we){const{t:e}=U(),D=G(),F=O(),k=q(),d=T(()=>String(D.params.code??"").trim().split(/\s+/)[0]),r=p("loading"),m=p(""),o=p(null),v=p(""),f=p(!1),c=p(null);async function g(){if(!d.value){r.value="error",m.value=e("pickup.emptyCode");return}r.value="loading",m.value="",o.value=null,v.value="";try{const a=await X(d.value);if(o.value=a,r.value="ready",a.isText){f.value=!0;try{v.value=await Y(d.value)}finally{f.value=!1}}}catch(a){r.value="error",m.value=a instanceof C?a.code===404?e("pickup.notFound"):a.code===423?e("home.rateLimited"):a.code===428?e("home.notInitialized"):a.msg:e("pickup.failedDefault")}}I(g),b(d,()=>{g()}),b(()=>e("pickup.emptyCode"),()=>{r.value==="error"&&m.value&&g()});async function A(){if(o.value){c.value=0;try{const{blob:a,filename:i}=await Z(d.value,x=>c.value=x);B(a,i||o.value.name||"download"),k.success(e("pickup.downloaded"))}catch(a){k.error(a instanceof C?a.msg:e("pickup.downloadFailed"))}finally{c.value=null}}}async function M(){await W(v.value)?k.success(e("pickup.copied")):k.error(e("common.copyFailed"))}function P(){if(!o.value)return;const a=new Blob([v.value],{type:"text/plain;charset=utf-8"}),i=o.value.name?.includes(".")?o.value.name:`${o.value.name||"text"}.txt`;B(a,i)}const h=p("");function S(){const a=h.value.trim();a&&F.push({name:"pickup",params:{code:a}})}const V=T(()=>{const a=o.value;return a?a.remainingDownloads===null||a.remainingDownloads===void 0||a.remainingDownloads<0?e("pickup.remainingUnlimited"):e("pickup.remainingCount",{n:a.remainingDownloads}):""});return(a,i)=>(l(),L(Q,null,{default:R(()=>[t("section",ee,[r.value==="loading"?(l(),u("div",te,[i[1]||(i[1]=t("span",{class:"spin","aria-hidden":"true"},null,-1)),z(" "+s(n(e)("pickup.querying",{code:d.value})),1)])):r.value==="error"?(l(),u(y,{key:1},[t("div",ae,[i[2]||(i[2]=t("div",{class:"empty-icon"},"📮",-1)),t("p",oe,s(m.value||n(e)("pickup.failed")),1),t("p",ne,s(n(e)("pickup.confirmHint")),1)]),t("form",{class:"quick-pickup",style:{"margin-top":"6px","max-width":"none"},onSubmit:E(S,["prevent"])},[H(t("input",{"onUpdate:modelValue":i[0]||(i[0]=x=>h.value=x),class:"input input-mono",placeholder:n(e)("pickup.retryPlaceholder"),maxlength:"32"},null,8,se),[[$,h.value]]),t("button",ie,s(n(e)("pickup.retryButton")),1)],32)],64)):o.value?(l(),u(y,{key:2},[t("div",le,[t("span",ue,s(o.value.isText?n(e)("common.text"):n(e)("common.file")),1),t("strong",re,s(o.value.name),1),o.value.isText?w("",!0):(l(),u("span",ce,s(n(_)(o.value.size)),1))]),t("p",pe,s(V.value)+" · "+s(n(e)("pickup.expireAt",{time:o.value.expiredAt?n(j)(o.value.expiredAt):n(e)("time.permanent")}))+" · "+s(n(J)(o.value.expiredAt)),1),o.value.isText?(l(),u(y,{key:0},[f.value?(l(),u("div",de,[i[3]||(i[3]=t("span",{class:"spin","aria-hidden":"true"},null,-1)),z(" "+s(n(e)("pickup.loadingText")),1)])):(l(),u(y,{key:1},[t("pre",me,s(v.value),1),t("div",ve,[t("button",{class:"btn",type:"button",onClick:M},s(n(e)("pickup.copyContent")),1),t("button",{class:"btn btn-ghost",type:"button",onClick:P},s(n(e)("pickup.downloadTxt")),1)])],64))],64)):(l(),u(y,{key:1},[t("div",ye,[i[4]||(i[4]=t("span",{style:{"font-size":"30px"},"aria-hidden":"true"},"📄",-1)),t("div",null,[t("div",ke,s(o.value.name),1),t("div",fe,s(n(e)("pickup.sizeUsed",{size:n(_)(o.value.size),n:o.value.usedCount})),1)])]),c.value!==null?(l(),u("div",ge,[t("div",he,[t("i",{style:K({width:`${c.value}%`})},null,4)]),t("p",xe,s(n(e)("pickup.downloading",{percent:c.value})),1)])):w("",!0),t("button",{class:"btn btn-block",type:"button",disabled:c.value!==null,onClick:A}," ⬇ "+s(n(e)("pickup.downloadFile",{size:n(_)(o.value.size)})),9,_e)],64))],64)):w("",!0)])]),_:1}))}});export{Be as default};
import{d as N,u as U,i as q,I,J as b,z as L,A as R,H as C,h as T,j as p,b as t,c as u,q as z,t as s,f as n,w as E,C as H,D as $,F as y,s as _,g as w,K as j,L as J,n as K,M as B,k as W,N as G,B as O,o as l}from"./index-BKnWAKao.js";import{P as Q}from"./PageShell-CBo29Oot.js";import{g as X,p as Y,b as Z}from"./share-B-zR67vw.js";import"./SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js";const ee={class:"card",style:{"max-width":"640px",margin:"12px auto 0"}},te={key:0,class:"loading-block"},ae={class:"empty"},oe={style:{"font-weight":"600",color:"var(--c-text)"}},ne={class:"hint"},se=["placeholder"],ie={class:"btn",type:"submit"},le={style:{display:"flex","align-items":"center",gap:"10px","flex-wrap":"wrap","margin-bottom":"4px"}},ue={class:"badge"},re={style:{"font-size":"16px","word-break":"break-all"}},ce={key:0,class:"hint",style:{margin:"0"}},pe={class:"hint",style:{"margin-bottom":"18px"}},de={key:0,class:"loading-block"},me={class:"text-view"},ve={style:{display:"flex",gap:"10px","margin-top":"14px","flex-wrap":"wrap"}},ye={class:"file-summary"},ke={style:{"font-weight":"600","word-break":"break-all"}},fe={class:"hint",style:{margin:"0"}},ge={key:0,style:{margin:"16px 0 6px"}},he={class:"progress"},xe={class:"hint"},_e=["disabled"],Be=N({__name:"PickupView",setup(we){const{t:e}=U(),D=G(),F=O(),k=q(),d=T(()=>String(D.params.code??"").trim().split(/\s+/)[0]),r=p("loading"),m=p(""),o=p(null),v=p(""),f=p(!1),c=p(null);async function g(){if(!d.value){r.value="error",m.value=e("pickup.emptyCode");return}r.value="loading",m.value="",o.value=null,v.value="";try{const a=await X(d.value);if(o.value=a,r.value="ready",a.isText){f.value=!0;try{v.value=await Y(d.value)}finally{f.value=!1}}}catch(a){r.value="error",m.value=a instanceof C?a.code===404?e("pickup.notFound"):a.code===423?e("home.rateLimited"):a.code===428?e("home.notInitialized"):a.msg:e("pickup.failedDefault")}}I(g),b(d,()=>{g()}),b(()=>e("pickup.emptyCode"),()=>{r.value==="error"&&m.value&&g()});async function A(){if(o.value){c.value=0;try{const{blob:a,filename:i}=await Z(d.value,x=>c.value=x);B(a,i||o.value.name||"download"),k.success(e("pickup.downloaded"))}catch(a){k.error(a instanceof C?a.msg:e("pickup.downloadFailed"))}finally{c.value=null}}}async function M(){await W(v.value)?k.success(e("pickup.copied")):k.error(e("common.copyFailed"))}function P(){if(!o.value)return;const a=new Blob([v.value],{type:"text/plain;charset=utf-8"}),i=o.value.name?.includes(".")?o.value.name:`${o.value.name||"text"}.txt`;B(a,i)}const h=p("");function S(){const a=h.value.trim();a&&F.push({name:"pickup",params:{code:a}})}const V=T(()=>{const a=o.value;return a?a.remainingDownloads===null||a.remainingDownloads===void 0||a.remainingDownloads<0?e("pickup.remainingUnlimited"):e("pickup.remainingCount",{n:a.remainingDownloads}):""});return(a,i)=>(l(),L(Q,null,{default:R(()=>[t("section",ee,[r.value==="loading"?(l(),u("div",te,[i[1]||(i[1]=t("span",{class:"spin","aria-hidden":"true"},null,-1)),z(" "+s(n(e)("pickup.querying",{code:d.value})),1)])):r.value==="error"?(l(),u(y,{key:1},[t("div",ae,[i[2]||(i[2]=t("div",{class:"empty-icon"},"📮",-1)),t("p",oe,s(m.value||n(e)("pickup.failed")),1),t("p",ne,s(n(e)("pickup.confirmHint")),1)]),t("form",{class:"quick-pickup",style:{"margin-top":"6px","max-width":"none"},onSubmit:E(S,["prevent"])},[H(t("input",{"onUpdate:modelValue":i[0]||(i[0]=x=>h.value=x),class:"input input-mono",placeholder:n(e)("pickup.retryPlaceholder"),maxlength:"32"},null,8,se),[[$,h.value]]),t("button",ie,s(n(e)("pickup.retryButton")),1)],32)],64)):o.value?(l(),u(y,{key:2},[t("div",le,[t("span",ue,s(o.value.isText?n(e)("common.text"):n(e)("common.file")),1),t("strong",re,s(o.value.name),1),o.value.isText?w("",!0):(l(),u("span",ce,s(n(_)(o.value.size)),1))]),t("p",pe,s(V.value)+" · "+s(n(e)("pickup.expireAt",{time:o.value.expiredAt?n(j)(o.value.expiredAt):n(e)("time.permanent")}))+" · "+s(n(J)(o.value.expiredAt)),1),o.value.isText?(l(),u(y,{key:0},[f.value?(l(),u("div",de,[i[3]||(i[3]=t("span",{class:"spin","aria-hidden":"true"},null,-1)),z(" "+s(n(e)("pickup.loadingText")),1)])):(l(),u(y,{key:1},[t("pre",me,s(v.value),1),t("div",ve,[t("button",{class:"btn",type:"button",onClick:M},s(n(e)("pickup.copyContent")),1),t("button",{class:"btn btn-ghost",type:"button",onClick:P},s(n(e)("pickup.downloadTxt")),1)])],64))],64)):(l(),u(y,{key:1},[t("div",ye,[i[4]||(i[4]=t("span",{style:{"font-size":"30px"},"aria-hidden":"true"},"📄",-1)),t("div",null,[t("div",ke,s(o.value.name),1),t("div",fe,s(n(e)("pickup.sizeUsed",{size:n(_)(o.value.size),n:o.value.usedCount})),1)])]),c.value!==null?(l(),u("div",ge,[t("div",he,[t("i",{style:K({width:`${c.value}%`})},null,4)]),t("p",xe,s(n(e)("pickup.downloading",{percent:c.value})),1)])):w("",!0),t("button",{class:"btn btn-block",type:"button",disabled:c.value!==null,onClick:A}," ⬇ "+s(n(e)("pickup.downloadFile",{size:n(_)(o.value.size)})),9,_e)],64))],64)):w("",!0)])]),_:1}))}});export{Be as default};
@@ -1,4 +1,4 @@
import{a0 as ge,h as F,a1 as Ze,a2 as Me,a3 as Xe,a4 as Qe,a5 as Pe,a6 as et,o as w,a7 as ze,z as ce,c as y,F as G,b as e,a8 as We,a9 as tt,e as st,aa as nt,G as Fe,A as it,ab as ot,ac as at,j as V,ad as Ae,ae as K,J as lt,I as Ye,af as rt,P as dt,ag as ct,ah as ut,d as ve,ai as _t,aj as mt,ak as Ue,al as b,n as Re,am as Ge,an as ft,ao as ht,ap as pt,aq as I,ar as Ee,as as qe,at as Q,au as gt,u as vt,i as bt,a as wt,t as l,f as o,q as M,w as He,C as f,D as v,g as L,Z as _e,s as Oe,R as ke,S as p,H as re,B as yt,_ as xt}from"./index-DYsKpclu.js";import{f as kt,g as St,h as De,i as Ct}from"./admin-DEOkRyTC.js";import{u as Bt}from"./auth-B7MDTgxJ.js";function Vt(s={},t={defaultBordered:!0}){const d=ge(Me,null);return{inlineThemeDisabled:d?.inlineThemeDisabled,mergedRtlRef:d?.mergedRtlRef,mergedComponentPropsRef:d?.mergedComponentPropsRef,mergedBreakpointsRef:d?.mergedBreakpointsRef,mergedBorderedRef:F(()=>{const{bordered:u}=s;return u!==void 0?u:d?.mergedBorderedRef.value??t.defaultBordered??!0}),mergedClsPrefixRef:d?d.mergedClsPrefixRef:Ze("n"),namespaceRef:F(()=>d?.mergedNamespaceRef.value)}}function $t(s,t,d){if(!t)return;const u=Xe(),_=ge(Me,null),h=()=>{const x=d.value;t.mount({id:x===void 0?s:x+s,head:!0,anchorMetaName:Pe,props:{bPrefix:x?`.${x}-`:void 0},ssr:u,parent:_?.styleMountTarget}),_?.preflightStyleDisabled||et.mount({id:"n-global",head:!0,anchorMetaName:Pe,ssr:u,parent:_?.styleMountTarget})};u?h():Qe(h)}function z(s,t=1){let d=Fe,u=!1;return typeof s=="function"&&(u=!0,w(),d=ce,s=s()),ze(s)?u?ce(Ie(s)):Ie(s):Array.isArray(s)?u?y(G,null,s.map(_=>z(()=>_)),-2):e(G,null,s.slice()):s==null||typeof s=="boolean"?d(We):d(tt,null,String(s),t)}function Ie(s){return s.el===null&&s.patchFlag!==-1||s.memo?s:nt(s)}const Tt=s=>typeof s=="function"||Object.prototype.toString.call(s)==="[object Object]"&&!ze(s)?s:{default:it(()=>[z(()=>s)])},C=s=>st(s)||null;function j(s){return typeof s=="string"?s.endsWith("px")?Number(s.slice(0,s.length-2)):Number(s):s}function Se(s){if(s!=null)return typeof s=="number"?`${s}px`:s.endsWith("px")?s:`${s}px`}function Ut(s,t,d,u){d||ot("useThemeClass","cssVarsRef is not passed");const _=ge(Me,null),h=_?.mergedThemeHashRef,x=_?.styleMountTarget,B=V(""),a=Xe();let k;const $=`__${s}`,R=()=>{let m=$;const T=t?t.value:void 0,N=h?.value;N&&(m+=`-${N}`),T&&(m+=`-${T}`);const{themeOverrides:E,builtinThemeOverrides:q}=u;E&&(m+=`-${Ae(JSON.stringify(E))}`),q&&(m+=`-${Ae(JSON.stringify(q))}`),B.value=m,k=()=>{const te=d.value;let se="";for(const ne in te)se+=`${ne}: ${te[ne]};`;K(`.${m}`,se).mount({id:m,ssr:a,parent:x}),k=void 0}};return at(()=>{R()}),{themeClass:B,onRender:()=>{k?.()}}}function Rt(s,t){return lt(s,d=>{d!==void 0&&(t.value=d)}),F(()=>s.value===void 0?t.value:s.value)}function Mt(){const s=V(!1);return Ye(()=>{s.value=!0}),rt(s)}function he(s,...t){if(Array.isArray(s))s.forEach(d=>he(d,...t));else return s(...t)}function Ne(s){return s.some(t=>ze(t)?!(t.type===We||t.type===G&&!Ne(t.children)):!0)?s:null}function ee(s,t){return t(s&&Ne(s())||null)}function Ce(s){return!(s&&Ne(s()))}const Le=ct("n-form-item");function zt(s,{defaultSize:t="medium",mergedSize:d,mergedDisabled:u}={}){const _=ge(Le,null);ut(Le,null);const h=F(d?()=>d(_):()=>{const{size:a}=s;if(a)return a;if(_){const{mergedSize:k}=_;if(k.value!==void 0)return k.value}return t}),x=F(u?()=>u(_):()=>{const{disabled:a}=s;return a!==void 0?a:_?_.disabled.value:!1}),B=F(()=>{const{status:a}=s;return a||_?.mergedValidationStatus.value});return dt(()=>{_&&_.restoreValidation()}),{mergedSizeRef:h,mergedDisabledRef:x,mergedStatusRef:B,nTriggerFormBlur(){_&&_.handleContentBlur()},nTriggerFormChange(){_&&_.handleContentChange()},nTriggerFormFocus(){_&&_.handleContentFocus()},nTriggerFormInput(){_&&_.handleContentInput()}}}var Je=ve({name:"BaseIconSwitchTransition",setup(s,{slots:t}){const d=Mt();return()=>(w(),ce(_t,{name:"icon-switch-transition",appear:d.value},Tt(t),1032,["appear"]))}});const{cubicBezierEaseInOut:Ft}=mt;function pe({originalTransform:s="",left:t=0,top:d=0,transition:u=`all .3s ${Ft} !important`}={}){return[K("&.icon-switch-transition-enter-from, &.icon-switch-transition-leave-to",{transform:`${s} scale(0.75)`,left:t,top:d,opacity:0}),K("&.icon-switch-transition-enter-to, &.icon-switch-transition-leave-from",{transform:`scale(1) ${s}`,left:t,top:d,opacity:1}),K("&.icon-switch-transition-enter-active, &.icon-switch-transition-leave-active",{transformOrigin:"center",position:"absolute",left:t,top:d,transition:u})]}var Nt=K([K("@keyframes rotator",`
import{a0 as ge,h as F,a1 as Ze,a2 as Me,a3 as Xe,a4 as Qe,a5 as Pe,a6 as et,o as w,a7 as ze,z as ce,c as y,F as G,b as e,a8 as We,a9 as tt,e as st,aa as nt,G as Fe,A as it,ab as ot,ac as at,j as V,ad as Ae,ae as K,J as lt,I as Ye,af as rt,P as dt,ag as ct,ah as ut,d as ve,ai as _t,aj as mt,ak as Ue,al as b,n as Re,am as Ge,an as ft,ao as ht,ap as pt,aq as I,ar as Ee,as as qe,at as Q,au as gt,u as vt,i as bt,a as wt,t as l,f as o,q as M,w as He,C as f,D as v,g as L,Z as _e,s as Oe,R as ke,S as p,H as re,B as yt,_ as xt}from"./index-BKnWAKao.js";import{f as kt,g as St,h as De,i as Ct}from"./admin-KnbIpHLF.js";import{u as Bt}from"./auth-Cp2GGuZy.js";function Vt(s={},t={defaultBordered:!0}){const d=ge(Me,null);return{inlineThemeDisabled:d?.inlineThemeDisabled,mergedRtlRef:d?.mergedRtlRef,mergedComponentPropsRef:d?.mergedComponentPropsRef,mergedBreakpointsRef:d?.mergedBreakpointsRef,mergedBorderedRef:F(()=>{const{bordered:u}=s;return u!==void 0?u:d?.mergedBorderedRef.value??t.defaultBordered??!0}),mergedClsPrefixRef:d?d.mergedClsPrefixRef:Ze("n"),namespaceRef:F(()=>d?.mergedNamespaceRef.value)}}function $t(s,t,d){if(!t)return;const u=Xe(),_=ge(Me,null),h=()=>{const x=d.value;t.mount({id:x===void 0?s:x+s,head:!0,anchorMetaName:Pe,props:{bPrefix:x?`.${x}-`:void 0},ssr:u,parent:_?.styleMountTarget}),_?.preflightStyleDisabled||et.mount({id:"n-global",head:!0,anchorMetaName:Pe,ssr:u,parent:_?.styleMountTarget})};u?h():Qe(h)}function z(s,t=1){let d=Fe,u=!1;return typeof s=="function"&&(u=!0,w(),d=ce,s=s()),ze(s)?u?ce(Ie(s)):Ie(s):Array.isArray(s)?u?y(G,null,s.map(_=>z(()=>_)),-2):e(G,null,s.slice()):s==null||typeof s=="boolean"?d(We):d(tt,null,String(s),t)}function Ie(s){return s.el===null&&s.patchFlag!==-1||s.memo?s:nt(s)}const Tt=s=>typeof s=="function"||Object.prototype.toString.call(s)==="[object Object]"&&!ze(s)?s:{default:it(()=>[z(()=>s)])},C=s=>st(s)||null;function j(s){return typeof s=="string"?s.endsWith("px")?Number(s.slice(0,s.length-2)):Number(s):s}function Se(s){if(s!=null)return typeof s=="number"?`${s}px`:s.endsWith("px")?s:`${s}px`}function Ut(s,t,d,u){d||ot("useThemeClass","cssVarsRef is not passed");const _=ge(Me,null),h=_?.mergedThemeHashRef,x=_?.styleMountTarget,B=V(""),a=Xe();let k;const $=`__${s}`,R=()=>{let m=$;const T=t?t.value:void 0,N=h?.value;N&&(m+=`-${N}`),T&&(m+=`-${T}`);const{themeOverrides:E,builtinThemeOverrides:q}=u;E&&(m+=`-${Ae(JSON.stringify(E))}`),q&&(m+=`-${Ae(JSON.stringify(q))}`),B.value=m,k=()=>{const te=d.value;let se="";for(const ne in te)se+=`${ne}: ${te[ne]};`;K(`.${m}`,se).mount({id:m,ssr:a,parent:x}),k=void 0}};return at(()=>{R()}),{themeClass:B,onRender:()=>{k?.()}}}function Rt(s,t){return lt(s,d=>{d!==void 0&&(t.value=d)}),F(()=>s.value===void 0?t.value:s.value)}function Mt(){const s=V(!1);return Ye(()=>{s.value=!0}),rt(s)}function he(s,...t){if(Array.isArray(s))s.forEach(d=>he(d,...t));else return s(...t)}function Ne(s){return s.some(t=>ze(t)?!(t.type===We||t.type===G&&!Ne(t.children)):!0)?s:null}function ee(s,t){return t(s&&Ne(s())||null)}function Ce(s){return!(s&&Ne(s()))}const Le=ct("n-form-item");function zt(s,{defaultSize:t="medium",mergedSize:d,mergedDisabled:u}={}){const _=ge(Le,null);ut(Le,null);const h=F(d?()=>d(_):()=>{const{size:a}=s;if(a)return a;if(_){const{mergedSize:k}=_;if(k.value!==void 0)return k.value}return t}),x=F(u?()=>u(_):()=>{const{disabled:a}=s;return a!==void 0?a:_?_.disabled.value:!1}),B=F(()=>{const{status:a}=s;return a||_?.mergedValidationStatus.value});return dt(()=>{_&&_.restoreValidation()}),{mergedSizeRef:h,mergedDisabledRef:x,mergedStatusRef:B,nTriggerFormBlur(){_&&_.handleContentBlur()},nTriggerFormChange(){_&&_.handleContentChange()},nTriggerFormFocus(){_&&_.handleContentFocus()},nTriggerFormInput(){_&&_.handleContentInput()}}}var Je=ve({name:"BaseIconSwitchTransition",setup(s,{slots:t}){const d=Mt();return()=>(w(),ce(_t,{name:"icon-switch-transition",appear:d.value},Tt(t),1032,["appear"]))}});const{cubicBezierEaseInOut:Ft}=mt;function pe({originalTransform:s="",left:t=0,top:d=0,transition:u=`all .3s ${Ft} !important`}={}){return[K("&.icon-switch-transition-enter-from, &.icon-switch-transition-leave-to",{transform:`${s} scale(0.75)`,left:t,top:d,opacity:0}),K("&.icon-switch-transition-enter-to, &.icon-switch-transition-leave-from",{transform:`scale(1) ${s}`,left:t,top:d,opacity:1}),K("&.icon-switch-transition-enter-active, &.icon-switch-transition-leave-active",{transformOrigin:"center",position:"absolute",left:t,top:d,transition:u})]}var Nt=K([K("@keyframes rotator",`
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
@@ -1 +1 @@
import{d as z,u as E,a as x,c as i,G as B,f as t,A as m,b as a,F as _,r as v,az as S,t as r,h as d,aA as p,aB as T,O as A,o,z as M,q as V,e as b,aC as w}from"./index-DYsKpclu.js";const D={class:"site-nav"},F=["src"],I={class:"brand-name"},O=["aria-label"],R={class:"nav-controls"},U=["aria-label"],q=["aria-checked","title","onClick"],G={class:"nav-control-icon","aria-hidden":"true"},H=["title"],K=z({__name:"SiteNav",setup($){const{t:s}=E(),c=x(),{mode:u,setMode:k}=w(),g=d(()=>[{to:"/",label:s("nav.home"),match:n=>n==="/"}]);function y(n){return n.match(location.pathname)}const C={light:"☀️",dark:"🌙",system:"💻"},f=d(()=>({light:s("theme.light"),dark:s("theme.dark"),system:s("theme.system")})),L=d(()=>p()==="zh-CN"?"中文":"English");function N(){const n=p()==="zh-CN"?"en-US":"zh-CN";T(n)}return(n,l)=>{const h=A("RouterLink");return o(),i("header",D,[B(h,{class:"brand",to:"/",title:t(s)("nav.homeTitle",{name:t(c).displayName})},{default:m(()=>[a("img",{src:t(c).displayLogoUrl,alt:"Logo",onError:l[0]||(l[0]=e=>e.target.style.visibility="hidden")},null,40,F),a("span",I,r(t(c).displayName),1)]),_:1},8,["title"]),a("nav",{class:"nav-links","aria-label":t(s)("nav.mainNav")},[(o(!0),i(_,null,v(g.value,e=>(o(),M(h,{key:e.to,to:e.to,class:b({"router-link-active":y(e)})},{default:m(()=>[V(r(e.label),1)]),_:2},1032,["to","class"]))),128))],8,O),a("div",R,[a("div",{class:"theme-seg",role:"radiogroup","aria-label":t(s)("theme.label")},[(o(!0),i(_,null,v(t(S),e=>(o(),i("button",{key:e,type:"button",role:"radio","aria-checked":t(u)===e,class:b({active:t(u)===e}),title:f.value[e],onClick:j=>t(k)(e)},[a("span",G,r(C[e]),1)],10,q))),128))],8,U),a("button",{class:"nav-control",type:"button",title:t(s)("lang.label"),onClick:N},[l[1]||(l[1]=a("span",{class:"nav-control-icon","aria-hidden":"true"},"🌐",-1)),a("span",null,r(L.value),1)],8,H)])])}}});export{K as _};
import{d as z,u as E,a as x,c as i,G as B,f as t,A as m,b as a,F as _,r as v,az as S,t as r,h as d,aA as p,aB as T,O as A,o,z as M,q as V,e as b,aC as w}from"./index-BKnWAKao.js";const D={class:"site-nav"},F=["src"],I={class:"brand-name"},O=["aria-label"],R={class:"nav-controls"},U=["aria-label"],q=["aria-checked","title","onClick"],G={class:"nav-control-icon","aria-hidden":"true"},H=["title"],K=z({__name:"SiteNav",setup($){const{t:s}=E(),c=x(),{mode:u,setMode:k}=w(),g=d(()=>[{to:"/",label:s("nav.home"),match:n=>n==="/"}]);function y(n){return n.match(location.pathname)}const C={light:"☀️",dark:"🌙",system:"💻"},f=d(()=>({light:s("theme.light"),dark:s("theme.dark"),system:s("theme.system")})),L=d(()=>p()==="zh-CN"?"中文":"English");function N(){const n=p()==="zh-CN"?"en-US":"zh-CN";T(n)}return(n,l)=>{const h=A("RouterLink");return o(),i("header",D,[B(h,{class:"brand",to:"/",title:t(s)("nav.homeTitle",{name:t(c).displayName})},{default:m(()=>[a("img",{src:t(c).displayLogoUrl,alt:"Logo",onError:l[0]||(l[0]=e=>e.target.style.visibility="hidden")},null,40,F),a("span",I,r(t(c).displayName),1)]),_:1},8,["title"]),a("nav",{class:"nav-links","aria-label":t(s)("nav.mainNav")},[(o(!0),i(_,null,v(g.value,e=>(o(),M(h,{key:e.to,to:e.to,class:b({"router-link-active":y(e)})},{default:m(()=>[V(r(e.label),1)]),_:2},1032,["to","class"]))),128))],8,O),a("div",R,[a("div",{class:"theme-seg",role:"radiogroup","aria-label":t(s)("theme.label")},[(o(!0),i(_,null,v(t(S),e=>(o(),i("button",{key:e,type:"button",role:"radio","aria-checked":t(u)===e,class:b({active:t(u)===e}),title:f.value[e],onClick:j=>t(k)(e)},[a("span",G,r(C[e]),1)],10,q))),128))],8,U),a("button",{class:"nav-control",type:"button",title:t(s)("lang.label"),onClick:N},[l[1]||(l[1]=a("span",{class:"nav-control-icon","aria-hidden":"true"},"🌐",-1)),a("span",null,r(L.value),1)],8,H)])])}}});export{K as _};
@@ -1 +1 @@
import{v as n,S as e,x as s}from"./index-DYsKpclu.js";function u(t){return n(s.adminLogin,{method:"POST",json:{password:t}})}function m(){return n(s.adminVerify)}async function l(){await n(s.adminLogout,{method:"POST"})}async function g(t){const a=await n(s.adminFileList,{query:{page:t.page,size:t.size,keyword:t.keyword||void 0}}),o=e(a,["data","list","items","files"])??[],d=Number(e(a,["total","count"])??o.length);return{page:Number(e(a,["page"])??t.page),size:Number(e(a,["size"])??t.size),total:d,data:o.map(i=>({id:Number(e(i,["id"])??0),code:String(e(i,["code"])??""),name:String(e(i,["name"])??`${e(i,["prefix"])??""}${e(i,["suffix"])??""}`),suffix:String(e(i,["suffix"])??""),size:Number(e(i,["size"])??0),isText:!!(e(i,["isText","is_text"])??!1),expiredAt:e(i,["expiredAt","expired_at","expires_at"])??null,expiredCount:e(i,["expiredCount","expired_count"])??null,usedCount:Number(e(i,["usedCount","used_count"])??0),createdAt:e(i,["createdAt","created_at"])??null,isExpired:!!(e(i,["isExpired","is_expired"])??!1)}))}}async function p(t){await n(s.adminFileDelete,{method:"DELETE",json:{id:t}})}async function f(t){await n(s.adminFileBatchDelete,{method:"POST",json:{ids:t}})}async function y(t){await n(s.adminFileUpdate,{method:"PATCH",json:t})}async function w(){const t=await n(s.adminConfigGet);if(t&&typeof t=="object"&&!Array.isArray(t)){const a=t;return e(a,["config","data","settings"])??a}return{}}async function S(t){await n(s.adminConfigUpdate,{method:"PATCH",json:t})}async function _(t){const a=await n(s.adminStorageSwitch,{method:"POST",json:{engine:t}});return String(a?.engine??t)}async function x(t,a){await n(s.adminPasswordUpdate,{method:"PATCH",json:{old_password:t,new_password:a}})}async function b(t){const a=await n(s.adminAuditList,{query:{page:t.page,size:t.size,action:t.action||void 0,result:t.result||void 0,ip:t.ip||void 0,start_time:t.startTime||void 0,end_time:t.endTime||void 0}}),o=e(a,["data","list","items","logs"])??[],d=Number(e(a,["total","count"])??o.length);return{page:Number(e(a,["page"])??t.page),size:Number(e(a,["size"])??t.size),total:d,data:o.map((i,r)=>({id:Number(e(i,["id"])??r+1),action:String(e(i,["action"])??""),result:String(e(i,["result"])??""),fileCode:String(e(i,["file_code","fileCode","code"])??""),fileName:String(e(i,["file_name","fileName","name"])??""),sizeBytes:e(i,["size_bytes","sizeBytes","size"])??null,transferredBytes:e(i,["transferred_bytes","transferredBytes","bytes"])??null,ip:String(e(i,["ip","client_ip","clientIp"])??""),userAgent:String(e(i,["user_agent","userAgent"])??""),deviceOs:String(e(i,["device_os","deviceOs","os"])??""),deviceBrowser:String(e(i,["device_browser","deviceBrowser","browser"])??""),deviceType:String(e(i,["device_type","deviceType"])??""),actor:String(e(i,["actor"])??""),errorMsg:String(e(i,["error_msg","errorMsg","error"])??""),durationMs:e(i,["duration_ms","durationMs","duration"])??null,createdAt:e(i,["created_at","createdAt","time"])??null}))}}export{g as a,f as b,p as c,y as d,b as e,w as f,_ as g,S as h,x as i,l as j,m as k,u as l};
import{v as n,S as e,x as s}from"./index-BKnWAKao.js";function u(t){return n(s.adminLogin,{method:"POST",json:{password:t}})}function m(){return n(s.adminVerify)}async function l(){await n(s.adminLogout,{method:"POST"})}async function g(t){const a=await n(s.adminFileList,{query:{page:t.page,size:t.size,keyword:t.keyword||void 0}}),o=e(a,["data","list","items","files"])??[],d=Number(e(a,["total","count"])??o.length);return{page:Number(e(a,["page"])??t.page),size:Number(e(a,["size"])??t.size),total:d,data:o.map(i=>({id:Number(e(i,["id"])??0),code:String(e(i,["code"])??""),name:String(e(i,["name"])??`${e(i,["prefix"])??""}${e(i,["suffix"])??""}`),suffix:String(e(i,["suffix"])??""),size:Number(e(i,["size"])??0),isText:!!(e(i,["isText","is_text"])??!1),expiredAt:e(i,["expiredAt","expired_at","expires_at"])??null,expiredCount:e(i,["expiredCount","expired_count"])??null,usedCount:Number(e(i,["usedCount","used_count"])??0),createdAt:e(i,["createdAt","created_at"])??null,isExpired:!!(e(i,["isExpired","is_expired"])??!1)}))}}async function p(t){await n(s.adminFileDelete,{method:"DELETE",json:{id:t}})}async function f(t){await n(s.adminFileBatchDelete,{method:"POST",json:{ids:t}})}async function y(t){await n(s.adminFileUpdate,{method:"PATCH",json:t})}async function w(){const t=await n(s.adminConfigGet);if(t&&typeof t=="object"&&!Array.isArray(t)){const a=t;return e(a,["config","data","settings"])??a}return{}}async function S(t){await n(s.adminConfigUpdate,{method:"PATCH",json:t})}async function _(t){const a=await n(s.adminStorageSwitch,{method:"POST",json:{engine:t}});return String(a?.engine??t)}async function x(t,a){await n(s.adminPasswordUpdate,{method:"PATCH",json:{old_password:t,new_password:a}})}async function b(t){const a=await n(s.adminAuditList,{query:{page:t.page,size:t.size,action:t.action||void 0,result:t.result||void 0,ip:t.ip||void 0,start_time:t.startTime||void 0,end_time:t.endTime||void 0}}),o=e(a,["data","list","items","logs"])??[],d=Number(e(a,["total","count"])??o.length);return{page:Number(e(a,["page"])??t.page),size:Number(e(a,["size"])??t.size),total:d,data:o.map((i,r)=>({id:Number(e(i,["id"])??r+1),action:String(e(i,["action"])??""),result:String(e(i,["result"])??""),fileCode:String(e(i,["file_code","fileCode","code"])??""),fileName:String(e(i,["file_name","fileName","name"])??""),sizeBytes:e(i,["size_bytes","sizeBytes","size"])??null,transferredBytes:e(i,["transferred_bytes","transferredBytes","bytes"])??null,ip:String(e(i,["ip","client_ip","clientIp"])??""),userAgent:String(e(i,["user_agent","userAgent"])??""),deviceOs:String(e(i,["device_os","deviceOs","os"])??""),deviceBrowser:String(e(i,["device_browser","deviceBrowser","browser"])??""),deviceType:String(e(i,["device_type","deviceType"])??""),actor:String(e(i,["actor"])??""),errorMsg:String(e(i,["error_msg","errorMsg","error"])??""),durationMs:e(i,["duration_ms","durationMs","duration"])??null,createdAt:e(i,["created_at","createdAt","time"])??null}))}}export{g as a,f as b,p as c,y as d,b as e,w as f,_ as g,S as h,x as i,l as j,m as k,u as l};
@@ -1 +1 @@
import{av as o,aw as a,W as r}from"./index-DYsKpclu.js";import{j as n,k as i,l as c}from"./admin-DEOkRyTC.js";const s="fcb_admin_flag",l=o("auth",{state:()=>({token:r(),checked:!1}),getters:{isAuthed:t=>!!t.token},actions:{async login(t){const e=(await c(t))?.token;if(!e)throw new Error("登录响应缺少 token");this.token=e,a(e);try{localStorage.setItem(s,"1")}catch{}this.checked=!0},async verify(){if(!this.token)return!1;try{return await i(),this.checked=!0,!0}catch{return this.reset(),!1}},async logout(){try{this.token&&await n()}catch{}this.reset()},reset(){this.token="",this.checked=!1,a("");try{localStorage.removeItem(s)}catch{}}}});export{l as u};
import{av as o,aw as a,W as r}from"./index-BKnWAKao.js";import{j as n,k as i,l as c}from"./admin-KnbIpHLF.js";const s="fcb_admin_flag",l=o("auth",{state:()=>({token:r(),checked:!1}),getters:{isAuthed:t=>!!t.token},actions:{async login(t){const e=(await c(t))?.token;if(!e)throw new Error("登录响应缺少 token");this.token=e,a(e);try{localStorage.setItem(s,"1")}catch{}this.checked=!0},async verify(){if(!this.token)return!1;try{return await i(),this.checked=!0,!0}catch{return this.reset(),!1}},async logout(){try{this.token&&await n()}catch{}this.reset()},reset(){this.token="",this.checked=!1,a("");try{localStorage.removeItem(s)}catch{}}}});export{l as u};
@@ -1,5 +1,5 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DYsKpclu.js","assets/index-CtyCxWf5.css"])))=>i.map(i=>d[i]);
import{ay as i}from"./index-DYsKpclu.js";const p='# API 概述\n\n文件快传 Go 版(v2.5.6)对外提供一套 REST API,覆盖文本/文件分享、分片上传、\n预签名直传、管理后台与审计日志查询。本文档与 `server/internal/api/` 实际实现逐一对齐,\n交互式规范见站内 `/openapi`(源文件 `docs/openapi.yaml`)。\n\n## Base URL\n\n- 服务默认监听 `:8466`,Base URL 为 `http://<host>:8466`(下文示例统一用 `http://localhost:8466`)。\n- **业务路由挂根路径**(与参考实现一致):`/share/*`、`/chunk/*`、`/presign/*`、`/admin/*`、`/setup`。\n- 仅两个公共接口带 `/api/v1` 前缀:`/api/v1/health`、`/api/v1/config`。\n\n## 统一响应封装\n\n所有 JSON 接口返回统一结构,HTTP 状态码与 `code` 一致;失败时 `data` 缺省:\n\n```json\n{ "code": 200, "msg": "ok", "data": { } }\n```\n\n失败示例(404):\n\n```json\n{ "code": 404, "msg": "文件不存在" }\n```\n\n个别端点直接返回原始内容而非 JSON 封装(文档中已单独标注):\n\n| 端点 | 响应形式 |\n|---|---|\n| `GET /share/select?code=`(文本分享) | `text/plain; charset=utf-8` 正文 |\n| `GET /share/select?code=`(文件分享) | 文件二进制流(200/206,支持 Range) |\n| `GET /share/download?key=&code=`(文件分享) | 文件二进制流(200/206,支持 Range) |\n| `GET /admin/file/download?id=`(文件分享) | 文件二进制流 |\n| `GET /setup` / `POST /setup`(表单) | HTML 向导/成功页 |\n\n## 字段命名约定\n\n- 接口字段以 **snake_case** 为主(`file_code`、`size_bytes`)。\n- 文件列表与审计日志的行字段同时输出 **snake_case 与 camelCase 双份**(如 `expired_at` 与 `expiredAt`),文档以 snake_case 为准,camelCase 仅为前端兼容保留。\n\n## 认证\n\n- 游客接口无需认证;是否允许游客上传由配置 `openUpload` 控制(关闭时上传类接口要求管理员 `Authorization: Bearer <token>`,否则 403)。\n- 管理接口(`/admin/login` 除外)一律要求 `Authorization: Bearer <JWT>`,无效/缺失返回 401。\n- 详情见《认证与限流》。\n\n## 限流\n\n按 IP(可信代理场景解析 `X-Forwarded-For`)维度限流,超限返回 **423**:\n\n| 规则 | 计数时机 | 默认(次/窗口) | 相关配置 |\n|---|---|---|---|\n| `upload` | **上传成功**后计数 | 10 次 / 1 分钟 | `uploadCount` / `uploadMinute` |\n| `error` | 取件失败(404/过期)时计数 | 10 次 / 1 分钟 | `errorCount` / `errorMinute` |\n| `login` | 登录失败时计数 | 5 次 / 15 分钟 | `loginCount` / `loginMinute` |\n| `metadata` | 每次访问即计数 | 同 `error` | `errorCount` / `errorMinute` |\n\n## 初始化守卫\n\n系统未初始化(未设置管理员密码)时,除 `GET|POST /setup` 与 `GET /api/v1/health` 外,\n**所有接口一律返回 428**:\n\n```json\n{ "code": 428, "msg": "系统未初始化,请先完成初始化" }\n```\n\n首次部署请先访问 `GET /setup` 获取 HTML 向导,或直接 `POST /setup` 完成初始化(见《管理后台 API》初始化章节)。\n\n## 审计\n\n所有上传/下载端点经审计中间件自动落库(操作时间/IP/UA/设备解析/动作/结果/字节数/耗时/角色),\n失败与被拒绝的请求同样记录;管理端经 `GET /admin/audit/list` 查询,详见《审计日志》。\n\n## 端点总览\n\n| 模块 | 端点 |\n|---|---|\n| 公共 | `GET /api/v1/health` · `GET /api/v1/config` · `GET /robots.txt`(输出 `robotsText` 配置) |\n| 初始化 | `GET /setup` · `POST /setup` |\n| 文本分享 | `POST /share/text` |\n| 文件分享 | `POST /share/file` |\n| 查询与取件 | `GET/POST /share/metadata` · `GET /share/select` · `POST /share/select` · `GET /share/download` |\n| 分片上传 | `POST /chunk/upload/init` · `POST /chunk/upload/{uploadID}/{chunkIndex}` · `GET /chunk/upload/status/{uploadID}` · `POST /chunk/upload/complete/{uploadID}` · `DELETE /chunk/upload/{uploadID}` |\n| 预签名直传 | `POST /presign/upload/init` · `PUT /presign/upload/proxy/{uploadID}` · `POST /presign/upload/confirm/{uploadID}` · `GET /presign/upload/status/{uploadID}` · `DELETE /presign/upload/{uploadID}` |\n| 管理后台 | `POST /admin/login` · `GET /admin/verify` · `POST /admin/logout` · `GET /admin/dashboard` · 文件管理 `/admin/file/*` · 配置 `/admin/config/*` · 密码 `/admin/settings/password` |\n| 审计日志 | `GET /admin/audit/list`(别名 `/admin/audit/logs`) |\n\n## 时间与编码\n\n- 时间字段一律 RFC 3339(如 `2025-06-01T12:00:00+08:00`);管理员会话过期时间为 Unix 秒。\n- 请求体支持 `application/json` 与 `application/x-www-form-urlencoded`(上传类为 `multipart/form-data`),文档示例以 JSON/curl 为主。\n- CORS:公开接口放开(Bearer 认证,无 Cookie CSRF 面);**管理端 `/admin/*` 已收紧**——携带 Origin 且Line truncated
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-BKnWAKao.js","assets/index-CtyCxWf5.css"])))=>i.map(i=>d[i]);
import{ay as i}from"./index-BKnWAKao.js";const p='# API 概述\n\n文件快传 Go 版(26.9)对外提供一套 REST API,覆盖文本/文件分享、分片上传、\n预签名直传、管理后台与审计日志查询。本文档与 `server/internal/api/` 实际实现逐一对齐,\n交互式规范见站内 `/openapi`(源文件 `docs/openapi.yaml`)。\n\n## Base URL\n\n- 服务默认监听 `:8466`,Base URL 为 `http://<host>:8466`(下文示例统一用 `http://localhost:8466`)。\n- **业务路由挂根路径**(与参考实现一致):`/share/*`、`/chunk/*`、`/presign/*`、`/admin/*`、`/setup`。\n- 仅两个公共接口带 `/api/v1` 前缀:`/api/v1/health`、`/api/v1/config`。\n\n## 统一响应封装\n\n所有 JSON 接口返回统一结构,HTTP 状态码与 `code` 一致;失败时 `data` 缺省:\n\n```json\n{ "code": 200, "msg": "ok", "data": { } }\n```\n\n失败示例(404):\n\n```json\n{ "code": 404, "msg": "文件不存在" }\n```\n\n个别端点直接返回原始内容而非 JSON 封装(文档中已单独标注):\n\n| 端点 | 响应形式 |\n|---|---|\n| `GET /share/select?code=`(文本分享) | `text/plain; charset=utf-8` 正文 |\n| `GET /share/select?code=`(文件分享) | 文件二进制流(200/206,支持 Range) |\n| `GET /share/download?key=&code=`(文件分享) | 文件二进制流(200/206,支持 Range) |\n| `GET /admin/file/download?id=`(文件分享) | 文件二进制流 |\n| `GET /setup` / `POST /setup`(表单) | HTML 向导/成功页 |\n\n## 字段命名约定\n\n- 接口字段以 **snake_case** 为主(`file_code`、`size_bytes`)。\n- 文件列表与审计日志的行字段同时输出 **snake_case 与 camelCase 双份**(如 `expired_at` 与 `expiredAt`),文档以 snake_case 为准,camelCase 仅为前端兼容保留。\n\n## 认证\n\n- 游客接口无需认证;是否允许游客上传由配置 `openUpload` 控制(关闭时上传类接口要求管理员 `Authorization: Bearer <token>`,否则 403)。\n- 管理接口(`/admin/login` 除外)一律要求 `Authorization: Bearer <JWT>`,无效/缺失返回 401。\n- 详情见《认证与限流》。\n\n## 限流\n\n按 IP(可信代理场景解析 `X-Forwarded-For`)维度限流,超限返回 **423**:\n\n| 规则 | 计数时机 | 默认(次/窗口) | 相关配置 |\n|---|---|---|---|\n| `upload` | **上传成功**后计数 | 10 次 / 1 分钟 | `uploadCount` / `uploadMinute` |\n| `error` | 取件失败(404/过期)时计数 | 10 次 / 1 分钟 | `errorCount` / `errorMinute` |\n| `login` | 登录失败时计数 | 5 次 / 15 分钟 | `loginCount` / `loginMinute` |\n| `metadata` | 每次访问即计数 | 同 `error` | `errorCount` / `errorMinute` |\n\n## 初始化守卫\n\n系统未初始化(未设置管理员密码)时,除 `GET|POST /setup` 与 `GET /api/v1/health` 外,\n**所有接口一律返回 428**:\n\n```json\n{ "code": 428, "msg": "系统未初始化,请先完成初始化" }\n```\n\n首次部署请先访问 `GET /setup` 获取 HTML 向导,或直接 `POST /setup` 完成初始化(见《管理后台 API》初始化章节)。\n\n## 审计\n\n所有上传/下载端点经审计中间件自动落库(操作时间/IP/UA/设备解析/动作/结果/字节数/耗时/角色),\n失败与被拒绝的请求同样记录;管理端经 `GET /admin/audit/list` 查询,详见《审计日志》。\n\n## 端点总览\n\n| 模块 | 端点 |\n|---|---|\n| 公共 | `GET /api/v1/health` · `GET /api/v1/config` · `GET /robots.txt`(输出 `robotsText` 配置) |\n| 初始化 | `GET /setup` · `POST /setup` |\n| 文本分享 | `POST /share/text` |\n| 文件分享 | `POST /share/file` |\n| 查询与取件 | `GET/POST /share/metadata` · `GET /share/select` · `POST /share/select` · `GET /share/download` |\n| 分片上传 | `POST /chunk/upload/init` · `POST /chunk/upload/{uploadID}/{chunkIndex}` · `GET /chunk/upload/status/{uploadID}` · `POST /chunk/upload/complete/{uploadID}` · `DELETE /chunk/upload/{uploadID}` |\n| 预签名直传 | `POST /presign/upload/init` · `PUT /presign/upload/proxy/{uploadID}` · `POST /presign/upload/confirm/{uploadID}` · `GET /presign/upload/status/{uploadID}` · `DELETE /presign/upload/{uploadID}` |\n| 管理后台 | `POST /admin/login` · `GET /admin/verify` · `POST /admin/logout` · `GET /admin/dashboard` · 文件管理 `/admin/file/*` · 配置 `/admin/config/*` · 密码 `/admin/settings/password` |\n| 审计日志 | `GET /admin/audit/list`(别名 `/admin/audit/logs`) |\n\n## 时间与编码\n\n- 时间字段一律 RFC 3339(如 `2025-06-01T12:00:00+08:00`);管理员会话过期时间为 Unix 秒。\n- 请求体支持 `application/json` 与 `application/x-www-form-urlencoded`(上传类为 `multipart/form-data`),文档示例以 JSON/curl 为主。\n- CORS:公开接口放开(Bearer 认证,无 Cookie CSRF 面);**管理端 `/admin/*` 已收紧**——携带 Origin 且既Line truncated
查询分享元信息(不消耗次数)与真正取件(消耗次数)的完整接口。
除 \`metadata\` 每次 423 限流计数外,取件失败还会计入 \`error\` 限流。
@@ -438,7 +438,7 @@ curl -s -X POST http://localhost:8466/presign/upload/init \\
"code": 200, "msg": "ok",
"data": {
"upload_id": "6a1e…",
"upload_url": "https://minio:9000/filecodebox/share/data/2025/06/01/6a1e…/backup.zip?X-Amz-…",
"upload_url": "https://minio:9000/fileshare/share/data/2025/06/01/6a1e…/backup.zip?X-Amz-…",
"mode": "direct",
"expires_in": 900,
"file_path": "share/data/2025/06/01/6a1e…"
@@ -594,7 +594,7 @@ curl -s -X DELETE http://localhost:8466/presign/upload/6a1e…
\`\`\`json
{ "code": 404, "msg": "上传会话已过期" }
\`\`\`
`,_='# 管理后台 API\n\n管理端接口:除 `POST /admin/login` 与初始化向导 `/setup` 外,一律要求\n`Authorization: Bearer <token>`(见《认证与限流》),无效令牌 401。\n\n## 初始化向导:GET /setup\n\n未初始化时返回 HTML 配置页(站点名称、管理员密码、上传/限流/保存策略);\n已初始化时 `303` 重定向到 `/`。\n\n```bash\ncurl -i http://localhost:8466/setup\n```\n\n## 初始化提交:POST /setup\n\n表单(浏览器向导)或 JSON 均可;成功后写入库配置 KV 并生成密码哈希与 `jwt_secret`。\n表单提交返回成功 HTML 页;JSON 提交返回 JSON。\n\n**主要字段**:\n\n| 字段 | 必需 | 默认 | 说明 |\n|---|---|---|---|\n| `admin_password` | ✅ | - | 管理员密码(≥8 位) |\n| `confirm_password` | ✅ | - | 确认密码(须一致) |\n| `site_name` | ❌ | 文件快传 | 站点名称 |\n| `upload_size_value` / `upload_size_unit` | ❌ | 10 / MB | 单文件大小限制(单位 KB/MB/GB) |\n| `save_time_value` / `save_time_unit` | ❌ | 0 / day | 最长保存秒数(0=不限) |\n| `expireStyle` | ❌ | day,hour,minute,forever,count | 过期方式(可多值/逗号分隔) |\n| `code_generate_type` | ❌ | secret | 取件码类型 `number`/`secret` |\n| `errorCount` / `errorMinute` | ❌ | 10 / 1 | 取件错误限流 |\n| `loginCount` / `loginMinute` | ❌ | 5 / 15 | 登录失败限流 |\n| `uploadCount` / `uploadMinute` | ❌ | 10 / 1 | 上传限流 |\n| `allowed_file_types` | ❌ | `*` | 逗号分隔白名单 |\n| `openUpload` / `enableChunk` | ❌ | 1 / 0 | 游客上传 / 分片开关(`1`/`true`/`on`/`yes`) |\n\n```bash\ncurl -s -X POST http://localhost:8466/setup \\\n -H \'Content-Type: application/json\' \\\n -d \'{"admin_password":"admin12345","confirm_password":"admin12345","site_name":"我的文件柜","upload_size_value":10,"upload_size_unit":"MB"}\'\n```\n\n```json\n{ "code": 200, "msg": "ok", "data": { "ok": true, "admin": "/#/admin" } }\n```\n\n**错误响应**(400,HTML 表单时内嵌错误提示):\n\n```json\n{ "code": 400, "msg": "管理员密码至少 8 位" }\n```\n\n## 登录:POST /admin/login\n\n```bash\ncurl -s -X POST http://localhost:8466/admin/login \\\n -H \'Content-Type: application/json\' \\\n -d \'{"password":"admin12345"}\'\n```\n\n**成功响应**(200):\n\n```json\n{\n "code": 200, "msg": "ok",\n "data": {\n "id": "admin", "username": "admin",\n "token": "eyJhbGciOiJIUzI1NiIs...",\n "token_type": "Bearer",\n "expires_at": 1750000000,\n "expires_in": 604800\n }\n}\n```\n\n**错误响应**:\n\n```json\n{ "code": 401, "msg": "密码错误" }\n```\n\n```json\n{ "code": 423, "msg": "请求次数过多,请稍后再试" }\n```\n\n## 校验会话:GET /admin/verify\n\n```bash\ncurl -s http://localhost:8466/admin/verify -H "Authorization: Bearer $TOKEN"\n```\n\n```json\n{ "code": 200, "msg": "ok", "data": { "id": "admin", "username": "admin", "token": "eyJ…", "token_type": "Bearer", "expires_at": 1750000000 } }\n```\n\n## 登出:POST /admin/logout\n\n无状态 JWT,服务端仅返回确认(客户端应丢弃令牌):\n\n```json\n{ "code": 200, "msg": "ok", "data": { "ok": true } }\n```\n\n## 仪表盘:GET /admin/dashboard\n\n```bash\ncurl -s http://localhost:8466/admin/dashboard -H "Authorization: Bearer $TOKEN"\n```\n\n```json\n{\n "code": 200, "msg": "ok",\n "data": {\n "totalFiles": 42,\n "storageUsed": "123456789",\n "sysUptime": 1750000000000,\n "yesterdayCount": 5, "yesterdaySize": "1048576",\n "todayCount": 12, "todaySize": "5242880",\n "activeCount": 40, "expiredCount": 2,\n "textCount": 10, "fileCount": 32, "chunkedCount": 3,\n "usedCount": 156,\n "storageBackend": "local",\n "uploadSizeLimit": 10485760,\n "openUpload": 1, "enableChunk": 1,\n "maxSaveSeconds": 0,\n "topSuffixes": [ { "suffix": ".pdf", "count": 12 }, { "suffix": "Text", "count": 10 } ],\n "recentFiles": [ { "id": 42, "code": "K3P9W", "name": "report.pdf", "size": 1048576, "created_at": "2025-06-01T12:00:00+08:00", "expired_at": "2025-06-08T12:00:00+08:00", "is_expired": false, "expired_count": -1, "used_count": 3, "is_text": false, "is_chunked": false, "is_permanent": false, "has_download_limit": false, "remaining_downloads": null, "file_hash": null, "prefix": "report", "suffix": ".pdf", "text": false, "createdAt": "2025-06-01T12:00:00+08:00", "expiredAt": "2025-06-08T12:00:00+08:00", "isExpired": false, "expiredCount": -1, "usedCount": 3, "isText": false, "isChunked": false, "isPermanent": false, "hasDownloadLimit": false, "remainingDownloads": null, "fileHash": null } ],\n "recentActivities": []\n }\n}\n```\n\n> `storageUsed`/`todaySize`/`yesterdaySize` 为字符串字节数;`sysUptime` 为服务启动时刻的 Unix 毫秒。\n\n## 文件列表:GET /admin/file/list\n\n**参数**:\n\n| 参数 | 默认 | 说明 |\n|---|---|---|\n| `page` / `size` | 1 / 10 | 分页(size 1~10 Line truncated
`,_='# 管理后台 API\n\n管理端接口:除 `POST /admin/login` 与初始化向导 `/setup` 外,一律要求\n`Authorization: Bearer <token>`(见《认证与限流》),无效令牌 401。\n\n## 初始化向导:GET /setup\n\n未初始化时返回 HTML 配置页(站点名称、管理员密码、上传/限流/保存策略);\n已初始化时 `303` 重定向到 `/`。\n\n```bash\ncurl -i http://localhost:8466/setup\n```\n\n## 初始化提交:POST /setup\n\n表单(浏览器向导)或 JSON 均可;成功后写入库配置 KV 并生成密码哈希与 `jwt_secret`。\n表单提交返回成功 HTML 页;JSON 提交返回 JSON。\n\n**主要字段**:\n\n| 字段 | 必需 | 默认 | 说明 |\n|---|---|---|---|\n| `admin_password` | ✅ | - | 管理员密码(≥8 位) |\n| `confirm_password` | ✅ | - | 确认密码(须一致) |\n| `site_name` | ❌ | 文件快传 | 站点名称 |\n| `upload_size_value` / `upload_size_unit` | ❌ | 10 / MB | 单文件大小限制(单位 KB/MB/GB) |\n| `save_time_value` / `save_time_unit` | ❌ | 0 / day | 最长保存秒数(0=不限) |\n| `expireStyle` | ❌ | day,hour,minute,forever,count | 过期方式(可多值/逗号分隔) |\n| `code_generate_type` | ❌ | secret | 取件码类型 `number`/`secret` |\n| `errorCount` / `errorMinute` | ❌ | 10 / 1 | 取件错误限流 |\n| `loginCount` / `loginMinute` | ❌ | 5 / 15 | 登录失败限流 |\n| `uploadCount` / `uploadMinute` | ❌ | 10 / 1 | 上传限流 |\n| `allowed_file_types` | ❌ | `*` | 逗号分隔白名单 |\n| `openUpload` / `enableChunk` | ❌ | 1 / 0 | 游客上传 / 分片开关(`1`/`true`/`on`/`yes`) |\n\n```bash\ncurl -s -X POST http://localhost:8466/setup \\\n -H \'Content-Type: application/json\' \\\n -d \'{"admin_password":"admin12345","confirm_password":"admin12345","site_name":"我的文件柜","upload_size_value":10,"upload_size_unit":"MB"}\'\n```\n\n```json\n{ "code": 200, "msg": "ok", "data": { "ok": true, "admin": "/#/admin" } }\n```\n\n**错误响应**(400,HTML 表单时内嵌错误提示):\n\n```json\n{ "code": 400, "msg": "管理员密码至少 8 位" }\n```\n\n## 登录:POST /admin/login\n\n```bash\ncurl -s -X POST http://localhost:8466/admin/login \\\n -H \'Content-Type: application/json\' \\\n -d \'{"password":"admin12345"}\'\n```\n\n**成功响应**(200):\n\n```json\n{\n "code": 200, "msg": "ok",\n "data": {\n "id": "admin", "username": "admin",\n "token": "eyJhbGciOiJIUzI1NiIs...",\n "token_type": "Bearer",\n "expires_at": 1750000000,\n "expires_in": 604800\n }\n}\n```\n\n**错误响应**:\n\n```json\n{ "code": 401, "msg": "密码错误" }\n```\n\n```json\n{ "code": 423, "msg": "请求次数过多,请稍后再试" }\n```\n\n## 校验会话:GET /admin/verify\n\n```bash\ncurl -s http://localhost:8466/admin/verify -H "Authorization: Bearer $TOKEN"\n```\n\n```json\n{ "code": 200, "msg": "ok", "data": { "id": "admin", "username": "admin", "token": "eyJ…", "token_type": "Bearer", "expires_at": 1750000000 } }\n```\n\n## 登出:POST /admin/logout\n\n无状态 JWT,服务端仅返回确认(客户端应丢弃令牌):\n\n```json\n{ "code": 200, "msg": "ok", "data": { "ok": true } }\n```\n\n## 仪表盘:GET /admin/dashboard\n\n```bash\ncurl -s http://localhost:8466/admin/dashboard -H "Authorization: Bearer $TOKEN"\n```\n\n```json\n{\n "code": 200, "msg": "ok",\n "data": {\n "totalFiles": 42,\n "storageUsed": "123456789",\n "sysUptime": 1750000000000,\n "yesterdayCount": 5, "yesterdaySize": "1048576",\n "todayCount": 12, "todaySize": "5242880",\n "activeCount": 40, "expiredCount": 2,\n "textCount": 10, "fileCount": 32, "chunkedCount": 3,\n "usedCount": 156,\n "storageBackend": "local",\n "uploadSizeLimit": 10485760,\n "openUpload": 1, "enableChunk": 1,\n "maxSaveSeconds": 0,\n "topSuffixes": [ { "suffix": ".pdf", "count": 12 }, { "suffix": "Text", "count": 10 } ],\n "recentFiles": [ { "id": 42, "code": "K3P9W", "name": "report.pdf", "size": 1048576, "created_at": "2025-06-01T12:00:00+08:00", "expired_at": "2025-06-08T12:00:00+08:00", "is_expired": false, "expired_count": -1, "used_count": 3, "is_text": false, "is_chunked": false, "is_permanent": false, "has_download_limit": false, "remaining_downloads": null, "file_hash": null, "prefix": "report", "suffix": ".pdf", "text": false, "createdAt": "2025-06-01T12:00:00+08:00", "expiredAt": "2025-06-08T12:00:00+08:00", "isExpired": false, "expiredCount": -1, "usedCount": 3, "isText": false, "isChunked": false, "isPermanent": false, "hasDownloadLimit": false, "remainingDownloads": null, "fileHash": null } ],\n "recentActivities": []\n }\n}\n```\n\n> `storageUsed`/`todaySize`/`yesterdaySize` 为字符串字节数;`sysUptime` 为服务启动时刻的 Unix 毫秒。\n\n## 文件列表:GET /admin/file/list\n\n**参数**:\n\n| 参数 | 默认 | 说明 |\n|---|---|---|\n| `page` / `size` | 1 / 10 | 分页(size 1~10 Line truncated
info:
title: 文件快传 Go 版 API
version: 2.5.6
@@ -2514,4 +2514,4 @@ components:
created_at: { type: string }
security: []
`,S=Object.assign({"../../../docs/api/00-overview.md":p,"../../../docs/api/01-auth.md":d,"../../../docs/api/02-text-share.md":c,"../../../docs/api/03-file-share.md":l,"../../../docs/api/04-pickup.md":m,"../../../docs/api/05-chunk-upload.md":u,"../../../docs/api/06-presign.md":g,"../../../docs/api/07-admin.md":_,"../../../docs/api/08-audit.md":y,"../../../docs/api/09-storage.md":h,"../../../docs/api/10-config.md":f,"../../../docs/api/11-errors.md":x,"../../../docs/api/12-logo.md":b}),v=["README","share","chunk","presign","admin","audit","errors","config","logo","webdav","env"];function j(n){return(n.split("/").pop()??n).replace(/\.md$/,"")}function E(n,e){const o=/^#\s+(.+)$/m.exec(n);return o?o[1].trim():e}const r=Object.entries(S).map(([n,e])=>{const o=j(n),s=v.indexOf(o);return{slug:o,title:E(e,o),embedded:e,order:s>=0?s:100+o.localeCompare("")}}).sort((n,e)=>n.order-e.order||n.slug.localeCompare(e.slug));r.length>0;const k=Object.assign({"../../../docs/openapi.yaml":T}),O=Object.values(k)[0]??null;async function C(n){if(n.embedded!==null)return n.embedded;const{API_BASE:e}=await i(async()=>{const{API_BASE:t}=await import("./index-DYsKpclu.js").then(a=>a.aD);return{API_BASE:t}},__vite__mapDeps([0,1])),o=`${e}/docs/api/${encodeURIComponent(n.slug)}.md`,s=await fetch(o);if(!s.ok)throw new Error(`文档加载失败(HTTP ${s.status})`);return s.text()}async function I(){try{const{API_BASE:n}=await i(async()=>{const{API_BASE:t}=await import("./index-DYsKpclu.js").then(a=>a.aD);return{API_BASE:t}},__vite__mapDeps([0,1])),e=await fetch(`${n}/docs/api/index.json`);if(!e.ok)return[];const o=await e.json(),s=new Set(r.map(t=>t.slug));return o.filter(t=>t.slug&&!s.has(t.slug)).map(t=>({slug:t.slug,title:t.title??t.slug,embedded:null,order:200}))}catch{return[]}}export{I as a,r as d,O as e,C as l};
`,S=Object.assign({"../../../docs/api/00-overview.md":p,"../../../docs/api/01-auth.md":d,"../../../docs/api/02-text-share.md":c,"../../../docs/api/03-file-share.md":l,"../../../docs/api/04-pickup.md":m,"../../../docs/api/05-chunk-upload.md":u,"../../../docs/api/06-presign.md":g,"../../../docs/api/07-admin.md":_,"../../../docs/api/08-audit.md":y,"../../../docs/api/09-storage.md":h,"../../../docs/api/10-config.md":f,"../../../docs/api/11-errors.md":x,"../../../docs/api/12-logo.md":b}),v=["README","share","chunk","presign","admin","audit","errors","config","logo","webdav","env"];function j(n){return(n.split("/").pop()??n).replace(/\.md$/,"")}function E(n,e){const o=/^#\s+(.+)$/m.exec(n);return o?o[1].trim():e}const r=Object.entries(S).map(([n,e])=>{const o=j(n),s=v.indexOf(o);return{slug:o,title:E(e,o),embedded:e,order:s>=0?s:100+o.localeCompare("")}}).sort((n,e)=>n.order-e.order||n.slug.localeCompare(e.slug));r.length>0;const k=Object.assign({"../../../docs/openapi.yaml":T}),O=Object.values(k)[0]??null;async function C(n){if(n.embedded!==null)return n.embedded;const{API_BASE:e}=await i(async()=>{const{API_BASE:t}=await import("./index-BKnWAKao.js").then(a=>a.aD);return{API_BASE:t}},__vite__mapDeps([0,1])),o=`${e}/docs/api/${encodeURIComponent(n.slug)}.md`,s=await fetch(o);if(!s.ok)throw new Error(`文档加载失败(HTTP ${s.status})`);return s.text()}async function I(){try{const{API_BASE:n}=await i(async()=>{const{API_BASE:t}=await import("./index-BKnWAKao.js").then(a=>a.aD);return{API_BASE:t}},__vite__mapDeps([0,1])),e=await fetch(`${n}/docs/api/index.json`);if(!e.ok)return[];const o=await e.json(),s=new Set(r.map(t=>t.slug));return o.filter(t=>t.slug&&!s.has(t.slug)).map(t=>({slug:t.slug,title:t.title??t.slug,embedded:null,order:200}))}catch{return[]}}export{I as a,r as d,O as e,C as l};
@@ -1,4 +1,4 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomeView-D38U_AAJ.js","assets/PageShell-D87JkPkG.js","assets/SiteNav.vue_vue_type_script_setup_true_lang-CwaEJKIZ.js","assets/PageShell-PYQzNiuf.css","assets/share-CqDDLJWI.js","assets/HomeView-DcN_X0wH.css","assets/PickupView-ClAAhXsM.js","assets/LoginView-BnVXNxFO.js","assets/auth-B7MDTgxJ.js","assets/admin-DEOkRyTC.js","assets/LoginView-BgHqRIwi.css","assets/AdminLayout-DJ2FR9f-.js","assets/FilesView-ZJ5eqPp5.js","assets/Pager.vue_vue_type_script_setup_true_lang-B3GeH0mY.js","assets/AuditView-BHN4e5xt.js","assets/AuditView-f2PBwbQe.css","assets/SettingsView-CjSvbH8z.js","assets/SettingsView-GpXVMuCV.css","assets/DocsView-Ds78oqBY.js","assets/docsSource-BXkkn0HE.js","assets/markdown-B5D8JARp.js","assets/OpenApiView-4SbIV1Bx.js","assets/swagger-CqkleIqs.js","assets/OpenApiView-BCH8BgeP.css","assets/NotFoundView-CbfqSXyJ.js"])))=>i.map(i=>d[i]);
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomeView-BUGc7QyM.js","assets/PageShell-CBo29Oot.js","assets/SiteNav.vue_vue_type_script_setup_true_lang-D3yLF4uh.js","assets/PageShell-PYQzNiuf.css","assets/share-B-zR67vw.js","assets/HomeView-DcN_X0wH.css","assets/PickupView-CUVFjD6g.js","assets/LoginView-mkNZ67cf.js","assets/auth-Cp2GGuZy.js","assets/admin-KnbIpHLF.js","assets/LoginView-BgHqRIwi.css","assets/AdminLayout-CmvNXPHJ.js","assets/FilesView-lLPRhmyI.js","assets/Pager.vue_vue_type_script_setup_true_lang-DZv_x-2P.js","assets/AuditView-BSm5VfBI.js","assets/AuditView-f2PBwbQe.css","assets/SettingsView-DgvAWaBc.js","assets/SettingsView-GpXVMuCV.css","assets/DocsView-DPtCYlAM.js","assets/docsSource-Df5ur5C4.js","assets/markdown-B5D8JARp.js","assets/OpenApiView-qf3nWBmo.js","assets/swagger-CqkleIqs.js","assets/OpenApiView-BCH8BgeP.css","assets/NotFoundView-DdQb5mYe.js"])))=>i.map(i=>d[i]);
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))r(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function o(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerPolicy&&(i.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?i.credentials="include":n.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(n){if(n.ep)return;n.ep=!0;const i=o(n);fetch(n.href,i)}})();function $l(e){const t=Object.create(null);for(const o of e.split(","))t[o]=1;return o=>o in t}const Se={},dr=[],Gt=()=>{},Fc=()=>!1,Jn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Qn=e=>e.startsWith("onUpdate:"),Be=Object.assign,Bl=(e,t)=>{const o=e.indexOf(t);o>-1&&e.splice(o,1)},zd=Object.prototype.hasOwnProperty,_e=(e,t)=>zd.call(e,t),oe=Array.isArray,To=e=>un(e)==="[object Map]",er=e=>un(e)==="[object Set]",Ta=e=>un(e)==="[object Date]",le=e=>typeof e=="function",Le=e=>typeof e=="string",yt=e=>typeof e=="symbol",be=e=>e!==null&&typeof e=="object",Oc=e=>(be(e)||le(e))&&le(e.then)&&le(e.catch),Nc=Object.prototype.toString,un=e=>Nc.call(e),Ud=e=>un(e).slice(8,-1),Mc=e=>un(e)==="[object Object]",Zn=e=>Le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Hr=$l(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ei=e=>{const t=Object.create(null);return(o=>t[o]||(t[o]=e(o)))},Vd=/-\w/g,ct=ei(e=>e.replace(Vd,t=>t.slice(1).toUpperCase())),jd=/\B([A-Z])/g,Ro=ei(e=>e.replace(jd,"-$1").toLowerCase()),ti=ei(e=>e.charAt(0).toUpperCase()+e.slice(1)),Di=ei(e=>e?`on${ti(e)}`:""),Vt=(e,t)=>!Object.is(e,t),In=(e,...t)=>{for(let o=0;o<e.length;o++)e[o](...t)},kc=(e,t,o,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:o})},oi=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Gd=e=>{const t=Le(e)?Number(e):NaN;return isNaN(t)?e:t};let Pa;const ri=()=>Pa||(Pa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ni(e){if(oe(e)){const t={};for(let o=0;o<e.length;o++){const r=e[o],n=Le(r)?Xd(r):ni(r);if(n)for(const i in n)t[i]=n[i]}return t}else if(Le(e)||be(e))return e}const Kd=/;(?![^(]*\))/g,Yd=/:([^]+)/,qd=/\/\*[^]*?\*\//g;function Xd(e){const t={};return e.replace(qd,"").split(Kd).forEach(o=>{if(o){const r=o.split(Yd);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ii(e){let t="";if(Le(e))t=e;else if(oe(e))for(let o=0;o<e.length;o++){const r=ii(e[o]);r&&(t+=r+" ")}else if(be(e))for(const o in e)e[o]&&(t+=o+" ");return t.trim()}const Jd="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Qd=$l(Jd);function Hc(e){return!!e||e===""}function Zd(e,t){if(e.length!==t.length)return!1;let o=!0;for(let r=0;o&&r<e.length;r++)o=Po(e[r],t[r]);return o}function Ia(e,t){if(e.size!==t.size)return!1;const o=Array.from(t),r=new Uint8Array(o.length);for(const n of e){let i=-1;for(let l=0;l<o.length;l++)if(!r[l]&&Po(n,o[l])){i=l;break}if(i<0)return!1;r[i]=1}return!0}function Po(e,t){if(e===t)return!0;let o=Ta(e),r=Ta(t);if(o||r)return o&&r?e.getTime()===t.getTime():!1;if(o=yt(e),r=yt(t),o||r)return e===t;if(o=oe(e),r=oe(t),o||r)return o&&r?Zd(e,t):!1;if(o=be(e),r=be(t),o||r){if(!o||!r)return!1;if(o=To(e),r=To(t),o||r||(o=er(e),r=er(t),o||r))return o&&r?Ia(e,t):!1;const n=Object.keys(e).length,i=Object.keys(t).length;if(n!==i)return!1;for(const l in e){const a=e.hasOwnProperty(l),s=t.hasOwnProperty(l);if(a&&!s||!a&&s||!Po(e[l],t[l]))return!1}}return String(e)===String(t)}function ep(e,t){return e.findIndex(o=>Po(o,t))}const $c=e=>!!(e&&e.__v_isRef===!0),Dn=e=>Le(e)?e:e==null?"":oe(e)||be(e)&&(e.toString===Nc||!le(e.toString))?$c(e)?Dn(e.value):JSON.stringify(e,Bc,2):String(e),Bc=(e,t)=>$c(t)?Bc(e,t.value):To(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((o,[r,n],i)=>(o[Ri(r,i)+" =>"]=n,o),{})}:er(t)?{[`Set(${t.size})`]:[...t.values()].map(o=>Ri(o))}:yt(t)?Ri(t):be(t)&&!oe(t)&&!Mc(t)?String(t):t,Ri=(e,t="")=>{var o;return yt(e)?`Symbol(${(o=e.description)!=null?o:t})`:e};let He;class Wc{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&He&&(He.active?(this.parent=He,this.index=(He.scopes||(He.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,o;if(this.scopes){const r=this.scopes.slice();for(t=0,o=r.length;t<o;t++)r[t].pause()}for(t=0,o=this.effects.length;t<o;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,o;if(this.scopes){const n=this.scopes.slice();foLine truncated
`))),e[Ko]=zn(n);const i=r||n.props&&n.props.type==="number";Go(e,t?"change":"input",l=>{l.target.composing||e[Ko](Ui(e.value,o,i))}),(o||i)&&Go(e,"change",()=>{e.value=Ui(e.value,o,i)}),t||(Go(e,"compositionstart",hh),Go(e,"compositionend",as),Go(e,"change",as))},mounted(e,{value:t,modifiers:{trim:o,number:r}}){const n=t??"",i=e[Sn];delete e[Sn],i!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==i?e[Ko](Ui(e.value,o,r)):e.value=n},beforeUpdate(e,{value:t,oldValue:o,modifiers:{lazy:r,trim:n,number:i}},l){if(e[Ko]=zn(l),e.composing)return;const a=(i||e.type==="number")&&!/^0\d/.test(e.value)?oi(e.value):e.value,s=t??"";if(a===s)return;const c=e.getRootNode();(c instanceof Document||c instanceof ShadowRoot)&&c.activeElement===e&&e.type!=="range"&&(r&&t===o||n&&e.value.trim()===s)||(e.value=s)}},mT={deep:!0,created(e,{value:t,modifiers:{number:o}},r){e._modelValue=t,Go(e,"change",()=>{const n=Array.prototype.filter.call(e.options,s=>s.selected).map(s=>o?oi(Un(s)):Un(s)),i=e.multiple,l=i?er(e._modelValue)?new Set(n):n:n[0],a=e._pendingValue=[i,i?oe(l)?n.slice():n:l];try{e[Ko](l)}finally{ci(()=>{e._pendingValue===a&&(e._pendingValue=void 0)})}}),e[Ko]=zn(r)},mounted(e,{value:t}){ss(e,t)},beforeUpdate(e,{value:t},o){e._modelValue=t,e[Ko]=zn(o)},updated(e,{value:t}){const o=e._pendingValue;e._pendingValue=void 0,(!o||o[0]!==e.multiple||!gh(t,o[1],o[0]))&&ss(e,t)}};function gh(e,t,o){if(!o||oe(e))return Po(e,t);if(er(e)){if(e.size!==t.length)return!1;for(const r of t)if(!e.has(r))return!1;return!0}return!1}function ss(e,t){const o=e.multiple,r=oe(t);if(!(o&&!r&&!er(t))){for(let n=0,i=e.options.length;n<i;n++){const l=e.options[n],a=Un(l);if(o)if(r){const s=typeof a;s==="string"||s==="number"?l.selected=t.some(c=>String(c)===String(a)):l.selected=ep(t,a)>-1}else l.selected=t.has(a);else if(Po(Un(l),t)){e.selectedIndex!==n&&(e.selectedIndex=n);return}}!o&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Un(e){return"_value"in e?e._value:e.value}const Ch=["ctrl","shift","alt","meta"],bh={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ch.some(o=>e[`${o}Key`]&&!t.includes(o))},hT=(e,t)=>{if(!e)return e;const o=e._withMods||(e._withMods={}),r=t.join(".");return o[r]||(o[r]=((n,...i)=>{for(let l=0;l<t.length;l++){const a=bh[t[l]];if(a&&a(n,t))return}return e(n,...i)}))},xh={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},gT=(e,t)=>{const o=e._withKeys||(e._withKeys={}),r=t.join(".");return o[r]||(o[r]=(n=>{if(!("key"in n))return;const i=Ro(n.key);if(t.some(l=>l===i||xh[l]===i))return e(n)}))},_h=Be({patchProp:dh},Vm);let cs;function vh(){return cs||(cs=ym(_h))}const Sh=((...e)=>{const t=vh().createApp(...e),{mount:o}=t;return t.mount=r=>{const n=Eh(r);if(!n)return;const i=t._component;!le(i)&&!i.render&&!i.template&&(i.template=n.innerHTML),n.nodeType===1&&(n.textContent="");const l=o(n,!1,yh(n));return n instanceof Element&&(n.removeAttribute("v-cloak"),n.setAttribute("data-v-app","")),l},t});function yh(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Eh(e){return Le(e)?document.querySelector(e):e}let Gu;const gi=e=>Gu=e,Ku=Symbol();function hl(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Vr;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Vr||(Vr={}));function Th(){const e=Wl(!0),t=e.run(()=>mt({}));let o=[],r=[];const n=qr({install(i){gi(n),n._a=i,i.provide(Ku,n),i.config.globalProperties.$pinia=n,r.forEach(l=>o.push(l)),r=[]},use(i){return this._a?o.push(i):r.push(i),this},_p:o,_a:null,_e:e,_s:new Map,state:t});return n}const Yu=()=>{};function us(e,t,o,r=Yu){e.add(t);const n=()=>{e.delete(t)&&r()};return!o&&zc()&&tp(n),n}function lr(e,...t){e.forEach(o=>{o(...t)})}const Ph=e=>e(),fs=Symbol(),Vi=Symbol();function gl(e,t){e instanceof Map&&t instanceof Map?t.forEach((o,r)=>e.set(r,o)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const o in t){if(!t.hasOwnProperty(o))continue;const r=t[o],n=e[o];hl(n)&&hl(r)&&e.hasOwnProperty(o)&&!we(r)&&!lo(r)?e[o]=gl(n,r):e[o]=r}return e}const Ih=Symbol();function Ah(e){return!hl(e)||!Object.prototype.hasOwnProperty.call(e,Ih)}const{assign:_o}=Object;function Lh(e){return!!(we(e)&&e.effect)}function wh(e,t,o,r){const{state:n,actions:i,getters:l}=t,a=o.state.value[e];let s;function c(){a||(o.state.value[e]=n?n():{});const u=Sp(o.state.value[e]);return _o(u,i,Object.keys(l||{}).reduce((f,d)=>(f[d]=qr(fe(()=>{gi(o);const p=o._s.get(e);return l[d].call(p,p)})),f),{}))}return s=qu(e,c,t,o,r,!0),s}function qu(e,t,o={},r,n,i){let l;const a=_o({actions:{}},o),s= Line truncated
`+Object.entries(e).map(o=>t+` ${ff(o[0])}: ${o[1]};`).join(`
@@ -25,4 +25,4 @@ ${n}
${t}
</style>`}function Hx(e,t,o){const{styles:r,ids:n}=o;n.has(e)||r!==null&&(n.add(e),r.push(kx(e,t)))}const $x=typeof document<"u";function Bx(){if($x)return;const e=Ze(Mx,null);if(e!==null)return{adapter:(t,o)=>Hx(t,o,e),context:e}}const js={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#663399",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32",transparent:"#0000"};function Wx(e,t,o){t/=100,o/=100;let r=(n,i=(n+e/60)%6)=>o-o*t*Math.max(Math.min(i,4-i,1),0);return[r(5)*255,r(3)*255,r(1)*255]}function zx(e,t,o){t/=100,o/=100;let r=t*Math.min(o,1-o),n=(i,l=(i+e/30)%12)=>o-r*Math.max(Math.min(l-3,9-l,1),-1);return[n(0)*255,n(8)*255,n(4)*255]}const Yt="^\\s*",qt="\\s*$",Lo="\\s*((\\.\\d+)|(\\d+(\\.\\d*)?))%\\s*",_t="\\s*((\\.\\d+)|(\\d+(\\.\\d*)?))\\s*",qo="([0-9A-Fa-f])",Xo="([0-9A-Fa-f]{2})",Rf=new RegExp(`${Yt}hsl\\s*\\(${_t},${Lo},${Lo}\\)${qt}`),Ff=new RegExp(`${Yt}hsv\\s*\\(${_t},${Lo},${Lo}\\)${qt}`),Of=new RegExp(`${Yt}hsla\\s*\\(${_t},${Lo},${Lo},${_t}\\)${qt}`),Nf=new RegExp(`${Yt}hsva\\s*\\(${_t},${Lo},${Lo},${_t}\\)${qt}`),Ux=new RegExp(`${Yt}rgb\\s*\\(${_t},${_t},${_t}\\)${qt}`),Vx=new RegExp(`${Yt}rgba\\s*\\(${_t},${_t},${_t},${_t}\\)${qt}`),jx=new RegExp(`${Yt}#${qo}${qo}${qo}${qt}`),Gx=new RegExp(`${Yt}#${Xo}${Xo}${Xo}${qt}`),Kx=new RegExp(`${Yt}#${qo}${qo}${qo}${qo}${qt}`),Yx=new RegExp(`${Yt}#${Xo}${Xo}${Xo}${Xo}${qt}`);function dt(e){return parseInt(e,16)}function qx(e){try{let t;if(t=Of.exec(e))return[Gn(t[1]),Eo(t[5]),Eo(t[9]),Zo(t[13])];if(t=Rf.exec(e))return[Gn(t[1]),Eo(t[5]),Eo(t[9]),1];throw new Error(`[seemly/hsla]: Invalid color value ${e}.`)}catch(t){throw t}}function Xx(e){try{let t;if(t=Nf.exec(e))return[Gn(t[1]),Eo(t[5]),Eo(t[9]),Zo(t[13])];if(t=Ff.exec(e))return[Gn(t[1]),Eo(t[5]),Eo(t[9]),1];throw new Error(`[seemly/hsva]: Invalid color value ${e}.`)}catch(t){throw t}}function fo(e){try{let t;if(t=Gx.exec(e))return[dt(t[1]),dt(t[2]),dt(t[3]),1];if(t=Ux.exec(e))return[Xe(t[1]),Xe(t[5]),Xe(t[9]),1];if(t=Vx.exec(e))return[Xe(t[1]),Xe(t[5]),Xe(t[9]),Zo(t[13])];if(t=jx.exec(e))return[dt(t[1]+t[1]),dt(t[2]+t[2]),dt(t[3]+t[3]),1];if(t=Yx.exec(e))return[dt(t[1]),dt(t[2]),dt(t[3]),Zo(dt(t[4])/255)];if(t=Kx.exec(e))return[dt(t[1]+Line truncated
`,OS="\u2028",NS="\u2029";function MS(e){const t=e;let o=0,r=1,n=1,i=0;const l=D=>t[D]===FS&&t[D+1]===it,a=D=>t[D]===it,s=D=>t[D]===NS,c=D=>t[D]===OS,u=D=>l(D)||a(D)||s(D)||c(D),f=()=>o,d=()=>r,p=()=>n,g=()=>i,C=D=>l(D)||s(D)||c(D)?it:t[D],S=()=>C(o),E=()=>C(o+i);function T(){return i=0,u(o)&&(r++,n=0),l(o)&&o++,o++,n++,t[o]}function v(){return l(o+i)&&i++,i++,t[o+i]}function y(){o=0,r=1,n=1,i=0}function L(D=0){i=D}function w(){const D=o+i;for(;D!==o;)T();i=0}return{index:f,line:d,column:p,peekOffset:g,charAt:C,currentChar:S,currentPeek:E,next:T,peek:v,reset:y,resetPeek:L,skipToPeek:w}}const bo=void 0,kS=".",Js="'",HS="tokenizer";function $S(e,t={}){const o=t.location!==!1,r=MS(e),n=()=>r.index(),i=()=>PS(r.line(),r.column(),r.index()),l=i(),a=n(),s={currentType:14,offset:a,startLoc:l,endLoc:l,lastType:14,lastOffset:a,lastStartLoc:l,lastEndLoc:l,braceNest:0,inLinked:!1,text:""},c=()=>s,{onError:u}=t;function f(m,h,A,...O){const j=c();if(h.column+=A,h.offset+=A,u){const B=o?Yn(j.startLoc,h):null,I=Pr(m,B,{domain:HS,args:O});u(I)}}function d(m,h,A){m.endLoc=i(),m.currentType=h;const O={type:h};return o&&(O.loc=Yn(m.startLoc,m.endLoc)),A!=null&&(O.value=A),O}const p=m=>d(m,14);function g(m,h){return m.currentChar()===h?(m.next(),h):(f(ie.EXPECTED_TOKEN,i(),0,h),"")}function C(m){let h="";for(;m.currentPeek()===Zt||m.currentPeek()===it;)h+=m.currentPeek(),m.peek();return h}function S(m){const h=C(m);return m.skipToPeek(),h}function E(m){if(m===bo)return!1;const h=m.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h===95}function T(m){if(m===bo)return!1;const h=m.charCodeAt(0);return h>=48&&h<=57}function v(m,h){const{currentType:A}=h;if(A!==2)return!1;C(m);const O=E(m.currentPeek());return m.resetPeek(),O}function y(m,h){const{currentType:A}=h;if(A!==2)return!1;C(m);const O=m.currentPeek()==="-"?m.peek():m.currentPeek(),j=T(O);return m.resetPeek(),j}function L(m,h){const{currentType:A}=h;if(A!==2)return!1;C(m);const O=m.currentPeek()===Js;return m.resetPeek(),O}function w(m,h){const{currentType:A}=h;if(A!==8)return!1;C(m);const O=m.currentPeek()===".";return m.resetPeek(),O}function D(m,h){const{currentType:A}=h;if(A!==9)return!1;C(m);const O=E(m.currentPeek());return m.resetPeek(),O}function F(m,h){const{currentType:A}=h;if(!(A===8||A===12))return!1;C(m);const O=m.currentPeek()===":";return m.resetPeek(),O}function P(m,h){const{currentType:A}=h;if(A!==10)return!1;const O=()=>{const B=m.currentPeek();return B==="{"?E(m.peek()):B==="@"||B==="%"||B==="|"||B===":"||B==="."||B===Zt||!B?!1:B===it?(m.peek(),O()):k(m,!1)},j=O();return m.resetPeek(),j}function U(m){C(m);const h=m.currentPeek()==="|";return m.resetPeek(),h}function X(m){const h=C(m),A=m.currentPeek()==="%"&&m.peek()==="{";return m.resetPeek(),{isModulo:A,hasSpace:h.length>0}}function k(m,h=!0){const A=(j=!1,B="",I=!1)=>{const M=m.currentPeek();return M==="{"?B==="%"?!1:j:M==="@"||!M?B==="%"?!0:j:M==="%"?(m.peek(),A(j,"%",!0)):M==="|"?B==="%"||I?!0:!(B===Zt||B===it):M===Zt?(m.peek(),A(!0,Zt,I)):M===it?(m.peek(),A(!0,it,I)):!0},O=A();return h&&m.resetPeek(),O}function Q(m,h){const A=m.currentChar();return A===bo?bo:h(A)?(m.next(),A):null}function me(m){const h=m.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h>=48&&h<=57||h===95||h===36}function ye(m){return Q(m,me)}function se(m){const h=m.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h>=48&&h<=57||h===95||h===36||h===45}function ne(m){return Q(m,se)}function de(m){const h=m.charCodeAt(0);return h>=48&&h<=57}function tt(m){return Q(m,de)}function ft(m){const h=m.charCodeAt(0);return h>=48&&h<=57||h>=65&&h<=70||h>=97&&h<=102}function Re(m){return Q(m,ft)}function Fe(m){let h="",A="";for(;h=tt(m);)A+=h;return A}function Tt(m){S(m);const h=m.currentChar();return h!=="%"&&f(ie.EXPECTED_TOKEN,i(),0,h),m.next(),"%"}function ht(m){let h="";for(;;){const A=m.currentChar();if(A==="{"||A==="}"||A==="@"||A==="|"||!A)break;if(A==="%")if(k(m))h+=A,m.next();else break;else if(A===Zt||A===it)if(k(m))h+=A,m.next();else{if(U(m))break;h+=A,m.next()}else h+=A,m.next()}return h}function gt(m){S(m);let h="",A="";for(;h=ne(m);)A+=h;return m.currentChar()===bo&&f(ie.UNTERMINATED_CLOSING_BRACE,i(),0),A}function We(m){S(m);let h="";return m.currentChar()==="-"?(m.next(),h+=`-${Fe(m)}`):h+=Fe(m),m.currentChar()===bo&&f(ie.UNTERMINATED_CLOSING_BRACE,i(),0),h}function H(m){return m!==Js&&m!==it}function Y(m){S(m),g(m,"'");let h="",A="";for(;h=Q(m,H);)h==="\\"?A+=G(m):A+=h;const O=m.currentChar();return O===it||O===bo?(f(ie.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,i(),0),O===it&&(m.next(),g(m,"'")),A):(g(m,"'"),A)}function G(m){const h=m.currentChar();switch(h){case"\\":case"'":return m.next(),`\\${h}`;case"u":return ee(m,h,4);case"U":return ee(m,h,6);default:return f(ie.UNKNOWN_ESCAPE_SEQUENCE,i(),0,h),""}}function ee(m,h,A){g(m,h);let O="";for(let j=0;j<A;j++){const B=Re(m);if(!B){f(ie.INVALID_UNICODE_ESCAPE_SEQUENCE,i(),0,`\\${h}${O}${m.currentChar()}`);break}O+=B}return`\\${h}${O}`}function ue(m){return m!=="{"&&m!=="}" Line truncated
`,i=t.needIndent?t.needIndent:o!=="arrow",l=e.helpers||[],a=qS(e,{filename:r,breakLineCode:n,needIndent:i});a.push(o==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),a.indent(i),l.length>0&&(a.push(`const { ${sd(l.map(u=>`${u}: _${u}`),", ")} } = ctx`),a.newline()),a.push("return "),xr(a,e),a.deindent(i),a.push("}"),delete e.helpers;const{code:s,map:c}=a.context();return{ast:e,code:s,map:c?c.toJSON():void 0}};function ty(e,t={}){const o=ad({},t),r=!!o.jit,n=!!o.minify,i=o.optimize==null?!0:o.optimize,a=US(o).parse(e);return r?(i&&GS(a),n&&ur(a),{ast:a,code:""}):(jS(a,o),ey(a,o))}function oy(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(io().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_JIT_COMPILATION__!="boolean"&&(io().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(io().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function Kt(e){return Ce(e)&&Ca(e)===0&&(Ot(e,"b")||Ot(e,"body"))}const cd=["b","body"];function ry(e){return Oo(e,cd)}const ud=["c","cases"];function ny(e){return Oo(e,ud,[])}const fd=["s","static"];function iy(e){return Oo(e,fd)}const dd=["i","items"];function ly(e){return Oo(e,dd,[])}const pd=["t","type"];function Ca(e){return Oo(e,pd)}const md=["v","value"];function Pn(e,t){const o=Oo(e,md);if(o!=null)return o;throw an(t)}const hd=["m","modifier"];function ay(e){return Oo(e,hd)}const gd=["k","key"];function sy(e){const t=Oo(e,gd);if(t)return t;throw an(6)}function Oo(e,t,o){for(let r=0;r<t.length;r++){const n=t[r];if(Ot(e,n)&&e[n]!=null)return e[n]}return o}const Cd=[...cd,...ud,...fd,...dd,...gd,...hd,...md,...pd];function an(e){return new Error(`unhandled node type: ${e}`)}const No=[];No[0]={w:[0],i:[3,0],"[":[4],o:[7]};No[1]={w:[1],".":[2],"[":[4],o:[7]};No[2]={w:[2],i:[3,0],0:[3,0]};No[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};No[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};No[5]={"'":[4,0],o:8,l:[5,0]};No[6]={'"':[4,0],o:8,l:[6,0]};const cy=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function uy(e){return cy.test(e)}function fy(e){const t=e.charCodeAt(0),o=e.charCodeAt(e.length-1);return t===o&&(t===34||t===39)?e.slice(1,-1):e}function dy(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function py(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:uy(t)?fy(t):"*"+t}function my(e){const t=[];let o=-1,r=0,n=0,i,l,a,s,c,u,f;const d=[];d[0]=()=>{l===void 0?l=a:l+=a},d[1]=()=>{l!==void 0&&(t.push(l),l=void 0)},d[2]=()=>{d[0](),n++},d[3]=()=>{if(n>0)n--,r=4,d[0]();else{if(n=0,l===void 0||(l=py(l),l===!1))return!1;d[1]()}};function p(){const g=e[o+1];if(r===5&&g==="'"||r===6&&g==='"')return o++,a="\\"+g,d[0](),!0}for(;r!==null;)if(o++,i=e[o],!(i==="\\"&&p())){if(s=dy(i),f=No[r],c=f[s]||f.l||8,c===8||(r=c[0],c[1]!==void 0&&(u=d[c[1]],u&&(a=i,u()===!1))))return;if(r===7)return t}}const ec=new Map;function hy(e,t){return Ce(e)?e[t]:null}function gy(e,t){if(!Ce(e))return null;let o=ec.get(t);if(o||(o=my(t),o&&ec.set(t,o)),!o)return null;const r=o.length;let n=e,i=0;for(;i<r;){const l=o[i];if(Cd.includes(l)&&Kt(n))return null;const a=n[l];if(a===void 0||Pe(n))return null;n=a,i++}return n}const Cy=e=>e,by=e=>"",xy="text",_y=e=>e.length===0?"":ES(e),vy=yS;function tc(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function Sy(e){const t=Me(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Me(e.named.count)||Me(e.named.n))?Me(e.named.count)?e.named.count:Me(e.named.n)?e.named.n:t:t}function yy(e,t){t.count||(t.count=e),t.n||(t.n=e)}function Ey(e={}){const t=e.locale,o=Sy(e),r=Ce(e.pluralRules)&&K(t)&&Pe(e.pluralRules[t])?e.pluralRules[t]:tc,n=Ce(e.pluralRules)&&K(t)&&Pe(e.pluralRules[t])?tc:void 0,i=E=>E[r(o,E.length,n)],l=e.list||[],a=E=>l[E],s=e.named||ve();Me(e.pluralIndex)&&yy(o,s);const c=E=>s[E];function u(E){const T=Pe(e.messages)?e.messages(E):Ce(e.messages)?e.messages[E]:!1;return T||(e.parent?e.parent.message(E):by)}const f=E=>e.modifiers?e.modifiers[E]:Cy,d=ae(e.processor)&&Pe(e.processor.normalize)?e.processor.normalize:_y,p=ae(e.processor)&&Pe(e.processor.interpolate)?e.processor.interpolate:vy,g=ae(e.processor)&&K(e.processor.type)?e.processor.type:xy,S={list:a,named:c,plural:i,linked:(E,...T)=>{const[v,y]=T;let L="text",w="";T.length===1?Ce(v)?(w=v.modifier||w,L=v.type||L):K(v)&&(w=v||w):T.length===2&&(K(v)&&(w=v||w),K(y)&&(L=y||L));const D=u(E)(S),F=L==="vnode"&&Ae(D)&&w?D[0]:D;return w?f(w)(F,L):F},message:u,type:g,interpolate:p,normalize:d,values:Ge(ve(),l,s)};return S}let sn=null;function Ty(e){sn=e}function Py(e,t,o){sn&&sn.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:o})}const Iy=Ay("function:translate");function Ay(e){return t=>sn&&sn.emit(e,t)}const Ly=ha.__EXTEND_POINT__,Wo=Pi(Ly),wy={FALLBACK_TO_TRANSLATE:Wo(),CANNOT_FORMAT_NUMBER:Wo(),FALLBACK_TO_NUMBER_FORMAT:Wo(),CANNOT_FORMAT_DATE:Wo(),FALLBACK Line truncated
`,i=t.needIndent?t.needIndent:o!=="arrow",l=e.helpers||[],a=qS(e,{filename:r,breakLineCode:n,needIndent:i});a.push(o==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),a.indent(i),l.length>0&&(a.push(`const { ${sd(l.map(u=>`${u}: _${u}`),", ")} } = ctx`),a.newline()),a.push("return "),xr(a,e),a.deindent(i),a.push("}"),delete e.helpers;const{code:s,map:c}=a.context();return{ast:e,code:s,map:c?c.toJSON():void 0}};function ty(e,t={}){const o=ad({},t),r=!!o.jit,n=!!o.minify,i=o.optimize==null?!0:o.optimize,a=US(o).parse(e);return r?(i&&GS(a),n&&ur(a),{ast:a,code:""}):(jS(a,o),ey(a,o))}function oy(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(io().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_JIT_COMPILATION__!="boolean"&&(io().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(io().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function Kt(e){return Ce(e)&&Ca(e)===0&&(Ot(e,"b")||Ot(e,"body"))}const cd=["b","body"];function ry(e){return Oo(e,cd)}const ud=["c","cases"];function ny(e){return Oo(e,ud,[])}const fd=["s","static"];function iy(e){return Oo(e,fd)}const dd=["i","items"];function ly(e){return Oo(e,dd,[])}const pd=["t","type"];function Ca(e){return Oo(e,pd)}const md=["v","value"];function Pn(e,t){const o=Oo(e,md);if(o!=null)return o;throw an(t)}const hd=["m","modifier"];function ay(e){return Oo(e,hd)}const gd=["k","key"];function sy(e){const t=Oo(e,gd);if(t)return t;throw an(6)}function Oo(e,t,o){for(let r=0;r<t.length;r++){const n=t[r];if(Ot(e,n)&&e[n]!=null)return e[n]}return o}const Cd=[...cd,...ud,...fd,...dd,...gd,...hd,...md,...pd];function an(e){return new Error(`unhandled node type: ${e}`)}const No=[];No[0]={w:[0],i:[3,0],"[":[4],o:[7]};No[1]={w:[1],".":[2],"[":[4],o:[7]};No[2]={w:[2],i:[3,0],0:[3,0]};No[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};No[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};No[5]={"'":[4,0],o:8,l:[5,0]};No[6]={'"':[4,0],o:8,l:[6,0]};const cy=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function uy(e){return cy.test(e)}function fy(e){const t=e.charCodeAt(0),o=e.charCodeAt(e.length-1);return t===o&&(t===34||t===39)?e.slice(1,-1):e}function dy(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function py(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:uy(t)?fy(t):"*"+t}function my(e){const t=[];let o=-1,r=0,n=0,i,l,a,s,c,u,f;const d=[];d[0]=()=>{l===void 0?l=a:l+=a},d[1]=()=>{l!==void 0&&(t.push(l),l=void 0)},d[2]=()=>{d[0](),n++},d[3]=()=>{if(n>0)n--,r=4,d[0]();else{if(n=0,l===void 0||(l=py(l),l===!1))return!1;d[1]()}};function p(){const g=e[o+1];if(r===5&&g==="'"||r===6&&g==='"')return o++,a="\\"+g,d[0](),!0}for(;r!==null;)if(o++,i=e[o],!(i==="\\"&&p())){if(s=dy(i),f=No[r],c=f[s]||f.l||8,c===8||(r=c[0],c[1]!==void 0&&(u=d[c[1]],u&&(a=i,u()===!1))))return;if(r===7)return t}}const ec=new Map;function hy(e,t){return Ce(e)?e[t]:null}function gy(e,t){if(!Ce(e))return null;let o=ec.get(t);if(o||(o=my(t),o&&ec.set(t,o)),!o)return null;const r=o.length;let n=e,i=0;for(;i<r;){const l=o[i];if(Cd.includes(l)&&Kt(n))return null;const a=n[l];if(a===void 0||Pe(n))return null;n=a,i++}return n}const Cy=e=>e,by=e=>"",xy="text",_y=e=>e.length===0?"":ES(e),vy=yS;function tc(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function Sy(e){const t=Me(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Me(e.named.count)||Me(e.named.n))?Me(e.named.count)?e.named.count:Me(e.named.n)?e.named.n:t:t}function yy(e,t){t.count||(t.count=e),t.n||(t.n=e)}function Ey(e={}){const t=e.locale,o=Sy(e),r=Ce(e.pluralRules)&&K(t)&&Pe(e.pluralRules[t])?e.pluralRules[t]:tc,n=Ce(e.pluralRules)&&K(t)&&Pe(e.pluralRules[t])?tc:void 0,i=E=>E[r(o,E.length,n)],l=e.list||[],a=E=>l[E],s=e.named||ve();Me(e.pluralIndex)&&yy(o,s);const c=E=>s[E];function u(E){const T=Pe(e.messages)?e.messages(E):Ce(e.messages)?e.messages[E]:!1;return T||(e.parent?e.parent.message(E):by)}const f=E=>e.modifiers?e.modifiers[E]:Cy,d=ae(e.processor)&&Pe(e.processor.normalize)?e.processor.normalize:_y,p=ae(e.processor)&&Pe(e.processor.interpolate)?e.processor.interpolate:vy,g=ae(e.processor)&&K(e.processor.type)?e.processor.type:xy,S={list:a,named:c,plural:i,linked:(E,...T)=>{const[v,y]=T;let L="text",w="";T.length===1?Ce(v)?(w=v.modifier||w,L=v.type||L):K(v)&&(w=v||w):T.length===2&&(K(v)&&(w=v||w),K(y)&&(L=y||L));const D=u(E)(S),F=L==="vnode"&&Ae(D)&&w?D[0]:D;return w?f(w)(F,L):F},message:u,type:g,interpolate:p,normalize:d,values:Ge(ve(),l,s)};return S}let sn=null;function Ty(e){sn=e}function Py(e,t,o){sn&&sn.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:o})}const Iy=Ay("function:translate");function Ay(e){return t=>sn&&sn.emit(e,t)}const Ly=ha.__EXTEND_POINT__,Wo=Pi(Ly),wy={FALLBACK_TO_TRANSLATE:Wo(),CANNOT_FORMAT_NUMBER:Wo(),FALLBACK_TO_NUMBER_FORMAT:Wo(),CANNOT_FORMAT_DATE:Wo(),FALLBACK Line truncated
@@ -1 +1 @@
import{v as x,S as s,U as m,V as g,x as u,W as w,H as i,X as f,Y as h}from"./index-DYsKpclu.js";function T(n,t,r,a=""){return x(u.shareText,{method:"POST",form:{text:n,expire_value:String(t),expire_style:r,code:a}})}function y(n,t,r,a,o=""){const e=new FormData;return e.append("file",n),e.append("expire_value",String(t)),e.append("expire_style",r),o&&e.append("code",o),h(u.shareFile,e,a)}async function S(n){const t=await x(u.shareMetadata,{query:{code:n}}),r=!!(s(t,["is_text","isText"])??s(t,["type"])==="text");return{code:String(s(t,["code"])??n),name:String(s(t,["name"])??"未命名"),size:Number(s(t,["size"])??0),type:r?"text":"file",isText:r,createdAt:s(t,["created_at","createdAt"])??null,expiredAt:s(t,["expired_at","expires_at","expiredAt","expiresAt"])??null,expiredCount:s(t,["expired_count","expiredCount","remaining_downloads","remainingDownloads"])??null,usedCount:Number(s(t,["used_count","usedCount"])??0),remainingDownloads:s(t,["remaining_downloads","remainingDownloads","expired_count","expiredCount"])??null}}async function b(n){const{blob:t}=await m(u.shareSelect,{query:{code:n}});return t.text()}function A(n,t){return new Promise((r,a)=>{const o=new URL(g(u.shareSelect),location.origin);o.searchParams.set("code",n);const e=new XMLHttpRequest;e.open("GET",o.toString()),e.timeout=6e5,e.responseType="blob";const l=w();l&&e.setRequestHeader("Authorization",`Bearer ${l}`),e.onprogress=p=>{p.lengthComputable&&t&&t(Math.round(p.loaded/p.total*100))},e.onload=()=>{if((e.getResponseHeader("content-type")??"").includes("application/json")){const d=new FileReader;d.onload=()=>{try{const c=JSON.parse(String(d.result));a(new i(c.code??e.status,c.msg||"取件失败",e.status))}catch{a(new i(e.status,"取件失败",e.status))}},d.readAsText(e.response);return}e.status>=200&&e.status<300?r({blob:e.response,filename:f(e.getResponseHeader("content-disposition"))}):a(new i(e.status,`取件失败(HTTP ${e.status})`,e.status))},e.onerror=()=>a(new i(0,"网络异常,取件失败")),e.ontimeout=()=>a(new i(0,"下载超时,请重试")),e.send()})}export{y as a,A as b,S as g,b as p,T as s};
import{v as x,S as s,U as m,V as g,x as u,W as w,H as i,X as f,Y as h}from"./index-BKnWAKao.js";function T(n,t,r,a=""){return x(u.shareText,{method:"POST",form:{text:n,expire_value:String(t),expire_style:r,code:a}})}function y(n,t,r,a,o=""){const e=new FormData;return e.append("file",n),e.append("expire_value",String(t)),e.append("expire_style",r),o&&e.append("code",o),h(u.shareFile,e,a)}async function S(n){const t=await x(u.shareMetadata,{query:{code:n}}),r=!!(s(t,["is_text","isText"])??s(t,["type"])==="text");return{code:String(s(t,["code"])??n),name:String(s(t,["name"])??"未命名"),size:Number(s(t,["size"])??0),type:r?"text":"file",isText:r,createdAt:s(t,["created_at","createdAt"])??null,expiredAt:s(t,["expired_at","expires_at","expiredAt","expiresAt"])??null,expiredCount:s(t,["expired_count","expiredCount","remaining_downloads","remainingDownloads"])??null,usedCount:Number(s(t,["used_count","usedCount"])??0),remainingDownloads:s(t,["remaining_downloads","remainingDownloads","expired_count","expiredCount"])??null}}async function b(n){const{blob:t}=await m(u.shareSelect,{query:{code:n}});return t.text()}function A(n,t){return new Promise((r,a)=>{const o=new URL(g(u.shareSelect),location.origin);o.searchParams.set("code",n);const e=new XMLHttpRequest;e.open("GET",o.toString()),e.timeout=6e5,e.responseType="blob";const l=w();l&&e.setRequestHeader("Authorization",`Bearer ${l}`),e.onprogress=p=>{p.lengthComputable&&t&&t(Math.round(p.loaded/p.total*100))},e.onload=()=>{if((e.getResponseHeader("content-type")??"").includes("application/json")){const d=new FileReader;d.onload=()=>{try{const c=JSON.parse(String(d.result));a(new i(c.code??e.status,c.msg||"取件失败",e.status))}catch{a(new i(e.status,"取件失败",e.status))}},d.readAsText(e.response);return}e.status>=200&&e.status<300?r({blob:e.response,filename:f(e.getResponseHeader("content-disposition"))}):a(new i(e.status,`取件失败(HTTP ${e.status})`,e.status))},e.onerror=()=>a(new i(0,"网络异常,取件失败")),e.ontimeout=()=>a(new i(0,"下载超时,请重试")),e.send()})}export{y as a,A as b,S as g,b as p,T as s};
+1 -1
View File
@@ -27,7 +27,7 @@
background: #0b0f1a;
}
</style>
<script type="module" crossorigin src="/assets/index-DYsKpclu.js"></script>
<script type="module" crossorigin src="/assets/index-BKnWAKao.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CtyCxWf5.css">
</head>
<body>
+5 -5
View File
@@ -1,12 +1,12 @@
{
"name": "filecodebox-web",
"version": "1.0.0",
"name": "fileshare-web",
"version": "26.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "filecodebox-web",
"version": "1.0.0",
"name": "fileshare-web",
"version": "26.9",
"dependencies": {
"marked": "^16.3.0",
"naive-ui": "^2.45.3",
@@ -1957,4 +1957,4 @@
}
}
}
}
}
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "filecodebox-web",
"name": "fileshare-web",
"private": true,
"version": "1.0.0",
"version": "26.9",
"type": "module",
"description": "FileCodeBox Go 版前端:分享 / 取件 / 管理后台 / 审计日志 / 站内文档",
"scripts": {