<template>  
 | 
  <view>  
 | 
    <view class="calendar-Time-header under_line">  
 | 
      <view class="header-left">  
 | 
        <!-- <image :src="lastDisabled ? disable : nodisable" mode="widthFix" @tap="subMonth"></image> -->  
 | 
        <image :src="nodisable" mode="widthFix" @tap="subMonth"></image>  
 | 
        <text>{{ title_time }}</text>  
 | 
        <image  
 | 
          src="@/static/meeting/icon/ar_right@2x.png"  
 | 
          mode="widthFix"  
 | 
          @tap="addMonth"  
 | 
        ></image>  
 | 
      </view>  
 | 
      <view class="header-right" @tap="backToToday">回到今天</view>  
 | 
      <!-- <text class='calendar-lastMonth' @tap="subMonth" v-bind:class="{'calendar-btn-disabled' : lastDisabled }">{{lastText}}</text>  
 | 
            <text class='calendar-TimeH'>{{title_time}}</text>  
 | 
            <text class='calendar-nextMonth' @tap="addMonth" v-bind:class="{'calendar-btn-disabled' : nextDisabled }">{{nextText}}</text>  
 | 
            <text class='calendar-backToToday' @tap="backToToday">回到今天</text> -->  
 | 
    </view>  
 | 
    <view class="ClearBoth"></view>  
 | 
    <view class="calendar-content">  
 | 
      <view class="calendar-row calendar-header">  
 | 
        <view class="calendar-col aligncanter">周日</view>  
 | 
        <view class="calendar-col aligncanter">周一</view>  
 | 
        <view class="calendar-col aligncanter">周二</view>  
 | 
        <view class="calendar-col aligncanter">周三</view>  
 | 
        <view class="calendar-col aligncanter">周四</view>  
 | 
        <view class="calendar-col aligncanter">周五</view>  
 | 
        <view class="calendar-col aligncanter">周六</view>  
 | 
      </view>  
 | 
      <view  
 | 
        class="calendar-row calendar-day"  
 | 
        v-bind:style="{  
 | 
          transform: transformObj,  
 | 
          'transition-duration': transformTimeObj,  
 | 
        }"  
 | 
        @touchstart="touchstart"  
 | 
        @touchmove="touchmove"  
 | 
        @touchend="touchend"  
 | 
      >  
 | 
        <view  
 | 
          class="calendar-col aligncanter calendar-col-lastMonth"  
 | 
          v-for="item in beforeDateList"  
 | 
          v-bind:key="item.key"  
 | 
          @tap="subMonth"  
 | 
          v-bind:class="{ 'calendar-out-of-Date': item.outOfDate }"  
 | 
          >{{ item.dateIndex }}  
 | 
          <text class="calendar-text">{{ item.markText }}</text>  
 | 
        </view>  
 | 
  
 | 
        <view  
 | 
          class="calendar-col aligncanter currentDays"  
 | 
          v-bind:class="{  
 | 
            'calendar-active': item.dateIndex == currentSelectTime,  
 | 
            'calendar-today': item.isToday,  
 | 
            'calendar-range': item.isRanges,  
 | 
            'calendar-out-of-Date': item.outOfDate,  
 | 
          }"  
 | 
          v-for="item in dateList"  
 | 
          v-bind:key="item.key"  
 | 
          @tap="selectedDateFun(item.dateIndex)"  
 | 
        >  
 | 
          <view class="dayValue">  
 | 
            <text  
 | 
              class="calendar-date calendar-day-6-7"  
 | 
              v-if="item.isDaySunOrSat"  
 | 
              >{{ item.dateIndex }}</text  
 | 
            >  
 | 
            <text v-else class="calendar-date">{{ item.dateIndex }}</text>  
 | 
            <text  
 | 
              class="calendar-point"  
 | 
              v-if="item.pointText"  
 | 
              v-bind:style="{  
 | 
                color: item.pointTextColor ? item.pointTextColor : maskColor,  
 | 
              }"  
 | 
              >{{ item.pointText }}</text  
 | 
            >  
 | 
            <text  
 | 
              class="calendar-text"  
 | 
              v-bind:style="{  
 | 
                color: item.markTextColor ? item.markTextColor : maskColor,  
 | 
              }"  
 | 
              >{{ item.markText }}</text  
 | 
            >  
 | 
          </view>  
 | 
        </view>  
 | 
  
 | 
        <view  
 | 
          class="calendar-col aligncanter calendar-col-nextMonth"  
 | 
          v-for="item in afterDateList"  
 | 
          v-bind:key="item.key"  
 | 
          @tap="addMonth"  
 | 
          v-bind:class="{ 'calendar-out-of-Date': item.outOfDate }"  
 | 
          >{{ item.dateIndex }}  
 | 
          <text class="calendar-text">{{ item.markText }}</text>  
 | 
        </view>  
 | 
      </view>  
 | 
      <view class="ClearBoth"></view>  
 | 
    </view>  
 | 
  </view>  
 | 
</template>  
 | 
  
 | 
<script>  
 | 
import lunarYearTool from './sloarToLunar.js'  
 | 
import { getDay } from '@/utils/utils.js'  
 | 
