手写排班日历

news2025/1/11 11:18:13

手写排班日历:

效果图:

在这里插入图片描述

vue代码如下:

<template>
  <div class="YSPB">
    <div class="title">排班日历</div>
    <div class="banner">
      <span class='iconfont icon-youjiantou ' @click="nextMounth('l')">{{ "{" }}</span>
      <span>{{ y }}{{ m }}</span>
      <span class='iconfont icon-youjiantou' @click="nextMounth('r')">{{ "}" }}</span>
    </div>
    <div class="cander" v-show="show">
      <div class="week">
        <span class='box' style='color:#ff0000a1;'></span>
        <span class='box'></span>
        <span class='box'></span>
        <span class='box'></span>
        <span class='box'></span>
        <span class='box'></span>
        <span class='box' style='color:#ff0000a1;'></span>
      </div>
      <div class="days">
        <div class="days1" v-for="(obj, i) in dateList" :key="i">
          <div :class="['txt',
            obj.day == today ? (obj.bool ? 'sel' : '') : '',
            obj.bool ? '' : 'old',
            obj.isWork == '上午' ? 'shangwuColor' : obj.isWork == '下午' ? 'xiawuColor' : obj.isWork == '全天' ? 'quantianColor' : '',
            obj.label == '左' ? 'Color_l' : obj.label == '中' ? 'Color_z' : obj.label == '右' ? 'Color_r' : '']"
            @click='selClick(obj.day, obj.bool, obj)'>
            <span v-if="obj.isWork == '上午'" class="t1">{{ obj.day }}</span>
            <span v-if="obj.isWork == '上午'" class="t2">{{ obj.lunar }}</span>
            <!-- <div :class="['t3', obj.isWork == '上午' ? 't4' : '']" v-show="(obj.day != today) && obj.bool && obj.isWork == '上午'">上午</div> -->

            <span v-if="obj.isWork == '下午'" class="t1">{{ obj.day }}</span>
            <span v-if="obj.isWork == '下午'" class="t2">{{ obj.lunar }}</span>
            <!-- <div :class="['t3', obj.isWork == '下午' ? 't4' : '']" v-show="(obj.day != today) && obj.bool && obj.isWork == '下午'">下午</div> -->

            <span v-if="obj.isWork == '全天'" class="t1">{{ obj.day }}</span>
            <span v-if="obj.isWork == '全天'" class="t2">{{ obj.lunar }}</span>
            <!-- <div :class="['t3', obj.isWork == '全天' ? 't4' : '']" v-show="(obj.day != today) && obj.bool && obj.isWork == '全天'">全天</div> -->

            <span v-if="!obj.isWork" class="t1">{{ obj.day }}</span>
            <span v-if="!obj.isWork" class="t2">{{ obj.lunar }}</span>
            <div :class="['t3']" v-show="(obj.day != today) && obj.bool && !obj.isWork"></div>
          </div>
        </div>
      </div>
    </div>
    <div class="bot">
      注意:所有排班不可自行更改,如需更改排班,请联系医院管理人员进行更改
    </div>
    <div class="forterColor">
      <div class="forterColor1">
        <div class="shangwuColor_qiu"></div> <span>上午班</span>
      </div>
      <div class="forterColor1">
        <div class="xiawuColor_qiu"></div><span>下午班</span>
      </div>
      <div class="forterColor1">
        <div class="quantianColor_qiu"></div><span>全天班</span>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: "cu-divClick",
  props: {
    list: {
      type: Array,
      default: () => []
    },
    clickAction: {
      type: Number,
      default: 3
    }
  },
  data() {
    return {
      show: true,
      dateList: [],
      today: new Date().getDate(),
      y: new Date().getFullYear(),
      m: new Date().getMonth() + 1,
      pbList: [], //排班列表
    };
  },
  mounted() {
    this.dateList = this.getTime()
    this.pbList = [

            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-02",
              "timeType": "全天"
            },
            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-03",
              "timeType": "全天"
            },
            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-15",
              "timeType": "上午"
            },
            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-16",
              "timeType": "上午"
            },
            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-17",
              "timeType": "上午"
            },
            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-18",
              "timeType": "下午"
            },

            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-26",
              "timeType": "全天"
            },
            {
              "doctorCode": "10015",
              "doctorName": "韩辰份",
              "resourcesDate": "2024-09-27",
              "timeType": "全天"
            },
          ];
          this.pbList = this.labelArray(this.pbList);
          console.log("this.pbList:", this.pbList)
          this.isWork()
  },
  watch: {
    dateList: {
      handler(newval) {
        this.isWork()
      },
      deep: true,
      immediate: true
    }
  },
  methods: {
    isWork() {
      this.show = false
      this.dateList.forEach(val => {
        this.pbList.forEach(item => {
          const date = this.y + '-' + this.m + '-' + val.day
          if (val.timeDate == item.resourcesDate && item.timeType == "上午") {
            val.isWork = "上午"
            console.log(date + val.isWork)
            val.label = item.label
          } else if (val.timeDate == item.resourcesDate && item.timeType == "下午") {
            val.isWork = "下午"
            console.log(date + val.isWork)
            val.label = item.label
          } else if (val.timeDate == item.resourcesDate && item.timeType == "全天") {
            val.isWork = "全天"
            console.log(date + val.isWork)
            val.label = item.label

          }
        })
      })

      this.show = true
    },

    areConsecutiveDates(date1, date2) {
      let d1 = new Date(date1);
      let d2 = new Date(date2);
      let oneDay = 24 * 60 * 60 * 1000;
      return Math.round((d2 - d1) / oneDay) === 1;
    },
    labelArray(arr) {
      let result = [];
      let i = 0;
      while (i < arr.length) {
        let start = i;
        let end = i;
        while (end + 1 < arr.length && arr[end].timeType === arr[end + 1].timeType && this.areConsecutiveDates(arr[end].resourcesDate, arr[end + 1].resourcesDate)) {
          end++;
        }
        if (start === end) {
          result.push(arr[start]);
        } else {
          result.push({ ...arr[start], label: '左' });// 上午/下午/全天-左边元素
          for (let j = start + 1; j < end; j++) {
            result.push({ ...arr[j], label: '中' });// 上午/下午/全天-中间元素
          }
          result.push({ ...arr[end], label: '右' });// 上午/下午/全天-右边元素
        }
        i = end + 1;
      }
      return result;
    },


    /* 日历 ----------------------------------*/
    // 选中日期
    selClick(day, flag, obj) {
      console.log(obj)
      if (!flag) return
      this.today = day
    },
    //获取当月天数
    getMounthNum(m) {
      let days = 0
      if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
        days = 31
      } else if (m == 4 || m == 6 || m == 9 || m == 11) {
        days = 30
      } else if (m == 2) {
        if ((this.y % 4 == 0 && this.y % 100 != 0) || (this.y % 400 == 0)) {
          days = 29
        } else {
          days = 28
        }
      }
      return days
    },
    //获取当月每一天对应周几
    getTime() {
      const date = new Date(this.y + '/' + this.m + '/' + '1')
      const arr = []
      const start = date.getDay()
      const end = new Date(this.y + '/' + this.m + '/' + this.getMounthNum(this.m)).getDay()
      for (let i = 1 - start; i <= this.getMounthNum(this.m) + 6 - end; i++) {
        let day = '',
          week = '',
          lunar = '',
          bool = true,
          m = '',
          y = this.y,
          today = this.today;
        if (i < 1) {
          m = this.m - 1
          if (m < 1) {
            y--
            m = 12
          }
          day = this.getMounthNum(m) + i
        } else if (i >= 1 && i <= this.getMounthNum(this.m)) {
          m = this.m
          day = i
        } else if (i > this.getMounthNum(this.m)) {
          m = this.m + 1
          if (m > 12) {
            y++
            m = 1
          }
          day = i - this.getMounthNum(this.m)
        }
        week = this.setWeek(new Date(y + '/' + m + '/' + day).getDay())
        day = day >= 10 ? day.toString() : '0' + day
        const ary = this.$cu.test.getLunar(new Date(y + '/' + m + '/' + day))
        if (day < this.today || i < 1 || i > this.getMounthNum(this.m)) {
          bool = false
        }
        console.log("y")
        m = m >= 10 ? m.toString() : '0' + m
        let timeDate = y + "-" + m + "-" + day
        arr.push({
          day,
          week,
          lunar: ary[1],
          nl: ary[0],
          bool,
          timeDate
        })
      }
      return arr
    },
    setWeek(val) {
      switch (val) {
        case 0:
          val = '周日'
          break;
        case 1:
          val = '周一'
          break;
        case 2:
          val = '周二'
          break;
        case 3:
          val = '周三'
          break;
        case 4:
          val = '周四'
          break;
        case 5:
          val = '周五'
          break;
        case 6:
          val = '周六'
          break;
      }
      return val
    },
    // 下一月或上一月
    nextMounth(val) {
      if (this.y == new Date().getFullYear() && this.m == new Date().getMonth() + 1 && val == 'l') return
      this.show = false
      if (val == 'l') {
        this.m--
        if (this.m < 1) {
          this.y--
          this.m = 12
        }
      } else if (val == 'r') {
        this.m++
        if (this.m > 12) {
          this.y++
          this.m = 1
        }
      }
      if (this.m != new Date().getMonth() + 1) {
        this.today = null
      } else {
        this.today = new Date().getDate()
      }
      this.dateList = this.getTime()
      this.show = true
    }
    /* 日历 ----------------------------------*/
  }
};
</script>

