美文网首页
vue实现展示工休日日历(含农历),并可点击切换工休日

vue实现展示工休日日历(含农历),并可点击切换工休日

作者: 风中凌乱的男子 | 来源:发表于2023-05-28 10:34 被阅读0次
    还是展示下成品效果
    image.png

    懒得解释了,直接丢源码吧

    里面有个农历的js文件,发私信找我索取
    <template>
      <div class="rili">
        <div class="change">
          <span>
            <el-button @click="changeMonthFun(1)">上月</el-button>
          </span>
          <el-date-picker :clearable="false" v-model="date" style="width: 120px;" @change="handleChange" type="month" placeholder="选择年月">
          </el-date-picker>
          <el-button @click="changeMonthFun(2)">下月</el-button>
        </div>
        <div class="rili_mouth">
          <!--components/xx-calendar/xx-calendar.wxml-->
          <!-- 头部 -->
          <div class="title-wrap">
            <div class="week">
              <span v-for="(item, index) in weeksArr" :key="index">{{ item }}</span>
            </div>
          </div>
          <!-- 日期 -->
          <div class="date-wrap">
            <!-- 上个月日期 -->
            <div class="mouth-date last-mouth" v-for="(item, index) in lastMonthDays" :key="index + 'a'">
              <span class="day-span">{{ item.date }}</span>
              <span class="day-nongli">十五</span>
              <span class="day-dot"></span>
            </div>
    
            <!-- 当月日期 -->
            <div class="mouth-date current-mouth" v-for="(item, index) in nowMonthDays" :key="index"
              @click="selectDate(item)">
              <div class="day-box" :class="item.restDay ? 'active' : ''">
                <span class="day-span">{{ item.date }}</span>
                <span class="day-nongli">{{ item.day }}</span>
                <span class="tip" v-if="item.restDay">休</span>
                <span class="tip" v-else>班</span>
              </div>
            </div>
            <!-- 下个月日期 -->
            <div class="mouth-date next-mouth" v-for="(item, index) in nextMonthDays" :key="index + 'b'">
              <span class="day-span">{{ item.date }}</span>
              <span class="day-nongli">十五</span>
              <span class="day-dot"></span>
            </div>
          </div>
    
        </div>
      </div>
    </template>
    
    <script>
    import calendarFormatter from "@/utils/calendar";
    export default {
      data() {
        return {
          restDayArr:[],
          year: new Date().getFullYear(),
          month: new Date().getMonth() + 1,
          date: new Date().getFullYear() + '-' + (new Date().getMonth() + 1),
          weeksArr: ['日', '一', '二', '三', '四', '五', '六'],
          nowMonth: new Date().getMonth() + 1, //本月是几月
          nowDay: new Date().getDate(), //本月当天的日期
          lastMonthDays: [], //上一个月
          nowMonthDays: [], //本月 
          nextMonthDays: [], //下一个月
        }
      },
      methods: {
        handleChange(val) {
        this.year = val.getFullYear()
        this.month = val.getMonth() + 1
        this.date = this.year + '-' + this.month
        console.log(this.date);
        this.createDays(this.year,this.month)
        this.getRestDays(this.year,this.month)
      },
        //获取当月天数
        getThisMonthDays(year, month) {
          return new Date(year, month, 0).getDate();
        },
        /** 总方法 */
        //创建日期
        createDays(year, month) {
          this.getLastMonthDays(year, month)
          this.getNowMonthDays(year, month)
          this.getNextMonthDays(year, month)
        },
        /** 获取上个月日期 */
        getLastMonthDays(year, month) {
          let nowMonthFirstDays = new Date(year, month - 1, 1).getDay()
          let lastMonthDays = []
          if (nowMonthFirstDays) { //判断当月的第一天是不是星期天
            //上个月显示多少天
            let lastMonthNums = month - 1 < 0 ? this.getThisMonthDays(year - 1, 12) : this.getThisMonthDays(year, month - 1); //判断是否会跨年
            //上个月从几号开始显示
            for (let i = lastMonthNums - nowMonthFirstDays + 1; i <= lastMonthNums; i++) {
              let time = new Date(year, month - 2, i).toLocaleDateString() //对应的时间
              lastMonthDays.push({
                date: i, //几号
                week: this.weeksArr[new Date(year, month - 2, i).getDay()], //星期几
                time,
                isNowMonthDay: ''
              });
            }
          }
          this.lastMonthDays = lastMonthDays
          console.log(this.lastMonthDays);
        },
        /** 获取当月日期 */
        getNowMonthDays(year, month) {
          let nowMonthDays = []
          let days = this.getThisMonthDays(year, month); //获取当月的天数
          for (let i = 1; i <= days; i++) {
            let d = new Date(year, month - 1, i)
            let years = d.getFullYear()
            let months = d.getMonth() + 1
            let day2 = d.getDate()
            let time = `${years + '/' + months + '/' + day2}` // 2023/3/3
            let timer = time.replace(/\//g, "-")
            let timer2 = timer.split('-')
            var day = calendarFormatter.solar2lunar(timer2[0], timer2[1], timer2[2]);
            let newdate
            if (day.IDayCn == '初一') {
              newdate = day.IMonthCn
            } else {
              newdate = day.IDayCn
            }
            nowMonthDays.push({
              date: i, //几号
              week: this.weeksArr[new Date(year, month - 1, i).getDay()], //星期几
              time,
              restDay: false,
              day: newdate,
            });
          }
          
          this.nowMonthDays = nowMonthDays
          console.log(nowMonthDays);
        },
        /** 获取下个月日期 */
        getNextMonthDays(year, month) {
          let {
            lastMonthDays,
            nowMonthDays,
          } = this
          let nextMonthDays = []
          let nextMonthNums = (lastMonthDays.length + nowMonthDays.length) > 35 ? 42 - (lastMonthDays.length + nowMonthDays.length) : 35 - (lastMonthDays.length + nowMonthDays.length) //下个月显示多少天
          let nowYear = (parseInt(month) + 1) > 12 ? year + 1 : year //下一个月的年份
          let nowMonth = (parseInt(month) + 1) > 12 ? 1 : parseInt(month) + 1 //下一个月的月份
          if (nextMonthNums) { //判断当前天数是否大于零
            for (let i = 1; i <= nextMonthNums; i++) {
              let time = new Date(year, month, i).toLocaleDateString()
              nextMonthDays.push({
                date: i, //几号
                week: this.weeksArr[new Date(nowYear, nowMonth - 1, i).getDay()], //星期几
                time,
                isNowMonthDay: ''
              });
            }
          }
    
          this.nextMonthDays = nextMonthDays
          console.log(nextMonthDays)
        },
        /** 切换月份 */
        changeMonthFun(e) {
          let {
            year,
            month
          } = this
          let type = e //类型
          if (type == 1) { //上一个月
            year = month - 1 > 0 ? year : year - 1
            month = month - 1 > 0 ? month - 1 : 12
          } else { //next 下个月
            year = (parseInt(month) + 1) > 12 ? year + 1 : year
            month = (parseInt(month) + 1) > 12 ? 1 : parseInt(month) + 1
          }
          this.year = year
          this.month = month
          this.createDays(year, month)
          this.getRestDays(year,month)
    
        },
        selectDate(item) {
          let date = item.time //选择的下标
          item.restDay = !item.restDay 
          let selectDate = date.replace(/\//g, "-")
          console.log("选择的时间", selectDate)
        },
        dislodgeZero(str) {
          let strArray = str.split("-");
          strArray = strArray.map(function (val) {
            if (val[0] == "0") {
              return (val = val.slice(1));
            } else {
              return val;
            }
          });
          return strArray.join("-");
        },
        getRestDays(year, month) {
          const restDays = [];
    
          // 获取当月第一天和最后一天的日期对象
          const firstDayOfMonth = new Date(year, month - 1, 1);
          const lastDayOfMonth = new Date(year, month, 0);
    
          // 循环处理每一天,判断是否为休息日(周六、周日)
          for (let day = 1; day <= lastDayOfMonth.getDate(); day++) {
            const date = new Date(year, month - 1, day);
            const dayOfWeek = date.getDay();
    
            if (dayOfWeek === 0 || dayOfWeek === 6) {
              // 如果是周六或周日,则将其加入到休息日数组中
              const formattedDate = `${year}-${month}-${day.toString().padStart(2, '0')}`;
              restDays.push(formattedDate);
            }
          }
          console.log(restDays);
          this.restDayArr = restDays
        }
      },
      mounted() {
        this.createDays(this.year, this.month);
        this.getRestDays(2023,5)
      },
      watch: {
        restDayArr(newValue, oldValue) {
          newValue.forEach(ele => {
            ele = this.dislodgeZero(ele).replace(/\-/g, "/")
            this.nowMonthDays.forEach(item => {
              if (ele == item.time) {
                item.restDay = true
              }
            })
          })
        }
      },
     
    }
    </script>
    
    <style lang="scss" scoped>
    .rili {
      border: 1px solid #2ba389;
      background: #eee;
      flex: 1;
      max-width: 544px;
      // min-height: 440px;
      border-radius: 12px;
      display: flex;
      flex-direction: column;
    
      .change {
        display: flex;
        justify-content: space-around;
        padding: 10px 0;
      }
    
      .rili_mouth {
        border-top: 1px solid #2ba389;
        border-radius: 16px;
        flex: 1;
        background: #fff;
        padding-bottom: 12px;
    
        /* 头部样式start */
        .week {
          display: flex;
          justify-content: space-around;
          font-size: 14px;
          color: #1F1F1F;
          padding: 15px 0 10px 0;
        }
    
        /* 头部样式end */
        /* 日期区域样式start */
        .date-wrap {
          display: flex;
          flex-wrap: wrap;
        }
    
        .mouth-date {
          display: flex;
          font-size: 16px;
          flex-direction: column;
          align-items: center;
          width: calc(100% / 7);
          padding-top: 10px;
          padding-bottom: 10px;
          cursor: pointer;
    
        }
    
        .last-mouth span,
        .next-mouth span {
          opacity: 0;
        }
    
        .mouth-date .day {
          display: flex;
          flex-direction: column;
          align-items: center;
          color: #1F1F1F;
    
        }
    
        .mouth-date .day-nongli {
          font-size: 12px;
          color: #888888;
          margin: 3px 0 6px 0;
        }
    
        .tip {
          font-size: 12px;
          position: absolute;
          top: 0;
          right: 0;
          background: #4b9ef2;
          color: #fff;
          padding: 2px;
          border-radius: 3px;
        }
    
        .mouth-date .color {
          color: #8096F0;
        }
    
        .mouth-date .day-dot {
          width: 5px;
          height: 5px;
          border-radius: 50%;
          background-color: #8096F0;
        }
    
        .mouth-date .day-box {
          border-radius: 6px;
          padding: 8px 17px;
          display: flex;
          flex-direction: column;
          align-items: center;
          position: relative;
          font-size: 16px;
          min-width: 58px;
    
        }
    
        .mouth-date .active {
          background-color: #f7d0cf;
        }
    
        .mouth-date .active span.tip {
          color: #fff;
          background: red;
        }
    
        .mouth-date .active span.day-span {
          color: red;
          font-weight: bold;
        }
    
        .mouth-date .active .day-nongli {
          color: red;
        }
    
      }
    }
    </style>
    

    相关文章

      网友评论

          本文标题:vue实现展示工休日日历(含农历),并可点击切换工休日

          本文链接:https://www.haomeiwen.com/subject/maxdedtx.html