|
@@ -1,149 +1,301 @@
|
|
|
<template>
|
|
|
- <div class="compact-container">
|
|
|
- <el-card shadow="always" class="compact-card">
|
|
|
- <!-- 紧凑标题区域 -->
|
|
|
- <div class="compact-title-section">
|
|
|
- <h2 class="compact-main-title">灌溉水输入通量计算</h2>
|
|
|
- <p class="compact-sub-title">选择土地类型并输入灌溉参数</p>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 紧凑参数输入区域 -->
|
|
|
- <div class="compact-input-section">
|
|
|
- <!-- 水地参数输入 -->
|
|
|
- <div class="compact-land-section">
|
|
|
- <el-checkbox v-model="waterLand" class="compact-land-checkbox">
|
|
|
- <span class="compact-land-label">水地</span>
|
|
|
- </el-checkbox>
|
|
|
- <div class="compact-input-group">
|
|
|
- <div class="compact-input-label">灌溉水用量 (m³)</div>
|
|
|
- <el-input
|
|
|
- v-model="irrigationWaterUsage"
|
|
|
- placeholder="用量"
|
|
|
- :disabled="!waterLand"
|
|
|
- size="small"
|
|
|
- class="compact-input"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class="compact-input-group">
|
|
|
- <div class="compact-input-label">有效利用率 (%)</div>
|
|
|
- <el-input
|
|
|
- v-model="irrigationEfficiency"
|
|
|
- placeholder="利用率"
|
|
|
- :disabled="!waterLand"
|
|
|
- size="small"
|
|
|
- class="compact-input"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="irrigation-management">
|
|
|
+ <!-- 计算页面 -->
|
|
|
+ <div v-if="showCalculation">
|
|
|
+ <el-card shadow="always" class="gradient-card">
|
|
|
+ <el-radio-group v-model="selectedLandType" style="width: 100%;">
|
|
|
+ <!-- 水地 -->
|
|
|
+ <el-row :gutter="20" style="margin-bottom: 10px; align-items: center;">
|
|
|
+ <el-col :span="6">
|
|
|
+ <div class="radio-container">
|
|
|
+ <el-radio label="water" border>水田</el-radio>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="9">
|
|
|
+ <div class="input-title">灌溉水用量 (m³/亩/年)</div>
|
|
|
+ <el-input
|
|
|
+ v-model="irrigationWaterUsage"
|
|
|
+ placeholder="请输入灌溉水用量"
|
|
|
+ :disabled="selectedLandType !== 'water'"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="9">
|
|
|
+ <div class="input-title">灌溉水有效利用率 (%)</div>
|
|
|
+ <el-input
|
|
|
+ v-model="irrigationEfficiency"
|
|
|
+ placeholder="请输入灌溉水有效利用率"
|
|
|
+ :disabled="selectedLandType !== 'water'"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <!-- 水浇地 -->
|
|
|
+ <el-row :gutter="20" style="margin-bottom: 10px; align-items: center;">
|
|
|
+ <el-col :span="6">
|
|
|
+ <div class="radio-container">
|
|
|
+ <el-radio label="irrigated" border>水浇地</el-radio>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="9">
|
|
|
+ <div class="input-title">灌溉水用量 (m³/亩/年)</div>
|
|
|
+ <el-input
|
|
|
+ v-model="irrigatedWaterUsage"
|
|
|
+ placeholder="请输入灌溉水用量"
|
|
|
+ :disabled="selectedLandType !== 'irrigated'"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="9">
|
|
|
+ <div class="input-title">灌溉水有效利用率 (%)</div>
|
|
|
+ <el-input
|
|
|
+ v-model="irrigatedEfficiency"
|
|
|
+ placeholder="请输入灌溉水有效利用率"
|
|
|
+ :disabled="selectedLandType !== 'irrigated'"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <!-- 旱地 -->
|
|
|
+ <el-row :gutter="20" style="margin-bottom: 10px; align-items: center;">
|
|
|
+ <el-col :span="6">
|
|
|
+ <div class="radio-container">
|
|
|
+ <el-radio label="dry" border>旱地</el-radio>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="9">
|
|
|
+ <div class="input-title">灌溉水用量 (m³/亩/年)</div>
|
|
|
+ <el-input
|
|
|
+ v-model="dryWaterUsage"
|
|
|
+ placeholder="请输入灌溉水用量"
|
|
|
+ :disabled="selectedLandType !== 'dry'"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="9">
|
|
|
+ <div class="input-title">灌溉水有效利用率 (%)</div>
|
|
|
+ <el-input
|
|
|
+ v-model="dryEfficiency"
|
|
|
+ placeholder="请输入灌溉水有效利用率"
|
|
|
+ :disabled="selectedLandType !== 'dry'"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-radio-group>
|
|
|
+
|
|
|
+ <el-row justify="center" style="margin-top: 20px;">
|
|
|
+ <el-button
|
|
|
+ class="calculate-btn"
|
|
|
+ @click="calculateFlux"
|
|
|
+ :loading="loading"
|
|
|
+ >
|
|
|
+ 计算灌溉水输入通量
|
|
|
+ </el-button>
|
|
|
+ </el-row>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 结果页面 -->
|
|
|
+ <div v-if="showResults">
|
|
|
+ <el-card shadow="always" class="results-card">
|
|
|
+ <div class="results-header">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ @click="backToCalculation"
|
|
|
+ class="back-button">
|
|
|
+ 返回计算
|
|
|
+ </el-button>
|
|
|
+ <div class="result-title">计算结果</div>
|
|
|
</div>
|
|
|
-
|
|
|
- <!-- 水浇地参数输入 -->
|
|
|
- <div class="compact-land-section">
|
|
|
- <el-checkbox v-model="irrigatedLand" class="compact-land-checkbox">
|
|
|
- <span class="compact-land-label">水浇地</span>
|
|
|
- </el-checkbox>
|
|
|
- <div class="compact-input-group">
|
|
|
- <div class="compact-input-label">灌溉水用量 (m³)</div>
|
|
|
- <el-input
|
|
|
- v-model="irrigatedWaterUsage"
|
|
|
- placeholder="用量"
|
|
|
- :disabled="!irrigatedLand"
|
|
|
- size="small"
|
|
|
- class="compact-input"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class="compact-input-group">
|
|
|
- <div class="compact-input-label">有效利用率 (%)</div>
|
|
|
- <el-input
|
|
|
- v-model="irrigatedEfficiency"
|
|
|
- placeholder="利用率"
|
|
|
- :disabled="!irrigatedLand"
|
|
|
- size="small"
|
|
|
- class="compact-input"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 旱地参数输入 -->
|
|
|
- <div class="compact-land-section">
|
|
|
- <el-checkbox v-model="dryLand" class="compact-land-checkbox">
|
|
|
- <span class="compact-land-label">旱地</span>
|
|
|
- </el-checkbox>
|
|
|
- <div class="compact-input-group">
|
|
|
- <div class="compact-input-label">灌溉水用量 (m³)</div>
|
|
|
- <el-input
|
|
|
- v-model="dryWaterUsage"
|
|
|
- placeholder="用量"
|
|
|
- :disabled="!dryLand"
|
|
|
- size="small"
|
|
|
- class="compact-input"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class="compact-input-group">
|
|
|
- <div class="compact-input-label">有效利用率 (%)</div>
|
|
|
- <el-input
|
|
|
- v-model="dryEfficiency"
|
|
|
- placeholder="利用率"
|
|
|
- :disabled="!dryLand"
|
|
|
- size="small"
|
|
|
- class="compact-input"
|
|
|
- />
|
|
|
- </div>
|
|
|
+
|
|
|
+ <div class="results-container">
|
|
|
+ <el-row :gutter="20" style="margin-top: 30px;">
|
|
|
+ <el-col :span="12">
|
|
|
+ <div class="result-subtitle">Cd含量地图</div>
|
|
|
+ <img v-if="mapImageUrl" :src="mapImageUrl" alt="Cd含量地图" class="result-image">
|
|
|
+ <div v-else class="image-placeholder">地图加载中...</div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <div class="result-subtitle">Cd含量直方图</div>
|
|
|
+ <img v-if="histogramImageUrl" :src="histogramImageUrl" alt="Cd含量直方图" class="result-image">
|
|
|
+ <div v-else class="image-placeholder">直方图加载中...</div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row style="margin-top: 30px;">
|
|
|
+ <el-col :span="24">
|
|
|
+ <div class="result-subtitle">统计结果</div>
|
|
|
+ <div class="statistics-container">
|
|
|
+ <!-- 基础统计表格 -->
|
|
|
+ <el-table
|
|
|
+ v-if="statisticsData"
|
|
|
+ :data="[statisticsData]"
|
|
|
+ border
|
|
|
+ size="small"
|
|
|
+ style="width: 100%; margin-bottom: 20px;"
|
|
|
+ >
|
|
|
+ <el-table-column prop="土地类型" label="土地类型" align="center"></el-table-column>
|
|
|
+ <el-table-column prop="数据更新时间" label="数据更新时间" align="center"></el-table-column>
|
|
|
+ <el-table-column prop="数据点总数" label="数据点总数" align="center"></el-table-column>
|
|
|
+ <el-table-column prop="均值" label="均值" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ <el-table-column prop="中位数" label="中位数" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ <el-table-column prop="标准差" label="标准差" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ <el-table-column prop="最小值" label="最小值" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ <el-table-column prop="最大值" label="最大值" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <!-- 分位数和形态统计表格 -->
|
|
|
+ <el-table
|
|
|
+ v-if="statisticsData"
|
|
|
+ :data="[statisticsData]"
|
|
|
+ border
|
|
|
+ size="small"
|
|
|
+ style="width: 100%; margin-bottom: 20px;"
|
|
|
+ >
|
|
|
+ <el-table-column prop="25%分位数" label="25%分位数" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ <el-table-column prop="75%分位数" label="75%分位数" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ <el-table-column prop="偏度" label="偏度" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ <el-table-column prop="峰度" label="峰度" align="center" :formatter="formatNumber"></el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
</div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 紧凑计算按钮 -->
|
|
|
- <div class="compact-button-section">
|
|
|
- <el-button
|
|
|
- class="compact-calculate-btn"
|
|
|
- @click="calculateFlux"
|
|
|
- >
|
|
|
- <i class="fas fa-calculator"></i> 计算输入通量
|
|
|
- </el-button>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 紧凑计算结果 -->
|
|
|
- <div v-if="fluxResult !== null" class="compact-result-section">
|
|
|
- <div class="compact-result-title">计算结果</div>
|
|
|
- <div class="compact-flux-value">{{ fluxResult.toFixed(2) }} <span class="compact-unit">m³</span></div>
|
|
|
- <p class="compact-result-description">灌溉水输入通量</p>
|
|
|
- </div>
|
|
|
- </el-card>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import { ref } from 'vue';
|
|
|
-import { ElCheckbox, ElInput, ElButton, ElMessage, ElCard } from 'element-plus';
|
|
|
+import axios from 'axios';
|
|
|
+import {
|
|
|
+ ElRadio,
|
|
|
+ ElRadioGroup,
|
|
|
+ ElInput,
|
|
|
+ ElButton,
|
|
|
+ ElMessage,
|
|
|
+ ElCard,
|
|
|
+ ElRow,
|
|
|
+ ElCol,
|
|
|
+ ElTable,
|
|
|
+ ElTableColumn
|
|
|
+} from 'element-plus';
|
|
|
+
|
|
|
+// 土地类型映射
|
|
|
+const landTypeMap = {
|
|
|
+ water: '水田',
|
|
|
+ irrigated: '水浇地',
|
|
|
+ dry: '旱地'
|
|
|
+};
|
|
|
|
|
|
export default {
|
|
|
components: {
|
|
|
- ElCheckbox,
|
|
|
+ ElRadio,
|
|
|
+ ElRadioGroup,
|
|
|
ElInput,
|
|
|
ElButton,
|
|
|
ElMessage,
|
|
|
- ElCard
|
|
|
+ ElCard,
|
|
|
+ ElRow,
|
|
|
+ ElCol,
|
|
|
+ ElTable,
|
|
|
+ ElTableColumn
|
|
|
},
|
|
|
setup() {
|
|
|
- const waterLand = ref(false);
|
|
|
- const irrigatedLand = ref(false);
|
|
|
- const dryLand = ref(false);
|
|
|
-
|
|
|
- const irrigationWaterUsage = ref('');
|
|
|
- const irrigationEfficiency = ref('');
|
|
|
+ const selectedLandType = ref('water'); // 默认选择水田
|
|
|
+
|
|
|
+ // 设置默认值
|
|
|
+ const irrigationWaterUsage = ref('711');
|
|
|
+ const irrigationEfficiency = ref('0.524');
|
|
|
|
|
|
- const irrigatedWaterUsage = ref('');
|
|
|
- const irrigatedEfficiency = ref('');
|
|
|
+ const irrigatedWaterUsage = ref('427');
|
|
|
+ const irrigatedEfficiency = ref('0.599');
|
|
|
|
|
|
- const dryWaterUsage = ref('');
|
|
|
- const dryEfficiency = ref('');
|
|
|
+ const dryWaterUsage = ref('200');
|
|
|
+ const dryEfficiency = ref('0.7');
|
|
|
|
|
|
const fluxResult = ref(null);
|
|
|
+ const showCalculation = ref(true); // 显示计算页面
|
|
|
+ const showResults = ref(false); // 显示结果页面
|
|
|
+ const loading = ref(false);
|
|
|
+
|
|
|
+ // 结果展示数据
|
|
|
+ const mapImageUrl = ref('');
|
|
|
+ const histogramImageUrl = ref('');
|
|
|
+ const statisticsData = ref(null);
|
|
|
+
|
|
|
+ // 格式化数字显示(保留4位小数)
|
|
|
+ const formatNumber = (row, column, cellValue) => {
|
|
|
+ if (typeof cellValue === 'number') {
|
|
|
+ return cellValue.toFixed(4);
|
|
|
+ }
|
|
|
+ return cellValue;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 获取默认地图
|
|
|
+ const fetchDefaultMap = async (landTypeChinese) => {
|
|
|
+ try {
|
|
|
+ const response = await axios.get('http://localhost:8000/api/water/default-map', {
|
|
|
+ params: { land_type: landTypeChinese },
|
|
|
+ responseType: 'blob' // 接收二进制数据
|
|
|
+ });
|
|
|
+
|
|
|
+ // 创建对象URL
|
|
|
+ return URL.createObjectURL(response.data);
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取默认地图失败:', error);
|
|
|
+ ElMessage.error('获取地图失败,请重试');
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
- const calculateFlux = () => {
|
|
|
+ // 获取默认直方图
|
|
|
+ const fetchDefaultHistogram = async (landTypeChinese) => {
|
|
|
+ try {
|
|
|
+ const response = await axios.get('http://localhost:8000/api/water/default-histogram', {
|
|
|
+ params: { land_type: landTypeChinese },
|
|
|
+ responseType: 'blob' // 接收二进制数据
|
|
|
+ });
|
|
|
+
|
|
|
+ // 创建对象URL
|
|
|
+ return URL.createObjectURL(response.data);
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取默认直方图失败:', error);
|
|
|
+ ElMessage.error('获取直方图失败,请重试');
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 获取统计数据
|
|
|
+ const fetchStatistics = async (landTypeChinese) => {
|
|
|
+ try {
|
|
|
+ const response = await axios.get('http://localhost:8000/api/water/statistics', {
|
|
|
+ params: { land_type: landTypeChinese }
|
|
|
+ });
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取统计数据失败:', error);
|
|
|
+ ElMessage.error('获取统计数据失败,请重试');
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 返回计算页面
|
|
|
+ const backToCalculation = () => {
|
|
|
+ showCalculation.value = true;
|
|
|
+ showResults.value = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const calculateFlux = async () => {
|
|
|
let totalFlux = 0;
|
|
|
let valid = true;
|
|
|
+ let currentLandType = '';
|
|
|
|
|
|
- if (waterLand.value) {
|
|
|
+ if (selectedLandType.value === 'water') {
|
|
|
if (!irrigationWaterUsage.value || !irrigationEfficiency.value) {
|
|
|
ElMessage.warning('请输入水地的灌溉水用量和有效利用率');
|
|
|
valid = false;
|
|
@@ -158,12 +310,12 @@ export default {
|
|
|
ElMessage.error('有效利用率应在0-100%之间');
|
|
|
valid = false;
|
|
|
} else {
|
|
|
- totalFlux += usage * efficiency;
|
|
|
+ totalFlux = usage * efficiency;
|
|
|
+ currentLandType = 'water';
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if (irrigatedLand.value) {
|
|
|
+ }
|
|
|
+ else if (selectedLandType.value === 'irrigated') {
|
|
|
if (!irrigatedWaterUsage.value || !irrigatedEfficiency.value) {
|
|
|
ElMessage.warning('请输入水浇地的灌溉水用量和有效利用率');
|
|
|
valid = false;
|
|
@@ -178,12 +330,12 @@ export default {
|
|
|
ElMessage.error('有效利用率应在0-100%之间');
|
|
|
valid = false;
|
|
|
} else {
|
|
|
- totalFlux += usage * efficiency;
|
|
|
+ totalFlux = usage * efficiency;
|
|
|
+ currentLandType = 'irrigated';
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if (dryLand.value) {
|
|
|
+ }
|
|
|
+ else if (selectedLandType.value === 'dry') {
|
|
|
if (!dryWaterUsage.value || !dryEfficiency.value) {
|
|
|
ElMessage.warning('请输入旱地的灌溉水用量和有效利用率');
|
|
|
valid = false;
|
|
@@ -198,33 +350,79 @@ export default {
|
|
|
ElMessage.error('有效利用率应在0-100%之间');
|
|
|
valid = false;
|
|
|
} else {
|
|
|
- totalFlux += usage * efficiency;
|
|
|
+ totalFlux = usage * efficiency;
|
|
|
+ currentLandType = 'dry';
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ElMessage.warning('请选择一种土地类型');
|
|
|
+ valid = false;
|
|
|
}
|
|
|
|
|
|
if (valid) {
|
|
|
+ loading.value = true;
|
|
|
fluxResult.value = totalFlux;
|
|
|
- ElMessage.success(`灌溉水输入通量: ${totalFlux.toFixed(2)} m³`);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取土地类型中文名称
|
|
|
+ const landTypeChinese = landTypeMap[currentLandType];
|
|
|
+
|
|
|
+ // 第一步:调用calculate接口进行计算
|
|
|
+ const formData = new FormData();
|
|
|
+ formData.append('land_type', landTypeChinese);
|
|
|
+ formData.append('param1', totalFlux);
|
|
|
+ formData.append('param2', parseFloat(irrigationEfficiency.value || irrigatedEfficiency.value || dryEfficiency.value));
|
|
|
+ formData.append('color_map_name', "绿-黄-红-紫");
|
|
|
+ formData.append('output_size', 8);
|
|
|
+
|
|
|
+ await axios.post('http://localhost:8000/api/water/calculate', formData, {
|
|
|
+ headers: {
|
|
|
+ 'Content-Type': 'multipart/form-data'
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 第二步:获取默认地图
|
|
|
+ mapImageUrl.value = await fetchDefaultMap(landTypeChinese);
|
|
|
+
|
|
|
+ // 第三步:获取默认直方图
|
|
|
+ histogramImageUrl.value = await fetchDefaultHistogram(landTypeChinese);
|
|
|
+
|
|
|
+ // 第四步:获取统计数据
|
|
|
+ statisticsData.value = await fetchStatistics(landTypeChinese);
|
|
|
+
|
|
|
+ // 切换到结果页面
|
|
|
+ showCalculation.value = false;
|
|
|
+ showResults.value = true;
|
|
|
+
|
|
|
+ ElMessage.success('计算完成,结果已展示');
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取结果失败:', error);
|
|
|
+ ElMessage.error('获取结果失败,请重试');
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
|
|
|
return {
|
|
|
- waterLand,
|
|
|
- irrigatedLand,
|
|
|
- dryLand,
|
|
|
-
|
|
|
+ selectedLandType,
|
|
|
irrigationWaterUsage,
|
|
|
irrigationEfficiency,
|
|
|
-
|
|
|
irrigatedWaterUsage,
|
|
|
irrigatedEfficiency,
|
|
|
-
|
|
|
dryWaterUsage,
|
|
|
dryEfficiency,
|
|
|
-
|
|
|
calculateFlux,
|
|
|
- fluxResult
|
|
|
+ fluxResult,
|
|
|
+ showCalculation,
|
|
|
+ showResults,
|
|
|
+ loading,
|
|
|
+ mapImageUrl,
|
|
|
+ histogramImageUrl,
|
|
|
+ statisticsData,
|
|
|
+ formatNumber,
|
|
|
+ backToCalculation
|
|
|
};
|
|
|
}
|
|
|
};
|
|
@@ -235,19 +433,73 @@ export default {
|
|
|
display: flex;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
- padding: 10px;
|
|
|
+ flex-direction: column;
|
|
|
}
|
|
|
|
|
|
-.compact-card {
|
|
|
- background: linear-gradient(135deg,
|
|
|
- rgba(250, 253, 255, 0.8),
|
|
|
- rgba(137, 223, 252, 0.8));
|
|
|
- padding: 20px;
|
|
|
- border: 1px solid #e0f7fa;
|
|
|
+.gradient-card {
|
|
|
+ /* 半透明渐变背景 */
|
|
|
+ background: linear-gradient(
|
|
|
+ 135deg,
|
|
|
+ rgba(250, 253, 255, 0.8),
|
|
|
+ rgba(137, 223, 252, 0.8)
|
|
|
+ );
|
|
|
+ width: 80%;
|
|
|
+ max-width: 800px;
|
|
|
+ padding: 25px;
|
|
|
+ box-sizing: border-box;
|
|
|
border-radius: 12px;
|
|
|
- width: 100%;
|
|
|
- max-width: 650px;
|
|
|
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
|
+ border: none;
|
|
|
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
|
|
+ backdrop-filter: blur(5px); /* 添加模糊效果增强半透明感 */
|
|
|
+}
|
|
|
+
|
|
|
+.results-card {
|
|
|
+ background: linear-gradient(
|
|
|
+ 135deg,
|
|
|
+ rgba(250, 253, 255, 0.8),
|
|
|
+ rgba(137, 223, 252, 0.8)
|
|
|
+ );
|
|
|
+ width: 90%;
|
|
|
+ max-width: 1200px;
|
|
|
+ padding: 30px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ border-radius: 12px;
|
|
|
+ border: none;
|
|
|
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
|
|
|
+}
|
|
|
+
|
|
|
+.results-header {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ padding-bottom: 15px;
|
|
|
+ border-bottom: 1px solid #e4e7ed;
|
|
|
+}
|
|
|
+
|
|
|
+.result-title {
|
|
|
+ font-size: 24px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #303133;
|
|
|
+ text-align: center;
|
|
|
+ flex-grow: 1;
|
|
|
+}
|
|
|
+
|
|
|
+/* 输入框标题样式 */
|
|
|
+.input-title {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #606266;
|
|
|
+ margin-bottom: 5px;
|
|
|
+ text-align: left;
|
|
|
+}
|
|
|
+
|
|
|
+/* 单选框容器 */
|
|
|
+.radio-container {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-start;
|
|
|
+ align-items: center;
|
|
|
+ height: 100%;
|
|
|
}
|
|
|
|
|
|
.compact-title-section {
|
|
@@ -325,18 +577,18 @@ export default {
|
|
|
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
|
|
|
}
|
|
|
|
|
|
-:deep(.compact-input .el-input__inner:disabled) {
|
|
|
- background-color: #f5f7fa;
|
|
|
- opacity: 0.7;
|
|
|
+:deep(.el-radio) {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-start;
|
|
|
+ text-align: left;
|
|
|
}
|
|
|
|
|
|
-.compact-button-section {
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- margin: 15px 0;
|
|
|
+:deep(.el-radio__label) {
|
|
|
+ text-align: left;
|
|
|
}
|
|
|
|
|
|
-.compact-calculate-btn {
|
|
|
+.calculate-btn {
|
|
|
width: 100%;
|
|
|
max-width: 300px;
|
|
|
height: 42px;
|
|
@@ -395,4 +647,93 @@ export default {
|
|
|
color: #555;
|
|
|
margin-top: 5px;
|
|
|
}
|
|
|
+
|
|
|
+/* 结果区域样式 */
|
|
|
+.results-container {
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.result-subtitle {
|
|
|
+ text-align: center;
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 20px;
|
|
|
+ margin-bottom: 15px;
|
|
|
+ color: #333;
|
|
|
+ padding-bottom: 5px;
|
|
|
+ border-bottom: 1px solid #eee;
|
|
|
+}
|
|
|
+
|
|
|
+.result-image {
|
|
|
+ width: 100%;
|
|
|
+ max-height: 400px;
|
|
|
+ object-fit: contain;
|
|
|
+ border-radius: 8px;
|
|
|
+ border: 1px solid #e4e7ed;
|
|
|
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
|
+ background-color: #f8f8f8;
|
|
|
+}
|
|
|
+
|
|
|
+.image-placeholder {
|
|
|
+ height: 400px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ border: 1px dashed #dcdfe6;
|
|
|
+ border-radius: 8px;
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ color: #909399;
|
|
|
+ font-style: italic;
|
|
|
+ font-size: 18px;
|
|
|
+}
|
|
|
+
|
|
|
+.statistics-container {
|
|
|
+ background-color: rgba(255, 255, 255, 0.7);
|
|
|
+ border-radius: 12px;
|
|
|
+ padding: 25px;
|
|
|
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 表格样式增强 */
|
|
|
+:deep(.el-table) {
|
|
|
+ margin-bottom: 25px;
|
|
|
+ border-radius: 10px;
|
|
|
+ overflow: hidden;
|
|
|
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-table__header) {
|
|
|
+ background-color: #f0f8ff;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-table th) {
|
|
|
+ background-color: #f0f8ff;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #2c3e50;
|
|
|
+ font-size: 16px;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-table td) {
|
|
|
+ font-size: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 返回按钮样式 */
|
|
|
+.back-button {
|
|
|
+ position: absolute;
|
|
|
+ top: 20px;
|
|
|
+ left: 20px; /* 从right改为left */
|
|
|
+ width: 120px;
|
|
|
+ font-size: 16px;
|
|
|
+ padding: 10px;
|
|
|
+ background: linear-gradient(to right, #8DF9F0, #26B046);
|
|
|
+ color: white;
|
|
|
+ border: none;
|
|
|
+ border-radius: 20px;
|
|
|
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
|
|
+ z-index: 10; /* 确保按钮在顶层 */
|
|
|
+}
|
|
|
+
|
|
|
+.back-button:hover {
|
|
|
+ background: linear-gradient(to right, #7de8df, #20a03d);
|
|
|
+}
|
|
|
</style>
|