vue 实现课程表甘特图

news2024/11/19 7:44:42

1 封装 components

<template>
	<view style="padding-bottom: 100rpx;">
		<view class="header flex_sb">
			<div class="header_list flex"  v-for="(item,index) in timeList" :key="item.value">
				<div>{{item.text}}</div>
				<div>{{item.value}}</div>
			</div>
		</view>
		<div class="left">
			<div class="box" v-for="(item,index) in dayTime" :key="index">
				<div class="left_list flex">
					<div style="color: #000;font-size: 30rpx;">{{index + 1}}</div>
					<div>{{item.startTime}}</div>
					<div>{{item.endTime}}</div>
				</div>
			</div>
		</div>
		<div class="content">
			<div class="week" v-for="(item,index) in courseData" :key="index">
				<div class="course_list" v-for="(course,courseIndex) in item" :key="courseIndex">
					<div class="course" :style="{height:(course.length * 150) + 'rpx',background:course.backgroundColor}" v-if="course.length > 0">
						{{course.name}}
					</div>
				</div>
			</div>
		</div>
	</view>
</template>

<script>
	export default {
		props:{
			data:{
				type:Array,
				default:() => []
			},
			palette:{
				type:Array,
				default:() => []
			},
			timeList:{
				type:Array,
				default:() => {
					return [{
						text:'星期',
						value:'日期'
					},{
						text:'周一',
						value:'02-02'
					},{
						text:'周二',
						value:'02-03'
					},{
						text:'周三',
						value:'02-04'
					},{
						text:'周四',
						value:'02-05'
					},{
						text:'周五',
						value:'02-06'
					},{
						text:'周六',
						value:'02-07'
					},{
						text:'周日',
						value:'02-08'
					}]
				}
			},
			dayTime:{
				type:Array,
				default:() => {
					return [{
							startTime:'08:10',
							endTime:'09:55'
						},{
							startTime:'09:05',
							endTime:'09:50'
						},{
							startTime:'10:10',
							endTime:'10:55'
						},{
							startTime:'11:05',
							endTime:'11:50'
						},{
							startTime:'14:00',
							endTime:'14:45'
						},{
							startTime:'14:55',
							endTime:'15:40'
						},{
							startTime:'16:00',
							endTime:'16:45'
						},{
							startTime:'16:55',
							endTime:'17:40'
						},{
							startTime:'18:10',
							endTime:'18:55'
						},{
							startTime:'17:05',
							endTime:'17:50'
						},{
							startTime:'20:10',
							endTime:'20:55'
						},{
							startTime:'21:05',
							endTime:'21:50'
						}]
				}
			}
		},
		data(){
			return {
				allPalette: [...this.palette,'#f05261', '#48a8e4', '#ffd061', '#52db9a',
					'#70d3e6', '#52db9a', '#3f51b5', '#f3d147', '#4adbc3', '#673ab7', 
					'#f3db49', '#76bfcd', '#b495e1', '#ff9800', '#8bc34a'],
			}
		},
		computed:{
			courseData(){
				/** 为数据标记背景颜色的函数 */
				let paletteIndex  = 0
				const getBackgroundColor = () => {
					const backgroundColor = this.allPalette[paletteIndex]
					paletteIndex++
					if(paletteIndex >= this.allPalette.length){
						paletteIndex = 0
					}
					return backgroundColor
				}
				
				/** 合并数据 */
				const listMerge = []
				this.data.forEach((list,i) => {
					if(!listMerge[i]) listMerge[i] = []
					list.forEach((item,index) => {
						if (!index) {
							return listMerge[i].push({ name: item, length: 1, backgroundColor: item === '' ? 'none' : getBackgroundColor() })
						}
						if (item === (listMerge[i][index - 1] || {}).name && item) {
						  const sameIndex = (listMerge[i][index - 1] || {}).sameIndex
						  if (sameIndex || sameIndex === 0) {
						    listMerge[i][sameIndex].length++
						    return listMerge[i].push({ name: item, length: 0, sameIndex: sameIndex })
						  }
						  listMerge[i][index - 1].length++
						  return listMerge[i].push({ name: item, length: 0, sameIndex: index - 1 })
						} else {
						  return listMerge[i].push({ name: item, length: 1, backgroundColor: item === '' ? 'none' : getBackgroundColor() })
						}
					})
				})
				return listMerge
			}
		}
	}
</script>

