diff --git a/docs/backstage/IM-Manager发布冒烟测试记录-20260923.md b/docs/backstage/IM-Manager发布冒烟测试记录-20260923.md new file mode 100644 index 0000000..d230055 --- /dev/null +++ b/docs/backstage/IM-Manager发布冒烟测试记录-20260923.md @@ -0,0 +1,70 @@ +# IM Manager 发布冒烟测试记录 + +测试时间:2026-09-23 02:50 CST + +测试环境: + +- Manager:`https://admin.118im.com/admin` +- 登录账号:`potter` +- 角色:平台超管 `supreme_manager` +- 租户:`default`,`tenantId=1` + +## 通过接口 + +以下接口返回 `code=0`: + +| 模块 | 接口 | 数据量 | +| --- | --- | --- | +| 租户列表 | `GET /imTenant/list?page=1&pageSize=10` | 8 | +| 租户详情 | `GET /imTenant/view?id=1` | 有数据 | +| 租户用量 | `GET /imTenant/usage?id=1` | 有数据 | +| 企业注册申请 | `GET /imTenantApplication/list?page=1&pageSize=10` | 10 | +| 企业注册详情 | `GET /imTenantApplication/view?id=4` | 有数据 | +| 企业反馈 | `GET /imTenantEntryFeedback/list?page=1&pageSize=10` | 3 | +| 用户列表 | `GET /imUser/list?tenantId=1&page=1&pageSize=10` | 10 | +| 群组列表 | `GET /imGroup/list?tenantId=1&page=1&pageSize=10` | 0 | +| 实名认证 | `GET /imRealname/list?tenantId=1&page=1&pageSize=10` | 1 | +| 群消息 | `GET /imGroupMessage/list?tenantId=1&page=1&pageSize=10` | 0 | +| 登录历史 | `GET /imUserLoginHistory/list?tenantId=1&page=1&pageSize=10` | 10 | +| 工作台概览 | `GET /imDashboard/overview?tenantId=1` | 有数据 | +| 趋势图 | `GET /imDashboard/trends?tenantId=1` | 7 | +| 通知模板 | `GET /imNotification/templateList?tenantId=1&page=1&pageSize=10` | 7 | +| 文件列表 | `GET /imFile/list?tenantId=1&page=1&pageSize=10` | 10 | +| 审计日志 | `GET /imAuditLog/list?tenantId=1&page=1&pageSize=10` | 0 | +| 外部配置 | `GET /imExternalConfig/list?tenantId=1&page=1&pageSize=20` | 5 | +| 文件策略 | `GET /imFilePolicy/list?tenantId=1&page=1&pageSize=10` | 6 | +| App 版本 | `GET /imAppRelease/list?page=1&pageSize=10` | 3 | +| 安全策略 | `GET /imSecurityPolicy/list?tenantId=1&page=1&pageSize=10` | 1 | +| 用户策略分组 | `GET /imUserPolicyGroup/list?tenantId=1&page=1&pageSize=10` | 3 | +| 敏感词分组 | `GET /imSensitiveWord/groupList?tenantId=1&page=1&pageSize=10` | 6 | +| 敏感词 | `GET /imSensitiveWord/list?tenantId=1&page=1&pageSize=10` | 10 | +| 举报原因 | `GET /imAbuseReason/list?tenantId=1&page=1&pageSize=10` | 10 | +| 注册邀请码 | `POST /imInvite/list` | 10 | +| Kafka 审计 | `GET /imKafkaAudit/list?page=1&pageSize=10` | 10 | +| Kafka 命令 | `GET /imKafkaCommand/list?page=1&pageSize=10&tenantId=1` | 10 | +| 死信列表 | `GET /imDeadLetter/list?page=1&pageSize=10&tenantId=1` | 0 | + +## 发现问题 + +| 问题 | 现象 | 定位 | +| --- | --- | --- | +| 注册配置平台角色被业务层拦截 | `GET /imRegistration/config/get?tenantId=1` 返回 `仅平台超级管理员可操作IM注册配置` | `admin` 账号可访问,`potter/supreme_manager` 不可访问;Manager 代码只认内置 super ID,未复用 IM 平台管理员判断 | +| 注册配置隐藏权限 SQL 不完整 | 测试库已补权限后可过菜单鉴权,但生成 SQL 缺少 `/imRegistration/config/get`、`/imRegistration/config/update` | 已补生成 SQL | +| 组织架构查询不可用 | `/imOrg/departmentList`、`/imOrg/memberList` 返回 `resource not found` | 直连 IM Server `/internal/admin-query/tenants/default/org/departments` 也是 404,线上 IM Server 未暴露该 internal query 资源 | +| 私聊消息查询不可用 | `/imPrivateMessage/list` 返回 `resource not found` | 直连 IM Server `/internal/admin-query/tenants/default/private-messages` 也是 404;同环境 `group-messages` 正常 | +| 登录失败日志不可用 | `/imLoginFailureLog/list` 返回 `resource not found` | 直连 IM Server `/internal/admin-query/tenants/default/login-failure-logs` 也是 404;IM Server 当前代码测试里也标注该资源已移除 | +| 工作台管理接口不可用 | `/imWorkbench/list`、`/imFeedbackConfig/get`、`/imMailboxConfig/get` 返回 `internal error` | `admin` 与 `potter` 均失败,基本排除菜单权限;需检查线上 Manager `imWorkbenchApi` 配置和 `im_workbench` 服务运行时配置 | + +## 本次 Manager 修复 + +- 注册配置接口改为复用 `isImPlatformAdmin`,允许 `supreme_manager` 平台角色访问。 +- 邀请码菜单生成 SQL 补充注册配置的隐藏权限。 +- 本地发布配置已补 `imWorkbenchApi`,但 `server/manifest/config/config.yaml` 为 git 忽略文件,线上仍需确认实际 Secret/ConfigMap 是否包含工作台地址与密钥。 + +## 验证命令 + +```bash +go test ./internal/logic/sys ./internal/library/imworkbench +``` + +结果:通过。 diff --git a/server/internal/logic/sys/im_registration.go b/server/internal/logic/sys/im_registration.go index 5304c71..8da9e55 100644 --- a/server/internal/logic/sys/im_registration.go +++ b/server/internal/logic/sys/im_registration.go @@ -130,7 +130,7 @@ func (s *sSysImRegistration) seedConfig(ctx context.Context) (err error) { } func (s *sSysImRegistration) verifySuper(ctx context.Context) error { - if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId(ctx)) { + if !isImPlatformAdmin(ctx, contexts.GetUserId(ctx)) { return gerror.New("仅平台超级管理员可操作IM注册配置") } return nil diff --git a/server/storage/data/generate/im_registration_invite_menu.sql b/server/storage/data/generate/im_registration_invite_menu.sql index eb74f6a..37fb8f5 100644 --- a/server/storage/data/generate/im_registration_invite_menu.sql +++ b/server/storage/data/generate/im_registration_invite_menu.sql @@ -41,3 +41,11 @@ WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imInviteBatchRev INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) SELECT NULL, @invitePageId, '导出邀请码', 'imInviteExport', '', '', '3', '', '/imInvite/export', '', '', '1', '', '0', '0', '', '0', '1', '0', '3', CONCAT('tr_', @imRootId, ' tr_', @invitePageId, ' '), '60', '', '1', @now, @now WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imInviteExport'); + +INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) +SELECT NULL, @invitePageId, '查看注册配置', 'imRegistrationConfigGet', '', '', '3', '', '/imRegistration/config/get', '', '', '1', '', '0', '0', '', '0', '1', '0', '3', CONCAT('tr_', @imRootId, ' tr_', @invitePageId, ' '), '80', '', '1', @now, @now +WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imRegistrationConfigGet'); + +INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) +SELECT NULL, @invitePageId, '更新注册配置', 'imRegistrationConfigUpdate', '', '', '3', '', '/imRegistration/config/update', '', '', '1', '', '0', '0', '', '0', '1', '0', '3', CONCAT('tr_', @imRootId, ' tr_', @invitePageId, ' '), '90', '', '1', @now, @now +WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imRegistrationConfigUpdate');