Vue【原创】基于【日历组件Calendar】的【节假日管理】功能整合
基于日历组件(lilo-calendar)的节假日管理功能整合。
效果图:

完整代码:
1 <template>
2 <div class="root-calendar">
3 <div class="control-wrapper">
4 <div class="year-wrapper">
5 <el-button v-for="(year, index) in years" :key="index" :type="year.isCurrent ? 'primary' : ''"
6 @click="changeYear(year)">
7 {{ year.value }}年
8 </el-button>
9 </div>
10 <div class="btn-wrapper">
11 <el-button type="primary" icon="el-icon-check" @click="submit">设置节假日</el-button>
12 </div>
13 </div>
14 <div class="calendar-wrapper" :style="{ height: `${calendarHeight}px` }">
15 <div class="calendar" v-for="(calendar, index) in calendars" :key="index">
16 <lilo-calendar :default-selected-dates="calendar.selectedDates" :current-date="calendar.date" can-select
17 @date-selected="dateSelected">
18 </lilo-calendar>
19 </div>
20 </div>
21 </div>
22 </template>
23
24 <script>
25 import _ from 'lodash';
26 // import {
27 // get1year, //业务接口,获取初始化的整年节假日
28 // set1year //业务接口,设置正年的节假日
29 // } from '@/api/khxt/holidays/index.js';
30
31 export default {
32 data() {
33 return {
34 years: [],
35 currentYear: new Date().getFullYear(),
36 calendars: [],
37 calendarHeight: 0,
38 }
39 },
40 created() {
41 this.defaultSelectedDates = []
42 this.selectedDates = []
43 this.tempSelectedDates = []
44
45 this.years = this.createYears();
46 this.calendars = this.createDates(new Date().getFullYear())
47 },
48 mounted() {
49 this.calendarHeight = window.document.body.clientHeight - 150;
50 window.addEventListener('resize', () => {
51 this.calendarHeight = window.document.body.clientHeight - 150;
52 });
53
54 this.getHolidays();
55 },
56 computed: {},
57 methods: {
58 getHolidays() {
59 this.tempSelectedDates = []
60 // get1year({ year: this.currentYear }).then(res => {
61 // const data = res.data
62 // let result = []
63 // data.forEach(d => {
64 // const { date } = d
65 // result.push(date)
66 // })
67 // this.defaultSelectedDates = result
68 // });
69
70 //静态测试数据,应该从业务接口获取
71 this.defaultSelectedDates = [
72 "2023-01-01", "2023-01-02", "2023-01-07", "2023-01-08", "2023-01-14", "2023-01-15", "2023-01-21",
73 "2023-01-22", "2023-01-23", "2023-01-24", "2023-01-25", "2023-01-26", "2023-01-27", "2023-02-04",
74 "2023-02-05", "2023-02-11", "2023-02-12", "2023-02-18", "2023-02-19", "2023-02-25", "2023-02-26",
75 "2023-03-04", "2023-03-05", "2023-03-11", "2023-03-12", "2023-03-18", "2023-03-19", "2023-03-25",
76 "2023-03-26", "2023-04-01", "2023-04-02", "2023-04-05", "2023-04-08", "2023-04-09", "2023-04-15",
77 "2023-04-16", "2023-04-22", "2023-04-29", "2023-04-30", "2023-05-01", "2023-05-02", "2023-05-03",
78 "2023-05-07", "2023-05-13", "2023-05-14", "2023-05-20", "2023-05-21", "2023-05-27", "2023-05-28",
79 "2023-06-03", "2023-06-04", "2023-06-10", "2023-06-11", "2023-06-17", "2023-06-18", "2023-06-22",
80 "2023-06-23", "2023-06-24", "2023-07-01", "2023-07-02", "2023-07-08", "2023-07-09", "2023-07-15",
81 "2023-07-16", "2023-07-22", "2023-07-23", "2023-07-29", "2023-07-30", "2023-08-05", "2023-08-06",
82 "2023-08-12", "2023-08-13", "2023-08-19", "2023-08-20", "2023-08-26", "2023-08-27", "2023-09-02",
83 "2023-09-03", "2023-09-09", "2023-09-10", "2023-09-16", "2023-09-17", "2023-09-23", "2023-09-24",
84 "2023-09-29", "2023-09-30", "2023-10-01", "2023-10-02", "2023-10-03", "2023-10-04", "2023-10-05",
85 "2023-10-06", "2023-10-14", "2023-10-15", "2023-10-21", "2023-10-22", "2023-10-28", "2023-10-29",
86 "2023-11-04", "2023-11-05", "2023-11-11", "2023-11-12", "2023-11-18", "2023-11-19", "2023-11-25",
87 "2023-11-26", "2023-12-02", "2023-12-03", "2023-12-09", "2023-12-10", "2023-12-16", "2023-12-17",
88 "2023-12-23", "2023-12-24", "2023-12-30", "2023-12-31"
89 ]
90 //把整年的选中日期分配到每个月,这个数据结构的组装过程应该在服务端构建更好
91 this.calendars.forEach(calendar => {
92 calendar.selectedDates = []
93 this.defaultSelectedDates.forEach(dsd => {
94 if(dsd.indexOf(calendar.date) !== -1) {
95 calendar.selectedDates.push(dsd)
96 }
97 })
98 })
99 // console.log(this.calendars)
100 },
101 createYears() {
102 let result = []
103 const dt = new Date()
104 const curYear = dt.getFullYear()
105 for (let i = 5; i >= -1; i--) {
106 result.push({
107 value: curYear - i,
108 isCurrent: i === 0
109 })
110 }
111 return result
112 },
113 createDates(curYear) {
114 let result = []
115 for (let i = 1; i <= 12; i++) {
116 result.push({
117 date: curYear + '-' + (i < 10 ? `0${i}` : i)
118 })
119 }
120 return result
121 },
122 changeYear(year) {
123 this.years.forEach(y => {
124 y.isCurrent = false;
125 })
126 year.isCurrent = true;
127
128 this.currentYear = year.value;
129
130 this.calendars = this.createDates(year.value)
131
132 this.getHolidays();
133 },
134 dateSelected(val) {
135 //我这边服务端需要全量返回,包括默认选中的内容,你也可以根据业务自己构建返回数据
136 if (val.selectedDates) {
137 this.tempSelectedDates = this.defaultSelectedDates.concat(this.tempSelectedDates).concat(val
138 .selectedDates)
139 this.tempSelectedDates = Array.from(new Set(this.tempSelectedDates));
140 }
141 if (val.removeDate) {
142 this.tempSelectedDates.splice(this.tempSelectedDates.indexOf(val.removeDate), 1);
143 const index = this.defaultSelectedDates.indexOf(val.removeDate);
144 if (index !== -1) {
145 this.defaultSelectedDates.splice(index, 1);
146 }
147 }
148 let result = []
149 this.tempSelectedDates.forEach(sd => {
150 result.push({
151 date: sd
152 })
153 })
154 this.selectedDates = result
155 },
156 submit: _.debounce(function() {
157 this.$confirm('是否确认提交', '提示', {
158 confirmButtonText: '确定',
159 cancelButtonText: '取消',
160 type: 'warning'
161 })
162 .then(() => {
163 const param = {
164 year: this.currentYear,
165 holidays: this.selectedDates
166 }
167 // set1year(param).then(res => {
168 // this.$notify.success({
169 // title: '通知',
170 // message: res.message
171 // });
172
173 // this.getHolidays();
174 // })
175 //打印最终提交结果数据
176 console.log(param);
177 })
178 .catch(() => {
179 this.loading = false;
180 this.$message({
181 type: 'info',
182 message: '已取消'
183 });
184 });
185 }, 300),
186 }
187 };
188 </script>
189
190 <style lang="scss" scoped>
191 .root-calendar {
192 display: flex;
193 flex-direction: column;
194
195 .control-wrapper {
196 display: flex;
197 justify-content: center;
198 align-items: center;
199
200 .year-wrapper {
201 flex: 1;
202 padding: 10px;
203 }
204
205 .btn-wrapper {
206 flex: 0 0 100px;
207 padding: 10px;
208 }
209 }
210
211 .calendar-wrapper {
212 // height: calc(100vh - 150px);
213 overflow-y: auto;
214 // flex: 1;
215 display: flex;
216 flex-wrap: wrap;
217
218 .calendar {
219 flex: 0 0 33.333%;
220 padding: 10px;
221 }
222 }
223 }
224 </style>
查看lilo-calendar日历组件请移步我的另外一个帖子:https://www.cnblogs.com/loveFlex/p/17662243.html
Vue【原创】基于【日历组件Calendar】的【节假日管理】功能整合的更多相关文章
- 3- 功能2:基于forms组件和ajax实现注册功能
1.forms组件的注册页面 url from django.urls import path, re_path from blog import views from django.views.st ...
- Vue.js与 ASP.NET Core 服务端渲染功能整合
http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...
- 基于Vue的简单日历组件
日历组件 由于移动端项目中需要用到日历组件,网上找了下,没看到几个合适的,就尝试着自己写一个.然后发现也不是很复杂,目前只做了最基本的功能,大家也可以拿去做做二次开发. 如何写一个日历组件 基础效果如 ...
- Vue文件封装日历组件
封装就是要具有灵活性,样式自适应,调用的时候传入props就可以变成自己想要的样式. 效果展示网址:https://1963331542.github.io/ 源代码: <template> ...
- 基于forms组件和Ajax实现注册功能
一.基于forms组件的注册页面设计 1.运用forms组件的校验字段功能实现用户注册 views.py: (在钩子中代码解耦,将form放在cnblog/blog/Myforms.py中) f ...
- 2.1博客系统 |基于form组件和Ajax实现注册登录
基于forms组件和Ajax实现注册功能 1 基于forms组件设计注册页面 --点击头像 === 点击input --头像预览: 修改用户选中的文件对象:获取文件对象的路径:修改img的src属性, ...
- BBS-基于forms组件和ajax实现注册功能
http://www.cnblogs.com/yuanchenqi/articles/7638956.html 1.设计注册页面 views.py from django import forms c ...
- vue-calendar 基于 vue 2.0 开发的轻量,高性能日历组件
vue-calendar-component 基于 vue 2.0 开发的轻量,高性能日历组件 占用内存小,性能好,样式好看,可扩展性强 原生 js 开发,没引入第三方库 Why Github 上很多 ...
- 一个vue的日历组件
说明: 1.基于element-ui开发的vue日历组件. 地址 更新: 1.增加value-format指定返回值的格式2.增加头部插槽自定义头部 <ele-calendar > < ...
- vue初学实践之路——vue简单日历组件(1)
---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不 ...
随机推荐
- spring之AOP的概念及简单案例
AOP概念 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP ...
- 把vue组件发布到npm
一直以来项目都使用他人开发的组件,于是乎自己也想倒腾着做一个,发布到npm 在其他项目里直接使用,这个组件上传和纯js 还是有一定区别的,在这个过程中也遇到了一些小问题,网上找了许多案例,都不是太全面 ...
- JavaScript模块化 之( Commonjs、AMD、CMD、ES6 modules)演变史
经常在工作中使用define(['./modulename'],function(modulename){}),require(['modulename'],function(modulename){ ...
- LeetCode刷题,代码随想录算法训练营Day3| 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表
链表理论基础 链表是通过指针串联在一起的线性结构,每个节点由一个数据域和一个指针域构成. 链表的类型 单链表 双链表 有两个指针域,一个指向下一个节点,一个指向上一个节点,既可以向前查询也可以向后查询 ...
- 【C#/.NET】使用ASP.NET Core对象池
Nuget Microsoft.Extensions.ObjectPool 使用对象池的好处 减少初始化/资源分配,提高性能.这一条与线程池同理,有些对象的初始化或资源分配耗时长,复用这些对象减少初始 ...
- Python连接es笔记二之查询方式汇总
本文首发于公众号:Hunter后端 原文链接:Python连接es笔记二之查询方式汇总 上一节除了介绍使用 Python 连接 es,还有最简单的 query() 方法,这一节介绍一下几种其他的查询方 ...
- Galaxy Project | 生信人最值得学习的开源项目之一
我与 Galaxy Project 的渊源可以追溯到我刚毕业,还在华大实习的那一段时间,这个项目应该是我职业生涯中最重要的一段经历.虽然这么对年以来一直都关注着这个项目,但大多数都是浅尝辄止,对源码层 ...
- 让ChatGPT来写今年的高考作文,能得几分?
使用最新的ChatGPT4模型,做2023年全国甲卷的高考作文. 作文考试题目如下 人们因技术发展得以更好地掌控时间,但也有人因此成了时间的仆人.这句话引发了你怎样的联想与思考?请写一篇文章. 要求: ...
- C#.NET CORE .NET6 RSA 私钥签名 公钥验签(验证签名) ver:20230614
C#.NET CORE .NET6 RSA 私钥签名 公钥验签(验证签名) ver:20230614 环境说明: .NET CORE 版本:.NET 6 . .NET CORE 对于RSA的支持: 1 ...
- Linux系统基础知识与自学方法
Linux系统基础知识与自学方法 大部分非计算机相关的朋友也经常使用电脑,所以我们频繁接触的是Windows系统.关于这个系统的评价不一,一部分人觉得简洁快捷,一部分人觉得问题(病毒.弹窗)多多,总之 ...