# U8 · 产品原型站 · 部署说明

这是一个**纯静态站点**：没有后端、没有数据库、不依赖 Node 构建、不加载任何 CDN。
`site/` 目录里的所有文件就是最终产物，原样上传到服务器的网站目录即可。

站点用途：给**开发和老板**快速浏览各功能的**可点击演示版**与**产品需求文档（PRD）**。

---

## 一、站点收录什么

站点采用**白名单收录**：只有 `site_build/build_site.py` 里 `MODULES` 数组登记过的功能模块
才会进站，不是"文档目录里有什么就上什么"。

站点分两个页签：

**① 功能演示列表（`index.html`）** —— 主要功能，共 **13 项**：

| 分组 | 模块 |
| --- | --- |
| 会话与消息 | 单聊快速建群、搜索、聊天文件夹、消息表情回复、消息选择 |
| 资料与设置 | 用户原名显示、群成员标签、登录密码、修改手机号、设备管理、隐私设置 |
| 资产与钱包 | 虚拟卡、虚拟卡运营后台 |

**② 其他资料（`others.html`）** —— 非主要功能与过程资料，共 **2 项**：
会话列表搜索（查缺补漏报告 + 早期 PRD）、发红包引导改版（专题演示）。

内容统计：**14 个可点击演示 + 14 份 PRD**。

页签归属由 `MODULES` 条目里的 `section` 字段决定：`"main"`（默认，进功能演示列表）
或 `"other"`（进其他资料）。把某个功能在主列表和其他资料之间挪动，只改这一个字段。

### 列表排序

两个列表**默认按「更新时间」倒序**（最近改动的功能排最前面），可以在「排序」下拉里
切换成「按分组」或「功能名称」。排序在构建时就写进 HTML，所以即使浏览器禁用
JavaScript，默认顺序依然正确。

「更新时间」取该功能相关文件（演示页 + 该功能的 PRD）里最新的修改时间。

### 近期上传 / 近期更新 是怎么来的

首页顶部有两块公示栏：左侧「近期上传」、右侧「近期更新」，各最多 3 条，新的顶掉旧的。

它们由 `site_build/activity.json`（**活动台账**）驱动，而不是靠文件时间戳 ——
仓库被拷贝、解压或 git 操作后，文件的创建时间会全部变得一样，`ctime` 也会被刷新，
根本区分不出"新加的"和"改过的"。所以生成器按**内容指纹**自己记账：

| 情况 | 台账动作 | 面板表现 |
| --- | --- | --- |
| 台账里没有这个模块 | 记下首次收录日期 | 出现在「近期上传」 |
| 指纹变了（内容改动） | 刷新最近变更日期 | 出现在「近期更新」 |
| 指纹没变 | 不动 | 两边都不出现 |

所以维护方式是：**改内容 → 重跑生成器 → 面板自动更新**。不需要手工维护这两个列表。

> 首次把某个功能登记进 `MODULES` 时，会用文件自身的日期作为基准（不会把历史内容
> 误报成"刚刚上传"）；之后再改动才会进「近期更新」。
> `activity.json` 建议一起提交到仓库，这样团队里谁构建都能看到一致的活动记录。

**不在站点里的内容**（按需求排除）：线框图、会话存档、常见问题页、过程/归档文档。
需要新增功能时，在 `MODULES` 里加一条；要从站点移除，删掉对应条目。

---

## 二、上传什么

把 **`site/` 目录里的全部内容**上传到网站目录：

```
404 相关：无需配置，静态站点直接用服务器默认 404
nginx.conf                 Nginx 的 location 规则（可选）
.htaccess                  Apache 的配置（可选）
preview.sh                 本地预览脚本（可以不传，传上去也无害）
robots.txt / sitemap.xml   搜索引擎用，可选
.nojekyll                  给 GitHub Pages 用，其它环境无影响

index.html                 功能演示列表（主要功能，13 项）
others.html                其他资料（非主要功能，2 项）
assets/                    样式、脚本、搜索索引
prd/<功能>/…                14 份产品需求文档（由 Markdown 渲染）
<功能名>/index.html         14 个可点击交互演示
```

