vue实现日历签到效果

在工作任务进行时,有一个签到日历的功能需求要实现,经过文档查询和样式优化实现了需求,在此记录一下。

技术背景:vue2+vant(样式控件)+ less + 一个公共样式文件

html实现部分:

 
<div class="calenderBox re_margin_top_16 re_sizing"><!-- 切换月份 -->   <div class="re_width100 re_flex_between"><div class="left"><van-icon @click="dateOperate('down')" class="icon" name="arrow-left" size="16" /></div><div class="re_font_14">{{ date[0] }}年{{ date[1] }}月</div><div class="right"><van-icon @click="dateOperate('up')" class="icon" name="arrow" size="16" /></div></div><!-- 日期列表 --><div class="date-list re_width100 re_margin_top_16"><div class="date-content"><!-- 日历头 --><div class="re_font_10 re_color_light re_flex_center" v-for="item in header" :key="item">{{ item }}</div><!-- 日列表 --><div class="re_margin_top_8 showday re_text_c re_sizing " v-for="(s, k) in dayList" :key="s + '-' + k"><template v-if="s.month == date[1]"><div v-if="s.signInStatus == 1" class="re_flex_center everyDay"><img class="star" src="../../../assets/task/gray.png" alt=""></div><!-- 补签 --><div @click="signIn(s, 2)" class="bu" v-else-if="s.signInStatus == 4"><img class="bu" src="../../../assets/task/no.png" alt=""></div><!--  --><div class="bu" v-else-if="s.signInStatus == 2"><img class="bu"  src="../../../assets/task/checkIn.png" alt=""></div><!-- 签到 --><div @click="signIn(s, 1)" v-else-if="s.signInStatus == 0 && getDayText(s) == '今天'" class="bu re_sizing jintian re_sizing"><img class="star" src="../../../assets/task/star.png" alt=""><span class="re_color_calendar_color">+{{ s.getMoney }}</span></div><div v-else-if="s.signInStatus == 0 && getDayText(s) != '今天'" class="bu future re_sizing"><img class="star" src="../../../assets/task/star.png" alt=""><span class="color_redlight re_font_14">+{{ s.getMoney }}</span></div><div v-else class="re_flex_center everyDay"><img class="star" src="../../../assets/task/gray.png" alt=""></div><span :class="['re_font_10',s.month !== date[1] ? 'other-day' : '',s.day === date[2] && s.month === date[1] ? getDayText(s) === '今天' ? 're_color_calendar_color' : 'today' : '',]">{{ getDayText(s) }}</span></template></div></div></div>
</div>

js实现部分

