Files
kefu/im/backend/migrations/043_admin_risk_keywords.sql
T
Your NameandClaude Opus 5 0031f79eb3 管理端补上运营真正要用的那几件事
原来 107 个后台接口配的是一套只能看的界面:风险中心 6 行代码全是只读,
动态和消息只能一条一条点,运营想发一句公告没有任何入口。

公告与通知:按全体、会员、城市、喂养者、有宠物的用户或指定名单发系统通知,
发之前能看到会发给多少人,可同时走离线推送。撤回只删还没读的那些——已经
读过的假装收回去只会让统计说谎。

资金总览:把"平台账上哪些钱不是自己的"单独摆出来(任务托管中 + 喂养者余额 +
申诉冻结),旁边才是收入、退款和待打款,最后是按产品和按日的收款。

退款统一到一个入口:会员、代喂、保证金都能分几次退到退完,每笔记一行;
退完最后一分钱才撤销买到的东西,半份会员仍然是会员。

风险中心能动手了:按等级和状态筛,行内直接封禁、冻结、加白(必须写理由)、
跳用户详情,事件可以标记跟进完成。

批量处置:动态、消息、举报支持勾选后批量下架/恢复/驳回,一次最多 100 条。
处罚仍然一条一条来——批量封禁是错封人最快的方式。

敏感词统一词库:消息、动态、送养共用一套,命中是拦截还是转人工由运营定;
转人工的命中会在风险中心留一条,管理端还能拿真实文案先试一遍。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:07:58 +08:00

48 lines
2.6 KiB
SQL

SET NAMES utf8mb4;
-- 风险中心原来只能看。加白是"这个人我们看过了,别再报",事件处理是"这条我
-- 跟进完了",两件事都得留下是谁做的。
ALTER TABLE user_risk_profiles
ADD COLUMN whitelisted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '人工加白后不再进风险列表',
ADD COLUMN whitelist_note VARCHAR(255) NOT NULL DEFAULT '',
ADD COLUMN reviewed_by BIGINT UNSIGNED NULL,
ADD COLUMN reviewed_at DATETIME(3) NULL;
ALTER TABLE risk_events
ADD COLUMN handled_at DATETIME(3) NULL,
ADD COLUMN handled_by BIGINT UNSIGNED NULL,
ADD COLUMN handled_note VARCHAR(255) NOT NULL DEFAULT '',
ADD KEY idx_risk_events_handled (handled_at, id);
-- 统一词库:消息、动态、送养原来各有各的判断(送养那组还写在配置里)。
-- 命中之后是拦下来还是转人工,是运营的判断,所以写在数据里而不是代码里。
CREATE TABLE IF NOT EXISTS content_keywords (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
word VARCHAR(60) NOT NULL,
scope VARCHAR(20) NOT NULL DEFAULT 'all' COMMENT 'all/message/post/adoption/nickname',
action VARCHAR(10) NOT NULL DEFAULT 'review' COMMENT 'block 直接拦下 / review 转人工',
category VARCHAR(30) NOT NULL DEFAULT '' COMMENT '分类,便于成组开关',
note VARCHAR(200) NOT NULL DEFAULT '',
status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '0 停用 1 启用',
hit_count INT UNSIGNED NOT NULL DEFAULT 0,
last_hit_at DATETIME(3) NULL,
created_by BIGINT UNSIGNED NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_keyword_scope (word, scope),
KEY idx_keywords_status (status, scope)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 把送养那组已经在用的词搬进词库,行为保持原样(转人工,不直接拦)。
INSERT IGNORE INTO content_keywords(word,scope,action,category,note)
SELECT TRIM(word),'adoption','review','送养收费','从 pet.adoption_review_words 迁移' FROM (
SELECT '元' AS word UNION ALL SELECT '钱' UNION ALL SELECT '价' UNION ALL SELECT '押金'
UNION ALL SELECT '费用' UNION ALL SELECT '红包' UNION ALL SELECT '转账' UNION ALL SELECT '收费'
UNION ALL SELECT '出售' UNION ALL SELECT '买' UNION ALL SELECT '卖'
) AS legacy;
INSERT INTO system_configs(config_key,config_value,value_type,description) VALUES
('moderation.keywords_enabled','true','boolean','是否启用统一词库;关闭后消息与动态不做关键词判断')
ON DUPLICATE KEY UPDATE description=VALUES(description);