# 用户生命周期管理

---
DDS-Section: 4. 用户生命周期管理
DDS-Lines: L203-L288
---

## 用户状态定义

| 状态 | 说明 | 触发条件 |
|:---|:---|:---|
| `disabled` | 待审批状态 | 用户注册后默认状态 |
| `active` | 正常激活 | 注册工单审批通过 |
| `locked` | 临时锁定 | 登录失败过多 / 管理员手动锁定 |

## 状态转换规则

| 原状态 | 事件 | 新状态 |
|:---|:---|:---|
| (新建) | 用户注册 | disabled |
| disabled | 保存草稿 | disabled |
| disabled | 工单打回 | disabled |
| disabled | 审批通过 | active |
| disabled | 工单撤销 | (删除) |
| active | 正常使用 | active |
| active | 信息更新 | active |
| active | 登录失败锁定 | locked |
| active | 管理员禁用 | disabled |
| active | 管理员删除 | (删除) |
| locked | 解锁 | active |
| locked | 管理员禁用 | disabled |

## 账户有效期机制

### 有效期设置规则

| 用户类型 | 有效期选项 | 默认值 | 说明 |
|:---|:---|:---|:---|
| SuperAdmin 创建 | 无限制/自定义 | 永久 | 可设置任意有效期 |
| Admin 创建 | 1/3/6/12个月 | 3个月 | 必须设置有效期 |
| Normal 创建 | 1/3/6/12个月 | 3个月 | 必须设置有效期 |

### 有效期字段

```go
AccountExpiresAt *time.Time `json:"account_expires_at"`  // NULL表示永久
```

### 有效期检查逻辑

| 检查点 | 行为 |
|:---|:---|
| 登录时 | 过期则拒绝登录 |
| JWT 中间件 | 校验用户状态时同时检查 |
| 提前提醒 | 7天内登录时返回提醒 |

## 强制修改密码机制

### 触发条件

| 条件 | 标识字段 | 处理方式 |
|:---|:---|:---|
| 首次登录 | `must_change_password = true` | 跳转改密页面 |
| 密码重置后 | `must_change_password = true` | 使用临时密码后强制改密 |
| 密码过期 | `password_expires_at` 已过期 | 拒绝登录 |

### 密码过期时间线

```
创建用户/重置密码
    ↓
password_expires_at = now + 90天
must_change_password = true
    ↓
首次登录 → 强制改密
    ↓
改密后: password_expires_at = now + 90天
        must_change_password = false
    ↓
正常使用
    ↓
第83天: 提醒
    ↓
第90天: 强制过期
```
