当前位置:首页>python>四柱命理分析的Python自动化实现

四柱命理分析的Python自动化实现

  • 2026-02-08 04:20:54
四柱命理分析的Python自动化实现

八字命理,又称四柱命理,是中国传统命理学的重要组成部分。它通过人出生的年、月、日、时四柱(每柱一天干、一地支,共八字)来推算人的命运走势。如今,我们借助Python编程语言,将这一传统智慧数字化,开发出了一款功能全面的八字命理分析系统。

📜 理论基础:中华传统命理学

什么是八字?

八字,又称四柱命理,是中国传统命理学的核心。它通过年、月、日、时四个时间维度,每个维度由天干地支组合而成,共八个字,来推算人的命运轨迹。

系统功能概览

1.八字排盘:准确计算年柱、月柱、日柱、时柱。

2.十神分析:分析八字中的十神关系。

3.五行分析:统计五行分布,分析五行强弱。

4.格局判断:根据五行力量判断格局类型。

5.神煞计算:计算天乙贵人、太极贵人、文昌贵人、驿马、桃花、华盖等神煞。

6.大运计算:排定大运,分析运势走势。

7.可视化图表:生成八字四柱图、十神分布图、五行能量图、大运走势图、格局分析图。

8.报告生成:生成HTML和文本格式的详细分析报告。

下面我们给出完整Python代码:

# # 必需的可视化库
# pip install matplotlib numpy seaborn pillow

# # 必需的可视化库
# pip install matplotlib numpy seaborn pillow

"""
八字命理分析系统 - 最终完整版(已修正所有错误)
功能:准确的八字排盘 + 专业可视化 + HTML报告
Python版本:3.12.9
"
""

from enum import Enum
import os
import sys
import datetime
import warnings
import webbrowser
from typing import Dict, List, Tuple, Optional, Any
from pathlib import Path
import math

# ==================== 导入可视化库 ====================
try:
    import matplotlib.pyplot as plt
    import matplotlib
    from matplotlib.patches import Rectangle, Circle, FancyBboxPatch
    from matplotlib.figure import Figure
    import numpy as np
    import seaborn as sns

# 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei''Microsoft YaHei''DejaVu Sans']
    plt.rcParams['axes.unicode_minus'] = False

    VISUALIZATION_AVAILABLE = True
except ImportError as e:
print(f"可视化库导入失败: {e}")
    VISUALIZATION_AVAILABLE = False


# ==================== 基础数据定义 ====================
class 天干(Enum):
    甲 = 1; 乙 = 2; 丙 = 3; 丁 = 4; 戊 = 5
    己 = 6; 庚 = 7; 辛 = 8; 壬 = 9; 癸 = 10


class 地支(Enum):
    子 = 1; 丑 = 2; 寅 = 3; 卯 = 4; 辰 = 5; 巳 = 6
    午 = 7; 未 = 8; 申 = 9; 酉 = 10; 戌 = 11; 亥 = 12


class 五行(Enum):
    木 = 1; 火 = 2; 土 = 3; 金 = 4; 水 = 5


class 十神(Enum):
    比肩 = "比肩"; 劫财 = "劫财"; 食神 = "食神"; 伤官 = "伤官"
    偏财 = "偏财"; 正财 = "正财"; 七杀 = "七杀"; 正官 = "正官"
    偏印 = "偏印"; 正印 = "正印"


# ==================== 准确八字计算器(最终版)====================
class 准确八字计算器:
"""准确的八字计算器 - 最终修正版"""

# 天干地支对应表
    天干表 = ['甲''乙''丙''丁''戊''己''庚''辛''壬''癸']
    地支表 = ['子''丑''寅''卯''辰''巳''午''未''申''酉''戌''亥']

# 六十甲子表(已修正错误)
    六十甲子 = [
'甲子''乙丑''丙寅''丁卯''戊辰''己巳''庚午''辛未''壬申''癸酉',
'甲戌''乙亥''丙子''丁丑''戊寅''己卯''庚辰''辛巳''壬午''癸未',
'甲申''乙酉''丙戌''丁亥''戊子''己丑''庚寅''辛卯''壬辰''癸巳',
'甲午''乙未''丙申''丁酉''戊戌''己亥''庚子''辛丑''壬寅''癸卯',
'甲辰''乙巳''丙午''丁未''戊申''己酉''庚戌''辛亥''壬子''癸丑',
'甲寅''乙卯''丙辰''丁巳''戊午''己未''庚申''辛酉''壬戌''癸亥'
    ]

# 节气表(简化版,实际应以精确节气时间为准)
    节气表 = {
        1: {'节气''小寒''日期': 5, '月支''丑'},
        2: {'节气''立春''日期': 4, '月支''寅'},
        3: {'节气''惊蛰''日期': 5, '月支''卯'},
        4: {'节气''清明''日期': 4, '月支''辰'},
        5: {'节气''立夏''日期': 5, '月支''巳'},
        6: {'节气''芒种''日期': 5, '月支''午'},
        7: {'节气''小暑''日期': 7, '月支''未'},
        8: {'节气''立秋''日期': 7, '月支''申'},
        9: {'节气''白露''日期': 7, '月支''酉'},
        10: {'节气''寒露''日期': 8, '月支''戌'},
        11: {'节气''立冬''日期': 7, '月支''亥'},
        12: {'节气''大雪''日期': 7, '月支''子'}
    }

    @staticmethod
    def 计算年柱(年份: int, 月份: int, 日: int) -> Tuple[str, str]:
"""
        计算年柱(考虑立春节气)
        立春一般在2月4日左右,立春后才是新的一年
        "
""
# 判断是否在立春前
        立春日 = 4  # 2月4日立春

if 月份 < 2 or (月份 == 2 and 日 < 立春日):
# 立春前,算上一年
            计算年份 = 年份 - 1
else:
            计算年份 = 年份

# 以1900年(庚子年)为基准
        基准年 = 1900  # 庚子年
        年差 = 计算年份 - 基准年

# 计算干支序号(庚子为37号)
        基准序号 = 37
        干支序号 = (基准序号 + 年差) % 60
if 干支序号 == 0:
            干支序号 = 60

# 获取干支
        干支 = 准确八字计算器.六十甲子[干支序号 - 1]

return 干支[0], 干支[1]  # 天干, 地支

    @staticmethod
    def 计算月柱(年份: int, 月份: int, 日: int, 年干: str) -> Tuple[str, str]:
"""
        计算月柱(考虑节气)
        "
""
# 判断是否在节气后
if 月份 in 准确八字计算器.节气表:
            节气信息 = 准确八字计算器.节气表[月份]
            节气日 = 节气信息['日期']
            月支 = 节气信息['月支']

if 日 >= 节气日:
# 节气后,用本月月支
                pass
else:
# 节气前,用上月月支
                上个月 = 月份 - 1
if 上个月 == 0:
                    上个月 = 12
                月支 = 准确八字计算器.节气表[上个月]['月支']
else:
# 默认值
            月支 = '寅'

# 月支列表
        月支列表 = ['寅''卯''辰''巳''午''未''申''酉''戌''亥''子''丑']
        月支序号 = 月支列表.index(月支)

# 使用五虎遁计算月干
        五虎遁 = {
'甲': ['丙''丁''戊''己''庚''辛''壬''癸''甲''乙''丙''丁'],
'乙': ['戊''己''庚''辛''壬''癸''甲''乙''丙''丁''戊''己'],
'丙': ['庚''辛''壬''癸''甲''乙''丙''丁''戊''己''庚''辛'],
'丁': ['壬''癸''甲''乙''丙''丁''戊''己''庚''辛''壬''癸'],
'戊': ['甲''乙''丙''丁''戊''己''庚''辛''壬''癸''甲''乙'],
'己': ['丙''丁''戊''己''庚''辛''壬''癸''甲''乙''丙''丁'],
'庚': ['戊''己''庚''辛''壬''癸''甲''乙''丙''丁''戊''己'],
'辛': ['庚''辛''壬''癸''甲''乙''丙''丁''戊''己''庚''辛'],
'壬': ['壬''癸''甲''乙''丙''丁''戊''己''庚''辛''壬''癸'],
'癸': ['甲''乙''丙''丁''戊''己''庚''辛''壬''癸''甲''乙']
        }

        月干 = 五虎遁[年干][月支序号]

return 月干, 月支

    @staticmethod
    def 计算日柱(年份: int, 月份: int, 日: int) -> Tuple[str, str]:
"""
        计算日柱(使用准确的公式)
        参考:蔡勒公式 + 基准日法
        "
""
# 使用1900年1月31日(甲午日)为基准日
        基准年 = 1900
        基准月 = 1
        基准日 = 31
        基准干支序号 = 31  # 甲午日为31(甲子为1)

# 计算两个日期之间的天数差
        from datetime import date
        try:
            d1 = date(基准年, 基准月, 基准日)
            d2 = date(年份, 月份, 日)
            天数差 = (d2 - d1).days
        except:
# 如果计算失败,使用简化公式
# 计算从1900年到目标年的总天数
            总天数 = 0
for y in range(基准年, 年份):
                总天数 += 366 if (y % 4 == 0 and y % 100 != 0) or (y % 400 == 0) else 365

# 计算目标年的月份天数
            月份天数 = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if (年份 % 4 == 0 and 年份 % 100 != 0) or (年份 % 400 == 0):
                月份天数[2] = 29

for m in range(1, 月份):
                总天数 += 月份天数[m]

            总天数 += 日 - 1
            天数差 = 总天数

# 计算干支序号
        干支序号 = (基准干支序号 + 天数差) % 60