export default {  
 | 
  name: 'Li-Calendar',  
 | 
  props: {  
 | 
    /**  
 | 
     * @description 当前时间 yyyy-MM-dd  
 | 
     */  
 | 
    currentTime: {  
 | 
      type: String,  
 | 
      default: function () {  
 | 
        let timeObj = new Date()  
 | 
        return timeObj.getFullYear() + "-" + (timeObj.getMonth() + 1) + "-" + timeObj.getDate()  
 | 
      }  
 | 
    },  
 | 
    /**  
 | 
     * @description 标记点列表  
 | 
     * time    标记时间    yyyy-MM-dd  
 | 
     * text    标记内容   
 | 
     * markPoint 是否显示标记点 默认false  
 | 
     * markTextColor 标记内容颜色  
 | 
     * pointText 左上角标记点内容  
 | 
     * pointTextColor 标记点颜色  
 | 
     */  
 | 
    mark: {  
 | 
      type: Array,  
 | 
      default: function () {  
 | 
        return undefined  
 | 
      }  
 | 
    },  
 | 
    /**  
 | 
     * @description 上月文字  
 | 
     */  
 | 
    lastText: {  
 | 
      type: String,  
 | 
      default: '〈'  
 | 
    },  
 | 
    /**  
 | 
     * @description 下月文字  
 | 
     */  
 | 
    nextText: {  
 | 
      type: String,  
 | 
      default: '〉'  
 | 
    },  
 | 
    /**  
 | 
     * @description 全局标记点颜色,包括点和文字  
 | 
     */  
 | 
    maskColor: {  
 | 
      type: String,  
 | 
      default: '#01AAED'  
 | 
    },  
 | 
    /**  
 | 
     * @description 是否显示农历,mask优先级高  
 | 
     */  
 | 
    showLunar: {  
 | 
      type: Boolean,  
 | 
      default: true  
 | 
    },  
 | 
    /**  
 | 
     * @description 设置标记范围  
 | 
     */  
 | 
    range: {  
 | 
      type: Object,  
 | 
      default: function () {  
 | 
        return {  
 | 
          rangeStart: undefined, //设置标记范围开始,yyyy-MM-dd  
 | 
          rangeEnd: undefined //设置标记范围结束,yyyy-MM-dd  
 | 
        }  
 | 
      }  
 | 
    },  
 | 
    /**  
 | 
     * @description 是否开启范围选择模式  
 | 
     */  
 | 
    rangeMode: {  
 | 
      type: Boolean,  
 | 
      default: false  
 | 
    },  
 | 
    /**  
 | 
     * @description 日历起始时间 yyyy-MM-dd  
 | 
     */  
 | 
    dateStart: {  
 | 
      type: String,  
 | 
      default: '1970-01-01'  
 | 
    },  
 | 
    /**  
 | 
     * @description 日历结束时间 yyyy-MM-dd  
 | 
     */  
 | 
    dateEnd: {  
 | 
      type: String,  
 | 
      default: '2100-12-31'  
 | 
    },  
 | 
    /**  
 | 
     * @description 是否可以滚动  
 | 
     */  
 | 
    canDrag: {  
 | 
      type: Boolean,  
 | 
      default: true  
 | 
    },  
 | 
  },  
 | 
  created() {  
 | 
    this.render()  
 | 
  },  
 | 
  data() {  
 | 
    return {  
 | 
      nodisable: require('@/static/meeting/icon/ar_left@2x.png'),  
 | 
      disable: require('@/static/meeting/icon/ar_left_disable.png'),  
 | 
  
 | 
      nextDisabled: false,  
 | 
      lastDisabled: true,  
 | 
      currentSelectTime: undefined, //点击时保存的dateIndex  
 | 
      title_time: '', //顶头文本  
 | 
      year: undefined, //当前年  
 | 
      month: undefined, //当前月  
 | 
      beforeDateList: [], //上个月的日期列表  
 | 
      dateList: [], //本月的日期列表  
 | 
      afterDateList: [], //下个月的日期列表  
 | 
      firstRangeSelected: false, // 范围开始时间是否已经选择  
 | 
      rangeStart_: undefined, //标记范围开始,yyyyMM-dd  
 | 
      rangeEnd_: undefined, //标记范围结束,yyyyMM-dd  
 | 
      transform_x: 0,  
 | 
      transform_time: 0,  
 | 
    }  
 | 
  },  
 | 
  methods: {  
 | 
    render(setTimeStr) { //初始化  
 | 
      let that = this  
 | 
      let currentTimeStr = setTimeStr ? setTimeStr : that.currentTime  
 | 
      let timeObj = this.toDateByStr(currentTimeStr) //当前选定的时间  
 | 
      //计算头部显示的年月  
 | 
      let _tempTileMonth = (timeObj.getMonth() + 1)  
 | 
      if (_tempTileMonth < 10)  
 | 
        _tempTileMonth = '0' + _tempTileMonth  
 | 
      this.title_time = timeObj.getFullYear() + "年" + _tempTileMonth + "月"  
 | 
  
 | 
      //获取当前时间月份1号  
 | 
      let firstDayStr = timeObj.getFullYear() + "/" + (timeObj.getMonth() + 1) + "/01"  
 | 
      let date = that.toDateByStr(firstDayStr)  
 | 
      that.year = date.getFullYear()  
 | 
      that.month = date.getMonth() + 1  
 | 
      let firstDayWeek = date.getDay() //第一天是星期几  
 | 
      let grid_sum = 0 //总格子数 ,用于后面填满格子  
 | 
      //获取上一个月的天数  
 | 
      let TempMonth  
 | 
      let TempYear  
 | 
      if (that.month == 1) { //跨年  
 | 
        TempMonth = 12  
 | 
        TempYear = that.year - 1  
 | 
      } else {  
 | 
        TempYear = that.year  
 | 
        TempMonth = that.month - 1  
 | 
      }  
 | 
      let TempLastMonthStr = TempYear + "/" + TempMonth + "/01"  
 | 
      let lastMonthTotalDay = that.getTotalDay(TempLastMonthStr)  
 | 
      let lastMonthStartDay = lastMonthTotalDay - firstDayWeek  
 | 
  
 | 
      let _dateStart = that.toDateByStr1(that.dateStart)  
 | 
      let _dateEnd = that.toDateByStr1(that.dateEnd)  
 | 
      // 创建前面的日期  
 | 
      that.beforeDateList = []  
 | 
      for (let i = 0; i < firstDayWeek; i++) {  
 | 
        grid_sum++  
 | 
        lastMonthStartDay++  
 | 
        let tempObj = {  
 | 
          dateIndex: lastMonthStartDay,  
 | 
          key: 'before_' + i  
 | 
        }  
 | 
  
 | 
        //判断是否超出日期范围  
 | 
        let _tempBeforeDate = new Date(TempYear + "/" + TempMonth + "/" + lastMonthStartDay)  
 | 
        if (_dateStart > _tempBeforeDate || _tempBeforeDate > _dateEnd) {  
 | 
          tempObj.outOfDate = true  
 | 
        }  
 | 
  
 | 
        //获取农历  
 | 
        if (that.showLunar) {  
 | 
          let LunarDate = that.sloarToLunar(TempYear, TempMonth, lastMonthStartDay)  
 | 
          let tempLunarDay = LunarDate.lunarDay == '初一' ? LunarDate.lunarMonth + '月' : LunarDate.lunarDay  
 | 
          tempObj.markText = tempLunarDay  
 | 
        }  
 | 
  
 | 
        that.beforeDateList.push(tempObj)  
 | 
      }  
 | 
  
 | 
      //获取一个月的天数  
 | 
      let totalDay = that.getTotalDay(currentTimeStr)  
 | 
  
 | 
      //生成本月日历  
 | 
      let today = new Date()  
 | 
      let today_year = today.getFullYear()  
 | 
      let today_month = today.getMonth() + 1  
 | 
      let today_day = today.getDate()  
 | 
      that.dateList = []  
 | 
      for (let i = 1; i <= totalDay; i++) { //循环日  
 | 
        grid_sum++  
 | 
  
 | 
        let tempObj = {  
 | 
          dateIndex: i,  
 | 
          key: 'date_' + i,  
 | 
          isRanges: false,  
 | 
          isToday: false  
 | 
        }  
 | 
        //当前日期变量  
 | 
        let tempDay = that.toDateByStr(that.year + "/" + that.month + "/" + i)  
 | 
  
 | 
        //判断是否为当天  
 | 
        if (today_year == that.year && today_month == that.month && today_day == i)  
 | 
          tempObj.isToday = true  
 | 
  
 | 
        //周六和周日,特殊处理  
 | 
        let tempCurrWeek = tempDay.getDay()  
 | 
        if (tempCurrWeek == 0 || tempCurrWeek == 6)  
 | 
          tempObj.isDaySunOrSat = true  
 | 
  
 | 
        //判断是否超出日期范围  
 | 
        if (_dateStart > tempDay || tempDay > _dateEnd) {  
 | 
          tempObj.outOfDate = true  
 | 
        }  
 | 
  
 | 
        //获取农历  
 | 
        if (that.showLunar) {  
 | 
          let LunarDate = that.sloarToLunar(that.year, that.month, i)  
 | 
          that.lunarMonth = LunarDate.lunarMonth  
 | 
          that.lunarYear = LunarDate.lunarYear  
 | 
          let tempLunarDay = LunarDate.lunarDay == '初一' ? LunarDate.lunarMonth + '月' : LunarDate.lunarDay  
 | 
          tempObj.lunarMonth = LunarDate.lunarMonth  
 | 
          tempObj.lunarYear = LunarDate.lunarYear  
 | 
          tempObj.lunarDay = LunarDate.lunarDay  
 | 
          tempObj.markText = tempLunarDay  
 | 
          tempObj.markTextColor = '#454545'  
 | 
        }  
 | 
  
 | 
        //设置了标记点  
 | 
        if (that.mark) {  
 | 
          for (let z = 0; z < that.mark.length; z++) { //判断是否为标记点  
 | 
            let tempDayMark = that.toDateByStr1(that.mark[z].time.trim())  
 | 
            if (tempDay.getTime() == tempDayMark.getTime()) {  
 | 
              let tempTextStr = that.mark[z].text  
 | 
              if (that.mark[z].markPoint != false) { // 是否显示点  
 | 
                tempObj.pointText = that.mark[z].pointText ? that.mark[z].pointText : '●'  
 | 
                tempObj.pointTextColor = that.mark[z].pointTextColor ? that.mark[z].pointTextColor : undefined  
 | 
              }  
 | 
              if (tempTextStr != undefined && tempTextStr != "") { // 是否显示文字  
 | 
                tempObj.markText = tempTextStr  
 | 
                tempObj.markTextColor = that.mark[z].markTextColor ? that.mark[z].markTextColor : undefined  
 | 
              }  
 | 
              break  
 | 
            }  
 | 
          }  
 | 
        }  
 | 
  
 | 
        that.dateList.push(tempObj)  
 | 
      }  
 | 
  
 | 
      that.setRange()  
 | 
  
 | 
      // 创建后面的空白,补够五行  
 | 
      that.afterDateList = []  
 | 
      if (grid_sum < 42) { // 创建后面的空白,补够五行  
 | 
        let j = 0  
 | 
  
 | 
        //获取下一月  
 | 
        let TempMonthNext  
 | 
        let TempYearNext  
 | 
        if (that.month == 12) { //跨年  
 | 
          TempMonthNext = 1  
 | 
          TempYearNext = that.year + 1  
 | 
        } else {  
 | 
          TempYearNext = that.year  
 | 
          TempMonthNext = that.month + 1  
 | 
        }  
 | 
  
 | 
        for (let i = grid_sum; i < 42; i++) {  
 | 
          j++  
 | 
  
 | 
          let tempObj = {  
 | 
            dateIndex: j,  
 | 
            key: 'after_' + j  
 | 
          }  
 | 
          //获取农历  
 | 
          if (that.showLunar) {  
 | 
            let LunarDate = that.sloarToLunar(TempYearNext, TempMonthNext, j)  
 | 
            let tempLunarDay = LunarDate.lunarDay == '初一' ? LunarDate.lunarMonth + '月' : LunarDate.lunarDay  
 | 
            tempObj.markText = tempLunarDay  
 | 
          }  
 | 
  
 | 
          //判断是否超出日期范围  
 | 
          let _tempAfterDate = new Date(TempYearNext + "/" + TempMonthNext + "/" + j)  
 | 
          if (_dateStart > _tempAfterDate || _tempAfterDate > _dateEnd) {  
 | 
            tempObj.outOfDate = true  
 | 
          }  
 | 
  
 | 
          that.afterDateList.push(tempObj)  
 | 
        }  
 | 
      }  
 | 
    },  
 | 
    sloarToLunar(year, month, day) {  
 | 
      // console.log('----')  
 | 
      // console.log(year + "--" +month+ "--" + day)  
 | 
      let result = lunarYearTool.sloarToLunar(year, month, day)  
 | 
      //console.log(result)  
 | 
      return result  
 | 
    },  
 | 
    getTotalDay(time) { //获取月 日期总数  
 | 
      time = time.replace(/-/g, "/")  
 | 
      let selectedDate = new Date(time)  
 | 
      if (selectedDate == "Invalid Date") {  
 | 
        selectedDate = new Date(time + "/01")  
 | 
      }  
 | 
  
 | 
      let dayMany = new Date(selectedDate.getFullYear(), (selectedDate.getMonth() + 1), 0).getDate()  
 | 
      return dayMany  
 | 
    },  
 | 
    toDateByStr(timeStr) { //字符串转换时间,转换失败或者不传字符串则返回当前  
 | 
      let timeObj  
 | 
      if (timeStr) {  
 | 
        timeObj = new Date(timeStr.replace(/-/g, "/"))  
 | 
      }  
 | 
      if (!timeStr || timeObj == "Invalid Date")  
 | 
        timeObj = new Date()  
 | 
      return timeObj  
 | 
    },  
 | 
    toDateByStr1(timeStr) { //字符串转换时间,转换失败或者不传字符串则null  
 | 
      try {  
 | 
        let timeObj  
 | 
        if (timeStr) {  
 | 
          timeObj = new Date(timeStr.replace(/-/g, "/"))  
 | 
        }  
 | 
        if (!timeStr || timeObj == "Invalid Date")  
 | 
          return null  
 | 
        return timeObj  
 | 
      } catch (e) {  
 | 
        return null  
 | 
      }  
 | 
    },  
 | 
    getTimeStrFormat(timeStr) { //获取格式化的时间 yyyy-MM-dd  
 | 
      let timeObj  
 | 
      if (timeStr) {  
 | 
        timeObj = new Date(timeStr.replace(/-/g, "/"))  
 | 
      }  
 | 
      if (!timeStr || timeObj == "Invalid Date")  
 | 
        timeObj = new Date()  
 | 
      return timeObj.getFullYear() + "-" + (timeObj.getMonth() + 1) + "-" + timeObj.getDate()  
 | 
    },  
 | 
    selectedDateFun(index) { //点击日期  
 | 
      let that = this  
 | 
      let selectObj = that.dateList[index - 1]  
 | 
      selectObj.year = that.year  
 | 
      selectObj.month = that.month  
 | 
      selectObj.day = index  
 | 
      selectObj.time = that.year + "-" + that.month + "-" + index  
 | 
      that.$emit('dayChange', selectObj)  
 | 
  
 | 
      //判断是否超出日期范围  
 | 
      if (that.checkOutOfDate(selectObj.time)) {  
 | 
        return  
 | 
      }  
 | 
  
 | 
      that.currentSelectTime = index  
 | 
  
 | 
      console.log(index)  
 | 
  
 | 
      //开启了范围选择模式  
 | 
      if (that.rangeMode) {  
 | 
        if (!that.firstRangeSelected) { //选择开始时间  
 | 
          that.firstRangeSelected = !that.firstRangeSelected  
 | 
          that.rangeStart_ = selectObj.time  
 | 
          that.rangeEnd_ = undefined  
 | 
          that.clearRange()  
 | 
        } else { //选择了结束时间  
 | 
          that.rangeEnd_ = selectObj.time  
 | 
          that.firstRangeSelected = !that.firstRangeSelected  
 | 
          that.$emit('rangeChange', {  
 | 
            start: that.rangeStart_,  
 | 
            end: that.rangeEnd_,  
 | 
          })  
 | 
          that.setRange()  
 | 
        }  
 | 
      }  
 | 
    },  
 | 
    addMonth() { //加一个月  
 | 
      let that = this  
 | 
      that.currentSelectTime = ''  
 | 
      let _Month = that.month  
 | 
      let _Year = that.year  
 | 
      if (that.month == 12) { //跨年  
 | 
        _Month = 1  
 | 
        _Year += 1  
 | 
      } else {  
 | 
        _Month += 1  
 | 
      }  
 | 
  
 | 
      let str = _Year + "/" + _Month + "/01"  
 | 
  
 | 
      //判断是否超出日期范围  
 | 
      if (that.checkOutOfDate(str)) {  
 | 
        that.nextDisabled = true  
 | 
        return  
 | 
      }  
 | 
  
 | 
      that.month = _Month  
 | 
      that.year = _Year  
 | 
      that.lastDisabled = false  
 | 
  
 | 
      //检查日期上限值是否在当月内,如果在则不能再切换下个月  
 | 
      if (that.checkDateRange(that.year, that.month, 1)) {  
 | 
        that.nextDisabled = true  
 | 
      }  
 | 
  
 | 
      if (that.rangeMode) { //开启了范围模式  
 | 
        that.currentSelectTime = undefined  
 | 
      }  
 | 
  
 | 
      that.$emit('monthChange', {  
 | 
        date: str  
 | 
      })  
 | 
      that.render(str)  
 | 
    },  
 | 
    subMonth() { //减一个月  
 | 
      let that = this  
 | 
  
 | 
      that.currentSelectTime = ''  
 | 
  
 | 
      let _Month = that.month  
 | 
      let _Year = that.year  
 | 
      if (that.month == 1) { //跨年  
 | 
        _Month = 12  
 | 
        _Year -= 1  
 | 
      } else {  
 | 
        _Month -= 1  
 | 
      }  
 | 
  
 | 
      let str = _Year + "/" + _Month + "/01"  
 | 
  
 | 
      //判断是否超出日期范围  
 | 
      let _totalDay = that.getTotalDay(str)  
 | 
      if (that.checkOutOfDate(_Year + "/" + _Month + "/" + _totalDay)) {  
 | 
        that.lastDisabled = true  
 | 
        return  
 | 
      }  
 | 
  
 | 
      that.month = _Month  
 | 
      that.year = _Year  
 | 
      that.nextDisabled = false  
 | 
  
 | 
      //检查日期下限值是否在当月内,如果在则不能再切换上个月  
 | 
      if (that.checkDateRange(that.year, that.month)) {  
 | 
        that.lastDisabled = true  
 | 
      }  
 | 
  
 | 
      if (that.rangeMode) { //开启了范围模式  
 | 
        that.currentSelectTime = undefined  
 | 
      }  
 | 
  
 | 
      that.$emit('monthChange', {  
 | 
        date: str  
 | 
      })  
 | 
      that.render(str)  
 | 
    },  
 | 
    backToToday() { //回到今天  
 | 
      let currDate = new Date()  
 | 
      let _year = currDate.getFullYear()  
 | 
      let _month = currDate.getMonth() + 1  
 | 
  
 | 
      this.currentSelectTime = getDay().day  
 | 
  
 | 
      this.$emit('dayChange', { time: getDay().date })  
 | 
  
 | 
      //如果已经是当月  
 | 
      if (_year == this.year && _month == this.month) {  
 | 
        return  
 | 
      }  
 | 
  
 | 
      let value = _year + "/" + _month + "/" + currDate.getDate()  
 | 
      this.$emit('monthChange', {  
 | 
        date: value  
 | 
      })  
 | 
      this.lastDisabled = true  
 | 
  
 | 
      this.render(value)  
 | 
    },  
 | 
    setRange() { //设置范围  
 | 
      let that = this  
 | 
      let rangeStartDate = that.toDateByStr1(that.rangeStart_)  
 | 
      let rangeEndDate = that.toDateByStr1(that.rangeEnd_)  
 | 
      if (!rangeStartDate || !rangeEndDate)  
 | 
        return  
 | 
      if (rangeStartDate > rangeEndDate) { //防止范围出错  
 | 
        let tempD = rangeEndDate  
 | 
        rangeEndDate = rangeStartDate  
 | 
        rangeStartDate = tempD  
 | 
      }  
 | 
  
 | 
      //循环判断范围  
 | 
      for (let i = 0; i < that.dateList.length; i++) {  
 | 
        let _TempDtStr = that.year + "/" + that.month + "/" + that.dateList[i].dateIndex  
 | 
        let _TempDt = that.toDateByStr1(_TempDtStr)  
 | 
        that.dateList[i].isRanges = false  
 | 
        if (rangeStartDate <= _TempDt && _TempDt <= rangeEndDate) //时间在范围内  
 | 
          that.dateList[i].isRanges = true  
 | 
      }  
 | 
    },  
 | 
    clearRange() { //关闭范围模式范围  
 | 
      let that = this  
 | 
      //循环判断范围  
 | 
      for (let i = 0; i < that.dateList.length; i++) {  
 | 
        that.dateList[i].isRanges = false  
 | 
      }  
 | 
    },  
 | 
    checkOutOfDate(time) { //判断是否超出日期范围,yyyy-MM-dd  
 | 
      let that = this  
 | 
      let _dateStart = that.toDateByStr1(that.dateStart)  
 | 
      let _dateEnd = that.toDateByStr1(that.dateEnd)  
 | 
      let _tempDate = that.toDateByStr1(time)  
 | 
      if (_dateStart > _tempDate || _tempDate > _dateEnd) {  
 | 
        return true  
 | 
      } else  
 | 
        return false  
 | 
    },  
 | 
    checkDateRange(year, month, type) { //判断范围界限值是否在当月内,yyyy-MM-dd,type;1 上限值,其他:下限值  
 | 
      let that = this  
 | 
  
 | 
      let totalDay = that.getTotalDay(year + '/' + month + '/01')  
 | 
      let firstD = that.toDateByStr1(year + '/' + month + '/01')  
 | 
      let lastD = that.toDateByStr1(year + '/' + month + '/' + totalDay)  
 | 
  
 | 
      if (type == 1) { //上限值  
 | 
        let _dateEnd = that.toDateByStr1(that.dateEnd)  
 | 
        if (firstD <= _dateEnd && _dateEnd <= lastD) {  
 | 
          return true  
 | 
        } else  
 | 
          return false  
 | 
      } else { //下限值  
 | 
        let _dateStart = that.toDateByStr1(that.dateStart)  
 | 
        if (firstD <= _dateStart && _dateStart <= lastD) {  
 | 
          return true  
 | 
        } else  
 | 
          return false  
 | 
      }  
 | 
    },  
 | 
    calendarTransform(x, time) {  //日历滑动动画  
 | 
      this.transform_x = x  
 | 
      this.transform_time = time  
 | 
    },  
 | 
    touchstart(event) {  
 | 
      if (!this.canDrag)  
 | 
        return  
 | 
      this.startPageX = event.touches[0].pageX  
 | 
      this.startPageY = event.touches[0].pageY  
 | 
    },  
 | 
    touchmove(event) {  
 | 
      if (!this.canDrag)  
 | 
        return  
 | 
      let touchmovePageX = event.touches[0].pageX  
 | 
      let result = touchmovePageX - this.startPageX  
 | 
      this.calendarTransform(result, 0)  
 | 
    },  
 | 
    touchend(event) {  
 | 
      if (!this.canDrag)  
 | 
        return  
 | 
      let that = this  
 | 
      let endPageX = event.changedTouches[0].pageX  
 | 
      let endPageY = event.changedTouches[0].pageY  
 | 
      let x = Math.abs(that.startPageX - endPageX) //横坐标之差  
 | 
      let y = Math.abs(that.startPageY - endPageY) //纵坐标之差  
 | 
  
 | 
      let screenX = 0  
 | 
      try {  
 | 
        const res = uni.getSystemInfoSync()  
 | 
        screenX = res.windowWidth  
 | 
      } catch (e) {  
 | 
        console.error(e)  
 | 
        return  
 | 
      }  
 | 
      if (that.startPageX > endPageX) { //左滑  
 | 
        let a = Math.atan(y / x)  
 | 
        let Rate = x / screenX  
 | 
        if (a < Math.PI / 6 && Rate > 0.3) {  
 | 
          screenX = -screenX  
 | 
          that.calendarTransform(screenX, 300)  
 | 
          setTimeout(function () {  
 | 
            that.addMonth()  
 | 
            that.calendarTransform(0, 0)  
 | 
          }, 300)  
 | 
        }  
 | 
        else {  
 | 
          that.calendarTransform(0, 300)  
 | 
        }  
 | 
      } else {  
 | 
        let a = Math.atan(y / x)  
 | 
        let Rate = x / screenX  
 | 
        if (a < Math.PI / 6 && Rate > 0.3) {  
 | 
          that.calendarTransform(screenX, 300)  
 | 
          setTimeout(function () {  
 | 
            that.subMonth()  
 | 
            that.calendarTransform(0, 0)  
 | 
          }, 300)  
 | 
        }  
 | 
        else {  
 | 
          that.calendarTransform(0, 300)  
 | 
        }  
 | 
      }  
 | 
    }  
 | 
  },  
 | 
  watch: {  
 | 
    currentTime: function (val, oldVal) { //时间改变  
 | 
      let dateNew = this.toDateByStr1(val)  
 | 
      if (dateNew.getFullYear() == this.year && (dateNew.getMonth() + 1) == this.month) {  
 | 
        console.log('time is not change')  
 | 
      } else {  
 | 
        this.currentSelectTime = dateNew.getDate()  
 | 
        this.render()  
 | 
      }  
 | 
    },  
 | 
    range: function (val, oldVal) { //范围改变  
 | 
      if (val.rangeStart != oldVal.rangeStart || val.rangeEnd != oldVal.rangeEnd) {  
 | 
        this.rangeStart_ = val.rangeStart  
 | 
        this.rangeEnd_ = val.rangeEnd  
 | 
        this.setRange()  
 | 
      }  
 | 
    },  
 | 
    mark: function (val, oldVal) { //标记改变  
 | 
      this.render()  
 | 
    },  
 | 
    rangeMode: function (val, oldVal) { //范围改变  
 | 
      if (!val) { //如果是关闭范围模式  
 | 
        this.rangeStart_ = undefined //标记范围开始,yyyyMM-dd  
 | 
        this.rangeEnd_ = undefined //标记范围结束,yyyyMM-dd  
 | 
        this.firstRangeSelected = false  
 | 
        this.clearRange()  
 | 
      }  
 | 
    },  
 | 
  },  
 | 
  computed: {  
 | 
    transformObj: function () {  
 | 
      return 'translate3d(' + this.transform_x + 'px, 0px, 0px) translateZ(0px)'  
 | 
    },  
 | 
    transformTimeObj: function () {  
 | 
      return this.transform_time + 'ms'  
 | 
    }  
 | 
  },  
 | 
}  
 | 
