# 项目开发需求说明文档（Django + Bootstrap + MySQL）

> 本文档用于告诉 AI Agent：需要开发一个 **类似 Cloudflare / 百度云加速的域名加速面板**，  
> 使用 **Python + Django（非前后端分离）+ Bootstrap + MySQL**，并集成 GoEdge 管理员 API 作为底层 CDN 引擎。

---

## 1. 项目目标

- 搭建一个 **按域名计费的 CDN 加速控制面板**，用户以 CNAME 方式接入域名。
- 每个域名默认有 **每月 15GB 免费流量**（该值应可在管理后台配置，并可对用户/域名单独调整）。
- 支持多种 **套餐（Plan）**，不同套餐控制：
  - 每个域名的免费/包含流量额度
  - 每 GB 超量单价
  - 可用功能（WAF、日志、HTTP/3、访问控制、缓存高级规则等）
- 系统提供：
  - 用户注册登录、域名接入管理、流量统计展示
  - 套餐订购与变更、账单与支付（先定义结构，支付接入可预留）
  - 强大的管理后台（基于 Django Admin + 自定义页面），可灵活配置套餐、免费额度、功能开关、超量策略等。
- 后端使用 Django 模板 + Bootstrap 完成 UI，**不做前后端分离**。

---

## 2. 技术栈与基础要求

- **后端框架**：Python 3.x + Django 4.x（或当前 LTS）
- **前端框架**：Django Template + Bootstrap 5（或当前版本）
- **数据库**：MySQL 8.x
- **CDN 引擎集成**：通过 HTTP 调用 **GoEdge 管理员 API**（使用 X-Edge-Access-Token）
- **用户认证**：
  - 使用 Django 内置认证体系扩展（或自定义 User 模型）
  - 支持邮箱 / 用户名登录
- **语言**：
  - 首版可仅中文界面，保留 i18n 结构，便于未来多语言。

---

## 3. 核心业务概念与模型

### 3.1 用户（User）

- 平台登录账号（客户）。
- 一个用户可以拥有多个域名。

### 3.2 域名（Domain / Site / Zone）

- 用户添加的待加速域名，如 `example.com`。
- 用户通过将其子域名（如 `www.example.com`）CNAME 到平台提供的加速域名接入。
- 每个域名：
  - 绑定一个当前套餐（Plan）
  - 拥有每月免费/包含流量额度
  - 有一套独立的功能配置（WAF 开关、缓存规则等）

### 3.3 套餐（Plan）

- 按域名计费的套餐模版。
- 定义：
  - 基础月费：每个域名每月多少钱
  - 包含流量：每个域名每月包含多少 GB
  - 超量单价：每 GB 超出后的费用
  - 功能开关：是否支持 WAF、日志下载、HTTP/3、WebSocket、自定义规则等
  - 可见/可购状态：是否显示给普通用户新购/升级、是否仅管理员可用

### 3.4 域名套餐实例（DomainPlan / Subscription）

- 某个域名当前使用的套餐实例。
- 记录：
  - `domain` + `plan`
  - 当前计费周期（开始时间/结束时间）
  - 实际生效的配额（可在 Plan 基础上对该域名单独 override）
  - 自定义价格/流量/功能

### 3.5 流量使用记录（Traffic Usage）

- 以 **域名 + 日期** 为粒度记录流量数据。
- 用于：
  - 展示流量图表
  - 计算是否超过“免费额度”和“套餐包含流量”
  - 计算超量费用

### 3.6 账单 / 订单（Invoice / Order）

- 对应一个计费周期或某一段用量的费用结果。
- 包含：
  - 基础套餐费用
  - 超量流量费用
  - 优惠/调整
  - 是否已支付

---

## 4. 功能模块（用户侧）

### 4.1 用户注册 / 登录 / 账号管理

**需求：**

- 用户可以通过邮箱注册账号。
- 登录支持：
  - 用户名 + 密码 或 邮箱 + 密码
- 验证码系统（预留，可以用简单图形验证码）。
- 用户中心页面：
  - 修改密码
  - 查看登录历史（最近若干登录 IP、时间）
  - 管理个人信息（名称、联系方式）

