## 完成的功能 - 用户登录/注册(邮箱 + Google OAuth) - 初始问题引导流程(4 个问题) - 智能体自动生成(根据用户回答) - 智能体列表页面 ## 新增文件 - 登录/注册页面和组件 - Onboarding 页面和组件 - 智能体列表页面 - 智能体 API 端点 - 智能体 Prompt 设计 ## 数据库迁移 - onboarding_fix 迁移(users.has_completed_onboarding) ## 测试 - 登录/注册:100% 通过 - Onboarding:85% 通过 - 智能体功能:85% 通过 Co-Authored-By: Claude <noreply@anthropic.com>
176 lines
13 KiB
SQL
176 lines
13 KiB
SQL
-- ============================================================================
|
||
-- 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;
|