</script>  
 | 
  
 | 
<style lang="scss">  
 | 
.calendar-Time-header {  
 | 
  /* text-align: center;  
 | 
    height: 50upx;  
 | 
    line-height: 50upx;  
 | 
    vertical-align: middle;  
 | 
    padding: 20upx; */  
 | 
  width: 100%;  
 | 
  display: flex;  
 | 
  align-items: center;  
 | 
  justify-content: space-between;  
 | 
  margin-bottom: 20rpx;  
 | 
}  
 | 
.header-left {  
 | 
  display: flex;  
 | 
  align-items: center;  
 | 
}  
 | 
.header-left image {  
 | 
  width: 30rpx;  
 | 
  height: 30rpx;  
 | 
}  
 | 
.header-left text {  
 | 
  font-size: 32rpx;  
 | 
  font-family: PingFangSC-Semibold, PingFang SC;  
 | 
  font-weight: 600;  
 | 
  color: #222222;  
 | 
  margin: 0 40rpx;  
 | 
}  
 | 
.header-right {  
 | 
  font-size: 28rpx;  
 | 
  font-family: PingFangSC-Regular, PingFang SC;  
 | 
  font-weight: 400;  
 | 
  color: $uni-color-primary;  
 | 
}  
 | 
.calendar-TimeH {  
 | 
}  
 | 
