diff --git a/src/assets/styles/variables.css b/src/assets/styles/variables.css
index 7bc7dd5..64826a4 100644
--- a/src/assets/styles/variables.css
+++ b/src/assets/styles/variables.css
@@ -44,7 +44,7 @@
/* 边框色 */
--border: var(--gray-lighter);
- --border-light: #e5e7eb;
+ --border-light: var(--gray-lighter);
--border-dark: var(--gray-light);
/* 间距 */
@@ -78,6 +78,21 @@
--font-size-xl: 1.25rem;
--font-size-xxl: 1.5rem;
+ /* 图标尺寸 */
+ --icon-size-xs: 12px;
+ --icon-size-sm: 16px;
+ --icon-size-md: 20px;
+ --icon-size-lg: 24px;
+ --icon-size-xl: 32px;
+
+ /* 组件尺寸 */
+ --mini-chart-size: 45px;
+ --pulse-dot-size: 5px;
+ --progress-bar-height: 8px;
+ --avatar-size-sm: 24px;
+ --avatar-size-md: 32px;
+ --avatar-size-lg: 40px;
+
/* 页面布局 */
--header-height: 72px;
--sidebar-width: 280px;
@@ -90,11 +105,11 @@
--gradient-primary: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%);
--gradient-brand: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
--gradient-success: linear-gradient(135deg, var(--success) 0%, var(--success-light) 100%);
- --gradient-sidebar: linear-gradient(180deg, #1e3a8a 0%, #1e40af 50%, #2563eb 100%);
- --gradient-card-primary: linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%);
- --gradient-card-secondary: linear-gradient(135deg, #06b6d4 0%, #22d3ee 100%);
- --gradient-card-success: linear-gradient(135deg, #10b981 0%, #34d399 100%);
- --gradient-card-warning: linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%);
+ --gradient-sidebar: linear-gradient(180deg, var(--primary) 0%, var(--primary-light) 50%, var(--primary-light) 100%);
+ --gradient-card-primary: linear-gradient(135deg, var(--primary-light) 0%, var(--primary-lighter) 100%);
+ --gradient-card-secondary: linear-gradient(135deg, var(--secondary) 0%, var(--secondary-light) 100%);
+ --gradient-card-success: linear-gradient(135deg, var(--success) 0%, var(--success-light) 100%);
+ --gradient-card-warning: linear-gradient(135deg, var(--warning) 0%, var(--warning-light) 100%);
--gradient-mesh: radial-gradient(circle at 20% 50%, rgba(59, 130, 246, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 80%, rgba(6, 182, 212, 0.1) 0%, transparent 50%),
radial-gradient(circle at 40% 20%, rgba(16, 185, 129, 0.05) 0%, transparent 50%);
@@ -118,8 +133,13 @@
--primary-alpha-medium: rgba(30, 58, 138, var(--opacity-medium));
--primary-alpha-heavy: rgba(30, 58, 138, var(--opacity-heavy));
--primary-alpha-strong: rgba(30, 58, 138, var(--opacity-strong));
+ --primary-light-alpha-light: rgba(59, 130, 246, 0.1);
+ --primary-light-alpha-heavy: rgba(59, 130, 246, var(--opacity-heavy));
+ --primary-light-alpha-medium: rgba(59, 130, 246, 0.3);
+ --primary-light-alpha-shadow: rgba(59, 130, 246, var(--opacity-heavy));
--success-alpha-light: rgba(16, 185, 129, var(--opacity-light));
+ --success-alpha-border: rgba(16, 185, 129, 0.25);
--success-alpha-medium: rgba(16, 185, 129, var(--opacity-medium));
--success-alpha-heavy: rgba(16, 185, 129, var(--opacity-heavy));
@@ -127,6 +147,7 @@
--danger-alpha-heavy: rgba(239, 68, 68, var(--opacity-heavy));
--secondary-alpha-heavy: rgba(6, 182, 212, var(--opacity-heavy));
+ --secondary-alpha-ultra-light: rgba(6, 182, 212, 0.05);
--gray-alpha-light: rgba(107, 114, 128, var(--opacity-light));
--gray-alpha-medium: rgba(107, 114, 128, var(--opacity-medium));
@@ -140,6 +161,14 @@
--black-alpha-light: rgba(0, 0, 0, 0.08);
--black-alpha-medium: rgba(0, 0, 0, 0.15);
+ /* 响应式断点 */
+ --breakpoint-xs: 480px;
+ --breakpoint-sm: 640px;
+ --breakpoint-md: 768px;
+ --breakpoint-lg: 1024px;
+ --breakpoint-xl: 1280px;
+ --breakpoint-xxl: 1536px;
+
/* 动画 */
--transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
diff --git a/src/components/AbilityRadarChart.vue b/src/components/AbilityRadarChart.vue
index 836370d..bd34568 100644
--- a/src/components/AbilityRadarChart.vue
+++ b/src/components/AbilityRadarChart.vue
@@ -27,6 +27,7 @@ import * as echarts from 'echarts'
import { TrendCharts } from '@element-plus/icons-vue'
import { useRoute } from 'vue-router'
import { mockPortraitData } from '@/utils/mockData'
+import { getCSSVariable } from '@/utils/cssHelper'
export default {
name: 'AbilityRadarChart',
@@ -70,10 +71,7 @@ export default {
center: ['50%', '55%']
}
- // 获取CSS变量的实际值
- const getCSSVariable = (variable) => {
- return getComputedStyle(document.documentElement).getPropertyValue(variable).trim()
- }
+ // 使用统一的CSS变量工具函数
const colors = [
getCSSVariable('--primary'), getCSSVariable('--secondary'), getCSSVariable('--success'),
@@ -214,7 +212,6 @@ export default {
scores,
averageScore,
rankInfo,
- dimensions: props.dimensions,
getColor
}
}
diff --git a/src/components/EvaluationDialog.vue b/src/components/EvaluationDialog.vue
index 18d0655..a8ca360 100644
--- a/src/components/EvaluationDialog.vue
+++ b/src/components/EvaluationDialog.vue
@@ -131,7 +131,7 @@
:max="100"
:precision="1"
placeholder="请输入课程成绩"
- style="width: 200px"
+ class="score-input"
/>
分
@@ -486,4 +486,9 @@ export default {
border-top: 1px solid var(--border-light);
border-radius: 0 0 var(--radius-lg) var(--radius-lg);
}
+
+/* 评分输入框 */
+.score-input {
+ width: 200px;
+}
\ No newline at end of file
diff --git a/src/views/BigScreenPortrait.vue b/src/views/BigScreenPortrait.vue
index 15aaf99..70add2e 100644
--- a/src/views/BigScreenPortrait.vue
+++ b/src/views/BigScreenPortrait.vue
@@ -98,7 +98,7 @@
@@ -112,7 +112,7 @@
@@ -126,7 +126,7 @@
@@ -201,7 +201,7 @@
@@ -452,7 +452,15 @@ export default {
const abilityChart = ref(null)
const gaugeChart = ref(null)
const trendChart = ref(null)
-
+
+ // 进度条数据(消除内联样式)
+ const progressData = ref({
+ video: '85%',
+ audio: '72%',
+ text: '94%',
+ overall: '87.5%'
+ })
+
let chartInstances = []
let timer = null
@@ -752,8 +760,8 @@ export default {
},
areaStyle: {
color: buildEChartsGradient(
- colors.secondaryAlphaHeavy.replace('var(--secondary-alpha-heavy)', 'rgba(6, 182, 212, 0.3)'),
- 'rgba(6, 182, 212, 0.05)'
+ 'var(--secondary-alpha-heavy)',
+ 'var(--secondary-alpha-ultra-light)'
)
},
symbol: 'circle',
@@ -841,7 +849,8 @@ export default {
viewReport,
analyzeDimension,
generateReport,
- viewHistory
+ viewHistory,
+ progressData
}
}
}
@@ -1023,8 +1032,8 @@ export default {
/* 模块容器 - 减少内边距 */
.module-container {
- background: rgba(30, 58, 138, 0.3);
- border: 1px solid rgba(59, 130, 246, 0.4);
+ background: var(--primary-alpha-strong);
+ border: 1px solid var(--primary-light-alpha-heavy);
border-radius: var(--radius-md);
padding: var(--spacing-md);
backdrop-filter: var(--glass-blur);
@@ -1142,8 +1151,8 @@ export default {
}
.gauge-mini {
- width: 45px;
- height: 45px;
+ width: var(--mini-chart-size);
+ height: var(--mini-chart-size);
position: relative;
flex-shrink: 0;
}
@@ -1208,8 +1217,8 @@ export default {
}
.metric-main-area {
- background: rgba(30, 58, 138, 0.2);
- border: 1px solid rgba(59, 130, 246, 0.3);
+ background: var(--primary-alpha-heavy);
+ border: 1px solid var(--primary-light-alpha-medium);
border-radius: var(--radius-md);
padding: 15px;
position: relative;
@@ -1226,13 +1235,13 @@ export default {
left: 0;
right: 0;
bottom: 0;
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, transparent 50%);
+ background: linear-gradient(135deg, var(--primary-light-alpha-light) 0%, transparent 50%);
pointer-events: none;
}
.metric-main-area:hover {
transform: translateY(-2px);
- box-shadow: 0 12px 40px rgba(59, 130, 246, 0.2);
+ box-shadow: 0 12px 40px var(--primary-light-alpha-shadow);
}
.main-metric-header {
@@ -1245,13 +1254,13 @@ export default {
}
.main-metric-header .el-icon {
- font-size: 20px;
- color: #06b6d4;
+ font-size: var(--icon-size-md);
+ color: var(--secondary);
}
.main-metric-header span {
font-size: var(--font-size-xl);
- color: #e2e8f0;
+ color: var(--gray-lighter);
font-weight: 500;
}
@@ -1265,12 +1274,12 @@ export default {
background: var(--success-alpha-medium);
padding: 3px 6px;
border-radius: var(--radius-lg);
- border: 1px solid rgba(16, 185, 129, 0.25);
+ border: 1px solid var(--success-alpha-border);
}
.pulse-dot {
- width: 5px;
- height: 5px;
+ width: var(--pulse-dot-size);
+ height: var(--pulse-dot-size);
background: var(--success);
border-radius: 50%;
animation: pulse 1.5s infinite;
@@ -1339,7 +1348,7 @@ export default {
display: flex;
align-items: center;
gap: 6px;
- font-size: 12px;
+ font-size: var(--font-size-xs);
}
.stat-label {
@@ -1382,8 +1391,8 @@ export default {
}
.wall-card {
- background: rgba(30, 58, 138, 0.3);
- border: 1px solid rgba(59, 130, 246, 0.4);
+ background: var(--primary-alpha-strong);
+ border: 1px solid var(--primary-light-alpha-heavy);
border-radius: var(--radius-sm);
padding: var(--spacing-xs);
display: flex;
@@ -1415,7 +1424,7 @@ export default {
}
.wall-card.compact .wall-icon {
- font-size: 12px;
+ font-size: var(--font-size-xs);
margin-bottom: 2px;
}
@@ -1511,8 +1520,8 @@ export default {
right: 0;
bottom: 0;
border: 3px solid transparent;
- border-top: 3px solid #06b6d4;
- border-right: 3px solid #06b6d4;
+ border-top: 3px solid var(--secondary);
+ border-right: 3px solid var(--secondary);
border-radius: 50%;
transform: rotate(-45deg);
animation: rotateProgress 2s linear infinite;
@@ -1543,13 +1552,13 @@ export default {
}
.stars {
- color: #f59e0b;
+ color: var(--warning);
font-size: 18px;
}
.rating-text {
font-size: 10px;
- color: #94a3b8;
+ color: var(--gray-light);
}
/* 多维度检测按钮优化 */
@@ -1592,7 +1601,7 @@ export default {
left: 0;
right: 0;
bottom: 0;
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, transparent 50%);
+ background: linear-gradient(135deg, var(--primary-light-alpha-light) 0%, transparent 50%);
pointer-events: none;
}
@@ -1621,7 +1630,7 @@ export default {
}
.card-icon.audio {
- background: linear-gradient(135deg, var(--purple), #a855f7);
+ background: var(--gradient-primary);
color: var(--text-inverse);
}
@@ -1669,7 +1678,7 @@ export default {
left: 2px;
right: 2px;
bottom: 2px;
- border: 1px solid rgba(59, 130, 246, 0.3);
+ border: 1px solid var(--primary-light-alpha-medium);
border-radius: 50%;
}
@@ -1757,7 +1766,7 @@ export default {
}
.action-btn-large .el-icon {
- font-size: 12px;
+ font-size: var(--font-size-xs);
}
.action-btn-large span {
@@ -1796,7 +1805,7 @@ export default {
background: linear-gradient(135deg, rgba(59, 130, 246, 0.15) 0%, rgba(6, 182, 212, 0.15) 100%);
border: 1px solid rgba(59, 130, 246, 0.25);
border-radius: var(--radius-sm);
- color: #e2e8f0;
+ color: var(--gray-lighter);
cursor: pointer;
transition: var(--transition);
font-size: 11px;
@@ -1811,7 +1820,7 @@ export default {
}
.dimension-btn .el-icon {
- font-size: 12px;
+ font-size: var(--font-size-xs);
color: var(--secondary);
opacity: 0.9;
}
@@ -1829,7 +1838,7 @@ export default {
.bar {
width: 4px;
- background: linear-gradient(to top, #06b6d4, #3b82f6);
+ background: linear-gradient(to top, var(--secondary), var(--primary-light));
border-radius: 2px;
animation: barGrow 1s ease-out;
}
@@ -1850,13 +1859,13 @@ export default {
width: 16px;
height: 16px;
border-radius: 50%;
- background: linear-gradient(135deg, #06b6d4, #3b82f6);
+ background: var(--gradient-brand);
border: 1px solid rgba(255, 255, 255, 0.3);
}
.avatar-more {
font-size: 10px;
- color: #94a3b8;
+ color: var(--gray-light);
background: rgba(147, 197, 253, 0.2);
padding: 2px 4px;
border-radius: 8px;
@@ -1887,12 +1896,12 @@ export default {
}
.status-item.completed {
- color: #10b981;
+ color: var(--success);
background: rgba(16, 185, 129, 0.2);
}
.status-item.pending {
- color: #f59e0b;
+ color: var(--warning);
background: rgba(245, 158, 11, 0.2);
}
@@ -1987,7 +1996,7 @@ export default {
}
.overview-icon {
- font-size: 20px;
+ font-size: var(--icon-size-md);
color: var(--secondary);
background: var(--secondary-alpha-heavy);
padding: 6px;
@@ -1995,9 +2004,9 @@ export default {
}
.overview-number {
- font-size: 20px;
+ font-size: var(--icon-size-md);
font-weight: 600;
- color: #e2e8f0;
+ color: var(--gray-lighter);
margin-bottom: 1px;
}
@@ -2067,9 +2076,9 @@ export default {
gap: 10px;
padding: 12px 16px;
background: linear-gradient(135deg, rgba(59, 130, 246, 0.2) 0%, rgba(6, 182, 212, 0.2) 100%);
- border: 1px solid rgba(59, 130, 246, 0.3);
+ border: 1px solid var(--primary-light-alpha-medium);
border-radius: 8px;
- color: #e2e8f0;
+ color: var(--gray-lighter);
cursor: pointer;
transition: all 0.3s ease;
font-size: 14px;
@@ -2084,7 +2093,7 @@ export default {
.dimension-btn .el-icon {
font-size: 16px;
- color: #06b6d4;
+ color: var(--secondary);
}
/* 操作按钮 */
@@ -2096,7 +2105,7 @@ export default {
.action-buttons .el-button {
flex: 1;
- background: linear-gradient(135deg, #3b82f6 0%, #06b6d4 100%);
+ background: var(--gradient-brand);
border: none;
color: white;
font-weight: bold;
@@ -2286,7 +2295,7 @@ export default {
padding: 8px 10px;
background: linear-gradient(135deg, rgba(59, 130, 246, 0.25) 0%, rgba(6, 182, 212, 0.2) 100%);
font-weight: 600;
- color: #e2e8f0;
+ color: var(--gray-lighter);
font-size: 11px;
flex: 0 0 auto;
border-bottom: 1px solid rgba(59, 130, 246, 0.3);
@@ -2310,7 +2319,7 @@ export default {
padding: 8px 10px;
margin: 2px 4px;
border-radius: var(--radius-sm);
- color: #e2e8f0;
+ color: var(--gray-lighter);
font-size: 11px;
align-items: center;
transition: var(--transition);
@@ -2367,9 +2376,9 @@ export default {
gap: 10px;
padding: 12px 16px;
background: linear-gradient(135deg, rgba(59, 130, 246, 0.2) 0%, rgba(6, 182, 212, 0.2) 100%);
- border: 1px solid rgba(59, 130, 246, 0.3);
+ border: 1px solid var(--primary-light-alpha-medium);
border-radius: 8px;
- color: #e2e8f0;
+ color: var(--gray-lighter);
cursor: pointer;
transition: all 0.3s ease;
font-size: 14px;
@@ -2384,7 +2393,7 @@ export default {
.dimension-btn .el-icon {
font-size: 16px;
- color: #06b6d4;
+ color: var(--secondary);
}
/* 操作按钮 */
@@ -2396,7 +2405,7 @@ export default {
.action-buttons .el-button {
flex: 1;
- background: linear-gradient(135deg, #3b82f6 0%, #06b6d4 100%);
+ background: var(--gradient-brand);
border: none;
color: white;
font-weight: bold;
@@ -2423,7 +2432,7 @@ export default {
}
.dimension-btn {
- font-size: 12px;
+ font-size: var(--font-size-xs);
padding: 8px 10px;
}
@@ -2532,7 +2541,7 @@ export default {
}
.wall-card.compact .wall-number {
- font-size: 20px;
+ font-size: var(--icon-size-md);
}
}
@@ -2565,7 +2574,7 @@ export default {
}
.wall-card.compact .wall-label {
- font-size: 12px;
+ font-size: var(--font-size-xs);
}
.metrics-layout {
@@ -2647,7 +2656,7 @@ export default {
}
.number-unit {
- font-size: 12px;
+ font-size: var(--font-size-xs);
}
.gauge-mini {
diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue
index fb21b0c..dab0f87 100644
--- a/src/views/Dashboard.vue
+++ b/src/views/Dashboard.vue
@@ -216,7 +216,7 @@