Bläddra i källkod

日管控页面

zhaoqi 6 månader sedan
förälder
incheckning
c91f691410

+ 2 - 1
yudao-ui-admin-vue3/.env.dev

@@ -4,7 +4,8 @@ NODE_ENV=production
 VITE_DEV=true
 
 # 请求路径
-VITE_BASE_URL='https://youdao.hofo.co'
+# VITE_BASE_URL='https://youdao.hofo.co'
+VITE_BASE_URL='http://gzsuoyou.daas.net.cn'
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server

+ 103 - 142
yudao-ui-admin-vue3/package-lock.json

@@ -9,7 +9,7 @@
       "version": "2.4.0-snapshot",
       "license": "MIT",
       "dependencies": {
-        "@element-plus/icons-vue": "^2.1.0",
+        "@element-plus/icons-vue": "^2.3.2",
         "@form-create/designer": "^3.2.6",
         "@form-create/element-ui": "^3.2.11",
         "@grapecity-software/spread-excelio": "^18.0.4",
@@ -31,6 +31,7 @@
         "@iconify/iconify": "^3.1.1",
         "@microsoft/fetch-event-source": "^2.0.1",
         "@videojs-player/vue": "^1.0.0",
+        "@vue-office/docx": "^1.6.3",
         "@vueuse/core": "^10.9.0",
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^5.1.10",
@@ -43,6 +44,7 @@
         "cropperjs": "^1.6.1",
         "crypto-js": "^4.2.0",
         "dayjs": "^1.11.13",
+        "decimal.js": "^10.6.0",
         "diagram-js": "^12.8.0",
         "drawio-embed": "^1.0.2",
         "driver.js": "^1.3.1",
@@ -62,16 +64,19 @@
         "min-dash": "^4.1.1",
         "mitt": "^3.0.1",
         "nprogress": "^0.2.0",
+        "pdf-lib": "^1.17.1",
         "pinia": "^2.1.7",
         "pinia-plugin-persistedstate": "^3.2.1",
         "qrcode": "^1.5.3",
         "qs": "^6.12.0",
-        "sortablejs": "^1.15.3",
+        "sortablejs": "^1.15.6",
         "spark-md5": "^3.0.2",
         "steady-xml": "^0.1.0",
         "url": "^0.11.3",
         "video.js": "^7.21.5",
         "vue": "3.5.12",
+        "vue-cropper": "^1.1.4",
+        "vue-demi": "^0.14.10",
         "vue-dompurify-html": "^4.1.4",
         "vue-i18n": "9.10.2",
         "vue-pdf-embed": "^2.1.2",
@@ -92,6 +97,7 @@
         "@types/nprogress": "^0.2.3",
         "@types/qrcode": "^1.5.5",
         "@types/qs": "^6.9.12",
+        "@types/sortablejs": "^1.15.8",
         "@typescript-eslint/eslint-plugin": "^7.1.0",
         "@typescript-eslint/parser": "^7.1.0",
         "@unocss/eslint-config": "^0.57.4",
@@ -2198,9 +2204,10 @@
       }
     },
     "node_modules/@element-plus/icons-vue": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
-      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
+      "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
+      "license": "MIT",
       "peerDependencies": {
         "vue": "^3.2.0"
       }
@@ -3982,6 +3989,24 @@
         "url": "https://opencollective.com/parcel"
       }
     },
+    "node_modules/@pdf-lib/standard-fonts": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz",
+      "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "^1.0.6"
+      }
+    },
+    "node_modules/@pdf-lib/upng": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/@pdf-lib/upng/-/upng-1.0.1.tgz",
+      "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "^1.0.10"
+      }
+    },
     "node_modules/@pkgjs/parseargs": {
       "version": "0.11.0",
       "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -4907,6 +4932,13 @@
       "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
       "dev": true
     },
+    "node_modules/@types/sortablejs": {
+      "version": "1.15.8",
+      "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+      "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/@types/svgo": {
       "version": "2.6.4",
       "resolved": "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz",
@@ -6199,6 +6231,23 @@
         "path-browserify": "^1.0.1"
       }
     },
+    "node_modules/@vue-office/docx": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npmmirror.com/@vue-office/docx/-/docx-1.6.3.tgz",
+      "integrity": "sha512-Cs+3CAaRBOWOiW4XAhTwwxJ0dy8cPIf6DqfNvYcD3YACiLwO4kuawLF2IAXxyijhbuOeoFsfvoVbOc16A/4bZA==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "@vue/composition-api": "^1.7.1",
+        "vue": "^2.0.0 || >=3.0.0",
+        "vue-demi": "^0.14.6"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@vue/babel-helper-vue-transform-on": {
       "version": "1.2.5",
       "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
@@ -6437,31 +6486,6 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
-    "node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/@vueuse/metadata": {
       "version": "10.11.1",
       "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.11.1.tgz",
@@ -6481,31 +6505,6 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
-    "node_modules/@vueuse/shared/node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/@wangeditor/basic-modules": {
       "version": "1.1.7",
       "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
@@ -8851,6 +8850,12 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/decimal.js": {
+      "version": "10.6.0",
+      "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz",
+      "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+      "license": "MIT"
+    },
     "node_modules/decode-uri-component": {
       "version": "0.2.2",
       "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
@@ -9278,31 +9283,6 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
-    "node_modules/element-plus/node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/element-plus/node_modules/@vueuse/metadata": {
       "version": "9.13.0",
       "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
@@ -9322,31 +9302,6 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
-    "node_modules/element-plus/node_modules/@vueuse/shared/node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/emoji-regex": {
       "version": "9.2.2",
       "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -14013,6 +13968,12 @@
       "integrity": "sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==",
       "dev": true
     },
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "license": "(MIT AND Zlib)"
+    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
@@ -14153,6 +14114,24 @@
       "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
       "dev": true
     },
+    "node_modules/pdf-lib": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmmirror.com/pdf-lib/-/pdf-lib-1.17.1.tgz",
+      "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==",
+      "license": "MIT",
+      "dependencies": {
+        "@pdf-lib/standard-fonts": "^1.0.0",
+        "@pdf-lib/upng": "^1.0.1",
+        "pako": "^1.0.11",
+        "tslib": "^1.11.1"
+      }
+    },
+    "node_modules/pdf-lib/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "license": "0BSD"
+    },
     "node_modules/pdfjs-dist": {
       "version": "4.10.38",
       "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz",
@@ -14229,31 +14208,6 @@
         "pinia": "^2.0.0"
       }
     },
-    "node_modules/pinia/node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/pkcs7": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/pkcs7/-/pkcs7-1.0.4.tgz",
@@ -18612,23 +18566,18 @@
         }
       }
     },
-    "node_modules/vue-dompurify-html": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmmirror.com/vue-dompurify-html/-/vue-dompurify-html-4.1.4.tgz",
-      "integrity": "sha512-K0XDSZA4dmMMvAgW8yaCx1kAYQldmgXeHJaLPS0mlSKOu8B+onE06X4KfB5LGyX4jR3rlVosyWJczRBzR0sZ/g==",
-      "dependencies": {
-        "dompurify": "^3.0.0",
-        "vue-demi": "^0.14.0"
-      },
-      "peerDependencies": {
-        "vue": "^2.7.0 || ^3.0.0"
-      }
+    "node_modules/vue-cropper": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/vue-cropper/-/vue-cropper-1.1.4.tgz",
+      "integrity": "sha512-5m98vBsCEI9rbS4JxELxXidtAui3qNyTHLHg67Qbn7g8cg+E6LcnC+hh3SM/p94x6mFh6KRxT1ttnta+wCYqWA==",
+      "license": "ISC"
     },
