vue3+ts+elementui制作精美的课表

news2024/11/24 8:29:19

使用vue3+ts+elementui 如何制作出精美的课表呢,

最终效果图如下:

 

直接上代码:

这里直接把封装成一个课表的组件:

<script setup lang="ts">
import { ref, watch, onMounted } from "vue";
import IconText from "@/views/common/IconText.vue";
import {
  Timer,
  Location,
  HomeFilled,
  UserFilled
} from "@element-plus/icons-vue";
const props = defineProps({
  //下午节次数
  afternoonLength: {
    type: [Number],
    default: 4
  },
  // 总节次
  length: {
    type: [Number],
    default: 12
  },
  //课表数据
  events: {
    type: Array<any>,
    default: null
  }
});
const tableCellStyle = ({ row, column }) => {
  if (row[column.property].title !== undefined) {
    //return { color: "#FFFFFF", "text-align": "center" };
    if (row[column.property].type === 1) {
      return {
        "background-color": "#2B65EC",
        "border-radius": "10px",
        color: "#fff"
      };
    } else if (row[column.property].type === 2) {
      return {
        "background-color": "#7F38EC",
        "border-radius": "10px",
        color: "#fff"
      };
    }
  }
};
// let maxHeight = 400;
const timetable = ref([]);
const makeTimetable = () => {
  timetable.value = [];
  for (let i = 0; i < props.length; i++) {
    const one = {
      sjd: "",
      jc: i + 1,
      mon: {},
      tue: {},
      wed: {},
      thu: {},
      fri: {},
      sat: {},
      sun: {}
    };
    if (i < 4) {
      one.sjd = "上午";
    } else if (i > 3 && i < props.afternoonLength + 4) {
      one.sjd = "下午";
    } else {
      one.sjd = "晚上";
    }
    timetable.value.push(one);
  }
};
const weeks = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
const mergeData = () => {
  // 合并数据
  if (props.events.length > 0) {
    for (let i = 0; i < props.events.length; i++) {
      // 获取星期几
      const week = weeks[props.events[i].xq - 1];
      timetable.value[props.events[i].start - 1][week] = props.events[i];
    }
  }
};

