373 lines
7.6 KiB
Vue
373 lines
7.6 KiB
Vue
<script setup>
|
||
/**
|
||
* 闹钟组件 仅对nvue兼容
|
||
*/
|
||
|
||
import {
|
||
onMounted,
|
||
ref,
|
||
reactive,
|
||
getCurrentInstance,
|
||
watch,
|
||
defineExpose,
|
||
computed,
|
||
} from 'vue';
|
||
// 工具库
|
||
import util from '@/common/js/util';
|
||
// api
|
||
import api from '@/api/index.js'
|
||
import {
|
||
before,
|
||
result
|
||
} from 'lodash';
|
||
|
||
const {
|
||
proxy
|
||
} = getCurrentInstance()
|
||
// 类型列表
|
||
const typeList = reactive([{
|
||
name: '倒计时闹钟',
|
||
key: 'countDown',
|
||
}, {
|
||
name: '时间闹钟',
|
||
key: 'time',
|
||
}, ])
|
||
const typeIndex = ref(0)
|
||
// 小时
|
||
const hour = reactive([])
|
||
// 小时下标
|
||
const hourIndex = ref(0)
|
||
// 分钟
|
||
const minute = reactive([])
|
||
// 分钟下标
|
||
const minuteIndex = ref(0)
|
||
// 闹铃时间
|
||
const alarm = computed(() => {
|
||
let result = uni.$store.state.alarmTime
|
||
return result
|
||
})
|
||
// 获取年月日
|
||
const yMd = ref('')
|
||
// 解决动态设置indicator-style不生效的问题
|
||
const visible = ref(true)
|
||
|
||
onMounted(() => {
|
||
// 打开弹窗
|
||
// open()
|
||
const date = new Date()
|
||
// 年月日
|
||
yMd.value = `${date.getFullYear()}-${util.toTwo(date.getMonth() + 1)}-${util.toTwo(date.getDate())}`
|
||
|
||
// 初始化
|
||
init()
|
||
|
||
util.isLogin().then(() => {
|
||
// 设置
|
||
getAlarm()
|
||
})
|
||
|
||
//
|
||
uni.$on('login', () => {
|
||
// 设置
|
||
getAlarm()
|
||
})
|
||
|
||
// 清空
|
||
uni.$on('logout', () => {
|
||
uni.$store.commit('setState', {
|
||
key: 'alarmTime',
|
||
value: '',
|
||
})
|
||
})
|
||
})
|
||
|
||
// 获取设置的倒计时
|
||
function getAlarm() {
|
||
api.video.getAlarm().then(rs => {
|
||
if (rs.code == 200) {
|
||
const result = rs.data
|
||
if (!result) return
|
||
// 结束时间
|
||
setTime(result.endTime)
|
||
return
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 设置闹钟提醒方式
|
||
* @param {Object} ev 默认事件
|
||
*/
|
||
function handleType(ev) {
|
||
const index = ev.detail.value
|
||
if (typeIndex.value === index) return
|
||
typeIndex.value = index
|
||
|
||
// 时间
|
||
if (typeList[index].key == 'time') {
|
||
const date = new Date()
|
||
hourIndex.value = hour.findIndex(node => node == date.getHours())
|
||
minuteIndex.value = minute.findIndex(node => node == date.getMinutes())
|
||
} else if (typeList[index].key == 'countDown') {
|
||
hourIndex.value = 0
|
||
minuteIndex.value = 0
|
||
}
|
||
}
|
||
|
||
// 初始化
|
||
function init() {
|
||
// 小时
|
||
for (let i = 0; i < 24; i++) {
|
||
hour.push(i)
|
||
}
|
||
// 分钟
|
||
for (let i = 0; i < 60; i++) {
|
||
minute.push(i)
|
||
}
|
||
}
|
||
|
||
// 设置时间
|
||
function setTime(endTime) {
|
||
// 当前时间
|
||
const currentTime = new Date(util.formatTime('yyyy-MM-dd HH:mm:ss')).valueOf()
|
||
// 闹钟时间
|
||
const alarmTime = new Date(endTime).valueOf()
|
||
// 如果闹钟时间小于当前时间
|
||
if (alarmTime < currentTime) return
|
||
|
||
//
|
||
setTimeout(() => {
|
||
util.alert({
|
||
content: '闹钟提醒时间到',
|
||
showCancel: false,
|
||
})
|
||
|
||
uni.$store.commit('setState', {
|
||
key: 'alarmTime',
|
||
value: '',
|
||
})
|
||
}, alarmTime - currentTime)
|
||
|
||
uni.$store.commit('setState', {
|
||
key: 'alarmTime',
|
||
value: endTime,
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 滑动小时
|
||
* @param {Object} ev 默认对象
|
||
*/
|
||
function handleHour(ev) {
|
||
const index = ev.detail.value[0]
|
||
if (hourIndex.value === index) return
|
||
hourIndex.value = index
|
||
}
|
||
|
||
/**
|
||
* 滑动分钟
|
||
* @param {Object} ev 默认对象
|
||
*/
|
||
function handleMinute(ev) {
|
||
const index = ev.detail.value[0]
|
||
if (minuteIndex.value === index) return
|
||
minuteIndex.value = index
|
||
}
|
||
|
||
// 打开弹窗
|
||
function open() {
|
||
proxy.$refs.time.open()
|
||
}
|
||
|
||
// 关闭弹窗
|
||
function close() {
|
||
proxy.$refs.time.close()
|
||
}
|
||
|
||
// 提交
|
||
function handleSubmit() {
|
||
// 当前下标
|
||
const type = typeList[typeIndex.value]
|
||
|
||
// 当前时间
|
||
let endTime = yMd.value
|
||
|
||
// 如果是倒计时闹钟
|
||
if (type.key == 'countDown') {
|
||
// 如果是当前时间
|
||
if (hourIndex.value === 0 && minuteIndex.value === 0) {
|
||
util.alert('当前时间已到')
|
||
return
|
||
}
|
||
|
||
//
|
||
endTime = util.strtotime(`+${hour[hourIndex.value]} hour`, new Date().getTime())
|
||
endTime = util.strtotime(`+${minute[minuteIndex.value]} minute`, endTime)
|
||
endTime = new Date(endTime).setSeconds(0)
|
||
endTime = util.formatTime('yyyy-MM-dd HH:mm:ss', endTime)
|
||
} else if (type.key == 'time') {
|
||
endTime += ` ${util.toTwo(hour[hourIndex.value])}:${util.toTwo(minute[minuteIndex.value])}:00`
|
||
// 当前时间
|
||
const currentTime = new Date(util.formatTime('yyyy-MM-dd HH:mm:ss')).valueOf()
|
||
// 闹钟时间
|
||
const alarmTime = new Date(endTime).valueOf()
|
||
|
||
// 如果闹钟时间小于当前时间
|
||
if (alarmTime < currentTime) {
|
||
util.alert('设置闹钟时间应大于当前时间')
|
||
return
|
||
}
|
||
}
|
||
|
||
api.video.setAlarm({
|
||
query: {
|
||
endTime,
|
||
}
|
||
}).then(rs => {
|
||
if (rs.code == 200) {
|
||
util.alert('设置成功')
|
||
|
||
//
|
||
setTime(endTime)
|
||
close()
|
||
return
|
||
}
|
||
|
||
util.alert({
|
||
content: rs.msg,
|
||
showCancel: false,
|
||
})
|
||
})
|
||
}
|
||
|
||
//
|
||
defineExpose({
|
||
open,
|
||
close,
|
||
})
|
||
</script>
|
||
|
||
<template>
|
||
<uni-popup ref="time" type="bottom">
|
||
<view class="popBot plr60 bfff">
|
||
<view class="close" @click="$refs.time.close()">
|
||
<uni-icons type="close" size="36rpx" color="#333" />
|
||
</view>
|
||
|
||
<!-- 标题 -->
|
||
<view class="title mtb40">
|
||
<picker class="df fdr jcc aic" :range="typeList" @change="handleType" :value="typeIndex" range-key="name">
|
||
<text class="tac f40">{{typeList[typeIndex].name}}</text>
|
||
<uni-icons type="right" color="#999" size="32rpx" />
|
||
</picker>
|
||
</view>
|
||
<!-- 副标题 -->
|
||
<view class="">
|
||
<text class="f32">闹钟提醒时间:{{alarm || '未设置'}}</text>
|
||
</view>
|
||
|
||
<!-- 操作台 -->
|
||
<view class="oclockBox aic mtb25">
|
||
<view class="oclock">
|
||
<!-- 选择器 -->
|
||
<view class="f1">
|
||
<picker-view v-if="visible" class="select f1" :value="[hourIndex]" indicator-class="option active" indicator-style="height: 56rpx;" @change="handleHour">
|
||
<picker-view-column>
|
||
<view v-for="(item,index) in hour" :key="index" class="option fdr aic jcc">
|
||
<text class="text">{{item}}</text>
|
||
<text class="text" v-if="index === hourIndex">时</text>
|
||
</view>
|
||
</picker-view-column>
|
||
</picker-view>
|
||
</view>
|
||
|
||
<view class="jcc">
|
||
<text>:</text>
|
||
</view>
|
||
|
||
<view class="f1">
|
||
<picker-view v-if="visible" class="select f1" :value="[minuteIndex]" indicator-class="option active" indicator-style="height: 56rpx;" @change="handleMinute">
|
||
<picker-view-column>
|
||
<view v-for="(item,index) in minute" :key="index" class="option fdr aic jcc">
|
||
<text class="text">{{item}}</text>
|
||
<text class="text" v-if="index === minuteIndex">分</text>
|
||
</view>
|
||
</picker-view-column>
|
||
</picker-view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 文字提示 -->
|
||
<view class="mt10">
|
||
<text class="c666 f20">预先设置观影时间,到时自动提醒</text>
|
||
</view>
|
||
|
||
<view class="btns mtb25">
|
||
<view class="button jcc confirm mtb10" @click="handleSubmit">
|
||
<text class="text">确认</text>
|
||
</view>
|
||
<view class="button jcc cancel mtb10" @click="close()">
|
||
<text class="text">关闭</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</uni-popup>
|
||
</template>
|
||
|
||
<style lang="scss" scoped>
|
||
//
|
||
.close {
|
||
position: absolute;
|
||
right: 20rpx;
|
||
top: 5rpx;
|
||
}
|
||
|
||
// 容器
|
||
.oclock {
|
||
flex-direction: row;
|
||
width: 460rpx;
|
||
height: 210rpx;
|
||
padding: 5rpx;
|
||
box-shadow: 0 0 8rpx rgba(0, 0, 0, 0.3);
|
||
border-radius: 25rpx;
|
||
|
||
// 选择器
|
||
.select {
|
||
|
||
// 文字
|
||
.text {
|
||
font-size: 48rpx;
|
||
color: #333;
|
||
}
|
||
}
|
||
}
|
||
|
||
.btns {
|
||
.button {
|
||
width: 460rpx;
|
||
height: 72rpx;
|
||
border-radius: 10rpx;
|
||
|
||
&.confirm {
|
||
background-color: #111;
|
||
|
||
.text {
|
||
color: #fff;
|
||
}
|
||
}
|
||
|
||
&.cancel {
|
||
background-color: #dcdcdc;
|
||
|
||
.text {
|
||
color: #333;
|
||
}
|
||
}
|
||
|
||
.text {
|
||
text-align: center;
|
||
}
|
||
}
|
||
}
|
||
</style> |