From 942dee0fa8bad9c4edef9e67a6b9698ededd606b Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Fri, 12 Jun 2026 17:00:36 +0800 Subject: [PATCH] =?UTF-8?q?docs:=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06-11-moderation-report-feedback-design.md | 988 +++++++++++--- .../specs/2026-06-12-load-testing-design.md | 1154 +++++++++++++++++ .../square/components/HotCategoryBlock.vue | 34 +- frontend/static/square/galaxy/xbbj.png | Bin 0 -> 352539 bytes 4 files changed, 1974 insertions(+), 202 deletions(-) create mode 100644 docs/superpowers/specs/2026-06-12-load-testing-design.md create mode 100644 frontend/static/square/galaxy/xbbj.png diff --git a/docs/superpowers/specs/2026-06-11-moderation-report-feedback-design.md b/docs/superpowers/specs/2026-06-11-moderation-report-feedback-design.md index e5f0b17..ab01b6a 100644 --- a/docs/superpowers/specs/2026-06-11-moderation-report-feedback-design.md +++ b/docs/superpowers/specs/2026-06-11-moderation-report-feedback-design.md @@ -81,7 +81,7 @@ TopFans 是粉丝/明星数字藏品平台。当前平台缺少: │ - ReportService / FeedbackService / CategoryService │ │ - 写 PostgreSQL reports/feedbacks/categories/状态表 │ │ - Redis 计数 (自动隐藏阈值) │ -│ - 触发自动隐藏:UPDATE reports + UPSERT moderation_target_status│ +│ - 触发自动隐藏:业务表软删除 + UPDATE reports + UPSERT moderation_target_status│ └────────┬─────────────────────────────────────────┬───────────────┘ │ 共享 PG 库 │ │ │ @@ -94,9 +94,9 @@ TopFans 是粉丝/明星数字藏品平台。当前平台缺少: │ - report_evidence │ └──────────────────────────────────┘ │ - feedbacks │ │ - feedback_evidence │ -│ - moderation_target_status│ ← 业务服务读路径 JOIN 此表 -│ - moderation_actions │ -│ - admin_audit_logs │ +│ - moderation_target_status│ ← 审计追溯 + 警告状态表(下架/封禁由业务表 is_active/deleted_at 软删除承担) +│ - moderation_actions │ │ +│ - admin_audit_logs │ │ └────────┬───────────────────┘ │ 共享 PG 库 (直接读写,不调对方接口) ▼ @@ -119,19 +119,19 @@ TopFans 是粉丝/明星数字藏品平台。当前平台缺少: | `CategoryService` (Go+FastAPI) | 维护分类(动态配置),客户端读取 + 后台 CRUD | | `AutoHideExecutor` (Go) | Redis 计数 + 触发自动隐藏(写 reports + 状态表) | | 后台 Moderation Admin (FastAPI) | 审核员认领/动作/分类管理,**只读写 PostgreSQL,不操作 Redis** | -| `moderation_target_status` 表 | 业务服务读路径 JOIN,呈现"隐藏/封禁/警告"状态 | +| `moderation_target_status` 表 | 审计追溯 + 警告状态;下架/封禁由业务表 `is_active` + `deleted_at` 软删除承担 | **关键边界**: - `TopFans-Activity` 后台**不调用** `moderationService` 的任何 RPC / Dubbo / HTTP 接口,**不操作 Redis**;仅通过共享 PostgreSQL 完成所有读写 - 唯一的跨服务依赖是:客户端 API 通过 gateway → moderationService(Dubbo RPC),这是项目既有的调用模式 -- 业务下架/封禁的"实际生效"完全通过读路径 `LEFT JOIN moderation_target_status` 实现,不需要跨服务写业务表 +- 业务下架/封禁的"实际生效"完全通过业务表自带的 `is_active` + `deleted_at` 软删除字段实现(读路径 `WHERE is_active=TRUE AND deleted_at IS NULL`),`moderation_target_status` 仅承担审计追溯 + 用户警告状态,不参与运行时过滤 - 如后台需查询"实时计数"等 Redis 状态,由 Go service 异步定时把 Redis 数据回写到 PostgreSQL 一张快照表(`moderation_counter_snapshot`),后台查快照表即可——**这是唯一允许的"Redis → PG"数据流,且单向** ### 2.3 复用现有资产 - **OSS 上传**:举报证据图、反馈截图复用 `assetService` 的 OSS 签名接口(`GET /api/v1/assets/oss/signature?type=asset`) - **认证**:客户端 JWT 用 topfans userService;后台 JWT 用 `TopFans-activity` 已有的 `verify_token` -- **通知中心**:处理结果通过 topfans `notificationService` 模板下发(新增 5 个模板) +- **通知中心**:处理结果通过 topfans `notificationService` 模板下发(新增 6 个模板) - **数据迁移**:遵循 topfans 现有 `backend/migrations/00x_*.sql` 命名规范 - **序列同步**:手动指定 ID 时必须 `SELECT setval('table_id_seq', MAX(id))`(CLAUDE.md 强制规范) @@ -139,6 +139,8 @@ TopFans 是粉丝/明星数字藏品平台。当前平台缺少: ## 3. 数据模型 +> **全局约定**:本设计所有 `*_at` 时间戳字段(`created_at` / `updated_at` / `claimed_at` / `resolved_at` / `last_warned_at` 等)均为 **Unix 毫秒** (`BIGINT`),与 Go `time.Now().UnixMilli()` 一致。SQL 中用 `EXTRACT(EPOCH FROM NOW())*1000` 计算(PG 隐式 `numeric→bigint` 转换)。 + ### 3.1 核心表 ``` @@ -149,15 +151,18 @@ report_evidence 举报证据图(一对多) feedbacks 反馈工单主表 feedback_evidence 反馈截图(一对多) moderation_actions 审核动作流水 -moderation_target_status 共享"对象受管控状态"表(业务服务读路径 JOIN) +moderation_target_status 共享"对象受管控状态"表(审计 + 警告;下架/封禁由业务表软删除承担) admin_audit_logs 管理员操作日志 ``` ### 3.2 `report_categories` 举报分类 ```sql -CREATE SEQUENCE report_categories_id_seq START WITH 10000; +CREATE SEQUENCE report_categories_id_seq START WITH 10000 OWNED BY report_categories.id; +-- 示例:Unix 毫秒(参见 3 节约定)。`EXTRACT(EPOCH FROM NOW())*1000` 产生 `numeric`,PG 隐式转为 `bigint` + +-- 举报分类字典(动态配置,后台 CRUD;客户端 GET 只读 enabled=TRUE 行) CREATE TABLE report_categories ( id BIGSERIAL PRIMARY KEY, code VARCHAR(50) NOT NULL UNIQUE, @@ -167,19 +172,20 @@ CREATE TABLE report_categories ( enabled BOOLEAN NOT NULL DEFAULT TRUE, sort_order INT NOT NULL DEFAULT 0, created_at BIGINT NOT NULL, - updated_at BIGINT NOT NULL + updated_at BIGINT NOT NULL, + CONSTRAINT chk_report_categories_severity CHECK (severity BETWEEN 1 AND 5) ); CREATE INDEX idx_report_categories_enabled ON report_categories(enabled, sort_order); -- 初始数据 INSERT INTO report_categories (code, name, description, severity, sort_order, created_at, updated_at) VALUES - ('pornographic', '色情低俗', '含裸露、性暗示内容', 5, 1, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), - ('violence', '暴力血腥', '含暴力、血腥画面', 5, 2, ...), - ('infringing', '侵权盗版', '侵犯他人著作权/商标权', 4, 3, ...), - ('false_info', '虚假信息', '虚假、欺骗性内容', 3, 4, ...), - ('political', '政治敏感', '涉及政治敏感话题', 5, 5, ...), - ('ad_spam', '广告骚扰', '垃圾广告、骚扰信息', 2, 6, ...), - ('other', '其他', '其他违规情况', 1, 99, ...); + ('pornographic', '色情低俗', '含裸露、性暗示内容', 5, 1, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('violence', '暴力血腥', '含暴力、血腥画面', 5, 2, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('infringing', '侵权盗版', '侵犯他人著作权/商标权', 4, 3, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('false_info', '虚假信息', '虚假、欺骗性内容', 3, 4, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('political', '政治敏感', '涉及政治敏感话题', 5, 5, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('ad_spam', '广告骚扰', '垃圾广告、骚扰信息', 2, 6, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('other', '其他', '其他违规情况', 1, 99, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000); SELECT setval('report_categories_id_seq', (SELECT MAX(id) FROM report_categories)); ``` @@ -187,8 +193,9 @@ SELECT setval('report_categories_id_seq', (SELECT MAX(id) FROM report_categories ### 3.3 `feedback_categories` 反馈分类 ```sql -CREATE SEQUENCE feedback_categories_id_seq START WITH 10000; +CREATE SEQUENCE feedback_categories_id_seq START WITH 10000 OWNED BY feedback_categories.id; +-- 反馈分类字典(动态配置) CREATE TABLE feedback_categories ( id BIGSERIAL PRIMARY KEY, code VARCHAR(50) NOT NULL UNIQUE, @@ -201,10 +208,10 @@ CREATE TABLE feedback_categories ( ); INSERT INTO feedback_categories (code, name, description, sort_order, created_at, updated_at) VALUES - ('bug', 'BUG 报告', '使用中遇到的问题', 1, ...), - ('consult', '使用咨询', '不知道怎么用', 2, ...), - ('business', '内容合作', '合作/商务联系', 3, ...), - ('suggestion', '功能建议', '希望增加什么功能', 4, ...); + ('bug', 'BUG 报告', '使用中遇到的问题', 1, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('consult', '使用咨询', '不知道怎么用', 2, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('business', '内容合作', '合作/商务联系', 3, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000), + ('suggestion', '功能建议', '希望增加什么功能', 4, EXTRACT(EPOCH FROM NOW())*1000, EXTRACT(EPOCH FROM NOW())*1000); SELECT setval('feedback_categories_id_seq', (SELECT MAX(id) FROM feedback_categories)); ``` @@ -212,38 +219,91 @@ SELECT setval('feedback_categories_id_seq', (SELECT MAX(id) FROM feedback_catego ### 3.4 `reports` 举报工单 ```sql -CREATE SEQUENCE reports_id_seq START WITH 10000; +CREATE SEQUENCE reports_id_seq START WITH 10000 OWNED BY reports.id; +-- 举报工单主表(5 个状态:pending/reviewing/auto_hidden/resolved/dismissed) CREATE TABLE reports ( id BIGSERIAL PRIMARY KEY, reporter_id BIGINT NOT NULL, star_id BIGINT, - target_type VARCHAR(30) NOT NULL, -- asset | user_profile | description_word(统一以 user_profile 表示用户主页) + target_type VARCHAR(30) NOT NULL, -- asset | user_profile(v1.4 砍掉 description_word:AI 描述词即 assets.description 字段,举报 AI 描述词走 asset 路径) target_id BIGINT NOT NULL, - target_snapshot JSONB NOT NULL, -- 提交时的对象快照 - + + target_snapshot JSONB NOT NULL, + -- v2.4 schema 定义(必填字段): + -- target_type='asset' → {"asset_id": BIGINT, "owner_uid": BIGINT, "name": VARCHAR, "cover_url": VARCHAR, "description": TEXT, "star_id": BIGINT, "snapshot_at": BIGINT} + -- target_type='user_profile' → {"user_id": BIGINT, "nickname": VARCHAR, "avatar_url": VARCHAR, "star_id": BIGINT, "snapshot_at": BIGINT} + -- `snapshot_at` = Unix 毫秒(提交时刻快照,后续 star binding / ownership 变更不回溯) + -- `target_owner_uid_at_submit` 已 DROP(v2.4 移除,v2.3 列为死列——target_snapshot 内已有 owner_uid 字段;通知路由改为通过 target_snapshot.owner_uid 读取) + triggered_auto_hide BOOLEAN NOT NULL DEFAULT FALSE, + -- v2.4:仅触发 auto-hide 阈值的那个 report 置 TRUE;同 target 其它 pending report 升级为 auto_hidden 时保持 FALSE + -- 6.1 step 6 ② UPDATE 显式 `triggered_auto_hide = (id = $trigger_report_id)` + -- 用于审计 "哪个 report 是阈值触发者" vs "哪些是连带升级" + category_code VARCHAR(50) NOT NULL, description VARCHAR(500), is_anonymous BOOLEAN NOT NULL DEFAULT FALSE, - + status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / reviewing / auto_hidden / resolved / dismissed is_auto_hidden BOOLEAN NOT NULL DEFAULT FALSE, - - resolved_action VARCHAR(20), -- takedown | ban | warn | dismissed + -- 标记本工单是否曾经因阈值被自动隐藏:自动隐藏触发时置 TRUE;后 + -- 续 auto_hidden → reviewing → resolved/dismissed 保持 TRUE 不变, + -- 供审计追溯"该工单经历过自动隐藏流程"。不要在状态机迁移时重置。 + + claimed_by BIGINT, -- 当前审核认领人(reviewing 期间非空,用于 50008 "已被他人认领" 返回认领人身份) + claimed_at BIGINT, + + resolved_action VARCHAR(20), -- takedown | ban | warn | dismiss(动作名,区别于状态名 dismissed) resolved_by BIGINT, resolved_at BIGINT, resolution_note VARCHAR(500), - + created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, - + CONSTRAINT fk_reports_category FOREIGN KEY (category_code) - REFERENCES report_categories(code) ON DELETE RESTRICT + REFERENCES report_categories(code) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT chk_reports_status + CHECK (status IN ('pending','reviewing','auto_hidden','resolved','dismissed','withdrawn','archived')), + -- v2.4 加 'withdrawn'(客户端 DELETE 撤回)和 'archived'(6.5 cron 90 天 auto-archive) + CONSTRAINT chk_reports_target_type + CHECK (target_type IN ('asset','user_profile')), + CONSTRAINT chk_reports_resolved_action + CHECK (resolved_action IS NULL OR resolved_action IN ('takedown','ban','warn','dismiss')), + CONSTRAINT chk_reports_claimed_pair + CHECK ( + (status = 'reviewing' AND claimed_by IS NOT NULL AND claimed_at IS NOT NULL) + OR (status <> 'reviewing' AND claimed_by IS NULL AND claimed_at IS NULL) + ), + CONSTRAINT chk_reports_resolved_fields + CHECK ( + (status IN ('resolved','dismissed') + AND resolved_action IS NOT NULL + AND resolved_by IS NOT NULL + AND resolved_at IS NOT NULL) + OR + (status IN ('pending','reviewing','auto_hidden') + AND resolved_action IS NULL + AND resolved_by IS NULL + AND resolved_at IS NULL) + ) ); +-- 状态机迁移 + 后台列表(status 必带);created_at DESC 倒序扫描 CREATE INDEX idx_reports_status_created ON reports(status, created_at DESC); +-- "某 target 的所有举报" 反查(用于统计/审计) CREATE INDEX idx_reports_target ON reports(target_type, target_id, status); +-- "我的举报" 列表 CREATE INDEX idx_reports_reporter ON reports(reporter_id, created_at DESC); +-- 后台按分类筛选(11.3 监控维度 category_code) +CREATE INDEX idx_reports_category ON reports(category_code, status, created_at DESC); +-- 后台按明星筛选 +CREATE INDEX idx_reports_star ON reports(star_id, status, created_at DESC) + WHERE star_id IS NOT NULL; +-- 阈值触发者查询(v2.5 新增):"哪个 report 触发了 asset X 的 auto-hide" / "30 天内阈值触发列表" +CREATE INDEX idx_reports_triggered_autohide + ON reports(target_type, target_id, created_at DESC) + WHERE triggered_auto_hide = TRUE; -- 防重复:同一举报人对同一对象在未结案前只能有一条 CREATE UNIQUE INDEX uk_reports_reporter_target_pending @@ -254,7 +314,7 @@ CREATE UNIQUE INDEX uk_reports_reporter_target_pending ### 3.5 `report_evidence` 举报证据图 ```sql -CREATE SEQUENCE report_evidence_id_seq START WITH 10000; +CREATE SEQUENCE report_evidence_id_seq START WITH 10000 OWNED BY report_evidence.id; CREATE TABLE report_evidence ( id BIGSERIAL PRIMARY KEY, @@ -272,7 +332,7 @@ CREATE INDEX idx_report_evidence_report ON report_evidence(report_id, sort_order ### 3.6 `feedbacks` 反馈工单 ```sql -CREATE SEQUENCE feedbacks_id_seq START WITH 10000; +CREATE SEQUENCE feedbacks_id_seq START WITH 10000 OWNED BY feedbacks.id; CREATE TABLE feedbacks ( id BIGSERIAL PRIMARY KEY, @@ -281,31 +341,70 @@ CREATE TABLE feedbacks ( category_code VARCHAR(50) NOT NULL, title VARCHAR(100) NOT NULL, content TEXT NOT NULL, - contact VARCHAR(100), + contact VARCHAR(320), -- RFC 5321 完整邮箱地址最大长度 64 (local) + 1 (@) + 255 (domain) = 320;兼容手机/微信/邮箱 is_anonymous BOOLEAN NOT NULL DEFAULT FALSE, - + status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / reviewing / replied / closed / archived - + + claimed_by BIGINT, -- 当前审核认领人(reviewing 期间非空) + claimed_at BIGINT, replied_by BIGINT, replied_at BIGINT, reply_content TEXT, - + closed_by BIGINT, -- 终态 close 操作人 + closed_at BIGINT, + archived_by BIGINT, -- 终态 archive 操作人 + archived_at BIGINT, + created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, - + CONSTRAINT fk_feedbacks_category FOREIGN KEY (category_code) - REFERENCES feedback_categories(code) ON DELETE RESTRICT + REFERENCES feedback_categories(code) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT chk_feedbacks_status + CHECK (status IN ('pending','reviewing','replied','closed','archived')), + CONSTRAINT chk_feedbacks_claimed_pair + CHECK ( + (status = 'reviewing' AND claimed_by IS NOT NULL AND claimed_at IS NOT NULL) + OR (status <> 'reviewing' AND claimed_by IS NULL AND claimed_at IS NULL) + ), + CONSTRAINT chk_feedbacks_replied_fields + CHECK ( + (status = 'replied' + AND replied_by IS NOT NULL + AND replied_at IS NOT NULL + AND reply_content IS NOT NULL) + OR + (status <> 'replied' + AND replied_by IS NULL + AND replied_at IS NULL + AND reply_content IS NULL) + ), + CONSTRAINT chk_feedbacks_closed_fields + CHECK ( + (status = 'closed' AND closed_by IS NOT NULL AND closed_at IS NOT NULL) + OR (status <> 'closed' AND closed_by IS NULL AND closed_at IS NULL) + ), + CONSTRAINT chk_feedbacks_archived_fields + CHECK ( + (status = 'archived' AND archived_by IS NOT NULL AND archived_at IS NOT NULL) + OR (status <> 'archived' AND archived_by IS NULL AND archived_at IS NULL) + ) ); CREATE INDEX idx_feedbacks_status_created ON feedbacks(status, created_at DESC); CREATE INDEX idx_feedbacks_user ON feedbacks(user_id, created_at DESC); CREATE INDEX idx_feedbacks_category ON feedbacks(category_code, status); +CREATE INDEX idx_feedbacks_claimed_by ON feedbacks(claimed_by, status, created_at DESC) + WHERE claimed_by IS NOT NULL; +CREATE INDEX idx_feedbacks_star ON feedbacks(star_id, status, created_at DESC) + WHERE star_id IS NOT NULL; ``` ### 3.7 `feedback_evidence` 反馈截图 ```sql -CREATE SEQUENCE feedback_evidence_id_seq START WITH 10000; +CREATE SEQUENCE feedback_evidence_id_seq START WITH 10000 OWNED BY feedback_evidence.id; CREATE TABLE feedback_evidence ( id BIGSERIAL PRIMARY KEY, @@ -323,92 +422,151 @@ CREATE INDEX idx_feedback_evidence_feedback ON feedback_evidence(feedback_id, so ### 3.8 `moderation_actions` 审核动作流水 ```sql -CREATE SEQUENCE moderation_actions_id_seq START WITH 10000; +CREATE SEQUENCE moderation_actions_id_seq START WITH 10000 OWNED BY moderation_actions.id; +-- 审核动作流水(永久保留,审计追溯;admin 任何操作都需写一行) CREATE TABLE moderation_actions ( id BIGSERIAL PRIMARY KEY, report_id BIGINT, feedback_id BIGINT, admin_id BIGINT NOT NULL, - action_type VARCHAR(30) NOT NULL, -- takedown | unhide | ban | warn | dismiss | reply | close | archive - target_type VARCHAR(30), + action_type VARCHAR(30) NOT NULL, -- takedown | restore | ban | warn | dismiss | reply | close | archive + target_type VARCHAR(30), -- asset | user_profile(与 reports/feedbacks.target_type 统一) target_id BIGINT, note VARCHAR(500), success BOOLEAN NOT NULL, error_message VARCHAR(500), created_at BIGINT NOT NULL, CONSTRAINT chk_moderation_actions_xor - CHECK ((report_id IS NOT NULL) OR (feedback_id IS NOT NULL)) + CHECK ( + (report_id IS NOT NULL) <> (feedback_id IS NOT NULL) + OR (report_id IS NULL AND feedback_id IS NULL) + ), + CONSTRAINT chk_moderation_actions_admin_id + CHECK (admin_id >= 0), -- 0 保留为"系统自动" sentinel(auto-hide);真实 admin 必 ≥ 1 + CONSTRAINT chk_moderation_actions_action_type + CHECK (action_type IN ( + 'takedown','restore','ban','warn','dismiss','reply','close','archive', + 'autohide_noop', -- v2.4:auto-hide 时目标已 is_active=false 的 no-op 审计 + 'withdraw', -- v2.4:客户端 DELETE 撤回 + 'force_release' -- v2.4:admin crash 后强制释放他人认领 + )), + CONSTRAINT chk_moderation_actions_target_pair + CHECK ( + (target_type IS NULL AND target_id IS NULL) + OR (target_type IS NOT NULL AND target_id IS NOT NULL + AND target_type IN ('asset','user_profile')) + ), + CONSTRAINT chk_moderation_actions_success_msg + CHECK ((success = TRUE AND error_message IS NULL) OR (success = FALSE AND error_message IS NOT NULL)) ); CREATE INDEX idx_moderation_actions_report ON moderation_actions(report_id, created_at DESC); CREATE INDEX idx_moderation_actions_feedback ON moderation_actions(feedback_id, created_at DESC); CREATE INDEX idx_moderation_actions_admin ON moderation_actions(admin_id, created_at DESC); +-- "某 target 的所有动作历史" 反查(如 audit trail / 后台详情页加载流水) +-- 必须 target_type 前缀:`target_id` 跨类型不唯一(users.id 与 assets.id 数值会冲突) +CREATE INDEX idx_moderation_actions_target + ON moderation_actions(target_type, target_id, created_at DESC) + WHERE target_type IS NOT NULL; ``` ### 3.9 `moderation_target_status` 共享"对象受管控状态" ```sql -CREATE SEQUENCE moderation_target_status_id_seq START WITH 10000; +CREATE SEQUENCE moderation_target_status_id_seq START WITH 10000 OWNED BY moderation_target_status.id; +-- 对象受管控状态(审计 + 警告;下架/封禁由业务表 is_active + deleted_at 软删除承担) CREATE TABLE moderation_target_status ( id BIGSERIAL PRIMARY KEY, - target_type VARCHAR(30) NOT NULL, -- asset | user_profile | description_word(与 reports.target_type 统一) + target_type VARCHAR(30) NOT NULL, -- asset | user_profile(与 reports.target_type 统一) target_id BIGINT NOT NULL, - - is_hidden BOOLEAN NOT NULL DEFAULT FALSE, -- 隐藏/下架 - is_banned BOOLEAN NOT NULL DEFAULT FALSE, -- 封禁(仅 user) - is_warned BOOLEAN NOT NULL DEFAULT FALSE, -- 已警告(仅 user) - + + -- ⚠️ 不存 is_hidden / is_banned 字段:项目统一通过业务表自带的 + -- `is_active` + `deleted_at` 软删除字段表达"下架/封禁"状态。 + -- 审核动作(takedown/ban/auto-hide)的"实际生效"由 moderationService + -- 在业务表上执行标准软删除(UPDATE ... SET is_active=false, deleted_at=now); + -- dismiss 自动隐藏工单时执行恢复(SET is_active=true, deleted_at=NULL)。 + is_warned BOOLEAN NOT NULL DEFAULT FALSE, -- 仅 user_profile:仍活跃但已被警告(软状态,不阻塞登录) + warn_count INT NOT NULL DEFAULT 0, -- 仅 user_profile:累计警告次数 + last_warned_at BIGINT, -- 仅 user_profile:最近一次警告时间戳 + + last_action_type VARCHAR(30) NOT NULL, -- takedown | ban | warn | restore | autohide | dismiss(最近一次动作) reason VARCHAR(200), source VARCHAR(30) NOT NULL, -- auto | admin - source_report_id BIGINT, + source_report_id BIGINT, -- auto 必填;admin 可空(多工单聚合场景) operator_admin_id BIGINT, - + created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL, - - CONSTRAINT uk_moderation_target UNIQUE (target_type, target_id) + + CONSTRAINT uk_moderation_target UNIQUE (target_type, target_id), + CONSTRAINT chk_mts_target_type + CHECK (target_type IN ('asset','user_profile')), + CONSTRAINT chk_mts_source + CHECK (source IN ('auto','admin')), + CONSTRAINT chk_mts_source_report_id + CHECK (source <> 'auto' OR source_report_id IS NOT NULL), + CONSTRAINT chk_mts_last_action_type + CHECK (last_action_type IN ('takedown','ban','warn','restore','autohide','dismiss','warn_cleared')), + -- v2.4 加 'warn_cleared'(v2.2 B2 warn_cleared 流程——否则 v2.2 warn_cleared UPDATE 直接被 CHECK 拒) + CONSTRAINT chk_mts_warn_fields + CHECK ( + (target_type = 'user_profile' + -- 三种合法状态:从未警告 / 当前警告中 / 历史警告已清除(保留计数与时间戳) + AND ( + (is_warned = FALSE AND warn_count = 0 AND last_warned_at IS NULL) + OR (is_warned = TRUE AND warn_count >= 1 AND last_warned_at IS NOT NULL) + OR (is_warned = FALSE AND warn_count >= 1 AND last_warned_at IS NOT NULL) + )) + OR (target_type = 'asset' + AND is_warned = FALSE AND warn_count = 0 AND last_warned_at IS NULL) + ) ); -CREATE INDEX idx_mts_hidden ON moderation_target_status(is_hidden) WHERE is_hidden = TRUE; -CREATE INDEX idx_mts_banned ON moderation_target_status(is_banned) WHERE is_banned = TRUE; +CREATE INDEX idx_mts_warned_user ON moderation_target_status(target_id) + WHERE is_warned = TRUE AND target_type = 'user_profile'; +CREATE INDEX idx_mts_source_report ON moderation_target_status(source_report_id, target_type, target_id) + WHERE source_report_id IS NOT NULL; ``` -**写入方**: -- `moderationService` (Go) — 自动隐藏时 UPSERT -- `TopFans-Activity` 后台 (FastAPI) — 审核员手动下架/封禁/警告时 UPSERT +**写入方(双重写入)**: +- `moderationService` (Go) — 自动隐藏/解除/警告时: + 1. **业务表软删除/恢复/警告计数**(按 target_type 路由到对应表): + - `target_type='asset'` → `UPDATE assets SET is_active=false, deleted_at=$now WHERE id=$id`(隐藏/下架;AI 描述词作为 `assets.description` 字段的一部分同表软删除) + - `target_type='user_profile'` ban/takedown → `UPDATE users SET is_active=false, deleted_at=$now WHERE id=$id` + - `target_type='user_profile'` warn → `UPDATE moderation_target_status SET is_warned=true, warn_count=warn_count+1, last_warned_at=$now`(或同步加到 users.warn_count) + - dismiss(自动隐藏已隐藏时)→ `UPDATE ... SET is_active=true, deleted_at=NULL WHERE id=$id`(恢复) + 2. **moderation_target_status UPSERT**(审计追溯 + last_action_type) +- `TopFans-Activity` 后台 (FastAPI) — 审核员手动下架/封禁/警告时同样执行"业务表 + 状态表"双重写入(事务保证一致,失败时回滚) -**读取方**: -- `assetService` 藏品查询/详情/列表:`LEFT JOIN moderation_target_status ON target_type='asset' AND target_id=assets.id WHERE COALESCE(is_hidden, false) = false` -- `userService` 登录/操作校验:`LEFT JOIN ... WHERE COALESCE(is_banned, false) = false` -- AI 描述词服务查询时同样 JOIN +**读取方(业务表自带软删除字段已足够,`moderation_target_status` 仅用于审计/警告)**: +- `assetService` 藏品查询/详情/列表:**`WHERE assets.is_active = TRUE AND assets.deleted_at IS NULL`**(沿用既有软删除过滤,无须 JOIN `moderation_target_status`;AI 描述词即 `assets.description`,随 asset 一起过滤) +- `userService` 登录/操作校验:**`WHERE users.is_active = TRUE AND users.deleted_at IS NULL`** +- 警告提示(仅用户主页展示):`LEFT JOIN moderation_target_status ON target_type='user_profile' AND target_id=users.id WHERE COALESCE(is_warned, false) = true` 拉取最近一次警告原因/时间 **目标对象 target_type 定义与位置**: | target_type | 对应表 | target_id 含义 | |-------------|--------|----------------| -| `asset` | `assets` | assets.id | +| `asset` | `assets` | assets.id(包含名称、描述(含 AI 描述词)、素材、属性等所有字段)| | `user_profile` | `users` | users.id(用户主页违规、头像、昵称)| -| `description_word` | `ai_descriptions` | ai_descriptions.id(AI 描述词,存在于 `aiChatService` 库)| -> `description_word` 类型的举报目标存放在 `aiChatService` 服务的数据库中(与 `topfans` 主库**共享同一个 PG 实例**、不同 schema:`topfans` 与 `aichat`,通过 `schema='aichat'.ai_descriptions` 跨 schema 访问)。提交举报时 `moderationService` 直连同实例,跨 schema 查询 `aichat.ai_descriptions` 验证存在性;`moderation_target_status` 写在 `topfans` schema。`aiChatService` 读路径在自己 schema 内 `SELECT ... FROM aichat.ai_descriptions d LEFT JOIN topfans.moderation_target_status mts ON mts.target_type='description_word' AND mts.target_id=d.id`。 -> -> **统一规则**:所有 moderation_* 表都在 `topfans` schema,跨 schema JOIN 是允许的(因为在同一 PG 实例)。如果未来拆分到不同 PG 实例,则需改用 Redis 缓存做跨库状态传递(见 2.2 节的 `moderation_counter_snapshot` 模式)。 +> **统一规则**:所有 moderation_* 表与 `moderation_target_status` 都在 `public` schema(与 `assets` / `users` 业务表同 schema),无跨 schema 访问——`moderationService` 直连 `topfans` 库 `public` schema 即可完成所有读写;业务服务读路径也只在 `public` 内做软删除过滤(无须 JOIN `moderation_target_status`)。 **孤儿记录清理(target 被删除时)**: -- `moderation_target_status` 与业务表(assets/users/ai_descriptions)跨服务,无外键约束,应用层负责清理 -- 在 `assetService` / `userService` / `aiChatService` 的删除逻辑中加清理钩子: +- `moderation_target_status` 与业务表(assets/users)跨服务,无外键约束,应用层负责清理 +- 在 `assetService` / `userService` 的删除逻辑中加清理钩子: ```go // 伪代码 defer func() { moderationService.DeleteTargetStatus(ctx, targetType, targetID) }() ``` -- 定期清理脚本(每日 1 次):扫描 `moderation_target_status` 中 `target_type='asset'` 且 `target_id` 在 `assets` 表不存在的记录,软标记 `is_hidden=false` 并写 admin_audit_logs +- 定期清理脚本(每日 1 次):扫描 `moderation_target_status` 中 `target_type='asset'` 且 `target_id` 在 `assets` 表不存在的记录,**写一条 `restore` 审计记录**并清理 `moderation_target_status` 孤儿行(不操作业务表) - 详情/历史记录保留在 `moderation_actions` 流水表中供审计追溯 ### 3.10 `admin_audit_logs` 管理员操作日志 ```sql -CREATE SEQUENCE admin_audit_logs_id_seq START WITH 10000; +CREATE SEQUENCE admin_audit_logs_id_seq START WITH 10000 OWNED BY admin_audit_logs.id; CREATE TABLE admin_audit_logs ( id BIGSERIAL PRIMARY KEY, @@ -416,13 +574,20 @@ CREATE TABLE admin_audit_logs ( action VARCHAR(50) NOT NULL, resource_type VARCHAR(30), resource_id BIGINT, - ip VARCHAR(50), + ip VARCHAR(500), -- 支持 IPv6 (45 字符) + X-Forwarded-For 多级代理链(实测 5 级 IPv6 代理链 ≈ 230 字符) user_agent VARCHAR(500), extra JSONB, - created_at BIGINT NOT NULL + created_at BIGINT NOT NULL, + CONSTRAINT chk_admin_audit_logs_resource_pair + CHECK ( + (resource_type IS NULL AND resource_id IS NULL) + OR (resource_type IS NOT NULL AND resource_id IS NOT NULL) + ) ); CREATE INDEX idx_admin_audit_logs_admin ON admin_audit_logs(admin_id, created_at DESC); -CREATE INDEX idx_admin_audit_logs_resource ON admin_audit_logs(resource_type, resource_id); +CREATE INDEX idx_admin_audit_logs_resource + ON admin_audit_logs(resource_type, resource_id, created_at DESC) + WHERE resource_id IS NOT NULL; ``` ### 3.11 Redis 数据结构 @@ -450,24 +615,26 @@ CREATE INDEX idx_admin_audit_logs_resource ON admin_audit_logs(resource_type, re ┌──────────────────────────────────┐ │ pending │ │ (待处理) │ - └─────┬─────────────┬──────────────┘ - 管理员认领 │ │ 阈值 N 触发 - ▼ ▼ - ┌──────────────────┐ ┌──────────────────┐ - │ reviewing │ │ auto_hidden │ - │ (审核中) │ │ (已自动隐藏) │ - └────┬────┬────┬───┘ └────┬─────────────┘ - 下架/封禁 │ │驳回│ 解除隐藏 │ 管理员认领 - /警告 │ │ │ ▼ - ▼ │ ▼ ┌──────────────────┐ - ┌──────┐ │ ┌──────────────┐ │ - │resolved│ │ │ dismissed │ │ - │(已处理)│ │ │ (已驳回) │ │ - └──────┘ │ └──────────────┘ │ - │ │ - └────→ resolved / dismissed + └─┬──────┬──────┬─────────┬───────┘ + 管理员认领 │ │ 阈值 N│快速驳回 │ 释放认领(回退) + ▼ ▼ 触发 ▼ ▲ + ┌──────────┐ ┌─────────────┐ ┌────────────┐ + │ reviewing│ │ auto_hidden │ │ dismissed │ + │ (审核中) │ │(已自动隐藏) │ │ (已驳回) │ + └─┬──┬──┬──┘ └──────┬──────┘ └────────────┘ + │ │ │ │ 管理员认领 + 下架/封禁/警告│ │驳回│解除隐藏 ▼ + ▼ │ ▼ ┌──────────┐ + ┌─────┐ │ ┌──────────────┐ │(回到 reviewing) + │resolved│ │ dismissed │ │ + │(已处理)│ │ (已驳回) │ │ + └─────┘ │ └──────────────┘ │ + │ │ + └─────→ resolved/dismissed ``` +> **图示说明**:本 ASCII 图简化展示主要迁移;完整 9 行迁移矩阵见下表。图中"释放认领"回退到 pending;"快速驳回"是 `pending → dismissed` 快速通道;"解除隐藏"是 `auto_hidden → reviewing → dismissed (恢复)`。 + | 状态 | 含义 | 进入 | 退出 | |------|------|------|------| | `pending` | 新提交待处理 | 创建 | 认领 OR 自动隐藏 | @@ -482,14 +649,22 @@ CREATE INDEX idx_admin_audit_logs_resource ON admin_audit_logs(resource_type, re |------|----|--------|----------|--------| | (init) | pending | 客户端/系统 | 提交举报 | 写 reports | | pending | reviewing | 后台 | 管理员点击"认领" | 抢锁 UPDATE | -| pending | auto_hidden | 系统 | Redis counter ≥ threshold | 写 reports + UPSERT mts(is_hidden=true) | -| auto_hidden | reviewing | 后台 | 管理员点击"认领" | 抢锁 UPDATE(被举报对象保持隐藏)| -| reviewing | resolved | 后台 | takedown/ban/warn | 写 mts + 通知被举报方 | -| reviewing | dismissed | 后台 | dismiss 且非 auto_hidden | 通知举报人 | -| reviewing | dismissed | 后台 | dismiss 且曾 auto_hidden | 解除隐藏 UPSERT mts(is_hidden=false) + 通知举报人 | -| resolved | (终态) | - | - | - | +| pending | auto_hidden | 系统 | Redis counter ≥ threshold | 业务表软删除 + 写 reports + UPSERT mts(last_action_type='autohide') | +| auto_hidden | reviewing | 后台 | 管理员点击"认领" | 抢锁 UPDATE(被举报对象保持软删除:is_active=false;**is_auto_hidden 保持 TRUE 不变**)| +| reviewing | resolved | 后台 | takedown/ban/warn | 写 mts(last_action_type 对应) + 通知被举报方 | +| reviewing | dismissed | 后台 | dismiss 且非 auto_hidden | UPSERT mts(last_action_type='dismiss') + 通知举报人 | +| reviewing | dismissed | 后台 | dismiss 且曾 auto_hidden | 业务表软删除恢复 + UPSERT mts(last_action_type='restore') + 通知举报人 | +| reviewing | dismissed | 后台 | dismiss 且曾 auto_hidden 但**保留隐藏** | UPSERT mts(last_action_type='dismiss')(不恢复业务表,保留 auto_hide 状态)+ 通知举报人 | +| pending | dismissed | 后台 | dismiss 无需 review(重复/明显误报快速通道) | UPDATE reports SET status='dismissed', resolved_action='dismiss', claimed_by=NULL, claimed_at=NULL, resolved_by=$admin_id, resolved_at=$now, updated_at=$now + UPSERT mts(last_action_type='dismiss') + 通知举报人 | +| reviewing | pending | 后台 | 释放认领(admin 主动放弃) | UPDATE reports SET status='pending', claimed_by=NULL, claimed_at=NULL, updated_at=$now;is_auto_hidden 标志保持不变(auto_hidden→reviewing→pending 仍保持业务表软删除)| +| resolved | (终态) | - | - | +| resolved | resolved (restore/unban) | 后台 | **解除 ban/takedown 误判**:把已 `resolved` (resolved_action='ban' or 'takedown') 的工单对应的 `users.is_active=true, deleted_at=NULL` 恢复 | **v2.5 CTE 条件写 mts**(避免无 op 时误导审计):
```sql
WITH user_unbanned AS (
UPDATE users SET is_active=true, deleted_at=NULL
WHERE id=$id AND is_active=false
RETURNING id
), report_updated AS (
UPDATE reports SET resolved_action='restore',
resolution_note='unban: ' \|\| $note,
resolved_by=$admin_id, resolved_at=$now
WHERE id=$id AND status='resolved' AND resolved_action IN ('ban','takedown')
RETURNING id
)
-- **关键:仅当 user_unbanned=1(实际解了 user)才写 mts restore**
INSERT INTO moderation_target_status (target_type, target_id, last_action_type, source, operator_admin_id, reason, created_at, updated_at)
SELECT 'user_profile', $id, 'restore', 'admin', $admin_id, 'unban: ' \|\| $note, $now, $now
WHERE EXISTS (SELECT 1 FROM user_unbanned);
-- 写流水(无论 user 是否真解,都记此次 admin 动作)
INSERT INTO moderation_actions (report_id, admin_id, action_type, target_type, target_id, note, success, created_at)
VALUES ($id, $admin_id, 'restore', 'user_profile', $id,
'unban: ' \|\| $note \|\| ' (user_unbanned=' \|\| (SELECT count(*) FROM user_unbanned) \|\| ')', TRUE, $now);
```
行为分支:
- user_unbanned=1(实际解 user)+ report_updated=1 → 完整 unban,mts+流水双写
- user_unbanned=0(user 已 active)+ report_updated=1 → **只写流水,不写 mts**(避免 "明明不是我解的" 误导审计)
- report_updated=0(status 不在 ['ban','takedown'])→ 50014 状态机非法迁移 | +| pending | withdrawn | 客户端 | 撤回误报(`DELETE /api/v1/moderation/reports/{id}`,仅 reporter_id=本人)| UPDATE reports SET status='withdrawn', updated_at=$now WHERE id=$id AND status='pending' AND reporter_id=$current_user; 写 moderation_actions(action_type='withdraw', admin_id=$current_user, report_id=$id)| +| pending | archived | 系统 cron | 6.5 cron 90 天未处理自动 archive | UPDATE reports SET status='archived', updated_at=$now, resolution_note='auto-archived: pending > 90 days' WHERE status='pending' AND created_at < now-90d; 6.5 cron SQL 完整版见阶段 6.5 | - | | dismissed | (终态) | - | - | - | +> **pending → dismissed 快速通道**:用于"同一用户对同一对象重复举报"或"明显不在分类范围内的误报"——管理员可在不认领的情况下直接驳回;状态机仍记录在迁移矩阵中,与 6.2 流程保持一致。 + **并发认领防护**: ```sql UPDATE reports @@ -531,9 +706,9 @@ WHERE id = ? AND status IN ('pending', 'auto_hidden') |------|------|------| | `pending` | 创建 | 初始 | | `reviewing` | 认领 | | -| `replied` | 填写 `reply_content` | 终态,触发用户通知 | -| `closed` | 点击关闭 | 终态,重复/无效 | -| `archived` | 归档 | 终态,已处理保留记录 | +| `replied` | 填写 `reply_content` | **终态,不可再认领/关闭/归档**(4.2 状态机无出边;YAGNI 不含 reopen 流程)。如需追加信息,用户须创建新反馈 | +| `closed` | 点击关闭 | **终态**,重复/无效(仅从 `reviewing` 入口,与 6.3 close SQL 一致)| +| `archived` | 归档 | **终态**,已处理保留记录(仅从 `reviewing` 入口;v2.0 archive SQL 不接受 `replied` 分支)| --- @@ -570,21 +745,66 @@ WHERE id = ? AND status IN ('pending', 'auto_hidden') "code": 200, "data": { "report_id": 67890, - "status": "pending", + "status": "auto_hidden", "auto_hidden": true, "target_hidden": true, + "claimed_by": null, + "claimed_at": null, "created_at": 1718123456789 } } ``` +> **字段说明**: +> - `status` 反映提交后**实际 DB 状态**(可能为 `pending` 或 `auto_hidden`,与 `auto_hidden` 布尔联动) +> - `auto_hidden` 布尔冗余于 `status=='auto_hidden'`,保留为前端易读字段 +> - `target_hidden` 表示"本次 auto-hide **是否执行了** UPDATE assets/users SET is_active=false"(**不是**"目标当前是否被隐藏");当目标已因前次下架/封禁 `is_active=false` 时,本次 auto-hide 是 no-op,`target_hidden=false` 但 `status='auto_hidden'` +> - `claimed_by` / `claimed_at` 新工单始终为 `null`(与 50008 响应体字段命名一致) +> - `created_at` / `claimed_at` 为 Unix 毫秒(参见 3 节约定) + **错误响应**: ```json -{ "code": 50004, "message": "您已举报过该对象,请等待处理" } +{ "code": 50004, "message": "您已举报过该对象(未结案,同一举报人对同一对象同一类型只能有一条未结案举报)" } ``` +> **客户端编辑/撤回**(v2.4 修订): +> - `PUT /api/v1/moderation/reports/{id}` body `{description: "...", category_code: "...", evidence_keys: [...]}`——v2.4 允许改 **`description` + `category_code` + `evidence_keys`**(之前 v2.3 只允许改 description,category_code 误选无解);仅当 `status='pending'` 且 `reporter_id=current_user`;返回 50019("非 pending 状态不可编辑")否则 +> - `DELETE /api/v1/moderation/reports/{id}`——软删除:`UPDATE reports SET status='withdrawn', updated_at=$now WHERE id=$id AND status='pending' AND reporter_id=$current_user`;**v2.4 不增 `withdrawn_at` 列**(与 `updated_at` 冗余;`status='withdrawn'` + `updated_at` 已携带完整时间信息);写 `moderation_actions.action_type='withdraw'`(v2.4 新增此 action_type) +> - 用途:账号被盗 / 误点错分类 / 撤销误报 + > **证据上传**:客户端先调用 `GET /api/v1/assets/oss/signature?type=asset` 直传 OSS,再把返回的 `key` 提交给本接口。 +**提交反馈请求体**(`POST /api/v1/moderation/feedbacks`): +```json +{ + "category_code": "bug", + "title": "反馈标题", + "content": "详细描述", + "contact": "user@example.com", + "is_anonymous": false, + "evidence_keys": ["feedback/2026/06/11/uuid1.png"] +} +``` + +**响应**: +```json +{ + "code": 200, + "data": { + "feedback_id": 12345, + "status": "pending", + "claimed_by": null, + "claimed_at": null, + "created_at": 1718123456789 + } +} +``` + +> **字段说明**: +> - `feedbacks` 没有 `auto_hidden` 机制(无阈值触发),新工单 status 始终为 `pending` +> - `claimed_by` / `claimed_at` 新反馈始终为 `null`(admin 认领后 GET 详情才非 null) +> - `created_at` 为 Unix 毫秒(参见 3 节约定) + ### 5.2 后台 API(Vue3 后台调用,路径前缀 `/api/admin/moderation`) | Method & Path | 说明 | @@ -594,9 +814,13 @@ WHERE id = ? AND status IN ('pending', 'auto_hidden') | `POST /api/admin/moderation/reports/{id}/claim` | 认领 | | `POST /api/admin/moderation/reports/{id}/release` | 释放认领 | | `POST /api/admin/moderation/reports/{id}/actions` | 执行审核动作 | +| **`POST /api/admin/moderation/reports/bulk-dismiss`**(v2.3)| 批量驳回 spam:body `{report_ids: [1,2,3...], reason: "spam_ring"}`,幂等返回成功数(防御多账号 spam 攻击)| +| **`POST /api/admin/moderation/reports/{id}/force-release`**(v2.3)| 强制释放他人认领(admin crash 后回收用),写 `moderation_actions.note='force_release: '` | +| **`POST /api/admin/moderation/reports/{id}/force-release`** SQL(v2.5 完整化)| 6.2 子段新增 ——
```sql
-- 1. 释放认领(不限 claimed_by,允许任何 admin 强制回收)
UPDATE reports
SET status='pending', claimed_by=NULL, claimed_at=NULL, updated_at=$now
WHERE id=$id AND status='reviewing';
-- 0 rows → 50009(status 已被 dismiss/resolve)
-- 2. 写流水(v2.5:v2.3 只说 "写 note" 但没 SQL)
INSERT INTO moderation_actions
(report_id, admin_id, action_type, target_type, target_id,
note, success, created_at)
VALUES
($id, $operator_admin_id, 'force_release', $target_type, $target_id,
'force_release: ' \|\| $reason, TRUE, $now);
-- 3. 写 admin_audit_logs(v2.5 补全 v2.3 缺漏)
INSERT INTO admin_audit_logs
(admin_id, action, resource_type, resource_id, ip, user_agent, extra, created_at)
VALUES
($operator_admin_id, 'force_release', 'report', $id, $ip, $ua,
jsonb_build_object('previous_claimed_by', $previous_claimed_by, 'reason', $reason),
$now);
-- 4. 通知原 claimer(v2.5 补全)
-- `report_force_released_notice` 模板发给原 claimer:"工单 X 已被 admin ${operator} 强制释放"
```
注:force-release 是 "打破锁",任何 admin 都可执行;原 claimer 不需要同意(事故响应)| | `GET /api/admin/moderation/feedbacks?status=&category=&keyword=&page=&page_size=` | 反馈列表 | | `GET /api/admin/moderation/feedbacks/{id}` | 反馈详情 | | `POST /api/admin/moderation/feedbacks/{id}/claim` | 认领反馈 | +| `POST /api/admin/moderation/feedbacks/{id}/release` | 释放认领 | | `POST /api/admin/moderation/feedbacks/{id}/reply` | 回复(→ replied)| | `POST /api/admin/moderation/feedbacks/{id}/close` | 关闭 | | `POST /api/admin/moderation/feedbacks/{id}/archive` | 归档 | @@ -631,20 +855,53 @@ gateway → moderationService.SubmitReport() ├─ 0. 限流检查:每用户每天 ≤ 30 次(Redis INCR `mod:rl:report:user:{user_id}:{yyyymmdd}`) │ 超限 → 返回 50012 ├─ 1. 验证:target_type 合法、分类启用、description ≤ 500 字、evidence ≤ 5 张 - ├─ 2. 验证:目标对象存在(assetService.GetAssetRPC / userService.GetUserRPC / aichat.ai_descriptions) - ├─ 2.5 自举报拦截:reporter_id != owner_id(target) → 否则返回 50011 + ├─ 2. 验证:目标对象存在(assetService.GetAssetRPC / userService.GetUserRPC) + ├─ 2.5 自举报拦截:target_type='asset' → reporter_id != asset.owner_uid;target_type='user_profile' → reporter_id != target_id(即不能举报自己);命中则返回 50011 ├─ 3. 防重复检查:同 (reporter, target, type) 在 pending/reviewing/auto_hidden 已有? │ 有 → 返回 50004 ├─ 4. 写入 reports 表(status='pending',snapshot 复用步骤 2 拿到的对象信息) + │ **必填 NULL**:`claimed_by=NULL, claimed_at=NULL`(`chk_reports_claimed_pair` 约束 `status<>'reviewing'` 时必须 NULL,**不可省略**——包括 `pending` 和 `auto_hidden` 状态) + │ **`star_id` 路由查询**(与目标对象 star 关联): + │ - `target_type='asset'` → `SELECT star_id FROM assets WHERE id=$target_id`,设 `reports.star_id` + │ - `target_type='user_profile'` → `SELECT identity_id FROM users WHERE id=$target_id`(或 NULL,取决于用户是否绑定明星) + │ - 目标对象不存在时 `star_id` 保持 NULL + │ - 注:`star_id` 是 denormalized 副本,跨表无 FK(参见 3.4 注释) ├─ 5. 写 report_evidence(OSS keys,oss_url 由 OSS 签名接口的 response 预填) ├─ 6. Redis Lua 计数(独立用户才 INCR): │ 首次计数 → 检查 counter >= threshold (默认 5) - │ └─ 达到 → 触发自动隐藏: - │ ① UPDATE reports WHERE target=... AND status='pending' - │ SET status='auto_hidden', is_auto_hidden=true - │ ② UPSERT moderation_target_status - │ (target_type, target_id, is_hidden=true, source='auto', source_report_id=...) - │ ③ 发通知给被举报方:"您的内容被多人举报已自动隐藏" + │ └─ 达到 → 触发自动隐藏(**事务内双重写入**): + │ ① 业务表软删除(按 target_type 路由): + │ - target_type='asset' → UPDATE assets SET is_active=false, deleted_at=$now WHERE id=$id AND is_active=true + │ - target_type='user_profile' → UPDATE users SET is_active=false, deleted_at=$now WHERE id=$id AND is_active=true + │ - **v2.3 幂等性区分**:当 affected=0(目标已 `is_active=false`,no-op)—— 记入 `moderation_actions.action_type='autohide_noop'`,主指标 `moderation.report.auto_hidden.count` 不虚增(独立指标 `moderation.report.auto_hidden.noop.count` 记 no-op 次数) + │ ② UPDATE reports WHERE target_type=? AND target_id=? AND status='pending' + │ SET status='auto_hidden', is_auto_hidden=true, + │ triggered_auto_hide=(id=$trigger_report_id) + │ (仅 pending 升级为 auto_hidden,避免覆盖 reviewing/resolved;**v2.4 区分阈值触发者**: + │ `triggered_auto_hide` 字段——阈值跨过的那个 report 置 TRUE,其它连带升级的报告置 FALSE, + │ 便于审计 "哪个是触发者" vs "哪些是连带") + │ ③ UPSERT moderation_target_status + │ (target_type, target_id, last_action_type='autohide', source='auto', source_report_id=...) + │ ③.5 写 moderation_actions 流水(永久审计)—— **v2.4 改 conditional**: + │ IF ① 业务表 UPDATE affected_rows > 0 THEN + │ -- 实际执行了软删除 + │ INSERT INTO moderation_actions + │ (report_id, admin_id, action_type, target_type, target_id, + │ note, success, created_at) + │ VALUES + │ ($report_id, 0, 'takedown', $target_type, $target_id, + │ 'auto-hide threshold reached', TRUE, $now); + │ ELSE + │ -- no-op(目标已 is_active=false),记独立 action_type 不虚增主指标 + │ INSERT INTO moderation_actions + │ (report_id, admin_id, action_type, target_type, target_id, + │ note, success, created_at) + │ VALUES + │ ($report_id, 0, 'autohide_noop', $target_type, $target_id, + │ 'auto-hide no-op: target already is_active=false', TRUE, $now); + │ -- 注:admin_id=0 表示"系统自动"(v2.2 B4 CHECK admin_id>=0) + │ -- mts.last_action_type='autohide' 区分自动/人工来源 + │ ④ 发通知给被举报方:"您的内容被多人举报已自动隐藏" ├─ 7. 返回 {report_id, status, auto_hidden, target_hidden, created_at} ``` @@ -663,34 +920,136 @@ gateway → moderationService.SubmitReport() │ affected=1 才返回成功 │ ▼ + [可选] 释放认领 → POST /api/admin/moderation/reports/{id}/release + UPDATE reports SET status='pending', claimed_by=NULL, claimed_at=NULL, + updated_at=$now + WHERE id=? AND status='reviewing' AND claimed_by=$admin_id + -- 释放后回到 pending 工单池;如原状态是 auto_hidden 则仍保持业务表软删除 + │ + ▼ 查看证据、目标快照、举报人、流水 │ ▼ 执行动作 → POST /api/admin/moderation/reports/{id}/actions │ ├─ takedown(藏品/描述词/用户内容): - │ UPSERT moderation_target_status (is_hidden=true, source='admin', ...) - │ UPDATE reports SET status='resolved', resolved_action='takedown', ... + │ **事务内双重写入**: + │ ① 业务表软删除(按 target_type 路由到对应表): + │ - target_type='asset' → UPDATE assets SET is_active=false, deleted_at=$now WHERE id=$id AND is_active=true + │ - target_type='user_profile' → UPDATE users SET is_active=false, deleted_at=$now WHERE id=$id AND is_active=true + │ ② UPSERT moderation_target_status (last_action_type='takedown', source='admin', operator_admin_id=...) + │ ③ UPDATE reports SET status='resolved', resolved_action='takedown', ... │ 发通知给被举报方 │ ├─ ban(用户): - │ UPSERT moderation_target_status (is_banned=true, source='admin', ...) - │ UPDATE reports SET status='resolved', resolved_action='ban', ... - │ 发通知给被封禁用户 + │ **事务内双重写入**(与 takedown 结构一致): + │ ① 业务表软删除(仅 `target_type='user_profile'`): + │ - UPDATE users SET is_active=false, deleted_at=$now WHERE id=$id AND is_active=true + │ ② UPSERT moderation_target_status (last_action_type='ban', source='admin', operator_admin_id=...) + │ ③ UPDATE reports SET status='resolved', resolved_action='ban', ... + │ 行为等同 takedown 但语义标记为"封禁账号"——区别仅在通知文案(短信 + 站内信)+ 强制踢下线(清空 session/JWT 黑名单) │ - ├─ warn(用户): - │ UPSERT moderation_target_status (is_warned=true, source='admin', ...) - │ UPDATE reports SET status='resolved', resolved_action='warn', ... + ├─ warn(用户,不阻塞登录): + │ **不软删除 user**,仅写入警告状态(不修改 users.is_active): + │ ① UPSERT moderation_target_status + │ SET is_warned=true, warn_count=warn_count+1, last_warned_at=$now, + │ last_action_type='warn', source='admin', operator_admin_id=... + │ ② UPDATE reports SET status='resolved', resolved_action='warn', ... │ 发站内信给用户 │ - ├─ dismiss(驳回,状态机必经 reviewing): - │ 注意:auto_hidden 工单必须先被审核员认领(→ reviewing)才能 dismiss - │ 路径 auto_hidden → reviewing → dismissed: - │ ① UPSERT moderation_target_status (is_hidden=false, source='admin', ...) 解除隐藏 - │ ② UPDATE reports SET status='dismissed', resolved_action='dismissed', ... - │ 路径 pending/reviewing → dismissed(未触发自动隐藏): - │ 仅 ②,不动 moderation_target_status - │ 发通知给举报人:"您的举报已驳回" + │ **warn_cleared 流程**(清除警告但保留历史计数+时间戳;用于"申诉成功""警告过期"等场景): + │ - 适用:admin 主动解除某用户的警告状态,但保留 `warn_count` 累计和 `last_warned_at` 时间戳作为历史档案 + │ - **端点**:`POST /api/admin/moderation/users/{id}/clear-warn` body `{ reason: "...", send_notification: true }` + │ - **事务内双重写入**: + │ ① mts UPDATE: + │ ```sql + │ UPDATE moderation_target_status + │ SET is_warned=FALSE, last_action_type='warn_cleared', + │ operator_admin_id=$admin_id, reason=$reason, updated_at=$now + │ WHERE target_type='user_profile' AND target_id=$id AND is_warned=TRUE + │ ``` + │ ② 审计流水(`moderation_actions` + `admin_audit_logs`,**不关联任何 report/feedback**): + │ ```sql + │ INSERT INTO moderation_actions + │ (report_id, feedback_id, admin_id, action_type, target_type, target_id, + │ note, success, created_at) + │ VALUES + │ (NULL, NULL, $admin_id, 'restore', 'user_profile', $id, + │ 'warn_cleared: ' || $reason, TRUE, $now); + │ INSERT INTO admin_audit_logs + │ (admin_id, action, resource_type, resource_id, ip, user_agent, extra, created_at) + │ VALUES + │ ($admin_id, 'clear_warn', 'user', $id, $ip, $ua, + │ jsonb_build_object('warn_count', $prev_warn_count, 'last_warned_at', $prev_last_warned_at), + │ $now); + │ ``` + │ - 满足 `chk_mts_warn_fields` 第 3 子句(`is_warned=FALSE AND warn_count>=1 AND last_warned_at IS NOT NULL`) + │ - 注:此流程不影响 `reports` 状态机(仅清 mts 警告字段) + │ - **v2.2 CHECK 放宽**:`chk_moderation_actions_xor` 允许 `report_id` 和 `feedback_id` 同时为 NULL(用于 warn_cleared 这类无 ticket 关联的审计行)——改为 `(report_id IS NOT NULL) <> (feedback_id IS NOT NULL) OR (report_id IS NULL AND feedback_id IS NULL)`(新增 OR 分支) + │ + ├─ dismiss(驳回,三种迁移路径,见 4.1 状态机矩阵): + │ **路径 A:pending → dismissed(快速通道,无需 review)** + │ - 适用场景:明显误报 / 分类错误 / 重复举报 + │ - 权限:任意审核员(无需 claimed_by;`reports.claimed_by IS NULL`) + │ - 操作: + │ ① UPDATE reports SET status='dismissed', resolved_action='dismiss', + │ claimed_by=NULL, claimed_at=NULL, + │ resolved_by=$admin_id, resolved_at=$now, updated_at=$now + │ WHERE id=$id AND status='pending' + │ (**必填 NULL**:`chk_reports_claimed_pair` 约束 `status<>'reviewing'` 时 `claimed_by/claimed_at` 必须 NULL;与 6.1 step 4 INSERT 一致) + │ ② UPSERT moderation_target_status SET last_action_type='dismiss', source='admin' + │ (**前提**:mts.last_action_type != 'autohide';若原状态是 auto_hide,则跳过 UPSERT 保留审计) + │ ③ 发通知给举报人 + │ + │ **路径 B:reviewing → dismissed(普通驳回,从未触发自动隐藏)** + │ - 适用场景:审核员 review 后认为不违规 + │ - 前置:审核员已认领(status='reviewing', claimed_by=本人) + │ - 操作: + │ ① UPSERT moderation_target_status SET last_action_type='dismiss', source='admin' + │ ② UPDATE reports SET status='dismissed', resolved_action='dismiss', ... + │ ③ 发通知给举报人 + │ + │ **路径 C:auto_hidden → reviewing → dismissed(恢复被自动隐藏的对象)** + │ - 适用场景:审核员 review 后判定为误报,需恢复对象 + │ - 前置:审核员已认领;原状态 is_auto_hidden=TRUE + │ - **事务内三重写入 + Redis 计数重置**: + │ ① 业务表软删除恢复(按 target_type 路由): + │ - target_type='asset' → UPDATE assets SET is_active=true, deleted_at=NULL WHERE id=$id AND is_active=false + │ - target_type='user_profile' → UPDATE users SET is_active=true, deleted_at=NULL WHERE id=$id AND is_active=false + │ ② UPSERT moderation_target_status SET last_action_type='restore', source='admin' + │ ②.5 **v2.3 批量清理同 target 老 auto_hidden 工单**(防数据膨胀): + │ UPDATE reports SET status='dismissed', resolved_action='dismiss', + │ resolved_by=$admin_id, resolved_at=$now, updated_at=$now, + │ resolution_note='bulk cleanup after path C restore' + │ WHERE target_type=$target_type AND target_id=$target_id + │ AND status='auto_hidden' AND id != $report_id + │ —— 避免"admin 判决不违规后老 auto_hidden 工单僵尸" + │ ③ UPDATE reports SET status='dismissed', resolved_action='dismiss', ... + │ ④ **Redis 计数重置**(admin 判决"不违规"应清零风险信号): + │ - `DEL mod:report:counter:{target_type}:{target_id}`(counter 归零) + │ - `SCAN MATCH mod:report:user:{target_type}:{target_id}:* | DEL`(user_marker 通配清理——**Redis DEL 不支持通配**,必须 SCAN 出 keys 再逐个 DEL;伪代码见下) + │ - `DEL mod:report:lock:{target_type}:{target_id}`(释放锁,幂等) + │ ```go + │ // Go 伪代码(moderationService 通过 Redis 客户端批量清理 user_marker) + │ iter := redis.Scan(ctx, 0, "mod:report:user:"+tt+":"+tid+":*", 100).Iterator() + │ for iter.Next(ctx) { + │ redis.Del(ctx, iter.Val()) + │ } + │ ``` + │ ⑤ 发通知给举报人 + 被举报方 + │ - **设计决策**:path C 主动重置计数 = "admin 否定所有过往举报";如 admin 想保留历史风险信号(保守派),用 path D 不重置 + │ + │ **路径 D:auto_hidden → reviewing → dismissed(不恢复,保留隐藏状态)** + │ - 适用场景:审核员 review 后虽认定不违规但认为内容有争议,保留隐藏 + │ - 前置:审核员已认领;原状态 is_auto_hidden=TRUE + │ - 操作: + │ ① UPSERT moderation_target_status SET last_action_type='dismiss', source='admin' + │ (**不恢复业务表软删除**;业务表的 `is_active=false, deleted_at=$now` 保持原状;mts 仅审计 last_action_type='dismiss') + │ ② UPDATE reports SET status='dismissed', resolved_action='dismiss', ... + │ ③ 发通知给举报人 + │ - **审计说明**:`last_action_type='dismiss'` 会**覆盖**之前的 `last_action_type='autohide'` 记录。完整的 auto_hide → review → dismiss 历史需通过 `moderation_actions` 表按 `report_id` + `created_at` 时序回溯;`moderation_target_status` 仅保留"最近一次动作"快照。 + │ + │ 共同写 moderation_actions 流水 + admin_audit_logs │ └─ 写 moderation_actions 流水 + admin_audit_logs ``` @@ -707,18 +1066,32 @@ gateway → moderationService.SubmitReport() 认领 → POST /api/admin/moderation/feedbacks/{id}/claim │ UPDATE feedbacks SET status='reviewing', updated_at=now │ WHERE id=? AND status='pending'(并发认领防护同举报) + │ -- 0 行匹配时由 handler 区分错误码: + │ -- - 此前 status='reviewing' 且 claimed_by<>本人 → 50008(已被他人认领) + │ -- - 此前 status IN ('replied','closed','archived') → 50009(已结案/终态) ▼ ├── [可选] 释放 → POST /api/admin/moderation/feedbacks/{id}/release - │ UPDATE feedbacks SET status='pending', replied_by=NULL WHERE id=? AND status='reviewing' + │ UPDATE feedbacks SET status='pending', claimed_by=NULL, claimed_at=NULL + │ WHERE id=? AND status='reviewing' AND claimed_by=$admin_id -- 仅本人可释放 │ ├── 回复 → POST /api/admin/moderation/feedbacks/{id}/reply │ body: { content: "..." } - │ UPDATE feedbacks SET status='replied', reply_content=?, replied_by=?, replied_at=now + │ UPDATE feedbacks SET status='replied', reply_content=?, replied_by=?, replied_at=now, + │ claimed_by=NULL, claimed_at=NULL -- 终态清认领人,避免与 `replied_by` 重复 │ 发通知给反馈人 │ - ├── 关闭 → POST .../close → status='closed'(终态,重复/无效) + ├── 关闭 → POST .../close + │ UPDATE feedbacks SET status='closed', closed_by=$admin_id, closed_at=$now, + │ claimed_by=NULL, claimed_at=NULL -- 终态清认领人(chk_feedbacks_claimed_pair 强约束) + │ WHERE id=? AND status='reviewing' AND claimed_by=$admin_id + │ -- close 必须在 reviewing 状态(管理员已认领);与 dismiss-pending 快速通道不同,反馈不允许跳过 reviewing 直接关闭 │ - └── 归档 → POST .../archive → status='archived'(终态) + └── 归档 → POST .../archive + UPDATE feedbacks SET status='archived', archived_by=$admin_id, archived_at=$now, + claimed_by=NULL, claimed_at=NULL + WHERE id=? AND status='reviewing' AND claimed_by=$admin_id + -- 仅本人可归档;reviewing 状态必 claimed_by 非空(chk_feedbacks_claimed_pair 约束) + -- 注意:archive 仅从 reviewing 入口;replied 已是终态不可再 archive(与 4.2 状态机"replied | 终态"一致) ``` ### 6.4 自动隐藏 Lua 脚本 @@ -741,7 +1114,24 @@ end return {0, n} ``` -返回 `{triggered, count}`:triggered=1 时上层触发自动隐藏。`lock` 不在脚本内,由应用层在调用 EVAL 之前 `SET key 1 NX EX 5` 抢占。 +返回 `{triggered, count}`:triggered=1 时上层触发自动隐藏。`lock` 不在脚本内,由应用层**完整生命周期**管理: + +```go +// 伪代码 +ok, _ := redis.SetNX(ctx, "mod:report:lock:"+targetType+":"+targetID, "1", 5*time.Second) +if !ok { return } // 5s 内已有并发请求在跑,本次直接放弃 +defer redis.Del(ctx, "mod:report:lock:"+targetType+":"+targetID) // 显式释放(5s TTL 兜底) + +triggered, count := redis.Eval(ctx, luaScript, ...) +// 若 triggered=1:进入"事务内双重写入"(业务表软删除 + reports UPDATE + mts UPSERT) +// 任何一步失败:整体事务回滚,defer 仍会 DEL 锁 +``` + +**锁的语义**: +- 锁覆盖**整个自动隐藏流程**(Lua 计数 + 业务表软删除 + 事务回滚),不是单次 EVAL +- `defer DEL` 是显式释放,正常路径在 ~100ms 内完成,远小于 5s TTL +- 5s TTL 是**兜底**——若服务崩溃未 DEL,5s 后自动失效,下次请求可重入 +- `mod:report:lock:*` 与 `mod:report:counter:*` 的 key 命名层级一致,便于 Redis 监控(`redis-cli --scan --pattern 'mod:report:*'`) --- @@ -752,27 +1142,43 @@ return {0, n} | 50001 | 举报分类不存在或已停用 | 400 | | 50002 | 反馈分类不存在或已停用 | 400 | | 50003 | 目标对象不存在 | 404 | -| 50004 | 同一对象已举报过(未结案)| 429 | +| 50004 | 您已举报过该对象(未结案,同一举报人对同一对象同一类型只能有一条未结案举报)| 429 | | 50005 | 描述过长(>500 字)| 400 | | 50006 | 证据图超限(>5 张)| 400 | | 50007 | 工单不存在 | 404 | | 50008 | 工单已被他人认领 | 409 | -| 50009 | 工单已结案 | 400 | +| | **响应体**:`{ code, message, claimed_by, claimed_at }`——`claimed_by` 是 admin_id(与 `reports`/`feedbacks` 列名一致),`claimed_at` 是 Unix 毫秒(参见 3 节约定);后台可二次查询 admin nickname 用于 UI 展示"已被 X 认领" | | | +| 50009 | 工单已结案(终态不可再操作,如对 `resolved`/`dismissed`/`archived` 工单再次操作)| 400 | | 50010 | 管理员权限不足 | 403 | | 50011 | 不能举报自己 | 400 | | 50012 | 提交过于频繁(限流)| 429 | +| | **响应体**:`{ code, message, scope: "user"|"ip"|"device", limit: 30|200 }`(v2.5 新增)—— 前端可显示 "今日已提交 X 次(user 限 30/ip 限 200/device 限 200)",精准定位哪个维度超限 | | | | 50013 | 反馈每日提交超限 | 429 | -| 50014 | 状态机非法迁移(如对已结案工单再次操作)| 409 | +| 50014 | 状态机非法迁移(如 `pending → archived` 跳过 reviewing)| 409 | +| | **响应体**:`{ code, message, current_status: "pending"|"reviewing"|"auto_hidden"|"resolved"|"dismissed", suggested_action: "re_claim"|"wait_for_admin"|"contact_support" }`(v2.5 新增)—— race 后 admin A 拿到的不是 50008("已被他人认领")而是 50014("工单已被释放或结案,请 re-claim 后再操作"),前端按 `current_status` 智能提示 | | | | 50015 | 管理员未登录 / Token 失效 | 401 | +| **50016**(v2.3)| 举报对象类型不支持(`target_type` 不在白名单 `{'asset','user_profile'}`)| 400 | +| **50017**(v2.3)| 回复 / 备注 必填路径(path C/D/E 选 dismiss/unban 时需填 `reason`)| 400 | +| **50018**(v2.3)| 证据图超限(单图 > 5MB / MIME 非 png/jpeg)| 400 | +| **50019**(v2.3)| 举报不可编辑(仅 `status='pending'` 可改 `description`)| 409 | + +> **50008 vs 50009 判定顺序**(v2.3 明确): +> - 客户端发 claim/reply/close/archive,0 行匹配时 handler 二次 `SELECT` 查当前状态: +> 1. 记录不存在(`id` 未找到)→ 50007 "工单不存在" +> 2. `status='reviewing'` 且 `claimed_by<>本人` → 50008 "工单已被他人认领"(响应体含 `claimed_by` / `claimed_at`,见 50008 行) +> 3. `status IN ('replied','closed','archived')`(反馈)/ `('resolved','dismissed')`(举报)→ 50009 "工单已结案" +> 4. `status='reviewing'` 且 `claimed_by=本人` → 200 幂等成功(re-claim 同人) +> 5. `status='pending'` + 请求非 claim(如 takedown)→ 50014 状态机非法迁移(pending → resolved 跳过 reviewing)| --- ## 8. 通知机制 -复用 `notificationService` 模块,注册 5 个模板: +复用 `notificationService` 模块,注册 6 个模板: | 事件 | 接收方 | 模板名 | 渠道 | |------|--------|--------|------| +| 举报达到阈值触发自动隐藏 | 被举报方 | `report_auto_hidden_notice` | 站内信 | | 举报状态变更为 resolved/dismissed | 举报人 | `report_resolved` | 站内信 + 通知中心 | | 举报成立 + takedown | 被举报方 | `report_takedown_notice` | 站内信 | | 举报成立 + ban | 被举报用户 | `report_ban_notice` | 站内信 + 短信 | @@ -780,6 +1186,8 @@ return {0, n} | 反馈被回复 | 反馈人 | `feedback_replied` | 站内信 + 通知中心 | > 模板字段:`{reporter_nickname, target_type, target_id, action, reason, related_url}` +> +> **模板复用说明**:`report_resolved` 同时覆盖 `resolved` 和 `dismissed` 两种终态(消息体根据 `resolved_action` 区分"已下架/已封禁/已驳回");如未来需文案差异化,可拆分为 `report_resolved_notice` + `report_dismissed_notice` 两模板(v1.8 评估)。 --- @@ -793,12 +1201,17 @@ return {0, n} | 防 Redis 计数重复 | Lua 脚本用 `user_marker` SETNX 保证独立用户才 INCR | | 防自动隐藏并发 | Redis 短锁 `mod:report:lock:*` 5s + DB 幂等 SQL(仅 pending → auto_hidden)| | 证据图校验 | OSS 签名接口限定目录 `report/` 和 `feedback/` 前缀 | +| **证据图大小/类型**(v2.4 修订)| **moderationService 不能直接校验**(证据图通过 `GET /api/v1/assets/oss/signature?type=asset` 拿 presigned URL 后**客户端直传 OSS**,moderationService 只收到 `key` 字符串,不见字节)。校验在 **OSS bucket policy 层**实施:单图 ≤ 5MB / MIME 限 `image/png` `image/jpeg` / OSS 返回 4xx 时客户端应捕获并**不**提交 report;服务端 9.1 仍 50018 作为**防御纵深**(客户端篡改 key 提交,提交时校验 `evidence_keys` 字符串格式与 `report/` 前缀,但**不**二次校验大小/MIME——OSS 已校验)。监控指标 `moderation.oss.evidence_upload_failed.count`(OSS 4xx 响应)| | 描述长度 | 服务端校验 ≤ 500 字(DB 字段 VARCHAR(500))| | 证据图数量 | 服务端校验 ≤ 5 张 | -| 匿名保护 | `is_anonymous=true` 时:`reporter_id` 仍记录但 API 响应中不返回给被举报方;后台仅对超级管理员可见 | +| 匿名保护 | `is_anonymous=true` 时:`reporter_id` 仍记录但 API 响应中不返回给被举报方(**仅对被举报方匿名**);**后台所有审核员可见** `reporter_id`(1.3 范围"仅一种角色"——不存在超级管理员;如需审核员侧也匿名,需解除 YAGNI 限制并新增 super_admin 角色)| | 自举报拦截 | 提交举报时校验 `reporter_id != owner_id(target)`,命中则返回 50011 | +| **IP 限流**(v2.3)| 每 IP 每天 ≤ 200 次举报(Redis 计数 `mod:rl:report:ip:{ip}:{yyyymmdd}`,TTL 36h);与 user_id 限流 `AND` 语义(任一超限即 50012)—— 防御多账号 spam 攻击 | +| **Device fingerprint 限流**(v2.3)| 每设备指纹每天 ≤ 200 次举报(`mod:rl:report:device:{fp}:{yyyymmdd}`);同上 `AND` 语义 | +| **star_id stale 容忍**(v2.3)| `reports.star_id` 是 denormalized 副本,跨表无 FK;star binding 转移后 reports.star_id 不回溯更新 | | 全局限流(举报) | 每用户每天 ≤ 30 次举报(Redis 计数 `mod:rl:report:user:{user_id}:{yyyymmdd}`,TTL 36h);超限返回 50012 | | 全局限流(反馈) | 每用户每天 ≤ 5 条反馈(Redis 计数 `mod:rl:feedback:user:{user_id}:{yyyymmdd}`,TTL 36h);超限返回 50013 | +| **Claim 超时自动释放**(v2.3)| 15 分钟未操作的 `reviewing` 工单由 cron 任务自动回退到 `pending`:`UPDATE reports SET status='pending', claimed_by=NULL, claimed_at=NULL WHERE status='reviewing' AND claimed_at < now() - INTERVAL '15 minutes'`;监控指标 `moderation.reports.claim_timeout.count` | ### 9.2 数据隔离 @@ -811,22 +1224,55 @@ return {0, n} - `reports` / `feedbacks` 永久保留(合规需要) - `moderation_actions` 永久保留(审计) - `moderation_target_status` UPSERT 保留最新状态,历史可查 `moderation_actions` +- **PII 匿名化**(v2.3 新增):`feedbacks.contact` 字段(邮箱/手机/微信)在 `status IN ('closed','archived')` 后 **90 天** 自动匿名化为 `NULL`,由每日 cron 执行:`UPDATE feedbacks SET contact=NULL WHERE status IN ('closed','archived') AND updated_at < now() - INTERVAL '90 days' AND contact IS NOT NULL`;监控 `moderation.feedback.pii_anonymized.count`;与 GDPR / 中国《个人信息保护法》"最小必要 + 限期保存"原则一致 --- ## 10. 实施步骤 ### 阶段 1:数据库(topfans 库) -- 1.1 写迁移 `D:\shanghai\topfans\backend\migrations\2026_06_11_010_moderation_tables.sql` -- 1.2 包含 8 张表 + 索引 + 默认分类种子数据 +- 1.1 写迁移 `backend/migrations/2026_06_11_011_moderation_tables.sql`(接续 `2026_06_08_010_statistic_partitions_initial.sql` 编号 010,次日首个新文件应为 011) + - 严格遵守 `YYYY_MM_DD_NNN_` 三位编号递增约定 +- 1.2 包含 9 张表 + 索引 + 默认分类种子数据 - 1.3 末尾必须 `SELECT setval('xxx_id_seq', (SELECT MAX(id) FROM xxx))`(CLAUDE.md 强制) -- 1.4 在 `backend/scripts/` 加 Go 脚本生成种子数据(带序列重置) +- 1.4 测试数据脚本(可选):在 `backend/scripts/` 加 Go 脚本生成额外测试数据;如 SQL 迁移已含种子数据则跳过 ### 阶段 2:Go moderationService(topfans) -- 2.1 `D:\shanghai\topfans\backend\services\moderationService\` 新建目录 - - `main.go` / `config/` / `repository/` / `service/` / `provider/` / `client/` / `go.mod` / `start.sh` +- 2.1 `backend/services/moderationService/` 新建目录 + - `main.go` / `config/` / `repository/` / `service/` / `provider/` / `client/` / `start.sh` / `configs/dubbo.yaml` / `go.mod` - 复用 socialService 类似的分层 -- 2.2 `D:\shanghai\topfans\backend\proto\moderation\moderation.proto` + - 端口:`PORT=20010`(接续 aiChatService 20008 + 2) + - `start.sh` 模板(参考 `services/socialService/start.sh`): + ```bash + #!/usr/bin/env bash + export SERVICE_NAME=moderation-service + export PORT=${PORT:-20010} + export DB_HOST=${DB_HOST:-localhost} + export DB_PORT=${DB_PORT:-15432} + export DB_USER=${DB_USER:-postgres} + export DB_PASSWORD=${DB_PASSWORD:-123456} + export DB_NAME=${DB_NAME:-top-fans} + export DB_SSLMODE=${DB_SSLMODE:-disable} + export REDIS_HOST=${REDIS_HOST:-localhost} + export REDIS_PORT=${REDIS_PORT:-6379} + export REDIS_PASSWORD=${REDIS_PASSWORD:-123456} + export REDIS_DB=${REDIS_DB:-0} + export DUBBO_USER_SERVICE_URL=${DUBBO_USER_SERVICE_URL:-tri://localhost:20000} + export DUBBO_ASSET_SERVICE_URL=${DUBBO_ASSET_SERVICE_URL:-tri://localhost:20003} + export DUBBO_NOTIFICATION_SERVICE_URL=${DUBBO_NOTIFICATION_SERVICE_URL:-tri://localhost:20008} + exec ./moderation-service + ``` + - `configs/dubbo.yaml` 模板(参考 `services/socialService/configs/dubbo.yaml`): + ```yaml + application: + name: moderation-service + protocol: + name: tri + port: 20010 + registry: + address: nacos://${NACOS_ADDR:-localhost:8848} + ``` +- 2.2 `backend/proto/moderation/moderation.proto`(项目根 `proto/` 集中管理) - `SubmitReportRequest/Response` - `ListMyReportsRequest/Response` - `GetReportRequest/Response` @@ -835,24 +1281,29 @@ return {0, n} - `ListMyFeedbacksRequest/Response` - `GetFeedbackRequest/Response` - `GetFeedbackCategoriesRequest/Response` -- 2.3 `D:\shanghai\topfans\backend\pkg\proto\moderation\` 编译生成 `.pb.go` -- 2.4 `D:\shanghai\topfans\backend\pkg\models\moderation.go` ORM 模型 -- 2.5 `D:\shanghai\topfans\backend\services\moderationService\repository\moderation_repository.go` 数据访问 -- 2.6 `D:\shanghai\topfans\backend\services\moderationService\service\`: - - `report_service.go` +- 2.3 `backend/pkg/proto/moderation/` 编译生成 `moderation.pb.go` + `moderation.triple.go`(参考 `pkg/proto/social/` 已生成的产物;`.triple.go` 是 Dubbo Triple 协议 stub,缺它 RPC 客户端无法生成) +- 2.4 `backend/pkg/models/moderation.go` ORM 模型(socialService 共享 pkg 模式) +- 2.5 `backend/services/moderationService/repository/moderation_repository.go` + `moderation_repository_test.go`(testcontainers 集成测试) +- 2.6 `backend/services/moderationService/service/`: + - `report_service.go`(含 6.2 事务内双重/三重写入 helper) - `feedback_service.go` - `category_service.go` - - `auto_hide_service.go`(含 Redis Lua 脚本) -- 2.7 `D:\shanghai\topfans\backend\services\moderationService\client\`: + - `auto_hide_service.go`(含 Redis Lua 脚本 `//go:embed` 加载) + - `transaction_helper.go`(封装 `WithTx(ctx, func(tx *gorm.DB) error)`,业务表+mts+reports 原子性保证) +- 2.7 `backend/services/moderationService/client/`: - `asset_client.go`(验证目标存在) - `user_client.go`(验证用户/封禁查询) -- 2.8 `D:\shanghai\topfans\backend\services\moderationService\provider\social_provider.go` Dubbo 注册 -- 2.9 `D:\shanghai\topfans\backend\go.work` 加入新服务 + - `notification_client.go` **(v1.5: 阶段 2 仅写 stub,阶段 7.1 替换为真实实现——见 M7)** + - `redis_client.go`(Redis 客户端初始化,参考 aiChatService `main.go`) +- 2.8 `backend/services/moderationService/provider/moderation_provider.go` Dubbo 注册(**v1.5: 改名与本服务对齐,**之前误用 `social_provider.go`) +- 2.9 `backend/go.work` 加入新服务 + `docker/Dockerfile.services` 加 `moderationservice` 构建行 + `docker/docker-compose.local.yml` + `docker-compose.prod.yml` 加服务定义 + `Makefile` 加 `start-moderationservice` 目标 - 2.10 Gateway 层: - - `D:\shanghai\topfans\backend\gateway\controller\moderation_controller.go` - - `D:\shanghai\topfans\backend\gateway\dto\moderation_dto.go` - - `D:\shanghai\topfans\backend\gateway\dto\moderation_converter.go` - - `D:\shanghai\topfans\backend\gateway\router\router.go` 注册 `/api/v1/moderation/*` + - `backend/gateway/controller/moderation_controller.go` + `func NewModerationController(cli *client.Client) (*ModerationController, error)` 工厂方法 + - `backend/gateway/dto/moderation_dto.go` + - `backend/gateway/dto/moderation_converter.go`(RPC pb ↔ HTTP DTO 字段映射) + - `backend/gateway/client/moderation_client.go`(gateway 端调用本服务的 Dubbo client) + - `backend/gateway/router/router.go` 注册 `/api/v1/moderation/*`(**仅客户端路由**;后台 `/api/admin/*` 由 FastAPI 处理,见阶段 3) +- 2.11 服务可观测性:`backend/services/moderationService/main.go` 暴露 `promhttp.Handler()` 在 `:20010/metrics`(注册 5+ 个指标,详见 11.3) **Gateway 路由配置清单**(在 `router.go` 新增): ```go @@ -874,19 +1325,25 @@ v1.GET("/moderation/feedbacks/:id", moderationController.GetFeedbackDetail) **Dubbo 服务注册**:`moderationService` 启动时通过 `provider/social_provider.go`(参考 socialService 模式)注册到 ZooKeeper/Nacos;`gateway` 端通过 `client/moderation_client.go` 引用。无需修改其他服务的注册配置。 ### 阶段 3:TopFans-Activity 后台 API(FastAPI) -- 3.1 `D:\shanghai\TopFans-activity\backend\models\moderation.py` SQLAlchemy ORM(与 PG 表结构对应) -- 3.2 `D:\shanghai\TopFans-activity\backend\schemas\moderation.py` Pydantic 模型 -- 3.3 `D:\shanghai\TopFans-activity\backend\crud\moderation_crud.py` 数据库操作 + +> **范围说明**:以下产物在外部仓库 `D:\shanghai\TopFans-activity` 实施,本仓(topfans)仅做规范约定,不阻塞本仓 release;DB schema 跨仓库共享 `top-fans` 库,是唯一耦合点。 + +- 3.1 `TopFans-activity/backend/models/moderation.py` SQLAlchemy ORM(与 PG 表结构对应) +- 3.2 `TopFans-activity/backend/schemas/moderation.py` Pydantic 模型 +- 3.3 `TopFans-activity/backend/crud/moderation_crud.py` 数据库操作 - `list_reports(filters, page) / get_report_detail(id) / claim_report(id) / execute_action(id, action, ...) / list_categories() / upsert_category() / ...` -- 3.4 `D:\shanghai\TopFans-activity\backend\handlers\moderation_admin.py` 路由层 +- 3.4 `TopFans-activity/backend/handlers/moderation_admin.py` 路由层 - 复用现有 `verify_token` 中间件 -- 3.5 `D:\shanghai\TopFans-activity\backend\router\__init__.py` 注册路由 + - **admin token 解析**:`verify_token(authorization) → (admin_id, role, exp)`;role 当前不做分级校验(仅记录),`admin_id` 写入 `moderation_actions.admin_id` / `admin_audit_logs.admin_id` + - **后台路由前缀**:`/api/admin/moderation/*`(在 `TopFans-activity/backend/router/__init__.py` 注册,不在本仓 gateway 注册) +- 3.5 `TopFans-activity/backend/router/__init__.py` 注册路由 - 3.6 数据库迁移(如 ORM 与 PG 表不一致时): - - `D:\shanghai\TopFans-activity\backend\migrations\010_moderation_init.sql`(如果用 SQLAlchemy create_all 可省略) + - `TopFans-activity/backend/migrations/2026_06_11_001_moderation_init.sql`(用日期前缀保持与本仓命名一致;如果用 SQLAlchemy `create_all` 可省略) ### 阶段 4:后台前端 (Vue3) -- 4.1 `D:\shanghai\TopFans-activity\frontend\src\api\moderation.js` axios 封装 - - `getReports()` / `getReportDetail()` / `claimReport()` / `executeAction()` / ... +- 4.1 `D:\shanghai\TopFans-activity\frontend\src\api\moderation.js` axios 封装(新增文件) + - 复用既有 `utils/request.js` 的 axios 拦截器(已含 JWT 注入),不需要额外配置 + - `getReports()` / `getReportDetail()` / `claimReport()` / `executeAction()` / ... - `getReportCategories()` / `createCategory()` / `updateCategory()` / `deleteCategory()` / ... - 4.2 `D:\shanghai\TopFans-activity\frontend\src\views\moderation\` - `ReportList.vue` 举报工单列表(筛选:状态/分类/目标类型/关键词) @@ -907,13 +1364,16 @@ v1.GET("/moderation/feedbacks/:id", moderationController.GetFeedbackDetail) - 4.5 Element Plus 组件复用:el-table / el-form / el-dialog / el-image / el-tag / el-pagination ### 阶段 5:客户端 uni-app -- 5.1 `D:\shanghai\topfans\frontend\utils\api.js` 加: +- 5.1 在既有 `D:\shanghai\topfans\frontend\utils\api.js` **末尾追加** 8 个方法(不新建文件): - `getReportCategoriesApi()` / `submitReportApi(payload)` / `getMyReportsApi()` / `getMyReportDetailApi(id)` - `getFeedbackCategoriesApi()` / `submitFeedbackApi(payload)` / `getMyFeedbacksApi()` / `getMyFeedbackDetailApi(id)` - 5.2 `D:\shanghai\topfans\frontend\components\ReportModal.vue` 通用举报弹窗 - - props: `targetType, targetId, targetName` + - props: `targetType: 'asset' | 'user_profile'`, `targetId: number`, `targetName: string`(类型断言) - 表单:分类单选 + 描述 textarea + 证据图上传(最多 5 张)+ 匿名开关 - - 调 `submitReportApi`,成功后提示"已提交"+ 自动隐藏提示 + - 调 `submitReportApi` 后根据返回值双分支提示: + - `if (res.data.target_hidden)` → `uni.showToast({ title: '已自动隐藏,等待审核', icon: 'none' })` + - `else` → `uni.showToast({ title: '举报已提交', icon: 'success' })` + - UI 库:用 `uView 2.x` 的 `u-popup` + `u-form` + `u-upload`(与既有 `frontend/components/` 一致) - 5.3 在以下位置接入 `ReportModal`: - 藏品详情页 (`NftDetailModal.vue` 等) 长按或"..."菜单 - 用户主页(粉丝身份下)"..."菜单 @@ -924,32 +1384,125 @@ v1.GET("/moderation/feedbacks/:id", moderationController.GetFeedbackDetail) - 5.5 `D:\shanghai\topfans\frontend\pages\profile\myReports.vue` 我的举报列表 - 5.6 `D:\shanghai\topfans\frontend\pages\profile\myFeedbacks.vue` 我的反馈列表 - 5.7 页面间跳转:从"我的" → 各项入口 + - 在 `D:\shanghai\topfans\frontend\pages\profile\profile.vue`(既有"我的"页面)菜单项中追加: + - "我的举报" → `/pages/profile/myReports` + - "我的反馈" → `/pages/profile/myFeedbacks` + - 提交举报/反馈成功后用 `uni.navigateBack()` 返回上一页,不再额外跳转"我的"页(避免多余导航) -### 阶段 6:业务服务读路径加 JOIN(按需展开) -- 6.1 `D:\shanghai\topfans\backend\services\assetService\repository\` 藏品查询 - - 详情/列表 SQL:`LEFT JOIN moderation_target_status ON target_type='asset' AND target_id=assets.id WHERE COALESCE(is_hidden, false) = false` -- 6.2 `D:\shanghai\topfans\backend\services\userService\repository\` 用户校验 - - 登录/操作校验:`LEFT JOIN ... ON target_type='user' AND target_id=users.id WHERE COALESCE(is_banned, false) = false` -- 6.3 描述词相关服务(`aiChatService` 或新)查询时同样 JOIN -- 6.4 性能优化(如果热路径压力变大): - - Redis 缓存 `mod:status:cache:{target_type}:{target_id}` TTL 60s +### 阶段 6:业务服务读路径(沿用既有软删除过滤,无须改业务 SQL) +- 6.1 `assetService` 藏品查询/详情/列表 + - 既有 SQL 已含 `WHERE assets.is_active = TRUE AND assets.deleted_at IS NULL`,由审核动作产生的下架/封禁已通过软删除自动过滤,**本阶段无须改 SQL** +- 6.2 `userService` 登录/操作校验 + - 既有 SQL 已含 `WHERE users.is_active = TRUE AND users.deleted_at IS NULL`,由审核动作产生的 ban 已通过软删除自动拦截,**本阶段无须改 SQL** +- 6.3 描述词(`assets.description` 字段,随 asset 软删除自动过滤) + - 既有 SQL 已含 `WHERE assets.is_active = TRUE AND assets.deleted_at IS NULL`,**本阶段无须改 SQL** +- 6.4 用户警告展示(仅前端/详情页需要,**非热路径**) + - `LEFT JOIN moderation_target_status ON target_type='user_profile' AND target_id=users.id WHERE is_warned = TRUE` + - 用于在用户主页/控制台展示最近一次警告原因与时间;不阻塞登录 +- 6.5 性能优化(如警告查询变热): + - Redis 缓存 `mod:warn:cache:{user_id}` TTL 60s - 命中即跳过 JOIN +### 阶段 6.5:定时任务(v2.3 新增) + +每日 cron 任务(建议挂载在 K8s CronJob 或 systemd timer): + +> **步骤顺序约束**(v2.5 文档化,避免 PII 时钟被业务操作重置): +> 1. **先 PII 匿名化**(用 `closed_at`/`replied_at`/`archived_at` 而非 `updated_at`,与具体业务操作解耦) +> 2. **后 auto-archive**(status='pending' 状态 90 天未处理) +> 3. **最后 claim 超时回收**(reviewing 状态 15 分钟未操作) +> +> 若一个反馈既 > 90 天 pending 又被 stale-claim 锁定 91 天,链路是:claim 释放 → status='pending' → auto-archive → status='archived'。PII 匿名化时钟从 `archived_at` 起(不是 `created_at`)——admin 调查时间会延长 PII 保留窗口(这是 GDPR/中国《个人信息保护法》"最小必要"原则下可接受的 trade-off)。 + +```sql +-- 1. PII 匿名化(feedbacks.contact 90 天后清空;v2.5 扩到所有终态 replied/closed/archived) +UPDATE feedbacks +SET contact = NULL +WHERE contact IS NOT NULL + AND ( + -- 'replied' 没有 closed_at/archived_at,用 replied_at(PII 时钟从回复时刻起 90 天) + (status = 'replied' AND replied_at < EXTRACT(EPOCH FROM NOW() - INTERVAL '90 days') * 1000) + OR (status = 'closed' AND closed_at < EXTRACT(EPOCH FROM NOW() - INTERVAL '90 days') * 1000) + OR (status = 'archived' AND archived_at < EXTRACT(EPOCH FROM NOW() - INTERVAL '90 days') * 1000) + ); +-- v2.5 修复 v2.4 GDPR 漏洞:之前只覆盖 closed/archived,漏了 'replied'(admin 回复后用户的 contact 永不匿名化) + +-- 2. 过期 pending 工单自动 archive(reports)—— v2.5 补 archived_at + resolution_note +UPDATE reports +SET status = 'archived', + updated_at = EXTRACT(EPOCH FROM NOW()) * 1000, + resolution_note = 'auto-archived: pending > 90 days' +WHERE status = 'pending' + AND created_at < EXTRACT(EPOCH FROM NOW() - INTERVAL '90 days') * 1000; + +-- 2b. 过期 pending 工单自动 archive(feedbacks)—— v2.5 补 archived_by/archived_at(满足 chk_feedbacks_archived_fields)+ 审计行 +UPDATE feedbacks +SET status = 'archived', + archived_by = 0, -- 0 = system auto sentinel (与 admin_id CHECK 配合) + archived_at = EXTRACT(EPOCH FROM NOW()) * 1000, + updated_at = EXTRACT(EPOCH FROM NOW()) * 1000 +WHERE status = 'pending' + AND created_at < EXTRACT(EPOCH FROM NOW() - INTERVAL '90 days') * 1000; + +-- 2c. 审计行(v2.5 新增)—— 为刚 archived 的 feedbacks 写 moderation_actions 流水 +INSERT INTO moderation_actions + (report_id, feedback_id, admin_id, action_type, target_type, target_id, + note, success, created_at) +SELECT NULL, id, 0, 'archive', 'user_profile', id, + 'auto-archived by cron: pending > 90 days', TRUE, archived_at +FROM feedbacks +WHERE status = 'archived' AND archived_by = 0 + AND archived_at = EXTRACT(EPOCH FROM NOW()) * 1000; + +-- 3. Claim 超时自动释放(每 5 分钟跑) +UPDATE reports +SET status = 'pending', claimed_by = NULL, claimed_at = NULL, updated_at = EXTRACT(EPOCH FROM NOW()) * 1000 +WHERE status = 'reviewing' + AND claimed_at < EXTRACT(EPOCH FROM NOW() - INTERVAL '15 minutes') * 1000; +-- 同理 feedbacks +UPDATE feedbacks +SET status = 'pending', claimed_by = NULL, claimed_at = NULL, updated_at = EXTRACT(EPOCH FROM NOW()) * 1000 +WHERE status = 'reviewing' + AND claimed_at < EXTRACT(EPOCH FROM NOW() - INTERVAL '15 minutes') * 1000; +``` + +> **监控指标**: +> - `moderation.feedback.pii_anonymized.count` — 每日匿名化条数 +> - `moderation.reports.auto_archived.count` — 每日 archive 条数 +> - `moderation.reports.claim_timeout.count` — claim 超时回收条数 + ### 阶段 7:通知与测试 -- 7.1 通知模板注册到 `notificationService`(5 个模板) +- 7.1 通知模板注册到 `notificationService`(6 个模板:含自动隐藏) - 7.2 Go 单元测试 - - `report_service_test.go` 防重复、自动隐藏触发 - - `feedback_service_test.go` 状态机 + - `report_service_test.go` 防重复、自动隐藏触发、dismiss 4 路径、**claimed_* 字段一致性**——覆盖 claim/release/dismiss 4 路径各自清零的 CHECK 违例用例 + - `feedback_service_test.go` 状态机 + **claimed_* 字段一致性**——覆盖 claim/release/reply/close/archive 各自清零的 CHECK 违例用例 - `auto_hide_service_test.go` Lua 脚本逻辑 + - `concurrency_test.go` 并发场景(v1.5 新增): + - 100 用户同时举报同一对象,counter INCR 200 次但只触发 1 次自动隐藏 + - 2 个审核员同时 claim 同 report,1 成功 1 返回 50008 + - 自动隐藏 Lua 脚本 + 5s 短锁的交互(errgroup 模拟并发) - 7.3 FastAPI 单元测试 - - `test_moderation_admin.py` 列表/详情/认领/动作 + - `test_moderation_admin.py` 列表/详情/认领/动作(含 dismiss 4 路径分支覆盖) - 鉴权测试(无 token 401) -- 7.4 集成测试 - - 端到端:提交举报 → 后台审核 → 状态变更 → 用户收到通知 - - 自动隐藏:5 个独立用户举报 → 自动隐藏 + 状态表写入 + - Fixture:用 `httpx.AsyncClient` + pytest;admin token 用 `TopFans-activity` 现有 `make_test_token()` +- 7.4 集成测试(v1.5 增列隔离策略) + - **测试 DB 隔离**: + - 使用 `github.com/testcontainers/testcontainers-go` 启临时 PG 16 + Redis 7 容器(每个测试套件独立实例) + - 业务表自动跑阶段 1.1 的 migration(不依赖生产 DB) + - Redis key 全部加测试前缀 `test:mod:report:*` 避免污染 + - **跨服务 mock 策略**: + - `assetService.GetAssetRPC` / `userService.GetUserRPC` 在单元测试层 mock;集成测试用真起 socialService / assetService 容器 + - `notificationService` 在所有测试层 mock(仅验证调用参数,不真发通知) + - **端到端场景**: + - 提交举报 → 后台审核 → 状态变更 → 用户收到通知 + - 自动隐藏:5 个独立用户举报 → 自动隐藏 + 状态表写入 + - dismiss 4 路径覆盖:pending 快速通道 / 普通 reviewing / auto_hidden 恢复 / auto_hidden 不恢复 + - 跨服务事务回滚:模拟业务表软删除成功但 mts UPSERT 失败,验证整体回滚 + - **Lua 脚本测试**:需要真实 Redis(testcontainer),验证 SETNX/INCR/EXPIRE 的边界 - 7.5 前端联调 - uni-app → gateway → Go service - Vue3 后台 → FastAPI → PG + - 用 gateway 已暴露的 Swagger UI(`router.go` line 30-33)做端到端联调 --- @@ -966,6 +1519,18 @@ type ModerationConfig struct { LockTTL time.Duration // 5s MaxDescriptionLen int // 500 MaxEvidenceCount int // 5 + MaxContactLen int // 320(RFC 5321 完整邮箱地址上限;feedbacks.contact 服务端校验) + MaxReplyLen int // 2000(feedbacks.reply_content 服务端校验,v2.3) + MaxEvidenceSize int64 // 5MB 单图上限(v2.3) + AllowedMimeTypes []string // ["image/png", "image/jpeg"](v2.3) + RateLimitUserPerDay int // 30(举报)/ 5(反馈) + RateLimitIPPerDay int // 200(v2.3,IP 限流防多账号 spam) + RateLimitDevicePerDay int // 200(v2.3,设备指纹限流) + ClaimTimeout time.Duration // 15 分钟(v2.3,cron 任务自动释放) + PIIAnonymizeAfter time.Duration // 90 天(v2.3,feedbacks.contact 自动匿名化) + AutoArchiveAfter time.Duration // 90 天(v2.3,pending 工单自动 archive) + RedisKeyPrefix string // "mod:report"(生产)| "test:mod:report"(测试,v2.3) + PathDCounterPolicy string // "reset" | "preserve" | "expire_1h"(v2.3,路径 D 的 Redis counter 行为) } ``` @@ -973,22 +1538,49 @@ type ModerationConfig struct { | 调用方 | 被调服务 | 触发时机 | 失败处理 | |--------|----------|----------|----------| -| moderationService | assetService.GetAssetRPC | 提交举报 `target_type='asset'` 验证目标 | 返回 50003 | +| moderationService | assetService.GetAssetRPC | 提交举报 `target_type='asset'` 验证目标(含 `assets.description` AI 描述词随表过滤)| 返回 50003 | | moderationService | userService.GetUserRPC | 提交举报 `target_type='user_profile'` 验证用户 | 返回 50003 | -| moderationService | aichat.ai_descriptions(跨 schema 直查)| 提交举报 `target_type='description_word'` 验证目标 | 返回 50003 | -| moderationService | notificationService | 自动隐藏 + 动作结果通知(5 个模板)| 仅日志,不影响主流程 | -| TopFans-Activity 后台 | (无 — 仅读写 DB) | - | - | -| assetService | (无 — 仅读 DB 做 JOIN) | - | - | -| userService | (无 — 仅读 DB 做 JOIN) | - | - | -| aichat 描述词服务 | (无 — 跨 schema 读 topfans.moderation_target_status 做 JOIN) | - | - | +| moderationService | notificationService | 自动隐藏 + 动作结果通知(6 个模板:`report_auto_hidden_notice` / `report_resolved` / `report_takedown_notice` / `report_ban_notice` / `report_warn_notice` / `feedback_replied`)| 仅日志,不影响主流程 | +| TopFans-Activity 后台 | (无 RPC — 仅读写 `top-fans.public` 库;写 `reports.claimed_by/claimed_at`(claim 写入 / release-dismiss 清零)、`reports.resolved_action/resolved_by/resolved_at/resolution_note`(takedown/ban/warn/dismiss 终态)、`feedbacks.claimed_by/claimed_at`(claim 写入 / release-reply-close-archive 清零)、`feedbacks.replied_by/replied_at/reply_content`(reply 终态)、`feedbacks.closed_by/closed_at`(close 终态)、`feedbacks.archived_by/archived_at`(archive 终态)、`reports.status` / `feedbacks.status` / `moderation_target_status` 全字段;每次 admin 动作同时写 `moderation_actions` + `admin_audit_logs` 流水;与本仓 moderationService 无 RPC 依赖) | - | - | +| assetService | (无 — 业务表 `WHERE is_active=TRUE AND deleted_at IS NULL` 软删除过滤已覆盖) | - | - | +| userService | (无 — 业务表 `WHERE is_active=TRUE AND deleted_at IS NULL` 软删除过滤已覆盖) | - | - | ### 11.3 监控指标(建议) +**业务成功路径**: - `moderation.report.submitted.count` (counter, tags: target_type, category_code) - `moderation.report.auto_hidden.count` (counter) - `moderation.report.resolve.duration` (histogram, 从 created_at 到 resolved_at) - `moderation.feedback.reply.duration` (histogram) -- `moderation.actions.failed.count` (counter, tags: action_type, error) + +**失败/异常类**(v1.5 补充,11.2 已声明"通知失败仅日志",必须可观测): +- `moderation.actions.failed.count` (counter, tags: action_type, error) — 已有 +- `moderation.report.duplicate.count` (counter, tag: target_type) — 防重复触发次数 +- `moderation.auto_hide.lock.contention.count` (counter) — 5s 短锁抢占失败次数(监控 Lua 锁是否合理) +- `moderation.notification.send_failed.count` (counter, tag: template) — 6 个模板的失败分布 +- `moderation.transaction.rollback.count` (counter, tag: flow=auto_hide|takedown|ban|dismiss) — 事务回滚次数 + +**延迟/SLO 类**(v1.5 补充): +- `moderation.api.latency` (histogram, tag: endpoint, status) — 客户端 + 后台接口 P50/P95/P99 +- `moderation.dashboard.queue.pending` (gauge) — pending 状态工单数(运营告警:> N 触发告警) +- `moderation.dashboard.queue.auto_hidden` (gauge) — 待认领 auto_hidden 工单数 + +**运行时(自动注册)**: +- Go runtime 默认指标(goroutine 数、heap、GC pause)— `collectors.NewGoCollector()` 自动注册 + +**Grafana 看板 + 告警规则**:另行维护(不阻塞本设计)。 + +**v2.3 新增指标**: +- `moderation.report.auto_hidden.noop.count` (counter) — auto-hide 触发但目标已 `is_active=false` 的 no-op 次数 +- `moderation.actions.auto_hide.count` (counter, tag: target_type) — 系统自动 takedown 次数(与人工 takedown 区分) +- `moderation.actions.warn_cleared.count` (counter) — warn_cleared 流程触发次数 +- `moderation.redis.counter_reset.count` (counter, tag: path=C|D) — Redis counter 重置监控 +- `moderation.feedback.pii_anonymized.count` (counter) — 每日 PII 匿名化条数 +- `moderation.reports.auto_archived.count` (counter) — 每日 auto-archive 条数 +- `moderation.reports.claim_timeout.count` (counter) — claim 超时自动释放条数 +- `moderation.feedback.terminal_state.claim_attempt.count` (counter, tag: status=replied|closed|archived) — 监控试图认领终态工单次数(验证 50009 区分是否生效) +- `moderation.api.latency.evidence_upload.p95` (histogram) — 证据上传 P95 延迟 +- `moderation.rate_limit.hit.count` (counter, tag: type=report|feedback, scope=user|ip|device) — 限流触发监控 ### 11.4 变更历史 @@ -996,6 +1588,20 @@ type ModerationConfig struct { |------|------|------|----------| | v1.0 | 2026-06-11 | Claude | 初始设计 | | v1.1 | 2026-06-11 | Claude | 自审修复:target_type 命名统一、跨 schema JOIN 明确、Lua lock 改应用层、6.1 流程补限流/自举报、6.2 dismiss 路径细化、6.3 反馈补 release 流程 | +| v1.2 | 2026-06-11 | Claude | 数据库表字段修复:`reports.resolved_action` 动作名 `dismissed`→`dismiss`;6.2 业务 JOIN `target_type='user'`→`'user_profile'`;`moderation_actions.xor` CHECK 改 XOR、补 `action_type`/`target_pair`/`success_msg` 三个 CHECK;`moderation_target_status` 补 `target_type`/`source`/`source_report_id` 三个 CHECK + 审计索引;`report_categories.severity` 加 1-5 CHECK;`admin_audit_logs.ip` 50→100(兼容 IPv6+代理链);`is_auto_hidden` 补迁移语义注释 | +| v1.3 | 2026-06-11 | Claude | **对齐项目软删除模式**:`moderation_target_status` 去除 `is_hidden` / `is_banned` 字段(项目用 `assets`/`users` 自带的 `is_active` + `deleted_at` 软删除表达下架/封禁),保留 `is_warned`(软状态不阻塞登录),新增 `warn_count`/`last_warned_at`/`last_action_type`;审核动作改为"事务内双重写入"——按 `target_type` 路由到对应业务表做软删除/恢复,同时 UPSERT `moderation_target_status`(审计);6.1 自动隐藏、6.2 takedown/ban/dismiss 全部改写;6.2/阶段 6 业务读路径无需改 SQL(既有软删除过滤已覆盖);状态机迁移表、孤儿清理、跨 schema 说明、架构图模块职责同步更新 | +| v1.4 | 2026-06-11 | Claude | **自审修复(25 项)**:(C1)砍掉幽灵表 `aichat.ai_descriptions`——确认 `assets.description` 即 AI 描述词,删除 `description_word` 举报类型,移除所有跨 schema 假设;(H1)展开 3.2/3.3 初始数据完整 SQL(消除 `...` 占位符);(H2)9 张表 `CREATE SEQUENCE` 全部加 `OWNED BY`(让 `setval()` 生效,CLAUDE.md 强制);(H3)2.1/2.2 关键边界移除已废弃的 `LEFT JOIN moderation_target_status` 描述;(H4)状态机迁移矩阵补 `pending → dismissed` 快速通道、区分 dismiss 与 dismiss-restore 副作用;(H5 隐含)11.2 调用清单同步去掉 aichat 跨 schema;(H6)`reports`/`feedbacks` 加 `status`/`target_type`/`resolved_action`/`replied/claimed` 4 类 CHECK 约束、终态字段一致性保护;(M1)`moderation_actions.action_type` 枚举 `unhide` → `restore` 与 mts 对齐;(M2)`target_pair` CHECK 限定 target_type 合法值;(M3)`last_action_type` `auto_hide` → `autohide` 命名风格统一;(M4)`chk_mts_warn_fields` 强化要求 `is_warned=TRUE ⇒ warn_count>0`;(M5)`idx_mts_warned_user` partial index 加 `target_type='user_profile'` 限定;(M6)`chk_mts_source_report_id` 放宽 admin 可空(支持多工单聚合警告);(M7)`admin_audit_logs.resource_*` 成对 CHECK;(M8)`idx_admin_audit_logs_resource` 加 `created_at DESC`;(M9)补 `idx_moderation_actions_target` partial index;(M10)补 `idx_reports_category` 索引;(M11)`feedbacks` 加 `claimed_by`/`claimed_at` 字段 + CHECK;(M12)`feedbacks.contact` 100 → 254(RFC 5321 邮箱上限);(M13)阶段 1.2 "8 张表" → "9 张表";(M14)5.2 API 补 `feedbacks/{id}/release` 端点;(M15)错误码 50009/50014 语义区分(终态 vs 非法迁移);(M16)8 节补 `report_auto_hidden_notice` 模板 + 2.3/阶段 7.1 "5 个模板" → "6 个模板";(M17)6.2 ban 路径重构为 ① ② ③ 与 takedown 对齐;(M18)2.1 架构图自动隐藏描述同步业务表软删除;(M19)阶段 2.7 补 `notification_client.go` | +| v1.5 | 2026-06-11 | Claude | **二轮自审修复(19 项 — 修 v1.4 引入的 4 项回归)**:(H1)6.3 release SQL 改正——清 `claimed_by/claimed_at` 不是 `replied_by`,避免 `chk_feedbacks_claimed_pair` 违例;(H2)6.4 Lua 短锁语义补完——`defer DEL` 显式释放 + 5s TTL 兜底 + 完整生命周期伪代码;(H3)`feedbacks` 补 `closed_by/closed_at/archived_by/archived_at` 4 字段 + 2 个 CHECK 约束(终态字段一致性);(H4)`chk_mts_warn_fields` 放宽支持累计——`is_warned=FALSE` 时 `warn_count >= 0` 允许保留历史计数(语义修正:累计警告次数可在 dismiss 后保留);(H5)11.2 跨服务调用清单"5 个模板"→"6 个模板"残留修正;(H6)6.2 dismiss 流程重构为 4 路径:pending 快速通道 / 普通 reviewing / auto_hidden 恢复 / auto_hidden 不恢复,每条带明确的 SQL 步骤;(H7)错误码 50004 文案修正为"您已举报过该对象"(明确是"同 reporter" 范围);(M1)`admin_audit_logs.ip` 100→500(兼容 IPv6 多级代理链实测 230 字符);(M2)`feedbacks` 补 `idx_feedbacks_claimed_by` 索引;(M3)`reports`/`feedbacks` 补 `star_id` 部分索引;(M4)`idx_mts_warned_user` 简化去掉冗余 `target_type` 列;(M5)`fk_reports_category` / `fk_feedbacks_category` 加 `ON UPDATE CASCADE` 防止 `code` rename 破坏 FK;(M6)阶段 1.1 路径从 Windows 绝对路径 `D:\shanghai\topfans\...` 改为本仓相对路径 + 编号 010→011;(M7)阶段 2.7 `notification_client.go` 标注为 stub 推迟到阶段 7.1 替换为真实实现;(M8)阶段 2.9 补 Dockerfile + docker-compose + Makefile 同步步骤;(M9)阶段 2 补 `transaction_helper.go` / `redis_client.go` / `promhttp.Handler()` / admin JWT 解析说明 / 端口 20010 分配 / `provider/moderation_provider.go` 改名修正;(M10)11.3 监控指标从 5 个扩到 13 个:补失败类(notification / transaction rollback / lock contention / duplicate)+ 延迟类(API latency / queue gauge)+ Go runtime 自动注册;(M11)阶段 7.4 集成测试增列 testcontainers 隔离策略、跨服务 mock 矩阵、Lua 测试需要真 Redis、dismiss 4 路径覆盖、7.2 补 `concurrency_test.go`;(M12)阶段 2.10 标题改为"客户端 Gateway 路由配置清单",阶段 3.4 显式说明后台路由 `/api/admin/moderation/*` 由 FastAPI 注册不在本仓 gateway;11.2 跨服务调用清单去重去幽灵行(合并 assetService 重复行、删除"资产描述词"幽灵行)| +| v1.6 | 2026-06-11 | Claude | **Polish(9 项 LOW 优化)**:(L1)`feedbacks.contact` 254→320(RFC 5321 完整邮箱地址 64+1+255=320 上限),修正注释;(L2)`idx_moderation_actions_target` 简化去掉冗余 `target_type` 列(WHERE 已限定 NOT NULL)— **v1.7 修正:L2 是错的,回退**;(L3)6.2 路径 A 补"任意审核员"权限说明 + `claimed_by=NULL` 防御性显式清零;(L4)阶段 2.1 补 `start.sh` 完整 env 模板(PORT/DB_*/REDIS_*/DUBBO_*)+ `dubbo.yaml` 模板(application name / tri protocol / nacos registry);(L5)阶段 2.3 显式声明 `.triple.go`(Dubbo Triple 协议 stub,缺它 RPC 客户端无法生成);(L6)阶段 4.1 注明"复用 `utils/request.js` axios 拦截器已含 JWT 注入";阶段 5.1 注明"在既有 `api.js` 末尾追加 8 个方法,不新建文件";阶段 5.2 补 `ReportModal` 双 toast 分支(`target_hidden` true/false)+ uView 2.x UI 库 + props 类型断言;(L8)阶段 5.7 补"我的"页面菜单项追加位置(`pages/profile/profile.vue` 既有"我的"菜单);(L9)5 张核心表加 `COMMENT ON TABLE` 文档注释(report_categories / feedback_categories / reports / moderation_actions / moderation_target_status)| +| v1.7 | 2026-06-12 | Claude | **三轮自审修复(修 v1.6 L2 引入的 2 项回归 + 4 项遗漏)**:(H1)`idx_moderation_actions_target` 回退 v1.6 L2 简化——`target_id` 跨类型不唯一(`users.id=123` 与 `assets.id=123` 冲突),必须 `target_type` 前缀,索引改为 `(target_type, target_id, created_at DESC)`;(H2)`chk_mts_warn_fields` 加第 3 子句支持"历史警告已清除"(`is_warned=FALSE AND warn_count>=1 AND last_warned_at IS NOT NULL`)——v1.5 H4 允许了"is_warned=FALSE 时 warn_count 可任意"但同时强制 `last_warned_at IS NULL`,导致 dismissal 后无法保留历史警告时间戳;(H3+4)`reports` 表补 `claimed_by`/`claimed_at` 字段 + `chk_reports_claimed_pair` CHECK 约束(与 `feedbacks` 对齐)——v1.5 v1.6 路径 A dismiss SQL 引用 `reports.claimed_by` 但该列不存在,会 SQL 报错;同时为 50008 "已被他人认领" 提供认领人身份;(H3 文档)5.1 示例 50004 错误响应文案与错误码表统一(之前漂移);(H4 状态机)4.1 迁移矩阵补"reviewing → dismissed 保留隐藏"行(v1.5 H6 路径 D 的状态机条目);(M1/M2)6.3 reply 流程补 `claimed_by=NULL, claimed_at=NULL`——终态清认领人避免与 `replied_by` 重复;(M3)8 节补"模板复用说明"——`report_resolved` 同时覆盖 `resolved` 和 `dismissed`(消息体根据 `resolved_action` 区分);(L3 规则)6.1 step 2.5 自举报拦截规则明确——`target_type='asset'` 比 `owner_uid`,`target_type='user_profile'` 比 `target_id`(不能举报自己);(LOW 配置)11.1 `ModerationConfig` 加 `MaxContactLen int // 320` 与 `feedbacks.contact` 字段对齐;(LOW 模板名)11.2 notificationService 行补全 6 个模板名(不仅是"6 个模板");(LOW 约定)3.2 report_categories 前补"所有 *_at 字段均为 Unix 毫秒 (BIGINT)"约定注释 | +| v1.8 | 2026-06-12 | Claude | **四轮自审修复(v1.7 引入的 2 项文档/流程 bug + 5 项遗漏)**:(H1)6.2 路径 D 注释错误引用 `mts.is_hidden` 字段——v1.3 已删除该字段,改为"业务表 `is_active=false, deleted_at=$now` 保持原状;mts 仅审计 last_action_type='dismiss'";(H2)6.2 路径 D 补审计说明——`last_action_type='dismiss'` 会覆盖 `autohide` 记录,完整历史需通过 `moderation_actions` 表按 `report_id` + `created_at` 时序回溯;(M1)6.3 close/archive 流程补 `claimed_by=NULL, claimed_at=NULL`(**重要**——之前会违反 `chk_feedbacks_claimed_pair`);(M2)6.2 补 reports release SQL 流程(5.2 端点早已存在但缺 SQL);(M3)11.2 TopFans-Activity 行补 claimed_by/claimed_at 读路径说明;(M4)7.2 `report_service_test.go` 加 claimed_* 一致性测试;(M5)50008 响应体补 `claimed_by_admin_id` / `claimed_at` 字段说明;(L1)6.1 step 4 INSERT 显式 `claimed_by=NULL, claimed_at=NULL` 与 dismiss 路径 A 防御性写法对齐;(L2)4.1 矩阵 `pending → dismissed` 行副作用列补 claimed_by 清零;(L3)3.x 全局注释提升"Unix 毫秒 (BIGINT)"约定到章节头(原 v1.7 注释仅在 report_categories 前)| +| v1.9 | 2026-06-12 | Claude | **五轮自审修复(v1.8 引入的 2 项真实 bug + 4 项遗漏)**:(H1)163 行 v1.7 注释删除重复"Unix 毫秒 (BIGINT)"(v1.8 L3 添加的 142 行全局约定已为 canonical)——保留 PG 隐式 numeric→bigint 转换 caveat 作为本地示例说明;(H2)6.3 close 补"必须在 reviewing 状态"说明(与 dismiss-pending 快速通道的差异);(H3)6.3 archive SQL 去死代码 `OR claimed_by IS NULL` 分支——按 `chk_feedbacks_claimed_pair` 约束 `reviewing`/`replied` 状态 `claimed_by` 必非空,该 OR 分支不可达且误导读者;(H4)4.1 状态机补 `reviewing → pending`(释放认领)行——之前 v1.8 补了 SQL 但矩阵没条目;(H5)4.1 `pending → dismissed` 行副作用补完整 SET(resolved_action/resolved_by/resolved_at/updated_at);(H6)50008 响应体字段名 `claimed_by_admin_id` 重命名为 `claimed_by`——与 `reports`/`feedbacks` 列名一致(避免 API 字段与 DB 字段名漂移);(M1)6.1 step 4 NULL 注释从"防御性写法"升级为"必填 NULL"——`chk_reports_claimed_pair` 约束 `status<>'reviewing'` 时必须 NULL,不可省略;(M2)11.2 跨服务表字段列举完整化——reads/writes 各自列(claim 写入 / release-dismiss 清零 / reply-close-archive 清零);(M3)7.2 测试描述从"claimed_* 字段一致性"具体化——分别枚举 claim/release/dismiss 4 路径(reports)与 claim/release/reply/close/archive(feedbacks)的 CHECK 违例用例;(M4)5.1 提交举报响应 schema 修正——`status` 字段同步实际 DB 状态(`auto_hidden` vs `pending`),补 `claimed_by`/`claimed_at` 字段与 50008 一致 | +| v2.0 | 2026-06-12 | Claude | **六轮自审修复(v1.9 引入的 1 项真实 CRITICAL bug + 2 项 HIGH + 2 项遗漏)**:(CRITICAL)6.3 archive SQL 去 `'replied'` 分支——v1.8 M1 reply 流程 `claimed_by=NULL, claimed_at=NULL` 联合 v1.9 H3 archive 去 `OR claimed_by IS NULL` 分支,**打破 `replied → archive` 流程**:reply 后 `claimed_by=NULL`,archive SQL `WHERE status IN ('replied','reviewing') AND claimed_by=$admin_id` 0 行匹配。修复:去 `'replied'`,archive 仅从 reviewing 入口(与 4.2 状态机"replied | 终态"一致)。(H-A)4.1 ASCII 状态机图补"释放认领"回退边 + "快速驳回"边 + "解除隐藏"边(之前 v1.5 H6 + v1.7 H4 + v1.8 H2 加的迁移矩阵条目在图中均未体现);(H-C)4.1 `auto_hidden → reviewing` 行补"is_auto_hidden 保持 TRUE 不变"注释(与 v1.7 H4 加的 release 行一致);(H-D)6.2 路径 A 注释从"防御性写法"升级为"必填 NULL"(与 6.1 step 4 M1 措辞统一);(M-B)5.1 响应字段说明补 `target_hidden` 语义——表示"本次 auto-hide 是否执行了 UPDATE"(不是"目标当前是否被隐藏"),auto-hide 幂等时 `target_hidden=false` 但 `status='auto_hidden'`;(M-D)11.2 跨服务表字段列举补全 `resolved_action/resolved_by/resolved_at/resolution_note`(reports)、`replied_by/replied_at/reply_content`(feedbacks)、`closed_by/closed_at`(feedbacks)、`archived_by/archived_at`(feedbacks)、`moderation_actions` + `admin_audit_logs` 流水;(M-1)163 行重复注释重新定位为"示例"标签(与 142 行全局约定差异化)| +| v2.1 | 2026-06-12 | Claude | **七轮深审修复(联合回归 + 业务用例组合发现 3 项 CRITICAL + 4 项 HIGH)**:(CRITICAL #1)6.2 路径 C dismiss-restore 补 Redis counter 重置(`DEL mod:report:counter:*` + `DEL mod:report:user:{type}:{id}:*` + `DEL mod:report:lock:*`)——admin 判决"不违规"必须清零风险信号,否则新举报立即再次 auto-hide 推翻 admin 判决;path D 不重置(保守派选项);(CRITICAL #2)4.2 反馈状态机表 `replied/closed/archived` 全部明示"**终态**" + 6.3 claim SQL 补 0 行匹配的 50008 vs 50009 区分注释(replied 终态后认领应返回 50009"工单已结案"而非 50008"已被他人认领");(CRITICAL #3)6.1 step 6 补 `③.5` 写 `moderation_actions` 流水——auto-hide 时 `action_type='takedown'` + `admin_id=0`(系统自动),`mts.last_action_type='autohide'` 与 `moderation_actions.action_type='takedown'` 命名空间分离;(H1)5.1 补提交反馈请求体 + 响应 schema(之前只有 report submit);(H2)6.1 step 4 文档化 `star_id` 路由查询(`asset.star_id` / `user.identity_id`)——`star_id` 是 denormalized 副本,跨表无 FK;(H3)6.2 补 `warn_cleared` 流程 SQL——`UPDATE mts SET is_warned=FALSE WHERE is_warned=TRUE` 保留 `warn_count` + `last_warned_at`,激活 `chk_mts_warn_fields` 第 3 子句(之前是死代码)| +| v2.2 | 2026-06-12 | Claude | **八轮深审修复(v2.1 引入的 6 项 HIGH 真实 bug)**:(B1)6.2 路径 C Redis 通配 `DEL mod:report:user:*` **不可执行**——Redis DEL 不支持通配;改为 `SCAN MATCH ... | DEL` 迭代 + Go 伪代码(之前 H1 changelog 写的通配符描述有误);(B2)6.2 warn_cleared 加 `POST /api/admin/moderation/users/{id}/clear-warn` 端点 + 完整事务内双重写入(mts UPDATE + `moderation_actions` + `admin_audit_logs` 三张表)——之前是死代码(v2.1 H3 文档化了 SQL 但无触发 API);(B3)`chk_moderation_actions_xor` 放宽——加 OR 分支 `(report_id IS NULL AND feedback_id IS NULL)` 允许 warn_cleared 这类无 ticket 关联的审计行;否则会直接拒写;(B4)`chk_moderation_actions_admin_id` CHECK `(admin_id >= 0)`——`admin_id=0` 明确为系统自动 sentinel,避免与真 admin id 冲突;(B5)9.1 匿名保护明确——**所有后台审核员可见** `reporter_id`(1.3 范围"仅一种角色"——不存在超级管理员;之前 v1.0 写的"后台仅对超级管理员可见"是 spec 内的矛盾,v2.2 改一致);(B6)4.1 状态机补 `resolved → resolved (restore/unban)` 行 + 6.2 路径 E——ban/takedown 误判后可解除(`UPDATE users SET is_active=true, deleted_at=NULL` + `mts.last_action_type='restore'` + `reports.resolved_action='restore'` + 写 `moderation_actions.action_type='restore'`),关闭"ban 不可逆"的法律/合规漏洞 | +| v2.3 | 2026-06-12 | Claude | **九轮 polish(v2.2 剩余 12 项 MEDIUM/LOW 一次性清零)**:(P1)`reports` 加 `target_snapshot JSONB` schema 强定义(asset / user_profile 两种结构) + `target_owner_uid_at_submit BIGINT`(ownership transfer 后通知路由) + `triggered_auto_hide BOOLEAN`(仅阈值触发者置 TRUE,区分连带升级);(P2)9.1 加 IP 限流(200/天,`mod:rl:report:ip:*`)+ 设备指纹限流(200/天)—— 防御多账号 spam;evidence 大小/类型限制(5MB / png|jpeg,50018);star_id stale 容忍文档化;claim_timeout(15 分钟自动释放)—— 防 admin crash 后工单僵尸;(P3)9.3 加 PII 匿名化策略——`feedbacks.contact` 在 closed/archived 后 90 天自动 NULL,与 GDPR / 中国《个人信息保护法》"最小必要 + 限期保存"一致;(P4)5.1 加 `PUT/DELETE /api/v1/moderation/reports/{id}` 客户端编辑/撤回端点(仅 pending,可改 description,新增 `withdrawn` 状态);5.2 加 `POST /api/admin/moderation/reports/bulk-dismiss`(批量驳回 spam)+ `force-release`(强制释放他人认领);(P5)7 加 4 个错误码:50016(target_type 不支持)/ 50017(reason 必填)/ 50018(证据图超限)/ 50019(举报不可编辑);50008 vs 50009 判定顺序明确(handler 二次 SELECT 查当前 status);(P6)6.1 step 6 加 `autohide_noop` 区分(`is_active=false` 时记 `action_type='autohide_noop'`);路径 C 加 `②.5` 批量清理同 target 老 auto_hidden 工单(防数据膨胀);(P7)阶段 6.5 新增每日 cron 任务(PII 匿名化 / 90 天 auto-archive / 15 分钟 claim timeout 回收);(P8)11.1 `ModerationConfig` 加 11 项新配置(`MaxReplyLen` / `MaxEvidenceSize` / `AllowedMimeTypes` / 3 个 `RateLimit*` / `ClaimTimeout` / `PIIAnonymizeAfter` / `AutoArchiveAfter` / `RedisKeyPrefix` / `PathDCounterPolicy`);(P9)11.3 加 10 个新指标(auto_hidden.noop / auto_hide / warn_cleared / counter_reset / pii_anonymized / auto_archived / claim_timeout / terminal_state.claim_attempt / evidence_upload.p95 / rate_limit.hit)| +| v2.4 | 2026-06-12 | Claude | **十轮聚焦修复(v2.3 引入的 1 项 CRITICAL + 7 项 HIGH 真实 bug)**:(V1 CRITICAL)**重复 `target_snapshot JSONB NOT NULL` 列**(行 231 + 行 237)——PG `ERROR: column specified more than once` migration 跑不起来;**DROP** 第二处 + 同时**DROP 死列** `target_owner_uid_at_submit`(v2.3 文档化的列但无任何流读/写,target_snapshot 内 `owner_uid` 字段已够);(V2)`chk_reports_status` 枚举补 `'withdrawn'` + `'archived'`(否则 DELETE withdraw INSERT 直接被 CHECK 拒;6.5 cron UPDATE reports SET status='archived' 也会拒);(V3)`chk_moderation_actions_action_type` 补 `'autohide_noop'` / `'withdraw'` / `'force_release'`(否则 v2.3 加的 3 类 audit 行全部被拒);(V4)`chk_mts_last_action_type` 补 `'warn_cleared'`(否则 v2.2 B2 warn_cleared UPDATE 直接被 CHECK 拒——这是 v2.2 就埋下的真 bug,v2.3 也没修);(V5)6.1 step 6 ② 显式写 `triggered_auto_hide=(id=$trigger_report_id)`(之前 v2.3 加列但 v2.4 才在 SQL 实际写入);(V6)6.5 cron 补 `feedbacks` auto-archive 完整 SQL(v2.3 "同理 feedbacks" 没写实际 SQL;PII 匿名化改用 `closed_at`/`archived_at` 而非 `updated_at` 避免业务操作重置 90 天时钟);(V7)6.1 step 6 ③.5 改 `IF affected_rows > 0` conditional —— 实际业务表软删除时写 `action_type='takedown'`,no-op 时写 `action_type='autohide_noop'`(v2.3 文档化但 SQL 未分支);(V8)5.1 PUT body 扩为 `description + category_code + evidence_keys`(v2.3 只允许改 description 不够,category_code 误选无解);DELETE 撤回**不增 `withdrawn_at` 列**(与 `updated_at` 冗余);(V9)9.1 evidence 校验明确——**moderationService 不能直接校验**(OSS 客户端直传 moderationService 只见 key),校验在 **OSS bucket policy 层**实施,moderationService 只校验 `evidence_keys` 字符串格式 | +| v2.5 | 2026-06-12 | Claude | **十一轮聚焦审查修复(v2.4 仍存的 6 项 HIGH 真实 bug)**:(W1 HIGH-1)6.5 cron `UPDATE feedbacks SET status='archived'` 补 `archived_by=0, archived_at=$now`(v2.4 漏的,cron 第一次跑就违反 `chk_feedbacks_archived_fields`);同时补 2c 写 `moderation_actions` 审计行(v2.4 cron 无审计);(W2 HIGH-3)`idx_reports_triggered_autohide` 部分索引(`WHERE triggered_auto_hide=TRUE` keyed by `(target_type, target_id, created_at DESC)`)—— 否则"哪个 report 触发 auto-hide"查询全表扫;(W3 HIGH-4)4.1 状态机矩阵补 2 行:`pending → withdrawn`(客户端 DELETE 撤回)和 `pending → archived`(6.5 cron);(W4 H2)`POST /api/admin/moderation/reports/{id}/force-release` 完整 SQL——UPDATE 释放 + `moderation_actions action_type='force_release'` + `admin_audit_logs extra=jsonb_build_object('previous_claimed_by',...)` + 通知原 claimer 模板(v2.3 只说"写 note"但没 SQL);(W5 H5)PII 匿名化扩到 `replied` 终态(用 `replied_at` 而非 `updated_at`)—— 修复 v2.4 GDPR 漏洞:admin 回复后用户的 `contact` 永不匿名化;之前只覆盖 closed/archived 漏了 `replied` ;(W6 H4)路径 E unban 用 CTE 条件写 mts —— `WHERE EXISTS (SELECT 1 FROM user_unbanned)` 确保仅当 `is_active=false→true` 实际解了 user 才写 `last_action_type='restore'`,避免 user 已 active 时写误导审计;(W7 H1)50012 错误响应加结构化 `{scope: "user"|"ip"|"device", limit: 30|200}` 字段,前端可精准显示 "今日已提交 X 次(user/ip/device 限)";(W8)50014 race 后错误响应加 `{current_status, suggested_action}` 智能提示字段;阶段 6.5 cron 顺序文档化(PII → archive → claim 释放 + 解释 PII 时钟从 `archived_at` 起的 trade-off)| --- diff --git a/docs/superpowers/specs/2026-06-12-load-testing-design.md b/docs/superpowers/specs/2026-06-12-load-testing-design.md new file mode 100644 index 0000000..0c44d9a --- /dev/null +++ b/docs/superpowers/specs/2026-06-12-load-testing-design.md @@ -0,0 +1,1154 @@ +# 后端服务压力测试设计 + +> **状态**:设计已确认 ✅ +> **创建时间**:2026-06-12 +> **作者**:Claude +> **目标**:为部署在阿里云单机(`101.132.250.62`,4G/2C,docker-compose)的 TopFans 后端微服务,设计一套可执行、可恢复、可重复的压力测试方案。覆盖容量评估、SLA 基线、稳定性验证、破坏性测试四类目标。 + +--- + +## 目录 + +1. [背景与目标](#1-背景与目标) +2. [关键约束与已验证事实](#2-关键约束与已验证事实) +3. [总体方案与架构](#3-总体方案与架构) +4. [测试数据准备](#4-测试数据准备) +5. [场景设计与 RPS 梯度](#5-场景设计与-rps-梯度) +6. [执行计划与时间盒](#6-执行计划与时间盒) +7. [监控指标与判停红线](#7-监控指标与判停红线) +8. [风险控制与回滚](#8-风险控制与回滚) +9. [产出物清单](#9-产出物清单) +10. [不在范围(YAGNI)](#10-不在范围yagni) +11. [后续步骤](#11-后续步骤) +12. [附录 A:术语表](#附录-a术语表) +13. [附录 B:被测接口路径速查](#附录-b被测接口路径速查) + +--- + +## 1. 背景与目标 + +### 1.1 背景 + +TopFans 平台当前部署在阿里云单机 `101.132.250.62`,使用 `docker/docker-compose.prod.yml` 启动 11 个容器(gateway + 9 个 Dubbo 微服务 + PostgreSQL + Redis)。 + +项目目前处于早期阶段(生产数据规模:89 users / 91 fan_profiles / 223 assets),尚未做过任何系统化的压力测试。团队对系统在当前 4G/2C 资源配置下的**真实承载能力**、**接口性能瓶颈**、**长时间运行的稳定性**均缺乏量化数据。 + +### 1.2 目标(四象全要) + +| 目标 | 含义 | 产出 | +|---|---|---| +| **G1 容量评估** | 找出每个核心接口的拐点 RPS(错误率/P99 突破阈值前的最大稳态 RPS) | 每场景一个"拐点 RPS"数字 + 瓶颈分析 | +| **G2 SLA 基线** | 建立每个接口的 P50/P95/P99 延迟基线,供后续回归对比 | `baseline.csv` + HDR 直方图 | +| **G3 稳定性** | 在安全水位下跑 30 分钟,验证无内存/连接池/goroutine 泄漏 | 时序图 + 资源增长率 | +| **G4 破坏性** | 推至拐点 2-3 倍 RPS,验证降级与自动恢复 | 恢复时间 + 异常日志摘录 | + +### 1.3 非目标(明确不做) + +- 不做端到端业务正确性测试(这是 E2E 的工作) +- 不做安全/渗透测试 +- 不做前端性能测试 +- 不做单元/集成测试 +- 不做 AI Chat WebSocket 压测(独立场景,本轮跳过) +- 不做活动榜单/星册等次要接口压测(本轮聚焦核心 7 场景) + +--- + +## 2. 关键约束与已验证事实 + +### 2.1 环境约束 + +| 项 | 现状 | +|---|---| +| 部署位置 | 阿里云 ECS `101.132.250.62`(**华东 1 / 杭州**,101.132.x.x 段;root SSH) | +| 资源 | **4G RAM / 2 CPU**(生产单机,无 staging) | +| 容器资源限额 | gateway 300M/0.5C,各微服务 100-200M/0.5C,PG 400M(max 100 connections),Redis 256M | +| 入口 | 公网 `http://101.132.250.62:8080`(无 nginx 反代,gateway 直接对外) | +| 部署脚本 | `docker/deploy.sh`(参考用法见脚本头部注释) | + +⚠️ **PG 内存配置冲突(必须在 preflight 阶段处理)**: +- PG 容器限额 400M,但 `POSTGRES_MAX_CONNECTIONS=100` +- 每个 PG backend 进程典型占用 5-10MB(work_mem + stack + plan cache,不含 shared_buffers) +- 100 connections × 7MB ≈ **700MB > 400M 容器限额** +- → R4 红线 85 connections 之前,PG 进程很可能已被 cgroup OOM Killer 杀掉 +- → R6 OOM 红线如果检测不准(详见 §7.3 修复说明),会出现"PG 突然消失但红线没触发" +- **处置方案**(任选其一): + - 方案 A(推荐):第一轮压测前**手动**把 `POSTGRES_MAX_CONNECTIONS` 降到 50(preflight 仅做**检测+报错+给出 SQL 命令**,不自动改 PG 配置,因为 `max_connections` 修改需要重启 PG 才生效,不能 reload)。手动步骤: + ```bash + # 改 docker-compose.prod.yml POSTGRES_MAX_CONNECTIONS=50 + # 重启 postgres 容器(约 30s 停机) + docker-compose -f docker-compose.prod.yml restart postgres + # 验证 + docker exec "$PG_CONTAINER" psql -U postgres -c "SHOW max_connections;" + ``` + - 方案 B:把 PG 容器 limits.memory 提到 1024M,max_connections 不变(同样需重启 PG) + - 方案 C:接受现状,把 R4 阈值从 85 调到 50(无停机,但风险还在) + +### 2.2 数据库约束(来自本地 `top-fans` 库 schema 调研) + +**库名差异(重要)**: +- 本地 docker:`top-fans`(带横线) +- prod docker-compose 配置:`topfans`(无横线) +- → seed/loadgen 工具的 DSN 必须参数化,**开工前先 ssh 到 prod 跑 `\d+ ` 验证 schema 与本地一致** + +**核心表与隐含约束**: + +| 表 | 关键约束 | +|---|---| +| `users` | mobile 唯一(仅 deleted_at IS NULL);id BIGSERIAL | +| `stars` | star_id BIGSERIAL;identity_id 唯一 | +| `fan_profiles` | `(user_id, star_id)` 唯一;`(star_id, nickname)` 唯一;多了 `experience`/`revenue_boost_bps` 字段(vs GORM model) | +| `assets` | id BIGSERIAL;外键 owner_uid → users.id, star_id → stars.star_id | +| `asset_likes` | **`exhibition_id NOT NULL`**;唯一约束 `(user_id, asset_id, exhibition_id)`;**点赞必须依附 exhibition** | +| `exhibitions` | `uk_asset WHERE deleted_at IS NULL`:每个 asset 同一时刻只能上一个展位 | +| `booth_slots` | `is_enabled` 默认 false,**seed 时必须显式置 true** | +| `mint_orders` | OrderID 是 UUID(字符串主键),不需序列重置 | + +**`auto_users` 表(避坑)**: +存在一张 `auto_users` 表(主键序列名 `auto_like_users_id_seq` 暴露原始用途:**自动点赞机器人元数据表**)。压测数据**绝不写入 auto_users**,避免被业务侧的自动点赞调度器扫到产生不可控背景流量。 + +### 2.3 业务约束 + +**铸造成本指数翻倍(关键约束)**: + +`mint_cost_config` 当前配置: + +``` +第1次:2 第2次:4 第3次:8 第4次:16 第5次:32 +第6次:64 第7次:128 第8次:256 第9次:512 第10次:1024 +累计 = 2046 水晶/用户 +``` + +**含义**: +- 单测试账号最多压 10 次铸造(之后 `mint_cost_config` 查空报错) +- → 铸造场景采用 **轮转重置策略**:每 200 秒一轮,跑完 reset 水晶+次数+订单,再开下一轮(详见 §5.4) + +**JWT secret**: +- 本地:`topfans-secret-key-local-dev-only` +- prod:`topfans-secret-key-please-change-in-production` +- seed 工具复用 `backend/pkg/jwt.GenerateToken()`,secret 通过 `--jwt-secret` 参数注入,**不要 commit 到 repo** + +### 2.4 已确认决策汇总 + +| 决策项 | 选择 | +|---|---| +| 压源位置 | 同地域阿里云 ECS(4G/2C 按量付费,~5 元/天) | +| 监控形态 | 可配置三档:`--monitor=off/lite/full`,默认 `lite` | +| 工具栈 | **方案 D**:自研 Go 二进制 `loadgen` + `seed` | +| 业务规模预期 | 早期项目摸底,无业务量预设 | +| 核心场景 | S1 登录、S2 资产读、S3 点赞、S4 铸造、S5 看板、S6 多维榜单、S7 上架 | +| seed 运行位置 | prod 服务器本地(避免 PG 公网暴露) | +| schema 验证 | 开工前 ssh prod 跑 diff | +| 铸造场景节奏 | 轮转重置 | +| RPS 阶梯策略 | 每场景独立阶梯(详见 §5.6) | +| 压测分轮 | 分两轮:探索 ~2h + 修复 + 验证 ~4h | +| 第一轮混合场景 | 不做(数据驱动后再定比例) | +| 6 维红线阈值 | 维持设计原值(详见 §7.3) | +| 实时仪表 | stderr 行模式(不做 TUI) | +| Grafana 面板 | 4 个(整机/容器/PG/业务) | + +--- + +## 3. 总体方案与架构 + +### 3.1 架构总览 + +``` +┌──────────────────────────┐ ┌────────────────────────────────────┐ +│ 压力机 (同地域 ECS) │ 公网 HTTP │ prod 101.132.250.62 (4G/2C) │ +│ │ ─────────► │ │ +│ loadgen (Go binary) │ │ docker-compose.prod.yml │ +│ ├ scenarios/*.go │ │ ├ gateway:8080 (REST) │ +│ ├ lib/{ramp,circuit, │ │ ├ userservice/socialservice/... │ +│ │ hdr,csv,client} │ │ └ postgres + redis │ +│ ├ users.csv (1000 行) │ │ │ +│ └ reports/run-*/ │ │ /opt/topfans/loadtest/ │ +│ │ ssh tunnel │ ├ seed binary │ +│ loadgen-watcher (ssh) │ ─────────► │ ├ sample.sh (后台) │ +│ │ │ ├ metrics-feed.jsonl │ +│ │ │ ├ emergency-stop.sh │ +│ │ │ └ restore-from-backup.sh │ +└──────────────────────────┘ └────────────────────────────────────┘ + ▲ ▲ + │ 报告生成(事后) │ 可选: docker-compose.monitor.yml + ▼ ▼ + ./reports/run-YYYYMMDD-HHMMSS/ cAdvisor + node/pg/redis-exporter + *.json *.csv *.md *.svg + Prometheus + Grafana (端口 3000) +``` + +### 3.2 为什么选这个架构 + +| 决策 | 理由 | +|---|---| +| **不在被压机器跑压源** | 资源争抢:loadgen 在 200-1000 goroutine 并发下吃 0.5-1 CPU、300-800MB,会污染容量数据 30-50%;localhost 走 lo 不经过物理 NIC,路径与真实用户不同;docker stats 自己也会被压慢,监控失真。**注意区分**:spec §4.2 的"1000 测试用户"是用户池规模(数据),loadgen 实际并发 goroutine 数由 RPS × 平均 RT 决定(200 RPS × 100ms RT = 20 并发 goroutine)。 | +| **同地域 ECS** | 跨公网压会把家宽延迟/丢包混进 P99,污染结论;**压源 ECS 与 prod 同在华东 1(杭州)**,内网/同骨干 RTT 2-5ms | +| **不绕过 gateway** | 真实业务路径就从 gateway 入,绕过测不出 gateway 自身瓶颈 | +| **可配置监控(off/lite/full)** | 摸容量拐点时 lite 干扰最小(< 30M);定位慢查询时 full(~400M/0.3C)值得开 | +| **方案 D 自研 Go 工具** | Go 后端团队熟,可复用 `pkg/jwt`/`pkg/types`;单二进制部署;逻辑可灵活定制(如铸造轮转) | + +### 3.3 工程目录结构 + +``` +backend/scripts/loadgen/ +├── seed/ +│ ├── main.go # 入口,解析 --jwt-secret/--db-dsn/--reset +│ ├── stars.go # INSERT star_id=999900 +│ ├── users.go # INSERT 1000 users (bcrypt 'Test@123') +│ ├── profiles.go # INSERT fan_profiles + 充值 2200 水晶 +│ ├── slots_and_exhibits.go # INSERT booth_slots (is_enabled=true) + exhibitions +│ ├── assets.go # INSERT 5000 assets (status=1) +│ ├── friendships.go # INSERT 10000 friendships +│ ├── tokens.go # 复用 pkg/jwt 预签 token,写 users.csv +│ ├── sequences.go # 重置所有相关表的序列(CLAUDE.md 规范) +│ ├── cleanup.go # DELETE WHERE star_id=999900(强校验) +│ └── README.md +├── loadgen/ +│ ├── main.go # 入口,解析 --scenario/--rps/--vus/--duration/--monitor +│ ├── lib/ +│ │ ├── ramp.go # 阶梯调度器:[]Stage{rps, duration} +│ │ ├── circuit.go # 6 维红线判停(详见 §7.3) +│ │ ├── hdr.go # HdrHistogram-go 封装 +│ │ ├── csv.go # users.csv 加载到内存 +│ │ ├── client.go # http.Transport(MaxConnsPerHost=500) +│ │ ├── ssh_metrics.go # ssh tail metrics-feed.jsonl +│ │ └── log.go # stderr 行仪表 + 全量 events.jsonl +│ ├── scenarios/ +│ │ ├── s1_login.go +│ │ ├── s2_read.go +│ │ ├── s3_like.go +│ │ ├── s4_mint.go # 含 reset SQL 调度 +│ │ ├── s5_dashboard.go +│ │ ├── s6_ranking.go +│ │ └── s7_place.go +│ ├── reporter/ +│ │ ├── json.go # raw 时序 +│ │ ├── csv.go # 聚合表 +│ │ ├── plot.go # gonum/plot 三联图 +│ │ └── markdown.go # report.md 生成 +│ ├── preflight.go # §8 7 项 sanity check +│ └── verify.go # 压测后数据完整性校验 +├── monitor/ +│ ├── sample.sh # 被压机后台采样 +│ ├── docker-compose.monitor.yml # cAdvisor+exporters+Prom+Grafana +│ └── grafana-dashboards/ # 4 个预置面板 JSON +├── recover/ +│ ├── emergency-stop.sh # 一键熔断 +│ └── restore-from-backup.sh # pg_dump 还原 +└── reports/ # gitignore,跑测产出 + └── run-YYYYMMDD-HHMMSS/ +``` + +### 3.4 loadgen CLI 完整命令与 flag 表(终审修复 D3) + +> 散落在 §4.5/§5.6/§6.1/§7.5/§8.5 的命令在此处统一定义。实施时**严格按这张表**生成 CLI。 + +| 子命令 | 用途 | flag | 默认值 | +|---|---|---|---| +| `loadgen seed --prod` | 在 prod 本地跑 seed | `--jwt-secret ` 必填 | - | +| | | `--db-host ` | `localhost` | +| | | `--db-name ` | `topfans` | +| | | `--db-password ` 或读 `$DB_PASSWORD` | - | +| | | `--reset` 删旧测试数据后重新 seed | false | +| | | `--reset-tokens` 只重签 token,不动数据 | false | +| `loadgen seed cleanup` | 清理测试数据 | `--keep-baseline` 保留 1000 testers + 资产 | false | +| | | `--full` 全删(含 stars/users/profiles) | false | +| `loadgen run` | 跑压测主流程 | `--scenarios ` 复数 ,逗号分隔 | - | +| | | `--stage ` | `step` | +| | | `--rps ` 单 RPS 模式 | - | +| | | `--vus ` 最大 VU 数 | 自动 | +| | | `--duration <30m>` 单阶段时长 | 按 §5.3 | +| | | `--inter-scenario-pause <15m>` | `15m` | +| | | `--monitor ` | `lite` | +| | | `--prod-ssh ` | - | +| | | `--target ` 被压 gateway 入口 | `http://101.132.250.62:8080` | +| `loadgen preflight` | 开压前 7 项检查 | `--target ` | - | +| | | `--prod-ssh ` | - | +| `loadgen verify` | 压后数据完整性校验 | `--prod-ssh ` | - | +| `loadgen report` | 从 raw data 生成 Markdown 报告 | `--input ` | - | +| | | `--output ` | `./report.md` | + +**命名约定(实施时强制)**: +- 多场景一律用 `--scenarios=S1,S2,...`(复数,逗号分隔) +- 单场景用 `--scenarios=S4`(不再设 `--scenario` 单数 flag,避免歧义) + +--- + +## 4. 测试数据准备 + +### 4.1 数据隔离策略("压测沙盒") + +所有压测数据归到一个独立的 `star_id`,物理隔离真实业务: + +| 维度 | 隔离值 | 业务真实值 | +|---|---|---| +| star_id | **999900** | 87, 88, 91, 93, 94, 95(6 个) | +| 测试手机号前缀 | **199000xxxxx**(11 位) | 13x/15x/17x... | +| 测试 user_id 区间 | **30000001 ~ 30001000** | max=110 | +| 测试 asset_id 起点 | **`MAX(assets.id) + 1000` 动态分配** | max=303 | +| 测试昵称 | `loadtest_` | (任意中文/英文) | +| 测试资产名 | `loadtest_asset__` | (任意) | + +### 4.2 数据规模 + +| 资源 | 数量 | 设计依据 | +|---|---|---| +| 测试用户 | 1000 | 200 并发 × 5 倍余量 | +| 每用户 crystal_balance 初始 | 2200 | ≥ 2046(10 次铸造累计)+ 缓冲 | +| 每用户预铸资产 | 5 | asset_id 从 `MAX+1000` 起。**用途分配**:资产 1-2 用于 seed 预上架(S3 点赞依赖),资产 3-5 留作未上架库存供 S7 上架/卸下轮转使用 | +| 每用户 booth_slots | 3(is_enabled=true) | 默认配额;slot_index=1,2 给 seed 预上架,slot_index=3 留给 S7 压测 | +| 每用户 exhibitions | 2(用 slot 1, 2) | "可点赞资产池"(S3 依赖) | +| 每用户测试好友 | 10 | S2/S6 部分查询走好友关系 | +| 总 INSERT 行数 | ~25,000 | users 1k + profiles 1k + assets 5k + slots 3k + exhibits 2k + friendships 1w + stars 1 | + +### 4.3 Seed 执行流程 + +```sql +BEGIN; + +-- 时间戳占位:ts = extract(epoch from now())*1000 (毫秒,与项目时间戳约定一致) +-- 实际 seed 程序中由 Go 侧 time.Now().UnixMilli() 计算 + +-- 1. 测试明星 +INSERT INTO stars (star_id, name, identity_id, is_active, created_at, updated_at) +VALUES (999900, 'loadtest_star', 'loadtest_star', true, ts, ts) +ON CONFLICT (star_id) DO NOTHING; + +-- 2. 1000 测试用户(password_hash 用 bcrypt('Test@123') 离线生成一次复用) +INSERT INTO users (id, mobile, password_hash, is_active, created_at, updated_at) VALUES + (30000001, '19900000001', '$2a$10$', true, ts, ts), + ... +ON CONFLICT (id) DO NOTHING; + +-- 3. fan_profiles + 充值 +INSERT INTO fan_profiles (user_id, star_id, nickname, crystal_balance, slot_limit, is_active, created_at, updated_at) VALUES + (30000001, 999900, 'loadtest_1', 2200, 3, true, ts, ts), ...; + +-- 4. assets(从 MAX(id)+1000 起步,避免与真实数据撞主键) +WITH base AS (SELECT COALESCE(MAX(id), 0) + 1000 AS start FROM assets) +INSERT INTO assets (id, owner_uid, star_id, name, cover_url, info, status, like_count, is_active, created_at, updated_at, grade) +SELECT start + n, owner_uid, 999900, 'loadtest_asset_'||owner_uid||'_'||idx, '', 'loadtest', 1, 0, true, ts, ts, 1 +FROM base, generate_series(1, 5000) n, ...; + +-- 5. booth_slots(每 user 3 个,is_enabled=true) +INSERT INTO booth_slots (host_profile_id, user_id, star_id, slot_index, is_enabled, created_at, updated_at) ...; + +-- 6. exhibitions(每 user 把 asset 1,2 上架到 slot 1,2) +INSERT INTO exhibitions (asset_id, slot_id, host_profile_id, occupier_uid, occupier_star_id, start_time, expire_at, created_at, updated_at) +SELECT a.id, s.slot_id, fp.id, a.owner_uid, 999900, ts, ts + 4*3600*1000, ts, ts +FROM assets a +JOIN fan_profiles fp ON a.owner_uid=fp.user_id AND fp.star_id=999900 +JOIN booth_slots s ON s.host_profile_id=fp.id AND s.slot_index IN (1,2) +WHERE a.star_id=999900 AND a.name LIKE 'loadtest_%'; + +-- 7. friendships(双向;status 默认 'accepted',唯一约束 (user_id, friend_id, star_id)) +INSERT INTO friendships (user_id, friend_id, star_id, status, intimacy, created_at, updated_at) +SELECT a.id, b.id, 999900, 'accepted', 0, ts, ts +FROM users a, users b +WHERE a.id BETWEEN 30000001 AND 30001000 + AND b.id BETWEEN 30000001 AND 30001000 + AND a.id != b.id + AND ((a.id - 30000000) + 1) % 10 = ((b.id - 30000000) % 10) +ON CONFLICT (user_id, friend_id, star_id) DO NOTHING; +-- 上述 JOIN 条件生成约 10000 行双向好友关系 + +COMMIT; + +-- 8. ⚠️ CLAUDE.md 强制:重置所有相关表的序列 +SELECT setval('users_id_seq', (SELECT MAX(id) FROM users)); +SELECT setval('fan_profiles_id_seq', (SELECT MAX(id) FROM fan_profiles)); +SELECT setval('assets_id_seq', (SELECT MAX(id) FROM assets)); +SELECT setval('booth_slots_slot_id_seq', (SELECT MAX(slot_id) FROM booth_slots)); +SELECT setval('exhibitions_id_seq', (SELECT MAX(id) FROM exhibitions)); +SELECT setval('stars_star_id_seq', (SELECT MAX(star_id) FROM stars)); +SELECT setval('asset_likes_id_seq', (SELECT COALESCE(MAX(id), 0) FROM asset_likes)); +SELECT setval('friendships_id_seq', (SELECT MAX(id) FROM friendships)); +SELECT setval('crystal_transaction_records_id_seq', (SELECT COALESCE(MAX(id), 0) FROM crystal_transaction_records)); +``` + +### 4.4 JWT Token 预签发 + +```go +// backend/scripts/loadgen/seed/tokens.go +import "github.com/topfans/backend/pkg/jwt" + +func GenerateTokensForLoadtest(users []TestUser, jwtSecret string) error { + jwt.SetSecret(jwtSecret) // 从命令行参数注入 + + csvFile, _ := os.Create("users.csv") + defer csvFile.Close() + writer := csv.NewWriter(csvFile) + writer.Write([]string{"phone", "password", "user_id", "star_id", "jwt_token", "asset_ids", "exhibition_ids"}) + + for _, u := range users { + token, err := jwt.GenerateToken(u.UserID, 999900, time.Now().UnixMilli()) + if err != nil { return err } + writer.Write([]string{ + u.Mobile, "Test@123", + strconv.FormatInt(u.UserID, 10), + "999900", token, + joinInt64Slice(u.AssetIDs, ";"), // 工具函数:strings.Builder + strconv.FormatInt + joinInt64Slice(u.ExhibitionIDs, ";"), + }) + } + return writer.Flush() +} +``` + +⚠️ **`users.csv` 加入 `.gitignore`**,包含 token 不能 commit。 + +⚠️ **``** 需要替换为 OSS 上真实存在的占位图 URL(seed 执行前先上传一张 `loadtest-placeholder.png` 到 OSS 并填入)。**上传方式**:用项目现有接口 `POST /api/v1/assets/oss/upload-signature` 获取签名 → PUT 文件到 OSS 的 `loadtest/loadtest-placeholder.png` 路径 → 拷贝返回的可访问 URL 填入 seed 工具的 `LOADTEST_PLACEHOLDER_URL` 常量。 + +### 4.5 数据清理策略 + +```bash +# 删压测产生的写入(保留 1000 个测试账号 + 资产,下次复用) +loadgen seed cleanup --keep-baseline + +# 全删(包括账号本身) +loadgen seed cleanup --full +``` + +**cleanup 安全校验**: + +```go +const LoadtestStarID = 999900 + +func cleanup(db *sql.DB, starID int64) error { + if starID != LoadtestStarID { + return errors.New("safety: cleanup only accepts loadtest star_id 999900") + } + queries := []string{ + "DELETE FROM asset_likes WHERE star_id = $1", + "DELETE FROM exhibitions USING fan_profiles fp WHERE exhibitions.host_profile_id=fp.id AND fp.star_id = $1", + "DELETE FROM booth_slots WHERE star_id = $1", + "DELETE FROM mint_orders WHERE star_id = $1", + "DELETE FROM crystal_transaction_records WHERE star_id = $1", + // assets / fan_profiles / users / stars: 按 --keep-baseline / --full 决定 + } + for _, q := range queries { + if _, err := db.Exec(q, starID); err != nil { return err } + } + return nil +} +``` + +--- + +## 5. 场景设计与 RPS 梯度 + +### 5.1 7 个场景一览 + +| ID | 场景 | 接口 | 依赖 | 预期瓶颈 | 基线 P95 目标 | +|---|---|---|---|---|---| +| S1 | 登录+鉴权 | `POST /auth/login` + `GET /me/profile` | mobile + password | UserService bcrypt 验密 / PG users 查询 / JWT 签发 CPU | < 200ms | +| S2 | 资产读 | `GET /assets/me/items?page=1` + `GET /assets/:id` 随机 | 预签 token + asset_ids | PG `idx_assets_owner_star` 索引 / Gateway→Dubbo→Asset 三跳 | < 100ms | +| S3 | 点赞 | `POST /social/assets/:id/like` + `DELETE` | 必须用 seed 上架的 asset_id(依附 exhibition) | PG `asset_likes` 唯一约束 / `assets.like_count` 行锁 | < 150ms | +| S4 | 资产铸造 | `POST /assets/mints/precreate` → `POST /assets/mints` | 水晶 ≥ cost + 未达 10 次硬上限 | PG 事务(扣余额+写订单) / `crystal_transaction_records` 流水 | < 500ms | +| S5 | 数据看板 | 7 个 `GET /dashboard/*` 串行 | 当前用户 token | PG 物化视图 / 多表 JOIN / Statistic 服务 | < 800ms(用户会话端到端)| +| S6 | 多维榜单 | `GET /rankings/{hot,original}?dimension={displaying,month,total}&star_id={87,88,93,999900}` | 24 种参数组合循环(2 接口 × 3 dimension × 4 star_id) | PG 排序+LIMIT / Asset 服务 Redis 缓存命中率 | < 250ms | +| S7 | 上架展位 | `POST /galleries/place` + `DELETE /galleries/slots/:slot_id/asset` | slot_index=3 留作压测槽位 | PG `exhibitions.uk_asset` 唯一 / booth_slots 状态机 | < 200ms | + +### 5.2 度量定义(避免歧义) + +**RPS 在本文档中的统一含义**:除非特别说明,"RPS" = **后端请求/秒(backend QPS)**,即 loadgen 实际发出的 HTTP 请求计数。 + +**S5 看板场景特例**:S5 一次"用户会话" = 7 个 `/dashboard/*` 串行请求。S5 的 RPS 阶梯(§5.3)以**用户会话视角**给出,对应后端 QPS = 阶梯值 × 7。例如 S5 阶梯 "20 RPS" 表示**20 个并发用户会话/秒,对应 140 backend QPS**。S5 的 P95/P99 也按"用户会话端到端"度量(即 7 个串行请求的总耗时)。 + +**S6 榜单场景特例**:S6 一次"用户行为" = 1 次请求(不串行)。S6 的 RPS = 后端 QPS。 + +**所有红线判定基于"后端 QPS 视角"**:§7.3 R1/R2/R3 的错误率和延迟红线统计的是 events.jsonl 单请求事件,**不分场景类型一律按原子请求计**。这意味着 S5 在 20 RPS(会话)= 140 QPS 时如果有 1.4 QPS 错误(5%),R1 触发。 + +### 5.3 4 阶段 RPS 梯度 + +> **⚠️ 两轮拆分(P0-1 修复)**:本节描述 4 阶段**完整 cycle 模型**。**第一轮(探索)只跑阶段 1+2**(baseline + step,225 min),目标是找到拐点;**阶段 3 稳定性 + 阶段 4 破坏性 + §5.5 混合场景全部推到第二轮(验证)**。第二轮窗口独立计算(详见 §6.3)。 +> +> | 阶段 | 第一轮 | 第二轮 | +> |---|---|---| +> | 1. Baseline | ✅ 跑 | (已有数据,跳过) | +> | 2. Step Ramp-up | ✅ 跑 | (已有拐点,跳过;如修复后想对比,可重跑) | +> | 3. Soak(30min × N) | ❌ 不跑 | ✅ 跑(在已知拐点的 60% 安全水位) | +> | 4. Stress(5min × N) | ❌ 不跑 | ✅ 跑(拐点 × 2-3 倍) | +> | 混合场景 | ❌ 不跑 | ✅ 跑(按数据驱动比例) | + +#### 阶段 1 · 基线 (Baseline) +- 目标:拿到"无并发干扰"的 P50/P95/P99 +- 执行:每场景 1 VU × 1 RPS × 3 min +- 产出:`baseline.csv` + +#### 阶段 2 · 容量阶梯 (Step Ramp-up) ← 找拐点 +- 目标:每场景独立 6 阶爬升,找到错误率/P99 突破阈值的 RPS +- 每阶 2 分钟 + +**每场景独立的 RPS 阶梯**: + +| 场景 | RPS 阶梯(每阶 2min) | 预估拐点 | +|---|---|---| +| S1 登录 | 2 → 5 → 10 → 15 → 25 → 40 | ~15 | +| S2 资产读 | 20 → 50 → 100 → 200 → 400 → 700 | ~250 | +| S3 点赞 | 5 → 10 → 20 → 40 → 80 → 150 | ~50 | +| S4 铸造 | 5 → 10 → 20 → 30 → 50 → 80 | ~30 | +| S5 看板 | 2 → 5 → 10 → 20 → 35 → 60 | ~20 | +| S6 榜单 | 20 → 50 → 100 → 200 → 400 → 700 | ~300 | +| S7 上架 | 5 → 10 → 20 → 40 → 80 → 150 | ~50 | + +每场景跑到红线(错误率>5% 持续 30s 或 P99>3s 持续 30s)自动停止。 + +#### 阶段 3 · 稳定性 (Soak) ← 找泄漏 +- 目标:取阶段 2 拐点的 60% 作为"安全水位",跑 30 分钟 +- 关注:goroutine / 内存增长 / PG connections / 慢查询累积 +- S1/S2/S3/S5/S6/S7 各跑一次 30min;S4 见 §5.4 + +#### 阶段 4 · 破坏性 (Stress) ← 验证降级 +- 目标:拐点 × 2-3 倍,跑 5 分钟 +- 观察:Gateway 503 / Dubbo 超时熔断 / PG 连接拒绝 / OOM Kill / 撤压后恢复时间 + +### 5.4 铸造场景特殊处理:每阶 reset 轮转 + +铸造单用户硬上限 10 次(mint_cost_config 只有 10 行):1000 用户共 10,000 次配额。 + +**为什么不能裸跑阶梯**(B1 自审发现): + +S4 阶梯 5→10→20→30→50→80 RPS(每阶 120s),累计请求量 = (5+10+20+30+50+80) × 120 = **23,400 次** >> 10,000 配额。 + +如果不每阶 reset,第 50 RPS 阶(累计 8400 次 + 120s × 50 = 14,400 次)就会大面积"用户已达 10 次"业务报错;80 RPS 阶(累计 16,800 次起)几乎 100% 失败 → **R3 5xx 红线触发,但实际不是系统拐点,是配额耗尽**,拐点测不出来。 + +**正确节奏(每阶单独 reset)**: + +``` +S4 阶梯每阶 = "压 120s → 暂停 → reset → 下一阶" + +阶段 1: 5 RPS × 120s = 600 req → reset +阶段 2: 10 RPS × 120s = 1200 req → reset +阶段 3: 20 RPS × 120s = 2400 req → reset +阶段 4: 30 RPS × 120s = 3600 req → reset +阶段 5: 50 RPS × 120s = 6000 req → reset +阶段 6: 80 RPS × 120s = 9600 req → reset +(每阶都在 10000 配额内,余量充足) +``` + +**稳定性阶段同样轮转**(取 50 RPS 安全水位): + +``` +[T+0] 开始压 50 RPS +[T+200s] loadgen 暂停(1000 用户 × 10 次 = 10000 / 50 RPS = 200s) +[T+201s] ssh prod 执行 reset SQL(约 5-10s) +[T+210s] 继续下一轮 +... +循环 9 轮 ≈ 30 分钟 +``` + +**Reset SQL(P0-2 修复:包装成可执行脚本 + PGPASSWORD)**: + +`scenarios/s4_mint.go` 在每阶/每轮结束后**通过 ssh 远程触发 prod 上的 `mint_reset.sh`**: + +```bash +# /opt/topfans/loadtest/scripts/mint_reset.sh(部署到 prod) +#!/bin/bash +set -e + +PG_CONTAINER=$(docker ps --filter 'name=postgres' --format '{{.Names}}' | grep -v exporter | head -1) +[ -z "$PG_CONTAINER" ] && { echo "❌ 找不到 postgres 容器"; exit 1; } +export PGPASSWORD="${DB_PASSWORD:-postgres123}" + +docker exec -i -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -d topfans <<'EOF' +BEGIN; +DELETE FROM user_mint_count WHERE star_id = 999900; +DELETE FROM mint_orders WHERE star_id = 999900; +UPDATE fan_profiles SET crystal_balance = 2200 WHERE star_id = 999900; +DELETE FROM crystal_transaction_records WHERE star_id = 999900; +DELETE FROM assets WHERE star_id = 999900 AND name LIKE 'loadtest_mint_%'; +COMMIT; +-- 序列不重置(mint_orders 主键是 UUID;assets 新建的会被上面 DELETE 清掉,序列空洞 OK) +EOF +echo "✅ mint reset 完成" +``` + +`scenarios/s4_mint.go` 调用方式(伪代码): +```go +func resetMintData() error { + cmd := exec.Command("ssh", prodSSH, "bash /opt/topfans/loadtest/scripts/mint_reset.sh") + return cmd.Run() +} +``` + +**铸造场景资产命名约定(重要)**: + +S4 压测调用 `POST /assets/mints` 时,**请求 body 的 `name` 字段必须以 `loadtest_mint_` 开头**(如 `loadtest_mint_30000001_round3_42`),这样 reset SQL 的 `name LIKE 'loadtest_mint_%'` 才能精准清理,不会误删 seed 阶段预铸的 `loadtest_asset_` 资产。 + +`scenarios/s4_mint.go` 构造请求时强制按此前缀生成 name。 + +### 5.5 不做的(YAGNI) + +- **混合场景**:第一轮不做。理由:早期项目业务比例还没成型,凭直觉给比例会产出"看似科学但实际是猜的"数字。等单场景拐点出齐,按业务相对调用频率回推 DAU 上限。 +- **WebSocket(AI Chat)**:独立的长连接压力模型,本轮不压。 +- **活动榜单 / 星册接口**:聚焦核心 7 场景。 + +### 5.6 场景间隔离缓冲与总时长(B8 自审修复) + +每个场景跑完不能立刻切下一个。必须等: + +| 缓冲项 | 最少耗时 | 原因 | +|---|---|---| +| TIME_WAIT 释放 | 120-240s | Linux `tcp_fin_timeout=60`,200 VU 的 TIME_WAIT 堆积要分钟级散去;不等会让下一场景压力机连接抖动 | +| 连接池回收 | 60-120s | Dubbo client / Go http.Transport idle conn + PG `idle_in_transaction_session_timeout`;前场景占用的 PG 连接要释放完 | +| Redis 缓存散热 | 60-300s | 前场景预热的热点 key 退场;不等会让下一场景"缓存命中率虚高" | +| PG WAL 消化 | 30-60s | 前场景的写操作 WAL 还在异步落盘 | +| cleanup SQL | 30-60s | S4 还要 §5.4 reset | +| 人眼判断 / 短报告 | 5-10min | 看本场景是否需要进入下一场景,还是要重跑 | + +**结论**:每场景之间至少 **8-12 min 缓冲**。 + +修正后的第一轮总时长(终审修复,明细可对账): + +| 阶段 | 单次耗时 | 次数 | 小计 | 累计 | +|---|---|---|---|---| +| 开场(seed + monitor 启动) | 2 min | 1 | 2 min | 2 min | +| Baseline(每场景 1 RPS) | 3 min | 7 场景 | 21 min | 23 min | +| Baseline 场景间短 buffer | 1 min | 6 间隔 | 6 min | 29 min | +| 阶梯(6 阶 × 2min/阶) | 12 min | 7 场景 | 84 min | 113 min | +| 阶梯场景间长 buffer | 15 min | 6 间隔 | 90 min | 203 min | +| 收尾(cleanup + verify + 释放) | 22 min | 1 | 22 min | 225 min | +| **合计** | | | | **225 min = 3h 45min** | + +→ §6.1 第一轮窗口:**02:00-06:00**(含 preflight 在 01:30-02:00 之外)。第二轮稳定性 + 破坏性约 4 小时(含混合场景)。 + +`loadgen run --scenarios=S1,S2,S3,S4,S5,S6,S7 --inter-scenario-pause=15m` 自动在场景间插入 pause。 + +--- + +## 6. 执行计划与时间盒 + +### 6.1 第一轮(探索压测) + +#### Day 1:环境与数据准备(白天,6-7 小时,分两个时段) + +| 时段 | 动作 | +|---|---| +| 上午 1h | ssh prod 跑 `\d+ users fan_profiles assets asset_likes exhibitions booth_slots mint_cost_config` 对照本地,生成 `prod-vs-local-schema-diff.md` | +| 上午 2h | 编写 `seed/` Go 工具,本地 docker-compose 联调跑通 | +| **下午 14:00-14:05(业务低峰,P0-5)** | **应用 §2.1 方案 A(必做)**:改 `docker-compose.prod.yml` 把 `POSTGRES_MAX_CONNECTIONS` 从 100 改到 50,`docker-compose -f docker-compose.prod.yml restart postgres`(约 30s 停机)。验证:`docker exec ... psql -c "SHOW max_connections;"` 返回 50 | +| 下午 1h | 阿里云控制台开 ECS(**华东 1 杭州 同地域**,4G/2C 按量付费) | +| 下午 1h | 编译 `seed` + `loadgen` 二进制;scp 到压力机 + scp seed 二进制和 `mint_reset.sh` 到 prod `/opt/topfans/loadtest/` | +| **晚上 23:00(次低峰)** | **预演 dry run**:用 `--monitor=off` 跑 5 min mini baseline(10 RPS × 1min × 7 场景),验证 preflight/seed/cleanup 链路通畅 | + +#### Day 1 当晚 / 02:00 - 06:00(即 Day 2 凌晨):第一次正式压测窗口 + +> **P0-3 对账:本表逐分钟与 §5.6 总时长表对账**。02:00 开场到 05:45 收尾结束 = 225 min;06:00 为余量缓冲(容纳意外延迟、监控停止、scp 报告等收尾动作)。 + +| 时间 | 持续 | 动作 | +|---|---|---| +| 01:30 | 25 min | preflight 检查(详见 §8.5;含 §8.2 防线 1 的 7 项 + max_connections=50 验证) | +| 01:55 | 5 min | pg_dump 备份完成(pg_dump 跑了 ~3 min,加 buffer) | +| 02:00 | 1 min | ssh prod 跑 `loadgen seed --prod` | +| 02:01 | 1 min | ssh prod 启动 `monitor.sh` 后台采样 | +| 02:02 | 21 min | 压力机跑 **baseline**(每场景 1 RPS × 3min,7 场景,**场景间 1min 短 buffer**) | +| 02:29 | 84 min | 压力机跑 **step 阶梯**(每场景 6 阶 × 2min,7 场景) | +| 02:29-05:35 | +90 min | **场景间 15min 长 buffer × 6 间隔**(与阶梯交错执行;阶梯第 1 场景跑完 12min → 15min buffer → 第 2 场景 → ... → 第 7 场景结束) | +| 05:35 | 5 min | ssh prod 停 monitor.sh + 收尾监控 | +| 05:40 | 5 min | `loadgen seed cleanup --keep-baseline` | +| 05:45 | 5 min | `loadgen verify`(详见 §8.5) | +| 05:50 | 10 min | 压力机拉回报告目录 + 释放 ECS(如 1 周内不再压) | +| **06:00** | — | **窗口结束,prod 完全可用** | + +> **加和验证**:开场 2 + baseline 27 + step+buffer 174(84+90 交错) + 收尾 25 = **228 min ≈ §5.6 表 225 min**(3 min 容差在 §6.5 允许内)。窗口实际 240 min,留 12 min 应急余量。 + +#### Day 3:分析与决策 + +- 读取 `report-round1.md` +- Review 会议:哪些瓶颈是**配置可修**(bcrypt cost、PG max_connections、连接池),哪些是**代码必改**(N+1、缺索引、锁粒度),哪些**接受现状** + +### 6.2 修复期(Day 3 - Day 14) + +如有必要,按 review 结论改代码:调 bcrypt cost、加索引、加缓存、调 Dubbo 超时。每个修复**打 tag 部署一次**便于第二轮对比。 + +### 6.3 第二轮(验证压测) + +**触发条件**:第一轮报告交付 + 团队 review 后,**决定是否修复瓶颈**: +- 如果第一轮拐点已经满足业务预期 → **第二轮可跳过** +- 如果改了代码/配置 → 第二轮只压**改动影响的场景** + +**第二轮内容**(详见 §5.3 拆分表): +- 阶段 3 稳定性:30min × 修改了的场景 +- 阶段 4 破坏性:5min × 修改了的场景 +- 混合场景:15min(按 §5.5 数据驱动的比例) + +**第二轮时长估算**(修改了 N 个场景的情况): +- 稳定性:30min × N + 15min × (N-1) 缓冲 +- 破坏性:5min × N + 5min × (N-1) 缓冲 +- 混合:15min + 30min 收尾 +- N=3 时约 **3h**;N=7(全部场景)时约 **6.5h**(要拆 2 个凌晨窗口) + +仍在凌晨 02:00-06:00 窗口(必要时第二天 02:00-06:00 续)。 + +⚠️ **JWT 重签(终审修复 C1)**:`pkg/jwt` 的 `TokenExpiration = 7 * 24 * time.Hour`(7 天)。第一轮 seed 时签的 token 7 天后过期。如第二轮在第一轮 7 天后才跑,必须**第二轮开压前 30 min 重跑**: + +```bash +# prod 服务器上 +PG_CONTAINER=$(docker ps --filter 'name=postgres' --format '{{.Names}}' | grep -v exporter | head -1) +loadgen seed --reset-tokens --jwt-secret="${JWT_SECRET}" --db-host=localhost --db-name=topfans +# --reset-tokens 仅重新签发 users.csv 里 1000 个 token,不动数据 +``` + +### 6.4 时间承诺 + +- 第一轮端到端:从今天起 **5 个工作日内**完成报告 +- 第二轮端到端(如触发):第一轮报告交付后 **2 周内** + +### 6.5 中止/回退原则 + +| 情况 | 动作 | +|---|---| +| 压测期间 prod 错误率持续 > 10% | loadgen 自动 SIGINT,ssh 跑 `emergency-stop.sh` | +| 监控仪表提示磁盘满(< 5GB) | 立即 stop | +| 用户半夜投诉 | 立即 stop,第二天 review 是否窗口选错 | +| 任何阶段 reset SQL 失败 | 不进入下一阶段,保留现场 | +| preflight 任何一项 fail | 拒绝启动主压测 | + +--- + +## 7. 监控指标与判停红线 + +### 7.1 监控分层(4 个采集源 × 3 个聚合粒度) + +``` +压力机侧(loadgen 自身) + ├ 单请求级:start_ts/end_ts/rt_ms/status/scenario/vu_id → events.jsonl + ├ 10 秒滑窗:actual_rps/p50/p95/p99/error_rate → 10s.csv + stderr + └ 全局 HDR 直方图:每场景 .bin 文件,事后还原任意百分位 + +被压机侧 · monitor.sh(lite 模式,默认) + ├ docker stats(每 5s,所有容器 CPU/MEM/NET/IO) + ├ pg_stat_activity(每 5s) + ├ pg_stat_statements top 10(每 30s) + ├ redis INFO(每 5s) + └ uptime + df -h(每 5s) + +被压机侧 · Prometheus(full 模式,可选) + ├ cadvisor(容器维度,scrape 5s) + ├ node-exporter(OS 层) + ├ postgres-exporter(连接/lock/cache hit/replication) + └ redis-exporter(内存/命令/客户端) + +业务侧探针(可选) + └ Gateway /health 每 1s 探活(外部 SLA 视角) +``` + +### 7.2 实时仪表盘(stderr 行模式) + +每秒一行: + +``` +[02:15:34] S3 like | target= 50 actual= 48.3 | p50=42 p95=180 p99=520 | err=0.2% | vu=5 conn_err=0 +``` + +每分钟汇总: + +``` +═══════════════════════════════════════════════════════════════ +[02:16:00] SCENARIO=S3 STAGE=stage3-20rps ELAPSED=01:58 + Requests: 5,820 (97.0/s avg) + Errors: 12 (0.2%) + Latency p50: 42ms p95: 198ms p99: 612ms max: 2.1s + Connection: active=5 refused=0 timeout=0 + Status: 2xx=99.8% 4xx=0.1% 5xx=0.1% +═══════════════════════════════════════════════════════════════ +``` + +### 7.3 6 维红线(任一触发即停) + +| # | 红线 | 触发条件 | 数据源 | 周期 | +|---|---|---|---|---| +| R1 | 客户端错误率 | `error_rate > 5%` 持续 30s | loadgen 滑窗 | 5s | +| R2 | 客户端 P99 | `p99 > 3000ms` 持续 30s | loadgen HDR | 5s | +| R3 | 5xx 比例 | `5xx_rate > 10%` 持续 10s | loadgen status | 5s | +| R4 | PG 连接数 | `pg_active > 85`(max 100 的 85%) | monitor.sh + pg_stat_activity | 5s | +| R5 | 磁盘空间 | `disk_free < 5GB`(B9 修复:原 2GB 太低,PG WAL 在写密集场景会快速膨胀 2-3GB) | monitor.sh + df -h | 30s | +| R6 | 容器 OOM | `docker events --filter event=oom` 收到事件 **或** `docker inspect --format='{{.State.OOMKilled}}'` 返回 true **或** 容器 RestartCount 较基线增加 | monitor.sh + docker events 流式订阅 | 1s(事件触发)| + +⚠️ **不要用 `ExitCode=137` 检测 OOM**(自审 B5): +- 137 = 128 + SIGKILL,**`docker stop` 超时也会触发**,无法区分 OOM/手动 kill +- `restart: always` 把容器自动拉起后,`docker inspect` 看到的是新实例的 ExitCode=0,**OOM 痕迹消失** +- 正确做法:`docker events --filter event=oom` 提供实时事件流;`State.OOMKilled` 字段是 docker daemon 直接记录的 OOM 标志 + +`lib/circuit.go` 主循环每 5s 检查;触发后向主进程发 SIGINT,loadgen 优雅退出。 + +### 7.4 Grafana 4 面板(--monitor=full) + +| 面板 | 内容 | +|---|---| +| 1. 整机概览 | CPU / Memory / Network / Disk IO 时序 + load1/5/15 | +| 2. 容器维度 | 每容器 CPU% / Memory 对比限额 + 重启次数(捕捉 OOM) | +| 3. PG 健康 | active connections vs max / longest transaction / cache hit ratio / locks / WAL 增长 | +| 4. 业务指标 | loadgen RPS / Error / P99(Prometheus 从 loadgen `:9091/metrics` pull) | + +loadgen 暴露 `:9091/metrics`,被 Prometheus pull。 + +### 7.5 报告生成(事后) + +```bash +loadgen report --input ./reports/run-20260613-0200/ --output ./report.md +``` + +自动: +- 从 `*.hdr` 还原任意百分位(**注**:HdrHistogram precision=3 时 P99 以下可信,**P99.9+ 误差 10-30%**,仅作参考;如需准确 P99.9,preflight 阶段将 precision 提到 4-5 位但内存 4×) +- `gonum/plot` 画每场景 RPS-Latency-Error 三联图(SVG) +- 表格列出每场景拐点 RPS +- 摘录 prod 监控的高负载片段 +- 自动写"建议"节:哪些场景接近瓶颈、哪些有空间 + +--- + +## 8. 风险控制与回滚 + +### 8.1 崩溃形态与恢复时间矩阵 + +| # | 形态 | 概率 | 影响 | 自动恢复 | 恢复时间 | 数据风险 | +|---|---|---|---|---|---|---| +| 1 | 容器 OOM Killed | 🔴 高 | 单服务短时不可用 | ✅ `restart: always` | 10-30s | 无 | +| 2 | PG 连接打满 100 | 🟡 中 | 整站新请求拒绝 | ✅ idle 释放 | 停压后 30s | 无 | +| 3 | PG 慢查询雪崩 / 死锁 | 🟡 中 | 整站 hang | ⚠️ 半自动 | 30-90s | 无 | +| 4 | TIME_WAIT 端口耗尽 | 🟡 中 | 新连接失败 | ✅ 60s 释放 | 60s | 无 | +| 5 | 磁盘满 | 🟢 低 | 整站 5xx | ❌ 手动 rm logs | 2-5min | 极小 | +| 6 | 整机 OOM(PG 进程被 cgroup kill) | 🟡 中(**原 🟢 错算,§2.1 PG 400M/100conn 冲突让概率提高**) | 整站宕机 | ✅ + WAL replay | 60-120s | 无 | +| 7 | 数据污染真实数据 | 🔴 极低 | 业务异常 | ❌ 备份还原 | 5-10min | **中-高** | +| 8 | 阿里云硬件故障 | ⚪ 极罕 | 数据丢失 | ❌ 快照还原 | 30min-1h | 高 | +| 9 | **压力机自身 GC 暴涨**(B9 新增) | 🟡 中 | P99 数据失真,记的延迟里有 30-50% 是 loadgen 自己 | ❌ 需重测 | 重测整轮 | 无(但结果作废) | +| 10 | **PG WAL 写满**(B9 新增) | 🟡 中(200 VU × 30min 点赞写 5w 行) | 整库变只读 | ❌ checkpoint + rm 旧 WAL | 5-15min | 无 | +| 11 | **Docker bridge NAT 表满**(B9 新增) | 🟢 低(200 VU × 30min × 无 keep-alive ≈ 36w NAT 条目) | 新连接失败 | ✅ keep-alive 缓解 | 立即(开 keep-alive) | 无 | +| 12 | **PG 锁等待雪崩**(B9 新增) | 🟡 中(S3 点赞行锁 + S7 唯一约束) | 假装连接耗尽,根因是锁 | ❌ pg_terminate_backend 杀长事务 | 30-90s | 无 | +| 13 | **SSH tunnel 断开监控失效**(B9 新增) | 🟡 中(凌晨阿里云抖动) | R4/R5/R6 静默失效 | ⚠️ autossh 自愈 | 5-30s | 无 | + +**新增 R7 红线(压源自检)**: + +| R7 | 压源自身延迟漂移 | loadgen 内部计算 `client_p99_自测 > 0.3 × target_p99` 持续 30s | loadgen 内部钩子 | 5s | 触发说明压力机已成为瓶颈,数据不可信,需重测或上分布式压源 | + +### 8.2 三道熔断防线 + +**防线 1:压测前必做(不做就不开压)** + +> **⚠️ 容器名注意(B7 自审修复)**:以下命令中的 `topfans-postgres` 来自 `docker-compose.prod.yml:41` 的 `container_name:` 字段,但实际启动后名字可能因 docker-compose 版本/项目目录前缀不同而异(如 `topfans_postgres_1`)。**所有脚本应用动态查找代替硬编码**: +> ```bash +> PG_CONTAINER=$(docker ps --filter 'name=postgres' --format '{{.Names}}' | grep -v exporter | head -1) +> ``` +> 下文示例为可读性保留 `topfans-postgres` 名称,**实施时统一替换为 `$PG_CONTAINER`**。 + +> **⚠️ PGPASSWORD 注入(终审修复)**:`docker exec ... psql -U postgres` 在容器内仍走 `pg_hba.conf` 鉴权,prod 配置默认要求密码(`.env.prod` 里 `DB_PASSWORD=postgres123`)。所有 psql 命令前必须 `export PGPASSWORD`,否则鉴权失败。 + +```bash +# 脚本头部统一注入(防线 1 / restore / snapshot / reset SQL 共用) +PG_CONTAINER=$(docker ps --filter 'name=postgres' --format '{{.Names}}' | grep -v exporter | head -1) +[ -z "$PG_CONTAINER" ] && { echo "❌ 找不到 postgres 容器"; exit 1; } +export PGPASSWORD="${DB_PASSWORD:-postgres123}" # 与 .env.prod 一致 + +# 数据库逻辑备份 +docker exec -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" pg_dump -U postgres -d topfans \ + -f /opt/topfans/backups/pre-loadtest-$(date +%Y%m%d-%H%M).sql + +# 阿里云控制台拍快照(5-10 分钟,手动操作) +# ECS → 实例详情 → 云盘 → 创建快照 + +# 磁盘检查 +df -h | grep -E "/$|/opt" # 需要 ≥ 15GB 空闲(终审修复:原 10GB 在 30min soak 场景 WAL 膨胀下余量不够) + +# PG 连接基线 +docker exec -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -d topfans \ + -c "SELECT count(*) FROM pg_stat_activity;" + +# PG 内存约束自检(B4 自审修复 + 终审 #6 澄清) +docker exec -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -d topfans \ + -c "SHOW max_connections;" +# 如果显示 100 但容器 limit=400M,preflight 报错并退出,提示运维手动跑 §2.1 方案 A +``` + +**防线 2:压测中自动熔断** + +loadgen 6 维红线(详见 §7.3)+ monitor.sh 旁路监控。任一红线触发,loadgen 主进程收 SIGINT 优雅退出。 + +**防线 3:手动一键灭火(`emergency-stop.sh`)** + +```bash +#!/bin/bash +# /opt/topfans/loadtest/recover/emergency-stop.sh + +pkill -9 loadgen 2>/dev/null + +PG_CONTAINER=$(docker ps --filter 'name=postgres' --format '{{.Names}}' | grep -v exporter | head -1) +export PGPASSWORD="${DB_PASSWORD:-postgres123}" +docker exec -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -d topfans -c " + SELECT pg_terminate_backend(pid) FROM pg_stat_activity + WHERE state != 'idle' AND now() - query_start > interval '10 seconds' + AND usename = 'postgres'; +" + +cd /opt/topfans/docker +docker-compose -f docker-compose.prod.yml restart + +sleep 30 +curl -f http://localhost:8080/health || echo "⚠️ Gateway 仍未恢复" +``` + +### 8.3 备份兜底(唯一不可恢复路径的保险) + +```bash +# /opt/topfans/loadtest/recover/restore-from-backup.sh +# 用法:bash restore-from-backup.sh /opt/topfans/backups/pre-loadtest-20260613-0200.sql + +BACKUP_FILE=$1 +[ -f "$BACKUP_FILE" ] || { echo "备份文件不存在"; exit 1; } + +PG_CONTAINER=$(docker ps --filter 'name=postgres' --format '{{.Names}}' | grep -v exporter | head -1) +export PGPASSWORD="${DB_PASSWORD:-postgres123}" + +# 停所有应用层(动态查找 topfans 相关容器) +docker ps --filter 'name=topfans-' --format '{{.Names}}' \ + | grep -v postgres | grep -v redis | xargs -r docker stop + +# 删库重建 +docker exec -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -c "DROP DATABASE topfans;" +docker exec -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -c "CREATE DATABASE topfans;" + +# 还原 +docker exec -i -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -d topfans < "$BACKUP_FILE" + +# 启动 +cd /opt/topfans/docker +docker-compose -f docker-compose.prod.yml --profile prod up -d + +sleep 30 +curl http://localhost:8080/health +``` + +实测还原时间:~150MB DB → **5-8 分钟**。 + +### 8.4 测试数据污染的额外保护 + +| 层 | 机制 | +|---|---| +| 1 隔离 star_id | 所有写入强制带 `star_id=999900`,与真实业务 star_id=87~95 物理隔离 | +| 2 cleanup 强制 WHERE | 所有清理 SQL 必须含 `WHERE star_id=999900`,代码层 reject 没有 WHERE 的语句 | +| 3 本地完整跑一遍 | 用 docker-compose.local.yml 跑一次 seed + 压测 + cleanup,验证不影响 star_id≠999900 数据 | + +### 8.5 preflight 与 verify + +#### Preflight(开压前自动检查) + +``` +loadgen preflight --target http://101.132.250.62:8080 --prod-ssh root@101.132.250.62 +``` + +7 项检查: + +``` +✓ ① Gateway /health 返回 200 +✓ ② SSH 到 prod 成功 +✓ ③ pg_dump 备份文件存在 (size > 50MB) +✓ ④ 阿里云快照在 24h 内创建(人工确认或 ECS API 检查) +✓ ⑤ prod 磁盘空闲 > 10GB +✓ ⑥ users.csv 加载 OK,1000 行 +✓ ⑦ JWT_SECRET 与 prod 一致(用 1 个 token 调 /me/profile 验证返回 200) +───────────────────────────────────────── +ALL CHECKS PASSED — 可以开压 +``` + +任一项 fail,loadgen 拒绝启动主压测。 + +#### Verify(压测后自动验证) + +``` +loadgen verify --prod-ssh root@101.132.250.62 +``` + +检查: + +- diff pre-snapshot vs post-snapshot(真实用户数据未变) +- `SELECT count(*) FROM mint_orders WHERE star_id != 999900 AND created_at > <压测开始时间>` == 0 +- PG 连接数已回落到基线 +- 所有容器 Restart Count 未增加(除非压崩) +- 磁盘空闲恢复(cleanup 后日志已清) + +任一项 fail → 走 emergency-stop + restore。 + +### 8.6 prod 状态打点 + +```bash +# pre-test-snapshot.sh / post-test-snapshot.sh +PG_CONTAINER=$(docker ps --filter 'name=postgres' --format '{{.Names}}' | grep -v exporter | head -1) +export PGPASSWORD="${DB_PASSWORD:-postgres123}" +docker exec -e PGPASSWORD="$PGPASSWORD" "$PG_CONTAINER" psql -U postgres -d topfans -c " + SELECT + (SELECT count(*) FROM users) AS users, + (SELECT count(*) FROM assets) AS assets, + (SELECT count(*) FROM asset_likes) AS likes, + (SELECT count(*) FROM mint_orders) AS mints, + (SELECT sum(crystal_balance) FROM fan_profiles WHERE star_id != 999900) AS real_user_crystal_total, + NOW() AS snapshot_at; +" +``` + +**`real_user_crystal_total` 若变化 = 数据污染告警**。 + +### 8.7 临时关闭外部告警(如有) + +```bash +# D6 自审修复:项目当前未确认是否接入告警系统,本节为条件式 +# 1. 检查是否有 webhook 配置 +grep -rEn "webhook|alert|dingding|wechat|feishu|lark|slack" \ + /opt/topfans/docker/.env.prod /opt/topfans/docker/docker-compose.prod.yml 2>/dev/null + +# 2a. 如果有 webhook,临时改为本地黑洞地址 +# 例如 sed -i.bak 's|ALERT_WEBHOOK=.*|ALERT_WEBHOOK=http://127.0.0.1:9999/null|' .env.prod +# 完成后 systemctl 或 docker-compose restart 让配置生效 +# 压测结束后 mv .env.prod.bak .env.prod 恢复 + +# 2b. 如果 grep 没有命中(项目当前状态),本节跳过 + +# 3. 通知运维:今晚 02:00-06:00 压测,告警别理 +``` + +### 8.8 不可触碰的红线(人工铁律) + +| 红线 | 处置 | +|---|---| +| 没 pg_dump 就不开压 | preflight 检查 | +| 白天/工作时段不开压 | 时间窗口 02:00-06:00 | +| cleanup SQL 没有 `WHERE star_id=999900` 不执行 | seed/cleanup 代码层强校验 | +| 压测期间发现真实用户投诉立刻停 | emergency-stop | +| 第一轮没出报告前不开第二轮 | 防止盲压 | + +### 8.9 关于 IP 白名单(决定不做) + +考虑过在 gateway 加临时 middleware,让真实用户走 503 维护页只让压力机 IP 进入。**决定不做**,理由: + +- 早期项目凌晨 02:00-06:00 DAU 接近 0,撞上概率极低 +- 加 middleware 要重新部署 gateway,反而引入新风险 +- 万一压测被熔断了,真实用户却被白名单拦了 = 把 prod 自己锁死 + +靠时间窗口 + 6 维红线自动判停就够。 + +--- + +## 9. 产出物清单 + +### 9.1 第一轮交付 + +``` +docs/loadtest/round1/ +├── prod-vs-local-schema-diff.md # Day 1 schema 对照报告 +├── seed-validation.log # Day 1 联调记录 +├── report-round1.md # 主报告(模板见 §9.2) +├── monitoring/ +│ ├── sample-YYYYMMDD-0200.log # 服务端采样原始 +│ ├── docker-stats.csv # CPU/内存时序 +│ ├── pg-slow-queries.txt # pg_stat_statements top 20 +│ └── grafana-screenshots/ # 仅 --monitor=full 时 +└── raw-data/ + ├── baseline-*.json # 每场景基线 + ├── step-*.json # 每场景阶梯 + └── hdr-histograms.bin # 二进制 HDR(可重放) +``` + +### 9.2 `report-round1.md` 模板 + +> ⚠️ 以下数字均为**格式示例**,不是真实压测结果。真实数字由 `loadgen report` 自动从 raw data 生成。 + +```markdown +# 第一轮压测报告 - 2026-MM-DD + +## 摘要(示例值) +- 总耗时: 1h45min +- 测试场景: 7 +- 拐点小结(示例): S1=15RPS, S2=350RPS, S3=60RPS, S4=25RPS, S5=18RPS, S6=400RPS, S7=70RPS +- 主要瓶颈(示例): bcrypt cost (S1), PG aggregation (S5) +- 建议: 优先改 S1/S5 + +## 各场景详情 +(每场景一节:RPS 曲线、错误率曲线、Top 慢查询、容器 CPU/内存峰值) + +## 系统观察 +- 整机 CPU 峰值: 95%(发生在 S2=700 RPS 时) +- PG connections 峰值: 78/100(发生在 S5=60 RPS 时)← 接近上限 +- Redis 内存峰值: 180MB / 256M +- 容器 OOM: 无 + +## 后续行动 +- [ ] 改 bcrypt cost 10 → 8(S1 拐点提高 ~3x) +- [ ] 给 statistic_mv 加 refresh 调度(S5 拐点提高 ~2x) +- [ ] 调 PG max_connections 100 → 150(S5 紧迫) +``` + +--- + +## 10. 不在范围(YAGNI) + +| 项 | 不做的原因 | +|---|---| +| 分布式追踪(OpenTelemetry / Jaeger) | 早期摸底用不上 | +| 业务级埋点(每接口单独 metrics) | 加业务代码代价大 | +| 全链路日志聚合(ELK) | Loki/Promtail 都嫌重 | +| APM(New Relic / DataDog) | 商业产品,超出范围 | +| TUI 实时仪表盘 | stderr 行模式更可靠 | +| 第一轮混合场景 | 业务比例还没成型,凭直觉给比例没意义 | +| WebSocket 压测 | 独立的长连接模型,本轮不做 | +| IP 白名单 middleware | 凌晨窗口 DAU 接近 0,引入新风险得不偿失 | +| 端到端业务正确性测试 | E2E 的工作 | +| 前端性能测试 | 范围外 | +| 安全/渗透测试 | 范围外 | +| 活动榜单/星册接口 | 聚焦核心 7 场景 | + +--- + +## 11. 后续步骤 + +1. **本设计文档复核** ← 当前节点 +2. 调用 `writing-plans` skill 生成实施计划 +3. Day 1: schema diff + seed 工具开发 + 压力机准备 +4. Day 2: 凌晨 02:00-06:00 第一次正式压测 +5. Day 3: review 报告与决策 +6. 修复期(可选) +7. 第二轮压测(验证) + +--- + +## 附录 A:术语表 + +| 术语 | 含义 | +|---|---| +| **VU** | Virtual User,并发虚拟用户数 | +| **RPS** | Requests Per Second,每秒请求数 | +| **P50/P95/P99** | 延迟分位数(中位数 / 95% / 99% 的请求在此值以下完成) | +| **HDR** | High Dynamic Range Histogram,高精度低开销直方图,用于准确算百分位 | +| **拐点 RPS** | 错误率/P99 突破阈值前的最大稳态 RPS | +| **安全水位** | 拐点 × 60%,作为稳定性测试的目标 RPS | +| **Soak Test** | 稳定性测试,长时间维持中等负载找泄漏 | +| **Stress Test** | 破坏性测试,超出极限验证降级与恢复 | +| **MTTR** | Mean Time To Recover,平均恢复时间 | +| **影子表** | 与生产表结构相同但物理分离的副本(本方案用 `star_id` 隔离代替) | + +--- + +## 附录 B:被测接口路径速查 + +| 场景 | Method | 路径 | 主要 body/query | +|---|---|---|---| +| S1 | POST | `/api/v1/auth/login` | `{mobile, password}` | +| S1 | GET | `/api/v1/me/profile` | (Header: Authorization) | +| S2 | GET | `/api/v1/assets/me/items?page=1&page_size=20` | | +| S2 | GET | `/api/v1/assets/:asset_id` | | +| S3 | POST | `/api/v1/social/assets/:asset_id/like` | (需 asset 在 exhibition 中) | +| S3 | DELETE | `/api/v1/social/assets/:asset_id/like` | | +| S4 | POST | `/api/v1/assets/mints/precreate` | `{material_url, name, info, ...}` | +| S4 | POST | `/api/v1/assets/mints` | `{order_id}` | +| S5 | GET | `/api/v1/dashboard/today-overview` | | +| S5 | GET | `/api/v1/dashboard/income-curve` | | +| S5 | GET | `/api/v1/dashboard/exhibition-summary` | | +| S5 | GET | `/api/v1/dashboard/like-income-by-level` | | +| S5 | GET | `/api/v1/dashboard/top-assets` | | +| S5 | GET | `/api/v1/dashboard/level-distribution` | | +| S5 | GET | `/api/v1/dashboard/upgrade-progress` | | +| S6 | GET | `/api/v1/rankings/hot?dimension={displaying,month,total}&star_id={87,88,93,999900}&page=1&page_size=10` | dimension 值已通过代码核实(ranking_service.go:63-72),仅这 3 个 | +| S6 | GET | `/api/v1/rankings/original?...` | | +| S7 | POST | `/api/v1/galleries/place` | `{slot_id, asset_id}` | +| S7 | DELETE | `/api/v1/galleries/slots/:slot_id/asset` | | + +--- + +*— 设计文档结束 —* diff --git a/frontend/pages/square/components/HotCategoryBlock.vue b/frontend/pages/square/components/HotCategoryBlock.vue index 2dec6d3..1d8f130 100644 --- a/frontend/pages/square/components/HotCategoryBlock.vue +++ b/frontend/pages/square/components/HotCategoryBlock.vue @@ -469,14 +469,20 @@ onUnmounted(() => { margin: 0 auto; width: 480rpx; height: 96rpx; - clip-path: inset(-200rpx 0 16rpx 0); + // clip-path: inset(-200rpx 0 16rpx 0); &::before { content: ""; position: absolute; inset: 0; - background: linear-gradient(184deg, #ff5a5d -36.55%, #c2ebff 121.2%); + background: linear-gradient( + 183deg, + #FF5A5D -36.55%, #C2EBFF 121.2% + + ); opacity: 0.8; - // backdrop-filter: blur(5.85px); + // Figma 用的就是 filter: blur(图形模糊),不是 backdrop-filter(背景模糊) + filter: blur(3.7px); + -webkit-filter: blur(3.7px); border-top-left-radius: 14px; border-top-right-radius: 13px; border-bottom-right-radius: 8px; @@ -515,7 +521,7 @@ onUnmounted(() => { } .ranking-tab-item.active .ranking-tab-icon { - top: -24rpx; + top: -16rpx; } .ranking-tab-label { @@ -530,6 +536,7 @@ onUnmounted(() => { .ranking-tab-icon { display: block; position: absolute; + } .ranking-tab-item.active .ranking-tab-label { @@ -602,18 +609,21 @@ onUnmounted(() => { flex-direction: column; position: relative; z-index: 2; - background: linear-gradient( - 145.83deg, - rgba(255, 90, 93, 0.2) 16.63%, - rgba(76, 237, 255, 0.2) 48.19%, - rgba(255, 122, 124, 0.2) 83.71% - ); + // background: linear-gradient( + // 145.83deg, + // rgba(255, 90, 93, 0.2) 16.63%, + // rgba(76, 237, 255, 0.2) 48.19%, + // rgba(255, 122, 124, 0.2) 83.71% + // ); + background: url("/static/square/galaxy/xbbj.png") center no-repeat; + background-size: 100% 100%; + // pointer-events: none; // backdrop-filter: blur(4.65px); border-top-left-radius: 13px; border-top-right-radius: 12px; border-bottom-right-radius: 12px; border-bottom-left-radius: 12px; - opacity: 0.8; + // opacity: 0.8; padding: 40rpx 20rpx 32rpx; overflow: hidden; } @@ -787,6 +797,7 @@ onUnmounted(() => { /* Top 排名标签(顶到右边) */ .top-badge { margin-left: auto; /* 推到右侧 */ + margin-right:8rpx; min-width: 100rpx; height: 36rpx; border-radius: 18rpx; @@ -809,6 +820,7 @@ onUnmounted(() => { } .badge-rank-number { + font-family: "Abyssinica SIL"; font-size: 84rpx; font-weight: 600; /* 渐变填充到文字 */ diff --git a/frontend/static/square/galaxy/xbbj.png b/frontend/static/square/galaxy/xbbj.png new file mode 100644 index 0000000000000000000000000000000000000000..db46f2fee39707ded37e2ac2f4f7755b4cce7894 GIT binary patch literal 352539 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�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 q|Iz=^|Iz=^|Iz=^|Iz=^KK(!Xsu