# 执行记录 · 2026-06-11 · GHCS v0.2 登录入口闭环验收（本地）

```jsx
HLDP://ghcs/v0.2/exec-log/2026-06-11 · 2026-06-11T00:48+08:00
├── scope: GHCS v0.2 · API Keys 登录入口产品化 + 本地验收闭环（不部署服务器）
├── env: Mac 本地开发（frontend:3000 + backend:5002）
├── policy: 未完全开发完不部署服务器（本次严格遵守）
└── result: ✅ 本地闭环通过
```

---

## ✅ 本次完成清单（按验收口径）

### 1) 登录入口（可点可用）

- 页面：`/console/keys` 顶部登录条显示
- 登录接口：`POST /api/login` → 返回 `access_token`（bearer）
- 本地持久化：`localStorage.ghcs_access_token` 有值（刷新不丢）

### 2) 写操作鉴权闭环（不再 401）

- 启停开关：触发 `PUT /api/keys/{id}` → 200
- Network 验收：请求头包含 `Authorization: Bearer <token>`
- 实际效果：key 的启用/停用状态可切换并生效

---

## 🧱 本次遇到的问题（根因）

1) **前端编译错误：TSX 的 style 写法错**

- 典型错误：`style= color: ...` / `style= backgroundColor: ...`
- 结果：Next 直接 build error（Expected '</', got 'ident'）

2) **富文本/渲染吞双花括号**

- 在聊天/Notion 中书写 `style= ...`  容易被吞成“少一层花括号”，导致反复改错
- 结论：对话与文档中统一使用 `style={ { ... } }` 展示代码（永不丢花括号）

3) **token 失效导致 401（令牌过期或无效）**

- 现象：localStorage 有 token，但写请求 401
- 处理：清空旧 token → 重新登录签发 → 再验收 PUT 200

---

## 🧠 认知沉淀（以后怎么避免绕圈）

- **硬规则 1：TSX 里看到 `style=` 就立即检查是否是对象形式**
    - 禁用：`style= color:` / `style= backgroundColor:`
    - 允许：`style= ...`  或 `style={ { ... } }`
- **硬规则 2：代码只在 VS Code 改；对话只传证据链**
    - 证据链最小集：localStorage token 有值 + Network PUT 200 + Bearer header 存在
- **硬规则 3：401 先走 SOP，不猜**
    - token 是否存在 → header 是否带 Bearer → response detail → 再决定清 token 还是修代码

---

## 📌 当前状态

- GHCS v0.2 · API Keys 登录入口 + 写操作鉴权：**本地验收✅**
- 下一步（仍保持本地优先）：全局 fetch 封装（自动带 Bearer + 统一 401 提示）