-    "node_modules/vue-dompurify-html/node_modules/vue-demi": {
+    "node_modules/vue-demi": {
       "version": "0.14.10",
       "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
       "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
       "hasInstallScript": true,
+      "license": "MIT",
       "bin": {
         "vue-demi-fix": "bin/vue-demi-fix.js",
         "vue-demi-switch": "bin/vue-demi-switch.js"
@@ -18649,6 +18598,18 @@
         }
       }
     },
+    "node_modules/vue-dompurify-html": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmmirror.com/vue-dompurify-html/-/vue-dompurify-html-4.1.4.tgz",
+      "integrity": "sha512-K0XDSZA4dmMMvAgW8yaCx1kAYQldmgXeHJaLPS0mlSKOu8B+onE06X4KfB5LGyX4jR3rlVosyWJczRBzR0sZ/g==",
+      "dependencies": {
+        "dompurify": "^3.0.0",
+        "vue-demi": "^0.14.0"
+      },
+      "peerDependencies": {
+        "vue": "^2.7.0 || ^3.0.0"
+      }
+    },
     "node_modules/vue-eslint-parser": {
       "version": "9.4.3",
       "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",

+ 1 - 1
yudao-ui-admin-vue3/package.json

@@ -26,7 +26,7 @@
     "lint:lint-staged": "lint-staged -c"
   },
   "dependencies": {
-    "@element-plus/icons-vue": "^2.1.0",
+    "@element-plus/icons-vue": "^2.3.2",
     "@form-create/designer": "^3.2.6",
     "@form-create/element-ui": "^3.2.11",
     "@grapecity-software/spread-excelio": "^18.0.4",

+ 4 - 2
yudao-ui-admin-vue3/src/main.ts

@@ -41,11 +41,13 @@ import '@/plugins/tongji' // 百度统计
 import Logger from '@/utils/Logger'
 import drawioEmbed from 'drawio-embed';
 import VueDOMPurifyHTML from 'vue-dompurify-html' // 解决v-html 的安全隐患
-
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 // 创建实例
 const setupAll = async () => {
   const app = createApp(App)
-
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component)
+}
   await setupI18n(app)
 
   setupStore(app)

+ 1 - 0
yudao-ui-admin-vue3/src/views/Login/components/LoginForm.vue

