Skip to content

封装课表组件

更新: 2025/3/21 20:30:41 字数: 0 字

需求分析

  课表,是用来展示我们学校的上课的时间表。

  我们的课表分两种,一种是展示整个学期的课表,一种是通过选择周次来展示某一周的课表。

  后面还可以通过这个展示一个教师的课表情况。

课表效果展示

旧系统课表展示

我自己开发的课表展示,一个是展示的全部学期的课程信息,一个是选择周次来展示某一周的课程信息。

制作过程

分析数据

  下面的是后端返回的数据结构:

点我查看后端返回的数据结构
json
{
  "msg": "操作成功",
  "firstCollum": {
    "1": "上午1-2节",
    "2": "上午3-4节",
    "3": "下午5-6节",
    "4": "下午7-8节",
    "5": "晚上9-10节"
  },
  "code": 0,
  "data": [
    [
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": [
          {
            "id": 144936,
            "tcId": 78432,
            "roomId": 349,
            "roomNumber": "5B414",
            "coursrName": "操作系统原理",
            "weekId": 0,
            "weekName": "1-16周",
            "period": 2,
            "weekDay": 3,
            "startSection": 1,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321413 "
          }
        ]
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": [
          {
            "id": 144944,
            "tcId": 78454,
            "roomId": 527,
            "roomNumber": "2101",
            "coursrName": "计算机网络A",
            "weekId": 0,
            "weekName": "1-16周",
            "period": 2,
            "weekDay": 7,
            "startSection": 1,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321413 "
          }
        ]
      }
    ],
    [
      {
        "teacherArrange": [
          {
            "id": 144952,
            "tcId": 78440,
            "roomId": 353,
            "roomNumber": "5B507",
            "coursrName": "Java程序设计",
            "weekId": 0,
            "weekName": "1-10周",
            "period": 2,
            "weekDay": 1,
            "startSection": 3,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321413 "
          }
        ]
      },
      {
        "teacherArrange": [
          {
            "id": 144923,
            "tcId": 78428,
            "roomId": 349,
            "roomNumber": "5B414",
            "coursrName": "计算机组成原理",
            "weekId": 0,
            "weekName": "1-16周",
            "period": 2,
            "weekDay": 2,
            "startSection": 3,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321410 0321411 <br/>0321413 "
          }
        ]
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": [
          {
            "id": 143388,
            "tcId": 77187,
            "roomId": 347,
            "roomNumber": "5B412",
            "coursrName": "习近平新时代中国特色社会主义思想概论",
            "weekId": 0,
            "weekName": "1-12周",
            "period": 2,
            "weekDay": 4,
            "startSection": 3,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321412 0321413 "
          }
        ]
      },
      {
        "teacherArrange": [
          {
            "id": 144924,
            "tcId": 78428,
            "roomId": 349,
            "roomNumber": "5B414",
            "coursrName": "计算机组成原理",
            "weekId": 0,
            "weekName": "1-16周",
            "period": 2,
            "weekDay": 5,
            "startSection": 3,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321410 0321411 <br/>0321413 "
          }
        ]
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": [
          {
            "id": 144945,
            "tcId": 78454,
            "roomId": 357,
            "roomNumber": "5B504",
            "coursrName": "计算机网络A",
            "weekId": 0,
            "weekName": "1-16周",
            "period": 2,
            "weekDay": 7,
            "startSection": 3,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321413 "
          }
        ]
      }
    ],
    [
      {
        "teacherArrange": [
          {
            "id": 143387,
            "tcId": 77187,
            "roomId": 347,
            "roomNumber": "5B412",
            "coursrName": "习近平新时代中国特色社会主义思想概论",
            "weekId": 0,
            "weekName": "1-12周",
            "period": 2,
            "weekDay": 1,
            "startSection": 5,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321412 0321413 "
          }
        ]
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": [
          {
            "id": 144819,
            "tcId": 78457,
            "roomId": 350,
            "roomNumber": "5B415",
            "coursrName": "C++面向对象程序设计",
            "weekId": 0,
            "weekName": "2-13周",
            "period": 2,
            "weekDay": 5,
            "startSection": 5,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0322408 0322409 <br/>0322410 "
          }
        ]
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      }
    ],
    [
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": [
          {
            "id": 144935,
            "tcId": 78432,
            "roomId": 351,
            "roomNumber": "5B410",
            "coursrName": "操作系统原理",
            "weekId": 0,
            "weekName": "1-16周",
            "period": 2,
            "weekDay": 2,
            "startSection": 7,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321413 "
          }
        ]
      },
      {
        "teacherArrange": [
          {
            "id": 144953,
            "tcId": 78440,
            "roomId": 354,
            "roomNumber": "5B506",
            "coursrName": "Java程序设计",
            "weekId": 0,
            "weekName": "1-10周",
            "period": 2,
            "weekDay": 3,
            "startSection": 7,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0321413 "
          }
        ]
      },
      {
        "teacherArrange": [
          {
            "id": 144820,
            "tcId": 78457,
            "roomId": 350,
            "roomNumber": "5B415",
            "coursrName": "C++面向对象程序设计",
            "weekId": 0,
            "weekName": "2-13周",
            "period": 2,
            "weekDay": 4,
            "startSection": 7,
            "courseSection": null,
            "periodType": 0,
            "teacherId": 2001467,
            "teacherName": "朱梅",
            "classesName": "0322408 0322409 <br/>0322410 "
          }
        ]
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      }
    ],
    [
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      },
      {
        "teacherArrange": []
      }
    ]
  ],
  "year": 2023,
  "term": "0"
}

  经过分析数据:

