Procházet zdrojové kódy

把看板合到视频中心

yanghao před 4 dny
rodič
revize
3006a796c6
100 změnil soubory, kde provedl 2616 přidání a 38 odebrání
  1. 4 1
      .env.dev
  2. 3 0
      .env.prod
  3. 6 1
      index.html
  4. 8 0
      package.json
  5. 399 0
      pnpm-lock.yaml
  6. binární
      public/js/EasyPlayer.swf
  7. 0 0
      public/js/EasyWasmPlayer.js
  8. binární
      public/js/jessibuca-pro/bg.jpg
  9. 0 0
      public/js/jessibuca-pro/decoder-pro-audio.js
  10. binární
      public/js/jessibuca-pro/decoder-pro-audio.wasm
  11. 0 0
      public/js/jessibuca-pro/decoder-pro-hard-not-wasm.js
  12. 0 0
      public/js/jessibuca-pro/decoder-pro-hard.js
  13. 8 0
      public/js/jessibuca-pro/decoder-pro-mt-worker.js
  14. binární
      public/js/jessibuca-pro/decoder-pro-mt-worker.wasm
  15. 0 0
      public/js/jessibuca-pro/decoder-pro-mt-worker.worker.js
  16. 0 0
      public/js/jessibuca-pro/decoder-pro-mt.js
  17. 7 0
      public/js/jessibuca-pro/decoder-pro-simd-mt-worker.js
  18. binární
      public/js/jessibuca-pro/decoder-pro-simd-mt-worker.wasm
  19. 0 0
      public/js/jessibuca-pro/decoder-pro-simd-mt-worker.worker.js
  20. 0 0
      public/js/jessibuca-pro/decoder-pro-simd-mt.js
  21. 0 0
      public/js/jessibuca-pro/decoder-pro-simd.js
  22. binární
      public/js/jessibuca-pro/decoder-pro-simd.wasm
  23. 0 0
      public/js/jessibuca-pro/decoder-pro.js
  24. binární
      public/js/jessibuca-pro/decoder-pro.wasm
  25. binární
      public/js/jessibuca-pro/expand-hover.png
  26. binární
      public/js/jessibuca-pro/expand.png
  27. binární
      public/js/jessibuca-pro/jessibuca-logo.png
  28. 0 0
      public/js/jessibuca-pro/jessibuca-pro-multi.js
  29. 0 0
      public/js/jessibuca-pro/jessibuca-pro-talk.js
  30. 0 0
      public/js/jessibuca-pro/jessibuca-pro.js
  31. binární
      public/js/jessibuca-pro/logo.png
  32. binární
      public/js/jessibuca-pro/zoom-stop-hover.png
  33. binární
      public/js/jessibuca-pro/zoom-stop.png
  34. 5 1
      src/api/pms/device/index.ts
  35. 53 0
      src/api/pms/video/category.ts
  36. 114 0
      src/api/pms/video/channel.ts
  37. 333 0
      src/api/pms/video/device.ts
  38. 8 0
      src/api/pms/video/dicts.ts
  39. 61 0
      src/api/pms/video/group.ts
  40. 158 0
      src/api/pms/video/list.ts
  41. 52 0
      src/api/pms/video/mediaServer.ts
  42. 106 0
      src/api/pms/video/model.ts
  43. 77 0
      src/api/pms/video/product.ts
  44. 44 0
      src/api/pms/video/protocol.ts
  45. 88 0
      src/api/pms/video/record.ts
  46. 53 0
      src/api/pms/video/salve.ts
  47. 34 0
      src/api/pms/video/sipConfig.ts
  48. 73 0
      src/api/pms/video/sipdevice.ts
  49. 64 0
      src/api/pms/video/temp.ts
  50. 53 0
      src/api/pms/video/template.ts
  51. 186 0
      src/api/pms/video/user.ts
  52. 10 0
      src/api/pms/video/warn.ts
  53. 53 0
      src/api/rq/iotmeasurebook/index.ts
  54. binární
      src/assets/icon/clear.png
  55. binární
      src/assets/icon/download.png
  56. binární
      src/assets/icon/fangda-hov.png
  57. binární
      src/assets/icon/fangda.png
  58. binární
      src/assets/icon/guangquan+.png
  59. binární
      src/assets/icon/guangquan-.png
  60. binární
      src/assets/icon/guangquan-hov+.png
  61. binární
      src/assets/icon/guangquan-hov-.png
  62. binární
      src/assets/icon/icon-card.png
  63. binární
      src/assets/icon/icon-ercode.png
  64. binární
      src/assets/icon/icon-font.png
  65. binární
      src/assets/icon/icon-fullscreen.png
  66. binární
      src/assets/icon/icon-info.png
  67. binární
      src/assets/icon/icon-list.png
  68. binární
      src/assets/icon/icon-rank-1.png
  69. binární
      src/assets/icon/icon-rank-2.png
  70. binární
      src/assets/icon/icon-rank-3.png
  71. binární
      src/assets/icon/icon-rank-4.png
  72. binární
      src/assets/icon/icon-search.png
  73. binární
      src/assets/icon/jujiao+.png
  74. binární
      src/assets/icon/jujiao-.png
  75. binární
      src/assets/icon/jujiao-hov+.png
  76. binární
      src/assets/icon/jujiao-hov-.png
  77. binární
      src/assets/icon/save.png
  78. binární
      src/assets/icon/suoxiao-hov.png
  79. binární
      src/assets/icon/suoxiao.png
  80. binární
      src/assets/imgs/gateway.png
  81. 56 0
      src/assets/imgs/gateway.svg
  82. binární
      src/assets/imgs/product.png
  83. 66 0
      src/assets/imgs/product.svg
  84. binární
      src/assets/imgs/qrcode.png
  85. binární
      src/assets/imgs/video.png
  86. 45 0
      src/assets/imgs/video.svg
  87. binární
      src/assets/imgs/wifi-die.png
  88. binární
      src/assets/imgs/wifi-live.png
  89. binární
      src/assets/imgs/zlm-logo.png
  90. 1 0
      src/assets/svgs/device.svg
  91. 1 0
      src/assets/svgs/share.svg
  92. 0 0
      src/assets/svgs/wifi_0.svg
  93. 0 0
      src/assets/svgs/wifi_1.svg
  94. 0 0
      src/assets/svgs/wifi_2.svg
  95. 0 0
      src/assets/svgs/wifi_3.svg
  96. 0 0
      src/assets/svgs/wifi_4.svg
  97. 3 0
      src/components/AnimatedCountTo/index.ts
  98. 36 0
      src/components/AnimatedCountTo/index.vue
  99. 57 35
      src/components/SvgIcon/index.vue
  100. 291 0
      src/components/ZmTable/ZmTableColumn.vue

+ 4 - 1
.env.dev

@@ -4,7 +4,10 @@ NODE_ENV=production
 VITE_DEV=true
 
 # 请求路径
-VITE_BASE_URL='https://iot.deepoil.cc'
+VITE_BASE_URL='http://1.94.244.160:66'
+
+# MQTT服务地址
+VITE_MQTT_SERVER_URL = ''
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server

+ 3 - 0
.env.prod

@@ -6,6 +6,9 @@ VITE_DEV=false
 # 请求路径
 VITE_BASE_URL='https://aims.deepoil.cc'
 
+# MQTT服务地址
+VITE_MQTT_SERVER_URL = ''
+
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 

+ 6 - 1
index.html

@@ -3,8 +3,13 @@
   <head>
     <script src="https://g.alicdn.com/code/npm/@ali/dingtalk-h5-remote-debug/0.1.3/index.js"></script>
     <script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
-    <script async type="text/javascript" src="/js/base64.min.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1.6.1/dist/sockjs.min.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/stompjs@2.3.3/lib/stomp.min.js"></script>
+    <script type="text/javascript" src="/js/base64.min.js"></script>
     <script src="https://api.map.baidu.com/api?v=3.0&ak=c0crhdxQ5H7WcqbcazGr7mnHrLa4GmO0"></script>
+
+    <script src="/js/jessibuca-pro/jessibuca-pro.js"></script>
+    <script type="text/javascript" src="/js/EasyWasmPlayer.js"></script>
     <meta charset="UTF-8" />
     <link rel="icon" href="/favicon.ico" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge" />

+ 8 - 0
package.json

@@ -35,6 +35,8 @@
     "@iconify/iconify": "^3.1.1",
     "@kjgl77/datav-vue3": "^1.7.4",
     "@microsoft/fetch-event-source": "^2.0.1",
+    "@number-flow/vue": "^0.4.8",
+    "@riophae/vue-treeselect": "^0.4.0",
     "@types/echarts": "^5.0.0",
     "@videojs-player/vue": "^1.0.0",
     "@vueuse/core": "^10.9.0",
@@ -57,8 +59,11 @@
     "driver.js": "^1.3.1",
     "echarts": "^5.6.0",
     "echarts-wordcloud": "^2.1.0",
+    "element-china-area-data": "^6.1.0",
     "element-plus": "2.9.1",
     "fast-xml-parser": "^4.3.2",
+    "file-save": "^0.2.0",
+    "file-saver": "^2.0.5",
     "highlight.js": "^11.9.0",
     "jsencrypt": "^3.3.2",
     "lodash-es": "^4.17.21",
@@ -71,6 +76,7 @@
     "mitt": "^3.0.1",
     "moment": "^2.30.1",
     "motion-v": "^1.7.4",
+    "mqtt": "^5.14.1",
     "nprogress": "^0.2.0",
     "pinia": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
@@ -87,8 +93,10 @@
     "vue-dompurify-html": "^4.1.4",
     "vue-echarts": "^7.0.3",
     "vue-i18n": "9.10.2",
+    "vue-json-viewer": "^3.0.4",
     "vue-router": "4.4.5",
     "vue-types": "^5.1.1",