### 4.2 域名列表 & 概览

- 页面：`/domains/`
- 展示内容：
  - 域名名称
  - 当前套餐名称
  - 本月已用流量 / 当前月度可用流量
  - 状态（未接入 / DNS 未生效 / 正常 / 超额 / 暂停）
- 支持操作：
  - 添加新域名
  - 进入域名详情
  - 删除/停用域名（逻辑删除或状态标记）

### 4.3 添加域名流程（CNAME 接入向导）

页面流程（可以拆成一个页面多步骤）：

1. 用户输入域名（`example.com`）
2. 选择接入子域名（可填多个，如 `www.example.com`、`static.example.com`）
3. 填写源站信息：
   - 源站地址（IP 或 源站域名）
   - 回源协议（HTTP/HTTPS）
   - 回源端口
4. 选择套餐（默认 Free 套餐，支持可选升级）
5. 创建后：
   - 后端调用 GoEdge Admin API 创建对应的 Server 与配置；
   - 生成 CNAME 目标，例如：`www.example.com.cdn.platform.com`
6. 页面展示：
   - 需要添加的 DNS 记录列表
   - 状态为“等待 DNS 配置”
   - 提供“立即检测 DNS 生效情况”的按钮（后台通过 DNS 查询判断）

### 4.4 域名详情页

- 路径示例：`/domains/<domain_id>/`
- 展示模块：

1. **概览**
   - 当前套餐信息
   - 本月流量进度条（已用 vs 总额度）
   - 超量状态提示（如已超过套餐流量 X GB）

2. **统计（流量 / 请求）**
   - 近 24 小时 / 7 天 / 30 天：
     - 流量图（MB/GB）
     - 请求数
     - HTTP 状态码分布（200/404/5xx）
     - 按地区/运营商分布（若 GoEdge 支持）

3. **接入信息**
   - 当前接入的子域名和对应的 CNAME 记录
   - DNS 状态

4. **功能设置（视套餐决定是否可见/可编辑）**
   - SSL/TLS 设置
   - 缓存规则
   - WAF 总开关
   - IP 黑白名单
   - 路径规则（简单页面规则）

> 所有修改类操作都通过 Django 视图调用 GoEdge Admin API 更新配置。

### 4.5 套餐列表 & 升级

- 页面：`/plans/`
- 展示所有 **对用户公开的套餐**，包括：
  - 套餐名称、月费
  - 每域名包含流量
  - 超量单价
  - 功能对比（表格形式）
- 在域名详情页可以：
  - 点击「升级套餐」
  - 跳转到套餐列表，选中一个 Plan → 后端进行升级逻辑（仅变更套餐记录，计费逻辑后续执行）

> 支付可先不做实际第三方接口，预留订单记录和“标记为已支付”的操作。

### 4.6 账单 / 费用

- 页面：`/billing/`
- 用户可查看：
  - 历史账单列表：时间区间、金额、状态
  - 每个账单详情：
    - 流量用量明细（按域名）
    - 超量部分计算方式

> 样式可以简单先实现，支付流程在后端逻辑中预留钩子。

---

## 5. 功能模块（管理员后台）

### 5.1 使用 Django Admin 的基础管理

- 启用 Django Admin，并注册模型：
  - 用户管理
  - 域名管理
  - 套餐管理
  - 域名套餐实例（DomainPlan/Subscription）
  - 流量记录
  - 账单/订单

### 5.2 自定义管理面板（独立于 admin site 的运营后台）

> 目的：提供一个比 Django Admin 更贴合业务的运营控制台。

可能路径：`/admin-panel/`（与 Django admin 区分）

功能：

#### 5.2.1 全局系统设置

- 例如 `SystemSettings` 表，对应的配置项：
  - `default_free_traffic_gb_per_domain`（默认每域名每月免费流量，默认 15）
  - 默认超量策略（超量是否允许访问、是否限速、是否自动停服）
  - GoEdge API 地址 + 管理员 `X-Edge-Access-Token`
  - 默认 CNAME 目标域名模板（如 `<subdomain>.cdn.xxx.com`）

