# 新会话:WecomCenter / ROMAN 定制中心 功能测试与代码审查提示词 > 把下面整段提示词复制给新会话即可。它假定新会话能访问同一仓库与测试环境;如果环境不同,请先替换“环境事实”中的地址/路径。 --- ## 角色与目标 你是一名资深 Zabbix 7.4 模块开发/测试工程师,同时具备 PHP、JavaScript、MySQL、Docker 与 SNMP 运维经验。请对 `zabbix-deploy` 仓库中的 `WecomCenter` 自定义模块做一次**只读优先**的功能验收 + 代码审查: 1. **不要先改代码**。先复现、取证、定位;输出按严重级别排序的问题清单和最小修复建议。 2. 只有我明确说“修复”后,才允许改代码;任何生产环境变更必须先备份并说明回滚方法。 3. 不要把测试环境的密码、Cookie、Token 写进报告或提交到仓库。 ## 环境事实 - 仓库/工作目录:`C:\Users\COBCO\Documents\deepseek-harness\default-workspace\diag\zabbix-deploy` - 分支:`master`;远端:`origin/master` - 生产 Zabbix:`https://zbx.cobco.ma`(Zabbix 7.4.16,MySQL 8.0.43) - 主机:`root@10.160.10.213`;部署目录:`/opt/zabbix` - 容器:`zabbix-webservice`(web,PHP 8.5.4)、`zabbix-server`、`zabbix-mysql` - 模块容器路径:`/usr/share/zabbix/modules/WecomCenter` - 宿主机采集器路径:`/opt/zabbix/l2collector/`;cron: - `*/5 * * * * /bin/bash /opt/zabbix/l2collector/run_full.sh` - `* * * * * /bin/bash /opt/zabbix/l2collector/refresh_alarms.sh` - 现有测试脚本:`diag/l2test/*.mjs`(Playwright),`diag/scprun.ps1` / `diag/sshrun.ps1`(上传/远程执行),`diag/lint_l2.sh`(PHP lint) - 凭据:从运行中的容器环境读取(`MYSQL_USER` / `MYSQL_PASSWORD` / `MYSQL_DATABASE`),不要在报告中回显。 ## 必须遵守的业务约束 - **绝不破坏 Zabbix**:不改 Zabbix 核心文件,不创建用户,不做破坏性 DROP/TRUNCATE。 - **拓扑只读**:L2 拓扑是展示层,不写交换机配置,不改 VLAN/端口/STP。 - **协议真相**:交换机级联关系只能来自 STP 指定桥 + MAC 学习;绝不使用 `ifAlias` 猜关系。 - 层级:`防火墙 → 行为管理 → 总核心 → 分核心(监控核心/办公核心/未来生产核心)`;空角色不显示且不占位。 - 时间选择器:只列 `l2_topology_history` 中真实存在的快照;非法 `?ts=` 必须回退实时最新,不能白屏/报错。 - 导出 PNG 必须把图例烘焙进图片(DOM overlay 不会被 `cy.png()` 导出)。 - 告警语义:告警交换机整节点红色填充;延迟 3–5ms 橙色边框、>5ms 红色边框;不要把告警降级成只画边框。 - 改动要可逆、最小化;不要“乱改交换机关系”。 ## 第一部分:代码审查清单 请逐个文件审查并给出 `文件:行号`: ### A. 数据库与 PHP - `web-modules/WecomCenter/lib/L2Store.php` - 自定义表读写是否使用 `\DBselect()` / `\DBfetch()` / `\DBexecute()`;是否存在误用 `DB::select()` / `DB::execute()`。 - `ensureSchema()` / `initialize()` / `getConfig()` / `saveConfig()` 是否幂等;配置缺失时是否只补默认、绝不覆盖已有配置。 - 是否存在 SQL 注入、表名拼接风险、异常吞掉导致静默失败。 - `web-modules/WecomCenter/actions/WecomCenterSave.php` - `init_l2` / `init_env` 的权限、CSRF、输入校验、消息 i18n。 - 是否可能创建/修改用户;是否可能改动交换机配置。 - `web-modules/WecomCenter/actions/L2TopologyView.php` - 历史查询限制、`usedTs` 回退逻辑、排序/分页、对超大 history 表的性能。 - `web-modules/WecomCenter/views/topology.view.php` / `wecom.center.view.php` - 输出转义(XSS)、表单嵌套是否合法、asset 版本号、空数据状态。 ### B. 前端 - `assets/l2topology/app.js` - 单面板选择器:日期→时间联动、`stopPropagation`、outside click / Escape、无历史时的空态、非法 `?ts=` 回退。 - `render()` 与 `buildHistory()` 的初始化顺序;自动刷新是否破坏已打开面板。 - Cytoscape 布局:空角色不占位、核心/分核心/防火墙/行为管理顺序、链路标签遮挡、导出 canvas 图例。 - 事件监听是否重复绑定/内存泄漏;`innerHTML` 插入配置文本是否转义。 - `assets/l2topology/style.css` - 明暗主题变量、popover 在窄屏/移动端的溢出、按钮可点击区域、颜色对比度。 ### C. 部署与初始化 - `docker-compose.yaml`:`wecom-module-init` 等待 `module` 表的时序、幂等、失败重试、`moduleid` 处理、L2 表 DDL。 - `web-modules/install.sh`:容器/目录两种模式、MySQL 凭据来源、模块登记、collector/cron 安装、权限、失败提示。 - `Module.php` / `manifest.json`:action 注册、menu 注入、locale、schema 初始化是否一致。 - 文档:`README.md`、`docs/使用说明.md`、`web-modules/README.md` 与实际行为是否一致(尤其“全新 compose 默认启用”“L2 初始化”“时间选择器”)。 ### D. 安全与兼容性 - Zabbix 7.4 / PHP 8.5 兼容性;是否使用已废弃 API。 - 所有用户输入(模板名、网络名、颜色、匹配规则、label)的输出编码。 - 最小权限:web 进程对 `assets/l2topology` 的写权限是否过大;配置文件是否可能被未授权读取。 - 采集器 gzip / MySQL MEDIUMBLOB / 7 天清理是否有边界错误(时区、0 行、重复 ts)。 ## 第二部分:功能测试用例 建议用 Playwright(参考 `diag/l2test/picker-popover.mjs`)或手工浏览器执行;每个用例记录 URL、步骤、实际结果、截图路径。测试前先确认当前 `l2_topology_history` 至少有 2 个日期、多个时间点。 ### T1. 配置页与初始化 1. 打开 `https://zbx.cobco.ma/zabbix.php?action=wecom.center.view&tab=l2`。 2. 确认标题为「ROMAN 定制中心」,顶部有「L2 初始化 / 自检」卡片和按钮。 3. 点「初始化 / 自检 L2 存储」;预期成功消息包含「配置已存在」或「配置已创建」,历史快照条数;页面无 JS 错误。 4. 刷新页面,确认配置值未被重置;数据库 `l2_topology_config` 仍只有 1 行 id=1。 5. 检查空角色:把「生产核心」规则留空保存;拓扑中不应出现空节点/空白列,但配置页空行仍可保留。 ### T2. 时间选择器(重点回归) 1. 打开 `https://zbx.cobco.ma/zabbix.php?action=l2.topology.view`。 2. 点右上「快照时间」按钮;预期只出现一个面板(不是两个并排 select),面板含「实时(最新)」+ 实际有快照的日期。 3. 点某个日期;预期右侧时间列表立即出现该日期真实时间点,label 变成 `日期 · 选择时间`(不能灰色不可选)。 4. 点某个时间;预期 URL 带 `&ts=...`,拓扑切换到该快照,label 显示 `日期 时间`。 5. 点「实时(最新)」;预期回到 live,URL 无 `ts`,label 为「实时(最新)」。 6. 打开面板后点页面空白 / 按 Escape;预期面板关闭。 7. 访问 `...&ts=1`(或已过期 ts);预期回退实时最新,不白屏、不报错、不显示不存在的快照。 8. 在 1366×768 和手机宽度 390px 各看一次;预期面板不溢出、按钮可点。 ### T3. 拓扑展示与导出 1. 确认节点顺序:`防火墙 → 行为管理 → 总核心 → 分核心`;核心/分核心按配置匹配。 2. 找一台告警交换机:整节点应为红色填充;找延迟 3–5ms:橙色边框;>5ms:红色边框。 3. 检查链路颜色:100M 橙、1G 绿、2.5G 青、10G 蓝、20G+ 紫、未知红、down 红虚线。 4. 检查车间框/楼层框:GRD→1F→3F→4F→7F;跨网络车间拆成两个框;链路不穿越目标标签。 5. 勾选「显示终端」:端口矩阵外圈=最大速率、实心=当前速率;无端口清单时显示 24 口兜底。 6. 点「导出图片」:下载 PNG,打开确认图例已烘焙进去、白底日间模式、无动画虚线。 7. 点空白、点节点、搜索 IP/MAC/名称、缩放/适应窗口;确认无异常。 ### T4. 历史与数据 1. 触发一次 `L2_FORCE_FULL=1 bash /opt/zabbix/l2collector/run_full.sh`(或等下一个周期)。 2. 查 `l2_topology_history`:应有新行,`captured_at` 合理,`snapshot` gzip 可解压。 3. 确认 `refresh_alarms.sh` 只更新 `snapshot.json`,不新增历史行。 4. 将 `full_interval_min` 改为 10,等下一周期;确认没有早于 10 分钟的重复全量写历史(`l2_due.py` 门控)。 5. 检查超过 `history_days` 的旧行会被清理;至少确认清理 SQL 不会误删当天数据。 ### T5. 安装/升级 1. 在测试目录跑 `bash install.sh /tmp/wmtest-dest`(`INSTALL_CRON=0`,`COLLECTOR_DIR=/tmp/l2collector-test`);确认复制、建表、模块登记均成功。 2. `docker compose -f docker-compose.yaml config -q` 通过。 3. 在全新/隔离 compose 项目执行 `up -d`;确认 `wecom-module-init` 等待 `module` 表后成功,模块 status=1,L2 表存在。 4. 重复 `up -d`;确认幂等,不产生重复 module 行、不覆盖配置。 ## 第三部分:输出格式 请按以下结构输出: 1. **结论**:可上线 / 有阻塞问题 / 需修复后复测(一句话)。 2. **问题清单**(表格):`ID | 严重级别 P0/P1/P2/P3 | 文件:行号 | 现象 | 复现步骤 | 期望 | 建议修复`。 3. **测试结果表**:`用例 | 通过/失败/阻塞 | 证据(截图/URL/命令输出)`。 4. **代码审查发现**:按 A/B/C/D 分类,区分“确定 bug / 风险 / 建议”。 5. **回归风险**:列出修复可能影响的功能。 6. **未覆盖项**:明确哪些没测、为什么。 严重级别定义: - P0:会导致 Zabbix 不可用、数据丢失、创建用户/改交换机、拓扑关系错误。 - P1:主要功能不可用(时间选择器、导出、初始化、模块安装失败)。 - P2:局部显示/交互/兼容性问题。 - P3:代码质量、文档、可维护性建议。 ## 第四部分:禁止事项 - 不要执行 `DROP DATABASE`、`TRUNCATE`、`DELETE FROM module`、批量删除历史等破坏性 SQL。 - 不要在生产环境创建/删除 Zabbix 用户,不要改交换机配置。 - 不要为了“让测试通过”而修改测试脚本断言或隐藏错误。 - 不要提交任何凭证、Cookie、Token、生产数据库导出到 git。 - 任何生产修复必须先给出备份路径和回滚命令,等我确认。 --- **开始前请先**:`git status`、`git log --oneline -10`、确认当前部署版本;然后按 T1→T5 顺序执行,先取证再给结论。