+    "vue3-next-qrcode": "^4.0.0",
     "vue3-signature": "^0.2.4",
     "vuedraggable": "^4.1.0",
     "vuex": "^4.1.0",

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 399 - 0
pnpm-lock.yaml


binární
public/js/EasyPlayer.swf


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/EasyWasmPlayer.js


binární
public/js/jessibuca-pro/bg.jpg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-audio.js


binární
public/js/jessibuca-pro/decoder-pro-audio.wasm


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-hard-not-wasm.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-hard.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 8 - 0
public/js/jessibuca-pro/decoder-pro-mt-worker.js


binární
public/js/jessibuca-pro/decoder-pro-mt-worker.wasm


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-mt-worker.worker.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-mt.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 7 - 0
public/js/jessibuca-pro/decoder-pro-simd-mt-worker.js


binární
public/js/jessibuca-pro/decoder-pro-simd-mt-worker.wasm


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-simd-mt-worker.worker.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-simd-mt.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro-simd.js


binární
public/js/jessibuca-pro/decoder-pro-simd.wasm


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/decoder-pro.js


binární
public/js/jessibuca-pro/decoder-pro.wasm


binární
public/js/jessibuca-pro/expand-hover.png


binární
public/js/jessibuca-pro/expand.png


binární
public/js/jessibuca-pro/jessibuca-logo.png


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/jessibuca-pro-multi.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/jessibuca-pro-talk.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
public/js/jessibuca-pro/jessibuca-pro.js


binární
public/js/jessibuca-pro/logo.png


binární
public/js/jessibuca-pro/zoom-stop-hover.png


binární
public/js/jessibuca-pro/zoom-stop.png


+ 5 - 1
src/api/pms/device/index.ts

