vue + ts 工作日设置功能实现

  • 功能介绍:
    • 点击选中添加当天为工作日
    • 再次点击取消当日为工作日
    • 工作日颜色为选中状态,以橘黄色背景白色字体显示
    • 鼠标点击当前颜色为红色,表示当前选中。
  • 相关技术:
    • 使用TS语法,vue框架。需要简单了解vue单页面结构及语法,以及typescript的vue语法,以及基本的typescript语法。
    • SASS样式语法,需要了解基本的sass语法
    • Js语法

  废话不多说直接上代码:(通过代码可以更快速了解)

  

<template>
	<div class="workday clear">
		<!-- 选择年份区 -->
		<div class="select-year ml-10">
			<el-select v-model="currectYear" placeholder="请选择年份" size="small">
				<el-option
					v-for="item, index in yearDict"
					:key="index"
					:label="item"
					:value="item">
				</el-option>
			</el-select>
			<el-button size="small" type="primary" class="ml-10" @click="searchYearDeatil">查 询</el-button>
			<el-button size="small" type="warning" class="ml-10" @click="currectYear=yearDict[0]">重 置</el-button>
		</div>
		<!-- 日历展示区 -->
		<div class="year-wrap fl mt-10">
			<div class="month-wrap" v-for="(yItem, yIndex) in workDayListData" :key="yIndex">
				{{yIndex+1}}
				<ul class="week-ul clear">
					<li>一</li>
					<li>二</li>
					<li>三</li>
					<li>四</li>
					<li>五</li>
					<li>六</li>
					<li>日</li>
				</ul>
				<ul class="day-ul clear">
					<li v-for="(item, index) in firstDayWeek(yItem)"></li>
					<li v-for="(mItem, mIndex) in yItem" :key="mItem.id" :class="{'work-day': mItem.workDayFlag==1, 'half-work': mItem.workDayFlag==3, 'active-day': active==mItem.id}" @click="setWorkday(yIndex,mIndex,mItem)">
						<span>{{mIndex+1}}</span>
					</li>
				</ul>
			</div>
		</div>
	</div>
</template>

<script lang="ts">
    import {Component, Watch, Vue} from "vue-property-decorator"
    import {workDayList, setWork, getYearList} from "@/api/workday/api"; //保存前后端交互api

    @Component({components: {},})
    export default class Workday extends Vue {
	currectYear: String = '';
	templateData: string = ''; //临时保存当日状态,用于修改工作日状态失败时恢复之前状态
	templateDayDetails: Object = {}; //临时保存当天详细信息
	private workDayListData: any = [];
	private yearDict: Array<any> = [];
	private active: any = '';
				
				
	//计算每个月第一天从周几开始排列
	get firstDayWeek() :Number {
		return (month) => {
			if(month) {
				let firstKey = month[0].dayOfWeek;
				return (firstKey-1)
			}else {
				console.log(new Error('数据格式错误或者数据请求失败'));
				return 0;
			}
		}
	}
				
	created() {
		getYearList().then(res => { //请求后台获取所有的年份
			this.yearDict = res.data;
			this.currectYear = this.yearDict[0];
			this.searchYearDeatil(); //获取当前年的详细月、工作日
		}).catch(rej => {
			this.$message.error(rej)
		})
	}
	
        //请求当前年的详细月、工作日内容
	searchYearDeatil() :void {
		workDayList({"year": this.currectYear}).then(res => {
			this.workDayListData = res.data;
		}).catch(rej => {
			console.log(rej);
		});
	}
				
	//设置或者取消工作日
	setWorkday(mon, day, dayDetail) :void {
		this.active = dayDetail.id;
	        this.templateDayDetails = dayDetail;
		this.templateData = dayDetail.workDayFlag;
		if(dayDetail.workDayFlag == 0 || dayDetail.workDayFlag == 3) { //状态0:非工作日;1:工作日;3:半工作日(这里没有添加半工作日设置,只有展示)
			dayDetail.workDayFlag = 1;
		}else if(dayDetail.workDayFlag == 1) {
			dayDetail.workDayFlag = 0;
		}
		let data = {ifWorkDay: dayDetail.workDayFlag, id: dayDetail.id};
		this.setRemoteWorkday(data, dayDetail);
	}
	//保存到后端
	setRemoteWorkday(data, dayDetail) :void {
		setWork(data).then(res => {
			if(res.data){
				return;
			}
		this.$message.error('操作失败');
		dayDetail.workDayFlag = this.templateData;
		}).catch(rej => {
			console.log(new Error(rej));
			this.$message.error('操作失败');
			dayDetail.workDayFlag = this.templateData;
		})
	}
				
    }
</script>

<style scoped lang="scss" scoped="scoped">
	.ml-10{
		margin-left: 10px;
	}
	.mt-10{
		margin-top: 10px;
	}
	.year-wrap{
		 1020px;
		overflow: hidden;
		li{
			list-style: none;
			float: left;
			 30px;
			height: 30px; 
			text-align: center;
			line-height: 30px;
			font-size: 12px;
			user-select: none;
		}
	}
	.workday{
		 1580px;
		overflow: auto;
	}
	.work-day,.half-work{
		border-radius: 50%;
		// border: 1px solid #ccc;
		color: #fff;
	}
	.work-day{
		background-color: rgb(240,148,68);
	}
	.half-work{
		background-color: rgb(85, 197, 175);
	}
	.fl{
		float:left;
	}
	.clear{
		overflow: hidden;
	}
	.day{
		 20px;
		height: 20px;
	}
	li.active-day{
		font-size: 14px;
		color: red;
		font-weight: bold;
	}
	.month-wrap{
		 210px;
		height: 230px;
		padding: 10px;
		margin:10px;
		border-radius: 6px;
		float:left;
		box-shadow: 0 0 10px #b6b6b6;
	}
	.current-day{
		color: red;
		font-weight: bold;
	}
	.day-ul{
		li{
			&:hover span{
				font-weight: bold;
				text-shadow: 1px 1px 1px #C0CCDA;
			};
			&:active span{
				color: mix(#acd2ff, #ffce78, 0.5)
			}
			span{
				cursor: pointer;
			} 
		}
	}
	
</style>

  

原文地址:https://www.cnblogs.com/xuchao-blogs/p/14213253.html