|
@@ -0,0 +1,116 @@
|
|
|
+<template>
|
|
|
+ <div class="steps-container">
|
|
|
+ <div
|
|
|
+ v-for="(step, index) in steps"
|
|
|
+ :key="index"
|
|
|
+ class="step-item"
|
|
|
+ :class="{ completed: index < currentStep, active: index === currentStep }"
|
|
|
+ >
|
|
|
+ <div class="step-circle">
|
|
|
+ <el-icon v-if="index < currentStep"><Select /></el-icon>
|
|
|
+ <span v-else class="step-number">{{ index + 1 }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="step-label">{{ step.label }}</div>
|
|
|
+ <div v-if="index < steps.length - 1" class="step-line" :class="{ completed: index < currentStep }"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, defineProps } from "vue";
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ currentStep: {
|
|
|
+ type: Number,
|
|
|
+ default: 2,
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const steps = ref([
|
|
|
+ { label: "触发农事" },
|
|
|
+ { label: "专家确认" },
|
|
|
+ { label: "服务报价" },
|
|
|
+ { label: "农事执行" },
|
|
|
+ { label: "农事复核" },
|
|
|
+]);
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.steps-container {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ justify-content: space-between;
|
|
|
+ position: relative;
|
|
|
+ .step-item {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ position: relative;
|
|
|
+ flex: 1;
|
|
|
+ z-index: 2;
|
|
|
+ .step-circle {
|
|
|
+ width: 25px;
|
|
|
+ height: 25px;
|
|
|
+ border-radius: 50%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ transition: all 0.3s ease;
|
|
|
+ .step-number {
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .step-label {
|
|
|
+ font-size: 12px;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 1.2;
|
|
|
+ max-width: 60px;
|
|
|
+ }
|
|
|
+ .step-line {
|
|
|
+ position: absolute;
|
|
|
+ top: 13px;
|
|
|
+ left: 74%;
|
|
|
+ width: calc(100% - 38px);
|
|
|
+ height: 2px;
|
|
|
+ background-color: rgba(0, 0, 0, 0.22);
|
|
|
+ z-index: 1;
|
|
|
+ }
|
|
|
+ &.completed {
|
|
|
+ .step-circle {
|
|
|
+ background-color: #1890ff;
|
|
|
+ color: white;
|
|
|
+ }
|
|
|
+ .step-line {
|
|
|
+ background-color: #1890ff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ &.active {
|
|
|
+ .step-circle {
|
|
|
+ background-color: #1890ff;
|
|
|
+ color: white;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.step-item:not(.completed):not(.active) .step-circle {
|
|
|
+ background-color: #FFFFFF;
|
|
|
+ color: #999;
|
|
|
+}
|
|
|
+.step-item.completed .step-label,
|
|
|
+.step-item.active .step-label {
|
|
|
+ color: #333;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+
|
|
|
+.step-item:not(.completed):not(.active) .step-label {
|
|
|
+ color: rgba(0, 0, 0, 0.5);
|
|
|
+}
|
|
|
+
|
|
|
+.step-line.completed {
|
|
|
+ background-color: #1890ff;
|
|
|
+}
|
|
|
+.step-item:last-child .step-line {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+</style>
|