diff --git a/frontend/index.html b/frontend/index.html
index 9456db6..07f9e10 100755
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -34,25 +34,55 @@
}
.stats {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: white;
- padding: 20px;
+ padding: 15px;
border-radius: 10px;
text-align: center;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.stat-card h3 {
color: #667eea;
- font-size: 2em;
+ font-size: 1.8em;
margin-bottom: 5px;
}
.stat-card p {
color: #666;
+ font-size: 0.9em;
}
+
+ /* Tab 切换 */
+ .tabs {
+ display: flex;
+ gap: 10px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+ }
+ .tab-btn {
+ padding: 12px 24px;
+ background: white;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 1em;
+ font-weight: 500;
+ color: #666;
+ transition: all 0.3s;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+ }
+ .tab-btn:hover {
+ background: #f8f9fa;
+ transform: translateY(-2px);
+ }
+ .tab-btn.active {
+ background: linear-gradient(135deg, #667eea, #764ba2);
+ color: white;
+ }
+
.section-box {
background: white;
border-radius: 10px;
@@ -66,17 +96,155 @@
padding-bottom: 10px;
border-bottom: 2px solid #667eea;
}
- .diary-item {
+
+ /* 日历组件 */
+ .calendar-wrapper {
+ display: flex;
+ gap: 20px;
+ flex-wrap: wrap;
+ }
+ .calendar {
+ flex: 0 0 300px;
+ background: #f8f9fa;
+ padding: 15px;
+ border-radius: 8px;
+ }
+ .calendar-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 15px;
+ }
+ .calendar-header button {
+ background: #667eea;
+ color: white;
+ border: none;
+ padding: 5px 10px;
+ border-radius: 5px;
+ cursor: pointer;
+ }
+ .calendar-header button:hover {
+ background: #5568d3;
+ }
+ .calendar-grid {
+ display: grid;
+ grid-template-columns: repeat(7, 1fr);
+ gap: 2px;
+ }
+ .calendar-day-header {
+ text-align: center;
+ font-size: 0.75em;
+ color: #666;
+ padding: 5px;
+ }
+ .calendar-day {
+ aspect-ratio: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.85em;
+ border-radius: 5px;
+ cursor: pointer;
+ transition: all 0.2s;
+ }
+ .calendar-day:hover {
+ background: #e0e7ff;
+ }
+ .calendar-day.selected {
+ background: #667eea;
+ color: white;
+ }
+ .calendar-day.today {
+ border: 2px solid #667eea;
+ font-weight: bold;
+ }
+ .calendar-day.has-data {
+ position: relative;
+ }
+ .calendar-day.has-data::after {
+ content: '';
+ position: absolute;
+ bottom: 2px;
+ width: 6px;
+ height: 6px;
+ background: #10b981;
+ border-radius: 50%;
+ }
+ .calendar-day.empty {
+ cursor: default;
+ }
+
+ /* 内容区域 */
+ .content-area {
+ flex: 1;
+ min-width: 0;
+ }
+
+ .task-item, .diary-item {
padding: 15px;
border-left: 4px solid #667eea;
background: #f8f9fa;
margin-bottom: 15px;
border-radius: 5px;
+ cursor: pointer;
+ transition: all 0.2s;
}
- .diary-item h3 {
- color: #333;
+ .task-item:hover, .diary-item:hover {
+ transform: translateX(5px);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
+ }
+ .task-item.status-pending { border-left-color: #6b7280; }
+ .task-item.status-in_progress { border-left-color: #3b82f6; }
+ .task-item.status-blocked { border-left-color: #f59e0b; }
+ .task-item.status-completed { border-left-color: #10b981; }
+ .task-item.status-cancelled { border-left-color: #ef4444; opacity: 0.6; }
+
+ .task-item .header, .diary-item .header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
margin-bottom: 10px;
}
+ .task-item .title, .diary-item .title {
+ font-weight: bold;
+ color: #333;
+ font-size: 1.1em;
+ }
+ .task-item .status {
+ padding: 4px 12px;
+ border-radius: 20px;
+ font-size: 0.85em;
+ color: white;
+ }
+ .status-pending .status { background: #6b7280; }
+ .status-in_progress .status { background: #3b82f6; }
+ .status-blocked .status { background: #f59e0b; }
+ .status-completed .status { background: #10b981; }
+ .status-cancelled .status { background: #ef4444; }
+
+ .task-item .priority {
+ font-size: 0.8em;
+ color: #666;
+ margin-bottom: 8px;
+ }
+ .task-item .progress-bar {
+ height: 8px;
+ background: #e5e7eb;
+ border-radius: 4px;
+ overflow: hidden;
+ margin: 10px 0;
+ }
+ .task-item .progress-fill {
+ height: 100%;
+ background: linear-gradient(90deg, #667eea, #764ba2);
+ transition: width 0.3s;
+ }
+ .task-item .progress-text {
+ font-size: 0.85em;
+ color: #666;
+ text-align: right;
+ }
+
.diary-item .date {
color: #667eea;
font-weight: bold;
@@ -94,6 +262,52 @@
margin-left: 20px;
white-space: pre-wrap;
}
+
+ /* 任务详情 */
+ .task-detail {
+ background: #f8f9fa;
+ padding: 20px;
+ border-radius: 8px;
+ margin-top: 20px;
+ }
+ .task-detail h3 {
+ color: #333;
+ margin-bottom: 15px;
+ }
+ .task-detail .meta {
+ display: flex;
+ gap: 20px;
+ margin-bottom: 15px;
+ flex-wrap: wrap;
+ }
+ .task-detail .meta-item {
+ background: white;
+ padding: 8px 15px;
+ border-radius: 5px;
+ font-size: 0.9em;
+ }
+ .task-detail .description {
+ margin-bottom: 15px;
+ white-space: pre-wrap;
+ color: #666;
+ }
+ .task-detail .progress-notes {
+ background: #fffbeb;
+ padding: 15px;
+ border-radius: 5px;
+ margin-top: 15px;
+ }
+ .task-detail .progress-notes h4 {
+ color: #92400e;
+ margin-bottom: 10px;
+ }
+ .task-detail .progress-notes .note {
+ font-size: 0.85em;
+ color: #666;
+ padding: 8px 0;
+ border-bottom: 1px solid #f3e5d5;
+ }
+
.experience-item {
padding: 15px;
border-left: 4px solid #f59e0b;
@@ -119,7 +333,7 @@
border-radius: 20px;
font-size: 0.85em;
}
- .experience-item .problem {
+ .experience-item .problem, .experience-item .solution, .experience-item .lesson {
margin: 10px 0;
}
.experience-item .problem-title {
@@ -127,16 +341,12 @@
color: #dc2626;
margin-bottom: 5px;
}
- .experience-item .solution {
- margin: 10px 0;
- }
.experience-item .solution-title {
font-weight: bold;
color: #059669;
margin-bottom: 5px;
}
.experience-item .lesson {
- margin: 10px 0;
padding: 10px;
background: #fef3c7;
border-radius: 5px;
@@ -146,6 +356,7 @@
color: #92400e;
margin-bottom: 5px;
}
+
.loading {
text-align: center;
padding: 40px;
@@ -159,92 +370,24 @@
border-radius: 10px;
margin-bottom: 20px;
}
- .emoji {
- font-size: 1.2em;
+ .empty-state {
+ text-align: center;
+ padding: 40px;
+ color: #666;
}
+
.grid-2 {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));
- gap: 30px;
- }
- .grid-3 {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+ grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
gap: 30px;
}
@media (max-width: 768px) {
- .grid-2, .grid-3 {
+ .grid-2, .calendar-wrapper {
grid-template-columns: 1fr;
}
- }
- .task-item {
- padding: 15px;
- border-left: 4px solid #667eea;
- background: #f8f9fa;
- margin-bottom: 15px;
- border-radius: 5px;
- }
- .task-item.status-pending { border-left-color: #6b7280; }
- .task-item.status-in_progress { border-left-color: #3b82f6; }
- .task-item.status-blocked { border-left-color: #f59e0b; }
- .task-item.status-completed { border-left-color: #10b981; }
- .task-item.status-cancelled { border-left-color: #ef4444; opacity: 0.6; }
- .task-item .header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 10px;
- }
- .task-item .title {
- font-weight: bold;
- color: #333;
- font-size: 1.1em;
- }
- .task-item .status {
- padding: 4px 12px;
- border-radius: 20px;
- font-size: 0.85em;
- color: white;
- }
- .status-pending .status { background: #6b7280; }
- .status-in_progress .status { background: #3b82f6; }
- .status-blocked .status { background: #f59e0b; }
- .status-completed .status { background: #10b981; }
- .status-cancelled .status { background: #ef4444; }
- .task-item .priority {
- font-size: 0.8em;
- color: #666;
- margin-bottom: 8px;
- }
- .task-item .progress-bar {
- height: 8px;
- background: #e5e7eb;
- border-radius: 4px;
- overflow: hidden;
- margin: 10px 0;
- }
- .task-item .progress-fill {
- height: 100%;
- background: linear-gradient(90deg, #667eea, #764ba2);
- transition: width 0.3s;
- }
- .task-item .progress-text {
- font-size: 0.85em;
- color: #666;
- text-align: right;
- }
- .task-item .description {
- color: #666;
- margin: 10px 0;
- white-space: pre-wrap;
- }
- .task-item .progress-notes {
- background: #fef3c7;
- padding: 10px;
- border-radius: 5px;
- font-size: 0.85em;
- color: #92400e;
- white-space: pre-wrap;
+ .calendar {
+ flex: 1;
+ }
}
@@ -262,26 +405,37 @@