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

news2024/11/29 10:34:21

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>

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

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

相关文章

【复试分数线】C9历年分数线汇总(第二弹)

今天我将分析C9中主要考信号的5所院校&#xff1a;复旦大学、上海交通大学、南京大学、哈尔滨工业大学、西安交通大学。 这次会为大家整理四电四邮的整理了近三年各院校的复试分数线作为参考&#xff0c;大家可以参考&#xff01; 大多数院校采取的是1.2:1差额的形式复试。举…

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

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

MyBatis(该篇足已)

目录 一.MyBatis是什么&#xff1f; 二.为什么学习MyBatis呢&#xff1f; 三.MyBatis的学习 3.1MyBatis的开发流程 3.2MyBatis项目 四.MyBatis的增删改操作 五.参数占位符 #{} 和 ${} 六.映射返回 七.映射失败 八.数据库连接池 九.动态SQL 9.1<if>标签 9.2&…

JavaSE——异常(2/2)-异常的处理(记录异常并提示 、尝试重新修复)

目录 记录异常并提示 案例演示 流程解析 写法优化 尝试重新修复 开发中对于异常的常见处理方式 一层一层往上抛出异常&#xff0c;并且在最上层捕获异常&#xff0c;分为两种不同的处理方式。 例如&#xff0c;B站网页报错就是采取的第一种方式&#xff1a; 记录异常并…

擎天科技与禅道合作,打造统一的项目管理平台

统一、全面的项目管理平台能够帮助企业优化管理流程&#xff0c;提升业务效率。擎天集团选择与禅道软件合作&#xff0c;打造统一的项目管理平台&#xff0c;在降低自研软件的研发成本、打破团队信息孤岛、保障数据全面性等方面效果显著&#xff0c;大大提高了团队沟通协作效率…

NL6621 WIFI模块烧录及其他

某宝淘得NL6621: 测了一下引脚&#xff1a; 做了以下功课&#xff1a; 新岸线物联网NL6621解决方案是高性价比、完全开源、高成熟度的解决方案&#xff0c;特别为高数据吞吐率低成本的无线局域网产品而设计。它集成了MCU&#xff0c; MAC&#xff0c;1T1R基带和带功放RF收发机于…

【JavaEE网络】HTTP响应详解:状态码、报头与正文的全面解析

目录 HTTP响应&#xff08;Response&#xff09;认识 "状态码" (status code)认识响应 “报头”&#xff08;header&#xff09;认识响应 “正文”&#xff08;body&#xff09; HTTP响应&#xff08;Response&#xff09; 响应&#xff1a; 首行响应头空行正文 认…

互动科技如何强化法治教育基地体验?

近年来&#xff0c;多媒体互动技术正日益融入我们生活的各个角落&#xff0c;法治教育领域亦不例外。步入法治教育基地&#xff0c;我们不难发现&#xff0c;众多创新的多媒体互动装置如雨后春笋般涌现&#xff0c;这些装置凭借前沿的科技手段&#xff0c;不仅极大地丰富了法制…

Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件

目录 1. 前言 2. 部署Node服务 2.1. 前置环境安装 2.2. 将Node服务加入集群 3. 部署JNI网络插件 4. 测试集群 5. 总结 1. 前言 我们在上一篇文章完成了Matster结点的部署&#xff0c;这次我们接着来部署Node服务&#xff0c;注意&#xff0c;我Node服务是部署在另外两台…

java 文件表创建及前后端使用

表结构task_file 前端具体到业务表单 <el-form-item label"任务附件" prop"taskAttachment"><el-upload ref"upload" accept".jpg, .png, .txt, .xlsx, .doc, .docx, .xls, .pdf, .zip, .rar":action"upload.url" …

(三)小程序样式和组件

视频链接&#xff1a;尚硅谷2024最新版微信小程序 文章目录 小程序的样式和组件介绍样式-尺寸单位 rpx样式-全局样式和局部样式组件-组件案例演示组件案例-轮播图区域绘制组件案例-轮播图图片添加组件案例-绘制公司信息区域组件案例-商品导航区域组件案例-跳转到商品列表组件案…

Java实现 selenium Web自动化测试(简单篇)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

LifeCycle之ProcessLifeCycleOwner

问题&#xff1a;想要知道应用程序当前处在前台、后台、或从后台回到前台&#xff0c;想要知道应用的状态&#xff0c; LifeCycle提供了ProcessLifeCycleOwner的类&#xff0c;方便我们知道整个应用程序的生命周期情况 ProcessLifeCycleOwner 使用方法 1.首先添加依赖 imple…

Flutter 首次亮相 Google Cloud Next 大会

作者 / Kelvin Boateng Flutter 团队在近期首次参加了 Google Cloud Next 大会&#xff0c;这意味着 Flutter 在开发社区中的影响力正在日益增长。 Google Cloud Next https://cloud.withgoogle.com/next 我们与 Google Cloud、Firebase、Very Good Ventures 和 Serverpod 的团…

深化产教融合,泰迪智能科技助力西南林业大学提质培优

2024年5月7日&#xff0c;泰迪智能科技昆明分公司院校部总监查良红和数据部负责人余雄亮赴西南林业大学理学院就工作室共建事宜进行交流会谈。西南林业大学理学院院长张雁、党委副书记魏轶、副院长谢爽、就业负责人罗丽及学生代表参与本次交流会。 会议伊始&#xff0c;谢副院长…

C++语法|进程虚拟地址空间和函数调用栈

本文来自施磊老师的课程&#xff0c;老师讲的非常不错&#xff0c;我的笔记也是囫囵吞枣全部记下&#xff0c;但是我在这里推荐一本书&#xff0c;真的真的建议初学C或者想要进阶C的同学们看看&#xff1a;《CPU眼里的C/C》 文章目录 进程的虚拟地址空间和布局进程虚拟地址空间…

服务异步通讯MQ

同步调用存在的问题: 异步调用方案: RabbitMQ安装: 第一种:在线拉取 docker pull rabbitmq:3-management 第二种:将已有的安装包放入再用load加载 我这里放到tmp包里边 然后:cd /tmp docker load -i mq.tar 加载进去 然后运行mq容器 docker run \-e RABBITMQ_DEFAULT_USER…

tag-字符串:数组拆分I

题目 给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) &#xff0c;使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 示例 题解一 class Solution:def arrayPairSum(self, nums: List[int]) …

@Test测试Mapper接口报错java.lang.NullPointerException

Test测试Mapper接口报错java.lang.NullPointerException 报错原因&#xff1a;没有注入依赖 解决方法&#xff1a;在测试类上面添加SpringBootTest

windows 环境下安装《车辆动态监控系统》支持JT808、JT1078、苏标主动安全设备接入

《车辆动态监控系统》下载安装部署包 开放端口 80/443/8800&#xff0c;web后台端口&#xff0c;nginx代理服务&#xff0c;nginx默认为8800端口8808&#xff0c;JT808专用端口6802&#xff0c;视频播放推流端口6891-6898&#xff0c;FTP端口6821&#xff0c;苏标主动安全附件…