Tianji
tianji
Install / Use
/learn @zabr1314/TianjiREADME
天机AI - AI驱动的东方玄学平台
<div align="center"> <img src="./docs/images/logo.png" alt="天机AI Logo" width="120"/>结合传统东方智慧与现代AI技术的个性化命理分析平台
</div>📖 项目简介
天机AI是一个创新的AI驱动东方玄学平台,将传统中华命理学与现代人工智能技术完美融合。平台提供专业的八字命理分析、合盘配对、卜卦占卜、运势预测等多元化服务,旨在为用户提供科学、准确、个性化的命理指导。
✨ 核心特色
- 🎯 AI驱动分析 - 基于DeepSeek大模型,提供智能化命理解读
- 🔮 多元化服务 - 涵盖八字、合盘、卜卦、运势、姓名、解梦六大核心功能
- 💎 天机点系统 - 创新的虚拟积分体系,灵活的付费模式
- 🎨 东方美学设计 - 融合传统文化元素的现代化UI设计
- 📱 全端响应式 - 完美适配桌面端与移动端体验
- 🌙 明暗主题 - 支持日夜模式切换,护眼舒适
🎪 功能模块
1. 个人八字命盘 (200天机点)
- 根据出生时间生成专业八字命盘
- AI深度解析性格特质、事业运势、感情走向
- 提供人生建议和改运方向

2. 八字合盘配对 (300天机点)
- 双人八字深度匹配分析
- 感情兼容性评分和详细解读
- 关系发展建议和注意事项

3. 日常卜卦占卜 (150天机点)
- 基于易经六十四卦的智能占卜
- 支持抛硬币等互动式卜卦体验
- 针对具体问题提供指导建议

4. 个人运势日历 (100天机点)
- 基于八字的每日运势预测
- 吉凶宜忌、幸运色彩、数字推荐
- 个性化的日常生活指导

5. 姓名学分析 (120天机点)
- 专业的姓名学五格剖象分析
- 姓名与八字的匹配度评估
- 改名建议和吉祥用字推荐

6. AI智能解梦 (80天机点)
- AI驱动的梦境象征解析
- 结合心理学与传统解梦理论
- 梦境寓意和生活指导建议

