vue实现的一款高校校历

909 阅读1分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

第一当然是先来看看效果图啦,一个根据学期展现学期的上课周和考试周期的日历。

8ecc5864107a40c0b273b29253b2cb0.jpg

分析步骤

思路分析:

1、首先获取该学期的日期(2021年08月30日 - 2022年02月21日)为该学期的教学周

2、获取该教学周中,节假日的日期

3、教学周的那几周为考试周

4、开始布局日历的格式

5、日历数据的处理

数据处理分析:

1、设置考试周`week`

2、设置节假日`note`

3`getDiffDate` 获取时间段的所有日期数组(处理当前数组中的日期,和note比对,存在的节假日,定义node字段)

4`getoneWeek` 获取月份的第一天,定义特殊的样式,区分月份

5`getk` 比对考试周`week` 当前周存在`week` 中,为考试周,设置考试周的样式

6`getzhou``getzhouOne` 比对考试周的日期,设置日期的高两条样式。


实现代码

<div class="week-header" v-if="!beizhu">
        <h6>教学<br />周次</h6>
        <ul>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
        </ul>
</div>
 <div class="weekmain" v-if="!beizhu">
      <div class="week">
        <ul>
          <li v-for="(item,index) in parseInt(date.length  / 7)"
              :key="index">
            <p v-if="!getk(item)">{{item}}</p>
            <p v-if="getk(item)"
               style="color:#11b497">{{item}}</p>
            <p v-if="getk(item)"
               style="color:#11b497;font-size:0.18rem;">考试周</p>
          </li>
        </ul>
      </div>
      <div class="day">
        <ul>
          <li v-for="(item,index) in date"
              :key="index"
              :class="[getzhou(parseInt(index / 7) + 1) ? 'active' : '',getzhouOne((index / 7) + 1) ? 'active2' : '']">
             <h6 v-if="new Date(item.day).getDate() == 1">{{getoneWeek(item.day)}}</h6>
            <p v-if="item.day && new Date(item.day).getDate() != 1">{{new Date(item.day).getDate()}}</p>
            <span>{{item.node}}</span> 
          </li>
        </ul>
      </div>
    </div>
<script>
export default {
  data () {
    return {
      xueqi:{
        text:'2021年秋季',
        id:1
      },
      showPicker:false,
      columns: [{
        text:'2021年秋季',
        id:1
      }],
      beizhu:false,
      week: ['17', '18', '19', '20'],
      date: [],
      kongday: 0,
      
      note: [{
        8: { 30: "老生开学"},
        1: { 1: "元旦节"},
        9: { 10: "教师节", 13: '新生开学', 21: '中秋节'  },
        10: { 1: "国庆节" },
        2: { 1: "春节" }
      }]
    }
  },
  mounted () {
    var date = this.getDiffDate('2021/08/30', '2022/02/21')
    for (let i = 0; i < date.length; i++) {
      var list = {}
      var m = new Date(date[i]).getMonth() + 1;
      var day = new Date(date[i]).getDate();
      list.day = new Date(date[i])

      if (this.note[0][m]) {
        if (this.note[0][m][day]) {
          list.node = this.note[0][m][day]
        }
      }
      this.date.push(list)

    }
    var kongday = new Date(date[0]).getDay() == 0 ? 7 : new Date(date[0]).getDay()
    if (kongday > 0 && kongday <= 7) {
      for (var i = 0; i < kongday - 1; i++) {
        this.date.unshift({})
      }
    }

  },
  methods: {
    getzhou(z){
     var d = this.week.find((e=>{
        return e == z
      }))
    return d
    },
    getzhouOne(z){
      var d = this.week.find((e=>{
        return e == z
      }))
    return d
    },
    // 选择学期
    onConfirm(value) {
      console.log(value)
      this.xueqi = value;
      this.showPicker = false;
    },
     
    getk (i) {
      var kao = this.week.find((e) => {
        return Number(e) == i
      })
      
      return kao
    },
    
    getoneWeek (day) {
      var tempDate = new Date();

      var days = new Date(day).getMonth() + 1;
      var week;

      switch (days) {
        case 1:
          week = '一月';
          break;
        case 2:
          week = '二月';
          break;
        case 3:
          week = '三月';
          break;
        case 4:
          week = '四月';
          break;
        case 5:
          week = '五月';
          break;
        case 6:
          week = '六月';
          break;
        case 7:
          week = '七月';
          break;
        case 8:
          week = '八月';
          break;
        case 9:
          week = '九月';
          break;
        case 10:
          week = '十月';
          break;
        case 11:
          week = '十一月';
          break;
        case 12:
          week = '十二月';
          break;
      }
      return week
    },
    getDiffDate (start, end) {
      var startTime = this.getDate(start);
      var endTime = this.getDate(end);
      var dateArr = [];
      while ((endTime.getTime() - startTime.getTime()) > 0) {
        var year = startTime.getFullYear();
        var month = startTime.getMonth().toString().length === 1 ? (parseInt(startTime.getMonth().toString(), 10) + 1) : (startTime.getMonth() + 1);
        var day = startTime.getDate().toString().length === 1 ? "0" + startTime.getDate() : startTime.getDate();
        dateArr.push(year + "/" + month + "/" + day);
        startTime.setDate(startTime.getDate() + 1);
      }
      return dateArr;

    },



    getDate (datestr) {
      var temp = datestr.split("/");
      if (temp[1] === '01') {
        temp[0] = parseInt(temp[0], 10) - 1;
        temp[1] = '12';
      } else {
        temp[1] = parseInt(temp[1], 10) - 1;
      }
      //new Date()的月份入参实际都是当前值-1
      var date = new Date(temp[0], temp[1], temp[2]);
      return date;

    }

  }
}
</script>

总结

在创建 Date 对象时尽量使用new Date('2021/01/01')这样的写法,否则在IOS设备上可能会出现Null 的情况。