hookehuyr

refactor(studentPage): 重构学生详情页面布局和样式

- 使用van-config-provider包裹整个页面以支持主题变量
- 调整统计图表stroke-width为70以增强可视性
- 使用van-sticky优化标签页的粘性布局
- 添加返回顶部按钮并设置样式
- 统一调整时间显示字体大小
- 优化状态图标显示效果
...@@ -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" /> &nbsp; 118 + <van-icon name="calendar-o" size="18" color="#6b7280" class="mb-1" /> &nbsp;
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" /> &nbsp; 122 + <van-icon name="clock-o" size="18" color="#6b7280" class="mb-1" /> &nbsp;
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;
......