# P10 发帖 · 设计说明（publish-post.vue）

> 单元：`publish-post` ｜ group=community ｜ P10 ｜ 依据：pages.json unit#15 + 规格表 P10 + 执行方案 §5.15
> 实现：`vue/src/pages/publish-post.vue` ｜ 状态帧 fixtures：`design/fixtures/community.states.json`

## 1. 区块与字段对照

| 字段/区块 | 实现落点 | 校验/反馈（C 维度） |
|---|---|---|
| ① 圈子必选 | FormField + 全屏抽屉（我加入的 2 + 推荐 2，单选回填，默认=首个已加入圈） | 必选；抽屉内行显成员/今日帖 |
| ② 标题 30 字 | input maxlength=30 | 计数 n/30；确认键 next |
| ③ 正文 1000 字+计数 | textarea maxlength=1000 | 计数 n/1000；extreme 帧=1000/1000 顶格（共享帖文派生，长度经 node 实测=1000） |
| ④ 图片 ≤9 | 四列九宫格：首图标「首图」；删除钮；添加位显余量 | loading 帧=上传中 62% 进度块；9 满禁用添加；删除=二次确认语义 toast |
| ⑤ 挂拍品单选 | 行式入口→半屏选择器（myItems state=live 单选 + 「不挂拍品」）；选择器内空态=EmptyState「还没有在售拍品」+「先去发布拍品 →」→publish-item（数据驱动，pages.json na 口径） | 选择器行内 PriceText 为本页唯一金额渲染点（表单收起态不显示价格） |
| ⑥ 话题标签 ≤3 | topics 词库 chips 多选 | 超 3 个 toast 拦截 |
| ⑦ 提交 | footbar block 按钮 + 草稿自动保存注 | 防连点=提交动作 toast 语义；error 帧=黄条「内容已保留」重试 |

## 2. 状态帧（board_parts=2）

| 帧 | 渲染 |
|---|---|
| normal | 空表单初态（圈子已预选、已选 2 图、#开箱 已选） |
| success | 「发布成功，审核通过后展示」+审核链路注（敏感词机审+后台人审开关）+返回圈子→circle |
| loading | 图片上传进度块（局部 loading，表单可继续填） |
| error | ErrorRetry「提交失败，内容已保留」+提交按钮禁用态 |
| guest | 登录引导 Sheet（发帖必登录；遮罩可点关） |
| extreme | 正文 1000/1000 顶格 + 9/9 图满（3 实图+6 示意占位，无同图复用） |
| empty | N/A（pages.json na_reason：表单页；「无在售拍品」是挂拍品选择器字段内空态而非页面空态） |

## 3. 九维度

- **A**：成功=审核中语义（不冒充已发布可见）；loading=局部上传。
- **B**：同 P05 表单基线（失焦校验/草稿/防连点）；图片删除二次确认；话题超限 toast。
- **C**：失焦校验/计数器/maxlength 逐字段（见 §1 表）；挂拍品选择器 confirm 语义。
- **D**：计数 n/上限；「最多 1 件」显式；按 §0.3。
- **E**：圈子选择=全屏抽屉；挂拍品=半屏选择器；error 帧内容保留可重试。
- **F**：按 §0.5（分包二语义，界面无平台词）。
- **G**：图片压缩上传语义（进度块示意）；分页 N/A（表单页）。
- **H**：必填 * + 文字；禁用态（error 帧/9 图满）成帧。
- **I**：POST /posts、GET /my/items?status=live（全部演示，不接真实接口）。

## 4. 决策触点 → 字段/组件

| 决策点 | 落点 |
|---|---|
| 发帖挂拍品（圈子服务拍卖流动性） | 挂拍品选择器（live 单选）+「先去发布拍品」兜底 |
| 发到哪个圈 | 圈子全屏抽屉（我加入的+推荐） |

## 5. 占位与素材纪律

- 已选图只用 post-image 白名单键（wulu-post-shot/wulu-box/badge-case）；缺口位 .ph「示意图」角标。
- 草稿自动保存=示意注（真实实现失焦存本地）。
- 审核说明文案=页内示意（正式文案随协议与后台配置）。
