vue+element的表格(el-table)排班情况表(2024-05-09)

vue+element的表格(el-table)排班情况,增删查改等简单功能

代码:

<template>
  <!-- 表格 -->
  <div class="sedules">
    <el-header>
      <el-date-picker
        v-model="monthValue2"
        type="month"
        placeholder="选择月"
        value-format="yyyy-M"
        @change="changeMonth"
      >
      </el-date-picker>
      <el-date-picker
        style="margin-left: 10px;"
        v-model="weekValue1"
        type="week"
        format="第 WW 周"
        placeholder="选择周"
        @change="changeWeek"
      >
      </el-date-picker>
    </el-header>
    <div class="table-content">
      <el-table
        v-loading="loading"
        class="sedules-table"
        :data="persons"
        border
        height="300"
      >
        <el-table-column
          prop="name"
          width="150"
          align="center"
          label="姓名/日期"
          fixed
        >
          <template slot-scope="{row}">
            <span :class="row.name === '+'?'cur':''" @click="clicksName(row)">{{ row.name }}</span>
          </template>
        </el-table-column>
        <template v-for="(col,i) in nowMonthDays">
          <el-table-column
            :show-overflow-tooltip="true"
            :label="col.date"
            :key="col.date"
            width="100"
            align="center"
          >
            <template slot-scope="{row}">
            <span v-if="filed(col, row).show" class="row-tag" @click="showLog(filed(col, row))">
              <i class="el-icon-close" @click.stop="handleCloseTag(filed(col, row))"></i>
              <el-tag v-if="filed(col, row).typeId === 0"> 白班 </el-tag>
              <el-tag v-else-if="filed(col, row).typeId === 1" type="success"> 中班 </el-tag>
              <el-tag v-else-if="filed(col, row).typeId === 2" type="danger"> 晚班 </el-tag>
              <span v-else> </span>
            </span>
              <i class="icon-plus row-tag" v-else @click="showLog(filed(col, row))">&ensp;</i>
            </template>
          </el-table-column>
        </template>
      </el-table>

    </div>

    <!-- 添加或修改对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="30%" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
        <el-form-item label="姓名" prop="name">
          <el-input style="width: 220px;" v-model="form.name" placeholder="姓名"></el-input>
        </el-form-item>
        <el-form-item label="日期" prop="day">
          <el-date-picker
            v-model="form.day"
            format="yyyy-MM-dd"
            value-format="yyyy-MM-dd"
            placeholder="请选择日期"
            clearable
          />
        </el-form-item>

        <el-form-item label="排班情况" prop="typeName">
          <el-select v-model="form.typeName" clearable placeholder="请选择" @change="$forceUpdate()">
            <el-option
              v-for="dict in sys_day_type"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
              @click.native="getTypeName(dict)"
            />
          </el-select>
        </el-form-item>

        <!--        <el-form-item label="备注" v-show="false">-->
        <!--          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>-->
        <!--        </el-form-item>-->
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submit">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import calendar from '@/utils/js-calendar-converter.js'

