概要
日历任务组件,国产项目需要使用自己开发的组件,只为展示任务人当月任务条数,是否冲突,任务时间等数据展示,就自己简单写了一个
代码
<template>
<div class="calendar-container">
<div class="schedule-head">
<div class="buton">
<button @click="minMonth">《</button>
<button @click="toToday">当月</button>
<button @click="maxMonth">》</button>
</div>
<div class="yeartitle">{{ yearModel }}年{{ monthModel }}月</div>
<ul class="rwtsxx">
<li><span>任务</span><span class="span1"></span></li>
<!-- <li><span>上午任务</span><span class="span2"></span></li>
<li><span>下午任务</span><span class="span3"></span></li> -->
<li><span>时间冲突任务</span><span class="span4"></span></li>
</ul>
</div>
<div style="width: 96%; height: auto; overflow: auto; margin: 0 2%">
<table class="bdtnone" :width="days.length * tableW + 55 + 'px'">
<thead>
<tr>
<th width="55">任务人</th>
<th
:width="tableW"
v-for="item in days"
:key="item.index"
:class="item.weekNum == '六' || item.weekNum == '日' ? 'xxr' : ''"
>
{{ item.name }} {{ item.weekNum }}<br />
<!-- <span>{{ item.name }}</span
><br />
<span>{{ item.weekNum }}</span
><br />-->
<span
style="
font-weight: normal;
font-size: 12px;
float: left;
padding-left: 3px;
"
>Am</span
><span
style="
font-weight: normal;
font-size: 12px;
float: right;
padding-right: 3px;
"
>Pm
</span>
</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in tableDate" :key="index">
<td :width="tableW">{{ item.name }}</td>
<td :colspan="days.length" style="border: none">
<table class="tablemin" :id="item.nameId">
<tr v-for="(items, index) in item.rwlist" :key="index">
<td :colspan="days.length">
<ul class="tableul">
<li
v-for="(itemss, indexs) in days"
:key="indexs"
@click="tcru(items.rwname)"
:style="{ width: tableW + 'px' }"
>
<span
:class="[
'span1',
items.maxdata == itemss.name && items.endTime < '12'
? 'span3'
: '',
items.mindata == itemss.name &&
items.startTime >= '12'
? 'span2'
: '',
items.chmindata <= itemss.name &&
items.chmaxdata >= itemss.name
? 'span4'
: '',
]"
v-if="
items.mindata <= itemss.name &&
items.maxdata >= itemss.name
"
>
</span>
</li>
<li
class="rwname"
:style="{ left: items.dataList + 'px' }"
:title="items.rwname"
>
{{ items.rwname }}
</li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
<el-dialog
:title="title"
:visible.sync="open"
width="300px"
append-to-body
>
<p>
{{ tcxx }}
</p>
<div slot="footer" class="dialog-footer">
<!-- <el-button type="primary" @click="submitForm">确 定</el-button> -->
<el-button @click="cancel">关 闭</el-button>
</div>
</el-dialog>
</div>
<!-- //表单 -->
</div>
</template>
<script>
export default {
data() {
return {
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
tc: false,
tcxx: "",
yyyy: null,
mm: null,
dd: null,
yearModel: null,
monthModel: null,
years: [],
months: [],
weekdays: ["日", "一", "二", "三", "四", "五", "六"],
days: [],
today: null, //今天
currentDay: null, // 选中天
scheduleList: [],
tableW: 55,
tableDate: [
{
name: "张三",
nameId: 12,
rwlist: [
{
rwname: "任务一",
startDate: "2022-11-09 08:00:00",
endDate: "2022-11-15 08:00:00",
startTime: "13",
endTime: "08",
},
{
rwname: "任务二",
startDate: "2022-11-01 08:00:00",
endDate: "2022-11-22 08:00:00",
startTime: "12",
endTime: "08",
},
{
rwname: "任务三",
startDate: "2022-11-05 08:00:00",
endDate: "2022-11-30 08:00:00",
startTime: "12",
endTime: "08",
},
{
rwname: "任务四",
startDate: "2022-11-02 08:00:00",
endDate: "2022-11-25 08:00:00",
startTime: "13",
endTime: "14",
},
],
},
{
name: "李四",
nameId: 13,
rwlist: [
{
rwname: "任务一",
startDate: "2022-11-05 08:00:00",
endDate: "2022-11-11 08:00:00",
startTime: "08",
endTime: "09",
},
{
rwname: "任务二",
startDate: "2022-11-07 08:00:00",
endDate: "2022-11-26 08:00:00",
startTime: "08",
endTime: "09",
},
{
rwname: "任务三",
startDate: "2022-11-01 08:00:00",
endDate: "2022-11-25 08:00:00",
startTime: "13",
endTime: "14",
},
{
rwname: "任务四",
startDate: "2022-11-03 08:00:00",
endDate: "2022-11-28 08:00:00",
startTime: "13",
endTime: "14",
},
],
},
{
name: "李四",
nameId: 13,
rwlist: [
{
rwname: "任务一",
startDate: "2022-11-05 08:00:00",
endDate: "2022-11-11 08:00:00",
startTime: "08",
endTime: "09",
},
{
rwname: "任务二",
startDate: "2022-11-07 08:00:00",
endDate: "2022-11-26 08:00:00",
startTime: "08",
endTime: "09",
},
{
rwname: "任务三",
startDate: "2022-11-01 08:00:00",
endDate: "2022-11-25 08:00:00",
startTime: "13",
endTime: "14",
},
{
rwname: "任务四",
startDate: "2022-11-03 08:00:00",
endDate: "2022-11-28 08:00:00",
startTime: "13",
endTime: "14",
},
],
},
{
name: "李四",
nameId: 13,
rwlist: [
{
rwname: "任务一",
startDate: "2022-11-05 08:00:00",
endDate: "2022-11-11 08:00:00",
startTime: "08",
endTime: "09",
},
{
rwname: "任务二",
startDate: "2022-11-07 08:00:00",
endDate: "2022-11-26 08:00:00",
startTime: "08",
endTime: "09",
},
{
rwname: "任务三",
startDate: "2022-11-01 08:00:00",
endDate: "2022-11-25 08:00:00",
startTime: "13",
endTime: "14",
},
{
rwname: "任务四",
startDate: "2022-11-03 08:00:00",
endDate: "2022-11-28 08:00:00",
startTime: "13",
endTime: "14",
},
],
},
],
};
},
mounted() {
var date = new Date();
this.yyyy = date.getFullYear();
this.mm = date.getMonth() + 1;
this.dd = date.getDate();
this.initDate();
this.getList();
},
methods: {
//任务详情方法
tcru(name) {
this.tcxx = name;
this.open = true;
this.title = "任务详情";
},
// 任务详情关闭按钮
cancel() {
this.open = false;
this.tcxx = "";
},
//获取当月数据
getList() {
const params = {
year: this.yearModel,
month: this.monthModel,
};
//对数据做处理
for (let i = 0; i < this.tableDate.length; i++) {
const array = this.tableDate[i].rwlist; //任务列表
if (array != null) {
for (let j = 0; j < array.length; j++) {
array[j].mindata = array[j].startDate.split(" ")[0].slice(-2); //开始日期
array[j].maxdata = array[j].endDate.split(" ")[0].slice(-2); //结束日期
array[j].dataList = Number(array[j].mindata) * this.tableW; //任务偏移位置
}
}
}
for (let s = 0; s < this.tableDate.length; s++) {
const array1 = this.tableDate[s].rwlist; //任务列表
if (array1 != null) {
var oneminarr = [];
var endmaxarr = [];
for (let c = 0; c < array1.length; c++) {
oneminarr.push(array1[c].mindata); //开始日期数组
endmaxarr.push(array1[c].maxdata); //结束日期数组
}
oneminarr.sort(); //开始日期排序
endmaxarr.sort(); //结束日期排序
for (let a = 0; a < array1.length; a++) {
if (Number(array1[a].mindata) > Number(oneminarr[0])) {
array1[a].chmindata = oneminarr[0];
} else {
array1[a].chmindata = oneminarr[1]; //最小冲突开始时间
}
if (
Number(array1[a].maxdata) <
Number(endmaxarr[endmaxarr.length - 1])
) {
array1[a].chmaxdata = endmaxarr[endmaxarr.length - 1];
} else {
array1[a].chmaxdata = endmaxarr[endmaxarr.length - 2]; //最大冲突开始时间
}
}
}
console.log(array1 + "ccccc");
}
},
// 获取当前月的天数、当前月第一天是周几
getMonthDayNum(year, month) {
let d = new Date(year, month, 0);
let day = d.getDate();
for (let i = 1; i <= day; i++) {
d.setDate(i);
this.days.push({
year: year,
month: month,
name: i,
weekNum: this.weekdays[d.getDay()],
});
}
//根据天数计算每列宽度
// if (this.days.length <= 29) {
// this.tableW = 55;
// }
// if (this.days.length == 30) {
// this.tableW = 53;
// }
// if (this.days.length == 31) {
// this.tableW = 52;
// }
},
// 回到当月
toToday() {
this.days = [];
this.yearModel = this.yyyy;
this.monthModel = this.mm;
this.getMonthDayNum(this.yearModel, this.monthModel);
},
// 当月
initDate() {
this.yearModel = this.yyyy;
this.monthModel = this.mm;
this.getMonthDayNum(this.yearModel, this.monthModel);
},
// 上一月
minMonth() {
this.days = [];
this.monthModel -= 1;
if (this.monthModel < 1) {
this.yearModel -= 1;
this.monthModel = 12;
}
this.getMonthDayNum(this.yearModel, this.monthModel);
// this.getList()
},
// 下一月
maxMonth() {
this.days = [];
this.monthModel += 1;
if (this.monthModel > 12) {
this.yearModel += 1;
this.monthModel = 1;
}
this.getMonthDayNum(this.yearModel, this.monthModel);
// this.getList()
},
},
};
</script>
<style lang="scss" scoped>
.schedule-head {
overflow: hidden;
line-height: 35px;
margin: 10px 2%;
}
div.buton {
float: left;
}
div.buton button {
background: rgb(64, 158, 255);
border: 1px solid rgb(64, 158, 255);
color: #fff;
cursor: pointer;
margin-right: 15px;
line-height: 25px;
width: 35px;
text-align: center;
padding: 0;
}
div.yeartitle {
float: left;
font-size: 18px;
font-weight: 700;
}
td {
position: relative;
border-collapse: collapse;
border-spacing: 0;
word-wrap: break-word;
padding: 0;
border-bottom: 1px solid #e9e2e2;
text-align: center;
background: #ffffff;
color: #000;
}
th {
border-collapse: collapse;
border-spacing: 0;
border-top: none;
word-wrap: break-word;
padding: 0;
border: 1px solid #e9e2e2;
background: #ffffff;
color: #000;
height: 35px;
border-right: none;
}
th.xxr {
// background: rgb(240, 9, 9);
color: rgb(240, 9, 9);
}
table {
margin: 0 auto;
line-height: 20pt;
border: 0;
table-layout: fixed;
border-spacing: 0;
overflow: hidden;
}
table.bdtnone {
line-height: 20pt;
border: 1px solid #e9e2e2;
table-layout: fixed;
border-bottom: 0;
border-top: 0;
border-left: 0;
}
table.bdtnone td {
border-left: 1px solid #e9e2e2;
}
table tr:nth-child(odd) td {
background: #cccccc61;
}
table.tablemin tr td {
padding: 0;
border-left: 0;
background: none;
}
table.tablemin tr:last-child td {
border-bottom: none;
}
ul.tableul {
position: relative;
width: 110%;
height: 30px;
margin: 0;
padding: 0;
}
ul.tableul li {
float: left;
margin: 0;
padding: 0;
height: 30px;
text-align: center;
line-height: 30px;
list-style: none;
border-right: 1px solid #e9e2e2;
// background: #30313361;
}
ul.tableul li span {
display: block;
width: 100%;
height: 20px;
margin: 5px 0;
cursor: pointer;
}
ul.rwtsxx {
margin: 0;
height: 35px;
float: left;
}
ul.rwtsxx li {
float: left;
margin-left: 15px;
list-style: none;
line-height: 35px;
}
ul.rwtsxx li span {
display: block;
float: left;
width: 30px;
height: 15px;
margin-left: 10px;
margin-top: 10px;
}
ul.rwtsxx li span:nth-child(1) {
width: auto;
height: 35px;
margin: 0;
line-height: 35px;
}
ul.rwtsxx li span.span3 {
background: #409eff;
// border-radius: 25px 0 0 0;
}
ul.tableul li span.span1,
ul.rwtsxx li span.span1 {
background: #409eff;
}
ul.rwtsxx li span.span2 {
background: #409eff;
// border-radius: 0 0 25px 0;
}
ul.tableul li span.span2 {
width: 50%;
background: #409eff;
// border-radius: 25px 0 0 0;
float: right;
}
ul.tableul li span.span3 {
width: 50%;
background: #409eff;
// border-radius: 0 0 25px 0;
float: left;
}
ul.tableul li span.span4,
ul.rwtsxx li span.span4 {
background: #f33030bf;
}
ul.tableul li.rwname {
position: absolute;
top: 0px;
font-size: 14px;
color: #fff;
font-weight: 600;
border: 0;
background: none;
width: 400px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-align: left;
cursor: pointer;
}
::-webkit-scrollbar {
/*滚动条整体样式*/
width: 7px;
/*高宽分别对应横竖滚动条的尺寸*/
height: 7px;
}
::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/
border-radius: 7px;
//background-color: #8c8c8c;
background-color: rgba(0, 0, 0, 0.25);
}
::-webkit-scrollbar-track {
background-color: #f6f6f6;
}
::-webkit-scrollbar-thumb,
::-webkit-scrollbar-track {
border: 0;
}
</style>
小结
简单的日历组件