const objectSpanMethod = ({ row, rowIndex, columnIndex }) => {
  if (columnIndex === 0) {
    if (rowIndex < 4) {
      if (rowIndex === 0) {
        return {
          rowspan: 4,
          colspan: 1
        };
      } else {
        return {
          rowspan: 0,
          colspan: 0
        };
      }
    } else if (rowIndex > 3 && rowIndex < 4 + props.afternoonLength) {
      if (rowIndex === 4) {
        return {
          rowspan: props.afternoonLength,
          colspan: 1
        };
      } else {
        return {
          rowspan: 0,
          colspan: 0
        };
      }
    } else {
      if (rowIndex === 4 + props.afternoonLength) {
        return {
          rowspan: props.length - 4 - props.afternoonLength,
          colspan: 1
        };
      } else {
        return {
          rowspan: 0,
          colspan: 0
        };
      }
    }
  }
  if (columnIndex === 2) {
    if (row.mon.title !== undefined) {
      return {
        rowspan: row.mon.end - row.mon.start + 1,
        colspan: 1
      };
    } else {
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  }
  if (columnIndex === 3) {
    if (row.tue.title !== undefined) {
      return {
        rowspan: row.tue.end - row.tue.start + 1,
        colspan: 1
      };
    } else {
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  }
  if (columnIndex === 4) {
    if (row.wed.title !== undefined) {
      return {
        rowspan: row.wed.end - row.wed.start + 1,
        colspan: 1
      };
    } else {
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  }
  if (columnIndex === 5) {
    if (row.thu.title !== undefined) {
      return {
        rowspan: row.thu.end - row.thu.start + 1,
        colspan: 1
      };
    } else {
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  }
  if (columnIndex === 6) {
    if (row.fri.title !== undefined) {
      return {
        rowspan: row.fri.end - row.fri.start + 1,
        colspan: 1
      };
    } else {
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  }
  if (columnIndex === 7) {
    if (row.sat.title !== undefined) {
      return {
        rowspan: row.sat.end - row.sat.start + 1,
        colspan: 1
      };
    } else {
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  }
  if (columnIndex === 8) {
    if (row.sun.title !== undefined) {
      return {
        rowspan: row.sun.end - row.sun.start + 1,
        colspan: 1
      };
    } else {
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  }
};
makeTimetable();
onMounted(() => {
  // maxHeight = document.documentElement.clientHeight;
  mergeData();
});
watch(
  props,
  (_newValue, _oldValue) => {
    mergeData();
  },
  { immediate: true, deep: true }
);
</script>

<template>
  <div>
    <div class="panel">
      <el-table
        :data="timetable"
        :border="true"
        :span-method="objectSpanMethod"
        :header-cell-style="{
          background: '#d9e5fd',
          color: 'black',
          fontWeight: 1000
        }"
        style="width: 100%"
        :cell-style="tableCellStyle"
      >
        <el-table-column prop="sjd" label="时间段" width="80" align="center" />
        <el-table-column prop="jc" label="节次" width="80" align="center" />
        <el-table-column prop="mon" label="星期一" align="left">
          <template v-slot="scope">
            <div v-if="scope.row.mon.title !== undefined">
              <h4>
                {{ scope.row.mon.title.toString().split(';').join('<br />') }}
              </h4>
              <h5><IconText :icon="Timer" :text="scope.row.mon.skjc" /></h5>
              <h5><IconText :icon="Location" :text="scope.row.mon.addr" /></h5>
              <h5>
                <IconText :icon="HomeFilled" :text="scope.row.mon.jxbzc" />
              </h5>
              <h5><IconText :icon="UserFilled" :text="scope.row.mon.num" /></h5>
            </div>
            <div v-else />
          </template>
        </el-table-column>
        <el-table-column prop="tue" label="星期二" align="left">
          <template v-slot="scope">
            <div v-if="scope.row.tue.title !== undefined">
              <h4>{{ scope.row.tue.title }}</h4>
              <h5><IconText :icon="Timer" :text="scope.row.tue.skjc" /></h5>
              <h5><IconText :icon="Location" :text="scope.row.tue.addr" /></h5>
              <h5>
                <IconText :icon="HomeFilled" :text="scope.row.tue.jxbzc" />
              </h5>
              <h5><IconText :icon="UserFilled" :text="scope.row.tue.num" /></h5>
            </div>
            <div v-else />
          </template>
        </el-table-column>
        <el-table-column prop="wed" label="星期三" align="left">
          <template v-slot="scope">
            <div v-if="scope.row.wed.title !== undefined">
              <h4>{{ scope.row.wed.title }}</h4>
              <h5><IconText :icon="Timer" :text="scope.row.wed.skjc" /></h5>
              <h5><IconText :icon="Location" :text="scope.row.wed.addr" /></h5>
              <h5>
                <IconText :icon="HomeFilled" :text="scope.row.wed.jxbzc" />
              </h5>
              <h5><IconText :icon="UserFilled" :text="scope.row.wed.num" /></h5>
            </div>
            <div v-else />
          </template>
        </el-table-column>
        <el-table-column prop="thu" label="星期四" align="left">
          <template v-slot="scope">
            <div v-if="scope.row.thu.title !== undefined">
              <h4>
                <span
                  v-html="
                    scope.row.thu.title.toString().split(';').join('<br />')
                  "
                />
              </h4>
              <h5><IconText :icon="Timer" :text="scope.row.thu.skjc" /></h5>
              <h5><IconText :icon="Location" :text="scope.row.thu.addr" /></h5>
              <h5>
                <IconText :icon="HomeFilled" :text="scope.row.thu.jxbzc" />
              </h5>
              <h5><IconText :icon="UserFilled" :text="scope.row.thu.num" /></h5>
            </div>
            <div v-else />
          </template>
        </el-table-column>
        <el-table-column prop="fri" label="星期五" align="left">
          <template v-slot="scope">
            <div v-if="scope.row.fri.title !== undefined">
              <h4>{{ scope.row.fri.title }}</h4>
              <h5><IconText :icon="Timer" :text="scope.row.fri.skjc" /></h5>
              <h5><IconText :icon="Location" :text="scope.row.fri.addr" /></h5>
              <h5>
                <IconText :icon="HomeFilled" :text="scope.row.fri.jxbzc" />
              </h5>
              <h5><IconText :icon="UserFilled" :text="scope.row.fri.num" /></h5>
            </div>
            <div v-else />
          </template>
        </el-table-column>
        <el-table-column prop="sat" label="星期六" align="left">
          <template v-slot="scope">
            <div v-if="scope.row.sat.title !== undefined">
              <h4>{{ scope.row.sat.title }}</h4>
              <h5><IconText :icon="Timer" :text="scope.row.sat.skjc" /></h5>
              <h5><IconText :icon="Location" :text="scope.row.sat.addr" /></h5>
              <h5>
                <IconText :icon="HomeFilled" :text="scope.row.sat.jxbzc" />
              </h5>
              <h5><IconText :icon="UserFilled" :text="scope.row.sat.num" /></h5>
            </div>
            <div v-else />
          </template>
        </el-table-column>
        <el-table-column prop="sun" label="星期日" align="left">
          <template v-slot="scope">
            <div v-if="scope.row.sun.title !== undefined">
              <h4>{{ scope.row.sun.title }}</h4>
              <h5><IconText :icon="Timer" :text="scope.row.sun.skjc" /></h5>
              <h5><IconText :icon="Location" :text="scope.row.sun.addr" /></h5>
              <h5>
                <IconText :icon="HomeFilled" :text="scope.row.sun.jxbzc" />
              </h5>
              <h5><IconText :icon="UserFilled" :text="scope.row.sun.num" /></h5>
            </div>
            <div v-else />
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>
<style scoped lang="scss">
.cellStyle {
  background-color: rgb(24 144 255 / 80%);
  color: #fff;
  border-radius: 10px;
}
</style>

引用timetable组件:

 

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

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

相关文章

Fortinet FortiOS 7.4.0 (FortiGate VM deployment Images) - 混合架构防火墙

Fortinet FortiOS 7.4.0 (FortiGate VM deployment Images) - 混合架构防火墙 下一代防火墙 (NGFW)、虚拟化 NGFW 和云原生防火墙 请访问原文链接&#xff1a;https://sysin.org/blog/fortios-7/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…

MySQL表的增删改查(数据库系列3)

目录 前言&#xff1a; 1.CRUD的解释 2.表的基本操作 2.1查看数据表 2.2创建表 2.3查看指定表的表结构 2.4删除表 2.5注释 3.新增&#xff08;Create&#xff09; 4.查询&#xff08;Retrieve&#xff09; 4.1全列查询 4.2指定列查询 4.3查询字段为表达式 4.4指定…

Linux_Linux基本指令(1)

目录 一、ls指令 二、pwd命令 三、cd指令 四、touch指令 五、mkdir指令 六、rmdir指令&&rm指令 一、ls指令 语法&#xff1a;ls [选项][目录或文件] 对于目录&#xff0c;ls指令是用来列出目录下的所有子目录与文件。对于文件&#xff0c;则是列出文件名及其他信…

zabbix 安装 踩坑记录与解决方案

博主首次安装 zabbix 时&#xff0c;出现了一些错误&#xff0c;特此记录一下&#xff0c;希望帮助到一些 Zabbix freshman. 参考其他博客安装 zabbix 时&#xff0c;运行到如下command 安装zabbix 相关组件出现如下Error: apt installzabbix-server-mysql zabbix-frontend-p…

154个Bug!

持续测试了一个月的H5项目&#xff0c;终于迎来了上线日&#xff0c;在测试H5的过程中&#xff0c;遇到了一些坑&#xff0c;积累了些许经验&#xff0c;想着分享一下&#xff0c;希望对大家有所启发。 主要从以下一个方面展开&#xff1a; 一、项目背景 二、测试环境准备 三…

专项练习18

目录 一、选择题 1、下列选项中&#xff0c;&#xff08;&#xff09;不是网页中的事件 2、下面有关浏览器中使用js跨域获取数据的描述&#xff0c;说法错误的是&#xff1f; 3、请问以下程序的输出是 4、以下哪一项不属于浏览器Response Headers字段&#xff1a; 一、选择题 …

IDEA中集成zookeeper的插件

IDEA中集成zookeeper的插件 一、IDEA中集成插件 搜索插件并安装&#xff1a; 安装完成&#xff0c;重启IDEA 配置zk集群 连接成功

beego 跨域问题处理

这几台在搞前端与后端分离设计&#xff08;之前没接触过&#xff0c;前端vueelementUI&#xff0c; 后端Beego框架&#xff09;&#xff0c;前端要使用到后端数据时&#xff0c;向发送对应的请求&#xff0c;发现提示跨域访问失败&#xff0c;于是需要配置后端支持跨域访问&…

@RequestBody接收不到前端传递过来的json数据

uniRequest.post(/orderParking,{parkingRecord:this.ParkingRecord})我刚开始只是写RequestBody ParkingRecord parkingRecord 一直获取的都是null, 直到用了Map标签才终于获取到参数了 RequestMapping(value "/orderParking",produces"application/json"…

Linux:ssh配置

环境 内网win10 192.168.25.1 服务器centos 内-192.168.25.11 外-192.168.254.11 外网服务器 192.168.254.10 服务名称为&#xff1a;sshd 默认端口号为&#xff1a;22 rpm -qc openssh-server.x86_64 # 查看配置文件 *服务端主程序&#xff1a;/usr/s…

git push origin masterEverything up-to-date解决方法

按住这个看一下很简单的问题&#xff0c;我在网上看了很多就是没找到能用的&#xff0c;最后找到了这个看起来写的很简单的一个文章&#xff0c;但他写的真的有用。 出现的问题 解决步骤第一步 git add . 第二步 git commit -m “message” 第三步 git push origin master…

python代码练习:石头剪刀布猜拳游戏

python代码练习&#xff1a;石头剪刀布猜拳游戏 题目结果展示源代码 题目 使用Python实现人机石头剪刀布猜拳小游戏&#xff0c;并且最后能够统计分数和局数 结果展示 源代码 # -*- coding: utf-8 -*- # Course : python 基础 # Time : 2023/7/2 14:21 # Author : Eden Wei …

7.2.2 【Linux】实体链接与符号链接:ln

在Linux下面的链接文件中有两种&#xff0c;一种是类似Windows的捷径功能的文件&#xff0c;可以快速链接到目标文件&#xff08;或目录&#xff09;&#xff1b;另一种是通过文件系统的inode链接来产生新文件名&#xff0c;而不是产生新文件。这种称为实体链接&#xff08;har…

【webrtc】nack学习笔记

本文大量参考了以下大神的文章,表示感谢:WebRTC 中的NackWebRTC之视频NackModuleWebRtc Video Receiver(三)-NACK丢包重传原理适用场景 Nack , 即丢包重传,在RTT小的情况下,是非常有效的错误恢复手段一般接收端会维护一个列表,用于记录收到的包的序列号,一般这个列表的长…

道路车辆 功能安全第1部分:术语

前言 本文件按照GB/T 1.1—2020《标准化工作导则 第1部分&#xff1a;标准化文件的结构和起草规则》的规定起草。 GB/T 34590-XXXX《道路车辆 功能安全》分为以下部分&#xff1a; —— 第1部分&#xff1a;术语&#xff1b; —— 第2部分&#xff1a;功能安全管理&#xff1b;…

【JUC进阶】09. 关于锁升级

目录 1、前言 2、回顾 2.1、对象头和内存布局 2.2、四大锁回顾 3、状态转换 3.1、锁状态 3.1.1、无锁状态 3.1.2、偏向锁状态 3.1.3、轻量级锁状态 3.1.4、重量级锁状态 3.2、状态转换条件 3.2.1、无锁 -> 偏向锁 3.2.2、偏向锁 -> 无锁 3.2.3、偏向锁 -&g…

SAP 查询字段所存在的表(增强定义)

T-CODE——axtshow DATA:lv_zzbranch TYPE ze_les_branch, ls_aet088 TYPE zlesaet088_bol_attr, lr_adminh TYPE REF TO cl_crm_bol_entity. lr_entity_relationv TYPE REF TO cl_crm_bol_entity. lr_entity_relationv lr_adminh->get_related_entity( …

15. 查询所有用户的连续登录两天及以上的日期区间

文章目录 题目需求思路一实现一题目来源 题目需求 从登录明细表&#xff08;user_login_detail&#xff09;中查询出&#xff0c;所有用户的连续登录两天及以上的日期区间&#xff0c;以登录时间&#xff08;login_ts&#xff09;为准。 期望结果如下&#xff1a; user_id (…

C#与C++编程环境对比:优点与应用场景详解

C#与C是两种常用的编程语言&#xff0c;它们在编程环境方面有一些相同点和不同点。首先&#xff0c;它们都可以用于开发跨平台的应用程序。其次&#xff0c;它们都具有强大的面向对象编程能力。但是&#xff0c;它们在语法、性能和应用领域等方面存在一些不同点 。 在语法方面…

编织魔法:探索Python字符串的奇幻世界

文章目录 前言什么是 python 字符串通过下标(索引)来访问字符串中的字符字符串的切片操作字符串常用的方法find() 查找子串index() 查找子串rfind() / rindex()count() 返回某个子串在字符串中出现的次数replace() 替换split() 按照指定字符分割字符串join() 用一个字符或者子串…