| <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>  |