.calendar-lastMonth {  
 | 
  width: 100upx;  
 | 
  font-size: 35upx;  
 | 
  margin-right: 10%;  
 | 
  padding: 0 5px;  
 | 
  text-align: center;  
 | 
}  
 | 
.calendar-nextMonth {  
 | 
  width: 100upx;  
 | 
  text-align: center;  
 | 
  margin-left: 10%;  
 | 
  font-size: 35upx;  
 | 
  padding: 0 5px;  
 | 
}  
 | 
.calendar-backToToday {  
 | 
  text-align: center;  
 | 
  font-size: 24upx;  
 | 
  position: absolute;  
 | 
  right: 5px;  
 | 
}  
 | 
  
 | 
.calendar-row:before,  
 | 
.calendar-row:after {  
 | 
  display: table;  
 | 
  content: " ";  
 | 
}  
 | 
  
 | 
.calendar-row:after {  
 | 
  clear: both;  
 | 
}  
 | 
  
 | 
.calendar-col {  
 | 
  width: 14.285714%;  
 | 
  max-width: 14.285714%;  
 | 
  position: relative;  
 | 
  float: left;  
 | 
  font-weight: 600;  
 | 
  min-height: 80upx;  
 | 
  font-size: 28rpx;  
 | 
  /* color: #999999; */  
 | 
  color: #222222;  
 | 
  white-space: nowrap;  
 | 
  text-overflow: ellipsis;  
 | 
  -o-text-overflow: ellipsis;  
 | 
  overflow: hidden;  
 | 
  
 | 
  display: flex;  
 | 
  align-items: center;  
 | 
  justify-content: center;  
 | 
}  
 | 
  
 | 