export default {
  name: 'paiban',
  data() {

    return {
      insDate: new Date().getFullYear() + '-' + (new Date().getMonth() + 1),
      weekValue1: '',
      monthValue2: new Date().getFullYear() + '-' + (new Date().getMonth() + 1),
      loading: false,
      title: '排班',
      form: {},
      // 是否显示弹出层
      open: false,
      year: new Date().getFullYear(),
      month: new Date().getMonth() + 1,
      weeksArr: ['日', '一', '二', '三', '四', '五', '六'],
      nowMonthDays: [],
      persons: [
        {
          'id': this.$uuid(),
          'name': '刘旺',
          'list': [
            { day: '2024-5-2', typeName: '白班', typeId: 0 },
            { day: '2024-5-6', typeName: '晚班', typeId: 2 },
            { day: '2024-5-7', typeName: '晚班', typeId: 2 },
            { day: '2024-5-9', typeName: '晚班', typeId: 2 }]
        },
        {
          'id': this.$uuid(),
          'name': '王安',
          'list': [
            { day: '2024-5-2', typeName: '白班', typeId: 0 },
            { day: '2024-5-6', typeName: '中班', typeId: 1 },
            { day: '2024-5-12', typeName: '中班', typeId: 1 }
          ]
        },
        {
          'id': this.$uuid(),
          'name': '王二麻子',
          'list': [
            { day: '2024-5-2', typeName: '白班', typeId: 0 },
            { day: '2024-5-6', typeName: '中班', typeId: 2 },
            { day: '2024-5-7', typeName: '中班', typeId: 2 }
          ]
        },
        {
          'id': this.$uuid(),
          'name': '张三',
          'list': [
            { day: '2024-5-2', typeName: '白班', typeId: 0 },  // 白班
            { day: '2024-5-6', typeName: '白班', typeId: 1 },   // 白班
            { day: '2024-5-7', typeName: '中班', typeId: 1 },  // 中班
            { day: '2024-5-8', typeName: '晚班', typeId: 2 }]   // 晚班
        },
        {
          'id': this.$uuid(),
          'name': '李四',
          'list': [
            { day: '2024-5-2', typeName: '白班', typeId: 0 },
            { day: '2024-5-6', typeName: '晚班', typeId: 2 },
            { day: '2024-5-7', typeName: '晚班', typeId: 2 },
            { day: '2024-5-9', typeName: '晚班', typeId: 2 }]
        },
        {
          'id': this.$uuid(),
          'name': '王二麻子',
          'list': [
            { day: '2024-5-2', typeName: '白班', typeId: 0 },
            { day: '2024-5-6', typeName: '中班', typeId: 2 },
            { day: '2024-5-7', typeName: '中班', typeId: 2 }
          ]
        }
      ],
      sys_day_type: [
        { value: 0, label: '白班' },
        { value: 1, label: '中班' },
        { value: 2, label: '晚班' }
      ],
      // 表单校验
      rules: {
        day: [
          { required: true, message: '日期不能为空', trigger: 'blur' }
        ],
        typeName: [
          { required: true, message: '排班情况不能为空', trigger: 'blur' }
        ]
      },
      timeRange: []
    }
  },
  computed: {},
  mounted() {
    this.persons = this.persons.map((two) => {
      two.list.unshift({})
      return two
    })
    this.persons.push({
      id: this.$uuid(),
      name: '+',
      list: []
    })
    this.getNowMonthDays(this.year, this.month)
  },
  methods: {
    clicksName(val) {
      debugger
      this.open = true
      this.title = "新增排班"

    },
    changeWeek(val) {
      this.timeRange = []
      if (val) {
        // 时间选择器按周
        const { year, month, day } = this.getMonday('s', 0, val)
        const { year: year1, month: month1, day: day1 } = this.getMonday('e', 0, val)
        for (let i = 0; i < 7; i++) {
          this.timeRange.push(day + i)
        }
        this.monthValue2 = ''
        this.getNowMonthDays(this.year, this.month, this.timeRange)
      } else {
        this.monthValue2 = this.insDate
        this.getNowMonthDays(this.year, this.month)
      }

    },
    changeMonth(val) {
      const [yy, mm] = val.split('-')
      this.getNowMonthDays((yy - 0), (mm - 0))
      this.weekValue1 = ''
    },
    /*
    方法:得到本周、上周、下周的起始、结束日期
    参数:type为字符串类型,有两种选择,"s"代表开始,"e"代表结束,
    dates为数字类型,不传或0代表本周,-1代表上
    currentTime:当前时间Mon Apr 01 2024 00:00:00 GMT+0800 (GMT+08:00)
    使用方法: console.log('本周结束日期',getDateFn.getMonday('e'));
         console.log('上周开始日期',getDateFn.getMonday('s',-1))
    */
    getMonday(type, dates, currentTime) {
      var now = currentTime || new Date()
      var nowTime = now.getTime()
      var day = now.getDay()
      var longTime = 24 * 60 * 60 * 1000
      var n = longTime * 7 * (dates || 0)
      if (type == 's') {
        var dd = nowTime - (day - 1) * longTime + n
      }

      if (type == 'e') {
        var dd = nowTime + (7 - day) * longTime + n
      }

      dd = new Date(dd)
      var y = dd.getFullYear()
      var m = dd.getMonth() + 1
      var d = dd.getDate()
      console.log(dd)
      // m = m < 10 ? '0' + m : m
      // d = d < 10 ? '0' + d : d
      // var day = y + '-' + m + '-' + d
      return { day: d - 1, year: y, month: m }
    },
    handleCloseTag(col) {
      const that = this
      this.$confirm('此操作删除记录, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        that.persons = that.persons.map((person) => {
          if (person.name === col.name) {
            person.list = person.list.filter((per) => {
              if (per.day !== col.day) {
                return per
              }
            })
          }
          return person
        })
        this.$message({
          type: 'success',
          message: '删除成功!'
        })
      }).catch(() => {
      })

    },
    getTypeName(item) {
      this.form.typeId = item.value
      this.form.typeName = item.label
    },
    filed(col, row) {
      let rows = row.list.find((one) => {
        if (one.day === col.day) {
          return one
        }
      })
      if (rows) {
        const rt1 = { show: true, ...rows, ...col, ...row }
        return rt1
      } else {
        const rt2 = { show: false, ...col, ...row }
        return rt2
      }
    },
    showLog(col) {
      console.log(col)
      this.open = true
      this.form = col
      this.title = '排班'

    },
    submit() {
      const that = this
      that.persons = that.persons.map((person) => {
        if (person.name === that.form.name) {
          const one = person.list.find((per) => {
            if (per.day === that.form.day) {
              return per
            }
          })
          if (one) {
            one.typeId = that.form.typeId
            one.typeName = that.form.typeName
          } else {
            person.list.push(
              {
                day: that.form.day,
                typeId: that.form.typeId,
                typeName: that.form.typeName
              }
            )
          }
        }
        return person
      })

      this.getNowMonthDays(this.year, this.month, this.timeRange)
      that.open = false
    },
    cancel() {
      this.open = false
    },
    // 获取当月天数
    getThisMonthDays(year, month) {
      return new Date(year, month, 0).getDate()
    },
    /** 获取当月日期 */
    getNowMonthDays(year, month, week) {
      let that = this
      const nowMonthDays = []
      that.loading = true
      that.year = year
      that.month = month
      setTimeout(() => {
        if (week && week.length) {
          for (let i in week) {
            const times = `${year + '-' + month + '-' + week[i]}` // 2023-3-3
            const lunar = calendar.solar2lunar(year, month, week[i])
            nowMonthDays.push({
              id: this.$uuid(),
              date: week[i] + '号', // 几号
              week: this.weeksArr[new Date(year, month - 1, week[i]).getDay()], // 星期几
              day: times,
              lunar: lunar.IMonthCn + lunar.IDayCn
            })
          }
        } else {
          let days = that.getThisMonthDays(year, month) // 获取当月的天数
          for (let i = 1; i <= days; i++) {
            const d = new Date(year, month - 1, i)
            const years = d.getFullYear()
            const months = d.getMonth() + 1
            const day2 = d.getDate()
            const times = `${years + '-' + months + '-' + day2}` // 2023-3-3
            const lunar = calendar.solar2lunar(years, months, day2)
            // var holidays = ['2024-5-1', '2024-5-2', '2024-5-3', '2024-5-4', '2024-5-5']
            nowMonthDays.push({
              id: that.$uuid(),
              date: i + '号', // 几号
              week: that.weeksArr[new Date(year, month - 1, i).getDay()], // 星期几
              day: times,
              lunar: lunar.IMonthCn + lunar.IDayCn
            })
          }
        }

        that.nowMonthDays = nowMonthDays
        that.loading = false
      }, 500)
    },
    // 默认显示当前年度
    getdatatime() {
      this.value1 = new Date()
    }
  }
}
</script>
<style lang="scss" scoped>
.sedules {
  height: 90%;

  .el-header {
    display: flex;
    justify-content: flex-start;
    align-content: center;
    align-items: center;
  }

  .table-content {
    position: relative;
    width: 100%;
    height: calc(100% - 40px);

  }

  ::v-deep.sedules-table.el-table {
    height: 100% !important;
    overflow: auto;

    & .el-table__cell.is-hidden > * {
      visibility: visible;
    }

    .el-table__fixed-body-wrapper {
      top: 44px !important;
    }

    .el-table__body-wrapper {
      height: calc(100% - 45px) !important;
    }

    .cur {
      cursor: pointer;
    }

    .el-table .cell {
      padding: 0;

      &.el-tooltip {
        white-space: nowrap;
        min-width: 50px;
        height: 100%;
        display: block;
        padding: 0;
      }
    }

    .row-tag {
      position: relative;
      display: inline-block;
      height: 100%;
      min-height: 20px;
      cursor: pointer;
      width: calc(100% - 10px);
      padding: 0;

      i.el-icon-close {
        position: absolute;
        right: 0;
        color: transparent;
      }

      &:hover {
        i.el-icon-close {
          color: #a7a7a7;
        }
      }

      .el-tag {
        width: 100%;
      }
    }
  }

}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8网络结构介绍

