hookehuyr

feat(teacher): 优化教师打卡和作业表单页面

- 在打卡页面添加顶部间距并区分打卡和作业按钮功能
- 重构表单页面,根据类型动态显示标题并简化代码结构
- 移除不必要的类型选择字段,默认根据路由参数设置类型
1 <!-- 1 <!--
2 * @Date: 2025-05-29 15:34:17 2 * @Date: 2025-05-29 15:34:17
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-06-20 10:40:58 4 + * @LastEditTime: 2025-06-20 10:56:22
5 * @FilePath: /mlaj/src/views/teacher/checkinPage.vue 5 * @FilePath: /mlaj/src/views/teacher/checkinPage.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
...@@ -21,13 +21,13 @@ ...@@ -21,13 +21,13 @@
21 @select="onSelectDay" 21 @select="onSelectDay"
22 @click-subtitle="onClickSubtitle"> 22 @click-subtitle="onClickSubtitle">
23 </van-calendar> 23 </van-calendar>
24 - <div style="padding: 0 1rem;"> 24 + <div style="padding: 0 1rem; margin-top: 1rem;">
25 <van-row gutter="15"> 25 <van-row gutter="15">
26 <van-col span="12"> 26 <van-col span="12">
27 - <van-button type="primary" block icon="photo" @click="handleAdd">安排打卡</van-button> 27 + <van-button type="primary" block icon="photo" @click="handleAdd('checkin')">安排打卡</van-button>
28 </van-col> 28 </van-col>
29 <van-col span="12"> 29 <van-col span="12">
30 - <van-button type="primary" block icon="video">设置作业</van-button> 30 + <van-button type="primary" block icon="video" @click="handleAdd('homework')">设置作业</van-button>
31 </van-col> 31 </van-col>
32 </van-row> 32 </van-row>
33 </div> 33 </div>
...@@ -817,12 +817,12 @@ const formatData = (data) => { ...@@ -817,12 +817,12 @@ const formatData = (data) => {
817 return formattedData; 817 return formattedData;
818 } 818 }
819 819
820 -const handleAdd = () => { 820 +const handleAdd = (type) => {
821 router.push({ 821 router.push({
822 path: '/teacher/form', 822 path: '/teacher/form',
823 query: { 823 query: {
824 post_id: route.query.id, 824 post_id: route.query.id,
825 - type: 'image', 825 + type: type,
826 status: 'add', 826 status: 'add',
827 } 827 }
828 }) 828 })
......
...@@ -2,31 +2,24 @@ ...@@ -2,31 +2,24 @@
2 * @Author: hookehuyr hookehuyr@gmail.com 2 * @Author: hookehuyr hookehuyr@gmail.com
3 * @Date: 2025-01-20 10:00:00 3 * @Date: 2025-01-20 10:00:00
4 * @LastEditors: hookehuyr hookehuyr@gmail.com 4 * @LastEditors: hookehuyr hookehuyr@gmail.com
5 - * @LastEditTime: 2025-06-18 11:43:03 5 + * @LastEditTime: 2025-06-20 10:58:03
6 * @FilePath: /mlaj/src/views/teacher/formPage.vue 6 * @FilePath: /mlaj/src/views/teacher/formPage.vue
7 * @Description: 教师作业新增表单页面 7 * @Description: 教师作业新增表单页面
8 --> 8 -->
9 <template> 9 <template>
10 - <AppLayout title="新增作业"> 10 + <AppLayout>
11 - <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">
12 - <div class="px-4 py-6"> 12 + <div class="px-4 py-6">
13 - <FrostedGlass class="rounded-xl overflow-hidden"> 13 + <FrostedGlass class="rounded-xl overflow-hidden">
14 - <div class="py-4"> 14 + <div class="py-4">
15 - <van-form @submit="handleSubmit"> 15 + <van-form @submit="handleSubmit">
16 - <van-cell-group inset> 16 + <van-cell-group inset>
17 - <!-- 作业名称 --> 17 + <!-- 作业名称 -->
18 - <van-field 18 + <van-field v-model="formData.homework_name" name="homework_name" label="作业名称" placeholder="请输入作业名称"
19 - v-model="formData.homework_name" 19 + required :border="false" :rules="[{ required: true, message: '请输入作业名称' }]" />
20 - name="homework_name" 20 +
21 - label="作业名称" 21 + <!-- 类型 -->
22 - placeholder="请输入作业名称" 22 + <!-- <van-field
23 - required
24 - :border="false"
25 - :rules="[{ required: true, message: '请输入作业名称' }]"
26 - />
27 -
28 - <!-- 类型 -->
29 - <van-field
30 v-model="formData.type" 23 v-model="formData.type"
31 is-link 24 is-link
32 readonly 25 readonly
...@@ -35,281 +28,134 @@ ...@@ -35,281 +28,134 @@
35 placeholder="请选择类型" 28 placeholder="请选择类型"
36 :border="false" 29 :border="false"
37 @click="showTypePicker = true" 30 @click="showTypePicker = true"
38 - /> 31 + /> -->
39 - 32 +
40 - <!-- 频次 --> 33 + <!-- 频次 -->
41 - <van-field 34 + <van-field v-model="formData.frequency" is-link readonly name="frequency" label="频次" placeholder="请选择频次"
42 - v-model="formData.frequency" 35 + :border="false" @click="showFrequencyPicker = true" />
43 - is-link 36 +
44 - readonly 37 + <!-- 目标总数 -->
45 - name="frequency" 38 + <van-field v-model="formData.target_count" type="number" name="target_count" label="目标总数"
46 - label="频次" 39 + :border="false" placeholder="请输入目标数量" />
47 - placeholder="请选择频次" 40 +
48 - :border="false" 41 + <!-- 开始时间 -->
49 - @click="showFrequencyPicker = true" 42 + <van-field v-model="startTimeDisplay" is-link readonly name="start_time" label="开始时间"
50 - /> 43 + placeholder="请选择开始时间" :border="false" @click="showStartTimePicker = true" />
51 - 44 +
52 - <!-- 目标总数 --> 45 + <!-- 结束时间 -->
53 - <van-field 46 + <van-field v-model="endTimeDisplay" is-link readonly name="end_time" label="结束时间" placeholder="请选择结束时间"
54 - v-model="formData.target_count" 47 + :border="false" @click="showEndTimePicker = true" />
55 - type="number" 48 +
56 - name="target_count" 49 + <!-- 课程 -->
57 - label="目标总数" 50 + <van-field v-model="formData.course" is-link readonly name="course" label="课程" placeholder="请选择课程"
58 - :border="false" 51 + :border="false" @click="showCoursePicker = true" />
59 - placeholder="请输入目标数量" 52 +
60 - /> 53 + <!-- 活动 -->
61 - 54 + <van-field v-model="formData.activity" is-link readonly name="activity" label="活动" placeholder="请选择活动"
62 - <!-- 开始时间 --> 55 + :border="false" @click="showActivityPicker = true" />
63 - <van-field 56 +
64 - v-model="startTimeDisplay" 57 + <!-- 年级 -->
65 - is-link 58 + <van-field v-model="formData.grade" is-link readonly name="grade" label="年级" placeholder="请选择年级"
66 - readonly 59 + :border="false" @click="showGradePicker = true" />
67 - name="start_time" 60 +
68 - label="开始时间" 61 + <!-- 班级 -->
69 - placeholder="请选择开始时间" 62 + <van-field v-model="formData.class_name" is-link readonly name="class_name" label="班级"
70 - :border="false" 63 + placeholder="请选择班级" :border="false" @click="showClassPicker = true" />
71 - @click="showStartTimePicker = true" 64 +
72 - /> 65 + <!-- 小组 -->
73 - 66 + <van-field v-model="formData.group_name" is-link readonly name="group_name" label="小组"
74 - <!-- 结束时间 --> 67 + placeholder="请选择小组" :border="false" @click="showGroupPicker = true" />
75 - <van-field 68 + </van-cell-group>
76 - v-model="endTimeDisplay" 69 +
77 - is-link 70 + <!-- 提交按钮 -->
78 - readonly 71 + <div style="margin: 16px;">
79 - name="end_time" 72 + <van-button native-type="submit" type="primary" block round :loading="loading">
80 - label="结束时间" 73 + 确认并保存
81 - placeholder="请选择结束时间" 74 + </van-button>
82 - :border="false" 75 + </div>
83 - @click="showEndTimePicker = true" 76 + </van-form>
84 - /> 77 + </div>
85 - 78 + </FrostedGlass>
86 - <!-- 课程 --> 79 + </div>
87 - <van-field 80 + </div>
88 - v-model="formData.course" 81 +
89 - is-link 82 + <!-- 类型选择器 -->
90 - readonly 83 + <van-popup v-model:show="showTypePicker" position="bottom">
91 - name="course" 84 + <van-picker :columns="typeOptions" @confirm="onTypeConfirm" @cancel="showTypePicker = false" />
92 - label="课程" 85 + </van-popup>
93 - placeholder="请选择课程" 86 +
94 - :border="false" 87 + <!-- 频次选择器 -->
95 - @click="showCoursePicker = true" 88 + <van-popup v-model:show="showFrequencyPicker" position="bottom">
96 - /> 89 + <van-picker :columns="frequencyOptions" @confirm="onFrequencyConfirm" @cancel="showFrequencyPicker = false" />
97 - 90 + </van-popup>
98 - <!-- 活动 --> 91 +
99 - <van-field 92 + <!-- 开始时间选择器 -->
100 - v-model="formData.activity" 93 + <van-popup v-model:show="showStartTimePicker" position="bottom">
101 - is-link 94 + <van-date-picker v-model="startDate" title="选择开始时间" :min-date="minDate" :max-date="maxDate"
102 - readonly 95 + @confirm="onStartTimeConfirm" @cancel="showStartTimePicker = false" />
103 - name="activity" 96 + </van-popup>
104 - label="活动" 97 +
105 - placeholder="请选择活动" 98 + <!-- 结束时间选择器 -->
106 - :border="false" 99 + <van-popup v-model:show="showEndTimePicker" position="bottom">
107 - @click="showActivityPicker = true" 100 + <van-date-picker v-model="endDate" title="选择结束时间" :min-date="minDate" :max-date="maxDate"
108 - /> 101 + @confirm="onEndTimeConfirm" @cancel="showEndTimePicker = false" />
109 - 102 + </van-popup>
110 - <!-- 年级 --> 103 +
111 - <van-field 104 + <!-- 课程选择器 -->
112 - v-model="formData.grade" 105 + <van-popup v-model:show="showCoursePicker" position="bottom">
113 - is-link 106 + <div class="p-4">
114 - readonly 107 + <van-search v-model="courseSearchValue" placeholder="搜索课程" @search="searchCourse" />
115 - name="grade" 108 + <van-list>
116 - label="年级" 109 + <van-cell v-for="course in filteredCourses" :key="course.id" :title="course.name" is-link :border="false"
117 - placeholder="请选择年级" 110 + @click="onCourseSelect(course)" />
118 - :border="false" 111 + </van-list>
119 - @click="showGradePicker = true" 112 + </div>
120 - /> 113 + </van-popup>
121 - 114 +
122 - <!-- 班级 --> 115 + <!-- 活动选择器 -->
123 - <van-field 116 + <van-popup v-model:show="showActivityPicker" position="bottom">
124 - v-model="formData.class_name" 117 + <div class="p-4">
125 - is-link 118 + <van-search v-model="activitySearchValue" placeholder="搜索活动" @search="searchActivity" />
126 - readonly 119 + <van-list>
127 - name="class_name" 120 + <van-cell v-for="activity in filteredActivities" :key="activity.id" :title="activity.name" is-link
128 - label="班级" 121 + :border="false" @click="onActivitySelect(activity)" />
129 - placeholder="请选择班级" 122 + </van-list>
130 - :border="false" 123 + </div>
131 - @click="showClassPicker = true" 124 + </van-popup>
132 - /> 125 +
133 - 126 + <!-- 年级选择器 -->
134 - <!-- 小组 --> 127 + <van-popup v-model:show="showGradePicker" position="bottom">
135 - <van-field 128 + <div class="p-4">
136 - v-model="formData.group_name" 129 + <van-search v-model="gradeSearchValue" placeholder="搜索年级" @search="searchGrade" />
137 - is-link 130 + <van-list>
138 - readonly 131 + <van-cell v-for="grade in filteredGrades" :key="grade.id" :title="grade.name" is-link :border="false"
139 - name="group_name" 132 + @click="onGradeSelect(grade)" />
140 - label="小组" 133 + </van-list>
141 - placeholder="请选择小组" 134 + </div>
142 - :border="false" 135 + </van-popup>
143 - @click="showGroupPicker = true" 136 +
144 - /> 137 + <!-- 班级选择器 -->
145 - </van-cell-group> 138 + <van-popup v-model:show="showClassPicker" position="bottom">
146 - 139 + <div class="p-4">
147 - <!-- 提交按钮 --> 140 + <van-search v-model="classSearchValue" placeholder="搜索班级" @search="searchClass" />
148 - <div style="margin: 16px;"> 141 + <van-list>
149 - <van-button 142 + <van-cell v-for="classItem in filteredClasses" :key="classItem.id" :title="classItem.name" is-link
150 - native-type="submit" 143 + :border="false" @click="onClassSelect(classItem)" />
151 - type="primary" 144 + </van-list>
152 - block 145 + </div>
153 - round 146 + </van-popup>
154 - :loading="loading" 147 +
155 - class="bg-green-500 hover:bg-green-600 transition-colors" 148 + <!-- 小组选择器 -->
156 - > 149 + <van-popup v-model:show="showGroupPicker" position="bottom">
157 - 确认并保存 150 + <div class="p-4">
158 - </van-button> 151 + <van-search v-model="groupSearchValue" placeholder="搜索小组" @search="searchGroup" />
159 - </div> 152 + <van-list>
160 - </van-form> 153 + <van-cell v-for="group in filteredGroups" :key="group.id" :title="group.name" is-link :border="false"
161 - </div> 154 + @click="onGroupSelect(group)" />
162 - </FrostedGlass> 155 + </van-list>
163 - </div> 156 + </div>
164 - </div> 157 + </van-popup>
165 - 158 + </AppLayout>
166 - <!-- 类型选择器 -->
167 - <van-popup v-model:show="showTypePicker" position="bottom">
168 - <van-picker
169 - :columns="typeOptions"
170 - @confirm="onTypeConfirm"
171 - @cancel="showTypePicker = false"
172 - />
173 - </van-popup>
174 -
175 - <!-- 频次选择器 -->
176 - <van-popup v-model:show="showFrequencyPicker" position="bottom">
177 - <van-picker
178 - :columns="frequencyOptions"
179 - @confirm="onFrequencyConfirm"
180 - @cancel="showFrequencyPicker = false"
181 - />
182 - </van-popup>
183 -
184 - <!-- 开始时间选择器 -->
185 - <van-popup v-model:show="showStartTimePicker" position="bottom">
186 - <van-date-picker
187 - v-model="startDate"
188 - title="选择开始时间"
189 - :min-date="minDate"
190 - :max-date="maxDate"
191 - @confirm="onStartTimeConfirm"
192 - @cancel="showStartTimePicker = false"
193 - />
194 - </van-popup>
195 -
196 - <!-- 结束时间选择器 -->
197 - <van-popup v-model:show="showEndTimePicker" position="bottom">
198 - <van-date-picker
199 - v-model="endDate"
200 - title="选择结束时间"
201 - :min-date="minDate"
202 - :max-date="maxDate"
203 - @confirm="onEndTimeConfirm"
204 - @cancel="showEndTimePicker = false"
205 - />
206 - </van-popup>
207 -
208 - <!-- 课程选择器 -->
209 - <van-popup v-model:show="showCoursePicker" position="bottom">
210 - <div class="p-4">
211 - <van-search
212 - v-model="courseSearchValue"
213 - placeholder="搜索课程"
214 - @search="searchCourse"
215 - />
216 - <van-list>
217 - <van-cell
218 - v-for="course in filteredCourses"
219 - :key="course.id"
220 - :title="course.name"
221 - is-link
222 - :border="false"
223 - @click="onCourseSelect(course)"
224 - />
225 - </van-list>
226 - </div>
227 - </van-popup>
228 -
229 - <!-- 活动选择器 -->
230 - <van-popup v-model:show="showActivityPicker" position="bottom">
231 - <div class="p-4">
232 - <van-search
233 - v-model="activitySearchValue"
234 - placeholder="搜索活动"
235 - @search="searchActivity"
236 - />
237 - <van-list>
238 - <van-cell
239 - v-for="activity in filteredActivities"
240 - :key="activity.id"
241 - :title="activity.name"
242 - is-link
243 - :border="false"
244 - @click="onActivitySelect(activity)"
245 - />
246 - </van-list>
247 - </div>
248 - </van-popup>
249 -
250 - <!-- 年级选择器 -->
251 - <van-popup v-model:show="showGradePicker" position="bottom">
252 - <div class="p-4">
253 - <van-search
254 - v-model="gradeSearchValue"
255 - placeholder="搜索年级"
256 - @search="searchGrade"
257 - />
258 - <van-list>
259 - <van-cell
260 - v-for="grade in filteredGrades"
261 - :key="grade.id"
262 - :title="grade.name"
263 - is-link
264 - :border="false"
265 - @click="onGradeSelect(grade)"
266 - />
267 - </van-list>
268 - </div>
269 - </van-popup>
270 -
271 - <!-- 班级选择器 -->
272 - <van-popup v-model:show="showClassPicker" position="bottom">
273 - <div class="p-4">
274 - <van-search
275 - v-model="classSearchValue"
276 - placeholder="搜索班级"
277 - @search="searchClass"
278 - />
279 - <van-list>
280 - <van-cell
281 - v-for="classItem in filteredClasses"
282 - :key="classItem.id"
283 - :title="classItem.name"
284 - is-link
285 - :border="false"
286 - @click="onClassSelect(classItem)"
287 - />
288 - </van-list>
289 - </div>
290 - </van-popup>
291 -
292 - <!-- 小组选择器 -->
293 - <van-popup v-model:show="showGroupPicker" position="bottom">
294 - <div class="p-4">
295 - <van-search
296 - v-model="groupSearchValue"
297 - placeholder="搜索小组"
298 - @search="searchGroup"
299 - />
300 - <van-list>
301 - <van-cell
302 - v-for="group in filteredGroups"
303 - :key="group.id"
304 - :title="group.name"
305 - is-link
306 - :border="false"
307 - @click="onGroupSelect(group)"
308 - />
309 - </van-list>
310 - </div>
311 - </van-popup>
312 - </AppLayout>
313 </template> 159 </template>
314 160
315 <script setup> 161 <script setup>
...@@ -322,21 +168,23 @@ import { useTitle } from '@vueuse/core'; ...@@ -322,21 +168,23 @@ import { useTitle } from '@vueuse/core';
322 168
323 const $route = useRoute(); 169 const $route = useRoute();
324 const $router = useRouter(); 170 const $router = useRouter();
325 -useTitle($route.meta.title || '新增作业'); 171 +useTitle($route.query.type === 'homework' ? '设置作业' : '安排打卡');
172 +
173 +const type = ref('');
326 174
327 // 表单数据 175 // 表单数据
328 const formData = ref({ 176 const formData = ref({
329 - homework_name: '', 177 + homework_name: '',
330 - type: '', 178 + type: $route.query.type === 'homework' ? '上传附件' : '签到',
331 - frequency: '', 179 + frequency: '',
332 - target_count: '', 180 + target_count: '',
333 - start_time: new Date(), 181 + start_time: new Date(),
334 - end_time: new Date(), 182 + end_time: new Date(),
335 - course: '', 183 + course: '',
336 - activity: '', 184 + activity: '',
337 - grade: '', 185 + grade: '',
338 - class_name: '', 186 + class_name: '',
339 - group_name: '' 187 + group_name: ''
340 }); 188 });
341 189
342 // 加载状态 190 // 加载状态
...@@ -361,17 +209,17 @@ const maxDate = new Date(2030, 11, 31); ...@@ -361,17 +209,17 @@ const maxDate = new Date(2030, 11, 31);
361 209
362 // 选项数据 210 // 选项数据
363 const typeOptions = ref([ 211 const typeOptions = ref([
364 - { text: '签到', value: 'checkin' }, 212 + { text: '签到', value: 'checkin' },
365 - { text: '作业', value: 'homework' }, 213 + { text: '作业', value: 'homework' },
366 - { text: '考试', value: 'exam' }, 214 + { text: '考试', value: 'exam' },
367 - { text: '活动', value: 'activity' } 215 + { text: '活动', value: 'activity' }
368 ]); 216 ]);
369 217
370 const frequencyOptions = ref([ 218 const frequencyOptions = ref([
371 - { text: '一次', value: 'once' }, 219 + { text: '一次', value: 'once' },
372 - { text: '每日', value: 'daily' }, 220 + { text: '每日', value: 'daily' },
373 - { text: '每周', value: 'weekly' }, 221 + { text: '每周', value: 'weekly' },
374 - { text: '每月', value: 'monthly' } 222 + { text: '每月', value: 'monthly' }
375 ]); 223 ]);
376 224
377 // 搜索值 225 // 搜索值
...@@ -383,85 +231,85 @@ const groupSearchValue = ref(''); ...@@ -383,85 +231,85 @@ const groupSearchValue = ref('');
383 231
384 // 数据列表 232 // 数据列表
385 const courses = ref([ 233 const courses = ref([
386 - { id: 1, name: '数学课程' }, 234 + { id: 1, name: '数学课程' },
387 - { id: 2, name: '语文课程' }, 235 + { id: 2, name: '语文课程' },
388 - { id: 3, name: '英语课程' }, 236 + { id: 3, name: '英语课程' },
389 - { id: 4, name: '物理课程' } 237 + { id: 4, name: '物理课程' }
390 ]); 238 ]);
391 239
392 const activities = ref([ 240 const activities = ref([
393 - { id: 1, name: '春游活动' }, 241 + { id: 1, name: '春游活动' },
394 - { id: 2, name: '运动会' }, 242 + { id: 2, name: '运动会' },
395 - { id: 3, name: '文艺汇演' }, 243 + { id: 3, name: '文艺汇演' },
396 - { id: 4, name: '科技节' } 244 + { id: 4, name: '科技节' }
397 ]); 245 ]);
398 246
399 const grades = ref([ 247 const grades = ref([
400 - { id: 1, name: '一年级' }, 248 + { id: 1, name: '一年级' },
401 - { id: 2, name: '二年级' }, 249 + { id: 2, name: '二年级' },
402 - { id: 3, name: '三年级' }, 250 + { id: 3, name: '三年级' },
403 - { id: 4, name: '四年级' } 251 + { id: 4, name: '四年级' }
404 ]); 252 ]);
405 253
406 const classes = ref([ 254 const classes = ref([
407 - { id: 1, name: '一班' }, 255 + { id: 1, name: '一班' },
408 - { id: 2, name: '二班' }, 256 + { id: 2, name: '二班' },
409 - { id: 3, name: '三班' }, 257 + { id: 3, name: '三班' },
410 - { id: 4, name: '四班' } 258 + { id: 4, name: '四班' }
411 ]); 259 ]);
412 260
413 const groups = ref([ 261 const groups = ref([
414 - { id: 1, name: '第一小组' }, 262 + { id: 1, name: '第一小组' },
415 - { id: 2, name: '第二小组' }, 263 + { id: 2, name: '第二小组' },
416 - { id: 3, name: '第三小组' }, 264 + { id: 3, name: '第三小组' },
417 - { id: 4, name: '第四小组' } 265 + { id: 4, name: '第四小组' }
418 ]); 266 ]);
419 267
420 // 计算属性 - 时间显示格式 268 // 计算属性 - 时间显示格式
421 const startTimeDisplay = computed(() => { 269 const startTimeDisplay = computed(() => {
422 - if (!formData.value.start_time) return ''; 270 + if (!formData.value.start_time) return '';
423 - return formatDateTime(formData.value.start_time); 271 + return formatDateTime(formData.value.start_time);
424 }); 272 });
425 273
426 const endTimeDisplay = computed(() => { 274 const endTimeDisplay = computed(() => {
427 - if (!formData.value.end_time) return ''; 275 + if (!formData.value.end_time) return '';
428 - return formatDateTime(formData.value.end_time); 276 + return formatDateTime(formData.value.end_time);
429 }); 277 });
430 278
431 // 过滤后的数据 279 // 过滤后的数据
432 const filteredCourses = computed(() => { 280 const filteredCourses = computed(() => {
433 - if (!courseSearchValue.value) return courses.value; 281 + if (!courseSearchValue.value) return courses.value;
434 - return courses.value.filter(course => 282 + return courses.value.filter(course =>
435 - course.name.toLowerCase().includes(courseSearchValue.value.toLowerCase()) 283 + course.name.toLowerCase().includes(courseSearchValue.value.toLowerCase())
436 - ); 284 + );
437 }); 285 });
438 286
439 const filteredActivities = computed(() => { 287 const filteredActivities = computed(() => {
440 - if (!activitySearchValue.value) return activities.value; 288 + if (!activitySearchValue.value) return activities.value;
441 - return activities.value.filter(activity => 289 + return activities.value.filter(activity =>
442 - activity.name.toLowerCase().includes(activitySearchValue.value.toLowerCase()) 290 + activity.name.toLowerCase().includes(activitySearchValue.value.toLowerCase())
443 - ); 291 + );
444 }); 292 });
445 293
446 const filteredGrades = computed(() => { 294 const filteredGrades = computed(() => {
447 - if (!gradeSearchValue.value) return grades.value; 295 + if (!gradeSearchValue.value) return grades.value;
448 - return grades.value.filter(grade => 296 + return grades.value.filter(grade =>
449 - grade.name.toLowerCase().includes(gradeSearchValue.value.toLowerCase()) 297 + grade.name.toLowerCase().includes(gradeSearchValue.value.toLowerCase())
450 - ); 298 + );
451 }); 299 });
452 300
453 const filteredClasses = computed(() => { 301 const filteredClasses = computed(() => {
454 - if (!classSearchValue.value) return classes.value; 302 + if (!classSearchValue.value) return classes.value;
455 - return classes.value.filter(classItem => 303 + return classes.value.filter(classItem =>
456 - classItem.name.toLowerCase().includes(classSearchValue.value.toLowerCase()) 304 + classItem.name.toLowerCase().includes(classSearchValue.value.toLowerCase())
457 - ); 305 + );
458 }); 306 });
459 307
460 const filteredGroups = computed(() => { 308 const filteredGroups = computed(() => {
461 - if (!groupSearchValue.value) return groups.value; 309 + if (!groupSearchValue.value) return groups.value;
462 - return groups.value.filter(group => 310 + return groups.value.filter(group =>
463 - group.name.toLowerCase().includes(groupSearchValue.value.toLowerCase()) 311 + group.name.toLowerCase().includes(groupSearchValue.value.toLowerCase())
464 - ); 312 + );
465 }); 313 });
466 314
467 /** 315 /**
...@@ -470,12 +318,12 @@ const filteredGroups = computed(() => { ...@@ -470,12 +318,12 @@ const filteredGroups = computed(() => {
470 * @returns {string} 格式化后的日期时间字符串 318 * @returns {string} 格式化后的日期时间字符串
471 */ 319 */
472 const formatDateTime = (date) => { 320 const formatDateTime = (date) => {
473 - if (!date) return ''; 321 + if (!date) return '';
474 - const d = new Date(date); 322 + const d = new Date(date);
475 - const year = d.getFullYear(); 323 + const year = d.getFullYear();
476 - const month = String(d.getMonth() + 1).padStart(2, '0'); 324 + const month = String(d.getMonth() + 1).padStart(2, '0');
477 - const day = String(d.getDate()).padStart(2, '0'); 325 + const day = String(d.getDate()).padStart(2, '0');
478 - return `${year}-${month}-${day}`; 326 + return `${year}-${month}-${day}`;
479 }; 327 };
480 328
481 /** 329 /**
...@@ -483,8 +331,8 @@ const formatDateTime = (date) => { ...@@ -483,8 +331,8 @@ const formatDateTime = (date) => {
483 * @param {Object} option - 选中的选项 331 * @param {Object} option - 选中的选项
484 */ 332 */
485 const onTypeConfirm = (option) => { 333 const onTypeConfirm = (option) => {
486 - formData.value.type = option.selectedOptions[0].text; 334 + formData.value.type = option.selectedOptions[0].text;
487 - showTypePicker.value = false; 335 + showTypePicker.value = false;
488 }; 336 };
489 337
490 /** 338 /**
...@@ -492,26 +340,26 @@ const onTypeConfirm = (option) => { ...@@ -492,26 +340,26 @@ const onTypeConfirm = (option) => {
492 * @param {Object} option - 选中的选项 340 * @param {Object} option - 选中的选项
493 */ 341 */
494 const onFrequencyConfirm = (option) => { 342 const onFrequencyConfirm = (option) => {
495 - formData.value.frequency = option.selectedOptions[0].text; 343 + formData.value.frequency = option.selectedOptions[0].text;
496 - showFrequencyPicker.value = false; 344 + showFrequencyPicker.value = false;
497 }; 345 };
498 346
499 /** 347 /**
500 * 开始时间确认 348 * 开始时间确认
501 */ 349 */
502 const onStartTimeConfirm = () => { 350 const onStartTimeConfirm = () => {
503 - const [year, month, day] = startDate.value; 351 + const [year, month, day] = startDate.value;
504 - formData.value.start_time = new Date(parseInt(year), parseInt(month) - 1, parseInt(day)); 352 + formData.value.start_time = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
505 - showStartTimePicker.value = false; 353 + showStartTimePicker.value = false;
506 }; 354 };
507 355
508 /** 356 /**
509 * 结束时间确认 357 * 结束时间确认
510 */ 358 */
511 const onEndTimeConfirm = () => { 359 const onEndTimeConfirm = () => {
512 - const [year, month, day] = endDate.value; 360 + const [year, month, day] = endDate.value;
513 - formData.value.end_time = new Date(parseInt(year), parseInt(month) - 1, parseInt(day)); 361 + formData.value.end_time = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
514 - showEndTimePicker.value = false; 362 + showEndTimePicker.value = false;
515 }; 363 };
516 364
517 /** 365 /**
...@@ -519,9 +367,9 @@ const onEndTimeConfirm = () => { ...@@ -519,9 +367,9 @@ const onEndTimeConfirm = () => {
519 * @param {Object} course - 选中的课程 367 * @param {Object} course - 选中的课程
520 */ 368 */
521 const onCourseSelect = (course) => { 369 const onCourseSelect = (course) => {
522 - formData.value.course = course.name; 370 + formData.value.course = course.name;
523 - showCoursePicker.value = false; 371 + showCoursePicker.value = false;
524 - courseSearchValue.value = ''; 372 + courseSearchValue.value = '';
525 }; 373 };
526 374
527 /** 375 /**
...@@ -529,9 +377,9 @@ const onCourseSelect = (course) => { ...@@ -529,9 +377,9 @@ const onCourseSelect = (course) => {
529 * @param {Object} activity - 选中的活动 377 * @param {Object} activity - 选中的活动
530 */ 378 */
531 const onActivitySelect = (activity) => { 379 const onActivitySelect = (activity) => {
532 - formData.value.activity = activity.name; 380 + formData.value.activity = activity.name;
533 - showActivityPicker.value = false; 381 + showActivityPicker.value = false;
534 - activitySearchValue.value = ''; 382 + activitySearchValue.value = '';
535 }; 383 };
536 384
537 /** 385 /**
...@@ -539,9 +387,9 @@ const onActivitySelect = (activity) => { ...@@ -539,9 +387,9 @@ const onActivitySelect = (activity) => {
539 * @param {Object} grade - 选中的年级 387 * @param {Object} grade - 选中的年级
540 */ 388 */
541 const onGradeSelect = (grade) => { 389 const onGradeSelect = (grade) => {
542 - formData.value.grade = grade.name; 390 + formData.value.grade = grade.name;
543 - showGradePicker.value = false; 391 + showGradePicker.value = false;
544 - gradeSearchValue.value = ''; 392 + gradeSearchValue.value = '';
545 }; 393 };
546 394
547 /** 395 /**
...@@ -549,9 +397,9 @@ const onGradeSelect = (grade) => { ...@@ -549,9 +397,9 @@ const onGradeSelect = (grade) => {
549 * @param {Object} classItem - 选中的班级 397 * @param {Object} classItem - 选中的班级
550 */ 398 */
551 const onClassSelect = (classItem) => { 399 const onClassSelect = (classItem) => {
552 - formData.value.class_name = classItem.name; 400 + formData.value.class_name = classItem.name;
553 - showClassPicker.value = false; 401 + showClassPicker.value = false;
554 - classSearchValue.value = ''; 402 + classSearchValue.value = '';
555 }; 403 };
556 404
557 /** 405 /**
...@@ -559,9 +407,9 @@ const onClassSelect = (classItem) => { ...@@ -559,9 +407,9 @@ const onClassSelect = (classItem) => {
559 * @param {Object} group - 选中的小组 407 * @param {Object} group - 选中的小组
560 */ 408 */
561 const onGroupSelect = (group) => { 409 const onGroupSelect = (group) => {
562 - formData.value.group_name = group.name; 410 + formData.value.group_name = group.name;
563 - showGroupPicker.value = false; 411 + showGroupPicker.value = false;
564 - groupSearchValue.value = ''; 412 + groupSearchValue.value = '';
565 }; 413 };
566 414
567 /** 415 /**
...@@ -569,7 +417,7 @@ const onGroupSelect = (group) => { ...@@ -569,7 +417,7 @@ const onGroupSelect = (group) => {
569 * @param {string} value - 搜索值 417 * @param {string} value - 搜索值
570 */ 418 */
571 const searchCourse = (value) => { 419 const searchCourse = (value) => {
572 - courseSearchValue.value = value; 420 + courseSearchValue.value = value;
573 }; 421 };
574 422
575 /** 423 /**
...@@ -577,7 +425,7 @@ const searchCourse = (value) => { ...@@ -577,7 +425,7 @@ const searchCourse = (value) => {
577 * @param {string} value - 搜索值 425 * @param {string} value - 搜索值
578 */ 426 */
579 const searchActivity = (value) => { 427 const searchActivity = (value) => {
580 - activitySearchValue.value = value; 428 + activitySearchValue.value = value;
581 }; 429 };
582 430
583 /** 431 /**
...@@ -585,7 +433,7 @@ const searchActivity = (value) => { ...@@ -585,7 +433,7 @@ const searchActivity = (value) => {
585 * @param {string} value - 搜索值 433 * @param {string} value - 搜索值
586 */ 434 */
587 const searchGrade = (value) => { 435 const searchGrade = (value) => {
588 - gradeSearchValue.value = value; 436 + gradeSearchValue.value = value;
589 }; 437 };
590 438
591 /** 439 /**
...@@ -593,7 +441,7 @@ const searchGrade = (value) => { ...@@ -593,7 +441,7 @@ const searchGrade = (value) => {
593 * @param {string} value - 搜索值 441 * @param {string} value - 搜索值
594 */ 442 */
595 const searchClass = (value) => { 443 const searchClass = (value) => {
596 - classSearchValue.value = value; 444 + classSearchValue.value = value;
597 }; 445 };
598 446
599 /** 447 /**
...@@ -601,7 +449,7 @@ const searchClass = (value) => { ...@@ -601,7 +449,7 @@ const searchClass = (value) => {
601 * @param {string} value - 搜索值 449 * @param {string} value - 搜索值
602 */ 450 */
603 const searchGroup = (value) => { 451 const searchGroup = (value) => {
604 - groupSearchValue.value = value; 452 + groupSearchValue.value = value;
605 }; 453 };
606 454
607 /** 455 /**
...@@ -609,64 +457,64 @@ const searchGroup = (value) => { ...@@ -609,64 +457,64 @@ const searchGroup = (value) => {
609 * @param {Object} values - 表单值 457 * @param {Object} values - 表单值
610 */ 458 */
611 const handleSubmit = async (values) => { 459 const handleSubmit = async (values) => {
612 - try { 460 + try {
613 - loading.value = true; 461 + loading.value = true;
614 462
615 - // 验证必填项 463 + // 验证必填项
616 - if (!formData.value.homework_name) { 464 + if (!formData.value.homework_name) {
617 - showToast('请输入作业名称'); 465 + showToast('请输入作业名称');
618 - return; 466 + return;
619 - } 467 + }
620 468
621 - // 这里可以调用API提交数据 469 + // 这里可以调用API提交数据
622 - console.log('提交的表单数据:', formData.value); 470 + console.log('提交的表单数据:', formData.value);
623 471
624 - // 模拟API调用 472 + // 模拟API调用
625 - await new Promise(resolve => setTimeout(resolve, 1000)); 473 + await new Promise(resolve => setTimeout(resolve, 1000));
626 474
627 - showToast('保存成功'); 475 + showToast('保存成功');
628 476
629 - // 返回上一页或跳转到列表页 477 + // 返回上一页或跳转到列表页
630 - $router.back(); 478 + $router.back();
631 479
632 - } catch (error) { 480 + } catch (error) {
633 - console.error('提交失败:', error); 481 + console.error('提交失败:', error);
634 - showToast('保存失败,请重试'); 482 + showToast('保存失败,请重试');
635 - } finally { 483 + } finally {
636 - loading.value = false; 484 + loading.value = false;
637 - } 485 + }
638 }; 486 };
639 487
640 /** 488 /**
641 * 组件挂载时初始化数据 489 * 组件挂载时初始化数据
642 */ 490 */
643 onMounted(() => { 491 onMounted(() => {
644 - // 这里可以调用API获取课程、活动、年级、班级、小组等数据 492 + // 这里可以调用API获取课程、活动、年级、班级、小组等数据
645 - console.log('页面初始化'); 493 + console.log('页面初始化');
646 }); 494 });
647 </script> 495 </script>
648 496
649 <style scoped> 497 <style scoped>
650 /* 自定义样式 */ 498 /* 自定义样式 */
651 :deep(.van-field__label) { 499 :deep(.van-field__label) {
652 - color: #333; 500 + color: #333;
653 - font-weight: 500; 501 + font-weight: 500;
654 } 502 }
655 503
656 :deep(.van-field--required .van-field__label::before) { 504 :deep(.van-field--required .van-field__label::before) {
657 - color: #ee0a24; 505 + color: #ee0a24;
658 } 506 }
659 507
660 :deep(.van-button--primary) { 508 :deep(.van-button--primary) {
661 - background: linear-gradient(135deg, #10b981 0%, #059669 100%); 509 + background: linear-gradient(135deg, #10b981 0%, #059669 100%);
662 - border: none; 510 + border: none;
663 } 511 }
664 512
665 :deep(.van-popup) { 513 :deep(.van-popup) {
666 - border-radius: 16px 16px 0 0; 514 + border-radius: 16px 16px 0 0;
667 } 515 }
668 516
669 :deep(.van-picker__toolbar) { 517 :deep(.van-picker__toolbar) {
670 - border-radius: 16px 16px 0 0; 518 + border-radius: 16px 16px 0 0;
671 } 519 }
672 </style> 520 </style>
......