@@ -15,11 +15,11 @@
-
+
-
+
diff --git a/src/views/pest/index.vue b/src/views/pest/index.vue
index 2958b61..d314766 100644
--- a/src/views/pest/index.vue
+++ b/src/views/pest/index.vue
@@ -1,7 +1,7 @@
-
+
+
+
+
+
+ 设备列表
+
+
+
+
+
+
+
+
diff --git a/src/views/pest/trendAnalysis/components/SearchForm.vue b/src/views/pest/trendAnalysis/components/SearchForm.vue
new file mode 100644
index 0000000..01df0de
--- /dev/null
+++ b/src/views/pest/trendAnalysis/components/SearchForm.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+ 搜索
+ 导出
+ 重置
+
+
+
+
+
diff --git a/src/views/pest/trendAnalysis/components/TrendChart.vue b/src/views/pest/trendAnalysis/components/TrendChart.vue
new file mode 100644
index 0000000..dbc8b1d
--- /dev/null
+++ b/src/views/pest/trendAnalysis/components/TrendChart.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/pest/trendAnalysis/components/chartAction.vue b/src/views/pest/trendAnalysis/components/chartAction.vue
new file mode 100644
index 0000000..e9449ba
--- /dev/null
+++ b/src/views/pest/trendAnalysis/components/chartAction.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pest/trendAnalysis/index.vue b/src/views/pest/trendAnalysis/index.vue
new file mode 100644
index 0000000..9ffecc9
--- /dev/null
+++ b/src/views/pest/trendAnalysis/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pest/trendAnalysis/mockData.js b/src/views/pest/trendAnalysis/mockData.js
new file mode 100644
index 0000000..bee71d4
--- /dev/null
+++ b/src/views/pest/trendAnalysis/mockData.js
@@ -0,0 +1,10 @@
+export const devices = [
+ {
+ id: "1",
+ name: "设备1",
+ },
+ {
+ id: "2",
+ name: "设备2",
+ },
+];
diff --git a/src/views/weather/history/components/HistoryTable.vue b/src/views/weather/history/components/HistoryTable.vue
new file mode 100644
index 0000000..7a88865
--- /dev/null
+++ b/src/views/weather/history/components/HistoryTable.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/weather/history/components/SearchForm.vue b/src/views/weather/history/components/SearchForm.vue
new file mode 100644
index 0000000..b0097f9
--- /dev/null
+++ b/src/views/weather/history/components/SearchForm.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 导出
+ 重置
+
+
+
+
+
diff --git a/src/views/weather/history/config.js b/src/views/weather/history/config.js
new file mode 100644
index 0000000..135b8c9
--- /dev/null
+++ b/src/views/weather/history/config.js
@@ -0,0 +1,18 @@
+/*
+ * @Author: chris
+ * @Date: 2025-09-05 10:12:41
+ * @LastEditors: chris
+ * @LastEditTime: 2025-09-09 16:17:59
+ */
+// 列配置
+export const columnsConfig = [
+ { key: 0, label: "参数名称", visible: true },
+ { key: 1, label: "数值", visible: true },
+ { key: 2, label: "记录时间", visible: true },
+];
+
+// 状态颜色映射
+export const statusColorMap = {
+ 0: "success",
+ 1: "danger",
+};
diff --git a/src/views/weather/history/index.vue b/src/views/weather/history/index.vue
new file mode 100644
index 0000000..cbd6215
--- /dev/null
+++ b/src/views/weather/history/index.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/weather/monitor/components/LiveData.vue b/src/views/weather/monitor/components/LiveData.vue
new file mode 100644
index 0000000..d2a8d0a
--- /dev/null
+++ b/src/views/weather/monitor/components/LiveData.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.title }}
+
+ {{ item.value }}
+ {{ item.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/weather/monitor/components/WeatherChart.vue b/src/views/weather/monitor/components/WeatherChart.vue
new file mode 100644
index 0000000..5736172
--- /dev/null
+++ b/src/views/weather/monitor/components/WeatherChart.vue
@@ -0,0 +1,460 @@
+
+
+
+
+
+
+
+
+ 近7天
+ 近30天
+ 近90天
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/weather/monitor/index.vue b/src/views/weather/monitor/index.vue
index e69de29..c13b33b 100644
--- a/src/views/weather/monitor/index.vue
+++ b/src/views/weather/monitor/index.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/weather/monitor/mock.js b/src/views/weather/monitor/mock.js
new file mode 100644
index 0000000..1708bab
--- /dev/null
+++ b/src/views/weather/monitor/mock.js
@@ -0,0 +1,240 @@
+// 气象数据模拟工具
+
+/**
+ * 生成日期数组
+ * @param {number} days - 天数
+ * @returns {Array} 日期数组
+ */
+const generateDates = (days) => {
+ const dates = [];
+ const today = new Date();
+
+ for (let i = days - 1; i >= 0; i--) {
+ const date = new Date(today);
+ date.setDate(date.getDate() - i);
+ dates.push(`${date.getMonth() + 1}/${date.getDate()}`);
+ }
+
+ return dates;
+};
+
+/**
+ * 生成随机数值数组
+ * @param {number} count - 数据点数量
+ * @param {number} min - 最小值
+ * @param {number} max - 最大值
+ * @param {number} base - 基准值
+ * @param {number} volatility - 波动率 (0-1)
+ * @returns {Array} 数值数组
+ */
+const generateValues = (count, min, max, base = 0, volatility = 0.1) => {
+ const values = [];
+ let current = base || min + (max - min) * Math.random();
+
+ for (let i = 0; i < count; i++) {
+ // 添加随机波动
+ const change = (max - min) * volatility * (Math.random() - 0.5);
+ current = Math.max(min, Math.min(max, current + change));
+
+ // 对于特定类型添加趋势
+ if (i % 10 === 0 && Math.random() > 0.7) {
+ current += (max - min) * 0.05 * (Math.random() - 0.5);
+ }
+
+ values.push(parseFloat(current.toFixed(1)));
+ }
+
+ return values;
+};
+
+/**
+ * 生成指定天数的气象数据
+ * @param {number} days - 天数
+ * @returns {Object} 气象数据对象
+ */
+const generateWeatherData = (days) => {
+ const dates = generateDates(days);
+ const count = dates.length;
+
+ return {
+ // 温度数据 (10-35°C)
+ temperature: {
+ 7: {
+ dates: generateDates(7),
+ values: generateValues(7, 15, 30, 22, 0.15),
+ },
+ 30: {
+ dates: generateDates(30),
+ values: generateValues(30, 10, 35, 23, 0.15),
+ },
+ 90: {
+ dates: generateDates(90),
+ values: generateValues(90, 5, 38, 22, 0.2),
+ },
+ },
+
+ // 湿度数据 (30-95%)
+ humidity: {
+ 7: {
+ dates: generateDates(7),
+ values: generateValues(7, 40, 90, 65, 0.2),
+ },
+ 30: {
+ dates: generateDates(30),
+ values: generateValues(30, 30, 95, 60, 0.25),
+ },
+ 90: {
+ dates: generateDates(90),
+ values: generateValues(90, 25, 98, 62, 0.25),
+ },
+ },
+
+ // 降雨量数据 (0-50mm)
+ rainfall: {
+ 7: { dates: generateDates(7), values: generateRainfallValues(7) },
+ 30: { dates: generateDates(30), values: generateRainfallValues(30) },
+ 90: { dates: generateDates(90), values: generateRainfallValues(90) },
+ },
+
+ // 风速数据 (0-15m/s)
+ windSpeed: {
+ 7: { dates: generateDates(7), values: generateValues(7, 0, 10, 3, 0.3) },
+ 30: {
+ dates: generateDates(30),
+ values: generateValues(30, 0, 15, 3.5, 0.3),
+ },
+ 90: {
+ dates: generateDates(90),
+ values: generateValues(90, 0, 20, 4, 0.35),
+ },
+ },
+
+ // 气压数据 (980-1040hPa)
+ pressure: {
+ 7: {
+ dates: generateDates(7),
+ values: generateValues(7, 990, 1030, 1013, 0.05),
+ },
+ 30: {
+ dates: generateDates(30),
+ values: generateValues(30, 985, 1035, 1015, 0.05),
+ },
+ 90: {
+ dates: generateDates(90),
+ values: generateValues(90, 980, 1040, 1012, 0.07),
+ },
+ },
+
+ // 光照数据 (0-100000lux)
+ light: {
+ 7: { dates: generateDates(7), values: generateLightValues(7) },
+ 30: { dates: generateDates(30), values: generateLightValues(30) },
+ 90: { dates: generateDates(90), values: generateLightValues(90) },
+ },
+ };
+};
+
+/**
+ * 生成降雨量数据(特殊处理,大部分为0)
+ * @param {number} count - 数据点数量
+ * @returns {Array} 降雨量数组
+ */
+const generateRainfallValues = (count) => {
+ const values = [];
+
+ for (let i = 0; i < count; i++) {
+ // 80%的概率无雨
+ if (Math.random() < 0.8) {
+ values.push(0);
+ } else {
+ // 小雨到大雨
+ const rain =
+ Math.random() < 0.7
+ ? parseFloat((Math.random() * 10).toFixed(1)) // 小雨 (0-10mm)
+ : parseFloat((10 + Math.random() * 40).toFixed(1)); // 大雨 (10-50mm)
+ values.push(rain);
+ }
+ }
+
+ return values;
+};
+
+/**
+ * 生成光照数据(模拟昼夜变化)
+ * @param {number} count - 数据点数量
+ * @returns {Array} 光照数组
+ */
+const generateLightValues = (count) => {
+ const values = [];
+
+ for (let i = 0; i < count; i++) {
+ // 模拟白天光照强,晚上光照弱
+ const hour = Math.floor(Math.random() * 24);
+ let light;
+
+ if (hour >= 6 && hour <= 18) {
+ // 白天 5000-100000lux
+ light = 5000 + Math.random() * 95000;
+ } else if ((hour >= 5 && hour < 6) || (hour > 18 && hour <= 19)) {
+ // 晨昏 100-5000lux
+ light = 100 + Math.random() * 4900;
+ } else {
+ // 夜晚 0-100lux
+ light = Math.random() * 100;
+ }
+
+ // 添加天气影响(阴天光照减弱)
+ if (Math.random() < 0.3) {
+ light *= 0.3 + Math.random() * 0.5;
+ }
+
+ values.push(parseFloat(light.toFixed(0)));
+ }
+
+ return values;
+};
+
+/**
+ * 生成实时气象数据
+ * @returns {Object} 实时气象数据
+ */
+const generateRealtimeWeatherData = () => {
+ return {
+ temperature: parseFloat((15 + Math.random() * 20).toFixed(1)),
+ humidity: parseFloat((30 + Math.random() * 65).toFixed(1)),
+ rainfall: parseFloat((Math.random() * 10).toFixed(1)),
+ windSpeed: parseFloat((Math.random() * 15).toFixed(1)),
+ pressure: parseFloat((990 + Math.random() * 40).toFixed(1)),
+ light: parseFloat((Math.random() * 100000).toFixed(0)),
+ updateTime: new Date().toLocaleTimeString("zh-CN"),
+ };
+};
+
+// 导出模拟数据
+export const weatherMockData = generateWeatherData();
+export const realtimeWeatherData = generateRealtimeWeatherData();
+
+/**
+ * 获取指定气象类型和时间范围的格式化数据(用于WeatherChart组件)
+ * @param {string} weatherType - 气象类型
+ * @param {number} days - 时间范围(7/30/90天)
+ * @returns {Object} 格式化的数据 { dates: [], values: [] }
+ */
+const getFormattedWeatherData = (weatherType, days) => {
+ // 验证参数
+ if (!weatherMockData[weatherType] || !weatherMockData[weatherType][days]) {
+ console.error(`无效的气象类型或时间范围: ${weatherType}, ${days}`);
+ return { dates: [], values: [] };
+ }
+
+ return weatherMockData[weatherType][days];
+};
+
+// 导出工具函数供其他组件使用
+export {
+ generateDates,
+ generateValues,
+ generateWeatherData,
+ generateRealtimeWeatherData,
+ getFormattedWeatherData,
+};