艺术家
2025-06-04 772190e7b2e3f6ef0695ba54d9209324acdcb30a
伸缩杆代码提交
已修改30个文件
已添加6个文件
3101 ■■■■ 文件已修改
项目代码/伸缩杆/client/index.html 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/pnpm-lock.yaml 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/api/newapi/AlarmReset.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/api/newapi/Maintenance.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/api/newapi/MaintenanceTeam.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/api/user.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon1.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon11.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon2.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon21.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon3.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon31.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon4.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon41.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon5.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon6.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/index/icon/icon61.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/login/bg.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/assets/login/bg1.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/components/basic/VolElementMenu.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/components/basic/VolElementMenuChild.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/layout/index.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/Index.vue 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/Login.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/system/Sys_Menu.vue 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/tts/AlarmReset/AlarmReset.vue 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/tts/DataLogging/Datalogging.vue 232 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/tts/Enteroverhaul/Enteroverhaul.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/tts/Parametersettings/Parametersettings.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/tts/PickAndDrop/Manualcontrol.vue 591 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/tts/PickAndDrop/PickAndDrop.vue 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/伸缩杆/client/src/views/tts/UserManagement/Usermanagement.vue 1166 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/可视化大屏.7z 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/可视化大屏/client/src/layout/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/可视化大屏/client/src/views/Index.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/index.html
@@ -23,10 +23,20 @@
    </noscript> -->
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
    <!--三个必要的js文件引入-->
    <script src="/webControl/jquery-1.12.4.min.js"></script>
    <script src="/webControl/jsencrypt.min.js"></script>
    <!-- ç”¨äºŽRSA加密 -->
    <script src="/webControl/web-control_1.2.7.min.js"></script>
    <script src="/webControl/webVideoCtrl.js" type="text/javascript"></script>
    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
    <script type="text/javascript">
      var Ip = returnCitySN["cip"];
      var cityname = returnCitySN["cname"];
      localStorage.setItem("Ip", Ip);
      localStorage.setItem("cityname", cityname);
    </script>
  </body>
</html>
<style>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/package.json
@@ -18,6 +18,7 @@
    "echarts": "^5.6.0",
    "element-china-area-data": "^6.1.0",
    "element-plus": "^2.9.9",
    "ezuikit-js": "8.1.9-beta.3",
    "pinia": "^2.3.0",
    "screenfull": "^6.0.2",
    "scss": "^0.2.4",
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/pnpm-lock.yaml
@@ -35,6 +35,9 @@
      element-plus:
        specifier: ^2.9.9
        version: 2.9.9(vue@3.5.13)
      ezuikit-js:
        specifier: 8.1.9-beta.3
        version: 8.1.9-beta.3
      pinia:
        specifier: ^2.3.0
        version: 2.3.1(vue@3.5.13)
@@ -415,6 +418,27 @@
    cpu: [x64]
    os: [win32]
  '@ezuikit/player-ezopen@8.1.9-beta.3':
    resolution: {integrity: sha512-4YEA/Otp/lW8iiCOhgajhpkrbdFePUN3oMnSumrvYvDfiIMAKJLAiAmCCiXieoJ8hIzrCeXKjYUPgY5/HALHdg==}
  '@ezuikit/player-plugin-record@8.1.8-beta.3':
    resolution: {integrity: sha512-YcQ5MR8zyg8b+o/ktr6r+YCXkiEX43HVmzVkfJsERgaokaHzoNIpOomEl51j/13gcemjSXuN6i1apCRC2v32pg==}
  '@ezuikit/utils-collect@0.1.1':
    resolution: {integrity: sha512-BgEOnTtAq8rQRBAKv5rLXbQLGOnfOZ6NS0QTmiviey80JbMJlxrLiqmjL5lxvkm4JtCcXCtSgPA4tskQKN4eDA==}
  '@ezuikit/utils-i18n@1.0.1':
    resolution: {integrity: sha512-uUjN3ADHV2ZG4QznuA7FB89/ck8AGV4qS8hm/sqeSA6/ie4ryYw8MS4wIv71WgPBIgIVDfASuEapyLOwq7R2aQ==}
  '@ezuikit/utils-logger@1.0.1':
    resolution: {integrity: sha512-qak0MXh4vWZCji3aSCfHdWR3EbZCaqS0iMT8/QWuWPRr0vDmTRMP3kFOAw1MuMraR0ocjPBE2PaTEmUuwVqaAw==}
  '@ezuikit/utils-service@1.0.1':
    resolution: {integrity: sha512-iNjYuU7AScBJxvKBM9PjiGI2y64QJNPT/H1Fy/Y7ZIAlw4DO//TP+x50qCho+i+EOUpWLtOqBQvtRb7a0O4X4Q==}
  '@ezuikit/utils-tools@1.0.4':
    resolution: {integrity: sha512-w+LZ03qowSqrSqDnuONKPpmEn0cuCaF2pkgHL1YicR0of/ZelCho5X8cy5TXQe7UsrQkIM2M7vVennv5KnAdpQ==}
  '@floating-ui/core@1.7.0':
    resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==}
@@ -441,6 +465,9 @@
  '@jridgewell/trace-mapping@0.3.25':
    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
  '@juggle/resize-observer@3.4.0':
    resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
  '@kurkle/color@0.3.4':
    resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==}
@@ -702,6 +729,9 @@
    resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
    engines: {node: '>=10.0.0'}
  abortcontroller-polyfill@1.7.8:
    resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==}
  address@1.2.2:
    resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
    engines: {node: '>= 10.0.0'}
@@ -766,6 +796,9 @@
  big.js@5.2.2:
    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
  bignumber.js@9.3.0:
    resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==}
  birpc@0.2.19:
    resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==}
@@ -891,6 +924,9 @@
  dayjs@1.11.13:
    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
  debounce-promise@3.1.2:
    resolution: {integrity: sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==}
  debug@4.4.0:
    resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
    engines: {node: '>=6.0'}
@@ -899,6 +935,10 @@
    peerDependenciesMeta:
      supports-color:
        optional: true
  deepmerge@4.3.1:
    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
    engines: {node: '>=0.10.0'}
  default-browser-id@5.0.0:
    resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
@@ -919,6 +959,9 @@
  delayed-stream@1.0.0:
    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
    engines: {node: '>=0.4.0'}
  delegate@3.2.0:
    resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
  destroy@1.2.0:
    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
@@ -1008,6 +1051,9 @@
  estree-walker@2.0.2:
    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
  eventemitter3@5.0.1:
    resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
  execa@9.5.2:
    resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==}
    engines: {node: ^18.19.0 || >=20.5.0}
@@ -1015,6 +1061,9 @@
  extend-shallow@2.0.1:
    resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
    engines: {node: '>=0.10.0'}
  ezuikit-js@8.1.9-beta.3:
    resolution: {integrity: sha512-BtpkKOafxRmZroVcol5yOpASVHi1ddUy7DGzFb/TLkoh3VER7xEOzJepiK0O7dOsXAMmxXwooMLO+DIfMXFXnw==}
  fast-deep-equal@3.1.3:
    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -1024,6 +1073,10 @@
  fast-uri@3.0.6:
    resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
  fetch-blob@3.2.0:
    resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
    engines: {node: ^12.20 || >= 14.13}
  figgy-pudding@3.5.2:
    resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==}
@@ -1056,6 +1109,10 @@
  form-data@4.0.2:
    resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
    engines: {node: '>= 6'}
  formdata-polyfill@4.0.10:
    resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
    engines: {node: '>=12.20.0'}
  formstream@1.5.1:
    resolution: {integrity: sha512-q7ORzFqotpwn3Y/GBK2lK7PjtZZwJHz9QE9Phv8zb5IrL9ftGLyi2zjGURON3voK8TaZ+mqJKERYN4lrHYTkUQ==}
@@ -1144,6 +1201,9 @@
  humanize-ms@1.2.1:
    resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
  i18n-js@4.5.1:
    resolution: {integrity: sha512-n7jojFj1WC0tztgr0I8jqTXuIlY1xNzXnC3mjKX/YjJhimdM+jXM8vOmn9d3xQFNC6qDHJ4ovhdrGXrRXLIGkA==}
  iconv-lite@0.6.3:
    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
@@ -1241,6 +1301,9 @@
  isstream@0.1.2:
    resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
  jquery@3.7.1:
    resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
  js-base64@2.6.4:
    resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
@@ -1318,6 +1381,9 @@
  make-dir@2.1.0:
    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
    engines: {node: '>=6'}
  make-plural@7.4.0:
    resolution: {integrity: sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg==}
  math-intrinsics@1.1.0:
    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
@@ -1407,6 +1473,11 @@
  neo-async@2.6.2:
    resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
  node-domexception@1.0.0:
    resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
    engines: {node: '>=10.5.0'}
    deprecated: Use your platform's native DOMException instead
  node-hex@1.0.1:
    resolution: {integrity: sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==}
@@ -1760,6 +1831,10 @@
    resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==}
    engines: {node: '>= 10.13.0'}
  screenfull@5.2.0:
    resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==}
    engines: {node: '>=0.10.0'}
  screenfull@6.0.2:
    resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==}
    engines: {node: ^14.13.1 || >=16.0.0}
@@ -1917,6 +1992,9 @@
  typedarray@0.0.6:
    resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
  ua-parser-js@1.0.37:
    resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==}
  uglify-js@3.19.3:
    resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
    engines: {node: '>=0.8.0'}
@@ -1970,6 +2048,10 @@
  utility@1.18.0:
    resolution: {integrity: sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==}
    engines: {node: '>= 0.12.0'}
  uuid@8.3.2:
    resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
    hasBin: true
  varint@6.0.0:
    resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
@@ -2097,6 +2179,10 @@
  wangeditor@4.7.15:
    resolution: {integrity: sha512-aPTdREd8BxXVyJ5MI+LU83FQ7u1EPd341iXIorRNYSOvoimNoZ4nPg+yn3FGbB93/owEa6buLw8wdhYnMCJQLg==}
  web-streams-polyfill@3.3.3:
    resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
    engines: {node: '>= 8'}
  webpack-sources@1.4.3:
    resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==}
@@ -2428,6 +2514,38 @@
  '@esbuild/win32-x64@0.25.1':
    optional: true
  '@ezuikit/player-ezopen@8.1.9-beta.3':
    dependencies:
      '@ezuikit/player-plugin-record': 8.1.8-beta.3
      '@ezuikit/utils-i18n': 1.0.1
      '@ezuikit/utils-logger': 1.0.1
      '@ezuikit/utils-service': 1.0.1
      '@ezuikit/utils-tools': 1.0.4
      '@juggle/resize-observer': 3.4.0
      dayjs: 1.11.13
      deepmerge: 4.3.1
      eventemitter3: 5.0.1
      jquery: 3.7.1
      screenfull: 5.2.0
      ua-parser-js: 1.0.37
  '@ezuikit/player-plugin-record@8.1.8-beta.3': {}
  '@ezuikit/utils-collect@0.1.1': {}
  '@ezuikit/utils-i18n@1.0.1':
    dependencies:
      i18n-js: 4.5.1
  '@ezuikit/utils-logger@1.0.1': {}
  '@ezuikit/utils-service@1.0.1':
    dependencies:
      '@ezuikit/utils-tools': 1.0.4
      dayjs: 1.11.13
  '@ezuikit/utils-tools@1.0.4': {}
  '@floating-ui/core@1.7.0':
    dependencies:
      '@floating-ui/utils': 0.2.9
@@ -2455,6 +2573,8 @@
    dependencies:
      '@jridgewell/resolve-uri': 3.1.2
      '@jridgewell/sourcemap-codec': 1.5.0
  '@juggle/resize-observer@3.4.0': {}
  '@kurkle/color@0.3.4': {}
@@ -2726,6 +2846,8 @@
  '@xmldom/xmldom@0.8.10': {}
  abortcontroller-polyfill@1.7.8: {}
  address@1.2.2: {}
  aes-decrypter@4.0.2:
@@ -2820,6 +2942,8 @@
  balanced-match@1.0.2: {}
  big.js@5.2.2: {}
  bignumber.js@9.3.0: {}
  birpc@0.2.19: {}
@@ -2956,9 +3080,13 @@
  dayjs@1.11.13: {}
  debounce-promise@3.1.2: {}
  debug@4.4.0:
    dependencies:
      ms: 2.1.3
  deepmerge@4.3.1: {}
  default-browser-id@5.0.0: {}
@@ -2974,6 +3102,8 @@
  define-lazy-prop@3.0.0: {}
  delayed-stream@1.0.0: {}
  delegate@3.2.0: {}
  destroy@1.2.0: {}
@@ -3093,6 +3223,8 @@
  estree-walker@2.0.2: {}
  eventemitter3@5.0.1: {}
  execa@9.5.2:
    dependencies:
      '@sindresorhus/merge-streams': 4.0.0
@@ -3112,11 +3244,34 @@
    dependencies:
      is-extendable: 0.1.1
  ezuikit-js@8.1.9-beta.3:
    dependencies:
      '@ezuikit/player-ezopen': 8.1.9-beta.3
      '@ezuikit/utils-collect': 0.1.1
      '@ezuikit/utils-i18n': 1.0.1
      '@ezuikit/utils-logger': 1.0.1
      '@ezuikit/utils-tools': 1.0.4
      '@juggle/resize-observer': 3.4.0
      abortcontroller-polyfill: 1.7.8
      debounce-promise: 3.1.2
      deepmerge: 4.3.1
      delegate: 3.2.0
      formdata-polyfill: 4.0.10
      jquery: 3.7.1
      lodash-es: 4.17.21
      screenfull: 5.2.0
      uuid: 8.3.2
  fast-deep-equal@3.1.3: {}
  fast-json-stable-stringify@2.1.0: {}
  fast-uri@3.0.6: {}
  fetch-blob@3.2.0:
    dependencies:
      node-domexception: 1.0.0
      web-streams-polyfill: 3.3.3
  figgy-pudding@3.5.2: {}
@@ -3147,6 +3302,10 @@
      combined-stream: 1.0.8
      es-set-tostringtag: 2.1.0
      mime-types: 2.1.35
  formdata-polyfill@4.0.10:
    dependencies:
      fetch-blob: 3.2.0
  formstream@1.5.1:
    dependencies:
@@ -3247,6 +3406,12 @@
    dependencies:
      ms: 2.1.3
  i18n-js@4.5.1:
    dependencies:
      bignumber.js: 9.3.0
      lodash: 4.17.21
      make-plural: 7.4.0
  iconv-lite@0.6.3:
    dependencies:
      safer-buffer: 2.1.2
@@ -3314,6 +3479,8 @@
  isobject@3.0.1: {}
  isstream@0.1.2: {}
  jquery@3.7.1: {}
  js-base64@2.6.4: {}
@@ -3396,6 +3563,8 @@
    dependencies:
      pify: 4.0.1
      semver: 5.7.2
  make-plural@7.4.0: {}
  math-intrinsics@1.1.0: {}
@@ -3485,6 +3654,8 @@
    optional: true
  neo-async@2.6.2: {}
  node-domexception@1.0.0: {}
  node-hex@1.0.1: {}
@@ -3805,6 +3976,8 @@
      ajv-formats: 2.1.1(ajv@8.17.1)
      ajv-keywords: 5.1.0(ajv@8.17.1)
  screenfull@5.2.0: {}
  screenfull@6.0.2: {}
  scss@0.2.4:
@@ -3953,6 +4126,8 @@
  typedarray@0.0.6: {}
  ua-parser-js@1.0.37: {}
  uglify-js@3.19.3: {}
  uglifyjs-webpack-plugin@2.2.0:
@@ -4017,6 +4192,8 @@
      mkdirp: 0.5.6
      mz: 2.7.0
      unescape: 1.0.1
  uuid@8.3.2: {}
  varint@6.0.0: {}