<style lang="less" scoped>
.YSPB {
  width: 100%;
  height: 100%;
  background-color: #f8f8f8;

  .title {
    // line-height: 110px;
    text-align: center;
    background-color: #fff;
    font-size: 24px;
    font-weight: bold;
    color: #000000;
    border-bottom: 1px solid #ddd;
    padding: 10px 0px;
  }

  .banner {
    display: flex;
    align-items: center;
    // line-height: 110px;
    text-align: center;
    background-color: #fff;
    font-size: 24px;
    font-weight: bold;
    padding: 20px 0px;

    .iconfont {
      flex: 1;
      color: #999;
      cursor: pointer;
      -moz-user-select: none;
      /*mozilar*/
      -webkit-user-select: none;
      /*webkit*/
      -ms-user-select: none;
      /*IE*/
      user-select: none;
    }

    .right {
      display: inline-block;
      transform: rotate(180deg);
    }

    span {
      display: inline-block;
      margin: 0 30px;
      color: #000;
    }
  }

  .cander {
    background-color: #fff;
    padding: 0 27px 50px;

    .week {
      height: 62px;
      border-radius: 31px;
      background-color: #f0f0f0;
      display: flex;

      .box {
        /* 每个项占宽度的 14% */
        width: 14.285714285714286%;
        font-size: 20px;
        display: flex;
        align-items: center;
        justify-content: center;
      }
    }

    .days {
      width: 100%;
      margin-top: 30px;
      display: flex;
      flex-wrap: wrap;

      .days1 {
        padding-top: 30px;
        /* 每个项占宽度的 14% */
        width: 14.285714285714286%;
        display: flex;
        align-items: center;
        justify-content: center;

        .txt {
          padding: 10px 14px;
          position: relative;
          text-align: center;
          color: #000;
          display: flex;
          flex-direction: column;
          align-items: center;
          justify-content: center;

          .t1 {
            display: inline-block;
            font-size: 20px;
            color: #333;
            line-height: 20px;
          }

          .t2 {
            display: block;
            font-size: 12px;
            color: #666;
            line-height: 12px;
          }

          .t3 {
            position: absolute;
            top: 0;
            right: 0;
            color: #00AF46;
            font-size: 12px;
          }

          .t4 {
            color: #F8764E;
          }

        }

        /* 设置每一行的第一位和第七位的文字颜色为红色 */




        .old {
          opacity: 0.5;

          /* 淡化子元素背景色 */
          .t1,
          .t2 {
            color: #b3b3b3;
          }
        }


      }

      .days1:nth-child(7n + 1),
      .days1:nth-child(7n) {
        .txt {
          span {
            color: #ff0000a1;
          }
        }

      }

    }
  }



  .forterColor1 {
    display: flex;
    align-items: center;

    span {
      margin-left: 10px;
    }
  }
}