.aligncanter {  
 | 
  text-align: center;  
 | 
  /* border-bottom: 1rpx solid #E5E5E5; */  
 | 
}  
 | 
  
 | 
.calendar-header {  
 | 
  color: gray;  
 | 
  height: 40upx;  
 | 
  line-height: 40upx;  
 | 
  vertical-align: middle;  
 | 
  font-size: 24upx;  
 | 
}  
 | 
  
 | 
.calendar-day {  
 | 
  height: 80upx;  
 | 
  transform: translate3d(0px, 0px, 0px) translateZ(0px);  
 | 
  transition-duration: 0ms;  
 | 
  transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1);  
 | 
}  
 | 
  
 | 
.calendar-content {  
 | 
}  
 | 
  
 | 
.calendar-date {  
 | 
  /* color: #000; */  
 | 
}  
 | 
.calendar-today {  
 | 
   border-radius: 6rpx;  
 | 
    background-color: #e9f4f6;   
 | 
  color: $uni-color-primary;  
 | 
  /* -moz-box-shadow: 0px 2upx 10upx #ABABAB;  
 | 
    -webkit-box-shadow: 0px 2upx 10upx #ABABAB;  
 | 
    box-shadow: 0px 2upx 10upx #ABABAB; */  
 | 
}  
 | 
