linqilong 2 mesiacov pred
rodič
commit
412b24cde5

+ 10 - 0
.env.development

@@ -0,0 +1,10 @@
+BASE_URL=/
+
+# 页面标题
+VUE_APP_TITLE =
+
+# 开发环境配置
+NODE_ENV = 'development'
+
+# 开发环境
+VUE_APP_BASE_API = '/base_api'

+ 10 - 0
.env.production

@@ -0,0 +1,10 @@
+BASE_URL=/
+
+# 页面标题
+VUE_APP_TITLE =
+
+# 生产环境配置
+NODE_ENV = 'production'
+
+# 生产环境
+VUE_APP_BASE_API = '/base_api'

+ 22 - 0
.eslintrc.js

@@ -0,0 +1,22 @@
+module.exports = {
+    "env": {
+        "browser": true,
+        "es2021": true,
+        "node": true
+    },
+    "extends": [
+        "eslint:recommended",
+        "plugin:vue/essential"
+    ],
+    "parserOptions": {
+        "ecmaVersion": 12,
+        "sourceType": "module"
+    },
+    "plugins": [
+        "vue"
+    ],
+    "rules": {
+        "no-unused-components": "off",
+        'vue/multi-word-component-names': 'off'
+    }
+};

+ 215 - 4
package-lock.json

@@ -8,8 +8,12 @@
       "name": "fjjgpt",
       "version": "0.1.0",
       "dependencies": {
+        "@ionic/vue": "^8.5.3",
+        "@ionic/vue-router": "^8.5.3",
         "core-js": "^3.8.3",
-        "vue": "^3.2.13"
+        "vue": "^3.2.13",
+        "vue-router": "^4.5.0",
+        "vue3-cookies": "^1.0.6"
       },
       "devDependencies": {
         "@babel/core": "^7.12.16",
@@ -18,7 +22,9 @@
         "@vue/cli-plugin-eslint": "~5.0.0",
         "@vue/cli-service": "~5.0.0",
         "eslint": "^7.32.0",
-        "eslint-plugin-vue": "^8.0.3"
+        "eslint-plugin-vue": "^8.0.3",
+        "sass": "1.32.13",
+        "sass-loader": "10.1.1"
       }
     },
     "node_modules/@achrinza/node-ipc": {
@@ -1746,6 +1752,37 @@
       "deprecated": "Use @eslint/object-schema instead",
       "dev": true
     },
+    "node_modules/@ionic/core": {
+      "version": "8.5.3",
+      "resolved": "https://registry.npmmirror.com/@ionic/core/-/core-8.5.3.tgz",
+      "integrity": "sha512-AiBK1gpzi9Knd3xbGWkuFja/f8hQTt+FIubdHBcRThUSjzJLgqYsfiSGkcdEAMf/t5mtaqRUUN1UbCcf2Ue9Xg==",
+      "license": "MIT",
+      "dependencies": {
+        "@stencil/core": "4.20.0",
+        "ionicons": "^7.2.2",
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/@ionic/vue": {
+      "version": "8.5.3",
+      "resolved": "https://registry.npmmirror.com/@ionic/vue/-/vue-8.5.3.tgz",
+      "integrity": "sha512-9PWdSmo0OhrmqGRRwzkFL1s6oCo5HsgZpiaNaJmUgMW0TtcOL75fDVo3Cyn9Jx7PWeMmKS7nFEx2RMDZqalgHw==",
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/core": "8.5.3",
+        "@stencil/vue-output-target": "0.10.7",
+        "ionicons": "^7.0.0"
+      }
+    },
+    "node_modules/@ionic/vue-router": {
+      "version": "8.5.3",
+      "resolved": "https://registry.npmmirror.com/@ionic/vue-router/-/vue-router-8.5.3.tgz",
+      "integrity": "sha512-K+N6jAag82xP3BsRund2bhRmTkER/35XnNj+SwC5imLdGoLrl8Q58aQf1/6m5QUYnD2BZScKT5GAgOCXfl4MvQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@ionic/vue": "8.5.3"
+      }
+    },
     "node_modules/@jridgewell/gen-mapping": {
       "version": "0.3.8",
       "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
@@ -1916,6 +1953,41 @@
       "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
       "dev": true
     },
