Skip to content

feat: SaaS tenants, subscriptions, two-stage approval and load-balanced short links #2

Description

@brownie-cake

背景

当前版本已具备短链、活码、账户所有权、单级管理员审核与访问统计,但仍是单组织模型。需要在保持 SQLite / MySQL、单体部署和现有公开链接兼容的前提下,演进为可私有部署也可平台运营的 SaaS 基础。

目标

1. 负载均衡短链目标池

  • 一个稳定短码可维护多个目标 URL。
  • 支持 round_robinrandomweighted_randomleast_usedip_hash
  • 目标支持启停、权重、排序、有效期、访问上限、健康状态和独立命中计数。
  • 选择、游标和计数更新在事务内完成;无可用目标时回退到原目标或备用链接。
  • 访问日志能够追踪实际命中的目标。

2. 多租户

  • 账户可加入多个租户并切换当前工作区。
  • 租户角色至少包括 owneradminreviewermemberanalyst
  • 所有资源列表、详情、统计、编辑、删除、审批与日志均执行服务端租户边界校验。
  • 现有账户和资源通过迁移自动进入个人工作区,不破坏已有部署。
  • 平台管理员与租户管理员权限分离。

3. 订阅与配额

  • 套餐、租户订阅、订阅变更申请、订阅事件和月度用量模型。
  • 默认 Free / Pro / Business / Enterprise 套餐;额度覆盖成员数、短链数、活码数、单短链目标数和月访问量。
  • 资源创建、成员邀请、目标池规模和公开访问量在服务端统一执行额度检查。
  • 支付提供商保持可插拔;首期支持平台管理员人工审批订阅变更,不把 Stripe 等供应商写死到核心域。
  • 支持 trialing / active / past_due / canceled / expired 等生命周期及周期结束取消。

4. 两级审批

  • 新建或修改内容进入 tenant_pending
  • 租户 owner/admin/reviewer 审核通过后进入 platform_pending
  • 仅平台管理员可完成最终 approved / platform_rejected
  • 任意内容性修改自动递增版本并重置为租户待审。
  • 短链、活码和活码子项均记录不可变审批事件;公开入口仅在平台终审通过后生效。

5. 管理端、测试与文档

  • 工作区切换、租户成员、订阅/额度、审批中心、平台租户/套餐/订阅申请管理。
  • 中英文文案、响应式和深浅色兼容。
  • SQLite 与 MySQL 迁移。
  • Store、路由权限、审批状态机、配额与分发策略测试。
  • 架构、SaaS 模型、升级和 API 文档。

兼容性原则

  • 现有短码 URL 与单目标行为保持不变。
  • 未配置目标池时继续使用 short_links.target_url
  • 迁移不重建旧表,不要求外部缓存或消息队列。
  • 私有单租户部署仍可使用默认个人工作区与 Free/Enterprise 手工套餐。

验收检查

gofmt -w <changed-go-files>
go test ./...
go vet ./...
go build -o bin/ai-shortlink ./cmd/server
node --check web/static/app.js
node --check web/static/platform_ext.js
git diff --check

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions