| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922 |
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>简谱渲染引擎重写 - 开发进度仪表板</title>
- <style>
- * {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
- }
- body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- min-height: 100vh;
- padding: 20px;
- }
- .container {
- max-width: 1400px;
- margin: 0 auto;
- background: white;
- border-radius: 20px;
- box-shadow: 0 20px 60px rgba(0,0,0,0.3);
- overflow: hidden;
- }
- .header {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- padding: 40px;
- text-align: center;
- }
- .header h1 {
- font-size: 2.5em;
- margin-bottom: 10px;
- font-weight: 700;
- }
- .header p {
- font-size: 1.2em;
- opacity: 0.9;
- }
- .stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 20px;
- padding: 30px;
- background: #f8f9fa;
- }
- .stat-card {
- background: white;
- padding: 20px;
- border-radius: 12px;
- box-shadow: 0 4px 6px rgba(0,0,0,0.1);
- text-align: center;
- transition: transform 0.3s ease;
- }
- .stat-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 12px rgba(0,0,0,0.15);
- }
- .stat-value {
- font-size: 2.5em;
- font-weight: 700;
- color: #667eea;
- margin-bottom: 5px;
- }
- .stat-label {
- color: #666;
- font-size: 0.9em;
- }
- .main-progress {
- padding: 40px;
- background: white;
- }
- .progress-header {
- margin-bottom: 20px;
- }
- .progress-title {
- font-size: 1.5em;
- color: #333;
- margin-bottom: 10px;
- }
- .progress-bar-container {
- background: #e9ecef;
- height: 40px;
- border-radius: 20px;
- overflow: hidden;
- position: relative;
- margin-bottom: 10px;
- }
- .progress-bar {
- height: 100%;
- background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
- transition: width 0.5s ease;
- display: flex;
- align-items: center;
- justify-content: center;
- color: white;
- font-weight: 600;
- font-size: 1.1em;
- }
- .progress-details {
- display: flex;
- justify-content: space-between;
- color: #666;
- font-size: 0.9em;
- margin-top: 5px;
- }
- .stages {
- padding: 40px;
- background: white;
- }
- .stage {
- margin-bottom: 30px;
- border: 2px solid #e9ecef;
- border-radius: 12px;
- overflow: hidden;
- transition: all 0.3s ease;
- }
- .stage:hover {
- border-color: #667eea;
- box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2);
- }
- .stage-header {
- background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
- padding: 20px;
- cursor: pointer;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .stage-header.completed {
- background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
- }
- .stage-header.in-progress {
- background: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%);
- }
- .stage-info {
- display: flex;
- align-items: center;
- gap: 15px;
- }
- .stage-status {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-weight: bold;
- color: white;
- }
- .status-pending {
- background: #6c757d;
- }
- .status-progress {
- background: #ffc107;
- }
- .status-completed {
- background: #28a745;
- }
- .stage-title {
- font-size: 1.3em;
- font-weight: 600;
- color: #333;
- }
- .stage-meta {
- display: flex;
- gap: 20px;
- align-items: center;
- }
- .stage-progress {
- font-size: 1.2em;
- font-weight: 600;
- color: #667eea;
- }
- .stage-time {
- color: #666;
- font-size: 0.9em;
- }
- .stage-body {
- padding: 20px;
- display: none;
- }
- .stage.expanded .stage-body {
- display: block;
- }
- .task {
- padding: 15px;
- margin-bottom: 10px;
- background: #f8f9fa;
- border-radius: 8px;
- border-left: 4px solid #e9ecef;
- display: flex;
- justify-content: space-between;
- align-items: center;
- transition: all 0.3s ease;
- }
- .task:hover {
- background: #e9ecef;
- transform: translateX(5px);
- }
- .task.completed {
- border-left-color: #28a745;
- background: #d4edda;
- }
- .task.in-progress {
- border-left-color: #ffc107;
- background: #fff3cd;
- }
- .task-info {
- flex: 1;
- }
- .task-title {
- font-weight: 600;
- color: #333;
- margin-bottom: 5px;
- }
- .task-meta {
- font-size: 0.85em;
- color: #666;
- }
- .task-status {
- padding: 6px 12px;
- border-radius: 20px;
- font-size: 0.85em;
- font-weight: 600;
- white-space: nowrap;
- }
- .task-status.completed {
- background: #28a745;
- color: white;
- }
- .task-status.in-progress {
- background: #ffc107;
- color: #333;
- }
- .task-status.pending {
- background: #6c757d;
- color: white;
- }
- .timeline {
- padding: 40px;
- background: #f8f9fa;
- }
- .timeline-title {
- font-size: 1.5em;
- color: #333;
- margin-bottom: 30px;
- text-align: center;
- }
- .timeline-container {
- position: relative;
- padding-left: 40px;
- }
- .timeline-line {
- position: absolute;
- left: 15px;
- top: 0;
- bottom: 0;
- width: 4px;
- background: #dee2e6;
- }
- .timeline-item {
- position: relative;
- margin-bottom: 30px;
- padding-left: 30px;
- }
- .timeline-dot {
- position: absolute;
- left: -33px;
- top: 5px;
- width: 20px;
- height: 20px;
- border-radius: 50%;
- background: white;
- border: 4px solid #6c757d;
- }
- .timeline-dot.completed {
- border-color: #28a745;
- background: #28a745;
- }
- .timeline-dot.in-progress {
- border-color: #ffc107;
- background: #ffc107;
- }
- .timeline-content {
- background: white;
- padding: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
- }
- .timeline-date {
- color: #667eea;
- font-weight: 600;
- margin-bottom: 5px;
- }
- .timeline-text {
- color: #333;
- }
- .footer {
- background: #2c3e50;
- color: white;
- padding: 30px;
- text-align: center;
- }
- .footer-links {
- display: flex;
- justify-content: center;
- gap: 30px;
- margin-top: 15px;
- }
- .footer-link {
- color: #3498db;
- text-decoration: none;
- transition: color 0.3s;
- }
- .footer-link:hover {
- color: #5dade2;
- }
- @media (max-width: 768px) {
- .stats {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .header h1 {
- font-size: 1.8em;
- }
-
- .stage-meta {
- flex-direction: column;
- align-items: flex-start;
- gap: 5px;
- }
- }
- </style>
- </head>
- <body>
- <div class="container">
- <!-- 头部 -->
- <div class="header">
- <h1>🎼 简谱渲染引擎重写</h1>
- <p>开发进度仪表板 - 实时追踪项目状态</p>
- </div>
- <!-- 统计卡片 -->
- <div class="stats">
- <div class="stat-card">
- <div class="stat-value">10%</div>
- <div class="stat-label">总体进度</div>
- </div>
- <div class="stat-card">
- <div class="stat-value">6/60+</div>
- <div class="stat-label">已完成任务</div>
- </div>
- <div class="stat-card">
- <div class="stat-value">10周</div>
- <div class="stat-label">预计周期</div>
- </div>
- <div class="stat-card">
- <div class="stat-value">29</div>
- <div class="stat-label">代码文件</div>
- </div>
- <div class="stat-card">
- <div class="stat-value">9</div>
- <div class="stat-label">文档文件</div>
- </div>
- <div class="stat-card">
- <div class="stat-value">阶段0</div>
- <div class="stat-label">当前阶段</div>
- </div>
- </div>
- <!-- 主进度条 -->
- <div class="main-progress">
- <div class="progress-header">
- <div class="progress-title">📊 整体进度</div>
- </div>
- <div class="progress-bar-container">
- <div class="progress-bar" style="width: 10%;">10%</div>
- </div>
- <div class="progress-details">
- <span>开始日期:2026-01-29</span>
- <span>预计完成:2026-04-09(10周后)</span>
- </div>
- </div>
- <!-- 各阶段详情 -->
- <div class="stages">
- <h2 style="margin-bottom: 30px; color: #333; text-align: center;">📋 开发阶段详情</h2>
- <!-- 阶段0 -->
- <div class="stage expanded">
- <div class="stage-header in-progress" onclick="toggleStage(this)">
- <div class="stage-info">
- <div class="stage-status status-progress">🚧</div>
- <div class="stage-title">阶段0:准备工作</div>
- </div>
- <div class="stage-meta">
- <div class="stage-progress">75%</div>
- <div class="stage-time">第1周</div>
- </div>
- </div>
- <div class="stage-body">
- <div class="task completed">
- <div class="task-info">
- <div class="task-title">✅ 任务0.1:创建项目目录结构</div>
- <div class="task-meta">完成时间:0.5天 | 29个代码文件</div>
- </div>
- <div class="task-status completed">已完成</div>
- </div>
- <div class="task completed">
- <div class="task-info">
- <div class="task-title">✅ 任务0.2:定义核心数据模型</div>
- <div class="task-meta">完成时间:1天 | 5个模型文件,300+行</div>
- </div>
- <div class="task-status completed">已完成</div>
- </div>
- <div class="task in-progress">
- <div class="task-info">
- <div class="task-title">🚧 任务0.3:创建测试数据和环境</div>
- <div class="task-meta">预计时间:0.5天 | 准备5个测试XML文件</div>
- </div>
- <div class="task-status in-progress">进行中</div>
- </div>
- <div class="task completed">
- <div class="task-info">
- <div class="task-title">✅ 任务0.4:创建核心模块框架</div>
- <div class="task-meta">完成时间:1天 | 15个模块文件</div>
- </div>
- <div class="task-status completed">已完成</div>
- </div>
- <div class="task completed">
- <div class="task-info">
- <div class="task-title">✅ 文档体系建立</div>
- <div class="task-meta">完成时间:2天 | 9个文档,2000+行</div>
- </div>
- <div class="task-status completed">已完成</div>
- </div>
- </div>
- </div>
- <!-- 阶段0.5 -->
- <div class="stage">
- <div class="stage-header" onclick="toggleStage(this)">
- <div class="stage-info">
- <div class="stage-status status-pending">⏸️</div>
- <div class="stage-title">阶段0.5:规范文档编写 ⭐新增</div>
- </div>
- <div class="stage-meta">
- <div class="stage-progress">0%</div>
- <div class="stage-time">第2周</div>
- </div>
- </div>
- <div class="stage-body">
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">📝 任务0.5.1:MusicXML元素映射规范</div>
- <div class="task-meta">预计时间:2天 | divisions、音高、时值转换规则</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">📝 任务0.5.2:简谱渲染规范</div>
- <div class="task-meta">预计时间:1天 | 增时线、减时线详细规则</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">📝 任务0.5.3:VexFlow兼容性规范</div>
- <div class="task-meta">预计时间:1.5天 | DOM结构、state.times字段清单</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">📝 任务0.5.4:创建测试基准数据</div>
- <div class="task-meta">预计时间:1.5天 | 使用旧引擎生成对比基准</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- </div>
- </div>
- <!-- 阶段1 -->
- <div class="stage">
- <div class="stage-header" onclick="toggleStage(this)">
- <div class="stage-info">
- <div class="stage-status status-pending">⏸️</div>
- <div class="stage-title">阶段1:核心解析器</div>
- </div>
- <div class="stage-meta">
- <div class="stage-progress">0%</div>
- <div class="stage-time">第3周</div>
- </div>
- </div>
- <div class="stage-body">
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🔧 任务1.0:Divisions处理器 ⭐新增</div>
- <div class="task-meta">预计时间:0.5天 | MusicXML时值基础</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🔧 任务1.1:OSMD数据解析器</div>
- <div class="task-meta">预计时间:3天 | 解析小节、音符、歌词</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🔧 任务1.2:时间计算器</div>
- <div class="task-meta">预计时间:1天 | 计算音符播放时间</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- </div>
- </div>
- <!-- 阶段2 -->
- <div class="stage">
- <div class="stage-header" onclick="toggleStage(this)">
- <div class="stage-info">
- <div class="stage-status status-pending">⏸️</div>
- <div class="stage-title">阶段2:布局引擎</div>
- </div>
- <div class="stage-meta">
- <div class="stage-progress">0%</div>
- <div class="stage-time">第4-5周</div>
- </div>
- </div>
- <div class="stage-body">
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">📐 任务2.1:小节布局计算器</div>
- <div class="task-meta">预计时间:3天 | 固定时间比例算法</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">📐 任务2.2:多声部对齐</div>
- <div class="task-meta">预计时间:2天 | 垂直对齐算法</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">📐 任务2.3:行布局和自动换行</div>
- <div class="task-meta">预计时间:2天 | 系统布局</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- </div>
- </div>
- <!-- 阶段3 -->
- <div class="stage">
- <div class="stage-header" onclick="toggleStage(this)">
- <div class="stage-info">
- <div class="stage-status status-pending">⏸️</div>
- <div class="stage-title">阶段3:绘制引擎</div>
- </div>
- <div class="stage-meta">
- <div class="stage-progress">0%</div>
- <div class="stage-time">第6-7周</div>
- </div>
- </div>
- <div class="stage-body">
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🎨 任务3.1:基础音符绘制</div>
- <div class="task-meta">预计时间:3天 | 数字、高低音点、附点、升降号</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🎨 任务3.2:线条绘制 ⭐已细化</div>
- <div class="task-meta">预计时间:2.5天 | 增时线、减时线算法</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🎨 任务3.3:歌词绘制</div>
- <div class="task-meta">预计时间:1天 | 歌词位置和样式</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- </div>
- </div>
- <!-- 阶段4 -->
- <div class="stage">
- <div class="stage-header" onclick="toggleStage(this)">
- <div class="stage-info">
- <div class="stage-status status-pending">⏸️</div>
- <div class="stage-title">阶段4:兼容层实现</div>
- </div>
- <div class="stage-meta">
- <div class="stage-progress">0%</div>
- <div class="stage-time">第8周</div>
- </div>
- </div>
- <div class="stage-body">
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🔗 任务4.0:state.times字段文档 ⭐新增</div>
- <div class="task-meta">预计时间:1天 | 30-40个字段完整清单</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🔗 任务4.1:OSMD兼容适配器</div>
- <div class="task-meta">预计时间:3天 | 数据和接口适配</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🔗 任务4.2:业务层集成</div>
- <div class="task-meta">预计时间:1天 | 引擎切换逻辑</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- </div>
- </div>
- <!-- 阶段5 -->
- <div class="stage">
- <div class="stage-header" onclick="toggleStage(this)">
- <div class="stage-info">
- <div class="stage-status status-pending">⏸️</div>
- <div class="stage-title">阶段5:测试与优化</div>
- </div>
- <div class="stage-meta">
- <div class="stage-progress">0%</div>
- <div class="stage-time">第9-10周</div>
- </div>
- </div>
- <div class="stage-body">
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🧪 任务5.1:功能完整性测试</div>
- <div class="task-meta">预计时间:2天 | 所有功能测试</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🧪 任务5.2:兼容性测试</div>
- <div class="task-meta">预计时间:2天 | 多浏览器、多场景</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- <div class="task pending">
- <div class="task-info">
- <div class="task-title">🚀 任务5.3:性能优化</div>
- <div class="task-meta">预计时间:2天 | 渲染性能提升</div>
- </div>
- <div class="task-status pending">待开始</div>
- </div>
- </div>
- </div>
- </div>
- <!-- 时间线 -->
- <div class="timeline">
- <h2 class="timeline-title">⏱️ 开发时间线</h2>
- <div class="timeline-container">
- <div class="timeline-line"></div>
-
- <div class="timeline-item">
- <div class="timeline-dot completed"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-01-29 ✅</div>
- <div class="timeline-text">
- <strong>项目启动</strong><br>
- 创建项目结构、数据模型、文档体系
- </div>
- </div>
- </div>
- <div class="timeline-item">
- <div class="timeline-dot in-progress"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-02-05 🚧</div>
- <div class="timeline-text">
- <strong>Checkpoint 0:阶段0完成</strong><br>
- 测试环境准备完成,进入规范文档编写
- </div>
- </div>
- </div>
- <div class="timeline-item">
- <div class="timeline-dot"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-02-12 ⏸️</div>
- <div class="timeline-text">
- <strong>Checkpoint 0.5:规范文档完成</strong><br>
- MusicXML映射、渲染规范、兼容性规范全部完成
- </div>
- </div>
- </div>
- <div class="timeline-item">
- <div class="timeline-dot"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-02-19 ⏸️</div>
- <div class="timeline-text">
- <strong>Checkpoint 1:核心解析器完成</strong><br>
- OSMD数据解析、时间计算全部完成
- </div>
- </div>
- </div>
- <div class="timeline-item">
- <div class="timeline-dot"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-03-05 ⏸️</div>
- <div class="timeline-text">
- <strong>Checkpoint 2:布局引擎完成</strong><br>
- 小节布局、多声部对齐、自动换行全部完成
- </div>
- </div>
- </div>
- <div class="timeline-item">
- <div class="timeline-dot"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-03-19 ⏸️</div>
- <div class="timeline-text">
- <strong>Checkpoint 3:绘制引擎完成</strong><br>
- 音符、线条、歌词绘制全部完成
- </div>
- </div>
- </div>
- <div class="timeline-item">
- <div class="timeline-dot"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-03-26 ⏸️</div>
- <div class="timeline-text">
- <strong>Checkpoint 4:兼容层完成</strong><br>
- 业务功能全部兼容,可以切换使用
- </div>
- </div>
- </div>
- <div class="timeline-item">
- <div class="timeline-dot"></div>
- <div class="timeline-content">
- <div class="timeline-date">2026-04-09 🎯</div>
- <div class="timeline-text">
- <strong>Checkpoint 5:项目完成!</strong><br>
- 测试通过,性能优化完成,准备上线
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- 页脚 -->
- <div class="footer">
- <p>简谱渲染引擎重写项目 © 2026</p>
- <div class="footer-links">
- <a href="./00-START_HERE.md" class="footer-link">📖 开始指南</a>
- <a href="./01-TASKS_CHECKLIST.md" class="footer-link">📋 任务清单</a>
- <a href="./02-PROGRESS.md" class="footer-link">📊 进度追踪</a>
- <a href="./03-MUSICXML_KNOWLEDGE.md" class="footer-link">📚 知识文档</a>
- </div>
- <p style="margin-top: 15px; font-size: 0.9em; opacity: 0.8;">
- 最后更新:2026-01-29 | 下次更新:完成任务0.3后
- </p>
- </div>
- </div>
- <script>
- // 切换阶段展开/折叠
- function toggleStage(header) {
- const stage = header.parentElement;
- stage.classList.toggle('expanded');
- }
- // 默认展开当前阶段
- document.addEventListener('DOMContentLoaded', function() {
- // 展开第一个阶段(阶段0)
- const firstStage = document.querySelector('.stage');
- if (firstStage) {
- firstStage.classList.add('expanded');
- }
- });
- // 更新进度百分比(可以通过JavaScript动态更新)
- function updateProgress(stageIndex, progress) {
- const stages = document.querySelectorAll('.stage');
- if (stages[stageIndex]) {
- const progressEl = stages[stageIndex].querySelector('.stage-progress');
- progressEl.textContent = progress + '%';
-
- // 更新状态图标
- const statusEl = stages[stageIndex].querySelector('.stage-status');
- const headerEl = stages[stageIndex].querySelector('.stage-header');
-
- if (progress === 100) {
- statusEl.textContent = '✅';
- statusEl.className = 'stage-status status-completed';
- headerEl.classList.remove('in-progress');
- headerEl.classList.add('completed');
- } else if (progress > 0) {
- statusEl.textContent = '🚧';
- statusEl.className = 'stage-status status-progress';
- headerEl.classList.add('in-progress');
- } else {
- statusEl.textContent = '⏸️';
- statusEl.className = 'stage-status status-pending';
- }
- }
-
- // 更新主进度条
- updateMainProgress();
- }
- // 更新主进度条
- function updateMainProgress() {
- const totalTasks = 60; // 总任务数
- const completedTasks = 6; // 已完成任务数
- const progress = Math.round((completedTasks / totalTasks) * 100);
-
- const progressBar = document.querySelector('.progress-bar');
- progressBar.style.width = progress + '%';
- progressBar.textContent = progress + '%';
-
- document.querySelector('.stat-value').textContent = progress + '%';
- }
- // 添加快捷键支持
- document.addEventListener('keydown', function(e) {
- // 按'e'键展开所有阶段
- if (e.key === 'e') {
- document.querySelectorAll('.stage').forEach(stage => {
- stage.classList.add('expanded');
- });
- }
- // 按'c'键折叠所有阶段
- if (e.key === 'c') {
- document.querySelectorAll('.stage').forEach(stage => {
- stage.classList.remove('expanded');
- });
- }
- });
- console.log('💡 提示:按 E 键展开所有阶段,按 C 键折叠所有阶段');
- </script>
- </body>
- </html>
|