@@ -118,7 +118,7 @@ export const IotDeviceApi = {
   },
 
   getIotDeviceTds: async (id: number) => {
-    return await request.get({ url: `/rq/iot-device/get/td?id=` + id })
+    return await request.get({ url: `/rq/iot-device/get/gateway/td?id=` + id })
   },
   getIotDeviceZHBDTds: async (id: number) => {
     return await request.get({ url: `/rq/iot-device/get/zhbd/td?id=` + id })
@@ -156,6 +156,10 @@ export const IotDeviceApi = {
     return await request.get({ url: `/rq/iot-device/td/page`, params })
   },
 
+  getIotDeviceOliConnectPage: async (params: any) => {
+    return await request.get({ url: `/rq/iot-device/td/ly/page`, params })
+  },
+
   // 新增时根据部门id获取设备列表
   getIotDeviceSetOptions: async (id: any) => {
     return await request.get({ url: `/rq/iot-device/dept/${id}` })

+ 53 - 0
src/api/pms/video/category.ts

@@ -0,0 +1,53 @@
+import request from '@/config/axios'
+
+// 查询产品分类列表
+export function listCategory(query) {
+  return request.get({
+    url: '/rq/iot-category/list',
+   
+    params: query
+  })
+}
+
+// 查询产品简短分类列表
+export function listShortCategory(query) {
+  return request.get({
+    url: '/rq/iot-category/shortlist',
+  
+    params: query,
+  })
+}
+
+// 查询产品分类详细
+export function getCategory(categoryId) {
+  return request.get({
+    url: '/rq/iot-category/' + categoryId,
+ 
+  })
+}
+
+// 新增产品分类
+export function addCategory(data) {
+  return request.post({
+    url: '/rq/iot-category',
+    
+    data: data
+  })
+}
+
+// 修改产品分类
+export function updateCategory(data) {
+  return request.put({
+    url: '/rq/iot-category',
+  
+    data: data
+  })
+}
+
+// 删除产品分类
+export function delCategory(categoryId) {
+  return request.delete({
+    url: `/rq/iot-category/delete?id=${categoryId}`
+  
+  })
+}

+ 114 - 0
src/api/pms/video/channel.ts

@@ -0,0 +1,114 @@
+import request from '@/config/axios'
+
+// 查询监控设备通道信息列表
+export async function listChannel(query) {
+  return await request.get({
+    url: '/rq/yf-sip-device-channel/page',
+    params: query
+  })
+}
+
+// 查询监控设备通道信息详细
+export function getChannel(channelId) {
+  return request.get({
+    url: '/sip/channel/' + channelId
+  })
+}
+
+// 新增监控设备通道信息
+export function addChannel(createNum, data) {
+  return request.post({
+    url: '/rq/yf-sip-device-channel/' + createNum,
+
+    data
+  })
+}
+
+// 修改监控设备通道信息
+export function updateChannel(data) {
+  return request.put({
+    url: '/sip/channel',
+
+    data: data
+  })
+}
+
+// 删除监控设备通道信息
+export function delChannel(channelId) {
+  return request.delete({
+    url: '/sip/channel/' + channelId
+  })
+}
+
+// 开始播放
+export function startPlay(deviceId, channelId) {
+  return request.get({
+    url: '/rq/sip/player/play/' + deviceId + '/' + channelId  // /rq/sip/player/play
+  })
+}
+
+// 获取流信息
+export function getStreaminfo(deviceId, channelId) {
+  return request.get({
+    url: '/sip/player/playstream/' + deviceId + '/' + channelId
+  })
+}
+
+export function playbackvideo(deviceId, channelId, query) {
+  return request.get({
+    url: '/rq/sip/player/playback/' + deviceId + '/' + channelId,
+
+    params: query
+  })
+}
+
+export function closeStream(deviceId, channelId, streamId) {
+  return request.get({
+    url: '/rq/sip/player/closeStream/' + deviceId + '/' + channelId + '/' + streamId
+  })
+}
+
+export function playbackPause(deviceId, channelId, streamId) {
+  return request.get({
+    url: '/sip/player/playbackPause/' + deviceId + '/' + channelId + '/' + streamId
+  })
+}
+
+export function playbackReplay(deviceId, channelId, streamId) {
+  return request.get({
+    url: '/sip/player/playbackReplay/' + deviceId + '/' + channelId + '/' + streamId
+  })
+}
+
+export function playbackSeek(deviceId, channelId, streamId, query) {
+  return request.get({
+    url: '/rq/sip/player/playbackSeek/' + deviceId + '/' + channelId + '/' + streamId,
+
+    params: query
+  })
+}
+
+export function playbackSpeed(deviceId, channelId, streamId, query) {
+  return request.get({
+    url: '/sip/player/playbackSpeed/' + deviceId + '/' + channelId + '/' + streamId,
+
+    params: query
+  })
+}
+
+// 监控设备绑定设备或场景
+export function binding(data) {
+  return request.post({
+    url: '/iot/relation/addOrUp',
+
+    data
+  })
+}
+// 通过设备或场景查询监控设备通道信息
+export function listRelDeviceOrScene(query) {
+  return request.get({
+    url: '/sip/channel/listRelDeviceOrScene',
+
+    params: query
+  })
+}

+ 333 - 0
src/api/pms/video/device.ts

@@ -0,0 +1,333 @@
+import request from '@/config/axios'
+
+// 查询设备列表
+export function listDevice(query) {
+    return request.get({
+        url: '/iot/device/list',
+       
+        params: query,
+    });
+}
+
+// 查询未授权设备列表
+export function listUnAuthDevice(query) {
+    return request.get({
+        url: '/iot/device/unAuthlist',
+       
+        params: query,
+    });
+}
+
+// 查询分组可添加设备分页列表
+export function listDeviceByGroup(query) {
+    return request.get({
+        url: '/iot/device/listByGroup',
+        
+        params: query,
+    });
+}
+
+// 查询设备简短列表
+export function listDeviceShort(query) {
+    return request.get({
+        url: '/rq/yf-iot-device/shortList',
+       
+        params: query,
+    });
+}
+
+// 查询所有设备简短列表
+export function listAllDeviceShort() {
+    return request.get({
+        url: '/iot/device/all',
+        
+    });
+}
+
+// 查询设备详细
+export function getDevice(deviceId) {
+    return request.get({
+        url: '/rq/yf-iot-device/' + deviceId,
+        
+    });
+}
+
+// 设备数据同步
+export function deviceSynchronization(serialNumber) {
+    return request.get({
+        url: '/iot/device/synchronization/' + serialNumber,
+       
+    });
+}
+
+// 根据设备编号查询设备详细
+export function getDeviceBySerialNumber(serialNumber) {
+    return request.get({
+        url: '/iot/device/getDeviceBySerialNumber/' + serialNumber,
+       
+    });
+}
+
+// 查询设备统计信息
+export function getDeviceStatistic() {
+    return request.get({
+        url: '/iot/device/statistic',
+       
+    });
+}
+
+// 选择分配设备
+export function distributionDevice(deptId, deviceIds) {
+    return request.post({
+        url: '/iot/device/assignment?deptId=' + deptId + '&deviceIds=' + deviceIds,
+       
+    });
+}
+//回收设备
+export function recycleDevice(deviceIds, recoveryDeptId) {
+    return request.post({
+        url: '/iot/device/recovery?deviceIds=' + deviceIds + '&recoveryDeptId=' + recoveryDeptId,
+        
+    });
+}
+//查询设备导入记录
+export function listImportRecord(params) {
+    return request.get({
+        url: '/iot/record/list',
+       
+        params: params,
+    });
+}
+//查询设备回收记录
+export function listRecycleRecord(params) {
+    return request.get({
+        url: '/iot/record/list',
+       
+        params: params,
+    });
+}
+//查询设备分配记录
+export function listAllotRecord(params) {
+    return request.get({
+        url: '/iot/record/list',
+      
+        params: params,
+    });
+}
+
+// 查询设备运行状态详细
+export function getDeviceRunningStatus(params) {
+    return request.get({
+        url: '/iot/device/runningStatus',
+      
+        params: params,
+    });
+}
+
+// 查询设备物模型的值
+export function getDeviceThingsModelValue(deviceId) {
+    return request.get({
+        url: '/iot/device/thingsModelValue/' + deviceId,
+       
+    });
+}
+
+// 新增设备
+export function addDevice(data) {
+    return request.post({
+        url: '/rq/yf-iot-device',
+        
+        data: data,
+    });
+}
+
+// 修改设备
+export function updateDevice(data) {
+    return request.put({
+        url: '/rq/yf-iot-device',
+       
+        data: data,
+    });
+}
+
+// 删除设备
+export function delDevice(deviceId) {
+    return request.delete({
+        url: '/rq/yf-iot-device/' + deviceId,
+       
+    });
+}
+
+// 生成设备编号
+export function generatorDeviceNum(params) {
+    return request.get({
+        url: '/rq/yf-iot-device/generator',
+        
+        params: params,
+    });
+}
+
+export function getGwDevCode(params) {
+    return request.get({
+        url: '/iot/device/gwDevCount',
+        
+        params: params,
+    });
+}
+
+//mqtt连接参数查看
+export function getMqttConnect(params) {
+    return request.get({
+        url: '/iot/device/getMqttConnectData',
+        
+        params: params,
+    });
+}
+
+
+// 查询设备变量概况
+export function listThingsModel(query) {
+    return request.get({
+        url: '/iot/device/listThingsModel',
+       
+        params: query,
+    });
+}
+
+// 查询设备历史轨迹
+export function getdevicehis(params) {
+    return request.get({
+        url: '/iot/device/devicehis',
+       
+        params: params,
+    });
+}
+
+// 测试dtu
+export function getDevDtu(data) {
+    return request.post({
+        url: '/iot/device/getDevDtu',
+       
+        data: data,
+    });
+}
+
+export function getDtuDeviceList(params) {
+    return request.get({
+        url: '/iot/device/getDtuDeviceList',
+       
+        params: params,
+    });
+}
+
+export function addDeviceUsers(data) {
+    return request.post({
+        url: '/iot/device/addDeviceUsers',
+      
+        data: data,
+    });
+}
+
+export function getDtuDeviceGroup() {
+    return request.get({
+        url: '/iot/device/getDtuDeviceGroup',
+       
+    });
+}
+
+export function updateDtuDevice(data) {
+    return request.post({
+        url: '/iot/device/updateDtuDevice',
+      
+        data: data,
+    });
+}
+
+export function deleteDtuDevice(data) {
+    return request.post({
+        url: '/iot/device/deleteDtuDevice',
+      
+        data: data,
+    });
+}
+
+export function getDtuDeviceGroupList(params) {
+    return request.get({
+        url: '/iot/device/getDtuDeviceGroupList',
+        
+        params: params,
+    });
+}
+
+export function addAndUpdateDtuDevGroup(data) {
+    return request.post({
+        url: '/iot/device/addAndUpdateDtuDevGroup',
+       
+        data: data,
+    });
+}
+
+export function deleteDtuDeviceGroup(params) {
+    return request.get({
+        url: '/iot/device/deleteDtuDeviceGroup',
+        
+        params: params,
+    });
+}
+
+export function selectDeviceAisfptList(params) {
+    return request.get({
+        url: '/iot/device/selectDeviceAisfptList',
+       
+        params: params,
+    });
+}
+
+export function addAndUpdateDeviceAisfpt(data) {
+    return request.post({
+        url: '/iot/device/addAndUpdateDeviceAisfpt',
+        
+        data: data,
+    });
+}
+
+export function deleteDeviceAisfpt(params) {
+    return request.get({
+        url: '/iot/device/deleteDeviceAisfpt',
+       
+        params: params,
+    });
+}
+
+export function getDeviceAbnormalList(query) {
+    return request.get({
+        url: `/iot/device/getDeviceAbnormalList`,
+       
+        params: query
+    })
+}
+
+export function updateMqttConnectData(query) {
+    return request.post({
+        url: `/iot/device/updateMqttConnectData`,
+       
+        data: query
+    })
+}
+
+// 查询设备统计信息
+export function getdeviceBoardList() {
+    return request.get({
+        url: '/iot/device/deviceBoardList',
+       
+    });
+}
+
+
+// 根据经纬度来查询地图上的数据
+export function deviceLongitudeAndLatitudeApi() {
+    return request.get({
+        url: '/iot/device/deviceLongitudeAndLatitude',
+       
+    });
+}

+ 8 - 0
src/api/pms/video/dicts.ts

@@ -0,0 +1,8 @@
+import request from '@/config/axios'
+
+// 查询设备列表
+export function getDicts(type) {
+    return request.get({
+        url: `/system/dict-data/type/${type}`,
+    });
+}

+ 61 - 0
src/api/pms/video/group.ts

@@ -0,0 +1,61 @@
+import request from '@/config/axios'
+
+// 查询设备分组列表
+export function listGroup(query) {
+  return request.get({
+    url: '/rq/iot-group/page',
+   
+    params: query
+  })
+}
+
+// 查询设备分组详细
+export function getGroup(groupId) {
+  return request.get({
+    url: '/rq/iot-group/' + groupId,
+  
+  })
+}
+
+// 查询分组下的关联设备ID数组
+export function getDeviceIds(groupId) {
+  return request.get({
+    url: '/rq/iot-group/getDeviceIds/' + groupId,
+  
+  })
+}
+
+// 新增设备分组
+export function addGroup(data) {
+  return request.post({
+    url: '/rq/iot-group',
+ 
+    data: data
+  })
+}
+
+// 修改设备分组
+export function updateGroup(data) {
+  return request.put({
+    url: '/rq/iot-group',
+ 
+    data: data
+  })
+}
+
+// 更新分组下的设备
+export function updateDeviceGroups(data) {
+  return request.put({
+    url: '/rq/iot-group/updateDeviceGroups',
+  
+    data: data
+  })
+}
+
+// 删除设备分组
+export function delGroup(groupId) {
+  return request.delete({
+    url: '/rq/iot-group/' + groupId,
+   
+  })
+}

+ 158 - 0
src/api/pms/video/list.ts

@@ -0,0 +1,158 @@
+import request from '@/config/axios'
+
+// 查询场景管理列表
+export function getSceneModelList(query) {
+    return request.get({
+        url: '/scene/model/list',
+      
+        params: query,
+    });
+}
+
+// 新增场景管理
+export function addSceneModel(data) {
+    return request.post({
+        url: '/scene/model',
+        
+        data: data,
+    });
+}
+
+// 修改场景管理
+export function updateSceneModel(data) {
+    return request.put({
+        url: '/scene/model',
+       
+        data: data,
+    });
+}
+
+// 删除场景管理
+export function deleteSceneModel(id) {
+    return request.delete({
+        url: '/scene/model/' + id,
+       
+    });
+}
+
+// 获取场景管理详细信息
+export function getSceneModelDetail(id) {
+    return request.get({
+        url: '/scene/model/' + id,
+       
+    });
+}
+
+// 点击查看进入后查询变量列表
+export function getSceneModelDataList(query) {
+    return request.get({
+        url: '/scene/modelData/list',
+       
+        params: query,
+    });
+}
+
+// 查询场景关联设备列表
+export function getSceneModelDeviceList(query) {
+    return request.get({
+        url: '/scene/modelDevice/list',
+       
+        params: query,
+    });
+}
+
+// 新增场景关联设备
+export function addModelDevice(data) {
+    return request.post({
+        url: '/scene/modelDevice',
+       
+        data: data,
+    });
+}
+
+// 删除场景关联设备
+export function deleteModelDevice(id) {
+    return request.delete({
+        url: '/scene/modelDevice/' + id,
+       
+    });
+}
+
+// 编辑场景关联设备
+export function updateModelDevice(data) {
+    return request.put({
+        url: '/scene/modelDevice',
+       
+        data: data,
+    });
+}
+
+// 点击编辑进入后根据类型查询变量列表
+export function getSceneModelDataListByType(query) {
+    return request.get({
+        url: '/scene/modelData/listByType',
+       
+        params: query,
+    });
+}
+
+// 全部启用
+export function enableModelDevice(data) {
+    return request.post({
+        url: '/scene/modelDevice/editEnable',
+      
+        data: data,
+    });
+}
+
+// 启用变量
+export function enableModelData(data) {
+    return request.post({
+        url: '/scene/modelData/editEnable',
+       
+        data: data,
+    });
+}
+
+// 获取场景录入运算变量列表
+export function getSceneModelTagList(query) {
+    return request.get({
+        url: '/scene/modelTag/list',
+       
+        params: query,
+    });
+}
+
+// 新增场景录入运算变量
+export function addSceneModelTag(data) {
+    return request.post({
+        url: '/scene/modelTag',
+       
+        data: data,
+    });
+}
+
+// 编辑场景录入运算变量
+export function updateSceneModelTag(data) {
+    return request.put({
+        url: '/scene/modelTag',
+        
+        data: data,
+    });
+}
+
+// 删除场景录入运算变量
+export function deleteSceneModelTag(id) {
+    return request.delete({
+        url: '/scene/modelTag/' + id,
+       
+    });
+}
+
+// 获取场景录入运算变量详情
+export function getSceneModelTag(id) {
+    return request.get({
+        url: '/scene/modelTag/' + id,
+        
+    });
+}

+ 52 - 0
src/api/pms/video/mediaServer.ts

@@ -0,0 +1,52 @@
+import request from '@/config/axios'
+
+// 查询流媒体服务器配置列表
+export function listmediaServer(query) {
+  return request.get({
+    url: '/rq/yf-media-server/page',
+   
+    params: query
+  })
+}
+
+// 查询流媒体服务器配置详细
+export function getmediaServer() {
+  return request.get({
+    url: '/rq/yf-media-server/',
+    
+  })
+}
+
+// 新增流媒体服务器配置
+export function addmediaServer(data) {
+  return request.post({
+    url: '/rq/yf-media-server/create',
+    
+    data: data
+  })
+}
+
+// 修改流媒体服务器配置
+export function updatemediaServer(data) {
+  return request.put({
+    url: '/rq/yf-media-server/update',
+    
+    data: data
+  })
+}
+
+// 删除流媒体服务器配置
+export function delmediaServer(id) {
+  return request.delete({
+    url: '/rq/yf-media-server/' + id,
+   
+  })
+}
+
+export function checkmediaServer(query) {
+  return request.get({
+    url: '/rq/yf-media-server/check' ,
+    
+    params: query
+  })
+}

+ 106 - 0
src/api/pms/video/model.ts

@@ -0,0 +1,106 @@
+import request from '@/config/axios'
+
+// 查询物模型列表
+export function listModel(query) {
+  return request.get({
+    url: '/rq/iot-things-model/page',
+ 
+    params: query,
+  });
+}
+
+// 查询物模型详细
+export function getModel(modelId) {
+  return request.get({
+    url: '/iot/model/' + modelId,
+   
+  });
+}
+
+// 查询物模型对应分享设备用户权限列表
+export function permListModel(productId) {
+  return request.get({
+    url: '/iot/model/permList/' + productId,
+   
+  });
+}
+
+// 新增物模型
+export function addModel(data) {
+  return request.post({
+    url: '/iot/model',
+
+    data: data,
+  });
+}
+
+// 导入通用物模型
+export function importModel(data) {
+  return request.post({
+    url: '/iot/model/import',
+  
+    data: data,
+  });
+}
+
+// 导入excel物模型
+export function importExcel(data) {
+    return request.post({
+        url: '/iot/model/importExcel',
+        
+        data: data,
+    });
+}
+
+
+// 修改物模型
+export function updateModel(data) {
+  return request.put({
+    url: '/iot/model',
+   
+    data: data,
+  });
+}
+
+// 删除物模型
+export function delModel(modelId) {
+  return request.delete({
+    url: '/iot/model/' + modelId,
+   
+  });
+}
+
+// 根据产品ID获取缓存的物模型
+export function cacheJsonThingsModel(productId) {
+  return request.get({
+    url: '/iot/model/cache/' + productId,
+    
+  });
+}
+
+// 同步采集点模板到产品物模型
+export function synchron(data) {
+  return request.post({
+    url: '/iot/model/synchron',
+   
+    data: data,
+  });
+}
+
+// 根据产品ID获取缓存的物模型
+export function getlListModbus(query) {
+  return request.get({
+    url: '/iot/model/listModbus',
+   
+    params: query,
+  });
+}
+
+// 根据产品ID获取缓存的物模型
+export function getWriteList(query) {
+  return request.get({
+    url: '/iot/model/write',
+ 
+    params: query,
+  });
+}

+ 77 - 0
src/api/pms/video/product.ts

@@ -0,0 +1,77 @@
+import request from '@/config/axios'
+
+// 查询产品列表
+export function listProduct(query) {
+  return request.get({
+    url: '/rq/iot-product/list',
+   
+    params: query
+  })
+}
+
+// 查询产品列表
+export function listShortProduct() {
+  return request.get({
+    url: '/rq/iot-product/shortList',
+    
+  })
+}
+
+// 查询产品详细
+export function getProduct(productId) {
+  return request.get({
+    url: `/rq/iot-product/get?id=${productId}`,
+  })
+}
+
+// 新增产品
+export function addProduct(data) {
+  return request.post({
+    url: '/rq/iot-product',
+   
+    data: data
+  })
+}
+
+// 修改产品
+export function updateProduct(data) {
+  return request.put({
+    url: '/rq/iot-product',
+   
+    data: data
+  })
+}
+
+// 获取产品下设备的数量
+export function deviceCount(productId) {
+  return request.get({
+    url: '/rq/iot-product/deviceCount/' + productId,
+    
+  })
+}
+
+// 更新产品状态
+export function changeProductStatus(data) {
+  return request.put({
+    url: '/rq/iot-product/status',
+   
+    data:data
+  })
+}
+
+// 删除产品
+export function delProduct(productId) {
+  return request.delete({
+    url: '/rq/iot-product/' + productId,
+    
+  })
+}
+
+// 根据采集点模板id查询所有产品
+export function selectByTempleId(params) {
+  return request.get({
+    url: '/rq/iot-product/queryByTemplateId',
+    
+    params: params
+  })
+}

+ 44 - 0
src/api/pms/video/protocol.ts

@@ -0,0 +1,44 @@
+import request from '@/config/axios'
+
+// 查询协议列表
+export function listProtocol(query) {
+  return request.get({
+    url: '/rq/iot-protocol/list',
+    
+    params: query
+  })
+}
+
+// 查询协议详细
+export function getProtocol(id) {
+  return request.get({
+    url: '/rq/iot-protocol' + id,
+    
+  })
+}
+
+// 新增协议
+export function addProtocol(data) {
+  return request.post({
+    url: '/rq/iot-protocol',
+  
+    data: data
+  })
+}
+
+// 修改协议
+export function updateProtocol(data) {
+  return request.put({
+    url: '/rq/iot-protocol',
+   
+    data: data
+  })
+}
+
+// 删除协议
+export function delProtocol(id) {
+  return request.delete({
+    url: '/rq/iot-protocol/' + id,
+    
+  })
+}

+ 88 - 0
src/api/pms/video/record.ts

@@ -0,0 +1,88 @@
+import request from '@/config/axios'
+
+export function getDevRecord(deviceId,channelId,query) {
+  return request.get({
+    url: '/rq/sip/record/devquery/' + deviceId + "/" + channelId,
+ 
+    params: query
+  })
+}
+
+export function getRecord(channelId,sn) {
+  return request.get({
+    url: '/sip/record/query/' + channelId + "/" + sn,
+   
+  })
+}
+
+export function getServerRecord(query) {
+  return request.get({
+    url: '/sip/record/serverRecord/list',
+  
+    params: query
+  })
+}
+
+export function getServerRecordByDate(query) {
+  return request.get({
+    url: '/sip/record/serverRecord/date/list',
+ 
+    params: query
+  })
+}
+
+export function getServerRecordByStream(query) {
+  return request.get({
+    url: '/sip/record/serverRecord/stream/list',
+   
+    params: query
+  })
+}
+
+export function getServerRecordByApp(query) {
+  return request.get({
+    url: '/sip/record/serverRecord/app/list',
+   
+    params: query
+  })
+}
+
+export function getServerRecordByFile(query) {
+  return request.get({
+    url: '/sip/record/serverRecord/file/list',
+   
+    params: query
+  })
+}
+
+export function getServerRecordByDevice(query) {
+  return request.get({
+    url: '/sip/record/serverRecord/device/list',
+   
+    params: query
+  })
+}
+
+export function startPlayRecord(deviceId, channelId) {
+  return request.get({
+    url: '/rq/sip/record/play/' + deviceId + "/" + channelId,
+   
+  })
+}
+
+export function startDownloadRecord(deviceId, channelId, query) {
+  return request.get({
+    url: '/rq/sip/record/download/' + deviceId + "/" + channelId,
+ 
+    params: query
+  })
+}
+
+
+export function uploadRecord(query) {
+  return request.get({
+    url: '/sip/record/upload',
+    
+    params: query
+  })
+}

+ 53 - 0
src/api/pms/video/salve.ts

@@ -0,0 +1,53 @@
+import request from '@/config/axios'
+
+// 查询变量模板设备从机列表
+export function listSalve(query) {
+  return request.get({
+    url: '/iot/salve/list',
+ 
+    params: query
+  })
+}
+
+// 查询变量模板设备从机详细
+export function getSalve(id) {
+  return request.get({
+    url: '/iot/salve/' + id,
+  
+  })
+}
+
+// 新增变量模板设备从机
+export function addSalve(data) {
+  return request.post({
+    url: '/iot/salve',
+   
+    data: data
+  })
+}
+
+// 修改变量模板设备从机
+export function updateSalve(data) {
+  return request.put({
+    url: '/iot/salve',
+ 
+    data: data
+  })
+}
+
+// 删除变量模板设备从机
+export function delSalve(id) {
+  return request.delete({
+    url: '/iot/salve/' + id,
+   
+  })
+}
+
+//根据产品id查询从机列表
+export function listByPid(params) {
+    return request.get({
+        url: "/iot/salve/listByPId",
+       
+        params: params,
+    })
+}

+ 34 - 0
src/api/pms/video/sipConfig.ts

@@ -0,0 +1,34 @@
+import request from '@/config/axios'
+
+// 查询sip系统配置详细
+export function getSipconfig(productId) {
+  return request.get({
+    url: '/rq/iot-sip-config/' + productId,
+  
+  })
+}
+
+// 新增sip系统配置
+export function addSipconfig(data) {
+  return request.post({
+    url: '/rq/iot-sip-config',
+   
+    data: data
+  })
+}
+
+// 修改sip系统配置
+export function updateSipconfig(data) {
+  return request.put({
+    url: '/rq/iot-sip-config/update',
+  
+    data: data
+  })
+}
+
+export function delSipconfigByProductId(productId) {
+  return request.delete({
+    url: '/rq/iot-sip-config/product/' + productId,
+   
+  })
+}

+ 73 - 0
src/api/pms/video/sipdevice.ts

@@ -0,0 +1,73 @@
+import request from '@/config/axios'
+
+// 查询监控设备列表
+export function listSipDevice(query) {
+  return request.get({
+    url: '/sip/device/list',
+    params: query
+  })
+}
+
+export function listSipDeviceChannel(deviceId) {
+  return request.get({
+    url: '/rq/yf-sip-device/listchannel/'+ deviceId,
+    
+  })
+}
+
+// 查询监控设备详细
+export function getSipDevice(deviceId) {
+  return request.get({
+    url: '/sip/device/' + deviceId,
+  
+  })
+}
+
+// 新增监控设备
+export function addSipDevice(data) {
+  return request.post({
+    url: '/sip/device',
+  
+    data: data
+  })
+}
+
+// 修改监控设备
+export function updateSipDevice(data) {
+  return request.put({
+    url: '/sip/device',
+  
+    data: data
+  })
+}
+
+// 删除监控设备
+export function delSipDevice(deviceId) {
+  return request.delete({
+    url: '/sip/device/' + deviceId,
+   
+  })
+}
+
+export function delSipDeviceBySipId(sipId) {
+  return request.delete({
+    url: '/rq/yf-sip-device/sipid/' + sipId,
+    
+  })
+}
+
+export function ptzdirection(deviceId,channelId,data) {
+  return request.post({
+    url: '/sip/ptz/direction/'+ deviceId + "/" + channelId,
+   
+    data: data
+  })
+}
+
+export function ptzscale(deviceId,channelId,data) {
+  return request.post({
+    url: '/sip/ptz/scale/'+ deviceId + "/" + channelId,
+    
+    data: data
+  })
+}

+ 64 - 0
src/api/pms/video/temp.ts

@@ -0,0 +1,64 @@
+import request from '@/config/axios'
+
+// 查询设备采集变量模板列表
+export function listTemp(query) {
+  return request.get({
+    url: '/rq/iot-var-temp/page',
+    
+    params: query
+  })
+}
+
+// 查询设备采集变量模板详细
+export function getTemp(templateId) {
+  return request.get({
+    url: '/iot/temp/' + templateId,
+   
+  })
+}
+
+// 新增设备采集变量模板
+export function addTemp(data) {
+  return request.post({
+    url: '/iot/temp',
+  
+    data: data
+  })
+}
+
+// 修改设备采集变量模板
+export function updateTemp(data) {
+  return request.put({
+    url: '/iot/temp',
+   
+    data: data
+  })
+}
+
+// 删除设备采集变量模板
+export function delTemp(templateId) {
+  return request.delete({
+    url: '/iot/temp/' + templateId,
+    
+  })
+}
+
+
+//根据产品查询采集点关联
+export function getDeviceTemp(params){
+  return request.get({
+    url: '/iot/temp/getTemp' ,
+    
+    params: params,
+    
+  })
+}
+
+export function getTempByPId(params){
+  return request.get({
+    url: '/rq/iot-var-temp/getTempByPid',
+    params: params,
+    
+
+  })
+}

+ 53 - 0
src/api/pms/video/template.ts

@@ -0,0 +1,53 @@
+import request from '@/config/axios'
+
+// 查询通用物模型列表
+export function listTemplate(query) {
+  return request.get({
+    url: '/rq/iot-things-model-template/list',
+    
+    params: query
+  })
+}
+
+// 查询通用物模型详细
+export function getTemplate(templateId) {
+  return request.get({
+    url: '/iot/template/' + templateId,
+   
+  })
+}
+
+// 新增通用物模型
+export function addTemplate(data) {
+  return request.post({
+    url: '/iot/template',
+  
+    data: data
+  })
+}
+
+// 修改通用物模型
+export function updateTemplate(data) {
+  return request.put({
+    url: '/iot/template',
+   
+    data: data
+  })
+}
+
+// 删除通用物模型
+export function delTemplate(templateId) {
+  return request.delete({
+    url: '/iot/template/' + templateId,
+    
+  })
+}
+
+// 查询通用物模型详细
+export function getAllPoints(params) {
+  return request.get({
+    url: '/rq/iot-things-model-template/getPoints',
+   
+    params: params,
+  })
+}

+ 186 - 0
src/api/pms/video/user.ts

@@ -0,0 +1,186 @@
+import request from '@/config/axios'
+function parseStrEmpty(str) {
+  if (!str || str == "undefined" || str == "null") {
+    return "";
+  }
+  return str;
+}
+
+// 查询用户列表
+export function listUser(query) {
+    return request.get({
+        url: '/system/user/list',
+        
+        params: query,
+    });
+}
+
+// 查询终端用户列表
+export function terminalUserList(query) {
+    return request.get({
+        url: '/system/user/listTerminal',
+       
+        params: query,
+    });
+}
+// 查询用户详细
+export function getUser(userId) {
+    return request.get({
+        url: '/system/user/' + parseStrEmpty(userId),
+       
+    });
+}
+// 查询角色列表
+export function getRole(deptId) {
+    return request.get({
+        url: '/system/dept/getRole?deptId=' + deptId,
+       
+    });
+}
+
+// 新增用户
+export function addUser(data) {
+    return request.post({
+        url: '/system/user',
+       
+        data: data,
+    });
+}
+
+// 修改用户
+export function updateUser(data) {
+    return request.put({
+        url: '/system/user',
+       
+        data: data,
+    });
+}
+
+// 删除用户
+export function delUser(userId) {
+    return request.delete({
+        url: '/system/user/' + userId,
+      
+    });
+}
+
+// 用户密码重置
+export function resetUserPwd(userId, password) {
+    const data = {
+        userId,
+        password,
+    };
+    return request.put({
+        url: '/system/user/resetPwd',
+        
+        data: data,
+    });
+}
+
+// 用户状态修改
+export function changeUserStatus(userId, status) {
+    const data = {
+        userId,
+        status,
+    };
+    return request.put({
+        url: '/system/user/changeStatus',
+       
+        data: data,
+    });
+}
+// 获取微信二维码
+export function getLoginParam() {
+    return request.get({
+        url: '/wechat/getWxBindQr',
+       
+    });
+}
+// 解除绑定
+export function secureBind(data) {
+    return request.post({
+        url: '/wechat/cancelBind',
+       
+        data: data,
+    });
+}
+// 查询用户个人信息
+export function getUserProfile() {
+    return request.get({
+        url: '/system/user/profile',
+       
+    });
+}
+
+// 修改用户个人信息
+export function updateUserProfile(data) {
+    return request.put({
+        url: '/system/user/profile',
+       
+        data: data,
+    });
+}
+
+// 用户密码重置
+export function updateUserPwd(oldPassword, newPassword) {
+    const data = {
+        oldPassword,
+        newPassword,
+    };
+    return request.put({
+        url: '/system/user/profile/updatePwd',
+        
+        params: data,
+    });
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+    return request.post({
+        url: '/system/user/profile/avatar',
+       
+        data: data,
+    });
+}
+
+// 查询授权角色
+export function getAuthRole(userId) {
+    return request.get({
+        url: '/system/user/authRole/' + userId,
+        
+    });
+}
+
+// 保存授权角色
+export function updateAuthRole(data) {
+    return request.put({
+        url: '/system/user/authRole',
+      
+        params: data,
+    });
+}
+
+// 查询机构下拉树结构
+export function deptsTreeSelect() {
+    return request.get({
+        url: '/system/user/deptTree',
+       
+    });
+}
+
+// 查询子机构下拉树结构
+export function deptsTreeSelectSub(showOwner) {
+    return request.get({
+        url: '/system/user/deptTree?showOwner=' + showOwner,
+       
+    });
+}
+
+// 查询终端用户列表
+export function getByDeptId(query) {
+  return request.get({
+    url: '/system/user/getByDeptId',
+   
+    params: query,
+  });
+}

+ 10 - 0
src/api/pms/video/warn.ts

@@ -0,0 +1,10 @@
+import request from '@/config/axios'
+
+// 查询用户列表
+export function warnList(query) {
+    return request.get({
+        url: '/rq/iot-video-alarm/page',
+        
+        params: query,
+    });
+}

+ 53 - 0
src/api/rq/iotmeasurebook/index.ts

@@ -0,0 +1,53 @@
+import request from '@/config/axios/service2'
+
+// 计量器具台账 VO
+export interface IotMeasureBookVO {
+  id: number // 主键id
+  measureCode: string // 计量器具编码
+  measureName: string // 计量器具名称
+  classify: string // 分类
+  dutyPerson: string // 责任人
+  buyDate: string // 采购日期
+  brand: string // 品牌
+  modelName: string // 规格型号
+  validity: Date // 有效期
+  lastTime: string // 上次检验/校准日期
+  measureUnit: string // 单位
+  measurePrice: number // 价格
+  measurePic: string // 图片
+  remark: string // 备注
+  deptId: number // 部门id
+}
+
+// 计量器具台账 API
+export const IotMeasureBookApi = {
+  // 查询计量器具台账分页
+  getIotMeasureBookPage: async (params: any) => {
+    return await request.get({ url: `/rq/iot-measure-book/page`, params })
+  },
+
+  // 查询计量器具台账详情
+  getIotMeasureBook: async (id: number) => {
+    return await request.get({ url: `/rq/iot-measure-book/get?id=` + id })
+  },
+
+  // 新增计量器具台账
+  createIotMeasureBook: async (data: IotMeasureBookVO) => {
+    return await request.post({ url: `/rq/iot-measure-book/create`, data })
+  },
+
+  // 修改计量器具台账
+  updateIotMeasureBook: async (data: IotMeasureBookVO) => {
+    return await request.put({ url: `/rq/iot-measure-book/update`, data })
+  },
+
+  // 删除计量器具台账
+  deleteIotMeasureBook: async (id: number) => {
+    return await request.delete({ url: `/rq/iot-measure-book/delete?id=` + id })
+  },
+
+  // 导出计量器具台账 Excel
+  exportIotMeasureBook: async (params) => {
+    return await request.download({ url: `/rq/iot-measure-book/export-excel`, params })
+  },
+}

binární
src/assets/icon/clear.png


binární
src/assets/icon/download.png


binární
src/assets/icon/fangda-hov.png


binární
src/assets/icon/fangda.png


binární
src/assets/icon/guangquan+.png


binární
src/assets/icon/guangquan-.png


binární
src/assets/icon/guangquan-hov+.png


binární
src/assets/icon/guangquan-hov-.png


binární
src/assets/icon/icon-card.png


binární
src/assets/icon/icon-ercode.png


binární
src/assets/icon/icon-font.png


binární
src/assets/icon/icon-fullscreen.png


binární
src/assets/icon/icon-info.png


binární
src/assets/icon/icon-list.png


binární
src/assets/icon/icon-rank-1.png


binární
src/assets/icon/icon-rank-2.png


binární
src/assets/icon/icon-rank-3.png


binární
src/assets/icon/icon-rank-4.png


binární
src/assets/icon/icon-search.png


binární
src/assets/icon/jujiao+.png


binární
src/assets/icon/jujiao-.png


binární
src/assets/icon/jujiao-hov+.png


binární
src/assets/icon/jujiao-hov-.png


binární
src/assets/icon/save.png


binární
src/assets/icon/suoxiao-hov.png


binární
src/assets/icon/suoxiao.png


binární
src/assets/imgs/gateway.png


+ 56 - 0
src/assets/imgs/gateway.svg

@@ -0,0 +1,56 @@
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81 80" class="design-iconfont">
+  <path d="M46.3594 57.6562H52.2188V55.3125H48.7031V47.0312H46.3594V57.6562Z" fill="url(#kpkn6ylv3__paint0_linear_6946_492)"/>
+  <path d="M28.7812 57.6562H34.6406V47.0312H32.2969V55.3125H28.7812V57.6562Z" fill="url(#kpkn6ylv3__paint1_linear_6946_492)"/>
+  <path d="M41.6719 47.0312H39.3281V54.1406H41.6719V47.0312Z" fill="url(#kpkn6ylv3__paint2_linear_6946_492)"/>
+  <path d="M25.1875 32.6172C25.375 25.6797 31.1719 20 38.1562 20C38.9531 20 39.75 20.0703 40.5 20.2109C44.4141 20.9375 47.7891 23.5234 49.6406 27.1094C52.8281 26.9922 55.5469 29.4766 55.7344 32.6172C58.5703 33.9531 60.5 36.8359 60.5 40C60.5 44.5234 56.7422 48.2031 52.2188 48.2031H28.7812C24.2578 48.2031 20.5 44.5234 20.5 40C20.5 36.8359 22.3516 33.9531 25.1875 32.6172Z" fill="url(#kpkn6ylv3__paint3_linear_6946_492)"/>
+  <path d="M33.4922 40.375L35.5078 41.5937C36.5859 39.8359 38.4375 38.7812 40.5 38.7812C42.5625 38.7812 44.4141 39.8359 45.4922 41.5937L47.5078 40.375C46.0078 37.9141 43.3828 36.4375 40.5 36.4375C37.6172 36.4375 34.9922 37.9141 33.4922 40.375Z" fill="url(#kpkn6ylv3__paint4_linear_6946_492)"/>
+  <path d="M29.5078 37.9375L31.5 39.1562C33.4219 35.9922 36.7969 34.0937 40.5 34.0937C44.2031 34.0937 47.5781 35.9922 49.5 39.1562L51.4922 37.9375C49.1484 34.0703 45.0234 31.75 40.5 31.75C35.9766 31.75 31.8516 34.0703 29.5078 37.9375Z" fill="url(#kpkn6ylv3__paint5_linear_6946_492)"/>
+  <path d="M37.5001 42.8125L39.4923 44.0547C39.7032 43.7031 40.1017 43.5156 40.5001 43.5156C40.8986 43.5156 41.297 43.7031 41.5079 44.0547L43.5001 42.8125C42.8439 41.7578 41.672 41.2188 40.5001 41.2188C39.3282 41.2188 38.1564 41.7578 37.5001 42.8125Z" fill="url(#kpkn6ylv3__paint6_linear_6946_492)"/>
+  <path d="M40.5 52.9688C42.4453 52.9688 44.0156 54.5391 44.0156 56.4844C44.0156 58.4297 42.4453 60 40.5 60C38.5547 60 36.9844 58.4297 36.9844 56.4844C36.9844 54.5391 38.5547 52.9688 40.5 52.9688Z" fill="url(#kpkn6ylv3__paint7_linear_6946_492)"/>
+  <path d="M54.5625 60C56.5 60 58.0781 58.4219 58.0781 56.4844C58.0781 54.5469 56.5 52.9688 54.5625 52.9688C52.625 52.9688 51.0469 54.5469 51.0469 56.4844C51.0469 58.4219 52.625 60 54.5625 60Z" fill="url(#kpkn6ylv3__paint8_linear_6946_492)"/>
+  <path d="M26.4375 60C28.375 60 29.9531 58.4219 29.9531 56.4844C29.9531 54.5469 28.375 52.9688 26.4375 52.9688C24.5 52.9688 22.9219 54.5469 22.9219 56.4844C22.9219 58.4219 24.5 60 26.4375 60Z" fill="url(#kpkn6ylv3__paint9_linear_6946_492)"/>
+  <defs>
+    <linearGradient id="kpkn6ylv3__paint0_linear_6946_492" x1="49.2891" y1="47.0312" x2="49.2891" y2="57.6562" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint1_linear_6946_492" x1="31.7109" y1="47.0312" x2="31.7109" y2="57.6562" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint2_linear_6946_492" x1="40.5" y1="57.1503" x2="40.5" y2="38.7465" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#273A9B"/>
+      <stop offset="1" stop-color="#88CDFF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint3_linear_6946_492" x1="40.5" y1="20" x2="40.5" y2="48.2031" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint4_linear_6946_492" x1="36.7659" y1="38.115" x2="36.7659" y2="41.5937" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint5_linear_6946_492" x1="34.6429" y1="34.1595" x2="34.6429" y2="39.1562" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint6_linear_6946_492" x1="38.9016" y1="42.1414" x2="38.9016" y2="44.0547" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint7_linear_6946_492" x1="38.6267" y1="55.2563" x2="38.6267" y2="60" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint8_linear_6946_492" x1="54.5625" y1="64.2562" x2="54.5625" y2="51.0094" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#F3C57A"/>
+      <stop offset=".49" stop-color="#F39369"/>
+      <stop offset="1" stop-color="#E94867"/>
+    </linearGradient>
+    <linearGradient id="kpkn6ylv3__paint9_linear_6946_492" x1="26.4375" y1="64.2562" x2="26.4375" y2="51.0094" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#F3C57A"/>
+      <stop offset=".49" stop-color="#F39369"/>
+      <stop offset="1" stop-color="#E94867"/>
+    </linearGradient>
+  </defs>
+</svg>

binární
src/assets/imgs/product.png


+ 66 - 0
src/assets/imgs/product.svg

@@ -0,0 +1,66 @@
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81 80" class="design-iconfont">
+  <path d="M56.328 56.0937L55.4999 60H50.4999L49.6718 56.0937L52.9999 54.6016L56.328 56.0937Z" fill="url(#kiuy5gxed__paint0_linear_6946_358)"/>
+  <path d="M31.328 56.0937L30.4999 60H25.4999L24.6717 56.0937L27.9999 54.6016L31.328 56.0937Z" fill="url(#kiuy5gxed__paint1_linear_6946_358)"/>
+  <path d="M58 41.0937L57.5 20H53.4922L53 41.0937L55.5 42.2031L58 41.0937Z" fill="url(#kiuy5gxed__paint2_linear_6946_358)"/>
+  <path d="M28 41.0937L27.5 20H23.4922L22.9922 41.0937L25.4922 42.2031L28 41.0937Z" fill="url(#kiuy5gxed__paint3_linear_6946_358)"/>
+  <path d="M20.5 41.0938V56.0937H60.5V41.0938H55.5L40.5 43.5937L25.5 41.0938H20.5Z" fill="url(#kiuy5gxed__paint4_linear_6946_358)"/>
+  <path d="M25.5 41.0938L26.3281 46.0937H54.6719L55.5 41.0938H25.5Z" fill="url(#kiuy5gxed__paint5_linear_6946_358)"/>
+  <path d="M55.7969 49.8047H53.4531V52.1484H55.7969V49.8047Z" fill="url(#kiuy5gxed__paint6_linear_6946_358)"/>
+  <path d="M51.0859 49.8047H48.7422V52.1484H51.0859V49.8047Z" fill="#fff"/>
+  <path d="M46.375 49.8047H44.0312V52.1484H46.375V49.8047Z" fill="url(#kiuy5gxed__paint7_linear_6946_358)"/>
+  <path d="M32.2578 49.8047H25.2109V52.1484H32.2578V49.8047Z" fill="url(#kiuy5gxed__paint8_linear_6946_358)"/>
+  <path d="M38.0079 36.0942L39.6642 37.7505C39.8986 37.5239 40.1954 37.4067 40.5001 37.4067C40.8048 37.4067 41.1095 37.5239 41.3361 37.7505L42.9923 36.0942C42.3048 35.4067 41.3986 35.063 40.5001 35.063C39.6017 35.063 38.6954 35.4067 38.0079 36.0942Z" fill="url(#kiuy5gxed__paint9_linear_6946_358)"/>
+  <path d="M34.6797 32.7656L36.3359 34.4219C37.4453 33.3125 38.9297 32.6953 40.5 32.6953C42.0703 32.6953 43.5547 33.3047 44.6641 34.4219L46.3203 32.7656C44.7656 31.2109 42.6953 30.3516 40.5 30.3516C38.3047 30.3516 36.2344 31.2109 34.6797 32.7656Z" fill="url(#kiuy5gxed__paint10_linear_6946_358)"/>
+  <path d="M31.3514 29.438L33.0077 31.0942C35.0077 29.0942 37.6718 27.9927 40.4999 27.9927C43.328 27.9927 45.9921 29.0942 47.9921 31.0942L49.6483 29.438C47.203 26.9927 43.953 25.6489 40.4999 25.6489C37.0468 25.6489 33.7968 26.9927 31.3514 29.438Z" fill="url(#kiuy5gxed__paint11_linear_6946_358)"/>
+  <defs>
+    <linearGradient id="kiuy5gxed__paint0_linear_6946_358" x1="51.2265" y1="56.3579" x2="51.2265" y2="60" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint1_linear_6946_358" x1="26.2265" y1="56.3579" x2="26.2265" y2="60" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint2_linear_6946_358" x1="55.5" y1="20" x2="55.5" y2="42.2031" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint3_linear_6946_358" x1="25.4961" y1="20" x2="25.4961" y2="42.2031" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint4_linear_6946_358" x1="40.5" y1="41.0938" x2="40.5" y2="56.0937" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint5_linear_6946_358" x1="32.5073" y1="42.7204" x2="32.5073" y2="46.0937" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint6_linear_6946_358" x1="54.625" y1="53.5672" x2="54.625" y2="49.1516" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#F3C57A"/>
+      <stop offset=".49" stop-color="#F39369"/>
+      <stop offset="1" stop-color="#E94867"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint7_linear_6946_358" x1="45.2031" y1="53.1406" x2="45.2031" y2="47.0734" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#273A9B"/>
+      <stop offset="1" stop-color="#88CDFF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint8_linear_6946_358" x1="28.7344" y1="53.1406" x2="28.7344" y2="47.0734" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#273A9B"/>
+      <stop offset="1" stop-color="#88CDFF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint9_linear_6946_358" x1="39.1722" y1="35.9373" x2="39.1722" y2="37.7505" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint10_linear_6946_358" x1="37.3987" y1="31.6758" x2="37.3987" y2="34.4219" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="kiuy5gxed__paint11_linear_6946_358" x1="35.6252" y1="27.4205" x2="35.6252" y2="31.0942" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+  </defs>
+</svg>

binární
src/assets/imgs/qrcode.png


binární
src/assets/imgs/video.png


+ 45 - 0
src/assets/imgs/video.svg

@@ -0,0 +1,45 @@
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81 80" class="design-iconfont">
+  <path d="M45.5324 52.8665H58.4946V46.7275H45.5324V52.8665Z" fill="url(#itvt2lb2h__paint0_linear_6946_3241)"/>
+  <path d="M59.6665 39.5947H57.3228V60.0003H59.6665V39.5947Z" fill="url(#itvt2lb2h__paint1_linear_6946_3241)"/>
+  <path d="M23.9452 32.4814L29.2003 35.2454L26.0313 40.2667L20.6858 39.5655L19.6665 35.7614L23.9452 32.4814Z" fill="url(#itvt2lb2h__paint2_linear_6946_3241)"/>
+  <path d="M44.8031 45.9931L43.4914 41.0977L41.7935 41.5527L41.794 41.554L41.2222 41.7073L42.5348 46.6031L43.6669 46.2996L43.6553 46.2563L43.6711 46.2964L44.8031 45.9931Z" fill="url(#itvt2lb2h__paint3_linear_6946_3241)"/>
+  <path d="M42.6343 42.429L47.3103 41.1761L45.3749 33.9531L36.0171 36.4612L37.9538 43.6847L42.6301 42.4309L42.624 42.4079L42.6343 42.429Z" fill="url(#itvt2lb2h__paint4_linear_6946_3241)"/>
+  <path d="M53.4557 34.8325L50.4121 23.4736L38.4107 26.6894L38.41 26.6867L23.4588 30.6953L26.5045 42.055L41.4557 38.0464L41.4535 38.0382L41.46 38.0467L53.4557 34.8325Z" fill="url(#itvt2lb2h__paint5_linear_6946_3241)"/>
+  <path d="M55.043 28.9391L52.6477 20L25.4228 27.2949L30.0171 32.313L40.377 29.5371L42.7652 32.229L55.043 28.9391Z" fill="url(#itvt2lb2h__paint6_linear_6946_3241)"/>
+  <path d="M45.6256 53.5943C43.4942 54.1654 41.2956 52.896 40.7244 50.7646C40.1533 48.6331 41.4228 46.4345 43.5542 45.8634C45.6856 45.2923 47.8843 46.5617 48.4554 48.6932C49.0265 50.8246 47.757 53.0232 45.6256 53.5943Z" fill="url(#itvt2lb2h__paint7_linear_6946_3241)"/>
+  <defs>
+    <linearGradient id="itvt2lb2h__paint0_linear_6946_3241" x1="52.0135" y1="46.7275" x2="52.0135" y2="52.8665" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="itvt2lb2h__paint1_linear_6946_3241" x1="58.4946" y1="39.5947" x2="58.4946" y2="60.0003" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="itvt2lb2h__paint2_linear_6946_3241" x1="24.4334" y1="44.9793" x2="24.4334" y2="30.312" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#F3C57A"/>
+      <stop offset=".49" stop-color="#F39369"/>
+      <stop offset="1" stop-color="#E94867"/>
+    </linearGradient>
+    <linearGradient id="itvt2lb2h__paint3_linear_6946_3241" x1="43.0126" y1="48.9337" x2="43.0126" y2="34.682" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#273A9B"/>
+      <stop offset="1" stop-color="#88CDFF"/>
+    </linearGradient>
+    <linearGradient id="itvt2lb2h__paint4_linear_6946_3241" x1="41.6637" y1="33.9531" x2="41.6637" y2="43.6847" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="itvt2lb2h__paint5_linear_6946_3241" x1="39.9328" y1="32.3665" x2="24.9817" y2="36.3752" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#7AB2FF"/>
+      <stop offset="1" stop-color="#E6F2FF"/>
+    </linearGradient>
+    <linearGradient id="itvt2lb2h__paint6_linear_6946_3241" x1="32.3414" y1="24.0059" x2="32.3414" y2="32.313" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+    <linearGradient id="itvt2lb2h__paint7_linear_6946_3241" x1="44.5899" y1="45.7266" x2="44.5899" y2="53.7311" gradientUnits="userSpaceOnUse">
+      <stop stop-color="#004DF3"/>
+      <stop offset="1" stop-color="#5294FF"/>
+    </linearGradient>
+  </defs>
+</svg>

binární
src/assets/imgs/wifi-die.png


binární
src/assets/imgs/wifi-live.png


binární
src/assets/imgs/zlm-logo.png


+ 1 - 0
src/assets/svgs/device.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1640528598588" class="icon" viewBox="0 0 1280 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16798" xmlns:xlink="http://www.w3.org/1999/xlink" width="160" height="128"><defs><style type="text/css"></style></defs><path d="M153.64583333 62h984.375C1176.87083362 62 1208.33333333 93.5 1208.33333333 132.3125v205.49999971c0 38.85000029-31.5 70.35000029-70.3125 70.35000029H153.64583333A70.3125 70.3125 0 0 1 83.33333333 337.85V132.3125C83.33333333 93.46249971 114.83333333 62 153.64583333 62z m104.92499971 138.44999971a34.61249971 34.61249971 0 0 0 0 69.22500029h212.02500058a34.61249971 34.61249971 0 0 0 0-69.22500029H258.57083304zM153.64583333 615.87500029h984.375c38.85000029 0 70.3125 31.5 70.3125 70.3125v205.5375C1208.33333333 930.53750029 1176.83333333 962 1138.02083333 962H153.64583333A70.3125 70.3125 0 0 1 83.33333333 891.6875v-205.49999971c0-38.85000029 31.5-70.35000029 70.3125-70.35000029z m104.92499971 138.4875a34.61249971 34.61249971 0 1 0 0 69.22499942h212.02500058a34.61249971 34.61249971 0 1 0 0-69.22499942H258.57083304z" p-id="16799"></path></svg>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
src/assets/svgs/share.svg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/assets/svgs/wifi_0.svg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/assets/svgs/wifi_1.svg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/assets/svgs/wifi_2.svg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/assets/svgs/wifi_3.svg


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/assets/svgs/wifi_4.svg


+ 3 - 0
src/components/AnimatedCountTo/index.ts

@@ -0,0 +1,3 @@
+import AnimatedCountTo from './index.vue'
+
+export { AnimatedCountTo }

+ 36 - 0
src/components/AnimatedCountTo/index.vue

@@ -0,0 +1,36 @@
+<script setup lang="ts">
+import type { Format, Value } from '@number-flow/vue'
+import type { HTMLAttributes } from 'vue'
+import NumberFlow from '@number-flow/vue'
+
+defineOptions({
+  name: 'FaAnimatedCountTo'
+})
+
+const props = defineProps<{
+  value: Value
+  format?: Format
+  locales?: string
+  prefix?: string
+  suffix?: string
+  trend?: 1 | 0 | -1
+  transformTiming?: EffectTiming
+  spinTiming?: EffectTiming
+  opacityTiming?: EffectTiming
+  willChange?: boolean
+  class?: HTMLAttributes['class']
+}>()
+
+const emit = defineEmits<{
+  animationsstart: []
+  animationsfinish: []
+}>()
+</script>
+
+<template>
+  <NumberFlow
+    v-bind="props"
+    @animationsstart="emit('animationsstart')"
+    @animationsfinish="emit('animationsfinish')"
+  />
+</template>

+ 57 - 35
src/components/SvgIcon/index.vue

@@ -1,47 +1,69 @@
 <template>
-  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
-  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
+  <div 
+    v-if="isExternalIcon" 
+    :style="styleExternalIcon" 
+    class="svg-external-icon svg-icon"
+    v-bind="$attrs"
+  ></div>
+  <svg 
+    v-else 
+    :class="svgClass" 
+    aria-hidden="true"
+    v-bind="$attrs"
+  >
     <use :xlink:href="iconName" />
   </svg>
 </template>
 
-<script>
-import { isExternal } from '@/utils/validate'
+<script setup>
+import { computed } from 'vue'
 
-export default {
+
+// 启用 inheritAttrs 选项
+defineOptions({
   name: 'SvgIcon',
-  props: {
-    iconClass: {
-      type: String,
-      required: true
-    },
-    className: {
-      type: String,
-      default: ''
-    }
+  inheritAttrs: false
+})
+
+// 定义 props
+const props = defineProps({
+  iconClass: {
+    type: String,
+    required: true
   },
-  computed: {
-    isExternal() {
-      return isExternal(this.iconClass)
-    },
-    iconName() {
-      return `#icon-${this.iconClass}`
-    },
-    svgClass() {
-      if (this.className) {
-        return 'svg-icon ' + this.className
-      } else {
-        return 'svg-icon'
-      }
-    },
-    styleExternalIcon() {
-      return {
-        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
-        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
-      }
-    }
+  className: {
+    type: String,
+    default: ''
   }
+})
+
+ function isExternal(path) {
+    return /^(https?:|mailto:|tel:)/.test(path)
 }
+
+// 计算属性
+const isExternalIcon = computed(() => {
+  return isExternal(props.iconClass)
+})
+
+const iconName = computed(() => {
+  return `#icon-${props.iconClass}`
+})
+
+const svgClass = computed(() => {
+  if (props.className) {
+    return 'svg-icon ' + props.className
+  } else {
+    return 'svg-icon'
+  }
+})
+
+const styleExternalIcon = computed(() => {
+  return {
+    mask: `url(${props.iconClass}) no-repeat 50% 50%`,
+    '-webkit-mask': `url(${props.iconClass}) no-repeat 50% 50%`
+  }
+})
 </script>
 
 <style scoped>
@@ -58,4 +80,4 @@ export default {
   mask-size: cover!important;
   display: inline-block;
 }
-</style>
+</style>

+ 291 - 0
src/components/ZmTable/ZmTableColumn.vue

@@ -0,0 +1,291 @@
+<script lang="ts" setup generic="T">
+import type { TableColumnCtx } from 'element-plus'
+import { computed, useAttrs, inject, ref } from 'vue'
+import { Filter } from '@element-plus/icons-vue'
+import { SortOrder, TableContextKey } from './token'
+
+interface Props extends /* @vue-ignore */ Partial<Omit<TableColumnCtx<T>, 'prop'>> {
+  prop?: (keyof T & string) | (string & {})
+  zmSortable?: boolean
+  zmFilterable?: boolean
+  filterModelValue?: any
+  realValue?: (value: any) => any
+}
+
+const emits = defineEmits(['update:filterModelValue'])
+const props = defineProps<Props>()
+const attrs = useAttrs()
+
+const tableContext = inject(TableContextKey, {
+  data: ref([]),
+  sortingFields: ref([]),
+  onQuery: () => {},
+  onSort: () => {},
+  loading: ref(false)
+})
+
+const defaultOptions = ref<Partial<Props>>({
+  align: 'center',
+  resizable: true,
+  showOverflowTooltip: true
+})
+
+const bindProps = computed(() => {
+  const resolvedAlign =
+    props.zmSortable || props.zmFilterable
+      ? 'left'
+      : attrs.align || props.align || defaultOptions.value.align
+
+  return {
+    ...defaultOptions.value,
+    ...attrs,
+    ...props,
+    prop: props.prop,
+    align: resolvedAlign,
+    className: (props.className ?? '') + ' ' + props.prop
+  }
+})
+
+const alignMap: Record<string, string> = {
+  center: 'justify-center',
+  left: 'justify-between',
+  right: 'justify-end'
+}
+const headerFlexClass = computed(
+  () => alignMap[bindProps.value.align as string] || 'justify-center'
+)
+
+const currentSortField = computed(() => {
+  if (!props.prop) return undefined
+  return tableContext.sortingFields.value.find((f: any) => f.field === props.prop)
+})
+
+const isSortActive = computed(() => !!currentSortField.value)
+
+const currentOrder = computed<SortOrder | undefined>(() => currentSortField.value?.order)
+
+const handleSortClick = () => {
+  if (!props.prop) return
+
+  let nextOrder: SortOrder | null = 'asc'
+
+  if (currentOrder.value === 'asc') {
+    nextOrder = 'desc'
+  } else if (currentOrder.value === 'desc') {
+    nextOrder = null
+  }
+
+  tableContext.onSort(props.prop, nextOrder)
+}
+
+const handleSearchClick = () => {
+  if (tableContext.onQuery && props.prop) {
+    tableContext.onQuery({
+      prop: props.prop,
+      value: props.filterModelValue
+    })
+  }
+}
+
+const getTextWidth = (text: string, fontSize = 14) => {
+  const span = document.createElement('span')
+  span.style.visibility = 'hidden'
+  span.style.position = 'absolute'
+  span.style.whiteSpace = 'nowrap'
+  span.style.fontSize = `${fontSize}px`
+  span.style.fontFamily = 'PingFang SC'
+  span.innerText = text
+
+  document.body.appendChild(span)
+  const width = span.offsetWidth
+  document.body.removeChild(span)
+
+  return width
+}
+
+const calculativeWidth = () => {
+  const values = tableContext.data.value
+    .map((item) => props.realValue?.(item[props.prop]) || item[props.prop])
+    .filter(Boolean)
+
+  let labelWidth = getTextWidth(bindProps.value.label || '') + 38
+
+  if (props.zmFilterable || props.zmSortable) {
+    labelWidth += 8
+  }
+
+  if (props.zmFilterable) labelWidth += 22
+  if (props.zmSortable) labelWidth += 22
+
+  const maxWidth = Math.max(...values.map((value) => getTextWidth(value) + 38), labelWidth)
+
+  defaultOptions.value.minWidth = maxWidth
+}
+
+watch(
+  () => tableContext.loading.value,
+  (loading) => {
+    if (!loading) {
+      nextTick(() => {
+        calculativeWidth()
+      })
+    }
+  },
+  { immediate: true }
+)
+</script>
+
+<template>
+  <el-table-column ref="columnRef" v-bind="bindProps">
+    <template v-for="(_, name) in $slots" :key="name" #[name]="slotData">
+      <slot v-if="name !== 'header'" :name="name" v-bind="slotData || {}"></slot>
+    </template>
+
+    <template #header="scope">
+      <slot name="header" v-bind="scope">
+        <div class="header-wrapper" :class="headerFlexClass">
+          <span class="truncate" :title="scope.column.label">{{ scope.column.label }}</span>
+          <div v-if="bindProps.zmSortable || bindProps.zmFilterable" class="action-area">
+            <el-tooltip
+              v-if="bindProps.zmSortable"
+              :content="
+                currentOrder === 'asc'
+                  ? '点击降序'
+                  : currentOrder === 'desc'
+                    ? '取消排序'
+                    : '点击升序'
+              "
+              placement="top"
+              :show-after="500"
+            >
+              <div
+                class="icon-btn"
+                :class="{ 'is-active': isSortActive }"
+                @click.stop="handleSortClick"
+              >
+                <i
+                  class="zm-sort-icon"
+                  :class="{
+                    'is-desc': currentOrder === 'desc'
+                  }"
+                ></i>
+              </div>
+            </el-tooltip>
+
+            <el-popover
+              v-if="bindProps.zmFilterable"
+              placement="top-end"
+              :popper-options="{ modifiers: [{ name: 'offset', options: { offset: [16, 18] } }] }"
+              trigger="click"
+              :width="260"
+              :show-arrow="false"
+            >
+              <template #reference>
+                <div
+                  class="icon-btn"
+                  :class="{ 'is-active': bindProps.filterModelValue }"
+                  @click.stop
+                >
+                  <el-icon :size="16"><Filter /></el-icon>
+                </div>
+              </template>
+
+              <slot name="filter" v-bind="scope">
+                <div class="flex gap-2 p-1">
+                  <el-input
+                    :model-value="bindProps.filterModelValue"
+                    @input="(val) => emits('update:filterModelValue', val)"
+                    placeholder="输入关键词"
+                    size="small"
+                    clearable
+                    @keydown.enter="handleSearchClick"
+                  />
+                  <el-button type="primary" size="small" @click="handleSearchClick">
+                    搜索
+                  </el-button>
+                </div>
+              </slot>
+            </el-popover>
+          </div>
+        </div>
+      </slot>
+    </template>
+  </el-table-column>
+</template>
+
+<style scoped lang="scss">
+.header-wrapper {
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  user-select: none;
+}
+
+.action-area {
+  display: flex;
+  height: 100%;
+  margin-left: 8px;
+  align-items: center;
+  gap: 4px;
+}
+
+.icon-btn {
+  display: flex;
+  width: 20px;
+  height: 20px;
+  color: var(--el-text-color-secondary);
+  cursor: pointer;
+  border-radius: 4px;
+  transition: background-color 0.2s;
+  align-items: center;
+  justify-content: center;
+
+  &:hover {
+    color: var(--el-color-primary);
+    background-color: var(--el-fill-color-darker);
+  }
+
+  &.is-active {
+    color: var(--el-color-primary);
+  }
+}
+
+.zm-sort-icon {
+  position: relative;
+  display: flex;
+  width: 12px;
+  height: 12px;
+  align-items: center;
+  justify-content: center;
+
+  &::before,
+  &::after {
+    position: absolute;
+    width: 8px;
+    height: 2px;
+    background-color: currentcolor;
+    border-radius: 2px;
+    content: '';
+    transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
+  }
+
+  &::before {
+    transform: translateX(-2.2px) rotate(45deg);
+  }
+
+  &::after {
+    transform: translateX(2.2px) rotate(-45deg);
+  }
+
+  &.is-desc {
+    &::before {
+      transform: translateX(-2.2px) rotate(-45deg);
+    }
+
+    &::after {
+      transform: translateX(2.2px) rotate(45deg);
+    }
+  }
+}
+</style>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů