You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

367 lines
8.9 KiB

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: []
}