**上传方式**（任选其一）：

```bash
# rsync（推荐，增量同步、保留中文文件名）
rsync -avz --delete site/ user@your-server:/www/u8-prototype/

# 或先打包再传
cd site && tar czf ../u8-prototype.tar.gz . && cd ..
scp u8-prototype.tar.gz user@your-server:/tmp/
ssh user@your-server 'mkdir -p /www/u8-prototype && tar xzf /tmp/u8-prototype.tar.gz -C /www/u8-prototype'
```

> ⚠️ **用 `rsync` / `tar` / `scp`，不要用会改写文件名编码的 FTP 客户端。**
> 站点里有中文文件名与中文目录（例如 `快速建群/index.html`），编码错了会大批 404。

---

## 三、Nginx 配置

```nginx
server {
    listen 80;
    server_name prototype.example.com;

    root /www/u8-prototype;
    index index.html;

    charset utf-8;
    autoindex off;

    include /www/u8-prototype/nginx.conf;   # 站点自带的缓存规则
}
```

配置完 `nginx -t` 检查语法，再 `nginx -s reload`。

`nginx.conf` 里做的事：CSS / JS 短缓存（10 分钟），可执行文件与 HTML 每次校验。

---

## 四、Apache 配置

站点根目录已带 `.htaccess`，服务器允许 `.htaccess` 生效时自动读取
（`AllowOverride All` 或至少 `AllowOverride FileInfo Indexes`）。

若服务器禁用了 `.htaccess`，把这几项搬进 `httpd.conf` 的 `<Directory>` 块：

```apache
DirectoryIndex index.html
AddDefaultCharset UTF-8
Options -Indexes
```

---

## 五、本地预览（上传前先看效果）

```bash
cd site
bash preview.sh          # 默认 http://127.0.0.1:8080
bash preview.sh 9000     # 指定端口
```

> **必须用 HTTP 访问。** 直接双击打开 HTML（`file://`）时，浏览器会拦截搜索索引的
> 加载，跨页面搜索会失效（列表内的筛选仍可用）。

---

## 六、更新内容

```bash
# 在仓库根目录
python3 site_build/build_site.py     # 重新生成 site/
python3 site_build/verify_site.py    # 自检：中文编码、站内死链
rsync -avz --delete site/ user@your-server:/www/u8-prototype/
```

`build_site.py` 只用 Python 3 标准库（3.9+），不需要安装任何依赖。

---

## 七、验收清单

| 检查项 | 预期 |
| --- | --- |
| 打开首页 | 「功能演示列表」显示 11 个主要功能，**按更新时间倒序**，样式正常 |
| 点顶栏「其他资料」页签 | 切到 `others.html`，显示 2 项非主要功能 |
| 在搜索框输入「登录」 | 列表实时过滤，只剩匹配行 |
| 切换「内容 = 有演示」 | 只显示提供演示的 12 个模块 |
| 点某行的「可点击演示」 | 打开该功能的交互原型 |
| 点某行的「查看 PRD」 | 打开 PRD：左侧正文 + 右侧目录 |
| 按 `/` 键 | 弹出跨页面搜索，输入「提现」「红包」有结果 |
| 点顶栏「产品原型站」 | 回到功能列表 |

---

## 八、已知说明

- **列表筛选是纯前端**，在首页内即时生效；顶栏 `/` 搜索是**跨页面**搜索
  （覆盖所有演示与 PRD 页面），两者互补。
- **站点体积约 1.5 MB**，非常轻，适合内网或公网托管。
- **深色模式**跟随访问者系统设置，也可在右上角手动切换，偏好存在浏览器本地。
- 站点**不采集访问数据**、不加载外部字体与脚本，可放在内网环境。
