# number_web **Repository Path**: anipython/number_web ## Basic Information - **Project Name**: number_web - **Description**: 123123123123 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-13 - **Last Updated**: 2026-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数字统计 Web 版 V2 由三个 customtkinter 桌面程序(特码统计 / 特肖统计 / 段统计)重构而来的前后端分离单页面应用。 后端 FastAPI 负责数据校验与文件读写, 前端 HTML + JS + CSS 负责表格重放渲染。 ## 功能说明 页面左侧栏为两层结构, 第一层是各个 section, 第二层是各 section 的份: | section | 名称 | 份(二级菜单) | 作用 | | --- | --- | --- | --- | | section_01 | 数据源 | 澳数 / 港数 / 澳肖 / 港肖 | 数据录入与原数据显示, 供其它 section 共同使用 | | section_02 | 平特区(数字+生肖) | 平特澳尾 / 平特港尾 / 平特澳肖 / 平特港肖 | 合并引用数据源(01 ~ 07 七份交错合并累加, 只有 1 个面板); 尾数页按数字个位 0 ~ 9 分组, 肖页直接统计生肖 | | section_03 | 特码统计(数字) | 澳特 / 港特 | 只读引用 数 数据源 | | section_04 | 段统计(数字) | 澳段 / 港段 | 只读引用 数 数据源(数字换算为段 1 ~ 7) | | section_05 | 尾数(数字) | 澳尾数 / 港尾数 | 只读引用 数 数据源(数字换算为个位尾数 0 ~ 9, 显示为 0尾/1尾/.../9尾, 逻辑参考段统计) | | section_06 | 半头(数字) | 澳半头 / 港半头 | 只读引用 数 数据源(数字换算为 十位数 + 个位单双 共 10 组: 0单/0双/1单/1双/.../4单/4双, 逻辑参考段统计) | | section_07 | 特肖统计(生肖) | 澳肖 / 港肖 | 只读引用 肖 数据源 | | section_08 | 半单双(数字) | 澳半单双 / 港半单双 | 只读引用 数 数据源(数字换算为 小单/小双/大单/大双) | | section_09 | 琴棋书画(生肖) | 澳琴棋书画 / 港琴棋书画 | 只读引用 肖 数据源(生肖换算为 琴/棋/书/画) | | section_10 | 春夏秋冬(生肖) | 澳春夏秋冬 / 港春夏秋冬 | 只读引用 肖 数据源(生肖换算为 春/夏/秋/冬) | | section_11 | 梅兰菊竹(生肖) | 澳梅兰菊竹 / 港梅兰菊竹 | 只读引用 肖 数据源(生肖换算为 梅/兰/菊/竹) | | section_12 | 东南西北(生肖) | 澳东南西北 / 港东南西北 | 只读引用 肖 数据源(生肖换算为 东/南/西/北) | | section_13 | 波色(数字) | 澳波色 / 港波色 | 只读引用 数 数据源(数字换算为 红/蓝/绿) | | section_14 | 天地人(生肖) | 澳天地人 / 港天地人 | 只读引用 肖 数据源(生肖换算为 天/地/人) | | section_15 | 菜草肉(生肖) | 澳菜草肉 / 港菜草肉 | 只读引用 肖 数据源(生肖换算为 菜/草/肉) | | section_16 | 魏蜀吴(生肖) | 澳魏蜀吴 / 港魏蜀吴 | 只读引用 肖 数据源(生肖换算为 魏/蜀/吴) | | section_17 | 福禄寿(生肖) | 澳福禄寿 / 港福禄寿 | 只读引用 肖 数据源(生肖换算为 福/禄/寿) | | section_18 | 日月星(生肖) | 澳日月星 / 港日月星 | 只读引用 肖 数据源(生肖换算为 日/月/星) | 除平特区外, 每个 section 的每一份下有 7 个独立面板(序号 01 ~ 07), 面板编号与数据源文件一一对应; 平特区(section_02)为合并统计, 每份只有 1 个面板, 把绑定数据源的 01 ~ 07 七份交错合并到一起累加(先取各表第 1 个: 表1→表2→…→表7, 再取各表第 2 个, 依此类推; 尾数页数据源为 澳_数/港_数, 肖页为 澳_肖/港_肖)。 平特区四个页面另有两条特殊规则: - 频率表以「每 7 个数据为一组(期)」统计: 「次数」列累加条目在全部数据中的实际出现次数(同一期出现 3 次就算 3 次, 不再只算 1 次), 故次数总和 = 合并总条数; 而「期数」与「连续未出现期数」仍以组(期)为单位——一组 7 个数据中只要某条目出现一次即算该期出现, 因此其数据量是逐条统计的 1/7(期数 = 合并总条数 ÷ 7)。 - 显示前先做数据量校验: 要求绑定的 7 个表条数完全一致; 若不一致(数据尚未录齐), 该页不做任何计算, 只显示「数据正在录入中」。 数据源页只有输入框 / 确定按钮 / 原数据显示; 统计页的表格完全由数据源文件重放生成。 每个表格上方都有一个加粗的名字标签, 如: 特码次数表 / 中出顺序 / 原数据 / 生肖次数表 / 段次数表 / 尾数次数表 / 频率表。 section_04 ~ section_07 的每张频率表后有「近 20 期的走势表」: 按当前面板最后最多 20 期统计各分组出现次数, 从高到低按排名约三等分为热 / 暖 / 冷, 同次数保持同档, 0 次归冷档; 每行在所属颜色列显示次数。历史不足 20 期时按已有期数计算。走势表右侧的「逐期开出表」按期显示开出分组在上一期走势中的热 / 暖 / 冷: 前 20 期留空, 第 21 期开始使用开出前的 20 期数据判定, 每期一个格子, 每行 50 列。表名右侧可勾选热 / 暖 / 冷或使用全选 / 全不选按钮, 仅控制对应格子的颜色高亮, 不隐藏文字。 两张表的下一行是「逐期开出表频率表」, 以第 21 期起的热 / 暖 / 冷结果统计次数、未出期数和连续未出现期数; 前 20 期的空格不计入统计, 高亮勾选状态也不影响统计结果。连续未出现期数中的 0 为红色, 7 ~ 9 为绿色, 10 及以上为蓝色, 其余为白色。 ## 数据源文件规则 数据源 = 澳/港 两种 × 数/肖 两种, 每种各有 01 ~ 07 七份, 共 28 个文件, 存放在 `data/` 目录: - `澳_数_01.txt ~ 澳_数_07.txt`, `港_数_01.txt ~ 港_数_07.txt`(数字 1 ~ 49) - `澳_肖_01.txt ~ 澳_肖_07.txt`, `港_肖_01.txt ~ 港_肖_07.txt`(12 生肖) 文件格式为单行英文逗号分隔, 在数据源页输入确认后追加写入。 旧版数据文件 `data_XX_YY_ZZ.txt` 保留在目录中, 不再引用。 ## 目录结构 ``` number_web/ ├── app.py # FastAPI 后端(入口) ├── requirements.txt # Python 依赖 ├── start.bat # 双击启动脚本 ├── data/ # 数据源文件 澳_数/港_数/澳_肖/港_肖 × 01~07 共 28 个 └── static/ ├── index.html # 单页面骨架 ├── style.css # 暗色主题样式 └── app.js # 重放 / 统计逻辑与渲染 ``` ## 环境准备 ### 1. 创建虚拟环境(创建在项目根目录中) 在项目根目录打开 PowerShell: ```powershell cd e:\py26\number_web python -m venv .venv ``` > 如果提示"无法加载文件, 因为在此系统上禁止运行脚本", 先执行: > `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned` ### 2. 激活虚拟环境 ```powershell .\.venv\Scripts\Activate.ps1 ``` 激活成功后命令行前面会出现 `(.venv)` 前缀。 ### 3. 安装依赖 ```powershell pip install -r requirements.txt ``` ## 启动方式 ### 方式一: 命令行启动(使用虚拟环境) 先激活虚拟环境, 然后: ```powershell python app.py ``` 看到 `Uvicorn running on http://127.0.0.1:8000` 后, 用浏览器打开该地址。 ### 方式二: 双击 start.bat 直接双击项目根目录的 `start.bat`, 会自动启动服务并打开浏览器。 注意: `start.bat` 使用的是系统 PATH 中的 Python(不是虚拟环境), 如果依赖只装在虚拟环境里, 请用方式一启动, 或在系统 Python 中也安装一遍依赖。 ### 停止服务 命令行方式按 `Ctrl + C`; bat 方式直接关闭控制台窗口。 ## 扩展新的 section 在 `app.py` 的 `SECTIONS` 列表中追加一条配置: `mode` 为 `view` 的统计页从 `SOURCES` 中选择一个已有数据源(每份绑定一个), 左侧栏会自动出现新的 section, 数据自动引用对应的 28 个数据源文件。 两种可选的进阶配置(平特区即由此实现): - `merged: True`: 该 section 每份只有 1 个面板, 后端把绑定数据源的 01 ~ 07 七份交错合并到一起累加统计(第 i 轮依次取每个表的第 i 个数据: 表1→表2→…→表7), 而非分成 7 个面板; 同时返回 `balanced`(7 表条数是否一致)与 `table_lengths`。前端在 merged 页把频率表按每 7 个一组统计, 且 `balanced` 为假时只显示「数据正在录入中」。 - 在 sub 上单独写 `view`(而非 section 级): 可让同一 section 内不同份使用不同显示类型(如平特区的尾数页 `tail` 与生肖页 `zodiac` 并存)。 显示类型 `view` 在前端 `app.js` 的 `TYPE_UI` 中配置渲染方式, 新增同类型 section 无需改渲染代码; 若引入全新类型(如 `tail`), 需在 `TYPE_UI` 补充对应配置。 ## API 一览 | 方法 | 路径 | 说明 | | --- | --- | --- | | GET | `/api/sections` | section 列表(含各份的名称 / 类型 / 绑定数据源) | | GET | `/api/sections/{sid}/subs/{i}/panels/{pid}` | 读取某一份某个面板的历史数据; 合并 section(平特区)只有 1 个面板, 返回 01 ~ 07 七份交错合并后的数据, 并附 `balanced`(7 表条数是否一致)与 `table_lengths` 字段供前端校验 | | POST | `/api/sections/{sid}/subs/{i}/panels/{pid}` | 追加一个值, body: `{"value": "..."}`; 仅数据源页可用, 统计页返回 405 |