.calendar-today .calendar-point {  
 | 
  color: white !important;  
 | 
}  
 | 
  
 | 
.calendar-today .calendar-text {  
 | 
  color: white !important;  
 | 
}  
 | 
  
 | 
.calendar-col-lastMonth .calendar-text {  
 | 
  color: gray;  
 | 
}  
 | 
  
 | 
.calendar-col-nextMonth .calendar-text {  
 | 
  color: gray;  
 | 
}  
 | 
  
 | 
/* .calendar-today .calendar-date{  
 | 
    color: white;  
 | 
} */  
 | 
  
 | 
.calendar-active {  
 | 
  color: #ffffff !important;  
 | 
  background-color: $uni-color-primary;  
 | 
  /* -moz-box-shadow: 0px 2upx 10upx #ABABAB;  
 | 
    -webkit-box-shadow: 0px 2upx 10upx #ABABAB;  
 | 
    box-shadow: 0px 2upx 10upx #ABABAB; */  
 | 
}  
 | 
/* 范围标记 */  
 | 
.calendar-range {  
 | 
  /* color:#01AAED; */  
 | 
  border-radius: 0px;  
 | 
  background-color: #d9d9d9;  
 | 
  -moz-box-shadow: none;  
 | 
  -webkit-box-shadow: none;  
 | 
  box-shadow: none;  
 | 
}  
 | 
  
 | 
.ClearBoth {  
 | 
  clear: both;  
 | 
}  
 | 
.calendar-col-nextMonth {  
 | 
  color: gray;  
 | 
}  
 | 
.calendar-col-lastMonth {  
 | 
  color: gray;  
 | 
}  
 | 
.calendar-btn-disabled {  
 | 
  color: gainsboro;  
 | 
}  
 | 
.calendar-point {  
 | 
  width: 28rpx;  
 | 
  height: 28rpx;  
 | 
  box-sizing: border-box;  
 | 
  background-color: #f62710;  
 | 
  border-radius: 50%;  
 | 
  font-size: 16upx;  
 | 
  color: #ffffff;  
 | 
  top: 2upx;  
 | 
  right: 2upx;  
 | 
  position: absolute;  
 | 
  display: flex;  
 | 
  align-items: center;  
 | 
  justify-content: center;  
 | 
}  
 | 
.calendar-text {  
 | 
  padding: 4rpx 0;  
 | 
  width: 100%;  
 | 
  font-size: 20upx;  
 | 
  color: #f62710;  
 | 
  top: 40upx;  
 | 
  left: 0px;  
 | 
  position: absolute;  
 | 
  overflow: hidden;  
 | 
}  
 | 
.dayValue {  
 | 
  text-align: center;  
 | 
  /* color: #000000; */  
 | 
}  
 | 
  
 | 
