diff --git a/ETL/README.md b/ETL/README.md index 55f49c7..c6df99c 100644 --- a/ETL/README.md +++ b/ETL/README.md @@ -1,3 +1,7 @@ L1A output_arena/iframe_network.json -> L1A.sqlite(Primary Key: match_id) -L1B -L2 L1A.sqlite -> L2.sqlite \ No newline at end of file + +L1B demoparser2 -> L1B.sqlite + +L2 L1A.sqlite (+L1b.sqlite) -> L2.sqlite + +L3 Deep Dive. \ No newline at end of file diff --git a/RDD.md b/RDD.md new file mode 100644 index 0000000..fb14c9f --- /dev/null +++ b/RDD.md @@ -0,0 +1,174 @@ +# YRTV 网站需求规格说明书 (RDD) + +## 1. 项目概述 (Overview) + +### 1.1 项目背景 +YRTV 是一个面向 CS2 战队数据洞察与战术研判的 Web 平台。该平台基于现有的 `ETL` 数据管线与 `L2_Main.sqlite` 核心数据库,旨在通过 Web 界面提供可视化的数据查询、战队管理、战术模拟及深度分析功能。 + +### 1.2 核心目标 +* **数据可视化**: 将复杂的 SQLite 比赛数据转化为易读的图表、雷达图和趋势线。 +* **战术研判**: 提供阵容模拟、协同分析及地图热点情报,辅助战术决策。 +* **交互体验**: 通过轻量级前端交互(筛选、对比、点赞、白板)提升数据使用效率。 +* **实时动态**: 追踪战队成员的实时竞技状态与近期比赛动态,营造“战队大厅”氛围。 + +### 1.3 技术栈规划 +* **后端框架**: Python Flask (轻量级,易于集成现有 ETL 脚本) +* **数据库**: + * L2: SQLite (`database/L2/L2_Main.sqlite`) - 基础事实数据 + * L3: SQLite (`database/L3/L3_Features.sqlite`) - 高级衍生特征 (Feature Store) +* **模板引擎**: Jinja2 (服务端渲染) +* **前端样式**: Tailwind CSS (CDN 引入,快速开发) +* **前端交互**: + * **图表**: Chart.js / ECharts (雷达图、趋势图) + * **交互**: Alpine.js 或原生 JS (处理模态框、异步请求) + * **拖拽**: SortableJS (阵容调整) + * **地图**: Leaflet.js 或简单 Canvas (热力图/策略板) + +--- + +## 2. 系统架构 (Architecture) + +### 2.1 目录结构规划 +```text +yrtv/ +├── web/ +│ ├── app.py # Flask 应用入口 +│ ├── config.py # 配置文件 +│ ├── routes/ # 路由模块 +│ │ ├── main.py # 首页与通用 +│ │ ├── players.py # 玩家模块 +│ │ ├── teams.py # 战队模块 +│ │ ├── matches.py # 比赛模块 +│ │ ├── tactics.py # 战术与分析模块 +│ │ └── admin.py # 管理后台 +│ ├── services/ # 业务逻辑层 (数据计算) +│ │ ├── stats_service.py # 核心指标计算 +│ │ ├── feature_store.py # L3 特征读取与计算 +│ │ └── etl_trigger.py # ETL 调度 +│ ├── static/ # 静态资源 +│ │ ├── css/ +│ │ ├── js/ +│ │ └── images/ +│ └── templates/ # Jinja2 模板 +│ ├── base.html +│ ├── components/ +│ └── ... (各页面模板) +├── database/ # 数据存储 +│ ├── L1A/ # 原始爬虫数据 +│ ├── L2/ # 结构化事实数据 +│ └── L3/ # [新增] 衍生特征库 (Feature Store) +└── ETL/ # ETL 脚本 + ├── L1A.py + ├── L2_Builder.py + └── L3_FeatureEng.py # [新增] L3 特征工程脚本 +``` + +### 2.2 数据流向 +1. **ETL 层**: + * L1 (Raw): 爬虫 -> JSON 存储。 + * L2 (Fact): JSON -> 清洗/标准化 -> Fact/Dim Tables。 + * **L3 (Features)**: L2 -> 聚合/滑窗计算/模型推理 -> Player/Team Derived Features (e.g., 近期状态分, 地图熟练度, 关键局胜率)。 +2. **Service 层**: Flask Service 读取 L2 (基础数据) 和 L3 (高级特征),执行业务逻辑。 +3. **View 层**: Jinja2 渲染 HTML,嵌入计算后的数据。 +4. **Client 层**: 浏览器展示页面,JS 处理局部交互。 + +--- + +## 3. 功能需求详解 (Functional Requirements) + +### 3.1 首页 (Home) +* **功能**: 平台入口与导航聚合。 +* **内容**: + * **Hero 区域**: 平台定位文案("JKTV CS2 队伍数据洞察平台")。 + * **Live / 战队状态看板 (New)**: + * **正在进行**: 如果监测到战队成员(配置列表内)正在进行比赛(通过 5E 接口轮询或最近 10 分钟内有数据更新),显示 "LIVE" 状态卡片。 + * **近期战况**: 滚动显示战队成员最近结束的 5 场比赛结果(胜负、比分、MVP)。 + * **状态概览**: 类似 GitHub Contribution 的热力日历,展示战队本月的活跃度。 + * **快捷入口卡片**: + * "战术指挥中心": 跳转至阵容模拟。 + * "近期比赛": 跳转至最新一场比赛详情。 + * "数据中心": 跳转至多维对比。 + * **比赛解析器**: 输入 5E 比赛链接,点击按钮触发后台 ETL 任务(异步),前端显示 Loading 状态或 Toast 提示。 + +### 3.2 玩家模块 (Players) +#### 3.2.1 玩家列表 +* **筛选/搜索**: 按 ID/昵称搜索,按 K/D、Rating、MVP 等指标排序。 +* **展示**: 卡片式布局,显示头像、ID、主队、核心数据 (Rating, K/D, ADR)。 +#### 3.2.2 玩家详情 +* **基础信息**: 头像、SteamID、5E ID、注册时间、主玩位置(根据数据推算)。 +* **核心指标**: 赛季平均 Rating, ADR, KAST, 首杀成功率等。 +* **能力雷达图**: *计算规则需在 Service 层定义*。 +* **趋势图**: 近 10/20 场比赛 Rating 走势 (Chart.js)。 +* **评价板**: 类似于虎扑评分,用户可点赞/踩,显示热门评价(需新增 `web_comments` 表)。增加访问次数统计。 +* **管理区** (Admin Only): 修改备注、上传自定义头像。 + +### 3.3 战队模块 (Teams) +* **阵容视图**: 展示当前核心阵容(活跃度最高的 5-7 人)。 +* **角色分组**: 根据 `profile_group_id` 或手动标签将玩家分组(如:主力、替补、青训)。 +* **统计概览**: 战队整体胜率、近期战绩、地图胜率分布。 + +### 3.4 比赛模块 (Matches) +#### 3.4.1 比赛列表 +* **筛选**: 按地图、日期范围、比赛类型(Classic/Leetify)筛选。 +* **展示**: 列表视图,显示时间、地图、比分、胜负、MVP。 +#### 3.4.2 比赛详情 +* **头部**: 比分板(CT/T 分数)、地图、时长、Demo 下载链接。 +* **数据表**: 双方队伍的完整数据表(K, D, A, FK, FD, ADR, Rating, KAST, AWP Kills 等)。 + * *利用 `fact_match_players` 中的丰富字段*。 +* **原始数据**: 提供 JSON 格式的原始数据查看/下载(`raw_iframe_network` 提取)。 + +### 3.5 战术模块 (Tactics) +#### 3.5.1 化学反应与战术深度分析 (Deep Analysis) +* **阵容组建**: 交互式界面,从玩家池拖拽 5 名玩家进入“首发名单”。 +* **阵容评估**: 实时计算该 5 人组合的平均能力雷达。 +* **共同经历**: 查询这 5 人共同参与过的比赛场次及胜率。 +* **协同矩阵**: 选择特定阵容,展示两两之间的协同数据(如:A 补枪 B 的次数,A 与 B 同时在场时的胜率)。 +* **最佳/短板分析**: 基于历史数据分析该阵容在特定地图上的强弱项。 +#### 3.5.2 数据对比 +* **多选对比**: 选择多名玩家,并在同一雷达图/柱状图中对比各项数据。 +* **地图筛选**: 查看特定玩家在特定地图上的表现差异。 +#### 3.5.3 道具与策略板 (Grenades & Strategy Board) +* **道具管理**: + * **道具计算**: 提供特定点位(如 Inferno 香蕉道)的烟雾弹/燃烧弹投掷模拟(基于坐标距离与轨迹公式)。 + * **道具库**: 预设主流地图的常见道具点位(图片/视频展示),支持管理员添加新点位。 +* **实时互动策略板**: + * **分地图绘制**: 基于 Leaflet.js 或 Canvas,加载 CS2 高清鸟瞰图。 + * **实时协同**: 支持 WebSocket 多人同屏绘制(类似 Excalidraw),即时同步画笔轨迹与标记。 + * **快照保存**: 支持一键保存当前战术板状态为图片或 JSON,生成分享链接/加入知识库。 + +#### 3.5.4 经济计算器 (Economy Calculator) +* **功能**: 模拟 CS2 经济系统,辅助指挥决策。 +* **输入**: 设定当前回合胜负、存活人数、炸弹状态、当前连败奖励。 +* **输出**: 预测下一回合敌我双方的经济状况(最小/最大可用资金),给出起枪建议(Eco/Force/Full Buy)。 + +### 3.6 知识库 (Knowledge Base / Wiki) +* **架构**: 典型的 Wiki 布局。 + * **左侧**: 全局文档树状目录(支持多级折叠)。 + * **右侧**: 当前文档的页内大纲(TOC)。 + * **中间**: Markdown 渲染的正文区域。 +* **功能**: + * **快速编辑**: 提供 Web 端 Markdown 编辑器,支持实时预览。 + * **简单验证**: 简单的密码或 Token 验证即可保存修改,降低贡献门槛。 + * **文件管理**: 支持新建、重命名、删除文档,自动生成目录结构。 + +### 3.7 管理后台 (Admin) +* **鉴权**: 简单的 Session/Token 登录。 +* **数据管理**: + * 手动触发增量/全量 ETL。 + * 上传 demo 文件或修正比赛数据。 +* **配置**: 管理员账号管理、全局公告设置。查看网站访问数等后台统计。 + +### 3.7E 管理后台查询工具 (SQL Runner) +* **功能**: 提供一个 Web 版的 SQLite 查询窗口。 +* **限制**: 只读权限(防止 `DROP/DELETE`),仅供高级用户进行自定义数据挖掘。 + +--- + +### Second Stage: Demo 深度解析管线 (Future) +* **目标**: 引入 `demoparser2` (或类似开源库) 实现本地 Demo 文件的深度解析,获取比 Web 爬虫更细粒度的原子级数据。 +* **Pipeline**: + 1. **Ingest**: 自动/手动上传 `.dem` 文件。 + 2. **Parse**: 调用 `demoparser2` 提取每 tick/每事件数据 (Player Position, Grenade Trajectory, Weapon Firing)。 + 3. **Store**: 将海量原子数据存入 ClickHouse 或优化的 SQLite 分表 (L1B/L2+)。 + 4. **Analyze**: 产出高级分析指标(如:真实拉枪反应时间、道具覆盖效率、非预瞄击杀率)。 + 5. **Visualize**: 在前端复盘页面实现 2D 回放 (2D Replay) 功能。 diff --git a/README.md b/README.md index 845752d..1bc351c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# YRTV 项目说明 +# YRTV 项目说明 till 0.4.1 ## 项目概览 yrtv这一块。 @@ -41,47 +41,10 @@ yrtv/ ``` ## 环境要求 -- Python 3.9+ +- Python 3.11.4+ - Playwright(下载器依赖) - pandas、numpy(校验脚本依赖) -项目默认 Python 路径: -``` -C:/ProgramData/anaconda3/python.exe -``` - -## 快速开始 -### 1. 下载比赛数据 -进入项目根目录运行(默认示例 URL): -``` -C:/ProgramData/anaconda3/python.exe downloader/downloader.py -``` - -指定比赛 URL: -``` -C:/ProgramData/anaconda3/python.exe downloader/downloader.py --url https://arena.5eplay.com/data/match/g161-20260118222715609322516 -``` - -批量下载(从文本文件读取 URL 列表): -``` -C:/ProgramData/anaconda3/python.exe downloader/downloader.py --url-list downloader/gamelist/match_list_2026.txt -``` - -### 2. 生成 L1A 数据库 -``` -C:/ProgramData/anaconda3/python.exe ETL/L1A.py -``` - -### 3. 生成 L2 数据库 -``` -C:/ProgramData/anaconda3/python.exe ETL/L2_Builder.py -``` - -### 4. 校验与覆盖检查 -``` -C:/ProgramData/anaconda3/python.exe ETL/verify/verify_L2.py -C:/ProgramData/anaconda3/python.exe ETL/verify/verify_deep.py -``` ## 数据库层级说明 ### L1A @@ -108,11 +71,6 @@ C:/ProgramData/anaconda3/python.exe ETL/verify/verify_deep.py ## JSON Schema 抽取工具 用于分析大量 `iframe_network.json` 的字段结构与覆盖情况,支持动态 Key 归并与多格式输出。 -常用命令: -``` -C:/ProgramData/anaconda3/python.exe utils/json_extractor/main.py -``` - 输出内容通常位于 `output_reports/` 或 `database/original_json_schema/`,包括: - `schema_summary.md`:结构概览 - `schema_flat.csv`:扁平字段列表 @@ -125,11 +83,3 @@ L2 中 `fact_matches.data_source_type` 用于区分数据来源与字段覆盖 - `unknown`:无法识别来源 入库逻辑保持互斥:同一场比赛只会按其来源覆盖相应字段,避免重复或冲突。 - -## 常用文件定位 -- 下载器入口:[downloader.py](file:///c:/Users/Administrator/Documents/trae_projects/yrtv/downloader/downloader.py) -- L1A 入库脚本:[L1A.py](file:///c:/Users/Administrator/Documents/trae_projects/yrtv/ETL/L1A.py) -- L2 构建脚本:[L2_Builder.py](file:///c:/Users/Administrator/Documents/trae_projects/yrtv/ETL/L2_Builder.py) -- L2 Schema:[schema.sql](file:///c:/Users/Administrator/Documents/trae_projects/yrtv/database/L2/schema.sql) -- 覆盖检查:[verify_L2.py](file:///c:/Users/Administrator/Documents/trae_projects/yrtv/ETL/verify/verify_L2.py) -- 深度校验:[verify_deep.py](file:///c:/Users/Administrator/Documents/trae_projects/yrtv/ETL/verify/verify_deep.py)