|
|
@@ -0,0 +1,401 @@
|
|
|
+<template>
|
|
|
+ <m-card title="研学成效数据" :width="398" :height="450">
|
|
|
+ <div class="study-effect">
|
|
|
+ <div class="effect-tabs">
|
|
|
+ <div
|
|
|
+ class="tab-item"
|
|
|
+ v-for="(tab, index) in effectTabs"
|
|
|
+ :key="index"
|
|
|
+ :class="{ active: activeTab === index }"
|
|
|
+ @click="activeTab = index"
|
|
|
+ >
|
|
|
+ {{ tab.name }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="effect-chart">
|
|
|
+ <div v-if="activeTab === 0" class="chart-line">
|
|
|
+ <div class="chart-title">学生能力提升 40%</div>
|
|
|
+ <div class="line-container">
|
|
|
+ <div class="line-item">
|
|
|
+ <div class="line-label">研学前</div>
|
|
|
+ <div class="line-bar-wrapper">
|
|
|
+ <div class="line-bar before" style="width: 50%"></div>
|
|
|
+ </div>
|
|
|
+ <div class="line-value">基础水平</div>
|
|
|
+ </div>
|
|
|
+ <div class="line-item">
|
|
|
+ <div class="line-label">研学后</div>
|
|
|
+ <div class="line-bar-wrapper">
|
|
|
+ <div class="line-bar after" style="width: 90%"></div>
|
|
|
+ </div>
|
|
|
+ <div class="line-value">专业水平</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="activeTab === 1" class="chart-bar">
|
|
|
+ <div class="chart-title">项目成果成效</div>
|
|
|
+ <div class="bar-container">
|
|
|
+ <div class="bar-item">
|
|
|
+ <div class="bar-value">+80%</div>
|
|
|
+ <div class="bar-fill" style="height: 80%"></div>
|
|
|
+ <div class="bar-label">学生满意度</div>
|
|
|
+ </div>
|
|
|
+ <div class="bar-item">
|
|
|
+ <div class="bar-value">+65%</div>
|
|
|
+ <div class="bar-fill" style="height: 65%"></div>
|
|
|
+ <div class="bar-label">就业率提升</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="activeTab === 2" class="chart-ring">
|
|
|
+ <div class="chart-title">社会影响提升</div>
|
|
|
+ <div class="ring-container">
|
|
|
+ <div class="ring-item">
|
|
|
+ <div class="ring-wrapper">
|
|
|
+ <svg width="80" height="80" viewBox="0 0 80 80">
|
|
|
+ <circle cx="40" cy="40" r="35" fill="none" stroke="rgba(255,255,255,0.1)" stroke-width="6" />
|
|
|
+ <circle cx="40" cy="40" r="35" fill="none" stroke="url(#gradient1)" stroke-width="6" stroke-linecap="round"
|
|
|
+ stroke-dasharray="220" stroke-dashoffset="44" transform="rotate(-90 40 40)" />
|
|
|
+ <defs>
|
|
|
+ <linearGradient id="gradient1" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
|
+ <stop offset="0%" stop-color="#30DCFF" />
|
|
|
+ <stop offset="100%" stop-color="#43e97b" />
|
|
|
+ </linearGradient>
|
|
|
+ </defs>
|
|
|
+ </svg>
|
|
|
+ <div class="ring-text">
|
|
|
+ <span class="percent">+80%</span>
|
|
|
+ <span class="label">社会认可度</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="ring-item">
|
|
|
+ <div class="ring-wrapper">
|
|
|
+ <svg width="80" height="80" viewBox="0 0 80 80">
|
|
|
+ <circle cx="40" cy="40" r="35" fill="none" stroke="rgba(255,255,255,0.1)" stroke-width="6" />
|
|
|
+ <circle cx="40" cy="40" r="35" fill="none" stroke="url(#gradient2)" stroke-width="6" stroke-linecap="round"
|
|
|
+ stroke-dasharray="220" stroke-dashoffset="33" transform="rotate(-90 40 40)" />
|
|
|
+ <defs>
|
|
|
+ <linearGradient id="gradient2" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
|
+ <stop offset="0%" stop-color="#ff6b6b" />
|
|
|
+ <stop offset="100%" stop-color="#ffd93d" />
|
|
|
+ </linearGradient>
|
|
|
+ </defs>
|
|
|
+ </svg>
|
|
|
+ <div class="ring-text">
|
|
|
+ <span class="percent">+75%</span>
|
|
|
+ <span class="label">媒体报道率</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="effect-compare">
|
|
|
+ <div class="compare-title">研学前后对比</div>
|
|
|
+ <div class="compare-container">
|
|
|
+ <div class="compare-card before">
|
|
|
+ <div class="card-label">研学前</div>
|
|
|
+ <div class="card-items">
|
|
|
+ <div class="card-item">
|
|
|
+ <span class="item-label">专业技能</span>
|
|
|
+ <span class="item-value">基础</span>
|
|
|
+ </div>
|
|
|
+ <div class="card-item">
|
|
|
+ <span class="item-label">实践经验</span>
|
|
|
+ <span class="item-value">缺乏</span>
|
|
|
+ </div>
|
|
|
+ <div class="card-item">
|
|
|
+ <span class="item-label">就业竞争力</span>
|
|
|
+ <span class="item-value">一般</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="compare-arrow">→</div>
|
|
|
+ <div class="compare-card after">
|
|
|
+ <div class="card-label">研学后</div>
|
|
|
+ <div class="card-items">
|
|
|
+ <div class="card-item">
|
|
|
+ <span class="item-label">专业技能</span>
|
|
|
+ <span class="item-value highlight">专业</span>
|
|
|
+ </div>
|
|
|
+ <div class="card-item">
|
|
|
+ <span class="item-label">实践经验</span>
|
|
|
+ <span class="item-value highlight">丰富</span>
|
|
|
+ </div>
|
|
|
+ <div class="card-item">
|
|
|
+ <span class="item-label">就业竞争力</span>
|
|
|
+ <span class="item-value highlight">优秀</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </m-card>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref } from "vue"
|
|
|
+import mCard from "@/components/mCard/index.vue"
|
|
|
+
|
|
|
+const activeTab = ref(0)
|
|
|
+
|
|
|
+const effectTabs = ref([
|
|
|
+ { name: "能力提升" },
|
|
|
+ { name: "成果成效" },
|
|
|
+ { name: "社会影响" },
|
|
|
+])
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.study-effect {
|
|
|
+ padding: 12px;
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 12px;
|
|
|
+ box-sizing: border-box;
|
|
|
+}
|
|
|
+
|
|
|
+.effect-tabs {
|
|
|
+ display: flex;
|
|
|
+ gap: 8px;
|
|
|
+ background: rgba(0, 180, 255, 0.05);
|
|
|
+ padding: 6px;
|
|
|
+ border-radius: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.tab-item {
|
|
|
+ flex: 1;
|
|
|
+ padding: 8px 10px;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 4px;
|
|
|
+ font-size: 10px;
|
|
|
+ color: rgba(255, 255, 255, 0.6);
|
|
|
+ cursor: pointer;
|
|
|
+ transition: all 0.3s ease;
|
|
|
+ &:hover {
|
|
|
+ color: rgba(255, 255, 255, 0.9);
|
|
|
+ background: rgba(48, 220, 255, 0.1);
|
|
|
+ }
|
|
|
+ &.active {
|
|
|
+ background: linear-gradient(135deg, #30DCFF, #00BFFF);
|
|
|
+ color: #fff;
|
|
|
+ box-shadow: 0 0 15px rgba(48, 220, 255, 0.4);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.effect-chart {
|
|
|
+ flex: 1;
|
|
|
+ background: rgba(0, 180, 255, 0.05);
|
|
|
+ border-radius: 6px;
|
|
|
+ padding: 12px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+}
|
|
|
+
|
|
|
+.chart-title {
|
|
|
+ font-size: 11px;
|
|
|
+ color: #30DCFF;
|
|
|
+ font-weight: 600;
|
|
|
+ text-align: center;
|
|
|
+ margin-bottom: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.chart-line .line-container {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.line-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.line-label {
|
|
|
+ width: 50px;
|
|
|
+ font-size: 10px;
|
|
|
+ color: rgba(255, 255, 255, 0.7);
|
|
|
+}
|
|
|
+
|
|
|
+.line-bar-wrapper {
|
|
|
+ flex: 1;
|
|
|
+ height: 18px;
|
|
|
+ background: rgba(255, 255, 255, 0.1);
|
|
|
+ border-radius: 9px;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+.line-bar {
|
|
|
+ height: 100%;
|
|
|
+ border-radius: 10px;
|
|
|
+ transition: width 1.5s ease;
|
|
|
+ &.before {
|
|
|
+ background: linear-gradient(90deg, rgba(255, 107, 107, 0.8), rgba(255, 217, 61, 0.8));
|
|
|
+ }
|
|
|
+ &.after {
|
|
|
+ background: linear-gradient(90deg, #30DCFF, #43e97b);
|
|
|
+ box-shadow: 0 0 10px rgba(48, 220, 255, 0.4);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.line-value {
|
|
|
+ width: 60px;
|
|
|
+ font-size: 12px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #30DCFF;
|
|
|
+ text-align: right;
|
|
|
+}
|
|
|
+
|
|
|
+.chart-bar .bar-container {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ align-items: flex-end;
|
|
|
+ flex: 1;
|
|
|
+ padding: 0 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.bar-item {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.bar-value {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #43e97b;
|
|
|
+}
|
|
|
+
|
|
|
+.bar-fill {
|
|
|
+ width: 40px;
|
|
|
+ background: linear-gradient(to top, #30DCFF, #43e97b);
|
|
|
+ border-radius: 5px 5px 0 0;
|
|
|
+ transition: height 1.5s ease;
|
|
|
+}
|
|
|
+
|
|
|
+.bar-label {
|
|
|
+ font-size: 10px;
|
|
|
+ color: rgba(255, 255, 255, 0.6);
|
|
|
+}
|
|
|
+
|
|
|
+.chart-ring .ring-container {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ flex: 1;
|
|
|
+}
|
|
|
+
|
|
|
+.ring-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.ring-wrapper {
|
|
|
+ position: relative;
|
|
|
+ width: 80px;
|
|
|
+ height: 80px;
|
|
|
+}
|
|
|
+
|
|
|
+.ring-text {
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ left: 50%;
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
+ text-align: center;
|
|
|
+ .percent {
|
|
|
+ display: block;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #30DCFF;
|
|
|
+ &.down {
|
|
|
+ color: #ff6b6b;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .label {
|
|
|
+ display: block;
|
|
|
+ font-size: 9px;
|
|
|
+ color: rgba(255, 255, 255, 0.6);
|
|
|
+ margin-top: 2px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.effect-compare {
|
|
|
+ background: rgba(0, 180, 255, 0.05);
|
|
|
+ border-radius: 8px;
|
|
|
+ padding: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.compare-title {
|
|
|
+ font-size: 11px;
|
|
|
+ color: #30DCFF;
|
|
|
+ font-weight: 600;
|
|
|
+ text-align: center;
|
|
|
+ margin-bottom: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.compare-container {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.compare-card {
|
|
|
+ flex: 1;
|
|
|
+ background: rgba(255, 255, 255, 0.05);
|
|
|
+ border-radius: 6px;
|
|
|
+ padding: 8px;
|
|
|
+ &.before {
|
|
|
+ border: 1px solid rgba(255, 107, 107, 0.3);
|
|
|
+ .card-label {
|
|
|
+ color: #ff6b6b;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ &.after {
|
|
|
+ border: 1px solid rgba(48, 220, 255, 0.3);
|
|
|
+ .card-label {
|
|
|
+ color: #30DCFF;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.card-label {
|
|
|
+ font-size: 10px;
|
|
|
+ font-weight: 600;
|
|
|
+ text-align: center;
|
|
|
+ margin-bottom: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.card-items {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.card-item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ font-size: 10px;
|
|
|
+ .item-label {
|
|
|
+ color: rgba(255, 255, 255, 0.5);
|
|
|
+ }
|
|
|
+ .item-value {
|
|
|
+ color: rgba(255, 255, 255, 0.8);
|
|
|
+ &.highlight {
|
|
|
+ color: #30DCFF;
|
|
|
+ font-weight: 600;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.compare-arrow {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #30DCFF;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+</style>
|