Showing
14 changed files
with
537 additions
and
48 deletions
| ... | ... | @@ -21,9 +21,7 @@ |
| 21 | 21 | theme = htmlRoot = null; |
| 22 | 22 | } |
| 23 | 23 | })(); |
| 24 | - const historyClick = () => { | |
| 25 | - console.log(1); | |
| 26 | - }; | |
| 24 | + | |
| 27 | 25 | </script> |
| 28 | 26 | <div id="app"> |
| 29 | 27 | <style> |
| ... | ... | @@ -163,6 +161,7 @@ |
| 163 | 161 | </div> |
| 164 | 162 | </div> |
| 165 | 163 | </div> |
| 164 | + | |
| 166 | 165 | <script type="module" src="/src/main.ts"></script> |
| 167 | 166 | </body> |
| 168 | 167 | </html> | ... | ... |
| ... | ... | @@ -19,6 +19,8 @@ enum DeviceManagerApi { |
| 19 | 19 | DEVICE_PROFILE_URL_ME = '/deviceProfile/me/list', |
| 20 | 20 | |
| 21 | 21 | DEVICE_ALARM_URL = '/alarm', |
| 22 | + | |
| 23 | + DEVICE_CREDENTIALS = '/device/credentials', | |
| 22 | 24 | } |
| 23 | 25 | |
| 24 | 26 | export const devicePage = (params: DeviceQueryParam) => { |
| ... | ... | @@ -108,3 +110,29 @@ export const clearOrAckAlarm = (id: string, flag: boolean) => { |
| 108 | 110 | } |
| 109 | 111 | ); |
| 110 | 112 | }; |
| 113 | + | |
| 114 | +// 获取设备凭证详情 | |
| 115 | +export const getDeviceToken = (id: string) => { | |
| 116 | + return defHttp.get( | |
| 117 | + { | |
| 118 | + url: `${DeviceManagerApi.DEVICE_URL}/${id}/credentials`, | |
| 119 | + }, | |
| 120 | + { | |
| 121 | + joinPrefix: false, | |
| 122 | + } | |
| 123 | + ); | |
| 124 | +}; | |
| 125 | + | |
| 126 | +// 保存设备凭证详情 | |
| 127 | + | |
| 128 | +export const saveDeviceToken = (data) => { | |
| 129 | + return defHttp.post( | |
| 130 | + { | |
| 131 | + url: DeviceManagerApi.DEVICE_CREDENTIALS, | |
| 132 | + data, | |
| 133 | + }, | |
| 134 | + { | |
| 135 | + joinPrefix: false, | |
| 136 | + } | |
| 137 | + ); | |
| 138 | +}; | ... | ... |
| ... | ... | @@ -35,10 +35,12 @@ export const alarmSearchSchemas: FormSchema[] = [ |
| 35 | 35 | colProps: { span: 6 }, |
| 36 | 36 | }, |
| 37 | 37 | { |
| 38 | - field: 'time', | |
| 38 | + field: 'endTime', | |
| 39 | 39 | label: '告警时间范围', |
| 40 | - component: 'RangePicker', | |
| 41 | - componentProps: {}, | |
| 40 | + component: 'DatePicker', | |
| 41 | + componentProps: { | |
| 42 | + valueFormat: 'x', | |
| 43 | + }, | |
| 42 | 44 | colProps: { span: 6 }, |
| 43 | 45 | }, |
| 44 | 46 | ]; | ... | ... |
| ... | ... | @@ -3,6 +3,15 @@ import type { FormSchema } from '/@/components/Table'; |
| 3 | 3 | import { getOrganizationList } from '/@/api/system/system'; |
| 4 | 4 | import { copyTransFun } from '/@/utils/fnUtils'; |
| 5 | 5 | import { getDeviceProfile } from '/@/api/alarm/position'; |
| 6 | + | |
| 7 | +export enum AggregateDataEnum { | |
| 8 | + MIN = 'MIN', | |
| 9 | + MAX = 'MAX', | |
| 10 | + AVG = 'AVG', | |
| 11 | + SUM = 'SUM', | |
| 12 | + COUNT = 'COUNT', | |
| 13 | + NONE = 'NONE', | |
| 14 | +} | |
| 6 | 15 | export const formSchema: FormSchema[] = [ |
| 7 | 16 | { |
| 8 | 17 | field: 'organizationId', |
| ... | ... | @@ -82,3 +91,114 @@ export const columns: BasicColumn[] = [ |
| 82 | 91 | slots: { customRender: 'deviceState' }, |
| 83 | 92 | }, |
| 84 | 93 | ]; |
| 94 | + | |
| 95 | +export const schemas: FormSchema[] = [ | |
| 96 | + { | |
| 97 | + field: 'name', | |
| 98 | + label: '最后数据', | |
| 99 | + component: 'Select', | |
| 100 | + componentProps: { | |
| 101 | + options: [ | |
| 102 | + { | |
| 103 | + label: '最近1小时', | |
| 104 | + value: '1', | |
| 105 | + }, | |
| 106 | + { | |
| 107 | + label: '最近2小时', | |
| 108 | + value: '2', | |
| 109 | + }, | |
| 110 | + { | |
| 111 | + label: '最近5小时', | |
| 112 | + value: '5', | |
| 113 | + }, | |
| 114 | + { | |
| 115 | + label: '最近12小时', | |
| 116 | + value: '12', | |
| 117 | + }, | |
| 118 | + { | |
| 119 | + label: '最近1天', | |
| 120 | + value: '1天', | |
| 121 | + }, | |
| 122 | + { | |
| 123 | + label: '最近7天', | |
| 124 | + value: '7天', | |
| 125 | + }, | |
| 126 | + { | |
| 127 | + label: '最近30天', | |
| 128 | + value: '30天', | |
| 129 | + }, | |
| 130 | + ], | |
| 131 | + }, | |
| 132 | + colProps: { | |
| 133 | + span: 6, | |
| 134 | + }, | |
| 135 | + }, | |
| 136 | + { | |
| 137 | + field: 'name', | |
| 138 | + label: '分组间隔', | |
| 139 | + component: 'Select', | |
| 140 | + componentProps: { | |
| 141 | + options: [ | |
| 142 | + { | |
| 143 | + label: '15秒', | |
| 144 | + value: '15', | |
| 145 | + }, | |
| 146 | + { | |
| 147 | + label: '30秒', | |
| 148 | + value: '30', | |
| 149 | + }, | |
| 150 | + { | |
| 151 | + label: '1分钟', | |
| 152 | + value: '60', | |
| 153 | + }, | |
| 154 | + { | |
| 155 | + label: '2分钟', | |
| 156 | + value: '120', | |
| 157 | + }, | |
| 158 | + { | |
| 159 | + label: '5分钟', | |
| 160 | + value: '360', | |
| 161 | + }, | |
| 162 | + { | |
| 163 | + label: '10分钟', | |
| 164 | + value: '600', | |
| 165 | + }, | |
| 166 | + { | |
| 167 | + label: '15分钟', | |
| 168 | + value: '900', | |
| 169 | + }, | |
| 170 | + ], | |
| 171 | + }, | |
| 172 | + colProps: { | |
| 173 | + span: 6, | |
| 174 | + }, | |
| 175 | + }, | |
| 176 | + { | |
| 177 | + field: 'name', | |
| 178 | + label: '数据聚合功能', | |
| 179 | + component: 'Select', | |
| 180 | + componentProps: { | |
| 181 | + options: [ | |
| 182 | + { | |
| 183 | + label: '最小值', | |
| 184 | + value: AggregateDataEnum.MIN, | |
| 185 | + }, | |
| 186 | + { | |
| 187 | + label: '最大值', | |
| 188 | + value: AggregateDataEnum.MAX, | |
| 189 | + }, | |
| 190 | + { | |
| 191 | + label: '平均值', | |
| 192 | + value: AggregateDataEnum.AVG, | |
| 193 | + }, | |
| 194 | + { | |
| 195 | + label: '求和', | |
| 196 | + value: AggregateDataEnum.SUM, | |
| 197 | + }, | |
| 198 | + ], | |
| 199 | + }, | |
| 200 | + colProps: { | |
| 201 | + span: 6, | |
| 202 | + }, | |
| 203 | + }, | |
| 204 | +]; | ... | ... |
| ... | ... | @@ -22,9 +22,13 @@ |
| 22 | 22 | : '离线' |
| 23 | 23 | }} |
| 24 | 24 | </Tag> |
| 25 | - </template></BasicTable | |
| 26 | - > | |
| 25 | + </template> | |
| 26 | + </BasicTable> | |
| 27 | 27 | </div> |
| 28 | + <a-button type="primary" @click="handleClick">打开弹窗</a-button> | |
| 29 | + <BasicModal @register="registerModal" title="历史数据" width="70%"> | |
| 30 | + <BasicForm @register="registerForm" /> | |
| 31 | + </BasicModal> | |
| 28 | 32 | </div> |
| 29 | 33 | </template> |
| 30 | 34 | <script lang="ts"> |
| ... | ... | @@ -36,11 +40,16 @@ |
| 36 | 40 | import { Tag } from 'ant-design-vue'; |
| 37 | 41 | import { DeviceState } from '/@/api/device/model/deviceModel'; |
| 38 | 42 | import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; |
| 43 | + import { useModal, BasicModal } from '/@/components/Modal'; | |
| 44 | + import { BasicForm, useForm } from '/@/components/Form'; | |
| 45 | + import { schemas } from './config.data'; | |
| 39 | 46 | export default defineComponent({ |
| 40 | 47 | name: 'BaiduMap', |
| 41 | 48 | components: { |
| 42 | 49 | BasicTable, |
| 43 | 50 | Tag, |
| 51 | + BasicModal, | |
| 52 | + BasicForm, | |
| 44 | 53 | }, |
| 45 | 54 | props: { |
| 46 | 55 | width: { |
| ... | ... | @@ -151,11 +160,23 @@ |
| 151 | 160 | console.log(record); |
| 152 | 161 | }; |
| 153 | 162 | |
| 163 | + const [registerModal, { openModal }] = useModal(); | |
| 164 | + const [registerForm] = useForm({ | |
| 165 | + labelWidth: 120, | |
| 166 | + schemas, | |
| 167 | + }); | |
| 168 | + const handleClick = () => { | |
| 169 | + openModal(true); | |
| 170 | + }; | |
| 171 | + | |
| 154 | 172 | return { |
| 155 | 173 | wrapRef, |
| 156 | 174 | registerTable, |
| 157 | 175 | deviceRowClick, |
| 158 | 176 | DeviceState, |
| 177 | + handleClick, | |
| 178 | + registerModal, | |
| 179 | + registerForm, | |
| 159 | 180 | }; |
| 160 | 181 | }, |
| 161 | 182 | }); | ... | ... |
| ... | ... | @@ -268,8 +268,185 @@ export const step2Schemas: FormSchema[] = [ |
| 268 | 268 | }, |
| 269 | 269 | { |
| 270 | 270 | label: '密码', |
| 271 | + component: 'InputPassword', | |
| 272 | + field: 'password', | |
| 273 | + ifShow: false, | |
| 274 | + }, | |
| 275 | +]; | |
| 276 | + | |
| 277 | +// 管理凭证的表单配置项 | |
| 278 | +export const TokenSchemas: FormSchema[] = [ | |
| 279 | + { | |
| 280 | + label: '凭据类型', | |
| 281 | + component: 'Select', | |
| 282 | + field: 'credentialType', | |
| 283 | + required: true, | |
| 284 | + componentProps({ formActionType }) { | |
| 285 | + const { updateSchema, setFieldsValue } = formActionType; | |
| 286 | + return { | |
| 287 | + options: [ | |
| 288 | + { | |
| 289 | + value: credentialTypeEnum.ACCESS_TOKEN, | |
| 290 | + label: 'Access Token', | |
| 291 | + }, | |
| 292 | + { | |
| 293 | + value: credentialTypeEnum.X_509, | |
| 294 | + label: 'X.509', | |
| 295 | + }, | |
| 296 | + { | |
| 297 | + value: credentialTypeEnum.MQTT_BASIC, | |
| 298 | + label: 'MQTT Basic', | |
| 299 | + }, | |
| 300 | + ], | |
| 301 | + onChange(value) { | |
| 302 | + setFieldsValue({ | |
| 303 | + publicKey: '', | |
| 304 | + credentialsId: '', | |
| 305 | + clientId: '', | |
| 306 | + username: '', | |
| 307 | + password: '', | |
| 308 | + }); | |
| 309 | + if (value === credentialTypeEnum.ACCESS_TOKEN) { | |
| 310 | + updateSchema([ | |
| 311 | + { | |
| 312 | + field: 'credentialsId', | |
| 313 | + ifShow: true, | |
| 314 | + }, | |
| 315 | + { | |
| 316 | + field: 'clientId', | |
| 317 | + ifShow: false, | |
| 318 | + }, | |
| 319 | + { | |
| 320 | + field: 'username', | |
| 321 | + ifShow: false, | |
| 322 | + }, | |
| 323 | + { | |
| 324 | + field: 'password', | |
| 325 | + ifShow: false, | |
| 326 | + }, | |
| 327 | + { | |
| 328 | + field: 'publicKey', | |
| 329 | + ifShow: false, | |
| 330 | + }, | |
| 331 | + ]); | |
| 332 | + } else if (value === credentialTypeEnum.X_509) { | |
| 333 | + updateSchema([ | |
| 334 | + { | |
| 335 | + field: 'publicKey', | |
| 336 | + ifShow: true, | |
| 337 | + }, | |
| 338 | + { | |
| 339 | + field: 'credentialsId', | |
| 340 | + ifShow: false, | |
| 341 | + }, | |
| 342 | + { | |
| 343 | + field: 'clientId', | |
| 344 | + ifShow: false, | |
| 345 | + }, | |
| 346 | + { | |
| 347 | + field: 'username', | |
| 348 | + ifShow: false, | |
| 349 | + }, | |
| 350 | + { | |
| 351 | + field: 'password', | |
| 352 | + ifShow: false, | |
| 353 | + }, | |
| 354 | + ]); | |
| 355 | + } else if (value === credentialTypeEnum.MQTT_BASIC) { | |
| 356 | + updateSchema([ | |
| 357 | + { | |
| 358 | + field: 'clientId', | |
| 359 | + ifShow: true, | |
| 360 | + }, | |
| 361 | + { | |
| 362 | + field: 'username', | |
| 363 | + ifShow: true, | |
| 364 | + }, | |
| 365 | + { | |
| 366 | + field: 'password', | |
| 367 | + ifShow: true, | |
| 368 | + }, | |
| 369 | + { | |
| 370 | + field: 'publicKey', | |
| 371 | + ifShow: false, | |
| 372 | + }, | |
| 373 | + { | |
| 374 | + field: 'credentialsId', | |
| 375 | + ifShow: false, | |
| 376 | + }, | |
| 377 | + ]); | |
| 378 | + } else { | |
| 379 | + updateSchema([ | |
| 380 | + { | |
| 381 | + field: 'clientId', | |
| 382 | + ifShow: false, | |
| 383 | + }, | |
| 384 | + { | |
| 385 | + field: 'username', | |
| 386 | + ifShow: false, | |
| 387 | + }, | |
| 388 | + { | |
| 389 | + field: 'password', | |
| 390 | + ifShow: false, | |
| 391 | + }, | |
| 392 | + { | |
| 393 | + field: 'publicKey', | |
| 394 | + ifShow: false, | |
| 395 | + }, | |
| 396 | + { | |
| 397 | + field: 'credentialsId', | |
| 398 | + ifShow: false, | |
| 399 | + }, | |
| 400 | + ]); | |
| 401 | + } | |
| 402 | + }, | |
| 403 | + }; | |
| 404 | + }, | |
| 405 | + }, | |
| 406 | + { | |
| 407 | + label: '访问令牌', | |
| 408 | + component: 'Input', | |
| 409 | + field: 'credentialsId', | |
| 410 | + required: true, | |
| 411 | + ifShow: false, | |
| 412 | + }, | |
| 413 | + { | |
| 414 | + label: 'RSA公钥', | |
| 271 | 415 | component: 'Input', |
| 416 | + field: 'publicKey', | |
| 417 | + required: true, | |
| 418 | + ifShow: false, | |
| 419 | + }, | |
| 420 | + { | |
| 421 | + label: '客户端ID', | |
| 422 | + component: 'Input', | |
| 423 | + field: 'clientId', | |
| 424 | + required: true, | |
| 425 | + ifShow: false, | |
| 426 | + }, | |
| 427 | + { | |
| 428 | + label: '用户名', | |
| 429 | + component: 'Input', | |
| 430 | + field: 'username', | |
| 431 | + required: true, | |
| 432 | + ifShow: false, | |
| 433 | + }, | |
| 434 | + { | |
| 435 | + label: '密码', | |
| 436 | + component: 'InputPassword', | |
| 272 | 437 | field: 'password', |
| 273 | 438 | ifShow: false, |
| 274 | 439 | }, |
| 440 | + { | |
| 441 | + label: 'id', | |
| 442 | + component: 'Input', | |
| 443 | + field: 'id', | |
| 444 | + show: false, | |
| 445 | + }, | |
| 446 | + { | |
| 447 | + label: 'tbDeviceId', | |
| 448 | + component: 'Input', | |
| 449 | + field: 'tbDeviceId', | |
| 450 | + show: false, | |
| 451 | + }, | |
| 275 | 452 | ]; | ... | ... |
| ... | ... | @@ -97,10 +97,12 @@ export const alarmSearchSchemas: FormSchema[] = [ |
| 97 | 97 | colProps: { span: 6 }, |
| 98 | 98 | }, |
| 99 | 99 | { |
| 100 | - field: 'time', | |
| 100 | + field: 'endTime', | |
| 101 | 101 | label: '告警时间范围', |
| 102 | - component: 'RangePicker', | |
| 103 | - componentProps: {}, | |
| 102 | + component: 'DatePicker', | |
| 103 | + componentProps: { | |
| 104 | + valueFormat: 'x', | |
| 105 | + }, | |
| 104 | 106 | colProps: { span: 6 }, |
| 105 | 107 | }, |
| 106 | 108 | ]; | ... | ... |
| ... | ... | @@ -49,11 +49,12 @@ |
| 49 | 49 | const activeKey = ref('1'); |
| 50 | 50 | const size = ref('small'); |
| 51 | 51 | const deviceDetailRef = ref(); |
| 52 | - const deviceDetail: any = ref({}); | |
| 53 | - | |
| 52 | + const deviceDetail = ref<any>({}); | |
| 53 | + const tbDeviceId = ref(''); | |
| 54 | 54 | // 详情回显 |
| 55 | 55 | const [register] = useDrawerInner(async (data) => { |
| 56 | 56 | const { id } = data; |
| 57 | + // 设备详情 | |
| 57 | 58 | const res = await getDeviceDetail(id); |
| 58 | 59 | deviceDetail.value = res; |
| 59 | 60 | const { latitude, longitude, address } = res.deviceInfo; |
| ... | ... | @@ -72,6 +73,7 @@ |
| 72 | 73 | closeDrawer, |
| 73 | 74 | deviceDetail, |
| 74 | 75 | deviceDetailRef, |
| 76 | + tbDeviceId, | |
| 75 | 77 | }; |
| 76 | 78 | }, |
| 77 | 79 | }); | ... | ... |
| 1 | 1 | <template> |
| 2 | - <BasicModal @register="registerModal" v-bind="$attrs" title="管理设备凭证"> | |
| 3 | - <BasicForm @register="registerForm" @cancel="handleCancel" @ok="handleOk"> | |
| 4 | - <template #addAgree="{ model, field }"> | |
| 5 | - <Checkbox v-model:checked="model[field]" @change="checkedChange" /> | |
| 6 | - <span class="ml-2">添加协议</span> | |
| 7 | - </template> | |
| 8 | - </BasicForm> | |
| 2 | + <BasicModal | |
| 3 | + @register="registerModal" | |
| 4 | + v-bind="$attrs" | |
| 5 | + title="管理设备凭证" | |
| 6 | + @cancel="handleCancel" | |
| 7 | + @ok="handleOk" | |
| 8 | + centered | |
| 9 | + > | |
| 10 | + <BasicForm @register="registerForm" /> | |
| 9 | 11 | </BasicModal> |
| 10 | 12 | </template> |
| 11 | 13 | |
| 12 | 14 | <script lang="ts"> |
| 13 | 15 | import { defineComponent } from 'vue'; |
| 14 | 16 | import { useModalInner, BasicModal } from '/@/components/Modal'; |
| 15 | - import { Checkbox } from 'ant-design-vue'; | |
| 16 | 17 | import { BasicForm, useForm } from '/@/components/Form'; |
| 17 | - import { step2Schemas } from '../../config/data'; | |
| 18 | - | |
| 18 | + import { TokenSchemas, credentialTypeEnum } from '../../config/data'; | |
| 19 | + import { saveDeviceToken } from '/@/api/device/deviceManager'; | |
| 20 | + import { useMessage } from '/@/hooks/web/useMessage'; | |
| 19 | 21 | export default defineComponent({ |
| 20 | 22 | components: { |
| 21 | 23 | BasicModal, |
| 22 | 24 | BasicForm, |
| 23 | - Checkbox, | |
| 24 | 25 | }, |
| 25 | 26 | emits: ['register'], |
| 26 | 27 | setup() { |
| 27 | - const [registerModal, { closeModal }] = useModalInner(async (data) => { | |
| 28 | - console.log(data); | |
| 29 | - }); | |
| 30 | 28 | const [ |
| 31 | 29 | registerForm, |
| 32 | 30 | { getFieldsValue, updateSchema, validate, resetFields, setFieldsValue }, |
| 33 | 31 | ] = useForm({ |
| 34 | 32 | labelWidth: 100, |
| 35 | - schemas: step2Schemas, | |
| 36 | - actionColOptions: { | |
| 37 | - span: 14, | |
| 38 | - }, | |
| 39 | - labelAlign: 'left', | |
| 33 | + schemas: TokenSchemas, | |
| 34 | + labelAlign: 'right', | |
| 40 | 35 | showSubmitButton: false, |
| 41 | 36 | showResetButton: false, |
| 42 | 37 | wrapperCol: { |
| 43 | 38 | span: 12, |
| 44 | 39 | }, |
| 45 | 40 | }); |
| 46 | - const checkedChange = async (e) => { | |
| 41 | + const [registerModal, { closeModal }] = useModalInner(async (data) => { | |
| 42 | + if (data.credentialsType === credentialTypeEnum.ACCESS_TOKEN) { | |
| 43 | + updateSchema([ | |
| 44 | + { | |
| 45 | + field: 'credentialType', | |
| 46 | + ifShow: true, | |
| 47 | + }, | |
| 48 | + { | |
| 49 | + field: 'credentialsId', | |
| 50 | + ifShow: true, | |
| 51 | + }, | |
| 52 | + ]); | |
| 53 | + setFieldsValue({ | |
| 54 | + credentialType: data.credentialsType, | |
| 55 | + credentialsId: data.credentialsId, | |
| 56 | + id: data.id.id, | |
| 57 | + tbDeviceId: data.deviceId.id, | |
| 58 | + }); | |
| 59 | + } else if (data.credentialsType === credentialTypeEnum.X_509) { | |
| 60 | + updateSchema([ | |
| 61 | + { | |
| 62 | + field: 'credentialType', | |
| 63 | + ifShow: true, | |
| 64 | + }, | |
| 65 | + { | |
| 66 | + field: 'publicKey', | |
| 67 | + ifShow: true, | |
| 68 | + }, | |
| 69 | + ]); | |
| 70 | + setFieldsValue({ | |
| 71 | + credentialType: data.credentialsType, | |
| 72 | + publicKey: data.credentialsValue, | |
| 73 | + id: data.id.id, | |
| 74 | + tbDeviceId: data.deviceId.id, | |
| 75 | + }); | |
| 76 | + } else { | |
| 77 | + updateSchema([ | |
| 78 | + { | |
| 79 | + field: 'credentialType', | |
| 80 | + ifShow: true, | |
| 81 | + }, | |
| 82 | + { | |
| 83 | + field: 'clientId', | |
| 84 | + ifShow: true, | |
| 85 | + }, | |
| 86 | + { | |
| 87 | + field: 'username', | |
| 88 | + ifShow: true, | |
| 89 | + }, | |
| 90 | + { | |
| 91 | + field: 'password', | |
| 92 | + ifShow: true, | |
| 93 | + }, | |
| 94 | + ]); | |
| 95 | + const credentialsValue = JSON.parse(data.credentialsValue); | |
| 96 | + setFieldsValue({ | |
| 97 | + credentialType: data.credentialsType, | |
| 98 | + clientId: credentialsValue?.clientId, | |
| 99 | + username: credentialsValue?.userName, | |
| 100 | + password: credentialsValue?.password, | |
| 101 | + id: data.id.id, | |
| 102 | + tbDeviceId: data.deviceId.id, | |
| 103 | + }); | |
| 104 | + } | |
| 105 | + }); | |
| 106 | + const checkedChange = (e) => { | |
| 47 | 107 | if (!e.target.checked) { |
| 48 | - await updateSchema([ | |
| 108 | + updateSchema([ | |
| 49 | 109 | { |
| 50 | 110 | field: 'credentialsId', |
| 51 | 111 | ifShow: false, |
| ... | ... | @@ -66,17 +126,84 @@ |
| 66 | 126 | field: 'publicKey', |
| 67 | 127 | ifShow: false, |
| 68 | 128 | }, |
| 129 | + { | |
| 130 | + field: 'credentialType', | |
| 131 | + ifShow: false, | |
| 132 | + }, | |
| 69 | 133 | ]); |
| 70 | 134 | setFieldsValue({ |
| 71 | 135 | credentialType: '', |
| 72 | 136 | }); |
| 137 | + } else { | |
| 138 | + updateSchema([ | |
| 139 | + { | |
| 140 | + field: 'credentialType', | |
| 141 | + ifShow: true, | |
| 142 | + }, | |
| 143 | + ]); | |
| 73 | 144 | } |
| 74 | 145 | }; |
| 75 | 146 | const handleCancel = () => { |
| 76 | - console.log('取消'); | |
| 147 | + resetFields(); | |
| 148 | + | |
| 149 | + updateSchema([ | |
| 150 | + { | |
| 151 | + field: 'publicKey', | |
| 152 | + ifShow: false, | |
| 153 | + }, | |
| 154 | + { | |
| 155 | + field: 'credentialsId', | |
| 156 | + ifShow: false, | |
| 157 | + }, | |
| 158 | + { | |
| 159 | + field: 'clientId', | |
| 160 | + ifShow: false, | |
| 161 | + }, | |
| 162 | + { | |
| 163 | + field: 'username', | |
| 164 | + ifShow: false, | |
| 165 | + }, | |
| 166 | + { | |
| 167 | + field: 'password', | |
| 168 | + ifShow: false, | |
| 169 | + }, | |
| 170 | + ]); | |
| 77 | 171 | }; |
| 78 | - const handleOk = () => { | |
| 79 | - console.log('确定'); | |
| 172 | + const handleOk = async () => { | |
| 173 | + // 验证 | |
| 174 | + const valid = await validate(); | |
| 175 | + if (!valid) return; | |
| 176 | + // 收集表单数据 | |
| 177 | + const field = getFieldsValue(); | |
| 178 | + const editData = { | |
| 179 | + id: { | |
| 180 | + id: field.id, | |
| 181 | + }, | |
| 182 | + deviceId: { | |
| 183 | + id: field.tbDeviceId, | |
| 184 | + entityType: 'DEVICE', | |
| 185 | + }, | |
| 186 | + credentialsType: field.credentialType, | |
| 187 | + credentialsId: field.credentialsId, | |
| 188 | + credentialsValue: | |
| 189 | + field.credentialType === credentialTypeEnum.MQTT_BASIC | |
| 190 | + ? JSON.stringify({ | |
| 191 | + userName: field.username, | |
| 192 | + password: field.password, | |
| 193 | + clientId: field.clientId, | |
| 194 | + }) | |
| 195 | + : field.credentialType === credentialTypeEnum.X_509 | |
| 196 | + ? field.publicKey | |
| 197 | + : null, | |
| 198 | + }; | |
| 199 | + | |
| 200 | + await saveDeviceToken(editData); | |
| 201 | + const { createMessage } = useMessage(); | |
| 202 | + createMessage.success('修改设备凭证成功'); | |
| 203 | + | |
| 204 | + // 请求 | |
| 205 | + closeModal(); | |
| 206 | + handleCancel(); | |
| 80 | 207 | }; |
| 81 | 208 | return { |
| 82 | 209 | registerModal, | ... | ... |
| ... | ... | @@ -37,6 +37,7 @@ |
| 37 | 37 | import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; |
| 38 | 38 | import { useModal } from '/@/components/Modal'; |
| 39 | 39 | import ManageDeviceTokenModal from '../modal/ManageDeviceTokenModal.vue'; |
| 40 | + import { getDeviceToken } from '/@/api/device/deviceManager'; | |
| 40 | 41 | export default defineComponent({ |
| 41 | 42 | components: { |
| 42 | 43 | Image, |
| ... | ... | @@ -90,16 +91,19 @@ |
| 90 | 91 | createMessage.success('复制成功~'); |
| 91 | 92 | } |
| 92 | 93 | }; |
| 93 | - const copyDeviceToken = () => { | |
| 94 | - // TODO:此处需要动态修改 | |
| 95 | - clipboardRef.value = props.deviceDetail.deviceToken; | |
| 96 | - if (unref(clipboardRef)) { | |
| 97 | - createMessage.success('复制成功~'); | |
| 94 | + const copyDeviceToken = async () => { | |
| 95 | + const token = await getDeviceToken(props.deviceDetail.tbDeviceId); | |
| 96 | + if (token.credentialsType === 'ACCESS_TOKEN') { | |
| 97 | + clipboardRef.value = token.credentialsId; | |
| 98 | + } else { | |
| 99 | + clipboardRef.value = token.credentialsValue; | |
| 98 | 100 | } |
| 101 | + createMessage.success('复制成功~'); | |
| 99 | 102 | }; |
| 100 | 103 | const [registerModal, { openModal }] = useModal(); |
| 101 | - const manageDeviceToken = () => { | |
| 102 | - openModal(true); | |
| 104 | + const manageDeviceToken = async () => { | |
| 105 | + const token = await getDeviceToken(props.deviceDetail.tbDeviceId); | |
| 106 | + openModal(true, token); | |
| 103 | 107 | }; |
| 104 | 108 | |
| 105 | 109 | return { | ... | ... |
| ... | ... | @@ -26,6 +26,7 @@ |
| 26 | 26 | const state = reactive({ |
| 27 | 27 | server: `ws://101.133.234.90:8080/api/ws/plugins/telemetry?token=${token}`, |
| 28 | 28 | sendValue: JSON.stringify({ |
| 29 | + attrSubCmds: [], | |
| 29 | 30 | tsSubCmds: [ |
| 30 | 31 | { |
| 31 | 32 | entityType: 'DEVICE', |
| ... | ... | @@ -34,6 +35,13 @@ |
| 34 | 35 | cmdId: 1, |
| 35 | 36 | }, |
| 36 | 37 | ], |
| 38 | + historyCmds: [], | |
| 39 | + entityDataCmds: [], | |
| 40 | + entityDataUnsubscribeCmds: [], | |
| 41 | + alarmDataCmds: [], | |
| 42 | + alarmDataUnsubscribeCmds: [], | |
| 43 | + entityCountCmds: [], | |
| 44 | + entityCountUnsubscribeCmds: [], | |
| 37 | 45 | }), |
| 38 | 46 | recordList: Array<socketDataType>(), |
| 39 | 47 | }); |
| ... | ... | @@ -49,10 +57,12 @@ |
| 49 | 57 | const { send } = useWebSocket(state.server, { |
| 50 | 58 | onConnected() { |
| 51 | 59 | send(state.sendValue); |
| 60 | + console.log('建立连接了'); | |
| 61 | + console.log(props.deviceDetail.tbDeviceId); | |
| 52 | 62 | }, |
| 53 | 63 | onMessage(_, e) { |
| 54 | 64 | const { data } = JSON.parse(e.data); |
| 55 | - console.log('来新消息了'); | |
| 65 | + console.log('来新消息了', 'data---', data); | |
| 56 | 66 | const newArray: any = []; |
| 57 | 67 | for (const key in data) { |
| 58 | 68 | const newData = data[key].flat(1); | ... | ... |