1406 lines
77 KiB
HTML
1406 lines
77 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>TH1 Dashboard</title>
|
||
<link rel="stylesheet" href="css/style.css">
|
||
</head>
|
||
<body>
|
||
|
||
<!-- Header -->
|
||
<div class="header">
|
||
<div class="header-left">
|
||
<img src="assets/logo/logo.png" alt="TOHOTOPIA" class="header-logo">
|
||
<div class="header-title">DASHBOARD</div>
|
||
<div class="header-sub">项目控制中心</div>
|
||
</div>
|
||
<div class="header-right">
|
||
<span class="header-info" id="export-time">数据: --</span>
|
||
<button class="btn-refresh" id="btn-refresh" title="更新数据">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M23 4v6h-6M1 20v-6h6"/>
|
||
<path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/>
|
||
</svg>
|
||
<span>更新数据</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Layout: Sidebar + Main -->
|
||
<div class="layout">
|
||
|
||
<!-- Sidebar Navigation -->
|
||
<nav class="sidebar">
|
||
<div class="nav-section-label">总览</div>
|
||
<button class="sidebar-tab active" data-tab="home">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
||
首页
|
||
</button>
|
||
|
||
<button class="sidebar-tab" data-tab="devplan">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg>
|
||
开发进度
|
||
</button>
|
||
|
||
<button class="sidebar-tab" data-tab="version">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 8v4l3 3"/><circle cx="12" cy="12" r="10"/></svg>
|
||
版本信息
|
||
</button>
|
||
|
||
<button class="sidebar-tab" data-tab="bugs">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M8 2l1.88 1.88M14.12 3.88L16 2M9 7.13v-1a3.003 3.003 0 116 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 014-4h4a4 4 0 014 4v3c0 3.3-2.7 6-6 6z"/><path d="M12 20v-9M6.53 9C4.6 8.8 3 7.1 3 5M6 13H2M6 17H3M17.47 9c1.93-.2 3.53-1.9 3.53-4M18 13h4M18 17h3"/></svg>
|
||
BUG跟踪
|
||
</button>
|
||
|
||
<button class="sidebar-tab" data-tab="todos">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"/></svg>
|
||
待办
|
||
</button>
|
||
|
||
<button class="sidebar-tab" data-tab="suggestions">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a4 4 0 01-4 4H8l-5 3V7a4 4 0 014-4h10a4 4 0 014 4z"/><path d="M8 8h8M8 12h5"/></svg>
|
||
建议跟踪
|
||
</button>
|
||
|
||
<div class="nav-section-label">分析模块</div>
|
||
<button class="sidebar-tab" data-tab="codex">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 8h10M7 12h7M5 20l-3 2V5a3 3 0 013-3h14a3 3 0 013 3v10a3 3 0 01-3 3H8z"/></svg>
|
||
Codex 对话
|
||
</button>
|
||
|
||
<button class="sidebar-tab" data-tab="gamebalance">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v18M3 12h18M5.63 5.63l12.74 12.74M18.37 5.63L5.63 18.37"/></svg>
|
||
平衡性分析
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="project">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
|
||
工程拆解
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="balance">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="20" x2="12" y2="10"/><line x1="18" y1="20" x2="18" y2="4"/><line x1="6" y1="20" x2="6" y2="16"/></svg>
|
||
数值设计
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="mechanics">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16v16H4z"/><path d="M9 4v16M4 9h16"/><path d="M14 14h3v3h-3z"/></svg>
|
||
游戏机制
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="ai-logic">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a7 7 0 00-7 7v4a4 4 0 004 4h1v3h4v-3h1a4 4 0 004-4V9a7 7 0 00-7-7z"/><path d="M9 9h.01M15 9h.01M9 13h6"/></svg>
|
||
AI逻辑
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="story">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg>
|
||
文案剧情
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="art">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="13.5" cy="6.5" r="2.5"/><path d="M17 3a2.83 2.83 0 114 4L7.5 20.5 2 22l1.5-5.5z"/></svg>
|
||
美术资产
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="art-dev">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4Z"/><path d="M15 5l4 4"/></svg>
|
||
美术开发
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="sentiment">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 11.5a8.38 8.38 0 01-.9 3.8 8.5 8.5 0 01-7.6 4.7 8.38 8.38 0 01-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 01-.9-3.8 8.5 8.5 0 014.7-7.6 8.38 8.38 0 013.8-.9h.5a8.48 8.48 0 018 8v.5z"/></svg>
|
||
舆情分析
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="marketing">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
|
||
宣发市场
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="sns">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75"/></svg>
|
||
SNS助手
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="community-monitor">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 12h4l3 8 4-16 3 8h4"/><path d="M5 19h14"/></svg>
|
||
社区监控
|
||
</button>
|
||
<button class="sidebar-tab" data-tab="form-helper">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 3H5a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-4"/><path d="M17 3l4 4L10 18H6v-4L17 3z"/></svg>
|
||
填表助手
|
||
</button>
|
||
</nav>
|
||
|
||
<!-- Main Content -->
|
||
<div class="main">
|
||
|
||
<!-- Loading Overlay -->
|
||
<div id="loading-overlay" class="loading-overlay" style="display:none;">
|
||
<div class="loading-card">
|
||
<div class="loading-spinner"></div>
|
||
<div class="loading-text" id="loading-text">正在更新数据...</div>
|
||
<div class="loading-progress">
|
||
<div class="loading-progress-bar" id="loading-bar"></div>
|
||
</div>
|
||
<div class="loading-detail" id="loading-detail"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Toast -->
|
||
<div id="toast" class="toast" style="display:none;"></div>
|
||
<a class="manual-corner-link" href="docs/dashboard_manual.html" target="_blank" rel="noreferrer" title="打开 Dashboard 使用手册">使用手册</a>
|
||
|
||
<!-- ===== Home Panel ===== -->
|
||
<div id="panel-home" class="tab-panel active">
|
||
|
||
<!-- Timeline Module -->
|
||
<div class="module-card">
|
||
<div class="module-header">
|
||
<span class="module-title">项目进度</span>
|
||
<span class="module-badge">里程碑</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div id="timeline-container" class="timeline-container">
|
||
<div class="loading-inline">正在加载计划数据...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Home Summary Modules (2-column grid) -->
|
||
<div id="home-summaries" class="home-summaries-grid"></div>
|
||
|
||
<!-- Architecture Graph Module -->
|
||
<div class="module-card">
|
||
<div class="module-header">
|
||
<span class="module-title">数据架构</span>
|
||
<span class="module-badge">系统拓扑</span>
|
||
</div>
|
||
<div class="module-body" style="padding:0;">
|
||
<canvas id="arch-canvas" width="1100" height="620"></canvas>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Summary Cards -->
|
||
<div id="summary-cards" class="summary-grid"></div>
|
||
</div>
|
||
|
||
<!-- ===== Placeholder Panels ===== -->
|
||
<div id="panel-project" class="tab-panel">
|
||
<!-- Content populated by js/project.js on first activation -->
|
||
<div class="loading-inline">正在加载工程数据...</div>
|
||
</div>
|
||
|
||
<div id="panel-balance" class="tab-panel">
|
||
<!-- Sub-tabs -->
|
||
<div class="sub-tabs" id="balance-sub-tabs">
|
||
<button class="sub-tab active" data-sub="factions">阵营</button>
|
||
<button class="sub-tab" data-sub="heroes">英雄</button>
|
||
<button class="sub-tab" data-sub="units">单位</button>
|
||
<button class="sub-tab" data-sub="actions">行动</button>
|
||
<button class="sub-tab" data-sub="skills">能力</button>
|
||
<button class="sub-tab" data-sub="grids">地块</button>
|
||
<button class="sub-tab" data-sub="techs">科技</button>
|
||
<button class="sub-tab" data-sub="cards">市政卡</button>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Factions -->
|
||
<div id="sub-factions" class="sub-panel active">
|
||
<div class="toolbar">
|
||
<select id="faction-force-filter" class="filter-select"><option value="">全部势力</option></select>
|
||
<select id="faction-civ-filter" class="filter-select"><option value="">全部文明</option></select>
|
||
</div>
|
||
<div id="factions-content" class="card-grid"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Heroes -->
|
||
<div id="sub-heroes" class="sub-panel">
|
||
<div class="toolbar">
|
||
<input type="text" id="hero-search" class="search-input" placeholder="搜索英雄名称...">
|
||
<select id="hero-force-filter" class="filter-select"><option value="">全部势力</option></select>
|
||
</div>
|
||
<div id="heroes-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Units -->
|
||
<div id="sub-units" class="sub-panel">
|
||
<div class="toolbar">
|
||
<input type="text" id="bunit-search" class="search-input" placeholder="搜索单位...">
|
||
<select id="bunit-type-filter" class="filter-select"><option value="">全部类型</option></select>
|
||
<select id="bunit-force-filter" class="filter-select"><option value="">全部势力</option></select>
|
||
</div>
|
||
<div id="units-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Actions -->
|
||
<div id="sub-actions" class="sub-panel">
|
||
<div class="toolbar">
|
||
<input type="text" id="action-search" class="search-input" placeholder="搜索行动...">
|
||
<select id="action-type-filter" class="filter-select"><option value="">全部类型</option></select>
|
||
</div>
|
||
<div id="actions-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Skills -->
|
||
<div id="sub-skills" class="sub-panel">
|
||
<div class="toolbar">
|
||
<input type="text" id="bskill-search" class="search-input" placeholder="搜索能力...">
|
||
<select id="bskill-view-filter" class="filter-select">
|
||
<option value="">全部类型</option>
|
||
<option value="Normal">Normal</option>
|
||
<option value="Special">Special</option>
|
||
<option value="Unique">Unique</option>
|
||
<option value="Negative">Negative</option>
|
||
<option value="Positive">Positive</option>
|
||
</select>
|
||
</div>
|
||
<div id="skills-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Grids -->
|
||
<div id="sub-grids" class="sub-panel">
|
||
<div id="grids-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Techs -->
|
||
<div id="sub-techs" class="sub-panel">
|
||
<div class="toolbar">
|
||
<input type="text" id="btech-search" class="search-input" placeholder="搜索科技...">
|
||
<select id="btech-cost-filter" class="filter-select">
|
||
<option value="">全部消耗</option>
|
||
<option value="1">Lv1</option>
|
||
<option value="2">Lv2</option>
|
||
<option value="3">Lv3</option>
|
||
</select>
|
||
</div>
|
||
<div id="techs-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Culture Cards -->
|
||
<div id="sub-cards" class="sub-panel">
|
||
<div class="toolbar">
|
||
<select id="card-culture-filter" class="filter-select">
|
||
<option value="">全部类型</option>
|
||
<option value="1">政治</option>
|
||
<option value="2">宗教</option>
|
||
<option value="3">军事</option>
|
||
<option value="4">经济</option>
|
||
</select>
|
||
</div>
|
||
<div id="cards-content"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ===== Form Helper Panel ===== -->
|
||
<div id="panel-form-helper" class="tab-panel">
|
||
<div class="sub-tabs" id="form-helper-sub-tabs">
|
||
<button class="sub-tab active" data-sub="fh-skills">Skill表</button>
|
||
<button class="sub-tab" data-sub="fh-techs">TechList</button>
|
||
<button class="sub-tab" data-sub="fh-tech-atoms">TechAtomList</button>
|
||
<button class="sub-tab" data-sub="fh-units">UnitTypeList</button>
|
||
<button class="sub-tab" data-sub="fh-resources">ResourceInfoList</button>
|
||
<button class="sub-tab" data-sub="fh-actions">ActionList</button>
|
||
<button class="sub-tab" data-sub="fh-texts">TextDataAssets</button>
|
||
<button class="sub-tab" data-sub="fh-wiki-list">WikiList</button>
|
||
</div>
|
||
|
||
<div id="sub-fh-skills" class="sub-panel active">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">SkillDataAssets</span>
|
||
<span class="module-badge" id="fh-skill-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-skill-search" class="search-input" placeholder="搜索 SkillType / 名称 / 描述...">
|
||
<button class="gb-btn-sm" id="fh-skill-sort" type="button">ID 倒序</button>
|
||
<button class="gb-btn-sm" id="fh-skill-refresh">刷新</button>
|
||
</div>
|
||
<div id="fh-skill-source" class="fh-source"></div>
|
||
<div id="fh-skill-content" class="fh-skill-content">
|
||
<div class="loading-inline">点击填表助手后加载 SkillDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="sub-fh-techs" class="sub-panel">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">TechDataAssets / TechList</span>
|
||
<span class="module-badge" id="fh-techs-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-techs-search" class="search-input" placeholder="搜索 TechType / 名称 / 描述...">
|
||
<button class="gb-btn-sm" id="fh-techs-sort" type="button">ID 倒序</button>
|
||
<button class="gb-btn-sm" id="fh-techs-refresh">刷新</button>
|
||
</div>
|
||
<div id="fh-techs-source" class="fh-source"></div>
|
||
<div id="fh-techs-content" class="fh-collection-content">
|
||
<div class="loading-inline">点击 TechList 后加载 TechDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="sub-fh-tech-atoms" class="sub-panel">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">TechDataAssets / TechAtomList</span>
|
||
<span class="module-badge" id="fh-tech-atoms-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-tech-atoms-search" class="search-input" placeholder="搜索 TechAtom / 名称 / 描述...">
|
||
<button class="gb-btn-sm" id="fh-tech-atoms-sort" type="button">ID 倒序</button>
|
||
<button class="gb-btn-sm" id="fh-tech-atoms-refresh">刷新</button>
|
||
</div>
|
||
<div id="fh-tech-atoms-source" class="fh-source"></div>
|
||
<div id="fh-tech-atoms-content" class="fh-collection-content">
|
||
<div class="loading-inline">点击 TechAtomList 后加载 TechDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="sub-fh-units" class="sub-panel">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">UnitTypeDataAssets / UnitTypeList</span>
|
||
<span class="module-badge" id="fh-units-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-units-search" class="search-input" placeholder="搜索 UnitType / GiantType / 名称 / 描述...">
|
||
<button class="gb-btn-sm" id="fh-units-sort" type="button">ID 倒序</button>
|
||
<button class="gb-btn-sm" id="fh-units-refresh">刷新</button>
|
||
</div>
|
||
<div id="fh-units-source" class="fh-source"></div>
|
||
<div id="fh-units-content" class="fh-collection-content">
|
||
<div class="loading-inline">点击 UnitTypeList 后加载 UnitTypeDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="sub-fh-resources" class="sub-panel">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">GridAndResourceDataAssets / ResourceInfoList</span>
|
||
<span class="module-badge" id="fh-resources-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-resources-search" class="search-input" placeholder="搜索 Resource / 名称 / 描述...">
|
||
<button class="gb-btn-sm" id="fh-resources-sort" type="button">ID 倒序</button>
|
||
<button class="gb-btn-sm" id="fh-resources-refresh">刷新</button>
|
||
</div>
|
||
<div id="fh-resources-source" class="fh-source"></div>
|
||
<div id="fh-resources-content" class="fh-collection-content">
|
||
<div class="loading-inline">点击 ResourceInfoList 后加载 GridAndResourceDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="sub-fh-actions" class="sub-panel">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">ActionDataAssets / ActionList</span>
|
||
<span class="module-badge" id="fh-actions-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-actions-search" class="search-input" placeholder="搜索 ActionId / 名称 / 描述...">
|
||
<button class="gb-btn-sm" id="fh-actions-sort" type="button">ID 倒序</button>
|
||
<button class="gb-btn-sm" id="fh-actions-refresh">刷新</button>
|
||
</div>
|
||
<div id="fh-actions-source" class="fh-source"></div>
|
||
<div id="fh-actions-content" class="fh-collection-content">
|
||
<div class="loading-inline">点击 ActionList 后加载 ActionDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="sub-fh-texts" class="sub-panel">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">TextDataAssets / Text Fields</span>
|
||
<span class="module-badge" id="fh-texts-badge">鏈姞杞?/span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-texts-search" class="search-input" placeholder="鎼滅储 FieldName / Text...">
|
||
<button class="gb-btn-sm" id="fh-texts-sort" type="button">ID 鍊掑簭</button>
|
||
<button class="gb-btn-sm" id="fh-texts-refresh">鍒锋柊</button>
|
||
</div>
|
||
<div id="fh-texts-source" class="fh-source"></div>
|
||
<div id="fh-texts-content" class="fh-collection-content">
|
||
<div class="loading-inline">鐐瑰嚮 TextDataAssets 鍚庡姞杞?TextDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="sub-fh-wiki-list" class="sub-panel">
|
||
<div class="module-card fh-module">
|
||
<div class="module-header">
|
||
<span class="module-title">WikiDataAssets / Items</span>
|
||
<span class="module-badge" id="fh-wiki-list-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="fh-toolbar">
|
||
<input type="text" id="fh-wiki-list-search" class="search-input" placeholder="搜索 Wiki Id / 名称 / 类型 / 描述...">
|
||
<button class="gb-btn-sm" id="fh-wiki-list-sort" type="button">ID 倒序</button>
|
||
<button class="gb-btn-sm gb-btn-primary" id="fh-wiki-list-add" type="button">新增 WikiItem</button>
|
||
<button class="gb-btn-sm" id="fh-wiki-list-refresh">刷新</button>
|
||
</div>
|
||
<div id="fh-wiki-list-source" class="fh-source"></div>
|
||
<div id="fh-wiki-list-content" class="fh-collection-content">
|
||
<div class="loading-inline">点击 WikiList 后加载 WikiDataAssets...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="panel-mechanics" class="tab-panel">
|
||
<div class="mechanics-layout">
|
||
<aside class="mechanics-sidebar">
|
||
<div class="mechanics-sidebar-head">
|
||
<div class="mechanics-title">游戏机制文档</div>
|
||
<div class="mechanics-subtitle">Design/final/mechanics</div>
|
||
</div>
|
||
<div id="mechanics-doc-list" class="mechanics-doc-list">
|
||
<div class="loading-inline">正在加载机制文档...</div>
|
||
</div>
|
||
</aside>
|
||
<section class="mechanics-reader">
|
||
<iframe id="mechanics-frame" class="mechanics-frame" title="游戏机制文档"></iframe>
|
||
</section>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="panel-ai-logic" class="tab-panel">
|
||
<div id="ai-logic-content" class="ai-page">
|
||
<div class="loading-inline">正在加载 AI 逻辑索引...</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="panel-story" class="tab-panel">
|
||
<!-- Sub-tabs -->
|
||
<div class="sub-tabs" id="story-sub-tabs">
|
||
<button class="sub-tab active" data-sub="lib-heroes">图鉴英雄</button>
|
||
<button class="sub-tab" data-sub="lib-wonders">图鉴奇观</button>
|
||
<button class="sub-tab" data-sub="comic">漫画剧情</button>
|
||
<button class="sub-tab" data-sub="moments">历史时刻</button>
|
||
<button class="sub-tab" data-sub="chat">游戏台词</button>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Library Heroes -->
|
||
<div id="sub-lib-heroes" class="sub-panel active">
|
||
<div class="toolbar">
|
||
<input type="text" id="lib-hero-search" class="search-input" placeholder="搜索英雄名称...">
|
||
</div>
|
||
<div id="lib-heroes-content" class="card-grid"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Library Wonders -->
|
||
<div id="sub-lib-wonders" class="sub-panel">
|
||
<div class="toolbar">
|
||
<input type="text" id="lib-wonder-search" class="search-input" placeholder="搜索奇观名称...">
|
||
</div>
|
||
<div id="lib-wonders-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Comic / Story Sheets -->
|
||
<div id="sub-comic" class="sub-panel">
|
||
<div class="toolbar">
|
||
<select id="comic-sheet-filter" class="filter-select"><option value="">全部章节</option></select>
|
||
</div>
|
||
<div id="comic-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Moments -->
|
||
<div id="sub-moments" class="sub-panel">
|
||
<div id="moments-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Chat Bubbles -->
|
||
<div id="sub-chat" class="sub-panel">
|
||
<div class="toolbar">
|
||
<input type="text" id="chat-search" class="search-input" placeholder="搜索角色或台词...">
|
||
</div>
|
||
<div id="chat-content"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="panel-art" class="tab-panel">
|
||
<!-- Outsource Summary Dashboard (rendered by art.js) -->
|
||
<div id="art-outsource-dashboard"></div>
|
||
|
||
<!-- Sub-tabs -->
|
||
<div class="sub-tabs" id="art-sub-tabs">
|
||
<button class="sub-tab" data-sub="art-outsource">外包进度</button>
|
||
<button class="sub-tab active" data-sub="art-illustrations">角色立绘</button>
|
||
<button class="sub-tab" data-sub="art-heroes">英雄立绘</button>
|
||
<button class="sub-tab" data-sub="art-units">兵种精灵</button>
|
||
<button class="sub-tab" data-sub="art-buildings">建筑</button>
|
||
<button class="sub-tab" data-sub="art-comic">游戏插图</button>
|
||
<button class="sub-tab" data-sub="art-forces">阵营图标</button>
|
||
<button class="sub-tab" data-sub="art-ui">UI素材</button>
|
||
</div>
|
||
|
||
<!-- Summary -->
|
||
<div id="art-summary" class="summary-grid" style="margin-bottom:16px"></div>
|
||
|
||
<!-- Sub-panel: Outsource -->
|
||
<div id="sub-art-outsource" class="sub-panel">
|
||
<div id="art-outsource-content"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panels -->
|
||
<div id="sub-art-illustrations" class="sub-panel active">
|
||
<div class="toolbar">
|
||
<select id="art-illust-group" class="filter-select"><option value="">全部势力</option></select>
|
||
</div>
|
||
<div id="art-illustrations-content" class="art-gallery"></div>
|
||
</div>
|
||
<div id="sub-art-heroes" class="sub-panel">
|
||
<div id="art-heroes-content" class="art-gallery"></div>
|
||
</div>
|
||
<div id="sub-art-units" class="sub-panel">
|
||
<div class="toolbar">
|
||
<select id="art-units-group" class="filter-select"><option value="">全部势力</option></select>
|
||
</div>
|
||
<div id="art-units-content" class="art-gallery"></div>
|
||
</div>
|
||
<div id="sub-art-buildings" class="sub-panel">
|
||
<div class="toolbar">
|
||
<select id="art-buildings-group" class="filter-select"><option value="">全部分类</option></select>
|
||
</div>
|
||
<div id="art-buildings-content" class="art-gallery"></div>
|
||
</div>
|
||
<div id="sub-art-comic" class="sub-panel">
|
||
<div class="toolbar">
|
||
<select id="art-comic-group" class="filter-select"><option value="">全部分类</option></select>
|
||
</div>
|
||
<div id="art-comic-content" class="art-gallery"></div>
|
||
</div>
|
||
<div id="sub-art-forces" class="sub-panel">
|
||
<div id="art-forces-content" class="art-gallery"></div>
|
||
</div>
|
||
<div id="sub-art-ui" class="sub-panel">
|
||
<div class="toolbar">
|
||
<select id="art-ui-group" class="filter-select"><option value="">全部分类</option></select>
|
||
</div>
|
||
<div id="art-ui-content" class="art-gallery"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="panel-art-dev" class="tab-panel">
|
||
<div class="sub-tabs" id="art-dev-sub-tabs">
|
||
<button class="sub-tab active" data-sub="art-dev-skill-action-icons">skill/action图标</button>
|
||
</div>
|
||
|
||
<div id="sub-art-dev-skill-action-icons" class="sub-panel active">
|
||
<div class="module-card artdev-module">
|
||
<div class="module-header">
|
||
<span class="module-title">skill/action图标需求</span>
|
||
<span class="module-badge" id="artdev-icon-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div id="artdev-icon-list" class="artdev-icon-list">
|
||
<div class="loading-inline">正在加载图标需求...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="panel-sentiment" class="tab-panel">
|
||
<div class="sub-tabs" id="sentiment-sub-tabs">
|
||
<button class="sub-tab active" data-sent-view="records">舆情记录</button>
|
||
<button class="sub-tab" data-sent-view="core-feedback">查看反馈集合</button>
|
||
<button class="sub-tab" data-sent-view="official-replies">官方回复集合</button>
|
||
<button class="sub-tab" data-sent-view="raw-feedback">原始反馈集</button>
|
||
</div>
|
||
|
||
<div id="sentiment-records-view">
|
||
<!-- Header bar -->
|
||
<div class="sent-header-bar">
|
||
<div class="sent-header-left">
|
||
<span class="sent-header-title">舆情记录</span>
|
||
<span class="sent-header-count" id="sentiment-count">加载中...</span>
|
||
</div>
|
||
<button class="sent-btn sent-btn-primary" onclick="sentShowAddModal()">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||
添加舆情
|
||
</button>
|
||
</div>
|
||
<!-- Toolbar -->
|
||
<div class="toolbar">
|
||
<input type="text" id="sentiment-search" class="search-input" placeholder="搜索标题、来源或摘要...">
|
||
<select id="sentiment-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="analyzed">已分析</option>
|
||
<option value="pending">待分析</option>
|
||
</select>
|
||
</div>
|
||
<!-- List -->
|
||
<div id="sentiment-list"></div>
|
||
</div>
|
||
|
||
<div id="sentiment-core-feedback-view" style="display:none;">
|
||
<div class="corefb-header-bar">
|
||
<div class="corefb-header-left">
|
||
<span class="corefb-header-title">核心玩家反馈</span>
|
||
<span class="corefb-header-count" id="corefb-count">加载中...</span>
|
||
</div>
|
||
<div class="corefb-header-actions">
|
||
<button class="sent-btn sent-btn-primary" id="corefb-export-btn" style="display:none;" onclick="corefbExportCurrentCollection()">导出</button>
|
||
<button class="sent-btn" id="corefb-back-btn" style="display:none;" onclick="corefbBackToCollections()">返回集合</button>
|
||
</div>
|
||
</div>
|
||
<div id="corefb-content" class="corefb-content"></div>
|
||
</div>
|
||
|
||
<div id="sentiment-official-replies-view" style="display:none;">
|
||
<div class="corefb-header-bar">
|
||
<div class="corefb-header-left">
|
||
<span class="corefb-header-title">官方回复集合</span>
|
||
<span class="corefb-header-count" id="offrep-count">加载中...</span>
|
||
</div>
|
||
<div class="corefb-header-actions">
|
||
<button class="sent-btn sent-btn-primary" id="offrep-export-btn" style="display:none;" onclick="offrepExportCurrentCollection()">导出</button>
|
||
<button class="sent-btn" id="offrep-back-btn" style="display:none;" onclick="offrepBackToCollections()">返回集合</button>
|
||
</div>
|
||
</div>
|
||
<div id="offrep-content" class="corefb-content"></div>
|
||
</div>
|
||
|
||
<div id="sentiment-raw-feedback-view" style="display:none;">
|
||
<div class="rawfb-header-bar">
|
||
<div class="rawfb-header-left">
|
||
<span class="rawfb-header-title">原始反馈集</span>
|
||
<span class="rawfb-header-count" id="rawfb-count">加载中...</span>
|
||
</div>
|
||
<div class="rawfb-header-actions">
|
||
<button class="sent-btn sent-btn-primary" id="rawfb-add-set-btn" onclick="rawfbShowAddSetModal()">新增反馈集</button>
|
||
<button class="sent-btn sent-btn-primary" id="rawfb-add-item-btn" style="display:none;" onclick="rawfbShowAddItemModal()">新增原始反馈</button>
|
||
<button class="sent-btn" id="rawfb-back-btn" style="display:none;" onclick="rawfbBackToSets()">返回反馈集</button>
|
||
</div>
|
||
</div>
|
||
<div id="rawfb-content" class="rawfb-content"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="panel-marketing" class="tab-panel">
|
||
<!-- Content populated by js/marketing.js on first activation -->
|
||
<div class="loading-inline">正在加载宣发数据...</div>
|
||
</div>
|
||
|
||
<div id="panel-devplan" class="tab-panel">
|
||
<!-- Content populated by js/devplan.js on first activation -->
|
||
<div class="loading-inline">正在加载开发计划...</div>
|
||
</div>
|
||
|
||
<div id="panel-version" class="tab-panel">
|
||
<!-- Content populated by js/version.js on first activation -->
|
||
<div class="loading-inline">正在加载版本信息...</div>
|
||
</div>
|
||
|
||
<!-- ===== Bug Tracker Panel ===== -->
|
||
<div id="panel-bugs" class="tab-panel">
|
||
<!-- Header bar -->
|
||
<div class="bug-header-bar">
|
||
<div class="bug-header-left">
|
||
<span class="bug-header-title">BUG 跟踪</span>
|
||
<span class="bug-header-count" id="bugs-count">加载中...</span>
|
||
</div>
|
||
<button class="bug-btn bug-btn-primary" onclick="bugsShowAddModal()">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||
添加 BUG
|
||
</button>
|
||
</div>
|
||
<!-- Toolbar -->
|
||
<div class="toolbar">
|
||
<button class="bug-btn" id="bugs-longterm-toggle" type="button">查看长期 BUG</button>
|
||
<input type="text" id="bugs-search" class="search-input" placeholder="搜索编号、标题或描述...">
|
||
<select id="bugs-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="open" selected>待修复</option>
|
||
<option value="fixing">修复中</option>
|
||
<option value="fixed">已修复</option>
|
||
<option value="verified">已验证</option>
|
||
<option value="wontfix">不修复</option>
|
||
</select>
|
||
<select id="bugs-priority-filter" class="filter-select">
|
||
<option value="">全部优先级</option>
|
||
<option value="critical">P0 致命</option>
|
||
<option value="high">P1 严重</option>
|
||
<option value="medium">P2 一般</option>
|
||
<option value="low">P3 轻微</option>
|
||
</select>
|
||
<select id="bugs-module-filter" class="filter-select">
|
||
<option value="">全部模块</option>
|
||
</select>
|
||
</div>
|
||
<!-- Bug List -->
|
||
<div id="bugs-list"></div>
|
||
</div>
|
||
|
||
<!-- ===== Todo Tracker Panel ===== -->
|
||
<div id="panel-todos" class="tab-panel">
|
||
<!-- Header bar -->
|
||
<div class="bug-header-bar">
|
||
<div class="bug-header-left">
|
||
<span class="bug-header-title">待办</span>
|
||
<span class="bug-header-count" id="todos-count">加载中...</span>
|
||
</div>
|
||
<button class="bug-btn bug-btn-primary" onclick="todosShowAddModal()">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||
添加待办
|
||
</button>
|
||
</div>
|
||
<!-- Toolbar -->
|
||
<div class="toolbar">
|
||
<button class="bug-btn" id="todos-longterm-toggle" type="button">查看长期待办</button>
|
||
<input type="text" id="todos-search" class="search-input" placeholder="搜索编号、标题或描述...">
|
||
<select id="todos-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="open">待处理</option>
|
||
<option value="fixing">进行中</option>
|
||
<option value="fixed">已完成</option>
|
||
<option value="verified">已确认</option>
|
||
<option value="wontfix">暂不做</option>
|
||
</select>
|
||
<select id="todos-priority-filter" class="filter-select">
|
||
<option value="">全部优先级</option>
|
||
<option value="critical">P0 紧急</option>
|
||
<option value="high">P1 重要</option>
|
||
<option value="medium">P2 普通</option>
|
||
<option value="low">P3 低优先级</option>
|
||
</select>
|
||
<select id="todos-module-filter" class="filter-select">
|
||
<option value="">全部模块</option>
|
||
</select>
|
||
</div>
|
||
<!-- Todo List -->
|
||
<div id="todos-list"></div>
|
||
</div>
|
||
|
||
<!-- ===== Suggestion Tracker Panel ===== -->
|
||
<div id="panel-suggestions" class="tab-panel">
|
||
<!-- Header bar -->
|
||
<div class="bug-header-bar">
|
||
<div class="bug-header-left">
|
||
<span class="bug-header-title">建议跟踪</span>
|
||
<span class="bug-header-count" id="suggestions-count">加载中...</span>
|
||
</div>
|
||
<button class="bug-btn bug-btn-primary" onclick="suggestionsShowAddModal()">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||
新增建议
|
||
</button>
|
||
</div>
|
||
<!-- Toolbar -->
|
||
<div class="toolbar">
|
||
<input type="text" id="suggestions-search" class="search-input" placeholder="搜索编号、标题或描述...">
|
||
<select id="suggestions-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="open">未处理</option>
|
||
<option value="processed">已处理</option>
|
||
</select>
|
||
<select id="suggestions-module-filter" class="filter-select">
|
||
<option value="">全部模块</option>
|
||
</select>
|
||
</div>
|
||
<!-- Suggestion List -->
|
||
<div id="suggestions-list"></div>
|
||
</div>
|
||
|
||
<!-- ===== Local Codex Sessions Panel ===== -->
|
||
<div id="panel-codex" class="tab-panel">
|
||
<div class="codex-shell">
|
||
<section class="codex-left">
|
||
<div class="codex-header">
|
||
<div>
|
||
<div class="codex-title">Codex 对话</div>
|
||
<div class="codex-subtitle" id="codex-count">加载中...</div>
|
||
</div>
|
||
<button class="bug-btn bug-btn-primary" id="codex-refresh" type="button">刷新</button>
|
||
</div>
|
||
<div class="codex-toolbar">
|
||
<input type="text" id="codex-search" class="search-input" placeholder="搜索标题、摘要或会话 ID...">
|
||
<label class="codex-check">
|
||
<input type="checkbox" id="codex-include-archived" checked>
|
||
<span>含归档</span>
|
||
</label>
|
||
</div>
|
||
<div id="codex-session-list" class="codex-session-list"></div>
|
||
</section>
|
||
|
||
<section class="codex-right">
|
||
<div class="codex-detail-head">
|
||
<div>
|
||
<div class="codex-detail-title" id="codex-detail-title">选择一个 TH1 会话</div>
|
||
<div class="codex-detail-meta" id="codex-detail-meta">本面板只显示工作目录为 C:\TH1\TH1 的本机 Codex 会话。</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="codex-runner">
|
||
<textarea id="codex-prompt" class="codex-prompt" rows="5" placeholder="输入要交给本机 Codex 执行的任务..."></textarea>
|
||
<div class="codex-runner-actions">
|
||
<button class="bug-btn" id="codex-run-new" type="button">新会话执行</button>
|
||
<button class="bug-btn bug-btn-primary" id="codex-run-resume" type="button" disabled>续接所选会话执行</button>
|
||
<span id="codex-job-status" class="codex-job-status"></span>
|
||
</div>
|
||
<pre id="codex-job-output" class="codex-job-output"></pre>
|
||
</div>
|
||
|
||
<div id="codex-messages" class="codex-messages">
|
||
<div class="loading-inline">选择左侧会话后查看摘要和最近消息。</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ===== SNS Assistant Panel ===== -->
|
||
<div id="panel-sns" class="tab-panel">
|
||
<!-- Sub-tabs -->
|
||
<div class="sub-tabs" id="sns-sub-tabs">
|
||
<button class="sub-tab" data-sub="tools">常用工具</button>
|
||
<button class="sub-tab" data-sub="xiaoheihe">小黑盒</button>
|
||
<button class="sub-tab active" data-sub="steam">Steam商店</button>
|
||
<button class="sub-tab" data-sub="bilibili">Bilibili</button>
|
||
<button class="sub-tab" data-sub="twitter">Twitter</button>
|
||
<button class="sub-tab" data-sub="qq">Q群</button>
|
||
<button class="sub-tab" data-sub="discord">Discord</button>
|
||
</div>
|
||
|
||
<!-- Sub-panel: 常用工具 -->
|
||
<div id="sub-sns-tools" class="sub-panel">
|
||
<div class="sns-header-bar">
|
||
<div class="sns-header-left">
|
||
<span class="sns-header-title">常用回复</span>
|
||
<span class="sns-header-count" id="qr-count">加载中...</span>
|
||
</div>
|
||
<button class="sns-btn sns-btn-primary" onclick="qrShowCreateDialog()">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||
新增一句
|
||
</button>
|
||
</div>
|
||
<div class="toolbar">
|
||
<input type="text" id="qr-search" class="search-input" placeholder="搜索标题或内容...">
|
||
</div>
|
||
<div id="qr-list"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: 小黑盒 -->
|
||
<div id="sub-sns-xiaoheihe" class="sub-panel">
|
||
<div class="sns-header-bar">
|
||
<div class="sns-header-left">
|
||
<span class="sns-header-title">小黑盒评论</span>
|
||
<span class="sns-header-count" id="sns-xiaoheihe-count">加载中...</span>
|
||
</div>
|
||
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('xiaoheihe')">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
|
||
自动更新最新事件
|
||
</button>
|
||
</div>
|
||
<div class="toolbar">
|
||
<input type="text" id="sns-xiaoheihe-search" class="search-input" placeholder="搜索标题...">
|
||
<select id="sns-xiaoheihe-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="pending">待处理</option>
|
||
<option value="processed">已处理</option>
|
||
</select>
|
||
</div>
|
||
<div id="sns-xiaoheihe-list"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Steam商店 -->
|
||
<div id="sub-sns-steam" class="sub-panel active">
|
||
<div class="sns-header-bar">
|
||
<div class="sns-header-left">
|
||
<span class="sns-header-title">Steam商店评论</span>
|
||
<span class="sns-header-count" id="sns-steam-count">加载中...</span>
|
||
</div>
|
||
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('steam')">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
|
||
自动更新最新事件
|
||
</button>
|
||
</div>
|
||
<div class="toolbar">
|
||
<input type="text" id="sns-steam-search" class="search-input" placeholder="搜索标题...">
|
||
<select id="sns-steam-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="pending">待处理</option>
|
||
<option value="processed">已处理</option>
|
||
</select>
|
||
</div>
|
||
<div id="sns-steam-list"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Bilibili -->
|
||
<div id="sub-sns-bilibili" class="sub-panel">
|
||
<div class="sns-header-bar">
|
||
<div class="sns-header-left">
|
||
<span class="sns-header-title">Bilibili评论</span>
|
||
<span class="sns-header-count" id="sns-bilibili-count">加载中...</span>
|
||
</div>
|
||
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('bilibili')">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
|
||
自动更新最新事件
|
||
</button>
|
||
</div>
|
||
<div class="toolbar">
|
||
<input type="text" id="sns-bilibili-search" class="search-input" placeholder="搜索标题...">
|
||
<select id="sns-bilibili-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="pending">待处理</option>
|
||
<option value="processed">已处理</option>
|
||
</select>
|
||
</div>
|
||
<div id="sns-bilibili-list"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Twitter -->
|
||
<div id="sub-sns-twitter" class="sub-panel">
|
||
<div class="sns-header-bar">
|
||
<div class="sns-header-left">
|
||
<span class="sns-header-title">Twitter评论</span>
|
||
<span class="sns-header-count" id="sns-twitter-count">加载中...</span>
|
||
</div>
|
||
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('twitter')">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
|
||
自动更新最新事件
|
||
</button>
|
||
</div>
|
||
<div class="toolbar">
|
||
<input type="text" id="sns-twitter-search" class="search-input" placeholder="搜索标题...">
|
||
<select id="sns-twitter-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="pending">待处理</option>
|
||
<option value="processed">已处理</option>
|
||
</select>
|
||
</div>
|
||
<div id="sns-twitter-list"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Q群 -->
|
||
<div id="sub-sns-qq" class="sub-panel">
|
||
<div class="sns-header-bar">
|
||
<div class="sns-header-left">
|
||
<span class="sns-header-title">Q群评论</span>
|
||
<span class="sns-header-count" id="sns-qq-count">加载中...</span>
|
||
</div>
|
||
<button class="sns-btn sns-btn-primary" onclick="snsAutoUpdate('qq')">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
|
||
自动更新最新事件
|
||
</button>
|
||
</div>
|
||
<div class="toolbar">
|
||
<input type="text" id="sns-qq-search" class="search-input" placeholder="搜索标题...">
|
||
<select id="sns-qq-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="pending">待处理</option>
|
||
<option value="processed">已处理</option>
|
||
</select>
|
||
</div>
|
||
<div id="sns-qq-list"></div>
|
||
</div>
|
||
|
||
<!-- Sub-panel: Discord -->
|
||
<div id="sub-sns-discord" class="sub-panel">
|
||
<div class="sns-header-bar">
|
||
<div class="sns-header-left">
|
||
<span class="sns-header-title">Discord评论</span>
|
||
<span class="sns-header-count" id="sns-discord-count">加载中...</span>
|
||
</div>
|
||
<div class="sns-header-actions">
|
||
<button class="sns-btn sns-btn-primary sns-btn-large" onclick="snsShowDiscordPasteDialog()">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||
添加 Discord 信息
|
||
</button>
|
||
<button class="sns-btn" onclick="snsAutoUpdate('discord')">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
|
||
自动更新最新事件
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="toolbar">
|
||
<input type="text" id="sns-discord-search" class="search-input" placeholder="搜索标题...">
|
||
<select id="sns-discord-status-filter" class="filter-select">
|
||
<option value="">全部状态</option>
|
||
<option value="pending">待处理</option>
|
||
<option value="processed">已处理</option>
|
||
</select>
|
||
</div>
|
||
<div id="sns-discord-list"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ===== Community Monitor Panel ===== -->
|
||
<div id="panel-community-monitor" class="tab-panel">
|
||
<div class="module-card cm-module">
|
||
<div class="module-header">
|
||
<span class="module-title">社区监控</span>
|
||
<span class="module-badge">SQLite / OpenRouter</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="cm-topbar">
|
||
<div class="cm-actions">
|
||
<button class="cm-btn primary" type="button" onclick="cmTriggerSync(false)">增量同步</button>
|
||
<button class="cm-btn" type="button" onclick="cmTriggerSync(true)">全量同步</button>
|
||
<button class="cm-btn" type="button" onclick="cmTriggerAnalyze()">补跑分析</button>
|
||
<button class="cm-btn" type="button" onclick="cmShowManualModal()">手动添加</button>
|
||
<button class="cm-btn" type="button" onclick="cmLoad(true)">刷新</button>
|
||
</div>
|
||
<div class="cm-platforms">
|
||
<label><input id="cm-platform-steam" type="checkbox" checked> Steam</label>
|
||
<label><input id="cm-platform-twitter" type="checkbox"> Twitter</label>
|
||
</div>
|
||
</div>
|
||
<div id="cm-config" class="cm-config"></div>
|
||
<div id="cm-summary" class="cm-summary-grid"></div>
|
||
<div class="cm-runs-card">
|
||
<div class="cm-section-title">最近同步</div>
|
||
<div id="cm-runs"></div>
|
||
</div>
|
||
<div class="cm-filter-bar">
|
||
<select id="cm-filter-source" class="filter-select" data-cm-filter>
|
||
<option value="">全部来源</option>
|
||
<option value="steam_reviews">Steam评测</option>
|
||
<option value="steam_discussions">Steam讨论区</option>
|
||
<option value="twitter_posts">Twitter帖子</option>
|
||
<option value="twitter_replies">Twitter回复</option>
|
||
<option value="manual">手动添加</option>
|
||
</select>
|
||
<select id="cm-filter-contentType" class="filter-select" data-cm-filter>
|
||
<option value="">全部类型</option>
|
||
<option value="review">评测</option>
|
||
<option value="discussion_topic">讨论主题</option>
|
||
<option value="discussion_reply">讨论回复</option>
|
||
<option value="twitter_post">Twitter帖子</option>
|
||
<option value="twitter_reply">Twitter回复</option>
|
||
<option value="manual_note">手动信息</option>
|
||
</select>
|
||
<select id="cm-filter-sentiment" class="filter-select" data-cm-filter>
|
||
<option value="">全部情绪</option>
|
||
<option value="positive">正面</option>
|
||
<option value="negative">负面</option>
|
||
<option value="mixed">混合</option>
|
||
<option value="neutral">中性</option>
|
||
</select>
|
||
<select id="cm-filter-status" class="filter-select" data-cm-filter>
|
||
<option value="">全部处理状态</option>
|
||
<option value="new">未处理</option>
|
||
<option value="read">已读</option>
|
||
<option value="needs_reply">待回复</option>
|
||
<option value="replied">已回复</option>
|
||
<option value="needs_fix">待修复</option>
|
||
<option value="archived">已归档</option>
|
||
</select>
|
||
<select id="cm-filter-analysisStatus" class="filter-select" data-cm-filter>
|
||
<option value="">全部分析状态</option>
|
||
<option value="done">已分析</option>
|
||
<option value="pending">待分析</option>
|
||
<option value="error">分析失败</option>
|
||
</select>
|
||
<label class="cm-check"><input id="cm-filter-reply" type="checkbox" data-cm-filter> 建议回复</label>
|
||
<label class="cm-check"><input id="cm-filter-actionable" type="checkbox" data-cm-filter> 具体反馈</label>
|
||
<input id="cm-filter-q" class="search-input" type="text" placeholder="搜索正文/摘要/作者..." data-cm-filter>
|
||
</div>
|
||
<div id="cm-list" class="cm-list">
|
||
<div class="loading-inline">点击社区监控后加载数据...</div>
|
||
</div>
|
||
<div id="cm-pager" class="cm-pager"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ===== Game Balance Analysis Panel ===== -->
|
||
<div id="panel-gamebalance" class="tab-panel">
|
||
<!-- Sub-nav -->
|
||
<div class="sub-tabs" id="gb-sub-tabs">
|
||
<button class="sub-tab active" data-sub="gb-query">通用查询</button>
|
||
<button class="sub-tab" data-sub="gb-hero-data">英雄数据</button>
|
||
<button class="sub-tab" data-sub="gb-hero-upgrade">英雄升级</button>
|
||
<button class="sub-tab" data-sub="gb-hero">英雄平衡</button>
|
||
<button class="sub-tab" data-sub="gb-faction">阵营平衡</button>
|
||
</div>
|
||
|
||
<!-- Sub: 通用查询 -->
|
||
<div id="sub-gb-query" class="sub-panel active">
|
||
<!-- Module 1: 版本筛选 -->
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">版本筛选</span>
|
||
<span class="module-badge" id="gb-version-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="gb-version-bar">
|
||
<button class="gb-btn-sm" onclick="gbSelectAllVersions(true)">全选</button>
|
||
<button class="gb-btn-sm" onclick="gbSelectAllVersions(false)">全不选</button>
|
||
</div>
|
||
<div id="gb-version-list" class="gb-version-list">
|
||
<span class="text-muted">加载中...</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Module 2: 筛选条件 -->
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">筛选条件</span>
|
||
<span class="module-badge">单位过滤</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="gb-filter-grid">
|
||
<div class="gb-filter-row">
|
||
<label class="gb-filter-check">
|
||
<input type="checkbox" id="gb-filter-unittype-on">
|
||
<span>UnitType</span>
|
||
</label>
|
||
<select id="gb-filter-unittype" class="gb-filter-select" disabled>
|
||
<option value="">--</option>
|
||
</select>
|
||
</div>
|
||
<div class="gb-filter-row">
|
||
<label class="gb-filter-check">
|
||
<input type="checkbox" id="gb-filter-gianttype-on">
|
||
<span>GiantType</span>
|
||
</label>
|
||
<select id="gb-filter-gianttype" class="gb-filter-select" disabled>
|
||
<option value="">--</option>
|
||
</select>
|
||
</div>
|
||
<div class="gb-filter-row">
|
||
<label class="gb-filter-check">
|
||
<input type="checkbox" id="gb-filter-level-on">
|
||
<span>Level</span>
|
||
</label>
|
||
<select id="gb-filter-level" class="gb-filter-select" disabled>
|
||
<option value="">--</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="gb-filter-actions">
|
||
<button class="gb-btn gb-btn-primary" onclick="gbSearch()">查询</button>
|
||
<button class="gb-btn" onclick="gbResetFilters()">重置</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Module 3: 统计结果 -->
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">统计结果</span>
|
||
<span class="module-badge" id="gb-stats-badge">--</span>
|
||
</div>
|
||
<div class="module-body" id="gb-stats-content">
|
||
<div class="gb-stats-empty">选择版本和筛选条件后点击查询</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Module 4: 数据列表 -->
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">对局数据</span>
|
||
<span class="module-badge" id="gb-data-badge">--</span>
|
||
</div>
|
||
<div class="module-body" style="padding:0;">
|
||
<div id="gb-data-table-wrap">
|
||
<table class="gb-table" id="gb-data-table">
|
||
<thead>
|
||
<tr>
|
||
<th>#</th>
|
||
<th>版本</th>
|
||
<th>玩家</th>
|
||
<th>总回合</th>
|
||
<th>伤害事件</th>
|
||
<th>造兵数</th>
|
||
<th>玩家数</th>
|
||
<th>时间戳</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="gb-data-tbody"></tbody>
|
||
</table>
|
||
</div>
|
||
<div class="gb-pagination" id="gb-pagination"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Sub: 英雄数据 -->
|
||
<div id="sub-gb-hero-data" class="sub-panel">
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">英雄数据</span>
|
||
<span class="module-badge" id="gbhd-total-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="gbhd-toolbar">
|
||
<div class="gbhp-model-meta">
|
||
<span>按职阶横向排列 5 个当前帝国,基础属性拆成独立行便于横向比对</span>
|
||
</div>
|
||
<div class="gbhp-controls">
|
||
<input type="text" id="gbhd-search" class="search-input" placeholder="搜索英雄 / 帝国 / 技能">
|
||
<select id="gbhd-class-filter" class="gb-filter-select">
|
||
<option value="">全部职阶</option>
|
||
</select>
|
||
<select id="gbhd-force-filter" class="gb-filter-select">
|
||
<option value="">全部5帝国</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div id="gbhd-hero-table" class="gbhd-table-shell">
|
||
<div class="gb-stats-empty">正在加载英雄数据...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Sub: 英雄升级 -->
|
||
<div id="sub-gb-hero-upgrade" class="sub-panel">
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">英雄升级</span>
|
||
<span class="module-badge" id="gbhu-total-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="gbhu-toolbar">
|
||
<div class="gbhp-model-meta">
|
||
<span>按当前 HeroDataAssets 任务配置估算每段升级大概需要的回合数,三段任务均按升级后从 0 重新累计处理。</span>
|
||
</div>
|
||
<div class="gbhp-controls">
|
||
<input type="text" id="gbhu-search" class="search-input" placeholder="搜索英雄 / 帝国 / 任务 / 估算逻辑">
|
||
<select id="gbhu-force-filter" class="gb-filter-select">
|
||
<option value="">全部5帝国</option>
|
||
</select>
|
||
<select id="gbhu-speed-filter" class="gb-filter-select">
|
||
<option value="">全部速度</option>
|
||
<option value="fast">偏快</option>
|
||
<option value="normal">常规</option>
|
||
<option value="slow">偏慢</option>
|
||
<option value="gated">门槛/依赖</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="gbhu-model-note">
|
||
基础口径:金币 6/回合、探索 8格/回合、伤害 12点/回合、击杀 1.2个/回合、开遗迹约每2回合1处、主动/特殊技能约每回合1次;特殊任务按技能机制覆盖。
|
||
</div>
|
||
<div id="gbhu-upgrade-table" class="gbhu-table-shell">
|
||
<div class="gb-stats-empty">正在加载英雄升级估算...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Sub: 英雄平衡 -->
|
||
<div id="sub-gb-hero" class="sub-panel">
|
||
<!-- Row 1: 版本筛选 + 计算 -->
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">版本筛选</span>
|
||
<span class="module-badge" id="gbh-version-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="gb-version-bar">
|
||
<button class="gb-btn-sm" onclick="gbhSelectAllVersions(true)">全选</button>
|
||
<button class="gb-btn-sm" onclick="gbhSelectAllVersions(false)">全不选</button>
|
||
</div>
|
||
<div id="gbh-version-list" class="gb-version-list">
|
||
<span class="text-muted">加载中...</span>
|
||
</div>
|
||
<div style="margin-top:12px;">
|
||
<button class="gb-btn gb-btn-primary" onclick="gbhCalculate()">计算</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Row 2: 显示维度 + 英雄网格 -->
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">英雄平衡</span>
|
||
<span class="module-badge" id="gbh-total-badge">--</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="gbh-metric-bar" id="gbh-metric-bar">
|
||
<label class="gbh-metric-radio">
|
||
<input type="radio" name="gbh-metric" value="appearRate" checked> 出场率
|
||
</label>
|
||
<label class="gbh-metric-radio">
|
||
<input type="radio" name="gbh-metric" value="avgDamage"> 平均伤害
|
||
</label>
|
||
<label class="gbh-metric-radio">
|
||
<input type="radio" name="gbh-metric" value="avgDeaths"> 平均死亡
|
||
</label>
|
||
</div>
|
||
<div id="gbh-tier-grid" class="gbh-tier-grid">
|
||
<div class="gb-stats-empty">选择版本后点击「计算」</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Row 3: 英雄定价评估 -->
|
||
<div class="module-card gb-module">
|
||
<div class="module-header">
|
||
<span class="module-title">英雄定价评估</span>
|
||
<span class="module-badge" id="gbhp-pricing-badge">未加载</span>
|
||
</div>
|
||
<div class="module-body">
|
||
<div class="gbhp-toolbar">
|
||
<div class="gbhp-model-meta">
|
||
<span id="gbhp-version-info">读取平衡建模最新产出...</span>
|
||
<span id="gbhp-source-info" class="gbhp-source-info"></span>
|
||
</div>
|
||
<div class="gbhp-controls">
|
||
<select id="gbhp-sort" class="gb-filter-select">
|
||
<option value="finalDesc">最终等级高到低</option>
|
||
<option value="finalAsc">最终等级低到高</option>
|
||
<option value="maxDesc">最高价高到低</option>
|
||
<option value="className">职阶 / 英雄名</option>
|
||
<option value="heroName">英雄名</option>
|
||
</select>
|
||
<button class="gb-btn-sm" onclick="gbhpLoadPricing(true)">刷新</button>
|
||
</div>
|
||
</div>
|
||
<div id="gbhp-pricing-table" class="gbhp-pricing-table">
|
||
<div class="gb-stats-empty">正在加载定价模型...</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Sub: 阵营平衡 -->
|
||
<div id="sub-gb-faction" class="sub-panel">
|
||
<div class="gb-placeholder">阵营平衡模块开发中...</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<script src="js/app.js"></script>
|
||
<script src="js/balance.js"></script>
|
||
<script src="js/mechanics.js?v=20260526-1"></script>
|
||
<script src="js/ai_logic.js"></script>
|
||
<script src="js/story.js"></script>
|
||
<script src="js/art.js"></script>
|
||
<script src="js/sentiment.js"></script>
|
||
<script src="js/core_feedback.js"></script>
|
||
<script src="js/official_replies.js"></script>
|
||
<script src="js/raw_feedback.js"></script>
|
||
<script src="js/project.js"></script>
|
||
<script src="js/marketing.js"></script>
|
||
<script src="js/devplan.js"></script>
|
||
<script src="js/version.js"></script>
|
||
<script src="js/bugs.js"></script>
|
||
<script src="js/todos.js"></script>
|
||
<script src="js/suggestions.js"></script>
|
||
<script src="js/codex_threads.js"></script>
|
||
<script src="js/gamebalance.js"></script>
|
||
<script src="js/sns.js"></script>
|
||
<script src="js/community_monitor.js"></script>
|
||
<script src="js/quick_replies.js"></script>
|
||
<script src="js/form_helper.js"></script>
|
||
<script src="js/art_dev.js"></script>
|
||
<script src="js/email_processing.js"></script>
|
||
</body>
|
||
</html>
|