【vue】晋升路线图、蛇形进度条

一、效果图(参考链接)

在这里插入图片描述

代码实现

<template><div class="only-content"><h1 class="text-center my-3">讲师晋升路线</h1><!--时间轴线显示--><div class="time-line"><div class="every-block" v-for="(item, index) in closeLevelList" :key="index":style="item.type === 0? 'float: left;' + 'width:' + item.width + '%;': item.type === 1? 'float: right;' + 'width:' + item.width: item.type === 2? 'float: right;' + 'width:' + item.width + '%;': 'float: left;' + 'width:' + item.width + '%;'"style="height: 200px"><!-- 右方向的时间轴 --><div class="identical to-right" v-if="item.type === 0"><!-- 序号 --><div class="step" :style="'border: 2px dashed' + item.background"><span v-if="item.levelSort < 10" :style="{ color: item.color }">0{{ item.levelSort }}</span><span v-else :style="{ color: item.color }">{{ item.levelSort}}</span></div><!--时间线--><div class="class-line" :style="'background:' + item.background"></div><!--结束箭头--><div class="end-arrow" v-if="closeLevelList.length === index + 1":style="'border-color: transparent transparent transparent' + item.background"></div><!--方向箭头--><div class="small-arrow-left" v-if="closeLevelList.length !== index + 1"></div><div class="small-arrow-right" v-if="closeLevelList.length !== index + 1"></div></div><!--右回转空心半圆环--><div class="right-box" v-if="item.type === 1"><div class="big-circular" :style="'background:' + item.background"><div class="small-circular"></div></div><!--结束箭头--><div :class="allTeacherLevelList.length % 3 > 0 ? 'end-arrow' : 'end-arrow2'" v-if="closeLevelList.length === index + 1":style="'border-color: transparent' +' ' +item.background +' ' +'transparent transparent'"></div></div><!-- 左方向的时间轴 --><div class="identical to-left" v-if="item.type === 2"><!-- 序号 --><div class="step" :style="'border: 2px dashed' + item.background"><span v-if="item.levelSort < 10" :style="{ color: item.color }">0{{ item.levelSort }}</span><span v-else :style="{ color: item.color }">{{item.levelSort}}</span></div><!--时间线--><div class="class-line" :style="'background:' + item.background"></div><!--结束箭头--><div class="end-arrow" v-if="closeLevelList.length === index + 1":style="'border-color: transparent' +' ' +item.background +' ' +'transparent transparent'"></div><!--反向箭头--><div class="small-arrow-left" v-if="closeLevelList.length !== index + 1"></div><div class="small-arrow-right" v-if="closeLevelList.length !== index + 1"></div></div><!--左回转空心半圆环--><div class="left-box" v-if="item.type === 3"><div class="big-circular" :style="'background:' + item.background"><div class="small-circular"></div></div><!--结束箭头--><div :class="allTeacherLevelList.length % 6 > 0 ? 'end-arrow' : 'end-arrow2'" v-if="closeLevelList.length === index + 1":style="'border-color: transparent transparent transparent' +item.background"></div></div><!-- 更多信息 --><div class="info" v-if="item.type == 0 || item.type == 2"><div class="flex-center"><span class="name" :style="{ color: item.color }">{{item.name}}</span><div class="level" v-if="item.currentFlag"><i class="el-icon-location"></i><span style="margin-left: 3px">我的级别</span></div></div><div class="my" :style="{ color: item.color }">在线课程数 {{ item.ocNum }}</div><div class="rule cursor" :style="{ backgroundColor: item.background }" @click="toDetail(item)">规则详情</div></div></div><div class="clear"></div></div></div>
</template><script>
import { parse, stringify } from '@/utils/index.js';
export default {name: 'PromoteRoad',data() {return {allTeacherLevelList: [], // 所有的数据closeLevelList: [], // 深克隆后的数据};},created() {this.getAllTeacherLevelList();},methods: {// 处理数据handleClassData() {let typeIndex = 0; // 类型标记let addLength = 0; // 赋值前叠加的总长度let otherLength = 0; // 赋值后叠加的总长度let moreThanPlan = []; // 每行结尾多于出的集合let currentIndex = this.allTeacherLevelList.findIndex(item => item.currentFlag == 1); // 当前级别的索引this.allTeacherLevelList.forEach((value, index) => {// 根据级别显示不同的颜色条if(value.levelSort === 1) {value.background = '#005a8b';}else if(value.levelSort === 2) {value.background = '#4a9ac4';}else if(value.levelSort === 3) {value.background = '#6aa342';}else if(value.levelSort === 4) {value.background = '#becd10';}else if(value.levelSort === 5) {value.background = '#f0c502';}else if(value.levelSort === 6) {value.background = '#e98a24';}else if(value.levelSort === 7) {value.background = '#ee878e';}else if(value.levelSort === 8) {value.background = '#d92c29';}else if(value.levelSort === 9) {value.background = '#ce1a70';}else if(value.levelSort === 10) {value.background = '#882161';}// 当前级别和之前的级别置灰if(index <= currentIndex) {value.isApplication = 1;value.background = '#efefef';value.color = '#ccc';}else {value.isApplication = 0;}let moreThan = {}; // 每行结尾多于出的数据addLength = addLength + 40; // 叠加每个数据的长度value.width = 100 / 3; // 每段的长度// 根据总的长度来判断是否大于100%if(addLength < 100) {value.type = typeIndex; // 分类的类型(1—从左往右;2—右半圆弧;3—从右往左;4—左半圆弧)otherLength = otherLength + value.width;}else {value.width = 100 - otherLength;value.type = typeIndex;typeIndex++;// 处理每行结尾多于出长度的数据moreThan = parse(stringify(value));moreThan.width = 0;moreThan.type = typeIndex;moreThanPlan.push(moreThan);typeIndex++;if(typeIndex === 4) {typeIndex = 0;}addLength = 0;otherLength = 0;}});// 处理后的数据集合let allTimeListData = this.sorts(this.allTeacherLevelList, moreThanPlan);// 深克隆数据this.closeLevelList = parse(stringify(allTimeListData));},// 循环排序(将每行多于长度的数据插入原数组)sorts(initArr, insertArr) {let arr = initArr.concat(); // 拷贝数组initArr.forEach((value, index) => {insertArr.forEach((val, ind) => {if(value.id == val.id) {// 判断值相同  插入let idx = [];arr.forEach((data, tt) => {if(data.id == val.id) {idx.push(tt); // 获取所有相同值得下标数组}});arr.splice(idx[idx.length - 1] + 1, 0, val); // 取最后相同值插入数据}});});return arr;},// 获取数据getAllTeacherLevelList() {this.$api.teacher.getAllTeacherLevelList().then(res => {this.allTeacherLevelList = res;this.handleClassData();});},// 跳转详情toDetail(data) {this.$router.push({path: '/frontend/promotionRule/detail',query: { id: data.id, isApplication: data.isApplication },});},},
};
</script>
<style scoped lang="scss">
.only-content {width: 100%;height: 100%;font-size: 12px;background-color: #fff;.clear {clear: both;}/*蛇形道样式*/.time-line {padding: 20px 120px;.every-block {position: relative;.identical {position: relative;}// 从左向右的方向直线样式.to-right {position: relative;/*颜色线样式*/.class-line {width: 100%;height: 25px;border-right: 1px solid #ccc;}/*结束箭头样式*/.end-arrow {position: absolute;bottom: -6px;right: -36px;width: 0;height: 0;border: 18px solid;}/*方向箭头样式*/.small-arrow-left {z-index: 20;position: absolute;bottom: 10px;right: 0;float: left;width: 8px;height: 4px;background-color: #fff;}.small-arrow-right {z-index: 20;position: absolute;bottom: 6px;right: -12px;float: left;width: 0;height: 0;border: 6px solid;border-color: transparent transparent transparent #fff;}}// 从右向左的方向直线样式.to-left {position: relative;/*颜色线样式*/.class-line {height: 25px;border-right: 1px solid #ccc;position: relative;}/*结束箭头样式*/.end-arrow {position: absolute;bottom: -6px;left: -36px;width: 0;height: 0;border: 18px solid;}/*方向箭头样式*/.small-arrow-left {z-index: 20;position: absolute;bottom: 10px;left: 0;float: left;width: 8px;height: 4px;background-color: #fff;}.small-arrow-right {z-index: 20;position: absolute;bottom: 6px;left: -12px;float: left;width: 0;height: 0;border: 6px solid;border-color: transparent #fff transparent transparent;}}// 左空心半圆样式.left-box {position: relative;top: 0px;left: -110px;.big-circular {float: left;width: 110px;height: 225px;-webkit-border-radius: 125px 0 0 125px;position: relative;.small-circular {width: 80px;height: 175px;background-color: #fff;-webkit-border-radius: 80px 0 0 80px;position: absolute;right: 0px;top: 25px;}}/*结束箭头样式*/.end-arrow {position: absolute;bottom: -128px;right: -96px;width: 0;height: 0;border: 18px solid;}.end-arrow2 {position: absolute;top: 195px;left: 110px;width: 0;height: 0;border: 18px solid;}}// 右空心半圆样式.right-box {position: relative;top: 0px;right: -110px;.big-circular {float: right;width: 110px;height: 225px;-webkit-border-radius: 0 125px 125px 0;position: relative;.small-circular {width: 80px;height: 175px;background-color: #fff;-webkit-border-radius: 0 80px 80px 0;position: absolute;left: 0;top: 25px;}}/*结束箭头样式*/.end-arrow {position: absolute;bottom: -128px;left: -96px;width: 0;height: 0;border: 18px solid;}.end-arrow2 {position: absolute;top: 195px;right: 110px;width: 0;height: 0;border: 18px solid;}}}}
}
.step {position: absolute;top: 50%;left: 50%;z-index: 999;transform: translate(-50%, -50%);height: 60px;width: 60px;background-color: #fff;text-align: center;line-height: 60px;font-size: 26px;border-radius: 100%;
}
.info {position: absolute;top: 50%;left: 50%;z-index: 999;transform: translate(-50%, -50%);.name {font-size: 16px;font-weight: bold;margin-right: 15px;}.level {font-size: 14px;color: #2a55f6;}.rule {font-size: 14px;text-align: center;padding: 3px;border-radius: 20px;margin-top: 10px;color: #fff;}
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定&#xff0c;或者多只相机固定位置拍图&#xff0c;硬拷贝拼图&#xff0c;采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照&#xff0c;相机视野互相重叠&#xff0c;基于Patmax特征定位后&#xff0c;无缝 拼图&#xff…

vue2项目报错You may need an appropriate loader to handle this file type

npm run 运行 vue2 项目时报错如下&#xff1a; error in ./node_modules/quill/formats/blockquote.jsModule parse failed: Unexpected token (3:18) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this …

Cyber Security 101-Web Hacking-Burp Suite: The Basics(Burp Suite:基础知识)

使用 Burp Suite 进行 Web 应用程序渗透测试的简介。 任务1&#xff1a;介绍 欢迎来到 Burp Suite Basics&#xff01; 这个特定的房间旨在了解 Burp Suite Web 应用程序安全测试框架的基础知识。我们的重点将围绕 以下关键方面&#xff1a; Burp Suite 的全面介绍。全面概述…

基于Informer网络实现电力负荷时序预测——cross validation交叉验证与Hyperopt超参数调优

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

【计算机网络】课程 实验二 交换机基本配置和VLAN 间路由实现

实验二 交换机基本配置和VLAN 间路由实现 一、实验目的 1&#xff0e;了解交换机的管理方式。 2&#xff0e;掌握通过Console接口对交换机进行配置的方法。 3&#xff0e;掌握交换机命令行各种模式的区别&#xff0c;能够使用各种帮助信息以及命令进行基本的配置。 4&…

MySQL入门学习笔记

第一章 数据库系统概述 数据库的4个基本概念 数据、数据库、数据库管理系统、数据库系统是与数据库技术密切相关的4个基本概念 数据 数据是数据库中存储的基本对象&#xff0c;描述事物的符号记录称为数据&#xff0c;数据的表现形式还不能完全表达其内容&#xff0c;需要…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

海外云服务器能用来做什么?

海外云服务器不仅服务种类繁多&#xff0c;而且能满足多行业的需求&#xff0c;方便了越来越多的企业与个人。本文将探讨海外云服务器的核心服务及其适用领域&#xff0c;帮助企业更好地了解这一技术资源。 云存储&#xff1a;安全高效的数据管理 海外云服务器为用户提供了稳定…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

基于物联网的冻保鲜运输智能控制系统

基于物联网的冻保鲜运输智能控制系统设计文档 1. 项目开发背景 随着全球化贸易的发展&#xff0c;冷链物流在现代运输行业中扮演着日益重要的角色。尤其是冻品、食品、药品等对运输环境有着严格要求的货物&#xff0c;其运输过程中温度、湿度等环境参数必须严格控制&#xff…

资源分享:gpts、kaggle、paperswithcode

gpts 似乎是gpt agent集合&#xff0c;专注于不同细分方向的ai助手。 kaggle 专注于AI相关的培训、竞赛、数据集、大模型。 paperswithcode 简单直接&#xff0c;内容如同网站地址&#xff0c;直接提供优秀代码和配套的论文&#xff0c;似乎还有数据集。

谷歌浏览器的书签同步功能详解

谷歌浏览器作为全球最受欢迎的网络浏览器之一&#xff0c;提供了众多强大的功能来提升用户的上网体验。其中&#xff0c;书签同步功能允许用户在不同设备之间无缝地同步浏览器数据&#xff0c;如书签、历史记录、密码等。本文将详细解析谷歌浏览器的书签同步功能&#xff0c;教…

pip error: microsoft visual c++ 14.0 or greater is required

报错原因&#xff1a;软件包作者发布的是为编译的*.tar.gz包&#xff0c;我们安装的时候需要调用系统C编译器来进行编译安装&#xff0c;如果系统没有安装编译器或者编译器版本不对就会报这个错误。 解决方式一&#xff1a;安装编译器&#xff0c;但不需要安装完整的visual c …

Windows提示msvcp120.dll丢失怎么解决?Windows文件丢失的4种解决方法,教你修复msvcp120.dll文件

Windows提示msvcp120.dll丢失&#xff1f;别担心&#xff0c;这里有4种解决方法&#xff01; 作为软件开发领域的一名从业者&#xff0c;我经常遇到用户反馈关于Windows系统报错的问题&#xff0c;其中“msvcp120.dll丢失”是一个较为常见的错误。今天&#xff0c;我将为大家科…

ESP32-C3 AT WiFi AP 启 TCP Server 被动接收模式 + BLE 共存

TCP 被动接收模式&#xff0c;每次发的数据会先存到缓冲区&#xff0c;参见&#xff1a;ATCIPRECVTYPE 指令说明。 即每包数据不会实时报告 IPD 接收情况&#xff0c;如果需要查询缓冲区的数据&#xff0c;先用 ATCIPRECVLEN? 指令查询被动接收模式下套接字数据的长度 。获取…

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极&#xff0c;LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理&#xff0c;当阳极为高电平&#xff0c;阴极为低电平则点亮&#xff0c;否则熄灭。 因此通过单片机P0口可控制点阵列&#xff0c;74HC595可控制点阵行 11 脚 SR…

pytest测试用例管理框架特点及常见语法和用法分享

一、pytest及其特点 1. 什么是pytest pytest 是一个功能强大且灵活的 Python 测试框架&#xff0c;也是目前最流行的测试框架&#xff0c;可以让我们很方便的编写和管理自动化测试用例&#xff0c;并提供丰富的插件来满足单元测试、集成测试、性能测试等各种测试需求。 2. p…

现代密码学期末重点(备考ing)

现代密码学期末重点&#xff0c;个人备考笔记哦 密码学概念四种密码学攻击方法什么是公钥密码&#xff1f;什么是对称密码&#xff1f;什么是无条件密码&#xff1f; 中国剩余定理&#xff08;必考&#xff09;什么是原根什么是阶 经典密码学密码体制什么是列置换&#xff1f; …

HarmonyOS:@Builder装饰器:自定义构建函数

一、前言 ArkUI提供了一种轻量的UI元素复用机制Builder&#xff0c;其内部UI结构固定&#xff0c;仅与使用方进行数据传递&#xff0c;开发者可以将重复使用的UI元素抽象成一个方法&#xff0c;在build方法里调用。 为了简化语言&#xff0c;我们将Builder装饰的函数也称为“自…