+    "node_modules/@stencil/core": {
+      "version": "4.20.0",
+      "resolved": "https://registry.npmmirror.com/@stencil/core/-/core-4.20.0.tgz",
+      "integrity": "sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg==",
+      "license": "MIT",
+      "bin": {
+        "stencil": "bin/stencil"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=7.10.0"
+      }
+    },
+    "node_modules/@stencil/vue-output-target": {
+      "version": "0.10.7",
+      "resolved": "https://registry.npmmirror.com/@stencil/vue-output-target/-/vue-output-target-0.10.7.tgz",
+      "integrity": "sha512-IYxDe+SLCkwhwsWRdynE31rTK1zN3hVwwojQ/V9lrN8Gnx4PTvrUQHiRno9jFo1dk+EaBZWX9gZSmXta0ZaZew==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@stencil/core": ">=2.0.0 || >=3 || >= 4.0.0-beta.0 || >= 4.0.0",
+        "vue": "^3.4.38",
+        "vue-router": "^4.5.0"
+      },
+      "peerDependenciesMeta": {
+        "@stencil/core": {
+          "optional": true
+        },
+        "vue": {
+          "optional": false
+        },
+        "vue-router": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@trysound/sax": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz",
@@ -2722,6 +2794,12 @@
       "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
       "dev": true
     },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
     "node_modules/@vue/reactivity": {
       "version": "3.5.13",
       "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
@@ -6543,6 +6621,15 @@
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "dev": true
     },
+    "node_modules/ionicons": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmmirror.com/ionicons/-/ionicons-7.4.0.tgz",
+      "integrity": "sha512-ZK94MMqgzMCPPMhmk8Ouu6goyVHFIlw/ACP6oe3FrikcI0N7CX0xcwVaEbUc0G/v3W0shI93vo+9ve/KpvcNhQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@stencil/core": "^4.0.3"
+      }
+    },
     "node_modules/ipaddr.js": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
@@ -9269,6 +9356,107 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
       "dev": true
     },