@@ -125,6 +125,7 @@ const loginData = reactive({
 
 // 获取验证码
 const getCode = async () => {
+  // await handleLogin({})
   // 情况一,未开启:则直接登录
   if (loginData.captchaEnable === 'false') {
     await handleLogin({})

+ 200 - 0
yudao-ui-admin-vue3/src/views/dataManagement/Index.vue

@@ -0,0 +1,200 @@
+<template>
+  <div>1111</div>
+</template>
+<script lang="ts" setup>
+import { set } from 'lodash-es'
+import { EChartsOption } from 'echarts'
+import { formatTime } from '@/utils'
+
+import { useUserStore } from '@/store/modules/user'
+// import { useWatermark } from '@/hooks/web/useWatermark'
+import type { WorkplaceTotal, Project, Notice, Shortcut } from './types'
+import { pieOptions, barOptions } from './echarts-data'
+import { useRouter } from 'vue-router'
+
+defineOptions({ name: 'Index' })
+
+const { t } = useI18n()
+const router = useRouter()
+const userStore = useUserStore()
+// const { setWatermark } = useWatermark()
+const loading = ref(true)
+const avatar = userStore.getUser.avatar
+const username = userStore.getUser.nickname
+const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
+// 获取统计数
+let totalSate = reactive<WorkplaceTotal>({
+  project: 0,
+  access: 0,
+  todo: 0
+})
+
+const getCount = async () => {
+  const data = {
+    project: 40,
+    access: 2340,
+    todo: 10
+  }
+  totalSate = Object.assign(totalSate, data)
+}
+
+// 获取项目数
+let projects = reactive<Project[]>([])
+const getProject = async () => {
+  const data = [
+    {
+      name: 'ruoyi-vue-pro',
+      icon: 'simple-icons:springboot',
+      message: 'github.com/YunaiV/ruoyi-vue-pro',
+      personal: 'Spring Boot 单体架构',
+      time: new Date('2025-01-02'),
+      color: '#6DB33F'
+    },
+    {
+      name: 'yudao-ui-admin-vue3',
+      icon: 'ep:element-plus',
+      message: 'github.com/yudaocode/yudao-ui-admin-vue3',
+      personal: 'Vue3 + element-plus 管理后台',
+      time: new Date('2025-02-03'),
+      color: '#409EFF'
+    },
+    {
+      name: 'yudao-ui-mall-uniapp',
+      icon: 'icon-park-outline:mall-bag',
+      message: 'github.com/yudaocode/yudao-ui-mall-uniapp',
+      personal: 'Vue3 + uniapp 商城手机端',
+      time: new Date('2025-03-04'),
+      color: '#ff4d4f'
+    },
+    {
+      name: 'yudao-cloud',
+      icon: 'material-symbols:cloud-outline',
+      message: 'github.com/YunaiV/yudao-cloud',
+      personal: 'Spring Cloud 微服务架构',
+      time: new Date('2025-04-05'),
+      color: '#1890ff'
+    },
+    {
+      name: 'yudao-ui-admin-vben',
+      icon: 'devicon:antdesign',
+      message: 'github.com/yudaocode/yudao-ui-admin-vben',
+      personal: 'Vue3 + vben5(antd) 管理后台',
+      time: new Date('2025-05-06'),
+      color: '#e18525'
+    },
+    {
+      name: 'yudao-ui-admin-uniapp',
+      icon: 'ant-design:mobile',
+      message: 'github.com/yudaocode/yudao-ui-admin-uniapp',
+      personal: 'Vue3 + uniapp 管理手机端',
+      time: new Date('2025-06-01'),
+      color: '#2979ff'
+    }
+  ]
+  projects = Object.assign(projects, data)
+}
+
+// 获取通知公告
+let notice = reactive<Notice[]>([])
+const getNotice = async () => {
+  const data = [
+    {
+      title: '系统支持 JDK 8/17/21,Vue 2/3',
+      type: '技术兼容性',
+      keys: ['JDK', 'Vue'],
+      date: new Date()
+    },
+    {
+      title: '后端提供 Spring Boot 2.7/3.2 + Cloud 双架构',
+      type: '架构灵活性',
+      keys: ['Boot', 'Cloud'],
+      date: new Date()
+    },
+    {
+      title: '个人与企业可 100% 直接使用,无需授权',
+      type: '免授权',
+      keys: ['无需授权'],
+      date: new Date()
+    },
+    {
+      title: '国内使用最广泛的快速开发平台,远超 10w+ 企业使用',
+      type: '广泛企业认可',
+      keys: ['最广泛', '10w+'],
+      date: new Date()
+    }
+  ]
+  notice = Object.assign(notice, data)
+}
+
+// 获取快捷入口
+
+// 用户来源
+const getUserAccessSource = async () => {
+  const data = [
+    { value: 335, name: 'analysis.directAccess' },
+    { value: 310, name: 'analysis.mailMarketing' },
+    { value: 234, name: 'analysis.allianceAdvertising' },
+    { value: 135, name: 'analysis.videoAdvertising' },
+    { value: 1548, name: 'analysis.searchEngines' }
+  ]
+  set(
+    pieOptionsData,
+    'legend.data',
+    data.map((v) => t(v.name))
+  )
+  pieOptionsData!.series![0].data = data.map((v) => {
+    return {
+      name: t(v.name),
+      value: v.value
+    }
+  })
+}
+const barOptionsData = reactive<EChartsOption>(barOptions) as EChartsOption
+
+// 周活跃量
+const getWeeklyUserActivity = async () => {
+  const data = [
+    { value: 13253, name: 'analysis.monday' },
+    { value: 34235, name: 'analysis.tuesday' },
+    { value: 26321, name: 'analysis.wednesday' },
+    { value: 12340, name: 'analysis.thursday' },
+    { value: 24643, name: 'analysis.friday' },
+    { value: 1322, name: 'analysis.saturday' },
+    { value: 1324, name: 'analysis.sunday' }
+  ]
+  set(
+    barOptionsData,
+    'xAxis.data',
+    data.map((v) => t(v.name))
+  )
+  set(barOptionsData, 'series', [
+    {
+      name: t('analysis.activeQuantity'),
+      data: data.map((v) => v.value),
+      type: 'bar'
+    }
+  ])
+}
+
+const getAllApi = async () => {
+  await Promise.all([
+    getCount(),
+    getProject(),
+    getNotice(),
+    getShortcut(),
+    getUserAccessSource(),
+    getWeeklyUserActivity()
+  ])
+  loading.value = false
+}
+
+const handleProjectClick = (message: string) => {
+  window.open(`https://${message}`, '_blank')
+}
+
+const handleShortcutClick = (url: string) => {
+  router.push(url)
+}
+
+getAllApi()
+</script>

+ 308 - 0
yudao-ui-admin-vue3/src/views/dataManagement/echarts-data.ts

@@ -0,0 +1,308 @@
+import { EChartsOption } from 'echarts'
+
+const { t } = useI18n()
+
+export const lineOptions: EChartsOption = {
+  title: {
+    text: t('analysis.monthlySales'),
+    left: 'center'
+  },
+  xAxis: {
+    data: [
+      t('analysis.january'),
+      t('analysis.february'),
+      t('analysis.march'),
+      t('analysis.april'),
+      t('analysis.may'),
+      t('analysis.june'),
+      t('analysis.july'),
+      t('analysis.august'),
+      t('analysis.september'),
+      t('analysis.october'),
+      t('analysis.november'),
+      t('analysis.december')
+    ],
+    boundaryGap: false,
+    axisTick: {
+      show: false
+    }
+  },
+  grid: {
+    left: 20,
+    right: 20,
+    bottom: 20,
+    top: 80,
+    containLabel: true
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'cross'
+    },
+    padding: [5, 10]
+  },
+  yAxis: {
+    axisTick: {
+      show: false
+    }
+  },
+  legend: {
+    data: [t('analysis.estimate'), t('analysis.actual')],
+    top: 50
+  },
+  series: [
+    {
+      name: t('analysis.estimate'),
+      smooth: true,
+      type: 'line',
+      data: [100, 120, 161, 134, 105, 160, 165, 114, 163, 185, 118, 123],
+      animationDuration: 2800,
+      animationEasing: 'cubicInOut'
+    },
+    {
+      name: t('analysis.actual'),
+      smooth: true,
+      type: 'line',
+      itemStyle: {},
+      data: [120, 82, 91, 154, 162, 140, 145, 250, 134, 56, 99, 123],
+      animationDuration: 2800,
+      animationEasing: 'quadraticOut'
+    }
+  ]
+}
+
+export const pieOptions: EChartsOption = {
+  title: {
+    text: t('analysis.userAccessSource'),
+    left: 'center'
+  },
+  tooltip: {
+    trigger: 'item',
+    formatter: '{a} <br/>{b} : {c} ({d}%)'
+  },
+  legend: {
+    orient: 'vertical',
+    left: 'left',
+    data: [
+      t('analysis.directAccess'),
+      t('analysis.mailMarketing'),
+      t('analysis.allianceAdvertising'),
+      t('analysis.videoAdvertising'),
+      t('analysis.searchEngines')
+    ]
+  },
+  series: [
+    {
+      name: t('analysis.userAccessSource'),
+      type: 'pie',
+      radius: '55%',
+      center: ['50%', '60%'],
+      data: [
+        { value: 335, name: t('analysis.directAccess') },
+        { value: 310, name: t('analysis.mailMarketing') },
+        { value: 234, name: t('analysis.allianceAdvertising') },
+        { value: 135, name: t('analysis.videoAdvertising') },
+        { value: 1548, name: t('analysis.searchEngines') }
+      ]
+    }
+  ]
+}
+
+export const barOptions: EChartsOption = {
+  title: {
+    text: t('analysis.weeklyUserActivity'),
+    left: 'center'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: 50,
+    right: 20,
+    bottom: 20
+  },
+  xAxis: {
+    type: 'category',
+    data: [
+      t('analysis.monday'),
+      t('analysis.tuesday'),
+      t('analysis.wednesday'),
+      t('analysis.thursday'),
+      t('analysis.friday'),
+      t('analysis.saturday'),
+      t('analysis.sunday')
+    ],
+    axisTick: {
+      alignWithLabel: true
+    }
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      name: t('analysis.activeQuantity'),
+      data: [13253, 34235, 26321, 12340, 24643, 1322, 1324],
+      type: 'bar'
+    }
+  ]
+}
+
+export const radarOption: EChartsOption = {
+  legend: {
+    data: [t('workplace.personal'), t('workplace.team')]
+  },
+  radar: {
+    // shape: 'circle',
+    indicator: [
+      { name: t('workplace.quote'), max: 65 },
+      { name: t('workplace.contribution'), max: 160 },
+      { name: t('workplace.hot'), max: 300 },
+      { name: t('workplace.yield'), max: 130 },
+      { name: t('workplace.follow'), max: 100 }
+    ]
+  },
+  series: [
+    {
+      name: `xxx${t('workplace.index')}`,
+      type: 'radar',
+      data: [
+        {
+          value: [42, 30, 20, 35, 80],
+          name: t('workplace.personal')
+        },
+        {
+          value: [50, 140, 290, 100, 90],
+          name: t('workplace.team')
+        }
+      ]
+    }
+  ]
+}
+
+export const wordOptions = {
+  series: [
+    {
+      type: 'wordCloud',
+      gridSize: 2,
+      sizeRange: [12, 50],
+      rotationRange: [-90, 90],
+      shape: 'pentagon',
+      width: 600,
+      height: 400,
+      drawOutOfBound: true,
+      textStyle: {
+        color: function () {
+          return (
+            'rgb(' +
+            [
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160)
+            ].join(',') +
+            ')'
+          )
+        }
+      },
+      emphasis: {
+        textStyle: {
+          shadowBlur: 10,
+          shadowColor: '#333'
+        }
+      },
+      data: [
+        {
+          name: 'Sam S Club',
+          value: 10000,
+          textStyle: {
+            color: 'black'
+          },
+          emphasis: {
+            textStyle: {
+              color: 'red'
+            }
+          }
+        },
+        {
+          name: 'Macys',
+          value: 6181
+        },
+        {
+          name: 'Amy Schumer',
+          value: 4386
+        },
+        {
+          name: 'Jurassic World',
+          value: 4055
+        },
+        {
+          name: 'Charter Communications',
+          value: 2467
+        },
+        {
+          name: 'Chick Fil A',
+          value: 2244
+        },
+        {
+          name: 'Planet Fitness',
+          value: 1898
+        },
+        {
+          name: 'Pitch Perfect',
+          value: 1484
+        },
+        {
+          name: 'Express',
+          value: 1112
+        },
+        {
+          name: 'Home',
+          value: 965
+        },
+        {
+          name: 'Johnny Depp',
+          value: 847
+        },
+        {
+          name: 'Lena Dunham',
+          value: 582
+        },
+        {
+          name: 'Lewis Hamilton',
+          value: 555
+        },
+        {
+          name: 'KXAN',
+          value: 550
+        },
+        {
+          name: 'Mary Ellen Mark',
+          value: 462
+        },
+        {
+          name: 'Farrah Abraham',
+          value: 366
+        },
+        {
+          name: 'Rita Ora',
+          value: 360
+        },
+        {
+          name: 'Serena Williams',
+          value: 282
+        },
+        {
+          name: 'NCAA baseball tournament',
+          value: 273
+        },
+        {
+          name: 'Point Break',
+          value: 265
+        }
+      ]
+    }
+  ]
+}

+ 308 - 0
yudao-ui-admin-vue3/src/views/dataManagement/equipment/echarts-data.ts

@@ -0,0 +1,308 @@
+import { EChartsOption } from 'echarts'
+
+const { t } = useI18n()
+
+export const lineOptions: EChartsOption = {
+  title: {
+    text: t('analysis.monthlySales'),
+    left: 'center'
+  },
+  xAxis: {
+    data: [
+      t('analysis.january'),
+      t('analysis.february'),
+      t('analysis.march'),
+      t('analysis.april'),
+      t('analysis.may'),
+      t('analysis.june'),
+      t('analysis.july'),
+      t('analysis.august'),
+      t('analysis.september'),
+      t('analysis.october'),
+      t('analysis.november'),
+      t('analysis.december')
+    ],
+    boundaryGap: false,
+    axisTick: {
+      show: false
+    }
+  },
+  grid: {
+    left: 20,
+    right: 20,
+    bottom: 20,
+    top: 80,
+    containLabel: true
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'cross'
+    },
+    padding: [5, 10]
+  },
+  yAxis: {
+    axisTick: {
+      show: false
+    }
+  },
+  legend: {
+    data: [t('analysis.estimate'), t('analysis.actual')],
+    top: 50
+  },
+  series: [
+    {
+      name: t('analysis.estimate'),
+      smooth: true,
+      type: 'line',
+      data: [100, 120, 161, 134, 105, 160, 165, 114, 163, 185, 118, 123],
+      animationDuration: 2800,
+      animationEasing: 'cubicInOut'
+    },
+    {
+      name: t('analysis.actual'),
+      smooth: true,
+      type: 'line',
+      itemStyle: {},
+      data: [120, 82, 91, 154, 162, 140, 145, 250, 134, 56, 99, 123],
+      animationDuration: 2800,
+      animationEasing: 'quadraticOut'
+    }
+  ]
+}
+
+export const pieOptions: EChartsOption = {
+  title: {
+    text: t('analysis.userAccessSource'),
+    left: 'center'
+  },
+  tooltip: {
+    trigger: 'item',
+    formatter: '{a} <br/>{b} : {c} ({d}%)'
+  },
+  legend: {
+    orient: 'vertical',
+    left: 'left',
+    data: [
+      t('analysis.directAccess'),
+      t('analysis.mailMarketing'),
+      t('analysis.allianceAdvertising'),
+      t('analysis.videoAdvertising'),
+      t('analysis.searchEngines')
+    ]
+  },
+  series: [
+    {
+      name: t('analysis.userAccessSource'),
+      type: 'pie',
+      radius: '55%',
+      center: ['50%', '60%'],
+      data: [
+        { value: 335, name: t('analysis.directAccess') },
+        { value: 310, name: t('analysis.mailMarketing') },
+        { value: 234, name: t('analysis.allianceAdvertising') },
+        { value: 135, name: t('analysis.videoAdvertising') },
+        { value: 1548, name: t('analysis.searchEngines') }
+      ]
+    }
+  ]
+}
+
+export const barOptions: EChartsOption = {
+  title: {
+    text: t('analysis.weeklyUserActivity'),
+    left: 'center'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: 50,
+    right: 20,
+    bottom: 20
+  },
+  xAxis: {
+    type: 'category',
+    data: [
+      t('analysis.monday'),
+      t('analysis.tuesday'),
+      t('analysis.wednesday'),
+      t('analysis.thursday'),
+      t('analysis.friday'),
+      t('analysis.saturday'),
+      t('analysis.sunday')
+    ],
+    axisTick: {
+      alignWithLabel: true
+    }
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      name: t('analysis.activeQuantity'),
+      data: [13253, 34235, 26321, 12340, 24643, 1322, 1324],
+      type: 'bar'
+    }
+  ]
+}
+
+export const radarOption: EChartsOption = {
+  legend: {
+    data: [t('workplace.personal'), t('workplace.team')]
+  },
+  radar: {
+    // shape: 'circle',
+    indicator: [
+      { name: t('workplace.quote'), max: 65 },
+      { name: t('workplace.contribution'), max: 160 },
+      { name: t('workplace.hot'), max: 300 },
+      { name: t('workplace.yield'), max: 130 },
+      { name: t('workplace.follow'), max: 100 }
+    ]
+  },
+  series: [
+    {
+      name: `xxx${t('workplace.index')}`,
+      type: 'radar',
+      data: [
+        {
+          value: [42, 30, 20, 35, 80],
+          name: t('workplace.personal')
+        },
+        {
+          value: [50, 140, 290, 100, 90],
+          name: t('workplace.team')
+        }
+      ]
+    }
+  ]
+}
+
+export const wordOptions = {
+  series: [
+    {
+      type: 'wordCloud',
+      gridSize: 2,
+      sizeRange: [12, 50],
+      rotationRange: [-90, 90],
+      shape: 'pentagon',
+      width: 600,
+      height: 400,
+      drawOutOfBound: true,
+      textStyle: {
+        color: function () {
+          return (
+            'rgb(' +
+            [
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160)
+            ].join(',') +
+            ')'
+          )
+        }
+      },
+      emphasis: {
+        textStyle: {
+          shadowBlur: 10,
+          shadowColor: '#333'
+        }
+      },
+      data: [
+        {
+          name: 'Sam S Club',
+          value: 10000,
+          textStyle: {
+            color: 'black'
+          },
+          emphasis: {
+            textStyle: {
+              color: 'red'
+            }
+          }
+        },
+        {
+          name: 'Macys',
+          value: 6181
+        },
+        {
+          name: 'Amy Schumer',
+          value: 4386
+        },
+        {
+          name: 'Jurassic World',
+          value: 4055
+        },
+        {
+          name: 'Charter Communications',
+          value: 2467
+        },
+        {
+          name: 'Chick Fil A',
+          value: 2244
+        },
+        {
+          name: 'Planet Fitness',
+          value: 1898
+        },
+        {
+          name: 'Pitch Perfect',
+          value: 1484
+        },
+        {
+          name: 'Express',
+          value: 1112
+        },
+        {
+          name: 'Home',
+          value: 965
+        },
+        {
+          name: 'Johnny Depp',
+          value: 847
+        },
+        {
+          name: 'Lena Dunham',
+          value: 582
+        },
+        {
+          name: 'Lewis Hamilton',
+          value: 555
+        },
+        {
+          name: 'KXAN',
+          value: 550
+        },
+        {
+          name: 'Mary Ellen Mark',
+          value: 462
+        },
+        {
+          name: 'Farrah Abraham',
+          value: 366
+        },
+        {
+          name: 'Rita Ora',
+          value: 360
+        },
+        {
+          name: 'Serena Williams',
+          value: 282
+        },
+        {
+          name: 'NCAA baseball tournament',
+          value: 273
+        },
+        {
+          name: 'Point Break',
+          value: 265
+        }
+      ]
+    }
+  ]
+}

+ 189 - 0
yudao-ui-admin-vue3/src/views/dataManagement/equipment/index.vue

@@ -0,0 +1,189 @@
+<template>
+  <div class="head-txt"> 数据中心 > 设备管理 </div>
+  <ContentWrap>
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="设备类型" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择启用状态"
+          class="!w-170px"
+          clearable
+        >
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="产品名称" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择启用状态"
+          class="!w-170px"
+          clearable
+        >
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="使用单位" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择启用状态"
+          class="!w-170px"
+          clearable
+        >
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery" type="primary"> 查询</el-button>
+        <el-button @click="resetQuery"> 重置</el-button>
+      </el-form-item>
+      <el-form-item :label-width="'100px'" label="使用登记时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-240px"
+        />
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" @selection-change="handleRowCheckboxChange">
+      <el-table-column label="序号" type="index" width="80" />
+      <el-table-column label="设备类型" align="center" prop="id" />
+      <el-table-column label="产品名称" align="center" prop="signature" />
+      <el-table-column label="设备代码" align="center" prop="signature" />
+      <el-table-column label="使用单位" align="center" prop="remark" />
+      <el-table-column
+        label="使用登记日期"
+        align="center"
+        prop="apiKey"
+        :show-overflow-tooltip="true"
+        width="180"
+      />
+
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['system:sms-channel:update']"
+          >
+            查看
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+</template>
+<script lang="ts" setup>
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { dateFormatter } from '@/utils/formatTime'
+import * as SmsChannelApi from '@/api/system/sms/smsChannel'
+
+defineOptions({ name: 'SystemSmsChannel' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const loading = ref(false) // 列表的加载中
+const total = ref(0) // 列表的总页数
+const list = ref([]) // 列表的数据
+const queryFormRef = ref() // 搜索的表单
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  signature: undefined,
+  status: undefined,
+  createTime: []
+})
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await SmsChannelApi.getSmsChannelPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+
+
+/** 批量删除按钮操作 */
+const checkedIds = ref<number[]>([])
+const handleRowCheckboxChange = (rows: SmsChannelApi.SmsChannelVO[]) => {
+  checkedIds.value = rows.map((row) => row.id)
+}
+
+
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style lang="scss" scoped>
+.head-txt {
+  width: 100%;
+  color: var(--el-text-color-placeholder);
+  background: #fff;
+  padding: 5px;
+  margin-bottom: 10px;
+  border-radius: 5px;
+}
+</style>

