From ed472869554fbf09f905cbaa117e2daab0b4fa35 Mon Sep 17 00:00:00 2001 From: yuliang_guo Date: Tue, 3 Feb 2026 16:38:45 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E9=99=AA=E7=BB=83?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E9=A1=B5=E9=9D=A2UI=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 统计卡片改用 el-statistic 组件,与错题分析保持一致 - 搜索框改为圆角胶囊形状,添加 hover 聚焦效果 - 下拉选择框使用统一的圆角灰底设计,添加 emoji 图标前缀 - 筛选标签改为胶囊形状 - 重置按钮仅在有筛选条件时显示 - 添加表格行悬浮效果和操作按钮悬浮样式 - 优化响应式布局 Co-authored-by: Cursor --- .../src/views/trainee/practice-records.vue | 428 ++++++++++++------ 1 file changed, 280 insertions(+), 148 deletions(-) diff --git a/frontend/src/views/trainee/practice-records.vue b/frontend/src/views/trainee/practice-records.vue index 3da85e7..a26ea4a 100644 --- a/frontend/src/views/trainee/practice-records.vue +++ b/frontend/src/views/trainee/practice-records.vue @@ -2,118 +2,134 @@
-
-
-
- - - -
-
-
{{ stat.value }}
-
{{ stat.label }}
-
- - {{ Math.abs(stat.trend) }}% -
-
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
- +
- - +
+ + + + +
+ - - + + - - + + - - + - - - - - 重置 - - - +
+ + + + + 重置 + +
@@ -123,6 +139,7 @@ closable @close="clearKeyword" type="primary" + effect="light" > 关键词:{{ filterForm.keyword }} @@ -381,6 +398,17 @@ interface PracticeStat { // 陪练统计数据 const practiceStats = ref([]) +// 简化的统计数据(用于 el-statistic 组件) +const practiceStatsData = computed(() => { + const stats = practiceStats.value + return { + totalCount: parseInt(stats.find(s => s.label === '总陪练次数')?.value || '0'), + avgScore: parseFloat(stats.find(s => s.label === '平均评分')?.value || '0'), + totalHours: parseFloat(stats.find(s => s.label === '总陪练时长')?.value?.replace('h', '') || '0'), + monthImprovement: parseInt(stats.find(s => s.label === '本月进步')?.value?.replace('+', '').replace('%', '') || '0') + } +}) + // 陪练记录数据(直接使用后端返回的已筛选、已分页的数据) const recordsList = ref([]) @@ -769,95 +797,143 @@ const loadRecords = async () => { max-width: 1400px; margin: 0 auto; + .card { + background: #fff; + border-radius: 12px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 2px 8px rgba(0,0,0,0.06); + } + .page-header { - display: flex; - justify-content: space-between; - align-items: center; margin-bottom: 24px; .page-title { font-size: 24px; font-weight: 600; - color: #333; - } - - .header-actions { - display: flex; - gap: 12px; + color: #1f2937; } } - .stats-overview { + // 统计区域 - 参考错题分析风格 + .stats-section { display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-bottom: 24px; .stat-card { - padding: 24px; - display: flex; - align-items: center; - gap: 20px; + text-align: center; + transition: transform 0.2s ease, box-shadow 0.2s ease; - .stat-icon { - width: 64px; - height: 64px; - border-radius: 16px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - .stat-content { - flex: 1; - - .stat-value { - font-size: 32px; - font-weight: 700; - color: #333; - line-height: 1; - margin-bottom: 8px; - } - - .stat-label { - font-size: 14px; - color: #666; - margin-bottom: 8px; - } - - .stat-trend { - display: flex; - align-items: center; - gap: 4px; - font-size: 12px; - font-weight: 500; - - &.up { - color: #67c23a; - } - - &.down { - color: #f56c6c; - } - } + &:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0,0,0,0.1); } } } + // 筛选区域 - 参考错题分析现代风格 .filter-section { - padding: 20px; - margin-bottom: 20px; + padding: 16px 20px; - .filter-form { - .el-form-item { - margin-bottom: 0; + .filter-toolbar { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + + .search-box { + flex: 0 0 280px; + + .search-input { + :deep(.el-input__wrapper) { + border-radius: 20px; + background: #f5f7fa; + box-shadow: none; + border: 1px solid transparent; + padding: 4px 16px; + transition: all 0.3s ease; + + &:hover, &:focus-within { + background: #fff; + border-color: #409eff; + box-shadow: 0 2px 12px rgba(64, 158, 255, 0.15); + } + } + + .search-icon { + color: #909399; + font-size: 16px; + } + } + } + + .filter-items { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; + flex: 1; + + .filter-select { + width: 130px; + + :deep(.el-select__wrapper) { + border-radius: 8px; + background: #f5f7fa; + box-shadow: none; + border: 1px solid transparent; + transition: all 0.2s ease; + min-height: 36px; + + &:hover { + background: #fff; + border-color: #dcdfe6; + } + + &.is-focused { + background: #fff; + border-color: #409eff; + box-shadow: 0 2px 8px rgba(64, 158, 255, 0.1); + } + } + + .select-prefix-icon { + font-size: 14px; + margin-right: 4px; + } + } + + .date-picker { + :deep(.el-input__wrapper) { + border-radius: 8px; + background: #f5f7fa; + box-shadow: none; + border: 1px solid transparent; + + &:hover { + background: #fff; + border-color: #dcdfe6; + } + } + } + } + + .reset-btn { + border-radius: 8px; + padding: 8px 16px; + font-size: 13px; + + .el-icon { + margin-right: 4px; + } } } .filter-tags { - margin-top: 16px; - padding-top: 16px; + margin-top: 14px; + padding-top: 14px; border-top: 1px solid #f0f0f0; display: flex; align-items: center; @@ -865,34 +941,54 @@ const loadRecords = async () => { gap: 8px; .filter-label { - color: #666; - font-size: 14px; - margin-right: 8px; + color: #606266; + font-size: 13px; + font-weight: 500; + } + + .el-tag { + border-radius: 16px; + padding: 0 12px; + height: 28px; + line-height: 26px; + font-size: 12px; } .clear-all-btn { - margin-left: 8px; + margin-left: auto; + font-size: 12px; } } .search-result-info { - margin-top: 12px; - padding-top: 12px; + margin-top: 14px; + padding-top: 14px; border-top: 1px solid #f0f0f0; + display: flex; + justify-content: space-between; + align-items: center; .result-count { - color: #666; + color: #606266; font-size: 14px; + display: flex; + align-items: center; + gap: 4px; strong { color: #409eff; font-weight: 600; + font-size: 18px; } } .filter-hint { color: #e6a23c; font-size: 12px; + background: #fdf6ec; + padding: 2px 8px; + border-radius: 10px; + margin-left: 8px; } } } @@ -922,6 +1018,26 @@ const loadRecords = async () => { justify-content: center; margin-top: 24px; } + + // 表格行悬浮效果 + :deep(.el-table__row) { + cursor: pointer; + transition: background-color 0.2s ease; + + &:hover { + background-color: #f5f7fa; + } + } + + // 操作按钮样式优化 + :deep(.el-button--link) { + padding: 4px 8px; + + &:hover { + background-color: rgba(64, 158, 255, 0.1); + border-radius: 4px; + } + } } .replay-content { @@ -1032,25 +1148,33 @@ const loadRecords = async () => { // 响应式设计 @media (max-width: 768px) { .practice-records-container { - .page-header { - flex-direction: column; - align-items: flex-start; - gap: 16px; - - .header-actions { - width: 100%; - justify-content: flex-end; - } + .stats-section { + grid-template-columns: repeat(2, 1fr); + gap: 12px; } - .stats-overview { - grid-template-columns: 1fr; - } + .filter-section { + .filter-toolbar { + flex-direction: column; + align-items: stretch; - .filter-form { - .el-form-item { - display: block; - margin-bottom: 16px !important; + .search-box { + flex: 1; + width: 100%; + + .search-input { + width: 100%; + } + } + + .filter-items { + width: 100%; + + .filter-select { + flex: 1; + min-width: 100px; + } + } } } @@ -1063,4 +1187,12 @@ const loadRecords = async () => { } } } + +@media (max-width: 480px) { + .practice-records-container { + .stats-section { + grid-template-columns: 1fr; + } + } +}