# 工业互联网平台 v5.0 · 启动手册 · 离线指南

> 适用：本原型 `原型/` 目录所有 HTML 页面
> 更新日期：2026-04-19

---

## 1. 一分钟启动

| 场景 | 步骤 |
|---|---|
| 我是产品经理，第一次看 | ① 解压 `原型/` 至本地任意目录 → ② 双击 **`START.html`** → ③ 在三大入口卡片中选「应用管理平台 · 控制台」开始体验 |
| 我要看完整登录 SSO 流程 | 双击 **`login.html`**，任选一个示例账号一键登录 |
| 我只想看某个子平台 | 直接双击对应 `*_index.html`，例如 `platforms/bi/app/bi_index.html` |
| 我要看移动驾驶舱 | 双击 `platforms/mobile/index.html`，浏览器请缩小窗口至 ~ 400 px 宽，或切到 DevTools 设备模拟（iPhone 12 推荐） |
| 我要部署给同事看 | 见第 6 节"内网静态服务器部署" |

> 全部页面都是**纯静态 HTML + JS + CSS**，**无需任何服务端、数据库、构建工具**。

---

## 2. 离线运行原理

| 资源 | 离线策略 | 文件 |
|---|---|---|
| 图标库 | 本地 `<iconify-icon>` polyfill + 870+ MDI SVG 内联 | `assets/vendor/iconify-icon.local.js` + `assets/vendor/iconify-mdi-data.js` |
| 3D 引擎 | three.js 本地化（约 670 KB） | `assets/vendor/three.min.js` |
| 字体 | 系统字体栈（PingFang SC / Microsoft YaHei / system-ui） | `assets/css/base.css` 内联 |
| 业务数据 | 全部 mock 数据，运行期 JS 工厂构造 | `assets/js/mock.js` 与各页面内联 |
| 图表 | 自研 SVG / Canvas，**不依赖** ECharts / D3 / Chart.js 在线版 | `assets/js/charts.js` |

> 关键约束：**HTML 中只允许出现** `file://` / `blob:` / `data:` / 相对路径资源；**严禁** 出现 `https://cdn.*` / `https://fonts.googleapis.com/*` / `unpkg` 等任何在线域名。
> 校验方法：DevTools → Network 标签页打开页面，确认 0 条外部域名请求。

---

## 3. 双击运行（file:// 协议）注意事项

### 3.1 推荐做法

1. 将 `原型/` 整个目录解压在**本地磁盘**，路径中**避免空格、中文括号、感叹号等特殊字符**（中文目录名本身没问题）。
2. 用 **Edge ≥ 110** 或 **Chrome ≥ 110** 双击 `START.html`。
3. 弹出"是否允许该文件访问本地文件"提示时（macOS Safari），点击允许即可。

### 3.2 file:// 下的已知行为差异

| 行为 | 说明 | 处理 |
|---|---|---|
| `fetch()` 加载本地 JSON | Chrome / Edge 默认禁止 file:// 下 fetch 本地文件 | 本原型已**全部内联化**（数据放在 `*.js` 中作为全局变量），不依赖 fetch；如自行扩展请走第 6 节内网部署 |
| `localStorage` | file:// 下每个文件路径自己一个 origin，子平台间不共享 token | 本原型对 `dt_logged` 等关键 key 做了**全平台同源约定**，但若你把同一份 HTML 同时放在两个不同盘符，会出现"在 D 盘登录后回到 C 盘需重新登录"现象 |
| `postMessage` | iframe 父子通信正常 ✓ | 无需特殊处理 |
| Service Worker | file:// 下不可用 | 本原型未使用 Service Worker |
| 弹出新窗口 | `window.open` 在 file:// 下会被部分浏览器拦截 | 编辑器 / 大屏均为 `window.open(..., '_blank')`，首次点击如被拦截，请允许"始终允许此站点弹出窗口" |

### 3.3 不推荐的浏览器

| 浏览器 | 现象 |
|---|---|
| IE 11 | ✗ 完全不支持 Web Components / Flexbox gap |
| 360 安全浏览器 兼容模式 | ✗ 旧 IE 内核，请切到极速模式 |
| 微信内置浏览器 | ⚠ 仅移动驾驶舱可看，桌面端布局错乱 |