export default {name: "calendar",data() {return {// 日历头header: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],// 选择日期date: [],// 天列表dayList: [],// 定时器timer: null,// 第一天是周几weeks: 0,userInfo: {},setInfo: {},successTitle:'签到成功',handleSignInfo:{}};},created() { },mounted() {let time = new Date();this.date.push(time.getFullYear(),this.formatTime(time.getMonth() + 1),this.formatTime(time.getDate()));this.countDay();this.getSignInCalendar();this.getInfo();},methods: {getInfo(){getSetInfo().then(res => {this.setInfo = res.data;})},goBack(){this.$router.go(-1);},// beforeSignInbeforeSignIn(){extraSignIn({signInDay: this.setInfo.signInDay}).then(res => {if(res.code == 1){this.successVisible = true;this.successTitle = '补签成功';this.handleSignInfo = res.data;this.getSignInCalendar();setTimeout(() => {this.successVisible = false;}, 5000);this.coinsVisible = false}if (res.code == 500) {showDialog({ title: '提示', message: res.msg });}})},// 签到signIn(s, type){if(type == 2){this.coinsVisible = truethis.setInfo.signInDay = s.signInDayreturn}addSignIn({signInDay: s.signInDay}).then(res => {if(res.code == 1){this.successVisible = true;this.successTitle = '签到成功';this.handleSignInfo = res.data;this.getSignInCalendar();setTimeout(() => {this.successVisible = false;}, 5000);}if (res.code == 500) {showDialog({ title: '提示', message: res.msg });}})},getSignInCalendar(){signInCalendar({signInDay: this.date.join('-')}).then(res => {this.dayList.forEach(item => {res.data.forEach(item2 => {if(item.signInDay === item2.signInDay){item.getMoney = item2.getMoney;item.signInStatus = item2.signInStatus;}})})})getSignInInfo().then(res => {this.userInfo = res.data;})},formatTime(time) {return time < 10 ? `0${time}` : time;},// 计算显示的天数据countDay() {let [y, m, d] = this.date;// 获取第一天是周几let week = new Date(`${y}/${m}/1`).getDay(),// 获取当前月的上个月多少天lastDays = this.getDays(y, m - 1),// 获取这个月有多少天days = this.getDays(y, m);// 计算这个月有多少周this.weeks = Math.ceil((days - (7 - week)) / 7) + 1;// 将当前月份的天数生成数组this.dayList = Array.from({ length: this.getDays(y, m) }, (v, k) => {return {day: this.formatTime(k + 1),month: m,year: y,signInDay: `${y}-${m}-${this.formatTime(k + 1)}`};});// 将本月1日前的数据补齐for (let i = lastDays; i > lastDays - week; i--) {this.dayList.unshift({day: i,// 如果当前日期是1月补齐的是去年12月的数据month: +m - 1 === 0 ? 12 : this.formatTime(+m - 1),year: +m - 1 === 0 ? y - 1 : y,});}// 计算需要补齐多少天let length = this.weeks * 7 - this.dayList.length;// 将本月最后一天的数据补齐for (let i = 1; i <= length; i++) {this.dayList.push({day: i,// 如果当前日期是12月补齐的是明年年1月的数据month: +m + 1 > 12 ? 1 : this.formatTime(+m + 1),year: +m + 1 > 12 ? y + 1 : y,});}},// 校验选择的月份和已选择的日期是否匹配checkDay() {// 获取选择的年月有多少天 防止这年不是闰年 就将日期跳转到28号,或者有的月份没有31号就跳到30号let num = this.getDays(this.date[0], this.date[1]);if (num < this.date[2]) {this.date.splice(2, 1, num);}},// 获取某个月有多少天getDays(year, month) {// 一年中每个月的天数let days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];// 判断是不是闰年 2月29天if (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) {days[1] = 29;}return days[month - 1];},//左右按钮点击事件dateOperate(type) {let [y, m, d] = this.date;// 如果是向后翻if (type === "up") {// 日期向后翻 切换月份if (+m === 12) {this.date.splice(0, 1, y + 1);this.date.splice(1, 1, "01");} else {this.date.splice(1, 1, this.formatTime(+m + 1));}// 如果是前后翻} else {if (+m === 1) {this.date.splice(0, 1, y - 1);this.date.splice(1, 1, 12);} else {this.date.splice(1, 1, this.formatTime(+m - 1));}}this.countDay();this.checkDay();this.getSignInCalendar()},// 取消事件cancel() {this.$emit("cancel");},// 获取日期显示文本getDayText(dateObj) {const today = new Date();const todayYear = today.getFullYear();const todayMonth = this.formatTime(today.getMonth() + 1);const todayDay = this.formatTime(today.getDate());// 检查是否是今天if (dateObj.year == todayYear && dateObj.month == todayMonth && dateObj.day == todayDay) {return "今天";}// 检查是否是明天const tomorrow = new Date(today);tomorrow.setDate(today.getDate() + 1);const tomorrowYear = tomorrow.getFullYear();const tomorrowMonth = this.formatTime(tomorrow.getMonth() + 1);const tomorrowDay = this.formatTime(tomorrow.getDate());if (dateObj.year == tomorrowYear && dateObj.month == tomorrowMonth && dateObj.day == tomorrowDay) {return "明天";}// 其他日期显示月.日格式return `${dateObj.month}.${dateObj.day}`;},}
}

css实现部分:

<style lang="less" scoped>.calendar {width: 100%;min-height: 100vh;background: url('../../../assets/task/calenderBg.png') no-repeat center top;background-size: 100% 812px;padding: 0 16px 16px;background-color: #ffe9e9;.title {padding: 30px 0 18px 0;width: 100%;font-weight: 600;.icon {position: absolute;left: 0px;top: 33px;}.explain {position: absolute;right: 0px;top: 34px;}}.calenderBox {width: 21.44rem;min-height: 33.25rem;background: #FFFFFF;border: 0.06rem solid #FFFFFF;border-radius: 1rem;padding: 1rem;}.date-list {padding-top: 0;display: flex;.date-content {flex: 1;height: 100%;display: grid;grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;grid-template-rows: auto;}.showday{margin: 8px auto 0;}.everyDay {width: 2.5rem;height: 3.38rem;background: #F5F7F9;border-radius: 6px;}.bu{width: 2.5rem;height: 3.38rem;}.color_redlight{color: #FF455E;}.jintian{border: 1px solid #FF455E;border-radius: 6px;padding-top: 6px;}.future{background: #F5F7F9;border-radius: 6px;padding-top: 6px;}.star{width: 18px;height: 18px;}.other-day {color: #CED1D9;}.today {color: #394365;}}}</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28973.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习使用ESP8266进行MQTT通信并在网页上可视化显示

目录 一、工具 二、 流程 三、代码实现 设置MQTT服务器地址 设置服务器和端口号 连接MQTT服务器并订阅话题 回调处理函数 发布数据到话题 四、调试软件使用 打开MQTTx 添加话题 五、网页使用 一、工具 arduino ide esp8266/32单片机 lot物联网网页 MQTTx软件或者m…

大模型应用开发学习笔记

Huggingface 下载模型&#xff1a; model_dirr"G:\python_ws_g\code\LLMProject\session_4\day02_huggingface\transformers_test\model\uer\uer\gpt2-chinese-cluecorpussmall\models--uer--gpt2-chinese-cluecorpussmall\snapshots\c2c0249d8a2731f269414cc3b22dff021…

虚拟卡 WildCard (野卡) 保姆级开卡教程

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学&#xff0c;要了解不同平台&#xff08;Grok、Talkatone 等&#xff09;的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时&#xff0c;一般都需要使…

C++实现3D(EasyX)详细教程

一、关于3D 我们看见&#xff0c;这两个三角形是相似的&#xff0c;因此计算很简单 若相对物体的方向是斜的&#xff0c;计算三角函数即可 不会的看代码 二、EasyX简介 initgraph(长,宽) 打开绘图 或initgraph(长,宽…

Qt 进度条与多线程应用、基于 Qt 的文件复制工具开发

练习1&#xff1a;Qt 进度条与多线程应用 题目描述 开发一个基于 Qt 的应用程序&#xff0c;该应用程序包含一个水平进度条&#xff08;QSlider&#xff09;&#xff0c;并且需要通过多线程来更新进度条的值。请根据以下要求完成代码&#xff1a; 界面设计&#xff1a; 使用 QS…

【算法day2】无重复字符的最长子串 两数之和

无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 https://leetcode.cn/problems/longest-substring-without-repeating-characters/ class Solution { public:int lengthOfLongestSubstring(string s) {int sub_length …

XHR请求解密:抓取动态生成数据的方法

在如今动态页面大行其道的时代&#xff0c;传统的静态页面爬虫已无法满足数据采集需求。尤其是在目标网站通过XHR&#xff08;XMLHttpRequest&#xff09;动态加载数据的情况下&#xff0c;如何精准解密XHR请求、捕获动态生成的数据成为关键技术难题。本文将深入剖析XHR请求解密…

【漫话机器学习系列】121.偏导数(Partial Derivative)

偏导数&#xff08;Partial Derivative&#xff09;详解 1. 引言 在数学分析、机器学习、物理学和工程学中&#xff0c;我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量&#xff0c;而是由多个变量共同决定的。那么&#xff0c;当其中某一个变量发生变化时&…

[C语言日寄] 字符串操作函数的使用及其拓展

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

ssm_mysql_暖心家装平台

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

地下井室可燃气体监测装置:守护地下安全,防患于未“燃”!

在城市的地下&#xff0c;隐藏着无数的燃气管道和井室&#xff0c;它们是城市基础设施建设的重要部分&#xff0c;燃气的使用&#xff0c;给大家的生活提供了极大的便利。在便利生活的背后&#xff0c;也存在潜在的城市安全隐患。 近年来&#xff0c;地下井室可燃气体泄漏事故…

EasyCVR平台赋能农业产业园:AIoT驱动的视频监控与大数据分析解决方案

随着现代农业的快速发展&#xff0c;农业产业园区的规模不断扩大&#xff0c;管理复杂度也随之增加。为了提高农业生产效率、保障农产品质量安全、实现精细化管理和智能化运营&#xff0c;视频信息化建设成为现代农业产业园的重要发展方向。EasyCVR作为一款功能强大的视频监控与…

【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成

标题&#xff1a;《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目&#xff1a;https://zju3dv.github.io/StarGen 来源&#xff1a;商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…

STM32 进阶 定时器

在stm32中定时器大概分为4类 1、系统定时器&#xff1a;属于arm内核&#xff0c;内嵌在NVIC中 2、高级定时器&#xff1a;可以用来刹车和死区 3、通用定时器&#xff1a;可以用来输出pwm方波 4、基本定时器&#xff1a;只能记数 系统定时器注意&#xff1a; 1、系统定时器…

day21-API(算法,lambda,练习)

常见的七种查找算法&#xff1a; ​ 数据结构是数据存储的方式&#xff0c;算法是数据计算的方式。所以在开发中&#xff0c;算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词&#xff0c;如果各位铁粉有疑惑&#xff0c;可以先看一下哥们后面录制的数据结构…

正则表达式梳理(基于python)

正则表达式&#xff08;regular expression&#xff09;是一种针对字符串匹配查找所定义的规则模式&#xff0c;独立于语言&#xff0c;但不同语言在实现上也会存在一些细微差别&#xff0c;下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…

Java多线程与高并发专题——为什么 Map 桶中超过 8 个才转为红黑树?

引入 JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点&#xff1a;最开始的 Map 是空的&#xff0c;因为里面没有任何元素&#xff0c;往里放元素时会计算 hash 值&#xff0c;计算之后&#xff0c;第 1 个 value 会首先占用一个桶&#xff08;也称为槽点&#xff…

Llama-Factory框架下的Meta-Llama-3-8B-Instruct模型微调

目录 引言 Llama - Factory 训练框架简介&#xff1a; Meta - Llama - 3 - 8B - Instruct 模型概述&#xff1a; Lora 方法原理及优势&#xff1a; 原理 优势 环境准备: 部署环境测试&#xff1a; 数据准备&#xff1a; 模型准备&#xff1a; 模型配置与训练&#xff1…

介绍一个能支持高带宽的EDID编辑软件

软件名称叫980 Manager 4.24.16&#xff0c;安装后的图标如下。   软件可以去此地址下载https://download.csdn.net/download/cjie221/90459603&#xff0c;下载后需解压&#xff0c;运行.msi文件安装。   安装后&#xff0c;打开软件&#xff0c;首先会弹出这个界面&…