ywty 是一款自托管图床 / 云相册系统:从经典 Lsky Pro+ 完全重写而来,后端从 PHP/Laravel 迁移到 Go + Gin + GORM,前端从 Vue 3 + Vite 升级到 Nuxt 3 SSR。
我们保留了原有的 REST 契约、30+ 张业务表结构和「多驱动」生态,目标是给个人/团队提供零成本、可扩展、长期可维护的私有云相册方案。
当前状态:P0–P11 全部完成 ✅,生产可用 alpha 版。欢迎 Star / Watch 关注更新。
- 📁 相册 - 公开/私有、批量管理、容量统计
- 🏷️ 标签 - 多对多绑定图片
- 🔗 分享 - 密码保护、过期时间、QR Code
- ❤️ 点赞 - 去重计数
- 🚨 举报 - 多类型、自动归集违规
- 🔍 探索 - 公开内容瀑布流、用户/专辑页
- JWT(前台用户)+ Session(后台管理员)
- 三套验证码:图形 / 邮箱 / 短信
- RBAC(Casbin)+ 角色组 + 用户组
- API Token(用户自管理 + 能力授权)
- OAuth 社交登录:GitHub / Google / 微信 / QQ / 钉钉 / Gitee / 微博
Local · S3 · 阿里云 OSS · 腾讯云 COS · 七牛云 · 又拍云 · FTP · SFTP · WebDAV
- 浏览器直传签名(OSS/S3 跳过服务器中转)
- 跨存储复制
- 用户配额 / 容量统计
- 套餐 / 订阅 / 订单全链路
- 6 种支付驱动:支付宝 · 微信 · PayPal · Stripe · EPay 彩虹 · Mock
- 异步通知(签名校验 + 防重放)
- 优惠券(满减 / 折扣 / 固定额)
| 类别 | 已支持 |
|---|---|
| 短信 | 阿里云 · 腾讯云 · Twilio · 七牛云 · Log |
| 邮件 | SMTP · 阿里云 DirectMail · Log |
| 社交登录 | GitHub · Google · 微信 · QQ · 钉钉 · Gitee · 微博 |
| 图片扫描 | 阿里云内容安全 · 腾讯云 IMS · 自定义 HTTP |
| 图片处理 | Local(imaging)· 自定义 HTTP |
- 一套 GORM 模型覆盖 30+ 张业务表
- 默认 SQLite 轻量化,深度支持 MySQL(推荐 MariaDB 10.6.20+)
- 迁移 CLI:
migrate up / down / status / seed
| 技术 | 用途 |
|---|---|
| Go 1.25+ | 主语言 |
| Gin | HTTP 框架 |
| GORM v2 | ORM |
| Viper | 配置(YAML + 环境变量) |
| Zap | 日志(按等级 / 文件切割) |
| Asynq | 异步队列(基于 Redis) |
| BigCache + Redis | 多级缓存 |
| Casbin | RBAC |
| golang-jwt | JWT |
| disintegration/imaging | 图像处理 |
| asaskevich/govalidator | 验证 |
| 技术 | 用途 |
|---|---|
| Nuxt 3 | SSR / SSG 框架 |
| Vue 3 + TypeScript | 视图层 |
| Pinia | 状态管理 |
| Vue I18n | 国际化(zh-CN / en-US) |
| @nuxt/image | 图片优化 |
| Tailwind CSS | 样式 |
| 技术 | 用途 |
|---|---|
| Docker + Docker Compose | 容器化 |
| GitHub Actions | CI(gofmt / vet / test / build / Docker 多架构) |
| Nginx | 反向代理 + HTTPS |
| Supervisor | 进程守护 |
# 1. 准备环境变量
cp .env.example .env
# 编辑 .env:至少改 JWT_SECRET 和 APP_URL
# 2. 一键启动(内置 MySQL + Redis)
docker compose up -d
# 3. 访问
open http://localhost:3000其他场景:
# 连接宿主机已有 MySQL + Redis
DB_HOST=host.docker.internal REDIS_HOST=host.docker.internal \
docker compose up -d --scale mysql=0 --scale redis=0
# 本地开发用 SQLite(无需任何数据库容器)
DB_DRIVER=sqlite docker compose up -d --scale mysql=0 --scale redis=0
# 数据库迁移
docker compose run --rm migrate默认管理员:admin / admin123456(请尽快修改)
# ---- 后端 ----
cd server
go mod download
cp .env.example .env
go run ./cmd/migrate # 初始化数据库 + 种子数据
go run ./cmd/api # 启动 API(默认 :8080)
# 另起一个终端:
go run ./cmd/worker # 启动 Worker(队列消费)
# ---- 前端 ----
cd web-nuxt
npm install
npm run dev # 启动 Web(默认 :3000)# 1. 编译产物 + 构建多架构镜像并推送
./deploy/deploy.sh prod v1.0.0
# 2. 拷贝 Nginx / Supervisor 模板
cp deploy/nginx.conf.example /etc/nginx/sites-available/ywty.conf
cp deploy/supervisor.conf /etc/supervisor/conf.d/ywty.conf
# 3. 数据库备份(自动按数据库驱动适配)
./deploy/backup-db.sh mysql详细的部署配置和参数说明见 deploy/README.md。
ywty/
├── server/ # Go 后端
│ ├── cmd/
│ │ ├── api/ # API 服务入口
│ │ ├── worker/ # 队列 Worker
│ │ ├── migrate/ # 数据库迁移 CLI
│ │ └── import/ # 数据导入工具
│ ├── configs/ # Viper 配置 + Casbin 模型
│ ├── internal/
│ │ ├── auth/ # JWT
│ │ ├── handler/ # HTTP handlers
│ │ ├── service/ # 业务服务
│ │ ├── model/ # GORM 模型(30+ 张表)
│ │ ├── drivers/ # 支付/存储驱动
│ │ ├── notify/ # 短信 / 邮件
│ │ ├── social/ # 社交登录
│ │ ├── scan/ # 图片扫描
│ │ ├── process/ # 图片处理
│ │ ├── jobs/ # 异步任务
│ │ ├── queue/ # Asynq 封装
│ │ ├── rbac/ # Casbin 鉴权
│ │ ├── middleware/ # 限流 / CORS
│ │ ├── database/ # GORM 工厂
│ │ ├── errors/ # 业务错误码
│ │ ├── response/ # 统一响应
│ │ ├── router/ # 路由注册
│ │ ├── seed/ # 种子数据
│ │ ├── license/ # License 管理
│ │ └── logger/ # Zap
│ ├── Dockerfile
│ └── go.mod
├── web-nuxt/ # Nuxt 3 前端
│ ├── pages/ # 公共端 + 用户中心 + 管理后台
│ ├── layouts/ # 4 套布局
│ ├── components/ # 通用组件
│ ├── composables/ # useApi / useAuth / useMessage
│ ├── stores/ # Pinia 状态
│ ├── middleware/ # 路由守卫
│ ├── i18n/ # 国际化
│ ├── types/ # TypeScript 类型
│ ├── server/api/ # Nitro BFF
│ └── Dockerfile
├── deploy/ # 部署脚本
│ ├── deploy.sh # 一键编译 + 构建 + 推送
│ ├── dev-up.sh / dev-down.sh
│ ├── backup-db.sh # 多数据库备份
│ ├── nginx.conf.example # 反向代理
│ └── supervisor.conf # 进程守护
├── .github/workflows/ # CI / Release
├── docker-compose.yml
├── .env.example
├── Dockerfile # 合并镜像(API + Web)
└── README.md
- 后端遵循 Uber Go Style Guide,提交前跑:
gofmt -l . # 格式检查 go vet ./... # 静态检查 go test -race ./...
- 前端遵循 Vue 3 + TypeScript 规范,提交前跑:
npm run lint npm run typecheck npm run build
- 提交信息遵循 Conventional Commits(
feat:/fix:/docs:/refactor:/test:/chore:)
# 查看 API 健康
curl http://localhost:8080/healthz
# 查看队列状态(需装 asynqmon)
# docker run -p 8081:8080 hibiken/asynqmon --redis-addr=host.docker.internal:6379
# 实时日志
docker compose logs -f ywty
# 进入 API 容器调试
docker compose exec ywty sh# 后端
cd server
go test -race -shuffle=on -coverprofile=coverage.out ./...
go tool cover -html=coverage.out # 查看覆盖率
# 前端(待补 E2E)
cd web-nuxt
npm run test当前覆盖:errors · storage · drivers/payment(含 EPay 签名校验、Mock 驱动单测)。
欢迎贡献代码 / 提 Issue / 提 PR。请阅读 CONTRIBUTING.md 与 CODE_OF_CONDUCT.md。
代码改动请尽量带上:
- ✅ 单元测试
- ✅ CHANGELOG 条目
- ✅ 类型定义 / API 文档更新
如果这个项目对你有帮助,请给我们一个 ⭐ 鼓励!你的支持是项目持续迭代的最大动力。
- 基础路径:
/api/v1、/api/v2(双版本兼容) - 鉴权:
Authorization: Bearer <access_token>或X-Token: <token> - 响应结构:
{ "code": 0, "message": "ok", "data": {...} } - 分页响应:
{ "data": [...], "meta": { "current_page": 1, "total": 100, "per_page": 20 } } - 错误码:业务错误码见
internal/errors,HTTP 状态码保持一致
| 阶段 | 名称 | 状态 |
|---|---|---|
| P0 | 工程脚手架 | ✅ |
| P1 | 数据库与基础 | ✅ |
| P2 | 鉴权体系 | ✅ |
| P3 | 核心域 | ✅ |
| P4 | 存储驱动(9 种) | ✅ |
| P5 | 商业域 | ✅ |
| P6 | 扩展驱动 | ✅ |
| P7 | 运营域 | ✅ |
| P8 | Nuxt 公共端 | ✅ |
| P9 | Nuxt 用户中心 | ✅ |
| P10 | Nuxt 管理后台 | ✅ |
| P11 | 测试与部署 | ✅ |
| v1.0 | 正式版 | 🎯 2026 Q4 |
| 未来 | 移动端 App / 多租户 / 联邦 | 💭 |
本项目采用 MIT License 开源。
- Lsky Pro+ — 原始项目作者及其团队
- 所有贡献者与社区用户
- ⭐ 如果觉得不错,给我们一个 Star 吧! ⭐