---

## 4. 故障排查

### 4.1 图标不显示（变成空白方块或 ❓ 占位）

**症状**：所有 `<iconify-icon>` 都不渲染，或个别图标显示为 `mdi:help-circle-outline` 占位。

**原因 → 排查**：

1. **`iconify-mdi-data.js` 未加载** → 打开 DevTools Console，检查是否有 `MDI_ICON_DATA is not defined` 报错。
   - 修复：确认页面 `<head>` 中两行脚本顺序为：
     ```html
     <script src="../../../assets/vendor/iconify-mdi-data.js"></script>
     <script src="../../../assets/vendor/iconify-icon.local.js"></script>
     ```
   - **iconify-mdi-data.js 必须在 iconify-icon.local.js 之前**。
2. **图标名拼写错误** → polyfill 找不到时落 `mdi:help-circle-outline` 占位，并把缺失名 push 到 `window.__MDI_MISSING__` 数组。在 Console 输入 `window.__MDI_MISSING__` 可查看缺失列表。
   - 修复：使用其他存在的 MDI 图标名（[mdi 图标库](https://pictogrammers.com/library/mdi/) 仅供命名参考，运行时无需联网）。
3. **路径深度错** → 部分页面在 `pages/<group>/<page>.html` 嵌套，相对路径前缀应为 `../../`，shell 在 `<id>/app/` 深 3 级用 `../../../`。
   - 修复：检查 `<script src="...">` 中 `../` 的层数与文件相对位置匹配。

### 4.2 3D 场景不动（孪生场景白屏 / 一帧不动）

**症状**：打开 `dt/pages/scenes/production-twin.html` 或 `twin-preview.html` 后，画面卡在 loading 或单帧。

**排查**：

1. **`three.min.js` 加载失败** → DevTools Network 检查 `assets/vendor/three.min.js` 是否 200。
2. **WebGL 被禁用** → 访问 `chrome://gpu`，确认 WebGL 状态为 "Hardware accelerated"。Edge 同理 `edge://gpu`。
3. **集成显卡驱动太旧** → 升级显卡驱动，或在 Edge 设置 → 系统 → 关闭 "使用图形加速时，使用兼容模式"。
4. **页面被嵌入 iframe 里且高度为 0** → 首屏 KPI 卡片没渲染时常见，刷新页面即可。

### 4.3 大屏空白 / 布局错乱

**症状**：BI 或质量大屏全屏后只看到背景，没有图表。

**排查**：

1. **窗口尺寸 < 1366×768** → 大屏均按 1920×1080 设计，<1366 时会出现裁切。
   - 修复：F11 全屏；或浏览器缩放至 75%。
2. **图表脚本顺序问题** → 检查 `<head>` 中 `assets/js/charts.js` 是否在大屏自有脚本**之前**加载。
3. **iframe 内打开大屏** → 大屏强制要求新窗口（`editor=true / screen=true` 时菜单已自动 `window.open`），如手动嵌 iframe 可能引发样式污染。
   - 修复：右键菜单 → 在新窗口打开。

### 4.4 登录无反应 / 一直跳回登录页

**症状**：点击"登录"后又跳回登录页，或子平台首页又自动跳回 `*_login.html`。

**排查**：

1. 浏览器**隐私模式**禁用 `localStorage` → 切到普通模式。
2. 浏览器开了"清除登出时数据" → 关闭该选项，或在某子平台先登录后再访问其他子平台。
3. 不同盘符 / 不同协议导致 origin 不同 → 把所有访问统一在 `file:///C:/.../原型/` 下，避免一会儿 `C:\` 一会儿 `D:\`。

### 4.5 移动驾驶舱在桌面浏览器看着特别小

**正常现象**：mobile 页固定 750 px 宽，桌面浏览器全屏会显得很窄。

**正确打开方式**：

- **方案 A**：浏览器窗口手动缩小到 ~400 px。
- **方案 B**（推荐）：F12 → 设备模拟（响应式）→ 选择 iPhone 12 / Pixel 5。
- **方案 C**：把 URL 复制到手机浏览器（前提是手机能访问到这个 file 路径，建议走第 6 节内网部署）。

---

## 5. 浏览器与分辨率兼容矩阵

| 浏览器 | 1366×768 | 1440×900 | 1920×1080 | 2560×1440 | 移动 750×1334 |
|---|---|---|---|---|---|
| Edge ≥ 110 | ✓ | ✓ | ✓ | ✓ | ✓（DevTools 模拟） |
| Chrome ≥ 110 | ✓ | ✓ | ✓ | ✓ | ✓ |
| Firefox ≥ 110 | ◐ 视觉略差异 | ◐ | ◐ | ◐ | ✓ |
| Safari ≥ 15 | ◐ backdrop-filter 略差 | ◐ | ◐ | ◐ | ✓ |
| 移动 Safari | — | — | — | — | ✓ |
| 移动 Chrome | — | — | — | — | ✓ |
| IE 11 | ✗ | ✗ | ✗ | ✗ | ✗ |

---

## 6. 部署到内网静态服务器

### 6.1 推荐方案：nginx 一行配置

把 `原型/` 整个目录上传到内网某台 Linux / Windows 主机，例如 `/srv/www/iiot/`。
nginx 最小配置（`/etc/nginx/conf.d/iiot.conf`）：

```nginx
server {
    listen       80;
    server_name  iiot.intra.example.com;
    root         /srv/www/iiot;
    index        START.html index.html;

    # 启用 gzip（可选，加速首屏加载）
    gzip          on;
    gzip_types    text/plain text/css application/javascript application/json image/svg+xml;
    gzip_min_length 1024;

    # 长缓存（图标 / 3D / 字体类）
    location ~* \.(js|css|svg|png|jpg|woff2)$ {
        expires 7d;
        add_header Cache-Control "public, immutable";
    }
}
```

reload：`sudo nginx -s reload`，访问 `http://iiot.intra.example.com/START.html`。

### 6.2 备选方案：Python 内置 HTTP 服务

适合临时演示（无需安装 nginx），在 `原型/` 目录下执行：

```bash
# Python 3
python -m http.server 8080 --bind 0.0.0.0
# 然后浏览器访问 http://<主机 IP>:8080/START.html
```

> 该方案不支持 gzip，单进程，仅适合 1–2 个并发用户演示。

### 6.3 备选方案：Node.js `serve`

```bash
npx serve -l 8080 .
```

### 6.4 部署后建议

| 项 | 建议 |
|---|---|
| 内网域名 | 申请固定内网域名（如 `iiot.intra.example.com`），便于团队记忆 |
| HTTPS | 内网可用自签证书 + 推送根证书；公网请用 Let's Encrypt |
| 访问控制 | nginx 加 `auth_basic` 简单口令保护 |
| 资源路径 | 不要把 `原型/` 改名为含特殊符号目录；`assets/` 与 `platforms/` 必须保持原相对结构 |
| 跨域 | 若后续接 mock-server，请加 `add_header Access-Control-Allow-Origin "*";` |

---

## 7. 自检清单（部署 / 演示前）

- [ ] 双击 `START.html` 能正常显示三大入口卡片
- [ ] DevTools → Network 0 条外部域名请求（除 `about:blank` / `data:`）
- [ ] 控制台 → 任意子平台跳转正常，登录态共享
- [ ] BI 大屏与孪生场景能在新窗口全屏打开
- [ ] 质量与成本移动驾驶舱在 750 px 视口下正常显示
- [ ] 任意叶子页能完整渲染图表与 KPI
- [ ] Edge 110 + Chrome 110 各跑一遍
- [ ] 1440×900 与 1920×1080 各跑一遍

---

## 8. 求助

| 我遇到… | 请… |
|---|---|
| 图标 / 大屏 / 登录类问题 | 见第 4 节"故障排查" |
| 想新增图标 / 替换离线包 | 见 `wendang/jiagou/lixian_fangan.md` 第 3 节 |
| 想了解架构 / 双端 / SSO | 见 `wendang/jiagou/jiagou_zongti.md` 与 `PLATFORM_MAP.md` |
| 想看每个子平台菜单 | 见 `PLATFORM_MAP.md` 第 3 节 |
| 想看版本变更 | 见 `wendang/banbenjilu/<拼音>_v5.0.md` |

---

**离线即满血。Have fun! 🚀**