+ 57 - 0
yudao-ui-admin-vue3/src/views/dataManagement/equipment/types.ts

@@ -0,0 +1,57 @@
+export type WorkplaceTotal = {
+  project: number
+  access: number
+  todo: number
+}
+
+export type Project = {
+  name: string
+  icon: string
+  message: string
+  personal: string
+  time: Date | number | string
+  color: string
+}
+
+export type Notice = {
+  title: string
+  type: string
+  keys: string[]
+  date: Date | number | string
+}
+
+export type Shortcut = {
+  name: string
+  icon: string
+  url: string
+  color: string
+}
+
+export type RadarData = {
+  personal: number
+  team: number
+  max: number
+  name: string
+}
+export type AnalysisTotalTypes = {
+  users: number
+  messages: number
+  moneys: number
+  shoppings: number
+}
+
+export type UserAccessSource = {
+  value: number
+  name: string
+}
+
+export type WeeklyUserActivity = {
+  value: number
+  name: string
+}
+
+export type MonthlySales = {
+  name: string
+  estimate: number
+  actual: number
+}

+ 227 - 0
yudao-ui-admin-vue3/src/views/dataManagement/monitor/Index.vue

@@ -0,0 +1,227 @@
+<template>
+  <div class="head-txt"> 数据中心 > 设备监控 </div>
+  <div class="video-box">
+    <div class="box-lf">
+      <div class="but-box">
+        <el-button class="but">客运索道设备</el-button>
+        <el-button class="but">大型游乐设施</el-button>
+      </div>
+      <el-input v-model="input" placeholder="请输入设备名称" />
+
+      <div class="region-box">
+        <el-tree
+          :data="data"
+          :disable-branch-nodes="true"
+          :props="defaultProps"
+          @current-change="handleNodeClick"
+        />
+      </div>
+    </div>
+    <div class="box-rg">
+      <div>{{ equipmentName }}</div>
+
+      <div class="video-div">
+        <div class="video-container"> </div>
+        <div class="video-container"> </div>
+      </div>
+
+      <div class="DeviceInformation">
+        <div class="DeviceInformation-lf">
+          <div class="text">运行数据</div>
+          <div class="text"> 在线状态:在线 </div>
+          <div class="text texts">
+            <div>电流:50A</div>
+            <div>胎压:15Pa</div>
+          </div>
+          <div class="text texts">
+            <div>电压:380v</div>
+            <div>机房气压:15Pa</div>
+          </div>
+          <div class="text texts">
+            <div>上部风速:20m/s</div>
+            <div>大气压:15Pa</div>
+          </div>
+          <div class="text texts">
+            <div>中部风速:15m/s</div>
+            <div>位移:正常</div>
+          </div>
+          <div class="text texts">
+            <div>温度:23℃</div>
+            <div>风向:东南风</div>
+          </div>
+        </div>
+        <div class="DeviceInformation-rg">
+          <div class="text">基本信息</div>
+          <div class="text">设备代码:SD-5001-201408-01</div>
+          <div class="text">设备品类:往复式客运缆车</div>
+          <div class="text">产品名称:地轨缆车</div>
+          <div class="text">设备使用区域:广东省广州市白云区胥</div>
+          <div class="text">使用单位名称:广州某某风景旅游开发有限公司</div>
+          <div class="text">安全管理人员:陈大壮</div>
+          <div class="text">安全管理联系电话:13112345678</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup>
+import { set } from 'lodash-es'
+import { EChartsOption } from 'echarts'
+import { formatTime } from '@/utils'
+
+import { useUserStore } from '@/store/modules/user'
+// import { useWatermark } from '@/hooks/web/useWatermark'
+import type { WorkplaceTotal, Project, Notice, Shortcut } from './types'
+import { pieOptions, barOptions } from './echarts-data'
+import { useRouter } from 'vue-router'
+import { useDesign } from '@/hooks/web/useDesign'
+const { getPrefixCls } = useDesign()
+const prefixCls = getPrefixCls('panel')
+const posterUrl = ref('https://haokan.baidu.com/')
+const videoSrc = ref('https://example.com/sample.mp4')
+const progress = ref(0)
+const muteValue = ref(0)
+
+const data = [
+  {
+    label: '区域1',
+    children: [
+      {
+        label: '设备名称1'
+      },
+      {
+        label: '设备名称2'
+      },
+      {
+        label: '设备名称3'
+      },
+      {
+        label: '设备名称4'
+      }
+    ]
+  },
+  {
+    label: '区域2',
+    children: [
+      {
+        label: '设备名称2-1'
+      },
+      {
+        label: '设备名称2-2'
+      },
+      {
+        label: '设备名称2-3'
+      },
+      {
+        label: '设备名称2-4'
+      }
+    ]
+  },
+  {
+    label: '区域3',
+    children: [
+      {
+        label: '设备名称3-1'
+      },
+      {
+        label: '设备名称3-2'
+      },
+      {
+        label: '设备名称3-3'
+      },
+      {
+        label: '设备名称3-4'
+      }
+    ]
+  }
+]
+const input = ref()
+const defaultProps = {
+  children: 'children',
+  label: 'label'
+}
+const equipmentName = ref()
+const handleNodeClick = (e) => {
+  console.log(11111, e)
+  equipmentName.value = e.label
+}
+const playerOptions = ref({
+  autoplay: false,
+  controls: true,
+  loop: false,
+  muted: false,
+  preload: 'auto',
+  fluid: true,
+  playbackRates: [0.5, 1.0, 1.5, 2.0]
+})
+</script>
+
+<style lang="scss" scoped>
+.head-txt {
+  width: 100%;
+  color: var(--el-text-color-placeholder);
+  background: #fff;
+  padding: 5px;
+  margin-bottom: 10px;
+  border-radius: 5px;
+}
+.video-box {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  background: #fff;
+  .box-lf {
+    width: 30%;
+    .but-box {
+      margin-bottom: 5px;
+    }
+    .but {
+      width: 48%;
+    }
+    .region-box {
+      margin-top: 10px;
+    }
+  }
+  .box-rg {
+    width: 70%;
+    padding: 5px;
+    .video-div {
+      width: 100%;
+      display: flex;
+      justify-content: space-between;
+      margin-top: 10px;
+    }
+    .video-container {
+      width: 45%;
+      height: 200px;
+      background-color: rgb(131, 128, 128);
+
+      margin-left: 3%;
+    }
+    .DeviceInformation {
+      width: 100%;
+      display: flex;
+      justify-content: space-between;
+      margin-top: 10px;
+      padding: 5px;
+      .DeviceInformation-lf,
+      .DeviceInformation-rg {
+        width: 45%;
+        .text {
+          color: var(--el-text-color-placeholder);
+          font-size: 12px;
+          margin-bottom: 10px;
+        }
+        .texts {
+          width: 100%;
+          display: flex;
+          justify-content: space-between;
+        }
+      }
+      .DeviceInformation-rg {
+        margin-left: 40px;
+      }
+    }
+  }
+}
+</style>