🛠️ 技术栈
前端技术
- 框架: Next.js 15+ (App Router)
- UI库: React 19 + TypeScript
- 样式: Tailwind CSS + shadcn/ui组件
- 状态管理: Zustand
- 表单处理: React Hook Form + Zod
- 主题: next-themes (明暗模式)
- 图标: Lucide React
后端技术
- 数据库: Supabase (PostgreSQL)
- 认证: Supabase Auth (Cookie-based SSR)
- 实时功能: Supabase Realtime
- 安全: Row Level Security (RLS)
AI集成
- AI服务: DeepSeek API
- 接口: OpenAI SDK兼容
- 模型: deepseek-chat
测试框架
- 单元测试: Jest + React Testing Library
- 集成测试: Jest
- E2E测试: Playwright
- API模拟: MSW
🚀 快速开始
环境要求
- Node.js 18+
- npm 或 yarn
- Git
安装步骤
- 克隆项目
git clone https://github.com/your-username/tianji-ai.git
cd tianji-ai
- 安装依赖
npm install
- 环境配置
# 复制环境变量模板
cp .env.local.example .env.local
# 编辑环境变量
# NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
# NEXT_PUBLIC_SUPABASE_PUBLISHABLE_OR_ANON_KEY=your-supabase-anon-key
# DEEPSEEK_API_KEY=your-deepseek-api-key
- 启动开发服务器
npm run dev
- 数据库设置
# 登录到 Supabase 项目控制台
# 1. 访问 https://supabase.com/dashboard
# 2. 创建新项目或选择现有项目
# 3. 在 SQL Editor 中执行数据库迁移
在 Supabase 项目的 SQL Editor 中执行以下 SQL 脚本来创建所需的数据表:
-- 创建用户资料表
CREATE TABLE public.user_profiles (
id UUID REFERENCES auth.users ON DELETE CASCADE PRIMARY KEY,
full_name TEXT,
avatar_url TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建天机点账户表
CREATE TABLE public.tianji_accounts (
id UUID REFERENCES auth.users ON DELETE CASCADE PRIMARY KEY,
balance INTEGER DEFAULT 100 NOT NULL CHECK (balance >= 0),
total_earned INTEGER DEFAULT 100 NOT NULL,
total_spent INTEGER DEFAULT 0 NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建天机点交易记录表
CREATE TABLE public.tianji_transactions (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
type TEXT NOT NULL CHECK (type IN ('earn', 'spend', 'refund')),
amount INTEGER NOT NULL,
description TEXT,
related_service TEXT,
related_id UUID,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建八字分析记录表
CREATE TABLE public.bazi_analyses (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
name TEXT NOT NULL,
gender TEXT NOT NULL CHECK (gender IN ('male', 'female')),
birth_year INTEGER NOT NULL,
birth_month INTEGER NOT NULL,
birth_day INTEGER NOT NULL,
birth_hour INTEGER NOT NULL,
birth_city TEXT NOT NULL,
lunar_date JSONB,
bazi_chart JSONB NOT NULL,
analysis_result JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建合盘分析记录表
CREATE TABLE public.hepan_analyses (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
person1_info JSONB NOT NULL,
person2_info JSONB NOT NULL,
relationship_type TEXT NOT NULL,
compatibility_score INTEGER NOT NULL CHECK (compatibility_score >= 0 AND compatibility_score <= 100),
analysis_result JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建卜卦记录表
CREATE TABLE public.bugua_divinations (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
question TEXT NOT NULL,
question_category TEXT NOT NULL,
urgency_level TEXT NOT NULL,
divination_method TEXT NOT NULL CHECK (divination_method IN ('time', 'coin')),
hexagram_data JSONB NOT NULL,
interpretation JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建运势记录表
CREATE TABLE public.calendar_fortunes (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
fortune_date DATE NOT NULL,
user_info JSONB NOT NULL,
fortune_data JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL,
UNIQUE(user_id, fortune_date)
);
-- 创建姓名分析记录表
CREATE TABLE public.name_analyses (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
name TEXT NOT NULL,
analysis_type TEXT NOT NULL CHECK (analysis_type IN ('existing', 'suggestion')),
birth_info JSONB,
analysis_result JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建解梦记录表
CREATE TABLE public.dream_interpretations (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
dream_content TEXT NOT NULL,
dream_category TEXT NOT NULL,
dream_emotion TEXT NOT NULL,
dream_frequency TEXT,
is_lucid_dream BOOLEAN DEFAULT FALSE,
user_demographics JSONB,
interpretation JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
);
-- 创建用户收藏表
CREATE TABLE public.user_favorites (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL,
item_type TEXT NOT NULL,
item_id UUID NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL,
UNIQUE(user_id, item_type, item_id)
);
-- 启用行级安全策略 (RLS)
ALTER TABLE public.user_profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.tianji_accounts ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.tianji_transactions ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.bazi_analyses ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.hepan_analyses ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.bugua_divinations ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.calendar_fortunes ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.name_analyses ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.dream_interpretations ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.user_favorites ENABLE ROW LEVEL SECURITY;
-- 创建 RLS 政策
CREATE POLICY "用户只能查看自己的资料" ON public.user_profiles FOR ALL USING (auth.uid() = id);
CREATE POLICY "用户只能操作自己的天机点账户" ON public.tianji_accounts FOR ALL USING (auth.uid() = id);
CREATE POLICY "用户只能查看自己的交易记录" ON public.tianji_transactions FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "用户只能查看自己的八字分析" ON public.bazi_analyses FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "用户只能查看自己的合盘分析" ON public.hepan_analyses FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "用户只能查看自己的卜卦记录" ON public.bugua_divinations FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "用户只能查看自己的运势记录" ON public.calendar_fortunes FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "用户只能查看自己的姓名分析" ON public.name_analyses FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "用户只能查看自己的解梦记录" ON public.dream_interpretations FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "用户只能管理自己的收藏" ON public.user_favorites FOR ALL USING (auth.uid() = user_id);
-- 创建天机点操作函数
CREATE OR REPLACE FUNCTION public.spend_tianji_points(
p_user_id UUID,
p_amount INTEGER,
p_description TEXT,
p_service TEXT DEFAULT NULL,
p_related_id UUID DEFAULT NULL
)
RETURNS BOOLEAN
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
current_balance INTEGER;
BEGIN
-- 检查用户余额
SELECT balance INTO current_balance
FROM public.tianji_accounts
WHERE id = p_user_id;
IF current_balance IS NULL THEN
RETURN FALSE;
END IF;
IF current_balance < p_amount THEN
RETURN FALSE;
END IF;
-- 更新账户余额
UPDATE public.tianji_accounts
SET
balance = balance - p_amount,
total_spent = total_spent + p_amount,
updated_at = now()
WHERE id = p_user_id;
-- 记录交易
INSERT INTO public.tianji_transactions (
user_id, type, amount, description, related_service, related_id
) VALUES (
p_user_id, 'spend', p_amount, p_description, p_service, p_related_id
);
RETURN TRUE;
END;
$$;
-- 创建新用户时自动创建相关记录的函数
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER
LANGUAGE plpgsql
SECURITY DEFIN
