hookehuyr

feat(teacher): 改进教师表单页面布局和样式

重构教师表单页面,优化布局和样式,提升用户体验
- 添加作业说明文本区域
- 使用van-stepper组件替代数字输入
- 重新组织表单结构为清晰的部分
- 增强移动端响应式设计
- 更新样式和交互元素
...@@ -62,6 +62,7 @@ declare module 'vue' { ...@@ -62,6 +62,7 @@ declare module 'vue' {
62 VanRate: typeof import('vant/es')['Rate'] 62 VanRate: typeof import('vant/es')['Rate']
63 VanRow: typeof import('vant/es')['Row'] 63 VanRow: typeof import('vant/es')['Row']
64 VanSearch: typeof import('vant/es')['Search'] 64 VanSearch: typeof import('vant/es')['Search']
65 + VanStepper: typeof import('vant/es')['Stepper']
65 VanSticky: typeof import('vant/es')['Sticky'] 66 VanSticky: typeof import('vant/es')['Sticky']
66 VanSwipe: typeof import('vant/es')['Swipe'] 67 VanSwipe: typeof import('vant/es')['Swipe']
67 VanSwipeItem: typeof import('vant/es')['SwipeItem'] 68 VanSwipeItem: typeof import('vant/es')['SwipeItem']
......
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:56:22 4 + * @LastEditTime: 2025-06-20 13:38:10
5 * @FilePath: /mlaj/src/views/teacher/checkinPage.vue 5 * @FilePath: /mlaj/src/views/teacher/checkinPage.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
67 </div> 67 </div>
68 </div> 68 </div>
69 69
70 - <div style="padding: 0 1rem; color: #4caf50;"> 70 + <div class="text-wrapper" style="padding: 0 1rem; color: #4caf50;">
71 <div class="text-header">学生动态</div> 71 <div class="text-header">学生动态</div>
72 <van-list 72 <van-list
73 v-if="checkinDataList.length" 73 v-if="checkinDataList.length"
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
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-20 10:58:03 5 + * @LastEditTime: 2025-06-20 15:43:37
6 * @FilePath: /mlaj/src/views/teacher/formPage.vue 6 * @FilePath: /mlaj/src/views/teacher/formPage.vue
7 * @Description: 教师作业新增表单页面 7 * @Description: 教师作业新增表单页面
8 --> 8 -->
...@@ -11,71 +11,133 @@ ...@@ -11,71 +11,133 @@
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="p-6">
15 <van-form @submit="handleSubmit"> 15 <van-form @submit="handleSubmit">
16 - <van-cell-group inset> 16 + <!-- 作业名称输入框 -->
17 - <!-- 作业名称 --> 17 + <div class="mb-6">
18 - <van-field v-model="formData.homework_name" name="homework_name" label="作业名称" placeholder="请输入作业名称" 18 + <van-field
19 - required :border="false" :rules="[{ required: true, message: '请输入作业名称' }]" /> 19 + v-model="formData.homework_name"
20 - 20 + name="homework_name"
21 - <!-- 类型 --> 21 + placeholder="请输入作业名称"
22 - <!-- <van-field 22 + required
23 - v-model="formData.type" 23 + :border="false"
24 - is-link 24 + class="homework-name-field"
25 - readonly 25 + />
26 - name="type" 26 + </div>
27 - label="类型" 27 +
28 - placeholder="请选择类型" 28 + <!-- 作业要求说明 -->
29 - :border="false" 29 + <div class="mb-6">
30 - @click="showTypePicker = true" 30 + <van-field
31 - /> --> 31 + v-model="formData.description"
32 - 32 + name="description"
33 - <!-- 频次 --> 33 + type="textarea"
34 - <van-field v-model="formData.frequency" is-link readonly name="frequency" label="频次" placeholder="请选择频次" 34 + placeholder="请输入作业要求和说明"
35 - :border="false" @click="showFrequencyPicker = true" /> 35 + :border="false"
36 - 36 + rows="4"
37 - <!-- 目标总数 --> 37 + class="description-field"
38 - <van-field v-model="formData.target_count" type="number" name="target_count" label="目标总数" 38 + />
39 - :border="false" placeholder="请输入目标数量" /> 39 + </div>
40 - 40 +
41 - <!-- 开始时间 --> 41 + <!-- 作业设置 -->
42 - <van-field v-model="startTimeDisplay" is-link readonly name="start_time" label="开始时间" 42 + <div class="mb-6">
43 - placeholder="请选择开始时间" :border="false" @click="showStartTimePicker = true" /> 43 + <h3 class="section-title">作业设置</h3>
44 - 44 + <van-row>
45 - <!-- 结束时间 --> 45 + <van-col span="12">
46 - <van-field v-model="endTimeDisplay" is-link readonly name="end_time" label="结束时间" placeholder="请选择结束时间" 46 + <label class="setting-label">作业频次</label>
47 - :border="false" @click="showEndTimePicker = true" /> 47 + <van-field
48 - 48 + v-model="formData.frequency"
49 - <!-- 课程 --> 49 + is-link
50 - <van-field v-model="formData.course" is-link readonly name="course" label="课程" placeholder="请选择课程" 50 + readonly
51 - :border="false" @click="showCoursePicker = true" /> 51 + name="frequency"
52 - 52 + placeholder="每天"
53 - <!-- 活动 --> 53 + :border="false"
54 - <van-field v-model="formData.activity" is-link readonly name="activity" label="活动" placeholder="请选择活动" 54 + @click="showFrequencyPicker = true"
55 - :border="false" @click="showActivityPicker = true" /> 55 + class="frequency-field"
56 - 56 + />
57 - <!-- 年级 --> 57 + </van-col>
58 - <van-field v-model="formData.grade" is-link readonly name="grade" label="年级" placeholder="请选择年级" 58 + <van-col span="12">
59 - :border="false" @click="showGradePicker = true" /> 59 + <label class="setting-label">目标总数</label>
60 - 60 + <div class="target-count-container">
61 - <!-- 班级 --> 61 + <van-stepper
62 - <van-field v-model="formData.class_name" is-link readonly name="class_name" label="班级" 62 + v-model="formData.target_count"
63 - placeholder="请选择班级" :border="false" @click="showClassPicker = true" /> 63 + min="1"
64 - 64 + max="100"
65 - <!-- 小组 --> 65 + integer
66 - <van-field v-model="formData.group_name" is-link readonly name="group_name" label="小组" 66 + button-size="24px"
67 - placeholder="请选择小组" :border="false" @click="showGroupPicker = true" /> 67 + input-width="60px"
68 - </van-cell-group> 68 + />
69 + <span class="target-unit">次</span>
70 + </div>
71 + </van-col>
72 + </van-row>
73 + </div>
74 +
75 + <!-- 时间设置 -->
76 + <div class="mb-6">
77 + <div class="time-row">
78 + <div class="time-item">
79 + <van-icon name="calendar-o" class="time-icon" />
80 + <span class="time-label">开始日期:</span>
81 + <span class="time-value" @click="showStartTimePicker = true">
82 + {{ startTimeDisplay || '2025-05-13' }}
83 + </span>
84 + <van-icon name="arrow" class="arrow-icon" />
85 + </div>
86 + </div>
87 + <div class="time-row">
88 + <div class="time-item">
89 + <van-icon name="calendar-o" class="time-icon" />
90 + <span class="time-label">结束日期:</span>
91 + <span class="time-value" @click="showEndTimePicker = true">
92 + {{ endTimeDisplay || '2025-06-13' }}
93 + </span>
94 + <van-icon name="arrow" class="arrow-icon" />
95 + </div>
96 + </div>
97 + </div>
98 +
99 + <!-- 选择项目 -->
100 + <div class="mb-6">
101 + <div class="select-row">
102 + <div class="select-item">
103 + <van-icon name="calendar-o" class="select-icon" />
104 + <span class="select-label">所在年级:</span>
105 + <van-icon name="arrow" class="arrow-icon" @click="showGradePicker = true" />
106 + </div>
107 + </div>
108 + <div class="select-row">
109 + <div class="select-item">
110 + <van-icon name="calendar-o" class="select-icon" />
111 + <span class="select-label">所在班级:</span>
112 + <van-icon name="arrow" class="arrow-icon" @click="showClassPicker = true" />
113 + </div>
114 + </div>
115 + <div class="select-row">
116 + <div class="select-item">
117 + <van-icon name="calendar-o" class="select-icon" />
118 + <span class="select-label">所在课程:</span>
119 + <van-icon name="arrow" class="arrow-icon" @click="showCoursePicker = true" />
120 + </div>
121 + </div>
122 + </div>
69 123
70 <!-- 提交按钮 --> 124 <!-- 提交按钮 -->
71 - <div style="margin: 16px;"> 125 + <div class="submit-container">
72 - <van-button native-type="submit" type="primary" block round :loading="loading"> 126 + <van-button
73 - 确认并保存 127 + native-type="submit"
128 + type="primary"
129 + block
130 + round
131 + :loading="loading"
132 + class="submit-btn"
133 + >
134 + 确认发布
74 </van-button> 135 </van-button>
75 </div> 136 </div>
76 </van-form> 137 </van-form>
77 </div> 138 </div>
78 </FrostedGlass> 139 </FrostedGlass>
140 + <div style="height: 4rem;"></div>
79 </div> 141 </div>
80 </div> 142 </div>
81 143
...@@ -175,9 +237,10 @@ const type = ref(''); ...@@ -175,9 +237,10 @@ const type = ref('');
175 // 表单数据 237 // 表单数据
176 const formData = ref({ 238 const formData = ref({
177 homework_name: '', 239 homework_name: '',
240 + description: '',
178 type: $route.query.type === 'homework' ? '上传附件' : '签到', 241 type: $route.query.type === 'homework' ? '上传附件' : '签到',
179 frequency: '', 242 frequency: '',
180 - target_count: '', 243 + target_count: 10,
181 start_time: new Date(), 244 start_time: new Date(),
182 end_time: new Date(), 245 end_time: new Date(),
183 course: '', 246 course: '',
...@@ -496,18 +559,175 @@ onMounted(() => { ...@@ -496,18 +559,175 @@ onMounted(() => {
496 559
497 <style scoped> 560 <style scoped>
498 /* 自定义样式 */ 561 /* 自定义样式 */
499 -:deep(.van-field__label) { 562 +
563 +/* 作业名称输入框 */
564 +.homework-name-field {
565 + background: #f5f5f5;
566 + border-radius: 12px;
567 + padding: 0.5rem;
568 +}
569 +
570 +:deep(.homework-name-field .van-field__control) {
571 + font-size: 16px;
572 + font-weight: 500;
573 + padding: 12px 16px;
574 +}
575 +
576 +/* 作业要求说明 */
577 +.description-field {
578 + background: #f5f5f5;
579 + border-radius: 12px;
580 + padding: 4px 0;
581 +}
582 +
583 +:deep(.description-field .van-field__control) {
584 + padding: 12px 16px;
585 + min-height: 100px;
586 +}
587 +
588 +/* 作业设置标题 */
589 +.section-title {
590 + font-size: 18px;
591 + font-weight: 600;
592 + color: #333;
593 + margin-bottom: 16px;
594 +}
595 +
596 +/* 设置行 */
597 +.setting-row {
598 + display: flex;
599 + gap: 20px;
600 + align-items: flex-start;
601 +}
602 +
603 +.setting-item {
604 + flex: 1;
605 +}
606 +
607 +.setting-label {
608 + display: block;
609 + font-size: 14px;
610 + color: #666;
611 + margin-bottom: 8px;
612 +}
613 +
614 +/* 频次选择 */
615 +.frequency-field {
616 + background: #f5f5f5;
617 + border-radius: 8px;
618 + padding: 2px 0;
619 +}
620 +
621 +:deep(.frequency-field .van-field__control) {
622 + /* padding: 2px; */
623 + text-align: center;
624 +}
625 +
626 +/* 目标总数容器 */
627 +.target-count-container {
628 + display: flex;
629 + align-items: center;
630 + justify-content: center;
631 + gap: 8px;
632 +}
633 +
634 +.target-unit {
635 + font-size: 14px;
636 + color: #666;
637 +}
638 +
639 +:deep(.van-stepper) {
640 + background: #f5f5f5;
641 + border-radius: 8px;
642 +}
643 +
644 +/* 时间设置 */
645 +.time-row {
646 + margin-bottom: 12px;
647 +}
648 +
649 +.time-item {
650 + display: flex;
651 + align-items: center;
652 + padding: 12px 16px;
653 + background: #f8f9fa;
654 + border-radius: 8px;
655 + cursor: pointer;
656 +}
657 +
658 +.time-icon {
659 + color: #666;
660 + margin-right: 12px;
661 +}
662 +
663 +.time-label {
664 + font-size: 14px;
665 + color: #333;
666 + margin-right: auto;
667 +}
668 +
669 +.time-value {
670 + font-size: 14px;
500 color: #333; 671 color: #333;
501 font-weight: 500; 672 font-weight: 500;
502 } 673 }
503 674
504 -:deep(.van-field--required .van-field__label::before) { 675 +.arrow-icon {
505 - color: #ee0a24; 676 + color: #999;
677 + margin-left: 8px;
678 + cursor: pointer;
679 +}
680 +
681 +/* 选择项目 */
682 +.select-row {
683 + margin-bottom: 12px;
684 +}
685 +
686 +.select-item {
687 + display: flex;
688 + align-items: center;
689 + padding: 12px 16px;
690 + background: #f8f9fa;
691 + border-radius: 8px;
692 + cursor: pointer;
693 +}
694 +
695 +.select-icon {
696 + color: #666;
697 + margin-right: 12px;
698 +}
699 +
700 +.select-label {
701 + font-size: 14px;
702 + color: #333;
703 + margin-right: auto;
704 +}
705 +
706 +/* 提交按钮 */
707 +.submit-container {
708 + margin-top: 32px;
709 +}
710 +
711 +.submit-btn {
712 + height: 48px;
713 + font-size: 16px;
714 + font-weight: 600;
506 } 715 }
507 716
508 -:deep(.van-button--primary) { 717 +:deep(.submit-btn.van-button--primary) {
509 - background: linear-gradient(135deg, #10b981 0%, #059669 100%); 718 + background: linear-gradient(135deg, #4ade80 0%, #22c55e 100%);
510 border: none; 719 border: none;
720 + box-shadow: 0 4px 12px rgba(34, 197, 94, 0.3);
721 +}
722 +
723 +/* 通用样式 */
724 +:deep(.van-field__label) {
725 + color: #333;
726 + font-weight: 500;
727 +}
728 +
729 +:deep(.van-field--required .van-field__label::before) {
730 + color: #ee0a24;
511 } 731 }
512 732
513 :deep(.van-popup) { 733 :deep(.van-popup) {
...@@ -517,4 +737,17 @@ onMounted(() => { ...@@ -517,4 +737,17 @@ onMounted(() => {
517 :deep(.van-picker__toolbar) { 737 :deep(.van-picker__toolbar) {
518 border-radius: 16px 16px 0 0; 738 border-radius: 16px 16px 0 0;
519 } 739 }
740 +
741 +/* 响应式设计 */
742 +@media (max-width: 480px) {
743 + .setting-row {
744 + flex-direction: column;
745 + gap: 16px;
746 + }
747 +
748 + .time-item,
749 + .select-item {
750 + padding: 10px 12px;
751 + }
752 +}
520 </style> 753 </style>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
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-20 10:17:50 5 + * @LastEditTime: 2025-06-20 11:47:35
6 * @FilePath: /mlaj/src/views/teacher/myClassPage.vue 6 * @FilePath: /mlaj/src/views/teacher/myClassPage.vue
7 * @Description: 我的班级页面 7 * @Description: 我的班级页面
8 --> 8 -->
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
30 <!-- 筛选器 --> 30 <!-- 筛选器 -->
31 <div> 31 <div>
32 <van-sticky> 32 <van-sticky>
33 - <van-dropdown-menu active-color="#10b981"> 33 + <van-dropdown-menu active-color="#10b981" swipe-threshold="3">
34 <van-dropdown-item v-model="gradeFilter" :options="gradeOptions" @change="handleGradeChange" /> 34 <van-dropdown-item v-model="gradeFilter" :options="gradeOptions" @change="handleGradeChange" />
35 <van-dropdown-item v-model="classFilter" :options="classOptions" @change="handleClassChange" /> 35 <van-dropdown-item v-model="classFilter" :options="classOptions" @change="handleClassChange" />
36 <van-dropdown-item v-model="courseFilter" :options="courseOptions" @change="handleCourseChange" /> 36 <van-dropdown-item v-model="courseFilter" :options="courseOptions" @change="handleCourseChange" />
...@@ -190,7 +190,7 @@ const gradeOptions = ref([ ...@@ -190,7 +190,7 @@ const gradeOptions = ref([
190 190
191 const classOptions = ref([ 191 const classOptions = ref([
192 { text: '全部班级', value: '全部班级' }, 192 { text: '全部班级', value: '全部班级' },
193 - { text: '高一(1)班', value: '高一(1)班' }, 193 + { text: '高一(1)班高一(1)班', value: '高一(1)班高一(1)班' },
194 { text: '高一(2)班', value: '高一(2)班' }, 194 { text: '高一(2)班', value: '高一(2)班' },
195 { text: '高一(3)班', value: '高一(3)班' } 195 { text: '高一(3)班', value: '高一(3)班' }
196 ]) 196 ])
......