-- Sensitive words, hit audit, account send mute. ALTER TABLE t_users ADD COLUMN send_muted_until DATETIME(3) NULL COMMENT '全站禁言截止时间,空或已过期表示可发消息'; CREATE TABLE IF NOT EXISTS t_sensitive_words ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '行 id,表内自增', word_raw VARCHAR(64) NOT NULL COMMENT '运营录入原文,展示用', word VARCHAR(64) NOT NULL COMMENT 'FoldAndIndex 后的词面,全局唯一,进自动机', category TINYINT NOT NULL COMMENT '1涉黑 2涉毒 3涉黄 4涉赌 5涉政 6宗教 7辱骂 8广告 9其他', action TINYINT NOT NULL COMMENT '1log 2replace 3reject 4hide 5mute 6disable', mute_seconds INT NOT NULL DEFAULT 0 COMMENT 'action=mute 时的禁言秒数', enabled TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0下线(不进自动机)', created_at DATETIME(3) NOT NULL COMMENT '创建时间', updated_at DATETIME(3) NOT NULL COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY uk_word (word) ) COMMENT='敏感词;发送热路径使用进程内自动机,本表为真源'; CREATE TABLE IF NOT EXISTS t_sensitive_hits ( id BIGINT NOT NULL COMMENT 'Snowflake', user_id BIGINT NOT NULL COMMENT '发送者 uid', conversation_id BIGINT NOT NULL DEFAULT 0 COMMENT '会话 id', word_id BIGINT NOT NULL COMMENT 't_sensitive_words.id', category TINYINT NOT NULL COMMENT '命中时的类别快照', action TINYINT NOT NULL COMMENT '本行对应词的 action', excerpt VARCHAR(128) NOT NULL DEFAULT '' COMMENT '命中片段,截断', real_ip VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'PROXY RealIP', created_at DATETIME(3) NOT NULL COMMENT '命中时间', PRIMARY KEY (id), KEY idx_user_created (user_id, created_at), KEY idx_created (created_at), KEY idx_word (word_id) ) COMMENT='敏感词命中审计,供 Admin 查询';