将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍&#xff0c;主要内容也是在目标检测任务中介绍&#xff0c;其他任务也只是Head层不相同。 1.YOLOv8_det网络结构 首先&#xff0c;YOLOv8网络分成了三部分&#xff0c;分别是主干网络…

制鞋5G智能工厂数字孪生可视化平台,推进行业数字化转型

制鞋5G智能工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。随着科技的飞速发展&#xff0c;5G技术与智能制造的结合正成为推动制鞋行业数字化转型的重要力量。制鞋5G智能工厂数字孪生可视化平台&#xff0c;不仅提高了生产效率&#xff0c;还优化了资源配置&#xff0…

【Linux系统编程】31.pthread_detach、线程属性

目录 pthread_detach 参数pthread 返回值 测试代码1 测试结果 pthread_attr_init 参数attr 返回值 pthread_attr_destroy 参数attr 返回值 pthread_attr_setdetachstate 参数attr 参数detachstate 返回值 测试代码2 测试结果 线程使用注意事项 pthread_deta…

SpringCloud:认识微服务

程序员老茶 &#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#…

NSSCTF | [SWPUCTF 2021 新生赛]easy_sql

打开题目&#xff0c;提示输入一些东西&#xff0c;很显眼的可以看到网站标题为“参数是wllm” 首先单引号判断闭合方式 ?wllm1 报错了&#xff0c;可以判断为单引号闭合。 然后判断字节数&#xff08;注意‘--’后面的空格&#xff09; ?wllm1 order by 3-- 接着输入4就…

