vue日历任务组件

文章目录

概要

日历任务组件,国产项目需要使用自己开发的组件,只为展示任务人当月任务条数,是否冲突,任务时间等数据展示,就自己简单写了一个

代码

<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>

小结

简单的日历组件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值