From 1e71dd86f6d0c4fc7e5143600d4bc4b50992a2a7 Mon Sep 17 00:00:00 2001 From: quanyawei <401863037@qq.com> Date: Thu, 04 Jul 2024 14:51:28 +0800 Subject: [PATCH] fix: 高德密钥修改 --- uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue | 360 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 360 insertions(+), 0 deletions(-) diff --git a/uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue b/uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue new file mode 100644 index 0000000..18d8dcc --- /dev/null +++ b/uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue @@ -0,0 +1,360 @@ +<template> + <u-picker + ref="picker" + :show="show" + :closeOnClickOverlay="closeOnClickOverlay" + :columns="columns" + :title="title" + :itemHeight="itemHeight" + :showToolbar="showToolbar" + :visibleItemCount="visibleItemCount" + :defaultIndex="innerDefaultIndex" + :cancelText="cancelText" + :confirmText="confirmText" + :cancelColor="cancelColor" + :confirmColor="confirmColor" + @close="close" + @cancel="cancel" + @confirm="confirm" + @change="change" + > + </u-picker> +</template> + +<script> + function times(n, iteratee) { + let index = -1 + const result = Array(n < 0 ? 0 : n) + while (++index < n) { + result[index] = iteratee(index) + } + return result + } + import props from './props.js'; + import dayjs from '../../libs/util/dayjs.js'; + /** + * DatetimePicker ��������������������� + * @description ������������������������������ + * @tutorial https://www.uviewui.com/components/datetimePicker.html + * @property {Boolean} show ��������������������������������������� ( ������ false ) + * @property {Boolean} showToolbar ������������������������������ ( ������ true ) + * @property {String | Number} value ��������� + * @property {String} title ������������ + * @property {String} mode ������������ mode=date������������������mode=time������������������mode=year-month������������������mode=datetime��������������������� ( ������ ���datetime ) + * @property {Number} maxDate ��������������������� ���������������10��� + * @property {Number} minDate ��������������������� ���������������10��� + * @property {Number} minHour ���������������������������mode=time������ ( ������ 0 ) + * @property {Number} maxHour ���������������������������mode=time������ ( ������ 23 ) + * @property {Number} minMinute ���������������������������mode=time������ ( ������ 0 ) + * @property {Number} maxMinute ���������������������������mode=time������ ( ������ 59 ) + * @property {Function} filter ������������������ + * @property {Function} formatter ��������������������� + * @property {Boolean} loading ��������������������������� ( ������ false ) + * @property {String | Number} itemHeight ��������������������������������� ( ������ 44 ) + * @property {String} cancelText ��������������������� ( ������ '������' ) + * @property {String} confirmText ��������������������� ( ������ '������' ) + * @property {String} cancelColor ��������������������� ( ������ '#909193' ) + * @property {String} confirmColor ��������������������� ( ������ '#3c9cff' ) + * @property {String | Number} visibleItemCount ������������������������������ ( ������ 5 ) + * @property {Boolean} closeOnClickOverlay ��������������������������������������� ( ������ false ) + * @property {Array} defaultIndex ��������������������� + * @event {Function} close ������������������������ + * @event {Function} confirm ��������������������������������������������� + * @event {Function} change ��������������������������� + * @event {Function} cancel ������������������ + * @example <u-datetime-picker :show="show" :value="value1" mode="datetime" ></u-datetime-picker> + */ + export default { + name: 'datetime-picker', + mixins: [uni.$u.mpMixin, uni.$u.mixin, props], + data() { + return { + columns: [], + innerDefaultIndex: [], + innerFormatter: (type, value) => value + } + }, + watch: { + show(newValue, oldValue) { + if (newValue) { + this.updateColumnValue(this.innerValue) + } + }, + propsChange() { + this.init() + } + }, + computed: { + // ������������������������������������������������������������������������������������ + propsChange() { + return [this.mode, this.maxDate, this.minDate, this.minHour, this.maxHour, this.minMinute, this.maxMinute, this.filter, ] + } + }, + mounted() { + this.init() + }, + methods: { + init() { + this.innerValue = this.correctValue(this.value) + this.updateColumnValue(this.innerValue) + }, + // ������������������������������������������������props������������������������ref������������ + setFormatter(e) { + this.innerFormatter = e + }, + // ��������������� + close() { + if (this.closeOnClickOverlay) { + this.$emit('close') + } + }, + // ������������������������������ + cancel() { + this.$emit('cancel') + }, + // ������������������������������ + confirm() { + this.$emit('confirm', { + value: this.innerValue, + mode: this.mode + }) + this.$emit('input', this.innerValue) + }, + //������������������������,������������������������,������������ + intercept(e,type){ + let judge = e.match(/\d+/g) + //������������������������ + if(judge.length>1){ + uni.$u.error("������������������������������������������������") + return 0 + }else if(type&&judge[0].length==4){//��������������������� + return judge[0] + }else if(judge[0].length>2){ + uni.$u.error("������������������������������������������������") + return 0 + }else{ + return judge[0] + } + }, + // ������������������������ + change(e) { + const { indexs, values } = e + let selectValue = '' + if(this.mode === 'time') { + // ������value������������������������������������������������������������������ + selectValue = `${this.intercept(values[0][indexs[0]])}:${this.intercept(values[1][indexs[1]])}` + } else { + // ������������������������������������'03'���������������3���'2019'���������������2019 + const year = parseInt(this.intercept(values[0][indexs[0]],'year')) + const month = parseInt(this.intercept(values[1][indexs[1]])) + let date = parseInt(values[2] ? this.intercept(values[2][indexs[2]]) : 1) + let hour = 0, minute = 0 + // ������������������������ + const maxDate = dayjs(`${year}-${month}`).daysInMonth() + // year-month������������date���������������������������������1������������������������������1��������� + if (this.mode === 'year-month') { + date = 1 + } + // ���������������maxDate��� + date = Math.min(maxDate, date) + if (this.mode === 'datetime') { + hour = parseInt(this.intercept(values[3][indexs[3]])) + minute = parseInt(this.intercept(values[4][indexs[4]])) + } + // ������������������ + selectValue = Number(new Date(year, month - 1, date, hour, minute)) + } + // ������������������������������������������������������ + selectValue = this.correctValue(selectValue) + this.innerValue = selectValue + this.updateColumnValue(selectValue) + // ������change���������value��������������������������� + this.$emit('change', { + value: selectValue, + // #ifndef MP-WEIXIN + // ���������������������������this��������������������������������������� + picker: this.$refs.picker, + // #endif + mode: this.mode + }) + }, + // ������������������������������0��������������������� + updateColumnValue(value) { + this.innerValue = value + this.updateColumns() + this.updateIndexs(value) + }, + // ������������ + updateIndexs(value) { + let values = [] + const formatter = this.formatter || this.innerFormatter + const padZero = uni.$u.padZero + if (this.mode === 'time') { + // ���time������������������:��������������� + const timeArr = value.split(':') + // ������formatter��������������������������������� + values = [formatter('hour', timeArr[0]), formatter('minute', timeArr[1])] + } else { + const date = new Date(value) + values = [ + formatter('year', `${dayjs(value).year()}`), + // ���������0 + formatter('month', padZero(dayjs(value).month() + 1)) + ] + if (this.mode === 'date') { + // date��������������������������� + values.push(formatter('day', padZero(dayjs(value).date()))) + } + if (this.mode === 'datetime') { + // ���������push��������������������������������� + values.push(formatter('day', padZero(dayjs(value).date())), formatter('hour', padZero(dayjs(value).hour())), formatter('minute', padZero(dayjs(value).minute()))) + } + } + + // ������������������������������������������������������������������������������������������ + const indexs = this.columns.map((column, index) => { + // ������������������������������������������������������������-1������ + return Math.max(0, column.findIndex(item => item === values[index])) + }) + this.innerDefaultIndex = indexs + }, + // ������������������ + updateColumns() { + const formatter = this.formatter || this.innerFormatter + // ���������������������������map������������������������������������0������ + const results = this.getOriginColumns().map((column) => column.values.map((value) => formatter(column.type, value))) + this.columns = results + }, + getOriginColumns() { + // ������������������ + const results = this.getRanges().map(({ type, range }) => { + let values = times(range[1] - range[0] + 1, (index) => { + let value = range[0] + index + value = type === 'year' ? `${value}` : uni.$u.padZero(value) + return value + }) + // ������������ + if (this.filter) { + values = this.filter(type, values) + } + return { type, values } + }) + return results + }, + // ��������������������������������������� + generateArray(start, end) { + return Array.from(new Array(end + 1).keys()).slice(start) + }, + // ��������������������� + correctValue(value) { + const isDateMode = this.mode !== 'time' + if (isDateMode && !uni.$u.test.date(value)) { + // ������������������������������������������������������������������������������������������������������������ + value = this.minDate + } else if (!isDateMode && !value) { + // ������������������������������������������������������������������������ + value = `${uni.$u.padZero(this.minHour)}:${uni.$u.padZero(this.minMinute)}` + } + // ������������ + if (!isDateMode) { + if (String(value).indexOf(':') === -1) return uni.$u.error('���������������������������12:24���������') + let [hour, minute] = value.split(':') + // ������������������������������������������������������������ + hour = uni.$u.padZero(uni.$u.range(this.minHour, this.maxHour, Number(hour))) + minute = uni.$u.padZero(uni.$u.range(this.minMinute, this.maxMinute, Number(minute))) + return `${ hour }:${ minute }` + } else { + // ������������������������������������������������������������������ + value = dayjs(value).isBefore(dayjs(this.minDate)) ? this.minDate : value + value = dayjs(value).isAfter(dayjs(this.maxDate)) ? this.maxDate : value + return value + } + }, + // ��������������������������������� + getRanges() { + if (this.mode === 'time') { + return [ + { + type: 'hour', + range: [this.minHour, this.maxHour], + }, + { + type: 'minute', + range: [this.minMinute, this.maxMinute], + }, + ]; + } + const { maxYear, maxDate, maxMonth, maxHour, maxMinute, } = this.getBoundary('max', this.innerValue); + const { minYear, minDate, minMonth, minHour, minMinute, } = this.getBoundary('min', this.innerValue); + const result = [ + { + type: 'year', + range: [minYear, maxYear], + }, + { + type: 'month', + range: [minMonth, maxMonth], + }, + { + type: 'day', + range: [minDate, maxDate], + }, + { + type: 'hour', + range: [minHour, maxHour], + }, + { + type: 'minute', + range: [minMinute, maxMinute], + }, + ]; + if (this.mode === 'date') + result.splice(3, 2); + if (this.mode === 'year-month') + result.splice(2, 3); + return result; + }, + // ������minDate���maxDate���minHour���maxHour������������������������������������������������������ + getBoundary(type, innerValue) { + const value = new Date(innerValue) + const boundary = new Date(this[`${type}Date`]) + const year = dayjs(boundary).year() + let month = 1 + let date = 1 + let hour = 0 + let minute = 0 + if (type === 'max') { + month = 12 + // ��������������� + date = dayjs(value).daysInMonth() + hour = 23 + minute = 59 + } + // ������������������������������������������������������(������������������)��������������������������������������������������������� + if (dayjs(value).year() === year) { + month = dayjs(boundary).month() + 1 + if (dayjs(value).month() + 1 === month) { + date = dayjs(boundary).date() + if (dayjs(value).date() === date) { + hour = dayjs(boundary).hour() + if (dayjs(value).hour() === hour) { + minute = dayjs(boundary).minute() + } + } + } + } + return { + [`${type}Year`]: year, + [`${type}Month`]: month, + [`${type}Date`]: date, + [`${type}Hour`]: hour, + [`${type}Minute`]: minute + } + }, + }, + } +</script> + +<style lang="scss" scoped> + @import '../../libs/css/components.scss'; +</style> -- Gitblit v1.8.0