189 lines
4.3 KiB
Vue
189 lines
4.3 KiB
Vue
<template>
|
|
<!-- 日期弹窗 -->
|
|
<view class="popUpNotification" v-if="Props.modelValue" @click.stop="close">
|
|
<view class="box" @click.stop="Props.modelValue=true">
|
|
<view class="top">
|
|
<view class="l" @click="dayindex=dayindex+1" ><uni-icons v-if="dayindex<daydata.monthGroups.length-1" type="left" size="18rpx"></uni-icons>
|
|
</view>
|
|
<view class="c">{{daydata.monthGroups[dayindex].year}}年 {{daydata.monthGroups[dayindex].month}}月 </view>
|
|
<view class="r" @click="dayindex=dayindex-1" ><uni-icons v-if="dayindex>0" type="right" size="18rpx"></uni-icons>
|
|
</view>
|
|
</view>
|
|
<view class="day">
|
|
<view>一</view>
|
|
<view>二</view>
|
|
<view>三</view>
|
|
<view>四</view>
|
|
<view>五</view>
|
|
<view>六</view>
|
|
<view>日</view>
|
|
</view>
|
|
<view class="form">
|
|
<view v-for="item in daydata.monthGroups[dayindex].days" @click.stop="settime(`${daydata.monthGroups[dayindex].year}-${daydata.monthGroups[dayindex].month}-${item}`,!daydata.day.includes(`${daydata.monthGroups[dayindex].year}-${daydata.monthGroups[dayindex].month}-${item}`))" :class="{del:!daydata.day.includes(`${daydata.monthGroups[dayindex].year}-${daydata.monthGroups[dayindex].month}-${item}`),on:chooseday==`${daydata.monthGroups[dayindex].year}-${daydata.monthGroups[dayindex].month}-${item}`}">{{item}}</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {
|
|
ref
|
|
} from 'vue';
|
|
const daydata=ref({});
|
|
const chooseday=ref("");
|
|
const dayindex=ref(0)
|
|
const adssEmits = defineEmits(["update:modelValue","change"])
|
|
const Props= defineProps({
|
|
style:{
|
|
type:Object,
|
|
default:{}
|
|
},
|
|
modelValue:{
|
|
type:Boolean,
|
|
default:false
|
|
}
|
|
})
|
|
|
|
function getCompleteMonthData() {
|
|
const today = new Date();
|
|
const day = [];
|
|
// 1. 获取过去30天的日期并按月分组
|
|
const monthGroups = {};
|
|
for (let i = 0; i <= 30; i++) {
|
|
const date = new Date(today);
|
|
date.setDate(today.getDate() - i);
|
|
const year = date.getFullYear();
|
|
const month = date.getMonth() + 1;
|
|
const monthKey = `${year}-${month.toString().padStart(2, '0')}`;
|
|
day.push(`${year}-${month}-${date.getDate()}`)
|
|
if (!monthGroups[monthKey]) {
|
|
monthGroups[monthKey] = {
|
|
year,
|
|
month,
|
|
days: getDays(new Date(year, month, 0).getDate()) // 获取该月完整天数
|
|
};
|
|
}
|
|
}
|
|
|
|
function getDays(l) {
|
|
let _data = [];
|
|
for (let m = 1; m <= l; m++) {
|
|
_data.push(m)
|
|
}
|
|
return _data;
|
|
}
|
|
|
|
return {
|
|
day,
|
|
monthGroups:Object.values(monthGroups)
|
|
}
|
|
}
|
|
daydata.value = getCompleteMonthData()
|
|
chooseday.value=daydata.value.day[0];
|
|
|
|
// reset()
|
|
function close(){
|
|
Props.modelValue=false;
|
|
adssEmits("update:modelValue",false)
|
|
}
|
|
function settime(time,type){
|
|
if(!type){
|
|
chooseday.value=time;
|
|
adssEmits("change",time)
|
|
Props.modelValue=false;
|
|
adssEmits("update:modelValue",false)
|
|
}
|
|
|
|
}
|
|
function reset(){
|
|
chooseday.value=daydata.value.day[0];
|
|
dayindex.value=0;
|
|
adssEmits("change",chooseday.value)
|
|
}
|
|
defineExpose({
|
|
reset
|
|
})
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.popUpNotification {
|
|
position: fixed;
|
|
top: 0px;
|
|
left: 0px;
|
|
width: 100%;
|
|
height: 100%;
|
|
background: rgba(0, 0, 0, 0.3);
|
|
z-index: 22;
|
|
|
|
&>.box {
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 50%;
|
|
transform: translate(-50%, -50%);
|
|
background: #fff;
|
|
border-radius: 10rpx;
|
|
overflow: hidden;
|
|
width: 300rpx;
|
|
|
|
.top {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
background: #F6F6F6;
|
|
padding: 10rpx 15rpx;
|
|
|
|
.c {
|
|
font-size: 13rpx;
|
|
font-weight: 800;
|
|
}
|
|
|
|
}
|
|
|
|
.day {
|
|
margin: 0rpx 15rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
margin: 10rpx 10rpx;
|
|
|
|
view {
|
|
flex: 1;
|
|
text-align: center;
|
|
font-size: 10rpx;
|
|
color: rgba(0, 0, 0, 0.88);
|
|
}
|
|
}
|
|
|
|
.form {
|
|
display: grid;
|
|
flex-wrap: wrap;
|
|
grid-template-columns: repeat(7, 1fr);
|
|
gap: 5rpx;
|
|
padding: 0rpx 10rpx;
|
|
padding-bottom: 10rpx;
|
|
|
|
view {
|
|
text-align: center;
|
|
flex: 1 1 1 1 1 1 1;
|
|
background: #F4F7FF;
|
|
color: #4D7BFF;
|
|
font-size: 11rpx;
|
|
border-radius: 3rpx;
|
|
padding: 10rpx 0;
|
|
}
|
|
|
|
.on {
|
|
background: #4D7BFF;
|
|
color: #fff;
|
|
|
|
}
|
|
|
|
.del {
|
|
background: transparent;
|
|
color: #999999;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
</style> |