[Linux][网络][网络层][IP协议]详细讲解

目录 0.基本概念1.IP协议头格式2.IP分片与组装1.为什么要分片&#xff1f;2.分片后谁来组装&#xff1f;3.这个分片操作传输层知道吗&#xff1f;4.如何识别报文和报文的不同&#xff1f;5.接收端&#xff0c;如何得知报文是独立的还是一个分片&#xff1f;6.如何区别哪些分片是…

UDP和TCP协议比较,TOE技术

如今在某些方面TCP超越UDP的主要原因如下 在硬件层面的TOE(TCP Offload Engine)功能&#xff0c;将越来越多的TCP功能卸载到网卡上。它极大地提升了TCP的性能&#xff0c;使其在高吞吐量场景下的表现更为出色。近年TCP的拥塞控制算法实现了显著进步。这些新算法显著提高了TCP在…

macos安装mysql一直卡在安装成功那个页面选项的解决办法

问题描述&#xff1a; 我安装的是比较新的版本8.0.37&#xff0c;安装过程中一直卡在安装那个选项上&#xff0c;且页面提示安装成功了&#xff0c;但就是死活不往下面的配置选项那一步走。 解决办法&#xff1a; 1.首先清理掉之前的mysql sudo rm -rf /usr/local/mysql2.然…

软件技术主要学什么课程

软件技术专业主要学习的课程和内容有编程语言、数据结构与算法、数据库技术等&#xff0c;以下是上大学网( www.sdaxue.com)整理的软件技术主要学什么课程&#xff0c;供大家参考&#xff01; 编程语言&#xff1a;掌握一种或多种编程语言&#xff0c;如C#、Java、Python、C等&…

Python 2.x与Python 3.x:初学者该如何选择?

