You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
topuser b6089c3aca 更新 '.drone.yml' 2 days ago
backend fix: update service port from 8080 to 8819 across configuration files 3 days ago
frontend fix: update service port from 8080 to 8819 across configuration files 3 days ago
.drone.yml 更新 '.drone.yml' 2 days ago
.gitignore feat: initialize frontend with Svelte and Vite 3 days ago
Caddyfile fix: update service port from 8080 to 8819 across configuration files 3 days ago
README.md fix: update service port from 8080 to 8819 across configuration files 3 days ago
short-link.service fix: update service port from 8080 to 8819 across configuration files 3 days ago

README.md

短链接生成器

粘贴长链接,一键变短。极简工具网站。

架构

用户请求 → 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

本地开发

后端

cd backend

# 安装依赖
go mod tidy

# 运行 (默认 :8819)
ADDR=:8819 DOMAIN=http://localhost:8819 DB_PATH=./data.db ADMIN_TOKEN=dev go run .

# 运行测试
go test ./...

前端

cd frontend

# 安装依赖
npm install

# 开发模式 (默认 :5173, API 请求会由 Vite 转发配置决定)
npm run dev

# 构建
npm run build

部署

环境要求

  • Go 1.22+
  • Node.js 20+
  • Caddy 2.x
  • systemd (Linux)

手动部署

# 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 <ADMIN_TOKEN>

列出所有短链接,按创建时间倒序。

→ 200 [{ "code": "abc1234", "original_url": "https://...", "visit_count": 42, "created_at": "2026-05-06T14:30:00Z" }]
→ 401 未授权

更新短链接指向的原始 URL。

请求: { "url": "https://new.example.com" }
→ 200 { "code": "abc1234", "original_url": "https://new.example.com", ... }
→ 404 短码不存在

删除短链接。

→ 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 格式下载