#### 5.2.2 套餐管理（Plans）

- 新增/编辑/删除套餐：
  - 套餐名称、描述
  - 月费（每域名月费）
  - 每域名包含流量（GB）
  - 超量单价（元/GB）
  - 功能开关（布尔或 JSON 配置）：
    - 启用 WAF（是/否）
    - 是否支持自定义 SSL 证书
    - 是否支持实时日志
    - 是否支持 HTTP/3
    - 是否支持 WebSocket
    - 是否支持自定义规则（页面规则数量上限）
  - 可见性：
    - 是否对普通用户展示
    - 是否允许新购
    - 是否允许续费
    - 是否只允许管理员手动分配

#### 5.2.3 用户与域名管理

- 用户列表：
  - 查看用户基本信息、注册时间、状态
  - 查看该用户下所有域名
- 域名列表：
  - 按域名搜索、按用户过滤
  - 查看当前使用的套餐、用量、状态
  - 操作：
    - 手动切换套餐
    - 为该域名增加 **额外的免费流量额度**（本周期）
    - 为该域名设置 **自定义超量单价**
    - 暂停/恢复域名
    - 查看与 GoEdge 的映射关系（serverId / clusterId 等）

#### 5.2.4 免费流量与配额调整

- 支持对以下层级做手动调整：
  1. 全局默认（所有新域名默认免费 15GB）
  2. 某个套餐的包含流量
  3. 某个用户的默认免费额度（该用户新添加的域名都使用这个值）
  4. 某个具体域名在当前周期的 **个人额外赠送流量**

- 在管理面板中应有页面：
  - 显示每个域名：
    - 基础套餐流量
    - 全局默认调整
    - 用户层级额外
    - 域名本身额外
  - 以及最终计算出的“本周期可用总免费流量”。

#### 5.2.5 计费与账单管理

- 账单列表：
  - 账单编号、用户、计费周期、总金额、是否已支付
- 支持：
  - 手动标记账单为已支付
  - 重新生成某个周期的账单（用于调试或运营）
  - 对超量部分进行 **人工减免或加价**（在账单上增加调账项目）

#### 5.2.6 运维监控 & 风控（可分阶段实现）

- 简单版本：
  - 全平台每日总流量曲线
  - 域名按流量排序的 Top N 列表
- 进一步：
  - 配置“异常流量检测阈值”（例如当日流量超过过去 7 日平均的 3 倍）→ 标记异常域名

---

## 6. 数据库设计（概要说明）

> 这里仅做表与字段的**概念说明**，具体字段类型和索引由 AI Agent 在实现时按 MySQL 习惯设计。

### 6.1 用户相关

- `users`（可扩展 Django User 或自定义）
  - id
  - username
  - email
  - password_hash
  - is_active
  - is_staff / is_superuser
  - created_at, updated_at

- `user_profile`（可选扩展）
  - user_id (FK)
  - display_name
  - contact_phone
  - default_free_traffic_gb_per_domain_override（用户级默认免费流量覆盖值）

### 6.2 域名与接入

- `domains`
  - id
  - user_id (FK)
  - name（`example.com`）
  - status（pending_dns / active / suspended / deleted）
  - current_plan_id (FK → plans)
  - current_cycle_start
  - current_cycle_end
  - cname_targets（JSON，子域名与 CNAME 目标映射）
  - origin_config（JSON：源站地址/端口/协议等）
  - edge_server_id（在 GoEdge 中的 serverId）
  - created_at, updated_at

- `domain_overrides`（域名级别的配额/价格/功能覆盖，可合并到 domains 里）
  - domain_id (FK)
  - extra_free_traffic_gb_current_cycle（本周期额外赠送的免费流量）
  - custom_overage_price_per_gb
  - custom_features (JSON)
  - note

### 6.3 套餐 & 功能

