实现内嵌原生轻量 RTSP 管理页面 #3

Open
opened 2026-08-28 10:45:50 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:单元任务
  • 阶段:待实施
  • 原始需求来源:Codex 对话,2026-08-28(Asia/Shanghai)
  • 用户确认:DevHarness 工单 #1 与 Quant-UX 原型 V1 均已验收通过,建立生产实现工单。
  • 前置工单:#1、#2,均已验收关闭。
  • 是否允许并行:否;本工单是该页面的首个生产实现,应在同一工作树内顺序完成代码、测试、文档和验收证据。

目标

在 MediaMTX 中实现已确认的原生轻量 RTSP 管理页面,由 MediaMTX 自身托管,用于在受控局域网内增加、编辑、删除静态 RTSP 源,查看运行状态,并通过 WebRTC/HLS 预览。

已确认设计证据

  • 设计工单:#2
  • 在线原型:MediaMTX Stream Console · 原型 V1
  • Quant-UX App ID:6a90f1d7191a826306a7f403
  • 用户确认时间:2026-08-28(Asia/Shanghai)
  • 原型基线:9 个画布、176 个组件、29 条交互连线,Quant-UX consistency verification 为 PASS。
  • 确认范围:桌面列表、添加、编辑、WebRTC/HLS 预览、删除确认、空/加载、API 不可达、HTTP 403、离线状态和手机端卡片布局。
  • 若页面结构、主要流程、权限模型或异常处理发生关键变化,必须更新原型并重新确认后再继续。

实现范围

1. MediaMTX 内嵌与路由

  • 使用 Go embed 将管理页静态资源编入 MediaMTX 二进制。
  • 由现有 API HTTP 服务提供 /admin/ 入口和所需静态资源。
  • /admin 规范化跳转到 /admin/;入口、静态资源和 SPA 回退行为有测试。
  • 不新增独立端口、Nginx、Node 运行时、数据库或单独 Web 服务。
  • API 未启用时不额外启动管理页面服务,并在文档中明确前置配置。

2. 原生前端

  • 仅使用原生 HTML、CSS 和 JavaScript;不引入前端框架、打包器、外部 CDN、字体、图片库或图标库。
  • 桌面宽度采用紧凑表格,窄屏采用卡片布局,避免横向溢出。
  • 实现路径统计、搜索/筛选、手动刷新和明确的加载/空/失败状态。
  • 状态同时使用文字和视觉标记,不仅依赖颜色。
  • 输入具有可见标签、就地校验、键盘焦点和至少 44px 的主要触控目标。
  • 尊重 prefers-reduced-motion,不依赖动画完成关键反馈。

3. 路径配置与运行状态

使用当前已存在的 Control API:

  • GET /v3/config/paths/list
  • GET /v3/config/paths/get/{name}
  • POST /v3/config/paths/add/{name}
  • PATCH /v3/config/paths/patch/{name}
  • DELETE /v3/config/paths/delete/{name}
  • GET /v3/paths/list

首期只管理静态 RTSP source 所需字段:

  • 路径名称
  • RTSP source URL
  • RTSP transport
  • 按需拉流开关及与页面直接相关的最小字段

要求:

  • 新增、编辑和删除均提供请求中、成功和失败反馈,防止重复提交。
  • 删除前二次确认并显示路径名称及影响。
  • 列表中的 RTSP 用户名/密码必须脱敏;DOM、通知和应用日志不得回显完整凭据。
  • 编辑时不得因为页面使用遮盖值而覆盖已有密码;凭据更新语义必须有测试。
  • 路径名称进入 URL 前正确编码,并处理包含斜杠等现有 API 支持的名称。
  • 不把真实摄像头 URL、用户名、密码或 Token 写入源码、测试快照、日志、工单或文档。

4. 权限和安全

  • 管理页面及配置变更沿用 action: api 权限边界。
  • 未认证、无权限和 API 不可达状态分别显示明确说明和恢复入口。
  • 不自行实现第二套用户系统、会话存储或权限数据库。
  • 不在浏览器持久化 RTSP 密码;除非现有 API 认证机制要求,否则不使用 localStorage 保存敏感值。
  • 动态内容使用安全 DOM API 或统一转义,避免将路径名、URL 和错误文本直接注入 innerHTML。
  • 增加必要的安全响应头或记录现有服务器统一处理结果。

