SOURCE

console 命令行工具 X clear

                    
>
console
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>排列三历史统计工具</title>
  <script src="https://cdn.tailwindcss.com"></script>
  <style>
    .tab-active { border-bottom: 2px solid #1677ff; color: #1677ff; font-weight: 600; }
    .num-ball {
      width: 40px; height: 40px; line-height: 40px;
      border-radius: 50%; background: #1677ff; color: #fff;
      text-align: center; font-weight: bold; display: inline-block;
    }
  </style>
</head>
<body class="bg-gray-50 text-sm">
  <!-- 全局风险提示 -->
  <div class="bg-amber-50 text-amber-700 p-3 text-xs leading-relaxed">
    温馨提示:开奖结果完全随机,本工具仅做历史数据统计复盘,不构成任何购彩建议,请勿沉迷。
  </div>

  <!-- 标签导航 -->
  <div class="bg-white flex border-b">
    <div class="tab-btn tab-active flex-1 text-center py-3 cursor-pointer" data-tab="history">开奖历史</div>
    <div class="tab-btn flex-1 text-center py-3 cursor-pointer text-gray-500" data-tab="hotcold">冷热统计</div>
    <div class="tab-btn flex-1 text-center py-3 cursor-pointer text-gray-500" data-tab="trend">走势分析</div>
  </div>

  <div class="p-3">
    <!-- 页面1:开奖历史 + 条件筛选 -->
    <div id="tab-history" class="tab-panel">
      <!-- 筛选面板 -->
      <div class="bg-white rounded-lg p-3 mb-3 shadow-sm">
        <div class="font-medium mb-2">条件筛选</div>
        <div class="grid grid-cols-2 gap-2 mb-2">
          <div>
            <label class="text-gray-500 text-xs">和值最小值</label>
            <input type="number" id="sumMin" placeholder="0" class="w-full border rounded px-2 py-1 mt-1">
          </div>
          <div>
            <label class="text-gray-500 text-xs">和值最大值</label>
            <input type="number" id="sumMax" placeholder="27" class="w-full border rounded px-2 py-1 mt-1">
          </div>
          <div>
            <label class="text-gray-500 text-xs">跨度最小值</label>
            <input type="number" id="spanMin" placeholder="0" class="w-full border rounded px-2 py-1 mt-1">
          </div>
          <div>
            <label class="text-gray-500 text-xs">跨度最大值</label>
            <input type="number" id="spanMax" placeholder="9" class="w-full border rounded px-2 py-1 mt-1">
          </div>
        </div>
        <div class="mb-2">
          <label class="text-gray-500 text-xs">奇偶形态</label>
          <select id="oddEven" class="w-full border rounded px-2 py-1 mt-1">
            <option value="">全部</option>
            <option value="3奇0偶">全奇</option>
            <option value="0奇3偶">全偶</option>
            <option value="2奇1偶">2奇1偶</option>
            <option value="1奇2偶">1奇2偶</option>
          </select>
        </div>
        <div class="flex gap-2">
          <button id="filterBtn" class="flex-1 bg-blue-500 text-white py-1.5 rounded">筛选</button>
          <button id="resetBtn" class="flex-1 border py-1.5 rounded">重置</button>
        </div>
      </div>

      <!-- 开奖列表 -->
      <div id="historyList" class="space-y-2"></div>
    </div>

    <!-- 页面2:冷热号统计 -->
    <div id="tab-hotcold" class="tab-panel hidden">
      <div class="bg-white rounded-lg p-3 shadow-sm">
        <div class="font-medium mb-3">号码热度排行(近100期)</div>
        <div id="hotList" class="grid grid-cols-5 gap-2"></div>
      </div>
    </div>

    <!-- 页面3:走势分析 -->
    <div id="tab-trend" class="tab-panel hidden">
      <div class="bg-white rounded-lg p-3 mb-3 shadow-sm">
        <div class="font-medium mb-3">和值分布(近100期)</div>
        <div id="sumChart" class="flex items-end justify-around h-48 border-b pb-1 text-xs"></div>
      </div>
      <div class="bg-white rounded-lg p-3 shadow-sm">
        <div class="font-medium mb-3">跨度分布(近100期)</div>
        <div id="spanChart" class="flex items-end justify-around h-40 border-b pb-1 text-xs"></div>
      </div>
    </div>
  </div>

  <script>
    // ========== 1. 模拟历史数据(可替换为真实数据) ==========
    // 真实使用时,把这里替换成你整理的官方历史开奖数据即可
    const rawData = []
    // 生成100条模拟数据演示用
    for (let i = 0; i < 100; i++) {
      const period = String(2026280 - i)
      const date = `2026-10-${String(20 - i).padStart(2, '0')}`
      const n1 = Math.floor(Math.random() * 10)
      const n2 = Math.floor(Math.random() * 10)
      const n3 = Math.floor(Math.random() * 10)
      rawData.push({ period, date, num1: n1, num2: n2, num3: n3 })
    }

    // ========== 2. 核心统计工具函数 ==========
    function calcItemStats(num1, num2, num3) {
      const nums = [num1, num2, num3]
      const sum = num1 + num2 + num3
      const span = Math.max(...nums) - Math.min(...nums)
      const oddCount = nums.filter(n => n % 2 === 1).length
      const oddEven = `${oddCount}奇${3 - oddCount}偶`
      const bigCount = nums.filter(n => n >= 5).length
      const bigSmall = `${bigCount}大${3 - bigCount}小`
      return { sum, span, oddEven, bigSmall }
    }

    function calcHotCold(list) {
      const count = new Array(10).fill(0)
      list.forEach(item => {
        count[item.num1]++
        count[item.num2]++
        count[item.num3]++
      })
      return count.map((times, num) => ({ num, times })).sort((a, b) => b.times - a.times)
    }

    function calcDistribution(list, key) {
      const map = {}
      list.forEach(item => {
        const v = item[key]
        map[v] = (map[v] || 0) + 1
      })
      return Object.entries(map)
        .map(([value, count]) => ({ value: Number(value), count }))
        .sort((a, b) => a.value - b.value)
    }

    // 预处理所有数据
    const fullData = rawData.map(item => ({
      ...item,
      ...calcItemStats(item.num1, item.num2, item.num3)
    }))

    // ========== 3. 渲染开奖历史列表 ==========
    function renderHistory(list) {
      const container = document.getElementById('historyList')
      container.innerHTML = list.map(item => `
        <div class="bg-white rounded-lg p-3 shadow-sm">
          <div class="flex justify-between text-gray-500 text-xs mb-2">
            <span>第${item.period}期</span>
            <span>${item.date}</span>
          </div>
          <div class="flex gap-3 mb-2">
            <span class="num-ball">${item.num1}</span>
            <span class="num-ball">${item.num2}</span>
            <span class="num-ball">${item.num3}</span>
          </div>
          <div class="flex justify-between text-gray-400 text-xs">
            <span>和值:${item.sum}</span>
            <span>跨度:${item.span}</span>
            <span>${item.oddEven}</span>
            <span>${item.bigSmall}</span>
          </div>
        </div>
      `).join('')
    }

    // ========== 4. 筛选功能 ==========
    function filterData() {
      const sumMin = Number(document.getElementById('sumMin').value) || 0
      const sumMax = Number(document.getElementById('sumMax').value) || 27
      const spanMin = Number(document.getElementById('spanMin').value) || 0
      const spanMax = Number(document.getElementById('spanMax').value) || 9
      const oddEven = document.getElementById('oddEven').value

      const result = fullData.filter(item => {
        if (item.sum < sumMin || item.sum > sumMax) return false
        if (item.span < spanMin || item.span > spanMax) return false
        if (oddEven && item.oddEven !== oddEven) return false
        return true
      })
      renderHistory(result)
    }

    function resetFilter() {
      document.getElementById('sumMin').value = ''
      document.getElementById('sumMax').value = ''
      document.getElementById('spanMin').value = ''
      document.getElementById('spanMax').value = ''
      document.getElementById('oddEven').value = ''
      renderHistory(fullData)
    }

    // ========== 5. 渲染冷热号 ==========
    function renderHotCold() {
      const hotList = calcHotCold(fullData.slice(0, 100))
      document.getElementById('hotList').innerHTML = hotList.map(item => `
        <div class="text-center p-2 bg-blue-50 rounded">
          <div class="text-lg font-bold text-blue-600">${item.num}</div>
          <div class="text-xs text-gray-500">${item.times}次</div>
        </div>
      `).join('')
    }

    // ========== 6. 渲染走势图表 ==========
    function renderCharts() {
      const data = fullData.slice(0, 100)
      const sumDist = calcDistribution(data, 'sum')
      const spanDist = calcDistribution(data, 'span')

      // 和值柱状图
      document.getElementById('sumChart').innerHTML = sumDist.map(item => `
        <div class="flex flex-col items-center" style="width:3%">
          <div class="text-gray-500">${item.count}</div>
          <div class="bg-blue-500 w-full rounded-t" style="height:${item.count * 8}px"></div>
          <div class="text-gray-500 mt-1">${item.value}</div>
        </div>
      `).join('')

      // 跨度柱状图
      document.getElementById('spanChart').innerHTML = spanDist.map(item => `
        <div class="flex flex-col items-center" style="width:8%">
          <div class="text-gray-500">${item.count}</div>
          <div class="bg-green-500 w-full rounded-t" style="height:${item.count * 10}px"></div>
          <div class="text-gray-500 mt-1">${item.value}</div>
        </div>
      `).join('')
    }

    // ========== 7. 标签页切换 ==========
    document.querySelectorAll('.tab-btn').forEach(btn => {
      btn.addEventListener('click', () => {
        document.querySelectorAll('.tab-btn').forEach(b => {
          b.classList.remove('tab-active')
          b.classList.add('text-gray-500')
        })
        btn.classList.add('tab-active')
        btn.classList.remove('text-gray-500')

        const tab = btn.dataset.tab
        document.querySelectorAll('.tab-panel').forEach(p => p.classList.add('hidden'))
        document.getElementById(`tab-${tab}`).classList.remove('hidden')

        // 切换时渲染对应页面
        if (tab === 'hotcold') renderHotCold()
        if (tab === 'trend') renderCharts()
      })
    })

    // 绑定筛选按钮
    document.getElementById('filterBtn').addEventListener('click', filterData)
    document.getElementById('resetBtn').addEventListener('click', resetFilter)

    // 初始化
    renderHistory(fullData)
  </script>
</body>
</html>