From bcb34ab8c86a13939d1029ef242d3f001b4a2731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E7=A3=8A?= <45566618@qq.com> Date: Fri, 14 Mar 2025 17:32:08 +0800 Subject: [PATCH] =?UTF-8?q?tplink=E6=91=84=E5=83=8F=E5=A4=B4=E7=89=A9?= =?UTF-8?q?=E8=81=94=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 1 + pnpm-lock.yaml | 16092 +++++++--------- public/static/tums-player/audio.wasm | Bin 0 -> 9367 bytes public/static/tums-player/decoder.worker.js | 129 + public/static/tums-player/libaudio.js | 1 + public/static/tums-player/libaudio.wasm | Bin 0 -> 318306 bytes public/static/tums-player/libffmpeg.js | 1 + public/static/tums-player/libffmpeg.wasm | Bin 0 -> 2098631 bytes public/static/tums-player/libs.worker.js | 92 + .../static/tums-player/tums-player.umd.min.js | 35 + .../tums-player/tums-player使用说明.html | 367 + public/static/tums-player/webgl.js | 2 + public/static/tums-player/webgl.worker.js | 42 + src/router/routes/tplink.ts | 23 + src/store/modules/permission.ts | 5 +- src/views/iot/tplink/camera/camera.api.ts | 268 + src/views/iot/tplink/camera/camera.data.ts | 266 + .../camera/components/CameraBitrateForm.vue | 300 + .../camera/components/CameraBlockForm.vue | 305 + .../camera/components/CameraCommonForm.vue | 455 + .../camera/components/CameraInfoDrawer.vue | 124 + .../camera/components/CameraInfoList.vue | 207 + .../camera/components/CameraLeftTree.vue | 205 + .../components/CameraLightAlarmForm.vue | 713 + .../components/CameraMultitransForm.vue | 195 + .../components/CameraMultitransModal.vue | 67 + .../camera/components/CameraOsdForm.vue | 305 + .../camera/components/CameraPictureConfig.vue | 228 + .../camera/components/CameraPlaybackForm.vue | 197 + .../camera/components/CameraPlaybackModal.vue | 67 + .../camera/components/CameraPreviewForm.vue | 318 + .../camera/components/CameraPreviewModal.vue | 67 + .../camera/components/CameraRecordList.vue | 133 + .../components/CameraSoundAlarmForm.vue | 713 + .../camera/components/CameraUploadForm.vue | 210 + .../iot/tplink/camera/icons/plan_set.png | Bin 0 -> 2880 bytes src/views/iot/tplink/camera/index.vue | 47 + .../iot/tplink/project/ProjectInfo.api.ts | 18 + .../iot/tplink/project/ProjectInfo.data.ts | 130 + .../iot/tplink/project/ProjectInfoList.vue | 153 + .../project/components/ProjectInfoDrawer.vue | 77 + src/views/iot/tplink/region/RegionInfo.api.ts | 18 + .../iot/tplink/region/RegionInfo.data.ts | 108 + .../iot/tplink/region/RegionInfoList.vue | 161 + 44 files changed, 13914 insertions(+), 8931 deletions(-) create mode 100644 public/static/tums-player/audio.wasm create mode 100644 public/static/tums-player/decoder.worker.js create mode 100644 public/static/tums-player/libaudio.js create mode 100644 public/static/tums-player/libaudio.wasm create mode 100644 public/static/tums-player/libffmpeg.js create mode 100644 public/static/tums-player/libffmpeg.wasm create mode 100644 public/static/tums-player/libs.worker.js create mode 100644 public/static/tums-player/tums-player.umd.min.js create mode 100644 public/static/tums-player/tums-player使用说明.html create mode 100644 public/static/tums-player/webgl.js create mode 100644 public/static/tums-player/webgl.worker.js create mode 100644 src/router/routes/tplink.ts create mode 100644 src/views/iot/tplink/camera/camera.api.ts create mode 100644 src/views/iot/tplink/camera/camera.data.ts create mode 100644 src/views/iot/tplink/camera/components/CameraBitrateForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraBlockForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraCommonForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraInfoDrawer.vue create mode 100644 src/views/iot/tplink/camera/components/CameraInfoList.vue create mode 100644 src/views/iot/tplink/camera/components/CameraLeftTree.vue create mode 100644 src/views/iot/tplink/camera/components/CameraLightAlarmForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraMultitransForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraMultitransModal.vue create mode 100644 src/views/iot/tplink/camera/components/CameraOsdForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraPictureConfig.vue create mode 100644 src/views/iot/tplink/camera/components/CameraPlaybackForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraPlaybackModal.vue create mode 100644 src/views/iot/tplink/camera/components/CameraPreviewForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraPreviewModal.vue create mode 100644 src/views/iot/tplink/camera/components/CameraRecordList.vue create mode 100644 src/views/iot/tplink/camera/components/CameraSoundAlarmForm.vue create mode 100644 src/views/iot/tplink/camera/components/CameraUploadForm.vue create mode 100644 src/views/iot/tplink/camera/icons/plan_set.png create mode 100644 src/views/iot/tplink/camera/index.vue create mode 100644 src/views/iot/tplink/project/ProjectInfo.api.ts create mode 100644 src/views/iot/tplink/project/ProjectInfo.data.ts create mode 100644 src/views/iot/tplink/project/ProjectInfoList.vue create mode 100644 src/views/iot/tplink/project/components/ProjectInfoDrawer.vue create mode 100644 src/views/iot/tplink/region/RegionInfo.api.ts create mode 100644 src/views/iot/tplink/region/RegionInfo.data.ts create mode 100644 src/views/iot/tplink/region/RegionInfoList.vue diff --git a/index.html b/index.html index 245a4a9..76edf62 100644 --- a/index.html +++ b/index.html @@ -166,6 +166,7 @@ + + + diff --git a/src/views/iot/tplink/camera/components/CameraBlockForm.vue b/src/views/iot/tplink/camera/components/CameraBlockForm.vue new file mode 100644 index 0000000..b548c2f --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraBlockForm.vue @@ -0,0 +1,305 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraCommonForm.vue b/src/views/iot/tplink/camera/components/CameraCommonForm.vue new file mode 100644 index 0000000..a5cf3fe --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraCommonForm.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraInfoDrawer.vue b/src/views/iot/tplink/camera/components/CameraInfoDrawer.vue new file mode 100644 index 0000000..9172307 --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraInfoDrawer.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraInfoList.vue b/src/views/iot/tplink/camera/components/CameraInfoList.vue new file mode 100644 index 0000000..2a1fa65 --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraInfoList.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraLeftTree.vue b/src/views/iot/tplink/camera/components/CameraLeftTree.vue new file mode 100644 index 0000000..8e2f93f --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraLeftTree.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraLightAlarmForm.vue b/src/views/iot/tplink/camera/components/CameraLightAlarmForm.vue new file mode 100644 index 0000000..a1e0316 --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraLightAlarmForm.vue @@ -0,0 +1,713 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraMultitransForm.vue b/src/views/iot/tplink/camera/components/CameraMultitransForm.vue new file mode 100644 index 0000000..2e8d5d7 --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraMultitransForm.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraMultitransModal.vue b/src/views/iot/tplink/camera/components/CameraMultitransModal.vue new file mode 100644 index 0000000..66db654 --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraMultitransModal.vue @@ -0,0 +1,67 @@ + + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraOsdForm.vue b/src/views/iot/tplink/camera/components/CameraOsdForm.vue new file mode 100644 index 0000000..d923bde --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraOsdForm.vue @@ -0,0 +1,305 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraPictureConfig.vue b/src/views/iot/tplink/camera/components/CameraPictureConfig.vue new file mode 100644 index 0000000..61bdc7d --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraPictureConfig.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraPlaybackForm.vue b/src/views/iot/tplink/camera/components/CameraPlaybackForm.vue new file mode 100644 index 0000000..31f8d4d --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraPlaybackForm.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraPlaybackModal.vue b/src/views/iot/tplink/camera/components/CameraPlaybackModal.vue new file mode 100644 index 0000000..6d6d0fc --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraPlaybackModal.vue @@ -0,0 +1,67 @@ + + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraPreviewForm.vue b/src/views/iot/tplink/camera/components/CameraPreviewForm.vue new file mode 100644 index 0000000..7b88c39 --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraPreviewForm.vue @@ -0,0 +1,318 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraPreviewModal.vue b/src/views/iot/tplink/camera/components/CameraPreviewModal.vue new file mode 100644 index 0000000..8491d96 --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraPreviewModal.vue @@ -0,0 +1,67 @@ + + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraRecordList.vue b/src/views/iot/tplink/camera/components/CameraRecordList.vue new file mode 100644 index 0000000..d8bfa2b --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraRecordList.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraSoundAlarmForm.vue b/src/views/iot/tplink/camera/components/CameraSoundAlarmForm.vue new file mode 100644 index 0000000..72e644b --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraSoundAlarmForm.vue @@ -0,0 +1,713 @@ + + + + + diff --git a/src/views/iot/tplink/camera/components/CameraUploadForm.vue b/src/views/iot/tplink/camera/components/CameraUploadForm.vue new file mode 100644 index 0000000..0a0ec9e --- /dev/null +++ b/src/views/iot/tplink/camera/components/CameraUploadForm.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/views/iot/tplink/camera/icons/plan_set.png b/src/views/iot/tplink/camera/icons/plan_set.png new file mode 100644 index 0000000000000000000000000000000000000000..75d1b8101019a5060166218c08cc27fe96e41546 GIT binary patch literal 2880 zcmbtW`9IYA8vo4LCo#s7WiT>zXpkaCDih*6L>b9)P*Wla-=RX5h9gT0(;VSguPmh) zCuH9V6HY~&-B=r4=7u7Q`|Y0B{Ri&-;q!Tx*ZcK6&u4w!i6`x?w_}ts0D$dO$dZQ0 z?w>Q@UK)IxfO59cZGD5V zOY1304GBdg-$fhFj&pIpDi4s0{ePI?@cfA7H-FeD{zy8a@Ii4X&J0J0u8^qovOp8z zBPgc6DKue@2K4JJKuH%OV$%Q#at~P9&jyq`avAi_U4T_H^6>%@#Z=TbY`o6w!u07+;lTftnC6?8o0Aj3;cx=xc+dRnGdCN@ z1tHSX(#>0axuz&)jlrIxW8F+{ttcM`o-~YDpK3JgX{74dnw| zjw@Tub_!742a)5-eDvOpOu=~?A*kK+PmQElvG=73^sq!Xzg84(Yd^ZfjO1YJPo_*d z+cVc@h?ffG#h{T3A_=CN4%-&Ul%U!MAY-@HlWp6IVlQ76hISK77>0JsBUeWwlRV~n zI#!F(#CDyYJ5#G_a}A;xV&Ly+LSnQ|^!c$1ETZ06Vjqe~@3fr+)V4N{4{{XTOoONt zi?~OPvLsr&TZ%PZs!K}HKeL@o*{QRW1m%DOJV4D+u86UmeJo?mhvMjK1q=6JkO&?q zS@R&zI!>gR5BX!A{qvDiPi0M}ZL4aL?KHfbDtna~!7323E{1ac zzQ|2m2a{{=H&CC(K>a;$oK=$gSp{va8mEgS^ae{#;|mGY#HshIN3#lScL&cm4KXfS zvlXr1jSt8FrMf&vD4ck8i+CW(H!H$H@dep&qaVI#!4`@yT23B!G3Yz|B~w>EUV&H( zUvxX%i`G`{8iIm&>79i$8_6c;gGrDs`JFjiHood@`v``nl2mwax+9ODKRUH6WI%#S z$*Jb$ddI8*;-YvYQTH%aFuhy$kI%QC&kr`J|4thavno|%pxPP<&O zF5iJky2*lOhqz4{j8n}qF6|D=xCQcK(R1?F+K^3)gD&L z^Y)NUn}aGA&dMowW2MC9?;%Xoe2;1}V&fR6goN=?Vy1o?+Va-&lonq6`BK?cHbYKY z7*8jsTG0+BJ&0y%N_EkoODzsMShySZYT6UB&Mg`8dt&}OY0*swj!j*Q42NT9oaL}^ zto-VEKR9;ISrXBAtk#H;CznWQaq{FX(^a%}MASSItf|KF1l+ykxLp`uJ{e2OQZvDt2`OHk|1YHWdKpF-&slQcyn*Cd<~J&1;kA^x2$i4KLL&yTQs=IiBGxv3 zBN-_)Wlm6q#Mm(u?m(Cj*L}J1^`|uuzK<}Gp#Ab!bp&~Pp-~(QccjieQ%CBgUiT40 zOHspGG;B|dnUYvdf@b6$dNgI;2+S)o^~vgqzpvTVD>3YCM2Mf<+)-s3Roco+8z?-j zus`MD8^b~7Kr*GHF@poHvi!x0Y;gD{R_Lq*n13N z$To9_^}MFYw~Je2ZTgbAYHDiN*#1w1k%dyX8h-PR6mI3cntvE^q9TCT^r_B=OCpM~ zCrm>3db}T{iWW8oa_8{DRoc>p2Jf~Jl-m2s`O5I|RzM88{%1^d_}uF9jc-b?ed)AzRG8jzPR5S9E)lmrm@3KQpx2Mt#!MCR5j|Z)(sDjp{h~WwZo8; zQ%~5#b@RpKdaJ{^@$|LS$#_R)XVw99-%^GNBLyCa)ycaaP&qqZ5N`F4dROHC?cQk0 z&FRaV^x?RX96ov2Rn9Ino~dQvnRmuay{hT=Uy5nhW!X+>@jm<5+iRhz8q;BKr7h(Gl@PF6sH6-0yBB$wDSs$;ab=Ei5B)1B%rh z|Ct<#8#!k7JmBJ3C+Ab$iGI~yDX+1kg)i^@iz}%0A6EBMqh$|qG0r}@Zn2dz>YjFc zs}xz^rkB>&*O$pj1Jw%|&M9+9S67YW9c$;ksdZ&gmcGERAIu)I*j-iW-)~%bEE=C2 zv1jqimuHV36m34eTiL&I#w_|Rv&8JmSEld?Le8>fbR~ZQ*!Jf>9~Xte&8tTunrgZ!BA~e2FJF!RKWSUG4ynJ?geM2n5K0WF$LuXR I=4WI64YYJ1?f?J) literal 0 HcmV?d00001 diff --git a/src/views/iot/tplink/camera/index.vue b/src/views/iot/tplink/camera/index.vue new file mode 100644 index 0000000..10d0c2f --- /dev/null +++ b/src/views/iot/tplink/camera/index.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/views/iot/tplink/project/ProjectInfo.api.ts b/src/views/iot/tplink/project/ProjectInfo.api.ts new file mode 100644 index 0000000..1061dff --- /dev/null +++ b/src/views/iot/tplink/project/ProjectInfo.api.ts @@ -0,0 +1,18 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + list = '/iot/projectInfo/list', + sync = '/iot/projectInfo/sync', +} + +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 项目信息同步 + * @param params + */ +export const sync = (params) => defHttp.get({ url: Api.sync, params }); diff --git a/src/views/iot/tplink/project/ProjectInfo.data.ts b/src/views/iot/tplink/project/ProjectInfo.data.ts new file mode 100644 index 0000000..9b1b2ea --- /dev/null +++ b/src/views/iot/tplink/project/ProjectInfo.data.ts @@ -0,0 +1,130 @@ +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; + +//列表数据 +export const columns: BasicColumn[] = [ + { + title: '项目序号', + align: "center", + dataIndex: 'projectId' + }, + { + title: '项目名称', + align: "center", + dataIndex: 'projectName' + }, + { + title: '创建时间', + align: "center", + dataIndex: 'createTimeStr' + }, + { + title: '设备数量', + align: "center", + dataIndex: 'deviceNum' + }, + { + title: '离线设备数', + align: "center", + dataIndex: 'offlineNum' + }, + { + title: '异常设备数', + align: "center", + dataIndex: 'abnormalNum' + }, + { + title: '运行天数', + align: "center", + dataIndex: 'runningTimeStr' + }, + { + title: '状态', + align: "center", + dataIndex: 'status', + customRender:({record})=>{ + return record.status?(record.status=='1'?'正常':'冻结'):''; + }, + } +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '名称', + field: 'projectName', + component: 'Input', + //colProps: { span: 6 }, + }, + { + label: '状态', + field: 'status', + component: 'JDictSelectTag', + componentProps: { + placeholder: '请选择状态', + options: [ + { label: '正常', value: '1' }, + { label: '冻结', value: '2' }, + ], + }, + //colProps: { span: 6 }, + } +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '项目序号', + field: 'projectId', + component: 'Input', + }, + { + label: '项目名称', + field: 'projectName', + component: 'Input', + }, + { + label: '创建时间', + field: 'createTimeStr', + component: 'Input', + }, + { + label: '设备数量', + field: 'deviceNum', + component: 'Input', + }, + { + label: '离线设备数', + field: 'offlineNum', + component: 'Input', + }, + { + label: '异常设备数', + field: 'abnormalNum', + component: 'Input', + }, + { + label: '运行天数', + field: 'runningTimeStr', + component: 'Input', + }, + { + label: '状态', + field: 'status', + component: 'JDictSelectTag', + defaultValue: 1, + componentProps: ({}) => { + return { + options: [ + { label: '正常', value: 1, key: '1' }, + { label: '冻结', value: 2, key: '2' }, + ] + }; + }, + }, +]; + diff --git a/src/views/iot/tplink/project/ProjectInfoList.vue b/src/views/iot/tplink/project/ProjectInfoList.vue new file mode 100644 index 0000000..462fdd6 --- /dev/null +++ b/src/views/iot/tplink/project/ProjectInfoList.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/views/iot/tplink/project/components/ProjectInfoDrawer.vue b/src/views/iot/tplink/project/components/ProjectInfoDrawer.vue new file mode 100644 index 0000000..298342f --- /dev/null +++ b/src/views/iot/tplink/project/components/ProjectInfoDrawer.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/views/iot/tplink/region/RegionInfo.api.ts b/src/views/iot/tplink/region/RegionInfo.api.ts new file mode 100644 index 0000000..5978012 --- /dev/null +++ b/src/views/iot/tplink/region/RegionInfo.api.ts @@ -0,0 +1,18 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + list = '/iot/regionInfo/list', + sync = '/iot/regionInfo/sync', +} + +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 项目信息同步 + * @param params + */ +export const sync = (params) => defHttp.get({ url: Api.sync, params }); diff --git a/src/views/iot/tplink/region/RegionInfo.data.ts b/src/views/iot/tplink/region/RegionInfo.data.ts new file mode 100644 index 0000000..57d5be1 --- /dev/null +++ b/src/views/iot/tplink/region/RegionInfo.data.ts @@ -0,0 +1,108 @@ +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; + +//列表数据 +export const columns: BasicColumn[] = [ + { + title: '区域序号', + align: "center", + dataIndex: 'regionId' + }, + { + title: '区域名称', + align: "center", + dataIndex: 'regionName' + }, + { + title: '区域层级', + align: "center", + dataIndex: 'regionLevel' + }, + { + title: '项目名称', + align: "center", + dataIndex: 'projectName' + }, + { + title: '更新时间', + align: "center", + dataIndex: 'updateTime' + }, + { + title: '区域次序', + align: "center", + dataIndex: 'sort' + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '项目', + field: 'projectId', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'nu_iot_tplink_project,project_name,project_id', + placeholder: '请选择项目', + }, + //colProps: { span: 6 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '项目序号', + field: 'projectId', + component: 'Input' + }, + { + label: '项目名称', + field: 'projectName', + component: 'Input', + }, + { + label: '创建时间', + field: 'createTimeStr', + component: 'Input', + }, + { + label: '设备数量', + field: 'deviceNum', + component: 'Input', + }, + { + label: '离线设备数', + field: 'offlineNum', + component: 'Input', + }, + { + label: '异常设备数', + field: 'abnormalNum', + component: 'Input', + }, + { + label: '运行天数', + field: 'runningTimeStr', + component: 'Input', + }, + { + label: '状态', + field: 'status', + component: 'JDictSelectTag', + defaultValue: 1, + componentProps: ({}) => { + return { + options: [ + { label: '正常', value: 1, key: '1' }, + { label: '冻结', value: 2, key: '2' }, + ] + }; + }, + }, +]; + diff --git a/src/views/iot/tplink/region/RegionInfoList.vue b/src/views/iot/tplink/region/RegionInfoList.vue new file mode 100644 index 0000000..5b6cae2 --- /dev/null +++ b/src/views/iot/tplink/region/RegionInfoList.vue @@ -0,0 +1,161 @@ + + + + +