# web-root **Repository Path**: tillfall/web-root ## Basic Information - **Project Name**: web-root - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-22 - **Last Updated**: 2026-08-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # web-root 个人一站式工具集 Flask 应用。围绕"基金 + 股票 + 照片/电影/视频 + 思维导图/流程图 + 地图足迹 + 日历"几个生活/投资场景,把数据采集、可视化、配置管理都装进一个 Web 入口,跑在 `0.0.0.0:5555` 上。 > 本 README 面向 AI 助手:用来理解代码、优化建议、新增功能时快速对齐项目约定。 --- ## 1. 技术栈 | 层 | 选型 | |---|---| | Web 框架 | **Flask** (蓝图式但未用 `Blueprint`,全部路由在 `main.py`) | | WSGI 服务器 | **gevent.pywsgi** (单进程异步,无线程池) | | 日志 | **loguru** (统一接管 stdlib logging / Werkzeug) | | 数据处理 | **pandas**, **numpy** | | 数学/统计 | **scipy.stats** (百分位计算) | | 机器学习 | **scikit-learn** (RandomForestRegressor + RandomizedSearchCV) + **joblib** (模型持久化) | | 数据源 | **akshare** (指数/ETF 实时 + 历史 K 线 + PE)、`requests` 直连东方财富 / 天天基金 / 新浪 / 腾讯 | | 模板 | Jinja2 (Flask 内置),前端无框架,原生 HTML + 原生 JS + ECharts (回测页) | | 拼音 | **pypinyin** (分类排序、拼音首字母) | | 部署 | Windows `.bat` 启动脚本,内含 `git pull` + `pip install` + 重启进程 | `requirements.txt` 一共 11 个依赖,无 Webpack/Vite 等前端工程化工具,所有 JS/CSS 静态资源放 `static/`。 --- ## 2. 目录结构 ``` web-root/ ├── main.py # Flask 入口,所有路由 (~450 行) ├── requirements.txt ├── start-flask.bat # Windows 启动:git pull → pip install → kill python → run ├── .gitignore # 忽略 local/、.idea/、__pycache__、/py_debug_local │ ├── pyutils/ # 业务工具模块 │ ├── __init__.py │ ├── log_util.py # loguru 接管 + 文件轮转 (1MB) │ ├── calendar_util.py # 日历 CSV 读写,单元格格式: month|value|color|tip │ ├── fund_util.py # 自选基金实时估值/历史净值/回撤 + 持仓基金实时市值/收益/回撤(原 fund_hold_util.py 已合并) + 基金交易模块(标签/天数/总估值/涨幅/回撤,文本存储),8 线程并发 │ ├── fund_trade_util.py # 交易记账:positions + capital + sell_records 合并 JSON │ ├── fund_monitor.py # 指数买卖点信号监控 (akshare 双源),生成 text/html │ ├── fund_backtest.py # 基金定投回测,输出供 ECharts 渲染的数据 │ ├── stock_util.py # 自选股票 PE 百分位 + 多空天数 + 5日量比,输出 stock.xlsx │ ├── stock_select_util.py # 选股监控 CSV:次日涨幅、多头天数、持仓状态 │ ├── mindmap_util.py # 缩进文本 ↔ 树形 JSON 互转,2 空格一级 │ ├── flowchat_util.py # Mermaid flowchart 文本读写 │ ├── image_py.py # 照片/电影分类管理器 (基于文件名约定的 tag1/tag2/tag3) │ ├── visit_utils.py # 地图足迹:文件名带"📍地名📍经度📍纬度"自动入图 │ ├── txt_util.py # .txt 渲染成 HTML │ └── invest/ # 机器学习子模块 (未集成到 Web,本地脚本) │ ├── __init__.py │ ├── stock_info_getter.py # 5min K 线拉取,日内 42 时点 + 量比 │ └── stock_train_and_predict.py # 随机森林 + 特征工程 + 超参调优 │ ├── templates/ # Jinja2 模板 │ ├── index.html # 首页,带启动时间 │ ├── fund.html / fund_config.html │ ├── fund_hold.html │ ├── fund_trade.html │ ├── fund_manage.html # 基金交易模块(买入弹窗/持仓列表/卖出弹窗,手机适配) │ ├── fund_invest.html # 信号监控 (数据来自 fund_monitor.analyze) │ ├── fund_backtest.html # ECharts 4 曲线 + 买卖点 │ ├── calendar2.html │ ├── flowchat_list.html / flowchat_edit.html # Mermaid 在线编辑 │ ├── mindmap_list.htm / mindmap_edit.htm # markmap 在线编辑 │ ├── video.html │ ├── visit.html # 高德地图 (前端 JS 直连,后端只给 markers JSON) │ ├── image_list.html / image_gallery.html # 瀑布流 (masonry + lazyload) │ ├── stock_select.html # 选股监控前端 │ └── ... │ ├── static/ │ ├── url.htm / route_list.htm / route_map.htm │ └── masonry/ # jQuery + masonry + lazyload │ ├── doc/ # 文档 (如 2026日历.xlsx) ├── my_knowledge/ │ └── fund_api.txt # 关键 API 备忘 (天天基金 / 东方财富) └── local/ # 运行时数据,被 .gitignore ├── calendar.csv ├── fund.txt # 自选基金配置 ├── fund_hold.txt # 持仓配置 ├── fund_trade.json # {positions, capital, sell_records} ├── fund_manage.txt # 基金交易模块持仓(标签,代码,简称,金额,份额,日期) ├── stock.xlsx ├── stock_select.txt ├── photo/ # 照片(文件名约定) ├── movie/ # 电影封面(文件名约定) ├── video/ # 视频文件 ├── visit/ # 足迹照片 ├── text/ # 任意 .txt ├── mindmaps/ # .txt (缩进格式) ├── flowcharts/ # .txt (mermaid) └── log/ └── log.txt # loguru 轮转 ``` --- ## 3. 主要功能及实现 ### 3.1 自选基金实时估值 `/fund` - 数据源:天天基金 `fundgz.1234567.com.cn/js/.js` - 额外计算:历史净值回撤 (`fund.eastmoney.com/pingzhongdata/.js` → `Data_ACWorthTrend`)、指定日期起算的期间涨幅 - 8 线程并发 (`ThreadPoolExecutor`),按拼音首字母排序 - 配置: `local/fund.txt`,每行 `基金代码,分类,监控日期(可选)`,`#` 开头为注释 ### 3.2 持仓基金 `/fund_hold` `/fund_trade` - 代码位置:`pyutils/fund_util.py::show_fund_hold()`(原 `fund_hold_util.py` 已合并到 `fund_util.py`,`main.py` 统一从 `fund_util` import) - `/fund_hold`:支持三种特殊类型 —— - `000000xxxx` 开头:**现金**,份额字段当作"当前净值" - `999999xxxx` 开头:**其他**,不参与收益计算 - 第 4 段为日期:**已赎回**,按指定日期的净值结算 - `/fund_trade`:完整交易台账,合并存储 `positions / capital / sell_records` 三部分 - 买卖 API:`/api/fund_trade/buy|sell|clear|capital` - 实时估算用 `fundgz.1234567.com.cn`,算日内收益用实时估值 − 昨日单位净值 ### 3.3 基金买卖信号监控 `/fund_invest` - `pyutils/fund_monitor.py`,核心是 `analyze()` 返回 `{text, html, results, triggered}` - **双数据源自动切换**:东方财富 (`ak.stock_zh_index_spot_em`) 优先,失败回退到新浪 (`ak.stock_zh_index_spot_sina`) - 配置: 模块顶部 `MONITOR_GROUPS` 列表,每个组含: ```python { "index_code": "000001", "index_name": "上证指数", "fund_code": "001437", "buy_rules": [(3.0, 95000), (2.5, 50000), (2.0, 20000)], # (跌幅%, 金额) "sell_rules": [(3.0, 0.50, "50%"), (2.0, 0.30, "30%"), (1.5, 0.20, "20%")] # (涨幅%, 比例, 标签) } ``` - 规则按"从大到小"匹配,**第一个命中**生效 - 卖出前会校验"当前价 > 平均成本",否则标记 `sell_skipped` 给出"收益为负不建议卖出"提示 ### 3.4 基金回测 `/fund_backtest` - `pyutils/fund_backtest.py::run_backtest_analysis()` - 默认参数:基准 `sh000001`、基金 `001437`、起始 `2021-07-01`、初始资金 100 万 - 规则字符串: `"3.0:95000,2.5:50000,2.0:20000"` (买入) / `"3.0:50,2.0:30,1.5:20"` (卖出) - 输出指标:策略总收益、买入持有收益、最大回撤、峰值成本、买卖次数、跳过的卖出(因收益为负) - 前端用 ECharts 4 曲线:指数累计收益、基金累计收益、累计成本、持仓收益 ### 3.5 自选股票 `/stock` - `pyutils/stock_util.py` 一次性脚本(被 `start-flask.bat` 调用) - 从新浪 K 线计算:多头天数 (close>MA5>MA10>MA20 全上涨)、5 日量比、最高点回撤 - 从 akshare 计算:PE 百分位 (近 5 年) - 结果写 `local/stock.xlsx`,Web 端 pandas 直接读 + 高亮渲染 ### 3.6 选股监控 `/stock_select` - `pyutils/stock_select_util.py`,CSV 存储 - 字段:代码、名称、监控时间、次日涨幅、多头天数、收盘价、次日最高、环比、次日收盘、持仓状态 - 新增/更新/删除/改持仓状态 都有 API,前端 JS 调用 - 涨幅为空时一键回填 (`/api/stock_select/update`),5 线程并发 ### 3.7 照片/电影 `/photo` `/movie` `/gallery` - `pyutils/image_py.py::ImageManager / MovieImageManager` - **文件名即元数据**(无 EXIF/IPTC 依赖): - 照片:`YY_地点.子地点_人物1人物2.jpg` (tag1=年, tag2=地点, tag3=人物) - 电影:`电影名.年份.评分.类型.jpg` - 分类页用 jQuery masonry + lazyload 瀑布流 - 搜索:文件名包含关键词(忽略大小写) ### 3.8 地图足迹 `/visit` - `pyutils/visit_utils.py` - 文件名约定:`前缀📍地点名📍经度📍纬度.jpg`,运行期首次解析时写入 `LOCATION_COORDS` 内存字典 - 前端高德地图 (`https://webapi.amap.com/...`) 直接根据 markers JSON 渲染 - 关键词"想去"→ 蓝色,默认"去过"→ 橙色 ### 3.9 视频 `/video` `/play/` `/stream/` - 列目录 → 选文件 → 用 `