+    "node_modules/sass": {
+      "version": "1.32.13",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.32.13.tgz",
+      "integrity": "sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "chokidar": ">=3.0.0 <4.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/sass-loader": {
+      "version": "10.1.1",
+      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.1.1.tgz",
+      "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "klona": "^2.0.4",
+        "loader-utils": "^2.0.0",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.0.0",
+        "semver": "^7.3.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "fibers": ">= 3.1.0",
+        "node-sass": "^4.0.0 || ^5.0.0",
+        "sass": "^1.3.0",
+        "webpack": "^4.36.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "fibers": {
+          "optional": true
+        },
+        "node-sass": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/sass-loader/node_modules/loader-utils": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/sass-loader/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/sass-loader/node_modules/semver": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz",
+      "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/schema-utils": {
       "version": "2.7.1",
       "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
@@ -10226,8 +10414,7 @@
     "node_modules/tslib": {
       "version": "2.8.1",
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
-      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "dev": true
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
     },
     "node_modules/type-check": {
       "version": "0.4.0",
@@ -10575,6 +10762,21 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
+    "node_modules/vue-router": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.0.tgz",
+      "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
     "node_modules/vue-style-loader": {
       "version": "4.1.3",
       "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@@ -10597,6 +10799,15 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
     },
+    "node_modules/vue3-cookies": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/vue3-cookies/-/vue3-cookies-1.0.6.tgz",
+      "integrity": "sha512-a1UvVD0qIgxyOqjlSOwnLnqAnz8ASltugEv8yX+96i/WGZAN9fEDci7xO4HIWZE1uToUnRq9JnFhvfDCSo45OA==",
+      "license": "MIT",
+      "dependencies": {
+        "vue": "^3.0.0"
+      }
+    },
     "node_modules/watchpack": {
       "version": "2.4.2",
       "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz",

+ 8 - 2
package.json

@@ -8,8 +8,12 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "@ionic/vue": "^8.5.3",
+    "@ionic/vue-router": "^8.5.3",
     "core-js": "^3.8.3",
-    "vue": "^3.2.13"
+    "vue": "^3.2.13",
+    "vue-router": "^4.5.0",
+    "vue3-cookies": "^1.0.6"
   },
   "devDependencies": {
     "@babel/core": "^7.12.16",
@@ -18,7 +22,9 @@
     "@vue/cli-plugin-eslint": "~5.0.0",
     "@vue/cli-service": "~5.0.0",
     "eslint": "^7.32.0",
-    "eslint-plugin-vue": "^8.0.3"
+    "eslint-plugin-vue": "^8.0.3",
+    "sass": "1.32.13",
+    "sass-loader": "10.1.1"
   },
   "eslintConfig": {
     "root": true,

+ 676 - 0
src/api/home.js

@@ -0,0 +1,676 @@
+import request from "@/utils/request";
+
+/**
+ * 水文测站实时信息
+ */
+export function getRStLLMaxDate() {
+  return request({
+    url: '/tbazmw_api/tbazmw/thdata/getRVandDrpMaxDate',
+    method: 'get'
+  })
+  // return Promise.resolve([
+  //   {
+  //     "stcd": "63304700",
+  //     "stnm": "太师桥",
+  //     "title": "太师桥",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.4941",
+  //     "lttd": "30.762836",
+  //     "shuxing": "基本站",
+  //     "xzqh": "浙江嘉兴",
+  //     "z": "3.24",
+  //     "q": "73.791",
+  //     "drp": "0",
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "63304650",
+  //     "stnm": "思源",
+  //     "title": "思源",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.522088",
+  //     "lttd": "30.841321",
+  //     "shuxing": "基本站",
+  //     "xzqh": "浙江嘉兴",
+  //     "z": "3.15",
+  //     "q": "15.308",
+  //     "drp": "0",
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "70112100",
+  //     "stnm": "罗桐埠 ",
+  //     "title": "罗桐埠 ",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "119.254444",
+  //     "lttd": "29.476389",
+  //     "shuxing": "基本站",
+  //     "xzqh": "浙江杭州",
+  //     "z": "23.14",
+  //     "q": "0",
+  //     "drp": "0",
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "70111400",
+  //     "stnm": "街口",
+  //     "title": "街口",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "118.71691",
+  //     "lttd": "29.72391",
+  //     "shuxing": "基本站",
+  //     "xzqh": "浙江杭州",
+  //     "z": "102.43",
+  //     "q": "0",
+  //     "drp": "0",
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "63301700",
+  //     "stnm": "北虹大桥",
+  //     "title": "北虹大桥",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.709747",
+  //     "lttd": "30.885936",
+  //     "shuxing": "基本站",
+  //     "xzqh": "浙江嘉兴",
+  //     "z": "3.049",
+  //     "q": "26.255",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "63304730",
+  //     "stnm": "文桥",
+  //     "title": "文桥",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.465831",
+  //     "lttd": "30.800258",
+  //     "shuxing": "预警站",
+  //     "xzqh": "浙江湖州",
+  //     "z": "3.21",
+  //     "q": "7.77",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "63305451",
+  //     "stnm": "圣塘桥",
+  //     "title": "圣塘桥",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.589144",
+  //     "lttd": "30.838792",
+  //     "shuxing": "预警站",
+  //     "xzqh": "浙江嘉兴",
+  //     "z": "3.13",
+  //     "q": "-40.204",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "63205690",
+  //     "stnm": "太平桥",
+  //     "title": "太平桥",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.702609",
+  //     "lttd": "30.886256",
+  //     "shuxing": "预警站",
+  //     "xzqh": "江苏苏州",
+  //     "z": "3.05",
+  //     "q": "18.11",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "63205680",
+  //     "stnm": "双林桥 ",
+  //     "title": "双林桥 ",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.705375",
+  //     "lttd": "30.922552",
+  //     "shuxing": "预警站",
+  //     "xzqh": "江苏苏州",
+  //     "z": "3.05",
+  //     "q": "-1.666",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "63205670",
+  //     "stnm": "章湾圩公路桥",
+  //     "title": "章湾圩公路桥",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.756256",
+  //     "lttd": "30.978642",
+  //     "shuxing": "预警站",
+  //     "xzqh": "江苏苏州",
+  //     "z": "3.04",
+  //     "q": "-9.445",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "701T0001",
+  //     "stnm": "新安江水文实验站",
+  //     "title": "丁栅闸",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "120.9528",
+  //     "lttd": "31.018267",
+  //     "shuxing": "预警站",
+  //     "xzqh": "浙江嘉兴",
+  //     "z": "3.22",
+  //     "q": "-3.014",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "71501011",
+  //     "stnm": "双港",
+  //     "title": "马蹄岙电站",
+  //     "tm": "2024-10-28 00:00:00",
+  //     "lgtd": "118.91861",
+  //     "lttd": "27.61917",
+  //     "shuxing": null,
+  //     "xzqh": null,
+  //     "z": null,
+  //     "q": "12.69",
+  //     "drp": null,
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   },
+  //   {
+  //     "stcd": "71501010",
+  //     "stnm": "托溪水文站",
+  //     "title": "托溪水文站",
+  //     "tm": "2024-10-30 14:00:00",
+  //     "lgtd": "119.354764",
+  //     "lttd": "27.491128",
+  //     "shuxing": null,
+  //     "xzqh": "福建宁德",
+  //     "z": "1.58",
+  //     "q": "2",
+  //     "drp": "0",
+  //     "dyp": null,
+  //     "stjl": null,
+  //     "xsa": null,
+  //     "xsavv": null,
+  //     "xsmxv": null,
+  //     "flwchrcd": null,
+  //     "wptn": null,
+  //     "msqmt": null,
+  //     "msamt": null,
+  //     "msvmt": null,
+  //     "grz": null,
+  //     "wrz": null,
+  //     "avz": null,
+  //     "avq": null,
+  //     "maxz": null,
+  //     "minz": null,
+  //     "maxq": null,
+  //     "minq": null,
+  //     "maxztm": null,
+  //     "minztm": null,
+  //     "maxqtm": null,
+  //     "minqtm": null,
+  //     "day": null,
+  //     "mnth": null,
+  //     "ohmaxr": null,
+  //     "ohbgtm": null,
+  //     "twhmaxr": null,
+  //     "shmaxr": null,
+  //     "shbgtm": null,
+  //     "twemaxr": null,
+  //     "twbgtm": null,
+  //     "odbgtm": null,
+  //     "tedmaxr": null,
+  //     "tedbgtm": null,
+  //     "odmaxr": null,
+  //     "mydavz": null,
+  //     "mydavq": null,
+  //     "swz": null
+  //   }
+  // ])
+}

+ 17 - 0
src/layout/components/AppMain.vue

@@ -0,0 +1,17 @@
+<script setup>
+import {useRoute} from "vue-router";
+import {computed} from "vue";
+
+const route = useRoute();
+
+const key = computed(() => {
+  return route.path + Math.random();
+});
+</script>
+<template>
+  <section ref="appMain" class="app-main">
+    <router-view :key="key" v-slot="{ Component, route }">
+      <component :is="Component" :key="route.fullPath"/>
+    </router-view>
+  </section>
+</template>

+ 24 - 0
src/layout/components/Navbar.vue

@@ -0,0 +1,24 @@
+<template>
+  <header>
+    <h1>福建水利监管工作平台</h1>
+  </header>
+</template>
+<script setup>
+import {onMounted, onUnmounted} from 'vue'
+
+
+onMounted(() => {
+})
+onUnmounted(() => {
+})
+
+</script>
+<style lang="scss" scoped>
+/* 头部样式 */
+header {
+  background-color: #007BFF;
+  color: white;
+  text-align: center;
+  padding: 20px;
+}
+</style>

+ 2 - 0
src/layout/components/index.js

@@ -0,0 +1,2 @@
+export {default as AppMain} from './AppMain.vue'
+export {default as Navbar} from './Navbar.vue'

+ 43 - 0
src/layout/index.vue

@@ -0,0 +1,43 @@
+<template>
+  <div :style="{ '--current-color': theme }" class="app-wrapper">
+    <div class="main-container">
+      <!-- 顶部 -->
+      <navbar/>
+      <!-- 展示页 -->
+      <app-main/>
+    </div>
+  </div>
+</template>
+<script setup>
+import {AppMain, Navbar} from '@/layout/components/index.js'
+</script>
+<style lang="scss" scoped>
+.app-wrapper {
+  height: 100%;
+  width: 100%;
+  pointer-events: none;
+
+  .main-container {
+    width: 100%;
+    height: 100%;
+    position: relative;
+
+    .app-main {
+      position: absolute;
+      top: 8vh;
+      left: 0;
+      width: 100%;
+      height: 92vh;
+    }
+  }
+
+  .floor-container {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+  }
+
+}
+</style>

+ 7 - 4
src/main.js

@@ -1,7 +1,10 @@
-import { createApp } from 'vue';
+import {createApp} from 'vue';
 import App from './App.vue';
 import router from './router';
+import {IonicVue} from '@ionic/vue';
 
-const app = createApp(App);
-app.use(router);
-app.mount('#app');
+const app = createApp(App).use(IonicVue).use(router);
+
+router.isReady().then(() => {
+    app.mount('#app');
+});

+ 19 - 15
src/router/index.js

@@ -1,25 +1,29 @@
-import { createRouter, createWebHistory } from 'vue-router';
-import HomeView from '../views/HomeView.vue';
-import AboutView from '../views/AboutView.vue';
+import {createRouter, createWebHistory} from '@ionic/vue-router';
+import layout from '@/layout/index.vue'
 
 const routes = [
     {
         path: '/',
-        name: 'Home',
-        component: HomeView
+        redirect: '/index',
+        component: layout,
+        children: [
+            {
+                path: 'index',
+                name: 'home',
+                component: () => import('@/views/HomeView.vue'),
+            },
+            {
+                path: 'about',
+                name: 'about',
+                component: () => import('@/views/AboutView.vue'),
+            },
+        ],
     },
-    {
-        path: '/about',
-        name: 'About',
-        component: AboutView
-    }
 ];
 
-// 硬编码 BASE_URL
-const baseUrl = '/';
 const router = createRouter({
-    history: createWebHistory(baseUrl),
-    routes
+    history: createWebHistory(process.env.BASE_URL),
+    routes,
 });
 
-export default router;
+export default router;

+ 17 - 0
src/utils/auth.js

@@ -0,0 +1,17 @@
+import {useCookies} from "vue3-cookies";
+
+const {cookies} = useCookies();
+const TokenKey = 'Admin-Token'
+
+export function getToken() {
+  return cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+  // 12小时过期
+  cookies.set(TokenKey, token, 60 * 60 * 12)
+}
+
+export function removeToken() {
+  return cookies.remove(TokenKey)
+}

+ 17 - 0
src/utils/errorCode.js

@@ -0,0 +1,17 @@
+const errorCode = {
+    '401': '认证失败,无法访问系统资源',
+    '403': '当前操作没有权限',
+    '404': '访问资源不存在',
+    'default': '系统未知错误,请反馈给管理员'
+}
+
+function getErrorMessage(code) {
+    if (errorCode[code]) {
+        return errorCode[code]
+    }
+
+    return '系统未知错误,请反馈给管理员';
+}
+
+export {getErrorMessage}
+

+ 112 - 0
src/utils/request.js

@@ -0,0 +1,112 @@
+import axios from "axios";
+import {getToken} from "@/utils/auth";
+import {getErrorMessage} from "@/utils/errorCode";
+import {validURL} from "@/utils/validate";
+import {ElMessage, ElMessageBox} from 'element-plus'
+
+axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
+// 创建axios实例
+const service = axios.create({
+    // axios中请求配置有baseURL选项,表示请求URL公共部分
+    // baseURL: process.env.BASE_API,
+    // 超时
+    timeout: 10000,
+});
+// request拦截器
+service.interceptors.request.use(
+    (config) => {
+        if (
+            !config.url.startsWith("/tbazmw_api") &&
+            !config.url.startsWith("/gx_api") &&
+            !validURL(config.url)
+        ) {
+            config.url = process.env.BASE_API + config.url;
+        }
+        // 是否需要设置 token
+        const isToken = (config.headers || {}).isToken === false;
+        if (getToken() && !isToken) {
+            config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
+        }
+        // get请求映射params参数
+        if (config.method === "get" && config.params) {
+            let url = config.url + "?";
+            for (const propName of Object.keys(config.params)) {
+                const value = config.params[propName];
+                var part = encodeURIComponent(propName) + "=";
+                if (value !== null && typeof value !== "undefined") {
+                    if (typeof value === "object") {
+                        for (const key of Object.keys(value)) {
+                            if (value[key] !== null && typeof value[key] !== "undefined") {
+                                let params = propName + "[" + key + "]";
+                                let subPart = encodeURIComponent(params) + "=";
+                                url += subPart + encodeURIComponent(value[key]) + "&";
+                            }
+                        }
+                    } else {
+                        url += part + encodeURIComponent(value) + "&";
+                    }
+                }
+            }
+            url = url.slice(0, -1);
+            config.params = {};
+            config.url = url;
+        }
+        return config;
+    },
+    (error) => {
+        console.log(error);
+        Promise.reject(error);
+    }
+);
+
+// 响应拦截器
+service.interceptors.response.use(
+    (res) => {
+        // 未设置状态码则默认成功状态
+        const code = res.data.code || 200;
+        // 查询错误信息
+        const msg = res.data.msg || getErrorMessage(code);
+        if (code === 401) {
+            ElMessageBox.confirm(
+                "登录状态已过期,您可以继续留在该页面,或者重新登录",
+                "系统提示",
+                {
+                    confirmButtonText: "重新登录",
+                    cancelButtonText: "取消",
+                    type: "warning",
+                }
+            )
+                .then(() => {
+                    // store.dispatch("LogOut").then(() => {
+                    //   location.href = "/login";
+                    // });
+                })
+                .catch(() => {
+                });
+            return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
+        } else if (code === 500) {
+            ElMessage({message: msg, type: 'error'})
+            return Promise.reject(msg)
+        } else if (code === 601) {
+            ElMessage({message: msg, type: 'error'})
+            return Promise.reject('error')
+        } else if (code !== 0 && code !== 200) {
+            return Promise.reject(msg);
+        } else {
+            return Promise.resolve(res.data);
+        }
+    },
+    (error) => {
+        let {message} = error;
+        if (message === "Network Error") {
+            message = "后端接口连接异常";
+        } else if (message.includes("timeout")) {
+            message = "系统接口请求超时";
+        } else if (message.includes("Request failed with status code")) {
+            message = "系统接口" + message.substr(message.length - 3) + "异常";
+        }
+        return Promise.reject(error);
+    }
+);
+
+export default service;

+ 109 - 0
src/utils/validate.js

@@ -0,0 +1,109 @@
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+  return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+  const valid_map = ['admin', 'editor']
+  return valid_map.indexOf(str.trim()) >= 0
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+  const reg = /^(https?|http|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+  return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+  const reg = /^[a-z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+  const reg = /^[A-Z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+  const reg = /^[A-Za-z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+  return reg.test(email)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+  if (typeof str === 'string' || str instanceof String) {
+    return true
+  }
+  return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+  if (typeof Array.isArray === 'undefined') {
+    return Object.prototype.toString.call(arg) === '[object Array]'
+  }
+  return Array.isArray(arg)
+}
+
+/**
+ * @param {String} arg
+ * @returns {Boolean}
+ */
+export function isJson(arg) {
+  try {
+    JSON.parse(arg);
+    return true;
+  } catch (e) {
+    return false;
+  }
+}
+
+/**
+ *判断是否是数字
+ * @param {String} val
+ * @returns {Boolean}
+ */
+export function isNumber(val) {
+  // isNaN()函数 把空串 空格 以及NUll 按照0来处理 所以先去除,
+  if (val === "" || val == null) {
+    return false;
+  }
+  return !isNaN(val);
+}

+ 38 - 2
vue.config.js

@@ -1,4 +1,40 @@
-const { defineConfig } = require('@vue/cli-service')
+const {defineConfig} = require('@vue/cli-service')
+
+const port = process.env.port || process.env.npm_config_port || 80; // 端口
+
 module.exports = defineConfig({
-  transpileDependencies: true
+    // 部署生产环境和开发环境下的URL。
+    // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上。
+    // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
+    publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
+    // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
+    outputDir: "dist",
+    // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
+    assetsDir: "static",
+    // 是否开启eslint保存检测,有效值:ture | false | 'error'
+    lintOnSave: process.env.NODE_ENV === "development",
+    // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
+    productionSourceMap: false,
+    transpileDependencies: true,
+    devServer: {
+        host: "0.0.0.0",
+        port: port,
+        proxy: {
+            '/base_api': {
+                target: 'http://localhost:3000', // 你的后端服务器地址
+                changeOrigin: true, // 需要虚拟托管站点
+                pathRewrite: {
+                    '^/base_api': '' // 移除路径中的/api前缀
+                }
+            }
+        }
+    },
+    css: {
+        loaderOptions: {
+            sass: {
+                // additionalData: `@import "@/assets/styles/index.scss";`, // 不同版本的 sass,此属性不同:data、prependData、additionalData
+                sassOptions: {outputStyle: 'expanded'} // fix: 解决 element-ui 图标 icon 偶现乱码问题
+            }
+        }
+    },
 })