<style lang="scss">
	.header{
		position: relative;
		padding: 0 20rpx;
		font-size: 26rpx;
		&_list{
			flex-direction: column;
			height: 100rpx;
			font-weight: 600;
		}
	}
	.left{
		width: 100%;
		.box{
			width: 100%;
			&::after{
				content: "";
				position: absolute;
				left: 0;
				width: 100%;
				height: 1rpx;
				background: #999;
			}
		}
		&_list{
			flex-direction: column;
			height: 150rpx;
			color: #6a855c;
			font-size: 12rpx;
			width: 11%;
			background: #fae3f9;
		}
	}
	
	.content{
		position: relative;
		position: absolute;
		top: 100rpx;
		left: 88rpx;
		width: calc(100% - 88rpx);
		height: 100%;
		display: flex;
		.week{
			flex: 1;
			width: 0;
			flex-grow: 1;
			display: flex;
			flex-direction: column;
		}
		.course_list{
			word-break: break-all;
			color: white;
		}
		.course{
			border-radius: 10rpx;
			text-align: center;
			display: flex;
			justify-content: center;
			align-items: center;
			font-size: 16rpx;
			padding: 0 4rpx;
			width: 90%;
		}
	}
	
</style>

2 页面中使用

<template>
    <timetable :data="timetables"></timetable>
</template>

<script>
    import Timetable from '@/components/timetable.vue'
    export default {
		components:{Timetable},
        data() {
            return {
                timetables: [
                  ['大学英语', '大学英语', '大学英语', '', '', '', '毛概', '毛概', '', '', '', '选修'],
                  ['', '', '信号与系统', '信号与系统', '模拟电子技术基础', '模拟电子技术基础', '', '', '', '', '', ''],
                  ['大学体育', '大学体育', '形势与政策', '形势与政策', '', '', '', '', '', '', '', ''],
                  ['', '', '', '', '电装实习', '电装实习', '', '', '', '大学体育', '大学体育', ''],
                  ['', '', '数据结构与算法分析', '数据结构与算法分析', '', '', '', '', '信号与系统', '信号与系统', '', ''],
				  ['', '', '数据结构与算法分析', '数据结构与算法分析', '', '', '', '', '信号与系统', '信号与系统', '', ''],
				  ['', '', '数据结构与算法分析', '数据结构与算法分析', '', '', '', '', '信号与系统', '信号与系统', '', '']
                ]
            }
        }
    }
</script>

3 效果图

在这里插入图片描述

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

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

相关文章

CORS跨域资源共享漏洞

前置知识 跨域 域&#xff08;Domain&#xff09;是由三部分组成的标识&#xff1a;协议、域名和端口。 例如这两个ip就属于不同的域&#xff1a; http://example.com https://example.com 因为它们的协议不同&#xff08;一个是HTTP&#xff0c;另一个是HTTPS&#xff0…

2023百强县名单出炉!千亿县达54个

作为国民经济发展中的基本单元&#xff0c;县域经济发挥着重要作用。 赛迪顾问25日发布的《2023中国县域经济百强研究》&#xff08;下称“报告”&#xff09;显示&#xff0c;千亿县达54个&#xff0c;百强县前10名中江苏省独占6席。 在百强县前10名中&#xff0c;江苏省占席最…

Esp32_Arduino接入腾讯云笔记

ESP32是一款由乐鑫科技&#xff08;Espressif Systems&#xff09;推出的双核、低功耗、集成Wi-Fi和蓝牙的单芯片微控制器。它采用了Tensilica Xtensa LX6高性能处理器&#xff0c;具有大量的GPIO引脚、模数转换器、SPI、I2S、UART、PWM、I2C和SD卡接口等功能&#xff0c;可以满…

android 清除缓存方法

