vue 实现课程表甘特图

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 效果图

在这里插入图片描述

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

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

相关文章

微信小程序——页面跳转方法和场景用法总结

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

如何在APP开发中实现多平台兼容?

随着移动互联网的发展&#xff0c;各大 APP平台也如雨后春笋般崛起&#xff0c;现在市面上主流的 APP平台基本都已经支持 IOS、 Android、 WP等多个平台的开发&#xff0c;但对于一些只想专注于做一款 APP的企业来说&#xff0c;往往只能选择在一个平台开发一个 APP&#xff0c…

opencv hand openpose

使用opencv c 来调用caffemodel 使用opencv 得dnn 模块调用 caffemodel得程序&#xff0c;图片自己输入就行&#xff0c;不做过多得解释&#xff0c;看代码清单。 定义手指关节点 const int POSE_PAIRS[20][2] { {0,1}, {1,2}, {2,3}, {3,4}, // thumb {0,5}, {5,6}, {6,7}…

索引能优化查询,那么谈谈索引的优点和缺点?索引原理

面试必备&#xff1a;索引能优化查询&#xff0c;那么谈谈索引的优点和缺点?索引原理 简述&#xff1a; 优点: 第一&#xff0c;通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。 第二&#xff0c;可以大大加快数据的检索速度&#xff0c;这也是创建…

leetcode刷题常用代码片段

Vscode是常用的开发工具&#xff0c;代码插入能够把常见的代码嵌入智能提醒&#xff0c;减轻了很大的工作量&#xff0c;下面是我刷题的配置&#xff0c;直接复制黏贴到自己的cpp.json里就可以用了 左下角&#xff0c;打开设置&#xff0c;选择用户代码片段&#xff0c;选择自…

idea中Easy Code模版配置

首先找到模版位置 找到使用的模版&#xff0c;我用的是MybatisPlus-H,这是我新建的一个模版 controller.java.vm模版 ##导入宏定义 $!{define.vm}##设置表后缀&#xff08;宏定义&#xff09; #setTableSuffix("Controller")##保存文件&#xff08;宏定义&#xff…

Tensorflow(二)

一、过拟合 过拟合现象:机器对于数据的学习过于自负(想要将误差减到最小)。 解决方法:利用正规化方法 二、卷积神经网络(CNN) 卷积神经网络是近些年来逐渐兴起的人工神经网络&#xff0c;主要用于图像分类、计算机视觉等。 卷积:例如对图片每一小块像素区域的处理&#xff…

利用Stable diffusion Ai 制作艺术二维码超详细参数和教程

大家有没有发现最近这段时间网上出现了各种各样的AI艺术二维码&#xff0c;这种二维码的出现&#xff0c;简直是对二维码的“颠覆式创新”&#xff0c;直接把传统的二维码提升了一个维度&#xff01;作为设计师的我们怎么可以不会呢&#xff1f; 今天就教大家怎么制作这种超有艺…

Error: unknown flag: --export 【k8s,kubernets报错】

报错情况如下&#xff1a; [rootk8smaster ~]# kubectl get deploy nginx -oyaml --export > my2.yaml Error: unknown flag: --export See kubectl get --help for usage.原因&#xff1a; --export在所使用的版本中已被移除 解决&#xff1a;去除--export即可&#xff0c…

七、Kafka源码分析之网络通信

1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器&#xff0c;首先得从 Deque 里找到自己的目标分区&#xff0c;如果没有就新建一个批量消息 Deque 加进入 2、消…

微信小程序 Page页面

新建页面只需要在app.json配置好路径&#xff0c;编译器自动新增了页面 项目首页&#xff0c;在app.json哪个页面是第一位&#xff0c;哪个页面就是小程序首页

Java面试笔记

JAVA基础知识 语法结构 1.类 2.属性 3.方法 4.静态代码块 构造器 构造函数&#xff0c;构造类的对象&#xff0c;默认隐式&#xff0c;创建对象&#xff0c;先执行父类构造函数&#xff0c;再执行子类构造函数 父类的super必须在第一行 代码块 优先级最高&#xff0c;只…

3ds Max图文教程: 使用动态工具Mass FX 创建风铃动画

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 简单的场景设置 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 我将向您展示风铃背后的动态 通过简单的场景设置进行模拟。一旦你有了这个想法&#xff0c;你就可以应用这个 技术到复杂的风铃结构。 基…

pytest study

pytest 测试用例的识别与运行 测试文件&#xff1a;test_*.py 和 *_test.py 以test开头或结尾的文件 测试用例&#xff1a;Test*类包含的所有 test_*的方法&#xff08;测试类不能带有__init__方法&#xff09;&#xff0c; 不在class中的所有test_*的方法 def func(x):r…

我对牟长青分享的各个私董会数据分析

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 其实之前&#xff0c;我也想写一个关于各个草根社群的数据分析&#xff0c;但这样的文章容易得罪人&#xff0c;因为我一直喜欢直言不讳&#xff0c;所以一直没有动笔。例如&#xff0c;我在6月份写…

windows安装linux

https://www.cnblogs.com/liuqingzheng/p/16271895.html 咱们安装linux系统是centos7 准备工作&#xff1a; 安装软件&#xff1a;vmware -------虚拟机 官网下载地址&#xff1a;下载 VMware Workstation Pro | CN 也可以从这里面下载 链接&#xff1a;https://pan.bai…

Bugs记录

一、/usr/bin/ld: cannot find -l**** 参考&#xff1a;https://www.cnblogs.com/sakuraie/p/13341508.html 在ubuntu上安装软件时&#xff0c;经常出现这样的问题&#xff1a; /usr/bin/ld: cannot find -l**** 例如&#xff1a; /usr/bin/ld: cannot find -lcaffe 安装 需…

SIP视频对讲sip广播网关

SV-PA2是专门对行业用户需求研发的一款SIP音视频对讲&#xff0c;媒体流传输采用标准IP/RTP/RTSP协议。它很好的继承了锐科达话机稳定性好、电信级音质的优点&#xff0c;且完美兼容当下所有基于SIP的主流IPPBX/软交换/IMS平台,如Asterisk, Broadsoft, 3CX, Elastix 等。它集多…

uni-app接口请求封装

1.前言。 正所谓“工欲善其事必先利其器”&#xff0c;在vue-PC项目中&#xff0c;我们可以借助axios来封装对应的api接口请求&#xff08;ps&#xff1a;axios的接口请求封装&#xff09;。不过&#xff0c;如果是用uni-app开发小程序&#xff0c;那么又该如何借助uni-app自带…

了解Unity编辑器之组件篇Physics(四)

Physics&#xff1a;用于处理物理仿真和碰撞检测。它提供了一组功能强大的工具和算法&#xff0c;用于模拟真实世界中的物理行为&#xff0c;使游戏或应用程序更加真实和可信。 主要用途包括&#xff1a; 碰撞检测&#xff1a;Unity Physics 提供了高效的碰撞检测算法&#x…