+ 308 - 0
yudao-ui-admin-vue3/src/views/dataManagement/monitor/echarts-data.ts

@@ -0,0 +1,308 @@
+import { EChartsOption } from 'echarts'
+
+const { t } = useI18n()
+
+export const lineOptions: EChartsOption = {
+  title: {
+    text: t('analysis.monthlySales'),
+    left: 'center'
+  },
+  xAxis: {
+    data: [
+      t('analysis.january'),
+      t('analysis.february'),
+      t('analysis.march'),
+      t('analysis.april'),
+      t('analysis.may'),
+      t('analysis.june'),
+      t('analysis.july'),
+      t('analysis.august'),
+      t('analysis.september'),
+      t('analysis.october'),
+      t('analysis.november'),
+      t('analysis.december')
+    ],
+    boundaryGap: false,
+    axisTick: {
+      show: false
+    }
+  },
+  grid: {
+    left: 20,
+    right: 20,
+    bottom: 20,
+    top: 80,
+    containLabel: true
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'cross'
+    },
+    padding: [5, 10]
+  },
+  yAxis: {
+    axisTick: {
+      show: false
+    }
+  },
+  legend: {
+    data: [t('analysis.estimate'), t('analysis.actual')],
+    top: 50
+  },
+  series: [
+    {
+      name: t('analysis.estimate'),
+      smooth: true,
+      type: 'line',
+      data: [100, 120, 161, 134, 105, 160, 165, 114, 163, 185, 118, 123],
+      animationDuration: 2800,
+      animationEasing: 'cubicInOut'
+    },
+    {
+      name: t('analysis.actual'),
+      smooth: true,
+      type: 'line',
+      itemStyle: {},
+      data: [120, 82, 91, 154, 162, 140, 145, 250, 134, 56, 99, 123],
+      animationDuration: 2800,
+      animationEasing: 'quadraticOut'
+    }
+  ]
+}
+
+export const pieOptions: EChartsOption = {
+  title: {
+    text: t('analysis.userAccessSource'),
+    left: 'center'
+  },
+  tooltip: {
+    trigger: 'item',
+    formatter: '{a} <br/>{b} : {c} ({d}%)'
+  },
+  legend: {
+    orient: 'vertical',
+    left: 'left',
+    data: [
+      t('analysis.directAccess'),
+      t('analysis.mailMarketing'),
+      t('analysis.allianceAdvertising'),
+      t('analysis.videoAdvertising'),
+      t('analysis.searchEngines')
+    ]
+  },
+  series: [
+    {
+      name: t('analysis.userAccessSource'),
+      type: 'pie',
+      radius: '55%',
+      center: ['50%', '60%'],
+      data: [
+        { value: 335, name: t('analysis.directAccess') },
+        { value: 310, name: t('analysis.mailMarketing') },
+        { value: 234, name: t('analysis.allianceAdvertising') },
+        { value: 135, name: t('analysis.videoAdvertising') },
+        { value: 1548, name: t('analysis.searchEngines') }
+      ]
+    }
+  ]
+}
+
+export const barOptions: EChartsOption = {
+  title: {
+    text: t('analysis.weeklyUserActivity'),
+    left: 'center'
+  },
+  tooltip: {
+    trigger: 'axis',
+    axisPointer: {
+      type: 'shadow'
+    }
+  },
+  grid: {
+    left: 50,
+    right: 20,
+    bottom: 20
+  },
+  xAxis: {
+    type: 'category',
+    data: [
+      t('analysis.monday'),
+      t('analysis.tuesday'),
+      t('analysis.wednesday'),
+      t('analysis.thursday'),
+      t('analysis.friday'),
+      t('analysis.saturday'),
+      t('analysis.sunday')
+    ],
+    axisTick: {
+      alignWithLabel: true
+    }
+  },
+  yAxis: {
+    type: 'value'
+  },
+  series: [
+    {
+      name: t('analysis.activeQuantity'),
+      data: [13253, 34235, 26321, 12340, 24643, 1322, 1324],
+      type: 'bar'
+    }
+  ]
+}
+
+export const radarOption: EChartsOption = {
+  legend: {
+    data: [t('workplace.personal'), t('workplace.team')]
+  },
+  radar: {
+    // shape: 'circle',
+    indicator: [
+      { name: t('workplace.quote'), max: 65 },
+      { name: t('workplace.contribution'), max: 160 },
+      { name: t('workplace.hot'), max: 300 },
+      { name: t('workplace.yield'), max: 130 },
+      { name: t('workplace.follow'), max: 100 }
+    ]
+  },
+  series: [
+    {
+      name: `xxx${t('workplace.index')}`,
+      type: 'radar',
+      data: [
+        {
+          value: [42, 30, 20, 35, 80],
+          name: t('workplace.personal')
+        },
+        {
+          value: [50, 140, 290, 100, 90],
+          name: t('workplace.team')
+        }
+      ]
+    }
+  ]
+}
+
+export const wordOptions = {
+  series: [
+    {
+      type: 'wordCloud',
+      gridSize: 2,
+      sizeRange: [12, 50],
+      rotationRange: [-90, 90],
+      shape: 'pentagon',
+      width: 600,
+      height: 400,
+      drawOutOfBound: true,
+      textStyle: {
+        color: function () {
+          return (
+            'rgb(' +
+            [
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160),
+              Math.round(Math.random() * 160)
+            ].join(',') +
+            ')'
+          )
+        }
+      },
+      emphasis: {
+        textStyle: {
+          shadowBlur: 10,
+          shadowColor: '#333'
+        }
+      },
+      data: [
+        {
+          name: 'Sam S Club',
+          value: 10000,
+          textStyle: {
+            color: 'black'
+          },
+          emphasis: {
+            textStyle: {
+              color: 'red'
+            }
+          }
+        },
+        {
+          name: 'Macys',
+          value: 6181
+        },
+        {
+          name: 'Amy Schumer',
+          value: 4386
+        },
+        {
+          name: 'Jurassic World',
+          value: 4055
+        },
+        {
+          name: 'Charter Communications',
+          value: 2467
+        },
+        {
+          name: 'Chick Fil A',
+          value: 2244
+        },
+        {
+          name: 'Planet Fitness',
+          value: 1898
+        },
+        {
+          name: 'Pitch Perfect',
+          value: 1484
+        },
+        {
+          name: 'Express',
+          value: 1112
+        },
+        {
+          name: 'Home',
+          value: 965
+        },
+        {
+          name: 'Johnny Depp',
+          value: 847
+        },
+        {
+          name: 'Lena Dunham',
+          value: 582
+        },
+        {
+          name: 'Lewis Hamilton',
+          value: 555
+        },
+        {
+          name: 'KXAN',
+          value: 550
+        },
+        {
+          name: 'Mary Ellen Mark',
+          value: 462
+        },
+        {
+          name: 'Farrah Abraham',
+          value: 366
+        },
+        {
+          name: 'Rita Ora',
+          value: 360
+        },
+        {
+          name: 'Serena Williams',
+          value: 282
+        },
+        {
+          name: 'NCAA baseball tournament',
+          value: 273
+        },
+        {
+          name: 'Point Break',
+          value: 265
+        }
+      ]
+    }
+  ]
+}