.sel {
  border-radius: 50%;
  border: 1px solid #dddddd;



}

.shangwuColor_qiu {
  margin-top: 4px;
  width: 18px;
  height: 18px;
  background-color: #ed4014;
  border-radius: 50%;
}

.xiawuColor_qiu {
  margin-top: 4px;
  width: 18px;
  height: 18px;
  background-color: #19be6b;
  border-radius: 50%;
}

.quantianColor_qiu {
  margin-top: 4px;
  width: 18px;
  height: 18px;
  background-color: #2d8cf0;
  border-radius: 50%;
}

.bot {
  padding: 10px 30px;
  font-size: 16px;
  color: #999;
  // line-height: 34px;
  text-align: justify;
}

.forterColor {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 30px;
  font-size: 16px;
}

.shangwuColor {
  margin-top: 4px;
  background-color: #ed4014;
  border-radius: 50%;

  .t1,
  .t2 {
    color: #fff !important;
  }
}

.xiawuColor {
  margin-top: 4px;
  background-color: #19be6b;
  border-radius: 50%;

  .t1,
  .t2 {
    color: #fff !important;
  }
}

.quantianColor {
  margin-top: 4px;
  background-color: #2d8cf0;
  border-radius: 50%;

  .t1,
  .t2 {
    color: #fff !important;
  }
}

