# 密码预设 — 设计规格

> ⚠️ **已归档** — 2026-05-22
> 本文档引用的文件结构已过时：`server/database.py` 已拆分为 `server/domain/models/`；PHP 前端 (`servers.php`/`settings.php`) 已迁移到 Tailwind CSS v4 + Alpine.js (`web/app/servers.html`/`settings.html`)。功能已实现，保留本文档供历史参考。

## 背景

多台服务器的 SSH 密码通常相同，每次新建服务器时重复输入密码效率低。提供密码预设列表，新建服务器时下拉选择即可。

## 核心变更

### 数据模型

**新增 PasswordPreset 表：**

```python
class PasswordPreset(Base):
    __tablename__ = "password_presets"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100), nullable=False, comment="预设名称")
    encrypted_pw = Column(String(500), nullable=False, comment="加密后的密码")
    created_at = Column(DateTime, default=datetime.datetime.utcnow)
```

加密方式与 Server.password 一致（Fernet），复用 `encrypt_value` / `decrypt_value`。

### API 端点

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/servers/password-presets` | 列表，只返回 id + name（不含密码） |
| POST | `/api/servers/password-presets` | 创建 {name, password}，加密存储 |
| DELETE | `/api/servers/password-presets/{id}` | 删除 |
| POST | `/api/servers/password-presets/{id}/reveal` | 解密返回明文（需 API 认证） |

### 前端改动

**servers.php 密码字段区：**

```
密码预设: [选择预设 ▾]          ← 新建
  ├─ 生产环境 — 123abc
  ├─ 测试环境 — test456
  └─ 自定义（手动输入）

SSH密码: [自动填充 ████████] 👁
         ← 选预设后自动填入，也可手动改
```

**settings.php 新增「密码预设管理」tab/区：**

```
┌─ 密码预设管理 ────────────────────────────────┐
│  名称              操作                        │
│  生产环境密码      [👁 查看] [🗑 删除]         │
│  测试环境密码      [👁 查看] [🗑 删除]         │
│  [+ 添加]  名称: [____] 密码: [____] [保存]   │
└────────────────────────────────────────────────┘
```

### 涉及文件

| 文件 | 改动 |
|------|------|
| `server/database.py` | PasswordPreset 模型 |
| `server/api/servers.py` | 4 个预设端点 |
| `web/servers.php` | 预设下拉 + JS 联动 |
| `web/settings.php` | 预设管理面板 |
| `docs/CHANGELOG.md` | 追加记录 |

预估：5 文件，~200 行。

## 规格自检

- [x] 无占位符/TODO
- [x] 加密/解密复用现有 infrastructure（Fernet + encrypt_value/decrypt_value）
- [x] 列表 API 不返回密码明文，reveal 端点需单独调用
- [x] 范围聚焦：仅密码预设，不涉及其他
