refactor(studentPage): 重构学生详情页面布局和样式
- 使用van-config-provider包裹整个页面以支持主题变量 - 调整统计图表stroke-width为70以增强可视性 - 使用van-sticky优化标签页的粘性布局 - 添加返回顶部按钮并设置样式 - 统一调整时间显示字体大小 - 优化状态图标显示效果
Showing
1 changed file
with
28 additions
and
26 deletions
| ... | @@ -2,11 +2,12 @@ | ... | @@ -2,11 +2,12 @@ |
| 2 | * @Author: hookehuyr hookehuyr@gmail.com | 2 | * @Author: hookehuyr hookehuyr@gmail.com |
| 3 | * @Date: 2025-06-19 17:12:19 | 3 | * @Date: 2025-06-19 17:12:19 |
| 4 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 4 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 5 | - * @LastEditTime: 2025-06-19 21:32:23 | 5 | + * @LastEditTime: 2025-06-19 22:39:26 |
| 6 | * @FilePath: /mlaj/src/views/teacher/studentPage.vue | 6 | * @FilePath: /mlaj/src/views/teacher/studentPage.vue |
| 7 | * @Description: 学生详情页面 | 7 | * @Description: 学生详情页面 |
| 8 | --> | 8 | --> |
| 9 | <template> | 9 | <template> |
| 10 | + <van-config-provider :theme-vars="themeVars"> | ||
| 10 | <div class="bg-gradient-to-br from-green-50 via-green-100/30 to-blue-50/30 min-h-screen"> | 11 | <div class="bg-gradient-to-br from-green-50 via-green-100/30 to-blue-50/30 min-h-screen"> |
| 11 | <!-- 学生基本信息 --> | 12 | <!-- 学生基本信息 --> |
| 12 | <div class="bg-white p-4"> | 13 | <div class="bg-white p-4"> |
| ... | @@ -56,7 +57,7 @@ | ... | @@ -56,7 +57,7 @@ |
| 56 | <div class="bg-white p-4 text-center"> | 57 | <div class="bg-white p-4 text-center"> |
| 57 | <div class="relative w-16 h-16 mx-auto mb-2"> | 58 | <div class="relative w-16 h-16 mx-auto mb-2"> |
| 58 | <van-circle v-model:current-rate="studentStats.attendanceRate" :rate="studentStats.attendanceRate" | 59 | <van-circle v-model:current-rate="studentStats.attendanceRate" :rate="studentStats.attendanceRate" |
| 59 | - :speed="100" :text="studentStats.attendanceRate + '%'" stroke-width="50" color="#10b981" size="64" /> | 60 | + :speed="100" :text="studentStats.attendanceRate + '%'" stroke-width="70" color="#10b981" size="64" /> |
| 60 | </div> | 61 | </div> |
| 61 | <div class="text-sm text-gray-600">出勤率</div> | 62 | <div class="text-sm text-gray-600">出勤率</div> |
| 62 | </div> | 63 | </div> |
| ... | @@ -66,7 +67,7 @@ | ... | @@ -66,7 +67,7 @@ |
| 66 | <div class="bg-white p-4 text-center"> | 67 | <div class="bg-white p-4 text-center"> |
| 67 | <div class="relative w-16 h-16 mx-auto mb-2"> | 68 | <div class="relative w-16 h-16 mx-auto mb-2"> |
| 68 | <van-circle v-model:current-rate="studentStats.homeworkRate" :rate="studentStats.homeworkRate" | 69 | <van-circle v-model:current-rate="studentStats.homeworkRate" :rate="studentStats.homeworkRate" |
| 69 | - :speed="100" :text="studentStats.homeworkRate + '%'" stroke-width="50" color="#3b82f6" size="64" /> | 70 | + :speed="100" :text="studentStats.homeworkRate + '%'" stroke-width="70" color="#3b82f6" size="64" /> |
| 70 | </div> | 71 | </div> |
| 71 | <div class="text-sm text-gray-600">作业完成率</div> | 72 | <div class="text-sm text-gray-600">作业完成率</div> |
| 72 | </div> | 73 | </div> |
| ... | @@ -76,7 +77,7 @@ | ... | @@ -76,7 +77,7 @@ |
| 76 | <div class="bg-white p-4 text-center"> | 77 | <div class="bg-white p-4 text-center"> |
| 77 | <div class="relative w-16 h-16 mx-auto mb-2"> | 78 | <div class="relative w-16 h-16 mx-auto mb-2"> |
| 78 | <van-circle v-model:current-rate="studentStats.testScore" :rate="studentStats.testScore" :speed="100" | 79 | <van-circle v-model:current-rate="studentStats.testScore" :rate="studentStats.testScore" :speed="100" |
| 79 | - :text="studentStats.testScore + '%'" stroke-width="50" color="#f59e0b" size="64" /> | 80 | + :text="studentStats.testScore + '%'" stroke-width="70" color="#f59e0b" size="64" /> |
| 80 | </div> | 81 | </div> |
| 81 | <div class="text-sm text-gray-600">测验成绩</div> | 82 | <div class="text-sm text-gray-600">测验成绩</div> |
| 82 | </div> | 83 | </div> |
| ... | @@ -93,27 +94,18 @@ | ... | @@ -93,27 +94,18 @@ |
| 93 | <van-icon name="arrow-down" size="14" class="ml-1" /> | 94 | <van-icon name="arrow-down" size="14" class="ml-1" /> |
| 94 | </div> | 95 | </div> |
| 95 | </div> | 96 | </div> |
| 96 | - <!-- <div class="flex items-center justify-between mb-3"> | ||
| 97 | - <div @click="activeTab = 'homework'" | ||
| 98 | - :class="['flex-1 text-center py-2 text-sm font-medium cursor-pointer', activeTab === 'homework' ? 'text-green-600 border-b-2 border-green-600' : 'text-gray-500']"> | ||
| 99 | - 作业记录 | ||
| 100 | </div> | 97 | </div> |
| 101 | - <div @click="activeTab = 'evaluation'" | 98 | + |
| 102 | - :class="['flex-1 text-center py-2 text-sm font-medium cursor-pointer', activeTab === 'evaluation' ? 'text-green-600 border-b-2 border-green-600' : 'text-gray-500']"> | 99 | + <!-- 使用van-sticky包裹van-tabs实现粘性布局 --> |
| 103 | - 班主任点评 | 100 | + <van-sticky :offset-top="0"> |
| 104 | - </div> | 101 | + <div class="bg-white"> |
| 105 | - <div @click="activeTab = 'statistics'" | 102 | + <van-tabs v-model:active="activeTab" color="#10b981" animated swipeable @change="handleTabChange"> |
| 106 | - :class="['flex-1 text-center py-2 text-sm font-medium cursor-pointer', activeTab === 'statistics' ? 'text-green-600 border-b-2 border-green-600' : 'text-gray-500']"> | ||
| 107 | - 打卡统计 | ||
| 108 | - </div> | ||
| 109 | - </div> --> | ||
| 110 | - <div class="px-4 py-3 bg-white" style="position: relative;"> | ||
| 111 | - <van-tabs v-model:active="activeTab" color="#10b981" sticky animated swipeable @change="handleTabChange"> | ||
| 112 | <van-tab title="作业记录" name="homework"></van-tab> | 103 | <van-tab title="作业记录" name="homework"></van-tab> |
| 113 | <van-tab title="班主任点评" name="evaluation"></van-tab> | 104 | <van-tab title="班主任点评" name="evaluation"></van-tab> |
| 114 | <van-tab title="打卡统计" name="statistics"></van-tab> | 105 | <van-tab title="打卡统计" name="statistics"></van-tab> |
| 115 | </van-tabs> | 106 | </van-tabs> |
| 116 | </div> | 107 | </div> |
| 108 | + </van-sticky> | ||
| 117 | 109 | ||
| 118 | <!-- 记录列表 --> | 110 | <!-- 记录列表 --> |
| 119 | <van-list v-show="activeTab === 'statistics'" v-model:loading="recordLoading" :finished="recordFinished" | 111 | <van-list v-show="activeTab === 'statistics'" v-model:loading="recordLoading" :finished="recordFinished" |
| ... | @@ -123,12 +115,12 @@ | ... | @@ -123,12 +115,12 @@ |
| 123 | <div class="flex items-center flex-1"> | 115 | <div class="flex items-center flex-1"> |
| 124 | <div class="mr-4"> | 116 | <div class="mr-4"> |
| 125 | <div style="display: flex; justify-content: center;"> | 117 | <div style="display: flex; justify-content: center;"> |
| 126 | - <van-icon name="calendar-o" size="16" color="#6b7280" class="mb-1" /> | 118 | + <van-icon name="calendar-o" size="18" color="#6b7280" class="mb-1" /> |
| 127 | - <span class="text-xs text-gray-500">{{ record.date }}</span> | 119 | + <span class="text-sm text-gray-500">{{ record.date }}</span> |
| 128 | </div> | 120 | </div> |
| 129 | <div style="display: flex; "> | 121 | <div style="display: flex; "> |
| 130 | - <van-icon name="clock-o" size="16" color="#6b7280" class="mb-1" /> | 122 | + <van-icon name="clock-o" size="18" color="#6b7280" class="mb-1" /> |
| 131 | - <span class="text-xs text-gray-500">{{ record.time }}</span> | 123 | + <span class="text-sm text-gray-500">{{ record.time }}</span> |
| 132 | </div> | 124 | </div> |
| 133 | </div> | 125 | </div> |
| 134 | </div> | 126 | </div> |
| ... | @@ -137,7 +129,7 @@ | ... | @@ -137,7 +129,7 @@ |
| 137 | <span v-else-if="record.status === '迟到'" class="text-orange-500 text-sm mr-2">{{ record.status }}</span> | 129 | <span v-else-if="record.status === '迟到'" class="text-orange-500 text-sm mr-2">{{ record.status }}</span> |
| 138 | <span v-else class="text-red-500 text-sm mr-2">{{ record.status }}</span> | 130 | <span v-else class="text-red-500 text-sm mr-2">{{ record.status }}</span> |
| 139 | 131 | ||
| 140 | - <van-icon v-if="record.status === '正常'" name="success" color="#10b981" size="16" /> | 132 | + <van-icon v-if="record.status === '正常'" name="passed" color="#10b981" size="16" /> |
| 141 | <van-icon v-else-if="record.status === '迟到'" name="warning-o" color="#f59e0b" size="16" /> | 133 | <van-icon v-else-if="record.status === '迟到'" name="warning-o" color="#f59e0b" size="16" /> |
| 142 | <van-icon v-else name="close" color="#ef4444" size="16" /> | 134 | <van-icon v-else name="close" color="#ef4444" size="16" /> |
| 143 | </div> | 135 | </div> |
| ... | @@ -214,7 +206,8 @@ | ... | @@ -214,7 +206,8 @@ |
| 214 | </div> | 206 | </div> |
| 215 | </div> | 207 | </div> |
| 216 | </van-list> | 208 | </van-list> |
| 217 | - </div> | 209 | + <van-back-top right="5vw" bottom="10vh" /> |
| 210 | + <div style="height: 5rem;"></div> | ||
| 218 | 211 | ||
| 219 | <!-- 状态筛选弹窗 --> | 212 | <!-- 状态筛选弹窗 --> |
| 220 | <van-popup v-model:show="showStatusPopup" position="bottom" round> | 213 | <van-popup v-model:show="showStatusPopup" position="bottom" round> |
| ... | @@ -235,6 +228,7 @@ | ... | @@ -235,6 +228,7 @@ |
| 235 | </div> | 228 | </div> |
| 236 | </van-popup> | 229 | </van-popup> |
| 237 | </div> | 230 | </div> |
| 231 | + </van-config-provider> | ||
| 238 | </template> | 232 | </template> |
| 239 | 233 | ||
| 240 | <script setup> | 234 | <script setup> |
| ... | @@ -253,6 +247,10 @@ const router = useRouter() | ... | @@ -253,6 +247,10 @@ const router = useRouter() |
| 253 | const route = useRoute() | 247 | const route = useRoute() |
| 254 | useTitle(route.meta.title); | 248 | useTitle(route.meta.title); |
| 255 | 249 | ||
| 250 | +const themeVars = reactive({ | ||
| 251 | + buttonNormalFontSize: '1rem', | ||
| 252 | +}) | ||
| 253 | + | ||
| 256 | // 学生信息 | 254 | // 学生信息 |
| 257 | const studentInfo = ref({ | 255 | const studentInfo = ref({ |
| 258 | id: 1, | 256 | id: 1, |
| ... | @@ -685,7 +683,11 @@ const formatData = (data) => { | ... | @@ -685,7 +683,11 @@ const formatData = (data) => { |
| 685 | } | 683 | } |
| 686 | </script> | 684 | </script> |
| 687 | 685 | ||
| 688 | -<style scoped lang="less"> | 686 | +<style lang="less"> |
| 687 | +.van-back-top { | ||
| 688 | + background-color: #4caf50; | ||
| 689 | +} | ||
| 690 | + | ||
| 689 | /* 自定义样式 */ | 691 | /* 自定义样式 */ |
| 690 | .van-circle { | 692 | .van-circle { |
| 691 | font-size: 12px; | 693 | font-size: 12px; | ... | ... |
-
Please register or login to post a comment