当前位置:首页 > VUE

vue实现点击签到功能

2026-02-24 03:18:00VUE

实现点击签到功能

在Vue中实现点击签到功能,通常需要结合前端交互和后端数据存储。以下是一个完整的实现方案:

前端实现

创建签到按钮组件:

<template>
  <button 
    @click="handleSignIn" 
    :disabled="isSigned"
    :class="{ 'signed': isSigned }"
  >
    {{ isSigned ? '已签到' : '点击签到' }}
  </button>
</template>

<script>
export default {
  data() {
    return {
      isSigned: false
    }
  },
  methods: {
    async handleSignIn() {
      try {
        // 调用API接口
        const response = await this.$axios.post('/api/signin')
        if (response.data.success) {
          this.isSigned = true
          this.$message.success('签到成功')
        }
      } catch (error) {
        console.error('签到失败:', error)
        this.$message.error('签到失败')
      }
    }
  },
  created() {
    // 检查是否已签到
    this.checkSignStatus()
  },
  methods: {
    async checkSignStatus() {
      const response = await this.$axios.get('/api/checkSign')
      this.isSigned = response.data.signed
    }
  }
}
</script>

<style scoped>
button {
  padding: 8px 16px;
  background-color: #4CAF50;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

button.signed {
  background-color: #9E9E9E;
  cursor: not-allowed;
}
</style>

后端API接口示例

Node.js Express实现:

vue实现点击签到功能

// 签到接口
router.post('/signin', async (req, res) => {
  try {
    const userId = req.user.id // 假设已认证
    const today = new Date().toISOString().split('T')[0]

    // 检查是否已签到
    const existingSign = await SignModel.findOne({
      userId,
      date: today
    })

    if (existingSign) {
      return res.json({ success: false, message: '今日已签到' })
    }

    // 创建签到记录
    await SignModel.create({
      userId,
      date: today,
      points: 10 // 签到积分
    })

    res.json({ success: true })
  } catch (error) {
    console.error(error)
    res.status(500).json({ success: false })
  }
})

// 检查签到状态接口
router.get('/checkSign', async (req, res) => {
  const userId = req.user.id
  const today = new Date().toISOString().split('T')[0]

  const existingSign = await SignModel.findOne({
    userId,
    date: today
  })

  res.json({ signed: !!existingSign })
})

数据库模型

MongoDB示例:

const mongoose = require('mongoose')

const signSchema = new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: 'User'
  },
  date: {
    type: String,
    required: true
  },
  points: {
    type: Number,
    default: 10
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
})

module.exports = mongoose.model('Sign', signSchema)

功能扩展

连续签到奖励

vue实现点击签到功能

实现连续签到逻辑:

// 在签到接口中添加连续签到计算
const lastSign = await SignModel.findOne({
  userId,
  date: { $lt: today }
}).sort({ date: -1 })

let consecutiveDays = 1
if (lastSign) {
  const lastDate = new Date(lastSign.date)
  const yesterday = new Date()
  yesterday.setDate(yesterday.getDate() - 1)

  if (lastDate.toISOString().split('T')[0] === yesterday.toISOString().split('T')[0]) {
    consecutiveDays = lastSign.consecutiveDays + 1
  }
}

// 根据连续天数给予不同奖励
let points = 10
if (consecutiveDays >= 7) points = 30
else if (consecutiveDays >= 3) points = 20

await SignModel.create({
  userId,
  date: today,
  points,
  consecutiveDays
})

前端显示连续签到天数

在组件中添加:

<div v-if="isSigned">
  您已连续签到 {{ consecutiveDays }} 天
</div>
data() {
  return {
    consecutiveDays: 0
  }
},

methods: {
  async checkSignStatus() {
    const response = await this.$axios.get('/api/checkSign')
    this.isSigned = response.data.signed
    this.consecutiveDays = response.data.consecutiveDays
  }
}

注意事项

  1. 确保用户认证正确,防止伪造签到
  2. 考虑时区问题,使用服务器时间而非客户端时间
  3. 对于高并发场景,使用数据库事务防止重复签到
  4. 前端应做好防重复提交处理
  5. 考虑添加签到日历展示功能,提升用户体验

通过以上实现,可以完成一个完整的Vue签到功能,包含基础签到、连续签到奖励等常见功能。

标签: 功能vue
分享给朋友:

相关文章

vue底层实现

vue底层实现

Vue.js 的底层实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其关键实现细节: 响应式系统 Vue 2…

vue实现datalist

vue实现datalist

使用 Vue 实现 HTML5 的 datalist 功能 HTML5 的 <datalist> 元素提供了一种自动完成输入框的功能,允许用户在输入时从预定义的选项列表中选择。以下是几种在…

vue实现select

vue实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML select 元素 原生 HTML 的 <sel…

vue实现列表

vue实现列表

Vue 实现列表的方法 在 Vue 中实现列表渲染通常使用 v-for 指令,可以动态生成多个元素。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 遍历数组,生成列表项。v-for 需要…

vue实现抽屉

vue实现抽屉

Vue 实现抽屉组件 抽屉组件是一种常见的 UI 模式,通常用于从屏幕边缘滑出内容。以下是几种实现抽屉的方法: 使用 Vue 原生实现 创建一个基本的抽屉组件,利用 Vue 的过渡和条件渲染功能。…

vue 实现协同

vue 实现协同

Vue 实现协同编辑的方案 协同编辑指多个用户同时编辑同一文档并实时同步更改。Vue 结合相关库和技术可轻松实现该功能。 使用 WebSocket 实现实时通信 WebSocket 提供全双工通信,…