- `plans`
  - id
  - name
  - description
  - billing_mode（per_domain_monthly）
  - base_price_per_domain
  - included_traffic_gb_per_domain
  - overage_price_per_gb
  - allow_overage（是否允许超量计费）
  - is_active
  - is_public
  - allow_new_purchase
  - allow_renew
  - created_at, updated_at

- `plan_features`（或直接用 JSON 存在 plans 中）
  - plan_id
  - key（如 `waf_enabled`、`http3_enabled` 等）
  - value（bool/int/string）

### 6.4 流量统计与计费

- `domain_traffic_daily`
  - id
  - domain_id (FK)
  - day（日期）
  - bytes
  - peak_bandwidth_mbps
  - created_at

- `invoices`
  - id
  - user_id
  - period_start
  - period_end
  - amount_plan_total（该周期所有域名套餐费用之和）
  - amount_overage_total
  - amount_adjustment（手工调整）
  - amount_total
  - status（unpaid / paid / cancelled）
  - created_at, paid_at

- `invoice_items`
  - id
  - invoice_id (FK)
  - domain_id (FK)
  - description（如“基础套餐费用”、“超量流量费用”等）
  - quantity（如 GB 数）
  - unit_price
  - amount

---

## 7. 业务流程说明（供实现时参考）

### 7.1 域名接入流程

1. 用户登录 → 添加域名 → 填写源站 → 选择套餐 → 创建域名记录 + 调 GoEdge 创建 Server
2. 系统生成 CNAME 目标 → 显示给用户
3. 用户配置 DNS → 前端提供“检测”按钮 → 后端通过 DNS 查询判断已生效
4. DNS 生效后，域名状态从 `pending_dns` → `active`，开始正式计流量。

### 7.2 计费周期与流量统计（按月）

1. 每天定时任务，从 GoEdge 统计 API 拉各域名的流量/请求数据，写入 `domain_traffic_daily`。
2. 每个域名有自己的计费周期（默认按自然月，也可按首次接入日算周期）。
3. 周期结束时，后台任务：
   - 计算该周期每个域名总流量
   - 对比“免费/套餐包含流量”：
     - 未超出 → 只收套餐费
     - 超出 → 套餐费 + 超量*单价
   - 生成 `invoice` 和 `invoice_items` 记录。

4. 对于未支付账单，可根据策略：
   - 在下一周期开始前停止所有域名（状态为 `suspended`）
   - 或只允许免费额度，超出部分阻断。

---

## 8. 界面与前端要求（Django + Bootstrap）

- 全站使用 Django 模板 + Bootstrap 布局：
  - 顶部导航：登录用户信息、域名列表入口、套餐、账单入口
  - 左侧在“域名详情页”使用类似 Cloudflare 的菜单列表（概览 / 分析 / SSL / 缓存 / 防火墙 / 设置）
- 表格和列表使用 Bootstrap Table 风格。
- 表单使用 CSRF 保护。
- 操作类按钮（如“升级套餐”、“暂停域名”）需二次确认弹窗。

---

## 9. 安全与权限

- 使用 Django Auth + `login_required` 装饰器保护用户页面。
- 管理后台分两套：
  - Django Admin（仅超级用户访问）
  - 自定义运营面板 `/admin-panel/`（限 staff 与具有相应权限的用户）
- 所有与 GoEdge API 交互的操作仅在后端进行，前端不暴露任何 GoEdge Access Token。
- 重要操作（删除域名、切换套餐、调账等）写「操作日志表」，记录操作人、时间、变更内容。

---

## 10. 可扩展点（后续版本预留）

- 支付功能集成（支付宝 / 微信 / Stripe 等）基于易支付：
  - 暂时只定义订单、账单结构，后续接入支付网关。
- 工单系统（Ticket）

---

> **AI Agent 实施重点：**
> - 先完成基础模型（用户 / 域名 / 套餐 / 流量 / 账单）和管理后台结构。
> - 实现「添加域名 → 生成 CNAME → 拉取流量 → 生成账单」完整闭环。
> - 前端使用 Django 模板 + Bootstrap 提供一个简单但清晰的 Cloudflare 风格面板。