+ 57 - 0
yudao-ui-admin-vue3/src/views/dataManagement/monitor/types.ts

@@ -0,0 +1,57 @@
+export type WorkplaceTotal = {
+  project: number
+  access: number
+  todo: number
+}
+
+export type Project = {
+  name: string
+  icon: string
+  message: string
+  personal: string
+  time: Date | number | string
+  color: string
+}
+
+export type Notice = {
+  title: string
+  type: string
+  keys: string[]
+  date: Date | number | string
+}
+
+export type Shortcut = {
+  name: string
+  icon: string
+  url: string
+  color: string
+}
+
+export type RadarData = {
+  personal: number
+  team: number
+  max: number
+  name: string
+}
+export type AnalysisTotalTypes = {
+  users: number
+  messages: number
+  moneys: number
+  shoppings: number
+}
+
+export type UserAccessSource = {
+  value: number
+  name: string
+}
+
+export type WeeklyUserActivity = {
+  value: number
+  name: string
+}
+
+export type MonthlySales = {
+  name: string
+  estimate: number
+  actual: number
+}

+ 57 - 0
yudao-ui-admin-vue3/src/views/dataManagement/types.ts

@@ -0,0 +1,57 @@
+export type WorkplaceTotal = {
+  project: number
+  access: number
+  todo: number
+}
+
+export type Project = {
+  name: string
+  icon: string
+  message: string
+  personal: string
+  time: Date | number | string
+  color: string
+}
+
+export type Notice = {
+  title: string
+  type: string
+  keys: string[]
+  date: Date | number | string
+}
+
+export type Shortcut = {
+  name: string
+  icon: string
+  url: string
+  color: string
+}
+
+export type RadarData = {
+  personal: number
+  team: number
+  max: number
+  name: string
+}
+export type AnalysisTotalTypes = {
+  users: number
+  messages: number
+  moneys: number
+  shoppings: number
+}
+
+export type UserAccessSource = {
+  value: number
+  name: string
+}
+
+export type WeeklyUserActivity = {
+  value: number
+  name: string
+}
+
+export type MonthlySales = {
+  name: string
+  estimate: number
+  actual: number
+}

+ 236 - 0
yudao-ui-admin-vue3/src/views/regulation/dailyControl/index.vue

