391 lines
23 KiB
Markdown
391 lines
23 KiB
Markdown
# IM Server 改造文档:支撑鸽达达管理后台复刻
|
||
|
||
本文面向 `/Users/youshunlai/go_workspace/im_server` 的现状改造,目标是为 Admin Server 复刻鸽达达后台提供准确、稳定、可审计的数据与治理能力。当前 IM Server 已有 Tinode 风格实时链路、产品 HTTP API、独立租户库、Kafka 命令消费、配置事件消费、内部 Admin Query,但鸽达达 20 个后台页面仍需要补充若干查询资源、审计日志、风控策略与消息处置能力。
|
||
|
||
## 1. 当前实现现状
|
||
|
||
核心架构:
|
||
|
||
| 能力 | 现状 |
|
||
| --- | --- |
|
||
| 实时链路 | `Session -> Hub -> Topic -> Store`。 |
|
||
| 客户端入口 | WebSocket `/v0/channels`,产品 HTTP `/v1/im/...`。 |
|
||
| 后台只读入口 | `/internal/admin-query/tenants/{tenant_code}/...`,要求内部签名与 capability。 |
|
||
| 后台写操作 | Kafka Admin Command 消费器 `startKafkaAdminCommandConsumer`。 |
|
||
| 配置同步 | Kafka config event、cache invalidate consumer 已存在。 |
|
||
| 消息转发 | `/v1/im/messages/forward` 已存在。 |
|
||
| 音视频入会 | `/v1/im/calls/rtc-join` 已存在。 |
|
||
|
||
本地 `tinode` 库观察:`im_users` 有数据、`im_topics` 有群/会话、`im_subscriptions` 有订阅、`im_messages` 有大量单聊或通用消息、`im_group_messages` 有群消息、`im_feedback_submissions`、`im_abuse_reports`、`im_kafka_dead_letters` 等表已存在;`im_audit_logs` 本地为空,`im_devices` 和 `im_group_files` 数据不足,不能直接满足后台登录历史、设备历史和群文件验收。
|
||
|
||
已有内部查询资源:
|
||
|
||
| 资源 | 已支持字段/场景 |
|
||
| --- | --- |
|
||
| `users` | 用户 ID、账号、手机号、状态、资料、凭证摘要、最后在线。 |
|
||
| `user_devices` | 用户设备列表。 |
|
||
| `groups` | Topic、群名、群主、群状态、治理开关、成员数。 |
|
||
| `groups/{topic}/members` | 群成员。 |
|
||
| `group_join-requests`、`group_invitations`、`group_announcements`、`group_mutes`、`group_admin-logs`、`group_files` | 群治理专题资源。 |
|
||
| `messages/{topic}/{seq}` | 单条消息详情。 |
|
||
| `files`、`files/{id}`、`files/{id}/links` | 文件列表、详情、链接关系。 |
|
||
| `feedback-submissions`、`abuse-reports`、`realname-verifications`、`audit-logs` | 用户反馈、举报、实名、审计。 |
|
||
| `dashboard/summary` | 当前只返回待办类指标,不足以覆盖鸽达达首页统计。 |
|
||
|
||
已有 Kafka Admin Command:
|
||
|
||
| 命令 | 用途 |
|
||
| --- | --- |
|
||
| `user.ban`、`user.unban` | 用户封禁/解封。 |
|
||
| `user.freeze`、`user.unfreeze` | 用户冻结/解冻。 |
|
||
| `user.device.kick`、`user.logout_all` | 设备踢下线、全端登出。 |
|
||
| `user.account.cancel`、`user.account.delete`、`user.password.reset` | 注销、删除、重置密码。 |
|
||
| `group.profile.update` | 群资料更新。 |
|
||
| `group.governance.update` | 群治理开关更新。 |
|
||
| `group.admin.set`、`group.admin.remove`、`group.owner.transfer` | 群角色管理。 |
|
||
| `group.member.mute`、`group.member.unmute`、`group.member.remove` | 群成员治理。 |
|
||
| `kafka.dead_letter.replay`、`ignore`、`resolve` | 死信处理。 |
|
||
|
||
## 2. 改造原则
|
||
|
||
IM Server 只负责租户业务库的数据查询、业务状态变更、实时生效与审计事件产生,不直接依赖 HotGo 后台表。Admin Server 下发的配置、策略和治理命令必须具备幂等性,并通过事件结果回传 Admin。所有 internal query 必须保持只读、分页、最大 `per_page=200`、内部签名鉴权、字段脱敏。
|
||
|
||
响应协议继续沿用现有 `imHTTPResponse`:`code`、`data`、`reason`、`message`、`details`、`request_id`、`server_time`。写请求继续要求 `Idempotency-Key`,避免后台重复点击导致重复处置。
|
||
|
||
## 3. 支撑 20 个后台页面的 IM 改造
|
||
|
||
### 3.1 数据概览
|
||
|
||
现有 `dashboard/summary` 只覆盖死信、待处理 outbox、待实名、待举报、待反馈、活跃群、封禁用户等运营待办。需要新增统计字段以匹配鸽达达首页。
|
||
|
||
新增 internal query:
|
||
|
||
| 路径 | 方法 | 说明 |
|
||
| --- | --- | --- |
|
||
| `/internal/admin-query/tenants/{tenant}/dashboard/overview` | GET | 返回总用户、活跃用户、总群组、总会话、总消息、今日消息。 |
|
||
| `/internal/admin-query/tenants/{tenant}/dashboard/trends` | GET | 返回最近 N 天用户增长与消息增长。 |
|
||
|
||
字段口径:
|
||
|
||
| 字段 | 计算建议 |
|
||
| --- | --- |
|
||
| `total_users` | `im_users` 有效用户数。 |
|
||
| `active_users` | `last_seen` 在指定窗口内或当天有消息/登录行为的用户数。 |
|
||
| `total_groups` | `im_group_settings.group_status='active'` 或有效群 topic 数。 |
|
||
| `total_conversations` | 有效 P2P topic + group topic 数。 |
|
||
| `total_messages` | `im_messages` + `im_group_messages`,按最终存储口径去重。 |
|
||
| `today_messages` | 当天创建的消息数,按租户时区对齐。 |
|
||
| `date`、`user_count`、`message_count` | 趋势表行字段。 |
|
||
|
||
### 3.2 用户管理
|
||
|
||
现有 `users`、`users/{id}`、`users/{id}/devices` 基本可支撑。需要补足鸽达达页面要求的筛选和字段脱敏。
|
||
|
||
改造点:
|
||
|
||
| 项 | 内容 |
|
||
| --- | --- |
|
||
| 查询筛选 | 增加 `phone`、`public_account`、`state`、`created_at_start/end`、`last_seen_start/end`。 |
|
||
| 字段补充 | 返回 `nickname`、头像文件 ID、性别、地区、签名、认证方式摘要、设备数、最近登录 IP。 |
|
||
| 状态映射 | 将 Tinode `state` 转换为 Admin 字典所需状态;保留原始值 `raw_state` 便于排错。 |
|
||
| 治理命令 | 继续使用已有 `user.ban/unban/freeze/unfreeze/device.kick/logout_all/account.cancel/account.delete/password.reset`。 |
|
||
| 审计 | 每次状态变更、重置密码、踢设备必须写 `im_audit_logs` 并产出 Kafka command result。 |
|
||
|
||
枚举建议:`user_state` 包含正常、封禁、冻结、注销、删除;`device_platform` 包含 `ios`、`android`、`web`、`desktop`、`unknown`。
|
||
|
||
### 3.3 用户分组
|
||
|
||
当前 IM Server 没有看到独立的后台用户策略分组执行层。Admin 将新增策略分组后,IM Server 需要消费配置事件并在运行时执行。
|
||
|
||
新增能力:
|
||
|
||
| 能力 | 说明 |
|
||
| --- | --- |
|
||
| 策略缓存 | 按租户缓存 `policy_group`、成员关系、优先级与规则。 |
|
||
| 匹配入口 | 登录、注册、加好友、建群、入群、发消息、上传文件、发起音视频前匹配策略。 |
|
||
| 配置事件 | 消费 `user_policy_group.updated`、`user_policy_group.deleted`,刷新缓存。 |
|
||
| 命中审计 | 命中 `deny`、`challenge` 或高风险规则时写审计与风控日志。 |
|
||
|
||
策略动作枚举:`allow` 放行、`deny` 拦截、`challenge` 二次验证、`audit_only` 仅记录。
|
||
|
||
好友策略需要在后端覆盖所有移动端入口。禁止加好友时,IM Server 不能只让客户端隐藏按钮,而要在搜索用户、查看个人名片、群成员资料、二维码解析、好友申请、邀请注册自动加好友、推荐联系人等入口统一拦截或返回脱敏数据。策略字段建议包含 `allow_add_friend`、`direct_add_friend`、`max_friend_count`、`allow_qrcode_add_friend`、`allow_group_member_profile`、`hide_profile_when_friend_disabled`。
|
||
|
||
### 3.4 群组管理
|
||
|
||
已有 `groups` 查询与群治理命令可复用。需要补鸽达达群状态语义和可能的群封停动作。
|
||
|
||
改造点:
|
||
|
||
| 项 | 内容 |
|
||
| --- | --- |
|
||
| 字段 | 确保 `topic`、`group_name`、`owner_id`、`group_status`、`business_member_count`、`join_approval`、`mute_all`、`created_at` 可稳定返回。 |
|
||
| 状态 | 明确 `group_status` 值:`active`、`muted`、`suspended`、`dissolved`。 |
|
||
| 命令 | 已有资料更新、治理设置、角色与成员治理;若需求要求群封停/解封,新增 `group.suspend`、`group.unsuspend`。 |
|
||
| 审计 | 群资料、治理开关、解散、禁言、成员操作均写 `im_group_admin_logs` 与 `im_audit_logs`。 |
|
||
|
||
### 3.5 群成员管理
|
||
|
||
现有 `groups/{topic}/members` 与成员命令可支撑。需要确保成员列表返回群角色、禁言状态与入群时间。
|
||
|
||
字段建议:`topic`、`user_id`、`nickname`、`display_name`、`role`、`status`、`muted_until`、`joined_at`、`last_seen`。`role` 枚举为 `owner`、`admin`、`member`;`status` 枚举为 `active`、`muted`、`removed`。
|
||
|
||
按钮对应命令:设管理员 `group.admin.set`、取消管理员 `group.admin.remove`、转让群主 `group.owner.transfer`、成员禁言 `group.member.mute`、解除禁言 `group.member.unmute`、移除成员 `group.member.remove`。
|
||
|
||
### 3.6 邀请码管理
|
||
|
||
IM Server 注册链路已在 `user.go` 中记录邀请码使用,`RecordUse` 已存在。需要解决邀请码格式冲突:鸽达达需求为 6 位数字,既有 IM 文档曾要求 5 位 ASCII 字母。若严格复刻鸽达达,应将 IM 注册校验、错误提示、唯一性检查、大小写处理统一改为 6 位数字。
|
||
|
||
改造点:
|
||
|
||
| 项 | 内容 |
|
||
| --- | --- |
|
||
| 校验 | 仅允许 `^[0-9]{6}$`,不做大小写转换。 |
|
||
| 使用记录 | 注册成功后写 `im_registration_invite_uses`,包含 `code`、`user_id`、`request_id`、`used_at`。 |
|
||
| 并发 | 使用事务或唯一约束防止超发。 |
|
||
| 状态 | `unused`、`used`、`expired`、`revoked`。 |
|
||
|
||
### 3.7 单聊消息
|
||
|
||
当前只有单条消息 detail 查询,不足以支撑后台列表。需要新增 internal message list resource。
|
||
|
||
新增 internal query:
|
||
|
||
| 路径 | 方法 | 查询参数 |
|
||
| --- | --- | --- |
|
||
| `/internal/admin-query/tenants/{tenant}/private-messages` | GET | `topic`、`from_user_id`、`to_user_id`、`content_type`、`status`、`keyword`、`created_at_start/end`、`page`、`per_page`。 |
|
||
| `/internal/admin-query/tenants/{tenant}/messages/{topic}/{seq}` | GET | 已有,继续作为详情。 |
|
||
|
||
返回字段:`topic`、`seq_id`、`from_user_id`、`to_user_id`、`head`、`content_type`、`content_excerpt`、`status`、`created_at`、`updated_at`。全文内容只在详情返回,并根据 Admin 权限决定是否脱敏。
|
||
|
||
新增 Kafka 命令建议:`message.hide`、`message.unhide`、`message.delete`、`message.restore`。如果只允许软删除,命令语义必须明确为后台不可见还是客户端不可见。
|
||
|
||
### 3.8 群聊消息
|
||
|
||
新增 internal group message list resource。可读取 `im_group_messages` 或统一消息表,但需要确保与客户端可见状态一致。
|
||
|
||
路径:`/internal/admin-query/tenants/{tenant}/group-messages`。
|
||
|
||
筛选:`topic`、`sender_user_id`、`content_type`、`status`、`keyword`、`created_at_start/end`。返回字段在单聊基础上增加 `group_name`、`reply_to_seq`、`at_users`。
|
||
|
||
处置命令复用消息命令,审计动作记录为 `message.hidden`、`message.deleted`、`message.restored`。
|
||
|
||
### 3.9 敏感词库
|
||
|
||
IM Server 需要新增敏感词运行时,而词库主数据由 Admin 控制库维护。IM Server 只消费配置事件和执行匹配。
|
||
|
||
改造点:
|
||
|
||
| 项 | 内容 |
|
||
| --- | --- |
|
||
| 缓存 | 按租户加载敏感词,支持分组、场景、优先级、状态。 |
|
||
| 匹配场景 | 消息发送、编辑消息、用户昵称/签名、群名/公告、反馈/举报内容。 |
|
||
| 动作 | `block` 拦截、`replace` 替换、`review` 进入审核、`audit_only` 仅审计。 |
|
||
| 审计 | 命中记录写 `im_sensitive_word_hits` 或统一 `im_audit_logs`。 |
|
||
| 性能 | 正常词库用 AC 自动机或等价高效结构;正则词单独限量执行。 |
|
||
|
||
### 3.10 文件管理
|
||
|
||
已有 internal `files`、`files/{id}`、`files/{id}/links` 与文件生命周期 Kafka 基础。需要补后台预览、下载和处置一致性。
|
||
|
||
改造点:
|
||
|
||
| 项 | 内容 |
|
||
| --- | --- |
|
||
| 文件状态 | `normal`、`quarantined`、`deleted`、`orphan`。 |
|
||
| 审核状态 | 复用 `pending`、`running`、`clean`、`risky`、`failed`。 |
|
||
| 预览下载 | 提供短期签名 URL 或代理下载,禁止返回永久存储地址。 |
|
||
| 隔离删除 | 后台命令应更新文件状态、断开消息/群文件链接、写审计。 |
|
||
| 安全审核 | 接入内容安全/恶意文件检测结果,并可重试审核。 |
|
||
|
||
### 3.11 用户反馈
|
||
|
||
已有 `feedback-submissions` 资源可查询。需要补处理状态回写能力和状态审计。
|
||
|
||
新增能力:
|
||
|
||
| 能力 | 说明 |
|
||
| --- | --- |
|
||
| 状态更新 | 提供 Kafka 命令或内部写接口:`feedback.status.update`。 |
|
||
| 附件 | 通过文件链接查询反馈附件,并返回签名预览 URL。 |
|
||
| 分类 | 分类来自 `im_feedback_config.categories`,Admin 配置后 IM bootstrap 同步。 |
|
||
| 审计 | 处理人、处理备注、前后状态写入审计。 |
|
||
|
||
状态枚举:`received`、`processing`、`resolved`、`closed`。
|
||
|
||
### 3.12 操作日志
|
||
|
||
IM Server 需要补充业务侧审计完整性。当前本地 `im_audit_logs` 为空,不能支撑后台多页面审计。
|
||
|
||
写入场景:用户状态变更、群治理、消息处置、文件处置、反馈处理、敏感词命中、登录成功/失败、配置热更新、Kafka 命令执行结果。
|
||
|
||
字段:`request_id`、`actor_user_id`、`action`、`target_type`、`target_id`、`ip`、`user_agent`、`detail`、`created_at`。`detail` 中敏感值必须脱敏或存 hash。
|
||
|
||
### 3.13 用户账号审计
|
||
|
||
新增或扩展 internal resource `user-account-audit`,按用户聚合账号生命周期事件。
|
||
|
||
路径:`/internal/admin-query/tenants/{tenant}/user-account-audit`。
|
||
|
||
筛选:`user_id`、`action`、`operator_id`、`ip`、`created_at_start/end`。返回:`event_id`、`user_id`、`action`、`operator_type`、`operator_id`、`before_state`、`after_state`、`reason`、`ip`、`device_id`、`created_at`。
|
||
|
||
动作枚举:`registered`、`login_success`、`logout`、`login_failed`、`password_changed`、`password_reset`、`banned`、`unbanned`、`frozen`、`unfrozen`、`device_kicked`、`cancelled`、`deleted`。
|
||
|
||
### 3.14 群事件审计
|
||
|
||
已有 `im_group_admin_logs` 与 group outbox,可新增 internal resource `group-event-audit` 或复用 `group_admin-logs` 扩展为全局查询。
|
||
|
||
路径:`/internal/admin-query/tenants/{tenant}/group-event-audit`。
|
||
|
||
筛选:`topic`、`operator_id`、`target_user_id`、`action`、`created_at_start/end`。返回:`event_id`、`topic`、`operator_id`、`target_user_id`、`action`、`object_type`、`object_id`、`before_data`、`after_data`、`created_at`。
|
||
|
||
### 3.15 管理员登录历史
|
||
|
||
该页面主要由 Admin Server 的 HotGo 登录日志提供,IM Server 无需改造。若以后要展示 Admin 调用 IM internal API 的访问审计,可在 internal API 层增加 `internal_api_access_logs`,但不作为复刻 P0。
|
||
|
||
### 3.16 用户登录历史
|
||
|
||
当前缺少完整登录历史表与查询。需要在认证成功、token 刷新、主动/被动登出时记录日志。
|
||
|
||
新增表建议:`im_user_login_logs`。
|
||
|
||
字段:`id`、`user_id`、`login_type`、`device_id`、`platform`、`ip`、`region`、`user_agent`、`request_id`、`result`、`login_at`、`logout_at`、`created_at`。
|
||
|
||
新增 internal query:`/internal/admin-query/tenants/{tenant}/user-login-logs`,支持按 `user_id`、`phone/account`、`ip`、`platform`、`login_at_start/end` 查询。
|
||
|
||
### 3.17 IP 账号统计
|
||
|
||
新增聚合查询,来源为注册、登录成功、登录失败、风控命中日志。
|
||
|
||
路径:`/internal/admin-query/tenants/{tenant}/ip-account-stats`。
|
||
|
||
字段:`ip`、`region`、`user_count`、`register_count`、`login_count`、`failure_count`、`first_seen_at`、`last_seen_at`、`risk_level`。该接口可以实时聚合,也可以由定时任务写入快照表以降低查询成本。
|
||
|
||
### 3.18 登录失败日志
|
||
|
||
新增表建议:`im_login_failure_logs`。
|
||
|
||
字段:`id`、`account`、`user_id`、`failure_type`、`reason`、`ip`、`region`、`device_id`、`platform`、`user_agent`、`request_id`、`attempt_at`。
|
||
|
||
新增 internal query:`/internal/admin-query/tenants/{tenant}/login-failure-logs`。失败类型枚举:`password_error`、`code_error`、`account_not_found`、`account_disabled`、`rate_limited`、`risk_blocked`。
|
||
|
||
### 3.19 私域设置
|
||
|
||
IM Server 需要确保客户端 `/v1/im/bootstrap` 使用 Admin 发布后的配置,并支持热更新。
|
||
|
||
配置来源:
|
||
|
||
| 配置 | 使用位置 |
|
||
| --- | --- |
|
||
| 注册/邀请码/短信 | 注册、验证码、密码找回。 |
|
||
| 上传/文件审核 | 上传、预览、消息附件。 |
|
||
| 反馈/邮箱/通知 | 客户端入口与提交表单。 |
|
||
| 版本/工作台 | bootstrap、app release、workbench。 |
|
||
| 声网/音视频 | `/v1/im/calls/rtc-join`。 |
|
||
| 好友功能 | `/v1/im/bootstrap` 返回 `global_friend_enabled`、入口隐藏建议和提示文案;实际拦截由后端完成。 |
|
||
| 消息宵禁 | `/v1/im/bootstrap` 返回当前宵禁摘要和提示文案;发送消息时仍以后端实时校验为准。 |
|
||
|
||
改造点:配置事件必须带版本号;IM 缓存应支持按租户回滚到上一发布版本;bootstrap 返回的配置只包含客户端需要的非敏感字段。
|
||
|
||
### 3.20 安全策略
|
||
|
||
IM Server 是安全策略的执行层。需要将 Admin 发布的策略接入登录、验证码、消息、文件、群、好友、实名、音视频等关键入口。全局禁止加好友和宵禁必须后端强制执行,客户端展示仅作为体验优化。
|
||
|
||
策略项:
|
||
|
||
| 策略 | 执行点 |
|
||
| --- | --- |
|
||
| 密码强度 | 注册、改密、重置密码。 |
|
||
| 登录限频 | 登录、验证码校验、密码找回。 |
|
||
| IP 黑白名单 | 登录、注册、发消息、上传文件。 |
|
||
| 敏感词 | 消息、资料、群资料、反馈。 |
|
||
| 文件审核 | 上传完成、消息发送前后、后台重审。 |
|
||
| 实名要求 | 加好友、建群、入群、发起音视频等敏感能力。 |
|
||
| 风控挑战 | 登录异常、IP 异常、设备异常。 |
|
||
| 全局好友功能 | 用户搜索、好友申请、二维码解析、群成员资料、个人名片、推荐联系人、邀请注册自动加好友。 |
|
||
| 消息宵禁 | 单聊/私聊发送消息入口,默认拦截 P2P topic 的 `{pub}`;如产品确认群聊也管控,可扩展到 group topic。 |
|
||
|
||
动作枚举统一为 `allow`、`challenge`、`block`、`audit_only`。
|
||
|
||
全局禁止加好友执行规则:
|
||
|
||
| 入口 | 后端行为 |
|
||
| --- | --- |
|
||
| 用户搜索 `/v1/im/users/search` | 可直接返回空列表,或返回脱敏结果但不允许发起好友申请。 |
|
||
| 用户详情 `/v1/im/users/{id}` | 非好友场景隐藏手机号、账号、二维码、个人扩展资料,只保留必要公开字段。 |
|
||
| 好友申请 `/v1/im/friend-requests` | 返回业务错误 reason,例如 `FRIEND_DISABLED`。 |
|
||
| 二维码解析 `/v1/im/qrcodes/resolve` | 禁止解析出可加好友目标,或返回脱敏提示。 |
|
||
| 群成员资料 | 群成员列表可保留昵称/头像用于群聊展示,但点击个人信息时返回脱敏资料并禁止添加。 |
|
||
| 邀请注册自动加好友 | 注册成功后跳过自动加好友并写审计,或按策略直接拒绝该邀请码能力。 |
|
||
|
||
宵禁执行规则:
|
||
|
||
| 项 | 说明 |
|
||
| --- | --- |
|
||
| 配置 | `message_curfew_enabled`、`message_curfew_rules`,规则包含时区、日期类型、开始时间、结束时间、scope、白名单、提示文案。 |
|
||
| 判断时机 | P2P topic 发布消息前校验;HTTP 消息发送、转发、草稿转发送等入口也要校验。 |
|
||
| 拦截结果 | 返回明确 reason,例如 `MESSAGE_CURFEW_ACTIVE`,并记录 `im_audit_logs` 或风控日志。 |
|
||
| 白名单 | 支持用户、系统账号、特定会话豁免。 |
|
||
| 跨天 | 支持如下班后 `18:00-09:00` 的跨天时间段。 |
|
||
|
||
## 4. Internal Admin Query 新增清单
|
||
|
||
建议在 `server/internal_admin_query_resources.go` 增补资源,并在 `server/internal_api.go` 路由分发中注册:
|
||
|
||
| 资源 | 必要性 | 说明 |
|
||
| --- | --- | --- |
|
||
| `dashboard/overview`、`dashboard/trends` | P0 | 首页统计。 |
|
||
| `private-messages`、`group-messages` | P0 | 消息管理列表。 |
|
||
| `user-login-logs`、`login-failure-logs` | P0 | 登录审计。 |
|
||
| `ip-account-stats` | P1 | IP 风险聚合。 |
|
||
| `user-account-audit`、`group-event-audit` | P1 | 专题审计。 |
|
||
| `sensitive-word-hits` | P1 | 敏感词命中查询。 |
|
||
|
||
所有列表接口返回现有结构:`items`、`total`、`page`、`per_page`。时间筛选继续使用 `created_at_start`、`created_at_end` 等字段,UID 参数继续支持数字 ID 与 `usr...` 编码。
|
||
|
||
## 5. Kafka 命令新增清单
|
||
|
||
已有用户与群治理命令保留。为复刻后台补充以下命令:
|
||
|
||
| 命令 | 说明 |
|
||
| --- | --- |
|
||
| `message.hide` | 后台隐藏消息,客户端不可见或后台标记隐藏。 |
|
||
| `message.unhide` | 恢复隐藏消息。 |
|
||
| `message.delete` | 后台删除消息,建议软删除。 |
|
||
| `message.restore` | 恢复误删消息。 |
|
||
| `file.quarantine` | 文件隔离。 |
|
||
| `file.delete` | 文件删除。 |
|
||
| `feedback.status.update` | 反馈处理状态更新。 |
|
||
| `group.suspend`、`group.unsuspend` | 如产品确认需要群封停/解封,则新增。 |
|
||
| `security.policy.reload` | 强制刷新安全策略缓存。 |
|
||
| `friend.policy.reload` | 强制刷新好友入口策略缓存,可与 `security.policy.reload` 合并实现。 |
|
||
| `curfew.policy.reload` | 强制刷新宵禁策略缓存,可与 `security.policy.reload` 合并实现。 |
|
||
|
||
命令 payload 必须包含 `command_id`、`actor_user_id`、`reason`、目标 ID、`version` 或 `expected_version`。执行后发布 result,状态为 `success`、`failed`、`dead`。
|
||
|
||
## 6. 数据库改造建议
|
||
|
||
配套建表与兼容迁移脚本见 [`sql/IM-Server改造.sql`](sql/IM-Server改造.sql)。脚本默认使用本地 `tinode`,上线时必须对每个独立租户数据库分别执行,租户业务表不增加 `tenant_id`。
|
||
|
||
租户库新增或补强表:
|
||
|
||
| 表 | 用途 |
|
||
| --- | --- |
|
||
| `im_user_login_logs` | 用户登录成功、登出、刷新等历史。 |
|
||
| `im_login_failure_logs` | 登录失败与风控拦截历史。 |
|
||
| `im_message_admin_actions` | 后台消息处置记录,可与消息表状态解耦。 |
|
||
| `im_sensitive_word_hits` | 敏感词命中记录。 |
|
||
| `im_ip_account_stats_daily` | IP 账号统计快照,可选。 |
|
||
|
||
已有表需补数据写入:`im_audit_logs` 当前本地为空,需要在关键业务入口统一写;`im_devices` 本地为空,需要确认设备绑定/解绑路径是否完整;`im_group_files` 本地为空,需要验证群文件写入链路。
|
||
|
||
索引建议:消息列表按 `(topic, created_at)`、`(from, created_at)`;登录日志按 `(user_id, login_at)`、`(ip, login_at)`;失败日志按 `(account, attempt_at)`、`(ip, attempt_at)`;敏感词命中按 `(scene, created_at)`、`(user_id, created_at)`。
|
||
|
||
## 7. 验收要求
|
||
|
||
1. Admin 20 个页面的查询按钮均能通过 internal query 返回真实数据或标准空态。
|
||
2. 用户、群、消息、文件、反馈的后台写操作均通过 Kafka 命令,具备幂等、结果回传、死信处理。
|
||
3. 登录历史、失败日志、账号审计、群事件审计不再依赖空表,关键入口可产生真实审计数据。
|
||
4. 敏感词与安全策略变更可热更新,无需重启 IM Server。
|
||
5. 所有 internal query 均保持只读、分页、鉴权、脱敏和错误 reason 规范。
|
||
6. 邀请码格式在 Admin 与 IM 注册链路完全一致,避免后台生成后客户端无法使用。
|