js
// 这个是接口返回的数据
const data = [
    // 第 1-2 节课 
    [
        // 周一
        {teacherArrange:[]},
        // 周二
        {teacherArrange:[]},
        {teacherArrange:[
                // {...} -> 是上课课程信息
                {...},
                {...}
            ]},
        {teacherArrange:[]},
        {teacherArrange:[]},
        {teacherArrange:[]},
        // 周日
        {teacherArrange:[]}
    ],
    // 3 - 4 节
    [],
    // 5 - 6 节
    [],
    // 7 - 8 节
    [],
    // 9 - 10
    [],
]

数据处理

js

import {getCourseScheduleUrl} from "@/api/home/home";

const param = reactive({
  queryYear: '0',
})
const weekCourse = ref([])
const firstCollum = ref([])
// 当前周次
const currentWeek = ref(1)
// 当前周次课程
const currentWeekCourse = ref([])
const getCourseSchedule = () => {
  let type = 2
  getCourseScheduleUrl(type, param).then((req) => {
    weekCourse.value = req.data
    firstCollum.value = req.firstCollum
    getCurrentWeekCourseByWeek()
  })
}

const backgroundColorList = ref(['#8BA2FF', '#FF6160', '#FEBF00', '#97CFF2', '#72BD3C', '#FF9899', '#F58345', '#EFA5E0', '#F88183']) // 背景颜色数组集合
const backGroundColor = new Map()

const getCurrentWeekCourseByWeek = () => {
  let colorIndex = 0
  backGroundColor.clear()
  currentWeekCourse.value = []
  for (let i = 0; i < weekCourse.value.length; i++) {
    const item = weekCourse.value[i]
    let needCourse = []
    for (let j = 0; j < item.length; j++) {
        // 这里看情况而定
        // 可以过滤展示指定周次的信息,也可以展示所有的课程信息
      const courses = item[j]?.teacherArrange.filter((course, index) => {
        let startWeek, endWeek
        if (course.weekName.indexOf('-') !== -1) {
          startWeek = course.weekName.split('-')[0]
          endWeek = course.weekName.split('-')[1]
        }
        if (startWeek && endWeek) {
          startWeek = parseInt(startWeek)
          endWeek = parseInt(endWeek)
          if (startWeek <= currentWeek.value && currentWeek.value <= endWeek) {
            return true
          }
        }
      }).map((course)=> {
        console.log("course", course.coursrName)
        const courseName = course?.coursrName
        if (backGroundColor.has(courseName)) {
          course.color = backGroundColor.get(courseName)
        }else {
          course.color = backgroundColorList.value[colorIndex]
          backGroundColor.set(courseName, course.color)
          colorIndex++
        }
        return course
      })
      needCourse.push(courses)
    }
    currentWeekCourse.value.push(needCourse)
  }
}

const weeks = reactive([
  {
    id: 1,
    week: '星期一',
  }, 
    // ...
  {
    id: 7,
    week: '星期日',
  },
])


const options = [
  {
    label: '第一周',
    value: 1,
  },
  // ...
  {
    label: '第十八周',
    value: 18,
  },
]



onMounted(() => {
    getCourseSchedule()
})

template 部分

vue

<template>
  <el-card>
    <template #header>
      <!--后期可以将 select 换成 segmented 分段控制器     -->
      <el-select v-model="currentWeek" size="small" @change="getCurrentWeekCourseByWeek">
        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"/>
      </el-select>
    </template>
    <template #default>

      <div class="timetable w100">
        <!--课程表    -->
        <div class="timetable-b w100">
          <table class="timetable-content w100">
            <!--表格表头数据        -->
            <thead>
            <tr>
              <th/>
              <th v-for="(week, weekIndex) in weeks" :key="week.id">
                {{ week.week }}
              </th>
            </tr>
            </thead>

            <!--表格数据        -->
            <tbody>
            <tr v-for="(item2, index2) in firstCollum" :key="index2">
              <!--第一列课表节 -->
              <td>
                <p>{{ item2 }}</p>
              </td>

              <td v-for="(item, index) in currentWeekCourse[index2 - 1]" :key="index">
                <div
                    :style="[
                    {
                       background: course.color,
                    },
                    { color: '#fff' },
                    { borderRadius: '15px' },
                    { padding: '10px' },
                    { height: '100%' },
                    { width: '100%' },
                  ]"
                    v-for="(course, index3) in item" class="div-class-tab" :key="index3"
                    style="overflow: hidden; text-overflow: ellipsis; ">
                  {{ course.coursrName }}
                  <br/>
                  <span v-html="course.classesName"/>
                  <br/>
                  {{ course.weekName }}
                  <br/>
                  {{ course.roomNumber }}
                </div>
              </td>
            </tr>
            </tbody>
          </table>
        </div>
      </div>

    </template>
  </el-card>
</template>

道友再会.