HydrologyForecastView.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <div class="hydrology-forecast-container">
  3. <div class="secondary-title-container">
  4. <div
  5. class="secondary-title"
  6. :class="{ active: activeSecondaryTab === '水文预报' }"
  7. @click="selectSecondaryTab('水文预报')"
  8. >
  9. <span>水文预报</span>
  10. </div>
  11. <div
  12. class="secondary-title"
  13. :class="{ active: activeSecondaryTab === '水文预警' }"
  14. @click="selectSecondaryTab('水文预警')"
  15. >
  16. <span>水文预警</span>
  17. </div>
  18. <div
  19. class="secondary-title"
  20. :class="{ active: activeSecondaryTab === '水文预演' }"
  21. @click="selectSecondaryTab('水文预演')"
  22. >
  23. <span>水文预演</span>
  24. </div>
  25. <div
  26. class="secondary-title"
  27. :class="{ active: activeSecondaryTab === '水文预案' }"
  28. @click="selectSecondaryTab('水文预案')"
  29. >
  30. <span>水文预案</span>
  31. </div>
  32. </div>
  33. <HydrologyForecastPanel
  34. v-if="activeSecondaryTab === '水文预报'"
  35. @updateForecastData="handleUpdateForecastData"
  36. />
  37. <HydrologyWarningPanel
  38. v-if="activeSecondaryTab === '水文预警'"
  39. @loadEmbankmentWarning="handleLoadEmbankmentWarning"
  40. />
  41. <HydrologySimulationPanel
  42. v-if="activeSecondaryTab === '水文预演'"
  43. :simulationTime="simulationTime"
  44. :simulationData="simulationData"
  45. @updateSimulationTime="$emit('updateSimulationTime', $event)"
  46. @updateSimulationData="$emit('updateSimulationData', $event)"
  47. @updateScenarioAndRisk="handleUpdateScenarioAndRisk"
  48. />
  49. <HydrologyPlanPanel
  50. v-if="activeSecondaryTab === '水文预案'"
  51. :selectedScenario="selectedScenario"
  52. :riskLevel="riskLevel"
  53. :scenarioLabel="scenarioLabel"
  54. />
  55. </div>
  56. </template>
  57. <script>
  58. import HydrologyForecastPanel from '../components/HydrologyForecastPanel.vue'
  59. import HydrologyWarningPanel from '../components/HydrologyWarningPanel.vue'
  60. import HydrologySimulationPanel from '../components/HydrologySimulationPanel.vue'
  61. import HydrologyPlanPanel from '../components/HydrologyPlanPanel.vue'
  62. export default {
  63. name: 'HydrologyForecastView',
  64. components: {
  65. HydrologyForecastPanel,
  66. HydrologyWarningPanel,
  67. HydrologySimulationPanel,
  68. HydrologyPlanPanel
  69. },
  70. props: {
  71. activeSecondaryTab: {
  72. type: String,
  73. default: '水文预报'
  74. },
  75. simulationTime: {
  76. type: Number,
  77. default: 0
  78. },
  79. simulationData: {
  80. type: Object,
  81. default: () => ({})
  82. },
  83. loadEmbankmentWarning: {
  84. type: Boolean,
  85. default: false
  86. }
  87. },
  88. data() {
  89. return {
  90. selectedScenario: 'light',
  91. scenarioLabel: '小雨情景(24h)',
  92. riskLevel: '正常'
  93. }
  94. },
  95. emits: ['selectSecondaryTab', 'updateSimulationTime', 'updateSimulationData', 'loadEmbankmentWarning', 'updateForecastData'],
  96. methods: {
  97. selectSecondaryTab(tab) {
  98. this.$emit('selectSecondaryTab', tab)
  99. },
  100. handleUpdateScenarioAndRisk({ scenario, riskLevel, selectedScenario }) {
  101. this.selectedScenario = selectedScenario
  102. this.scenarioLabel = scenario
  103. this.riskLevel = riskLevel
  104. },
  105. handleLoadEmbankmentWarning() {
  106. this.$emit('loadEmbankmentWarning')
  107. },
  108. handleUpdateForecastData(data) {
  109. this.$emit('updateSimulationData', data)
  110. }
  111. }
  112. }
  113. </script>
  114. <style scoped>
  115. .hydrology-forecast-container {
  116. width: 100%;
  117. height: 100%;
  118. position: relative;
  119. }
  120. .secondary-title-container {
  121. position: absolute;
  122. bottom: 46px;
  123. left: 50%;
  124. transform: translateX(-50%);
  125. display: flex;
  126. gap: 20px;
  127. z-index: 4;
  128. }
  129. .secondary-title {
  130. width: 159px;
  131. height: 31px;
  132. background-image: url('/src/assets/images/未选中底部标题.png');
  133. background-size: 100% 100%;
  134. background-position: center;
  135. background-repeat: no-repeat;
  136. display: flex;
  137. align-items: center;
  138. justify-content: center;
  139. font-size: 14px;
  140. font-weight: bold;
  141. cursor: pointer;
  142. transition: all 0.3s ease;
  143. }
  144. .secondary-title span {
  145. background: linear-gradient(to bottom, #e2e8ff, #7bbef6);
  146. -webkit-background-clip: text;
  147. background-clip: text;
  148. color: transparent;
  149. text-shadow: 0 0 5px rgba(0, 212, 255, 0.3);
  150. }
  151. .secondary-title:hover,
  152. .secondary-title.active {
  153. background-image: url('/src/assets/images/选中底部标题.png');
  154. }
  155. .secondary-title:hover span,
  156. .secondary-title.active span {
  157. background: linear-gradient(to bottom, #e2e8ff, #62f6fb);
  158. -webkit-background-clip: text;
  159. background-clip: text;
  160. color: transparent;
  161. }
  162. </style>