# WeCom Center — 可移植 Zabbix 前端模块 一个自包含、多语言的 Zabbix 7.4 前端模块(custom module / plugin)。加载后会在 **Administration → WeCom Center** 增加一个定制页面,集中处理: - **告警优化(核心)**:以勾选方式一键切换“是否告警”与通知严重度;内置 5 套告警方案(标准 / 警告以上 / 全部 / 仅灾难 / 关闭),点一下立即生效。 - **机器人与账号**:在同一页编辑企业微信 Webhook 地址 / 机器人 key、机器人账号、接收目标,并可“发送测试”验证(直接调用企微接口,返回 errcode)。 - **模板导入**:把放在 `templates/` 目录里的模板文件(yaml/xml/json)一键导入 Zabbix。 - **地图坐标**:批量/单个设置主机的 `location_lat` / `location_lon`(主机资产清单)。 所有改动都通过 **Zabbix 官方 API** 写入数据库,因此:换机器、重建容器、升级镜像后设置都在;只要“加载插件”即可复用。 ## 目录结构 ``` WecomCenter/ ├── manifest.json # 模块清单(v2.0),注册 2 个 action ├── Module.php # 模块入口:注册视图目录、初始化 i18n、注入左侧菜单 ├── actions/ │ ├── WecomCenterView.php # GET 控制器,渲染页面 │ └── WecomCenterSave.php # POST 控制器,分发一键方案/保存/测试/导入/地图 ├── views/ │ └── wecom.center.view.php # 页面模板(Zabbix 原生 UI 组件) ├── lib/ │ ├── I18n.php # 极简多语言层(按当前语言加载,缺省回退英文) │ └── Helper.php # 业务逻辑:媒介/账号/key、方案预设、导入、坐标、测试 ├── locale/ # 35 个语言文件(见“多语言”) ├── templates/demo.yaml # 示例模板(演示一键导入) └── assets/wecom.center.css ``` ## 安装(可移植方式) 1. **持久化模块目录**:在 `docker-compose.yaml` 的 web 服务下挂载宿主目录: ```yaml zabbix-web-nginx-mysql: volumes: - /opt/zabbix/zabbix-server/web-modules:/usr/share/zabbix/modules ``` 2. 把本 `WecomCenter/` 目录整体放到宿主 `/opt/zabbix/zabbix-server/web-modules/WecomCenter/`,然后 `docker compose up -d` 重建一次 web 容器使挂载生效(数据不动,仅 web 短暂重启)。 3. **启用模块**(写入 `module` 表,status=1 为启用): ```sql INSERT INTO module(moduleid,id,relative_path,status,config) SELECT 1001,'wecom_center','modules/WecomCenter',1,'[]' WHERE NOT EXISTS (SELECT 1 FROM module WHERE id='wecom_center'); ``` (也可在 Administration → General → Modules 里点“启用”。) 4. 刷新网页,左侧 **Administration → WeCom Center** 即可进入。 > 换环境:重复 1–3 即可。模块代码放在 git 里,`web-modules/` 随仓库走;MySQL 卷里保存着 `module` 启用记录,二者都在 → 插件始终在线。 ## 多语言 - 共 **35 个语言文件**,覆盖 Zabbix 全部 36 个 locale(`en_GB`/`en_US` 共用英文)。 - **已人工翻译**:`zh_CN`、`zh_TW`、`ja_JP`、`ko_KR`、`ru_RU`、`de_DE`、`fr_FR`、`es_ES`、`pt_BR`、`it_IT`、`pl_PL`、`tr_TR`。 - 其余语言文件存在但暂未翻译,运行时自动回退英文(页面照常工作,不会报错)。 - 增加/完善语言:复制 `locale/en.php` 为 `locale/.php` 并翻译 value 即可,键名保持不变。模块会读取当前用户语言(`CWebUser::$data['lang']`)自动切换。 ## 设计要点(适配 Zabbix 7.4) - `manifest.json` 用 `manifest_version: 2.0`;action 的控制器类位于 `actions/`(自动加载器会把子命名空间段转小写)。 - 视图目录必须在 `Module::init()` 里 `CView::registerDirectory($this->getRelativePath().'/views')`。 - 菜单注入:`APP::Component()->get('menu.main')->findOrAdd(_('Administration'))->getSubmenu()->add(...)`。 - 关键 API 注意:`mediatype.get` **不支持 `sortfield=name`**(会整体返回 false);`configuration.import` 的规则键是复数 `templates`(不是 `template`)。 - 告警“开关”落在用户媒介的 `active` 字段:**0=启用、1=停用**;严重度为位掩码(未分类=1…灾难=32)。 ## 告警媒介说明 页面基于“Webhook 类型(type=4)的媒介 + 一个机器人账号(默认用户名 `wecomrobot`)的媒介记录”工作: - 一键方案 / 勾选保存 → 修改该账号对应媒介的 `severity` / `active`。 - 保存 key → 修改该 Webhook 媒介的 `webhook_url` 参数(保留其它参数)。 - 发送测试 → 直接 POST 到该 `webhook_url`,检查返回 `errcode:0`。 若环境中没有 Webhook 媒介类型,页面会提示“未找到 webhook 媒介类型”。