if 干支序号 == 0:
            干支序号 = 60

# 获取干支
        干支 = 准确八字计算器.六十甲子[干支序号 - 1]

return 干支[0], 干支[1]

    @staticmethod
    def 计算时柱(日干: str, 时辰: int) -> Tuple[str, str]:
"""计算时柱"""
# 时支对应表
        时支对应表 = {
            23: '子', 0: '子',
            1: '丑', 2: '丑',
            3: '寅', 4: '寅',
            5: '卯', 6: '卯',
            7: '辰', 8: '辰',
            9: '巳', 10: '巳',
            11: '午', 12: '午',
            13: '未', 14: '未',
            15: '申', 16: '申',
            17: '酉', 18: '酉',
            19: '戌', 20: '戌',
            21: '亥', 22: '亥'
        }

# 获取时支
        时支 = 时支对应表.get(时辰, '子')

# 时支在列表中的位置
        时支序号 = 准确八字计算器.地支表.index(时支)

# 使用五鼠遁计算时干
        五鼠遁 = {
'甲': ['甲''乙''丙''丁''戊''己''庚''辛''壬''癸''甲''乙'],
'乙': ['丙''丁''戊''己''庚''辛''壬''癸''甲''乙''丙''丁'],
'丙': ['戊''己''庚''辛''壬''癸''甲''乙''丙''丁''戊''己'],
'丁': ['庚''辛''壬''癸''甲''乙''丙''丁''戊''己''庚''辛'],
'戊': ['壬''癸''甲''乙''丙''丁''戊''己''庚''辛''壬''癸'],
'己': ['甲''乙''丙''丁''戊''己''庚''辛''壬''癸''甲''乙'],
'庚': ['丙''丁''戊''己''庚''辛''壬''癸''甲''乙''丙''丁'],
'辛': ['戊''己''庚''辛''壬''癸''甲''乙''丙''丁''戊''己'],
'壬': ['庚''辛''壬''癸''甲''乙''丙''丁''戊''己''庚''辛'],
'癸': ['壬''癸''甲''乙''丙''丁''戊''己''庚''辛''壬''癸']
        }

        时干 = 五鼠遁[日干][时支序号]

return 时干, 时支

    @staticmethod
    def 排八字(出生时间: datetime.datetime, 性别: str) -> Dict:
"""完整的八字排盘"""
        年份 = 出生时间.year
        月份 = 出生时间.month
        日 = 出生时间.day
        时辰 = 出生时间.hour

# 计算年柱
        年干, 年支 = 准确八字计算器.计算年柱(年份, 月份, 日)

# 计算月柱
        月干, 月支 = 准确八字计算器.计算月柱(年份, 月份, 日, 年干)

# 计算日柱
        日干, 日支 = 准确八字计算器.计算日柱(年份, 月份, 日)

# 计算时柱
        时干, 时支 = 准确八字计算器.计算时柱(日干, 时辰)

# 构建命盘
        命盘 = {
'出生时间': 出生时间,
'性别': 性别,
'年柱': {'天干': 年干, '地支': 年支},
'月柱': {'天干': 月干, '地支': 月支},
'日柱': {'天干': 日干, '地支': 日支},
'时柱': {'天干': 时干, '地支': 时支},
'日主': 日干
        }

return 命盘

    @staticmethod
    def 验证八字计算(年份: int, 月份: int, 日: int, 时辰: int, 性别: str):
"""验证八字计算准确性"""
print(f"\n验证八字计算准确性:")
print(f"输入: {年份}年{月份}月{日}日 {时辰}时 {性别}")

        出生时间 = datetime.datetime(年份, 月份, 日, 时辰)
        命盘 = 准确八字计算器.排八字(出生时间, 性别)

print(f"年柱: {命盘['年柱']['天干']}{命盘['年柱']['地支']}")
print(f"月柱: {命盘['月柱']['天干']}{命盘['月柱']['地支']}")
print(f"日柱: {命盘['日柱']['天干']}{命盘['日柱']['地支']}")
print(f"时柱: {命盘['时柱']['天干']}{命盘['时柱']['地支']}")
print(f"日主: {命盘['日主']}")


# ==================== 十神分析 ====================
class 十神分析器:
"""十神分析系统"""

    十神关系表 = {
'甲': {'甲''比肩''乙''劫财''丙''食神''丁''伤官''戊''偏财',
'己''正财''庚''七杀''辛''正官''壬''偏印''癸''正印'},
'乙': {'甲''劫财''乙''比肩''丙''伤官''丁''食神''戊''正财',
'己''偏财''庚''正官''辛''七杀''壬''正印''癸''偏印'},
'丙': {'甲''偏印''乙''正印''丙''比肩''丁''劫财''戊''食神',
'己''伤官''庚''偏财''辛''正财''壬''七杀''癸''正官'},
'丁': {'甲''正印''乙''偏印''丙''劫财''丁''比肩''戊''伤官',
'己''食神''庚''正财''辛''偏财''壬''正官''癸''七杀'},
'戊': {'甲''七杀''乙''正官''丙''偏印''丁''正印''戊''比肩',
'己''劫财''庚''食神''辛''伤官''壬''偏财''癸''正财'},
'己': {'甲''正官''乙''七杀''丙''正印''丁''偏印''戊''劫财',
'己''比肩''庚''伤官''辛''食神''壬''正财''癸''偏财'},
'庚': {'甲''偏财''乙''正财''丙''七杀''丁''正官''戊''偏印',
'己''正印''庚''比肩''辛''劫财''壬''食神''癸''伤官'},
'辛': {'甲''正财''乙''偏财''丙''正官''丁''七杀''戊''正印',
'己''偏印''庚''劫财''辛''比肩''壬''伤官''癸''食神'},
'壬': {'甲''食神''乙''伤官''丙''偏财''丁''正财''戊''七杀',
'己''正官''庚''偏印''辛''正印''壬''比肩''癸''劫财'},
'癸': {'甲''伤官''乙''食神''丙''正财''丁''偏财''戊''正官',
'己''七杀''庚''正印''辛''偏印''壬''劫财''癸''比肩'}
    }

    @staticmethod
    def 计算十神(命盘: Dict) -> Dict:
"""为八字命盘计算十神"""
        日主 = 命盘['日主']

for 柱名 in ['年柱''月柱''日柱''时柱']:
            天干 = 命盘[柱名]['天干']
            命盘[柱名]['十神'] = 十神分析器.十神关系表[日主][天干]

return 命盘

    @staticmethod
    def 统计十神力量(命盘: Dict) -> Dict:
"""统计十神在命盘中的力量"""
        十神统计 = {}

for 柱名 in ['年柱''月柱''日柱''时柱']:
            十神名 = 命盘[柱名]['十神']
            十神统计[十神名] = 十神统计.get(十神名, 0) + 1

return 十神统计


# ==================== 五行分析 ====================
class 五行分析器:
"""五行分析系统"""

    天干五行表 = {
'甲''木''乙''木',
'丙''火''丁''火',
'戊''土''己''土',
'庚''金''辛''金',
'壬''水''癸''水'
    }

    地支五行表 = {
'子''水''丑''土''寅''木''卯''木',
'辰''土''巳''火''午''火''未''土',
'申''金''酉''金''戌''土''亥''水'
    }

    @staticmethod
    def 获取天干五行(天干: str) -> str:
"""获取天干对应的五行"""
return 五行分析器.天干五行表.get(天干, '土')

    @staticmethod
    def 获取地支五行(地支: str) -> str:
"""获取地支对应的五行"""
return 五行分析器.地支五行表.get(地支, '土')

    @staticmethod
    def 统计五行力量(命盘: Dict) -> Dict:
"""统计五行在命盘中的力量"""
        五行统计 = {'木': 0, '火': 0, '土': 0, '金': 0, '水': 0}

for 柱名 in ['年柱''月柱''日柱''时柱']:
            天干 = 命盘[柱名]['天干']
            地支 = 命盘[柱名]['地支']

            五行统计[五行分析器.获取天干五行(天干)] += 1
            五行统计[五行分析器.获取地支五行(地支)] += 1

return 五行统计

    @staticmethod
    def 获取日主五行(命盘: Dict) -> str:
"""获取日主的五行属性"""
return 五行分析器.获取天干五行(命盘['日主'])


# ==================== 格局判断 ====================
class 格局判断器:
"""格局判断系统"""

    @staticmethod
    def 判断格局(命盘: Dict, 五行统计: Dict) -> Dict:
"""判断八字格局"""
        日主五行 = 五行分析器.获取日主五行(命盘)
        日主力量 = 五行统计.get(日主五行, 0)

        总力量 = sum(五行统计.values())

if 总力量 > 0:
            日主比例 = 日主力量 / 总力量
else:
            日主比例 = 0

if 日主比例 >= 0.6:
            格局类型 = "专旺格"
            格局描述 = f"日主{日主五行}极旺,形成{日主五行}专旺格局"
elif 日主比例 <= 0.2:
            格局类型 = "从格"
            格局描述 = "日主极弱,不得不从强势五行"
else:
            格局类型 = "普通格局"
            格局描述 = "五行相对平衡,为普通格局"

return {
'类型': 格局类型,
'描述': 格局描述,
'日主五行': 日主五行,
'日主力量': 日主力量,
'日主比例': f"{日主比例:.1%}"
        }


# ==================== 神煞系统 ====================
class 神煞计算器:
"""神煞计算系统"""

    @staticmethod
    def 计算神煞(命盘: Dict) -> Dict:
"""计算命盘中的神煞"""
        神煞结果 = {}