5. 预览与输出地址

  • 默认 WebRTC 预览,可切换到 HLS。
  • 媒体仍直接访问 MediaMTX WebRTC/HLS 服务(默认 :8889 / :8888),不通过管理页面转发视频。
  • 根据当前浏览器地址和配置生成同主机的播放入口,避免写死部署主机名。
  • 显示并允许复制 RTSP、WebRTC、HLS 输出地址。
  • 预览失败时给出协议、编码兼容或服务未启用的可恢复说明;WebRTC 失败可切换 HLS。

非目标

  • 不做录像检索、磁盘管理、告警、转码编辑器、多租户或完整 VMS。
  • 不复制 MediaMTX 全部全局配置为大型后台。
  • 不代理或转发媒体数据。
  • 不增加匿名配置修改能力。
  • 不保证浏览器解码所有摄像头编码。
  • 不复制 seekwhencer/mediamtx-ui 源码、样式或受版权保护资产;仅实现本项目已确认原型。
  • 不删除或恢复当前工作区已有的 .github 删除项。

建议代码边界

实现前先以代码图或源码确认最终边界,优先考虑:

  • internal/api/:API HTTP 路由、鉴权和管理页入口。
  • 新增独立、可测试的内嵌静态资源目录或包,避免把大段 HTML/JS 混入路由处理函数。
  • internal/api/*_test.go:路由、鉴权、CRUD 与静态资源测试。
  • 必要的配置示例和维护者文档;不污染或重写 MediaMTX 上游官网文档结构。

以上是建议而非预先锁死的文件列表;如架构发现更合适的现有扩展点,应在工单中说明。

验证

至少执行并记录:

  • 管理页静态资源、/admin 跳转、/admin/ 响应与鉴权测试。
  • 路径列表、添加、编辑、删除的 Go/API 集成测试。
  • 前端核心逻辑的可重复测试,或在不引入重型工具链的前提下提供等效验证。
  • 桌面与 375px 窄屏人工检查。
  • 键盘操作、焦点、标签、错误提示和 reduced-motion 检查。
  • 未认证、HTTP 403、API 不可达、空列表、加载、离线和预览失败场景。
  • RTSP 凭据脱敏和编辑不覆盖旧密码的专项测试。
  • go test ./internal/api ./internal/core 或实际受影响包。
  • go test ./...;如环境原因无法完成,记录具体失败与替代验证。
  • python dev_scripts/harness.py check --strict
  • python dev_scripts/harness.py sync --check
  • git diff --check
  • 浏览器不产生运行时错误,页面不请求第三方资源。

验收标准

  • MediaMTX API 服务可在 /admin/ 提供自包含管理页面。
  • 页面不依赖 Node、Nginx、数据库、外部 CDN 或独立进程。
  • 可新增、编辑、删除静态 RTSP 源,并显示运行状态。
  • WebRTC/HLS 可切换预览,输出地址可复制。
  • 桌面和窄屏行为符合已确认原型。
  • 空、加载、离线、API 不可达、未认证、403 和预览失败有明确反馈及恢复路径。
  • 权限沿用 action: api,没有匿名修改路径。
  • RTSP 凭据不会在列表、DOM、日志、测试或文档中泄露。
  • 关键自动化测试、Go 测试、Harness 检查和人工浏览器检查有证据。
  • Wiki 长期事实与本地镜像在实现稳定后更新。
  • 提交推送并回写最终证据,工单保持待用户验收。
  • 用户明确验收后才关闭工单。

风险与回退

  • 风险:扩大 API 暴露面或破坏现有鉴权;通过沿用 action: api 和集成测试控制。
  • 风险:遮盖凭据在编辑时被误保存;通过保留/替换语义和专项测试控制。
  • 风险:WebRTC/HLS 端口、TLS 或编码差异导致预览失败;通过动态地址、协议切换和可恢复提示控制。
  • 风险:内嵌资源增加维护负担;保持少量原生文件和零运行时依赖。
  • 回退:移除 /admin/ 路由和内嵌静态资源,恢复相关文档;不迁移数据、不删除现有路径配置。

文档影响

  • 实现稳定后更新 Product-Requirements-Overview、Architecture-and-Code-Map、Local-Development-and-Verification 和 Common-Changes 中与管理页相关的长期事实。
  • 通过 Harness 从 Gitea Wiki 单向同步 docs/maintainer/,不直接编辑生成镜像。
  • 是否需要修改上游用户文档应在实施时根据最终配置入口评估,不把定制文档混入官网文档。
## 基本信息 - 类型:单元任务 - 阶段:待实施 - 原始需求来源:Codex 对话,2026-08-28(Asia/Shanghai) - 用户确认:DevHarness 工单 #1 与 Quant-UX 原型 V1 均已验收通过,建立生产实现工单。 - 前置工单:#1、#2,均已验收关闭。 - 是否允许并行:否;本工单是该页面的首个生产实现,应在同一工作树内顺序完成代码、测试、文档和验收证据。 ## 目标 在 MediaMTX 中实现已确认的原生轻量 RTSP 管理页面,由 MediaMTX 自身托管,用于在受控局域网内增加、编辑、删除静态 RTSP 源,查看运行状态,并通过 WebRTC/HLS 预览。 ## 已确认设计证据 - 设计工单:[#2](https://git.ilapage.cn/OPC/mediamtx/issues/2) - 在线原型:[MediaMTX Stream Console · 原型 V1](https://qux.ilapage.cn/#/apps/6a90f1d7191a826306a7f403.html) - Quant-UX App ID:`6a90f1d7191a826306a7f403` - 用户确认时间:2026-08-28(Asia/Shanghai) - 原型基线:9 个画布、176 个组件、29 条交互连线,Quant-UX consistency verification 为 `PASS`。 - 确认范围:桌面列表、添加、编辑、WebRTC/HLS 预览、删除确认、空/加载、API 不可达、HTTP 403、离线状态和手机端卡片布局。 - 若页面结构、主要流程、权限模型或异常处理发生关键变化,必须更新原型并重新确认后再继续。 ## 实现范围 ### 1. MediaMTX 内嵌与路由 - 使用 Go `embed` 将管理页静态资源编入 MediaMTX 二进制。 - 由现有 API HTTP 服务提供 `/admin/` 入口和所需静态资源。 - `/admin` 规范化跳转到 `/admin/`;入口、静态资源和 SPA 回退行为有测试。 - 不新增独立端口、Nginx、Node 运行时、数据库或单独 Web 服务。 - API 未启用时不额外启动管理页面服务,并在文档中明确前置配置。 ### 2. 原生前端 - 仅使用原生 HTML、CSS 和 JavaScript;不引入前端框架、打包器、外部 CDN、字体、图片库或图标库。 - 桌面宽度采用紧凑表格,窄屏采用卡片布局,避免横向溢出。 - 实现路径统计、搜索/筛选、手动刷新和明确的加载/空/失败状态。 - 状态同时使用文字和视觉标记,不仅依赖颜色。 - 输入具有可见标签、就地校验、键盘焦点和至少 44px 的主要触控目标。 - 尊重 `prefers-reduced-motion`,不依赖动画完成关键反馈。 ### 3. 路径配置与运行状态 使用当前已存在的 Control API: - `GET /v3/config/paths/list` - `GET /v3/config/paths/get/{name}` - `POST /v3/config/paths/add/{name}` - `PATCH /v3/config/paths/patch/{name}` - `DELETE /v3/config/paths/delete/{name}` - `GET /v3/paths/list` 首期只管理静态 RTSP source 所需字段: - 路径名称 - RTSP source URL - RTSP transport - 按需拉流开关及与页面直接相关的最小字段 要求: - 新增、编辑和删除均提供请求中、成功和失败反馈,防止重复提交。 - 删除前二次确认并显示路径名称及影响。 - 列表中的 RTSP 用户名/密码必须脱敏;DOM、通知和应用日志不得回显完整凭据。 - 编辑时不得因为页面使用遮盖值而覆盖已有密码;凭据更新语义必须有测试。 - 路径名称进入 URL 前正确编码,并处理包含斜杠等现有 API 支持的名称。 - 不把真实摄像头 URL、用户名、密码或 Token 写入源码、测试快照、日志、工单或文档。 ### 4. 权限和安全 - 管理页面及配置变更沿用 `action: api` 权限边界。 - 未认证、无权限和 API 不可达状态分别显示明确说明和恢复入口。 - 不自行实现第二套用户系统、会话存储或权限数据库。 - 不在浏览器持久化 RTSP 密码;除非现有 API 认证机制要求,否则不使用 localStorage 保存敏感值。 - 动态内容使用安全 DOM API 或统一转义,避免将路径名、URL 和错误文本直接注入 `innerHTML`。 - 增加必要的安全响应头或记录现有服务器统一处理结果。 ### 5. 预览与输出地址 - 默认 WebRTC 预览,可切换到 HLS。 - 媒体仍直接访问 MediaMTX WebRTC/HLS 服务(默认 `:8889` / `:8888`),不通过管理页面转发视频。 - 根据当前浏览器地址和配置生成同主机的播放入口,避免写死部署主机名。 - 显示并允许复制 RTSP、WebRTC、HLS 输出地址。 - 预览失败时给出协议、编码兼容或服务未启用的可恢复说明;WebRTC 失败可切换 HLS。 ## 非目标 - 不做录像检索、磁盘管理、告警、转码编辑器、多租户或完整 VMS。 - 不复制 MediaMTX 全部全局配置为大型后台。 - 不代理或转发媒体数据。 - 不增加匿名配置修改能力。 - 不保证浏览器解码所有摄像头编码。 - 不复制 seekwhencer/mediamtx-ui 源码、样式或受版权保护资产;仅实现本项目已确认原型。 - 不删除或恢复当前工作区已有的 `.github` 删除项。 ## 建议代码边界 实现前先以代码图或源码确认最终边界,优先考虑: - `internal/api/`:API HTTP 路由、鉴权和管理页入口。 - 新增独立、可测试的内嵌静态资源目录或包,避免把大段 HTML/JS 混入路由处理函数。 - `internal/api/*_test.go`:路由、鉴权、CRUD 与静态资源测试。 - 必要的配置示例和维护者文档;不污染或重写 MediaMTX 上游官网文档结构。 以上是建议而非预先锁死的文件列表;如架构发现更合适的现有扩展点,应在工单中说明。 ## 验证 至少执行并记录: - 管理页静态资源、`/admin` 跳转、`/admin/` 响应与鉴权测试。 - 路径列表、添加、编辑、删除的 Go/API 集成测试。 - 前端核心逻辑的可重复测试,或在不引入重型工具链的前提下提供等效验证。 - 桌面与 375px 窄屏人工检查。 - 键盘操作、焦点、标签、错误提示和 reduced-motion 检查。 - 未认证、HTTP 403、API 不可达、空列表、加载、离线和预览失败场景。 - RTSP 凭据脱敏和编辑不覆盖旧密码的专项测试。 - `go test ./internal/api ./internal/core` 或实际受影响包。 - `go test ./...`;如环境原因无法完成,记录具体失败与替代验证。 - `python dev_scripts/harness.py check --strict` - `python dev_scripts/harness.py sync --check` - `git diff --check` - 浏览器不产生运行时错误,页面不请求第三方资源。 ## 验收标准 - [ ] MediaMTX API 服务可在 `/admin/` 提供自包含管理页面。 - [ ] 页面不依赖 Node、Nginx、数据库、外部 CDN 或独立进程。 - [ ] 可新增、编辑、删除静态 RTSP 源,并显示运行状态。 - [ ] WebRTC/HLS 可切换预览,输出地址可复制。 - [ ] 桌面和窄屏行为符合已确认原型。 - [ ] 空、加载、离线、API 不可达、未认证、403 和预览失败有明确反馈及恢复路径。 - [ ] 权限沿用 `action: api`,没有匿名修改路径。 - [ ] RTSP 凭据不会在列表、DOM、日志、测试或文档中泄露。 - [ ] 关键自动化测试、Go 测试、Harness 检查和人工浏览器检查有证据。 - [ ] Wiki 长期事实与本地镜像在实现稳定后更新。 - [ ] 提交推送并回写最终证据,工单保持待用户验收。 - [ ] 用户明确验收后才关闭工单。 ## 风险与回退 - 风险:扩大 API 暴露面或破坏现有鉴权;通过沿用 `action: api` 和集成测试控制。 - 风险:遮盖凭据在编辑时被误保存;通过保留/替换语义和专项测试控制。 - 风险:WebRTC/HLS 端口、TLS 或编码差异导致预览失败;通过动态地址、协议切换和可恢复提示控制。 - 风险:内嵌资源增加维护负担;保持少量原生文件和零运行时依赖。 - 回退:移除 `/admin/` 路由和内嵌静态资源,恢复相关文档;不迁移数据、不删除现有路径配置。 ## 文档影响 - 实现稳定后更新 Product-Requirements-Overview、Architecture-and-Code-Map、Local-Development-and-Verification 和 Common-Changes 中与管理页相关的长期事实。 - 通过 Harness 从 Gitea Wiki 单向同步 `docs/maintainer/`,不直接编辑生成镜像。 - 是否需要修改上游用户文档应在实施时根据最终配置入口评估,不把定制文档混入官网文档。
Author
Owner

建单与前置门禁记录

  • #1 DevHarness:用户已明确验收并关闭。
  • #2 Quant-UX V1:用户已明确验收并关闭。
  • Product-Requirements-Overview Wiki revision:69f6a337a250440c7c5043c8d75122d8e5bfd0a6
  • 本地只读镜像提交:a3ca54ca,已推送至 origin/main
  • python dev_scripts/harness.py check --strict:通过
  • git diff --check:通过
  • 现有 .github 未提交删除项保持不动。

当前阶段:待实施。本次只建立并登记生产工单,尚未修改 MediaMTX 产品代码。

## 建单与前置门禁记录 - #1 DevHarness:用户已明确验收并关闭。 - #2 Quant-UX V1:用户已明确验收并关闭。 - Product-Requirements-Overview Wiki revision:`69f6a337a250440c7c5043c8d75122d8e5bfd0a6` - 本地只读镜像提交:`a3ca54ca`,已推送至 `origin/main` - `python dev_scripts/harness.py check --strict`:通过 - `git diff --check`:通过 - 现有 `.github` 未提交删除项保持不动。 当前阶段:**待实施**。本次只建立并登记生产工单,尚未修改 MediaMTX 产品代码。
Author
Owner

实施开始

  • 开始时间:2026-08-28(Asia/Shanghai)
  • 基线提交:a3ca54ca
  • 设计基线:已验收 Quant-UX V1
  • 当前阶段:核对现有 API、鉴权、配置模型与测试扩展点后实施。
  • 代码发现:codebase-memory MCP 在当前会话不可用,按项目规则回退到 rg 和定点源码读取。
  • 工作区边界:保留现有 .github 未提交删除项,不读取或提交 ip_camera.env。
## 实施开始 - 开始时间:2026-08-28(Asia/Shanghai) - 基线提交:`a3ca54ca` - 设计基线:已验收 Quant-UX V1 - 当前阶段:核对现有 API、鉴权、配置模型与测试扩展点后实施。 - 代码发现:codebase-memory MCP 在当前会话不可用,按项目规则回退到 `rg` 和定点源码读取。 - 工作区边界:保留现有 `.github` 未提交删除项,不读取或提交 `ip_camera.env`。
Author
Owner

最终实施证据(待用户验收)

实现结果

  • MediaMTX API 服务新增 /admin → /admin/ 规范化入口。
  • /admin/、app.css、app.js 使用 Go embed 编入 MediaMTX 二进制。
  • 路由位于现有 API 鉴权中间件之后,继续使用 action: api。
  • 原生 HTML/CSS/JavaScript,无 Node 运行时、Nginx、数据库、前端框架、CDN、外部字体或第三方页面资源。
  • 支持静态 RTSP/RTSPS 源列表、搜索、状态筛选、统计、添加、编辑、删除确认。
  • 合并 /v3/config/paths/list 与 /v3/paths/list;按 available 和按需配置区分在线、离线、待请求。
  • 编辑时源地址留空不会发送 source 字段,可保留既有地址和凭据。
  • 原始 RTSP 地址只在请求处理瞬间存在;应用状态、列表、帮助文字、通知和 DOM 仅保留脱敏地址。
  • 默认 WebRTC 预览,可切换 HLS;RTSP/HLS/WebRTC 端口来自 /v3/config/global/get,部署主机来自当前浏览器地址。
  • 提供 RTSP、WebRTC、HLS 输出地址复制。
  • 加入 CSP、nosniff、no-referrer、SAMEORIGIN、缓存策略与未知资源 404。
  • 桌面使用紧凑表格,700px 以下切换卡片;可见标签、焦点环、live region、44px 操作目标和 reduced-motion 已实现。

代码

  • internal/api/api.go
  • internal/api/api_admin.go
  • internal/api/api_admin_test.go
  • internal/api/admin/index.html
  • internal/api/admin/app.css
  • internal/api/admin/app.js

提交:

  • 6465a11074673b027251e0b81a11dbe46bb2ed39 feat: add embedded RTSP admin console (#3)
  • 已推送并回读 origin/main,远端与本地提交一致。

自动验证

  • node --check internal/api/admin/app.js:通过。
  • go test ./internal/api -run '^TestAdmin' -count=1:通过。
  • go test ./... -run '^$':全部 Go 包编译通过。
  • go test -tags enable_linters ./internal/linters/docsorder:通过。
  • python dev_scripts/harness.py check --strict:通过。
  • python -m unittest discover -s tests -v:4/4 通过。
  • git diff --check:通过。
  • HLS 上游生成资源:下载 v1.7.1 release archive,SHA-256 863cc31280d388e6feb9e08d0b246b98b88dd6a16fd81d9ee15dd3e3b2ecc9eb 校验通过;生成物受忽略并已从工作树清理。

未运行完整 go test ./...:本机已有用户服务占用 127.0.0.1:9997,上游 API 集成测试固定使用该端口并发生 bind 冲突;没有停止或修改该进程。以管理页专项测试和全部包编译作为本次替代证据。

浏览器验证

使用仅含 192.0.2.x 保留地址和虚构凭据的隔离配置验证:

  • 1440×900:表格、统计、搜索筛选和操作布局正确。
  • 375×812:切换卡片布局,scrollWidth <= innerWidth,无横向溢出。
  • 手机端主要操作最小高度:44px。
  • 添加空表单:路径名与源地址就地报错并聚焦首个错误。
  • 新增 building/west:成功,列表只显示 rtsp://viewer:••••@192.0.2.30:554/live。
  • 编辑留空保存:源地址保持不变,传输方式成功更新为 TCP。
  • 自定义端口:RTSP 8556、WebRTC 8887、HLS 8886 均正确生成;WebRTC/HLS 页签切换正确。
  • 删除操作:显示路径名、影响、取消和危险确认按钮;未实际删除正式数据。
  • API 服务停止后:显示“API 连接失败”、原因和“重试”恢复入口。
  • DOM 未发现虚构明文密码;浏览器 console warning/error:0。
  • 未连接真实摄像头,未验证实际编码解码、NAT 或生产认证。

Wiki 与镜像

  • Product-Requirements-Overview:66aa5cb6e1b5d1558fd5fe6dafd6f38fe3a6f5ae
  • Architecture-and-Code-Map:a978bca7f5f9a686b33387bb8477c0adddf7a40c
  • Local-Development-and-Verification:5515588b36721b79890d6a12b89f3d3d6e7cc426
  • Common-Changes:713c7047d63271c8b345c163c3582d2caa20a2e2

四页均通过 Harness 同步到 docs/maintainer/ 并包含在实现提交中。

工作区边界

  • 原有 .github 未提交删除项保持不动,未进入提交。
  • ip_camera.env 未读取、未提交。
  • 临时二进制、测试配置、日志、下载压缩包和生成资源均已清理。

当前状态:实现完成,待用户验收。工单保持开启。

## 最终实施证据(待用户验收) ### 实现结果 - MediaMTX API 服务新增 `/admin` → `/admin/` 规范化入口。 - `/admin/`、`app.css`、`app.js` 使用 Go `embed` 编入 MediaMTX 二进制。 - 路由位于现有 API 鉴权中间件之后,继续使用 `action: api`。 - 原生 HTML/CSS/JavaScript,无 Node 运行时、Nginx、数据库、前端框架、CDN、外部字体或第三方页面资源。 - 支持静态 RTSP/RTSPS 源列表、搜索、状态筛选、统计、添加、编辑、删除确认。 - 合并 `/v3/config/paths/list` 与 `/v3/paths/list`;按 `available` 和按需配置区分在线、离线、待请求。 - 编辑时源地址留空不会发送 `source` 字段,可保留既有地址和凭据。 - 原始 RTSP 地址只在请求处理瞬间存在;应用状态、列表、帮助文字、通知和 DOM 仅保留脱敏地址。 - 默认 WebRTC 预览,可切换 HLS;RTSP/HLS/WebRTC 端口来自 `/v3/config/global/get`,部署主机来自当前浏览器地址。 - 提供 RTSP、WebRTC、HLS 输出地址复制。 - 加入 CSP、`nosniff`、no-referrer、SAMEORIGIN、缓存策略与未知资源 404。 - 桌面使用紧凑表格,700px 以下切换卡片;可见标签、焦点环、live region、44px 操作目标和 reduced-motion 已实现。 ### 代码 - `internal/api/api.go` - `internal/api/api_admin.go` - `internal/api/api_admin_test.go` - `internal/api/admin/index.html` - `internal/api/admin/app.css` - `internal/api/admin/app.js` 提交: - `6465a11074673b027251e0b81a11dbe46bb2ed39 feat: add embedded RTSP admin console (#3)` - 已推送并回读 `origin/main`,远端与本地提交一致。 ### 自动验证 - `node --check internal/api/admin/app.js`:通过。 - `go test ./internal/api -run '^TestAdmin' -count=1`:通过。 - `go test ./... -run '^$'`:全部 Go 包编译通过。 - `go test -tags enable_linters ./internal/linters/docsorder`:通过。 - `python dev_scripts/harness.py check --strict`:通过。 - `python -m unittest discover -s tests -v`:4/4 通过。 - `git diff --check`:通过。 - HLS 上游生成资源:下载 `v1.7.1` release archive,SHA-256 `863cc31280d388e6feb9e08d0b246b98b88dd6a16fd81d9ee15dd3e3b2ecc9eb` 校验通过;生成物受忽略并已从工作树清理。 未运行完整 `go test ./...`:本机已有用户服务占用 `127.0.0.1:9997`,上游 API 集成测试固定使用该端口并发生 bind 冲突;没有停止或修改该进程。以管理页专项测试和全部包编译作为本次替代证据。 ### 浏览器验证 使用仅含 `192.0.2.x` 保留地址和虚构凭据的隔离配置验证: - 1440×900:表格、统计、搜索筛选和操作布局正确。 - 375×812:切换卡片布局,`scrollWidth <= innerWidth`,无横向溢出。 - 手机端主要操作最小高度:44px。 - 添加空表单:路径名与源地址就地报错并聚焦首个错误。 - 新增 `building/west`:成功,列表只显示 `rtsp://viewer:••••@192.0.2.30:554/live`。 - 编辑留空保存:源地址保持不变,传输方式成功更新为 TCP。 - 自定义端口:RTSP 8556、WebRTC 8887、HLS 8886 均正确生成;WebRTC/HLS 页签切换正确。 - 删除操作:显示路径名、影响、取消和危险确认按钮;未实际删除正式数据。 - API 服务停止后:显示“API 连接失败”、原因和“重试”恢复入口。 - DOM 未发现虚构明文密码;浏览器 console warning/error:0。 - 未连接真实摄像头,未验证实际编码解码、NAT 或生产认证。 ### Wiki 与镜像 - Product-Requirements-Overview:`66aa5cb6e1b5d1558fd5fe6dafd6f38fe3a6f5ae` - Architecture-and-Code-Map:`a978bca7f5f9a686b33387bb8477c0adddf7a40c` - Local-Development-and-Verification:`5515588b36721b79890d6a12b89f3d3d6e7cc426` - Common-Changes:`713c7047d63271c8b345c163c3582d2caa20a2e2` 四页均通过 Harness 同步到 `docs/maintainer/` 并包含在实现提交中。 ### 工作区边界 - 原有 `.github` 未提交删除项保持不动,未进入提交。 - `ip_camera.env` 未读取、未提交。 - 临时二进制、测试配置、日志、下载压缩包和生成资源均已清理。 当前状态:**实现完成,待用户验收**。工单保持开启。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/mediamtx#3