# 数据库表结构(account-manager v2) ## 数据库路径 `{JIANGCHANG_DATA_ROOT}/{JIANGCHANG_USER_ID}/account-manager/account-manager.db` (或宿主映射的 `CLAW_DATA_ROOT` / `CLAW_USER_ID`,解析细节见 [`RUNTIME.md`](RUNTIME.md)。) ## Schema 版本 - `PRAGMA user_version = 2` - `_schema_meta.schema_version = "2.1"`(字符串;迁移完成后取值) 启动时 `ensure_schema` 自动执行 `migrate_v1_to_v2` 与 `migrate_v2_to_v2_1`,幂等。 --- ## 1. `platforms` — 平台注册表 | 字段 | 类型 | 说明 | |---|---|---| | `platform_key` | TEXT PK | 平台唯一键(`maersk` / `deepseek` / `sohu` …) | | `display_name` | TEXT NOT NULL | 展示名 | | `domain` | TEXT NOT NULL | `logistics` / `llm` / `content` / `dev` / `sim` / …(以代码注册为准) | | `provider_code` | TEXT | 供应商代码 | | `default_url` | TEXT | 默认入口 URL | | `aliases_json` | TEXT | 别名 JSON 数组 | | `capabilities_json` | TEXT | `{"web": bool, "api_key": bool, "rpa": bool}` | | `enabled` | INTEGER | 是否启用(1/0) | | `default_auth_strategy` | TEXT | 新账号默认 `auth_strategy`;可由迁移回填 | | `created_at` | INTEGER | Unix 秒 UTC | | `updated_at` | INTEGER | Unix 秒 UTC | **索引:** `idx_platforms_domain`,`idx_platforms_provider_code` --- ## 2. `accounts` — 账号身份 | 字段 | 类型 | 说明 | |---|---|---| | `id` | INTEGER PK AUTO | 主键 | | `platform_key` | TEXT NOT NULL | 对应 `platforms.platform_key` | | `account_label` | TEXT NOT NULL | 人可读名称 | | `login_id` | TEXT | 登录标识(可空) | | `login_id_type` | TEXT | `email` / `username` / `phone` / … | | `tenant_id` | TEXT | 租户,可空 | | `environment` | TEXT | `simulator` / `staging` / `production` / … | | `role` | TEXT | `booking` / `tracking` / `api` / … | | `provider_code` | TEXT | 冗余供应商码 | | `profile_dir` | TEXT | Playwright profile 目录 | | `url` | TEXT | 账号入口 URL | | `status` | TEXT | `active` / `disabled` / … | | `session_status` | TEXT | `unknown` / `likely_valid` / … | | `last_used_at` | INTEGER | Unix 秒 | | `last_login_check_at` | INTEGER | Unix 秒 | | `last_error_code` | TEXT | 文本错误码 | | `last_error_message` | TEXT | 错误说明 | | `extra_json` | TEXT | 扩展 JSON(可含 `logged_in_url_pattern` / `logged_in_selector` 等 hook) | | `auth_strategy` | TEXT NOT NULL | 九种策略之一(见 [`PLATFORMS.md`](PLATFORMS.md) / `db/auth_strategy.py`) | | `session_persistent` | INTEGER NOT NULL DEFAULT 1 | `0`/`1` | | `device_fingerprint` | TEXT | 仅 `device_bound` | | `created_at` | INTEGER | Unix 秒 UTC | | `updated_at` | INTEGER | Unix 秒 UTC | **索引:** `idx_accounts_platform`,`idx_accounts_pick_web`,`idx_accounts_provider`,`idx_accounts_status` --- ## 3. `credentials` — 凭据(API Key / Token / Password …) | 字段 | 类型 | 说明 | |---|---|---| | `id` | INTEGER PK AUTO | 主键 | | `account_id` | INTEGER | 关联 `accounts.id`,可空(历史平台级 Key) | | `platform_key` | TEXT NOT NULL | 平台键 | | `credential_label` | TEXT NOT NULL | 展示名称 | | `credential_type` | TEXT NOT NULL | `api_key` / `password` / … | | `secret_storage` | TEXT NOT NULL | `none` / `env` / `windows_credential` / `local_encrypted` | | `secret_ref` | TEXT | `env` 变量名 / `windows_credential` target;其它后端可为空 | | `secret_mask` | TEXT | 打码展示 | | `secret_ciphertext` | TEXT | `local_encrypted` 专用 Fernet token(v2.1 增加) | | `expires_at` | INTEGER | Unix 秒 | | `status` | TEXT | `active` / `disabled` / … | | `last_used_at` | INTEGER | Unix 秒 | | `extra_json` | TEXT | JSON | | `created_at` | INTEGER | Unix 秒 | | `updated_at` | INTEGER | Unix 秒 | **原则**:不把 **明文** secret 写入 SQLite;`local_encrypted` 仅存 **密文**。外部后端(env / Windows CM)仍在运行时解析。 **索引:** `idx_credentials_platform_type`,`idx_credentials_status`,**`idx_credentials_account`(`migrate_v1_to_v2` 中 `CREATE INDEX IF NOT EXISTS`)** --- ## 4. `account_leases` — RPA 并发锁 | 字段 | 类型 | 说明 | |---|---|---| | `id` | INTEGER PK AUTO | 主键 | | `account_id` | INTEGER NOT NULL | `accounts.id` | | `lease_token` | TEXT UNIQUE | 随机 token | | `holder` | TEXT NOT NULL | 持有者标识 | | `purpose` | TEXT | 用途 | | `expires_at` | INTEGER NOT NULL | Unix 秒 UTC | | `heartbeat_at` | INTEGER | Unix 秒 | | `released_at` | INTEGER | Unix 秒 | | `status` | TEXT | `active` / `released` / `expired` | | `created_at` | INTEGER | Unix 秒 | | `updated_at` | INTEGER | Unix 秒 | **索引:** `idx_leases_account_status`,`idx_leases_token`,`idx_leases_expires` --- ## 5. `_schema_meta` — Schema 元数据 | 字段 | 类型 | 说明 | |---|---|---| | `key` | TEXT PRIMARY KEY | 键名 | | `value` | TEXT NOT NULL | 值 | **已知键** - `schema_version` — 逻辑 schema 版本字符串:`migrate_v1_to_v2` 完成后写入 `"2"`,`migrate_v2_to_v2_1` 完成后更新为 **`"2.1"`**。 --- ## Profile 文件布局 ``` {DATA_ROOT}/{USER_ID}/account-manager/ ├── account-manager.db ├── master.key # 若执行过 init-master-key(也可用环境变量代替) └── profiles/ └── {domain}/ └── {platform_key}/ └── {safe_label}[_{login_id_suffix}]/ ``` 删除账号时实现会尽量同步删除对应目录。 ## 与 JSON 输出的对应关系 CLI JSON 字段与上表对应;若有封装层(`_ok_json`),详见 [`CLI.md`](CLI.md) / [`INTEGRATION.md`](INTEGRATION.md)。