feat: add visual task board HTML
CI - Continuous Integration / Run Tests (push) Failing after 0s
CI - Continuous Integration / Security Scan (push) Failing after 1s
CI - Continuous Integration / Build and Verify (push) Has been skipped
Complete CI/CD Pipeline / Code Quality & Security (push) Failing after 0s
Security Scanning / SAST (Bandit + Semgrep) (push) Failing after 1s
Complete CI/CD Pipeline / Run Tests (push) Has been skipped
Complete CI/CD Pipeline / Build Docker Image (push) Has been skipped
Complete CI/CD Pipeline / Container Security Scan (push) Has been skipped
Complete CI/CD Pipeline / Deploy to Development (GitOps) (push) Has been skipped
Complete CI/CD Pipeline / Deploy to Production (GitOps) (push) Has been skipped
Complete CI/CD Pipeline / Post-deployment Verification (push) Failing after 0s
Complete CI/CD Pipeline / Notify Results (push) Successful in 0s
Security Scanning / Container Scanning (push) Failing after 0s
Security Scanning / Secret Scanning (push) Failing after 0s
Security Scanning / Dependency Scanning (Safety + Trivy) (push) Failing after 3s
Security Scanning / License Compliance (push) Failing after 3s
Test Matrix / Security Scan (push) Failing after 2s
Security Scanning / Security Summary (push) Failing after 1s
TODO to Issue / Create Issues from TODOs (push) Failing after 0s
Test Matrix / Lint (push) Failing after 18s
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (macos-latest, 3.11, unit) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.10, integration) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.10, unit) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.11, integration) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.11, unit) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.12, integration) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.12, unit) (push) Has been skipped
Test Matrix / E2E Tests (push) Has been skipped
Test Matrix / Coverage Summary (push) Has been skipped
Test Matrix / Build Docker Image (push) Has been skipped
Test Matrix / All Tests Passed (push) Failing after 0s
CI - Continuous Integration / Run Tests (push) Failing after 0s
CI - Continuous Integration / Security Scan (push) Failing after 1s
CI - Continuous Integration / Build and Verify (push) Has been skipped
Complete CI/CD Pipeline / Code Quality & Security (push) Failing after 0s
Security Scanning / SAST (Bandit + Semgrep) (push) Failing after 1s
Complete CI/CD Pipeline / Run Tests (push) Has been skipped
Complete CI/CD Pipeline / Build Docker Image (push) Has been skipped
Complete CI/CD Pipeline / Container Security Scan (push) Has been skipped
Complete CI/CD Pipeline / Deploy to Development (GitOps) (push) Has been skipped
Complete CI/CD Pipeline / Deploy to Production (GitOps) (push) Has been skipped
Complete CI/CD Pipeline / Post-deployment Verification (push) Failing after 0s
Complete CI/CD Pipeline / Notify Results (push) Successful in 0s
Security Scanning / Container Scanning (push) Failing after 0s
Security Scanning / Secret Scanning (push) Failing after 0s
Security Scanning / Dependency Scanning (Safety + Trivy) (push) Failing after 3s
Security Scanning / License Compliance (push) Failing after 3s
Test Matrix / Security Scan (push) Failing after 2s
Security Scanning / Security Summary (push) Failing after 1s
TODO to Issue / Create Issues from TODOs (push) Failing after 0s
Test Matrix / Lint (push) Failing after 18s
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (macos-latest, 3.11, unit) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.10, integration) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.10, unit) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.11, integration) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.11, unit) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.12, integration) (push) Has been skipped
Test Matrix / Test (${{ matrix.python-version }}, ${{ matrix.test-type }}) (ubuntu-latest, 3.12, unit) (push) Has been skipped
Test Matrix / E2E Tests (push) Has been skipped
Test Matrix / Coverage Summary (push) Has been skipped
Test Matrix / Build Docker Image (push) Has been skipped
Test Matrix / All Tests Passed (push) Failing after 0s
- Interactive Kanban board for task tracking - Beautiful gradient design with animations - 3 columns: Todo (6), In Progress (0), Done (3) - Click cards to view GitHub Issues - Progress bar showing 33% completion - Responsive layout for mobile/desktop - Color-coded priorities Can be opened locally: open task-board.html 🤖 Generated with Claude Code Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
This commit is contained in:
+536
@@ -0,0 +1,536 @@
|
||||
<!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", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
padding: 20px;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.header {
|
||||
text-align: center;
|
||||
color: white;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
font-size: 2.5em;
|
||||
margin-bottom: 10px;
|
||||
text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.header .subtitle {
|
||||
font-size: 1.2em;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.stats {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
margin-bottom: 30px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.stat-card {
|
||||
background: white;
|
||||
padding: 20px 30px;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.stat-card .number {
|
||||
font-size: 2.5em;
|
||||
font-weight: bold;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.stat-card .label {
|
||||
font-size: 0.9em;
|
||||
color: #666;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.board {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
|
||||
gap: 20px;
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.column {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
border-radius: 10px;
|
||||
padding: 20px;
|
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.column-header {
|
||||
font-size: 1.3em;
|
||||
font-weight: bold;
|
||||
margin-bottom: 15px;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 3px solid;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.column-header .count {
|
||||
font-size: 0.8em;
|
||||
background: #f0f0f0;
|
||||
padding: 3px 10px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.column.todo .column-header {
|
||||
border-color: #fbbf24;
|
||||
color: #f59e0b;
|
||||
}
|
||||
|
||||
.column.in-progress .column-header {
|
||||
border-color: #60a5fa;
|
||||
color: #3b82f6;
|
||||
}
|
||||
|
||||
.column.done .column-header {
|
||||
border-color: #34d399;
|
||||
color: #10b981;
|
||||
}
|
||||
|
||||
.task-card {
|
||||
background: white;
|
||||
border: 2px solid #e5e7eb;
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin-bottom: 12px;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.task-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.task-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.task-number {
|
||||
font-size: 0.9em;
|
||||
font-weight: bold;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.task-priority {
|
||||
font-size: 0.75em;
|
||||
padding: 3px 8px;
|
||||
border-radius: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.priority-critical {
|
||||
background: #fee2e2;
|
||||
color: #dc2626;
|
||||
}
|
||||
|
||||
.priority-high {
|
||||
background: #fef3c7;
|
||||
color: #d97706;
|
||||
}
|
||||
|
||||
.priority-medium {
|
||||
background: #dbeafe;
|
||||
color: #2563eb;
|
||||
}
|
||||
|
||||
.priority-low {
|
||||
background: #e5e7eb;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
.task-title {
|
||||
font-weight: 600;
|
||||
color: #1f2937;
|
||||
margin-bottom: 8px;
|
||||
font-size: 0.95em;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.task-meta {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
font-size: 0.8em;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
.task-meta span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.task-link {
|
||||
text-align: center;
|
||||
margin-top: 10px;
|
||||
padding-top: 10px;
|
||||
border-top: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
.task-link a {
|
||||
color: #667eea;
|
||||
text-decoration: none;
|
||||
font-size: 0.85em;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.task-link a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
background: #e5e7eb;
|
||||
border-radius: 15px;
|
||||
overflow: hidden;
|
||||
margin: 20px 0;
|
||||
box-shadow: inset 0 2px 4px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #10b981 0%, #34d399 100%);
|
||||
transition: width 0.5s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.legend {
|
||||
background: white;
|
||||
padding: 15px 20px;
|
||||
border-radius: 8px;
|
||||
margin-top: 20px;
|
||||
max-width: 1400px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.legend h3 {
|
||||
margin-bottom: 10px;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
.legend-items {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.legend-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.legend-color {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.board {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
.stats {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>📊 留守儿童心理风险检测平台</h1>
|
||||
<div class="subtitle">开发任务看板 - Phase 2</div>
|
||||
</div>
|
||||
|
||||
<div class="stats">
|
||||
<div class="stat-card">
|
||||
<div class="number">9</div>
|
||||
<div class="label">总任务数</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="number" style="color: #10b981;">3</div>
|
||||
<div class="label">已完成</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="number" style="color: #3b82f6;">0</div>
|
||||
<div class="label">进行中</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="number" style="color: #f59e0b;">6</div>
|
||||
<div class="label">待开始</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="progress-bar">
|
||||
<div class="progress-fill" style="width: 33%;">33% 完成</div>
|
||||
</div>
|
||||
|
||||
<div class="board">
|
||||
<!-- Todo Column -->
|
||||
<div class="column todo">
|
||||
<div class="column-header">
|
||||
<span>📋 待办 (Todo)</span>
|
||||
<span class="count">6</span>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">#37</span>
|
||||
<span class="task-priority priority-critical">🔴 Critical</span>
|
||||
</div>
|
||||
<div class="task-title">Complete test coverage: risk assessments endpoints</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ 4-6h</span>
|
||||
<span>🧪 Testing</span>
|
||||
</div>
|
||||
<div class="task-link">
|
||||
<a href="https://github.com/BrunoGaoSZ/ljwx-children/issues/37" target="_blank">
|
||||
查看详情 →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">#38</span>
|
||||
<span class="task-priority priority-low">⚪ Low</span>
|
||||
</div>
|
||||
<div class="task-title">Complete test coverage: data collection endpoints</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ 4-6h</span>
|
||||
<span>🧪 Testing</span>
|
||||
</div>
|
||||
<div class="task-link">
|
||||
<a href="https://github.com/BrunoGaoSZ/ljwx-children/issues/38" target="_blank">
|
||||
查看详情 →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">#39</span>
|
||||
<span class="task-priority priority-medium">🟠 Medium</span>
|
||||
</div>
|
||||
<div class="task-title">Implement resource library endpoints</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ 4-6h</span>
|
||||
<span>📡 API</span>
|
||||
</div>
|
||||
<div class="task-link">
|
||||
<a href="https://github.com/BrunoGaoSZ/ljwx-children/issues/39" target="_blank">
|
||||
查看详情 →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">#40</span>
|
||||
<span class="task-priority priority-medium">🟠 Medium</span>
|
||||
</div>
|
||||
<div class="task-title">Implement communication endpoints</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ 6-8h</span>
|
||||
<span>📡 API</span>
|
||||
</div>
|
||||
<div class="task-link">
|
||||
<a href="https://github.com/BrunoGaoSZ/ljwx-children/issues/40" target="_blank">
|
||||
查看详情 →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">#41</span>
|
||||
<span class="task-priority priority-low">⚪ Low-Medium</span>
|
||||
</div>
|
||||
<div class="task-title">Implement analytics dashboard endpoints</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ 6-8h</span>
|
||||
<span>📊 Analytics</span>
|
||||
</div>
|
||||
<div class="task-link">
|
||||
<a href="https://github.com/BrunoGaoSZ/ljwx-children/issues/41" target="_blank">
|
||||
查看详情 →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">#42</span>
|
||||
<span class="task-priority priority-high">🟡 High</span>
|
||||
</div>
|
||||
<div class="task-title">Deploy to OrbStack for local testing</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ 4-6h</span>
|
||||
<span>🚀 DevOps</span>
|
||||
</div>
|
||||
<div class="task-link">
|
||||
<a href="https://github.com/BrunoGaoSZ/ljwx-children/issues/42" target="_blank">
|
||||
查看详情 →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- In Progress Column -->
|
||||
<div class="column in-progress">
|
||||
<div class="column-header">
|
||||
<span>🚧 进行中 (In Progress)</span>
|
||||
<span class="count">0</span>
|
||||
</div>
|
||||
<div style="text-align: center; color: #9ca3af; padding: 40px 20px;">
|
||||
<p>暂无进行中的任务</p>
|
||||
<p style="font-size: 0.9em; margin-top: 10px;">从待办列表中选择一个任务开始吧!</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Done Column -->
|
||||
<div class="column done">
|
||||
<div class="column-header">
|
||||
<span>✅ 已完成 (Done)</span>
|
||||
<span class="count">3</span>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">Task-001</span>
|
||||
<span class="task-priority priority-critical">🔴 Critical</span>
|
||||
</div>
|
||||
<div class="task-title">Database Migration (Alembic)</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ Completed</span>
|
||||
<span>🗄️ Database</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">Task-002</span>
|
||||
<span class="task-priority priority-high">🟡 High</span>
|
||||
</div>
|
||||
<div class="task-title">Redis Token Blacklist</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ Completed</span>
|
||||
<span>🔐 Auth</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="task-card">
|
||||
<div class="task-header">
|
||||
<span class="task-number">Task-003</span>
|
||||
<span class="task-priority priority-critical">🔴 Critical</span>
|
||||
</div>
|
||||
<div class="task-title">Ollama AI Integration (lingjingwanxiang:32b)</div>
|
||||
<div class="task-meta">
|
||||
<span>⏱️ Completed</span>
|
||||
<span>🤖 AI/ML</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="legend">
|
||||
<h3>🎨 图例说明</h3>
|
||||
<div class="legend-items">
|
||||
<div class="legend-item">
|
||||
<div class="legend-color" style="background: #fee2e2;"></div>
|
||||
<span>Critical Priority - 需要立即处理</span>
|
||||
</div>
|
||||
<div class="legend-item">
|
||||
<div class="legend-color" style="background: #fef3c7;"></div>
|
||||
<span>High Priority - 高优先级</span>
|
||||
</div>
|
||||
<div class="legend-item">
|
||||
<div class="legend-color" style="background: #dbeafe;"></div>
|
||||
<span>Medium Priority - 中等优先级</span>
|
||||
</div>
|
||||
<div class="legend-item">
|
||||
<div class="legend-color" style="background: #e5e7eb;"></div>
|
||||
<span>Low Priority - 低优先级</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="text-align: center; color: white; margin-top: 30px; opacity: 0.8;">
|
||||
<p>📅 最后更新: 2026-01-01</p>
|
||||
<p style="margin-top: 5px;">
|
||||
<a href="https://github.com/BrunoGaoSZ/ljwx-children" target="_blank" style="color: white;">
|
||||
🔗 GitHub Repository
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 添加点击任务卡片跳转到 GitHub Issue 的功能
|
||||
document.querySelectorAll('.task-card').forEach(card => {
|
||||
card.addEventListener('click', function() {
|
||||
const link = this.querySelector('.task-link a');
|
||||
if (link) {
|
||||
window.open(link.href, '_blank');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 动画效果
|
||||
window.addEventListener('load', () => {
|
||||
const cards = document.querySelectorAll('.task-card');
|
||||
cards.forEach((card, index) => {
|
||||
setTimeout(() => {
|
||||
card.style.opacity = '0';
|
||||
card.style.transform = 'translateY(20px)';
|
||||
setTimeout(() => {
|
||||
card.style.transition = 'all 0.5s ease';
|
||||
card.style.opacity = '1';
|
||||
card.style.transform = 'translateY(0)';
|
||||
}, 50);
|
||||
}, index * 100);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user