@@ -4146,6 +4323,8 @@
      '@babel/runtime-corejs3': 7.27.1
      tslib: 2.8.1
  web-streams-polyfill@3.3.3: {}
  webpack-sources@1.4.3:
    dependencies:
      source-list-map: 2.0.1
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/api/newapi/AlarmReset.js
@@ -1,4 +1,6 @@
import http from "../http";
//登录记录
export const BecomeTrue = (data) => http.post(`/api/AlarmResetHsy/BecomeTrue?account=${data.account}`);
//报警复位
export const BecomeTrue = () => http.post(`/api/AlarmResetHsy/BecomeTrue`);
//清除报警信息
export const ClearAlarm = () => http.post(`/api/AlarmResetHsy/DeleteAllinform`);
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/api/newapi/Maintenance.js
@@ -8,5 +8,7 @@
export const RunOperation = (id, ispossible) => http.post(`/api/Maintenance/RunOperation?id=${id}&ispossible=${ispossible}`);
//改变状态
export const ChangeTasState = (data) => http.post("/api/Maintenance/ChangeTasState", data);
//获取开始检修人员
export const YShowStartTake = () => http.post(`/api/Maintenance/YShowStartTake`);
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/api/newapi/MaintenanceTeam.js
@@ -1,6 +1,6 @@
import http from "../http";
//检修设置记录
export const MaintenanceSettingRecord = (data) =>http.post(`/api/MaintenanceTeam/MaintenanceSettingRecord`, data);
export const MaintenanceSettingRecord = (data) => http.post(`/api/MaintenanceTeam/MaintenanceSettingRecord`, data);
//检修操作记录
export const MaintenanceOperationRecord = (data) => http.post(`/api/Maintenance/MaintenanceOperationRecord`,data);
//授权记录记录
export const AuthGetPageData = (data) => http.post(`/api/AuthorizationRecord/GetPageData`, data);
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/api/user.js
@@ -10,7 +10,7 @@
export const GetUerType = () => http.get('/api/User/GetUerType')
//获取用户列表
export const GetUserList = (data) => http.post('/api/User/GetPageData', data)
export const GetUserList = (data) => http.post('/api/User/YShowUserList', data)
//新建用户
export const AddUser = (data) => http.post('/api/User/AdduserData', data)
@@ -54,3 +54,20 @@
export const IsEnabled = (data) => http.post(`/api/User/UpdateData`, data);
//获取部门
export const GetDepartment = (data) => http.post('/api/Department/GetPageData', data)
//获取用户班组
export const GetUserTeam = (data) => http.post('/api/TeamCategory/GetPageData', data)
//添加用户班组
export const AddUserTeam = (data) => http.post('/api/TeamCategory/AddData', data)
//编辑用户班组
export const EditUserTeam = (data) => http.post('/api/TeamCategory/UpdateData', data)
//删除用户班组
export const DeleteUserTeam = (data) => http.post('/api/TeamCategory/Del', data)
//获取用户单位
export const GetUserUnit = (data) => http.post('/api/UnitCategory/GetPageData', data)
//添加用户单位
export const AddUserUnit = (data) => http.post('/api/UnitCategory/AddData', data)
//编辑用户单位
export const EditUserUnit = (data) => http.post('/api/UnitCategory/UpdateData', data)
//删除用户单位
export const DeleteUserUnit = (data) => http.post('/api/UnitCategory/Del', data)
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon1.png

ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon11.png
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon2.png

ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon21.png
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon3.png

ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon31.png
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon4.png

ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon41.png
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon5.png

ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon6.png

ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/index/icon/icon61.png
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/login/bg.png

ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/assets/login/bg1.png
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/components/basic/VolElementMenu.vue
@@ -50,7 +50,7 @@
</template>
<script>
// import VolElementMenuChild from "./VolElementMenuChild";
import VolElementMenuChild from "./VolElementMenuChild.vue";
import { useRouter } from "vue-router";
import {
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/components/basic/VolElementMenuChild.vue
@@ -58,6 +58,3 @@
  font-size: 0.88rem !important;
}
</style>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/layout/index.vue
@@ -3,42 +3,6 @@
    style="display: flex; width: 100%; min-height: 100vh; height: 100%"
    :class="['vol-theme-' + theme]"
  >
    <!-- <div
      style="
        width: 12.5rem;
        height: 100%;
        display: flex;
        flex-direction: column;
      "
    >
      <div
        style="
          width: 100%;
          background-color: #f5f5f5;
          display: flex;
          justify-content: center;
          align-items: center;
          height: 3.75rem;
        "
      >
        <img
          @click="router.push({ path: '/' })"
          src="@/assets/logo.png"
          alt=""
          style="height: 3.65rem; cursor: pointer"
        />
      </div>
      <el-scrollbar style="flex: 1; background-color: #242424">
        <VolMenu
          :currentMenuId="currentMenuId"
          :on-select="onSelect"
          :enable="true"
          :open-select="false"
          :isCollapse="isCollapse"
          :list="menuOptions"
        ></VolMenu>
      </el-scrollbar>
    </div> -->
    <div style="flex: 1; height: 100%; display: flex; flex-direction: column">
      <header style="height: 4.38rem; background-color: #006eff">
        <div
@@ -76,28 +40,17 @@
                padding: 0 0.69rem 0 0;
              "
            >
              <!-- <span
              <span
                style="
                  font-size: 1.25rem;
                  font-weight: bold;
                  color: #fff;
                  margin-right: 0.69rem;
                  cursor: pointer;
                  color: rgb(255, 255, 255);
                  font-size: 0.88rem;
                  margin-right: 1rem;
                "
                @click="router.push({ path: '/VideoSurveillance' })"
                >视频监控</span
              > -->
              <!-- <span
                style="
                  font-size: 1.25rem;
                  font-weight: bold;
                  color: #fff;
                  margin-right: 0.69rem;
                  cursor: pointer;
                "
                @click="router.push({ path: '/AlarmReset' })"
                >报警复位</span
              > -->
                @click="toDetail"
                class="tetxsize"
                >权限修改</span
              >
              <img
                v-if="!isFullscreen"
                style="
@@ -134,12 +87,16 @@
                @click="router.push({ path: '/index' })"
              />
              <div>
                <span style="color: rgb(255, 255, 255); font-size: 0.88rem"
                <span
                  style="color: rgb(255, 255, 255); font-size: 0.88rem"
                  class="tetxsize"
                  >角色:{{ acountInfo.roleName }}</span
                >
              </div>
              <div style="margin-left: 2rem">
                <span style="color: rgb(255, 255, 255); font-size: 0.88rem"
                <span
                  style="color: rgb(255, 255, 255); font-size: 0.88rem"
                  class="tetxsize"
                  >姓名:{{ acountInfo.userTrueName }}</span
                >
              </div>
@@ -180,6 +137,7 @@
                  font-size: 0.88rem;
                  text-align: left;
                "
                class="tetxsize"
              >
                {{ userName }}
              </div>
