Files
digital-psychology/apps/api/migrations/000013_analytics_ops.up.sql
T
jackyu66gitandCursor 7ab9add5dd
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
feat(ops): ECR-007 行为分析与 ECR-008 内容运营后台
落地埋点 ingest/数据看板、首页宫格 CMS 与测评上下架;含账号引导、问答流式与免责声明去重,以及 review P1 审计同事务修复。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:26:16 +08:00

30 lines
1.4 KiB
SQL

-- Ops-B analytics (ECR-007)
CREATE TABLE IF NOT EXISTS analytics_sessions (
session_id varchar(64) PRIMARY KEY,
device_key varchar(128) NOT NULL,
user_id uuid NULL REFERENCES users(id),
started_at timestamptz NOT NULL DEFAULT now(),
ended_at timestamptz NULL,
exit_page text NULL,
duration_ms int NULL
);
CREATE INDEX IF NOT EXISTS idx_analytics_sessions_started ON analytics_sessions(started_at DESC);
CREATE INDEX IF NOT EXISTS idx_analytics_sessions_user ON analytics_sessions(user_id);
CREATE INDEX IF NOT EXISTS idx_analytics_sessions_device ON analytics_sessions(device_key);
CREATE TABLE IF NOT EXISTS analytics_events (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
session_id varchar(64) NOT NULL REFERENCES analytics_sessions(session_id),
user_id uuid NULL REFERENCES users(id),
name varchar(64) NOT NULL,
page_path text NULL,
props jsonb NOT NULL DEFAULT '{}',
client_ts timestamptz NOT NULL,
received_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_analytics_events_received ON analytics_events(received_at DESC);
CREATE INDEX IF NOT EXISTS idx_analytics_events_name_day ON analytics_events(name, ((received_at AT TIME ZONE 'UTC')::date));
CREATE INDEX IF NOT EXISTS idx_analytics_events_page ON analytics_events(page_path) WHERE page_path IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_analytics_events_session ON analytics_events(session_id);