自从Python在1994年首次发布以来,已经经历了多个版本的更新和改进。Python 1.x虽然在发展史上具有重要意义,但早已过时,不再用于实际开发。2000年发布的Python 2.x和2008年发布的Python 3.x则成为了Python家族中最常用的两个版本,形成了一个重要的分界线。特别是Python 3.x…

GPU通用计算介绍

谈到 GPU &#xff08;Graphics Processing Unit&#xff0c;图形显示卡&#xff09;大多数人想到的是游戏、图形渲染等这些词汇&#xff0c;图形处理确实是 GPU 的一大应用场景。然而人们也早已关注到它在通用计算上的巨大潜力&#xff0c;并提出了 GPGPU (General-purpose co…

本地搭建hydra服务用go以验证oidc流程

目录 1、docker搭建hydra&#xff0c;环境配置&#xff1a; 2、搭建完成后服务调用&#xff1a; 2.1保证服务正常启动&#xff1a; 2.2 通过postman调用&#xff0c;获取client_id&#xff1a; 2.3 通过client_id&#xff0c;实现oauth2/auth调用 3. 通过go语言实现oidc验…

jsp 实验12 servlet

一、实验目的 掌握怎样在JSP中使用javabean 二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握servlet的用法。【参考课本 上机实验1 】 三、源代码以及执行结果截图&#xff1a; 源代碼&#xff1a; inputVertex.jsp&#xff1a; <% page lang…

免费思维13招之四:主副型思维

免费思维13招之四:主副型思维 本节,给你分享一下产品型思维的第二种子思维:主副型思维 什么是主副型思维呢?传统的主副型思维是指对企业的核心、利润最高的产品进行收费,一些附加品、延伸产品进行让利,赠送给客户。 但是这早已过时了,现在升级之后的产品型思维,就是将…

​​​​【收录 Hello 算法】4.4 内存与缓存

目录 4.4 内存与缓存 4.4.1 计算机存储设备 4.4.2 数据结构的内存效率 4.4.3 数据结构的缓存效率 4.4 内存与缓存 在本章的前两节中&#xff0c;我们探讨了数组和链表这两种基础且重要的数据结构&#xff0c;它们分别代表了“连续存储”和“分散存储”两种物理…

如何防止WordPress网站内容被抓取

最近在检查网站服务器的访问日志的时候&#xff0c;发现了大量来自同一个IP地址的的请求&#xff0c;用站长工具分析确认了我的网站内容确实是被他人的网站抓取了&#xff0c;我第一时间联系了对方网站的服务器提供商投诉了该网站&#xff0c;要求对方停止侵权行为&#xff0c;…

16【PS Aseprite 作图】图像从Aseprite传输到PS

【内容背景】Aseprite很适合做像素图&#xff0c;有一个“完美像素”的选项&#xff0c;就不用在PS里面慢慢修线&#xff0c;能够省事很多 【具体操作】 勾选完美像素 Aseprite里面的“完美像素”能够减少修线的步骤&#xff0c;在“作图”的时候一定要注意勾选 导出 选择…

【全开源】Java线上云酒馆单预约系统源码小程序源码

核心功能&#xff1a; 座位预约&#xff1a;用户可以通过该系统提前预约酒馆的座位&#xff0c;选择就餐时间和人数&#xff0c;以及特殊座位&#xff08;如包厢、卡座等&#xff09;&#xff0c;确保到店后有合适的座位。酒水点餐&#xff1a;用户可以在预约的同时&#xff0…

OSError: image file is truncated (36 bytes not processed)解决方案

错误原因&#xff1a; 图像文件被损坏 解决方案&#xff1a; 代码开头添加如下两行代码&#xff1a; from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES True

ETL工具kettle(PDI)入门教程,Transform,Mysql->Mysql,Csv->Excel

什么是kettle&#xff0c;kettle的下载&#xff0c;安装和配置&#xff1a;ETL免费工具kettle(PDI)&#xff0c;安装和配置-CSDN博客 mysql安装配置&#xff1a;Linux Centos8 Mysql8.3.0安装_linux安装mysql8.3-CSDN博客 1 mysql -> mysql 1.1 mysql CREATE TABLE user_…