Browse Source

[Feat 0000]功能逻辑优化

bobo04052021@163.com 1 day ago
parent
commit
2616f82043
100 changed files with 2413 additions and 696 deletions
  1. 96 65
      App.vue
  2. 17 7
      api/api.js
  3. 112 90
      common/router/index.js
  4. 3 2
      common/service/config.service.js
  5. 30 12
      common/service/service.js
  6. 164 0
      common/util/deviceIcon.js
  7. 21 10
      manifest.json
  8. 4 1
      pages.json
  9. 81 43
      pages/common/exit.vue
  10. 235 3
      pages/device/index.vue
  11. 158 31
      pages/filecenter/filecenter.vue
  12. 4 0
      pages/gasreport/components/gasFill.vue
  13. 5 6
      pages/gasreport/components/gasImgIdentify.vue
  14. 2 4
      pages/gasreport/components/save-component.vue
  15. 12 7
      pages/gasreport/components/taskBoard.vue
  16. 242 196
      pages/gasreport/components/taskBoardAddress.vue
  17. 19 6
      pages/gasreport/gasreport.vue
  18. 55 56
      pages/home/detail/autodoor/autodoor.vue
  19. 81 62
      pages/home/home.vue
  20. 2 1
      pages/ipConfig/ipConfig.vue
  21. 1 1
      pages/login/login copy.vue
  22. 23 5
      pages/login/login.vue
  23. 206 36
      pages/user/people.vue
  24. 14 10
      pages/warndata/components/device-detail.vue
  25. 13 7
      pages/warndata/components/dust-detail.vue
  26. 13 3
      pages/warndata/components/fire-detail.vue
  27. 13 3
      pages/warndata/components/gas-detail.vue
  28. 13 3
      pages/warndata/components/vent-detail.vue
  29. 9 3
      pages/warndata/warndata.vue
  30. 29 23
      pages/webview/webview.vue
  31. 9 0
      static/icon-new/Fan1StartStatus_str.svg
  32. 9 0
      static/icon-new/Fan2StartStatus_str.svg
  33. 9 0
      static/icon-new/FanStartStatus.svg
  34. 9 0
      static/icon-new/FanStartStatus_str.svg
  35. 9 0
      static/icon-new/Fan_MOT1_Power.svg
  36. 9 0
      static/icon-new/Fan_MOT2_Power.svg
  37. 9 0
      static/icon-new/T.svg
  38. 9 0
      static/icon-new/V.svg
  39. 9 0
      static/icon-new/airLeakageRatePerHundred_merge.svg
  40. 9 0
      static/icon-new/airSupplyDistence_merge.svg
  41. 9 0
      static/icon-new/atomizeState.svg
  42. 9 0
      static/icon-new/atomizeState_str.svg
  43. 12 0
      static/icon-new/batteryLevel.svg
  44. 11 0
      static/icon-new/centerTemperature.svg
  45. 14 0
      static/icon-new/ch2val.svg
  46. 9 0
      static/icon-new/ch4.svg
  47. 7 0
      static/icon-new/chval.svg
  48. 17 0
      static/icon-new/co2_merge.svg
  49. 17 0
      static/icon-new/co2val.svg
  50. 14 0
      static/icon-new/controlState.svg
  51. 14 0
      static/icon-new/controlState_str.svg
  52. 14 0
      static/icon-new/coval.svg
  53. 9 0
      static/icon-new/createtime.svg
  54. 12 0
      static/icon-new/cumulativeFlow.svg
  55. 13 0
      static/icon-new/density.svg
  56. 9 0
      static/icon-new/ductOutletAirVolume_merge.svg
  57. 17 0
      static/icon-new/dustval.svg
  58. 10 0
      static/icon-new/favg.svg
  59. 9 0
      static/icon-new/fengsu_merge.svg
  60. 9 0
      static/icon-new/fireval.svg
  61. 9 0
      static/icon-new/fireval_str.svg
  62. 12 0
      static/icon-new/flowRate.svg
  63. 9 0
      static/icon-new/flow_merge.svg
  64. 10 0
      static/icon-new/fmax.svg
  65. 10 0
      static/icon-new/fmin.svg
  66. 12 0
      static/icon-new/frontRearDP.svg
  67. 12 0
      static/icon-new/frontRearDifference.svg
  68. 10 0
      static/icon-new/fsectarea.svg
  69. 9 0
      static/icon-new/fy_merge.svg
  70. 9 0
      static/icon-new/gasC.svg
  71. 9 0
      static/icon-new/gasMixMass.svg
  72. 9 0
      static/icon-new/gcreatetime.svg
  73. 9 0
      static/icon-new/groutingPump.svg
  74. 9 0
      static/icon-new/groutingPump_str.svg
  75. 12 0
      static/icon-new/humidity.svg
  76. 12 0
      static/icon-new/inletAirVolume_merge.svg
  77. 13 0
      static/icon-new/instantaneousFlow.svg
  78. 12 0
      static/icon-new/kpa.svg
  79. 9 0
      static/icon-new/monitorValue.svg
  80. 12 0
      static/icon-new/nitrogenContent.svg
  81. 13 0
      static/icon-new/nitrogenPressure.svg
  82. 16 0
      static/icon-new/o2val.svg
  83. 9 0
      static/icon-new/onState.svg
  84. 9 0
      static/icon-new/onState_str.svg
  85. 11 0
      static/icon-new/outletTemperature.svg
  86. 9 0
      static/icon-new/pa.svg
  87. 9 0
      static/icon-new/pressure.svg
  88. 13 0
      static/icon-new/pulpingMachine.svg
  89. 13 0
      static/icon-new/pulpingMachine_str.svg
  90. 9 0
      static/icon-new/ratio.svg
  91. 9 0
      static/icon-new/readTime.svg
  92. 9 0
      static/icon-new/smokeval.svg
  93. 9 0
      static/icon-new/smokeval_str.svg
  94. 9 0
      static/icon-new/sprayval.svg
  95. 9 0
      static/icon-new/strname.svg
  96. 11 0
      static/icon-new/temperature.svg
  97. 9 0
      static/icon-new/timedState.svg
  98. 9 0
      static/icon-new/timeval.svg
  99. 9 0
      static/icon-new/ttime.svg
  100. 9 0
      static/icon-new/typeName.svg

+ 96 - 65
App.vue

@@ -6,17 +6,20 @@
 import Vue from "vue";
 import configService from "@/common/service/config.service.js";
 import api from "@/api/api";