获得应用的存储信息 private void getAppStorageInfo(String packageName){StorageStatsManager storageStatsManager (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE);StorageManager storageManager (StorageManager) context.getSystemS…

第二十一章 数据处理篇:imgaug

参考教程&#xff1a; https://imgaug.readthedocs.io/en/latest/source/jupyter_notebooks.html 文章目录 概述针对图片的增强基础使用样例base class: augment增强的组合sequentialsomeof和oneofsometimes 增强的种类 针对关键点的增强针对包围框的增强 概述 imgaug是一个使…

【深度学习】GPT-3

2020年5月&#xff0c;OpenAI在长达72页的论文《https://arxiv.org/pdf/2005.14165Language Models are Few-Shot Learners》中发布了GPT-3&#xff0c;共有1750亿参数量&#xff0c;需要700G的硬盘存储&#xff0c;(GPT-2有15亿个参数)&#xff0c;它比GPT-2有了极大的改进。根…

PX4常见解锁失败报错及解决方法

文章目录 一、Kill switch engagen二、电源检查CBRK_SUPPLY_CHK三、USB连接检查CBRK_USB_CHK四、安全开关检查CBRK_IO_SAFETY五、high Accelerometer bios六、high gyro bios七、compasss inconsistent八、GPS报错九、Accels inconsistent十、偏航角一直漂移十一、PREFLIGHT FA…

同步编程和异步编程的区别

我在这里用几个例子&#xff08;附带图文&#xff09;给你们讲解一下&#xff0c;具体区别。 第一个例子 一、同步 执行步骤&#xff1a; step1 》 step2 》step3 先打印 hello moon&#xff0c; 再打印图片&#xff0c; 等待图片打印完&#xff0c;再打印 hello Jupiter …

全国青少年信息素养大赛Scratch图形化编程_初赛_模拟一卷

全国青少年电子信息智能创新大赛Scratch图形化编程_初赛_模拟一卷 一、选择题 第 1 题 单选题 能让角色在整个舞台范围内的任意位置出现的程序是&#xff1f;&#xff08; &#xff09; A. B. C. D. 第 2 题 单选题 猫抓老鼠游戏的封面上有“开始”按钮和“游戏规则”两…

实战:Docker+Jenkins+Gitee构建CICD流水线

文章目录 前言Jenkins部署创建Jenkins docker-compose配置maven源启动Jenkins容器安装插件Gitee ssh公匙配置与测试项目提交 Jenkins创建流水线写在最后 前言 持续集成和持续交付一直是当下流行的开发运维方式&#xff0c;CICD省去了大量的运维时间&#xff0c;也能够提高开发…

Windows环境部署安装Chatglm2-6B-int4

chatglm2-6B是最近比较火爆的大模型&#xff0c;可以在消费级显卡上部署使用&#xff0c;适合学习。但是一般人也不一定有那么高的硬件配置&#xff0c;所以部署个int4版本应该是大多数人的最好选择。我就在家里部署起了int4版本的chatglm2-6B&#xff0c;记录一下免得忘了。 …

Docker资源限制

Docker资源限制 一、cpu资源控制1、 设置cpu使用率上限2、设置cpu资源占用比&#xff08;设置多个容器时才有效&#xff09;3、设置容器绑定指定的CPU 三、内存资源控制四、磁盘IO配额控制1、限制Block IO2、限制bps和iops进行限制 一、cpu资源控制 cgroups是一个非常强大的li…

VMware虚拟机无法自动获取IP地址的解决办法

安装好虚拟机后&#xff0c;网络是ok的&#xff0c;但是关机后&#xff0c;再次开启就不能用了。网上找了好多方法&#xff0c;都不管用&#xff0c;最后恢复默认设置搞定了&#xff0c;实在没办法的可以试一试

【致敬未来的攻城狮计划】第3期 作业汇总贴 + 获奖公布(文末荐书)

目录 一、写在前面 二、种子学员介绍 三、作业贴汇总 四、小小总结 五、获奖公布 六、学员有话说 七、特别致谢 八、友情荐书 一、写在前面 时间过得真快&#xff0c;距离 【致敬未来的攻城狮计划】第3期 的发起&#xff0c;已经过去有些时间了&#xff0c;让我们一起…

FileHub使用教程:Github Token获取步骤,使用快人一步

FileHub介绍 filehub是我开发的一个免费文件存储软件&#xff0c;可存万物。软件仓库&#xff1a;GitHub - Sjj1024/s-hub: 一个使用github作为资源存储的软件 软件下载地址&#xff1a;。有问题可以留言或者提Issue&#xff0c; 使用第一步&#xff1a;获取Github Token 使…

苹果手机充电充不进去什么原因?2023最新解决方法!

最近新买了一部苹果手机&#xff0c;才开心没两天呢&#xff0c;今天突然就发现苹果手机充电充不进了&#xff0c;这是为什么呢&#xff1f;有没有朋友知道呀&#xff1f;” 苹果手机作为目前年轻人比较喜欢的一款手机&#xff0c;也渐渐走进我们的生活。但在使用苹果手机时&am…

windows下载安装nvm并使用安装node

nvm安装 NVM&#xff08;Node Version Manager&#xff09;是一个用于管理 Node.js 版本的工具&#xff0c;可以在同一台计算机上安装和切换不同版本的 Node.js 1.官网下载 官网&#xff1a;https://github.com/coreybutler/nvm-windows/releases 2.安装步骤 解压后点击e…

网访问内网机器:基于frp的内网穿透

随缘更新些我自己的博客网站里的文章吧 因为经常需要远程访问自己的机器&#xff0c;所以写一个博客记录一下 公网访问内网机器&#xff1a;基于frp的内网穿透 从公网中访问自己的私有设备向来是一件难事儿。 1. 为什么需要内网穿透&#xff1f; A. 计算机网络 如何在自己的机…

【Lua学习笔记】Lua进阶——Table,迭代器

文章目录 官方唯一指定数据结构--tabletable的一万种用法字典和数组 迭代器ipairs()pairs() 回到Table 在【Lua学习笔记】Lua入门中我们讲到了Lua的一些入门知识点&#xff0c;本文将补充Lua的一些进阶知识 官方唯一指定数据结构–table 在上篇文章的最后&#xff0c;我们指出…

【windows】连接共享打印机提示:0x0000011B

【问题现象】 添加共享打印机的时候&#xff0c; 提示错误&#xff1a;0x0000011B。 【解决方法】 按winr键&#xff0c;在运行输入regedit 然后在注册表中找到路径&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print 打开后&#xff0c;在右侧…