密码支持选择24点功能
This commit is contained in:
parent
db607aa35a
commit
9a274a77c2
12
api/setting.js
Normal file
12
api/setting.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import request from '../utils/request'
|
||||||
|
|
||||||
|
// setting 设置模块
|
||||||
|
|
||||||
|
// 获取锁设置
|
||||||
|
export function getLockSettingRequest(data) {
|
||||||
|
return request({
|
||||||
|
url: '/lockSetting/getLockSetting',
|
||||||
|
method: 'POST',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
276
components/LockDateHourPicker/LockDateHourPicker.vue
Normal file
276
components/LockDateHourPicker/LockDateHourPicker.vue
Normal file
@ -0,0 +1,276 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<view @click="openPicker" class="flex items-center bg-white font-bold text-base h-100 w-full">
|
||||||
|
<view class="w-168 ml-4 leading-[100rpx]">{{ title }}</view>
|
||||||
|
<view class="mr-4 text-right w-[518rpx] h-100 leading-[100rpx]">
|
||||||
|
{{ timeFormat(value, 'yyyy-mm-dd h:M') }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<up-popup :show="show" @close="closePicker" mode="bottom" bgColor="transparent" round="32rpx">
|
||||||
|
<view class="w-750 bg-white">
|
||||||
|
<view class="flex justify-between items-center px-4 py-3 text-lg">
|
||||||
|
<text class="text-gray-500" @click="closePicker">取消</text>
|
||||||
|
<text class="font-bold">{{ title }}</text>
|
||||||
|
<text class="text-blue-500" @click="confirmSelection">确定</text>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<picker-view
|
||||||
|
:value="pickerIndex"
|
||||||
|
class="h-250px"
|
||||||
|
indicator-style="height:50px"
|
||||||
|
@change="onPickerChange"
|
||||||
|
:immediate-change="true"
|
||||||
|
>
|
||||||
|
<picker-view-column>
|
||||||
|
<view v-for="year in years" :key="year" class="text-center text-lg leading-10"
|
||||||
|
>{{ year }}年</view
|
||||||
|
>
|
||||||
|
</picker-view-column>
|
||||||
|
<picker-view-column>
|
||||||
|
<view v-for="month in months" :key="month" class="text-center text-lg leading-10"
|
||||||
|
>{{ month }}月</view
|
||||||
|
>
|
||||||
|
</picker-view-column>
|
||||||
|
<picker-view-column>
|
||||||
|
<view v-for="day in days" :key="day" class="text-center text-lg leading-10"
|
||||||
|
>{{ day }}日</view
|
||||||
|
>
|
||||||
|
</picker-view-column>
|
||||||
|
<picker-view-column>
|
||||||
|
<view v-for="hour in hours" :key="hour" class="text-center text-lg leading-10"
|
||||||
|
>{{ hour }}时</view
|
||||||
|
>
|
||||||
|
</picker-view-column>
|
||||||
|
</picker-view>
|
||||||
|
</view>
|
||||||
|
</up-popup>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, watch, computed } from 'vue'
|
||||||
|
import { timeFormat } from 'uview-plus'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
title: { type: String, default: '请选择时间' },
|
||||||
|
value: { type: String, default: '' },
|
||||||
|
minDate: { type: Number, required: true },
|
||||||
|
maxDate: { type: Number, required: true }
|
||||||
|
})
|
||||||
|
|
||||||
|
const emit = defineEmits(['changeTime'])
|
||||||
|
|
||||||
|
const openPicker = () => {
|
||||||
|
show.value = true
|
||||||
|
initPickerData(props.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
const closePicker = () => {
|
||||||
|
show.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const parseDate = timestamp => {
|
||||||
|
const date = new Date(timestamp)
|
||||||
|
return {
|
||||||
|
year: date.getFullYear(),
|
||||||
|
month: date.getMonth() + 1,
|
||||||
|
day: date.getDate(),
|
||||||
|
hour: date.getHours()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const minDateParsed = computed(() => parseDate(props.minDate))
|
||||||
|
const maxDateParsed = computed(() => parseDate(props.maxDate))
|
||||||
|
|
||||||
|
const show = ref(false)
|
||||||
|
const years = ref([])
|
||||||
|
const months = ref([])
|
||||||
|
const days = ref([])
|
||||||
|
const hours = ref([])
|
||||||
|
const pickerIndex = ref([0, 0, 0, 0])
|
||||||
|
const tempPickerValue = ref({
|
||||||
|
year: 0,
|
||||||
|
month: 0,
|
||||||
|
day: 0,
|
||||||
|
hour: 0
|
||||||
|
})
|
||||||
|
|
||||||
|
const generateYears = () => {
|
||||||
|
const minYear = minDateParsed.value.year
|
||||||
|
const maxYear = maxDateParsed.value.year
|
||||||
|
return Array.from({ length: maxYear - minYear + 1 }, (_, i) => minYear + i)
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateMonths = year => {
|
||||||
|
let monthsList = []
|
||||||
|
const minMonth = year === minDateParsed.value.year ? minDateParsed.value.month : 1
|
||||||
|
const maxMonth = year === maxDateParsed.value.year ? maxDateParsed.value.month : 12
|
||||||
|
|
||||||
|
for (let month = minMonth; month <= maxMonth; month++) {
|
||||||
|
monthsList.push(month)
|
||||||
|
}
|
||||||
|
months.value = monthsList
|
||||||
|
return monthsList
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateDays = (year, month) => {
|
||||||
|
const daysInMonth = new Date(year, month, 0).getDate()
|
||||||
|
let minDay = 1
|
||||||
|
let maxDay = daysInMonth
|
||||||
|
|
||||||
|
if (year === minDateParsed.value.year && month === minDateParsed.value.month) {
|
||||||
|
minDay = minDateParsed.value.day
|
||||||
|
}
|
||||||
|
|
||||||
|
if (year === maxDateParsed.value.year && month === maxDateParsed.value.month) {
|
||||||
|
maxDay = maxDateParsed.value.day
|
||||||
|
}
|
||||||
|
|
||||||
|
maxDay = Math.min(maxDay, daysInMonth)
|
||||||
|
|
||||||
|
if (minDay > maxDay) {
|
||||||
|
days.value = [1]
|
||||||
|
return [1]
|
||||||
|
}
|
||||||
|
|
||||||
|
const daysList = Array.from({ length: maxDay - minDay + 1 }, (_, i) => minDay + i)
|
||||||
|
days.value = daysList
|
||||||
|
return daysList
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateHours = (year, month, day) => {
|
||||||
|
let startHour = 0
|
||||||
|
let endHour = 24
|
||||||
|
|
||||||
|
if (
|
||||||
|
year === minDateParsed.value.year &&
|
||||||
|
month === minDateParsed.value.month &&
|
||||||
|
day === minDateParsed.value.day
|
||||||
|
) {
|
||||||
|
startHour = minDateParsed.value.hour
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
year === maxDateParsed.value.year &&
|
||||||
|
month === maxDateParsed.value.month &&
|
||||||
|
day === maxDateParsed.value.day
|
||||||
|
) {
|
||||||
|
endHour = maxDateParsed.value.hour
|
||||||
|
}
|
||||||
|
|
||||||
|
const hoursList = Array.from({ length: endHour - startHour + 1 }, (_, i) => startHour + i)
|
||||||
|
hours.value = hoursList
|
||||||
|
return hoursList
|
||||||
|
}
|
||||||
|
|
||||||
|
const onPickerChange = event => {
|
||||||
|
const [yearIndex, monthIndex, dayIndex, hourIndex] = event.detail.value
|
||||||
|
const selectedYear = years.value[yearIndex]
|
||||||
|
|
||||||
|
const updatedMonths = updateMonths(selectedYear)
|
||||||
|
let selectedMonth = updatedMonths[Math.max(0, Math.min(monthIndex, updatedMonths.length - 1))]
|
||||||
|
if (selectedYear === minDateParsed.value.year) {
|
||||||
|
selectedMonth = Math.max(selectedMonth, minDateParsed.value.month)
|
||||||
|
}
|
||||||
|
|
||||||
|
const updatedDays = updateDays(selectedYear, selectedMonth)
|
||||||
|
let selectedDay = updatedDays[Math.max(0, Math.min(dayIndex, updatedDays.length - 1))]
|
||||||
|
if (selectedYear === minDateParsed.value.year && selectedMonth === minDateParsed.value.month) {
|
||||||
|
selectedDay = Math.max(selectedDay, minDateParsed.value.day)
|
||||||
|
}
|
||||||
|
|
||||||
|
const updatedHours = updateHours(selectedYear, selectedMonth, selectedDay)
|
||||||
|
let selectedHour = updatedHours[Math.max(0, Math.min(hourIndex, updatedHours.length - 1))]
|
||||||
|
if (
|
||||||
|
selectedYear === minDateParsed.value.year &&
|
||||||
|
selectedMonth === minDateParsed.value.month &&
|
||||||
|
selectedDay === minDateParsed.value.day
|
||||||
|
) {
|
||||||
|
selectedHour = Math.max(selectedHour, minDateParsed.value.hour)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(1111, selectedYear, selectedMonth, selectedDay, selectedHour)
|
||||||
|
console.log(
|
||||||
|
1111,
|
||||||
|
yearIndex,
|
||||||
|
updatedMonths.indexOf(selectedMonth),
|
||||||
|
updatedDays.indexOf(selectedDay),
|
||||||
|
updatedHours.indexOf(selectedHour)
|
||||||
|
)
|
||||||
|
|
||||||
|
tempPickerValue.value = {
|
||||||
|
year: selectedYear,
|
||||||
|
month: selectedMonth,
|
||||||
|
day: selectedDay,
|
||||||
|
hour: selectedHour
|
||||||
|
}
|
||||||
|
|
||||||
|
pickerIndex.value = [
|
||||||
|
yearIndex,
|
||||||
|
updatedMonths.indexOf(selectedMonth),
|
||||||
|
updatedDays.indexOf(selectedDay),
|
||||||
|
updatedHours.indexOf(selectedHour)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const initPickerData = timestamp => {
|
||||||
|
if (!timestamp) {
|
||||||
|
timestamp = props.minDate
|
||||||
|
}
|
||||||
|
|
||||||
|
const date = new Date(timestamp)
|
||||||
|
let year = date.getFullYear()
|
||||||
|
let month = date.getMonth() + 1
|
||||||
|
let day = date.getDate()
|
||||||
|
let hour = date.getHours()
|
||||||
|
|
||||||
|
if (hour === 24) {
|
||||||
|
hour = 0
|
||||||
|
const nextDay = new Date(date)
|
||||||
|
nextDay.setDate(date.getDate() + 1)
|
||||||
|
year = nextDay.getFullYear()
|
||||||
|
month = nextDay.getMonth() + 1
|
||||||
|
day = nextDay.getDate()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (year === minDateParsed.value.year) {
|
||||||
|
month = Math.max(month, minDateParsed.value.month)
|
||||||
|
if (month === minDateParsed.value.month) {
|
||||||
|
day = Math.max(day, minDateParsed.value.day)
|
||||||
|
if (day === minDateParsed.value.day) {
|
||||||
|
hour = Math.max(hour, minDateParsed.value.hour)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
years.value = generateYears()
|
||||||
|
const updatedMonths = updateMonths(year)
|
||||||
|
const updatedDays = updateDays(year, month)
|
||||||
|
const updatedHours = updateHours(year, month, day)
|
||||||
|
|
||||||
|
tempPickerValue.value = {
|
||||||
|
year,
|
||||||
|
month,
|
||||||
|
day,
|
||||||
|
hour
|
||||||
|
}
|
||||||
|
|
||||||
|
pickerIndex.value = [
|
||||||
|
years.value.indexOf(year),
|
||||||
|
updatedMonths.indexOf(month),
|
||||||
|
updatedDays.indexOf(day),
|
||||||
|
updatedHours.indexOf(hour)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(() => props.value, initPickerData, { immediate: true })
|
||||||
|
|
||||||
|
const confirmSelection = () => {
|
||||||
|
const { year, month, day, hour } = tempPickerValue.value
|
||||||
|
|
||||||
|
const selectedDate = new Date(year, month - 1, day, hour, 0, 0, 0)
|
||||||
|
emit('changeTime', selectedDate.getTime())
|
||||||
|
show.value = false
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -40,14 +40,14 @@
|
|||||||
@change-input="changeTemporaryInput"
|
@change-input="changeTemporaryInput"
|
||||||
></LockInput>
|
></LockInput>
|
||||||
<view style="margin-top: 20rpx">
|
<view style="margin-top: 20rpx">
|
||||||
<LockDatetimePicker
|
<LockDateHourPicker
|
||||||
title="失效时间"
|
title="失效时间"
|
||||||
:value="temporaryTime"
|
:value="temporaryTime"
|
||||||
:minDate="minDate"
|
:minDate="minDate"
|
||||||
:maxDate="maxDate"
|
:maxDate="maxDate"
|
||||||
type="datehour"
|
type="datehour"
|
||||||
@change-time="changeTemporaryTime"
|
@change-time="changeTemporaryTime"
|
||||||
></LockDatetimePicker>
|
></LockDateHourPicker>
|
||||||
</view>
|
</view>
|
||||||
<view class="text">{{ text }}</view>
|
<view class="text">{{ text }}</view>
|
||||||
<view class="button" @click="createPassword('temporary')">获取密码</view>
|
<view class="button" @click="createPassword('temporary')">获取密码</view>
|
||||||
@ -60,7 +60,7 @@
|
|||||||
import { mapActions, mapState } from 'pinia'
|
import { mapActions, mapState } from 'pinia'
|
||||||
import { useBasicStore } from '@/stores/basic'
|
import { useBasicStore } from '@/stores/basic'
|
||||||
import LockInput from '@/components/LockInput/LockInput.vue'
|
import LockInput from '@/components/LockInput/LockInput.vue'
|
||||||
import LockDatetimePicker from '@/components/LockDatetimePicker/LockDatetimePicker.vue'
|
import LockDateHourPicker from '@/components/LockDateHourPicker/LockDateHourPicker.vue'
|
||||||
import { createPsaawordRequest } from '@/api/keyboardPwd'
|
import { createPsaawordRequest } from '@/api/keyboardPwd'
|
||||||
import { useBluetoothStore } from '@/stores/bluetooth'
|
import { useBluetoothStore } from '@/stores/bluetooth'
|
||||||
import { useLockStore } from '@/stores/lock'
|
import { useLockStore } from '@/stores/lock'
|
||||||
@ -68,7 +68,7 @@
|
|||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
LockInput,
|
LockInput,
|
||||||
LockDatetimePicker
|
LockDateHourPicker
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -97,17 +97,16 @@
|
|||||||
},
|
},
|
||||||
async onLoad() {
|
async onLoad() {
|
||||||
this.deviceInfo = await this.getDeviceInfo()
|
this.deviceInfo = await this.getDeviceInfo()
|
||||||
this.temporaryTime = this.setTime()
|
this.temporaryTime = Number(this.getNextFullHour())
|
||||||
this.minDate = Number(this.getNextFullHour())
|
this.minDate = Number(this.getNextFullHour())
|
||||||
this.maxDate = Number(this.getFutureTimestamp())
|
this.maxDate = Number(this.getFutureTimestamp())
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions(useBasicStore, ['getDeviceInfo', 'backAndToast', 'getNetworkType']),
|
...mapActions(useBasicStore, ['getDeviceInfo', 'backAndToast', 'getNetworkType']),
|
||||||
...mapActions(useLockStore, ['getPasswordList', 'updatePasswordSearch']),
|
...mapActions(useLockStore, ['getPasswordList', 'updatePasswordSearch']),
|
||||||
// 获取下一个整点时间
|
|
||||||
getNextFullHour() {
|
getNextFullHour() {
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
const currentHour = now.getHours()
|
const currentHour = now.getHours() + 1
|
||||||
now.setHours(currentHour)
|
now.setHours(currentHour)
|
||||||
now.setMinutes(0)
|
now.setMinutes(0)
|
||||||
now.setSeconds(0)
|
now.setSeconds(0)
|
||||||
@ -126,12 +125,6 @@
|
|||||||
|
|
||||||
return futureDate.getTime()
|
return futureDate.getTime()
|
||||||
},
|
},
|
||||||
setTime() {
|
|
||||||
const now = new Date()
|
|
||||||
now.setMinutes(0, 0, 0)
|
|
||||||
|
|
||||||
return now.getTime()
|
|
||||||
},
|
|
||||||
async createPassword(type) {
|
async createPassword(type) {
|
||||||
const that = this
|
const that = this
|
||||||
if (
|
if (
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user