# 天乙贵人
        天乙贵人表 = {
'甲': ['丑''未'], '乙': ['子''申'],
'丙': ['亥''酉'], '丁': ['亥''酉'],
'戊': ['丑''未'], '己': ['子''申'],
'庚': ['丑''未'], '辛': ['寅''午'],
'壬': ['卯''巳'], '癸': ['卯''巳']
        }

        日干 = 命盘['日主']
if 日干 in 天乙贵人表:
            神煞结果['天乙贵人'] = 天乙贵人表[日干]

# 太极贵人
        太极贵人表 = {
'甲': ['子''午'], '乙': ['子''午'],
'丙': ['卯''酉'], '丁': ['卯''酉'],
'戊': ['辰''戌''丑''未'],
'己': ['辰''戌''丑''未'],
'庚': ['寅''亥'], '辛': ['寅''亥'],
'壬': ['申''巳'], '癸': ['申''巳']
        }

if 日干 in 太极贵人表:
            神煞结果['太极贵人'] = 太极贵人表[日干]

# 文昌贵人
        文昌贵人表 = {
'甲': ['巳'], '乙': ['午'],
'丙': ['申'], '丁': ['酉'],
'戊': ['申'], '己': ['酉'],
'庚': ['亥'], '辛': ['子'],
'壬': ['寅'], '癸': ['卯']
        }

if 日干 in 文昌贵人表:
            神煞结果['文昌贵人'] = 文昌贵人表[日干]

# 驿马
        驿马表 = {
'子': ['寅'], '丑': ['亥'],
'寅': ['申'], '卯': ['巳'],
'辰': ['寅'], '巳': ['亥'],
'午': ['申'], '未': ['巳'],
'申': ['寅'], '酉': ['亥'],
'戌': ['申'], '亥': ['巳']
        }

        年支 = 命盘['年柱']['地支']
if 年支 in 驿马表:
            神煞结果['驿马'] = 驿马表[年支]

# 桃花
        桃花表 = {
'子': ['酉'], '丑': ['午'],
'寅': ['卯'], '卯': ['子'],
'辰': ['酉'], '巳': ['午'],
'午': ['卯'], '未': ['子'],
'申': ['酉'], '酉': ['午'],
'戌': ['卯'], '亥': ['子']
        }

if 年支 in 桃花表:
            神煞结果['桃花'] = 桃花表[年支]

# 华盖
        华盖表 = {
'子': ['辰'], '丑': ['丑'],
'寅': ['戌'], '卯': ['未'],
'辰': ['辰'], '巳': ['丑'],
'午': ['戌'], '未': ['未'],
'申': ['辰'], '酉': ['丑'],
'戌': ['戌'], '亥': ['未']
        }

if 年支 in 华盖表:
            神煞结果['华盖'] = 华盖表[年支]

return 神煞结果


# ==================== 大运计算 ====================
class 大运计算器:
"""大运计算系统"""

    @staticmethod
    def 计算起运岁数(出生时间: datetime.datetime, 性别: str, 阳年: bool) -> float:
"""计算起运岁数(修正版)"""
# 正确的算法:阳年男、阴年女顺行;阴年男、阳年女逆行

if (阳年 and 性别 == '男') or (not 阳年 and 性别 == '女'):
# 顺行:从出生日到下一个节气
            顺行 = True
else:
# 逆行:从出生日到上一个节气
            顺行 = False

# 简化计算:每3天为1岁,1天为4个月,1个时辰为10天
# 使用出生日的日数作为简化计算
if 顺行:
            天数 = 出生时间.day
else:
            天数 = 30 - 出生时间.day

        岁数 = 天数 / 3  # 3天为1岁
return 岁数

    @staticmethod
    def 计算大运(命盘: Dict, 步数: int = 8) -> List[Dict]:
"""计算大运(修正版)"""
        大运列表 = []

# 判断阴阳年:甲丙戊庚壬为阳,乙丁己辛癸为阴
        年干 = 命盘['年柱']['天干']
        阳年 = 年干 in ['甲''丙''戊''庚''壬']
        性别 = 命盘['性别']

# 计算起运岁数
        起运岁数 = 大运计算器.计算起运岁数(命盘['出生时间'], 性别, 阳年)

# 判断顺行还是逆行(修正逻辑)
        顺行 = (阳年 and 性别 == '男') or (not 阳年 and 性别 == '女')

# 起始干支(月柱)
        月干 = 命盘['月柱']['天干']
        月支 = 命盘['月柱']['地支']

for i in range(步数):
if 顺行:
# 顺排
                天干序号 = (准确八字计算器.天干表.index(月干) + i) % 10
                地支序号 = (准确八字计算器.地支表.index(月支) + i) % 12
else:
# 逆排
                天干序号 = (准确八字计算器.天干表.index(月干) - i) % 10
                地支序号 = (准确八字计算器.地支表.index(月支) - i) % 12

            大运天干 = 准确八字计算器.天干表[天干序号]
            大运地支 = 准确八字计算器.地支表[地支序号]

            起始年龄 = 起运岁数 + i * 10
            结束年龄 = 起始年龄 + 10

            大运列表.append({
'序号': i + 1,
'干支': f"{大运天干}{大运地支}",
'起始年龄': round(起始年龄, 1),
'结束年龄': round(结束年龄, 1)
            })

return 大运列表


# ==================== 专业可视化引擎 ====================
class 专业可视化引擎:
"""专业可视化引擎"""

# 颜色配置
    五行颜色 = {
'木''
#4CAF50',  # 绿色
'火''#F44336',  # 红色
'土''#FF9800',  # 橙色
'金''#FFC107',  # 黄色
'水''#2196F3',  # 蓝色
    }

    十神颜色 = {
'比肩''#795548''劫财''#9E9E9E',
'食神''#4CAF50''伤官''#8BC34A',
'偏财''#FF9800''正财''#FFC107',
'七杀''#F44336''正官''#E91E63',
'偏印''#9C27B0''正印''#3F51B5'
    }

    主题颜色 = {
'主色''#2C3E50',
'强调色''#E74C3C',
'成功色''#27AE60',
'信息色''#3498DB',
'背景色''#F8F9FA'
    }

    @staticmethod
    def 创建八字四柱图(命盘: Dict, 保存路径: str) -> bool:
"""创建八字四柱图"""
        try:
            fig = plt.figure(figsize=(12, 8), facecolor=专业可视化引擎.主题颜色['背景色'])

# 创建网格
            gs = fig.add_gridspec(2, 2, hspace=0.3, wspace=0.3)

            柱名 = ['年柱''月柱''日柱''时柱']

for idx, 名称 in enumerate(柱名):
if idx == 0:
                    ax = fig.add_subplot(gs[0, 0])
elif idx == 1:
                    ax = fig.add_subplot(gs[0, 1])
elif idx == 2:
                    ax = fig.add_subplot(gs[1, 0])
else:
                    ax = fig.add_subplot(gs[1, 1])

                ax.set_facecolor('#FFFFFF')
                柱 = 命盘[名称]

# 绘制八字柱
                专业可视化引擎.绘制八字柱(ax, 柱, 名称)

# 边框美化
for spine in ax.spines.values():
                    spine.set_color('#BDC3C7')
                    spine.set_linewidth(1.5)

            plt.suptitle('八字四柱命盘图', fontsize=20, fontweight='bold',
                         color=专业可视化引擎.主题颜色['主色'], y=0.98)
            plt.tight_layout()
            plt.savefig(保存路径, dpi=150, bbox_inches='tight',
                        facecolor=专业可视化引擎.主题颜色['背景色'])
            plt.close()
return True

        except Exception as e:
print(f"创建八字四柱图错误: {e}")
return False

    @staticmethod
    def 绘制八字柱(ax, 柱, 柱名: str):
"""绘制单个八字柱"""
# 天干地支颜色
        天干颜色 = 专业可视化引擎.获取天干颜色(柱['天干'])
        地支颜色 = 专业可视化引擎.获取地支颜色(柱['地支'])

# 绘制天干部分
        ax.add_patch(Rectangle((0.2, 0.6), 0.6, 0.3, facecolor=天干颜色, alpha=0.9,
                               edgecolor='white', linewidth=3))
        ax.text(0.5, 0.75, 柱['天干'], ha='center', va='center',
                fontsize=28, fontweight='bold', color='white')
        ax.text(0.5, 0.65, '天干', ha='center', va='center',
                fontsize=12, color='white', fontweight='bold')

# 绘制地支部分
        ax.add_patch(Rectangle((0.2, 0.2), 0.6, 0.3, facecolor=地支颜色, alpha=0.9,
                               edgecolor='white', linewidth=3))
        ax.text(0.5, 0.35, 柱['地支'], ha='center', va='center',
                fontsize=28, fontweight='bold', color='white')
        ax.text(0.5, 0.25, '地支', ha='center', va='center',
                fontsize=12, color='white', fontweight='bold')

# 柱名称
        ax.text(0.5, 1.08, 柱名, transform=ax.transAxes, ha='center',
                fontsize=16, fontweight='bold', color=专业可视化引擎.主题颜色['主色'])

# 十神信息
if'十神'in 柱:
            color = 专业可视化引擎.十神颜色.get(柱['十神'], '#7F8C8D')
            ax.text(0.5, -0.15, 柱['十神'], transform=ax.transAxes, ha='center',
                    fontsize=13, fontweight='bold', color=color)

        ax.set_xlim(0, 1)
        ax.set_ylim(0, 1)
        ax.axis('off')

    @staticmethod
    def 获取天干颜色(天干: str) -> str:
"""获取天干对应的颜色"""
        五行 = 五行分析器.获取天干五行(天干)
return 专业可视化引擎.五行颜色.get(五行, '#95A5A6')

    @staticmethod
    def 获取地支颜色(地支: str) -> str:
"""获取地支对应的颜色"""
        五行 = 五行分析器.获取地支五行(地支)
return 专业可视化引擎.五行颜色.get(五行, '#95A5A6')

    @staticmethod
    def 创建十神分布图(十神统计: Dict, 保存路径: str) -> bool:
"""创建十神分布图"""
        try:
# 准备数据
            十神列表 = list(十神统计.keys())
            数量列表 = list(十神统计.values())

if not 十神列表:
return False

            颜色列表 = [专业可视化引擎.十神颜色.get(神, '#95A5A6'for 神 in 十神列表]

            fig, ax = plt.subplots(figsize=(14, 7), facecolor=专业可视化引擎.主题颜色['背景色'])
            ax.set_facecolor('#FFFFFF')

# 创建水平条形图
            y_pos = np.arange(len(十神列表))
            bars = ax.barh(y_pos, 数量列表, color=颜色列表, alpha=0.85, height=0.7)

# 添加数值标签
for bar, count in zip(bars, 数量列表):
                width = bar.get_width()
                ax.text(width + 0.1, bar.get_y() + bar.get_height() / 2,
                        f'{count} 次', ha='left', va='center',
                        fontsize=12, fontweight='bold', color=专业可视化引擎.主题颜色['主色'])

# 设置样式
            ax.set_yticks(y_pos)
            ax.set_yticklabels(十神列表, fontsize=13, fontweight='bold')
            ax.set_xlabel('出现次数', fontsize=13, fontweight='bold')
            ax.set_title('十神力量分布图', fontsize=18, fontweight='bold',
                         color=专业可视化引擎.主题颜色['主色'], pad=25)

# 网格和边框
            ax.grid(True, axis='x', alpha=0.2, linestyle='--')
            ax.spines['top'].set_visible(False)
            ax.spines['right'].set_visible(False)
            ax.spines['left'].set_linewidth(1.5)
            ax.spines['bottom'].set_linewidth(1.5)

# 添加图例说明
            ax.text(0.02, 0.98, '十神代表不同的人际关系和特质',
                    transform=ax.transAxes, fontsize=11, color='#7F8C8D',
                    verticalalignment='top', fontweight='bold')

            plt.tight_layout()
            plt.savefig(保存路径, dpi=150, bbox_inches='tight',
                        facecolor=专业可视化引擎.主题颜色['背景色'])
            plt.close()
return True

        except Exception as e:
print(f"创建十神分布图错误: {e}")
return False

    @staticmethod
    def 创建五行能量图(五行统计: Dict, 保存路径: str) -> bool:
"""创建五行能量雷达图"""
        try:
# 准备数据
            五行列表 = ['木''火''土''金''水']
            能量列表 = [五行统计.get(五行, 0) for 五行 in 五行列表]
            颜色列表 = [专业可视化引擎.五行颜色[五行] for 五行 in 五行列表]

# 角度计算
            angles = np.linspace(0, 2 * np.pi, len(五行列表), endpoint=False).tolist()
            angles += angles[:1]
            能量列表 += 能量列表[:1]

            fig = plt.figure(figsize=(10, 9), facecolor=专业可视化引擎.主题颜色['背景色'])
            ax = fig.add_subplot(111, polar=True)

# 绘制雷达图
            ax.plot(angles, 能量列表, 'o-', linewidth=3, color=专业可视化引擎.主题颜色['信息色'])
            ax.fill(angles, 能量列表, alpha=0.25, color=专业可视化引擎.主题颜色['信息色'])

# 设置刻度
            ax.set_xticks(angles[:-1])
            ax.set_xticklabels(五行列表, fontsize=15, fontweight='bold')

# 设置网格
            ax.grid(True)
            ax.set_rlabel_position(30)
            plt.yticks([1, 2, 3, 4, 5], ["1""2""3""4""5"],
                       color="grey", size=11, fontweight='bold')
            plt.ylim(0, max(能量列表) + 1)

# 添加数值标签
for i, (角度, 能量) in enumerate(zip(angles[:-1], 能量列表[:-1])):
                color = 专业可视化引擎.五行颜色[五行列表[i]]
                ax.text(角度, 能量 + 0.3, f'{能量}', ha='center', va='center',
                        fontsize=13, fontweight='bold', color=color)

            ax.set_title('五行能量分布雷达图', fontsize=18, fontweight='bold',
                         color=专业可视化引擎.主题颜色['主色'], pad=30)

            plt.tight_layout()
            plt.savefig(保存路径, dpi=150, bbox_inches='tight',
                        facecolor=专业可视化引擎.主题颜色['背景色'])
            plt.close()
return True

        except Exception as e:
print(f"创建五行能量图错误: {e}")
return False

    @staticmethod
    def 创建大运走势图(大运列表: List[Dict], 保存路径: str) -> bool:
"""创建大运走势图"""
        try:
            fig, ax = plt.subplots(figsize=(14, 7), facecolor=专业可视化引擎.主题颜色['背景色'])
            ax.set_facecolor('#FFFFFF')

# 准备数据
            年龄段 = [f"{运['起始年龄']:.0f}-{运['结束年龄']:.0f}"for 运 in 大运列表]
# 根据大运干支生成运势得分(简化版)
            运势得分 = []
for 运 in 大运列表:
                干支 = 运['干支']
# 简单算法:根据干支的五行生克关系给分
                基础分 = 70
if any(字 in 干支 for 字 in ['甲''乙''寅''卯']):  # 木
                    基础分 += 5
if any(字 in 干支 for 字 in ['丙''丁''巳''午']):  # 火
                    基础分 += 8
if any(字 in 干支 for 字 in ['戊''己''辰''戌''丑''未']):  # 土
                    基础分 += 3
if any(字 in 干支 for 字 in ['庚''辛''申''酉']):  # 金
                    基础分 += 6
if any(字 in 干支 for 字 in ['壬''癸''子''亥']):  # 水
                    基础分 += 4
                运势得分.append(min(基础分, 95))

            大运干支 = [运['干支'for 运 in 大运列表]

# 创建折线图
            ax.plot(年龄段, 运势得分, marker='o', linewidth=3.5,
                    color=专业可视化引擎.主题颜色['强调色'],
                    markersize=12, markerfacecolor='white',
                    markeredgewidth=3, markeredgecolor=专业可视化引擎.主题颜色['强调色'])

# 填充区域
            ax.fill_between(range(len(年龄段)), 运势得分, alpha=0.15,
                            color=专业可视化引擎.主题颜色['强调色'])

# 添加数据标签
for i, (干支, 得分) in enumerate(zip(大运干支, 运势得分)):
                ax.text(i, 得分 + 2.5, f'{得分}分', ha='center', va='bottom',
                        fontsize=11, fontweight='bold',
                        color=专业可视化引擎.主题颜色['强调色'])
                ax.text(i, 得分 - 8, 干支, ha='center', va='top',
                        fontsize=10, fontweight='bold',
                        color=专业可视化引擎.主题颜色['主色'])

# 设置样式
            ax.set_xlabel('年龄段 (岁)', fontsize=13, fontweight='bold')
            ax.set_ylabel('运势指数', fontsize=13, fontweight='bold')
            ax.set_title('大运走势图', fontsize=18, fontweight='bold',
                         color=专业可视化引擎.主题颜色['主色'], pad=25)

# 网格和边框
            ax.grid(True, alpha=0.2, linestyle='--')
            ax.set_ylim(50, 100)
            ax.spines['top'].set_visible(False)
            ax.spines['right'].set_visible(False)
            ax.spines['left'].set_linewidth(1.5)
            ax.spines['bottom'].set_linewidth(1.5)

            plt.tight_layout()
            plt.savefig(保存路径, dpi=150, bbox_inches='tight',
                        facecolor=专业可视化引擎.主题颜色['背景色'])
            plt.close()
return True

        except Exception as e:
print(f"创建大运走势图错误: {e}")
return False

    @staticmethod
    def 创建格局分析图(格局数据: Dict, 保存路径: str) -> bool:
"""创建格局分析环形图"""
        try:
            fig, ax = plt.subplots(figsize=(10, 8), facecolor=专业可视化引擎.主题颜色['背景色'])
            ax.set_facecolor('#FFFFFF')

# 准备数据
            格局类型 = 格局数据['类型']
            其他比例 = 100 - 40  # 假设主要格局占40%

            格局分布 = {
                格局类型: 40,
'其他格局': 其他比例
            }

            colors = [专业可视化引擎.主题颜色['强调色'], '#ECF0F1']

# 创建环形饼图
            wedges, texts, autotexts = ax.pie(
                格局分布.values(),
                labels=格局分布.keys(),
                colors=colors,
                autopct='%1.1f%%',
                startangle=90,
                pctdistance=0.85,
                textprops={'fontsize': 12, 'fontweight''bold'},
                wedgeprops={'edgecolor''white''linewidth': 2}
            )

# 美化文字
for autotext in autotexts:
                autotext.set_color('white')
                autotext.set_fontweight('bold')
                autotext.set_fontsize(13)

# 添加中心圆
            centre_circle = Circle((0, 0), 0.70, fc='white', edgecolor='#BDC3C7', linewidth=2)
            ax.add_artist(centre_circle)

# 中心文字
            ax.text(0, 0.15, '格局分析', ha='center', va='center',
                    fontsize=16, fontweight='bold', color=专业可视化引擎.主题颜色['主色'])
            ax.text(0, -0.15, 格局类型, ha='center', va='center',
                    fontsize=14, fontweight='bold', color=专业可视化引擎.主题颜色['强调色'])

            ax.set_title('八字格局分析图', fontsize=18, fontweight='bold',
                         color=专业可视化引擎.主题颜色['主色'], pad=30)

# 添加图例
            ax.legend(wedges, 格局分布.keys(),
                      title="格局类型",
                      loc="center left",
                      bbox_to_anchor=(1, 0, 0.5, 1),
                      fontsize=11,
                      title_fontsize=12)

            plt.tight_layout()
            plt.savefig(保存路径, dpi=150, bbox_inches='tight',
                        facecolor=专业可视化引擎.主题颜色['背景色'])
            plt.close()
return True

        except Exception as e:
print(f"创建格局分析图错误: {e}")
return False


# ==================== 专业HTML报告生成器 ====================
class 专业HTML报告生成器:
"""生成专业的HTML报告"""

    @staticmethod
    def 生成完整HTML报告(命盘: Dict, 分析数据: Dict, 输出文件夹: str) -> str:
"""生成完整的HTML报告"""

# 构建图片路径
        图片路径 = {
'八字四柱图''bazi_pillar.png',
'十神分布图''ten_gods.png',
'五行能量图''five_elements.png',
'大运走势图''luck_trend.png',
'格局分析图''pattern.png'
        }

        html_path = os.path.join(输出文件夹, "八字命理专业分析报告.html")

# 获取性别显示文本
        性别显示 = "男性"if 命盘['性别'] == "男"else"女性"

        html_content = f"""
<!DOCTYPE html>
<html lang="
zh-CN">
<head>
    <meta charset="
UTF-8">
    <meta name="
viewport" content="width=device-width, initial-scale=1.0">
    <title>八字命理专业分析报告</title>
    <style>
        :root {{
            --primary-color: #2C3E50;
            --secondary-color: #3498DB;
            --accent-color: #E74C3C;
            --success-color: #27AE60;
            --warning-color: #F39C12;
            --light-color: #F8F9FA;
            --dark-color: #343A40;
            --border-radius: 12px;
            --box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
        }}

        * {{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }}

        body {{
            font-family: 'Microsoft YaHei', 'PingFang SC', 'Segoe UI', sans-serif;
            line-height: 1.7;
            color: var(--dark-color);
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            padding: 25px;
            min-height: 100vh;
        }}

        .container {{
            max-width: 1400px;
            margin: 0 auto;
            background: white;
            border-radius: var(--border-radius);
            box-shadow: var(--box-shadow);
            overflow: hidden;
            animation: fadeIn 0.8s ease-out;
        }}

        @keyframes fadeIn {{
            from {{ opacity: 0; transform: translateY(20px); }}
            to {{ opacity: 1; transform: translateY(0); }}
        }}

        /* 头部样式 */
        .header {{
            background: linear-gradient(135deg, var(--primary-color) 0%, #4A6491 100%);
            color: white;
            padding: 50px 40px;
            text-align: center;
            position: relative;
            overflow: hidden;
        }}

        .header::before {{
            content: "
";
            position: absolute;
            top: -30px;
            right: -30px;
            font-size: 200px;
            opacity: 0.1;
            transform: rotate(15deg);
        }}

        .header h1 {{
            font-size: 38px;
            margin-bottom: 15px;
            text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
            position: relative;
            z-index: 1;
        }}

        .header .subtitle {{
            font-size: 18px;
            opacity: 0.9;
            margin-bottom: 10px;
        }}

        /* 基本信息 */
        .basic-info {{
            padding: 35px;
            background: var(--light-color);
            margin: 25px;
            border-radius: var(--border-radius);
            border-left: 5px solid var(--secondary-color);
        }}

        .info-grid {{
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
            gap: 25px;
            margin-top: 25px;
        }}

        .info-card {{
            background: white;
            padding: 25px;
            border-radius: var(--border-radius);
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }}

        .info-card:hover {{
            transform: translateY(-5px);
            box-shadow: 0 12px 25px rgba(0, 0, 0, 0.15);
        }}

        .info-card h3 {{
            color: var(--primary-color);
            margin-bottom: 20px;
            padding-bottom: 12px;
            border-bottom: 3px solid var(--secondary-color);
            display: flex;
            align-items: center;
            gap: 12px;
            font-size: 20px;
        }}

        .info-card h3 i {{
            color: var(--accent-color);
            font-size: 22px;
        }}

        /* 八字展示 */
        .bazi-section {{
            padding: 35px;
            margin: 25px;
            background: white;
            border-radius: var(--border-radius);
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
        }}

        .bazi-grid {{
            display: grid;
            grid-template-columns: repeat(4, 1fr);
            gap: 20px;
            margin: 30px 0;
        }}

        @media (max-width: 768px) {{
            .bazi-grid {{
                grid-template-columns: repeat(2, 1fr);
            }}
        }}

        @media (max-width: 480px) {{
            .bazi-grid {{
                grid-template-columns: 1fr;
            }}
        }}

        .bazi-item {{
            padding: 25px;
            border-radius: var(--border-radius);
            color: white;
            font-weight: bold;
            font-size: 28px;
            text-align: center;
            position: relative;
            overflow: hidden;
            transition: transform 0.3s ease;
        }}

        .bazi-item:hover {{
            transform: scale(1.05);
        }}

        .bazi-item::after {{
            content: "
";
            position: absolute;
            top: 0;
            left: -100%;
            width: 100%;
            height: 100%;
            background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
            transition: left 0.6s;
        }}

        .bazi-item:hover::after {{
            left: 100%;
        }}

        .year-pillar {{ background: linear-gradient(135deg, #27AE60#2ECC71); }}
        .month-pillar {{ background: linear-gradient(135deg, #3498DB#2980B9); }}
        .day-pillar {{ background: linear-gradient(135deg, #E74C3C#C0392B); }}
        .hour-pillar {{ background: linear-gradient(135deg, #9B59B6#8E44AD); }}

        .bazi-label {{
            font-size: 16px;
            opacity: 0.9;
            margin-bottom: 10px;
            display: block;
        }}

        .bazi-ten-god {{
            font-size: 15px;
            margin-top: 10px;
            opacity: 0.9;
        }}

        /* 图表展示 */
        .charts-section {{
            padding: 35px;
            margin: 25px;
            background: white;
            border-radius: var(--border-radius);
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
        }}

        .charts-grid {{
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
            gap: 30px;
            margin-top: 30px;
        }}

        .chart-item {{
            background: var(--light-color);
            padding: 20px;
            border-radius: var(--border-radius);
            text-align: center;
            transition: all 0.3s ease;
        }}

        .chart-item:hover {{
            transform: translateY(-5px);
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
        }}

        .chart-item img {{
            max-width: 100%;
            height: auto;
            border-radius: 10px;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
            transition: transform 0.3s ease;
            cursor: pointer;
        }}

        .chart-item img:hover {{
            transform: scale(1.02);
        }}

        .chart-title {{
            color: var(--primary-color);
            margin: 20px 0 15px;
            font-size: 18px;
            font-weight: bold;
        }}

        .chart-desc {{
            color: #6C757D;
            font-size: 14px;
            line-height: 1.5;
        }}

        /* 运势展望 */
        .luck-section {{
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 35px;
            margin: 25px;
            border-radius: var(--border-radius);
        }}

        .luck-years {{
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
            gap: 20px;
            margin-top: 25px;
        }}

        .luck-year {{
            background: rgba(255, 255, 255, 0.15);
            padding: 20px;
            border-radius: var(--border-radius);
            text-align: center;
            backdrop-filter: blur(10px);
            transition: all 0.3s ease;
        }}

        .luck-year:hover {{
            background: rgba(255, 255, 255, 0.25);
            transform: translateY(-5px);
        }}

        .luck-year-number {{
            font-size: 22px;
            font-weight: bold;
            margin-bottom: 8px;
        }}

        .luck-year-level {{
            font-size: 16px;
            opacity: 0.9;
            margin-bottom: 10px;
            padding: 4px 12px;
            background: rgba(255, 255, 255, 0.2);
            border-radius: 20px;
            display: inline-block;
        }}

        /* 页脚 */
        .footer {{
            text-align: center;
            padding: 40px;
            background: var(--primary-color);
            color: white;
            border-radius: var(--border-radius);
            margin: 25px;
        }}

        .disclaimer {{
            background: #FFF3CD;
            border-left: 6px solid var(--warning-color);
            padding: 25px;
            margin: 25px;
            border-radius: var(--border-radius);
            color: var(--dark-color);
        }}

        /* 打印按钮 */
        .print-btn {{
            position: fixed;
            bottom: 30px;
            right: 30px;
            background: var(--primary-color);
            color: white;
            border: none;
            padding: 15px 25px;
            border-radius: 30px;
            cursor: pointer;
            box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
            z-index: 1000;
            font-family: inherit;
            font-size: 15px;
            font-weight: bold;
            transition: all 0.3s ease;
            display: flex;
            align-items: center;
            gap: 10px;
        }}

        .print-btn:hover {{
            background: var(--secondary-color);
            transform: translateY(-3px);
            box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
        }}
    </style>
    <link rel="
stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
</head>
<body>
    <div class="
container">
        <!-- 报告头部 -->
        <div class="
header">
            <h1><i class="
fas fa-yin-yang"></i> 八字命理专业分析报告</h1>
            <div class="
subtitle">基于传统命理学与现代可视化技术的深度分析</div>
            <div style="
margin-top: 20px; font-size: 15px; opacity: 0.8;">
                生成时间:{datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')}
            </div>
        </div>

        <!-- 基本信息 -->
        <div class="
basic-info">
            <h2 style="
color: var(--primary-color); margin-bottom: 25px;">
                <i class="
fas fa-user-circle"></i> 基本信息
            </h2>

            <div class="
info-grid">
                <div class="
info-card">
                    <h3><i class="
fas fa-calendar-alt"></i> 出生信息</h3>
                    <p><strong>出生时间:</strong>{命盘['出生时间'].strftime('%Y年%m月%d日 %H时')}</p>
                    <p><strong>性别:</strong>{性别显示}</p>
                    <p><strong>八字排盘:</strong></p>
                    <div style="
font-size: 22px; font-weight: bold; color: var(--primary-color); margin-top: 10px;">
                        {命盘['年柱']['天干']}{命盘['年柱']['地支']} 
                        {命盘['月柱']['天干']}{命盘['月柱']['地支']} 
                        {命盘['日柱']['天干']}{命盘['日柱']['地支']} 
                        {命盘['时柱']['天干']}{命盘['时柱']['地支']}
                    </div>
                </div>

                <div class="
info-card">
                    <h3><i class="
fas fa-sun"></i> 日主分析</h3>
                    <p><strong>日主天干:</strong>{命盘['日主']}</p>
                    <p><strong>五行属性:</strong>{专业HTML报告生成器.获取五行属性(命盘['日主'])}</p>
                    <p><strong>性格特征:</strong>{专业HTML报告生成器.获取日主性格(命盘['日主'])}</p>
                </div>

                <div class="
info-card">
                    <h3><i class="
fas fa-chart-bar"></i> 格局分析</h3>
                    <p><strong>主要格局:</strong><span style="
color: var(--accent-color); font-weight: bold;">{分析数据['格局']['类型']}</span></p>
                    <p><strong>格局描述:</strong>{分析数据['格局']['描述']}</p>
                    <p><strong>日主力量:</strong>{分析数据['格局']['日主力量']} 处</p>
                </div>
            </div>
        </div>

        <!-- 八字四柱展示 -->
        <div class="
bazi-section">
            <h2 style="
color: var(--primary-color); margin-bottom: 25px;">
                <i class="
fas fa-sitemap"></i> 八字四柱详细分析
            </h2>

            <div class="
bazi-grid">
                <div class="
bazi-item year-pillar">
                    <span class="
bazi-label">年柱</span>
                    {命盘['年柱']['天干']}{命盘['年柱']['地支']}
                    <div class="
bazi-ten-god">{命盘['年柱']['十神']}</div>
                </div>
                <div class="
bazi-item month-pillar">
                    <span class="
bazi-label">月柱</span>
                    {命盘['月柱']['天干']}{命盘['月柱']['地支']}
                    <div class="
bazi-ten-god">{命盘['月柱']['十神']}</div>
                </div>
                <div class="
bazi-item day-pillar">
                    <span class="
bazi-label">日柱</span>
                    {命盘['日柱']['天干']}{命盘['日柱']['地支']}
                    <div class="
bazi-ten-god">{命盘['日柱']['十神']}</div>
                </div>
                <div class="
bazi-item hour-pillar">
                    <span class="
bazi-label">时柱</span>
                    {命盘['时柱']['天干']}{命盘['时柱']['地支']}
                    <div class="
bazi-ten-god">{命盘['时柱']['十神']}</div>
                </div>
            </div>
        </div>

        <!-- 图表展示 -->
        <div class="
charts-section">
            <h2 style="
color: var(--primary-color); margin-bottom: 25px;">
                <i class="
fas fa-chart-line"></i> 专业可视化分析
            </h2>

            <div class="
charts-grid">
                <div class="
chart-item">
                    <div class="
chart-title">八字四柱结构图</div>
                    <img src="
{图片路径['八字四柱图']}" alt="八字四柱图">
                    <p class="
chart-desc">展示年、月、日、时四柱的五行属性和关系</p>
                </div>

                <div class="
chart-item">
                    <div class="
chart-title">十神力量分布图</div>
                    <img src="
{图片路径['十神分布图']}" alt="十神分析图">
                    <p class="
chart-desc">显示十神在命盘中的出现次数和力量对比</p>
                </div>

                <div class="
chart-item">
                    <div class="
chart-title">五行能量分布图</div>
                    <img src="
{图片路径['五行能量图']}" alt="五行能量图">
                    <p class="
chart-desc">以雷达图形式展示五行能量的平衡状态</p>
                </div>

                <div class="
chart-item">
                    <div class="
chart-title">大运走势分析图</div>
                    <img src="
{图片路径['大运走势图']}" alt="大运走势图">
                    <p class="
chart-desc">展示0-80岁的大运走势和关键年龄段</p>
                </div>

                <div class="
chart-item">
                    <div class="
chart-title">八字格局分析图</div>
                    <img src="
{图片路径['格局分析图']}" alt="格局分析图">
                    <p class="
chart-desc">环形图展示格局类型的分布概率</p>
                </div>
            </div>
        </div>

        <!-- 运势展望 -->
        <div class="
luck-section">
            <h2 style="
margin-bottom: 25px; display: flex; align-items: center; gap: 12px;">
                <i class="
fas fa-crystal-ball"></i> 未来五年运势展望
            </h2>

            <div class="
luck-years">
                {专业HTML报告生成器.生成运势HTML()}
            </div>
        </div>

        <!-- 注意事项 -->
        <div class="
disclaimer">
            <h3 style="
color: var(--warning-color); margin-bottom: 15px;">
                <i class="
fas fa-exclamation-triangle"></i> 重要声明
            </h3>
            <p style="
margin-bottom: 10px;">1. 本报告基于传统八字命理理论生成,结合现代数据可视化技术,仅供娱乐参考。</p>
            <p style="
margin-bottom: 10px;">2. 命运掌握在自己手中,八字分析仅为可能性参考,不应作为人生决策的唯一依据。</p>
            <p style="
margin-bottom: 10px;">3. 命理分析应结合现实情况,理性看待分析结果。</p>
            <p>4. 积极面对人生,努力创造美好未来才是最重要的。</p>
        </div>

        <!-- 页脚 -->
        <div class="
footer">
            <h3 style="
margin-bottom: 15px;">八字命理专业分析系统 v3.0</h3>
            <p>© 2024 专业八字命理分析系统 - 仅供学习研究使用</p>
            <p style="
margin-top: 15px; opacity: 0.8; font-size: 14px;">
                <i class="
fas fa-code"></i> 技术支持:Python 3.12 + Matplotlib + 传统命理算法
            </p>
        </div>
    </div>

    <!-- 打印按钮 -->
    <button class="
print-btn" onclick="window.print()">
        <i class="
fas fa-print"></i> 打印报告
    </button>

    <script>
        // 图片点击放大功能
        document.querySelectorAll('.chart-item img').forEach(img => {{
            img.addEventListener('click', function() {{
                const modal = document.createElement('div');
                modal.style.cssText = `
                    position: fixed;
                    top: 0;
                    left: 0;
                    width: 100%;
                    height: 100%;
                    background: rgba(0,0,0,0.95);
                    display: flex;
                    justify-content: center;
                    align-items: center;
                    z-index: 2000;
                    cursor: zoom-out;
                `;

                const modalImg = document.createElement('img');
                modalImg.src = this.src;
                modalImg.style.cssText = `
                    max-width: 90%;
                    max-height: 90%;
                    border-radius: 15px;
                    box-shadow: 0 15px 40px rgba(0,0,0,0.4);
                `;

                modal.appendChild(modalImg);
                document.body.appendChild(modal);

                modal.addEventListener('click', () => {{
                    document.body.removeChild(modal);
                }});
            }});
        }});

        // 八字柱悬停效果
        document.querySelectorAll('.bazi-item').forEach(item => {{
            item.addEventListener('mouseenter', function() {{
                const pillar = this.querySelector('span').textContent + ' ' + this.childNodes[2].textContent.trim();
                const tenGod = this.querySelector('.bazi-ten-god').textContent;
                this.title = `八字柱: ${{pillar}} | 十神: ${{tenGod}}`;
            }});
        }});

        // 打印样式优化
        window.addEventListener('beforeprint', () => {{
            document.querySelector('.print-btn').style.display = 'none';
        }});

        window.addEventListener('afterprint', () => {{
            document.querySelector('.print-btn').style.display = 'flex';
        }});
    </script>
</body>
</html>
"
""

# 保存HTML文件
        with open(html_path, 'w', encoding='utf-8') as f:
            f.write(html_content)

return html_path

    @staticmethod
    def 生成运势HTML() -> str:
"""生成运势HTML内容"""
        html = ''
        当前年份 = datetime.datetime.now().year

for i in range(5):
            年份 = 当前年份 + i
            运势等级 = ['大吉''中吉''平运''小吉''中平'][i % 5]
            运势颜色 = ['#27AE60''#2ECC71''#3498DB''#F39C12''#E74C3C'][i % 5]

            html += f"""
                <div class="
luck-year">
                    <div class="
luck-year-number">{年份}</div>
                    <div class="
luck-year-level" style="color: {运势颜色};">{运势等级}</div>
                    <div style="
font-size: 13px; opacity: 0.9;">
                        {专业HTML报告生成器.获取年度运势建议(年份)}
                    </div>
                </div>
            "
""

return html

    @staticmethod
    def 获取五行属性(天干: str) -> str:
"""获取五行属性"""
        五行映射 = {
'甲''阳木''乙''阴木',
'丙''阳火''丁''阴火',
'戊''阳土''己''阴土',
'庚''阳金''辛''阴金',
'壬''阳水''癸''阴水'
        }
return 五行映射.get(天干, '未知')

    @staticmethod
    def 获取日主性格(日主: str) -> str:
"""获取日主性格"""
        性格描述 = {
'甲''正直仁慈,有领导才能,积极向上',
'乙''温柔体贴,适应力强,有韧性',
'丙''热情开朗,光明磊落,有感染力',
'丁''温和细腻,注重礼仪,有洞察力',
'戊''诚实稳重,有责任感,值得信赖',
'己''温和包容,重视内涵,有耐心',
'庚''刚毅果断,讲义气,有正义感',
'辛''细腻敏锐,追求完美,有审美观',
'壬''聪明灵活,适应力强,有包容心',
'癸''温柔内向,深思熟虑,有创造力'
        }
return 性格描述.get(日主, '需综合分析')

    @staticmethod
    def 获取年度运势建议(年份: int) -> str:
"""获取年度运势建议"""
        建议列表 = [
'本年宜稳扎稳打,积累实力',
'本年有机会展现才华,把握机遇',
'本年人际关系活跃,适合合作',
'本年需谨慎决策,三思后行',
'本年财运较佳,适合投资理财',
'本年学习运强,适合进修提升',
'本年贵人运佳,易得他人帮助',
'本年宜外出发展,变动中求机遇',
'本年需注意健康,劳逸结合',
'本年家庭运佳,多与家人沟通',
'本年事业有突破,积极进取',
'本年宜保守为主,避免冒险'
        ]
return 建议列表[年份 % len(建议列表)]


# ==================== 主系统 ====================
class 八字命理分析系统:
"""八字命理分析主系统"""

    def __init__(self):
        self.命盘 = None
        self.分析数据 = {}
        self.输出文件夹 = None
        self.图片文件夹 = None
        self.初始化系统()

    def 初始化系统(self):
"""初始化系统"""
print("=" * 70)
print("八字命理分析系统 v3.0 (最终完整版)")
print("=" * 70)
print("功能特色:")
print("  1. ✅ 准确的八字排盘(已修正所有计算错误)")
print("  2. ✅ 完整的十神分析")
print("  3. ✅ 五行能量分析")
print("  4. ✅ 格局判断系统")
print("  5. ✅ 大运排盘计算")
print("  6. ✅ 神煞系统分析")
print("  7. ✅ 专业可视化图表")
print("  8. ✅ 精美HTML报告")
print("=" * 70)

if not VISUALIZATION_AVAILABLE:
print("注意: 可视化库不可用,图表功能将受限")
print("请运行: pip install matplotlib numpy seaborn")

# 创建输出文件夹
        self.输出文件夹 = self.创建输出文件夹()
        self.图片文件夹 = os.path.join(self.输出文件夹, "charts")
        os.makedirs(self.图片文件夹, exist_ok=True)

print(f"结果将保存到: {self.输出文件夹}")
print("=" * 70)

    def 创建输出文件夹(self):
"""创建输出文件夹"""
# 获取桌面路径
if os.name == 'nt':  # Windows
            import winreg
            try:
                key = winreg.OpenKey(
                    winreg.HKEY_CURRENT_USER,
                    r'Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'
                )
                桌面路径, _ = winreg.QueryValueEx(key, 'Desktop')
                winreg.CloseKey(key)
                桌面路径 = os.path.expandvars(桌面路径)
            except:
                桌面路径 = os.path.join(os.path.expanduser('~'), 'Desktop')
else:  # macOS/Linux
            桌面路径 = os.path.join(os.path.expanduser('~'), 'Desktop')

# 创建八字命理文件夹
        八字文件夹 = os.path.join(桌面路径, "八字命理专业分析报告")
if not os.path.exists(八字文件夹):
            os.makedirs(八字文件夹)

# 创建时间戳子文件夹
        时间戳 = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        输出文件夹 = os.path.join(八字文件夹, f"报告_{时间戳}")
        os.makedirs(输出文件夹)

return 输出文件夹

    def 输入八字信息(self):
"""输入八字信息(修正版)"""
print("\n" + "=" * 60)
print("请输入出生信息")
print("=" * 60)

        try:
print("\n出生日期:")
            年份 = int(input("  年份 (如: 1989): "))
            月份 = int(input("  月份 (1-12): "))
            日 = int(input("  日期 (1-31): "))

print("\n出生时间:")
print("  提示:23-1点为子时,1-3点为丑时,以此类推")
            时辰输入 = input("  时辰 (0-23点,默认12): ")
            时辰 = int(时辰输入) if 时辰输入.strip() else 12

print("\n性别:")
            性别输入 = input("  1=男性,2=女性 (默认1): ")
            性别 = "女"if (性别输入.strip() == "2"else"男"# 修正了这里!!!

# 验证日期合法性
            datetime.datetime(年份, 月份, 日, 时辰)

return {
'year': 年份,
'month': 月份,
'day': 日,
'hour': 时辰,
'gender': 性别
            }

        except ValueError as e:
print(f"输入错误: 日期或时间不合法,请检查输入")
return None
        except Exception as e:
print(f"输入错误: {e}")
return None

    def 分析八字(self, 出生信息: Dict):
"""执行完整的八字分析"""
print("\n" + "=" * 60)
print("开始八字命理分析...")
print("=" * 60)

        try:
# 创建datetime对象
            出生时间 = datetime.datetime(
                出生信息['year'],
                出生信息['month'],
                出生信息['day'],
                出生信息['hour']
            )

# 1. 排八字
print("1. 排八字...")
            self.命盘 = 准确八字计算器.排八字(出生时间, 出生信息['gender'])

# 2. 计算十神
print("2. 计算十神...")
            self.命盘 = 十神分析器.计算十神(self.命盘)
            十神统计 = 十神分析器.统计十神力量(self.命盘)

# 3. 分析五行
print("3. 分析五行...")
            五行统计 = 五行分析器.统计五行力量(self.命盘)

# 4. 判断格局
print("4. 判断格局...")
            格局数据 = 格局判断器.判断格局(self.命盘, 五行统计)

# 5. 计算神煞
print("5. 计算神煞...")
            神煞数据 = 神煞计算器.计算神煞(self.命盘)

# 6. 计算大运
print("6. 计算大运...")
            大运数据 = 大运计算器.计算大运(self.命盘)

# 保存分析数据
            self.分析数据 = {
'十神统计': 十神统计,
'五行统计': 五行统计,
'格局': 格局数据,
'神煞': 神煞数据,
'大运': 大运数据
            }

print("\n✓ 八字分析完成!")
return True

        except Exception as e:
print(f"\n✗ 分析失败: {e}")
            import traceback
            traceback.print_exc()
return False

    def 显示基本信息(self):
"""显示基本信息"""
if not self.命盘:
print("请先进行八字分析")
return

print("\n" + "=" * 60)
print("八字基本信息")
print("=" * 60)
print(f"出生时间: {self.命盘['出生时间'].strftime('%Y年%m月%d日 %H时')}")
print(f"性别: {self.命盘['性别']}")
print(f"八字: {self.命盘['年柱']['天干']}{self.命盘['年柱']['地支']} "
              f"{self.命盘['月柱']['天干']}{self.命盘['月柱']['地支']} "
              f"{self.命盘['日柱']['天干']}{self.命盘['日柱']['地支']} "
              f"{self.命盘['时柱']['天干']}{self.命盘['时柱']['地支']}")
print(f"日主: {self.命盘['日主']}")
print("\n十神分布:")
for 柱名 in ['年柱''月柱''日柱''时柱']:
print(f"  {柱名}: {self.命盘[柱名]['天干']}{self.命盘[柱名]['地支']} - {self.命盘[柱名]['十神']}")
print("=" * 60)

    def 生成所有可视化图表(self):
"""生成所有可视化图表"""
if not VISUALIZATION_AVAILABLE:
print("可视化库不可用,无法生成图表")
print("请运行: pip install matplotlib numpy seaborn")
return False

if not self.命盘:
print("请先进行八字分析")
return False

print("\n正在生成专业可视化图表...")
print("-" * 50)

        图表列表 = [
            ('八字四柱图''bazi_pillar.png',
             lambda: 专业可视化引擎.创建八字四柱图(self.命盘, os.path.join(self.图片文件夹, 'bazi_pillar.png'))),
            ('十神分布图''ten_gods.png',
             lambda: 专业可视化引擎.创建十神分布图(self.分析数据['十神统计'],
                                                   os.path.join(self.图片文件夹, 'ten_gods.png'))),
            ('五行能量图''five_elements.png',
             lambda: 专业可视化引擎.创建五行能量图(self.分析数据['五行统计'],
                                                   os.path.join(self.图片文件夹, 'five_elements.png'))),
            ('大运走势图''luck_trend.png',
             lambda: 专业可视化引擎.创建大运走势图(self.分析数据['大运'],
                                                   os.path.join(self.图片文件夹, 'luck_trend.png'))),
            ('格局分析图''pattern.png',
             lambda: 专业可视化引擎.创建格局分析图(self.分析数据['格局'],
                                                   os.path.join(self.图片文件夹, 'pattern.png'))),
        ]

        成功计数 = 0
for 图表名, 文件名, 生成函数 in 图表列表:
print(f"正在生成 {图表名}...", end=" ")
            try:
if 生成函数():
print("✓ 成功")
                    成功计数 += 1
else:
print("✗ 失败")
            except Exception as e:
print(f"✗ 错误: {e}")

print("-" * 50)
print(f"图表生成完成: {成功计数}/{len(图表列表)} 个图表生成成功")
print(f"图表保存位置: {self.图片文件夹}")

return 成功计数 > 0

    def 生成HTML报告(self):
"""生成HTML报告"""
if not self.命盘:
print("请先进行八字分析")
return False

print("\n正在生成专业HTML报告...")

        try:
# 复制图片到输出目录
            import shutil
for 图片文件 in os.listdir(self.图片文件夹):
if 图片文件.endswith('.png'):
                    src = os.path.join(self.图片文件夹, 图片文件)
                    dst = os.path.join(self.输出文件夹, 图片文件)
                    shutil.copy2(src, dst)

# 生成HTML报告
            html路径 = 专业HTML报告生成器.生成完整HTML报告(self.命盘, self.分析数据, self.输出文件夹)

print(f"✓ HTML报告已保存: {html路径}")

# 询问是否打开
            打开 = input("\n是否在浏览器中打开HTML报告?(y/n,默认y): ").strip().lower()
if 打开 != 'n':
                webbrowser.open(f'file://{os.path.abspath(html路径)}')
print("正在打开报告...")

return True

        except Exception as e:
print(f"✗ 生成HTML报告失败: {e}")
return False

    def 生成详细文本报告(self):
"""生成详细文本报告"""
if not self.命盘:
print("请先进行八字分析")
return False

        try:
            报告路径 = os.path.join(self.输出文件夹, "八字详细分析.txt")

            报告内容 = f"""
{'=' * 85}
八字命理详细分析报告
{'=' * 85}

一、基本信息
{'-' * 45}
出生时间: {self.命盘['出生时间'].strftime('%Y年%m月%d日 %H时')}
性别: {self.命盘['性别']}
八字: {self.命盘['年柱']['天干']}{self.命盘['年柱']['地支']} {self.命盘['月柱']['天干']}{self.命盘['月柱']['地支']} 
      {self.命盘['日柱']['天干']}{self.命盘['日柱']['地支']} {self.命盘['时柱']['天干']}{self.命盘['时柱']['地支']}
日主: {self.命盘['日主']}

二、八字排盘
{'-' * 45}
年柱: {self.命盘['年柱']['天干']}{self.命盘['年柱']['地支']} ({self.命盘['年柱']['十神']})
月柱: {self.命盘['月柱']['天干']}{self.命盘['月柱']['地支']} ({self.命盘['月柱']['十神']})
日柱: {self.命盘['日柱']['天干']}{self.命盘['日柱']['地支']} ({self.命盘['日柱']['十神']})
时柱: {self.命盘['时柱']['天干']}{self.命盘['时柱']['地支']} ({self.命盘['时柱']['十神']})

三、十神分析
{'-' * 45}
"
""

for 十神, 数量 in self.分析数据['十神统计'].items():
                报告内容 += f"{十神}: {数量} 处\n"

            报告内容 += f"""
四、五行分布
{'-' * 45}
"
""
for 五行, 数量 in self.分析数据['五行统计'].items():
                报告内容 += f"{五行}: {数量} 处\n"

            报告内容 += f"""
五、格局判断
{'-' * 45}
格局类型: {self.分析数据['格局']['类型']}
格局描述: {self.分析数据['格局']['描述']}
日主五行: {self.分析数据['格局']['日主五行']}
日主力量: {self.分析数据['格局']['日主力量']} 处
日主比例: {self.分析数据['格局']['日主比例']}

六、神煞分析
{'-' * 45}
"
""
for 神煞名, 神煞值 in self.分析数据['神煞'].items():
if isinstance(神煞值, list):
                    报告内容 += f"{神煞名}: {', '.join(神煞值)}\n"
else:
                    报告内容 += f"{神煞名}: {神煞值}\n"

            报告内容 += f"""
七、大运排盘
{'-' * 45}
"
""
for 运 in self.分析数据['大运']:
                报告内容 += f"第{运['序号']}步大运: {运['干支']} ({运['起始年龄']:.1f}-{运['结束年龄']:.1f}岁)\n"

            报告内容 += f"""
{'=' * 85}
说明:
1. 本报告基于传统八字命理理论生成,仅供娱乐参考
2. 命理分析不应作为人生决策的唯一依据
3. 命运掌握在自己手中,积极面对生活最重要
4. 本系统已修正八字计算错误,确保排盘准确
{'=' * 85}
生成时间: {datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')}
报告位置: {self.输出文件夹}
{'=' * 85}
"
""

            with open(报告路径, 'w', encoding='utf-8') as f:
                f.write(报告内容)

print(f"✓ 详细报告已保存: {报告路径}")
return True

        except Exception as e:
print(f"✗ 生成详细报告失败: {e}")
return False

    def 打开结果文件夹(self):
"""打开结果文件夹"""
        try:
if os.name == 'nt':  # Windows
                os.startfile(self.输出文件夹)
elif os.name == 'posix':  # macOS/Linux
                import subprocess
                subprocess.run(['open', self.输出文件夹])

print(f"✓ 已打开结果文件夹: {self.输出文件夹}")
return True

        except Exception as e:
print(f"✗ 打开文件夹失败: {e}")
return False

    def 运行(self):
"""运行主系统"""
print("欢迎使用八字命理分析系统 (最终完整版)")
print("本系统已修正所有计算错误,确保八字排盘准确")
print("=" * 70)

# 验证测试案例
print("\n验证测试案例: 1989年5月27日15时 男性")
        准确八字计算器.验证八字计算(1989, 5, 27, 15, "男")

while True:
print("\n" + "=" * 60)
print("主菜单")
print("=" * 60)
print("1. 输入八字并分析")
print("2. 显示基本信息")
print("3. 生成可视化图表")
print("4. 生成HTML报告")
print("5. 生成详细文本报告")
print("6. 打开结果文件夹")
print("7. 退出系统")
print("=" * 60)

            选择 = input("请选择操作 (1-7): ").strip()

if 选择 == '1':
                出生信息 = self.输入八字信息()
if 出生信息:
if self.分析八字(出生信息):
                        self.显示基本信息()

elif 选择 == '2':
                self.显示基本信息()

elif 选择 == '3':
                self.生成所有可视化图表()

elif 选择 == '4':
                self.生成HTML报告()

elif 选择 == '5':
                self.生成详细文本报告()

elif 选择 == '6':
                self.打开结果文件夹()

elif 选择 == '7':
print(f"\n感谢使用八字命理分析系统!")
print(f"分析结果保存在: {self.输出文件夹}")
print("再见!")
break

else:
print("无效的选择,请重新输入")

            input("\n按回车键继续...")


# ==================== 程序入口 ====================
if __name__ == "__main__":
    try:
# 显示欢迎信息
print("\n" + "=" * 70)
print("八字命理分析系统 - 最终完整版(已修正所有错误)")
print("Python版本: 3.12.9")
print("=" * 70)

# 创建并运行系统
        系统 = 八字命理分析系统()
        系统.运行()

    except KeyboardInterrupt:
print("\n程序被用户中断")
    except Exception as e:
print(f"\n程序运行出错: {e}")
        import traceback

        traceback.print_exc()
        input("\n按回车键退出...")

核心算法介绍

1. 八字排盘

年柱计算:考虑立春节气,以2月4日左右为界,之前为上一年,之后为本年。以1900年(庚子年)为基准,通过年差计算干支。

月柱计算:根据节气划分月份,使用五虎遁(年上起月法)计算月干。

日柱计算:使用基准日法(1900年1月31日为甲午日)计算日柱。

时柱计算:根据日干和时辰,使用五鼠遁(日上起时法)计算时柱。

2. 十神分析

十神是以日主(日柱天干)为中心,与其他天干的关系。系统内置了十神关系表,根据日主与其他天干的关系确定十神。

3. 五行分析

天干地支都有对应的五行属性,系统统计四柱中五行出现的次数,分析五行强弱。

4. 格局判断

根据日主五行在八字中的比例,判断格局类型:

专旺格:日主比例≥60%

从格:日主比例≤20%

普通格:其他情况

5. 神煞计算

系统计算了天乙贵人、太极贵人、文昌贵人、驿马、桃花、华盖等常见神煞。

6. 大运计算

起运岁数:根据出生日期和节气计算,阳年男、阴年女顺行,阴年男、阳年女逆行。

大运排法:从月柱开始,顺排或逆排,每十年一大运。

可视化与报告

系统利用Matplotlib和Seaborn库生成五种专业图表,并通过HTML和文本形式输出详细报告,方便用户查看和保存。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 19:41:55 HTTP/2.0 GET : https://f.mffb.com.cn/a/462852.html
  2. 运行时间 : 0.141643s [ 吞吐率:7.06req/s ] 内存消耗:5,149.23kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=e07ad6aa4b94c7be47075e6ea6c0d9db
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000815s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001210s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003184s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.008437s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001181s ]
  6. SELECT * FROM `set` [ RunTime:0.000460s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001347s ]
  8. SELECT * FROM `article` WHERE `id` = 462852 LIMIT 1 [ RunTime:0.002163s ]
  9. UPDATE `article` SET `lasttime` = 1770550915 WHERE `id` = 462852 [ RunTime:0.014567s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.009588s ]
  11. SELECT * FROM `article` WHERE `id` < 462852 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.006739s ]
  12. SELECT * FROM `article` WHERE `id` > 462852 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000915s ]
  13. SELECT * FROM `article` WHERE `id` < 462852 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002212s ]
  14. SELECT * FROM `article` WHERE `id` < 462852 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002184s ]
  15. SELECT * FROM `article` WHERE `id` < 462852 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001453s ]
0.144814s