@@ -389,6 +347,10 @@
      }
      if (item.path == "#") return;
      open(item);
    };
    // ç®¡ç† è·¯ç”±è·³è½¬
    const toDetail = (row) => {
      router.push("/sysMenu");
    };
    const open = (item, useRoute) => {
      /* 2020.07.31增加手动打开tabs*/
@@ -741,6 +703,7 @@
      acountInfo,
      screenonToggle,
      isFullscreen,
      toDetail,
    };
  },
  /**
@@ -861,6 +824,12 @@
.header-navigation ::v-deep(.el-tabs__item.is-top) {
  padding: 0 15px;
}
@media screen and (max-width: 1080px) {
  .tetxsize {
    font-size: 1.5rem !important;
  }
}
</style>
<style>
.horizontal-collapse-transition {
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/Index.vue
@@ -21,14 +21,15 @@
            <img src="@/assets/index/icon/icon1.png" alt="" />
          </div>
        </div>
        <div
          class="item"
          style="background-color: #ffa726"
          @click="router.push('/Maintenancemanagement')"
          style="background-color: #2200de"
          @click="router.push('/Enteroverhaul')"
        >
          <span>检修管理</span>
          <span>进入检修</span>
          <div class="count">
            <img src="@/assets/index/icon/icon2.png" alt="" />
            <img src="@/assets/index/icon/icon6.png" alt="" />
          </div>
        </div>
        <div
@@ -63,14 +64,15 @@
            <img src="@/assets/index/icon/icon5.png" alt="" />
          </div>
        </div>
        <div
          class="item"
          style="background-color: #2200de"
          @click="router.push('/Enteroverhaul')"
          style="background-color: #ffa726"
          @click="router.push('/AlarmReset')"
        >
          <span>进入检修</span>
          <span>报警复位</span>
          <div class="count">
            <img src="@/assets/index/icon/icon6.png" alt="" />
            <img src="@/assets/index/icon/icon2.png" alt="" />
          </div>
        </div>
      </div>
@@ -89,16 +91,16 @@
        </div>
        <div
          class="item"
          style="background-color: #ffa726"
          @click="router.push('/Maintenancemanagement')"
          style="background-color: #2200de"
          @click="router.push('/Enteroverhaul')"
        >
          <span>检修管理</span>
          <span>进入检修</span>
          <div class="count">
            <img src="@/assets/index/icon/icon2.png" alt="" />
            <img src="@/assets/index/icon/icon6.png" alt="" />
          </div>
        </div>
      </div>
      <div class="main_b">
      <div class="main_b" style="margin-top: 9rem; margin-bottom: 9rem">
        <div
          class="item"
          style="background-color: #9ccc65"
@@ -131,14 +133,15 @@
            <img src="@/assets/index/icon/icon5.png" alt="" />
          </div>
        </div>
        <div
          class="item"
          style="background-color: #2200de"
          @click="router.push('/Enteroverhaul')"
          style="background-color: #ffa726"
          @click="router.push('/AlarmReset')"
        >
          <span>进入检修</span>
          <span>报警复位</span>
          <div class="count">
            <img src="@/assets/index/icon/icon6.png" alt="" />
            <img src="@/assets/index/icon/icon2.png" alt="" />
          </div>
        </div>
      </div>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/Login.vue
@@ -2,6 +2,32 @@
  <div class="login-container">
    <div class="login-header">
      <img src="../assets/login/login-text.png" alt="" />
      <div>
        <img
          v-if="!isFullscreen"
          style="
            width: 1.88rem;
            height: 1.88rem;
            margin-right: 1.81rem;
            cursor: pointer;
          "
          src="@/assets/screen.png"
          alt=""
          @click="screenonToggle"
        />
        <img
          v-if="isFullscreen"
          style="
            width: 1.88rem;
            height: 1.88rem;
            margin-right: 1.81rem;
            cursor: pointer;
          "
          src="@/assets/exitscreen.png"
          alt=""
          @click="screenonToggle"
        />
      </div>
    </div>
    <div class="login-box">
      <!-- å·¦ä¾§å›¾ç‰‡ -->
@@ -25,7 +51,7 @@
          <el-form-item prop="userName">
            <el-input
              v-model="loginForm.userName"
              style="height: 3.13rem"
              style="height: 3.13rem; width: 20.19rem"
              ref="userNameRef"
              type="text"
              size="large"
@@ -37,7 +63,7 @@
            <el-input
              show-password
              v-model="loginForm.password"
              style="height: 3.13rem"
              style="height: 3.13rem; width: 20.19rem"
              type="password"
              size="large"
              auto-complete="off"
@@ -46,7 +72,7 @@
            </el-input>
          </el-form-item>
          <el-form-item prop="verificationCode">
          <!-- <el-form-item prop="verificationCode">
            <div style="display: flex">
              <el-input
                v-model="loginForm.verificationCode"
@@ -66,7 +92,7 @@
                />
              </div>
            </div>
          </el-form-item>
          </el-form-item> -->
          <el-form-item>
            <el-button
              :loading="loading"
@@ -224,8 +250,9 @@
<script setup>
import { getCodeImg, login, CleanUnusedImages } from "@/api/login";
import { useRouter, useRoute } from "vue-router";
import { getCurrentInstance, ref, nextTick, onMounted } from "vue";
import { getCurrentInstance, ref, nextTick, onMounted, onUnmounted } from "vue";
import { ElMessage } from "element-plus";
import screenfull from "screenfull";
import store from "@/store";
import axios from "axios";
@@ -249,7 +276,7 @@
const loginForm = ref({
  userName: "",
  password: "",
  verificationCode: "",
  verificationCode: "1234",
  UUID: undefined,
  tenantId: "0",
});
@@ -528,6 +555,28 @@
    }, 3000);
  }
};
// æ˜¯å¦å…¨å±
const isFullscreen = ref(false);
// ç›‘听变化
const screenchange = () => {
  isFullscreen.value = screenfull.isFullscreen;
};
// åˆ‡æ¢äº‹ä»¶
const screenonToggle = () => {
  screenfull.toggle();
};
// è®¾ç½®ä¾¦å¬å™¨
onMounted(() => {
  screenfull.on("screenchange", screenchange);
});
// åˆ é™¤ä¾¦å¬å™¨
onUnmounted(() => {
  screenfull.off("screenchange", screenchange);
});
</script>
<style lang="less" scoped>
@@ -543,6 +592,7 @@
  flex-direction: column;
  .login-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 4.38rem;
    background-color: #006eff;
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/system/Sys_Menu.vue
@@ -1,14 +1,34 @@
<template>
  <div style="width: 100%;height: 100%;display: flex;background-color: white;" >
  <div
    style="width: 100%; height: 100%; display: flex; background-color: white"
  >
    <!-- <el-input/> -->
    <vol-box :width="940" :mask="true" :height="500" title="图标列表" v-model="model">
    <vol-box
      :width="940"
      :mask="true"
      :height="500"
      title="图标列表"
      v-model="model"
    >
      <Icons :onSelect="onSelect"></Icons>
      <template #footer>
        <el-button type="primary" size="mini" @click="model = false">ç¡® è®¤</el-button>
        <el-button type="primary" size="mini" @click="model = false"
          >ç¡® è®¤</el-button
        >
      </template>
    </vol-box>
    <vol-box :width="600" :mask="true" :height="270" title="其他权限" v-model="actionModel">
      <vol-form ref="actionForm" :formRules="actionOptions" :formFields="actionFields">
    <vol-box
      :width="600"
      :mask="true"
      :height="270"
      title="其他权限"
      v-model="actionModel"
    >
      <vol-form
        ref="actionForm"
        :formRules="actionOptions"
        :formFields="actionFields"
      >
        <template #header>
          <div>
            <el-alert show-icon type="success">
@@ -20,20 +40,33 @@
        </template>
      </vol-form>
      <template #footer>
        <el-button type="primary" size="mini" @click="otherAction">ç¡® è®¤</el-button>
        <el-button type="primary" size="mini" @click="otherAction"
          >ç¡® è®¤</el-button
        >
      </template>
    </vol-box>
    <!-- v-if="tree.length" -->
    <div class="menu-left">
      <div class="m-title"><i class="el-icon-warning-outline"></i>菜单列表</div>
      <el-scrollbar style="height: calc(100vh - 6.5rem - 40px - 10px); width: 200px">
        <VolMenu :onSelect="getTreeItem" :list="tree" :isCollapse="false"></VolMenu>
      <el-scrollbar
        style="height: calc(100vh - 6.5rem - 40px - 10px); width: 200px"
      >
        <VolMenu
          :onSelect="getTreeItem"
          :list="tree"
          :isCollapse="false"
        ></VolMenu>
      </el-scrollbar>
    </div>
    <div class="menu-right" style="margin-left: 10px;">
    <div class="menu-right" style="margin-left: 10px">
      <el-scrollbar style="height: 100%">
        <el-alert title="菜单配置说明" type="warning" :closable="false" show-icon>
        <el-alert
          title="菜单配置说明"
          type="warning"
          :closable="false"
          show-icon
        >
          <div>
            1、如果是用代码生器生成的Vue页面,Url为Vue项目中src->router->viewGrid.js对应表名的path属性
          </div>
@@ -42,31 +75,56 @@
          </div>
        </el-alert>
        <div style="padding: 0px 30px 0 20px">
          <vol-form class="form-content" ref="form" :formRules="options" :formFields="fields">
          <vol-form
            class="form-content"
            ref="form"
            :formRules="options"
            :formFields="fields"
          >
          </vol-form>
          <div>
            <div class="auth-group">
              <label style="width: 100px">权限按钮:</label>
              <div class="ck">
                <el-checkbox-group v-model="actions">
                  <el-checkbox v-for="(item, index) in action" :key="index" :label="item.value">{{ item.text + "(" +
                    item.value + ")" }}</el-checkbox>
                  <el-checkbox
                    v-for="(item, index) in action"
                    :key="index"
                    :label="item.value"
                    >{{ item.text + "(" + item.value + ")" }}</el-checkbox
                  >
                </el-checkbox-group>
              </div>
            </div>
          </div>
          <div style="padding-left: 100px">
            <el-button @click="handleCheckAll" size="mini" type="success" plain><i class="el-icon-check"></i>全
              é€‰</el-button>
            <el-button @click="actionModel = true" size="mini" type="primary" plain><i
                class="el-icon-plus"></i>其他权限</el-button>
            <el-button @click="handleCheckAll" size="mini" type="success" plain
              ><i class="el-icon-check"></i>全 é€‰</el-button
            >
            <el-button
              @click="actionModel = true"
              size="mini"
              type="primary"
              plain
              ><i class="el-icon-plus"></i>其他权限</el-button
            >
          </div>
          <div class="m-btn">
            <el-button type="primary" @click="save"><i class="el-icon-check"></i>保存</el-button>
            <el-button type="success" @click="add"><i class="el-icon-plus"></i>新建</el-button>
            <el-button type="warning" @click="addChild"><i class="el-icon-plus"></i>添加子级</el-button>
            <el-button type="primary" plain @click="addBrother"><i class="el-icon-circle-plus"></i> æ·»åŠ åŒçº§</el-button>
            <el-button type="warning" plain @click="delMenu"><i class="el-icon-delete"></i> åˆ é™¤èœå•</el-button>
            <el-button type="primary" @click="save"
              ><i class="el-icon-check"></i>保存</el-button
            >
            <el-button type="success" @click="add"
              ><i class="el-icon-plus"></i>新建</el-button
            >
            <el-button type="warning" @click="addChild"
              ><i class="el-icon-plus"></i>添加子级</el-button
            >
            <el-button type="primary" plain @click="addBrother"
              ><i class="el-icon-circle-plus"></i> æ·»åŠ åŒçº§</el-button
            >
            <el-button type="warning" plain @click="delMenu"
              ><i class="el-icon-delete"></i> åˆ é™¤èœå•</el-button
            >
          </div>
        </div>
      </el-scrollbar>
@@ -176,7 +234,11 @@
        tigger = true;
        let menuId = this.fields.menuId;
        this.http
          .post("/api/Sys_Menu/delMenu?menuId=" + menuId, {}, "正在删除数据....")
          .post(
            "/api/Sys_Menu/delMenu?menuId=" + menuId,
            {},
            "正在删除数据...."
          )
          .then((x) => {
            if (!x.status) return this.$Message.error(x.message);
            this.$refs.form.reset();
@@ -227,7 +289,7 @@
            orderNo: this.fields.orderNo,
            parentId: this.fields.parentId,
          });
          console.log(this.tree)
          console.log(this.tree);
        });
      });
    },
@@ -246,11 +308,9 @@
    onOpenChange(node) {
      if (node.length == 0) return;
      this.getTreeItem(node[node.length > 1 ? node.length - 1 : 0]);
    }
    },
  },
  created(){
  },
  created() {},
  setup() {
    const tree = ref([]);
    const actionValues = ref([]);
@@ -270,10 +330,10 @@
    });
    const initTree = () => {
      http.post("/api/Sys_Menu/getMenu", {}, true).then((x) => {
        x.forEach(item => {
          item.icon = 'el-icon-menu';
        })
        x.forEach((item) => {
          item.icon = "el-icon-menu";
        });
        tree.value = x;
      });
    };
@@ -426,33 +486,35 @@
    ]);
    const refForm = ref();
    const getTreeItem = (node) => {
      http.post("api/Sys_Menu/getTreeItem?menuId=" + node, {}, true).then((x) => {
        try {
          fields.value.icon = x.icon;
          if (x.auth) {
            x.auth = JSON.parse(x.auth);
            action.value.splice(8, action.value.length);
      http
        .post("api/Sys_Menu/getTreeItem?menuId=" + node, {}, true)
        .then((x) => {
          try {
            fields.value.icon = x.icon;
            if (x.auth) {
              x.auth = JSON.parse(x.auth);
              action.value.splice(8, action.value.length);
            actions.value = x.auth.map((element) => {
              if (actionValues.value.indexOf(element.value) == -1) {
                action.value.push(element);
              }
              return element.value;
            });
          } else {
            action.value.splice(8, action.value.length);
              actions.value = x.auth.map((element) => {
                if (actionValues.value.indexOf(element.value) == -1) {
                  action.value.push(element);
                }
                return element.value;
              });
            } else {
              action.value.splice(8, action.value.length);
              x.auth = [];
              fields.value.icon = "";
              actions.value = [];
            }
          } catch (error) {
            console.log("菜单功能权限转换成JSON失败:" + x.auth);
            x.auth = [];
            fields.value.icon = "";
            //   this.icon = "";
            actions.value = [];
          }
        } catch (error) {
          console.log("菜单功能权限转换成JSON失败:" + x.auth);
          x.auth = [];
          //   this.icon = "";
          actions.value = [];
        }
        refForm.value.reset(x);
      });
          refForm.value.reset(x);
        });
    };
    return {
      tree,
@@ -468,7 +530,7 @@
      actionOptions,
      options,
      form: refForm,
      getTreeItem
      getTreeItem,
    };
  },
  data() {
@@ -521,7 +583,7 @@
      margin-top: 1px;
    }
    >div {
    > div {
      float: left;
    }
  }
@@ -615,4 +677,3 @@
  padding-left: 4px;
}
</style>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/AlarmReset/AlarmReset.vue
@@ -1,10 +1,22 @@
<template>
  <div class="AlarmReset">
    <div style="width: 100%; text-align: center; font-size: 5rem; color: #fff">
    <div
      :style="{
        width: '100%',
        textAlign: 'center',
        fontSize: isMin ? '5rem' : '2rem',
        color: '#fff',
      }"
    >
      æŠ¥è­¦å¤ä½
    </div>
    <div style="margin-top: 3rem">
      <el-table :data="tableData" style="width: 100%" height="800">
      <el-table
        empty-text="暂无数据"
        :data="tableData"
        style="width: 100%"
        :height="isMin ? '800' : '450'"
      >
        <el-table-column prop="Id" label="序号" />
        <el-table-column prop="AlarmContent" label="报警内容" />
        <el-table-column prop="ResetStatus" label="复位状态" />
@@ -40,18 +52,34 @@
      />
    </div>
    <div
      style="
        width: 100%;
        display: flex;
        justify-content: center;
        margin-top: 4rem;
      "
      :style="{
        width: '100%',
        display: 'flex',
        justifyContent: 'center',
        marginTop: isMin ? '4rem' : '2rem',
      }"
    >
      <el-button
        type="primary"
        style="width: 10rem; height: 3rem"
        :style="{
          width: isMin ? '16rem' : '10rem',
          height: isMin ? '5rem' : '2.5rem',
        }"
        @click="handleBecomeTrue"
        >报警复位</el-button
        ><span :style="{ fontSize: isMin ? '3rem' : '1.5rem' }">
          æŠ¥è­¦å¤ä½</span
        ></el-button
      >
      <el-button
        type="primary"
        :style="{
          width: isMin ? '20rem' : '10rem',
          height: isMin ? '5rem' : '2.5rem',
        }"
        @click="handleClearAlarm"
        ><span :style="{ fontSize: isMin ? '3rem' : '1.5rem' }">
          æ¸…除报警信息</span
        ></el-button
      >
    </div>
  </div>
@@ -59,7 +87,7 @@
<script setup>
import { ref, onMounted, onUnmounted } from "vue";
import { ElMessage } from "element-plus";
import { BecomeTrue } from "@/api/newapi/AlarmReset.js";
import { BecomeTrue, ClearAlarm } from "@/api/newapi/AlarmReset.js";
import { formatTime } from "@/utils/index.js";
const timer = ref(null);
@@ -68,26 +96,37 @@
const pageSize = ref(10); // æ¯é¡µæ˜¾ç¤ºçš„æ¡æ•°
const currentPage = ref(0); // å½“前页码
const total = ref(0); // æ€»æ¡æ•°
const isStart = ref(false); // æ˜¯å¦å¼€å§‹
const positionvalue = ref({}); // ä½ç½®å€¼
const createSocket = (url) => {
  clearInterval(timer.value);
  // åˆ›å»ºWebSocket连接
  //"ws://127.0.0.1:9295/admin"
  client.value = new WebSocket("ws://192.168.2.103:5173/");
  //192.168.1.103
  client.value = new WebSocket("ws://192.168.1.103:5173/");
  client.value.onopen = function () {
    console.log("WebSocket è¿žæŽ¥æˆåŠŸ");
  };
  client.value.onmessage = function (event) {
    let data = JSON.parse(event.data);
    tableData.value = data.Data.slice(
      currentPage.value * pageSize.value,
      (currentPage.value + 1) * pageSize.value
    );
    total.value = data.Data.length; // æ›´æ–°æ€»æ¡æ•°
    console.log("WebSocket æŽ¥æ”¶åˆ°æ¶ˆæ¯", tableData.value);
    if (data.Status) {
      tableData.value = data.Data.slice(
        currentPage.value * pageSize.value,
        (currentPage.value + 1) * pageSize.value
      );
      total.value = data.Data.length; // æ›´æ–°æ€»æ¡æ•°
    } else {
      positionvalue.value = data;
    }
    console.log("WebSocket æŽ¥æ”¶åˆ°æ¶ˆæ¯", data);
  };
  client.value.onclose = function () {
    console.log("WebSocket è¿žæŽ¥å…³é—­");
    timer.value = setTimeout(createSocket, 1000);
    if (isStart.value) {
      timer.value = setTimeout(createSocket, 1000);
    }
  };
  client.value.onerror = function () {};
@@ -95,12 +134,10 @@
const handleCurrentChange = (val) => {
  currentPage.value = val - 1; // æ›´æ–°å½“前页码
};
const account = JSON.parse(localStorage.getItem("user")).userName; // èŽ·å–è´¦å·
// const account = JSON.parse(localStorage.getItem("user")).userName; // èŽ·å–è´¦å·
//复位按钮方法
const handleBecomeTrue = (val) => {
  BecomeTrue({
    account: account,
  }).then((res) => {
const handleBecomeTrue = () => {
  BecomeTrue().then((res) => {
    if (res.code == 0) {
      ElMessage({
        message: "复位成功",
@@ -114,16 +151,31 @@
    }
  });
};
//清除报警信息方法
const handleClearAlarm = () => {
  ClearAlarm().then((res) => {
    if (res.code == 0) {
      ElMessage({
        message: "清除成功",
        type: "success",
      });
    }
  });
};
const isMin = ref(false); // æ˜¯å¦æœ€å°åŒ–
onMounted(() => {
  isMin.value = window.innerWidth <= 1080; // åˆ¤æ–­æ˜¯å¦æœ€å°åŒ–
  isStart.value = true; // è®¾ç½®ä¸ºå¼€å§‹çŠ¶æ€
  createSocket();
});
onUnmounted(() => {
  isStart.value = false;
  clearInterval(timer.value);
  if (client.value) {
    client.value.close();
  }
  clearInterval(timer.value);
});
</script>
<style lang="scss" scoped>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/DataLogging/Datalogging.vue
@@ -15,7 +15,7 @@
          :class="['item', isactive == 2 ? 'isactive' : '']"
          @click="changeactive(2)"
        >
          æ£€ä¿®æ“ä½œè®°å½•
          æŽˆæƒè®°å½•
        </div>
        <div
          v-if="roleINFO == 1"
@@ -38,9 +38,9 @@
              border-radius: 0 0.25rem 0.25rem 0;
              box-shadow: none;
              width: 19rem;
              height: 2rem;
              border-left: 0;
            "
            class="time_picker"
            format="YYYY-MM-DD HH:mm:ss"
            type="datetimerange"
            range-separator="~"
@@ -52,9 +52,11 @@
        <div class="serch_box">
          <div class="serchb">全局搜索</div>
          <input
            @focus="focusInput"
            v-model="queryForm.selectInput"
            placeholder="请输入关键词搜索"
            style="border-left: 0.06rem solid #e2e2e2"
            ref="inputRef"
          />
        </div>
        <el-button
@@ -89,19 +91,31 @@
          :header-cell-style="{
            background: 'rgba(250,250,250,1)',
            color: '#101010',
            fontSize: '0.88rem',
            fontSize: '1.25rem',
            height: '3rem',
            border: 'none',
          }"
          :row-style="{
            color: '#101010',
            fontSize: '0.88rem',
            fontSize: '1.25rem',
            height: '3rem',
            WWWW,
          }"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="operatorName" label="姓名" align="center" />
          <el-table-column prop="teamName" label="班组" align="center" />
          <!-- <el-table-column prop="teamName" label="组别" align="center" /> -->
          <el-table-column prop="" label="组员类型" align="center">
            <template #default="scope">
              <span v-if="scope.row.isLeader == 0">组员</span>
              <span v-else-if="scope.row.isLeader == 1">组长</span>
            </template>
          </el-table-column>
          <el-table-column prop="dept_Id" label="检修道" align="center">
            <template #default="scope">
              <div>{{ scope.row.dept_Id }}</div>
            </template></el-table-column
          >
          <el-table-column prop="headImageUrl" label="人脸" align="center">
            <template #default="scope">
              <el-image
@@ -118,11 +132,16 @@
            label="分配时间"
            align="center"
          />
          <el-table-column prop="Creater" label="分配检修员" align="center">
          </el-table-column>
          <!-- <el-table-column prop="Creater" label="分配检修员" align="center">
          </el-table-column> -->
          <el-table-column
            prop="ipAddress"
            label="设备IP"
            align="center"
          ></el-table-column>
        </el-table>
        <!-- æ£€ä¿®æ“ä½œè®°å½•记录 -->
        <!-- å§“名 userName,单位 uerUnit,班组 userTeam,操作人 modifier,启用时间 enableTime,停用时间  disableTime-->
        <!-- æŽˆæƒè®°å½• -->
        <el-table
          empty-text="暂无数据"
          v-if="isactive == 2"
@@ -132,41 +151,23 @@
          :header-cell-style="{
            background: 'rgba(250,250,250,1)',
            color: '#101010',
            fontSize: '0.88rem',
            fontSize: '1.25rem',
            height: '3rem',
            border: 'none',
          }"
          :row-style="{
            color: '#101010',
            fontSize: '0.88rem',
            fontSize: '1.25rem',
            height: '3rem',
          }"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="userTrueName" label="姓名" align="center" />
          <el-table-column prop="userName" label="姓名" align="center" />
          <el-table-column prop="uerUnit" label="单位" align="center" />
          <el-table-column prop="userteam" label="班组" align="center" />
          <el-table-column prop="headImageUrl" label="人脸" align="center">
            <template #default="scope">
              <el-image
                style="width: 5rem; height: 5rem"
                :src="'http://192.168.1.103:9093' + scope.row.headImageUrl"
                show-progress
                :initial-index="4"
                fit="cover"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="maintenancStartTime"
            label="进入检修时间"
            align="center"
          />
          <el-table-column
            prop="maintenancEendTime"
            label="退出检修时间"
            align="center"
          />
          <el-table-column prop="" label="检修道号" align="center">
          <el-table-column prop="enableTime" label="启用时间" align="center" />
          <el-table-column prop="disableTime" label="禁用时间" align="center" />
          <el-table-column prop="modifier" label="操作人" align="center">
          </el-table-column>
        </el-table>
@@ -180,20 +181,20 @@
          :header-cell-style="{
            background: 'rgba(250,250,250,1)',
            color: '#101010',
            fontSize: '0.88rem',
            fontSize: '1.25rem',
            height: '3rem',
            border: 'none',
          }"
          :row-style="{
            color: '#101010',
            fontSize: '0.88rem',
            fontSize: '1.25rem',
            height: '3rem',
          }"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="userTrueName" label="姓名" align="center" />
          <el-table-column prop="opCenten" label="单位" align="center" />
          <el-table-column prop="userteam" label="班组" align="center" />
          <!-- <el-table-column prop="opCenten" label="单位" align="center" /> -->
          <!-- <el-table-column prop="userteam" label="组别" align="center" /> -->
          <el-table-column prop="headImageUrl" label="人脸" align="center">
            <template #default="scope">
              <el-image
@@ -206,8 +207,8 @@
            </template>
          </el-table-column>
          <el-table-column prop="loginTiem" label="登录时间" align="center" />
          <el-table-column prop="outTiem" label="退出时间" align="center" />
          <el-table-column label="操作内容" align="center" />
          <!-- <el-table-column prop="outTiem" label="退出时间" align="center" /> -->
          <!-- <el-table-column label="操作内容" align="center" /> -->
        </el-table>
      </div>
      <div
@@ -267,7 +268,7 @@
} from "@/api/newapi/Datalogging";
import {
  MaintenanceSettingRecord,
  MaintenanceOperationRecord,
  AuthGetPageData,
} from "@/api/newapi/MaintenanceTeam";
const obj = {
  selectTime: [], // æ—¶é—´èŒƒå›´
@@ -283,6 +284,21 @@
const pageTotal = ref(0);
const pageTotal1 = ref(0);
const pageTotal2 = ref(0);
const inputRef = ref(null);
const focusInput = () => {
  if (typeof Windows !== "undefined") {
    const textInputPane =
      Windows.UI.ViewManagement.InputPane.getForCurrentView();
    // æ˜¾ç¤ºè™šæ‹Ÿé”®ç›˜
    textInputPane.show();
    // éšè—è™šæ‹Ÿé”®ç›˜
    textInputPane.hide();
  }
  inputRef.value?.focus();
  console.log("focusInput called", inputRef.value);
};
//分页请求参数
const pageQuery = ref({
  page: 1, //当前页面
@@ -451,24 +467,12 @@
    { name: "createTime", value: startTime, displayType: "ThanOrEqual" },
    { name: "createTime", value: endTime, displayType: "LessOrEqual" },
  ];
  MaintenanceOperationRecord({
    pageIndex: pageQuery1.value.page,
    pageSize: pageQuery1.value.rows,
    searchKeyword: queryForm.value.selectInput,
    startDate:
      queryForm.value.selectTime.length != 0
        ? queryForm.value.selectTime[0]
        : "",
    endDate:
      queryForm.value.selectTime.length != 0
        ? queryForm.value.selectTime[1]
        : "",
    sortField: "maintenancStartTime",
    sortOrder: "desc",
    account: account,
  AuthGetPageData({
    ...pageQuery.value,
    filter,
  }).then((res) => {
    tableData.value = res.data.items;
    pageTotal1.value = res.data.totalCount;
    tableData.value = res.rows;
    pageTotal1.value = res.total;
  });
};
//登录记录
@@ -687,6 +691,118 @@
    border-bottom: 0.06rem solid rgba(233, 233, 233, 1);
  }
}
@media screen and (max-width: 1080px) {
  .Datalogging {
    display: flex;
    background-color: #fff;
    .content {
      width: 100%;
      display: flex;
      flex-direction: column;
      .checkbox {
        width: 40rem !important;
        display: flex;
        justify-content: space-between;
        margin-top: 1rem;
        margin-left: 1.31rem;
        .item {
          width: 12rem;
          height: 2.88rem;
          border-radius: 0.25rem;
          background-color: rgba(190, 199, 209, 1);
          color: rgba(255, 255, 255, 1);
          font-size: 1.25rem;
          text-align: center;
          line-height: 2.88rem;
          cursor: pointer;
        }
        .isactive {
          background-color: rgba(16, 16, 16, 1);
          color: rgba(255, 255, 255, 1);
        }
      }
      .serch {
        display: flex;
        margin-top: 1.31rem;
        align-items: center;
        .time_box {
          display: flex;
          align-items: center;
          text-align: center;
          margin-left: 0.98rem;
          .time {
            box-sizing: border-box;
            width: 7rem;
            height: 2.5rem;
            text-align: center;
            border: 0.06rem solid rgba(222, 222, 222, 1);
            border-radius: 0.25rem 0 0 0.25rem;
            font-size: 1.25rem;
            display: flex;
            align-items: center;
            justify-content: center;
          }
        }
        .serch_box {
          display: flex;
          align-items: center;
          text-align: center;
          margin-left: 0.98rem;
          border-radius: 0.38rem;
          .serchb {
            box-sizing: border-box;
            width: 6.88rem;
            height: 2.5rem;
            text-align: center;
            font-size: 1.25rem;
            display: flex;
            align-items: center;
            justify-content: center;
            border: 0.06rem solid rgba(222, 222, 222, 1);
          }
          input {
            box-sizing: border-box;
            outline: none;
            width: 19rem;
            height: 2.5rem;
            border: 0.06rem solid rgba(222, 222, 222, 1);
            border-radius: 0 0.25rem 0.25rem 0;
            padding-left: 0.3125rem;
            font-size: 1rem;
          }
        }
      }
      .btns {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-top: 1.31rem;
        margin-left: 1.13rem;
        padding-right: 2rem;
        box-sizing: border-box;
      }
    }
    .my-header {
      height: 3.84rem;
      display: flex;
      justify-content: space-between;
      border-bottom: 0.06rem solid rgba(233, 233, 233, 1);
    }
  }
}
</style>
<style>
.confirmButtonClass {
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/Enteroverhaul/Enteroverhaul.vue
@@ -1,7 +1,12 @@
<template>
  <div class="Enteroverhaul">
    <div class="btns">
      <el-button class="btn" type="primary" @click="startMaintenceTask">
      <el-button
        :disabled="startdisabled"
        class="btn"
        type="primary"
        @click="startMaintenceTask"
      >
        <div
          style="
            display: flex;
@@ -21,6 +26,7 @@
              font-size: 1.25rem;
              margin-top: 1.6rem;
            "
            class="btn_text"
            >开始检修</span
          >
        </div>
@@ -29,6 +35,7 @@
        class="btn"
        type="primary"
        style="margin-left: 6.81rem"
        :disabled="!isStart"
        @click="stopMaintenceTask"
      >
        <div
@@ -50,6 +57,7 @@
              font-size: 1.25rem;
              margin-top: 1.6rem;
            "
            class="btn_text"
            >结束检修</span
          >
        </div>
@@ -87,22 +95,22 @@
            ></template
          >
        </el-table-column>
        <el-table-column
        <!-- <el-table-column
          prop="maintenanceDate"
          label="派发任务时间"
          align="center"
        />
        /> -->
        <el-table-column
          prop="maintenancStartTime"
          label="开始检修时间"
          align="center"
        />
        <el-table-column
        <!-- <el-table-column
          prop="maintenancEendTime"
          label="结束检修时间"
          align="center"
        />
        /> -->
      </el-table>
    </div>
  </div>
@@ -115,6 +123,8 @@
  StartMaintenceTask,
  StopMaintenanceTask,
} from "@/api/user";
import { YShowStartTake } from "@/api/newapi/Maintenance.js";
import { ElMessage } from "element-plus";
const userInfo = ref(store.state.userInfo);
const isStart = ref(false); //是否开始检修
@@ -127,6 +137,17 @@
    tableData.value = [res.data];
  });
};
const getStartTake = async () => {
  YShowStartTake().then((res) => {
    if (res.data.length > 0) {
      isStart.value = true;
    } else {
      isStart.value = false;
    }
    tableData.value = res.data;
  });
};
const startdisabled = ref(false); //开始按钮是否禁用
//开始检修
const startMaintenceTask = async () => {
  StartMaintenceTask({
@@ -134,6 +155,8 @@
  }).then((res) => {
    isStart.value = true;
    tableData.value = [res.data];
    startdisabled.value = true;
    getStartTake();
  });
};
//结束检修
@@ -147,7 +170,8 @@
};
onMounted(() => {
  getMaintenanceTasksOfTheDay();
  // getMaintenanceTasksOfTheDay();
  getStartTake();
});
</script>
<style lang="scss" scoped>
@@ -158,7 +182,6 @@
  .btns {
    margin-top: 7%;
    .btn {
      width: 12.19rem;
      height: 11.63rem;
@@ -180,4 +203,37 @@
    margin-top: 5.19rem;
  }
}
@media screen and (max-width: 1080px) {
  .Enteroverhaul {
    display: flex;
    flex-direction: column;
    align-items: center;
    .btns {
      margin-top: 7%;
      .btn {
        width: 25.19rem;
        height: 24.63rem;
        background-image: url("@/assets/Enteroverhaul/btnbg.png");
        background-size: 100% 100%;
        background-repeat: no-repeat;
        border: none;
        .btn_text {
          font-size: 2.88rem !important;
        }
      }
    }
    .content_box {
      width: 70%;
      height: 40%;
      background-color: rgba(9, 48, 104, 1);
      color: rgba(16, 16, 16, 1);
      font-size: 0.88rem;
      box-shadow: 0rem 0.13rem 0.38rem 0rem rgba(6, 229, 231, 1);
      border: 0.06rem solid rgba(6, 229, 231, 1);
      margin-top: 5.19rem;
    }
  }
}
</style>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/Parametersettings/Parametersettings.vue
@@ -3,6 +3,7 @@
    <div class="Parametersettings_l">
      <div
        style="color: rgba(0, 9, 56, 1); font-size: 1.13rem; font-weight: bold"
        class="title"
      >
        ä¼¸å‡ºç¼©å›žé€Ÿåº¦è®¾ç½®
      </div>
@@ -18,72 +19,90 @@
      >
        <el-form-item prop="extendSpeed">
          <template #label>
            <span style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              >å·¦PLC自动伸出缩回速度m/min:</span
            <span
              style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              class="title_span"
              >PLC自动伸出缩回速度m/min:</span
            >
          </template>
          <el-input
            style="height: 1.88rem"
            class="title_input"
            placeholder="请输入"
            v-model="ruleForm.extendSpeed"
          />
        </el-form-item>
        <el-form-item prop="retractionSpeed">
        <!-- <el-form-item prop="retractionSpeed">
          <template #label>
            <span style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
            <span
              style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              class="title_span"
              >右PLC自动伸出缩回速度m/min:</span
            >
          </template>
          <el-input
            style="height: 1.88rem"
            class="title_input"
            placeholder="请输入"
            v-model="ruleForm.retractionSpeed"
          />
        </el-form-item>
        </el-form-item> -->
        <el-form-item prop="manualExtend">
          <template #label>
            <span style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              >å·¦PLC手动伸出缩回速度m/min:</span
            <span
              style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              class="title_span"
              >PLC手动伸出缩回速度m/min:</span
            >
          </template>
          <el-input
            style="height: 1.88rem"
            class="title_input"
            placeholder="请输入"
            v-model="ruleForm.manualExtend"
          />
        </el-form-item>
        <el-form-item prop="manualRetraction">
        <!-- <el-form-item prop="manualRetraction">
          <template #label>
            <span style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
            <span
              style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              class="title_span"
              >右PLC手动伸出缩回速度m/min:</span
            >
          </template>
          <el-input
            style="height: 1.88rem"
            class="title_input"
            placeholder="请输入"
            v-model="ruleForm.manualRetraction"
          />
        </el-form-item>
        </el-form-item> -->
        <el-form-item prop="leftPosition">
          <template #label>
            <span style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
            <span
              style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              class="title_span"
              >å·¦PLC自动伸到位:</span
            >
          </template>
          <el-input
            style="height: 1.88rem"
            class="title_input"
            placeholder="请输入"
            v-model="ruleForm.leftPosition"
          />
        </el-form-item>
        <el-form-item prop="rightPosition">
          <template #label>
            <span style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
            <span
              style="color: rgba(0, 9, 56, 1); font-size: 0.88rem"
              class="title_span"
              >右PLC自动伸到位:</span
            >
          </template>
          <el-input
            style="height: 1.88rem"
            class="title_input"
            placeholder="请输入"
            v-model="ruleForm.rightPosition"
          />
@@ -99,11 +118,7 @@
          >
            <el-button
              style="height: 1.88rem; width: 5.63rem"
              @click="resetForm(ruleFormRef)"
              >取消</el-button
            >
            <el-button
              style="height: 1.88rem; width: 5.63rem"
              class="title_button"
              type="primary"
              @click="submitForm(ruleFormRef)"
            >
@@ -113,93 +128,6 @@
        </el-form-item>
      </el-form>
    </div>
    <!-- <div class="Parametersettings_c">
      <div
        style="color: rgba(0, 9, 56, 1); font-size: 1.13rem; font-weight: bold"
      >
        PLC信号监控
      </div>
      <div
        class="box"
        style="
          display: flex;
          justify-content: space-between;
          flex-wrap: wrap;
          padding: 0 5.25rem;
          margin-top: 3.03rem;
        "
      >
        <el-row>
          <el-col style="display: flex; justify-content: space-between">
            <div class="box_item"></div>
            <div class="box_item"></div>
            <div class="box_item"></div>
          </el-col>
          <el-col
            style="
              display: flex;
              justify-content: space-between;
              margin-top: 2.78rem;
            "
            ><div class="box_item"></div>
            <div class="box_item"></div>
            <div style="width: 6.25rem; height: 6.25rem"></div
          ></el-col>
        </el-row>
      </div>
    </div>
    <div class="Parametersettings_r">
      <div
        style="color: rgba(0, 9, 56, 1); font-size: 1.13rem; font-weight: bold"
      >
        æ•…障处理
      </div>
      <div
        style="
          display: flex;
          flex-direction: column;
          margin-top: 4.19rem;
          align-items: center;
          justify-content: space-around;
          height: 40%;
        "
      >
        <el-button
          type="primary"
          style="
            width: 7.38rem;
            height: 2.75rem;
            background-color: rgba(230, 160, 0, 1);
            color: rgba(255, 255, 255, 1);
            font-size: 1rem;
            margin-left: 1rem;
          "
          >回原点</el-button
        >
        <el-button
          type="primary"
          style="
            width: 7.38rem;
            height: 2.75rem;
            background-color: rgba(0, 207, 55, 1);
            color: rgba(255, 255, 255, 1);
            font-size: 1rem;
          "
          >复位</el-button
        >
        <el-button
          type="primary"
          style="
            width: 7.38rem;
            height: 2.75rem;
            background-color: rgba(255, 0, 0, 1);
            color: rgba(255, 255, 255, 1);
            font-size: 1rem;
          "
          >清除故障</el-button
        >
      </div>
    </div> -->
  </div>
</template>
<script setup>
@@ -224,8 +152,8 @@
});
//保存
const submitForm = () => {
  console.log(ruleForm.value);
  ruleForm.value.retractionSpeed = ruleForm.value.extendSpeed;
  ruleForm.value.manualRetraction = ruleForm.value.manualExtend;
  AddData(ruleForm.value).then((res) => {
    if (res.code == 0) {
      ElMessage.success("保存成功");
@@ -288,4 +216,21 @@
    padding: 1.44rem 1.25rem;
  }
}
@media screen and (max-width: 1080px) {
  .title {
    font-size: 3rem !important;
  }
  .title_span {
    font-size: 2rem !important;
  }
  .title_input {
    height: 4rem !important;
    font-size: 3rem !important;
  }
  .title_button {
    height: 5rem !important;
    width: 14rem !important;
    font-size: 3rem !important;
  }
}
</style>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/PickAndDrop/Manualcontrol.vue
@@ -6,14 +6,16 @@
          @click="handleAutoPickAndDrop('伸出')"
          type="primary"
          size="small"
          style="
            width: 14.69rem;
            height: 5.06rem;
            color: rgba(64, 253, 240, 1);
            background-color: rgba(6, 229, 231, 0.3);
            border: none;
            border-top: 0.25rem solid rgba(6, 229, 231, 1);
          "
          :style="{
            width: '14.69rem',
            height: '5.06rem',
            color: !AutoPickColor ? 'rgba(64, 253, 240, 1)' : '#fff',
            backgroundColor: !AutoPickColor
              ? 'rgba(6, 229, 231, 0.3)'
              : 'rgba(205, 208, 214,0.5)',
            border: 'none',
            borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
          }"
        >
          <div class="btnicon">
            <span
@@ -38,14 +40,16 @@
          @click="handleAutoPickAndDrop('缩回')"
          type="primary"
          size="small"
          style="
            width: 14.69rem;
            height: 5.06rem;
            color: rgba(64, 253, 240, 1);
            background-color: rgba(6, 229, 231, 0.3);
            border: none;
            border-top: 0.25rem solid rgba(6, 229, 231, 1);
          "
          :style="{
            width: '14.69rem',
            height: '5.06rem',
            color: !AutoDropColor ? 'rgba(64, 253, 240, 1)' : '#fff',
            backgroundColor: !AutoDropColor
              ? 'rgba(6, 229, 231, 0.3)'
              : 'rgba(205, 208, 214,0.5)',
            border: 'none',
            borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
          }"
        >
          <div class="btnicon">
            <span
@@ -70,14 +74,16 @@
          @click="handlePouse"
          type="primary"
          size="small"
          style="
            width: 14.69rem;
            height: 5.06rem;
            color: rgba(64, 253, 240, 1);
            background-color: rgba(6, 229, 231, 0.3);
            border: none;
            border-top: 0.25rem solid rgba(6, 229, 231, 1);
          "
          :style="{
            width: '14.69rem',
            height: '5.06rem',
            color: !pouseColor ? 'rgba(64, 253, 240, 1)' : '#fff',
            backgroundColor: !pouseColor
              ? 'rgba(6, 229, 231, 0.3)'
              : 'rgba(205, 208, 214,0.5)',
            border: 'none',
            borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
          }"
        >
          <div class="btnicon">
            <span
@@ -119,14 +125,16 @@
              @click="handManualOperation('å·¦', '伸出')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !leftPickColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !leftPickColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -151,14 +159,16 @@
              @click="handManualOperation('å·¦', '缩回')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !leftDropColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !leftDropColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -179,16 +189,19 @@
              </div>
              <span style="font-size: 2.25rem; text-align: center">缩回</span>
            </el-button>
            <div style="color: #fff; font-size: 2rem; margin-left: 15rem">
              å³ä¾§ä¼¸ç¼©æ†
            <div style="color: #fff; font-size: 2rem; margin-left: 13rem">
              å·¦ä¾§ä¼¸ç¼©æ†ä½ç½®:{{
                leftposition.Liftvalue ? parseInt(leftposition.Liftvalue) : 0
              }}
            </div>
          </div>
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.leftPosition }}</div>
          <!--  ruleForm.leftPosition -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.manualExtend }}</div>
          <div class="item">缩回速度:{{ ruleForm.manualExtend }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -203,7 +216,7 @@
            <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
              >视频监控左侧</span
            >
            <img src="@/assets/imgs/right.png" alt="" />
            <img src="@/assets/imgs/left.png" alt="" />
          </div>
        </div>
      </div>
@@ -214,14 +227,16 @@
              @click="handManualOperation('右', '伸出')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !rightPickColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !rightPickColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -246,14 +261,16 @@
              @click="handManualOperation('右', '缩回')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !rightDropColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !rightDropColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -274,16 +291,21 @@
              </div>
              <span style="font-size: 2.25rem; text-align: center">缩回</span>
            </el-button>
            <div style="color: #fff; font-size: 2rem; margin-left: 15rem">
              å·¦ä¾§ä¼¸ç¼©æ†
            <div style="color: #fff; font-size: 2rem; margin-left: 13rem">
              å³ä¾§ä¼¸ç¼©æ†ä½ç½®:{{
                rightposition.Rightvalue
                  ? parseInt(rightposition.Rightvalue)
                  : 0
              }}
            </div>
          </div>
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.rightPosition }}</div>
          <!-- ruleForm.rightPosition -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.manualRetraction }}</div>
          <div class="item">缩回速度:{{ ruleForm.manualRetraction }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -298,7 +320,7 @@
            <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
              >视频监控右侧</span
            >
            <img src="@/assets/imgs/left.png" alt="" />
            <img src="@/assets/imgs/right.png" alt="" />
          </div>
        </div>
      </div>
@@ -311,14 +333,16 @@
              @click="handManualOperation('å·¦', '伸出')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !leftPickColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !leftPickColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -343,14 +367,16 @@
              @click="handManualOperation('å·¦', '缩回')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !leftDropColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !leftDropColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -374,14 +400,17 @@
          </div>
          <div style="color: #fff; font-size: 2rem">左侧伸缩杆</div>
          <span style="color: #fff; font-size: 2rem"
            >当前伸缩杆位置:{{ Position.right }}</span
            >当前伸缩杆位置:{{
              leftposition.Liftvalue ? parseInt(leftposition.Liftvalue) : 0
            }}</span
          >
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.leftPosition }}</div>
          <!--  ruleForm.leftPosition -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.manualExtend }}</div>
          <div class="item">缩回速度:{{ ruleForm.manualExtend }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -396,7 +425,7 @@
            <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
              >视频监控左侧</span
            >
            <img src="@/assets/imgs/right.png" alt="" />
            <img src="@/assets/imgs/left.png" alt="" />
          </div>
        </div>
      </div>
@@ -407,14 +436,16 @@
              @click="handManualOperation('右', '伸出')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !rightPickColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !rightPickColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -439,14 +470,16 @@
              @click="handManualOperation('右', '缩回')"
              type="primary"
              size="small"
              style="
                width: 14.69rem;
                height: 5.06rem;
                color: rgba(64, 253, 240, 1);
                background-color: rgba(6, 229, 231, 0.3);
                border: none;
                border-top: 0.25rem solid rgba(6, 229, 231, 1);
              "
              :style="{
                width: '14.69rem',
                height: '5.06rem',
                color: !rightDropColor ? 'rgba(64, 253, 240, 1)' : '#fff',
                backgroundColor: !rightDropColor
                  ? 'rgba(6, 229, 231, 0.3)'
                  : 'rgba(205, 208, 214,0.5)',
                border: 'none',
                borderTop: '0.25rem solid rgba(6, 229, 231, 1)',
              }"
            >
              <div class="btnicon">
                <span
@@ -470,14 +503,17 @@
          </div>
          <div style="color: #fff; font-size: 2rem">右侧伸缩杆</div>
          <span style="color: #fff; font-size: 2rem"
            >当前伸缩杆位置:{{ Position.right }}</span
            >当前伸缩杆位置:{{
              rightposition.Rightvalue ? parseInt(rightposition.Rightvalue) : 0
            }}</span
          >
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.rightPosition }}</div>
          <!-- ruleForm.rightPosition -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.manualRetraction }}</div>
          <div class="item">缩回速度:{{ ruleForm.manualRetraction }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -492,16 +528,14 @@
            <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
              >视频监控右侧</span
            >
            <div
            <!-- <div id="video-container"></div> -->
            <img src="@/assets/imgs/right.png" alt="" />
            <!-- <div
              id="playWnd"
              class="playWnd"
              style="left: 109px; top: 133px"
            ></div>
            <!-- <iframe
              src="http://192.168.2.168/doc/pageview.asp"
              id="childFrame"
              style="height: 100%"
            ></iframe> -->
              ref="playWnd"
            ></div> -->
          </div>
        </div>
      </div>
@@ -509,7 +543,7 @@
  </div>
</template>
<script setup>
import { ref, onMounted, nextTick } from "vue";
import { ref, onMounted, nextTick, onUnmounted } from "vue";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import {
@@ -517,19 +551,62 @@
  GetPosition,
  AutoPickAndDrop,
  Pouse,
  GetParameter,
} from "@/api/newapi/Parameters.js";
// import { WebVideoCtrl } from "@/assets/webControl/webVideoCtrl.js";
// import EZUIKit from "ezuikit-js";
const router = useRouter();
const isMobile = ref(false);
const Position = ref({
  left: 0,
  lift: 0,
  right: 0,
});
const rightposition = ref({});
const leftposition = ref({});
const tableData = ref([]);
const isStart = ref(false); // æ˜¯å¦å¼€å§‹
const timer = ref(null);
const client = ref(null);
const pouseColor = ref(false);
const AutoPickColor = ref(false); // ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
const AutoDropColor = ref(false); // ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
const rightPickColor = ref(false); // å³ä¾§ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
const rightDropColor = ref(false); // å³ä¾§ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
const leftPickColor = ref(false); // å·¦ä¾§ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
const leftDropColor = ref(false); // å·¦ä¾§ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
const jumpRouter = (path) => {
  router.push(path);
};
const handManualOperation = async (position, ExtendedState) => {
const handManualOperation = throttle(async (position, ExtendedState) => {
  if (position == "右") {
    if (ExtendedState == "伸出") {
      rightPickColor.value = true; // å³ä¾§ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
    } else {
      rightDropColor.value = true; // å³ä¾§ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
    }
  } else {
    if (ExtendedState == "伸出") {
      leftPickColor.value = true; // å·¦ä¾§ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
    } else {
      leftDropColor.value = true; // å·¦ä¾§ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
    }
  }
  setTimeout(() => {
    if (position == "右") {
      if (ExtendedState == "伸出") {
        rightPickColor.value = false; // å³ä¾§ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
      } else {
        rightDropColor.value = false; // å³ä¾§ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
      }
    } else {
      if (ExtendedState == "伸出") {
        leftPickColor.value = false; // å·¦ä¾§ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
      } else {
        leftDropColor.value = false; // å·¦ä¾§ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
      }
    }
  }, 2000);
  try {
    const res = await ManualOperation({
      position: position,
@@ -552,10 +629,20 @@
      type: "error",
    });
  }
  console.log(res);
};
const handleAutoPickAndDrop = async (val) => {
}, 2000);
const handleAutoPickAndDrop = throttle(async (val) => {
  if (val == "伸出") {
    AutoPickColor.value = true; // ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
  } else {
    AutoDropColor.value = true; // ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
  }
  setTimeout(() => {
    if (val == "伸出") {
      AutoPickColor.value = false; // ä¼¸å‡ºæ—¶é¢œè‰²ä¸ºé»˜è®¤é¢œè‰²
    } else {
      AutoDropColor.value = false; // ç¼©å›žæ—¶é¢œè‰²ä¸ºå˜è‰²
    }
  }, 2000);
  try {
    const response = await AutoPickAndDrop({
      ExtendedState: val,
@@ -569,8 +656,12 @@
    console.error(error);
    ElMessage.error("操作失败");
  }
};
const handlePouse = async () => {
}, 2000);
const handlePouse = throttle(async () => {
  pouseColor.value = !pouseColor.value; // åˆ‡æ¢é¢œè‰²
  setTimeout(() => {
    pouseColor.value = !pouseColor.value; // åˆ‡æ¢é¢œè‰²
  }, 2000);
  try {
    const response = await Pouse();
    if (response.code === 0) {
@@ -578,158 +669,111 @@
    } else {
      ElMessage.error(response.message);
    }
    console.log("Pouse response:", response);
  } catch (error) {
    console.error(error);
    ElMessage.error(error);
  }
};
  // 5秒后恢复原来的颜色
}, 2000);
//获取当前位置
const getPosition = () => {
  GetPosition().then((res) => {
// const getPosition = () => {
//   GetPosition().then((res) => {
//     if (res.code == 0) {
//       Position.value.lift = res.data.lift;
//       Position.value.right = res.data.right;
//     }
//   });
// };
function throttle(func, wait) {
  // ä¸Šä¸€æ¬¡æ‰§è¡Œå‡½æ•°çš„æ—¶é—´æˆ³ï¼Œåˆå§‹å€¼ä¸º 0
  let lastTime = 0;
  // è¿”回一个闭包函数,作为节流后的函数
  return function (...args) {
    // èŽ·å–å½“å‰æ—¶é—´æˆ³
    const now = Date.now();
    // å¦‚果当前时间与上一次执行时间的差值大于等于 wait,则执行函数
    if (now - lastTime >= wait) {
      // æ›´æ–°ä¸Šä¸€æ¬¡æ‰§è¡Œå‡½æ•°çš„æ—¶é—´æˆ³
      lastTime = now;
      // è°ƒç”¨åŽŸå§‹å‡½æ•°ï¼Œå¹¶ä¼ å…¥å‚æ•°
      func(...args);
    }
  };
}
const ruleForm = ref({
  creater: "string",
  createDate: "2025-03-27T05:48:57.698Z",
  modifier: "string",
  modifyDate: "2025-03-27T05:48:57.698Z",
  id: 0,
  extendSpeed: 0,
  retractionSpeed: 0,
  manualExtend: 0,
  manualRetraction: 0,
  // depid: userInfo.depid,
  // account: userInfo.userName,
  leftPosition: 0,
  rightPosition: 0,
});
//获取参数
const getParameter = () => {
  GetParameter().then((res) => {
    if (res.code == 0) {
      Position.value.left = res.data.left;
      Position.value.right = res.data.right;
      ruleForm.value.extendSpeed = res.data == null ? 0 : res.data.extendSpeed;
      ruleForm.value.retractionSpeed =
        res.data == null ? 0 : res.data.retractionSpeed;
      ruleForm.value.manualExtend =
        res.data == null ? 0 : res.data.manualExtend;
      ruleForm.value.manualRetraction =
        res.data == null ? 0 : res.data.manualRetraction;
      ruleForm.value.leftPosition =
        res.data == null ? 0 : res.data.leftPosition;
      ruleForm.value.rightPosition =
        res.data == null ? 0 : res.data.rightPosition;
    }
  });
};
// const WebVideoCtrl = new WebControl();
// åˆ›å»ºæ’­æ”¾å®žä¾‹
function initPlugin() {
  console.log("initPlugin",new WebControl());
  oWebControl = new WebControl({
    szPluginContainer: "playWnd", // æŒ‡å®šå®¹å™¨id
    iServicePortStart: 15900, // æŒ‡å®šèµ·æ­¢ç«¯å£å·ï¼Œå»ºè®®ä½¿ç”¨è¯¥å€¼
    iServicePortEnd: 15900,
    szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // ç”¨äºŽIE10使用ActiveX的clsid
    cbConnectSuccess: function () {
      // åˆ›å»ºWebControl实例成功
      oWebControl
        .JS_StartService("window", {
          // WebControl实例创建成功后需要启动服务
          dllPath: "./VideoPluginConnect.dll", // å€¼"./VideoPluginConnect.dll"写死
        })
        .then(
          function () {
            // å¯åŠ¨æ’ä»¶æœåŠ¡æˆåŠŸ
            oWebControl.JS_SetWindowControlCallback({
              // è®¾ç½®æ¶ˆæ¯å›žè°ƒ
              cbIntegrationCallBack: cbIntegrationCallBack,
            });
            oWebControl.JS_CreateWnd("playWnd", 1000, 600).then(function () {
              //JS_CreateWnd创建视频播放窗口,宽高可设定
              init(); // åˆ›å»ºæ’­æ”¾å®žä¾‹æˆåŠŸåŽåˆå§‹åŒ–
            });
          },
          function () {
            // å¯åŠ¨æ’ä»¶æœåŠ¡å¤±è´¥
          }
        );
    },
    cbConnectError: function () {
      // åˆ›å»ºWebControl实例失败
      oWebControl = null;
      $("#playWnd").html("插件未启动,正在尝试启动,请稍候...");
      WebControl.JS_WakeUp("VideoWebPlugin://"); // ç¨‹åºæœªå¯åŠ¨æ—¶æ‰§è¡Œerror函数,采用wakeup来启动程序
      initCount++;
      if (initCount < 3) {
        setTimeout(function () {
          initPlugin();
        }, 3000);
      } else {
        $("#playWnd").html("插件启动失败,请检查插件是否安装!");
      }
    },
    cbConnectClose: function (bNormalClose) {
      // å¼‚常断开:bNormalClose = false
      // JS_Disconnect正常断开:bNormalClose = true
      console.log("cbConnectClose");
      oWebControl = null;
      $("#playWnd").html("插件未启动,正在尝试启动,请稍候...");
      WebControl.JS_WakeUp("VideoWebPlugin://");
      initCount++;
      if (initCount < 3) {
        setTimeout(function () {
          initPlugin();
        }, 3000);
      } else {
        $("#playWnd").html("插件启动失败,请检查插件是否安装!");
      }
    },
  });
}
const createSocket = (url) => {
  clearInterval(timer.value);
  // åˆ›å»ºWebSocket连接
  //"ws://127.0.0.1:9295/admin"
  //192.168.1.103
  client.value = new WebSocket("ws://192.168.1.103:5173/");
  client.value.onopen = function () {
    console.log("WebSocket è¿žæŽ¥æˆåŠŸ");
  };
  client.value.onmessage = function (event) {
    let data = JSON.parse(event.data);
    if (data.Status) {
      tableData.value = data.Data;
    } else if (data.device == "右Plc") {
      rightposition.value = data;
    } else if (data.device == "å·¦Plc") {
      leftposition.value = data;
    }
// const initWebVideoCtrl = () => {
//   if (!WebVideoCtrl) {
//     console.error("WebControl æœªæ­£ç¡®åŠ è½½ï¼Œè¯·æ£€æŸ¥ç›¸å…³è„šæœ¬ã€‚");
//     ElMessage.error("WebControl æœªæ­£ç¡®åŠ è½½ï¼Œè¯·æ£€æŸ¥ç›¸å…³è„šæœ¬ã€‚");
//     return;
//   }
    console.log("WebSocket æŽ¥æ”¶åˆ°æ¶ˆæ¯", data);
  };
  client.value.onclose = function () {
    console.log("WebSocket è¿žæŽ¥å…³é—­");
    if (isStart.value) {
      timer.value = setTimeout(createSocket, 1000);
    }
  };
//   try {
//     // åˆå§‹åŒ–插件
//     WebVideoCtrl.I_InitPlugin(800, 600, {
//       bWndFull: true, // æ˜¯å¦æ”¯æŒå•窗口全屏
//       iPackageType: 2, // 2 è¡¨ç¤º HLS åè®®
//     });
//     // æ’入插件到指定 DOM å…ƒç´ 
//     WebVideoCtrl.I_InsertOBJECTPlugin("videoDiv");
//     // è®¾å¤‡ä¿¡æ¯
//     const deviceInfo = {
//       sIP: "192.168.2.168", // è®¾å¤‡ IP åœ°å€
//       iPort: 80, // è®¾å¤‡ç«¯å£å·
//       sUsername: "admin", // ç”¨æˆ·å
//       sPassword: "123456", // å¯†ç 
//     };
//     // è°ƒç”¨ç™»å½•设备函数
//     loginDevice(deviceInfo);
//   } catch (error) {
//     console.error("初始化 WebVideoCtrl æ’件时出错:", error);
//     ElMessage.error("初始化 WebVideoCtrl æ’件时出错,请检查配置。");
//   }
// };
// ç™»å½•设备
// const loginDevice = (deviceInfo) => {
//   WebVideoCtrl.I_Login(
//     deviceInfo.sIP,
//     1,
//     deviceInfo.iPort,
//     deviceInfo.sUsername,
//     deviceInfo.sPassword,
//     {
//       success: () => {
//         console.log("登录成功");
//         ElMessage.success("设备登录成功");
//         // å¼€å§‹é¢„览
//         startRealPlay();
//       },
//       error: () => {
//         console.error("登录失败,请检查设备信息和网络连接。");
//         ElMessage.error("设备登录失败,请检查设备信息和网络连接。");
//       },
//     }
//   );
// };
// // å¼€å§‹å®žæ—¶é¢„览函数
// const startRealPlay = () => {
//   try {
//     WebVideoCtrl.I_StartRealPlay(1, {
//       iStreamType: 0, // ä¸»ç æµ
//     });
//     console.log("开始实时预览");
//   } catch (error) {
//     console.error("开始实时预览时出错:", error);
//     ElMessage.error("开始实时预览时出错,请检查设备状态。");
//   }
// };
  client.value.onerror = function () {};
};
onMounted(() => {
  initPlugin();
  isStart.value = true; // è®¾ç½®ä¸ºå¼€å§‹çŠ¶æ€
  createSocket();
  getParameter();
  // initPlugin();
  // initWebVideoCtrl();
  // ç›‘听窗口大小变化
  window.addEventListener("resize", () => {
@@ -749,7 +793,16 @@
    // å¦‚果窗口宽度小于等于1080px,执行相应的操作
    isMobile.value = false;
  }
  getPosition();
  // getPosition();
});
onUnmounted(() => {
  isStart.value = false;
  clearInterval(timer.value);
  if (client.value) {
    client.value.close();
  }
  clearInterval(timer.value);
});
</script>
<style lang="scss" scoped>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/PickAndDrop/PickAndDrop.vue
@@ -120,15 +120,20 @@
    <div v-if="isMobile" class="content">
      <div class="content_l">
        <div class="model">
          <span>当前伸缩杆位置:{{ Position.right }}</span>
          <span
            >当前伸缩杆位置:{{
              leftposition.Liftvalue ? parseInt(leftposition.Liftvalue) : 0
            }}</span
          >
          <span>左侧伸缩杆</span>
          <span></span>
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.leftPosition }}</div>
          <!--  ruleForm.leftPosition -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.extendSpeed }}</div>
          <div class="item">缩回速度:{{ ruleForm.extendSpeed }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -143,21 +148,26 @@
            <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
              >视频监控左侧</span
            >
            <img src="@/assets/imgs/right.png" alt="" />
            <img src="@/assets/imgs/left.png" alt="" />
          </div>
        </div>
      </div>
      <div class="content_r">
        <div class="model">
          <span>当前伸缩杆位置:{{ Position.right }}</span>
          <span>左侧伸缩杆</span>
          <span
            >当前伸缩杆位置:{{
              rightposition.Rightvalue ? parseInt(rightposition.Rightvalue) : 0
            }}</span
          >
          <span>右侧伸缩杆</span>
          <span></span>
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.rightPosition }}</div>
          <!-- ruleForm.rightPosition -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.retractionSpeed }}</div>
          <div class="item">缩回速度:{{ ruleForm.retractionSpeed }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -172,7 +182,7 @@
            <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
              >视频监控右侧</span
            >
            <img src="@/assets/imgs/left.png" alt="" />
            <img src="@/assets/imgs/right.png" alt="" />
          </div>
        </div>
      </div>
@@ -180,15 +190,20 @@
    <div v-else class="content_mobile">
      <div class="content_l">
        <div class="model">
          <span>当前伸缩杆位置:{{ Position.left }}</span>
          <span
            >当前伸缩杆位置:{{
              leftposition.Liftvalue ? parseInt(leftposition.Liftvalue) : 0
            }}</span
          >
          <span>左侧伸缩杆</span>
          <span></span>
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.leftPosition }}</div>
          <!-- ruleForm.leftPosition  -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.extendSpeed }}</div>
          <div class="item">缩回速度:{{ ruleForm.extendSpeed }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -203,21 +218,26 @@
            <span style="color: #fff; font-size: 2.5rem; font-weight: bold"
              >视频监控左侧</span
            >
            <img src="@/assets/imgs/right.png" alt="" />
            <img src="@/assets/imgs/left.png" alt="" />
          </div>
        </div>
      </div>
      <div class="content_r">
        <div class="model">
          <span>当前伸缩杆位置:{{ Position.right }}</span>
          <span>左侧伸缩杆</span>
          <span
            >当前伸缩杆位置:{{
              rightposition.Rightvalue ? parseInt(rightposition.Rightvalue) : 0
            }}</span
          >
          <span>右侧伸缩杆</span>
          <span></span>
        </div>
        <div class="operate">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
          <div class="item">缩回速度</div>
          <div class="item">伸到位:{{ ruleForm.rightPosition }}</div>
          <!--  ruleForm.rightPosition -->
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.retractionSpeed }}</div>
          <div class="item">缩回速度:{{ ruleForm.retractionSpeed }}</div>
          <div class="open">
            <div class="city">
              <div class="dotted"></div>
@@ -232,7 +252,7 @@
            <span style="color: #fff; font-size: 2.5rem; font-weight: bold"
              >视频监控右侧</span
            >
            <img src="@/assets/imgs/left.png" alt="" />
            <img src="@/assets/imgs/right.png" alt="" />
          </div>
        </div>
      </div>
@@ -240,22 +260,43 @@
  </div>
</template>
<script setup>
import { ref, onMounted, nextTick } from "vue";
import { ref, onMounted, nextTick, onUnmounted } from "vue";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import {
  AutoPickAndDrop,
  Pouse,
  GetPosition,
  GetParameter,
} from "@/api/newapi/Parameters.js";
const router = useRouter();
const isMobile = ref(false);
const Position = ref({
  left: 0,
  lift: 0,
  right: 0,
});
const ruleForm = ref({
  creater: "string",
  createDate: "2025-03-27T05:48:57.698Z",
  modifier: "string",
  modifyDate: "2025-03-27T05:48:57.698Z",
  id: 0,
  extendSpeed: 0,
  retractionSpeed: 0,
  manualExtend: 0,
  manualRetraction: 0,
  // depid: userInfo.depid,
  // account: userInfo.userName,
  leftPosition: 0,
  rightPosition: 0,
});
const rightposition = ref({});
const leftposition = ref({});
const tableData = ref([]);
const isStart = ref(false); // æ˜¯å¦å¼€å§‹
const timer = ref(null);
const client = ref(null);
const jumpRouter = (path) => {
  router.push(path);
};
@@ -289,13 +330,63 @@
};
//获取当前位置
const getPosition = () => {
  GetPosition().then((res) => {
// const getPosition = () => {
//   GetPosition().then((res) => {
//     if (res.code == 0) {
//       Position.value.lift = res.data.lift;
//       Position.value.right = res.data.right;
//     }
//   });
// };
//获取参数
const getParameter = () => {
  GetParameter().then((res) => {
    if (res.code == 0) {
      Position.value.left = res.data.lift;
      Position.value.right = res.data.right;
      ruleForm.value.extendSpeed = res.data == null ? 0 : res.data.extendSpeed;
      ruleForm.value.retractionSpeed =
        res.data == null ? 0 : res.data.retractionSpeed;
      ruleForm.value.manualExtend =
        res.data == null ? 0 : res.data.manualExtend;
      ruleForm.value.manualRetraction =
        res.data == null ? 0 : res.data.manualRetraction;
      ruleForm.value.leftPosition =
        res.data == null ? 0 : res.data.leftPosition;
      ruleForm.value.rightPosition =
        res.data == null ? 0 : res.data.rightPosition;
    }
  });
};
const createSocket = (url) => {
  clearInterval(timer.value);
  // åˆ›å»ºWebSocket连接
  //"ws://127.0.0.1:9295/admin"
  //192.168.1.103
  client.value = new WebSocket("ws://192.168.1.103:5173/");
  client.value.onopen = function () {
    console.log("WebSocket è¿žæŽ¥æˆåŠŸ");
  };
  client.value.onmessage = function (event) {
    let data = JSON.parse(event.data);
    if (data.Status) {
      tableData.value = data.Data;
    } else if (data.device == "右Plc") {
      rightposition.value = data;
    } else if (data.device == "å·¦Plc") {
      leftposition.value = data;
    }
    console.log("WebSocket æŽ¥æ”¶åˆ°æ¶ˆæ¯", data);
  };
  client.value.onclose = function () {
    console.log("WebSocket è¿žæŽ¥å…³é—­");
    if (isStart.value) {
      timer.value = setTimeout(createSocket, 1000);
    }
  };
  client.value.onerror = function () {};
};
onMounted(() => {
  // ç›‘听窗口大小变化
@@ -316,7 +407,19 @@
    // å¦‚果窗口宽度小于等于1080px,执行相应的操作
    isMobile.value = false;
  }
  getPosition();
  isStart.value = true; // è®¾ç½®ä¸ºå¼€å§‹çŠ¶æ€
  createSocket();
  // getPosition();
  getParameter();
});
onUnmounted(() => {
  isStart.value = false;
  clearInterval(timer.value);
  if (client.value) {
    client.value.close();
  }
  clearInterval(timer.value);
});
</script>
<style lang="scss" scoped>
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/UserManagement/Usermanagement.vue
@@ -14,6 +14,18 @@
        >
          ç”¨æˆ·è§’色
        </div>
        <div
          :class="['item', isactive == 3 ? 'isactive' : '']"
          @click="changeactive(3)"
        >
          ç”¨æˆ·ç­ç»„
        </div>
        <div
          :class="['item', isactive == 4 ? 'isactive' : '']"
          @click="changeactive(4)"
        >
          ç”¨æˆ·å•位
        </div>
      </div>
      <div class="serch">
        <div class="time_box">
@@ -31,6 +43,7 @@
              height: 2rem;
              border-left: 0;
            "
            class="time_picker"
            format="YYYY-MM-DD HH:mm:ss"
            type="datetimerange"
            range-separator="~"
@@ -46,6 +59,7 @@
              placeholder="请选择"
              size="small"
              style="width: 100%; font-size: 0.15rem"
              class="select"
            >
              <el-option
                v-for="item in selectoptions"
@@ -65,10 +79,15 @@
          @click="handleQuery"
          type="primary"
          size="small"
          style="margin-left: 0.98rem; height: 2rem"
          style="margin-left: 0.98rem; height: 2.5rem"
          class="text_btn"
          >查询</el-button
        >
        <el-button size="small" style="height: 2rem" @click="resetQuery"
        <el-button
          size="small"
          style="height: 2.5rem"
          class="text_btn"
          @click="resetQuery"
          >重置</el-button
        >
      </div>
@@ -87,6 +106,7 @@
              display: flex;
              align-items: center;
            "
            class="text_btn"
            ><el-icon style="margin-right: 0.2rem"> <Plus /> </el-icon
            >新建</el-button
          >
@@ -103,6 +123,41 @@
              display: flex;
              align-items: center;
            "
            class="text_btn"
            ><el-icon style="margin-right: 0.2rem"> <Plus /> </el-icon
            >新建</el-button
          >
          <!-- ç”¨æˆ·ç­ç»„新建 -->
          <el-button
            v-if="isactive == 3"
            type="primary"
            size="small"
            @click="AddGroup"
            style="
              width: 5.5rem;
              height: 2rem;
              font-size: 0.88rem;
              display: flex;
              align-items: center;
            "
            class="text_btn"
            ><el-icon style="margin-right: 0.2rem"> <Plus /> </el-icon
            >新建</el-button
          >
          <!-- ç”¨æˆ·å•位新建 -->
          <el-button
            v-if="isactive == 4"
            type="primary"
            size="small"
            @click="AddUnit"
            style="
              width: 5.5rem;
              height: 2rem;
              font-size: 0.88rem;
              display: flex;
              align-items: center;
            "
            class="text_btn"
            ><el-icon style="margin-right: 0.2rem"> <Plus /> </el-icon
            >新建</el-button
          >
@@ -110,12 +165,14 @@
            size="small"
            style="width: 5.5rem; height: 2rem; font-size: 0.88rem"
            @click="printExcel"
            class="text_btn"
            >批量导出</el-button
          >
          <el-button
            @click="deleteAll"
            size="small"
            style="width: 5.5rem; height: 2rem; font-size: 0.88rem"
            class="text_btn"
            >批量删除</el-button
          >
        </div>
@@ -124,22 +181,40 @@
        <!-- ç”¨æˆ·åˆ—表 -->
        <el-table
          empty-text="暂无数据"
          height="450"
          :height="isMin ? '950' : '450'"
          v-if="isactive == 1"
          :data="tableData"
          style="width: 100%"
          :header-cell-style="{
            background: 'rgba(250,250,250,1)',
            color: '#101010',
            fontSize: '0.88rem',
            height: '3rem',
            border: 'none',
          }"
          :row-style="{
            color: '#101010',
            fontSize: '0.88rem',
            height: '3rem',
          }"
          :header-cell-style="
            isMin
              ? {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '1.5rem',
                  height: '3rem',
                  border: 'none',
                }
              : {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                  border: 'none',
                }
          "
          :row-style="
            isMin
              ? {
                  color: '#101010',
                  fontSize: '2rem',
                  height: '3rem',
                }
              : {
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                }
          "
          @selection-change="UserSelectionChange"
        >
          <el-table-column type="selection" align="center" min-width="1%" />
@@ -162,14 +237,25 @@
            min-width="3%"
          />
          <el-table-column
            prop="userteam"
            label="用户分组"
            prop="isLeader"
            label="用户类型"
            align="center"
            min-width="2%"
          >
            <template #default="scope">
              <span v-if="scope.row.isLeader == 0">组员</span>
              <span v-else-if="scope.row.isLeader == 1">组长</span>
            </template>
          </el-table-column>
          <el-table-column
            prop="unit"
            label="单位"
            align="center"
            min-width="3%"
          />
          <el-table-column
            prop="roleName"
            label="用户角色"
            prop="userteam"
            label="班组"
            align="center"
            min-width="3%"
          />
@@ -242,22 +328,40 @@
        <!-- ç”¨æˆ·è§’色 -->
        <el-table
          empty-text="暂无数据"
          height="450"
          :height="isMin ? '950' : '450'"
          v-if="isactive == 2"
          :data="grideData"
          style="width: 100%"
          :header-cell-style="{
            background: 'rgba(250,250,250,1)',
            color: '#101010',
            fontSize: '0.88rem',
            height: '3rem',
            border: 'none',
          }"
          :row-style="{
            color: '#101010',
            fontSize: '0.88rem',
            height: '3rem',
          }"
          :header-cell-style="
            isMin
              ? {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '1.5rem',
                  height: '3rem',
                  border: 'none',
                }
              : {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                  border: 'none',
                }
          "
          :row-style="
            isMin
              ? {
                  color: '#101010',
                  fontSize: '1.88rem',
                  height: '3rem',
                }
              : {
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                }
          "
          @selection-change="RoleSelectionChange"
        >
          <el-table-column type="selection" align="center" />
@@ -276,6 +380,12 @@
                style="color: #4386ff; cursor: pointer"
                >管理</span
              >
            </template>
          </el-table-column>
          <el-table-column prop="isLeader" label="组员类型" align="center">
            <template #default="scope">
              <span v-if="scope.row.isLeader == 0">组员</span>
              <span v-else-if="scope.row.isLeader == 1">组长</span>
            </template>
          </el-table-column>
          <el-table-column prop="deptName" label="备注" align="center" />
@@ -303,8 +413,142 @@
                      scope.row.user_Id == '1' ||
                      scope.row.userName != userInfo.userName)
                "
                style="color: blue; font-size: 0.88rem; cursor: pointer"
                :style="{
                  color: 'blue',
                  fontSize: isMin ? '1.88rem' : '0.88rem',
                  cursor: 'pointer',
                }"
                @click="EditRole(scope.row)"
                >编辑</span
              >
            </template></el-table-column
          >
        </el-table>
        <!-- ç”¨æˆ·ç­ç»„ -->
        <el-table
          empty-text="暂无数据"
          :height="isMin ? '950' : '450'"
          v-if="isactive == 3"
          :data="departmentData"
          style="width: 100%"
          :header-cell-style="
            isMin
              ? {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '1.5rem',
                  height: '3rem',
                  border: 'none',
                }
              : {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                  border: 'none',
                }
          "
          :row-style="
            isMin
              ? {
                  color: '#101010',
                  fontSize: '1.88rem',
                  height: '3rem',
                }
              : {
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                }
          "
          @selection-change="TreamSelectionChange"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="teamName" label="班组名称" align="center" />
          <el-table-column prop="creater" label="创建者" align="center" />
          <el-table-column prop="createDate" label="创建时间" align="center" />
          <el-table-column label="操作" align="center">
            <template #default="scope">
              <span
                v-if="
                  !(userInfo.userName == 'admin' || userInfo.roleId == '1'
                    ? scope.row.userName == 'admin' || scope.row.user_Id == '1'
                    : scope.row.userName == 'admin' ||
                      scope.row.user_Id == '1' ||
                      scope.row.userName != userInfo.userName)
                "
                :style="{
                  color: 'blue',
                  fontSize: isMin ? '1.88rem' : '0.88rem',
                  cursor: 'pointer',
                }"
                @click="EditTream(scope.row)"
                >编辑</span
              >
            </template></el-table-column
          >
        </el-table>
        <!-- ç”¨æˆ·å•位 -->
        <el-table
          empty-text="暂无数据"
          :height="isMin ? '950' : '450'"
          v-if="isactive == 4"
          :data="unitData"
          style="width: 100%"
          :header-cell-style="
            isMin
              ? {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '1.5rem',
                  height: '3rem',
                  border: 'none',
                }
              : {
                  background: 'rgba(250,250,250,1)',
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                  border: 'none',
                }
          "
          :row-style="
            isMin
              ? {
                  color: '#101010',
                  fontSize: '1.88rem',
                  height: '3rem',
                }
              : {
                  color: '#101010',
                  fontSize: '0.88rem',
                  height: '3rem',
                }
          "
          @selection-change="UnitSelectionChange"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="unitName" label="单位名称" align="center" />
          <el-table-column prop="creater" label="创建者" align="center" />
          <el-table-column prop="createDate" label="创建日期" align="center" />
          <el-table-column label="操作" align="center">
            <template #default="scope">
              <span
                v-if="
                  !(userInfo.userName == 'admin' || userInfo.roleId == '1'
                    ? scope.row.userName == 'admin' || scope.row.user_Id == '1'
                    : scope.row.userName == 'admin' ||
                      scope.row.user_Id == '1' ||
                      scope.row.userName != userInfo.userName)
                "
                :style="{
                  color: 'blue',
                  fontSize: isMin ? '1.88rem' : '0.88rem',
                  cursor: 'pointer',
                }"
                @click="EditUnit(scope.row)"
                >编辑</span
              >
            </template></el-table-column
@@ -354,6 +598,7 @@
        >
          <span
            style="color: rgb(16, 16, 16); font-size: 1rem; font-weight: bold"
            class="font-title"
            >用户信息</span
          >
        </div>
@@ -374,6 +619,7 @@
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    class="from_title"
                    >登录账号</span
                  >
                </div>
@@ -392,6 +638,7 @@
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    class="from_title"
                    >真实姓名</span
                  >
                </div>
@@ -410,6 +657,7 @@
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    class="from_title"
                    >联系电话</span
                  >
                </div>
@@ -430,6 +678,7 @@
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    class="from_title"
                    >用户角色
                  </span>
                </div>
@@ -438,6 +687,7 @@
                v-model="formUser.roleid"
                placeholder="请选择"
                size="small"
                @change="handleRoleChange"
              >
                <el-option
                  :disabled="item.roleId == 1"
@@ -450,26 +700,27 @@
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item prop="rolename">
            <el-form-item prop="userunit">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    >用户类型
                  </span>
                    class="from_title"
                    >单位</span
                  >
                </div>
              </template>
              <el-select
                v-model="formUser.rolename"
                v-model="formUser.userunit"
                placeholder="请选择"
                size="small"
              >
                <el-option
                  v-for="item in roleNameList"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                  v-for="item in unitData"
                  :key="item.id"
                  :label="item.unitName"
                  :value="item.unitName"
                />
              </el-select>
            </el-form-item>
@@ -481,6 +732,7 @@
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    class="from_title"
                    >是否启用</span
                  >
                </div>
@@ -502,68 +754,31 @@
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item prop="dept_Id">
            <el-form-item prop="userteam">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    >轨道站</span
                    class="from_title"
                    >班组</span
                  >
                </div>
              </template>
              <el-select
                v-model="formUser.dept_Id"
                v-model="formUser.userteam"
                placeholder="请选择"
                size="small"
              >
                <el-option
                  v-for="item in departmentOptions"
                  v-for="item in departmentData"
                  :key="item.id"
                  :label="item.departmentName"
                  :value="item.id"
                  :label="item.teamName"
                  :value="item.teamName"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item prop="dept_Id">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    >组</span
                  >
                </div>
              </template>
              <el-input
                size="small"
                v-model="formUser.userteam"
                placeholder="请输入"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item prop="dept_Id">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    >卡号</span
                  >
                </div>
              </template>
              <el-input
                size="small"
                v-model="formUser.carnuber"
                placeholder="请输入"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item>
              <template #label>
@@ -571,16 +786,9 @@
                  <span style="color: red; margin-right: 0.2rem">*</span>
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    class="from_title"
                    >人脸图片</span
                  >
                  <!-- <span
                    style="
                      color: rgba(255, 0, 0, 1);
                      font-size: 0.75rem;
                      margin-left: 0.5rem;
                    "
                    >注:最多可上传三张,图片需要正规的人像证件照</span
                  > -->
                </div>
              </template>
              <el-upload
@@ -660,7 +868,7 @@
      </template>
    </el-dialog>
    <!-- ç”¨æˆ·ä¿¡æ¯ä¿®æ”¹å¯†ç å¼¹å‡ºæ¡† -->
    <!-- ç”¨æˆ·ä¿®æ”¹å¯†ç å¼¹å‡ºæ¡† -->
    <el-dialog
      v-model="dialogVisible1"
      title=""
@@ -703,9 +911,11 @@
                border-radius: 0.25rem;
              "
            >
              <span style="color: #51b820; font-size: 1rem"
              <span style="color: #51b820; font-size: 1rem" class="formpassword"
                >账号:{{ formpassword.userName }}</span
              ><span style="color: #51b820; font-size: 1rem; margin-left: 2rem"
              ><span
                style="color: #51b820; font-size: 1rem; margin-left: 2rem"
                class="formpassword"
                >用户:{{ formpassword.roleName }}</span
              >
            </div>
@@ -760,7 +970,11 @@
          "
        >
          <span
            style="color: rgb(16, 16, 16); font-size: 1rem; font-weight: bold"
            :style="{
              color: 'rgb(16, 16, 16)',
              fontSize: isMin ? '2rem' : '1rem',
              fontWeight: 'bold',
            }"
            >用户角色</span
          >
        </div>
@@ -776,8 +990,20 @@
        <el-form-item prop="roleName">
          <template #label>
            <div style="display: flex; align-items: flex-end">
              <span style="color: red; margin-right: 0.2rem">*</span>
              <span style="font-size: 0.88rem; color: black; font-weight: bold"
              <span
                :style="{
                  color: 'red',
                  marginRight: '0.2rem',
                  fontSize: '2rem',
                }"
                >*</span
              >
              <span
                :style="{
                  fontSize: isMin ? '2rem' : '0.88rem',
                  color: 'black',
                  fontWeight: bold,
                }"
                >角色名称</span
              >
            </div>
@@ -789,10 +1015,49 @@
            placeholder="请输入"
          />
        </el-form-item>
        <el-form-item prop="isLeader">
          <template #label>
            <div style="display: flex; align-items: flex-end">
              <span
                :style="{
                  color: 'red',
                  marginRight: '0.2rem',
                  fontSize: '2rem',
                }"
                >*</span
              >
              <span
                :style="{
                  fontSize: isMin ? '2rem' : '0.88rem',
                  color: 'black',
                  fontWeight: bold,
                }"
                >组员类型</span
              >
            </div>
          </template>
          <el-select
            v-model="formRole.isLeader"
            placeholder="请选择"
            size="small"
          >
            <el-option
              v-for="item in rolekey"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item>
          <template #label>
            <div style="display: flex; align-items: flex-end">
              <span style="font-size: 0.88rem; color: black; font-weight: bold"
              <span
                :style="{
                  fontSize: isMin ? '2rem' : '0.88rem',
                  color: 'black',
                  fontWeight: 'bold',
                }"
                >备注</span
              >
            </div>
@@ -818,6 +1083,178 @@
            size="small"
            type="primary"
            @click="saveRole(formRoleRef)"
            style="height: 2rem; font-size: 0.88rem"
          >
            ä¿å­˜
          </el-button>
        </div>
      </template>
    </el-dialog>
    <!-- ç”¨æˆ·ç­ç»„新建/编辑 -->
    <el-dialog
      v-model="TreamdialogVisible"
      title=""
      width="20%"
      :before-close="handleClose"
      :show-close="false"
      :align-center="true"
      @close="resetForm2(formTreamdRef)"
    >
      <template #title>
        <div
          style="
            height: 3.63rem;
            display: flex;
            border-bottom: 1px solid #e6e6e6;
          "
        >
          <span
            :style="{
              color: 'rgb(16, 16, 16)',
              fontSize: isMin ? '2rem' : '1rem',
              fontWeight: 'bold',
            }"
            >用户班组</span
          >
        </div>
      </template>
      <el-form
        :model="formTeam"
        label-width="auto"
        label-position="top"
        ref="formTreamdRef"
        :rules="roleRules"
        :hide-required-asterisk="true"
      >
        <el-form-item prop="teamName">
          <template #label>
            <div style="display: flex; align-items: flex-end">
              <span
                :style="{
                  color: 'red',
                  marginRight: '0.2rem',
                  fontSize: '2rem',
                }"
                >*</span
              >
              <span
                :style="{
                  fontSize: isMin ? '2rem' : '0.88rem',
                  color: 'black',
                  fontWeight: bold,
                }"
                >班组名称</span
              >
            </div>
          </template>
          <el-input
            style="height: 2rem"
            size="small"
            v-model="formTeam.teamName"
            placeholder="请输入"
          />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer" style="text-align: center">
          <el-button
            size="small"
            @click="TreamdialogVisible = false"
            style="height: 2rem; font-size: 0.88rem"
            >取消</el-button
          >
          <el-button
            size="small"
            type="primary"
            @click="saveTream(formTreamdRef)"
            style="height: 2rem; font-size: 0.88rem"
          >
            ä¿å­˜
          </el-button>
        </div>
      </template>
    </el-dialog>
    <!-- ç”¨æˆ·å•位新建/编辑 -->
    <el-dialog
      v-model="UnitdialogVisible"
      title=""
      width="20%"
      :before-close="handleClose"
      :show-close="false"
      :align-center="true"
      @close="resetForm3(formUnitRef)"
    >
      <template #title>
        <div
          style="
            height: 3.63rem;
            display: flex;
            border-bottom: 1px solid #e6e6e6;
          "
        >
          <span
            :style="{
              color: 'rgb(16, 16, 16)',
              fontSize: isMin ? '2rem' : '1rem',
              fontWeight: 'bold',
            }"
            >用户单位</span
          >
        </div>
      </template>
      <el-form
        :model="formUnit"
        label-width="auto"
        label-position="top"
        ref="formUnitRef"
        :rules="roleRules"
        :hide-required-asterisk="true"
      >
        <el-form-item prop="unitName">
          <template #label>
            <div style="display: flex; align-items: flex-end">
              <span
                :style="{
                  color: 'red',
                  marginRight: '0.2rem',
                  fontSize: '2rem',
                }"
                >*</span
              >
              <span
                :style="{
                  fontSize: isMin ? '2rem' : '0.88rem',
                  color: 'black',
                  fontWeight: bold,
                }"
                >单位名称</span
              >
            </div>
          </template>
          <el-input
            style="height: 2rem"
            size="small"
            v-model="formUnit.unitName"
            placeholder="请输入"
          />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer" style="text-align: center">
          <el-button
            size="small"
            @click="UnitdialogVisible = false"
            style="height: 2rem; font-size: 0.88rem"
            >取消</el-button
          >
          <el-button
            size="small"
            type="primary"
            @click="saveUnit(formUnitRef)"
            style="height: 2rem; font-size: 0.88rem"
          >
            ä¿å­˜
@@ -858,6 +1295,15 @@
  ExportApi1,
  UpdatePwd,
  DeleteUserData,
  GetDepartment,
  GetUserTeam,
  AddUserTeam,
  EditUserTeam,
  DeleteUserTeam,
  GetUserUnit,
  AddUserUnit,
  EditUserUnit,
  DeleteUserUnit,
} from "@/api/user";
import { useRouter } from "vue-router";
import { formatTime } from "@/utils/index.js";
@@ -868,7 +1314,6 @@
  UpdateRoleApi,
  DeleteRoleApi,
} from "@/api/role";
import { GetDepartment } from "@/api/user";
let obj = {
  selectName: "",
  selectTime: [], // æ—¶é—´èŒƒå›´
@@ -880,10 +1325,12 @@
const tableData = ref([]);
const grideData = ref([]);
//用户班组
const departmentData = ref([]);
//用户单位
const unitData = ref([]);
//新建用户ref
const formUserRef = ref();
const options = ref([]);
const props = { multiple: true };
const userInfo = ref();
const isoptins = ref([
  {
@@ -892,13 +1339,13 @@
  },
  { value: 1, label: "是" },
]);
//分组
//角色
const groupOptions = ref([]);
const formUser = ref({
  id: undefined,
  username: "",
  phoneno: "",
  roleid: 2,
  roleid: null,
  rolename: "",
  enable: 1,
  path: "",
@@ -906,14 +1353,16 @@
  dept_Id: 1,
  carnuber: null,
  userteam: "",
  isLeader: 0,
  userunit: "",
});
const rules = reactive({
  userName: {
  username: {
    required: true,
    message: "请输入用户名",
    trigger: "blur",
  },
  role_Id: {
  roleid: {
    required: true,
    message: "请选择角色",
    trigger: "change",
@@ -930,12 +1379,12 @@
    message: "请输入姓名",
    trigger: "blur",
  },
  phoneNo: {
  phoneno: {
    required: true,
    message: "请输入手机号",
    trigger: "blur",
  },
  userTrueName: {
  usertruename: {
    required: true,
    message: "请输入真实姓名",
    trigger: "blur",
@@ -945,13 +1394,12 @@
    message: "请输入组",
    trigger: "blur",
  },
  carnuber: {
  userunit: {
    required: true,
    message: "请输入卡号",
    message: "请选择单位",
    trigger: "blur",
  },
});
const formpasswordRef = ref();
const isactive = ref(1);
const dialogVisible = ref(false);
@@ -977,21 +1425,26 @@
  },
];
const fileList = ref([]);
const roleNameList = ref([
  { value: "电气质检", label: "电气质检" },
  { value: "机械质检", label: "机械质检" },
  { value: "地沟质检", label: "地沟质检" },
  { value: "电气力矩", label: "电气力矩" },
  { value: "电气辅助", label: "电气辅助" },
  { value: "机械力矩", label: "机械力矩" },
  { value: "机械辅助", label: "机械辅助" },
  { value: "地沟力矩", label: "地沟力矩" },
  { value: "地沟辅助", label: "地沟辅助" },
const rolekey = ref([
  { value: 1, label: "组长" },
  { value: 0, label: "组员" },
]);
const roleOptions = [
  {
    value: "roleName",
    label: "角色名称",
  },
];
const treamOptions = [
  {
    value: "teamName",
    label: "班组名称",
  },
];
const unitOptions = [
  {
    value: "unitName",
    label: "单位名称",
  },
];
const selectoptions = ref([]);
@@ -1016,12 +1469,53 @@
    },
  ],
});
const uploadRef = ref();
const showUpload = ref(false);
const pageTotal = ref(0);
const isMin = ref(false);
const newRole = ref({});
//获取部门
const departmentOptions = ref([]);
const initData = () => {
  // æŸ¥è¯¢æ¡ä»¶
  const startTime = formatTime(queryForm.value.selectTime[0]);
  const endTime = formatTime(queryForm.value.selectTime[1]);
  const filter = [
    {
      name: queryForm.value.selectType,
      value: queryForm.value.selectInput,
      displayType: "like",
    },
    { name: "createDate", value: startTime, displayType: "ThanOrEqual" },
    { name: "createDate", value: endTime, displayType: "LessOrEqual" },
  ];
  GetUserList({
    pageIndex: 1,
    pageSize: 10,
    searchKeyword: "",
    startDate: formatTime(queryForm.value.selectTime[0]),
    endDate: formatTime(queryForm.value.selectTime[1]),
    status: 0,
    sortField: "",
    sortOrder: "",
    account: "",
  }).then((res) => {
    tableData.value = res.data.items.map((item) => {
      return {
        ...item,
        isdisabled:
          userInfo.value.userName == "admin" || userInfo.value.roleId == "1"
            ? item.userName == "admin" || item.user_Id == "1"
            : item.userName == "admin" ||
              item.user_Id == "1" ||
              item.userName != userInfo.value.userName,
      };
    });
    pageTotal.value = res.data.totalCount;
  });
  getDepartment();
};
const getDepartment = () => {
  GetDepartment({
    page: 1,
@@ -1043,40 +1537,6 @@
  }).then((res) => {
    departmentOptions.value = res.rows;
  });
};
//登录记录
const initData = () => {
  // æŸ¥è¯¢æ¡ä»¶
  const startTime = formatTime(queryForm.value.selectTime[0]);
  const endTime = formatTime(queryForm.value.selectTime[1]);
  const filter = [
    {
      name: queryForm.value.selectType,
      value: queryForm.value.selectInput,
      displayType: "like",
    },
    { name: "createDate", value: startTime, displayType: "ThanOrEqual" },
    { name: "createDate", value: endTime, displayType: "LessOrEqual" },
  ];
  GetUserList({
    ...pageQuery.value,
    filter,
  }).then((res) => {
    tableData.value = res.rows.map((item) => {
      return {
        ...item,
        isdisabled:
          userInfo.value.userName == "admin" || userInfo.value.roleId == "1"
            ? item.userName == "admin" || item.user_Id == "1"
            : item.userName == "admin" ||
              item.user_Id == "1" ||
              item.userName != userInfo.value.userName,
      };
    });
    pageTotal.value = res.total;
  });
  getDepartment();
};
//分页请求参数
const pageQuery = ref({
@@ -1138,13 +1598,14 @@
  formUser.value = {
    username: "",
    phoneno: "",
    roleid: 20,
    roleid: null,
    rolename: "",
    enable: 1,
    path: "",
    user_Id: undefined,
    userteam: "",
    carnuber: null,
    isLeader: 0,
  };
  fileList.value = [];
};
@@ -1154,6 +1615,20 @@
  formRole.value = {
    roleName: "",
    description: "",
  };
};
const resetForm2 = (formEl) => {
  if (!formEl) return;
  formEl.resetFields();
  formTeam.value = {
    teamName: "",
  };
};
const resetForm3 = (formEl) => {
  if (!formEl) return;
  formEl.resetFields();
  formUnit.value = {
    unitName: "",
  };
};
@@ -1172,25 +1647,33 @@
const beforeAvatarUpload = (val) => {
  console.log(val);
};
const handleRoleChange = (val) => {
  groupOptions.value.find((item) => {
    if (item.roleId == val) {
      newRole.value = item;
    }
  });
};
//新建用户账号
const saveObj = async (formEl) => {
  // submitUpload();
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
    if (valid) {
      if (formUser.value.id != undefined) {
         if (!formUser.value.userteam.includes('组')) {
          formUser.value.userteam = formUser.value.userteam + '组'
        }
        // if (!formUser.value.userteam.includes("组")) {
        //   formUser.value.userteam = formUser.value.userteam + "组";
        // }
        formUser.value.isLeader = newRole.value.isLeader;
        UpdateUser(formUser.value).then((res) => {
          ElMessage({ message: "修改成功", type: "success" });
          dialogVisible.value = false;
          initData();
        });
      } else {
         if (!formUser.value.userteam.includes('组')) {
          formUser.value.userteam = formUser.value.userteam + '组'
        }
        // if (!formUser.value.userteam.includes("组")) {
        //   formUser.value.userteam = formUser.value.userteam + "组";
        // }
        formUser.value.isLeader = newRole.value.isLeader;
        AddUser(formUser.value).then((res) => {
          ElMessage({ message: "提交成功", type: "success" });
          dialogVisible.value = false;
@@ -1240,6 +1723,8 @@
    usertruename: val.userTrueName,
    cardNumber: val.cardNumber,
    userteam: val.userteam,
    userunit: val.unit,
    dept_Id: val.dept_Id,
  };
  UpdateUser(data).then((res) => {
    ElMessage({ message: "修改成功", type: "success" });
@@ -1272,6 +1757,8 @@
    carnuber: val.cardNumber,
    userteam: val.userteam,
    dept_Id: val.dept_Id,
    isLeader: val.isLeader,
    userunit: val.unit,
  };
  formUser.value = {
    ...obj,
@@ -1330,6 +1817,16 @@
    message: "请输入角色描述",
    trigger: "blur",
  },
  teamName: {
    required: true,
    message: "请输入班组名称",
    trigger: "blur",
  },
  unitName: {
    required: true,
    message: "请输入单位名称",
    trigger: "blur",
  },
});
const formRole = ref({
  roleName: "",
@@ -1373,6 +1870,20 @@
  let obj = Object.assign({}, val);
  formRole.value = obj;
  dialogVisible2.value = true;
};
//编辑班组
const EditTream = (val) => {
  Treamtype.value = "修改";
  let obj = Object.assign({}, val);
  formTeam.value = obj;
  TreamdialogVisible.value = true;
};
//编辑单位
const EditUnit = (val) => {
  Unittype.value = "修改";
  let obj = Object.assign({}, val);
  formUnit.value = obj;
  UnitdialogVisible.value = true;
};
//获取角色
const getRole = () => {
@@ -1425,15 +1936,119 @@
    });
  }
};
//获取用户班组
const getGroup = () => {
  const startTime = formatTime(queryForm.value.selectTime[0]);
  const endTime = formatTime(queryForm.value.selectTime[1]);
  const filter = [
    {
      name: queryForm.value.selectType,
      value: queryForm.value.selectInput,
      displayType: "like",
    },
    { name: "createDate", value: startTime, displayType: "ThanOrEqual" },
    { name: "createDate", value: endTime, displayType: "LessOrEqual" },
  ];
  GetUserTeam({ ...pageQuery.value, filter }).then((res) => {
    departmentData.value = res.rows;
    pageTotal.value = res.total;
  });
};
const formTeam = ref({});
const TreamdialogVisible = ref(false);
//新建用户班组
const AddGroup = () => {
  Treamtype.value = "新建";
  TreamdialogVisible.value = true;
};
const Treamtype = ref("新建");
const formTreamdRef = ref(null);
const saveTream = async (formEl) => {
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
    if (valid) {
      if (Treamtype.value == "修改") {
        EditUserTeam(formTeam.value).then((res) => {
          ElMessage({ message: "修改成功", type: "success" });
          TreamdialogVisible.value = false;
          getGroup();
        });
      } else {
        AddUserTeam(formTeam.value).then((res) => {
          ElMessage({ message: "添加成功", type: "success" });
          TreamdialogVisible.value = false;
          getGroup();
        });
      }
    } else {
      console.log("error submit!", fields);
    }
  });
};
const formUnit = ref({});
const UnitdialogVisible = ref(false);
const Unittype = ref("新建");
const formUnitRef = ref(null);
const AddUnit = () => {
  Unittype.value = "新建";
  UnitdialogVisible.value = true;
};
//获取用户单位
const getUnit = () => {
  const startTime = formatTime(queryForm.value.selectTime[0]);
  const endTime = formatTime(queryForm.value.selectTime[1]);
  const filter = [
    {
      name: queryForm.value.selectType,
      value: queryForm.value.selectInput,
      displayType: "like",
    },
    { name: "createDate", value: startTime, displayType: "ThanOrEqual" },
    { name: "createDate", value: endTime, displayType: "LessOrEqual" },
  ];
  GetUserUnit({ ...pageQuery.value, filter }).then((res) => {
    unitData.value = res.rows;
    pageTotal.value = res.total;
  });
};
//保存单位
const saveUnit = async (formEl) => {
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
    if (valid) {
      if (Unittype.value == "修改") {
        EditUserUnit(formUnit.value).then((res) => {
          ElMessage({ message: "修改成功", type: "success" });
          UnitdialogVisible.value = false;
          getUnit();
        });
      } else {
        AddUserUnit(formUnit.value).then((res) => {
          ElMessage({ message: "添加成功", type: "success" });
          UnitdialogVisible.value = false;
          getUnit();
        });
      }
    } else {
      console.log("error submit!", fields);
    }
  });
};
//切换页面
const changeactive = (index) => {
  isactive.value = index;
  if (isactive.value == 1) {
    selectoptions.value = userOptions;
    initData();
  } else {
  } else if (isactive.value == 2) {
    selectoptions.value = roleOptions;
    getRole();
  } else if (isactive.value == 3) {
    selectoptions.value = treamOptions;
    getGroup();
  } else if (isactive.value == 4) {
    selectoptions.value = unitOptions;
    getUnit();
  }
};
@@ -1447,6 +2062,14 @@
const RoleSelectionChange = (val) => {
  ids.value = [];
  ids.value = val.map((item) => item.roleId);
};
const TreamSelectionChange = (val) => {
  ids.value = [];
  ids.value = val.map((item) => item.id);
};
const UnitSelectionChange = (val) => {
  ids.value = [];
  ids.value = val.map((item) => item.id);
};
const deleteAll = () => {
  if (ids.value.includes(1)) {
@@ -1462,22 +2085,37 @@
      ElMessage({ message: "删除成功", type: "success" });
      initData();
    });
  } else {
  } else if (isactive.value == 2) {
    DeleteRoleApi(ids.value).then((res) => {
      ElMessage({ message: "删除成功", type: "success" });
      getRole();
    });
  } else if (isactive.value == 3) {
    DeleteUserTeam(ids.value).then((res) => {
      ElMessage({ message: "删除成功", type: "success" });
      getGroup();
    });
  } else if (isactive.value == 4) {
    DeleteUserUnit(ids.value).then((res) => {
      ElMessage({ message: "删除成功", type: "success" });
      getUnit();
    });
  }
};
//管理
//路由跳转
// ç®¡ç† è·¯ç”±è·³è½¬
const toDetail = (row) => {
  router.push({ name: "permission", state: { info: JSON.stringify(row) } });
};
onMounted(() => {
  if (window.innerWidth <= 1080) {
    isMin.value = true;
  }
  //打印当前屏幕宽度
  initData();
  getRole();
  getUnit();
  getGroup();
  userInfo.value = JSON.parse(localStorage.getItem("user"));
});
</script>
@@ -1492,7 +2130,7 @@
    flex-direction: column;
    .checkbox {
      width: 11rem;
      width: 25rem;
      display: flex;
      justify-content: space-between;
      margin-top: 1rem;
@@ -1624,6 +2262,194 @@
    text-align: center;
  }
}
@media screen and (max-width: 1080px) {
  .Usermanagement {
    display: flex;
    background-color: #fff;
    .content {
      width: 100%;
      display: flex;
      flex-direction: column;
      .checkbox {
        width: 35rem;
        display: flex;
        justify-content: space-between;
        margin-top: 1rem;
        margin-left: 1.31rem;
        .item {
          width: 8rem;
          height: 2.88rem;
          border-radius: 0.25rem;
          background-color: rgba(190, 199, 209, 1);
          color: rgba(255, 255, 255, 1);
          font-size: 1.25rem;
          text-align: center;
          line-height: 2.88rem;
          cursor: pointer;
        }
        .isactive {
          background-color: rgba(16, 16, 16, 1);
          color: rgba(255, 255, 255, 1);
        }
      }
      .serch {
        display: flex;
        margin-top: 1.31rem;
        align-items: center;
        .time_box {
          display: flex;
          align-items: center;
          text-align: center;
          margin-left: 0.98rem;
          .time {
            box-sizing: border-box;
            width: 6.88rem;
            height: 3rem;
            text-align: center;
            border: 0.06rem solid rgba(222, 222, 222, 1);
            border-radius: 0.25rem 0 0 0.25rem;
            font-size: 1.25rem;
            display: flex;
            align-items: center;
            justify-content: center;
          }
          :deep(.el-input__wrapper) {
            height: 3rem !important;
            font-size: 1.25rem !important;
          }
        }
        .serch_box {
          display: flex;
          align-items: center;
          text-align: center;
          margin-left: 0.98rem;
          border-radius: 0.38rem;
          .serchb {
            box-sizing: border-box;
            width: 9rem;
            height: 3rem !important;
            text-align: center;
            font-size: 2rem !important;
            display: flex;
            align-items: center;
            justify-content: center;
            .select {
              height: 3rem !important;
              :deep(.el-select__wrapper) {
                height: 3rem !important;
                font-size: 1.5rem !important;
              }
            }
          }
          input {
            box-sizing: border-box;
            outline: none;
            width: 19rem;
            height: 3rem;
            border: 0.06rem solid rgba(222, 222, 222, 1);
            border-radius: 0 0.25rem 0.25rem 0;
            padding-left: 0.3125rem;
            font-size: 2rem;
          }
        }
        .text_btn {
          width: 10rem !important;
          height: 3.5rem !important;
          font-size: 2rem !important;
          display: flex;
          align-items: center;
        }
      }
      .btns {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-top: 1.31rem;
        margin-left: 1.13rem;
        padding-right: 2rem;
        box-sizing: border-box;
        .text_btn {
          width: 10rem !important;
          height: 3.5rem !important;
          font-size: 2rem !important;
          display: flex;
          align-items: center;
        }
      }
    }
    .formpassword {
      font-size: 1.5rem !important;
    }
    .my-header {
      height: 3.84rem;
      display: flex;
      justify-content: space-between;
      border-bottom: 0.06rem solid rgba(233, 233, 233, 1);
    }
    .avatar-uploader .avatar {
      width: 7rem;
      height: 7rem;
      display: block;
    }
    :deep(.avatar-uploader .el-upload) {
      width: 7rem;
      height: 7rem;
      border: 0.0625rem dashed var(--el-border-color);
      border-radius: 0.0375rem;
      cursor: pointer;
      position: relative;
      overflow: hidden;
      transition: var(--el-transition-duration-fast);
    }
    :deep(.el-upload-list__item) {
      width: 7rem;
      height: 7rem;
    }
    .avatar-uploader .el-upload:hover {
      border-color: var(--el-color-primary);
    }
    .el-icon .avatar-uploader-icon {
      font-size: 0.5rem;
      color: #8c939d;
      width: 0.81rem;
      height: 0.81rem;
      text-align: center;
    }
    .font-title {
      font-size: 2rem !important;
    }
    .from_title {
      font-size: 2rem !important;
    }
    .el-form-item__content {
      .el-input {
        height: 3rem !important;
        font-size: 2rem !important;
      }
      .el-select--small :deep(.el-select__wrapper) {
        font-size: 2rem;
        line-height: 3rem;
        min-height: 3rem;
      }
    }
  }
}
</style>
<style>
.confirmButtonClass {
ÏîÄ¿´úÂë/¿ÉÊÓ»¯´óÆÁ.7z
Binary files differ
ÏîÄ¿´úÂë/¿ÉÊÓ»¯´óÆÁ/client/src/layout/index.vue
@@ -195,7 +195,7 @@
        <router-view
          style="
            height: calc(100vh - 4.38rem - 10rem);
            width: calc(100vw - 10rem);
            width: calc(100vw - 6rem);
          "
          v-slot="{ Component }"
        >
@@ -796,7 +796,7 @@
  // background-repeat: no-repeat;
  // background-size: 100% 100%;
  background: linear-gradient(to bottom, #0072c6, #2e6aa7);
  padding: 5rem 5rem;
  padding: 5rem 3rem;
  box-sizing: border-box;
}
ÏîÄ¿´úÂë/¿ÉÊÓ»¯´óÆÁ/client/src/views/Index.vue
@@ -5,7 +5,7 @@
        display: flex;
        justify-content: center;
        color: #fff;
        font-size: 15rem;
        font-size: 20rem;
        letter-spacing: 5rem;
        font-weight: bold;
      "
@@ -20,7 +20,7 @@
        align-items: center;
        color: #fff;
        font-size: 3rem;
        margin-top: 3rem;
        margin-top: 1rem;
      "
    >
      <div
@@ -47,7 +47,7 @@
        color: #fff;
        font-weight: bold;
        margin-top: 5rem;
        font-size: 10rem;
        font-size: 12rem;
      "
    >
      <span> CR400AF</span>
@@ -83,7 +83,7 @@
          <div
            style="
              height: 5rem;
              font-size: 6rem;
              font-size: 7rem;
              font-weight: bold;
              display: flex;
              align-items: center;
@@ -121,7 +121,7 @@
            <div
              style="
                width: 40%;
                font-size: 6rem;
                font-size: 7rem;
                color: #fff;
                background-color: #058f66;
                border-radius: 1.5rem;
@@ -134,7 +134,7 @@
            <div
              style="
                width: 40%;
                font-size: 6rem;
                font-size: 7rem;
                color: #fff;
                background-color: #d9001b;
                border-radius: 1.5rem;
@@ -164,7 +164,7 @@
            >位
          </div>
        </div>
        <div style="width: 90%; margin-top: 2rem">
        <div style="width: 98%; margin-top: 2rem">
          <el-table
            empty-text="暂无数据"
            :data="tableData"
@@ -174,11 +174,12 @@
              height: '1.61rem',
              color: '#fff',
              background: '#1860A8',
              fontSize: '2rem',
              fontSize: '2.1rem',
            }"
            :cell-style="{
              color: '#fff',
              background: 'rgba(23, 87, 149, 0.9)',
              fontSize: '4rem',
            }"
          >
            <el-table-column