.calendar-day-6-7 {  
 | 
  /* color: orangered; */  
 | 
}  
 | 
  
 | 
/* 超出日期范围 */  
 | 
.calendar-out-of-Date {  
 | 
  background-color: #eaeaea;  
 | 
}  
 | 
.calendar-out-of-Date .calendar-date {  
 | 
  color: gray;  
 | 
}  
 | 
  
 | 
/* 以下为实现0.5px底部边界 */  
 | 
.under_line {  
 | 
  position: relative;  
 | 
}  
 | 
.under_line:before,  
 | 
.under_line:after {  
 | 
  position: absolute;  
 | 
  content: " ";  
 | 
  height: 1px;  
 | 
  width: 100%;  
 | 
  left: 0;  
 | 
  transform-origin: 0 0;  
 | 
  -webkit-transform-origin: 0 0;  
 | 
}  
 | 
/* .fineLine:before{顶部top: 0;background: #000;} */  
 | 
.under_line:after {  
 | 
  bottom: 0;  
 | 
}  
 | 
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {  
 | 
  .under_line:after,  
 | 
  .under_line:before {  
 | 
    -webkit-transform: scaleY(0.667);  
 | 
  }  
 | 
}  
 | 
@media only screen and (-webkit-min-device-pixel-ratio: 2) {  
 | 
  .under_line:after,  
 | 
  .under_line:before {  
 | 
    -webkit-transform: scaleY(0.5);  
 | 
  }  
 | 
}  
 | 
/* 以上为实现0.5px底部边界 */  
 | 
</style>  
 |