mirror of
https://github.com/patdelphi/suanming.git
synced 2026-02-28 05:33:11 +08:00
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:
30
CHANGELOG.md
30
CHANGELOG.md
@@ -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
|
||||
|
||||
### 修复
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Koyeb 部署指南
|
||||
|
||||
本指南将帮助您将三算命项目部署到 Koyeb 平台。
|
||||
本指南将帮助您将神机阁项目部署到 Koyeb 平台。
|
||||
|
||||
## 🚀 部署步骤
|
||||
|
||||
@@ -158,4 +158,4 @@ Koyeb 会自动监控您的应用健康状态:
|
||||
|
||||
---
|
||||
|
||||
**部署成功后,您的三算命应用就可以在全球范围内访问了!** 🎉
|
||||
**部署成功后,您的神机阁应用就可以在全球范围内访问了!** 🎉
|
||||
90
README.md
90
README.md
@@ -1,20 +1,31 @@
|
||||
# 神机阁 - AI命理分析平台
|
||||
|
||||
[](https://github.com/your-repo/ai-numerology-refactored)
|
||||
[](https://github.com/your-repo/shenjige-numerology)
|
||||
[](LICENSE)
|
||||
[](https://nodejs.org/)
|
||||
[](https://reactjs.org/)
|
||||
[](https://www.typescriptlang.org/)
|
||||
[](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
|
||||
|
||||
---
|
||||
|
||||
**三算命** - 传承千年智慧,拥抱现代科技 🌟
|
||||
**神机阁** - 传承千年智慧,拥抱现代科技 🌟
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# API 文档
|
||||
|
||||
本文档描述了三算命平台的后端API接口,基于Node.js Express框架实现。
|
||||
本文档描述了神机阁平台的后端API接口,基于Node.js Express框架实现。
|
||||
|
||||
## 基础信息
|
||||
|
||||
|
||||
@@ -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 中提问。
|
||||
1170
docs/DEVELOPMENT.md
1170
docs/DEVELOPMENT.md
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
# 本地化部署指南
|
||||
|
||||
本文档详细说明如何部署和运行完全本地化的三算命应用。
|
||||
本文档详细说明如何部署和运行完全本地化的神机阁应用。
|
||||
|
||||
## 🎯 本地化改造概述
|
||||
|
||||
@@ -384,7 +384,7 @@ pm2 logs numerology-app
|
||||
|
||||
## 🎉 恭喜!
|
||||
|
||||
您已成功部署本地化的三算命应用!现在可以:
|
||||
您已成功部署本地化的神机阁应用!现在可以:
|
||||
- 🔮 进行八字、紫微、易经分析
|
||||
- 👤 管理用户账户和档案
|
||||
- 📚 查看和管理历史记录
|
||||
|
||||
702
logic/bazi.txt
702
logic/bazi.txt
@@ -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}元素的不利时期`;
|
||||
}
|
||||
3415
logic/yijing.txt
3415
logic/yijing.txt
File diff suppressed because it is too large
Load Diff
687
logic/ziwei.txt
687
logic/ziwei.txt
@@ -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);
|
||||
};
|
||||
}
|
||||
@@ -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": {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- 三算命本地化数据库Schema
|
||||
-- 神机阁本地化数据库Schema
|
||||
-- SQLite数据库结构定义
|
||||
|
||||
-- 用户表
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user