Showing
14 changed files
with
537 additions
and
48 deletions
@@ -21,9 +21,7 @@ | @@ -21,9 +21,7 @@ | ||
21 | theme = htmlRoot = null; | 21 | theme = htmlRoot = null; |
22 | } | 22 | } |
23 | })(); | 23 | })(); |
24 | - const historyClick = () => { | ||
25 | - console.log(1); | ||
26 | - }; | 24 | + |
27 | </script> | 25 | </script> |
28 | <div id="app"> | 26 | <div id="app"> |
29 | <style> | 27 | <style> |
@@ -163,6 +161,7 @@ | @@ -163,6 +161,7 @@ | ||
163 | </div> | 161 | </div> |
164 | </div> | 162 | </div> |
165 | </div> | 163 | </div> |
164 | + | ||
166 | <script type="module" src="/src/main.ts"></script> | 165 | <script type="module" src="/src/main.ts"></script> |
167 | </body> | 166 | </body> |
168 | </html> | 167 | </html> |
@@ -19,6 +19,8 @@ enum DeviceManagerApi { | @@ -19,6 +19,8 @@ enum DeviceManagerApi { | ||
19 | DEVICE_PROFILE_URL_ME = '/deviceProfile/me/list', | 19 | DEVICE_PROFILE_URL_ME = '/deviceProfile/me/list', |
20 | 20 | ||
21 | DEVICE_ALARM_URL = '/alarm', | 21 | DEVICE_ALARM_URL = '/alarm', |
22 | + | ||
23 | + DEVICE_CREDENTIALS = '/device/credentials', | ||
22 | } | 24 | } |
23 | 25 | ||
24 | export const devicePage = (params: DeviceQueryParam) => { | 26 | export const devicePage = (params: DeviceQueryParam) => { |
@@ -108,3 +110,29 @@ export const clearOrAckAlarm = (id: string, flag: boolean) => { | @@ -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,10 +35,12 @@ export const alarmSearchSchemas: FormSchema[] = [ | ||
35 | colProps: { span: 6 }, | 35 | colProps: { span: 6 }, |
36 | }, | 36 | }, |
37 | { | 37 | { |
38 | - field: 'time', | 38 | + field: 'endTime', |
39 | label: '告警时间范围', | 39 | label: '告警时间范围', |
40 | - component: 'RangePicker', | ||
41 | - componentProps: {}, | 40 | + component: 'DatePicker', |
41 | + componentProps: { | ||
42 | + valueFormat: 'x', | ||
43 | + }, | ||
42 | colProps: { span: 6 }, | 44 | colProps: { span: 6 }, |
43 | }, | 45 | }, |
44 | ]; | 46 | ]; |
@@ -38,7 +38,6 @@ | @@ -38,7 +38,6 @@ | ||
38 | formConfig: { | 38 | formConfig: { |
39 | labelWidth: 120, | 39 | labelWidth: 120, |
40 | schemas: alarmSearchSchemas, | 40 | schemas: alarmSearchSchemas, |
41 | - fieldMapToTime: [['time', ['startTime', 'endTime'], 'x']], | ||
42 | }, | 41 | }, |
43 | useSearchForm: true, | 42 | useSearchForm: true, |
44 | bordered: true, | 43 | bordered: true, |
@@ -3,6 +3,15 @@ import type { FormSchema } from '/@/components/Table'; | @@ -3,6 +3,15 @@ import type { FormSchema } from '/@/components/Table'; | ||
3 | import { getOrganizationList } from '/@/api/system/system'; | 3 | import { getOrganizationList } from '/@/api/system/system'; |
4 | import { copyTransFun } from '/@/utils/fnUtils'; | 4 | import { copyTransFun } from '/@/utils/fnUtils'; |
5 | import { getDeviceProfile } from '/@/api/alarm/position'; | 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 | export const formSchema: FormSchema[] = [ | 15 | export const formSchema: FormSchema[] = [ |
7 | { | 16 | { |
8 | field: 'organizationId', | 17 | field: 'organizationId', |
@@ -82,3 +91,114 @@ export const columns: BasicColumn[] = [ | @@ -82,3 +91,114 @@ export const columns: BasicColumn[] = [ | ||
82 | slots: { customRender: 'deviceState' }, | 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,9 +22,13 @@ | ||
22 | : '离线' | 22 | : '离线' |
23 | }} | 23 | }} |
24 | </Tag> | 24 | </Tag> |
25 | - </template></BasicTable | ||
26 | - > | 25 | + </template> |
26 | + </BasicTable> | ||
27 | </div> | 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 | </div> | 32 | </div> |
29 | </template> | 33 | </template> |
30 | <script lang="ts"> | 34 | <script lang="ts"> |
@@ -36,11 +40,16 @@ | @@ -36,11 +40,16 @@ | ||
36 | import { Tag } from 'ant-design-vue'; | 40 | import { Tag } from 'ant-design-vue'; |
37 | import { DeviceState } from '/@/api/device/model/deviceModel'; | 41 | import { DeviceState } from '/@/api/device/model/deviceModel'; |
38 | import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; | 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 | export default defineComponent({ | 46 | export default defineComponent({ |
40 | name: 'BaiduMap', | 47 | name: 'BaiduMap', |
41 | components: { | 48 | components: { |
42 | BasicTable, | 49 | BasicTable, |
43 | Tag, | 50 | Tag, |
51 | + BasicModal, | ||
52 | + BasicForm, | ||
44 | }, | 53 | }, |
45 | props: { | 54 | props: { |
46 | width: { | 55 | width: { |
@@ -151,11 +160,23 @@ | @@ -151,11 +160,23 @@ | ||
151 | console.log(record); | 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 | return { | 172 | return { |
155 | wrapRef, | 173 | wrapRef, |
156 | registerTable, | 174 | registerTable, |
157 | deviceRowClick, | 175 | deviceRowClick, |
158 | DeviceState, | 176 | DeviceState, |
177 | + handleClick, | ||
178 | + registerModal, | ||
179 | + registerForm, | ||
159 | }; | 180 | }; |
160 | }, | 181 | }, |
161 | }); | 182 | }); |
@@ -268,8 +268,185 @@ export const step2Schemas: FormSchema[] = [ | @@ -268,8 +268,185 @@ export const step2Schemas: FormSchema[] = [ | ||
268 | }, | 268 | }, |
269 | { | 269 | { |
270 | label: '密码', | 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 | component: 'Input', | 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 | field: 'password', | 437 | field: 'password', |
273 | ifShow: false, | 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,10 +97,12 @@ export const alarmSearchSchemas: FormSchema[] = [ | ||
97 | colProps: { span: 6 }, | 97 | colProps: { span: 6 }, |
98 | }, | 98 | }, |
99 | { | 99 | { |
100 | - field: 'time', | 100 | + field: 'endTime', |
101 | label: '告警时间范围', | 101 | label: '告警时间范围', |
102 | - component: 'RangePicker', | ||
103 | - componentProps: {}, | 102 | + component: 'DatePicker', |
103 | + componentProps: { | ||
104 | + valueFormat: 'x', | ||
105 | + }, | ||
104 | colProps: { span: 6 }, | 106 | colProps: { span: 6 }, |
105 | }, | 107 | }, |
106 | ]; | 108 | ]; |
@@ -49,11 +49,12 @@ | @@ -49,11 +49,12 @@ | ||
49 | const activeKey = ref('1'); | 49 | const activeKey = ref('1'); |
50 | const size = ref('small'); | 50 | const size = ref('small'); |
51 | const deviceDetailRef = ref(); | 51 | const deviceDetailRef = ref(); |
52 | - const deviceDetail: any = ref({}); | ||
53 | - | 52 | + const deviceDetail = ref<any>({}); |
53 | + const tbDeviceId = ref(''); | ||
54 | // 详情回显 | 54 | // 详情回显 |
55 | const [register] = useDrawerInner(async (data) => { | 55 | const [register] = useDrawerInner(async (data) => { |
56 | const { id } = data; | 56 | const { id } = data; |
57 | + // 设备详情 | ||
57 | const res = await getDeviceDetail(id); | 58 | const res = await getDeviceDetail(id); |
58 | deviceDetail.value = res; | 59 | deviceDetail.value = res; |
59 | const { latitude, longitude, address } = res.deviceInfo; | 60 | const { latitude, longitude, address } = res.deviceInfo; |
@@ -72,6 +73,7 @@ | @@ -72,6 +73,7 @@ | ||
72 | closeDrawer, | 73 | closeDrawer, |
73 | deviceDetail, | 74 | deviceDetail, |
74 | deviceDetailRef, | 75 | deviceDetailRef, |
76 | + tbDeviceId, | ||
75 | }; | 77 | }; |
76 | }, | 78 | }, |
77 | }); | 79 | }); |
@@ -108,7 +108,6 @@ | @@ -108,7 +108,6 @@ | ||
108 | if (current.value === 0) { | 108 | if (current.value === 0) { |
109 | // 验证 | 109 | // 验证 |
110 | const valid = await unref(DeviceStep1Ref)?.parentValidate(); | 110 | const valid = await unref(DeviceStep1Ref)?.parentValidate(); |
111 | - console.log('123'); | ||
112 | if (!valid) return; | 111 | if (!valid) return; |
113 | stepState.value = unref(DeviceStep1Ref)?.parentGetFieldsValue(); | 112 | stepState.value = unref(DeviceStep1Ref)?.parentGetFieldsValue(); |
114 | } else { | 113 | } else { |
1 | <template> | 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 | </BasicModal> | 11 | </BasicModal> |
10 | </template> | 12 | </template> |
11 | 13 | ||
12 | <script lang="ts"> | 14 | <script lang="ts"> |
13 | import { defineComponent } from 'vue'; | 15 | import { defineComponent } from 'vue'; |
14 | import { useModalInner, BasicModal } from '/@/components/Modal'; | 16 | import { useModalInner, BasicModal } from '/@/components/Modal'; |
15 | - import { Checkbox } from 'ant-design-vue'; | ||
16 | import { BasicForm, useForm } from '/@/components/Form'; | 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 | export default defineComponent({ | 21 | export default defineComponent({ |
20 | components: { | 22 | components: { |
21 | BasicModal, | 23 | BasicModal, |
22 | BasicForm, | 24 | BasicForm, |
23 | - Checkbox, | ||
24 | }, | 25 | }, |
25 | emits: ['register'], | 26 | emits: ['register'], |
26 | setup() { | 27 | setup() { |
27 | - const [registerModal, { closeModal }] = useModalInner(async (data) => { | ||
28 | - console.log(data); | ||
29 | - }); | ||
30 | const [ | 28 | const [ |
31 | registerForm, | 29 | registerForm, |
32 | { getFieldsValue, updateSchema, validate, resetFields, setFieldsValue }, | 30 | { getFieldsValue, updateSchema, validate, resetFields, setFieldsValue }, |
33 | ] = useForm({ | 31 | ] = useForm({ |
34 | labelWidth: 100, | 32 | labelWidth: 100, |
35 | - schemas: step2Schemas, | ||
36 | - actionColOptions: { | ||
37 | - span: 14, | ||
38 | - }, | ||
39 | - labelAlign: 'left', | 33 | + schemas: TokenSchemas, |
34 | + labelAlign: 'right', | ||
40 | showSubmitButton: false, | 35 | showSubmitButton: false, |
41 | showResetButton: false, | 36 | showResetButton: false, |
42 | wrapperCol: { | 37 | wrapperCol: { |
43 | span: 12, | 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 | if (!e.target.checked) { | 107 | if (!e.target.checked) { |
48 | - await updateSchema([ | 108 | + updateSchema([ |
49 | { | 109 | { |
50 | field: 'credentialsId', | 110 | field: 'credentialsId', |
51 | ifShow: false, | 111 | ifShow: false, |
@@ -66,17 +126,84 @@ | @@ -66,17 +126,84 @@ | ||
66 | field: 'publicKey', | 126 | field: 'publicKey', |
67 | ifShow: false, | 127 | ifShow: false, |
68 | }, | 128 | }, |
129 | + { | ||
130 | + field: 'credentialType', | ||
131 | + ifShow: false, | ||
132 | + }, | ||
69 | ]); | 133 | ]); |
70 | setFieldsValue({ | 134 | setFieldsValue({ |
71 | credentialType: '', | 135 | credentialType: '', |
72 | }); | 136 | }); |
137 | + } else { | ||
138 | + updateSchema([ | ||
139 | + { | ||
140 | + field: 'credentialType', | ||
141 | + ifShow: true, | ||
142 | + }, | ||
143 | + ]); | ||
73 | } | 144 | } |
74 | }; | 145 | }; |
75 | const handleCancel = () => { | 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 | return { | 208 | return { |
82 | registerModal, | 209 | registerModal, |
@@ -43,7 +43,6 @@ | @@ -43,7 +43,6 @@ | ||
43 | formConfig: { | 43 | formConfig: { |
44 | labelWidth: 120, | 44 | labelWidth: 120, |
45 | schemas: alarmSearchSchemas, | 45 | schemas: alarmSearchSchemas, |
46 | - fieldMapToTime: [['time', ['startTime', 'endTime'], 'x']], | ||
47 | }, | 46 | }, |
48 | useSearchForm: true, | 47 | useSearchForm: true, |
49 | bordered: true, | 48 | bordered: true, |
@@ -37,6 +37,7 @@ | @@ -37,6 +37,7 @@ | ||
37 | import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; | 37 | import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; |
38 | import { useModal } from '/@/components/Modal'; | 38 | import { useModal } from '/@/components/Modal'; |
39 | import ManageDeviceTokenModal from '../modal/ManageDeviceTokenModal.vue'; | 39 | import ManageDeviceTokenModal from '../modal/ManageDeviceTokenModal.vue'; |
40 | + import { getDeviceToken } from '/@/api/device/deviceManager'; | ||
40 | export default defineComponent({ | 41 | export default defineComponent({ |
41 | components: { | 42 | components: { |
42 | Image, | 43 | Image, |
@@ -90,16 +91,19 @@ | @@ -90,16 +91,19 @@ | ||
90 | createMessage.success('复制成功~'); | 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 | const [registerModal, { openModal }] = useModal(); | 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 | return { | 109 | return { |
@@ -26,6 +26,7 @@ | @@ -26,6 +26,7 @@ | ||
26 | const state = reactive({ | 26 | const state = reactive({ |
27 | server: `ws://101.133.234.90:8080/api/ws/plugins/telemetry?token=${token}`, | 27 | server: `ws://101.133.234.90:8080/api/ws/plugins/telemetry?token=${token}`, |
28 | sendValue: JSON.stringify({ | 28 | sendValue: JSON.stringify({ |
29 | + attrSubCmds: [], | ||
29 | tsSubCmds: [ | 30 | tsSubCmds: [ |
30 | { | 31 | { |
31 | entityType: 'DEVICE', | 32 | entityType: 'DEVICE', |
@@ -34,6 +35,13 @@ | @@ -34,6 +35,13 @@ | ||
34 | cmdId: 1, | 35 | cmdId: 1, |
35 | }, | 36 | }, |
36 | ], | 37 | ], |
38 | + historyCmds: [], | ||
39 | + entityDataCmds: [], | ||
40 | + entityDataUnsubscribeCmds: [], | ||
41 | + alarmDataCmds: [], | ||
42 | + alarmDataUnsubscribeCmds: [], | ||
43 | + entityCountCmds: [], | ||
44 | + entityCountUnsubscribeCmds: [], | ||
37 | }), | 45 | }), |
38 | recordList: Array<socketDataType>(), | 46 | recordList: Array<socketDataType>(), |
39 | }); | 47 | }); |
@@ -49,10 +57,12 @@ | @@ -49,10 +57,12 @@ | ||
49 | const { send } = useWebSocket(state.server, { | 57 | const { send } = useWebSocket(state.server, { |
50 | onConnected() { | 58 | onConnected() { |
51 | send(state.sendValue); | 59 | send(state.sendValue); |
60 | + console.log('建立连接了'); | ||
61 | + console.log(props.deviceDetail.tbDeviceId); | ||
52 | }, | 62 | }, |
53 | onMessage(_, e) { | 63 | onMessage(_, e) { |
54 | const { data } = JSON.parse(e.data); | 64 | const { data } = JSON.parse(e.data); |
55 | - console.log('来新消息了'); | 65 | + console.log('来新消息了', 'data---', data); |
56 | const newArray: any = []; | 66 | const newArray: any = []; |
57 | for (const key in data) { | 67 | for (const key in data) { |
58 | const newData = data[key].flat(1); | 68 | const newData = data[key].flat(1); |