|
|
|
import convertSolarLunar from './convertSolarLunar'
|
|
|
|
|
|
|
|
let systemInfo
|
|
|
|
|
|
|
|
export function getSystemInfo() {
|
|
|
|
if (systemInfo) return systemInfo
|
|
|
|
systemInfo = wx.getSystemInfoSync()
|
|
|
|
return systemInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isComponent(target) {
|
|
|
|
return (
|
|
|
|
target &&
|
|
|
|
target.__wxExparserNodeId__ !== void 0 &&
|
|
|
|
typeof target.setData === 'function'
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Logger {
|
|
|
|
info(msg) {
|
|
|
|
console.log(
|
|
|
|
'%cInfo: %c' + msg,
|
|
|
|
'color:#FF0080;font-weight:bold',
|
|
|
|
'color: #FF509B'
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
warn(msg) {
|
|
|
|
console.log(
|
|
|
|
'%cWarn: %c' + msg,
|
|
|
|
'color:#FF6600;font-weight:bold',
|
|
|
|
'color: #FF9933'
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
tips(msg) {
|
|
|
|
console.log(
|
|
|
|
'%cTips: %c' + msg,
|
|
|
|
'color:#00B200;font-weight:bold',
|
|
|
|
'color: #00CC33'
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Slide {
|
|
|
|
/**
|
|
|
|
* 上滑
|
|
|
|
* @param {object} e 事件对象
|
|
|
|
* @returns {boolean} 布尔值
|
|
|
|
*/
|
|
|
|
isUp(gesture = {}, touche = {}) {
|
|
|
|
const {startX, startY} = gesture
|
|
|
|
const deltaX = touche.clientX - startX
|
|
|
|
const deltaY = touche.clientY - startY
|
|
|
|
if (deltaY < -60 && deltaX < 20 && deltaX > -20) {
|
|
|
|
this.slideLock = false
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 下滑
|
|
|
|
* @param {object} e 事件对象
|
|
|
|
* @returns {boolean} 布尔值
|
|
|
|
*/
|
|
|
|
isDown(gesture = {}, touche = {}) {
|
|
|
|
const {startX, startY} = gesture
|
|
|
|
const deltaX = touche.clientX - startX
|
|
|
|
const deltaY = touche.clientY - startY
|
|
|
|
if (deltaY > 60 && deltaX < 20 && deltaX > -20) {
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 左滑
|
|
|
|
* @param {object} e 事件对象
|
|
|
|
* @returns {boolean} 布尔值
|
|
|
|
*/
|
|
|
|
isLeft(gesture = {}, touche = {}) {
|
|
|
|
const {startX, startY} = gesture
|
|
|
|
const deltaX = touche.clientX - startX
|
|
|
|
const deltaY = touche.clientY - startY
|
|
|
|
if (deltaX < -60 && deltaY < 20 && deltaY > -20) {
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 右滑
|
|
|
|
* @param {object} e 事件对象
|
|
|
|
* @returns {boolean} 布尔值
|
|
|
|
*/
|
|
|
|
isRight(gesture = {}, touche = {}) {
|
|
|
|
const {startX, startY} = gesture
|
|
|
|
const deltaX = touche.clientX - startX
|
|
|
|
const deltaY = touche.clientY - startY
|
|
|
|
|
|
|
|
if (deltaX > 60 && deltaY < 20 && deltaY > -20) {
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class GetDate {
|
|
|
|
/**
|
|
|
|
* new Date 区分平台
|
|
|
|
* @param {number} year
|
|
|
|
* @param {number} month
|
|
|
|
* @param {number} day
|
|
|
|
*/
|
|
|
|
newDate(year, month, day) {
|
|
|
|
let cur = `${+year}-${+month}-${+day}`
|
|
|
|
if (isIos()) {
|
|
|
|
cur = `${+year}/${+month}/${+day}`
|
|
|
|
}
|
|
|
|
return new Date(cur)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 计算指定月份共多少天
|
|
|
|
* @param {number} year 年份
|
|
|
|
* @param {number} month 月份
|
|
|
|
*/
|
|
|
|
thisMonthDays(year, month) {
|
|
|
|
return new Date(Date.UTC(year, month, 0)).getUTCDate()
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 计算指定月份第一天星期几
|
|
|
|
* @param {number} year 年份
|
|
|
|
* @param {number} month 月份
|
|
|
|
*/
|
|
|
|
firstDayOfWeek(year, month) {
|
|
|
|
return new Date(Date.UTC(year, month - 1, 1)).getUTCDay()
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 计算指定日期星期几
|
|
|
|
* @param {number} year 年份
|
|
|
|
* @param {number} month 月份
|
|
|
|
* @param {number} date 日期
|
|
|
|
*/
|
|
|
|
dayOfWeek(year, month, date) {
|
|
|
|
return new Date(Date.UTC(year, month - 1, date)).getUTCDay()
|
|
|
|
}
|
|
|
|
|
|
|
|
todayDate() {
|
|
|
|
const _date = new Date()
|
|
|
|
const year = _date.getFullYear()
|
|
|
|
const month = _date.getMonth() + 1
|
|
|
|
const date = _date.getDate()
|
|
|
|
return {
|
|
|
|
year,
|
|
|
|
month,
|
|
|
|
date
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
todayTimestamp() {
|
|
|
|
const {year, month, date} = this.todayDate()
|
|
|
|
const timestamp = this.newDate(year, month, date).getTime()
|
|
|
|
return timestamp
|
|
|
|
}
|
|
|
|
|
|
|
|
toTimeStr(dateInfo) {
|
|
|
|
if (dateInfo.day) {
|
|
|
|
dateInfo.date = dateInfo.day
|
|
|
|
}
|
|
|
|
return `${+dateInfo.year}-${+dateInfo.month}-${+dateInfo.date}`
|
|
|
|
}
|
|
|
|
|
|
|
|
sortDates(dates, sortType) {
|
|
|
|
return dates.sort(function (a, b) {
|
|
|
|
const at = getDateTimeStamp(a)
|
|
|
|
const bt = getDateTimeStamp(b)
|
|
|
|
if (at < bt && sortType !== 'desc') {
|
|
|
|
return -1
|
|
|
|
} else {
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
prevMonth(dataInfo) {
|
|
|
|
const prevMonthInfo =
|
|
|
|
+dataInfo.month > 1
|
|
|
|
? {
|
|
|
|
year: dataInfo.year,
|
|
|
|
month: dataInfo.month - 1
|
|
|
|
}
|
|
|
|
: {
|
|
|
|
year: dataInfo.year - 1,
|
|
|
|
month: 12
|
|
|
|
}
|
|
|
|
return prevMonthInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
nextMonth(dataInfo) {
|
|
|
|
const nextMonthInfo =
|
|
|
|
+dataInfo.month < 12
|
|
|
|
? {
|
|
|
|
year: dataInfo.year,
|
|
|
|
month: dataInfo.month + 1
|
|
|
|
}
|
|
|
|
: {
|
|
|
|
year: dataInfo.year + 1,
|
|
|
|
month: 1
|
|
|
|
}
|
|
|
|
return nextMonthInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
convertLunar(dates = []) {
|
|
|
|
const datesWithLunar = dates.map(date => {
|
|
|
|
if (date) {
|
|
|
|
date.lunar = convertSolarLunar.solar2lunar(
|
|
|
|
+date.year,
|
|
|
|
+date.month,
|
|
|
|
+date.day
|
|
|
|
)
|
|
|
|
}
|
|
|
|
return date
|
|
|
|
})
|
|
|
|
return datesWithLunar
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isIos() {
|
|
|
|
const sys = getSystemInfo()
|
|
|
|
return /iphone|ios/i.test(sys.platform)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 浅比较对象是否相等
|
|
|
|
* @param {Object} origin 对比源
|
|
|
|
* @param {Object} target 对比目标
|
|
|
|
* @return {Boolean} true 为相等,false 为不等
|
|
|
|
*/
|
|
|
|
export function shallowEqual(origin, target) {
|
|
|
|
if (origin === target) {
|
|
|
|
return true
|
|
|
|
} else if (
|
|
|
|
typeof origin === 'object' &&
|
|
|
|
origin != null &&
|
|
|
|
typeof target === 'object' &&
|
|
|
|
target != null
|
|
|
|
) {
|
|
|
|
if (Object.keys(origin).length !== Object.keys(target).length) return false
|
|
|
|
for (var prop in origin) {
|
|
|
|
if (target.hasOwnProperty(prop)) {
|
|
|
|
if (!shallowEqual(origin[prop], target[prop])) return false
|
|
|
|
} else return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
} else return false
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取当前页面实例
|
|
|
|
*/
|
|
|
|
export function getCurrentPage() {
|
|
|
|
const pages = getCurrentPages()
|
|
|
|
const last = pages.length - 1
|
|
|
|
return pages[last]
|
|
|
|
}
|
|
|
|
|
|
|
|
export function getComponent(componentId) {
|
|
|
|
const logger = new Logger()
|
|
|
|
let page = getCurrentPage() || {}
|
|
|
|
if (page.selectComponent && typeof page.selectComponent === 'function') {
|
|
|
|
if (componentId) {
|
|
|
|
return page.selectComponent(componentId)
|
|
|
|
} else {
|
|
|
|
logger.warn('请传入组件ID')
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
logger.warn('该基础库暂不支持多个小程序日历组件')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 日期数组根据日期去重
|
|
|
|
* @param {array} array 数组
|
|
|
|
*/
|
|
|
|
export function uniqueArrayByDate(array = []) {
|
|
|
|
let uniqueObject = {}
|
|
|
|
let uniqueArray = []
|
|
|
|
array.forEach(item => {
|
|
|
|
uniqueObject[`${item.year}-${item.month}-${item.day}`] = item
|
|
|
|
})
|
|
|
|
for (let i in uniqueObject) {
|
|
|
|
uniqueArray.push(uniqueObject[i])
|
|
|
|
}
|
|
|
|
return uniqueArray
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 指定可选日期及可选日期数组去重
|
|
|
|
* @param {array} enableDays 特定可选日期数组
|
|
|
|
* @param {array} enableArea 可选日期区域数组
|
|
|
|
*/
|
|
|
|
export function delRepeatedEnableDay(enableDays = [], enableArea = []) {
|
|
|
|
let _startTimestamp
|
|
|
|
let _endTimestamp
|
|
|
|
if (enableArea.length === 2) {
|
|
|
|
const {startTimestamp, endTimestamp} = convertEnableAreaToTimestamp(
|
|
|
|
enableArea
|
|
|
|
)
|
|
|
|
_startTimestamp = startTimestamp
|
|
|
|
_endTimestamp = endTimestamp
|
|
|
|
}
|
|
|
|
const enableDaysTimestamp = converEnableDaysToTimestamp(enableDays)
|
|
|
|
const tmp = enableDaysTimestamp.filter(
|
|
|
|
item => item < _startTimestamp || item > _endTimestamp
|
|
|
|
)
|
|
|
|
return tmp
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 指定日期区域转时间戳
|
|
|
|
* @param {array} timearea 时间区域
|
|
|
|
*/
|
|
|
|
export function convertEnableAreaToTimestamp(timearea = []) {
|
|
|
|
const getDate = new GetDate()
|
|
|
|
const start = timearea[0].split('-')
|
|
|
|
const end = timearea[1].split('-')
|
|
|
|
const logger = new Logger()
|
|
|
|
if (start.length !== 3 || end.length !== 3) {
|
|
|
|
logger.warn('enableArea() 参数格式为: ["2018-2-1", "2018-3-1"]')
|
|
|
|
return {}
|
|
|
|
}
|
|
|
|
const startTimestamp = getDate.newDate(start[0], start[1], start[2]).getTime()
|
|
|
|
const endTimestamp = getDate.newDate(end[0], end[1], end[2]).getTime()
|
|
|
|
return {
|
|
|
|
start,
|
|
|
|
end,
|
|
|
|
startTimestamp,
|
|
|
|
endTimestamp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 计算指定日期时间戳
|
|
|
|
* @param {object} dateInfo
|
|
|
|
*/
|
|
|
|
export function getDateTimeStamp(dateInfo) {
|
|
|
|
if (Object.prototype.toString.call(dateInfo) !== '[object Object]') return
|
|
|
|
const getDate = new GetDate()
|
|
|
|
return getDate.newDate(dateInfo.year, dateInfo.month, dateInfo.day).getTime()
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 指定特定日期数组转时间戳
|
|
|
|
* @param {array} enableDays 指定时间数组
|
|
|
|
*/
|
|
|
|
export function converEnableDaysToTimestamp(enableDays = []) {
|
|
|
|
const logger = new Logger()
|
|
|
|
const getDate = new GetDate()
|
|
|
|
const enableDaysTimestamp = []
|
|
|
|
enableDays.forEach(item => {
|
|
|
|
if (typeof item !== 'string')
|
|
|
|
return logger.warn('enableDays()入参日期格式错误')
|
|
|
|
const tmp = item.split('-')
|
|
|
|
if (tmp.length !== 3) return logger.warn('enableDays()入参日期格式错误')
|
|
|
|
const timestamp = getDate.newDate(tmp[0], tmp[1], tmp[2]).getTime()
|
|
|
|
enableDaysTimestamp.push(timestamp)
|
|
|
|
})
|
|
|
|
return enableDaysTimestamp
|
|
|
|
}
|
|
|
|
|
|
|
|
// 同一页面多个日历组件按先后顺序渲染
|
|
|
|
export const initialTasks = {
|
|
|
|
flag: 'finished', // process 处理中,finished 处理完成
|
|
|
|
tasks: []
|
|
|
|
}
|