# 短链接生成器 粘贴长链接,一键变短。极简工具网站。 ## 架构 ``` 用户请求 → Caddy ├── /api/* → Go 后端 :8819 ├── /[a-zA-Z0-9]{7} → Go 后端 :8819 (短码重定向) └── 其他 → 静态文件 /opt/short-link/frontend ``` ``` 后端: Go 1.22 + net/http(标准库路由) + JSON 文件持久化 前端: Svelte 4 + Vite 5 网关: Caddy(自动 HTTPS) 部署: Drone CI → systemd ``` ## 本地开发 ### 后端 ```bash cd backend # 安装依赖 go mod tidy # 运行 (默认 :8819) ADDR=:8819 DOMAIN=http://localhost:8819 DB_PATH=./data.db ADMIN_TOKEN=dev go run . # 运行测试 go test ./... ``` ### 前端 ```bash cd frontend # 安装依赖 npm install # 开发模式 (默认 :5173, API 请求会由 Vite 转发配置决定) npm run dev # 构建 npm run build ``` ## 部署 ### 环境要求 - Go 1.22+ - Node.js 20+ - Caddy 2.x - systemd (Linux) ### 手动部署 ```bash # 1. 构建 cd backend && CGO_ENABLED=0 go build -ldflags="-s -w" -o short-link-server . cd ../frontend && npm install && npm run build # 2. 部署文件 mkdir -p /opt/short-link/data /opt/short-link/frontend cp backend/short-link-server /opt/short-link/ cp -r frontend/dist/* /opt/short-link/frontend/ # 3. 生成管理员 Token openssl rand -hex 32 # 填入 short-link.service 的 ADMIN_TOKEN # 4. 注册服务 cp short-link.service /etc/systemd/system/ systemctl daemon-reload systemctl enable --now short-link # 5. Caddy cp Caddyfile /etc/caddy/ systemctl reload caddy ``` ### Drone CI 自动部署 推送到 `main` 分支自动触发。需在 Drone 配置 `ssh_key` secret(部署机 SSH 私钥)。 `.drone.yml` 完成了三步流水线: 1. `golang:1.22` — 编译 Go 二进制 2. `node:20-alpine` — 构建前端 3. `alpine:3` — 上传文件 + `systemctl restart short-link` + `systemctl reload caddy` ## 配置 | 环境变量 | 默认值 | 说明 | |----------|--------|------| | `ADDR` | `:8819` | 监听地址 | | `DOMAIN` | `http://localhost:8819` | 短链接域名,用于拼接 short_url | | `DB_PATH` | `./data.db` | JSON 数据文件路径 | | `ADMIN_TOKEN` | (空) | 管理员 Bearer Token,空值时所有管理接口返回 401 | ## API ### POST /api/shorten ``` 请求: { "url": "https://example.com/very/long/path" } 响应: { "code": "abc1234", "short_url": "https://xieyaxin.top:8899/abc1234", "original_url": "https://example.com/very/long/path" } ``` - 自动补全 `https://` 前缀 - 仅支持 http/https 协议 - 返回 400(URL 不合法)、500(服务端错误) ### GET /:code ``` GET /abc1234 → 302 Found → Location: https://example.com/... ``` - 存在:302 临时重定向 - 不存在:404 ### 管理接口 以下接口需在请求头中携带 `Authorization: Bearer `。 #### GET /api/admin/links 列出所有短链接,按创建时间倒序。 ``` → 200 [{ "code": "abc1234", "original_url": "https://...", "visit_count": 42, "created_at": "2026-05-06T14:30:00Z" }] → 401 未授权 ``` #### PUT /api/admin/links/{code} 更新短链接指向的原始 URL。 ``` 请求: { "url": "https://new.example.com" } → 200 { "code": "abc1234", "original_url": "https://new.example.com", ... } → 404 短码不存在 ``` #### DELETE /api/admin/links/{code} 删除短链接。 ``` → 200 { "ok": true } → 404 短码不存在 ``` #### GET /api/admin/export 导出全部数据。 ``` GET /api/admin/export → JSON 文件下载 (application/json) GET /api/admin/export?format=csv → CSV 文件下载 (text/csv) ``` ## 短码设计 - 7 位 base62 字符集 (a-z, A-Z, 0-9) - `crypto/rand` 密码学安全随机数 - 62^7 ≈ 3.5 万亿组合 - 插入前检查唯一约束,碰撞重试最多 3 次 ## 管理后台 访问 `/#admin` 进入管理界面: 1. 输入 `ADMIN_TOKEN` 登录(浏览器 sessionStorage 保存,关闭标签页自动清除) 2. 表格展示所有短链接:短码、原始链接、访问次数、创建时间 3. 行内编辑:修改原始 URL 4. 行内删除:确认后删除 5. 导出数据:支持 JSON / CSV 格式下载