当前位置:首页 > VUE

vue实现打卡提醒

2026-01-18 19:03:04VUE

实现思路

使用Vue开发打卡提醒功能,主要涉及前端界面交互、本地存储或后端数据同步、定时提醒逻辑。以下是具体实现方法:

界面设计

创建打卡按钮和状态显示组件,使用Vue的响应式数据绑定功能。示例代码:

<template>
  <div>
    <button @click="handleCheckIn" :disabled="isCheckedIn">打卡</button>
    <p v-if="isCheckedIn">今日已打卡</p>
    <p v-else>今日未打卡</p>
  </div>
</template>

数据存储

采用浏览器本地存储保存打卡记录,适合纯前端实现:

data() {
  return {
    isCheckedIn: localStorage.getItem('checkedIn') === 'true'
  }
},
methods: {
  handleCheckIn() {
    localStorage.setItem('checkedIn', 'true')
    this.isCheckedIn = true
  }
}

定时提醒

利用浏览器的Notification API实现系统通知,需要先请求用户授权:

methods: {
  requestNotificationPermission() {
    Notification.requestPermission().then(permission => {
      if (permission === 'granted') {
        this.setReminder()
      }
    })
  },
  setReminder() {
    const now = new Date()
    const targetTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 18, 0) // 下午6点提醒

    if (now < targetTime && !this.isCheckedIn) {
      setTimeout(() => {
        new Notification('打卡提醒', { body: '记得完成今日打卡!' })
      }, targetTime - now)
    }
  }
},
mounted() {
  this.requestNotificationPermission()
}

每日重置

添加逻辑在次日自动重置打卡状态:

methods: {
  checkDateChange() {
    const lastCheckDate = localStorage.getItem('lastCheckDate')
    const today = new Date().toDateString()

    if (lastCheckDate !== today) {
      localStorage.setItem('checkedIn', 'false')
      localStorage.setItem('lastCheckDate', today)
      this.isCheckedIn = false
    }
  }
},
mounted() {
  this.checkDateChange()
}

完整示例

结合上述功能的完整组件示例:

vue实现打卡提醒

<template>
  <div>
    <button @click="handleCheckIn" :disabled="isCheckedIn">打卡</button>
    <p v-if="isCheckedIn">今日已打卡</p>
    <p v-else>今日未打卡</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isCheckedIn: localStorage.getItem('checkedIn') === 'true'
    }
  },
  methods: {
    handleCheckIn() {
      localStorage.setItem('checkedIn', 'true')
      localStorage.setItem('lastCheckDate', new Date().toDateString())
      this.isCheckedIn = true
    },
    requestNotificationPermission() {
      Notification.requestPermission().then(permission => {
        if (permission === 'granted') {
          this.setReminder()
        }
      })
    },
    setReminder() {
      const now = new Date()
      const targetTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 18, 0)

      if (now < targetTime && !this.isCheckedIn) {
        setTimeout(() => {
          new Notification('打卡提醒', { body: '记得完成今日打卡!' })
        }, targetTime - now)
      }
    },
    checkDateChange() {
      const lastCheckDate = localStorage.getItem('lastCheckDate')
      const today = new Date().toDateString()

      if (lastCheckDate !== today) {
        localStorage.setItem('checkedIn', 'false')
        localStorage.setItem('lastCheckDate', today)
        this.isCheckedIn = false
      }
    }
  },
  mounted() {
    this.checkDateChange()
    this.requestNotificationPermission()
  }
}
</script>

进阶优化

  1. 添加后端API集成,使用axios发送打卡数据到服务器
  2. 实现历史打卡记录查看功能
  3. 添加多设备同步支持
  4. 使用Vuex管理全局打卡状态
  5. 添加打卡统计图表展示

以上实现可根据实际需求进行调整和扩展。

标签: vue
分享给朋友:

相关文章

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-containe…

vue插槽实现

vue插槽实现

插槽的基本概念 Vue插槽(Slot)是一种内容分发机制,允许父组件向子组件传递模板片段,子组件通过<slot>标签定义接收位置。插槽的核心作用是增强组件的灵活性和复用性。 默认插槽 子…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue实现tap

vue实现tap

Vue 实现 Tap 事件 在移动端开发中,Tap 事件比 Click 事件更常用,因为 Click 事件有 300ms 延迟。以下是几种在 Vue 中实现 Tap 事件的方法。 使用第三方库 安装…

vue搜索实现

vue搜索实现

Vue 搜索功能实现方法 基于计算属性的搜索 在 Vue 中可以通过计算属性实现简单的搜索功能。这种方式适合小型数据集,利用 JavaScript 的 filter 方法进行筛选。 data() {…

vue 实现loading

vue 实现loading

Vue 实现 Loading 的方法 使用 v-if 和 v-show 控制显示 在 Vue 中可以通过 v-if 或 v-show 控制 loading 组件的显示与隐藏。v-if 会动态创建或销毁…