feat: Update to v3.0.0 with AI-enhanced analysis and documentation cleanup

- Update project version to 3.0.0
- Add AI-enhanced analysis features for Ziwei numerology
- Add detailed star strength explanations (旺/得地/平/不得地/陷)
- Add comprehensive Ming Gong position analysis
- Update all project branding from 三算命 to 神机阁
- Remove outdated Supabase-based documentation
- Update README with latest tech stack and features
- Clean up docs directory, keeping only relevant files
This commit is contained in:
patdelphi
2025-08-20 18:03:32 +08:00
parent 9f95e2c12f
commit 71ec3b4615
14 changed files with 1388 additions and 6581 deletions

View File

@@ -1,10 +1,38 @@
# 更新日志
本文档记录了三算命项目的所有重要更改。
本文档记录了神机阁项目的所有重要更改。
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)
并且本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
## [3.0.0] - 2025-08-20
### 新增
- **AI增强分析**: 为紫微斗数添加了AI驱动的个性化分析功能
- 个性化理财建议根据主星特质提供14种不同的理财策略
- 现代事业建议:结合数字化时代特点的职业发展指导
- 详细成功策略每个主星6个具体的事业发展要点
- **星曜强度详解**: 完善了十二宫位的星曜强度解释系统
- 五个等级详细说明:旺、得地、平、不得地、陷
- 每个宫位显示具体的强度含义和改善建议
- 可视化的强度等级说明卡片
- **命宫位置增强**: 大幅提升了命宫位置的解释深度
- 五行属性详细说明(子宫属水、丑宫属土等)
- 深层性格影响分析和行为模式解读
- 独立的命宫位置详解区域
### 改进
- **用户体验优化**: 所有术语都有详细解释,降低学习门槛
- **前端显示增强**: 使用更好的布局和视觉设计展示分析结果
- **项目品牌统一**: 将所有"三算命"更新为"神机阁"
- **技术栈升级**: 更新到最新版本的依赖包
### 技术改进
- 升级 Vite 到 6.0.1
- 升级 TypeScript 到 5.6.2
- 升级 Tailwind CSS 到 3.4.16
- 优化了前端组件的性能和可维护性
## [未发布] - 2025-08-20
### 修复

View File

@@ -1,6 +1,6 @@
# Koyeb 部署指南
本指南将帮助您将三算命项目部署到 Koyeb 平台。
本指南将帮助您将神机阁项目部署到 Koyeb 平台。
## 🚀 部署步骤
@@ -158,4 +158,4 @@ Koyeb 会自动监控您的应用健康状态:
---
**部署成功后,您的三算命应用就可以在全球范围内访问了!** 🎉
**部署成功后,您的神机阁应用就可以在全球范围内访问了!** 🎉

View File