@@ -0,0 +1,236 @@
+
+<template>
+  <div class="calendar-container">
+    <div class="head">
+      <div></div>
+      <div class="head-txt">
+        <div class="head-lf">
+          <span class="yd"></span>
+          <span>未排查</span>
+        </div>
+        <div>
+          <span class="yd yds"></span>
+          <span>已排查</span>
+        </div>
+     </div>
+    </div>
+    <div class="calendar">
+        <el-calendar ref="calendarRef" v-model="currentDate" :style="`--el-calendar-border: none;`">
+      <!-- 自定义头部插槽 -->
+      <template #header="{ date }">
+        <div class="custom-header">
+        <div class="picker-div">
+         <el-date-picker
+          v-model="currentDate"
+          type="month"
+          
+         
+          :placeholder=formatDateTitle(date)
+          @change="pickerChange"
+        />
+        </div>  
+         <div class="buttons-box">
+          <el-button-group class="nav-buttons">            
+            <el-button @click="prevMonth" circle>
+              <el-icon><ArrowLeftBold /></el-icon>
+            </el-button>
+          </el-button-group>
+          <div class="title">
+            {{ formatDateTitle(date) }}
+          </div>
+          <el-button-group class="nav-buttons">
+             <el-button  @click="nextMonth" circle>
+              <el-icon><ArrowRightBold /></el-icon>
+            </el-button>
+            
+          </el-button-group>
+          
+          </div>
+          <el-button-group class="nav-buttons">
+            
+            
+            <el-button class="button-css" @click="goToday">
+              今天
+            </el-button>
+          </el-button-group>
+        </div>
+      </template>
+
+      <!-- 自定义日期单元格 -->
+      <template #date-cell="{ data }">
+        <div class="cell-content" @click="handleDateClick(data.day)">
+          {{ data.day.split('-')[2] }}
+        </div>
+      </template>
+    </el-calendar>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+
+
+const router = useRouter()
+const calendarRef = ref()
+const currentDate = ref(new Date())
+const value4 = ref('')
+const formatDateTitle = (date) => {
+  console.log('${year}年${month}月',date)
+  // const year = date.getFullYear()
+  // const month = date.getMonth() + 1
+  return date
+}
+
+const prevMonth = () => {
+  const date = new Date(currentDate.value)
+  date.setMonth(date.getMonth() - 1)
+  currentDate.value = date
+}
+
+const nextMonth = () => {
+  const date = new Date(currentDate.value)
+  date.setMonth(date.getMonth() + 1)
+  currentDate.value = date
+}
+
+
+
+
+const goToday = () => {
+  currentDate.value = new Date()
+}
+const pickerChange=(e)=>{
+
+}
+const handleDateClick=(e)=>{
+  console.log(1111,e)
+  router.push({ path: '/lggd/dailyControlList' })
+}
+</script>
+
+<style lang="scss" scoped>
+.calendar-container {
+  width: 100%;
+  height: 100vh;
+}
+.head {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+  .head-txt {
+     width: 200px;
+     display: flex;
+     justify-content: center;  
+     
+  }
+  .head-lf {
+    margin-right: 20px;
+  }
+
+  .yd {
+    display: inline-block;
+    width: 8px;
+    height: 8px;
+    border-radius: 50%;
+    background: #E7E7E7 ;
+    font-size: 12px;
+    color: #323C50;
+    margin-right: 10px;
+  }
+  .yds {
+    background: #B2FACB ;
+  }
+}
+
+ .custom-calendar {
+  width: 100%;
+  max-width: 600px;
+  margin: 0 auto;
+}
+
+.custom-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 10px;
+}
+
+.title {
+  font-size: 18px;
+  font-weight: bold;
+  color: #fff;
+  margin: 0 50px;
+}
+
+
+
+.cell-content {
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background: #E7E7E7;
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+
+}
+.custom-header {
+  width: 100%;
+  background: #035293 ;
+}
+.button-css {
+  border:none;
+   background: #035293 ;
+   color: #fff;
+}
+.buttons-box {
+  display: flex;
+}
+.picker-div {
+  width: 115px;
+}
+.picker-css {
+  width: 125px;
+}
+:deep(.el-date-editor.el-input){
+width: 125px;
+}
+:deep(.el-calendar-day){
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+:deep(.current){
+ border:none;
+padding:0 40px;
+box-sizing: border-box;
+}
+:deep(.prev){
+ border:none;
+padding:0 40px;
+box-sizing: border-box;
+
+}
+
+.v-footer {
+  display: none !important;
+}
+:deep(.el-calendar-table .el-calendar-day ){
+  height: 50px;
+   border:none;
+}
+:deep(.el-calendar-table__row){
+  border:none;
+}
+
+:deep(.el-calendar-table td.is-selected) {
+  background-color: transparent !important; /* 移除背景色 */
+  border: none !important; /* 移除边框 */
+  color: inherit !important; /* 恢复默认字体颜色 */
+}
+:deep(.el-calendar-table .el-calendar-day):hover {
+  background-color: inherit !important;
+}
+</style>

+ 224 - 0
yudao-ui-admin-vue3/src/views/regulation/dailyControlList/index.vue

@@ -0,0 +1,224 @@
+
+<template>
+  <div class="calendar-container">
+     <div class="head">
+
+        <el-form
+          ref="ruleFormRef"
+          :model="ruleForm"
+          status-icon         
+          label-width="auto"
+          class="demo-form-inline"
+          :inline="true"
+          
+        >
+             <el-form-item label="排查状态" style="width: 300px">
+               <el-select  placeholder="排查状态">
+                 <el-option label="未排查" value="1" />
+                 <el-option label="已排查" value="2" />
+               </el-select>
+             </el-form-item>
+             <el-form-item label="设备代码" >
+                     <el-input placeholder="设备代码"  />
+              </el-form-item>
+              <el-form-item label="出产编号" >
+                     <el-input  placeholder="出产编号"/>
+               </el-form-item>
+               <el-form-item label="设备所在地点" >
+                     <el-input placeholder="设备所在地点"  />
+               </el-form-item>
+               <el-form-item>
+                  <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+                  <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+                  
+               </el-form-item>
+         </el-form>
+     </div>
+
+     <div class="list-box">
+       <div class="list-head">
+        <el-button type="primary">批量排查</el-button>
+       </div>
+       <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" @selection-change="handleRowCheckboxChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column label="序号" type="index" width="80" />
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['system:sms-channel:update']"
+          >
+            详情
+          </el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="设备代码" align="center" prop="id" />
+      <el-table-column label="出产编号" align="center" prop="signature" />
+      <el-table-column label="设备所在地点" align="center" prop="signature" />
+      <el-table-column label="排查状态" align="center" prop="remark" />
+    </el-table>
+    
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+     </div>
+  </div>
+  <div class="pop-up-box" v-if="show">
+      <div class="pop-up">
+         <div class="pop-up-head">
+            <div>日排查管控</div>
+            <div>
+            <el-button  circle >
+               <el-icon><CloseBold /></el-icon>
+            </el-button>
+            </div>
+         </div>
+         <div class="pop-up-con">
+             <div class="pop-up-title">设备详情</div>
+             <div class="pop-up-form">
+                <el-form label-position="right" :inline="true" :model="formInline" class="demo-form-inline">
+                    <el-form-item label-position="right" label="出产编号">
+                      <el-input v-model="formInline.user" placeholder="出产编号" clearable />
+                    </el-form-item>
+                     <el-form-item label-position="right" label="设备代码">
+                      <el-input v-model="formInline.user" placeholder="设备代码" clearable />
+                    </el-form-item>
+                     <el-form-item label-position="right" label="所在地址">
+                      <el-input v-model="formInline.user" placeholder="所在地址" clearable />
+                    </el-form-item>
+                     <el-form-item label-position="right" label="排 查 人 ">
+                      <el-input v-model="formInline.user" placeholder="排查人" clearable />
+                    </el-form-item>
+                    
+    
+                 </el-form>
+             </div>
+         </div>
+         <div class="pop-up-con pop-up-cons">
+          <div class="pop-up-title">排查项</div>
+          <div class="pop-up-group">
+              <div>
+                1、<span>【日检】</span>
+                <span class="txt">未按规定进行领用、使用控制以及材料标识</span>
+                <el-tooltip placement="right" effect="light">
+                  <template #content> 检查标准:<br />电梯运行平稳,无异常晃动、卡顿、异响;平层准确,误差不超落,平层误差大易测量过±15mm<br />
+                  检查办法:<br />电梯运行平稳,无异常晃动、卡顿、异响<br />
+                  潜在风险:<br /> 电梯运行平稳,无异常晃动、卡顿、异响;平层准确,误差不超落,平层误差大易测量过±15mm <br />
+                  异常处理措施:<br />电梯运行平稳,无异常晃动、卡顿、异响;平层准确,误差不超落,平层误差大易测量过±15mm
+                  </template>
+                    <span><el-icon><QuestionFilled /></el-icon></span>
+                </el-tooltip>
+                
+              </div>
+          </div>
+         </div>
+      </div>
+  </div>
+</template>
+<script lang="ts" setup>
+const ruleForm=ref()
+const loading = ref(false) // 列表的加载中
+const list = ref([])
+const total = ref(0)
+const show=ref(false)
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+ 
+}
+/** 批量删除按钮操作 */
+const checkedIds = ref<number[]>([])
+const handleRowCheckboxChange = () => {
+  
+}
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  signature: undefined,
+  status: undefined,
+  createTime: []
+})
+
+const formInline=ref(
+  {
+  user: '',
+  region: '',
+  date: '',
+}
+)
+</script>
+
+<style lang="scss" scoped>
+.head,.list-box {
+  width: 100%;
+  padding:10px;
+  border:1px solid #CCCCCC ;
+}
+.demo-ruleForm {
+  width: 100%;
+}
+.list-box {
+  margin-top: 10px;
+}
+.list-head {
+  margin-bottom: 10px;
+}
+.pop-up-box {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  background:#D7D6DA;
+  z-index: 999;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  .pop-up {
+    width: 710px;
+    background: #fff;
+    padding: 25px;
+    border-radius: 10px;
+    .pop-up-head {
+      height: 53px;
+      display: flex;
+      justify-content: space-between;
+      border-bottom: 1px solid #D7D6DA;
+      line-height: 53px;
+      font-size: 16px;
+    }
+    .pop-up-con {
+      margin-top:14px;
+      font-size: 14px;
+      color: #3C3C43;
+      border-bottom: 1px solid #D7D6DA;
+    }
+    .pop-up-cons {
+      border:none;
+    }
+    .pop-up-form {
+      margin-top: 9px;
+    }
+    .pop-up-group {
+      margin-top:16px;
+      background: #F6F9FE;
+      width: 100%;
+      height: 137px;
+      padding:12px;
+      .txt {
+        color: #999999;
+        font-size: 12px;
+        margin-right: 5px;
+      }
+    }
+  }
+}
+</style>

+ 13 - 0
yudao-ui-admin-vue3/src/views/regulation/weeklyInvestigation/index.vue

@@ -0,0 +1,13 @@
+
+<template>
+  <div class="calendar-container">
+      月排查
+  </div>
+</template>
+<script lang="ts" setup>
+
+</script>
+
+<style lang="scss" scoped>
+
+</style>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 726 - 600
yudao-ui-admin-vue3/yarn.lock