+import { ACCESS_TOKEN, USER_INFO } from "@/common/util/constants";
 export default {
   data() {
     return {
-      socketTask: null,//websocket对象
+      socketTask: null, //websocket对象
       updateChecked: false, //每次启动只检查一次更新
-    }
+    };
   },
   onLaunch: function () {
-    //消息推送
-    this.getPushClientID()
+    // 把本地保存的登录信息同步回内存,冷启动后保持登录状态
+    this.restoreLoginState();
 
+    //消息推送
+    this.getPushClientID();
 
     const savedIP = uni.getStorageSync("selectedIP");
     if (configService.apiUrl !== "") {
@@ -295,60 +298,86 @@ export default {
     clearInterval(this.$store.state.timer); // 假设定时器存储在 Vuex 的状态管理中
   },
   methods: {
+    // 启动时把本地保存的登录信息同步到内存(不清除、不强制重新登录)
+    restoreLoginState() {
+      const token = uni.getStorageSync(ACCESS_TOKEN);
+      console.log(
+        "启动登录状态:",
+        token ? "本地有登录信息" : "本地没有登录信息",
+        "apiUrl=",
+        uni.getStorageSync("apiUrl")
+      );
+      if (!token) {
+        return;
+      }
+      const userInfo = uni.getStorageSync(USER_INFO) || {};
+      try {
+        this.$store.commit("SET_TOKEN", token);
+        this.$store.commit("SET_NAME", {
+          username: userInfo.username,
+          realname: userInfo.realname,
+        });
+        this.$store.commit("SET_AVATAR", userInfo.avatar);
+      } catch (e) {
+        console.log("restoreLoginState", e);
+      }
+    },
     //消息推送
     getPushClientID() {
-      uni.getPushClientId({
-        //获取客户端推送标识
-        success: (res) => {
-          console.log(res.cid, 'cid---');
-          uni.setStorageSync('push_cid', res.cid); // 存储CID供后续使用
-        },
-        fail(err) {
-          console.log(err)
-        }
-      });
+      // uni.getPushClientId({
+      //   //获取客户端推送标识
+      //   success: (res) => {
+      //     console.log(res.cid, "cid---");
+      //     uni.setStorageSync("push_cid", res.cid); // 存储CID供后续使用
+      //   },
+      //   fail(err) {
+      //     console.log(err);
+      //   },
+      // });
     },
     // 检测版本
     checkVersion() {
       plus.runtime.getProperty(plus.runtime.appid, (appInfo) => {
         // 获取版本号
-        const currentVersion = appInfo.version
+        const currentVersion = appInfo.version;
         // 这是用来看看版本是多少的
-        console.log(currentVersion, '版本号');
-        this.getVersionFn(currentVersion)
+        console.log(currentVersion, "版本号");
+        this.getVersionFn(currentVersion);
       });
     },
     getVersionFn(currentVersion) {
-      let that = this
+      let that = this;
       new Promise((resolve, reject) => {
         api
           .getAppLast({})
           .then((response) => {
             if (response.statusCode == 200) {
-              console.log(response, '响应数据')
-              const updateUrl = `${configService.apiUrlP}:9999${response.data.downloadUrl}`;  // 下载地址
-              let indexF = response.data.filename.lastIndexOf('-')
-              let indexL = response.data.filename.lastIndexOf('.')
-              const latestVersion = response.data.filename.substring(indexF + 1, indexL)// 版本号
-              console.log(updateUrl, '下载地址')
-              console.log(latestVersion, '版本号')
+              console.log(response, "响应数据");
+              const updateUrl = `${configService.apiUrlP}:9999${response.data.downloadUrl}`; // 下载地址
+              let indexF = response.data.filename.lastIndexOf("-");
+              let indexL = response.data.filename.lastIndexOf(".");
+              const latestVersion = response.data.filename.substring(
+                indexF + 1,
+                indexL
+              ); // 版本号
+              console.log(updateUrl, "下载地址");
+              console.log(latestVersion, "版本号");
               // 比较版本号,判断是否有新版本
               if (that.compareVersion(currentVersion, latestVersion) < 0) {
                 // 提示用户更新
-                uni.showModal({
-                  title: '更新提示',
-                  content: '检测到新版本,是否立即更新?',
-                  success: (modalRes) => {
-                    if (modalRes.confirm) {
-                      // 用户确认更新,下载新版本
-                      that.downloadAndInstall(updateUrl);
-                    }
-                  }
-                });
+                // uni.showModal({
+                //   title: "更新提示",
+                //   content: "检测到新版本,是否立即更新?",
+                //   success: (modalRes) => {
+                //     if (modalRes.confirm) {
+                //       // 用户确认更新,下载新版本
+                //       that.downloadAndInstall(updateUrl);
+                //     }
+                //   },
+                // });
               } else {
-                console.log('当前已是最新版本');
+                console.log("当前已是最新版本");
               }
-
             } else {
               reject(response);
             }
@@ -362,8 +391,8 @@ export default {
 
     // 比较版本号
     compareVersion(v1, v2) {
-      const version1 = v1.split('.').map(Number);
-      const version2 = v2.split('.').map(Number);
+      const version1 = v1.split(".").map(Number);
+      const version2 = v2.split(".").map(Number);
 
       for (let i = 0; i < version1.length; i++) {
         if (version1[i] < version2[i]) {
@@ -377,36 +406,39 @@ export default {
 
     // 下载并安装新版本
     downloadAndInstall(url) {
-      let dtask = plus.downloader.createDownload(url, {
-        filename: '_downloads/temporary.apk' //利用保存路径,实现下载文件的重命名
-      },
+      let dtask = plus.downloader.createDownload(
+        url,
+        {
+          filename: "_downloads/temporary.apk", //利用保存路径,实现下载文件的重命名
+        },
         function (d, status) {
-          // 下载完成  
+          // 下载完成
           if (status == 200) {
-            plus.runtime.install(plus.io.convertLocalFileSystemURL(
-              d.filename), {}, {}, function (error) {
+            plus.runtime.install(
+              plus.io.convertLocalFileSystemURL(d.filename),
+              {},
+              {},
+              function (error) {
                 uni.showToast({
-                  title: '安装失败',
-                  duration: 1500
+                  title: "安装失败",
+                  duration: 1500,
                 });
-              })
+              }
+            );
           } else {
             uni.showToast({
-              title: '更新失败',
-              duration: 1500
+              title: "更新失败",
+              duration: 1500,
             });
           }
-        });
+        }
+      );
       try {
-        console.log('开始下载');
+        console.log("开始下载");
         dtask.start(); // 开启下载的任务
         let prg = 0;
-        let showLoading = plus.nativeUI.showWaiting(
-          "正在下载"); //创建一个showWaiting对象 
-        dtask.addEventListener('statechanged', function (
-          task,
-          status
-        ) {
+        let showLoading = plus.nativeUI.showWaiting("正在下载"); //创建一个showWaiting对象
+        dtask.addEventListener("statechanged", function (task, status) {
           // 给下载任务设置一个监听 并根据状态  做操作
           switch (task.state) {
             case 1:
@@ -417,9 +449,8 @@ export default {
               break;
             case 3:
               prg = parseInt(
-                (parseFloat(task.downloadedSize) /
-                  parseFloat(task.totalSize)) *
-                100
+                (parseFloat(task.downloadedSize) / parseFloat(task.totalSize)) *
+                  100
               );
               showLoading.setTitle("  正在下载" + prg + "%  ");
               break;
@@ -432,13 +463,13 @@ export default {
       } catch (err) {
         plus.nativeUI.closeWaiting();
         uni.showToast({
-          title: '更新失败',
+          title: "更新失败",
           mask: false,
-          duration: 1500
+          duration: 1500,
         });
       }
-    }
-  }
+    },
+  },
 };
 </script>
 

+ 17 - 7
api/api.js

@@ -77,7 +77,7 @@ const apiService = {
   getDeviceType(params) {
     return http.get(
       "/safety/ventanalyDeviceInfo/DeviceKind/queryBySystem",
-      params
+      params,
     );
   },
 
@@ -94,6 +94,12 @@ const apiService = {
   getDeviceMonitor(params) {
     return http.post("/monitor/device", params);
   },
+  // 查询设备类型字典(如安全监控的监测类型下拉项)
+  // 入参:{ devicetype: "safetymonitor", code: "dataTypeName" }
+  // 返回:[{ code: "0004", name: "一氧化碳" }, ...]
+  getCodeDict(params) {
+    return http.post("/monitor/codeDict", params);
+  },
   //查询场景类型数据
   getSysList(params) {
     const url = buildURL("/safety/ventanalyManageSystem/list", params);
@@ -110,7 +116,7 @@ const apiService = {
   controlDevice(params) {
     return http.put(
       "/ventanaly-device/safety/ventanalyMonitorData/devicecontrol",
-      params
+      params,
     );
   },
   //根据设备id 查询该设备关联的视频流url
@@ -161,7 +167,7 @@ const apiService = {
   getOpreateHistory(params) {
     const url = buildURL(
       "/ventanaly-device/safety/ventanalyDevicesetLog/list",
-      params
+      params,
     );
     return http.get(url);
   },
@@ -177,14 +183,14 @@ const apiService = {
   sysTypeWarn(params) {
     return http.post(
       "/ventanaly-device/safety/ventanalyAlarmLog/sysTypeWarn",
-      params
+      params,
     );
   },
   //获取通风预警监测详情信息
   sysWarn(params) {
     return http.post(
       "/ventanaly-device/safety/ventanalyAlarmLog/sysWarn",
-      params
+      params,
     );
   },
   //获取通风预警监测详情信息
@@ -208,8 +214,12 @@ const apiService = {
     return http.post("/ventanaly-sharefile/fileServer/preview", params);
   },
   // 下载文件
-  downloadFile(params) {
-    return http.post("/ventanaly-sharefile/fileServer/download", params);
+  downloadFile(params, options = {}) {
+    return http.post(
+      "/ventanaly-sharefile/fileServer/download",
+      params,
+      options,
+    );
   },
   // 删除文件
   delateFile(params) {

+ 112 - 90
common/router/index.js

@@ -1,102 +1,124 @@
-import modules from './modules'
-import Vue from 'vue'
-import Router from '@/plugin/uni-simple-router/index.js'
-import { ACCESS_TOKEN } from '@/common/util/constants.js'
-import configService from '@/common/service/config.service.js'
+import modules from "./modules";
+import Vue from "vue";
+import Router from "@/plugin/uni-simple-router/index.js";
+import { ACCESS_TOKEN } from "@/common/util/constants.js";
+import configService from "@/common/service/config.service.js";
 import api from "@/api/api";
-import { SKIP_SSO_URL_QUERY, locationUrl, openSso, getUrlParam } from './sso.js'
+import {
+  SKIP_SSO_URL_QUERY,
+  locationUrl,
+  openSso,
+  getUrlParam,
+} from "./sso.js";
 
-Vue.use(Router)
+Vue.use(Router);
 //初始化
 const router = new Router({
-	encodeURI: true,
-	routes: [...modules]//路由表
+  encodeURI: true,
+  routes: [...modules], //路由表
 });
 
-const whiteList = ['/pages/login/login']
+const whiteList = ["/pages/login/login"];
+// 防止短时间内重复跳转登录页
+let lastRedirectAt = 0;
 //全局路由前置守卫
 router.beforeEach((to, from, next) => {
-	let token = uni.getStorageSync(ACCESS_TOKEN);
-	
-	console.log("-----to---------------------"+JSON.stringify(token))
-	if (token) {
-		next()
-	} else {
-		// query如果没有明确要求跳过sso则执行sso登录
-				// const token = uni.getStorageSync(ACCESS_TOKEN);
-			const ticket = getUrlParam('ticket');
-			console.log("-----ticket---------------------"+ticket)
-		if (ticket != null && ticket != '') {
-			/**
-			   * 单点登录,返回是否需要跳转到单点登录页
-			*/
-			let redirect = false;
-			// if (openSso == 'true') {
-				if (!token) {
-					if (ticket) {
-						try {
-							new Promise((resolve, reject) => {
-								api
-									.validateCasLogin({
-										ticket: ""+ticket,
-										service: "http://localhost:8080/",
-									})
-									.then((response) => {
-										if (response.data.code == 200) {
-											uni.setStorageSync(ACCESS_TOKEN, response.data.result.token);
-											redirect = true;
-										} else {
-											reject(response);
-										}
-									})
-									.catch((error) => {
-										console.log("catch===>response", response);
-										reject(error);
-									});
-							});
+  let token = uni.getStorageSync(ACCESS_TOKEN);
 
-						} catch (e) {
-							redirect = true;
-							// if (process.env.VUE_APP_PLATFORM != 'h5') {
-							// 	uni.navigateTo({
-							// 		url: 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl())
-							// 	});
-							// } else {
-							// 	window.location.href = 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl());
-							// }
+  console.log("-----to---------------------" + JSON.stringify(token));
+  if (token) {
+    next();
+    return;
+  }
+  // 目标就是登录页,直接放行
+  if (whiteList.indexOf(to.path) !== -1) {
+    next();
+    return;
+  }
+  // 1 秒内只触发一次登录跳转,避免与退出登录 / 401 的 reLaunch 叠加
+  const now = Date.now();
+  if (now - lastRedirectAt < 1000) return;
+  lastRedirectAt = now;
+  {
+    // query如果没有明确要求跳过sso则执行sso登录
+    // const token = uni.getStorageSync(ACCESS_TOKEN);
+    const ticket = getUrlParam("ticket");
+    console.log("-----ticket---------------------" + ticket);
+    if (ticket != null && ticket != "") {
+      /**
+       * 单点登录,返回是否需要跳转到单点登录页
+       */
+      let redirect = false;
+      // if (openSso == 'true') {
+      if (!token) {
+        if (ticket) {
+          try {
+            new Promise((resolve, reject) => {
+              api
+                .validateCasLogin({
+                  ticket: "" + ticket,
+                  service: "http://localhost:8080/",
+                })
+                .then((response) => {
+                  if (response.data.code == 200) {
+                    uni.setStorageSync(
+                      ACCESS_TOKEN,
+                      response.data.result.token,
+                    );
+                    redirect = true;
+                  } else {
+                    reject(response);
+                  }
+                })
+                .catch((error) => {
+                  console.log("catch===>response", response);
+                  reject(error);
+                });
+            });
+          } catch (e) {
+            redirect = true;
+            // if (process.env.VUE_APP_PLATFORM != 'h5') {
+            // 	uni.navigateTo({
+            // 		url: 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl())
+            // 	});
+            // } else {
+            // 	window.location.href = 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl());
+            // }
+          }
+        } else {
+          if (window.location.search == "?type=noCas") {
+          } else {
+            redirect = true;
+            uni.navigateTo({
+              url:
+                "https://id.shendong.com.cn/default" +
+                "/login?service=" +
+                encodeURIComponent(locationUrl()),
+            });
+            // if (process.env.VUE_APP_PLATFORM != 'h5') {
+            // 	uni.navigateTo({
+            // 		url: 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl())
+            // 	});
+            // } else {
+            // 	window.location.href = 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl());
+            // }
+          }
+        }
+      }
+      // }
+      let redirectSso = redirect;
 
-						}
-					} else {
-						if (window.location.search == '?type=noCas') {
-						} else {
-							redirect = true;
-								uni.navigateTo({
-									url: 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl())
-								});
-							// if (process.env.VUE_APP_PLATFORM != 'h5') {
-							// 	uni.navigateTo({
-							// 		url: 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl())
-							// 	});
-							// } else {
-							// 	window.location.href = 'https://id.shendong.com.cn/default' + '/login?service=' + encodeURIComponent(locationUrl());
-							// }
-						}
-					}
-				}
-			// }
-			let redirectSso = redirect;
-
-			// 如果需要重定向到sso页面则取消路由导航
-			if (redirectSso) return;
-		} else if (whiteList.indexOf(to.path) !== -1) {
-			next()
-		} else {
-			next({ path: '/pages/login/login' })
-		}
-	}
-})
+      // 如果需要重定向到sso页面则取消路由导航
+      if (redirectSso) return;
+    } else if (whiteList.indexOf(to.path) !== -1) {
+      next();
+    } else {
+      next({ path: "/pages/login/login" });
+    }
+  }
+});
 // 全局路由后置守卫
 router.afterEach((to, from) => {
-	console.log("afterEach")
-})
-export default router;
+  console.log("afterEach");
+});
+export default router;

+ 3 - 2
common/service/config.service.js

@@ -10,13 +10,14 @@ if (process.env.NODE_ENV == "development") {
   // BASE_URL = "http://172.16.53.16:9999"; //大海则煤矿
   //BASE_URL = "http://10.7.0.19:9999"; //特拉布拉
   //BASE_URL = "http://10.35.116.82:9999"; //棋盘井东区
-  // BASE_URL = "http://182.92.126.35:9999"; //测试环境
+  BASE_URL = "http://182.92.126.35:9999"; //测试环境
 }
 let staticDomainURL = BASE_URL + "/sys/common/static";
 const configService = {
+  // apiUrl: uni.getStorageSync("apiUrl") || BASE_URL,
   apiUrl: BASE_URL || uni.getStorageSync("apiUrl"),
   apiUrlP: "http://182.92.126.35",
-  // apiUrlP: 'http://182.92.126.35:6006',
+  // apiUrlP: 'http://10.248.235.101',//神东
   staticDomainURL: staticDomainURL,
   hasBaseUrl: !!BASE_URL,
 };

+ 30 - 12
common/service/service.js

@@ -16,6 +16,8 @@ const getTokenStorage = () => {
 };
 
 const http = new Request();
+// 记录上次因登录失效跳登录页的时间,用于防止连续跳转
+let lastReloginAt = 0;
 http.setConfig((config) => {
   /* 设置全局配置 */
   config.baseUrl = configService.apiUrl; /* 根域名不同 */
@@ -75,11 +77,13 @@ http.interceptor.response(
           tip.error("拒绝访问");
           break;
         case 500:
-          if (!token || data.message == "Token失效,请重新登录") {
-            let timeout = setTimeout(tip.alert("登录已过期"), 1000);
+          // 仅在服务端明确提示 Token 失效时才清理登录态;
+          // 服务端偶发 500(如冷启动时网关未就绪)不应清掉本地登录信息,
+          // 否则重新打开应用会莫名要求重新登录
+          if (data.message == "Token失效,请重新登录") {
+            tip.alert("登录已过期");
             store.dispatch("Logout").then(() => {
-              clearTimeout(timeout);
-              window.location.reload();
+              uni.reLaunch({ url: "/pages/login/login" });
             });
           }
           break;
@@ -88,13 +92,27 @@ http.interceptor.response(
         case 504:
           break;
         case 401:
-          console.log("------异常响应-401-----", 401);
-
-          console.log("------uni-----", uni);
-          uni.navigateTo({
-            url: "/pages/login/login",
-          });
-          return;
+          {
+            console.log("------异常响应-401-----", 401);
+            const pages = getCurrentPages() || [];
+            const currentPage = pages[pages.length - 1];
+            const currentRoute = currentPage ? currentPage.route : "";
+            // 已经在登录页,不再重复跳转
+            if (currentRoute === "pages/login/login") {
+              return;
+            }
+            // 多个请求同时 401 时只跳一次,避免连续跳转被拦截
+            const now = Date.now();
+            if (lastReloginAt && now - lastReloginAt < 3000) {
+              return;
+            }
+            lastReloginAt = now;
+            // 登录失效:清空页面栈进入登录页,否则登录页侧滑会回到系统内部页面
+            uni.reLaunch({
+              url: "/pages/login/login",
+            });
+            return;
+          }
           if (token) {
             /* store.dispatch('Logout').then(() => {
              setTimeout(() => {
@@ -113,7 +131,7 @@ http.interceptor.response(
       }
     }
     return response;
-  }
+  },
 );
 
 export { http };

+ 164 - 0
common/util/deviceIcon.js

@@ -0,0 +1,164 @@
+/**
+ * 设备字段图标
+ * static/icon-new 下的图标已按接口 showColum 的 monitorcode 命名,
+ * 这里统一按 monitorcode 取图,取不到再按描述/关键字兜底。
+ */
+
+// 已按 monitorcode 命名的图标(忽略大小写匹配)
+const ICON_FILE_LIST = [
+  "airLeakageRatePerHundred_merge",
+  "airSupplyDistence_merge",
+  "atomizeState",
+  "atomizeState_str",
+  "batteryLevel",
+  "centerTemperature",
+  "ch2val",
+  "ch4",
+  "chval",
+  "co2_merge",
+  "co2val",
+  "controlState",
+  "controlState_str",
+  "coval",
+  "createtime",
+  "cumulativeFlow",
+  "density",
+  "ductOutletAirVolume_merge",
+  "dustval",
+  "Fan_MOT1_Power",
+  "Fan_MOT2_Power",
+  "Fan1StartStatus_str",
+  "Fan2StartStatus_str",
+  "FanStartStatus",
+  "FanStartStatus_str",
+  "favg",
+  "fengsu_merge",
+  "fireval",
+  "fireval_str",
+  "flow_merge",
+  "flowRate",
+  "fmax",
+  "fmin",
+  "frontRearDifference",
+  "frontRearDP",
+  "fsectarea",
+  "fy_merge",
+  "gasC",
+  "gasMixMass",
+  "gasval",
+  "gcreatetime",
+  "groutingPump",
+  "groutingPump_str",
+  "humidity",
+  "inletAirVolume_merge",
+  "instantaneousFlow",
+  "kpa",
+  "monitorValue",
+  "nitrogenContent",
+  "nitrogenPressure",
+  "o2val",
+  "onState",
+  "onState_str",
+  "outletTemperature",
+  "pa",
+  "pressure",
+  "pulpingMachine",
+  "pulpingMachine_str",
+  "ratio",
+  "readTime",
+  "smokeval",
+  "smokeval_str",
+  "sprayval",
+  "strname",
+  "T",
+  "temperature",
+  "timedState",
+  "timeval",
+  "ttime",
+  "type_merge",
+  "typeName",
+  "unitval",
+  "V",
+  "valvestate_str",
+  "waterPump",
+  "waterPump_str",
+  "waterSupply",
+  "windSpeed",
+  "ws_merge",
+];
+
+const ICON_CODE_MAP = {};
+ICON_FILE_LIST.forEach((name) => {
+  ICON_CODE_MAP[name.toLowerCase()] = name;
+});
+
+// 匹配不到时的默认图标
+const DEFAULT_ICON = "/static/icon-new/type_merge.svg";
+
+/**
+ * 按字段取图标
+ * @param {String} monitorcode 接口字段编码
+ * @param {String} des 字段中文描述
+ * @param {Number} fanNo 风机编号(1-主机 2-备机),非风机页面可不传
+ * @returns {String} 图标路径
+ */
+export function getDeviceIcon(monitorcode, des, fanNo) {
+  let code = (monitorcode || "").toLowerCase();
+  const desText = des || "";
+
+  // 风机型号(code = type_merge)固定使用 type_merge.svg
+  if (code == "type_merge" || desText.indexOf("风机型号") > -1) {
+    return "/static/icon-new/type_merge.svg";
+  }
+  // 甲烷类字段(ch4_merge 等,含 ch4 即可)使用 ch4.svg
+  if (code.indexOf("ch4") > -1) {
+    return "/static/icon-new/ch4.svg";
+  }
+  // 时间类字段(readTime、时间 等)使用 T.svg,排除“是否定时”等 timed 字段
+  if (
+    (code.indexOf("time") > -1 && code.indexOf("timed") == -1) ||
+    desText.indexOf("时间") > -1
+  ) {
+    return "/static/icon-new/T.svg";
+  }
+  if (desText.indexOf("温度") > -1) {
+    return "/static/icon-new/centerTemperature.svg";
+  }
+  // 风机主机/备机:monitorcode 形如 fan1xxx / fan_mot1_xxx,按编号取对应图标
+  if (fanNo) {
+    code = code.replace(/^(fan)_?mot[12]/, "$1_mot" + fanNo);
+    code = code.replace(/^(fan)[12]/, "$1" + fanNo);
+  }
+  // 优先按 monitorcode 直接取同名图标
+  if (code && ICON_CODE_MAP[code]) {
+    return "/static/icon-new/" + ICON_CODE_MAP[code] + ".svg";
+  }
+  if (code.indexOf("frontarea") > -1) {
+    return "/static/home/gfmj.svg";
+  }
+  if (code.indexOf("area") > -1) {
+    return "/static/icon-new/dmj.svg";
+  }
+  if (
+    code.indexOf("m3") > -1 ||
+    code.indexOf("va") > -1 ||
+    code.indexOf("forward") > -1
+  ) {
+    return "/static/icon-new/fl.svg";
+  }
+  if (code.indexOf("gate") > -1 || code.indexOf("door") > -1) {
+    return "/static/icon-new/door-icon.svg";
+  }
+  if (
+    code.indexOf("press") > -1 ||
+    code.indexOf("pressure") > -1 ||
+    code.indexOf("pa1") > -1 ||
+    code.indexOf("pa2") > -1 ||
+    code.indexOf("dp") > -1
+  ) {
+    return "/static/icon-new/qyyl-icon.svg";
+  }
+  return DEFAULT_ICON;
+}
+
+export default getDeviceIcon;

+ 21 - 10
manifest.json

@@ -1,11 +1,19 @@
 {
     "name" : "智能通风",
-    "appid" : "__UNI__2000523",
+    "appid" : "__UNI__8193760",
     "description" : "",
     "versionName" : "2.2.22",
     "versionCode" : 1,
     "transformPx" : false,
     "app-plus" : {
+        "permissions" : {
+            "plus.io" : {
+                "description" : "文件读写"
+            },
+            "Storage" : {
+                "description" : "读写存储,用于文件下载保存"
+            }
+        },
         "compatible" : {
             "ignoreVersion" : true,
             "runtimeVersion" : "4.23,4.29",
@@ -33,7 +41,11 @@
         "distribute" : {
             /* 应用发布信息 */
             "android" : {
-                /* android打包配置 */
+                /* android打包配置 *//* 下载文件要写入存储,Android 9 及以下需运行时申请该权限 */
+                "permissionExternalStorage" : {
+                    "request" : "always",
+                    "prompt" : "保存下载的文件需要访问设备存储权限"
+                },
                 "permissions" : [
                     "<uses-feature android:name=\"android.hardware.camera\"/>",
                     "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
@@ -79,13 +91,7 @@
                         "appkey_android" : "87f4d2a4a0c42e0c86cf312c8b8154e8"
                     }
                 },
-                "push" : {
-                    "unipush" : {
-                        "version" : "2",
-                        "offline" : true,
-                        "hms" : {}
-                    }
-                }
+                "push" : {}
             },
             "splashscreen" : {
                 "iosStyle" : "default",
@@ -166,5 +172,10 @@
         },
         "notch" : true
     },
-    "fallbackLocale" : "zh-Hans"
+    "fallbackLocale" : "zh-Hans",
+    "uniStatistics" : {
+        "version" : "2",
+        "type" : "public",
+        "enable" : true
+    }
 }

+ 4 - 1
pages.json

@@ -113,7 +113,10 @@
       "path": "pages/login/login",
       "style": {
         "navigationStyle": "custom",
-        "navigationBarTextStyle": "black"
+        "navigationBarTextStyle": "black",
+        "app-plus": {
+          "popGesture": "none"
+        }
       }
     },
     {

+ 81 - 43
pages/common/exit.vue

@@ -1,50 +1,88 @@
 <template>
-	<view>
-		<scroll-view :scroll-y="modalName==null" class="page" :class="modalName!=null?'show':''">
-			<cu-custom bgColor="bg-gradual-pink" :isBack="false">
-				<!-- <block slot="backText">返回</block> -->
-				<block slot="content">退出页</block>
-			</cu-custom>
-			<view class="solids-bottom padding-xs flex align-center">
-				<view class="flex-sub text-center">
-					<view class="solid-bottom text-xsl padding">
-						<text class=" cuIcon-roundcheckfill text-green"></text>
-					</view>
-					<view class="padding">{{item.msg}}</view>
-				</view>
-			</view>
-			<view class="padding flex flex-direction">
-				<button class="cu-btn bg-green shadow-blur round lg" @tap="goback()">返回登录
-				</button>
-			</view>
-		</scroll-view>
-	</view>
-
+  <view>
+    <scroll-view
+      :scroll-y="modalName == null"
+      class="page"
+      :class="modalName != null ? 'show' : ''"
+    >
+      <cu-custom bgColor="bg-gradual-pink" :isBack="false">
+        <!-- <block slot="backText">返回</block> -->
+        <block slot="content">退出页</block>
+      </cu-custom>
+      <view class="solids-bottom padding-xs flex align-center">
+        <view class="flex-sub text-center">
+          <view class="solid-bottom text-xsl padding">
+            <text class="cuIcon-roundcheckfill text-green"></text>
+          </view>
+          <view class="padding">{{ item.msg }}</view>
+        </view>
+      </view>
+      <view class="padding flex flex-direction">
+        <button class="cu-btn bg-green shadow-blur round lg" @tap="goback()">
+          返回登录
+        </button>
+      </view>
+    </scroll-view>
+  </view>
 </template>
 
 <script>
-	import api from "@/api/api";
-	
-	export default {
-		data() {
-			return {
-				modalName: null,
-				item:{msg:'退出成功'},
-			}
-		},
-		onLoad: function (option) {
-			api.logout().then(res=>{
-				uni.clearStorageSync()
-			})
-		},
-		methods: {
-			goback(){
-				uni.navigateTo({
-					url:'/pages/login/login'
-				})
-			}
-		}
-	}
+import api from "@/api/api";
+import { ACCESS_TOKEN, USER_NAME, USER_INFO } from "@/common/util/constants";
+
+export default {
+  data() {
+    return {
+      modalName: null,
+      item: { msg: "退出成功" },
+      jumping: false, // 防止重复点击导致连续跳转
+    };
+  },
+  onLoad: function (option) {
+    const logoutToken = uni.getStorageSync(ACCESS_TOKEN);
+    const logoutRequest = api.logout(logoutToken);
+    console.log(logoutToken, "token");
+    this.clearLoginState();
+    logoutRequest.catch(() => {
+      console.error("退出登录请求失败");
+    });
+  },
+  onBackPress() {
+    return true;
+  },
+  methods: {
+    clearLoginState() {
+      [
+        ACCESS_TOKEN,
+        USER_NAME,
+        USER_INFO,
+        "menuPermission",
+        "btnPermission",
+      ].forEach((key) => {
+        uni.removeStorageSync(key);
+      });
+      this.$store.commit("SET_TOKEN", "");
+      this.$store.commit("SET_NAME", { username: "", realname: "" });
+      this.$store.commit("SET_DICT", "");
+    },
+    goback() {
+      // 避免重复点击/与 401 跳转叠加,造成 do not operate continuously
+      if (this.jumping) {
+        return;
+      }
+      this.jumping = true;
+      // 退出登录后清空页面栈,否则登录页侧滑会回到系统内部页面
+      uni.reLaunch({
+        url: "/pages/login/login",
+        complete: () => {
+          setTimeout(() => {
+            this.jumping = false;
+          }, 800);
+        },
+      });
+    },
+  },
+};
 </script>
 
 <style>

+ 235 - 3
pages/device/index.vue

@@ -53,6 +53,50 @@
         activeStyle="color: #000000; font-weight: 700;"
         @click="NavChange"
       ></u-tabs>
+      <!-- 安全监控:设备类型筛选(默认一氧化碳) -->
+      <view v-if="!menushow && isSafeMonitor" class="devic-box-filter">
+        <view class="filter-row" @click="openDataTypePicker">
+          <text class="filter-label">设备类型</text>
+          <text class="filter-value">{{
+            dataTypeName || "请选择设备类型"
+          }}</text>
+          <u-icon
+            :name="dataTypeShow ? 'arrow-up' : 'arrow-down'"
+            size="12"
+            color="#2b7cff"
+          ></u-icon>
+        </view>
+        <!-- 下拉面板 -->
+        <view v-if="dataTypeShow" class="filter-dropdown">
+          <view class="filter-dropdown-scroll">
+            <view class="filter-option-loading" v-if="!dataTypeLoaded">
+              <text class="filter-option-text">加载中...</text>
+            </view>
+            <view
+              class="filter-option"
+              :class="{ active: item.code === dataTypeCode }"
+              v-for="item in dataTypeOptions"
+              :key="item.code"
+              @click.stop="onDataTypeSelect(item)"
+            >
+              <text class="filter-option-text">{{ item.name }}</text>
+              <u-icon
+                v-if="item.code === dataTypeCode"
+                name="checkbox-mark"
+                size="12"
+                color="#2b7cff"
+              ></u-icon>
+            </view>
+          </view>
+        </view>
+      </view>
+      <!-- 点空白处关闭下拉 -->
+      <view
+        v-if="dataTypeShow"
+        class="filter-dropdown-mask"
+        @touchmove.stop.prevent
+        @click="dataTypeShow = false"
+      ></view>
       <view v-if="!menushow" class="devic-box-list">
         <!-- <home cur="home" :showColum="showColum" v-if="pageCurNew == '0' && !menushow" :key="0" :deviceType="deviceType"
           @setMenushow="setMenushow"></home> -->
@@ -63,6 +107,7 @@
           v-if="!menushow"
           :key="0"
           :deviceType="deviceType"
+          :filterParams="dataTypeFilterParams"
           @setMenushow="setMenushow"
         ></home>
         <!-- <history :key="1" cur="history" :showColum="showColum" :deviceType="deviceType"
@@ -92,6 +137,7 @@ export default {
       showColum: {},
       menushow: true,
       deviceType: "",
+      deviceTypeName: "", //当前设备分类名称
       //左上角三横线菜单
       navMenuShow: false,
       navMenuList: [
@@ -110,8 +156,43 @@ export default {
       //   },
       // ],
       tabListNew: [],
+      //安全监控的设备类型筛选(默认一氧化碳 0004)
+      dataTypeList: [],
+      dataTypeCode: "0004",
+      dataTypeName: "一氧化碳",
+      dataTypeShow: false,
+      dataTypeLoaded: false,
+      dataTypeLoading: false,
     };
   },
+  computed: {
+    //当前是否为安全监控分类(id 或名称两种方式兼容)
+    isSafeMonitor() {
+      const id = String(this.deviceType || "").toLowerCase();
+      const name = String(this.deviceTypeName || "");
+      return id.indexOf("safetymonitor") > -1 || name.indexOf("安全监控") > -1;
+    },
+    //下拉选项:“全部” + 接口返回的设备类型
+    dataTypeOptions() {
+      return [{ code: "", name: "全部" }].concat(this.dataTypeList || []);
+    },
+    //下发给列表的筛选条件:全部时传空对象
+    dataTypeFilterParams() {
+      if (!this.isSafeMonitor) {
+        return null;
+      }
+      return this.dataTypeCode ? { dataTypeName: this.dataTypeCode } : {};
+    },
+  },
+  watch: {
+    //切到安全监控分类时拉取设备类型下拉项
+    deviceType() {
+      this.ensureDataTypeOptions();
+    },
+    deviceTypeName() {
+      this.ensureDataTypeOptions();
+    },
+  },
   created() {
     this.getShowColum();
   },
@@ -128,11 +209,64 @@ export default {
     });
   },
   methods: {
+    // 是安全监控分类时才去拉设备类型下拉项
+    ensureDataTypeOptions() {
+      if (this.isSafeMonitor) {
+        this.loadDataTypeOptions();
+      }
+    },
+    // 安全监控:拉取设备类型下拉项,默认选中一氧化碳
+    loadDataTypeOptions() {
+      if (this.dataTypeLoaded || this.dataTypeLoading) {
+        return;
+      }
+      this.dataTypeLoading = true;
+      api
+        .getCodeDict({ devicetype: "safetymonitor", code: "dataTypeName" })
+        .then((response) => {
+          const raw = response && response.data;
+          const list = Array.isArray(raw)
+            ? raw
+            : raw && Array.isArray(raw.result)
+            ? raw.result
+            : [];
+          this.dataTypeList = list;
+          this.dataTypeLoaded = true;
+          // 默认选中一氧化碳,找不到就取第一项
+          const target =
+            list.find((item) => item.code === this.dataTypeCode) || list[0];
+          if (target) {
+            this.dataTypeCode = target.code;
+            this.dataTypeName = target.name;
+          }
+        })
+        .catch(() => {})
+        .then(() => {
+          this.dataTypeLoading = false;
+        });
+    },
+    openDataTypePicker() {
+      // 下拉浮层:选项未加载完时先拉一次
+      if (!this.dataTypeLoaded) {
+        this.loadDataTypeOptions();
+      }
+      this.dataTypeShow = !this.dataTypeShow;
+    },
+    onDataTypeSelect(item) {
+      this.dataTypeShow = false;
+      if (!item) {
+        return;
+      }
+      // code 为空表示“全部”
+      this.dataTypeCode = item.code || "";
+      this.dataTypeName = item.name || "全部";
+    },
     NavChange: function (item) {
       console.log("item", item);
       // this.PageCur = item.index;
       this.navMenuShow = false;
       this.deviceType = item.id;
+      this.deviceTypeName = item.name || "";
       this.menushow = false;
     },
     devicemenuShow(e) {
@@ -186,9 +320,9 @@ export default {
         });
       this.deviceType = params.id;
       this.tabListNew = data;
-      this.pageCurNew = this.tabListNew.find(
-        (item) => item.id == params.id
-      ).index;
+      const cur = this.tabListNew.find((item) => item.id == params.id);
+      this.deviceTypeName = (cur && cur.name) || "";
+      this.pageCurNew = cur ? cur.index : 0;
       console.log("data", data);
       this.menushow = false;
     },
@@ -242,6 +376,104 @@ export default {
   z-index: 2;
 }
 
+/* 安全监控的设备类型筛选条,固定在 tab 下方 */
+.devic-box-filter {
+  position: relative;
+  z-index: 21;
+  flex-shrink: 0;
+  margin: 0px 15px;
+  padding: 0px 16rpx;
+  height: 72rpx;
+  box-sizing: border-box;
+  border-radius: 10rpx;
+  background-color: #f9f9fb;
+  border: 1rpx solid #fff;
+
+  .filter-row {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    height: 100%;
+  }
+
+  .filter-label {
+    flex-shrink: 0;
+    font-size: 26rpx;
+    color: #303133;
+    margin-right: 12rpx;
+  }
+
+  .filter-value {
+    flex: 1;
+    min-width: 0;
+    font-size: 26rpx;
+    color: #2b7cff;
+    text-align: right;
+    margin-right: 8rpx;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+
+  /* 下拉面板:贴着筛选条下方展开,限制高度内部滚动 */
+  .filter-dropdown {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 100%;
+    margin-top: 8rpx;
+    max-height: 420rpx;
+    background-color: #ffffff;
+    border: 1rpx solid #e6ecf8;
+    border-radius: 10rpx;
+    box-shadow: 0 8rpx 24rpx rgba(43, 124, 255, 0.12);
+    overflow: hidden;
+    box-sizing: border-box;
+  }
+
+  .filter-dropdown-scroll {
+    max-height: 420rpx;
+    overflow-y: auto;
+  }
+
+  .filter-option,
+  .filter-option-loading {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: space-between;
+    height: 72rpx;
+    padding: 0px 16rpx;
+    box-sizing: border-box;
+  }
+
+  .filter-option-text {
+    font-size: 26rpx;
+    color: #303133;
+  }
+
+  .filter-option.active,
+  .filter-option:active {
+    background-color: #f2f7ff;
+  }
+
+  .filter-option.active .filter-option-text {
+    color: #2b7cff;
+    font-weight: 600;
+  }
+}
+
+/* 下拉展开时的透明遮罩,点空白关闭 */
+.filter-dropdown-mask {
+  position: fixed;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 20;
+  background: transparent;
+}
+
 .devic-box-list {
   flex: 1;
   min-height: 0;

+ 158 - 31
pages/filecenter/filecenter.vue

@@ -1,4 +1,4 @@
-<template name="filecenter">
+<template name="filecenter">
   <view class="file-page">
     <u-navbar
       title="文件中心"
@@ -28,7 +28,10 @@
           <view class="file-tab-line" v-if="curNow === index"></view>
         </view>
       </view>
-
+      <!-- 下载结果提示条-->
+      <view v-if="downloadTipShow" class="download-tip-bar">
+        <text class="download-tip-bar-text">{{ downloadTipText }}</text>
+      </view>
       <view class="file-main">
         <view class="search-card">
           <view class="search-row">
@@ -460,6 +463,7 @@
 <script>
 import api from "@/api/api";
 import configService from "../../common/service/config.service";
+import { ACCESS_TOKEN } from "@/common/util/constants";
 // import FileTreeMenu from "./treeMenu/fileTreeMenu.vue";
 export default {
   // components: {
@@ -472,6 +476,10 @@ export default {
     cur(val) {
       if (val === "filecenter") {
         this.refreshListHeight();
+        // 登录后切到本页时补一次加载
+        if (this.hasToken() && !this.loading && this.fileData.length === 0) {
+          this.getFileInfo();
+        }
       }
     },
   },
@@ -531,6 +539,8 @@ export default {
       listKey: 0, //列表 key,重新查询时重建列表以回到顶部
       loadFailed: false, //列表加载是否失败
       listHeight: 0, //列表滚动区高度(px),由搜索卡片下沿算到底部 tabbar
+      downloadTipShow: false, //下载结果轻提示是否显示
+      downloadTipText: "", //下载结果轻提示文字
       // 用 data 传值,避免编译器把字面量属性裁掉导致 scroll-y 丢失
       scrollEnabled: true,
       scrollLowerThreshold: 120,
@@ -574,6 +584,18 @@ export default {
     },
   },
   methods: {
+    // 是否已登录
+    hasToken() {
+      return !!uni.getStorageSync(ACCESS_TOKEN);
+    },
+    // 未登录时的空状态:清空列表,但不提示“加载失败”
+    resetWithoutLogin() {
+      this.loading = false;
+      this.loadFailed = false;
+      this.fileData = [];
+      this.total = 0;
+      this.hasMore = false;
+    },
     //左上角返回键:直接返回首页
     goBack() {
       this.$emit("changePage", "device");
@@ -626,6 +648,12 @@ export default {
     },
     // 拉取文件列表:reset 为 true 时从第一页重新加载,否则加载下一页
     async getFileInfo(reset = true) {
+      // 未登录不请求,避免刚启动就提示“文件列表加载失败”
+      if (!this.hasToken()) {
+        this.requestSeq += 1; // 丢弃可能还在路上的旧请求
+        this.resetWithoutLogin();
+        return;
+      }
       if (!reset && (this.loading || !this.hasMore)) {
         return;
       }
@@ -739,38 +767,116 @@ export default {
         },
       });
     },
-    // //下载文件到手机
+    // 下载文件到手机
     download(params) {
-      var fileiId = params.id;
-      var params = {
-        id: fileiId,
-      };
-      new Promise((resolve, reject) => {
-        api
-          .downloadFile(params)
-          .then((response) => {
-            if (response.statusCode == 200) {
-              console.log(response, "111");
-              // const blob = new Blob([response.data], {
-              //   type: "charset=UTF-8",
-              // }); // 构造一个blob对象来处理数据
-              // if ("download" in document.createElement("a")) {
-              //   // 支持a标签download的浏览器
-              //   const link = document.createElement("a"); // 创建a标签
-              //   link.href = URL.createObjectURL(blob);
-              //   document.body.appendChild(link);
-              //   link.click(); // 执行下载
-              //   URL.revokeObjectURL(link.href); //
-              //   document.body.removeChild(link); //
-              // }
-            } else {
-              // console.log("请求下载文件失败:", err);
+      const fileId = params && params.id;
+      const rawName = (params && params.fileName) || String(fileId);
+      // 过滤文件名里的非法字符,避免保存失败
+      const fileName = rawName.replace(/[\\/:*?"<>|]/g, "_");
+      const url =
+        configService.apiUrl + "/ventanaly-sharefile/fileServer/download";
+      // #ifdef APP-PLUS
+      const token = uni.getStorageSync("Access-Token");
+      uni.showLoading({ title: "下载中...", mask: true });
+
+      // 下载到沙盒 _downloads 目录,兼容性最好,支持uni.openDocument打开
+      const sandboxPath = "_downloads/" + fileName;
+
+      const dtask = plus.downloader.createDownload(
+        url,
+        {
+          method: "POST",
+          data: JSON.stringify({ id: fileId }),
+          filename: sandboxPath,
+        },
+        (download, status) => {
+          uni.hideLoading();
+          console.log(
+            "下载回调 status:",
+            status,
+            "state:",
+            download && download.state
+          );
+          // 兼容不同机型返回的状态:200 或 download.state === 4(完成)
+          const isSuccess =
+            status === 200 ||
+            status === "200" ||
+            (download && download.state === 4);
+          if (isSuccess) {
+            // 先显示提示,后面的文件处理即使异常也不影响提示
+            this.showDownloadTip("下载完成");
+            try {
+              const localFilePath = download.filename;
+              const realPath = plus.io.convertLocalFileSystemURL(localFilePath);
+              console.log("沙盒文件路径:", realPath);
+
+              // 尝试复制到公共下载目录(可选,失败不影响下载结果提示)
+              const destPath = plus.io.PUBLIC_DOWNLOADS + "/" + fileName;
+              plus.io.copyFile(
+                localFilePath,
+                destPath,
+                () => {
+                  console.log("复制到公共下载目录成功");
+                  plus.io.scanFile(destPath, () => {
+                    console.log("媒体扫描完成,文件管理器可看到");
+                  });
+                },
+                (err) => {
+                  console.log("复制到公共目录失败,分区存储限制", err);
+                }
+              );
+            } catch (e) {
+              console.log("下载后文件处理异常:", e);
             }
-          })
-          .catch((error) => {
-            reject(error);
+          } else {
+            this.showDownloadTip(
+              "下载失败" + (status ? "(" + status + ")" : "")
+            );
+          }
+        }
+      );
+      dtask.setRequestHeader("Content-Type", "application/json");
+      dtask.setRequestHeader("X-Access-Token", token);
+      dtask.start();
+      // #endif
+      // #ifdef H5
+      api
+        .downloadFile({ id: fileId }, { responseType: "arraybuffer" })
+        .then((response) => {
+          if (response.statusCode != 200) {
+            uni.showToast({ title: "下载失败", icon: "none" });
+            return;
+          }
+          const blob = new Blob([response.data]);
+          const link = document.createElement("a");
+          link.href = URL.createObjectURL(blob);
+          link.download = fileName;
+          document.body.appendChild(link);
+          link.click();
+          URL.revokeObjectURL(link.href);
+          document.body.removeChild(link);
+          uni.showToast({
+            title: "下载完成",
+            icon: "success",
+            duration: 1500,
           });
-      });
+        })
+        .catch(() => {
+          uni.showToast({ title: "下载失败", icon: "none" });
+        });
+      // #endif
+    },
+    // 显示下载结果轻提示(5 秒后自动消失)
+    showDownloadTip(text) {
+      if (this._downloadTipTimer) {
+        clearTimeout(this._downloadTipTimer);
+      }
+      this.downloadTipText = text || "";
+      this.downloadTipShow = true;
+      console.log("显示下载提示:", this.downloadTipText);
+      this._downloadTipTimer = setTimeout(() => {
+        this.downloadTipShow = false;
+      }, 5000);
     },
     // //删除文件
     showmodal(data) {
@@ -1741,4 +1847,25 @@ export default {
   width: 100%;
   display: block;
 }
+
+/* 下载结果提示条:内嵌页面顶部,随布局占位,确保可见 */
+.download-tip-bar {
+  flex-shrink: 0;
+  margin: 16rpx 32rpx 0;
+  padding: 16rpx 24rpx;
+  border-radius: 10rpx;
+  background-color: rgba(43, 124, 255, 0.12);
+  border: 1rpx solid rgba(43, 124, 255, 0.3);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.download-tip-bar-text {
+  font-size: 26rpx;
+  font-weight: 600;
+  color: #2b7cff;
+  text-align: center;
+  line-height: 1.4;
+}
 </style>

+ 4 - 0
pages/gasreport/components/gasFill.vue

@@ -397,6 +397,10 @@ export default {
       },
       immediate: true,
     },
+    //暂存列表自带导航栏,显示时隐藏父级导航栏
+    zcShow(val) {
+      this.$emit("toggleNav", !val);
+    },
   },
   mounted() {
     this.getGasList();

+ 5 - 6
pages/gasreport/components/gasImgIdentify.vue

@@ -1,10 +1,11 @@
-<template>
+<template>
   <view class="gas-fill">
     <u-navbar
-      :bgStatusImage="backPic0"
-      :bgImage="backPic"
       :title="gasTitle"
       :safeAreaInsetTop="true"
+      :fixed="true"
+      height="50px"
+      bgColor="#afc3fc"
       leftIcon="arrow-left"
       @leftClick="handlerToggle"
     >
@@ -291,7 +292,7 @@
 import api from "@/api/api";
 import moment from "moment";
 import configService from "@/common/service/config.service.js";
-import { RHFselcet } from "@/uni_modules/fz-media-selcet";
+// import { RHFselcet } from "@/uni_modules/fz-media-selcet";
 import helangCompress from "@/components/helang-compress/helang-compress";
 export default {
   name: "gasFill",
@@ -350,8 +351,6 @@ export default {
       imageSrcView: "", //任务明细查看图片详情
       tempFilePaths: [],
       gasTitle: "数据采集", //标题
-      backPic0: "url(/static/topnavbar0.png)",
-      backPic: "url(../../static/topnavbar.png)",
       loading: false,
       paramData: {},
       statusShow: "",

+ 2 - 4
pages/gasreport/components/save-component.vue

@@ -1,7 +1,7 @@
 <template>
     <view class="save-component">
-        <u-navbar :bgStatusImage="backPic0" :bgImage="backPic" :title="topTitle" :safeAreaInsetTop="true"
-            leftIcon="arrow-left" @leftClick="handlerToggle">
+        <u-navbar :title="topTitle" :safeAreaInsetTop="true" :fixed="true" height="50px"
+            bgColor="#afc3fc" leftIcon="arrow-left" @leftClick="handlerToggle">
         </u-navbar>
         <u-list :height="666">
             <u-list-item v-for="(item, index) in zcList" :key="index">
@@ -36,8 +36,6 @@ export default {
 
             indexList: [],
             topTitle: '暂存列表',//标题
-            backPic0: "url(/static/topnavbar0.png)",
-            backPic: "url(../../static/topnavbar.png)",
         }
     },
     computed: {

+ 12 - 7
pages/gasreport/components/taskBoard.vue

@@ -1,16 +1,18 @@
 <template>
   <view class="taskBoard">
     <u-navbar
-      :bgStatusImage="backPic0"
-      :bgImage="backPic"
+      v-if="isShow"
       :title="gasTitle"
       :safeAreaInsetTop="true"
       leftIcon="arrow-left"
       leftIconColor="#303133"
+      :fixed="true"
+      height="50px"
+      bgColor="#afc3fc"
       @leftClick="goBack"
     >
     </u-navbar>
-    <u-list :height="666" v-if="isShow">
+    <u-list v-if="isShow">
       <u-list-item v-for="(item, index) in indexList" :key="index">
         <u-cell icon="share" @click="getBorad(item)">
           <view slot="title" class="u-slot-title">
@@ -112,8 +114,6 @@ export default {
       taskId: "",
       indexList: [],
       gasTitle: "巡检任务", //标题
-      backPic0: "url(/static/topnavbar0.png)",
-      backPic: "url(../../static/topnavbar.png)",
     };
   },
   computed: {
@@ -206,9 +206,14 @@ export default {
 <style lang="scss" scoped>
 .taskBoard {
   position: relative;
-  width: 100%;
+  width: 90%;
   height: 100%;
-  background-color: #fff;
+  margin-top: 20px;
+  background: #f9f9fb;
+  border: 1rpx solid #fff;
+  border-radius: 16rpx;
+  margin-left: 20px;
+  margin-right: 14px;
 }
 
 .dialog-item {

+ 242 - 196
pages/gasreport/components/taskBoardAddress.vue

@@ -1,225 +1,271 @@
 <template>
-    <view class="taskBoardAddress">
-        <u-navbar :bgStatusImage="backPic0" :bgImage="backPic" :title="gasTitle" :safeAreaInsetTop="true"
-            leftIcon="arrow-left" @leftClick="handlerToggle"> </u-navbar>
-        <view>
-            <u-button v-if="showBtn" icon="eye" type="primary" size="small" loadingText="识别中"
-                style="width: 100%; margin: 0" @click="getYjsb">一键识别</u-button>
-        </view>
-        <u-list :height="666" :scrollTop="topH" v-if="isShow">
-            <u-list-item v-for="(item, index) in indexList" :key="index">
-                <u-cell icon="share">
-                    <view slot="title" class="u-slot-title">
-                        <text class="u-cell-text">{{ `${item.deviceName} (${item.checkNum == '1' ? '第一次' :
-                            item.checkNum == '2' ? '第二次' : ''})` }}</text>
-                        <!-- <u-tag text="查看" plain size="mini" type="warning">
+  <view class="taskBoardAddress">
+    <!-- 查看巡检点详情时隐藏本页导航栏,由详情页展示自己的标题与返回键 -->
+    <u-navbar
+      v-if="!toComponent"
+      :title="gasTitle"
+      :safeAreaInsetTop="true"
+      :fixed="true"
+      height="50px"
+      bgColor="#afc3fc"
+      leftIcon="arrow-left"
+      @leftClick="handlerToggle"
+    >
+    </u-navbar>
+    <view>
+      <u-button
+        v-if="showBtn"
+        icon="eye"
+        type="primary"
+        size="small"
+        loadingText="识别中"
+        style="width: 100%; margin-top: 20px"
+        @click="getYjsb"
+        >一键识别</u-button
+      >
+    </view>
+    <u-list :height="666" :scrollTop="topH" v-if="isShow">
+      <u-list-item v-for="(item, index) in indexList" :key="index">
+        <u-cell icon="share">
+          <view slot="title" class="u-slot-title">
+            <text class="u-cell-text">{{
+              `${item.deviceName} (${
+                item.checkNum == "1"
+                  ? "第一次"
+                  : item.checkNum == "2"
+                  ? "第二次"
+                  : ""
+              })`
+            }}</text>
+            <!-- <u-tag text="查看" plain size="mini" type="warning">
                         </u-tag> -->
-                    </view>
-                    <view slot="value" style="display: flex;align-items: center;">
-                        <u-icon :name="item.checkState == '0' ? 'plus' : 'checkmark'" size="16"
-                            @click="getBoradAddress(item, index)"></u-icon>
-                        <u-icon v-if="item.zcShow" style="margin-left:10px" name="photo" size="16"></u-icon>
-                    </view>
-                </u-cell>
-            </u-list-item>
-        </u-list>
-        <!-- 一键识别List -->
-        <view v-if="sbShow">
-            <Recognition :recognitionData="recognitionData" @getRepport="getRepport"></Recognition>
-        </view>
-        <component :is="toComponent" :Ids="Ids" :checkNum="checkNum" :classType="classType" :isSensor="isSensor"
-            :deviceID="deviceID" :deviceName="deviceName" :saveImg="saveImg" :checkState="checkState" :sbData="sbData"
-            :urlData="urlData" @getBackAddress="getBackAddress" @clearImg="clearImg">
-        </component>
+          </view>
+          <view slot="value" style="display: flex; align-items: center">
+            <u-icon
+              :name="item.checkState == '0' ? 'plus' : 'checkmark'"
+              size="16"
+              @click="getBoradAddress(item, index)"
+            ></u-icon>
+            <u-icon
+              v-if="item.zcShow"
+              style="margin-left: 10px"
+              name="photo"
+              size="16"
+            ></u-icon>
+          </view>
+        </u-cell>
+      </u-list-item>
+    </u-list>
+    <!-- 一键识别List -->
+    <view v-if="sbShow">
+      <Recognition
+        :recognitionData="recognitionData"
+        @getRepport="getRepport"
+      ></Recognition>
     </view>
+    <component
+      :is="toComponent"
+      :Ids="Ids"
+      :checkNum="checkNum"
+      :classType="classType"
+      :isSensor="isSensor"
+      :deviceID="deviceID"
+      :deviceName="deviceName"
+      :saveImg="saveImg"
+      :checkState="checkState"
+      :sbData="sbData"
+      :urlData="urlData"
+      @getBackAddress="getBackAddress"
+      @clearImg="clearImg"
+    >
+    </component>
+  </view>
 </template>
 
 <script>
 import api from "@/api/api";
-import gasImgIdentify from './gasImgIdentify.vue'
-import Recognition from './Recognition.vue'
+import gasImgIdentify from "./gasImgIdentify.vue";
+import Recognition from "./Recognition.vue";
 
 export default {
-    name: 'taskBoardAddress',
-    components: { gasImgIdentify, Recognition },
-    props: {
-        taskId: {
-            type: String,
-            default: ''
-        },
+  name: "taskBoardAddress",
+  components: { gasImgIdentify, Recognition },
+  props: {
+    taskId: {
+      type: String,
+      default: "",
     },
+  },
 
-    data() {
-        return {
-            saveImg: '',
-            // imgList: [],
-            topH: 0,
-            activeIndex: 0,
-            Ids: '',
-            checkNum: '',//巡检次数
-            classType: '',
-            isSensor: '',
-            deviceID: '',
-            deviceName: '',
-            checkState: '',
-            isShow: true,
-            toComponent: '',
-            indexList: [],
-            gasTitle: '任务明细',//标题
-            backPic0: "url(/static/topnavbar0.png)",
-            backPic: "url(../../static/topnavbar.png)",
-            sbShow: false,
-            sbData: [],
-            urlData: '',
-            showBtn: true,
-        }
+  data() {
+    return {
+      saveImg: "",
+      // imgList: [],
+      topH: 0,
+      activeIndex: 0,
+      Ids: "",
+      checkNum: "", //巡检次数
+      classType: "",
+      isSensor: "",
+      deviceID: "",
+      deviceName: "",
+      checkState: "",
+      isShow: true,
+      toComponent: "",
+      indexList: [],
+      gasTitle: "任务明细", //标题
+      sbShow: false,
+      sbData: [],
+      urlData: "",
+      showBtn: true,
+    };
+  },
+  computed: {
+    searchTime: function () {
+      return uni.getStorageSync("searchTime");
     },
-    computed: {
-        searchTime: function () {
-            return uni.getStorageSync('searchTime')
-        },
-        //一键识别列表
-        recognitionData: function () {
-            let list = []
-            this.indexList.forEach(el => {
-                if (uni.getStorageSync(el.deviceId)) {
-                    el.img = uni.getStorageSync(el.deviceId)
-                    el.status = ''
-                    list.push(el)
-                }
-            })
-            return list
+    //一键识别列表
+    recognitionData: function () {
+      let list = [];
+      this.indexList.forEach((el) => {
+        if (uni.getStorageSync(el.deviceId)) {
+          el.img = uni.getStorageSync(el.deviceId);
+          el.status = "";
+          list.push(el);
         }
+      });
+      return list;
+    },
+  },
+  mounted() {
+    this.taskDetailsLists();
+  },
+  methods: {
+    //点击返回上一级
+    handlerToggle() {
+      this.$emit("getBackBoard");
+    },
+    //暂存图片预览
+    // getView(item) {
+    //     let imgList = []
+    //     imgList.push(uni.getStorageSync(item.deviceId))
+    //     // 预览图片
+    //     uni.previewImage({
+    //         urls: imgList,
+    //         current: 0
+    //     });
+    // },
+    //清除暂存图片
+    clearImg(data) {
+      if (data) {
+        this.saveImg = "";
+      }
+    },
 
+    //一键识别
+    getYjsb() {
+      let that = this;
+      that.isShow = false;
+      that.sbShow = true;
+      that.showBtn = false;
+      if (that.recognitionData.length != 0) {
+        uni.showLoading({
+          title: "批量识别中...",
+          mask: true,
+        });
+      }
     },
-    mounted() {
-        this.taskDetailsLists()
+    //批量识别后跳转到填报页面
+    getRepport(param) {
+      let that = this;
+      that.sbShow = false;
+      that.showBtn = false;
+      console.log(param, "param------");
+      that.Ids = param.id;
+      that.checkNum = param.checkNum;
+      that.classType = param.classType_dictText;
+      that.checkState = param.checkState;
+      that.isSensor = param.isSensor;
+      that.deviceID = param.deviceId;
+      that.deviceName = param.deviceName;
+      that.sbData = param.sbList;
+      that.urlData = param.img;
+      that.toComponent = "gasImgIdentify";
+    },
+    getBoradAddress(item, index) {
+      let that = this;
+      that.activeIndex = index;
+      that.isShow = false;
+      that.showBtn = false;
+      if (item.checkState == "0") {
+        that.Ids = item.id;
+        that.isSensor = item.isSensor;
+      }
+      that.checkNum = item.checkNum;
+      that.classType = item.classType_dictText;
+      that.checkState = item.checkState;
+      that.deviceID = item.deviceId;
+      that.deviceName = item.deviceName;
+      that.saveImg = uni.getStorageSync(item.deviceId);
+      that.toComponent = "gasImgIdentify";
+    },
+    getBackAddress() {
+      this.isShow = true;
+      this.showBtn = true;
+      this.sbShow = false;
+      this.toComponent = "";
+      this.urlData = "";
+      this.topH = 39 * this.activeIndex;
+      this.taskDetailsLists();
     },
-    methods: {
-        //点击返回上一级
-        handlerToggle() {
-            this.$emit('getBackBoard')
-        },
-        //暂存图片预览
-        // getView(item) {
-        //     let imgList = []
-        //     imgList.push(uni.getStorageSync(item.deviceId))
-        //     // 预览图片
-        //     uni.previewImage({
-        //         urls: imgList,
-        //         current: 0
-        //     });
-        // },
-        //清除暂存图片
-        clearImg(data) {
-            if (data) {
-                this.saveImg = ''
-            }
-        },
 
-        //一键识别
-        getYjsb() {
-            let that = this
-            that.isShow = false
-            that.sbShow = true
-            that.showBtn = false
-            if (that.recognitionData.length != 0) {
-                uni.showLoading({
-                    title: '批量识别中...',
-                    mask: true
+    taskDetailsLists() {
+      let that = this;
+      new Promise((resolve, reject) => {
+        api
+          .taskDetailsList({
+            pageNo: 1,
+            pageSize: 100,
+            taskId: that.taskId,
+            taskTime: that.searchTime,
+          })
+          .then((response) => {
+            if (response.data.code == 200) {
+              console.log(response, "地点列表---");
+              that.indexList = response.data.result.records || [];
+              if (that.indexList.length != 0) {
+                that.indexList.forEach((el) => {
+                  if (uni.getStorageSync(el.deviceId)) {
+                    el.zcShow = true;
+                  } else {
+                    el.zcShow = false;
+                  }
                 });
+              }
+            } else {
+              reject(response);
             }
-        },
-        //批量识别后跳转到填报页面
-        getRepport(param) {
-            let that = this
-            that.sbShow = false
-            that.showBtn = false
-            console.log(param, 'param------')
-            that.Ids = param.id
-            that.checkNum = param.checkNum
-            that.classType = param.classType_dictText
-            that.checkState = param.checkState
-            that.isSensor = param.isSensor
-            that.deviceID = param.deviceId
-            that.deviceName = param.deviceName
-            that.sbData = param.sbList
-            that.urlData = param.img
-            that.toComponent = 'gasImgIdentify'
-        },
-        getBoradAddress(item, index) {
-            let that = this
-            that.activeIndex = index
-            that.isShow = false
-            that.showBtn = false
-            if (item.checkState == '0') {
-                that.Ids = item.id
-                that.isSensor = item.isSensor
-            }
-            that.checkNum = item.checkNum
-            that.classType = item.classType_dictText
-            that.checkState = item.checkState
-            that.deviceID = item.deviceId
-            that.deviceName = item.deviceName
-            that.saveImg = uni.getStorageSync(item.deviceId)
-            that.toComponent = 'gasImgIdentify'
-        },
-        getBackAddress() {
-            this.isShow = true
-            this.showBtn = true
-            this.sbShow = false
-            this.toComponent = ''
-            this.urlData=''
-            this.topH = 39 * this.activeIndex
-            this.taskDetailsLists()
-        },
-
-        taskDetailsLists() {
-            let that = this
-            new Promise((resolve, reject) => {
-                api
-                    .taskDetailsList({ pageNo: 1, pageSize: 100, taskId: that.taskId, taskTime: that.searchTime })
-                    .then((response) => {
-                        if (response.data.code == 200) {
-                            console.log(response, '地点列表---')
-                            that.indexList = response.data.result.records || []
-                            if (that.indexList.length != 0) {
-                                that.indexList.forEach(el => {
-                                    if (uni.getStorageSync(el.deviceId)) {
-                                        el.zcShow = true
-                                    } else {
-                                        el.zcShow = false
-                                    }
-                                })
-                            }
-                        } else {
-                            reject(response);
-                        }
-                    })
-                    .catch((error) => {
-                        console.log("catch===>response", response);
-                        reject(error);
-                    });
-            });
-        }
-    }
-
+          })
+          .catch((error) => {
+            console.log("catch===>response", response);
+            reject(error);
+          });
+      });
+    },
+  },
 };
 </script>
 
 <style lang="scss" scoped>
 .taskBoardAddress {
-    position: relative;
-    width: 100%;
-    height: 100%;
-    background-color: #fff;
-    padding: 0px 10px;
-    box-sizing: border-box;
-
+  position: relative;
+  width: 100%;
+  height: 100%;
+  padding: 0px 10px;
+  box-sizing: border-box;
 }
 
-
 ::v-deep .u-slot-title {
-    display: flex;
+  display: flex;
 }
 </style>

+ 19 - 6
pages/gasreport/gasreport.vue

@@ -1,12 +1,15 @@
 <template>
   <view class="gas-report" name="gasreport">
+    <!-- 子页面自带导航栏时隐藏父级导航栏,避免标题重叠 -->
     <u-navbar
-      :bgStatusImage="backPic0"
-      :bgImage="backPic"
+      v-if="showTopNav"
       :title="gasTitle"
       :safeAreaInsetTop="true"
       leftIcon="arrow-left"
       leftIconColor="#303133"
+      :fixed="true"
+      height="50px"
+      bgColor="transparent"
       @leftClick="goBack"
     >
     </u-navbar>
@@ -18,6 +21,7 @@
         :firstTj="firstTj"
         :secondTj="secondTj"
         @goHome="goHome"
+        @toggleNav="toggleNav"
       ></component>
     </view>
     <!-- 导航弹出层 -->
@@ -50,9 +54,8 @@ export default {
   },
   data() {
     return {
-      backPic0: "url(/static/topnavbar0.png)",
-      backPic: "url(../../static/topnavbar.png)",
       gasTitle: "瓦斯日报", //标题
+      navVisible: true, //子组件暂存列表等自带导航栏时由子组件通知隐藏
       showModel: false, //是否打开弹出层
       // loadComponent: 'gasFill',//默认加载组件
       // loadComponent: 'gasImgIdentify',//默认加载组件
@@ -64,7 +67,12 @@ export default {
       secondTj: [], //二次统计
     };
   },
-  computed: {},
+  computed: {
+    //taskBoard 及暂存列表自带导航栏,此时不渲染父级导航栏
+    showTopNav() {
+      return this.loadComponent !== "taskBoard" && this.navVisible;
+    },
+  },
   mounted() {
     this.queryNowGasInfoByUser();
   },
@@ -72,6 +80,10 @@ export default {
     showPopup() {
       this.showModel = !this.showModel;
     },
+    //子组件控制父级导航栏显示/隐藏
+    toggleNav(visible) {
+      this.navVisible = visible;
+    },
     //子组件请求返回首页:通知外层 index.vue 切回首页页签(设备中心)
     goHome() {
       this.$emit("changePage", "device");
@@ -90,6 +102,7 @@ export default {
     //导航栏点击
     handlerClick(data) {
       let that = this;
+      that.navVisible = true;
       switch (data) {
         case "瓦斯巡检记录卡管理":
           that.loadComponent = "gasRecordCard";
@@ -165,7 +178,7 @@ export default {
 
   .gas-content {
     height: 666px;
-    margin-top: 85px;
+    margin-top: calc(50px + var(--status-bar-height, 0px));
     overflow-y: auto;
 
     .popup-modal {

+ 55 - 56
pages/home/detail/autodoor/autodoor.vue

@@ -4,7 +4,7 @@
     <u-navbar
       :title="name"
       @leftClick="backPage"
-      bgColor="transparent"
+      bgColor="#afc3fc"
       :bgImage="backPic"
       :bgStatusImage="backPic0"
       :safeAreaInsetTop="true"
@@ -178,29 +178,19 @@
           </view>
           <view v-if="cameraList.length > 0">
             <view
-              class="flcard deviceback"
+              class="flcard deviceback camera-card"
               v-for="(item, index) in cameraList"
               :key="index"
             >
+              <!-- 统一使用 yingbing-video:App 端原生 video 层级最高,页面滚动到顶部时会盖住标题栏 -->
               <yingbing-video
-                v-if="item.devicekind == 'flv'"
                 style="width: 100%; height: 250px"
+                :dataId="'camera' + index"
                 :src="item.addr"
+                :formats="getVideoFormat(item)"
                 autoplay
                 muted
               ></yingbing-video>
-              <video
-                v-else
-                style="width: 100%; height: 250px"
-                id="myVideo"
-                controls
-                show-loading
-                autoplay
-                class="r-video"
-                :vslide-gesture="true"
-                :vslide-gesture-in-fullscreen="true"
-                :src="item.addr"
-              ></video>
             </view>
           </view>
           <view class="flcard data-card-wrap">
@@ -223,11 +213,11 @@
               >
                 <view class="data-icon">
                   <view class="data-icon-glass">
-                    <u-icon
-                      :name="getFieldIcon(item.monitorcode)"
-                      color="#ffffff"
-                      size="14"
-                    ></u-icon>
+                    <image
+                      class="data-icon-img"
+                      :src="getIcon1(item.monitorcode, item.des)"
+                      mode="aspectFit"
+                    ></image>
                   </view>
                 </view>
                 <view class="data-text">
@@ -271,11 +261,11 @@
               >
                 <view class="data-icon">
                   <view class="data-icon-glass">
-                    <u-icon
-                      :name="getFieldIcon(item.monitorcode)"
-                      color="#ffffff"
-                      size="14"
-                    ></u-icon>
+                    <image
+                      class="data-icon-img"
+                      :src="getIcon1(item.monitorcode, item.des, 1)"
+                      mode="aspectFit"
+                    ></image>
                   </view>
                 </view>
                 <view class="data-text">
@@ -296,11 +286,11 @@
               >
                 <view class="data-icon">
                   <view class="data-icon-glass">
-                    <u-icon
-                      :name="getFieldIcon(item.monitorcode)"
-                      color="#ffffff"
-                      size="14"
-                    ></u-icon>
+                    <image
+                      class="data-icon-img"
+                      :src="getIcon1(item.monitorcode, item.des, 2)"
+                      mode="aspectFit"
+                    ></image>
                   </view>
                 </view>
                 <view class="data-text">
@@ -406,6 +396,7 @@ import windowAnimate from "../windowAnimate/windowAnimate.vue";
 import windrectAnimate from "../windrectAnimate/windrectAnimate.vue";
 import fanlocalAnimate from "../fanlocalAnimate/fanlocalAnimate2.vue";
 import fanmainAnimate from "../fanmainAnimate/fanmainAnimate.vue";
+import { getDeviceIcon } from "@/common/util/deviceIcon";
 export default {
   data() {
     return {
@@ -743,25 +734,20 @@ export default {
       // 发起请求后关闭密码输入弹窗
       this.show = false;
     },
-    getFieldIcon(monitorcode) {
-      const code = (monitorcode || "").toLowerCase();
-      if (code.indexOf("gate") > -1 || code.indexOf("door") > -1) {
-        return "grid-fill";
-      }
-      if (
-        code.indexOf("press") > -1 ||
-        code.indexOf("pressure") > -1 ||
-        code.indexOf("ycyl") > -1
-      ) {
-        return "level";
-      }
-      if (code.indexOf("warn") > -1 || code.indexOf("fault") > -1) {
-        return "error-circle-fill";
-      }
-      if (code.indexOf("time") > -1 || code.indexOf("readtime") > -1) {
-        return "clock-fill";
-      }
-      return "list";
+    // 按 monitorcode 取图标(风机页面传 fanNo 区分主机/备机)
+    getIcon1(monitorcode, des, fanNo) {
+      return getDeviceIcon(monitorcode, des, fanNo);
+    },
+    // 摄像头播放格式,没有后缀的地址需要明确指定 flv
+    getVideoFormat(item) {
+      if (!item) return "auto";
+      if (item.devicekind == "flv") return "flv";
+      const path = String(item.addr || "")
+        .split("?")[0]
+        .toLowerCase();
+      if (path.endsWith(".flv")) return "flv";
+      if (path.endsWith(".m3u8")) return "m3u8";
+      return "auto";
     },
     getMonitorValue(item) {
       if (item.monitorcode == "doorUse") {
@@ -861,9 +847,11 @@ export default {
 </script>
 <style lang="scss" scoped>
 .page-wrap {
-  // overflow: auto;
-  height: 100vh;
-  background: url("../../../../static/desk-img/1-3.png") no-repeat;
+  // 整页滚动(不使用内部 div 滚动),否则 App 端原生 video 会固定不跟随滚动
+  min-height: 100vh;
+  background-color: #f2f4fd;
+  background-image: url("../../../../static/desk-img/1-3.png");
+  background-repeat: no-repeat;
   background-size: 100% auto;
 }
 
@@ -878,11 +866,11 @@ export default {
 // }
 
 .main {
-  // min-height: calc(100vh - 50px);
-  height: calc(100vh - 115px - var(--status-bar-height, 0px));
-  // padding-bottom: 40rpx;
-  overflow-y: auto;
+  // 不限制高度、不内部滚动,交给页面滚动
+  height: auto;
+  overflow: visible;
   margin-bottom: 10px;
+  padding-bottom: 40rpx;
 }
 
 .container {
@@ -941,6 +929,17 @@ export default {
   background: #ffffff;
 }
 
+/* 摄像头卡片:内部视频随页面滚动、不脱离文档流,避免盖住标题栏 */
+.camera-card {
+  overflow: hidden;
+  border-radius: 10rpx;
+}
+
+/* 标题栏置于最上层 */
+::v-deep .u-navbar {
+  z-index: 999;
+}
+
 .data-card-wrap {
   padding: 16rpx;
 }

+ 81 - 62
pages/home/home.vue

@@ -2,7 +2,16 @@
   <view class="container">
     <view v-if="!menushow" class="main">
       <view class="u-page">
-        <view :class="{ empty: showList.length === 0 }">
+        <!-- 加载中 -->
+        <view v-if="loading" class="loading-message">
+          <u-loading-icon
+            mode="circle"
+            size="24"
+            color="#0065f8"
+          ></u-loading-icon>
+          <text class="loading-text">加载中...</text>
+        </view>
+        <view v-else :class="{ empty: showList.length === 0 }">
           <template v-if="showList.length > 0">
             <view v-for="(item, index) in showList" :key="index">
               <view class="device-card">
@@ -82,7 +91,7 @@
                         ></u-icon> -->
                         <image
                           class="icon-top"
-                          :src="getIcon1(showitem.monitorcode)"
+                          :src="getIcon1(showitem.monitorcode, showitem.des)"
                           mode="aspectFit"
                         ></image>
                       </view>
@@ -125,11 +134,13 @@
                       >
                         <view class="data-icon">
                           <view class="data-icon-glass">
-                            <u-icon
-                              :name="getFieldIcon(showitem.monitorcode)"
-                              color="#ffffff"
-                              size="14"
-                            ></u-icon>
+                            <image
+                              class="icon-top"
+                              :src="
+                                getIcon1(showitem.monitorcode, showitem.des, 1)
+                              "
+                              mode="aspectFit"
+                            ></image>
                           </view>
                         </view>
                         <view class="data-text">
@@ -152,11 +163,13 @@
                       >
                         <view class="data-icon">
                           <view class="data-icon-glass">
-                            <u-icon
-                              :name="getFieldIcon(showitem.monitorcode)"
-                              color="#ffffff"
-                              size="14"
-                            ></u-icon>
+                            <image
+                              class="icon-top"
+                              :src="
+                                getIcon1(showitem.monitorcode, showitem.des, 2)
+                              "
+                              mode="aspectFit"
+                            ></image>
                           </view>
                         </view>
                         <view class="data-text">
@@ -202,6 +215,8 @@
 <script>
 import api from "@/api/api";
 import { computed } from "vue";
+import { getDeviceIcon } from "@/common/util/deviceIcon";
+
 export default {
   data() {
     return {
@@ -218,9 +233,11 @@ export default {
       deviceType1: "",
       devices1: [],
       showList: [],
+      loadSeq: 0, //请求序号,用于丢弃过期响应
+      loading: false, //列表是否加载中
     };
   },
-  props: ["showColum", "deviceType"],
+  props: ["showColum", "deviceType", "filterParams"],
   computed: {
     hasDoorUse() {
       return (this.deviceShowList || []).some(
@@ -249,6 +266,12 @@ export default {
       },
       immediate: true,
     },
+    //安全监控切换设备类型(如瓦斯/一氧化碳/全部)后重新查询
+    filterParams() {
+      if (this.TabCur) {
+        this.loadData(this.TabCur);
+      }
+    },
   },
   created() {
     this.colums = this.showColum;
@@ -300,55 +323,17 @@ export default {
       }
       return "-";
     },
-    getFieldIcon(monitorcode) {
-      const code = (monitorcode || "").toLowerCase();
-      if (code.indexOf("gate") > -1 || code.indexOf("door") > -1) {
-        return "grid-fill";
-      }
-      if (code.indexOf("press") > -1 || code.indexOf("pressure") > -1) {
-        return "level";
-      }
-      if (code.indexOf("wind") > -1 || code.indexOf("speed") > -1) {
-        return "reload";
-      }
-      return "list";
-    },
-    getIcon1(monitorcode) {
-      const code = (monitorcode || "").toLowerCase();
-      if (code.indexOf("frontarea") > -1) {
-        return "/static/home/gfmj.svg";
-      }
-      if (code.indexOf("area") > -1) {
-        return "/static/icon-new/dmj.svg";
-      }
-      if (
-        code.indexOf("m3") > -1 ||
-        code.indexOf("va") > -1 ||
-        code.indexOf("forward") > -1
-      ) {
-        return "/static/icon-new/fl.svg";
-      }
-      if (code.indexOf("gate") > -1 || code.indexOf("door") > -1) {
-        return "/static/icon-new/door-icon.svg";
-      }
-      if (
-        code.indexOf("press") > -1 ||
-        code.indexOf("pressure") > -1 ||
-        code.indexOf("pa1") > -1 ||
-        code.indexOf("pa2") > -1 ||
-        code.indexOf("dp") > -1
-      ) {
-        return "/static/icon-new/qyyl-icon.svg";
-      }
-      return "/static/icon-new/dmj.svg";
+    // 按 monitorcode 取图标(风机页面传 fanNo 区分主机/备机)
+    getIcon1(monitorcode, des, fanNo) {
+      return getDeviceIcon(monitorcode, des, fanNo);
     },
     startTimer() {
       // 避免重复创建定时器
       this.stopTimer();
       // 每隔一段时间执行某个操作
       this.timer = setInterval(async () => {
-        // 执行定时任务
-        await this.loadData(this.deviceType);
+        // 执行定时任务(silent:后台刷新不显示“加载中”)
+        await this.loadData(this.deviceType, true);
         console.log("定时任务执行中...");
       }, 5000);
     },
@@ -363,7 +348,7 @@ export default {
     restartTimer() {
       this.startTimer();
       if (this.deviceType) {
-        this.loadData(this.deviceType);
+        this.loadData(this.deviceType, true);
       }
     },
     getIcon(itemValue) {
@@ -374,14 +359,30 @@ export default {
       // 根据itemValue获取对应的图标路径,如果找不到对应关系则返回默认图标
       return "/static/sidebar/" + itemValue + ".svg";
     },
-    loadData(type) {
+    loadData(type, silent = false) {
+      const seq = ++this.loadSeq;
+      // 定时轮询用 silent,避免每次刷新都闪一下“加载中”
+      if (!silent) {
+        this.loading = true;
+      }
+      // 安全监控按设备类型筛选
+      const params = {
+        devicetype: type,
+        pagetype: "normal",
+      };
+      // 安全监控的筛选条件:全部时是 {},未选分类时为 null
+      if (this.filterParams) {
+        params.filterParams = this.filterParams;
+      }
       return new Promise((resolve, reject) => {
         api
-          .getDeviceMonitor({
-            devicetype: type,
-            pagetype: "normal",
-          })
+          .getDeviceMonitor(params)
           .then((response) => {
+            // 丢弃过期响应(快速切换分类/设备类型时)
+            if (seq !== this.loadSeq) {
+              return;
+            }
+            this.loading = false;
             if (response.data.code == 200) {
               this.deviceList[type] = response.data.result.msgTxt[0].datalist;
               this.curlist = this.deviceList[type];
@@ -435,6 +436,9 @@ export default {
           })
           .catch((error) => {
             // console.log("catch===>response", response);
+            if (seq === this.loadSeq) {
+              this.loading = false;
+            }
             reject(error);
           });
       });
@@ -552,6 +556,21 @@ export default {
   color: #000;
 }
 
+/* 加载中 */
+.loading-message {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  padding: 200rpx 0;
+}
+
+.loading-text {
+  margin-left: 12rpx;
+  font-size: 26rpx;
+  color: #8a94a6;
+}
+
 /* ===== 设备卡片 ===== */
 .device-card {
   background: #f9f9fb;

+ 2 - 1
pages/ipConfig/ipConfig.vue

@@ -97,7 +97,8 @@ export default {
       //   cancelText: "取消",
       //   confirmText: "确认",
       // });
-      uni.redirectTo({
+      // 清空页面栈进入登录页,避免登录页侧滑回到系统内部页面
+      uni.reLaunch({
         url: "/pages/login/login?reload=" + 1,
       });
     },

+ 1 - 1
pages/login/login copy.vue

@@ -9,7 +9,7 @@
         </view>
         <view class="text-center" :style="[{ animation: 'show ' + 0.4 + 's 1' }]">
           <!-- <u-link  class="zai-title2 text-shadow " href="http://localhost:8080?ticket=234" >切换单点登录</u-link> -->
-          <view class="zai-title2 text-shadow " @click="changeloginType">切换单点登录</view>
+          <view class="zai-title2 text-shadow " @click="changeloginType">工号登录</view>
         </view>
         <view class="box padding-lr-xl login-paddingtop" :style="[{ animation: 'show ' + 0.6 + 's 1' }]">
           <block>

+ 23 - 5
pages/login/login.vue

@@ -70,7 +70,7 @@
             @click="changePassword"
           ></u-icon>
         </view>
-        <view class="sso-link" @click="changeloginType">切换单点登录</view>
+        <view class="sso-link" @click="changeloginType">工号登录</view>
       </view>
 
       <view class="footer-area">
@@ -91,7 +91,7 @@
     <!-- 登录加载弹窗 -->
     <view class="cu-load load-modal" v-if="loading">
       <image
-        src="/static/desk-img/144.png"
+        src="/static/desk-img/logo.png"
         mode="aspectFit"
         class="round"
       ></image>
@@ -195,11 +195,23 @@ export default {
       ],
     };
   },
+  // 登录页禁用系统返回,避免回到系统内部页面(真正退出请用退出登录)
+  onBackPress() {
+    return true;
+  },
   onLoad: function (option) {
     console.log("=======option.ticket======" + JSON.stringify(option.ticket));
     if (option.ticket) {
       this.loginCas(option.ticket);
     }
+    // 回填上次选择的服务器地址,避免看起来像是要重新选择 IP
+    const savedCode = uni.getStorageSync("apiCode");
+    const savedUrl = uni.getStorageSync("apiUrl");
+    if (savedCode || savedUrl) {
+      const ipList = (this.IpConfig && this.IpConfig[0]) || [];
+      const matched = ipList.filter((item) => item.code === savedCode)[0];
+      this.IPSet = matched ? matched.label : savedUrl || "";
+    }
     // #ifdef APP-PLUS
     var that = this;
     plus.runtime.getProperty(plus.runtime.appid, function (wgtinfo) {
@@ -273,6 +285,7 @@ export default {
             // #endif
             // #ifndef APP-PLUS
             // #endif
+            console.log(res.data);
           } else {
             this.$tip.alert(res.data.message);
           }
@@ -340,7 +353,8 @@ export default {
               uni.setStorageSync("menuPermission", data);
               uni.setStorageSync("btnPermission", dataBtn);
               this.$tip.success("登录成功!");
-              uni.navigateTo({
+              // 登录成功后清空页面栈,防止从系统内页面返回又回到登录页
+              uni.reLaunch({
                 url: "/pages/index/index",
               });
             } else {
@@ -452,7 +466,10 @@ export default {
       tourl = tourl.replace(9999, 8092);
       // this.$tip.success("tourl="+tourl);
       var rastourl =
-        "https://id.shendong.com.cn/default" + "/login?service=" + tourl;
+        "https://id.shendong.com.cn/default" +
+        "/login?service=" +
+        encodeURIComponent(tourl) +
+        "&renew=true";
       // rastourl ="http://182.92.126.35:8092/?ticket=234";
       console.log("===========" + rastourl);
       this.openBrowser(rastourl);
@@ -486,7 +503,8 @@ export default {
       setTimeout(() => {
         uni.getStorageSync("apiUrl");
       }, 100);
-      uni.navigateTo({ url: "/pages/login/login" });
+      // 切换 IP 后重新进入登录页,清空页面栈,避免侧滑回退到旧页面
+      uni.reLaunch({ url: "/pages/login/login" });
     },
   },
   beforeDestroy() {

+ 206 - 36
pages/user/people.vue

@@ -9,9 +9,9 @@
         <view class="user1" :style="[{ animationDelay: '0.2s' }]">
           <view class="username1">
             <view class="text-xl" style="color: #fff">{{
-              personalList.username
+              personalList.realname
             }}</view>
-            <view class="text-info">用户</view>
+            <view class="text-info">姓名</view>
           </view>
           <view class="usericon1"> </view>
         </view>
@@ -19,9 +19,9 @@
         <view class="user2" :style="[{ animationDelay: '0.2s' }]">
           <view class="username2">
             <view class="text-xl" style="color: #fff">{{
-              personalList.post ? personalList.post : "员工"
+              personalList.username
             }}</view>
-            <view class="text-info">职务</view>
+            <view class="text-info">账号</view>
           </view>
           <view class="usericon2"> </view>
         </view>
@@ -30,7 +30,7 @@
       <view
         class="cu-list menu card-menu margin-top-xl margin-bottom-xl shadow-lg radius people-menu"
       >
-        <view
+        <!-- <view
           class="cu-item arrow animation-slide-bottom"
           :style="[{ animationDelay: '0.3s' }]"
           @tap="scan"
@@ -39,7 +39,7 @@
             <text class="cuIcon-scan menu-icon"></text>
             <text class="text-grey">扫码</text>
           </view>
-        </view>
+        </view> -->
         <navigator
           class="cu-item arrow animation-slide-bottom"
           url="/pages/user/userdetail"
@@ -51,34 +51,71 @@
           </view>
         </navigator>
 
-        <navigator
+        <view
           class="cu-item arrow animation-slide-bottom"
           :style="[{ animationDelay: '0.7s' }]"
-          url="/pages/user/userexit"
           hover-class="none"
+          @tap="confirmExit"
         >
           <view class="content">
             <text class="cuIcon-exit menu-icon"></text>
             <text class="text-grey">退出</text>
           </view>
-        </navigator>
+        </view>
       </view>
       <view class="cu-tabbar-height"></view>
     </scroll-view>
+
+    <!-- 退出登录确认弹窗 -->
+    <u-popup
+      :show="exitShow"
+      mode="center"
+      :round="16"
+      :closeable="false"
+      :closeOnClickOverlay="true"
+      @close="closeExit"
+    >
+      <view class="exit-modal">
+        <view class="exit-modal-header">
+          <text class="exit-modal-title">提示</text>
+          <view class="exit-modal-close" @click="closeExit">
+            <u-icon name="close" size="16" color="#2b7cff"></u-icon>
+          </view>
+        </view>
+        <view class="exit-modal-divider"></view>
+        <view class="exit-modal-body">
+          <view class="exit-confirm-box">
+            <!-- 退出图标位置:待替换为正式图标 -->
+            <image
+              class="exit-confirm-icon"
+              src="/static/user/loginout.svg"
+            ></image>
+            <text class="exit-confirm-text">确定退出登录吗?</text>
+          </view>
+        </view>
+        <view class="exit-modal-footer">
+          <view class="exit-btn exit-btn-plain" @click="closeExit">
+            <text class="exit-btn-text">取消</text>
+          </view>
+          <view class="exit-btn exit-btn-primary" @click="doLogout">
+            <text class="exit-btn-text">确定</text>
+          </view>
+        </view>
+      </view>
+    </u-popup>
   </view>
 </template>
 
 <script>
 import api from "@/api/api";
+import { ACCESS_TOKEN, USER_NAME, USER_INFO } from "@/common/util/constants";
 export default {
   name: "people",
   data() {
     return {
       personalList: {
-        avatar: "",
         realname: "",
         username: "",
-        post: "",
       },
       positionUrl: "/sys/position/list",
       departUrl: "/sys/user/userDepartList",
@@ -86,6 +123,8 @@ export default {
       postUrl: "/sys/position/queryByCode",
       userId: "",
       id: "",
+      logoutJumping: false, // 防止重复点击退出
+      exitShow: false, // 退出确认弹窗
     };
   },
   watch: {
@@ -93,12 +132,51 @@ export default {
       immediate: true,
       handler() {
         console.log("watch", this.cur);
-        this.userId = this.$store.getters.userid;
+        const userInfo = uni.getStorageSync(USER_INFO) || {};
+        this.userId = userInfo.id || "";
+        this.personalList.realname = userInfo.realname || "";
+        this.personalList.username = userInfo.username || "";
         this.load();
       },
     },
   },
   methods: {
+    // 退出登录:先弹确认框,确认后直接退出并回到登录页
+    confirmExit() {
+      this.exitShow = true;
+    },
+    closeExit() {
+      this.exitShow = false;
+    },
+    doLogout() {
+      if (this.logoutJumping) {
+        return;
+      }
+      this.logoutJumping = true;
+      this.exitShow = false;
+      const token = uni.getStorageSync(ACCESS_TOKEN);
+      // 退出接口失败不影响本地退出流程
+      if (token) {
+        api.logout(token).catch(() => {});
+      }
+      this.clearLoginState();
+      // 直接回到登录页,清空页面栈,避免侧滑返回系统内部页面
+      uni.reLaunch({ url: "/pages/login/login" });
+    },
+    clearLoginState() {
+      [
+        ACCESS_TOKEN,
+        USER_NAME,
+        USER_INFO,
+        "menuPermission",
+        "btnPermission",
+      ].forEach((key) => {
+        uni.removeStorageSync(key);
+      });
+      this.$store.commit("SET_TOKEN", "");
+      this.$store.commit("SET_NAME", { username: "", realname: "" });
+      this.$store.commit("SET_DICT", "");
+    },
     scan() {
       console.log("进来了");
       // #ifndef H5
@@ -129,26 +207,8 @@ export default {
                 ? api.getFileAccessHttpUrl(perArr.avatar)
                 : "/static/user2.png";
             this.personalList.realname = perArr.realname;
+            console.log(perArr, "用户信息");
             this.personalList.username = perArr.username;
-            this.personalList.depart = perArr.departIds;
-            this.getpost(perArr.post);
-          }
-        })
-        .catch((err) => {
-          console.log(err);
-        });
-    },
-    getpost(code) {
-      if (!code || code.length == 0) {
-        this.personalList.post = "员工";
-        return false;
-      }
-      this.$http
-        .get(this.postUrl, { params: { code: code } })
-        .then((res) => {
-          console.log("postUrl", res);
-          if (res.data.success) {
-            this.personalList.post = res.data.result.name;
           }
         })
         .catch((err) => {
@@ -229,8 +289,8 @@ export default {
   flex: 0 0 auto;
   position: relative;
   z-index: 1;
-  width: 82px;
-  height: 90px;
+  width: 72px;
+  height: 80px;
   margin: 0 0px -5px 0;
   align-self: flex-end;
   background-image: url("/static/user/user.png");
@@ -268,8 +328,8 @@ export default {
   flex: 0 0 auto;
   position: relative;
   z-index: 1;
-  width: 90px;
-  height: 89px;
+  width: 80px;
+  height: 79px;
   margin: 0 -1px -4px 0;
   align-self: flex-end;
   background-image: url("/static/user/user1.png");
@@ -290,7 +350,7 @@ export default {
 .username2 .text-xl {
   overflow: hidden;
   color: #fff;
-  font-size: 36rpx;
+  font-size: 28rpx;
   font-weight: bold;
   line-height: 1.2;
   text-overflow: ellipsis;
@@ -377,4 +437,114 @@ map,
   color: #000;
   font-weight: bold;
 }
+
+/* ===== 退出登录确认弹窗 ===== */
+.exit-modal {
+  width: 620rpx;
+  background: #f9f9fb;
+  border-radius: 16rpx;
+  border: 1px solid #fff;
+  overflow: hidden;
+  padding-bottom: 28rpx;
+  box-sizing: border-box;
+}
+
+.exit-modal-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  padding: 28rpx 28rpx 20rpx;
+}
+
+.exit-modal-title {
+  font-size: 32rpx;
+  font-weight: 700;
+  color: #1a1a1a;
+}
+
+.exit-modal-close {
+  width: 44rpx;
+  height: 44rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.exit-modal-divider {
+  height: 1rpx;
+  background: #eef0f4;
+  margin: 0 24rpx;
+}
+
+.exit-modal-body {
+  padding: 24rpx 28rpx;
+}
+
+/* 内容框 */
+.exit-confirm-box {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  padding: 36rpx 24rpx;
+  box-sizing: border-box;
+  border-radius: 12rpx;
+  background-color: #eaeefc;
+  border: 1px solid #fff;
+}
+
+/* 退出图标:uni-app image 默认 320x240,必须显式给宽高 */
+.exit-confirm-icon {
+  width: 56rpx;
+  height: 56rpx;
+  margin-right: 16rpx;
+  flex-shrink: 0;
+}
+
+.exit-confirm-text {
+  font-size: 28rpx;
+  color: #1a1a1a;
+  white-space: nowrap;
+}
+
+.exit-modal-footer {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  gap: 20rpx;
+  padding: 0 28rpx;
+}
+
+.exit-btn {
+  flex: 1;
+  height: 64rpx;
+  border-radius: 8rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-sizing: border-box;
+}
+
+.exit-btn-text {
+  font-size: 28rpx;
+  font-weight: 500;
+}
+
+.exit-btn-plain {
+  background: #ffffff;
+  border: 1rpx solid #0065f8;
+}
+
+.exit-btn-plain .exit-btn-text {
+  color: #0065f8;
+}
+
+.exit-btn-primary {
+  background: #0065f8;
+}
+
+.exit-btn-primary .exit-btn-text {
+  color: #ffffff;
+}
 </style>

+ 14 - 10
pages/warndata/components/device-detail.vue

@@ -110,8 +110,8 @@ export default {
       tabList: [{ name: "实时预警" }, { name: "报警历史" }],
       tabItemStyle: { height: "46px", padding: "0 24px" },
       activeTabStyle: {
-        color: "#2b7cff",
-        fontWeight: "600",
+        color: "#000000",
+        fontWeight: "bold",
         fontSize: "15px",
       },
       inactiveTabStyle: { color: "#666666", fontSize: "15px" },
@@ -228,26 +228,30 @@ export default {
 <style lang="scss" scoped>
 .device-detail {
   position: relative;
+  // 撑满父容器高度:tab 固定在顶部,滚动区域在 tab 下面
+  display: flex;
+  flex-direction: column;
+  height: 100%;
   box-sizing: border-box;
 
   .device-tab {
+    flex-shrink: 0;
     position: sticky;
     top: 0;
     z-index: 10;
-    margin-bottom: 20rpx;
-  }
-
-  .devic-box-tab {
-    padding: 0px 10px !important;
+    background-color: #f9f9fb;
+    border-radius: 5px;
+    border: 1px solid #fff;
+    margin-bottom: 10px;
   }
 
   .device-content {
     display: flex;
     flex-direction: column;
-    height: auto;
-    min-height: 600px;
+    flex: 1;
+    min-height: 0;
     box-sizing: border-box;
-    overflow: hidden;
+    overflow-y: auto;
 
     /* 查询条件卡片 */
     .filter-card {

+ 13 - 7
pages/warndata/components/dust-detail.vue

@@ -4,6 +4,7 @@
       class="devic-box-tab"
       :current="PageCur"
       :list="tabList"
+      :activeStyle="{ color: '#000', fontWeight: 'bold' }"
       @click="NavChange"
     ></u-tabs>
     <view class="dust-content">
@@ -133,7 +134,8 @@ export default {
     return {
       option: {},
       timer: "",
-      PageCur: "0",
+      // 必须是数字,u-tabs 内部用 === 比较下标,字符串 "0" 会导致默认选中项拿不到 activeStyle
+      PageCur: 0,
       tabList: [],
       //喷粉选项数据
       topList: [],
@@ -405,23 +407,27 @@ export default {
 <style lang="scss" scoped>
 .dust-detail {
   position: relative;
+  // 撑满父容器高度:tab 固定在顶部,滚动区域在 tab 下面
+  display: flex;
+  flex-direction: column;
+  height: 100%;
   // padding: 0px 10px;
   box-sizing: border-box;
 
   .devic-box-tab {
+    flex-shrink: 0;
     position: sticky;
     top: 0;
     z-index: 10;
-    padding: 0px 10px !important;
+    background-color: #f9f9fb;
+    border-radius: 5px;
+    border: 1px solid #fff;
     margin-bottom: 10px;
   }
 
   .dust-content {
-    // height: 704px;
-    // padding: 0px 10px;
-    // box-sizing: border-box;
-    // overflow-y: auto;
-    height: auto;
+    flex: 1;
+    min-height: 0;
     box-sizing: border-box;
     overflow-y: auto;
 

+ 13 - 3
pages/warndata/components/fire-detail.vue

@@ -4,6 +4,7 @@
       class="devic-box-tab"
       :current="PageCur"
       :list="tabList"
+      :activeStyle="{ color: '#000', fontWeight: 'bold' }"
       @click="NavChange"
     ></u-tabs>
     <view class="fire-content-box">
@@ -81,7 +82,8 @@ export default {
     return {
       timer: "",
       isShow: false,
-      PageCur: "0",
+      // 必须是数字,u-tabs 内部用 === 比较下标,字符串 "0" 会导致默认选中项拿不到 activeStyle
+      PageCur: 0,
       tabList: [
         { name: "内因火灾" },
         { name: "外因火灾" },
@@ -216,18 +218,26 @@ export default {
 <style lang="scss" scoped>
 .fire-detail {
   position: relative;
+  // 撑满父容器高度:tab 固定在顶部,滚动区域在 tab 下面
+  display: flex;
+  flex-direction: column;
+  height: 100%;
   box-sizing: border-box;
 
   .devic-box-tab {
+    flex-shrink: 0;
     position: sticky;
     top: 0;
     z-index: 10;
-    padding: 0px 10px !important;
+    background-color: #f9f9fb;
+    border-radius: 5px;
+    border: 1px solid #fff;
     margin-bottom: 10px;
   }
 
   .fire-content-box {
-    height: auto;
+    flex: 1;
+    min-height: 0;
     box-sizing: border-box;
     overflow-y: auto;
 

+ 13 - 3
pages/warndata/components/gas-detail.vue

@@ -4,6 +4,7 @@
       class="devic-box-tab"
       :current="PageCur"
       :list="tabList"
+      :activeStyle="{ color: '#000', fontWeight: 'bold' }"
       @click="NavChange"
     ></u-tabs>
     <view class="gas-content" v-if="PageCur == 0">
@@ -165,7 +166,8 @@ export default {
     return {
       timeRan: Number(new Date()),
       timer: "",
-      PageCur: "0",
+      // 必须是数字,u-tabs 内部用 === 比较下标,字符串 "0" 会导致默认选中项拿不到 activeStyle
+      PageCur: 0,
       tabList: [{ name: "预警监测" }],
       // isShowSelect: true,
       showJcd: false,
@@ -312,18 +314,26 @@ export default {
 <style lang="scss" scoped>
 .gas-detail {
   position: relative;
+  // 撑满父容器高度:tab 固定在顶部,滚动区域在 tab 下面
+  display: flex;
+  flex-direction: column;
+  height: 100%;
   box-sizing: border-box;
 
   .devic-box-tab {
+    flex-shrink: 0;
     position: sticky;
     top: 0;
     z-index: 10;
-    padding: 0px 10px !important;
+    background-color: #f9f9fb;
+    border-radius: 5px;
+    border: 1px solid #fff;
     margin-bottom: 10px;
   }
 
   .gas-content {
-    height: 100%;
+    flex: 1;
+    min-height: 0;
     box-sizing: border-box;
     overflow-y: auto;
 

+ 13 - 3
pages/warndata/components/vent-detail.vue

@@ -4,6 +4,7 @@
       class="devic-box-tab"
       :current="PageCur"
       :list="tabList"
+      :activeStyle="{ color: '#000', fontWeight: 'bold' }"
       @click="NavChange"
     ></u-tabs>
     <view class="vent-content">
@@ -85,7 +86,8 @@ export default {
     return {
       mainTitle: "",
       timer: "",
-      PageCur: "0",
+      // 必须是数字,u-tabs 内部用 === 比较下标,字符串 "0" 会导致默认选中项拿不到 activeStyle
+      PageCur: 0,
       tabList: [],
       cardList: [
         {
@@ -358,18 +360,26 @@ export default {
 <style lang="scss" scoped>
 .vent-detail {
   position: relative;
+  // 撑满父容器高度:tab 固定在顶部,滚动区域在 tab 下面
+  display: flex;
+  flex-direction: column;
+  height: 100%;
   box-sizing: border-box;
 
   .devic-box-tab {
+    flex-shrink: 0;
     position: sticky;
     top: 0;
     z-index: 10;
-    padding: 0px 10px !important;
+    background-color: #f9f9fb;
+    border-radius: 5px;
+    border: 1px solid #fff;
     margin-bottom: 10px;
   }
 
   .vent-content {
-    height: auto;
+    flex: 1;
+    min-height: 0;
     box-sizing: border-box;
     overflow-y: auto;
 

+ 9 - 3
pages/warndata/warndata.vue

@@ -378,7 +378,7 @@
           </view>
         </view>
       </view>
-      <view class="main" v-else>
+      <view class="main detail-main" v-else>
         <ventDetail v-if="Type == 'vent'"></ventDetail>
         <deviceDetail v-if="Type == 'device'"></deviceDetail>
         <fireDetail v-if="Type == 'fire'"></fireDetail>
@@ -858,16 +858,22 @@ export default {
 }
 
 .main {
-  margin-top: 10px;
   display: flex;
   flex-direction: column;
   flex: 1;
   width: 100%;
-  padding: 0 24rpx 40rpx;
+  padding: 10px 24rpx 40rpx;
   box-sizing: border-box;
   background: transparent;
 }
 
+// 详情页:根区域撑满高度且不滚动
+.main.detail-main {
+  height: 100%;
+  overflow: hidden;
+  padding-bottom: 10px;
+}
+
 .warn-list {
   width: 100%;
 }

+ 29 - 23
pages/webview/webview.vue

@@ -69,7 +69,7 @@ export default {
       });
     },
     startListening() {
-		var than = this
+      var than = this;
       this.timer = setInterval(() => {
         var pages = getCurrentPages();
         var page = pages[pages.length - 1];
@@ -87,16 +87,16 @@ export default {
           tourl = tourl.substring(tourl.indexOf("ticket") + 7, tourl.length);
           var pos = tourl.indexOf("&");
           if (pos != -1) tourl = tourl.substring(0, pos);
-        console.log("=======ticket======", tourl);
-		
-		uni.navigateTo({
-		  url: "/pages/login/login?ticket="+tourl,
-		});
-		  // setTimeout(()=>{
-    //       uni.navigateTo({
-    //         url: "/pages/index/index",
-    //       });
-		  // },10000)
+          console.log("=======ticket======", tourl);
+
+          uni.navigateTo({
+            url: "/pages/login/login?ticket=" + tourl,
+          });
+          // setTimeout(()=>{
+          //       uni.navigateTo({
+          //         url: "/pages/index/index",
+          //       });
+          // },10000)
           // than.loginCas(tourl);
         }
       }, 200); // 间隔3秒检查一次
@@ -110,17 +110,17 @@ export default {
 
     loginCas(value) {
       var than = this;
-	  
-	  this.$tip.success(configService.apiUrl);
-	  var ser = configService.apiUrl;
-	  ser = tourl.replace(9999, 8092);
-              this.$tip.success(ser);
+
+      this.$tip.success(configService.apiUrl);
+      var ser = configService.apiUrl;
+      ser = tourl.replace(9999, 8092);
+      this.$tip.success(ser);
       new Promise((resolve, reject) => {
         api
           .validateCasLogin("", "?ticket=" + value + "&service=" + ser)
           .then((response) => {
-              than.$tip.success(response.message);
-			  
+            than.$tip.success(response.message);
+
             // console.log("response===>response", JSON.stringify(response));
             // if (response.data.code == 200) {
             // 	uni.setStorageSync(ACCESS_TOKEN, response.data.result.token);
@@ -140,7 +140,7 @@ export default {
               realname: userInfo.realname,
             });
 
-              than.$tip.success("loginCas=");
+            than.$tip.success("loginCas=");
             than.getPermissionList();
           })
           .catch((error) => {
@@ -156,7 +156,7 @@ export default {
     //获取权限菜单
     getPermissionList() {
       var than = this;
-              this.$tip.success("getPermissionList");
+      this.$tip.success("getPermissionList");
       console.log("getPermissionList=========================");
       new Promise((resolve, reject) => {
         api
@@ -169,7 +169,7 @@ export default {
               uni.setStorageSync("menuPermission", data);
               uni.setStorageSync("btnPermission", dataBtn);
               than.$tip.success("登录成功!");
-              than.$tip.success("navigateTo="+pages/index/index);
+              than.$tip.success("navigateTo=" + pages / index / index);
               uni.navigateTo({
                 url: "/pages/index/index",
               });
@@ -185,7 +185,7 @@ export default {
     },
     saveClientId() {
       console.log("saveClientId=========================");
-          this.getPermissionList();
+      this.getPermissionList();
       // var info = plus.push.getClientInfo();
       // var cid = info.clientid;
       // this.$http
@@ -209,7 +209,13 @@ export default {
   },
   watch: {},
   onUnload() {
-    plus.runtime.quit();
+    // 注意:这里不能直接退出应用。
+    // 退出登录 / 登录失效时用 reLaunch 清空页面栈,若单点登录页还在栈里,
+    // 销毁本页会触发 plus.runtime.quit(),导致退出登录后直接退到桌面而不是登录页。
+    // 单点登录页侧滑返回时也应回到登录页,而不是关闭应用。
+    // #ifdef APP-PLUS
+    // plus.runtime.quit();
+    // #endif
   },
   onLoad(option) {
     // 获取传递过来的url参数

+ 9 - 0
static/icon-new/Fan1StartStatus_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.842" height="29.355" viewBox="0 0 28.842 29.355">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="电机运行状态" d="M187.336,150.748a14.1,14.1,0,0,0,4.176,7.491,1.289,1.289,0,0,0,2-.293l1.675-2.9a1.29,1.29,0,0,0-.161-1.51,8.428,8.428,0,0,1-1.865-3.387,1.289,1.289,0,0,0-1.242-.945H188.6a1.289,1.289,0,0,0-1.263,1.546Zm17.048,5.965a1.287,1.287,0,0,0-1.391-.616,8.3,8.3,0,0,1-4.19-.166,1.29,1.29,0,0,0-1.492.588l-1.645,2.85a1.288,1.288,0,0,0,.67,1.852,14.233,14.233,0,0,0,8.979.268,1.288,1.288,0,0,0,.744-1.878l-1.674-2.9Zm5.922-19.686a1.287,1.287,0,0,0-.825-.3,1.338,1.338,0,0,0-.226.021,1.288,1.288,0,0,0-.889.625l-1.648,2.853a1.291,1.291,0,0,0,.236,1.587,8.291,8.291,0,0,1,2.336,3.865,1.29,1.29,0,0,0,1.243.948h3.32a1.288,1.288,0,0,0,1.262-1.544A14.159,14.159,0,0,0,210.306,137.026Zm-4.166-1.932a1.29,1.29,0,0,0-.826-.759,14.222,14.222,0,0,0-8.979.267,1.29,1.29,0,0,0-.67,1.854l1.645,2.85a1.29,1.29,0,0,0,1.492.588,8.28,8.28,0,0,1,4.19-.168,1.289,1.289,0,0,0,1.391-.614l1.674-2.9A1.287,1.287,0,0,0,206.141,135.094Zm7.713,14.107h-3.32a1.288,1.288,0,0,0-1.243.947,8.3,8.3,0,0,1-2.336,3.865,1.289,1.289,0,0,0-.236,1.585l1.648,2.854a1.287,1.287,0,0,0,.89.625,1.332,1.332,0,0,0,.226.019,1.286,1.286,0,0,0,.825-.3,14.164,14.164,0,0,0,4.809-8.054,1.288,1.288,0,0,0-1.262-1.544ZM187.6,146.15a1.287,1.287,0,0,0,1,.474h3.32a1.289,1.289,0,0,0,1.242-.945,8.429,8.429,0,0,1,1.865-3.389,1.288,1.288,0,0,0,.161-1.509l-1.675-2.9a1.288,1.288,0,0,0-2-.293,14.1,14.1,0,0,0-4.176,7.491,1.286,1.286,0,0,0,.265,1.073Z" transform="translate(-186.805 -133.234)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/Fan2StartStatus_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.842" height="29.355" viewBox="0 0 28.842 29.355">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="电机运行状态" d="M187.336,150.748a14.1,14.1,0,0,0,4.176,7.491,1.289,1.289,0,0,0,2-.293l1.675-2.9a1.29,1.29,0,0,0-.161-1.51,8.428,8.428,0,0,1-1.865-3.387,1.289,1.289,0,0,0-1.242-.945H188.6a1.289,1.289,0,0,0-1.263,1.546Zm17.048,5.965a1.287,1.287,0,0,0-1.391-.616,8.3,8.3,0,0,1-4.19-.166,1.29,1.29,0,0,0-1.492.588l-1.645,2.85a1.288,1.288,0,0,0,.67,1.852,14.233,14.233,0,0,0,8.979.268,1.288,1.288,0,0,0,.744-1.878l-1.674-2.9Zm5.922-19.686a1.287,1.287,0,0,0-.825-.3,1.338,1.338,0,0,0-.226.021,1.288,1.288,0,0,0-.889.625l-1.648,2.853a1.291,1.291,0,0,0,.236,1.587,8.291,8.291,0,0,1,2.336,3.865,1.29,1.29,0,0,0,1.243.948h3.32a1.288,1.288,0,0,0,1.262-1.544A14.159,14.159,0,0,0,210.306,137.026Zm-4.166-1.932a1.29,1.29,0,0,0-.826-.759,14.222,14.222,0,0,0-8.979.267,1.29,1.29,0,0,0-.67,1.854l1.645,2.85a1.29,1.29,0,0,0,1.492.588,8.28,8.28,0,0,1,4.19-.168,1.289,1.289,0,0,0,1.391-.614l1.674-2.9A1.287,1.287,0,0,0,206.141,135.094Zm7.713,14.107h-3.32a1.288,1.288,0,0,0-1.243.947,8.3,8.3,0,0,1-2.336,3.865,1.289,1.289,0,0,0-.236,1.585l1.648,2.854a1.287,1.287,0,0,0,.89.625,1.332,1.332,0,0,0,.226.019,1.286,1.286,0,0,0,.825-.3,14.164,14.164,0,0,0,4.809-8.054,1.288,1.288,0,0,0-1.262-1.544ZM187.6,146.15a1.287,1.287,0,0,0,1,.474h3.32a1.289,1.289,0,0,0,1.242-.945,8.429,8.429,0,0,1,1.865-3.389,1.288,1.288,0,0,0,.161-1.509l-1.675-2.9a1.288,1.288,0,0,0-2-.293,14.1,14.1,0,0,0-4.176,7.491,1.286,1.286,0,0,0,.265,1.073Z" transform="translate(-186.805 -133.234)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/FanStartStatus.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.842" height="29.355" viewBox="0 0 28.842 29.355">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="电机运行状态" d="M187.336,150.748a14.1,14.1,0,0,0,4.176,7.491,1.289,1.289,0,0,0,2-.293l1.675-2.9a1.29,1.29,0,0,0-.161-1.51,8.428,8.428,0,0,1-1.865-3.387,1.289,1.289,0,0,0-1.242-.945H188.6a1.289,1.289,0,0,0-1.263,1.546Zm17.048,5.965a1.287,1.287,0,0,0-1.391-.616,8.3,8.3,0,0,1-4.19-.166,1.29,1.29,0,0,0-1.492.588l-1.645,2.85a1.288,1.288,0,0,0,.67,1.852,14.233,14.233,0,0,0,8.979.268,1.288,1.288,0,0,0,.744-1.878l-1.674-2.9Zm5.922-19.686a1.287,1.287,0,0,0-.825-.3,1.338,1.338,0,0,0-.226.021,1.288,1.288,0,0,0-.889.625l-1.648,2.853a1.291,1.291,0,0,0,.236,1.587,8.291,8.291,0,0,1,2.336,3.865,1.29,1.29,0,0,0,1.243.948h3.32a1.288,1.288,0,0,0,1.262-1.544A14.159,14.159,0,0,0,210.306,137.026Zm-4.166-1.932a1.29,1.29,0,0,0-.826-.759,14.222,14.222,0,0,0-8.979.267,1.29,1.29,0,0,0-.67,1.854l1.645,2.85a1.29,1.29,0,0,0,1.492.588,8.28,8.28,0,0,1,4.19-.168,1.289,1.289,0,0,0,1.391-.614l1.674-2.9A1.287,1.287,0,0,0,206.141,135.094Zm7.713,14.107h-3.32a1.288,1.288,0,0,0-1.243.947,8.3,8.3,0,0,1-2.336,3.865,1.289,1.289,0,0,0-.236,1.585l1.648,2.854a1.287,1.287,0,0,0,.89.625,1.332,1.332,0,0,0,.226.019,1.286,1.286,0,0,0,.825-.3,14.164,14.164,0,0,0,4.809-8.054,1.288,1.288,0,0,0-1.262-1.544ZM187.6,146.15a1.287,1.287,0,0,0,1,.474h3.32a1.289,1.289,0,0,0,1.242-.945,8.429,8.429,0,0,1,1.865-3.389,1.288,1.288,0,0,0,.161-1.509l-1.675-2.9a1.288,1.288,0,0,0-2-.293,14.1,14.1,0,0,0-4.176,7.491,1.286,1.286,0,0,0,.265,1.073Z" transform="translate(-186.805 -133.234)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/FanStartStatus_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.842" height="29.355" viewBox="0 0 28.842 29.355">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="电机运行状态" d="M187.336,150.748a14.1,14.1,0,0,0,4.176,7.491,1.289,1.289,0,0,0,2-.293l1.675-2.9a1.29,1.29,0,0,0-.161-1.51,8.428,8.428,0,0,1-1.865-3.387,1.289,1.289,0,0,0-1.242-.945H188.6a1.289,1.289,0,0,0-1.263,1.546Zm17.048,5.965a1.287,1.287,0,0,0-1.391-.616,8.3,8.3,0,0,1-4.19-.166,1.29,1.29,0,0,0-1.492.588l-1.645,2.85a1.288,1.288,0,0,0,.67,1.852,14.233,14.233,0,0,0,8.979.268,1.288,1.288,0,0,0,.744-1.878l-1.674-2.9Zm5.922-19.686a1.287,1.287,0,0,0-.825-.3,1.338,1.338,0,0,0-.226.021,1.288,1.288,0,0,0-.889.625l-1.648,2.853a1.291,1.291,0,0,0,.236,1.587,8.291,8.291,0,0,1,2.336,3.865,1.29,1.29,0,0,0,1.243.948h3.32a1.288,1.288,0,0,0,1.262-1.544A14.159,14.159,0,0,0,210.306,137.026Zm-4.166-1.932a1.29,1.29,0,0,0-.826-.759,14.222,14.222,0,0,0-8.979.267,1.29,1.29,0,0,0-.67,1.854l1.645,2.85a1.29,1.29,0,0,0,1.492.588,8.28,8.28,0,0,1,4.19-.168,1.289,1.289,0,0,0,1.391-.614l1.674-2.9A1.287,1.287,0,0,0,206.141,135.094Zm7.713,14.107h-3.32a1.288,1.288,0,0,0-1.243.947,8.3,8.3,0,0,1-2.336,3.865,1.289,1.289,0,0,0-.236,1.585l1.648,2.854a1.287,1.287,0,0,0,.89.625,1.332,1.332,0,0,0,.226.019,1.286,1.286,0,0,0,.825-.3,14.164,14.164,0,0,0,4.809-8.054,1.288,1.288,0,0,0-1.262-1.544ZM187.6,146.15a1.287,1.287,0,0,0,1,.474h3.32a1.289,1.289,0,0,0,1.242-.945,8.429,8.429,0,0,1,1.865-3.389,1.288,1.288,0,0,0,.161-1.509l-1.675-2.9a1.288,1.288,0,0,0-2-.293,14.1,14.1,0,0,0-4.176,7.491,1.286,1.286,0,0,0,.265,1.073Z" transform="translate(-186.805 -133.234)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/Fan_MOT1_Power.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.247" height="28.214" viewBox="0 0 28.247 28.214">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="电机有功功率" d="M51.76,41.557a5.73,5.73,0,0,0-5.528-5.717H34.3V63h4.03V48.7h8.059C49.433,48.7,52.008,46.5,51.76,41.557Zm-2.749,1.557c-.262,1.324-1.324,1.295-2.633,1.295H38.334V40.131h8.059c1.338.131,3.142.393,2.618,2.982ZM51.92,60.046c-.029-.422-2.255-8.335-2.255-8.335H47.134s-2.2,7.724-2.226,8.088l-1.935-8.088H40.763l2.895,10.808h2.328l2.429-8.612c.029.364,2.182,8.612,2.182,8.612H53L55.95,51.711h-2.2L51.92,60.046Zm8.685-8.525a2.326,2.326,0,0,0-2.662,1.847H57.9V51.711H56.1V62.519h1.8V57.05a4.911,4.911,0,0,1,.684-2.735,2.1,2.1,0,0,1,2.968-.684V51.7A2.066,2.066,0,0,0,60.605,51.522Z" transform="translate(-33.804 -35.34)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/Fan_MOT2_Power.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.247" height="28.214" viewBox="0 0 28.247 28.214">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="电机有功功率" d="M51.76,41.557a5.73,5.73,0,0,0-5.528-5.717H34.3V63h4.03V48.7h8.059C49.433,48.7,52.008,46.5,51.76,41.557Zm-2.749,1.557c-.262,1.324-1.324,1.295-2.633,1.295H38.334V40.131h8.059c1.338.131,3.142.393,2.618,2.982ZM51.92,60.046c-.029-.422-2.255-8.335-2.255-8.335H47.134s-2.2,7.724-2.226,8.088l-1.935-8.088H40.763l2.895,10.808h2.328l2.429-8.612c.029.364,2.182,8.612,2.182,8.612H53L55.95,51.711h-2.2L51.92,60.046Zm8.685-8.525a2.326,2.326,0,0,0-2.662,1.847H57.9V51.711H56.1V62.519h1.8V57.05a4.911,4.911,0,0,1,.684-2.735,2.1,2.1,0,0,1,2.968-.684V51.7A2.066,2.066,0,0,0,60.605,51.522Z" transform="translate(-33.804 -35.34)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/T.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28" height="28" viewBox="0 0 28 28">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="时间" d="M77.5,91A13.5,13.5,0,1,1,91,77.5,13.5,13.5,0,0,1,77.5,91Zm0-3.857A9.643,9.643,0,1,0,67.857,77.5,9.643,9.643,0,0,0,77.5,87.143Zm7.749-11.571v3.857H75.571V69.786h3.857v5.786Z" transform="translate(-63.5 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/V.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="31" height="31" viewBox="0 0 31 31">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="监测值" d="M15,0a.938.938,0,0,1,.938.938v.971A13.127,13.127,0,0,1,28.091,14.063h.971a.938.938,0,0,1,0,1.875h-.971A13.127,13.127,0,0,1,15.938,28.091v.971a.938.938,0,0,1-1.875,0v-.971A13.127,13.127,0,0,1,1.911,15.938H.938a.938.938,0,0,1,0-1.875h.971A13.127,13.127,0,0,1,14.063,1.911V.938A.937.937,0,0,1,15,0Zm0,3.75A11.25,11.25,0,1,0,26.25,15,11.25,11.25,0,0,0,15,3.75Zm0,5.625A5.625,5.625,0,1,1,9.375,15,5.625,5.625,0,0,1,15,9.375Z" transform="translate(0.5 0.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/airLeakageRatePerHundred_merge.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.778" height="23.66" viewBox="0 0 28.778 23.66">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="百米漏风率" d="M65.853,146.814v21.179a.591.591,0,0,0,.592.592h13.82a.051.051,0,0,0,.051-.051.29.29,0,0,0-.018-.1L72.049,146.6a.593.593,0,0,0-.554-.383H66.445A.592.592,0,0,0,65.853,146.814Zm27.33,8.288a.966.966,0,0,0-1.284-.448,4.311,4.311,0,0,1-4.191-.294,6.221,6.221,0,0,0-6.854,0,4.276,4.276,0,0,1-2.693.695c-.706-.056-1,1.878.127,1.915a6.221,6.221,0,0,0,3.636-1.025,4.278,4.278,0,0,1,4.715,0,6.26,6.26,0,0,0,6.091.428A.945.945,0,0,0,93.183,155.1Zm.349,5.924a.968.968,0,0,0-1.285-.448,4.311,4.311,0,0,1-4.191-.294,6.219,6.219,0,0,0-6.853,0,4.308,4.308,0,0,1-1.761.666c-.358.05-.293,1.953.13,1.9a6.218,6.218,0,0,0,2.7-.986,4.279,4.279,0,0,1,4.715,0,6.263,6.263,0,0,0,6.092.427A.948.948,0,0,0,93.532,161.026Zm-.352,5.924A.966.966,0,0,0,91.9,166.5a4.311,4.311,0,0,1-4.191-.294,6.219,6.219,0,0,0-6.853,0c-.6.4.368,2.048,1.069,1.585a4.278,4.278,0,0,1,4.715,0,6.263,6.263,0,0,0,6.092.427A.946.946,0,0,0,93.18,166.951Z" transform="translate(-65.353 -145.722)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/airSupplyDistence_merge.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.144" height="21.013" viewBox="0 0 28.144 21.013">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="供风距离" d="M26.915,144.171H24.058V150.6a.713.713,0,1,1-1.426,0v-6.427H19.771v5a.713.713,0,1,1-1.426,0v-5H15.487v5a.714.714,0,0,1-1.429,0v-5H11.2v5a.714.714,0,0,1-1.429,0v-5H6.916V150.6a.713.713,0,1,1-1.426,0v-6.427H2.629A1.429,1.429,0,0,0,1.2,145.6v8.571A1.433,1.433,0,0,0,2.629,155.6H26.915a1.433,1.433,0,0,0,1.429-1.429V145.6a1.433,1.433,0,0,0-1.429-1.429Zm1.07-8.475a.713.713,0,0,0-1.07.619v2.143H2.629v-2.143a.714.714,0,0,0-1.429,0v5.713a.714.714,0,1,0,1.429,0v-2.141H26.915v2.143a.713.713,0,1,0,1.426,0v-5.716a.715.715,0,0,0-.356-.619Z" transform="translate(-0.7 -135.087)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/atomizeState.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="25.517" height="25.541" viewBox="0 0 25.517 25.541">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="喷雾状态" d="M144.151,158.92a1.274,1.274,0,0,1-1.276-1.276V147.416a1.27,1.27,0,0,1,.379-.9l2.587-2.567a1.284,1.284,0,0,1,.9-.371h3.791v-5.1h-5.9l-5.541,4.779v14.394a1.276,1.276,0,1,1-2.551,0v-14.98a1.275,1.275,0,0,1,.442-.965l6.338-5.469a1.276,1.276,0,0,1,.833-.311H151.8a1.274,1.274,0,0,1,1.276,1.276v7.653a1.274,1.274,0,0,1-1.276,1.276h-4.536l-1.838,1.822v9.7a1.274,1.274,0,0,1-1.276,1.276Zm12.759-20.448a1.274,1.274,0,0,1-.7-2.34l3.866-2.543a1.275,1.275,0,1,1,1.4,2.133l-3.866,2.543A1.282,1.282,0,0,1,156.91,138.472Zm3.862,3.874h-3.866a1.276,1.276,0,1,1,0-2.551h3.866a1.276,1.276,0,1,1,0,2.551Zm0,6.346a1.279,1.279,0,0,1-.706-.211l-3.866-2.567a1.277,1.277,0,0,1,1.411-2.129l3.866,2.567a1.276,1.276,0,0,1-.706,2.34Z" transform="translate(-136.534 -133.379)" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/atomizeState_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="25.517" height="25.541" viewBox="0 0 25.517 25.541">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="喷雾状态" d="M144.151,158.92a1.274,1.274,0,0,1-1.276-1.276V147.416a1.27,1.27,0,0,1,.379-.9l2.587-2.567a1.284,1.284,0,0,1,.9-.371h3.791v-5.1h-5.9l-5.541,4.779v14.394a1.276,1.276,0,1,1-2.551,0v-14.98a1.275,1.275,0,0,1,.442-.965l6.338-5.469a1.276,1.276,0,0,1,.833-.311H151.8a1.274,1.274,0,0,1,1.276,1.276v7.653a1.274,1.274,0,0,1-1.276,1.276h-4.536l-1.838,1.822v9.7a1.274,1.274,0,0,1-1.276,1.276Zm12.759-20.448a1.274,1.274,0,0,1-.7-2.34l3.866-2.543a1.275,1.275,0,1,1,1.4,2.133l-3.866,2.543A1.282,1.282,0,0,1,156.91,138.472Zm3.862,3.874h-3.866a1.276,1.276,0,1,1,0-2.551h3.866a1.276,1.276,0,1,1,0,2.551Zm0,6.346a1.279,1.279,0,0,1-.706-.211l-3.866-2.567a1.277,1.277,0,0,1,1.411-2.129l3.866,2.567a1.276,1.276,0,0,1-.706,2.34Z" transform="translate(-136.534 -133.379)" fill="url(#linear-gradient)"/>
+</svg>

+ 12 - 0
static/icon-new/batteryLevel.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="31" height="17.436" viewBox="0 0 31 17.436">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="电池电量" transform="translate(0 -224.1)">
+    <path id="路径_56375" data-name="路径 56375" d="M29.8,230.479a.491.491,0,0,1-.248-.421v-3.006A2.962,2.962,0,0,0,26.6,224.1H2.952A2.957,2.957,0,0,0,0,227.049v11.532a2.962,2.962,0,0,0,2.952,2.955H26.595a2.962,2.962,0,0,0,2.952-2.952v-3.006a.488.488,0,0,1,.248-.421,2.425,2.425,0,0,0,1.2-2.1v-.484A2.413,2.413,0,0,0,29.8,230.479Zm-2.186,8.1A1.024,1.024,0,0,1,26.6,239.6H2.952a1.024,1.024,0,0,1-1.014-1.014V227.049a1.023,1.023,0,0,1,1.014-1.014H26.595a1.023,1.023,0,0,1,1.014,1.014v11.535Z" transform="translate(0 0)" fill="url(#linear-gradient)"/>
+    <path id="路径_56376" data-name="路径 56376" d="M115.377,328.484v10.173a.486.486,0,0,1-.484.484H96.484a.486.486,0,0,1-.484-.484V328.484a.486.486,0,0,1,.484-.484h18.408A.486.486,0,0,1,115.377,328.484Z" transform="translate(-93.093 -100.754)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 11 - 0
static/icon-new/centerTemperature.svg

@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="18.367" height="31.454" viewBox="0 0 18.367 31.454">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="中心温度" transform="translate(0 -2.811)">
+    <path id="路径_55369" data-name="路径 55369" d="M223.265,19.362V10.925a.932.932,0,0,0-.931-.931h-.074a.9.9,0,0,0-.9.9v8.465a3.277,3.277,0,0,0-2.4,3.124,3.36,3.36,0,1,0,4.312-3.124Zm4.942-3.738a.849.849,0,0,1-.332-.645V5.439a5.567,5.567,0,0,0-11.131,0v9.27a1.326,1.326,0,0,1-.451,1.017,8.846,8.846,0,0,0-3.164,6.763,9.186,9.186,0,0,0,18.367,0A8.847,8.847,0,0,0,228.207,15.624Zm-5.9,12.983a6.213,6.213,0,0,1-6.29-6.121,6.064,6.064,0,0,1,2.939-5.172l.445-.273a.493.493,0,0,0,.233-.418V5.439a2.676,2.676,0,0,1,5.35,0V16.622a.494.494,0,0,0,.233.418l.445.273a6.057,6.057,0,0,1,2.936,5.172,6.22,6.22,0,0,1-6.293,6.121Z" transform="translate(-213.129 2.811)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 14 - 0
static/icon-new/ch2val.svg

@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40.405" height="18.397" viewBox="0 0 40.405 18.397">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="乙烯" transform="translate(-89.811 -2267.302)">
+    <path id="路径_56369" data-name="路径 56369" d="M108.747,323.159a1.68,1.68,0,0,0-1.6-.847,1.481,1.481,0,0,0-1.035.329,2.53,2.53,0,0,0-.659,1.106,9.592,9.592,0,0,0-.329,2c-.071.823-.094,1.835-.094,3.034a26.772,26.772,0,0,0,.141,3.081,7.117,7.117,0,0,0,.4,1.835,1.654,1.654,0,0,0,.682.87,1.712,1.712,0,0,0,.964.212,2.665,2.665,0,0,0,.847-.141,1.559,1.559,0,0,0,.682-.612,4.226,4.226,0,0,0,.447-1.294,11.526,11.526,0,0,0,.165-2.211h3.364a15.783,15.783,0,0,1-.212,2.587,5.909,5.909,0,0,1-.8,2.14,3.947,3.947,0,0,1-1.623,1.482,6.341,6.341,0,0,1-2.729.517,6.446,6.446,0,0,1-3.034-.612,4.2,4.2,0,0,1-1.741-1.764,8.022,8.022,0,0,1-.776-2.752,35.136,35.136,0,0,1,0-7.033,8.149,8.149,0,0,1,.776-2.776,4.391,4.391,0,0,1,1.741-1.788,6.155,6.155,0,0,1,3.034-.659,5.9,5.9,0,0,1,2.846.588,3.914,3.914,0,0,1,1.552,1.482,5.336,5.336,0,0,1,.659,1.952,18.594,18.594,0,0,1,.141,1.976h-3.364A6.247,6.247,0,0,0,108.747,323.159Zm16.3-2.987v6.421H129v-6.421h3.387v16.795H129V329.51h-3.952v7.456h-3.387V320.172Zm-10.914,15.76a6.053,6.053,0,0,1,.141-1.294,5.23,5.23,0,0,1,.423-1.153,6.511,6.511,0,0,1,.729-1.058,10.753,10.753,0,0,1,1.011-1.058l.847-.8a4.265,4.265,0,0,0,.565-.565,2.079,2.079,0,0,0,.329-.541,1.713,1.713,0,0,0,.165-.565,3.538,3.538,0,0,0,0-.706,1.056,1.056,0,0,0-.753-1.27,1.146,1.146,0,0,0-1.247.588,2.085,2.085,0,0,0-.165.659v.776h-2.023v-.353a3.1,3.1,0,0,1,.776-2.235,3.335,3.335,0,0,1,2.446-.776,3.279,3.279,0,0,1,2.352.729,2.776,2.776,0,0,1,.776,2.093,4.051,4.051,0,0,1-.094.917,2.631,2.631,0,0,1-.282.823,4.357,4.357,0,0,1-.494.776,7.779,7.779,0,0,1-.753.776l-1.176,1.082a4.066,4.066,0,0,0-.729.823,2.426,2.426,0,0,0-.329.706h3.928v1.623Z" transform="translate(-11.32 1947.943)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+    <g id="组_15752" data-name="组 15752" transform="translate(122.285 2274.279)" style="isolation: isolate">
+      <path id="路径_56258" data-name="路径 56258" d="M988.534,591.553h-1.2v1.917h-2.321v-1.917H980.6v-1.536a23.673,23.673,0,0,0,2.14-2.7,23.357,23.357,0,0,0,1.781-3.11h2.811v5.654h1.2Zm-3.519-1.689V586.41q-.24.513-.534,1.019t-.61.959q-.315.451-.632.833a6.632,6.632,0,0,1-.6.643Z" transform="translate(-980.603 -584.21)" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/ch4.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="34.554" height="19.393" viewBox="0 0 34.554 19.393">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="甲烷" d="M167.5,323.476a1.726,1.726,0,0,0-1.679-.886,1.679,1.679,0,0,0-1.1.358,2.394,2.394,0,0,0-.684,1.166,9.92,9.92,0,0,0-.342,2.115q-.093,1.306-.093,3.2a31.1,31.1,0,0,0,.14,3.265,7.247,7.247,0,0,0,.42,1.928,1.748,1.748,0,0,0,.715.917,2.056,2.056,0,0,0,1.011.233,2.338,2.338,0,0,0,.886-.155,1.555,1.555,0,0,0,.715-.653,4.23,4.23,0,0,0,.466-1.368,12.534,12.534,0,0,0,.171-2.332H171.7a15.921,15.921,0,0,1-.218,2.737,6.22,6.22,0,0,1-.84,2.27,4.152,4.152,0,0,1-1.71,1.555,6.5,6.5,0,0,1-2.876.544,6.764,6.764,0,0,1-3.2-.653,4.369,4.369,0,0,1-1.835-1.866,8.21,8.21,0,0,1-.824-2.908,37.316,37.316,0,0,1,0-7.448,8.225,8.225,0,0,1,.824-2.923,4.665,4.665,0,0,1,1.835-1.9,6.453,6.453,0,0,1,3.2-.684,6.219,6.219,0,0,1,3.016.622,4.237,4.237,0,0,1,1.648,1.555,5.515,5.515,0,0,1,.684,2.068,17.3,17.3,0,0,1,.14,2.083h-3.576a6.453,6.453,0,0,0-.466-2.845Zm9.811-3.172V327.1h4.183V320.3h3.576v17.757h-3.576v-7.883h-4.183v7.883h-3.576V320.3Zm12.874,6.748H192.5v6.981h1.057v1.741H192.5v2.286H190.45v-2.286h-3.918V333.94Zm.233,2.8-2.146,4.183h2.177v-4.183Z" transform="translate(-159.506 -319.486)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

File diff suppressed because it is too large
+ 7 - 0
static/icon-new/chval.svg


+ 17 - 0
static/icon-new/co2_merge.svg

@@ -0,0 +1,17 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="37.102" height="24.278" viewBox="0 0 37.102 24.278">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="二氧化碳" transform="translate(-898.614 -469.47)">
+    <g id="组_15361" data-name="组 15361" transform="translate(898.614 469.47)" style="isolation: isolate">
+      <path id="路径_56261" data-name="路径 56261" d="M901.52,492.284a5.879,5.879,0,0,1-2.122-2.108,5.576,5.576,0,0,1-.784-2.892V475.255a5.579,5.579,0,0,1,.784-2.893,5.883,5.883,0,0,1,2.122-2.108,5.646,5.646,0,0,1,2.906-.783h1.919a5.65,5.65,0,0,1,2.906.783,5.774,5.774,0,0,1,2.108,2.108,5.653,5.653,0,0,1,.77,2.893v.729H909.48v-.729a3.138,3.138,0,0,0-3.136-3.136h-1.919a3.009,3.009,0,0,0-2.23.919,3.043,3.043,0,0,0-.906,2.217v12.028a3.04,3.04,0,0,0,.906,2.216,3,3,0,0,0,2.23.92h1.919a3.139,3.139,0,0,0,3.136-3.136v-.73h2.649v.73a5.649,5.649,0,0,1-.77,2.892,5.771,5.771,0,0,1-2.108,2.108,5.651,5.651,0,0,1-2.906.784h-1.919A5.647,5.647,0,0,1,901.52,492.284Z" transform="translate(-898.614 -469.47)" fill="url(#linear-gradient)"/>
+      <path id="路径_56262" data-name="路径 56262" d="M928.659,492.189a6.516,6.516,0,0,1-2.392-2.379,6.333,6.333,0,0,1-.878-3.258V475.984a6.331,6.331,0,0,1,.878-3.257,6.512,6.512,0,0,1,2.392-2.379,6.407,6.407,0,0,1,3.271-.878h.946a6.333,6.333,0,0,1,3.257.878,6.546,6.546,0,0,1,2.379,2.379,6.333,6.333,0,0,1,.879,3.257v10.569a6.336,6.336,0,0,1-.879,3.258,6.551,6.551,0,0,1-2.379,2.379,6.333,6.333,0,0,1-3.257.878h-.946A6.407,6.407,0,0,1,928.659,492.189Zm-.067-3.717A4,4,0,0,0,930,489.892a3.688,3.688,0,0,0,1.933.527h.946a3.687,3.687,0,0,0,1.932-.527,4,4,0,0,0,1.406-1.419,3.708,3.708,0,0,0,.527-1.919V475.984a3.71,3.71,0,0,0-.527-1.919,4,4,0,0,0-1.406-1.419,3.686,3.686,0,0,0-1.932-.527h-.946a3.688,3.688,0,0,0-1.933.527,4,4,0,0,0-1.406,1.419,3.71,3.71,0,0,0-.527,1.919v10.569A3.707,3.707,0,0,0,928.592,488.472Z" transform="translate(-910.945 -469.47)" fill="url(#linear-gradient)"/>
+    </g>
+    <g id="组_15362" data-name="组 15362" transform="translate(927.744 482.265)" style="isolation: isolate">
+      <path id="路径_56263" data-name="路径 56263" d="M974.182,502.254H966.21v-1.109a3.67,3.67,0,0,1,.357-1.663,5.053,5.053,0,0,1,.884-1.26,8.98,8.98,0,0,1,1.148-1q.621-.455,1.149-.9a5.377,5.377,0,0,0,.884-.924,1.824,1.824,0,0,0,.356-1.115,1.029,1.029,0,0,0-.369-.851,1.556,1.556,0,0,0-1-.3,3.459,3.459,0,0,0-.7.079,4.845,4.845,0,0,0-.759.225,5.524,5.524,0,0,0-.726.343,2.773,2.773,0,0,0-.6.449v-2.56a5.078,5.078,0,0,1,1.61-.706,7.412,7.412,0,0,1,1.689-.191,5.226,5.226,0,0,1,1.531.218,3.49,3.49,0,0,1,1.234.654,3.149,3.149,0,0,1,.825,1.069,3.35,3.35,0,0,1,.3,1.464,3.043,3.043,0,0,1-.336,1.4,6.246,6.246,0,0,1-.838,1.24,9.557,9.557,0,0,1-1.083,1.069q-.581.488-1.082.87c-.334.256-.613.475-.838.661s-.337.33-.337.435v.053h4.672Z" transform="translate(-966.21 -490.771)" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 17 - 0
static/icon-new/co2val.svg

@@ -0,0 +1,17 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="37.102" height="24.278" viewBox="0 0 37.102 24.278">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="二氧化碳" transform="translate(-898.614 -469.47)">
+    <g id="组_15361" data-name="组 15361" transform="translate(898.614 469.47)" style="isolation: isolate">
+      <path id="路径_56261" data-name="路径 56261" d="M901.52,492.284a5.879,5.879,0,0,1-2.122-2.108,5.576,5.576,0,0,1-.784-2.892V475.255a5.579,5.579,0,0,1,.784-2.893,5.883,5.883,0,0,1,2.122-2.108,5.646,5.646,0,0,1,2.906-.783h1.919a5.65,5.65,0,0,1,2.906.783,5.774,5.774,0,0,1,2.108,2.108,5.653,5.653,0,0,1,.77,2.893v.729H909.48v-.729a3.138,3.138,0,0,0-3.136-3.136h-1.919a3.009,3.009,0,0,0-2.23.919,3.043,3.043,0,0,0-.906,2.217v12.028a3.04,3.04,0,0,0,.906,2.216,3,3,0,0,0,2.23.92h1.919a3.139,3.139,0,0,0,3.136-3.136v-.73h2.649v.73a5.649,5.649,0,0,1-.77,2.892,5.771,5.771,0,0,1-2.108,2.108,5.651,5.651,0,0,1-2.906.784h-1.919A5.647,5.647,0,0,1,901.52,492.284Z" transform="translate(-898.614 -469.47)" fill="url(#linear-gradient)"/>
+      <path id="路径_56262" data-name="路径 56262" d="M928.659,492.189a6.516,6.516,0,0,1-2.392-2.379,6.333,6.333,0,0,1-.878-3.258V475.984a6.331,6.331,0,0,1,.878-3.257,6.512,6.512,0,0,1,2.392-2.379,6.407,6.407,0,0,1,3.271-.878h.946a6.333,6.333,0,0,1,3.257.878,6.546,6.546,0,0,1,2.379,2.379,6.333,6.333,0,0,1,.879,3.257v10.569a6.336,6.336,0,0,1-.879,3.258,6.551,6.551,0,0,1-2.379,2.379,6.333,6.333,0,0,1-3.257.878h-.946A6.407,6.407,0,0,1,928.659,492.189Zm-.067-3.717A4,4,0,0,0,930,489.892a3.688,3.688,0,0,0,1.933.527h.946a3.687,3.687,0,0,0,1.932-.527,4,4,0,0,0,1.406-1.419,3.708,3.708,0,0,0,.527-1.919V475.984a3.71,3.71,0,0,0-.527-1.919,4,4,0,0,0-1.406-1.419,3.686,3.686,0,0,0-1.932-.527h-.946a3.688,3.688,0,0,0-1.933.527,4,4,0,0,0-1.406,1.419,3.71,3.71,0,0,0-.527,1.919v10.569A3.707,3.707,0,0,0,928.592,488.472Z" transform="translate(-910.945 -469.47)" fill="url(#linear-gradient)"/>
+    </g>
+    <g id="组_15362" data-name="组 15362" transform="translate(927.744 482.265)" style="isolation: isolate">
+      <path id="路径_56263" data-name="路径 56263" d="M974.182,502.254H966.21v-1.109a3.67,3.67,0,0,1,.357-1.663,5.053,5.053,0,0,1,.884-1.26,8.98,8.98,0,0,1,1.148-1q.621-.455,1.149-.9a5.377,5.377,0,0,0,.884-.924,1.824,1.824,0,0,0,.356-1.115,1.029,1.029,0,0,0-.369-.851,1.556,1.556,0,0,0-1-.3,3.459,3.459,0,0,0-.7.079,4.845,4.845,0,0,0-.759.225,5.524,5.524,0,0,0-.726.343,2.773,2.773,0,0,0-.6.449v-2.56a5.078,5.078,0,0,1,1.61-.706,7.412,7.412,0,0,1,1.689-.191,5.226,5.226,0,0,1,1.531.218,3.49,3.49,0,0,1,1.234.654,3.149,3.149,0,0,1,.825,1.069,3.35,3.35,0,0,1,.3,1.464,3.043,3.043,0,0,1-.336,1.4,6.246,6.246,0,0,1-.838,1.24,9.557,9.557,0,0,1-1.083,1.069q-.581.488-1.082.87c-.334.256-.613.475-.838.661s-.337.33-.337.435v.053h4.672Z" transform="translate(-966.21 -490.771)" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 14 - 0
static/icon-new/controlState.svg

@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.824" height="27.104" viewBox="0 0 24.824 27.104">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="控制状态" transform="translate(-130.56 -68.672)">
+    <path id="路径_56371" data-name="路径 56371" d="M373.828,405.6l.008-.008-2.4-2.4a6.486,6.486,0,0,0-.787-8.21l-3.3-3.3a.277.277,0,0,0-.185-.074.255.255,0,0,0-.185.074l-1.39,1.392-2.157-2.157,0,0a1.075,1.075,0,0,0-.775-.331,1.1,1.1,0,0,0-.751,1.89l2.141,2.139-2.925,2.925-2.143-2.143a1.077,1.077,0,0,0-.779-.337,1.1,1.1,0,0,0-.779,1.864l0,0,2.153,2.153-1.392,1.392a.263.263,0,0,0,0,.366l3.3,3.3a6.485,6.485,0,0,0,8.214.787l2.4,2.4,0,0a1.209,1.209,0,0,0,.848.35,1.229,1.229,0,0,0,.884-2.079Z" transform="translate(-219.497 -311.904)" fill="url(#linear-gradient)"/>
+    <path id="路径_56372" data-name="路径 56372" d="M137.763,181.135l8.8-8.8a.255.255,0,0,0,.074-.185.279.279,0,0,0-.074-.185l-3.3-3.3a6.484,6.484,0,0,0-8.21-.787l-2.4-2.4-.008.01a1.229,1.229,0,0,0-2.081.882,1.208,1.208,0,0,0,.35.848l0,0,2.4,2.4a6.489,6.489,0,0,0,.789,8.214l3.3,3.3a.259.259,0,0,0,.366,0l1.392-1.392" transform="translate(0 -93.472)" fill="url(#linear-gradient)"/>
+    <path id="路径_56373" data-name="路径 56373" d="M559.229,208.9a1.209,1.209,0,0,0,2.413,0,6.346,6.346,0,0,0-6.338-6.338,1.209,1.209,0,0,0,0,2.413,3.93,3.93,0,0,1,3.925,3.925" transform="translate(-410.425 -129.722)" fill="url(#linear-gradient)"/>
+    <path id="路径_56374" data-name="路径 56374" d="M542.184,68.672a1.209,1.209,0,0,0,0,2.413,8.509,8.509,0,0,1,8.5,8.5,1.209,1.209,0,0,0,2.413,0,10.926,10.926,0,0,0-10.912-10.912" transform="translate(-397.713)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 14 - 0
static/icon-new/controlState_str.svg

@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.824" height="27.104" viewBox="0 0 24.824 27.104">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="控制状态" transform="translate(-130.56 -68.672)">
+    <path id="路径_56371" data-name="路径 56371" d="M373.828,405.6l.008-.008-2.4-2.4a6.486,6.486,0,0,0-.787-8.21l-3.3-3.3a.277.277,0,0,0-.185-.074.255.255,0,0,0-.185.074l-1.39,1.392-2.157-2.157,0,0a1.075,1.075,0,0,0-.775-.331,1.1,1.1,0,0,0-.751,1.89l2.141,2.139-2.925,2.925-2.143-2.143a1.077,1.077,0,0,0-.779-.337,1.1,1.1,0,0,0-.779,1.864l0,0,2.153,2.153-1.392,1.392a.263.263,0,0,0,0,.366l3.3,3.3a6.485,6.485,0,0,0,8.214.787l2.4,2.4,0,0a1.209,1.209,0,0,0,.848.35,1.229,1.229,0,0,0,.884-2.079Z" transform="translate(-219.497 -311.904)" fill="url(#linear-gradient)"/>
+    <path id="路径_56372" data-name="路径 56372" d="M137.763,181.135l8.8-8.8a.255.255,0,0,0,.074-.185.279.279,0,0,0-.074-.185l-3.3-3.3a6.484,6.484,0,0,0-8.21-.787l-2.4-2.4-.008.01a1.229,1.229,0,0,0-2.081.882,1.208,1.208,0,0,0,.35.848l0,0,2.4,2.4a6.489,6.489,0,0,0,.789,8.214l3.3,3.3a.259.259,0,0,0,.366,0l1.392-1.392" transform="translate(0 -93.472)" fill="url(#linear-gradient)"/>
+    <path id="路径_56373" data-name="路径 56373" d="M559.229,208.9a1.209,1.209,0,0,0,2.413,0,6.346,6.346,0,0,0-6.338-6.338,1.209,1.209,0,0,0,0,2.413,3.93,3.93,0,0,1,3.925,3.925" transform="translate(-410.425 -129.722)" fill="url(#linear-gradient)"/>
+    <path id="路径_56374" data-name="路径 56374" d="M542.184,68.672a1.209,1.209,0,0,0,0,2.413,8.509,8.509,0,0,1,8.5,8.5,1.209,1.209,0,0,0,2.413,0,10.926,10.926,0,0,0-10.912-10.912" transform="translate(-397.713)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 14 - 0
static/icon-new/coval.svg

@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="29.908" height="23.458" viewBox="0 0 29.908 23.458">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="一氧化碳" transform="translate(-771.614 -468.47)">
+    <g id="组_15348" data-name="组 15348" transform="translate(771.614 468.47)" style="isolation: isolate">
+      <path id="路径_56246" data-name="路径 56246" d="M774.5,491.149a5.842,5.842,0,0,1-2.11-2.1,5.542,5.542,0,0,1-.779-2.875V474.221a5.546,5.546,0,0,1,.779-2.876,5.848,5.848,0,0,1,2.11-2.1,5.613,5.613,0,0,1,2.888-.779H779.3a5.616,5.616,0,0,1,2.889.779,5.741,5.741,0,0,1,2.1,2.1,5.619,5.619,0,0,1,.766,2.876v.725h-2.633v-.725A3.119,3.119,0,0,0,779.3,471.1h-1.908a2.992,2.992,0,0,0-2.217.914,3.024,3.024,0,0,0-.9,2.2v11.957a3.022,3.022,0,0,0,.9,2.2,2.988,2.988,0,0,0,2.217.914H779.3a3.12,3.12,0,0,0,3.117-3.118v-.726h2.633v.726a5.615,5.615,0,0,1-.766,2.875,5.736,5.736,0,0,1-2.1,2.1,5.617,5.617,0,0,1-2.889.779h-1.908A5.613,5.613,0,0,1,774.5,491.149Z" transform="translate(-771.614 -468.47)" fill="url(#linear-gradient)"/>
+      <path id="路径_56247" data-name="路径 56247" d="M801.64,491.055a6.479,6.479,0,0,1-2.378-2.365,6.3,6.3,0,0,1-.873-3.238V474.945a6.3,6.3,0,0,1,.873-3.238,6.475,6.475,0,0,1,2.378-2.365,6.369,6.369,0,0,1,3.252-.873h.941a6.3,6.3,0,0,1,3.238.873,6.507,6.507,0,0,1,2.365,2.365,6.3,6.3,0,0,1,.874,3.238v10.507a6.3,6.3,0,0,1-.874,3.238,6.511,6.511,0,0,1-2.365,2.365,6.3,6.3,0,0,1-3.238.873h-.941A6.369,6.369,0,0,1,801.64,491.055Zm-.067-3.7a3.974,3.974,0,0,0,1.4,1.411,3.666,3.666,0,0,0,1.922.524h.941a3.666,3.666,0,0,0,1.921-.524,3.974,3.974,0,0,0,1.4-1.411,3.685,3.685,0,0,0,.524-1.908V474.945a3.689,3.689,0,0,0-.524-1.908,3.978,3.978,0,0,0-1.4-1.41,3.666,3.666,0,0,0-1.921-.524h-.941a3.666,3.666,0,0,0-1.922.524,3.978,3.978,0,0,0-1.4,1.41,3.688,3.688,0,0,0-.524,1.908v10.507A3.685,3.685,0,0,0,801.573,487.36Z" transform="translate(-782.4 -468.47)" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/createtime.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28" height="28" viewBox="0 0 28 28">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="时间" d="M77.5,91A13.5,13.5,0,1,1,91,77.5,13.5,13.5,0,0,1,77.5,91Zm0-3.857A9.643,9.643,0,1,0,67.857,77.5,9.643,9.643,0,0,0,77.5,87.143Zm7.749-11.571v3.857H75.571V69.786h3.857v5.786Z" transform="translate(-63.5 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 12 - 0
static/icon-new/cumulativeFlow.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="19.999" height="27.335" viewBox="0 0 19.999 27.335">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="累计流量" transform="translate(-136.533 -2.617)">
+    <path id="路径_56361" data-name="路径 56361" d="M136.533,19.653c0-1.8.9-4.109,2.509-6.869q1.037-1.762,2.212-3.437,1.515-2.164,3.172-4.223.658-.821,1.339-1.623l.107-.125.659-.76.661.76.107.125.295.348q2.228,2.656,4.218,5.5,1.172,1.674,2.209,3.436c1.61,2.76,2.51,5.071,2.51,6.869a10,10,0,1,1-20,0Zm9.256-13.42q-1.62,2.011-3.1,4.13-1.134,1.614-2.135,3.316c-1.462,2.507-2.268,4.576-2.268,5.975a8.251,8.251,0,1,0,16.492,0c0-1.4-.807-3.468-2.269-5.975q-1-1.7-2.133-3.316-1.819-2.6-3.846-5.042c-.232.282-.48.585-.742.912" fill="url(#linear-gradient)"/>
+    <path id="路径_56362" data-name="路径 56362" d="M255.581,567.41a7.011,7.011,0,0,1-6.977-7.047c0-3.891,3.626-1.921,6.977,0,3.366,1.93,6.976-3.891,6.976,0a7.011,7.011,0,0,1-6.976,7.047" transform="translate(-109.048 -540.526)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 13 - 0
static/icon-new/density.svg

@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27.615" height="31" viewBox="0 0 27.615 31">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="密度" transform="translate(-56)">
+    <path id="路径_56220" data-name="路径 56220" d="M449.938,705.938m-1.938,0A1.938,1.938,0,1,0,449.938,704,1.938,1.938,0,0,0,448,705.938Z" transform="translate(-380.131 -682.683)" fill="url(#linear-gradient)"/>
+    <path id="路径_56221" data-name="路径 56221" d="M449.938,193.938m-1.938,0A1.938,1.938,0,1,0,449.938,192,1.938,1.938,0,0,0,448,193.938Z" transform="translate(-380.131 -186.186)" fill="url(#linear-gradient)"/>
+    <path id="路径_56222" data-name="路径 56222" d="M83.009,21.038V10.246A1.936,1.936,0,0,0,81.677,6.9a1.793,1.793,0,0,0-.315.024L71.642,1.32a1.935,1.935,0,0,0-3.67,0L58.3,6.9a1.76,1.76,0,0,0-.363-.036,1.936,1.936,0,0,0-1.332,3.343V21a1.936,1.936,0,0,0,1.332,3.343,2.052,2.052,0,0,0,.612-.1l9.417,5.438a1.935,1.935,0,0,0,3.67,0l9.38-5.414a1.935,1.935,0,0,0,2.592-1.823,1.892,1.892,0,0,0-.6-1.4Zm-13.2,6.092a1.925,1.925,0,0,0-1.381.581l-8.581-4.954a2.228,2.228,0,0,0,.03-.351,1.721,1.721,0,0,0-.042-.4l8.036-4.639v.073a1.939,1.939,0,0,0,3.852.315l8.018,4.627v.061a2.861,2.861,0,0,0,.024.321l-8.575,4.954A1.906,1.906,0,0,0,69.807,27.13Zm0-23.254a1.925,1.925,0,0,0,1.381-.581l8.587,4.96-8.133,4.7a1.936,1.936,0,0,0-3.755.357L59.87,8.672a1.728,1.728,0,0,0-.073-.4L68.42,3.294A1.949,1.949,0,0,0,69.807,3.876ZM80.762,20.735,71.4,15.327l8.89-5.135a1.936,1.936,0,0,0,.781.484V20.6A2.391,2.391,0,0,0,80.762,20.735ZM59.016,10.416l8.508,4.911-8.981,5.184V10.646A1.9,1.9,0,0,0,59.016,10.416Z" transform="translate(0)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/ductOutletAirVolume_merge.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.696" height="23.063" viewBox="0 0 28.696 23.063">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="风筒出口风量" d="M64.173,142.572a11.029,11.029,0,0,1-9.862,15.485l.007.006H40v-6.572h3.993a11.028,11.028,0,0,1,9.862-15.485L53.848,136H67.7v6.572Zm-3.275,1.3-3.385,1.58a4,4,0,0,0-2.087-2.087l1.529-3.276a7.525,7.525,0,0,0-6.132.173l1.448,3.1a4,4,0,0,0-2.087,2.087l-3-1.4a7.52,7.52,0,0,0,0,5.952l3-1.4a4,4,0,0,0,2.087,2.087l-1.448,3.1a7.525,7.525,0,0,0,6.132.173L55.426,150.7a4,4,0,0,0,2.087-2.087l3.385,1.58A7.511,7.511,0,0,0,60.9,143.874Zm-7.05,5.739a2.347,2.347,0,1,1,2.347-2.347A2.347,2.347,0,0,1,53.848,149.613Zm0-3.286a.939.939,0,1,0,.939.939A.939.939,0,0,0,53.848,146.327Z" transform="translate(-39.5 -135.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 17 - 0
static/icon-new/dustval.svg

@@ -0,0 +1,17 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27.139" height="24" viewBox="0 0 27.139 24">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="粉尘浓度值" transform="translate(-15.924 -87.45)">
+    <path id="路径_55299" data-name="路径 55299" d="M395.551,90.809m-3.359,0a3.359,3.359,0,1,0,3.359-3.359A3.359,3.359,0,0,0,392.192,90.809Z" transform="translate(-365.812 0)" fill="url(#linear-gradient)"/>
+    <path id="路径_55300" data-name="路径 55300" d="M637.32,586.938m-3.361,0a3.361,3.361,0,1,0,3.361-3.361A3.361,3.361,0,0,0,633.959,586.938Z" transform="translate(-600.86 -482.34)" fill="url(#linear-gradient)"/>
+    <path id="路径_55301" data-name="路径 55301" d="M19.285,578.9m-3.361,0a3.361,3.361,0,1,0,3.361-3.361A3.361,3.361,0,0,0,15.924,578.9Z" transform="translate(0 -474.526)" fill="url(#linear-gradient)"/>
+    <path id="路径_55302" data-name="路径 55302" d="M394.335,795.384m-2.194,0a2.194,2.194,0,1,0,2.194-2.194A2.194,2.194,0,0,0,392.141,795.384Z" transform="translate(-365.762 -686.128)" fill="url(#linear-gradient)"/>
+    <path id="路径_55303" data-name="路径 55303" d="M836.806,340.113m-2.194,0a2.194,2.194,0,1,0,2.194-2.194A2.194,2.194,0,0,0,834.612,340.113Z" transform="translate(-795.937 -243.509)" fill="url(#linear-gradient)"/>
+    <path id="路径_55304" data-name="路径 55304" d="M290.143,386.4m-2.194,0a2.194,2.194,0,1,0,2.194-2.194A2.194,2.194,0,0,0,287.949,386.4Z" transform="translate(-264.465 -288.508)" fill="url(#linear-gradient)"/>
+    <path id="路径_55305" data-name="路径 55305" d="M30.457,219.486m-2.194,0a2.194,2.194,0,1,0,2.194-2.194A2.194,2.194,0,0,0,28.263,219.486Z" transform="translate(-11.996 -126.234)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 10 - 0
static/icon-new/favg.svg

@@ -0,0 +1,10 @@
+<svg id="平均温度" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21.341" height="31.027" viewBox="0 0 21.341 31.027">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="路径_55369" data-name="路径 55369" d="M222.221,17.369V9.8a.836.836,0,0,0-.835-.835h-.066a.81.81,0,0,0-.81.81v7.593a2.939,2.939,0,0,0-2.157,2.8,3.014,3.014,0,1,0,3.868-2.8Zm4.433-3.353a.762.762,0,0,1-.3-.579V4.879a4.994,4.994,0,0,0-9.985,0v8.315a1.19,1.19,0,0,1-.4.912,7.935,7.935,0,0,0-2.838,6.067,8.24,8.24,0,0,0,16.476,0A7.936,7.936,0,0,0,226.654,14.015Zm-5.29,11.646a5.573,5.573,0,0,1-5.643-5.491,5.439,5.439,0,0,1,2.637-4.64l.4-.245a.443.443,0,0,0,.209-.375V4.879a2.4,2.4,0,0,1,4.8,0V14.911a.443.443,0,0,0,.209.375l.4.245a5.433,5.433,0,0,1,2.634,4.64,5.579,5.579,0,0,1-5.645,5.491Z" transform="translate(-213.129 2.811)" fill="url(#linear-gradient)"/>
+  <path id="路径_55371" data-name="路径 55371" d="M64,120.4v1.521h7.518V120.4Zm0,9.3h7.518v-1.521H64Zm0-3.891h7.518v-1.521H64Z" transform="translate(-50.177 -120.4)" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/fengsu_merge.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="31.998" height="32" viewBox="0 0 31.998 32">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="出口风速" d="M82.2,95A1.107,1.107,0,0,1,81.1,93.891V82.269A1.107,1.107,0,0,1,82.2,81.162h5.535a1.107,1.107,0,0,1,1.107,1.107v8.3A4.428,4.428,0,0,1,84.417,95ZM68.364,88.907a4.428,4.428,0,0,1-4.428-4.428V82.264a1.107,1.107,0,0,1,1.107-1.107H76.665a1.107,1.107,0,0,1,1.107,1.107V87.8a1.107,1.107,0,0,1-1.107,1.107ZM82.2,77.836A1.107,1.107,0,0,1,81.1,76.729V71.194A1.107,1.107,0,0,1,82.2,70.087h8.3a4.428,4.428,0,0,1,4.428,4.428v2.214a1.107,1.107,0,0,1-1.107,1.107Zm-11.071,0a1.107,1.107,0,0,1-1.107-1.107v-8.3A4.428,4.428,0,0,1,74.453,64h2.214a1.107,1.107,0,0,1,1.107,1.107V76.729a1.107,1.107,0,0,1-1.107,1.107Z" transform="translate(-63.436 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/fireval.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="26.999" height="31.928" viewBox="0 0 26.999 31.928">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="火焰" d="M118.311,84.394c-1.986-4.18-.941-6.584.627-8.779a14.258,14.258,0,0,0,2.09-4.912,5.576,5.576,0,0,1,.836,4.389,11.535,11.535,0,0,0,2.4-8.361c5.225,3.658,7.525,11.7,4.494,17.557,16.094-9.2,3.971-22.887,1.881-24.351.732,1.568.836,4.18-.627,5.434-2.4-9.2-8.361-10.973-8.361-10.973.732,4.7-2.508,9.824-5.643,13.691a9.928,9.928,0,0,0-1.254-5.016c-.209,3.449-2.822,6.166-3.553,9.615-.941,4.7.732,8.047,7.107,11.7Z" transform="translate(-110.513 -53.695)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/fireval_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="26.999" height="31.928" viewBox="0 0 26.999 31.928">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="火焰" d="M118.311,84.394c-1.986-4.18-.941-6.584.627-8.779a14.258,14.258,0,0,0,2.09-4.912,5.576,5.576,0,0,1,.836,4.389,11.535,11.535,0,0,0,2.4-8.361c5.225,3.658,7.525,11.7,4.494,17.557,16.094-9.2,3.971-22.887,1.881-24.351.732,1.568.836,4.18-.627,5.434-2.4-9.2-8.361-10.973-8.361-10.973.732,4.7-2.508,9.824-5.643,13.691a9.928,9.928,0,0,0-1.254-5.016c-.209,3.449-2.822,6.166-3.553,9.615-.941,4.7.732,8.047,7.107,11.7Z" transform="translate(-110.513 -53.695)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 12 - 0
static/icon-new/flowRate.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="31" height="27.735" viewBox="0 0 31 27.735">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="注浆流量" transform="translate(-0.048 0.071)">
+    <path id="路径_56394" data-name="路径 56394" d="M30.029,5.453V3.779H24.213V1.758a1.736,1.736,0,1,0-3.468,0V17.185a.848.848,0,0,0,0,.109,3.06,3.06,0,1,0,3.453.038V14.945h5.83V13.114H24.213V10.2h5.816V8.347H24.213V5.453ZM14.987,22.412A6.134,6.134,0,0,1,12.2,21.63a3.8,3.8,0,0,0-1.959-.546,3.411,3.411,0,0,0-1.684.583l-1.2-1.85a5.555,5.555,0,0,1,2.767-.949,5.863,5.863,0,0,1,3.017.754,3.89,3.89,0,0,0,1.874.583,3.8,3.8,0,0,0,2.139-.811l1.286,1.793a5.93,5.93,0,0,1-3.4,1.224Zm15.038,0h-.256A5.664,5.664,0,0,1,27,21.464l1.2-1.845a3.4,3.4,0,0,0,1.679.588,3.794,3.794,0,0,0,1.958-.545,6.167,6.167,0,0,1,2.79-.769h.052a5.977,5.977,0,0,1,3.406,1.224L36.8,21.91a3.8,3.8,0,0,0-2.139-.811h-.033a4.132,4.132,0,0,0-1.841.531,6.063,6.063,0,0,1-2.761.783ZM7.956,25.358a3.16,3.16,0,0,1,1.9-.949c1.746-.123,2.343,1.727,4.184,1.869s2.372-1.736,4.416-1.66c1.864.071,2.116,1.67,3.956,1.712,1.94.048,2.372-1.708,4.269-1.679s2.282,1.874,4.128,1.836c1.9-.038,2.609-2.035,4.606-1.94a3.61,3.61,0,0,1,2,.8" transform="translate(-7.113 0)" fill="url(#linear-gradient)"/>
+    <path id="路径_56395" data-name="路径 56395" d="M23.661,865.651a4,4,0,0,1-2.69-1.153,2.05,2.05,0,0,0-1.4-.683,2.191,2.191,0,0,0-1.423.617A4.307,4.307,0,0,1,15.3,865.49a4.188,4.188,0,0,1-2.666-1.1,2.007,2.007,0,0,0-1.309-.617,2.325,2.325,0,0,0-1.542.645,4.2,4.2,0,0,1-2.932,1.015,4.829,4.829,0,0,1-2.685-1.229c-.588-.474-.881-.674-1.328-.645a2.011,2.011,0,0,0-1.2.621L.048,862.506a4.235,4.235,0,0,1,2.623-1.252,4.057,4.057,0,0,1,2.913,1.124,2.676,2.676,0,0,0,1.423.745c.5.043.8-.156,1.38-.579a4.459,4.459,0,0,1,2.993-1.082,4.269,4.269,0,0,1,2.656,1.11,1.955,1.955,0,0,0,1.281.6,2.159,2.159,0,0,0,1.423-.617,4.373,4.373,0,0,1,2.846-1.063,4.269,4.269,0,0,1,2.846,1.219c.527.436.788.626,1.243.617a2.864,2.864,0,0,0,1.537-.745,4.367,4.367,0,0,1,5.835-.156l-1.423,1.836a2.42,2.42,0,0,0-1.347-.559c-.6-.033-1,.251-1.655.745a4.824,4.824,0,0,1-2.875,1.2Z" transform="translate(0 -837.987)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/flow_merge.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27.217" height="27.222" viewBox="0 0 27.217 27.222">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="风机排风量" d="M54.03,62.61c.881-1.1,1.806-3.662,2.541-3.361,2.144,1.388.448,4.106-1.084,5.8-1.993,2.2-1.494,4.1,1.342,4.892,3.032.847,6.942-.714,8.019-3.2,1.109-2.56-.135-5.32-3.375-7.431-.826-.537-2.4-.777-1.611-2.133.585-1.01,1.909-.746,2.909-.146A18.411,18.411,0,0,1,65.1,58.579c2.486,2.065,4.309,1.409,4.931-1.82.617-3.2-.919-6.648-3.524-7.453-3.327-1.031-5.466.752-7.137,3.365-.537.843-.821,2.426-2.184,1.585-.914-.563-.6-1.864-.123-2.933a8.639,8.639,0,0,1,1.6-2.311c2.034-2.241,1.5-4-1.4-4.8-3.045-.845-6.967.8-7.941,3.335-1.1,2.856.087,6.279,3.819,7.956.581.4,1.789.421,1.479,1.251-.3.794-1.2.858-1.859.741A6.148,6.148,0,0,1,48.91,55.2c-1.315-1.621-2.849-1.508-4.1.295-1.629,2.352-.752,6.967,1.665,8.722,2.338,1.7,5.448,1.019,7.556-1.6Zm4.23-6.72a1.309,1.309,0,1,1-1.831.02A1.309,1.309,0,0,1,58.26,55.889Z" transform="translate(-43.46 -43.466)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 10 - 0
static/icon-new/fmax.svg

@@ -0,0 +1,10 @@
+<svg id="最高温度" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21.341" height="31.026" viewBox="0 0 21.341 31.026">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="路径_55369" data-name="路径 55369" d="M222.221,17.368V9.8a.836.836,0,0,0-.835-.835h-.066a.81.81,0,0,0-.81.81v7.593a2.939,2.939,0,0,0-2.157,2.8,3.014,3.014,0,1,0,3.868-2.8Zm4.433-3.353a.762.762,0,0,1-.3-.579V4.879a4.994,4.994,0,0,0-9.985,0v8.315a1.19,1.19,0,0,1-.4.912,7.935,7.935,0,0,0-2.838,6.067,8.24,8.24,0,0,0,16.476,0A7.936,7.936,0,0,0,226.654,14.015Zm-5.29,11.646a5.573,5.573,0,0,1-5.643-5.491,5.439,5.439,0,0,1,2.637-4.64l.4-.245a.443.443,0,0,0,.209-.375V4.879a2.4,2.4,0,0,1,4.8,0V14.911a.443.443,0,0,0,.209.375l.4.245a5.433,5.433,0,0,1,2.634,4.64,5.579,5.579,0,0,1-5.645,5.491Z" transform="translate(-213.129 2.811)" fill="url(#linear-gradient)"/>
+  <path id="路径_55370" data-name="路径 55370" d="M280.466,153.782v6.2h1.253v-6.2l1.316,1.316.877-.94-2.819-2.819-2.819,2.819.877.877Zm-3.133-3.2h7.518v-1.253h-7.518Z" transform="translate(-263.51 -149.334)" fill="url(#linear-gradient)"/>
+</svg>

+ 10 - 0
static/icon-new/fmin.svg

@@ -0,0 +1,10 @@
+<svg id="最低温度" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21.341" height="31.027" viewBox="0 0 21.341 31.027">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="路径_55369" data-name="路径 55369" d="M222.221,17.368V9.8a.836.836,0,0,0-.835-.835h-.066a.81.81,0,0,0-.81.81v7.593a2.939,2.939,0,0,0-2.157,2.8,3.014,3.014,0,1,0,3.868-2.8Zm4.433-3.353a.762.762,0,0,1-.3-.579V4.879a4.994,4.994,0,0,0-9.985,0v8.315a1.19,1.19,0,0,1-.4.912,7.935,7.935,0,0,0-2.838,6.067,8.24,8.24,0,0,0,16.476,0A7.936,7.936,0,0,0,226.654,14.015Zm-5.29,11.646a5.573,5.573,0,0,1-5.643-5.491,5.439,5.439,0,0,1,2.637-4.64l.4-.245a.443.443,0,0,0,.209-.375V4.879a2.4,2.4,0,0,1,4.8,0V14.911a.443.443,0,0,0,.209.375l.4.245a5.433,5.433,0,0,1,2.634,4.64,5.579,5.579,0,0,1-5.645,5.491Z" transform="translate(-213.129 2.811)" fill="url(#linear-gradient)"/>
+  <path id="路径_55370" data-name="路径 55370" d="M280.466,155.536v-6.2h1.253v6.2l1.316-1.316.877.94-2.819,2.819-2.819-2.819.877-.877Zm-3.133,3.2h7.518v1.253h-7.518Z" transform="translate(-263.51 -149.334)" fill="url(#linear-gradient)"/>
+</svg>

+ 12 - 0
static/icon-new/frontRearDP.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32.902" height="20" viewBox="0 0 32.902 20">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="压差" transform="translate(0)">
+    <path id="路径_55264" data-name="路径 55264" d="M61.592,117.857a15.3,15.3,0,0,1,3.524-4.871,16.454,16.454,0,0,1,5.229-3.283,17.643,17.643,0,0,1,12.808,0,16.555,16.555,0,0,1,5.229,3.283,15.237,15.237,0,0,1,3.528,4.871,14.309,14.309,0,0,1,1.292,5.966,14.647,14.647,0,0,1-.256,2.717L92.7,127.8H87.366a1.538,1.538,0,1,1,0-3.068h2.51c.026-.3.037-.607.037-.91a11.6,11.6,0,0,0-2.126-6.675l-1.149,1.07a1.73,1.73,0,0,1-2.327,0,1.458,1.458,0,0,1,0-2.168l1.343-1.251a13.567,13.567,0,0,0-7.2-3.133,1.471,1.471,0,0,1,.018.222v1.841a1.651,1.651,0,0,1-3.294,0v-1.841a1.707,1.707,0,0,1,.018-.239c-6.529.719-11.6,5.9-11.6,12.17,0,.3.011.61.037.91h2.51a1.538,1.538,0,1,1,0,3.068H60.8l-.242-1.265a14.444,14.444,0,0,1,1.036-8.679Z" transform="translate(-60.3 -108.5)" fill="url(#linear-gradient)"/>
+    <path id="路径_55265" data-name="路径 55265" d="M420.283,383.75a1.73,1.73,0,0,1,2.327,0l5.039,4.694a3.342,3.342,0,0,1,.589-.055,2.778,2.778,0,1,1-2.975,2.771,2.719,2.719,0,0,1,.059-.549l-5.039-4.694A1.458,1.458,0,0,1,420.283,383.75Z" transform="translate(-411.08 -373.932)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 12 - 0
static/icon-new/frontRearDifference.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32.902" height="20" viewBox="0 0 32.902 20">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="压差" transform="translate(0)">
+    <path id="路径_55264" data-name="路径 55264" d="M61.592,117.857a15.3,15.3,0,0,1,3.524-4.871,16.454,16.454,0,0,1,5.229-3.283,17.643,17.643,0,0,1,12.808,0,16.555,16.555,0,0,1,5.229,3.283,15.237,15.237,0,0,1,3.528,4.871,14.309,14.309,0,0,1,1.292,5.966,14.647,14.647,0,0,1-.256,2.717L92.7,127.8H87.366a1.538,1.538,0,1,1,0-3.068h2.51c.026-.3.037-.607.037-.91a11.6,11.6,0,0,0-2.126-6.675l-1.149,1.07a1.73,1.73,0,0,1-2.327,0,1.458,1.458,0,0,1,0-2.168l1.343-1.251a13.567,13.567,0,0,0-7.2-3.133,1.471,1.471,0,0,1,.018.222v1.841a1.651,1.651,0,0,1-3.294,0v-1.841a1.707,1.707,0,0,1,.018-.239c-6.529.719-11.6,5.9-11.6,12.17,0,.3.011.61.037.91h2.51a1.538,1.538,0,1,1,0,3.068H60.8l-.242-1.265a14.444,14.444,0,0,1,1.036-8.679Z" transform="translate(-60.3 -108.5)" fill="url(#linear-gradient)"/>
+    <path id="路径_55265" data-name="路径 55265" d="M420.283,383.75a1.73,1.73,0,0,1,2.327,0l5.039,4.694a3.342,3.342,0,0,1,.589-.055,2.778,2.778,0,1,1-2.975,2.771,2.719,2.719,0,0,1,.059-.549l-5.039-4.694A1.458,1.458,0,0,1,420.283,383.75Z" transform="translate(-411.08 -373.932)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 10 - 0
static/icon-new/fsectarea.svg

@@ -0,0 +1,10 @@
+<svg id="巷道面积" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="34.11" height="25.69" viewBox="0 0 34.11 25.69">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="路径_11" data-name="路径 11" d="M138.762,97.28c-5.505,0-7.016,11.01-10.794,11.01s-4.577-2.591-9.5-2.591c-5.505,0-5.829,4.318-5.829,4.318V122.97h34.11V106.779S144.267,97.28,138.762,97.28Z" transform="translate(-112.64 -97.28)" fill="url(#linear-gradient)"/>
+  <path id="路径_12" data-name="路径 12" d="M139.194,344.551c-5.505,0-7.232,5.181-11.01,5.181s-7.491-6.692-11.658-6.692a4.473,4.473,0,0,0-3.886,2.375v12.953h34.11V348.221S144.7,344.551,139.194,344.551Z" transform="translate(-112.64 -332.678)" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/fy_merge.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="29.11" viewBox="0 0 32 29.11">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="风机负压" d="M60.052,104.367a1.43,1.43,0,0,1-.086-.473V89.445a1.445,1.445,0,1,1,2.89,0V103.5a1.576,1.576,0,1,0,2.783-1.011,1.441,1.441,0,1,1,2.032-1.9l.082-.075a4.466,4.466,0,1,1-7.7,3.854Zm-8.841,0a1.43,1.43,0,0,0,.086-.473V89.445a1.445,1.445,0,0,0-2.89,0V103.5a1.576,1.576,0,1,1-2.783-1.011,1.441,1.441,0,1,0-2.032-1.9l-.082-.075a4.466,4.466,0,1,0,7.7,3.854Zm4.42-13.477a1.445,1.445,0,0,1,1.445,1.445v12.61a1.445,1.445,0,1,1-2.89,0V92.335A1.445,1.445,0,0,1,55.631,90.89ZM40,116.11v-3.678a2.627,2.627,0,0,1,2.627-2.627h7.587a7.09,7.09,0,0,0,10.571,0h7.587A2.627,2.627,0,0,1,71,112.432v3.678Z" transform="translate(-39.5 -87.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/gasC.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="29.829" height="28.837" viewBox="0 0 29.829 28.837">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="瓦斯浓度" d="M45.09,66.625a1.446,1.446,0,0,1,1.442,1.442V78.355a6.343,6.343,0,1,0,12.685,0v-1.84a4.069,4.069,0,0,1,.232-1.334l.026-.012a4.034,4.034,0,0,1,3.02-2.582l-.024,0a3.331,3.331,0,0,1,.512-.071l.25-.006a4.065,4.065,0,0,1,4.038,4.018v4.846a1.442,1.442,0,0,1-2.884,0V76.535a1.127,1.127,0,1,0-2.253,0v1.82a9.243,9.243,0,0,1-18.486.02V68.065a1.446,1.446,0,0,1,1.442-1.442Zm18.973.7a9.262,9.262,0,0,1,8.415,9.207v4.846a1.446,1.446,0,0,1-1.442,1.442,1.428,1.428,0,0,1-1.028-.414,1.458,1.458,0,0,1-.414-1.028V76.535a6.4,6.4,0,0,0-5.909-6.362,8.042,8.042,0,0,0,.378-2.484Zm-15.206,5.35a8.43,8.43,0,0,0,2.882,2.468v3.226a1.136,1.136,0,0,0,2.271,0V76.535a5.669,5.669,0,0,1,.02-.577,9.109,9.109,0,0,0,2.88.055,5.116,5.116,0,0,0-.018.522v1.82a4.018,4.018,0,0,1-8.037.018Zm7.117-12.918a7.585,7.585,0,1,1-7.586,7.585,7.584,7.584,0,0,1,7.586-7.585Zm0,2.856A4.729,4.729,0,1,0,60.7,67.346,4.729,4.729,0,0,0,55.973,62.617Zm2.049,1.763-1.1,2.964a1.153,1.153,0,0,1-2.295.122,1.142,1.142,0,0,1,.833-1.261Z" transform="translate(-43.148 -59.26)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/gasMixMass.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.617" height="21" viewBox="0 0 28.617 21">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="瓦斯抽采混量" d="M32.408,43.272a9.011,9.011,0,0,1-9.136-8.863V25.056a1.826,1.826,0,0,1,3.651,0v9.352a5.487,5.487,0,0,0,10.967,0v-1.66a4.232,4.232,0,0,1,8.46,0v4.4a1.826,1.826,0,0,1-3.651,0v-4.4a.57.57,0,0,0-.585-.55.564.564,0,0,0-.573.55v1.661a9.01,9.01,0,0,1-9.134,8.863Zm16.656-4.353a1.8,1.8,0,0,1-1.826-1.783V32.741a5.482,5.482,0,0,0-10.958,0V34.4a4.236,4.236,0,0,1-8.469,0V25.055a1.826,1.826,0,0,1,3.651,0V34.4a.584.584,0,0,0,1.167,0V32.741a9.135,9.135,0,0,1,18.261,0v4.395a1.8,1.8,0,0,1-1.826,1.783Z" transform="translate(-22.773 -22.773)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/gcreatetime.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28" height="28" viewBox="0 0 28 28">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="时间" d="M77.5,91A13.5,13.5,0,1,1,91,77.5,13.5,13.5,0,0,1,77.5,91Zm0-3.857A9.643,9.643,0,1,0,67.857,77.5,9.643,9.643,0,0,0,77.5,87.143Zm7.749-11.571v3.857H75.571V69.786h3.857v5.786Z" transform="translate(-63.5 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/groutingPump.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="28.745" viewBox="0 0 21 28.745">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="注浆泵" d="M232.466,132.886h14.087a2.119,2.119,0,0,0,1.676-2.071v-4.565a2.119,2.119,0,0,0-2.119-2.119h-13.2a2.119,2.119,0,0,0-2.119,2.119v4.565A2.119,2.119,0,0,0,232.466,132.886Zm17.769,3.57H247.5a.555.555,0,0,0-.555.555v1.256h-1.7v-4.339H233.776v16.838a1.11,1.11,0,0,0,1.11,1.11h9.246a1.11,1.11,0,0,0,1.11-1.11v-8.3h1.7v1.256a.555.555,0,0,0,.555.555h2.733a.555.555,0,0,0,.555-.555v-6.715A.554.554,0,0,0,250.235,136.456Z" transform="translate(-230.29 -123.63)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/groutingPump_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="28.745" viewBox="0 0 21 28.745">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="注浆泵" d="M232.466,132.886h14.087a2.119,2.119,0,0,0,1.676-2.071v-4.565a2.119,2.119,0,0,0-2.119-2.119h-13.2a2.119,2.119,0,0,0-2.119,2.119v4.565A2.119,2.119,0,0,0,232.466,132.886Zm17.769,3.57H247.5a.555.555,0,0,0-.555.555v1.256h-1.7v-4.339H233.776v16.838a1.11,1.11,0,0,0,1.11,1.11h9.246a1.11,1.11,0,0,0,1.11-1.11v-8.3h1.7v1.256a.555.555,0,0,0,.555.555h2.733a.555.555,0,0,0,.555-.555v-6.715A.554.554,0,0,0,250.235,136.456Z" transform="translate(-230.29 -123.63)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 12 - 0
static/icon-new/humidity.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.792" height="28.395" viewBox="0 0 28.792 28.395">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="相对湿度" transform="translate(-67.9 -78.7)">
+    <path id="路径_56218" data-name="路径 56218" d="M82.34,103.047a8.589,8.589,0,0,1-4.361,1.136,8.287,8.287,0,0,1-5.194-1.711A4.862,4.862,0,0,1,70.8,98.7a10.859,10.859,0,0,1,1.22-3.719c.7-1.553,1.675-3.454,2.905-5.649,1.114-1.989,2.24-3.864,3.054-5.194.813,1.327,1.934,3.2,3.047,5.184.61,1.088,1.159,2.108,1.643,3.044.352-.688.762-1.449,1.24-2.3.145-.258.287-.51.429-.759-.249-.455-.507-.926-.775-1.407-2.153-3.842-4.339-7.257-4.358-7.292L77.982,78.7l-1.223,1.911c-.023.036-2.2,3.451-4.358,7.292-1.275,2.273-2.292,4.251-3.025,5.888A13.319,13.319,0,0,0,67.9,98.708a7.174,7.174,0,0,0,.846,3.377,8.484,8.484,0,0,0,2.224,2.66,11.664,11.664,0,0,0,13.765.2,8.791,8.791,0,0,1-1.336-.885A8.35,8.35,0,0,1,82.34,103.047Z" fill="url(#linear-gradient)"/>
+    <path id="路径_56219" data-name="路径 56219" d="M250.613,279.976c-1.343-2.4-2.663-4.465-2.721-4.548l-1.1-1.727-1.1,1.727c-.055.087-1.375,2.153-2.721,4.548-2.553,4.555-2.847,6.124-2.847,6.908a4.9,4.9,0,0,0,.571,2.289,5.734,5.734,0,0,0,1.488,1.782,7.642,7.642,0,0,0,9.226,0,5.7,5.7,0,0,0,1.488-1.782,4.849,4.849,0,0,0,.571-2.289C253.464,286.1,253.167,284.527,250.613,279.976Zm-.855,8.932a5.024,5.024,0,0,1-5.94,0,2.617,2.617,0,0,1-1.078-2.021c0-.19.119-1.359,2.508-5.617.542-.968,1.088-1.888,1.54-2.641.455.752,1,1.675,1.54,2.641,2.386,4.258,2.508,5.427,2.508,5.617A2.622,2.622,0,0,1,249.758,288.908Zm-17.277-2.557-2.566-.281a4.535,4.535,0,0,0,1.007,3.251,4.744,4.744,0,0,0,3.574,1.527l.1-2.579a2.312,2.312,0,0,1-1.708-.62,1.967,1.967,0,0,1-.407-1.317A.146.146,0,0,0,232.481,286.351Z" transform="translate(-156.769 -188.705)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 12 - 0
static/icon-new/inletAirVolume_merge.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27.402" height="24.567" viewBox="0 0 27.402 24.567">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="吸风量" transform="translate(-224 -224)">
+    <path id="路径_56279" data-name="路径 56279" d="M225.417,224A1.417,1.417,0,0,0,224,225.417v13.229a1.418,1.418,0,0,0,1.417,1.417h4.724a1.417,1.417,0,0,0,0-2.835h-3.307V226.835h21.733v10.394H245.26a1.417,1.417,0,1,0,0,2.835h4.724a1.417,1.417,0,0,0,1.417-1.417V225.417A1.417,1.417,0,0,0,249.985,224Z" fill="url(#linear-gradient)"/>
+    <path id="路径_56280" data-name="路径 56280" d="M276.116,353.417a1.417,1.417,0,0,0-2.835,0v10.394a4.252,4.252,0,0,1-4.252,4.252h-.945a1.417,1.417,0,1,0,0,2.835h.945a7.087,7.087,0,0,0,7.087-7.087Zm2.362,2.362A1.417,1.417,0,0,1,279.9,357.2v7.559a1.417,1.417,0,0,1-2.835,0V357.2A1.417,1.417,0,0,1,278.478,355.78Zm2.362-2.362a1.417,1.417,0,1,1,2.835,0v10.394a4.252,4.252,0,0,0,4.252,4.252h.945a1.417,1.417,0,1,1,0,2.835h-.945a7.087,7.087,0,0,1-7.087-7.087Z" transform="translate(-40.777 -122.331)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 13 - 0
static/icon-new/instantaneousFlow.svg

@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="34.419" height="28.39" viewBox="0 0 34.419 28.39">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="瞬时流量" transform="translate(-12 -99.609)">
+    <path id="路径_56358" data-name="路径 56358" d="M45.713,112.5l-5.7-.021-2.072-6.663a.719.719,0,0,0-.878-.509l-1.225.01c-.372-.1-.664.21-.764.578l-3.1,14.618-4.055-20.379a.69.69,0,0,0-.847-.5s-1.039.017-1.528.014a.72.72,0,0,0-.651.489l-3.136,16.081L20.674,112.8c-.1-.389-.468-.441-.891-.42l-7.059-.007a.717.717,0,0,0-.719.719l0,1.432a.714.714,0,0,0,.716.719l5.679.021,2.079,6.567a.728.728,0,0,0,.891.509l1.115-.01a.819.819,0,0,0,.916-.575l3.2-14.814,4.086,20.538a.7.7,0,0,0,.85.5s.761-.01,1.2-.007.52-.829.52-.829l3.4-15.723,1.053,3.407a.718.718,0,0,0,.878.509l7.1.038a.714.714,0,0,0,.719-.716l0-1.442A.7.7,0,0,0,45.713,112.5Z" transform="translate(0 0)" fill="url(#linear-gradient)"/>
+    <path id="路径_56359" data-name="路径 56359" d="M717.183,624.5a5.161,5.161,0,1,0-.041,10.322h0a5.161,5.161,0,1,0,.038-10.322Zm-.031,9.076a3.913,3.913,0,1,1,3.927-3.9A3.913,3.913,0,0,1,717.152,633.575Z" transform="translate(-675.906 -506.824)" fill="url(#linear-gradient)"/>
+    <path id="路径_56360" data-name="路径 56360" d="M837.925,707.223l.007-2.32-1.119,0-.014,3.438,3.438.014,0-1.119Z" transform="translate(-796.411 -584.458)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 12 - 0
static/icon-new/kpa.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32.902" height="20" viewBox="0 0 32.902 20">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="压差" transform="translate(0)">
+    <path id="路径_55264" data-name="路径 55264" d="M61.592,117.857a15.3,15.3,0,0,1,3.524-4.871,16.454,16.454,0,0,1,5.229-3.283,17.643,17.643,0,0,1,12.808,0,16.555,16.555,0,0,1,5.229,3.283,15.237,15.237,0,0,1,3.528,4.871,14.309,14.309,0,0,1,1.292,5.966,14.647,14.647,0,0,1-.256,2.717L92.7,127.8H87.366a1.538,1.538,0,1,1,0-3.068h2.51c.026-.3.037-.607.037-.91a11.6,11.6,0,0,0-2.126-6.675l-1.149,1.07a1.73,1.73,0,0,1-2.327,0,1.458,1.458,0,0,1,0-2.168l1.343-1.251a13.567,13.567,0,0,0-7.2-3.133,1.471,1.471,0,0,1,.018.222v1.841a1.651,1.651,0,0,1-3.294,0v-1.841a1.707,1.707,0,0,1,.018-.239c-6.529.719-11.6,5.9-11.6,12.17,0,.3.011.61.037.91h2.51a1.538,1.538,0,1,1,0,3.068H60.8l-.242-1.265a14.444,14.444,0,0,1,1.036-8.679Z" transform="translate(-60.3 -108.5)" fill="url(#linear-gradient)"/>
+    <path id="路径_55265" data-name="路径 55265" d="M420.283,383.75a1.73,1.73,0,0,1,2.327,0l5.039,4.694a3.342,3.342,0,0,1,.589-.055,2.778,2.778,0,1,1-2.975,2.771,2.719,2.719,0,0,1,.059-.549l-5.039-4.694A1.458,1.458,0,0,1,420.283,383.75Z" transform="translate(-411.08 -373.932)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/monitorValue.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="31" height="31" viewBox="0 0 31 31">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="监测值" d="M15,0a.938.938,0,0,1,.938.938v.971A13.127,13.127,0,0,1,28.091,14.063h.971a.938.938,0,0,1,0,1.875h-.971A13.127,13.127,0,0,1,15.938,28.091v.971a.938.938,0,0,1-1.875,0v-.971A13.127,13.127,0,0,1,1.911,15.938H.938a.938.938,0,0,1,0-1.875h.971A13.127,13.127,0,0,1,14.063,1.911V.938A.937.937,0,0,1,15,0Zm0,3.75A11.25,11.25,0,1,0,26.25,15,11.25,11.25,0,0,0,15,3.75Zm0,5.625A5.625,5.625,0,1,1,9.375,15,5.625,5.625,0,0,1,15,9.375Z" transform="translate(0.5 0.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 12 - 0
static/icon-new/nitrogenContent.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.792" height="28.395" viewBox="0 0 28.792 28.395">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="氮气含量" transform="translate(-67.9 -78.7)">
+    <path id="路径_56218" data-name="路径 56218" d="M82.34,103.047a8.589,8.589,0,0,1-4.361,1.136,8.287,8.287,0,0,1-5.194-1.711A4.862,4.862,0,0,1,70.8,98.7a10.859,10.859,0,0,1,1.22-3.719c.7-1.553,1.675-3.454,2.905-5.649,1.114-1.989,2.24-3.864,3.054-5.194.813,1.327,1.934,3.2,3.047,5.184.61,1.088,1.159,2.108,1.643,3.044.352-.688.762-1.449,1.24-2.3.145-.258.287-.51.429-.759-.249-.455-.507-.926-.775-1.407-2.153-3.842-4.339-7.257-4.358-7.292L77.982,78.7l-1.223,1.911c-.023.036-2.2,3.451-4.358,7.292-1.275,2.273-2.292,4.251-3.025,5.888A13.319,13.319,0,0,0,67.9,98.708a7.174,7.174,0,0,0,.846,3.377,8.484,8.484,0,0,0,2.224,2.66,11.664,11.664,0,0,0,13.765.2,8.791,8.791,0,0,1-1.336-.885A8.35,8.35,0,0,1,82.34,103.047Z" fill="url(#linear-gradient)"/>
+    <path id="路径_56219" data-name="路径 56219" d="M250.613,279.976c-1.343-2.4-2.663-4.465-2.721-4.548l-1.1-1.727-1.1,1.727c-.055.087-1.375,2.153-2.721,4.548-2.553,4.555-2.847,6.124-2.847,6.908a4.9,4.9,0,0,0,.571,2.289,5.734,5.734,0,0,0,1.488,1.782,7.642,7.642,0,0,0,9.226,0,5.7,5.7,0,0,0,1.488-1.782,4.849,4.849,0,0,0,.571-2.289C253.464,286.1,253.167,284.527,250.613,279.976Zm-.855,8.932a5.024,5.024,0,0,1-5.94,0,2.617,2.617,0,0,1-1.078-2.021c0-.19.119-1.359,2.508-5.617.542-.968,1.088-1.888,1.54-2.641.455.752,1,1.675,1.54,2.641,2.386,4.258,2.508,5.427,2.508,5.617A2.622,2.622,0,0,1,249.758,288.908Zm-17.277-2.557-2.566-.281a4.535,4.535,0,0,0,1.007,3.251,4.744,4.744,0,0,0,3.574,1.527l.1-2.579a2.312,2.312,0,0,1-1.708-.62,1.967,1.967,0,0,1-.407-1.317A.146.146,0,0,0,232.481,286.351Z" transform="translate(-156.769 -188.705)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 13 - 0
static/icon-new/nitrogenPressure.svg

@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27.615" height="31" viewBox="0 0 27.615 31">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="氮气压力" transform="translate(-56)">
+    <path id="路径_56220" data-name="路径 56220" d="M449.938,705.938m-1.938,0A1.938,1.938,0,1,0,449.938,704,1.938,1.938,0,0,0,448,705.938Z" transform="translate(-380.131 -682.683)" fill="url(#linear-gradient)"/>
+    <path id="路径_56221" data-name="路径 56221" d="M449.938,193.938m-1.938,0A1.938,1.938,0,1,0,449.938,192,1.938,1.938,0,0,0,448,193.938Z" transform="translate(-380.131 -186.186)" fill="url(#linear-gradient)"/>
+    <path id="路径_56222" data-name="路径 56222" d="M83.009,21.038V10.246A1.936,1.936,0,0,0,81.677,6.9a1.793,1.793,0,0,0-.315.024L71.642,1.32a1.935,1.935,0,0,0-3.67,0L58.3,6.9a1.76,1.76,0,0,0-.363-.036,1.936,1.936,0,0,0-1.332,3.343V21a1.936,1.936,0,0,0,1.332,3.343,2.052,2.052,0,0,0,.612-.1l9.417,5.438a1.935,1.935,0,0,0,3.67,0l9.38-5.414a1.935,1.935,0,0,0,2.592-1.823,1.892,1.892,0,0,0-.6-1.4Zm-13.2,6.092a1.925,1.925,0,0,0-1.381.581l-8.581-4.954a2.228,2.228,0,0,0,.03-.351,1.721,1.721,0,0,0-.042-.4l8.036-4.639v.073a1.939,1.939,0,0,0,3.852.315l8.018,4.627v.061a2.861,2.861,0,0,0,.024.321l-8.575,4.954A1.906,1.906,0,0,0,69.807,27.13Zm0-23.254a1.925,1.925,0,0,0,1.381-.581l8.587,4.96-8.133,4.7a1.936,1.936,0,0,0-3.755.357L59.87,8.672a1.728,1.728,0,0,0-.073-.4L68.42,3.294A1.949,1.949,0,0,0,69.807,3.876ZM80.762,20.735,71.4,15.327l8.89-5.135a1.936,1.936,0,0,0,.781.484V20.6A2.391,2.391,0,0,0,80.762,20.735ZM59.016,10.416l8.508,4.911-8.981,5.184V10.646A1.9,1.9,0,0,0,59.016,10.416Z" transform="translate(0)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 16 - 0
static/icon-new/o2val.svg

@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22.658" height="24.278" viewBox="0 0 22.658 24.278">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="氧气" transform="translate(-913.058 -469.47)">
+    <g id="组_15361" data-name="组 15361" transform="translate(898.614 469.47)" style="isolation: isolate">
+      <path id="路径_56262" data-name="路径 56262" d="M928.659,492.189a6.516,6.516,0,0,1-2.392-2.379,6.333,6.333,0,0,1-.878-3.258V475.984a6.331,6.331,0,0,1,.878-3.257,6.512,6.512,0,0,1,2.392-2.379,6.407,6.407,0,0,1,3.271-.878h.946a6.333,6.333,0,0,1,3.257.878,6.546,6.546,0,0,1,2.379,2.379,6.333,6.333,0,0,1,.879,3.257v10.569a6.336,6.336,0,0,1-.879,3.258,6.551,6.551,0,0,1-2.379,2.379,6.333,6.333,0,0,1-3.257.878h-.946A6.407,6.407,0,0,1,928.659,492.189Zm-.067-3.717A4,4,0,0,0,930,489.892a3.688,3.688,0,0,0,1.933.527h.946a3.687,3.687,0,0,0,1.932-.527,4,4,0,0,0,1.406-1.419,3.708,3.708,0,0,0,.527-1.919V475.984a3.71,3.71,0,0,0-.527-1.919,4,4,0,0,0-1.406-1.419,3.686,3.686,0,0,0-1.932-.527h-.946a3.688,3.688,0,0,0-1.933.527,4,4,0,0,0-1.406,1.419,3.71,3.71,0,0,0-.527,1.919v10.569A3.707,3.707,0,0,0,928.592,488.472Z" transform="translate(-910.945 -469.47)" fill="url(#linear-gradient)"/>
+    </g>
+    <g id="组_15362" data-name="组 15362" transform="translate(927.744 482.265)" style="isolation: isolate">
+      <path id="路径_56263" data-name="路径 56263" d="M974.182,502.254H966.21v-1.109a3.67,3.67,0,0,1,.357-1.663,5.053,5.053,0,0,1,.884-1.26,8.98,8.98,0,0,1,1.148-1q.621-.455,1.149-.9a5.377,5.377,0,0,0,.884-.924,1.824,1.824,0,0,0,.356-1.115,1.029,1.029,0,0,0-.369-.851,1.556,1.556,0,0,0-1-.3,3.459,3.459,0,0,0-.7.079,4.845,4.845,0,0,0-.759.225,5.524,5.524,0,0,0-.726.343,2.773,2.773,0,0,0-.6.449v-2.56a5.078,5.078,0,0,1,1.61-.706,7.412,7.412,0,0,1,1.689-.191,5.226,5.226,0,0,1,1.531.218,3.49,3.49,0,0,1,1.234.654,3.149,3.149,0,0,1,.825,1.069,3.35,3.35,0,0,1,.3,1.464,3.043,3.043,0,0,1-.336,1.4,6.246,6.246,0,0,1-.838,1.24,9.557,9.557,0,0,1-1.083,1.069q-.581.488-1.082.87c-.334.256-.613.475-.838.661s-.337.33-.337.435v.053h4.672Z" transform="translate(-966.21 -490.771)" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/onState.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.842" height="29.355" viewBox="0 0 28.842 29.355">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="使用状态" d="M187.336,150.748a14.1,14.1,0,0,0,4.176,7.491,1.289,1.289,0,0,0,2-.293l1.675-2.9a1.29,1.29,0,0,0-.161-1.51,8.428,8.428,0,0,1-1.865-3.387,1.289,1.289,0,0,0-1.242-.945H188.6a1.289,1.289,0,0,0-1.263,1.546Zm17.048,5.965a1.287,1.287,0,0,0-1.391-.616,8.3,8.3,0,0,1-4.19-.166,1.29,1.29,0,0,0-1.492.588l-1.645,2.85a1.288,1.288,0,0,0,.67,1.852,14.233,14.233,0,0,0,8.979.268,1.288,1.288,0,0,0,.744-1.878l-1.674-2.9Zm5.922-19.686a1.287,1.287,0,0,0-.825-.3,1.338,1.338,0,0,0-.226.021,1.288,1.288,0,0,0-.889.625l-1.648,2.853a1.291,1.291,0,0,0,.236,1.587,8.291,8.291,0,0,1,2.336,3.865,1.29,1.29,0,0,0,1.243.948h3.32a1.288,1.288,0,0,0,1.262-1.544A14.159,14.159,0,0,0,210.306,137.026Zm-4.166-1.932a1.29,1.29,0,0,0-.826-.759,14.222,14.222,0,0,0-8.979.267,1.29,1.29,0,0,0-.67,1.854l1.645,2.85a1.29,1.29,0,0,0,1.492.588,8.28,8.28,0,0,1,4.19-.168,1.289,1.289,0,0,0,1.391-.614l1.674-2.9A1.287,1.287,0,0,0,206.141,135.094Zm7.713,14.107h-3.32a1.288,1.288,0,0,0-1.243.947,8.3,8.3,0,0,1-2.336,3.865,1.289,1.289,0,0,0-.236,1.585l1.648,2.854a1.287,1.287,0,0,0,.89.625,1.332,1.332,0,0,0,.226.019,1.286,1.286,0,0,0,.825-.3,14.164,14.164,0,0,0,4.809-8.054,1.288,1.288,0,0,0-1.262-1.544ZM187.6,146.15a1.287,1.287,0,0,0,1,.474h3.32a1.289,1.289,0,0,0,1.242-.945,8.429,8.429,0,0,1,1.865-3.389,1.288,1.288,0,0,0,.161-1.509l-1.675-2.9a1.288,1.288,0,0,0-2-.293,14.1,14.1,0,0,0-4.176,7.491,1.286,1.286,0,0,0,.265,1.073Z" transform="translate(-186.805 -133.234)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/onState_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.842" height="29.355" viewBox="0 0 28.842 29.355">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="使用状态" d="M187.336,150.748a14.1,14.1,0,0,0,4.176,7.491,1.289,1.289,0,0,0,2-.293l1.675-2.9a1.29,1.29,0,0,0-.161-1.51,8.428,8.428,0,0,1-1.865-3.387,1.289,1.289,0,0,0-1.242-.945H188.6a1.289,1.289,0,0,0-1.263,1.546Zm17.048,5.965a1.287,1.287,0,0,0-1.391-.616,8.3,8.3,0,0,1-4.19-.166,1.29,1.29,0,0,0-1.492.588l-1.645,2.85a1.288,1.288,0,0,0,.67,1.852,14.233,14.233,0,0,0,8.979.268,1.288,1.288,0,0,0,.744-1.878l-1.674-2.9Zm5.922-19.686a1.287,1.287,0,0,0-.825-.3,1.338,1.338,0,0,0-.226.021,1.288,1.288,0,0,0-.889.625l-1.648,2.853a1.291,1.291,0,0,0,.236,1.587,8.291,8.291,0,0,1,2.336,3.865,1.29,1.29,0,0,0,1.243.948h3.32a1.288,1.288,0,0,0,1.262-1.544A14.159,14.159,0,0,0,210.306,137.026Zm-4.166-1.932a1.29,1.29,0,0,0-.826-.759,14.222,14.222,0,0,0-8.979.267,1.29,1.29,0,0,0-.67,1.854l1.645,2.85a1.29,1.29,0,0,0,1.492.588,8.28,8.28,0,0,1,4.19-.168,1.289,1.289,0,0,0,1.391-.614l1.674-2.9A1.287,1.287,0,0,0,206.141,135.094Zm7.713,14.107h-3.32a1.288,1.288,0,0,0-1.243.947,8.3,8.3,0,0,1-2.336,3.865,1.289,1.289,0,0,0-.236,1.585l1.648,2.854a1.287,1.287,0,0,0,.89.625,1.332,1.332,0,0,0,.226.019,1.286,1.286,0,0,0,.825-.3,14.164,14.164,0,0,0,4.809-8.054,1.288,1.288,0,0,0-1.262-1.544ZM187.6,146.15a1.287,1.287,0,0,0,1,.474h3.32a1.289,1.289,0,0,0,1.242-.945,8.429,8.429,0,0,1,1.865-3.389,1.288,1.288,0,0,0,.161-1.509l-1.675-2.9a1.288,1.288,0,0,0-2-.293,14.1,14.1,0,0,0-4.176,7.491,1.286,1.286,0,0,0,.265,1.073Z" transform="translate(-186.805 -133.234)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 11 - 0
static/icon-new/outletTemperature.svg

@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="18.367" height="31.454" viewBox="0 0 18.367 31.454">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="模出口温度" transform="translate(0 -2.811)">
+    <path id="路径_55369" data-name="路径 55369" d="M223.265,19.362V10.925a.932.932,0,0,0-.931-.931h-.074a.9.9,0,0,0-.9.9v8.465a3.277,3.277,0,0,0-2.4,3.124,3.36,3.36,0,1,0,4.312-3.124Zm4.942-3.738a.849.849,0,0,1-.332-.645V5.439a5.567,5.567,0,0,0-11.131,0v9.27a1.326,1.326,0,0,1-.451,1.017,8.846,8.846,0,0,0-3.164,6.763,9.186,9.186,0,0,0,18.367,0A8.847,8.847,0,0,0,228.207,15.624Zm-5.9,12.983a6.213,6.213,0,0,1-6.29-6.121,6.064,6.064,0,0,1,2.939-5.172l.445-.273a.493.493,0,0,0,.233-.418V5.439a2.676,2.676,0,0,1,5.35,0V16.622a.494.494,0,0,0,.233.418l.445.273a6.057,6.057,0,0,1,2.936,5.172,6.22,6.22,0,0,1-6.293,6.121Z" transform="translate(-213.129 2.811)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/pa.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="29.335" viewBox="0 0 32 29.335">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="气压值" d="M93.893,155.045a1.256,1.256,0,0,1-.733-2.277,12.991,12.991,0,1,0-20.571-10.554,12.883,12.883,0,0,0,5.224,10.41,1.257,1.257,0,0,1-1.5,2.013,15.508,15.508,0,0,1-6.231-12.428,15.5,15.5,0,1,1,31,0,15.479,15.479,0,0,1-6.461,12.6,1.183,1.183,0,0,1-.724.24Zm-8.311-7.17a3.017,3.017,0,0,1-3.015-3.015,3.1,3.1,0,0,1,.043-.518l.043-.244-3.681-3.154a1.253,1.253,0,0,1-.134-1.773,1.25,1.25,0,0,1,1.773-.134l3.628,3.111.244-.1a2.987,2.987,0,0,1,1.078-.2h.019a3.012,3.012,0,0,1,0,6.025Zm9.787-4.4a1.26,1.26,0,0,1-1.256-1.256,8.536,8.536,0,1,0-17.072,0,1.256,1.256,0,0,1-2.511,0,11.047,11.047,0,1,1,22.095,0,1.247,1.247,0,0,1-.364.887,1.232,1.232,0,0,1-.887.369Z" transform="translate(-69.577 -126.21)" stroke="rgba(0,0,0,0)" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/pressure.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.766" height="28.766" viewBox="0 0 28.766 28.766">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="压力" d="M13.883,27.766A13.883,13.883,0,1,1,27.766,13.883,13.883,13.883,0,0,1,13.883,27.766Zm-.909-10.41a1.968,1.968,0,0,0,1.963-1.919L16.8,10.384,12.436,13.5a1.964,1.964,0,0,0,.538,3.856Zm.909-14.438A11.43,11.43,0,0,0,6.1,22.705a1.352,1.352,0,0,0,1.839-1.977,8.719,8.719,0,1,1,11.889,0,1.336,1.336,0,0,0-.429.939,1.349,1.349,0,0,0,2.268,1.036A11.429,11.429,0,0,0,13.883,2.917Zm6.865,18.8h0v0a10.069,10.069,0,1,0-13.728,0v0h0a10.07,10.07,0,1,1,13.732,0Z" transform="translate(0.5 0.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 13 - 0
static/icon-new/pulpingMachine.svg

@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="23.52" height="27.775" viewBox="0 0 23.52 27.775">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="制浆机" transform="translate(-552.5 39.5)">
+    <g id="图层_1" data-name="图层 1" transform="translate(553 -39)">
+      <path id="路径_55478" data-name="路径 55478" d="M22.52,2.226v.131a3.836,3.836,0,0,0-.038.384v8.92a3.831,3.831,0,0,0,.038.385v.065c-.107.149-.225.29-.319.446q-2.322,3.809-4.639,7.621c-.554.911-1.107,1.823-1.677,2.761l2.708,1.717v2.12H6.677V24.643L9.41,22.9,6.88,19.635q-2.789-3.607-5.587-7.208a1.09,1.09,0,0,1-.246-.734c.009-2.333,0-4.666,0-7V4.237L0,4.386V3.077l1.051.048V2.784c0-.673,0-.678.668-.829.368-.084.74-.147,1.117-.221.007-.073.011-.126.018-.179.031-.251.009-.687.106-.716a.811.811,0,0,0,.56-.482C3.545.3,3.678.3,3.76.272c.253-.09.5-.181.757-.272h.2A.894.894,0,0,0,5.749.594C7.043.519,8.341.475,9.636.481c2.79.014,5.581.056,8.37.109.794.016,1.586.11,2.379.167.229.016.323.127.3.362a5.328,5.328,0,0,0,0,.546ZM3.6.582l.029.109L4.773.606,4.789.49c-.1-.058-.215-.181-.3-.162A8.778,8.778,0,0,0,3.6.582Z" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 13 - 0
static/icon-new/pulpingMachine_str.svg

@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="23.52" height="27.775" viewBox="0 0 23.52 27.775">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="制浆机" transform="translate(-552.5 39.5)">
+    <g id="图层_1" data-name="图层 1" transform="translate(553 -39)">
+      <path id="路径_55478" data-name="路径 55478" d="M22.52,2.226v.131a3.836,3.836,0,0,0-.038.384v8.92a3.831,3.831,0,0,0,.038.385v.065c-.107.149-.225.29-.319.446q-2.322,3.809-4.639,7.621c-.554.911-1.107,1.823-1.677,2.761l2.708,1.717v2.12H6.677V24.643L9.41,22.9,6.88,19.635q-2.789-3.607-5.587-7.208a1.09,1.09,0,0,1-.246-.734c.009-2.333,0-4.666,0-7V4.237L0,4.386V3.077l1.051.048V2.784c0-.673,0-.678.668-.829.368-.084.74-.147,1.117-.221.007-.073.011-.126.018-.179.031-.251.009-.687.106-.716a.811.811,0,0,0,.56-.482C3.545.3,3.678.3,3.76.272c.253-.09.5-.181.757-.272h.2A.894.894,0,0,0,5.749.594C7.043.519,8.341.475,9.636.481c2.79.014,5.581.056,8.37.109.794.016,1.586.11,2.379.167.229.016.323.127.3.362a5.328,5.328,0,0,0,0,.546ZM3.6.582l.029.109L4.773.606,4.789.49c-.1-.058-.215-.181-.3-.162A8.778,8.778,0,0,0,3.6.582Z" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/ratio.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32.039" height="23.737" viewBox="0 0 32.039 23.737">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="粉尘呼尘占比" d="M7.072,165.047a2.723,2.723,0,0,1,2.961,3.026A3.026,3.026,0,0,1,7.072,171.1a3.027,3.027,0,0,1,0-6.052Zm15.643-.987v.007a3.027,3.027,0,1,0-2.958-3.026A2.715,2.715,0,0,0,22.715,164.059Zm-11.058.3v.007a2.677,2.677,0,0,0,2.69-2.477,2.513,2.513,0,0,0-2.69-2.483,2.678,2.678,0,0,0-2.69,2.476A2.508,2.508,0,0,0,11.657,164.358Zm10.72,6.74a2.5,2.5,0,0,0,2.69,2.476,2.678,2.678,0,0,0,2.69-2.476,2.508,2.508,0,0,0-2.69-2.476A2.674,2.674,0,0,0,22.377,171.1Zm-4.808-1.161v0a2.147,2.147,0,0,0,2.153-2.2,2.338,2.338,0,0,0-2.153-2.2,2.147,2.147,0,0,0-2.153,2.2A2.34,2.34,0,0,0,17.569,169.937Zm-13.743-8.9a2.2,2.2,0,0,0,0-4.4,2.2,2.2,0,0,0,0,4.4Zm25.752,3.324a1.441,1.441,0,1,0-1.248-.721A1.44,1.44,0,0,0,29.579,164.365Zm1.852,11.169a.74.74,0,0,0-.583-.3v0a1.062,1.062,0,0,0-.721.147c-5.793,4.135-11.009,1.183-11.153,1.038-10.861-6.8-17.919.293-18.1.437a.771.771,0,0,0-.288.591,1.117,1.117,0,0,0,.288.591c.291.444.865.3,1.3,0,.145-.3,6.081-6.052,15.64-.147a11.173,11.173,0,0,0,5.793,1.477,13.379,13.379,0,0,0,7.675-2.511,1.113,1.113,0,0,0,.144-1.328Z" transform="translate(-0.086 -156.137)" stroke="rgba(0,0,0,0)" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/readTime.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28" height="28" viewBox="0 0 28 28">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="时间" d="M77.5,91A13.5,13.5,0,1,1,91,77.5,13.5,13.5,0,0,1,77.5,91Zm0-3.857A9.643,9.643,0,1,0,67.857,77.5,9.643,9.643,0,0,0,77.5,87.143Zm7.749-11.571v3.857H75.571V69.786h3.857v5.786Z" transform="translate(-63.5 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/smokeval.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30.105" height="28.3" viewBox="0 0 30.105 28.3">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="烟雾" d="M28.956,78.242H1.1A9.269,9.269,0,0,1,0,73.876a9.929,9.929,0,0,1,10.161-9.686,10.158,10.158,0,0,1,9.513,6.339c.117-.04.24-.057.359-.091a7.076,7.076,0,0,1,.75-.191c.136-.024.28-.025.42-.04a7.292,7.292,0,0,1,.845-.081A6.905,6.905,0,0,1,29.1,76.868a6.343,6.343,0,0,1-.149,1.374ZM3.3,88.753a1.438,1.438,0,0,1,0,2.523,1.5,1.5,0,0,1-1.478,0,1.438,1.438,0,0,1,0-2.523,1.5,1.5,0,0,1,1.478,0ZM5.778,84.16a1.465,1.465,0,0,1,1.478,1.455,1.447,1.447,0,0,1-.747,1.262,1.5,1.5,0,0,1-1.478,0,1.449,1.449,0,0,1,.747-2.717Zm4.018,4.4a1.456,1.456,0,1,1-1.478,1.455A1.469,1.469,0,0,1,9.8,88.559Zm3.2-4.4a1.465,1.465,0,0,1,1.478,1.455,1.48,1.48,0,0,1-1.494,1.455A1.455,1.455,0,1,1,13,84.161Zm4,4.4a1.455,1.455,0,1,1-1.455,1.455A1.469,1.469,0,0,1,17,88.559Zm3.2-4.4a1.465,1.465,0,0,1,1.478,1.455,1.447,1.447,0,0,1-.748,1.261,1.5,1.5,0,0,1-1.478,0,1.45,1.45,0,0,1,.747-2.717Zm4.815-.825a.587.587,0,0,0,.6-.582.61.61,0,0,0-.6-.582H3.951a1.148,1.148,0,1,1,0-2.3H25.037a2.879,2.879,0,1,1-.016,5.757,1.148,1.148,0,0,1,0-2.3Z" transform="translate(0.5 -63.689)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/smokeval_str.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30.105" height="28.3" viewBox="0 0 30.105 28.3">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="烟雾" d="M28.956,78.242H1.1A9.269,9.269,0,0,1,0,73.876a9.929,9.929,0,0,1,10.161-9.686,10.158,10.158,0,0,1,9.513,6.339c.117-.04.24-.057.359-.091a7.076,7.076,0,0,1,.75-.191c.136-.024.28-.025.42-.04a7.292,7.292,0,0,1,.845-.081A6.905,6.905,0,0,1,29.1,76.868a6.343,6.343,0,0,1-.149,1.374ZM3.3,88.753a1.438,1.438,0,0,1,0,2.523,1.5,1.5,0,0,1-1.478,0,1.438,1.438,0,0,1,0-2.523,1.5,1.5,0,0,1,1.478,0ZM5.778,84.16a1.465,1.465,0,0,1,1.478,1.455,1.447,1.447,0,0,1-.747,1.262,1.5,1.5,0,0,1-1.478,0,1.449,1.449,0,0,1,.747-2.717Zm4.018,4.4a1.456,1.456,0,1,1-1.478,1.455A1.469,1.469,0,0,1,9.8,88.559Zm3.2-4.4a1.465,1.465,0,0,1,1.478,1.455,1.48,1.48,0,0,1-1.494,1.455A1.455,1.455,0,1,1,13,84.161Zm4,4.4a1.455,1.455,0,1,1-1.455,1.455A1.469,1.469,0,0,1,17,88.559Zm3.2-4.4a1.465,1.465,0,0,1,1.478,1.455,1.447,1.447,0,0,1-.748,1.261,1.5,1.5,0,0,1-1.478,0,1.45,1.45,0,0,1,.747-2.717Zm4.815-.825a.587.587,0,0,0,.6-.582.61.61,0,0,0-.6-.582H3.951a1.148,1.148,0,1,1,0-2.3H25.037a2.879,2.879,0,1,1-.016,5.757,1.148,1.148,0,0,1,0-2.3Z" transform="translate(0.5 -63.689)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/sprayval.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="31" height="31" viewBox="0 0 31 31">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="监测值" d="M15,0a.938.938,0,0,1,.938.938v.971A13.127,13.127,0,0,1,28.091,14.063h.971a.938.938,0,0,1,0,1.875h-.971A13.127,13.127,0,0,1,15.938,28.091v.971a.938.938,0,0,1-1.875,0v-.971A13.127,13.127,0,0,1,1.911,15.938H.938a.938.938,0,0,1,0-1.875h.971A13.127,13.127,0,0,1,14.063,1.911V.938A.937.937,0,0,1,15,0Zm0,3.75A11.25,11.25,0,1,0,26.25,15,11.25,11.25,0,0,0,15,3.75Zm0,5.625A5.625,5.625,0,1,1,9.375,15,5.625,5.625,0,0,1,15,9.375Z" transform="translate(0.5 0.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/strname.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27.888" height="28.128" viewBox="0 0 27.888 28.128">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="名称" d="M25.287,0H14.023c-.887,0-1.05.39-1.9,1.277L3.742,9.646,17.274,23.19,25.683,14.8c.713-.713,1.222-1.067,1.222-1.954V1.606A1.615,1.615,0,0,0,25.287,0ZM20.854,10.8a3.361,3.361,0,1,1,0-4.752A3.353,3.353,0,0,1,20.854,10.8ZM1.038,12.343a3.472,3.472,0,0,0,0,4.919L9.66,25.869a3.491,3.491,0,0,0,4.929,0l1.494-1.491L2.55,10.834,1.038,12.344ZM17.3,7.234a1.673,1.673,0,1,0,1.186-.493,1.68,1.68,0,0,0-1.186.493Z" transform="translate(0.483 0.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 11 - 0
static/icon-new/temperature.svg

@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="18.367" height="31.454" viewBox="0 0 18.367 31.454">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <g id="温度" transform="translate(0 -2.811)">
+    <path id="路径_55369" data-name="路径 55369" d="M223.265,19.362V10.925a.932.932,0,0,0-.931-.931h-.074a.9.9,0,0,0-.9.9v8.465a3.277,3.277,0,0,0-2.4,3.124,3.36,3.36,0,1,0,4.312-3.124Zm4.942-3.738a.849.849,0,0,1-.332-.645V5.439a5.567,5.567,0,0,0-11.131,0v9.27a1.326,1.326,0,0,1-.451,1.017,8.846,8.846,0,0,0-3.164,6.763,9.186,9.186,0,0,0,18.367,0A8.847,8.847,0,0,0,228.207,15.624Zm-5.9,12.983a6.213,6.213,0,0,1-6.29-6.121,6.064,6.064,0,0,1,2.939-5.172l.445-.273a.493.493,0,0,0,.233-.418V5.439a2.676,2.676,0,0,1,5.35,0V16.622a.494.494,0,0,0,.233.418l.445.273a6.057,6.057,0,0,1,2.936,5.172,6.22,6.22,0,0,1-6.293,6.121Z" transform="translate(-213.129 2.811)" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 9 - 0
static/icon-new/timedState.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.97" height="28.972" viewBox="0 0 28.97 28.972">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="是否定时" d="M61.193,61.768a.937.937,0,0,0,.214-.327,1.086,1.086,0,0,0,.078-.384V55A.991.991,0,1,0,59.5,55v5.635l-3.985,4.041a1.013,1.013,0,0,0,0,1.416.976.976,0,0,0,1.395,0Zm-.7-12.726a11.936,11.936,0,0,1,11.86,12.011,12.063,12.063,0,0,1-2.936,7.9l2.022,2.053a2.014,2.014,0,0,1,0,2.831,1.953,1.953,0,0,1-2.791,0L66.343,71.5a11.672,11.672,0,0,1-11.694,0l-2.309,2.336a1.953,1.953,0,0,1-2.791,0,2.014,2.014,0,0,1,0-2.831l2.022-2.053a12.063,12.063,0,0,1-2.935-7.9A11.936,11.936,0,0,1,60.492,49.043Zm5.965-.62a4.376,4.376,0,0,1,7.987,2.541,4.439,4.439,0,0,1-1.728,3.515,13.98,13.98,0,0,0-6.26-6.056Zm-15.53-1.86A4.358,4.358,0,0,1,54.5,48.44a13.955,13.955,0,0,0-6.245,6.066,4.439,4.439,0,0,1,2.672-7.944Z" transform="translate(-45.98 -45.952)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/timeval.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28" height="28" viewBox="0 0 28 28">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="时间" d="M77.5,91A13.5,13.5,0,1,1,91,77.5,13.5,13.5,0,0,1,77.5,91Zm0-3.857A9.643,9.643,0,1,0,67.857,77.5,9.643,9.643,0,0,0,77.5,87.143Zm7.749-11.571v3.857H75.571V69.786h3.857v5.786Z" transform="translate(-63.5 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/ttime.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28" height="28" viewBox="0 0 28 28">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="时间" d="M77.5,91A13.5,13.5,0,1,1,91,77.5,13.5,13.5,0,0,1,77.5,91Zm0-3.857A9.643,9.643,0,1,0,67.857,77.5,9.643,9.643,0,0,0,77.5,87.143Zm7.749-11.571v3.857H75.571V69.786h3.857v5.786Z" transform="translate(-63.5 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 9 - 0
static/icon-new/typeName.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="28.867" height="28.487" viewBox="0 0 28.867 28.487">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f9faff"/>
+      <stop offset="1" stop-color="#c4d2fd"/>
+    </linearGradient>
+  </defs>
+  <path id="测点类型" d="M55.4,51.8a1.127,1.127,0,0,1,0-1.594l4.427-4.427a1.127,1.127,0,0,1,1.593,0l4.429,4.427a1.127,1.127,0,0,1,0,1.593l-4.427,4.429a1.127,1.127,0,0,1-1.594,0Zm2.389-.8,2.834,2.833L63.461,51l-2.834-2.833L57.794,51Zm5.751,8.936a1.127,1.127,0,0,1,0-1.593l4.427-4.429a1.127,1.127,0,0,1,1.593,0l4.429,4.429a1.127,1.127,0,0,1,0,1.593l-4.427,4.429a1.127,1.127,0,0,1-1.594,0Zm2.389-.8,2.834,2.834L71.6,59.142l-2.834-2.834-2.833,2.834Zm-18.671.8a1.127,1.127,0,0,1,0-1.593l4.429-4.429a1.127,1.127,0,0,1,1.593,0l4.429,4.429a1.127,1.127,0,0,1,0,1.593l-4.427,4.429a1.127,1.127,0,0,1-1.593,0l-4.432-4.429Zm2.391-.8,2.834,2.834,2.833-2.834-2.833-2.834ZM55.4,68.08a1.127,1.127,0,0,1,0-1.593l4.427-4.429a1.127,1.127,0,0,1,1.593,0l4.429,4.427a1.127,1.127,0,0,1,0,1.593l-4.427,4.429a1.127,1.127,0,0,1-1.594,0L55.4,68.08Zm2.389-.8,2.834,2.833,2.834-2.833-2.834-2.834-2.833,2.834Z" transform="translate(-46.053 -44.85)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

Some files were not shown because too many files changed in this diff