Files
aomin a7605ef8b8 chore(repo): 导入 M-Z 业务底座 V1.9 基线并建立仓库规范
按周工交付的 SEC-Z-01 清理后源码建立 M-Z 主干,并按 Git 仓库惯例重排目录。

- aomin-gateway/  后端工程 87 文件,原样保留,路径与构建命令未变
- demo/           演示前端与设备模拟器 9 文件(原 02_前端与设备端),非正式三端
- docs/handover/  交付与安全清理材料 6 份,内容未改
- docs/contract/  J-00 规格、OpenAPI、内部五接口、状态机、Mock 样例
- docs/reference/ 指纹与校验清单,含 84 个源码文件的 sha256 清单

目录重排只动位置不动内容:源码树 84 文件哈希与交付一致,逐文件自校验通过;
12 条 Flyway 迁移与交付包内镜像逐字节一致。

未纳入:迁移镜像目录(与工程内一套重复,改留指纹)、target/、证据 raw、
应急恢复脚本、评审用虚构台账数据。

安全:SEC-Z-01 15 处明文已清零,导入前重新扫描无新增命中,本仓库无历史污染。
行尾按交付字节原样保存(.gitattributes 设 * -text),不做归一化以免整树摘要失效。
2026-11-13 17:32:37 +08:00

112 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 前端与设备端源码(演示用)
> **这不是主干三端。** 按 AM-S1-GOV-020 §6.2(3),正式三端的接入由陈工统一完成。
> 这份是 M-Z 配套的**演示前端 + 设备模拟器**,用途只有两个:跑通链路、看接口效果。
---
## 一、目录
```
web/
├── index.html 首页(三个入口 + 账号与地址)
├── common.js 公共库:token 命名空间、fetch 封装、toast
├── admin/index.html 运营后台(登录、设备、告警、住户、用户、台账…)
└── family/
├── index.html 家属端 H5(告警、探视、设置)
├── map-baidu.html 百度地图选点
├── map-offline.html 离线地图(无 AK 时自动降级到这里)
└── map-picker.html 天地图选点(含运行时占位符)
sim/
└── sim_device.py 设备模拟器:扮演网关 + 7 台设备,只调 I-01/I-02/I-12
```
| 文件 | 行数 | 说明 |
|---|---|---|
| `web/admin/index.html` | 1110 | 体量最大,六个业务页签 |
| `web/family/index.html` | 1763 | 家属端全部功能 |
| `sim/sim_device.py` | 578 | 纯 Python 标准库,无第三方依赖 |
---
## 二、怎么跑
### 方式一:跟着后端跑(推荐)
后端把 `/app/**` 映射到 `biz.web.dir` 指向的目录:
```bash
set DB_PASS=<口令>
set BIZ_DEMO_ENABLED=true
java -Dbiz.web.dir="<本目录>/web" -jar aomin-gateway/target/aomin-gateway-0.0.1-SNAPSHOT.jar ^
--server.port=8080
```
打开:
| 地址 | 页面 |
|---|---|
| `http://127.0.0.1:8080/app/index.html` | 首页 |
| `http://127.0.0.1:8080/app/family/index.html` | 家属端 |
| `http://127.0.0.1:8080/app/admin/index.html` | 运营后台 |
> 页面里写的接口地址是**相对路径**(`/api/v1/...`),所以必须经后端提供,不能双击 html 直接开——那样会 404。
### 方式二:设备模拟器
```bash
python sim/sim_device.py # 默认 9901 控制台,往 8080 发事件
python sim/sim_device.py --fast # 快节奏(每轮 3 秒)
python sim/sim_device.py --seed # 启动先补历史告警
python sim/sim_device.py --quiet # 只开控制台,不自动产生事件
```
可覆盖的环境变量:
| 变量 | 默认 | 说明 |
|---|---|---|
| `SIM_BASE` | `http://127.0.0.1:8080` | 目标 M 层地址 |
| `SIM_PORT` | `9901` | 模拟器控制台端口 |
---
## 三、运行时占位符(4 个,**不要改成具体值**)
| 占位符 | 出现位置 | 部署时替换成 | 不替换会怎样 |
|---|---|---|---|
| `__BAIDU_AK__` | `family/map-baidu.html`(2 处) | 自己的百度地图 AK;或启动前 `window.BAIDU_AK = 'xxx'` 注入 | 地图加载失败,**自动降级到离线地图**,不影响其他功能 |
| `__WB_HTTP_PORT__` | `family/map-picker.html` | 天地图服务端口 | 选点页不可用 |
| `__WB_TMAP_SECRET__` | `family/map-picker.html` | 天地图服务密钥 | 选点页不可用 |
| `__PORT__` | `sim_device.py` 内置控制台页面 | 由脚本自己按 `SIM_PORT` 替换,不用手改 | — |
> `map-picker.html` 第 10 行原本就写着「`__WB_HTTP_PORT__` / `__WB_TMAP_SECRET__` 是运行时占位符,禁止改成具体值、禁止内嵌任何 key」——按这条执行。
---
## 四、本次做了什么清理(2026-11-13)
| 改动 | 原因 |
|---|---|
| 删掉后台登录页「密码」输入框里的预填值 | 原来 `value` 里写死了演示口令,打开页面就明文可见 |
| 两处"演示账号 admin / 口令"的提示改为"口令按部署说明" | 页面里不再出现任何口令字面值 |
| 百度 AK 由真实值改为 `__BAIDU_AK__` 占位符 | 原 AK 是真实密钥,进 git 会永久留痕、可被盗刷配额 |
| 首页"flyway 1.0.18 / 83 表"改为"1.0.28 / 87 表" | 旧数字,与当前迁移不一致 |
**没动的**:家属端演示账号 `13800000000 / 123456` 的提示保留——那是 `BIZ_DEMO_ENABLED=true` 时库里真实播种的演示数据,不是系统凭据;只在不显示演示数据的环境才会失效。
---
## 五、边界
| 项 | 说明 |
|---|---|
| 不是正式三端 | 演示页,不做兼容性、无障碍、国际化;正式三端由陈工按 §6.2(3) 接入 |
| 接口是相对路径 | 必须由后端 `/app/**` 提供,不能独立部署到别的域名下直接调 |
| 地图依赖外部服务 | 百度/天地图都在公网;内网环境会走离线地图降级 |
| 权限只做前端遮挡 | 真正的数据权限在后端(A-Z-03 / AUTH-01),页面隐藏按钮不等于没权限 |
| 模拟器是"网关+设备" | 它只调 I-01/I-02/I-12,不碰任何业务接口,和真设备走同一条路径 |
---
*配套:后端源码与契约见 `周工_SEC-Z-01清理后_源码与说明_20261113.zip`。*