echo/supabase/seed.sql
ddshi 4c42d6b6f5 feat: 完成阶段 2 - 用户系统与智能体初始化
## 完成的功能
- 用户登录/注册(邮箱 + Google OAuth)
- 初始问题引导流程(4 个问题)
- 智能体自动生成(根据用户回答)
- 智能体列表页面

## 新增文件
- 登录/注册页面和组件
- Onboarding 页面和组件
- 智能体列表页面
- 智能体 API 端点
- 智能体 Prompt 设计

## 数据库迁移
- onboarding_fix 迁移(users.has_completed_onboarding)

## 测试
- 登录/注册:100% 通过
- Onboarding:85% 通过
- 智能体功能:85% 通过

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-12 14:08:12 +08:00

176 lines
13 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================================
-- Echo (回声) - 测试数据种子脚本
-- 版本: 202601120001
-- 创建日期: 2026-01-12
-- 说明: 用于本地开发和测试的初始数据
-- ============================================================================
-- ============================================================================
-- 第一部分: 测试用户数据
-- ============================================================================
-- 插入测试用户
INSERT INTO users (id, email, google_id, avatar_url, language, subscription_status) VALUES
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', 'test1@example.com', 'google_12345', 'https://api.dicebear.com/7.x/avataaars/svg?seed=test1', 'zh-CN', 'free'),
('b2c3d4e5-f6a7-8901-bcde-f23456789012', 'test2@example.com', 'google_67890', 'https://api.dicebear.com/7.x/avataaars/svg?seed=test2', 'zh-CN', 'premium'),
('c3d4e5f6-a7b8-9012-cdef-345678901234', 'test3@example.com', NULL, 'https://api.dicebear.com/7.x/avataaars/svg?seed=test3', 'en-US', 'free');
-- ============================================================================
-- 第二部分: 测试智能体数据
-- ============================================================================
-- 测试用户 1 的智能体
INSERT INTO agents (id, user_id, name, personality, background, avatar_url, is_custom, is_default, language, system_prompt) VALUES
('d4e5f6a7-b8c9-0123-defa-456789012345', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', '十年后的自己',
'{"traits": ["warm", "wise", "patient"], "tone": "gentle"}',
'你是一个在海边开书店的中年人,生活简单而充实。每天早上你会去海边散步,然后开始在书店里整理书籍,等待有缘人的到来。',
'avatar_default_1.png', FALSE, TRUE, 'zh-CN',
'你是用户「test1」的未来的自己。你在海边开了一家书店生活简单而充实。'),
('e5f6a7b8-c9d0-1234-efab-567890123456', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', '未来的投资人',
'{"traits": ["analytical", "confident", "strategic"], "tone": "professional"}',
'你是一个成功的投资人,在金融行业打拼多年。你懂得如何做出明智的决策,也经历过失败和挫折。',
'avatar_custom_1.png', TRUE, FALSE, 'zh-CN',
'你是用户「test1」想象中的未来的投资人角色。');
-- 测试用户 2 的智能体
INSERT INTO agents (id, user_id, name, personality, background, avatar_url, is_custom, is_default, language, system_prompt) VALUES
('f6a7b8c9-d0e1-2345-fabc-678901234567', 'b2c3d4e5-f6a7-8901-bcde-f23456789012', '五年后的自己',
'{"traits": ["energetic", "optimistic", "creative"], "tone": "encouraging"}',
'你是一个自由创作者,在世界各地旅居,同时进行写作和艺术创作。生活充满可能性和惊喜。',
'avatar_default_2.png', FALSE, TRUE, 'zh-CN',
'你是用户「test2」想象中的五年后的自己一个自由创作者。');
-- 测试用户 3 的智能体
INSERT INTO agents (id, user_id, name, personality, background, avatar_url, is_custom, is_default, language, system_prompt) VALUES
('a7b8c9d0-e1f2-3456-bcde-789012345678', 'c3d4e5f6-a7b8-9012-cdef-345678901234', 'Future Self',
'{"traits": ["wise", "calm", "insightful"], "tone": "thoughtful"}',
'You are living in a peaceful mountain cabin, working on meaningful projects while maintaining a balanced life.',
'avatar_default_3.png', FALSE, TRUE, 'en-US',
'You are user「test3」s future self, living a balanced life in a mountain cabin.');
-- ============================================================================
-- 第三部分: 测试初始问题回答数据
-- ============================================================================
INSERT INTO onboarding_answers (user_id, question_1, question_2, question_3, question_4) VALUES
('a1b2c3d4-e5f6-7890-abcd-ef1234567890',
'希望成为一个内心平静、对生活有掌控力的人,能够帮助他人实现梦想。',
'希望在一个靠海的小城,有一个自己的书店或咖啡馆,生活节奏缓慢而充实。',
'目前最大的困扰是对未来的不确定感,不知道自己选择的路是否正确。',
'最在乎的人是父母和几个多年的老朋友。'),
('b2c3d4e5-f6a7-8901-bcde-f23456789012',
'希望成为一个自由且有创造力的人,能够通过自己的作品影响他人。',
'世界各地,目前可能在一个温暖的海边城市,或者欧洲的某个小镇。',
'焦虑于如何在追求梦想和维持生计之间找到平衡。',
'家人和一些志同道合的朋友。'),
('c3d4e5f6-a7b8-9012-cdef-345678901234',
'Someone who has found inner peace and lives authentically according to their values.',
'Living in a peaceful mountain area or a small coastal town, close to nature.',
'Feeling stuck in the daily grind and unsure how to break free.',
'My family and a few close friends who truly understand me.');
-- ============================================================================
-- 第四部分: 测试信件数据
-- ============================================================================
-- 测试用户 1 的信件
INSERT INTO letters (id, user_id, agent_id, content, ai_reply, status, scheduled_at, replied_at) VALUES
-- 已回复的信件
('b8c9d0e1-f2a3-4567-cdef-890123456789', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', 'd4e5f6a7-b8c9-0123-defa-456789012345',
'亲爱的未来的我,你好。我现在对未来的职业选择感到非常迷茫。我正在考虑是否要换一份工作,但又不确定这是不是一个正确的决定。希望你能给我一些建议。',
'亲爱的过去的自己,收到你的信了。我理解你现在的迷茫和不确定。我只想告诉你,人生没有绝对正确的道路,只有适合当下的选择。重要的是保持学习的心态,勇敢尝试。',
'replied', '2026-01-10 10:00:00+00', '2026-01-10 18:30:00+00'),
('c9d0e1f2-a3b4-5678-defa-901234567890', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', 'd4e5f6a7-b8c9-0123-defa-456789012345',
'最近压力很大,感觉身边没有人能理解我。我想对未来的自己说,希望那时的你已经找到了内心的平静。',
'亲爱的,我收到你的信了。首先,我想告诉你,压力是成长的一部分。当我回望过去,我发现那些让我感到最艰难的时刻,往往是塑造我的关键时刻。',
'replied', '2026-01-11 10:00:00+00', '2026-01-11 16:45:00+00'),
-- 待处理的信件
('d0e1f2a3-b4c5-6789-efab-012345678901', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', 'd4e5f6a7-b8c9-0123-defa-456789012345',
'今天是我的生日,想给未来的自己写一封信。希望明年的今天,我已经实现了自己的目标,变成了更好的自己。',
NULL, 'pending', '2026-01-12 12:00:00+00', NULL),
-- 草稿信件
('e1f2a3b4-c5d6-7890-fabc-123456789012', 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', 'd4e5f6a7-b8c9-0123-defa-456789012345',
'这是一封草稿信件,我还在思考要写什么内容。',
NULL, 'draft', NULL, NULL);
-- 测试用户 2 的信件
INSERT INTO letters (id, user_id, agent_id, content, ai_reply, status, scheduled_at, replied_at) VALUES
('f2a3b4c5-d6e7-8901-bcde-234567890123', 'b2c3d4e5-f6a7-8901-bcde-f23456789012', 'f6a7b8c9-d0e1-2345-fabc-678901234567',
'我想辞掉现在稳定的工作,去追求自己的梦想。但是又害怕失败,你说我应该怎么做?',
'收到你的信了!我理解你的纠结。稳定和梦想之间的选择确实不容易。但我想告诉你,失败不可怕,可怕的是从未尝试。',
'replied', '2026-01-09 14:00:00+00', '2026-01-09 20:00:00+00');
-- ============================================================================
-- 第五部分: 测试邮票数据
-- ============================================================================
-- 测试用户 1 的邮票
INSERT INTO user_stamps (user_id, stamp_def_id, source, letter_id, obtained_at, used_at) VALUES
-- 每日邮票(未使用)
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM stamp_definitions WHERE code = 'daily_default'), 'daily_grant', NULL, '2026-01-12 00:00:00+00', NULL),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM stamp_definitions WHERE code = 'daily_default'), 'daily_grant', NULL, '2026-01-11 00:00:00+00', NULL),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM stamp_definitions WHERE code = 'daily_default'), 'daily_grant', NULL, '2026-01-10 00:00:00+00', NULL),
-- 已使用的邮票
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM stamp_definitions WHERE code = 'daily_default'), 'daily_grant', 'b8c9d0e1-f2a3-4567-cdef-890123456789', '2026-01-09 00:00:00+00', '2026-01-10 10:00:00+00'),
-- 成就邮票
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM stamp_definitions WHERE code = 'welcome'), 'achievement', NULL, '2026-01-01 12:00:00+00', NULL),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM stamp_definitions WHERE code = 'first_letter'), 'achievement', 'b8c9d0e1-f2a3-4567-cdef-890123456789', '2026-01-10 10:00:00+00', NULL);
-- 测试用户 2 的邮票
INSERT INTO user_stamps (user_id, stamp_def_id, source, letter_id, obtained_at, used_at) VALUES
-- 付费用户每日多张邮票
('b2c3d4e5-f6a7-8901-bcde-f23456789012', (SELECT id FROM stamp_definitions WHERE code = 'daily_default'), 'daily_grant', NULL, '2026-01-12 00:00:00+00', NULL),
('b2c3d4e5-f6a7-8901-bcde-f23456789012', (SELECT id FROM stamp_definitions WHERE code = 'daily_default'), 'daily_grant', NULL, '2026-01-12 00:00:00+00', NULL),
('b2c3d4e5-f6a7-8901-bcde-f23456789012', (SELECT id FROM stamp_definitions WHERE code = 'daily_default'), 'daily_grant', NULL, '2026-01-12 00:00:00+00+00', NULL);
-- ============================================================================
-- 第六部分: 测试成长标签数据
-- ============================================================================
INSERT INTO growth_tags (user_id, letter_id, mood_tags, topic_tags, behavior_tags, sentiment_score, keywords, ai_analysis) VALUES
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', 'b8c9d0e1-f2a3-4567-cdef-890123456789',
ARRAY['anxious', 'hopeful'], ARRAY['career'], ARRAY['increased_frequency'], 0.45,
ARRAY['迷茫', '选择', '未来', '建议', '决定'],
'用户对职业选择感到迷茫,但同时对未来抱有希望。这是一个关于职业转型的关键时刻。'),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', 'c9d0e1f2-a3b4-5678-defa-901234567890',
ARRAY['anxious', 'peaceful'], ARRAY['mental_health', 'growth'], ARRAY['stable'], 0.30,
ARRAY['压力', '平静', '理解', '关键'],
'用户正在经历压力期,但展现出内在的韧性。情绪标签显示焦虑与平静并存,表明用户正在寻找平衡。'),
('b2c3d4e5-f6a7-8901-bcde-f23456789012', 'f2a3b4c5-d6e7-8901-bcde-234567890123',
ARRAY['determined', 'confused'], ARRAY['career', 'lifestyle'], ARRAY['contemplation'], 0.55,
ARRAY['梦想', '工作', '害怕', '尝试', '失败'],
'用户在稳定和追求梦想之间挣扎,但表现出强烈的改变意愿。这是一个重要的转折点。');
-- ============================================================================
-- 第七部分: 测试成就数据
-- ============================================================================
INSERT INTO achievements (user_id, milestone_id, achieved_at, notification_sent) VALUES
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM milestones WHERE code = 'welcome'), '2026-01-01 12:00:00+00', TRUE),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', (SELECT id FROM milestones WHERE code = 'first_letter'), '2026-01-10 10:00:00+00', TRUE),
('b2c3d4e5-f6a7-8901-bcde-f23456789012', (SELECT id FROM milestones WHERE code = 'welcome'), '2026-01-05 10:00:00+00', TRUE);
-- ============================================================================
-- 第八部分: 测试每日统计数据
-- ============================================================================
INSERT INTO daily_stats (user_id, stat_date, letters_sent, stamps_used, stamps_granted, last_active_at) VALUES
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', '2026-01-12', 0, 0, 1, '2026-01-12 10:00:00+00'),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', '2026-01-11', 1, 0, 1, '2026-01-11 10:00:00+00'),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', '2026-01-10', 1, 1, 1, '2026-01-10 10:00:00+00'),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', '2026-01-09', 0, 0, 1, '2026-01-09 00:00:00+00'),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890', '2026-01-08', 0, 0, 1, '2026-01-08 00:00:00+00'),
('b2c3d4e5-f6a7-8901-bcde-f23456789012', '2026-01-12', 0, 0, 3, '2026-01-12 00:00:00+00'),
('b2c3d4e5-f6a7-8901-bcde-f23456789012', '2026-01-11', 1, 0, 3, '2026-01-11 14:00:00+00');
-- ============================================================================
-- 种子数据插入完成
-- ============================================================================
-- 验证数据
SELECT 'Users count: ' || COUNT(*)::TEXT FROM users;
SELECT 'Agents count: ' || COUNT(*)::TEXT FROM agents;
SELECT 'Letters count: ' || COUNT(*)::TEXT FROM letters;
SELECT 'User stamps count: ' || COUNT(*)::TEXT FROM user_stamps;
SELECT 'Achievements count: ' || COUNT(*)::TEXT FROM achievements;