-- 登录失败日志表(共库多租户版)。 -- 背景:登录失败日志仅记录触发账号锁定的事件(见 session.go lockedNow 分支), -- 普通失败不再落库;锁定计数器存 Redis,im_login_lockouts 不再使用。 -- 执行范围:每个租户业务库(共库模式即 tinode / meeting_im 库各执行一次)。 -- 上游 scripts/IM-租户业务库初始化.sql 中的同名表无 tenant_id 列,勿用旧版执行。 CREATE TABLE IF NOT EXISTS `im_login_failure_logs` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL DEFAULT 0, `user_id` bigint DEFAULT NULL, `account_type` varchar(24) NOT NULL DEFAULT '', `account_hash` char(64) NOT NULL DEFAULT '', `account_mask` varchar(128) NOT NULL DEFAULT '', `failure_type` varchar(32) NOT NULL, `reason` varchar(96) NOT NULL DEFAULT '', `detail` varchar(500) NOT NULL DEFAULT '', `ip` varchar(64) NOT NULL DEFAULT '', `region` varchar(128) NOT NULL DEFAULT '', `device_id` varchar(255) NOT NULL DEFAULT '', `platform` varchar(32) NOT NULL DEFAULT 'unknown', `app_version` varchar(32) NOT NULL DEFAULT '', `user_agent` varchar(512) NOT NULL DEFAULT '', `risk_level` varchar(16) NOT NULL DEFAULT 'medium', `risk_action` varchar(24) NOT NULL DEFAULT 'audit_only', `request_id` varchar(64) NOT NULL DEFAULT '', `attempt_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `metadata` json DEFAULT NULL, `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), KEY `idx_im_login_failure_tenant_time` (`tenant_id`,`attempt_at` DESC,`id` DESC), KEY `idx_im_login_failure_account_time` (`account_hash`,`attempt_at` DESC,`id` DESC), KEY `idx_im_login_failure_user_time` (`user_id`,`attempt_at` DESC,`id` DESC), KEY `idx_im_login_failure_ip_time` (`ip`,`attempt_at` DESC,`id` DESC), KEY `idx_im_login_failure_type_time` (`failure_type`,`attempt_at` DESC,`id` DESC), KEY `idx_im_login_failure_request` (`request_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;