.Color_l {
  border-radius: 140px 0 0 140px;
  width: 100% !important;
}

.Color_z {
  border-radius: 0 0 0 0;
  width: 100% !important;
}

// .Color_z::before {
//   content: "";
//   position: absolute;
//   top: 0;
//   left: 0;
//   width: 100%;
//   height: 100%;
//   background-color: rgba(0, 0, 0, 0.1);
//   /* 半透明覆盖层 */
//   z-index: 1;
// }

.Color_r {
  border-radius: 0 140px 140px 0;
  width: 100% !important;
}

.t1 {
  font-weight: bold;
  font-size: 20px !important;
}

.t2 {
  font-size: 12px !important;
}</style>


学习内容:

提示:这里可以添加要学的内容

例如:

  1. 搭建 Java 开发环境
  2. 掌握 Java 基本语法
  3. 掌握条件语句
  4. 掌握循环语句

学习时间:

提示:这里可以添加计划学习的时间

例如:

  • 周一至周五晚上 7 点—晚上9点
  • 周六上午 9 点-上午 11 点
  • 周日下午 3 点-下午 6 点

学习产出:

提示:这里统计学习计划的总量

例如:

  • 技术笔记 2 遍
  • CSDN 技术博客 3 篇
  • 习的 vlog 视频 1 个

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】分类与回归——掌握两大核心算法的区别与应用

【机器学习】分类与回归——掌握两大核心算法的区别与应用 1. 引言 在机器学习中&#xff0c;分类和回归是两大核心算法。它们广泛应用于不同类型的预测问题。分类用于离散的输出&#xff0c;如预测图像中的对象类型&#xff0c;而回归则用于连续输出&#xff0c;如预测房价。…

.net core 通过Sqlsugar生成实体

通过替换字符串的方式生成代码&#xff0c;其他代码也可以通这种方式生成 直接上代码 设置模板 将这几个模板文件设置为&#xff1a;嵌入资源 模板内容&#xff1a; using SqlSugar;namespace {Namespace}.Domain.Admin.{ModelName}; /// <summary> /// {TableDisplay…

浪潮光纤交换机FS8500、FS8600、FS8900端口数量授权扩容方法

浪潮光纤交换机FS8500、FS8600、FS8900系列是OEM博通G610、G620、G630光纤交换机&#xff0c;激活方法也是和博通一样的 获取设备License id 登录光纤交换机&#xff0c;可以使用Console线&#xff0c;也可以使用网线ssh登录默认ip&#xff1a;10.77.77.77&#xff0c;这里推…

【北京迅为】《STM32MP157开发板使用手册》- 第二十六章Cortex-M4 GPIO_蜂鸣器实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

浅谈电动汽车公共充电桩布局设计及解决方案

摘要&#xff1a;随着社会现代化的深入推进&#xff0c;环境保护和资源利用可持续化发展的重要性愈发显著。电动汽车因其在节能、效率、环保等方面的突出优势&#xff0c;开始越来越多的进入城市交通系统。然而目前充电桩等相关配套设施缺乏合理的设置依据&#xff0c;不利于电…

【区块链通用服务平台及组件】中金数据云链平台 | FISCO BCOS应用案例

近年来&#xff0c;湖北省、武汉市区块链产业加快发展&#xff0c;在供应链管理、产品溯源等诸多领域逐步落地&#xff0c;形成了良好创新 创业氛围。2022 年 8 月&#xff0c;武汉市正式获批建设国家区块链发展先导区。中金数据&#xff08;武汉&#xff09;超算技术有限公司以…

组织数据能力评估模型一览

组织数据能力的成熟度等评估模型主要包括&#xff1a;DCMM、DSMM、DCAM、DAMA等。最新版《DMBOK2.1》 中&#xff0c;对于数据成熟度评估模型的选择给出了应考虑的标准&#xff1a; 可访问性&#xff1a;实践以非技术术语陈述&#xff0c;传达活动的功能要义。全面性&#xff…

HBase在大数据实时处理中的角色

HBase是一个分布式的、面向列的开源NoSQL数据库&#xff0c;它建立在Hadoop的HDFS之上&#xff0c;被设计用于处理大规模数据集。HBase非常适合于需要随机实时读写访问的应用程序&#xff0c;例如大数据分析、数据仓库和实时数据处理等场景。本文将探讨HBase是如何进行大数据实…

SpinalHDL之数据类型(六)

本文作为SpinalHDL学习笔记第五十九篇,介绍SpinalHDL的Vec数据类型。 目录: 1.描述(Description) 2.声明(Declaration) 3.操作符(Operators) ⼀、描述(Description) Vec是定义了⼀组带有标号的信号的复合信号(基于SpinalHDL基础类别)。 ⼆、声明(Declaration) 声明向量的…

