# ElecLab Web · 电气计算工坊

浏览器即开即用的**低压电气设计与计算工具**（教学 + 初步设计定位），纯前端实现、无构建、无依赖、12 种语言。

## 快速开始

直接双击 `index.html` 打开即可（或用任意静态服务器托管）。数据保存在浏览器 localStorage，无需后端。

```bash
# 可选：本地起静态服务
python -m http.server 8000
# 打开 http://localhost:8000
```

## 功能总览（23 个页面）

**核心计算（13）**
| 页面 | 功能 | 依据 |
|---|---|---|
| 项目概览 | 系统参数、项目/方案管理、合规清单、异常清单、校审流程、打印模板 | — |
| 负荷 | 负荷表、功率平衡（ΣP/ΣQ/ΣS/加权 cosφ）、增长系数、变压器推荐 | IEC 60364 |
| 电缆 | 截面选型（安装方式/温度/成组/土壤修正）、载流量表 | IEC 60364-5-52 |
| 电压降 | 稳态压降、最大长度反算 | IEC 60364-5-52 §525 |
| 电机启动 | 启动电流/压降/母线跌落，DOL/星三角/软启动/变频对比 | IEC 60034 |
| 馈线档案 | 馈线→回路树、逐回路校验、负载率仪表盘、CSV 双向 | IEC 60364 |
| 短路 | I"k3/I"k1 + 电机反馈叠加 | IEC 60909 |
| 保护 | 过载/瞬时/分断/热稳定校验（MCB/熔断器） | IEC 60364-4-43 |
| 接地 | TT/TN-S/TN-C/IT 校验 | IEC 60364-4-41 |
| PFC | 无功补偿容量 | IEC 61000-3-2 |
| UPS | 容量/电池/选型 | IEC 62040 |
| 谐波 THD | 单装置谱 + 多装置叠加（α 求和） | IEC 61000-3-6/12 |
| 电弧闪光 | IEEE 1584 2002/2018 双版本、PPE、边界距离 | IEEE 1584/NFPA 70E |

**扩展模块（6）**
| 页面 | 功能 | 依据 |
|---|---|---|
| 直流系统 | 48/110/220V 直流配电：电流/压降/电池/短路 | IEC 60364/62485 |
| 防雷 SPD | 滚球法保护半径 + SPD 分级 | IEC 62305 |
| 负荷潮流 | 前推回代潮流（节点电压/支路电流） | 径向网 |
| 桥架选型 | 电缆填充率 40% 限值 + 载流量参考 | IEC 61084 |
| 启动器 | 接触器/热继电器/断路器配合 | IEC 60947-4-1 |
| 配合表 | 上游×下游选择性矩阵 + 级联提示 | IEC 60947-2 |

**系统建模（2）**：单线图编辑器（元件/连线/运行模式/多电源中压/相平衡）、多页分幅导出。
**交付（3）**：计算书 PDF、单线图 SVG/DXF、BOM/CSV/JSON 导入导出。
**选型库（1）**：231 个内置标准型号（7 大类）+ 批量品牌 CSV 导入筛选。

## 技术栈

- 原生 HTML/CSS/JavaScript（ES6，无构建步骤）
- 单页应用：`js/i18n.js`（12 语言）→ `js/data.js`（数据表）→ `js/calc.js`（计算引擎）→ `js/ui.js`（页面渲染）→ `js/main.js`（事件与状态）
- 多方案工程数据库（localStorage）：方案 CRUD + 实时联动 + A/B 对比 + 自动迁移
- 测试：jsdom 冒烟测试 + 数值 sanity 断言

## 测试

```bash
# 冒烟测试（23 页面 + 交互链路，需 node + jsdom）
node test/smoke.js

# 数值断言（引擎手算对照）
node test/sanity.js
```

## 文件结构

```
elec-calc/
├── index.html          # 入口（含 SEO meta）
├── css/style.css
├── js/  i18n.js data.js calc.js ui.js main.js
├── test/ sanity.js smoke.js
└── docs/ gap-analysis.html   # 能力差距矩阵
          usage.html          # 使用说明
```

## 免责声明

本工具基于教学模型与标准简化算法，**仅用于教学与初步设计**。正式工程必须遵循适用国家/地区标准，并依据制造商认证数据进行校核。

## 使用说明

详见 [`docs/usage.html`](docs/usage.html)。
