docs: R16 成员档案修改与空壳删除裁决入档
成员操作面扩为可改 name/remark、key_count=0 时硬删空壳;软删除仍是账本实体默认语义。
This commit is contained in:
+22
-11
@@ -4,8 +4,8 @@
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 状态 | 定稿(2026-10-01) |
|
||||
| 关联 | `docs/design/api_keys表字段设计.md` 3.9(归属列指向本表)· `docs/design/需求清单.md` §9 |
|
||||
| 状态 | 定稿(2026-10-01;R16 修订 2026-10-10) |
|
||||
| 关联 | `docs/design/api_keys表字段设计.md` 3.9(归属列指向本表)· `docs/design/需求清单.md` §9(访问主体模型)· R16(档案可改、空壳删除) |
|
||||
| 范围 | 列结构 + 语义 + 写入时机;令牌生成细节归技术稿;方言映射归数据访问层设计 |
|
||||
| 字段数 | 7 = 1 主键 + 6 业务字段 |
|
||||
|
||||
@@ -21,13 +21,13 @@
|
||||
|
||||
| 列 | 类型 | 值来源 | 说明 |
|
||||
|----|------|--------|------|
|
||||
| `id` | bigserial PK | 自增 | |
|
||||
| `name` | text UNIQUE | 管理面录入 | 显示名——账目与视图中的署名 |
|
||||
| `remark` | text | 管理面录入 | 备注(联系方式、是谁等;可空) |
|
||||
| `status` | text | 管理面 | `active` / `disabled`——停用即成员视图访问立即失效(令牌校验含状态判断) |
|
||||
| `token_hash` | text | 管理面生成令牌时 | 成员视图的访问凭证(哈希存储,明文只在生成时展示一次) |
|
||||
| `token_issued_at` | timestamptz | 同上 | 当前令牌的签发时间(审计线索) |
|
||||
| `created_at` | timestamptz | 开户时 | |
|
||||
| `id` | bigserial PK | 自增 | 不可改 |
|
||||
| `name` | text UNIQUE | 管理面录入(可改) | 显示名——账目与视图中的署名;开户后可改(R16) |
|
||||
| `remark` | text | 管理面录入(可改) | 备注(联系方式、是谁等;可空);开户后可改(R16) |
|
||||
| `status` | text | 管理面启停 | `active` / `disabled`——停用即成员视图访问立即失效(令牌校验含状态判断);**不并入档案编辑** |
|
||||
| `token_hash` | text | 管理面生成令牌时 | 成员视图的访问凭证(哈希存储,明文只在生成时展示一次);仅随重发更新 |
|
||||
| `token_issued_at` | timestamptz | 同上 | 当前令牌的签发时间(审计线索);仅随重发更新 |
|
||||
| `created_at` | timestamptz | 开户时 | 不可改 |
|
||||
|
||||
## 3. 决策记录(含理由)
|
||||
|
||||
@@ -45,17 +45,28 @@
|
||||
|
||||
账目署名不可歧义。
|
||||
|
||||
### 3.4 软删除(`status`)而非物理删除
|
||||
### 3.4 软删除(`status`)为主,空壳例外硬删(R16)
|
||||
|
||||
成员名下的 key 与历史用量是账本的一部分——「退拼」是停用(保留行、停访问),不是抹掉事实。
|
||||
成员名下的 key 与历史用量是账本的一部分——「退拼」是停用(保留行、停访问),不是抹掉事实。**默认无物理删除**。
|
||||
|
||||
**空壳例外(R16)**:当前 `key_count = 0`(无任何 `api_keys.member_id` 指向本行)时允许硬删——该行不承载账本事实,删了只清掉误建/未使用的开户壳,并释放 UNIQUE 名称。名下有 key 一律拒绝删除(只能停用)。硬删与软删除不冲突:账本实体的默认语义仍是软删除,空壳删是「无账本可保」时的清理通道。
|
||||
|
||||
### 3.5 档案字段可改(`name` / `remark`)(R16)
|
||||
|
||||
- **动机**:开户后挂 key 前发现名称不对(误建、占位名)——已发出令牌时「改名」优于「删了重建」(重建会作废旧令牌)
|
||||
- **可改字段收窄**:仅 `name` / `remark`;`status` / 令牌 / `id` / `created_at` 各走各的生命周期,不并入档案编辑
|
||||
- **`name` 仍 UNIQUE**(3.3 不变);冲突 `409 member_name_taken`
|
||||
- **展示口径 = 当前名**:日志 / 总览 / 成员视图联查实时取 `members.name`(与 `api_keys.token_name` 的「当前名为准」同则)——历史署名随改名漂移,可接受
|
||||
|
||||
## 4. 写入时机
|
||||
|
||||
| 时机 | 动作 |
|
||||
|------|------|
|
||||
| 开户(管理面) | INSERT(`name` / `remark`;生成令牌 → `token_hash` + `token_issued_at`) |
|
||||
| 档案修改(R16) | UPDATE `name` 和/或 `remark` |
|
||||
| 停用 / 启用 | UPDATE `status` |
|
||||
| 重发令牌 | UPDATE `token_hash` + `token_issued_at`(旧令牌即失效) |
|
||||
| 空壳删除(R16) | DELETE(仅 `key_count = 0`;名下有 key 拒绝) |
|
||||
|
||||
以上全部为管理面写操作,均落**审计日志**(审计为独立需求,表结构归技术稿)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user