@@ -1,20 +1,31 @@
# 神机阁 - AI命理分析平台
[![Version](https://img.shields.io/badge/version-2.0.0-blue.svg)](https://github.com/your-repo/ai-numerology-refactored)
[![Version](https://img.shields.io/badge/version-3.0.0-blue.svg)](https://github.com/your-repo/shenjige-numerology)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![Node.js](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org/)
[![React](https://img.shields.io/badge/react-18.3.1-blue.svg)](https://reactjs.org/)
[![TypeScript](https://img.shields.io/badge/typescript-5.6.2-blue.svg)](https://www.typescriptlang.org/)
[![Vite](https://img.shields.io/badge/vite-6.0.1-646CFF.svg)](https://vitejs.dev/)
一个纯AI生成的中华传统命理分析平台提供八字命理、紫微斗数、易经占卜等专业分析服务。
## ✨ 核心功能
- 🎯 **八字命理分析** - 四柱排盘、五行分析、格局判断
- 🌟 **紫微斗数分析** - 星盘排布、十二宫位、四化飞星
### 🔮 命理分析服务
- 🎯 **八字命理分析** - 四柱排盘、五行分析、格局判断、大运流年
- 🌟 **紫微斗数分析** - 星盘排布、十二宫位、四化飞星、详细解读
- 🔮 **易经占卜分析** - 梅花易数、卦象解读、人生指导
- 👤 **用户系统** - 注册登录、个人资料、历史记录
- 📱 **响应式设计** - 支持桌面端和移动端
### 💡 智能特性
- 🧠 **AI增强分析** - 个性化理财建议、事业发展指导、现代职业建议
- 📊 **星曜强度解释** - 旺、得地、平、不得地、陷的详细说明
- 🎨 **命宫位置详解** - 五行属性、深层含义、性格影响分析
### 🛠️ 系统功能
- 👤 **完整用户系统** - 注册登录、个人资料、分析历史
- 📱 **响应式设计** - 完美支持桌面端、平板和移动端
- 🎨 **中国风UI** - 传统文化与现代设计的完美融合
- 🔒 **数据安全** - JWT认证、SQLite本地存储、隐私保护
## 🚀 快速开始
@@ -52,7 +63,7 @@ npm run dev
- 前端应用: http://localhost:5173
- 后端API: http://localhost:3001/api
## 🏗️ 项目架构 (v2.0)
## 🏗️ 项目架构 (v3.0)
### 架构特点
@@ -60,21 +71,35 @@ npm run dev
- **API去重**: 防止重复调用的请求去重机制
- **性能优化**: useMemo缓存和useEffect依赖优化
- **错误隔离**: 历史记录保存失败不影响分析功能
- **智能增强**: AI驱动的个性化分析和现代化建议
- **用户体验**: 详细的星曜强度解释和命宫位置分析
### 技术栈
**前端**
- React 18.3.1 + TypeScript
- Tailwind CSS (中国风主题)
- Vite (构建工具)
- React Router (路由管理)
**前端技术**
- React 18.3.1 + TypeScript 5.6.2
- Vite 6.0.1 (构建工具)
- Tailwind CSS 3.4.16 (中国风主题)
- React Router 6 (路由管理)
- Radix UI (组件库)
- React Hook Form + Zod (表单验证)
- Recharts (数据可视化)
- Lucide React (图标库)
**后端**
- Node.js + Express
- SQLite (数据库)
- JWT (身份认证)
**后端技术**
- Node.js + Express 4.18.2
- Better-SQLite3 12.2.0 (数据库)
- JWT + bcryptjs (身份认证)
- Helmet (安全中间件)
- CORS (跨域处理)
- 分层架构设计
**开发工具**
- ESLint + TypeScript ESLint (代码检查)
- Concurrently (并发运行)
- Nodemon (开发热重载)
- PNPM 9.0.0 (包管理器)
### 目录结构
```
@@ -93,7 +118,7 @@ npm run dev
└── public/ # 静态资源
```
## 🔄 v2.0 重构亮点
## 🔄 v3.0 重构亮点
### 解决的核心问题
@@ -101,22 +126,25 @@ npm run dev
2. **架构耦合**: 分析与存储混合 → 完全分离,职责清晰
3. **性能问题**: 重复渲染和API调用 → 优化减少60%+重复调用
4. **时间显示**: 时区问题 → 统一ISO时间戳和本地化显示
5. **分析深度**: 基础解释不够详细 → AI增强的个性化分析
6. **用户体验**: 术语难懂 → 详细的星曜强度和命宫位置解释
### 架构对比
### 版本对比
| 方面 | v1.0 (重构前) | v2.0 (重构) |
|------|---------------|---------------|
| 分析接口 | 分析+存储耦合 | 纯分析计算 |
| 历史记录 | 自动存储 | 专门接口存储 |
| 重复记录 | 3-5条/次 | 1条/次 |
| API调用 | 频繁重复 | 去重优化 |
| 错误处理 | 耦合失败 | 隔离容错 |
| 方面 | v1.0 (初版) | v2.0 (重构) | v3.0 (当前) |
|------|-------------|-------------|-------------|
| 分析接口 | 分析+存储耦合 | 纯分析计算 | AI增强分析 |
| 历史记录 | 自动存储 | 专门接口存储 | 优化存储 |
| 重复记录 | 3-5条/次 | 1条/次 | 1条/次 |
| API调用 | 频繁重复 | 去重优化 | 智能缓存 |
| 错误处理 | 耦合失败 | 隔离容错 | 全面容错 |
| 分析深度 | 基础解释 | 标准分析 | AI个性化 |
| 用户体验 | 术语晦涩 | 改进显示 | 详细解释 |
## 📚 文档
- [API文档](docs/API.md) - 详细的API接口说明
- [开发指南](docs/DEVELOPMENT.md) - 开发环境设置和最佳实践
- [部署指南](docs/DEPLOYMENT.md) - 生产环境部署说明
- [本地部署指南](docs/LOCAL_DEPLOYMENT.md) - 本地化部署和运行说明
- [更新日志](CHANGELOG.md) - 版本更新记录
## 🧪 测试
@@ -144,7 +172,7 @@ npm run build
npm run start
```
详细部署说明请参考 [部署指南](docs/DEPLOYMENT.md)。
详细部署说明请参考 [本地部署指南](docs/LOCAL_DEPLOYMENT.md)。
## 🤝 贡献
@@ -170,10 +198,10 @@ npm run start
## 📞 联系我们
- 项目主页: [GitHub Repository](https://github.com/your-repo/ai-numerology-refactored)
- 问题反馈: [GitHub Issues](https://github.com/your-repo/ai-numerology-refactored/issues)
- 邮箱: your-email@example.com
- 项目主页: [GitHub Repository](https://github.com/your-repo/shenjige-numerology)
- 问题反馈: [GitHub Issues](https://github.com/your-repo/shenjige-numerology/issues)
- 邮箱: contact@shenjige.com
---
**三算命** - 传承千年智慧,拥抱现代科技 🌟
**神机阁** - 传承千年智慧,拥抱现代科技 🌟

View File

@@ -1,6 +1,6 @@
# API 文档
本文档描述了三算命平台的后端API接口基于Node.js Express框架实现。
本文档描述了神机阁平台的后端API接口基于Node.js Express框架实现。
## 基础信息

View File

@@ -1,521 +0,0 @@
# 部署指南
本文档详细说明如何将三算命平台部署到各种环境中。
## 目录
- [环境要求](#环境要求)
- [Supabase 配置](#supabase-配置)
- [前端部署](#前端部署)
- [Vercel 部署](#vercel-部署)
- [Netlify 部署](#netlify-部署)
- [GitHub Pages 部署](#github-pages-部署)
- [自托管部署](#自托管部署)
- [Edge Functions 部署](#edge-functions-部署)
- [环境变量配置](#环境变量配置)
- [域名配置](#域名配置)
- [SSL 证书](#ssl-证书)
- [监控和日志](#监控和日志)
- [故障排除](#故障排除)
## 环境要求
### 开发环境
- Node.js >= 18.0.0
- pnpm >= 8.0.0 (推荐) 或 npm >= 9.0.0
- Git >= 2.0.0
### 生产环境
- 支持静态文件托管的服务器或CDN
- Supabase 项目 (后端服务)
- 域名 (可选)
- SSL 证书 (推荐)
## Supabase 配置
### 1. 创建 Supabase 项目
1. 访问 [Supabase](https://supabase.com) 并创建账户
2. 创建新项目
3. 等待项目初始化完成
4. 记录项目URL和API密钥
### 2. 数据库设置
在 Supabase SQL 编辑器中执行以下SQL创建必要的表
```sql
-- 创建用户资料表
CREATE TABLE IF NOT EXISTS user_profiles (
id UUID REFERENCES auth.users(id) PRIMARY KEY,
username TEXT UNIQUE,
full_name TEXT,
avatar_url TEXT,
birth_date DATE,
birth_time TIME,
birth_place TEXT,
gender TEXT CHECK (gender IN ('male', 'female')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建命理分析记录表
CREATE TABLE IF NOT EXISTS numerology_readings (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users(id) NOT NULL,
reading_type TEXT NOT NULL CHECK (reading_type IN ('bazi', 'ziwei', 'yijing', 'wuxing')),
name TEXT,
birth_date DATE,
birth_time TIME,
gender TEXT CHECK (gender IN ('male', 'female')),
birth_place TEXT,
input_data JSONB,
results JSONB,
analysis JSONB,
status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'completed', 'failed')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_numerology_readings_user_id ON numerology_readings(user_id);
CREATE INDEX IF NOT EXISTS idx_numerology_readings_type ON numerology_readings(reading_type);
CREATE INDEX IF NOT EXISTS idx_numerology_readings_created_at ON numerology_readings(created_at DESC);
-- 启用行级安全策略
ALTER TABLE user_profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE numerology_readings ENABLE ROW LEVEL SECURITY;
-- 用户资料访问策略
CREATE POLICY "Users can view own profile" ON user_profiles
FOR SELECT USING (auth.uid() = id);
CREATE POLICY "Users can update own profile" ON user_profiles
FOR UPDATE USING (auth.uid() = id);
CREATE POLICY "Users can insert own profile" ON user_profiles
FOR INSERT WITH CHECK (auth.uid() = id);
-- 命理分析记录访问策略
CREATE POLICY "Users can view own readings" ON numerology_readings
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Users can insert own readings" ON numerology_readings
FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update own readings" ON numerology_readings
FOR UPDATE USING (auth.uid() = user_id);
```
### 3. 认证设置
1. 在 Supabase 控制台中,转到 "Authentication" > "Settings"
2. 配置站点URL为你的域名
3. 启用邮箱确认 (可选)
4. 配置第三方登录提供商 (可选)
## 前端部署
### Vercel 部署
Vercel 是推荐的部署平台,提供优秀的性能和开发体验。
#### 自动部署 (推荐)
1. 将代码推送到 GitHub 仓库
2. 访问 [Vercel](https://vercel.com) 并登录
3. 点击 "New Project"
4. 导入你的 GitHub 仓库
5. 配置环境变量:
```
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
```
6. 点击 "Deploy"
#### 手动部署
```bash
# 安装 Vercel CLI
npm i -g vercel
# 登录 Vercel
vercel login
# 构建项目
npm run build
# 部署
vercel --prod
```
### Netlify 部署
#### 自动部署
1. 将代码推送到 GitHub 仓库
2. 访问 [Netlify](https://netlify.com) 并登录
3. 点击 "New site from Git"
4. 选择你的 GitHub 仓库
5. 配置构建设置:
- Build command: `npm run build`
- Publish directory: `dist`
6. 配置环境变量
7. 点击 "Deploy site"
#### 手动部署
```bash
# 安装 Netlify CLI
npm install -g netlify-cli
# 构建项目
npm run build
# 部署
netlify deploy --prod --dir=dist
```
### GitHub Pages 部署
1. 在项目根目录创建 `.github/workflows/deploy.yml`
```yaml
name: Deploy to GitHub Pages
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
env:
VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }}
VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
if: github.ref == 'refs/heads/main'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
```
2. 在 GitHub 仓库设置中配置 Secrets
3. 启用 GitHub Pages
### 自托管部署
#### 使用 Nginx
1. 构建项目:
```bash
npm run build
```
2. 将 `dist` 目录上传到服务器
3. 配置 Nginx
```nginx
server {
listen 80;
server_name your-domain.com;
root /path/to/your/dist;
index index.html;
# 处理 SPA 路由
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
}
```
#### 使用 Apache
1. 在 `dist` 目录创建 `.htaccess` 文件:
```apache
RewriteEngine On
RewriteBase /
# 处理 SPA 路由
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
# 静态资源缓存
<FilesMatch "\.(js|css|png|jpg|jpeg|gif|ico|svg)$">
ExpiresActive On
ExpiresDefault "access plus 1 year"
</FilesMatch>
```
## Edge Functions 部署
### 1. 准备 Edge Functions
在 Supabase 项目中创建以下 Edge Functions
- `bazi-analyzer` - 八字命理分析
- `ziwei-analyzer` - 紫微斗数分析
- `yijing-analyzer` - 易经占卜分析
- `bazi-wuxing-analysis` - 五行分析
- `bazi-details` - 八字详细分析
### 2. 部署 Edge Functions
```bash
# 安装 Supabase CLI
npm install -g supabase
# 登录 Supabase
supabase login
# 链接到你的项目
supabase link --project-ref your-project-ref
# 部署所有函数
supabase functions deploy
# 或部署单个函数
supabase functions deploy bazi-analyzer
```
### 3. 设置环境变量
```bash
# 为 Edge Functions 设置环境变量
supabase secrets set SUPABASE_URL=your_supabase_url
supabase secrets set SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
```
## 环境变量配置
### 开发环境 (.env.local)
```env
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your_anon_key
```
### 生产环境
根据部署平台配置相应的环境变量:
- **Vercel**: 在项目设置中添加环境变量
- **Netlify**: 在站点设置中添加环境变量
- **GitHub Actions**: 在仓库 Secrets 中添加
- **自托管**: 在构建脚本中设置
## 域名配置
### 1. DNS 设置
根据部署平台配置 DNS 记录:
- **Vercel**: 添加 CNAME 记录指向 `cname.vercel-dns.com`
- **Netlify**: 添加 CNAME 记录指向 Netlify 提供的域名
- **自托管**: 添加 A 记录指向服务器 IP
### 2. 自定义域名
在部署平台的控制台中添加自定义域名,并等待 DNS 传播完成。
## SSL 证书
大多数现代部署平台都会自动提供 SSL 证书:
- **Vercel**: 自动提供 Let's Encrypt 证书
- **Netlify**: 自动提供 Let's Encrypt 证书
- **GitHub Pages**: 支持自定义域名的 HTTPS
对于自托管,可以使用 Certbot 获取免费的 Let's Encrypt 证书:
```bash
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d your-domain.com
# 设置自动续期
sudo crontab -e
# 添加以下行:
0 12 * * * /usr/bin/certbot renew --quiet
```
## 监控和日志
### 1. 应用监控
推荐使用以下监控服务:
- **Vercel Analytics**: Vercel 内置分析
- **Google Analytics**: 网站流量分析
- **Sentry**: 错误监控和性能监控
### 2. Supabase 监控
在 Supabase 控制台中可以查看:
- API 使用情况
- 数据库性能
- Edge Functions 日志
- 认证统计
### 3. 日志配置
在生产环境中启用适当的日志级别:
```typescript
// 生产环境日志配置
if (import.meta.env.PROD) {
console.log = () => {} // 禁用 console.log
console.warn = () => {} // 禁用 console.warn
// 保留 console.error 用于错误报告
}
```
## 故障排除
### 常见问题
#### 1. 构建失败
**问题**: 构建过程中出现错误
**解决方案**:
- 检查 Node.js 版本是否符合要求
- 清除缓存:`rm -rf node_modules package-lock.json && npm install`
- 检查环境变量是否正确配置
#### 2. 路由不工作
**问题**: SPA 路由在生产环境中不工作
**解决方案**:
- 确保服务器配置了正确的回退规则
- 检查 `vite.config.ts` 中的 base 配置
#### 3. API 调用失败
**问题**: 无法连接到 Supabase
**解决方案**:
- 检查环境变量是否正确
- 验证 Supabase URL 和 API 密钥
- 检查网络连接和 CORS 设置
#### 4. 认证问题
**问题**: 用户无法登录或注册
**解决方案**:
- 检查 Supabase 认证设置
- 验证站点 URL 配置
- 检查邮箱确认设置
### 性能优化
#### 1. 代码分割
```typescript
// 使用动态导入进行代码分割
const AnalysisPage = lazy(() => import('./pages/AnalysisPage'))
const HistoryPage = lazy(() => import('./pages/HistoryPage'))
```
#### 2. 图片优化
- 使用 WebP 格式
- 实现懒加载
- 使用 CDN 加速
#### 3. 缓存策略
```nginx
# Nginx 缓存配置
location ~* \.(js|css)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location ~* \.(png|jpg|jpeg|gif|ico|svg)$ {
expires 6M;
add_header Cache-Control "public";
}
```
## 安全检查清单
- [ ] 启用 HTTPS
- [ ] 配置安全头
- [ ] 启用 Supabase RLS
- [ ] 验证环境变量安全
- [ ] 定期更新依赖
- [ ] 配置 CSP 策略
- [ ] 启用错误监控
- [ ] 设置备份策略
## 维护和更新
### 1. 定期更新
```bash
# 检查过时的依赖
npm outdated
# 更新依赖
npm update
# 安全审计
npm audit
npm audit fix
```
### 2. 数据库维护
- 定期备份数据库
- 监控数据库性能
- 清理过期数据
- 优化查询性能
### 3. 监控和告警
设置适当的监控和告警机制:
- 应用错误率
- 响应时间
- 数据库连接
- 磁盘空间使用
---
如需更多帮助,请查看我们的 [FAQ](FAQ.md) 或在 GitHub Issues 中提问。

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
# 本地化部署指南
本文档详细说明如何部署和运行完全本地化的三算命应用。
本文档详细说明如何部署和运行完全本地化的神机阁应用。
## 🎯 本地化改造概述
@@ -384,7 +384,7 @@ pm2 logs numerology-app
## 🎉 恭喜!
您已成功部署本地化的三算命应用!现在可以:
您已成功部署本地化的神机阁应用!现在可以:
- 🔮 进行八字、紫微、易经分析
- 👤 管理用户账户和档案
- 📚 查看和管理历史记录

View File

@@ -1,702 +0,0 @@
// AI命理大师 - 八字个性化分析 Edge Function - 完全基于用户数据无占位符版本
Deno.serve(async (req)=>{
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT, DELETE, PATCH',
'Access-Control-Max-Age': '86400',
'Access-Control-Allow-Credentials': 'false'
};
if (req.method === 'OPTIONS') {
return new Response(null, {
status: 200,
headers: corsHeaders
});
}
try {
const requestBody = await req.text();
console.log('Bazi analyzer request:', requestBody);
let requestData;
try {
requestData = JSON.parse(requestBody);
} catch (parseError) {
console.error('JSON parse error:', parseError);
return new Response(JSON.stringify({
error: {
code: 'INVALID_JSON',
message: 'Invalid JSON in request body'
}
}), {
status: 400,
headers: {
...corsHeaders,
'Content-Type': 'application/json'
}
});
}
const { user_id, birth_data } = requestData;
const reading_type = 'bazi';
console.log('Bazi analysis request:', {
user_id,
reading_type,
birth_data
});
if (!user_id || !birth_data) {
throw new Error('Missing required parameters: user_id or birth_data');
}
const supabaseUrl = Deno.env.get('SUPABASE_URL');
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY');
if (!supabaseUrl || !supabaseKey) {
throw new Error('Missing Supabase configuration');
}
// 执行完全个性化的八字分析
const analysisResult = await performFullBaziAnalysis(birth_data);
console.log('Complete Bazi analysis generated');
// 保存分析结果到数据库 - 使用正确的 numerology_readings 表
const recordData = {
user_id,
reading_type: 'bazi',
name: birth_data.name || null,
birth_date: birth_data.birth_date,
birth_time: birth_data.birth_time || null,
gender: birth_data.gender,
birth_place: birth_data.birth_place || null,
input_data: birth_data,
results: {
result_data: analysisResult,
analysis_type: 'bazi'
},
analysis: analysisResult,
status: 'completed'
};
const saveResponse = await fetch(`${supabaseUrl}/rest/v1/numerology_readings`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${supabaseKey}`,
'apikey': supabaseKey,
'Prefer': 'return=representation'
},
body: JSON.stringify(recordData)
});
if (!saveResponse.ok) {
const errorText = await saveResponse.text();
console.error('Save bazi analysis error:', errorText);
throw new Error(`Failed to save analysis: ${errorText}`);
}
const savedRecord = await saveResponse.json();
console.log('Saved personalized bazi analysis successfully');
return new Response(JSON.stringify({
data: {
record_id: savedRecord[0]?.id,
analysis: analysisResult
}
}), {
headers: {
...corsHeaders,
'Content-Type': 'application/json'
}
});
} catch (error) {
console.error('Bazi analyzer error:', error);
const errorResponse = {
error: {
code: 'BAZI_ANALYSIS_ERROR',
message: error.message
}
};
return new Response(JSON.stringify(errorResponse), {
status: 500,
headers: {
...corsHeaders,
'Content-Type': 'application/json'
}
});
}
});
// 完全个性化的八字分析主函数 - 基于真实用户数据
async function performFullBaziAnalysis(birth_data) {
try {
const { birth_date, birth_time, gender, birth_place, name } = birth_data;
const personalizedName = name || '您';
// 1. 精确计算八字四柱
const baziChart = calculatePreciseBazi(birth_date, birth_time);
// 2. 详细五行分析
const wuxingAnalysis = performDetailedWuxingAnalysis(baziChart, gender, personalizedName);
// 3. 精确格局判定
const patternAnalysis = determineAccuratePattern(baziChart, gender, personalizedName);
// 4. 精准大运流年分析
const fortuneAnalysis = calculatePreciseFortune(baziChart, birth_date, gender, personalizedName);
// 5. 综合人生指导
const lifeGuidance = generateComprehensiveLifeGuidance(baziChart, patternAnalysis, wuxingAnalysis, gender, personalizedName);
// 6. 现代应用建议
const modernGuidance = generateModernApplications(baziChart, patternAnalysis, gender, personalizedName);
return {
analysis_type: 'bazi',
analysis_date: new Date().toISOString().split('T')[0],
basic_info: {
personal_data: {
name: personalizedName,
birth_date: birth_date,
birth_time: birth_time || '12:00',
gender: gender === 'male' || gender === '男' ? '男性' : '女性',
birth_place: birth_place || '未提供'
},
bazi_chart: baziChart,
lunar_info: calculateLunarInfo(birth_date)
},
wuxing_analysis: {
element_distribution: wuxingAnalysis.distribution,
balance_analysis: wuxingAnalysis.detailed_analysis,
personal_traits: wuxingAnalysis.personality_traits,
suggestions: wuxingAnalysis.improvement_suggestions
},
geju_analysis: {
pattern_type: patternAnalysis.pattern_name,
pattern_strength: patternAnalysis.strength,
characteristics: patternAnalysis.detailed_traits,
career_path: patternAnalysis.suitable_careers,
life_meaning: patternAnalysis.philosophical_meaning,
development_strategy: patternAnalysis.action_plan
},
dayun_analysis: {
current_age: fortuneAnalysis.current_age,
current_dayun: fortuneAnalysis.current_period,
dayun_sequence: fortuneAnalysis.life_periods,
yearly_fortune: fortuneAnalysis.current_year_analysis,
future_outlook: fortuneAnalysis.next_decade_forecast
},
life_guidance: {
overall_summary: lifeGuidance.comprehensive_summary,
career_development: lifeGuidance.career_guidance,
wealth_management: lifeGuidance.wealth_guidance,
marriage_relationships: lifeGuidance.relationship_guidance,
health_wellness: lifeGuidance.health_guidance,
personal_development: lifeGuidance.self_improvement
},
modern_applications: {
lifestyle_recommendations: modernGuidance.daily_life,
career_strategies: modernGuidance.professional_development,
relationship_advice: modernGuidance.interpersonal_skills,
decision_making: modernGuidance.timing_guidance
}
};
} catch (error) {
console.error('Complete Bazi analysis error:', error);
throw error;
}
}
// 精确计算八字四柱
function calculatePreciseBazi(birth_date, birth_time) {
const heavenlyStems = [
'甲',
'乙',
'丙',
'丁',
'戊',
'己',
'庚',
'辛',
'壬',
'癸'
];
const earthlyBranches = [
'子',
'丑',
'寅',
'卯',
'辰',
'巳',
'午',
'未',
'申',
'酉',
'戌',
'亥'
];
const birthDate = new Date(birth_date);
const birthYear = birthDate.getFullYear();
const birthMonth = birthDate.getMonth() + 1;
const birthDay = birthDate.getDate();
const birthHour = birth_time ? parseInt(birth_time.split(':')[0]) : 12;
// 精确的干支计算
const yearStemIndex = (birthYear - 4) % 10;
const yearBranchIndex = (birthYear - 4) % 12;
const monthStemIndex = (yearStemIndex * 2 + birthMonth) % 10;
const monthBranchIndex = (birthMonth + 1) % 12;
const daysSinceEpoch = Math.floor((birthDate - new Date('1900-01-01')) / (1000 * 60 * 60 * 24));
const dayStemIndex = (daysSinceEpoch + 9) % 10;
const dayBranchIndex = (daysSinceEpoch + 9) % 12;
const hourStemIndex = (dayStemIndex * 2 + Math.floor((birthHour + 1) / 2)) % 10;
const hourBranchIndex = Math.floor((birthHour + 1) / 2) % 12;
const result = {
year_pillar: {
stem: heavenlyStems[yearStemIndex],
branch: earthlyBranches[yearBranchIndex],
element: getElementFromStem(heavenlyStems[yearStemIndex])
},
month_pillar: {
stem: heavenlyStems[monthStemIndex],
branch: earthlyBranches[monthBranchIndex],
element: getElementFromStem(heavenlyStems[monthStemIndex])
},
day_pillar: {
stem: heavenlyStems[dayStemIndex],
branch: earthlyBranches[dayBranchIndex],
element: getElementFromStem(heavenlyStems[dayStemIndex])
},
hour_pillar: {
stem: heavenlyStems[hourStemIndex],
branch: earthlyBranches[hourBranchIndex],
element: getElementFromStem(heavenlyStems[hourStemIndex])
},
day_master: heavenlyStems[dayStemIndex],
complete_chart: `${heavenlyStems[yearStemIndex]}${earthlyBranches[yearBranchIndex]} ${heavenlyStems[monthStemIndex]}${earthlyBranches[monthBranchIndex]} ${heavenlyStems[dayStemIndex]}${earthlyBranches[dayBranchIndex]} ${heavenlyStems[hourStemIndex]}${earthlyBranches[hourBranchIndex]}`
};
return result;
}
// 详细五行分析
function performDetailedWuxingAnalysis(baziChart, gender, name) {
const dayMaster = baziChart.day_master;
const dayMasterElement = getElementFromStem(dayMaster);
// 统计五行分布
const elements = {
'木': 0,
'火': 0,
'土': 0,
'金': 0,
'水': 0
};
[
'year_pillar',
'month_pillar',
'day_pillar',
'hour_pillar'
].forEach((pillar)=>{
const stemElement = baziChart[pillar].element;
const branchElement = getBranchElement(baziChart[pillar].branch);
elements[stemElement]++;
elements[branchElement]++;
});
const sortedElements = Object.entries(elements).sort((a, b)=>b[1] - a[1]);
const strongestElement = sortedElements[0][0];
const weakestElement = sortedElements[sortedElements.length - 1][0];
// 生成完全个性化的分析
const genderTitle = gender === 'male' || gender === '男' ? '男命' : '女命';
const personalityTraits = generatePersonalityFromDayMaster(dayMaster, gender, elements);
const balanceAnalysis = generateBalanceAnalysis(elements, dayMasterElement, strongestElement, weakestElement, name);
const improvementSuggestions = generateImprovementSuggestions(dayMasterElement, weakestElement, strongestElement, name, gender);
return {
distribution: elements,
detailed_analysis: `${name}的八字中,日主${dayMaster}(${dayMasterElement}元素)${genderTitle}${dayMasterElement}命格具有${getElementNatureDescription(dayMasterElement)}的特质。${balanceAnalysis}`,
personality_traits: personalityTraits,
improvement_suggestions: improvementSuggestions
};
}
// 生成个性特质描述
function generatePersonalityFromDayMaster(dayMaster, gender, elements) {
const dayMasterTraits = {
'甲': '如参天大树般正直挺拔,具有开拓进取的精神和天然的领导气质',
'乙': '如花草般柔韧而富有生命力,具有很强的适应能力和艺术天赋',
'丙': '如太阳般光明磊落,性格开朗热情,具有很强的感染力和表现欲',
'丁': '如星火般温暖细腻,思维敏锐,具有细致的观察力和创意能力',
'戊': '如高山般稳重厚实,具有很强的责任心和包容心,值得信赖',
'己': '如沃土般温和包容,具有很好的亲和力和协调能力,善于照顾他人',
'庚': '如利剑般刚毅果断,具有很强的原则性和执行力,做事雷厉风行',
'辛': '如珠宝般精致优雅,注重品质和细节,具有很好的审美能力',
'壬': '如江河般胸怀宽广,具有很强的包容性和变通能力,智慧深邃',
'癸': '如露水般纯净灵性,直觉敏锐,具有很强的感知能力和同情心'
};
const baseTraits = dayMasterTraits[dayMaster] || '性格温和平衡,具有良好的适应能力';
const genderModification = gender === 'male' || gender === '男' ? ',在男性特质上表现为坚毅和担当' : ',在女性特质上表现为温柔和包容';
return baseTraits + genderModification;
}
// 生成平衡分析
function generateBalanceAnalysis(elements, dayElement, strongest, weakest, name) {
const total = Object.values(elements).reduce((a, b)=>a + b, 0);
const balance = Math.max(...Object.values(elements)) - Math.min(...Object.values(elements));
let strengthAnalysis = '';
if (elements[strongest] >= 4) {
strengthAnalysis = `五行中${strongest}元素极为旺盛(${elements[strongest]}个),占据主导地位,表现出强烈的${getElementDetailedTraits(strongest)}特质`;
} else if (elements[strongest] >= 3) {
strengthAnalysis = `五行中${strongest}元素较为旺盛(${elements[strongest]}个),显现出明显的${getElementDetailedTraits(strongest)}特质`;
} else {
strengthAnalysis = '五行分布相对均匀,各种特质都有所体现';
}
let weaknessAnalysis = '';
if (elements[weakest] === 0) {
weaknessAnalysis = `,但完全缺乏${weakest}元素,这意味着需要特别注意培养${getElementMissingTraits(weakest)}方面的能力`;
} else if (elements[weakest] === 1) {
weaknessAnalysis = `,而${weakest}元素较弱(仅${elements[weakest]}个),建议在生活中多加强${getElementMissingTraits(weakest)}的修养`;
}
const overallBalance = balance <= 1 ? '整体五行平衡良好,人生发展较为稳定' : balance <= 2 ? '五行略有偏颇,某些方面会特别突出' : '五行偏科明显,容易在某个领域有特殊成就,但需注意全面发展';
return strengthAnalysis + weaknessAnalysis + '。' + overallBalance;
}
// 生成改进建议
function generateImprovementSuggestions(dayElement, weakElement, strongElement, name, gender) {
const suggestions = [];
// 基于缺失元素的建议
if (weakElement) {
const elementSupplements = {
'木': '多接触大自然,培养耐心和成长心态,可以多使用绿色物品,向东方发展',
'火': '增强自信和表现力,多参加社交活动,可以多穿红色衣物,向南方发展',
'土': '培养稳重和信用,加强责任感,可以多接触土地和陶瓷,向中央发展',
'金': '提升决断力和原则性,注重品质追求,可以多使用金属制品,向西方发展',
'水': '增强智慧和变通能力,培养学习习惯,可以多亲近水源,向北方发展'
};
suggestions.push(`针对${weakElement}元素不足:${elementSupplements[weakElement]}`);
}
// 基于过旺元素的建议
const relationToDay = getElementRelation(strongElement, dayElement);
if (relationToDay === 'overcome') {
suggestions.push(`由于${strongElement}元素过旺,需要适当平衡,避免过度${getElementExcessTraits(strongElement)}`);
}
// 性别特定建议
const genderAdvice = gender === 'male' || gender === '男' ? '作为男性,建议在事业上发挥主导作用,同时注意家庭责任的承担' : '作为女性,建议在温柔的同时保持独立,事业与家庭并重';
suggestions.push(genderAdvice);
return suggestions.join('');
}
// 精确格局判定
function determineAccuratePattern(baziChart, gender, name) {
const dayMaster = baziChart.day_master;
const monthStem = baziChart.month_pillar.stem;
const monthBranch = baziChart.month_pillar.branch;
const dayElement = getElementFromStem(dayMaster);
const monthElement = getElementFromStem(monthStem);
// 判断格局类型
const tenGodRelation = determineTenGodRelation(dayElement, monthElement);
const patternType = getPatternFromTenGod(tenGodRelation);
const patternStrength = evaluatePatternStrength(baziChart, patternType, monthBranch);
// 生成详细分析
const detailedTraits = generatePatternTraits(patternType, patternStrength, dayMaster, gender, name);
const suitableCareers = generateCareerGuidance(patternType, dayElement, gender);
const philosophicalMeaning = generatePhilosophicalMeaning(patternType, patternStrength, name);
const actionPlan = generateActionPlan(patternType, patternStrength, gender);
return {
pattern_name: patternType,
strength: patternStrength,
detailed_traits: detailedTraits,
suitable_careers: suitableCareers,
philosophical_meaning: philosophicalMeaning,
action_plan: actionPlan
};
}
// 精准大运流年计算
function calculatePreciseFortune(baziChart, birth_date, gender, name) {
const currentYear = new Date().getFullYear();
const birthYear = new Date(birth_date).getFullYear();
const currentAge = currentYear - birthYear;
// 计算大运起始年龄
const startAge = gender === 'male' || gender === '男' ? 8 : 7;
const currentDayunIndex = Math.floor((currentAge - startAge) / 10);
const yearInDayun = (currentAge - startAge) % 10;
// 生成大运序列
const dayunSequence = generateDayunSequence(baziChart, startAge, gender);
const currentPeriod = dayunSequence[Math.max(0, currentDayunIndex)] || dayunSequence[0];
// 当前流年分析
const currentYearAnalysis = analyzeCurrentYear(baziChart, currentYear, currentAge, name, gender);
// 未来十年预测
const nextDecadeForecast = generateNextDecadeForecast(baziChart, currentAge, dayunSequence, name, gender);
return {
current_age: currentAge,
current_period: currentPeriod,
life_periods: dayunSequence,
current_year_analysis: currentYearAnalysis,
next_decade_forecast: nextDecadeForecast
};
}
// 综合人生指导
function generateComprehensiveLifeGuidance(baziChart, patternAnalysis, wuxingAnalysis, gender, name) {
const dayElement = getElementFromStem(baziChart.day_master);
const patternType = patternAnalysis.pattern_name;
const comprehensiveSummary = `${name},根据您的八字分析,您具有${patternType}的命格特征,${patternAnalysis.detailed_traits}。建议您充分发挥这些优势,在人生道路上稳步前进。`;
const careerGuidance = `在事业发展方面:${generateSpecificCareerAdvice(patternType, dayElement, gender)}。建议重点关注${getCareerFocusAreas(patternType)}领域的机会。`;
const wealthGuidance = `在财富管理方面:${generateWealthStrategy(dayElement, patternType, gender)}。理财方式建议${getWealthManagementStyle(patternType)}。`;
const relationshipGuidance = `在感情关系方面:${generateRelationshipAdvice(dayElement, gender, patternType)}。婚姻配偶特质建议寻找${getIdealPartnerTraits(dayElement, gender)}的人。`;
const healthGuidance = `在健康养生方面:${generateHealthAdvice(dayElement, wuxingAnalysis.distribution)}。特别需要注意${getHealthFocusAreas(dayElement)}的保养。`;
const selfImprovement = `在个人修养方面:${generateSelfDevelopmentPlan(patternType, dayElement, gender)}。建议培养${getPersonalGrowthAreas(patternType)}方面的能力。`;
return {
comprehensive_summary: comprehensiveSummary,
career_guidance: careerGuidance,
wealth_guidance: wealthGuidance,
relationship_guidance: relationshipGuidance,
health_guidance: healthGuidance,
self_improvement: selfImprovement
};
}
// 现代应用建议
function generateModernApplications(baziChart, patternAnalysis, gender, name) {
const patternType = patternAnalysis.pattern_name;
const dayElement = getElementFromStem(baziChart.day_master);
const dailyLife = `日常生活中,${name}适合${getDailyLifeStyle(patternType, dayElement)}。建议居住环境选择${getIdealLivingEnvironment(dayElement)},作息时间${getOptimalSchedule(patternType)}。`;
const professionalDevelopment = `职业发展上,建议选择${getProfessionalPath(patternType, gender)}的工作方式。技能提升重点关注${getSkillDevelopmentAreas(patternType)}。`;
const interpersonalSkills = `人际交往中,${name}的优势在于${getInterpersonalStrengths(patternType, dayElement)}。建议在${getNetworkingStrategy(patternType)}方面多加努力。`;
const timingGuidance = `决策时机方面,${name}适合在${getOptimalDecisionTiming(dayElement, patternType)}时期做重要决定。避免在${getUnfavorableTiming(dayElement)}时期冒险。`;
return {
daily_life: dailyLife,
professional_development: professionalDevelopment,
interpersonal_skills: interpersonalSkills,
timing_guidance: timingGuidance
};
}
// 所有辅助函数实现
function getElementFromStem(stem) {
const stemElements = {
'甲': '木',
'乙': '木',
'丙': '火',
'丁': '火',
'戊': '土',
'己': '土',
'庚': '金',
'辛': '金',
'壬': '水',
'癸': '水'
};
return stemElements[stem] || '土';
}
function getBranchElement(branch) {
const branchElements = {
'子': '水',
'丑': '土',
'寅': '木',
'卯': '木',
'辰': '土',
'巳': '火',
'午': '火',
'未': '土',
'申': '金',
'酉': '金',
'戌': '土',
'亥': '水'
};
return branchElements[branch] || '土';
}
function getElementRelation(element1, element2) {
if (element1 === element2) return 'same';
const generateCycle = {
'木': '火',
'火': '土',
'土': '金',
'金': '水',
'水': '木'
};
const overcomeCycle = {
'木': '土',
'火': '金',
'土': '水',
'金': '木',
'水': '火'
};
if (generateCycle[element1] === element2) return 'generate';
if (overcomeCycle[element1] === element2) return 'overcome';
if (generateCycle[element2] === element1) return 'beGenerated';
if (overcomeCycle[element2] === element1) return 'beOvercome';
return 'neutral';
}
// 简化实现所有其他辅助函数
function getElementNatureDescription(element) {
const descriptions = {
'木': '生机勃勃、向上发展、具有创新精神',
'火': '热情奔放、光明磊落、具有感染力',
'土': '稳重踏实、包容厚德、具有建设性',
'金': '坚毅果断、追求完美、具有原则性',
'水': '智慧深邃、变通灵活、具有适应性'
};
return descriptions[element] || '平和均衡';
}
function getElementDetailedTraits(element) {
const traits = {
'木': '成长发展、创新创造、仁慈包容',
'火': '热情活力、表达展示、光明正大',
'土': '稳定可靠、诚信厚道、包容承载',
'金': '坚毅果决、严格自律、追求卓越',
'水': '智慧深邃、灵活应变、润泽无声'
};
return traits[element] || '平和特质';
}
function getElementMissingTraits(element) {
const missing = {
'木': '成长心态和仁慈品格',
'火': '热情活力和表达能力',
'土': '稳重品格和信用观念',
'金': '决断能力和原则坚持',
'水': '智慧思维和变通能力'
};
return missing[element] || '平衡发展';
}
function getElementExcessTraits(element) {
const excess = {
'木': '固执己见或过于理想主义',
'火': '急躁冲动或过于张扬',
'土': '过于保守或行动迟缓',
'金': '过于严厉或缺乏变通',
'水': '过于消极或缺乏行动力'
};
return excess[element] || '某些特质过度表现';
}
function determineTenGodRelation(dayElement, monthElement) {
if (dayElement === monthElement) return '比肩';
const generateCycle = {
'木': '火',
'火': '土',
'土': '金',
'金': '水',
'水': '木'
};
const overcomeCycle = {
'木': '土',
'火': '金',
'土': '水',
'金': '木',
'水': '火'
};
if (generateCycle[dayElement] === monthElement) return '食神';
if (overcomeCycle[dayElement] === monthElement) return '正财';
if (generateCycle[monthElement] === dayElement) return '正印';
if (overcomeCycle[monthElement] === dayElement) return '正官';
return '杂气';
}
function getPatternFromTenGod(tenGod) {
const patterns = {
'正官': '正官格',
'正财': '正财格',
'食神': '食神格',
'正印': '正印格',
'比肩': '建禄格'
};
return patterns[tenGod] || '杂气格';
}
function evaluatePatternStrength(baziChart, patternType, monthBranch) {
// 简化的格局强度评估
const dayElement = getElementFromStem(baziChart.day_master);
const seasonalStrength = getSeasonalStrength(dayElement, monthBranch);
if (seasonalStrength === '旺') return '上等';
if (seasonalStrength === '相') return '中上';
if (seasonalStrength === '休') return '中等';
return '偏弱';
}
function getSeasonalStrength(element, monthBranch) {
const seasonMap = {
'木': [
'寅',
'卯',
'辰'
],
'火': [
'巳',
'午',
'未'
],
'土': [
'辰',
'未',
'戌',
'丑'
],
'金': [
'申',
'酉',
'戌'
],
'水': [
'亥',
'子',
'丑'
]
};
return seasonMap[element]?.includes(monthBranch) ? '旺' : '休';
}
// 所有其他辅助函数都返回个性化的内容而不是占位符
function calculateLunarInfo(birth_date) {
const date = new Date(birth_date);
return `农历${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`;
}
function generatePatternTraits(patternType, strength, dayMaster, gender, name) {
return `${name}的${patternType}表现为${strength}水平,具有该格局的典型特征和发展潜力`;
}
function generateCareerGuidance(patternType, dayElement, gender) {
return `适合从事与${patternType}相关的职业领域,发挥${dayElement}元素的特长`;
}
function generatePhilosophicalMeaning(patternType, strength, name) {
return `${name}的人生使命体现了${patternType}的深层含义,通过${strength}的修养达到人生境界`;
}
function generateActionPlan(patternType, strength, gender) {
return `建议制定基于${patternType}特点的行动计划,循序渐进地提升到${strength}以上水平`;
}
function generateDayunSequence(baziChart, startAge, gender) {
const sequences = [];
for(let i = 0; i < 8; i++){
sequences.push({
period: i + 1,
age_range: `${startAge + i * 10}-${startAge + i * 10 + 9}岁`,
theme: `第${i + 1}步大运期`,
characteristics: '人生发展的重要阶段'
});
}
return sequences;
}
function analyzeCurrentYear(baziChart, currentYear, age, name, gender) {
return `${name}在${currentYear}年(${age}岁)的运势分析:整体发展稳健,需要注意把握机遇`;
}
function generateNextDecadeForecast(baziChart, age, dayunSequence, name, gender) {
return `${name}未来十年(${age}-${age + 10}岁)总体运势展望:发展前景良好,建议稳步推进各项计划`;
}
// 所有其他函数都返回基于实际数据的个性化内容
function generateSpecificCareerAdvice(patternType, dayElement, gender) {
return `基于${patternType}和${dayElement}元素特质的具体职业建议`;
}
function getCareerFocusAreas(patternType) {
return `${patternType}相关的重点发展领域`;
}
function generateWealthStrategy(dayElement, patternType, gender) {
return `结合${dayElement}元素和${patternType}特点的财富策略`;
}
function getWealthManagementStyle(patternType) {
return `适合${patternType}的理财方式`;
}
function generateRelationshipAdvice(dayElement, gender, patternType) {
return `基于${dayElement}元素特质的感情关系建议`;
}
function getIdealPartnerTraits(dayElement, gender) {
return `与${dayElement}元素相配的理想伴侣特质`;
}
function generateHealthAdvice(dayElement, elementDistribution) {
return `基于${dayElement}日主的健康养生建议`;
}
function getHealthFocusAreas(dayElement) {
return `${dayElement}元素对应的身体保养重点`;
}
function generateSelfDevelopmentPlan(patternType, dayElement, gender) {
return `结合${patternType}和${dayElement}特质的个人发展计划`;
}
function getPersonalGrowthAreas(patternType) {
return `${patternType}需要重点培养的能力领域`;
}
function getDailyLifeStyle(patternType, dayElement) {
return `适合${patternType}的生活方式建议`;
}
function getIdealLivingEnvironment(dayElement) {
return `适合${dayElement}元素的居住环境`;
}
function getOptimalSchedule(patternType) {
return `适合${patternType}的作息安排`;
}
function getProfessionalPath(patternType, gender) {
return `${patternType}适合的职业发展路径`;
}
function getSkillDevelopmentAreas(patternType) {
return `${patternType}需要重点发展的技能领域`;
}
function getInterpersonalStrengths(patternType, dayElement) {
return `${patternType}和${dayElement}在人际交往中的优势`;
}
function getNetworkingStrategy(patternType) {
return `适合${patternType}的社交策略`;
}
function getOptimalDecisionTiming(dayElement, patternType) {
return `${dayElement}和${patternType}的最佳决策时机`;
}
function getUnfavorableTiming(dayElement) {
return `${dayElement}元素的不利时期`;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,687 +0,0 @@
// 紫微斗数分析Edge Function - 真正的动态紫微斗数计算
Deno.serve(async (req) => {
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT, DELETE, PATCH',
'Access-Control-Max-Age': '86400',
'Access-Control-Allow-Credentials': 'false'
};
if (req.method === 'OPTIONS') {
return new Response(null, {
status: 200,
headers: corsHeaders
});
}
try {
const requestBody = await req.text();
console.log('Ziwei analyzer request body:', requestBody);
let requestData;
try {
requestData = JSON.parse(requestBody);
} catch (parseError) {
console.error('JSON parse error:', parseError);
return new Response(JSON.stringify({
error: {
code: 'INVALID_JSON',
message: 'Invalid JSON in request body'
}
}), {
status: 400,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
});
}
const { user_id, birth_data } = requestData;
const reading_type = 'ziwei';
console.log('Ziwei analysis request:', { user_id, reading_type, birth_data });
if (!user_id || !birth_data) {
throw new Error('Missing required parameters: user_id or birth_data');
}
const supabaseUrl = Deno.env.get('SUPABASE_URL');
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY');
if (!supabaseUrl || !supabaseKey) {
throw new Error('Missing Supabase configuration');
}
// 使用真正的紫微斗数算法进行计算
const analysisResult = performRealZiweiAnalysis(birth_data);
// 保存到数据库
const recordData = {
user_id,
reading_type: 'ziwei',
name: birth_data.name || null,
birth_date: birth_data.birth_date,
birth_time: birth_data.birth_time || null,
gender: birth_data.gender,
birth_place: birth_data.birth_place || null,
input_data: birth_data,
results: {
result_data: analysisResult,
analysis_type: 'ziwei'
},
analysis: analysisResult,
status: 'completed'
};
const saveResponse = await fetch(`${supabaseUrl}/rest/v1/numerology_readings`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${supabaseKey}`,
'apikey': supabaseKey,
'Prefer': 'return=representation'
},
body: JSON.stringify(recordData)
});
if (!saveResponse.ok) {
const errorText = await saveResponse.text();
console.error('Save ziwei analysis error:', errorText);
throw new Error(`Failed to save analysis: ${errorText}`);
}
const savedRecord = await saveResponse.json();
console.log('Saved ziwei analysis successfully');
return new Response(JSON.stringify({
data: {
record_id: savedRecord[0]?.id,
analysis: analysisResult
}
}), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
});
} catch (error) {
console.error('Ziwei analysis error:', error);
return new Response(JSON.stringify({
error: {
code: 'ZIWEI_ANALYSIS_ERROR',
message: error.message || '紫微斗数分析过程中发生错误'
}
}), {
status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
});
}
});
// 真正的紫微斗数分析函数
function performRealZiweiAnalysis(birth_data) {
const { name, birth_date, birth_time, gender } = birth_data;
const personName = name || '您';
const personGender = gender === 'male' || gender === '男' ? '男性' : '女性';
// 计算八字信息
const baziInfo = calculateBazi(birth_date, birth_time);
// 计算紫微斗数排盘
const starChart = calculateRealStarChart(birth_date, birth_time, gender);
// 生成基于真实星盘的个性化分析
const analysis = generateRealPersonalizedAnalysis(starChart, personName, personGender, baziInfo);
return {
ziwei: {
ming_gong: starChart.mingGong,
ming_gong_xing: starChart.mingGongStars,
shi_er_gong: starChart.twelvePalaces,
si_hua: starChart.siHua,
da_xian: starChart.majorPeriods,
birth_chart: starChart.birthChart
},
analysis: analysis,
bazi: baziInfo
};
}
// 计算真正的八字信息
function calculateBazi(birthDateStr, birthTimeStr) {
const birthDate = new Date(birthDateStr);
const [hour, minute] = birthTimeStr ? birthTimeStr.split(':').map(Number) : [12, 0];
// 计算干支(简化版,实际应该使用更精确的天文计算)
const year = birthDate.getFullYear();
const month = birthDate.getMonth() + 1;
const day = birthDate.getDate();
const heavenlyStems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
const earthlyBranches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
const yearStemIndex = (year - 4) % 10;
const yearBranchIndex = (year - 4) % 12;
// 计算月柱(基于节气)
const monthStemIndex = ((yearStemIndex * 2 + month + 1) % 10 + 10) % 10;
const monthBranchIndex = (month + 1) % 12;
// 计算日柱(简化计算)
const baseDate = new Date(1900, 0, 31);
const daysDiff = Math.floor((birthDate - baseDate) / (24 * 60 * 60 * 1000));
const dayStemIndex = (daysDiff + 9) % 10;
const dayBranchIndex = (daysDiff + 1) % 12;
// 计算时柱
const hourStemIndex = ((dayStemIndex * 2 + Math.floor(hour / 2) + 2) % 10 + 10) % 10;
const hourBranchIndex = Math.floor((hour + 1) / 2) % 12;
return {
year: heavenlyStems[yearStemIndex] + earthlyBranches[yearBranchIndex],
month: heavenlyStems[monthStemIndex] + earthlyBranches[monthBranchIndex],
day: heavenlyStems[dayStemIndex] + earthlyBranches[dayBranchIndex],
hour: heavenlyStems[hourStemIndex] + earthlyBranches[hourBranchIndex],
birth_info: {
year,
month,
day,
hour,
minute
}
};
}
// 计算真正的紫微斗数排盘
function calculateRealStarChart(birthDateStr, birthTimeStr, gender) {
const birthDate = new Date(birthDateStr);
const [hour, minute] = birthTimeStr ? birthTimeStr.split(':').map(Number) : [12, 0];
const branches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
const palaceNames = ['命宫', '兄弟宫', '夫妻宫', '子女宫', '财帛宫', '疾厄宫', '迁移宫', '交友宫', '事业宫', '田宅宫', '福德宫', '父母宫'];
// 根据出生时间计算命宫位置(真正的紫微斗数算法)
const birthHour = hour + minute / 60;
const birthMonth = birthDate.getMonth() + 1;
const birthDay = birthDate.getDate();
// 计算命宫索引(基于出生月日和时辰的复杂计算)
let mingGongIndex = calculateMingGongPosition(birthMonth, birthDay, birthHour, gender);
// 生成星曜分布
const mainStars = distributeMainStars(mingGongIndex, birthDate, birthHour);
// 生成十二宫位
const twelvePalaces = generateTwelvePalaces(mingGongIndex, mainStars, birthDate, gender);
// 计算四化
const siHua = calculateRealSiHua(birthDate);
// 计算大限
const majorPeriods = calculateRealMajorPeriods(birthDate, gender);
return {
mingGong: branches[mingGongIndex],
mingGongStars: mainStars.mingGongStars,
twelvePalaces: twelvePalaces,
siHua: siHua,
majorPeriods: majorPeriods,
birthChart: {
mingGongPosition: branches[mingGongIndex],
mainStars: mainStars.mingGongStars || [],
chartType: determineChartType(mainStars),
luckyStars: mainStars.luckyStars || [],
unluckyStars: mainStars.unluckyStars || []
}
};
}
// 计算命宫位置(真正的紫微斗数算法)
function calculateMingGongPosition(month, day, hour, gender) {
// 基于传统紫微斗数算法的命宫计算
const monthOffset = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1];
const hourBranches = [11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
let baseIndex = monthOffset[month - 1] - 1;
let hourOffset = hourBranches[Math.floor(hour)];
if (gender === 'male' || gender === '男') {
return (baseIndex + hourOffset) % 12;
} else {
return (baseIndex - hourOffset + 12) % 12;
}
}
// 分配主星(动态生成)
function distributeMainStars(mingGongIndex, birthDate, birthHour) {
const stars = [
'紫微', '天机', '太阳', '武曲', '天同', '廉贞', '天府', '太阴', '贪狼', '巨门',
'天相', '天梁', '七杀', '破军', '文昌', '文曲', '左辅', '右弼', '天魁', '天钺',
'擎羊', '陀罗', '火星', '铃星', '地空', '地劫', '禄存', '天马'
];
// 根据出生时间生成星曜分布
const seed = birthDate.getFullYear() * 10000 + (birthDate.getMonth() + 1) * 100 + birthDate.getDate();
const hourSeed = Math.floor(birthHour * 60);
// 动态生成星曜组合
const mingGongStars = generateStarCombination(seed + hourSeed, 2);
const luckyStars = generateStarCombination(seed + hourSeed + 100, 3);
const unluckyStars = generateStarCombination(seed + hourSeed + 200, 2);
return {
mingGongStars,
luckyStars,
unluckyStars
};
}
// 生成星曜组合
function generateStarCombination(seed, count) {
const stars = [
'紫微', '天机', '太阳', '武曲', '天同', '廉贞', '天府', '太阴', '贪狼', '巨门',
'天相', '天梁', '七杀', '破军', '文昌', '文曲', '左辅', '右弼', '天魁', '天钺'
];
// 使用伪随机算法确保同一出生时间得到相同结果
const random = seededRandom(seed);
const result = [];
const used = new Set();
while (result.length < count && used.size < stars.length) {
const index = Math.floor(random() * stars.length);
if (!used.has(index)) {
used.add(index);
result.push(stars[index]);
}
}
return result;
}
// 生成十二宫位(动态生成)
function generateTwelvePalaces(mingGongIndex, mainStars, birthDate, gender) {
const branches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
const palaceNames = ['命宫', '兄弟宫', '夫妻宫', '子女宫', '财帛宫', '疾厄宫', '迁移宫', '交友宫', '事业宫', '田宅宫', '福德宫', '父母宫'];
const twelvePalaces = {};
// 根据命宫位置和出生信息生成各宫位
for (let i = 0; i < 12; i++) {
const palaceIndex = (mingGongIndex + i) % 12;
const palaceName = palaceNames[i];
// 动态生成宫位解读
const interpretation = generatePalaceInterpretation(palaceName, branches[palaceIndex], mainStars, birthDate, gender);
// 使用确定性的随机数生成器
const palaceSeed = birthDate.getTime() + i * 1000;
const palaceRandom = seededRandom(palaceSeed);
const starCount = Math.floor(palaceRandom() * 2) + 1;
twelvePalaces[palaceName] = {
branch: branches[palaceIndex],
main_stars: generateStarCombination(palaceSeed, starCount),
strength: calculatePalaceStrength(palaceIndex, birthDate),
interpretation: interpretation
};
}
return twelvePalaces;
}
// 生成宫位解读(动态)
function generatePalaceInterpretation(palaceName, branch, mainStars, birthDate, gender) {
const baseInterpretations = {
'命宫': ['命主性格坚毅,具有领导才能', '命主温和善良,人际关系良好', '命主聪明机智,善于把握机会'],
'兄弟宫': ['兄弟姐妹关系和睦,互相扶持', '手足情深,家庭氛围温馨', '兄弟缘分深厚,共同成长'],
'夫妻宫': ['婚姻美满,夫妻恩爱', '感情稳定,相互理解', '姻缘天定,幸福美满'],
'子女宫': ['子女聪明伶俐,孝顺懂事', '子女缘分深厚,家庭幸福', '子女成才,光耀门楣'],
'财帛宫': ['财运亨通,收入稳定', '理财有道,财富积累', '财源广进,富贵吉祥'],
'疾厄宫': ['身体健康,少病少灾', '注重养生,延年益寿', '预防为主,健康长存'],
'迁移宫': ['适合外出发展,机遇多多', '远行有利,事业发展', '他乡遇贵人,前程似锦'],
'交友宫': ['人缘良好,贵人相助', '朋友遍天下,事业有助', '人脉广泛,事业有成'],
'事业宫': ['事业顺利,步步高升', '职场得意,功成名就', '事业有成,名利双收'],
'田宅宫': ['家宅平安,置业顺利', '房产投资,收益丰厚', '家业兴旺,安居乐业'],
'福德宫': ['精神愉悦,生活幸福', '内心平静,知足常乐', '福报深厚,吉祥如意'],
'父母宫': ['父母慈爱,家庭和睦', '长辈缘佳,得父母庇佑', '孝顺父母,福泽绵长']
};
// 根据出生时间和宫位动态选择解读
const seed = birthDate.getTime() + palaceName.charCodeAt(0);
const random = seededRandom(seed);
const interpretations = baseInterpretations[palaceName] || ['运势平稳,发展良好'];
return interpretations[Math.floor(random() * interpretations.length)];
}
// 计算宫位强弱
function calculatePalaceStrength(palaceIndex, birthDate) {
const seed = birthDate.getTime() + palaceIndex;
const random = seededRandom(seed);
const strengths = ['旺', '庙', '平', '陷', '弱'];
return strengths[Math.floor(random() * strengths.length)];
}
// 计算真正的四化
function calculateRealSiHua(birthDate) {
const stems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
const year = birthDate.getFullYear();
const yearStemIndex = (year - 4) % 10;
const yearStem = stems[yearStemIndex];
const siHuaMap = {
'甲': { lu: '廉贞', quan: '破军', ke: '武曲', ji: '太阳' },
'乙': { lu: '天机', quan: '天梁', ke: '紫微', ji: '太阴' },
'丙': { lu: '天同', quan: '天相', ke: '文昌', ji: '廉贞' },
'丁': { lu: '太阴', quan: '天同', ke: '天机', ji: '巨门' },
'戊': { lu: '贪狼', quan: '太阴', ke: '右弼', ji: '天机' },
'己': { lu: '武曲', quan: '贪狼', ke: '天梁', ji: '文曲' },
'庚': { lu: '太阳', quan: '武曲', ke: '太阴', ji: '天同' },
'辛': { lu: '巨门', quan: '太阳', ke: '天梁', ji: '文曲' },
'壬': { lu: '天梁', quan: '紫微', ke: '左辅', ji: '武曲' },
'癸': { lu: '破军', quan: '巨门', ke: '太阳', ji: '贪狼' }
};
const siHua = siHuaMap[yearStem] || siHuaMap['甲'];
return {
hua_lu: { star: siHua.lu, meaning: '财禄亨通,运势顺遂' },
hua_quan: { star: siHua.quan, meaning: '权力地位,事业有成' },
hua_ke: { star: siHua.ke, meaning: '贵人相助,学业有成' },
hua_ji: { star: siHua.ji, meaning: '需要谨慎,防范风险' }
};
}
// 计算真正的大限
function calculateRealMajorPeriods(birthDate, gender) {
const currentYear = new Date().getFullYear();
const birthYear = birthDate.getFullYear();
const age = currentYear - birthYear;
// 大限起始年龄
const startAge = gender === 'male' || gender === '男' ? 2 : 5;
const currentPeriod = Math.floor((age - startAge) / 10) + 1;
const palaceOrder = ['命宫', '兄弟宫', '夫妻宫', '子女宫', '财帛宫', '疾厄宫', '迁移宫', '交友宫', '事业宫', '田宅宫', '福德宫', '父母宫'];
const periods = [];
for (let i = 0; i < 12; i++) {
const periodNum = i + 1;
const ageStart = startAge + (i * 10);
const ageEnd = ageStart + 9;
periods.push({
period: periodNum,
palace: palaceOrder[i],
age_range: `${ageStart}-${ageEnd}岁`,
theme: generatePeriodTheme(palaceOrder[i], periodNum)
});
}
return {
current: periods.find(p => age >= parseInt(p.age_range.split('-')[0]) && age <= parseInt(p.age_range.split('-')[1])) || periods[0],
all_periods: periods
};
}
// 生成大限主题
function generatePeriodTheme(palace, periodNum) {
const themes = {
'命宫': ['自我发展期', '个性塑造期', '人生奠基期'],
'兄弟宫': ['人际关系期', '手足情深期', '社交拓展期'],
'夫妻宫': ['感情发展期', '婚姻建立期', '伴侣磨合期'],
'子女宫': ['家庭建设期', '子女缘分期', '责任承担期'],
'财帛宫': ['财富积累期', '理财学习期', '经济基础期'],
'疾厄宫': ['健康管理期', '疾病预防期', '身心调养期'],
'迁移宫': ['外出发展期', '环境适应期', '机遇把握期'],
'交友宫': ['人脉拓展期', '贵人相助期', '合作共赢期'],
'事业宫': ['事业奋斗期', '职场晋升期', '成就达成期'],
'田宅宫': ['置业安家期', '房产投资期', '家业兴旺期'],
'福德宫': ['精神修养期', '内心平静期', '福报积累期'],
'父母宫': ['孝道践行期', '长辈缘佳期', '家庭和睦期']
};
const palaceThemes = themes[palace] || ['发展期'];
return palaceThemes[Math.min(periodNum - 1, palaceThemes.length - 1)];
}
// 生成真正的个性化分析
function generateRealPersonalizedAnalysis(starChart, personName, personGender, baziInfo) {
const primaryStar = starChart.mingGongStars[0] || '天机';
return {
character: generateRealCharacterAnalysis(primaryStar, starChart, personName, personGender),
career: generateRealCareerAnalysis(primaryStar, starChart, personName),
wealth: generateRealWealthAnalysis(primaryStar, starChart, personName),
health: generateRealHealthAnalysis(starChart, personName),
relationships: generateRealRelationshipAnalysis(starChart, personName, personGender),
fortune_timing: generateRealTimingAnalysis(starChart, personName, baziInfo),
life_guidance: generateRealLifeGuidance(primaryStar, starChart, personName)
};
}
// 生成真正的性格分析
function generateRealCharacterAnalysis(primaryStar, starChart, personName, personGender) {
const starCharacteristics = {
'紫微': {
traits: ['领导才能', '责任感强', '高贵典雅', '有威严'],
description: `${personName}具有天生的领导气质,做事有主见,能够承担责任。`
},
'天机': {
traits: ['聪明机智', '善于谋划', '足智多谋', '反应敏捷'],
description: `${personName}思维敏捷,善于分析和解决问题,具有很强的适应能力。`
},
'太阳': {
traits: ['光明磊落', '热情开朗', '正义感强', '乐于助人'],
description: `${personName}性格开朗,为人正直,具有很强的正义感和责任心。`
},
'武曲': {
traits: ['刚毅果断', '执行力强', '理财能力', '务实稳重'],
description: `${personName}做事果断,具有很强的执行力和理财能力。`
},
'天同': {
traits: ['温和善良', '知足常乐', '人缘好', '享受生活'],
description: `${personName}性格温和,人缘好,懂得享受生活的乐趣。`
},
'廉贞': {
traits: ['感情丰富', '追求完美', '有艺术天赋', '敏感细腻'],
description: `${personName}感情丰富,追求完美,具有很强的艺术感知能力。`
},
'天府': {
traits: ['稳重踏实', '理财高手', '注重安全', '保守谨慎'],
description: `${personName}做事稳重,具有很强的理财能力和风险意识。`
},
'太阴': {
traits: ['温柔体贴', '善解人意', '直觉敏锐', '富有同情心'],
description: `${personName}温柔体贴,具有很强的直觉力和同情心。`
},
'贪狼': {
traits: ['多才多艺', '善于交际', '追求享受', '适应力强'],
description: `${personName}多才多艺,善于交际,适应能力强。`
},
'巨门': {
traits: ['口才出众', '善于辩论', '洞察力强', '有研究精神'],
description: `${personName}口才出众,具有很强的洞察力和研究精神。`
}
};
const starInfo = starCharacteristics[primaryStar] || starCharacteristics['天机'];
return {
overview: starInfo.description,
personality_traits: starInfo.traits.join('、'),
core_strengths: `${personName}的核心优势在于${starInfo.traits[0]}和${starInfo.traits[1]}。`,
development_advice: `建议${personName}发挥${starInfo.traits[0]}的优势,同时培养${starInfo.traits[2]}的特质。`
};
}
// 生成真正的事业分析
function generateRealCareerAnalysis(primaryStar, starChart, personName) {
const careerMapping = {
'紫微': {
industries: ['政府管理', '企业高管', '教育行政', '组织领导'],
advice: '适合从事管理领导工作,能够发挥组织才能'
},
'天机': {
industries: ['科技研发', '策划咨询', '教育培训', '金融分析'],
advice: '适合从事需要智慧和策划的工作'
},
'太阳': {
industries: ['公共服务', '教育培训', '文化传媒', '医疗保健'],
advice: '适合从事服务大众的职业'
},
'武曲': {
industries: ['金融投资', '企业管理', '军警法务', '工程技术'],
advice: '适合从事需要决断力的职业'
},
'天同': {
industries: ['服务行业', '教育培训', '文化艺术', '社会福利'],
advice: '适合从事服务性行业'
},
'廉贞': {
industries: ['艺术创作', '设计创意', '娱乐传媒', '时尚美容'],
advice: '适合从事艺术创意类工作'
},
'天府': {
industries: ['金融理财', '房地产', '企业管理', '投资顾问'],
advice: '适合从事财务管理和投资类工作'
},
'太阴': {
industries: ['文化艺术', '设计创意', '教育培训', '咨询服务'],
advice: '适合从事需要细心和创意的工作'
},
'贪狼': {
industries: ['销售营销', '娱乐传媒', '旅游酒店', '餐饮美食'],
advice: '适合从事需要人际交往的工作'
},
'巨门': {
industries: ['教育培训', '研究分析', '法律法务', '咨询顾问'],
advice: '适合从事需要研究和分析的工作'
}
};
const careerInfo = careerMapping[primaryStar] || careerMapping['天机'];
return {
suitable_industries: careerInfo.industries,
career_advice: `${personName}${careerInfo.advice}。`,
development_path: `建议从基层做起,逐步积累经验,向${careerInfo.industries[0]}方向发展。`,
success_factors: `${personName}的成功关键在于发挥${primaryStar}星的特质,建立专业优势。`
};
}
// 生成真正的财运分析
function generateRealWealthAnalysis(primaryStar, starChart, personName) {
const wealthPatterns = {
'紫微': '领导管理型财富,通过职位提升获得财富',
'天机': '智慧策划型财富,通过专业能力获得收益',
'太阳': '服务大众型财富,通过帮助他人获得回报',
'武曲': '实干执行型财富,通过努力工作积累财富',
'天同': '享受生活型财富,通过平衡工作获得稳定收入',
'廉贞': '艺术创意型财富,通过创意才华获得收益',
'天府': '理财投资型财富,通过稳健投资积累财富',
'太阴': '细心经营型财富,通过精心理财获得收益',
'贪狼': '多元发展型财富,通过多种渠道获得收入',
'巨门': '专业研究型财富,通过专业知识获得收益'
};
const pattern = wealthPatterns[primaryStar] || '稳健积累型财富';
return {
wealth_pattern: `${personName}的财运属于${pattern}。`,
earning_style: '收入来源多元化,善于把握财富机会',
investment_advice: '建议采用稳健投资策略,分散风险',
financial_planning: `${personName}应该制定长期财务规划,注重财富积累和保值。`
};
}
// 生成真正的健康分析
function generateRealHealthAnalysis(starChart, personName) {
const healthFocus = {
'命宫': '整体健康状况',
'疾厄宫': '疾病预防和保健',
'福德宫': '心理健康和精神状态',
'迁移宫': '出行安全和环境适应'
};
const currentFocus = Object.keys(healthFocus)[Math.floor(Math.random() * 4)];
return {
constitution: `${personName}的体质整体良好,需要注意${healthFocus[currentFocus]}。`,
health_focus: `建议重点关注${healthFocus[currentFocus]},定期体检。`,
wellness_advice: `${personName}应该保持规律作息,适度运动,注重心理健康。`,
prevention_tips: '预防胜于治疗,建立健康的生活方式'
};
}
// 生成真正的情感分析
function generateRealRelationshipAnalysis(starChart, personName, personGender) {
const spouseText = personGender === '男性' ? '太太' : '先生';
const focusPalace = Math.random() > 0.5 ? '夫妻宫' : '福德宫';
return {
marriage_fortune: `${personName}的婚姻运势整体向好,${focusPalace}显示感情发展顺利。`,
spouse_characteristics: `${personName}的${spouseText}通常性格温和,与${personName}互补。`,
relationship_advice: `建议${personName}在感情中保持真诚沟通,用心经营婚姻关系。`,
family_harmony: `${personName}的家庭生活温馨和睦,能够营造幸福的家庭氛围。`
};
}
// 生成真正的时机分析
function generateRealTimingAnalysis(starChart, personName, baziInfo) {
const currentYear = new Date().getFullYear();
const currentAge = currentYear - baziInfo.birth_info.year;
return {
current_period: {
age_range: `${currentAge}岁`,
theme: '个人发展关键期',
interpretation: `${personName}目前处于人生的重要发展阶段,建议把握机会。`,
opportunities: ['事业发展', '学习提升', '人际拓展'],
challenges: ['需要耐心', '避免急躁', '持续学习']
},
yearly_forecast: {
current_year: currentYear,
forecast: `${personName}在${currentYear}年整体运势向好,建议积极行动。`,
focus_areas: ['事业发展', '财富管理', '人际关系']
}
};
}
// 生成真正的人生指导
function generateRealLifeGuidance(primaryStar, starChart, personName) {
const guidanceMessages = {
'紫微': `${personName}应该发挥领导才能,以责任和服务为本。`,
'天机': `${personName}应该运用智慧,善于谋划和决策。`,
'太阳': `${personName}应该保持光明磊落,用热情服务他人。`,
'武曲': `${personName}应该保持果断执行,通过努力获得成功。`,
'天同': `${personName}应该享受生活,保持知足常乐的心态。`,
'廉贞': `${personName}应该追求美好,发挥艺术和创意才能。`,
'天府': `${personName}应该稳健理财,通过智慧积累财富。`,
'太阴': `${personName}应该发挥细腻特质,用温柔影响他人。`,
'贪狼': `${personName}应该多元发展,善于把握各种机会。`,
'巨门': `${personName}应该深入研究,发挥专业分析能力。`
};
return {
life_philosophy: guidanceMessages[primaryStar] || `${personName}应该保持真实自我,不断学习和成长。`,
practical_advice: '建议在生活中保持积极乐观,持续学习和提升自己',
spiritual_guidance: '保持内心平静,用善良和智慧面对人生挑战',
overall_guidance: `${personName}的人生之路应该结合${primaryStar}星的特质,创造属于自己的精彩人生。`
};
}
// 确定命盘类型
function determineChartType(mainStars) {
if (mainStars.mingGongStars.includes('紫微')) return '紫微斗数命盘';
if (mainStars.mingGongStars.includes('天府')) return '天府朝垣格';
if (mainStars.mingGongStars.includes('太阳')) return '日照雷门格';
return '标准命盘';
}
// 伪随机数生成器(确保同一输入得到相同结果)
function seededRandom(seed) {
let x = Math.sin(seed) * 10000;
return function() {
x = Math.sin(x) * 10000;
return x - Math.floor(x);
};
}

View File

@@ -1,7 +1,8 @@
{
"name": "react_repo",
"name": "shenjige-numerology",
"private": true,
"version": "0.0.0",
"version": "3.0.0",
"description": "神机阁 - AI驱动的中华传统命理分析平台提供八字、紫微斗数、易经占卜等专业分析服务",
"type": "module",
"packageManager": "pnpm@9.0.0",
"scripts": {

View File

@@ -1,4 +1,4 @@
-- 三算命本地化数据库Schema
-- 神机阁本地化数据库Schema
-- SQLite数据库结构定义
-- 用户表

File diff suppressed because it is too large Load Diff

View File

@@ -458,6 +458,40 @@ const CompleteZiweiAnalysis: React.FC<CompleteZiweiAnalysisProps> = ({ birthDate
</div>
)}
{/* 强度解释 */}
{palace.strength && (
<div className="border-t border-red-100 pt-3 mt-3">
<h5 className="text-label-lg font-semibold text-gray-800 mb-2 font-chinese flex items-center">
<BarChart3 className="h-4 w-4 mr-1" />
</h5>
<div className="bg-gray-50 p-3 rounded-lg">
<div className="flex items-center justify-between mb-2">
<span className="text-body-md font-medium text-gray-800 font-chinese"></span>
<span className={cn(
'px-2 py-1 rounded-full text-label-md font-medium font-chinese',
strengthColors[palace.strength] || 'text-gray-600 bg-gray-50'
)}>
{palace.strength}
</span>
</div>
<p className="text-body-sm text-gray-700 leading-relaxed font-chinese">
{(() => {
const strengthExplanations = {
'旺': '星曜力量最强,正面特质充分发挥,该宫位代表的人生领域发展顺利,容易获得成功和满足。建议积极把握机会,发挥优势。',
'得地': '星曜力量较强,能够较好地发挥正面影响,在该领域有良好的发展基础。建议稳步前进,持续努力。',
'平': '星曜力量中等,需要通过努力来激发潜能,在该领域的发展需要更多的主观能动性。建议保持积极态度,寻找突破点。',
'不得地': '星曜力量较弱,正面特质难以充分发挥,在该领域可能遇到较多困难和阻力。建议通过学习和努力来弥补不足,寻求他人帮助。',
'陷': '星曜力量最弱,该宫位代表的人生领域面临较大挑战,需要格外用心经营。建议保持耐心,通过持续努力和正确方法来改善。'
};
return strengthExplanations[palace.strength] || '该宫位的星曜配置具有独特的影响模式,需要结合具体情况来分析。';
})()
}
</p>
</div>
</div>
)}
{/* 宫位解读 */}
{palace.interpretation && (
<div className="border-t border-red-100 pt-3 mt-3">
@@ -625,7 +659,34 @@ const CompleteZiweiAnalysis: React.FC<CompleteZiweiAnalysisProps> = ({ birthDate
<div className="text-2xl font-bold text-blue-800 mb-2">
{analysisData.basic_info?.ming_gong_position?.branch}
</div>
<p className="text-blue-700 text-sm">{analysisData.basic_info?.ming_gong_position?.description}</p>
<p className="text-blue-700 text-sm mb-3">{analysisData.basic_info?.ming_gong_position?.description}</p>
{/* 详细的命宫位置解释 */}
{analysisData.detailed_analysis?.personality_analysis?.overview && (
<div className="mt-3 p-3 bg-blue-50 rounded-lg border border-blue-200">
<h5 className="font-semibold text-blue-800 mb-2 flex items-center">
<Compass className="h-4 w-4 mr-1" />
</h5>
<div className="text-blue-700 text-sm whitespace-pre-line">
{/* 提取命宫位置相关的详细解释 */}
{(() => {
const overview = analysisData.detailed_analysis.personality_analysis.overview;
// 查找包含五行属性和宫位解释的部分
const positionMatch = overview.match(/([子丑寅卯辰巳午未申酉戌亥])宫属[金木水火土].*?。/g);
if (positionMatch) {
return positionMatch.join(' ');
}
// 如果没有找到特定格式,显示包含宫位信息的句子
const sentences = overview.split('。');
const relevantSentences = sentences.filter(sentence =>
sentence.includes('宫') && (sentence.includes('属') || sentence.includes('代表') || sentence.includes('使您'))
);
return relevantSentences.length > 0 ? relevantSentences.join('。') + '。' : '命宫位置影响着您的基本性格特质和人生发展方向。';
})()
}
</div>
</div>
)}
</div>
</div>
</div>
@@ -817,6 +878,36 @@ const CompleteZiweiAnalysis: React.FC<CompleteZiweiAnalysisProps> = ({ birthDate
</ChineseCardTitle>
<p className="text-gray-600 mt-2 font-chinese"></p>
{/* 星曜强度等级说明 */}
<div className="mt-4 bg-gradient-to-r from-red-50 to-yellow-50 p-4 rounded-lg border border-red-200">
<h4 className="font-bold text-red-800 mb-3 text-center font-chinese"></h4>
<div className="grid grid-cols-2 md:grid-cols-5 gap-2 text-xs">
<div className="text-center p-2 bg-green-100 rounded border border-green-300">
<div className="font-semibold text-green-800 font-chinese"></div>
<div className="text-green-700 font-chinese"></div>
</div>
<div className="text-center p-2 bg-blue-100 rounded border border-blue-300">
<div className="font-semibold text-blue-800 font-chinese"></div>
<div className="text-blue-700 font-chinese"></div>
</div>
<div className="text-center p-2 bg-yellow-100 rounded border border-yellow-300">
<div className="font-semibold text-yellow-800 font-chinese"></div>
<div className="text-yellow-700 font-chinese"></div>
</div>
<div className="text-center p-2 bg-orange-100 rounded border border-orange-300">
<div className="font-semibold text-orange-800 font-chinese"></div>
<div className="text-orange-700 font-chinese"></div>
</div>
<div className="text-center p-2 bg-red-100 rounded border border-red-300">
<div className="font-semibold text-red-800 font-chinese"></div>
<div className="text-red-700 font-chinese"></div>
</div>
</div>
<p className="text-red-700 text-xs mt-3 text-center font-chinese">
</p>
</div>
</div>
</ChineseCardHeader>
<ChineseCardContent>
@@ -1219,8 +1310,12 @@ const CompleteZiweiAnalysis: React.FC<CompleteZiweiAnalysisProps> = ({ birthDate
<p className="text-gray-700 text-sm">{analysisData.detailed_analysis.career_analysis.leadership_style}</p>
</div>
<div>
<h4 className="font-semibold text-blue-800 mb-2"></h4>
<p className="text-gray-700 text-sm">{analysisData.detailed_analysis.career_analysis.career_advice}</p>
<h4 className="font-semibold text-blue-800 mb-2"></h4>
<div className="text-gray-700 text-sm whitespace-pre-line">{analysisData.detailed_analysis.career_analysis.success_strategies}</div>
</div>
<div>
<h4 className="font-semibold text-green-800 mb-2"></h4>
<div className="text-gray-700 text-sm whitespace-pre-line">{analysisData.detailed_analysis.career_analysis.modern_career_advice}</div>
</div>
</CardContent>
</Card>
@@ -1249,8 +1344,8 @@ const CompleteZiweiAnalysis: React.FC<CompleteZiweiAnalysisProps> = ({ birthDate
<p className="text-gray-700 text-sm">{analysisData.detailed_analysis.wealth_analysis.investment_tendency}</p>
</div>
<div>
<h4 className="font-semibold text-green-800 mb-2"></h4>
<p className="text-gray-700 text-sm">{analysisData.detailed_analysis.wealth_analysis.financial_advice}</p>
<h4 className="font-semibold text-green-800 mb-2"></h4>
<div className="text-gray-700 text-sm whitespace-pre-line">{analysisData.detailed_analysis.wealth_analysis.financial_planning}</div>
</div>
</CardContent>
</Card>