最新消息,OpenAI o 1 一种新的大型语言模型正在被引入

据最新消息。 我们正在引入OpenAI o 1&#xff0c;这是一种新的大型语言模型&#xff0c;经过强化学习训练&#xff0c;可以执行复杂的推理。O 1在回答之前思考--它可以在对用户做出响应之前产生一个很长的内部思考链。 OpenAI o 1在竞争性编程问题&#xff08;Codeforces&am…

GaN挑战Si价格底线?英飞凌推出全球首个12英寸GaN晶圆技术

昨日&#xff0c;英飞凌宣布已成功开发出全球首个12英寸功率氮化镓GaN晶圆技术&#xff0c;并计划在今年的德国慕尼黑展上向公众展示首批12英寸GaN晶圆。 据英飞凌介绍&#xff0c;12英寸晶圆上的芯片生产在技术上更先进&#xff0c;效率也有显著提高&#xff0c;相较于8英寸晶…

Serverless 安全新杀器:云安全中心护航容器安全

作者&#xff1a;胡志广(独鳌) 云安全中心对于 Serverless 容器用户的价值 从云计算发展之初&#xff0c;各大云厂商及传统安全厂商就开始围绕云计算的形态来做安全解决方案。传统安全与云计算安全的形态与做法开始发生变化&#xff0c;同时随着这 10 多年的发展&#xff0c;…

JavaWeb开发中为什么Controller里面的方法是@RequestMapping?

在Java Web开发中&#xff0c;尤其是在使用Spring MVC框架时&#xff0c;RequestMapping注解被广泛应用于Controller层的方法上&#xff0c;这是因为RequestMapping是Spring MVC提供的一个核心注解&#xff0c;用于将HTTP请求映射到相应的处理器类或处理器方法上。通过这种方式…

安全隔离上网的有效途径:沙盒

在数字化浪潮日益汹涌的今天&#xff0c;网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制&#xff0c;为企业和个人提供了一种在享受网络便利的同时&#xff0c;保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网&#xff0c;从而为用户提…

什么开放式耳机好用?2024五款宝藏品牌推荐!

在移动互联网时代&#xff0c;耳机已成为许多人生活中不可或缺的一部分&#xff0c;无论是在通勤路上还是运动时&#xff0c;它们都能提供音乐享受&#xff0c;同时减轻压力。然而&#xff0c;长时间佩戴入耳式耳机可能会引起耳道不适甚至炎症。因此&#xff0c;开放式耳机因其…

STM32 如何生成随机数

目录 一、引言 二、STM32 随机数发生器概述 三、工作原理 1.噪声源 2.线性反馈移位寄存器&#xff08;LFSR&#xff09; 3.数据寄存器&#xff08;RNG_DR&#xff09; 4.监控和检测电路&#xff1a; 5.控制和状态寄存器 6.生成流程 四、使用方法 1.使能随机数发生器 …

洛谷 P3065 [USACO12DEC] First! G

原题点这里​​​​​​ 题目来源于&#xff1a;洛谷 题目本质&#xff1a;字符串&#xff0c;Hash&#xff0c;字典树Trie 题目思路&#xff1a; 因为涉及到字典序的问题&#xff0c;那么应该能想到字典树。很显然字符串s1如果比字符串s2的字典序小的话&#xff0c;只有两种…

sms4j 发送短信

一、使用介绍 技术介绍&#xff1a; SMS4J: 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商 项目地址&#xff1a; SMS4J: 让简单的事情回归简单的本质。 SMS4J为短信聚合框架&#xff0c;帮您轻松集成多家短信服务&#xff0c;解决接入多个短信SDK的繁琐流程。 目前已…

8招教你轻松解决职场甩锅PUA!

你是不是四十岁了还不知道解决职场甩锅行为也是有公式的&#xff01; 那些混得好&#xff0c;能轻松赢得领导赏识&#xff0c;快速升职的&#xff0c;都 是早就把这些技巧背的滚瓜烂熟&#xff01; 比如&#xff1a; 1、同事的错&#xff0c;领导误会是你 错误话术 这不是…

【Linux】在Windows搭建WSL2开发环境

在Windows搭建WSL2开发环境 WSL安装和调整更改安装位置变更默认apt源 Python环境变更默认Python版本安装pip WSL安装和调整 这里使用的WSL2&#xff0c;Ubuntu22.04 如果在WSL中需要使用系统代理但是报以下的错&#xff1a; 在当前Windows用户目录下创建.wslconfig并写入以下配…