Detail.vue 3.42 KB
<template>
  <div class="tabs-detail">
    <div v-if="deviceDetail?.deviceInfo?.avatar">
      <p>设备图片</p>
      <Image :src="deviceDetail.deviceInfo.avatar" :width="100" />
    </div>
    <div>
      <p>设备信息</p>
      <Table
        bordered
        :columns="columns"
        :data-source="[{ ...deviceDetail, key: 'name' }]"
        :pagination="false"
      />
    </div>
    <div v-if="deviceDetail?.deviceInfo?.address">
      <p>设备位置</p>
      <div ref="wrapRef" style="height: 400px; width: 90%" class="ml-6"></div>
    </div>
    <div class="mt-4">
      <a-button type="primary" class="mr-4" @click="copyDeviceId">复制设备ID</a-button>
      <a-button type="primary" @click="copyToken">复制访问令牌</a-button>
    </div>
  </div>
</template>
<script lang="ts">
  import { defineComponent, ref, unref, nextTick } from 'vue';
  import { Image, Table } from 'ant-design-vue';
  import { columns } from '../../config/detail.config';
  import { useScript } from '/@/hooks/web/useScript';
  import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
  import { useMessage } from '/@/hooks/web/useMessage';
  export default defineComponent({
    components: {
      Image,
      Table,
    },
    props: {
      deviceDetail: {
        type: Object,
        required: true,
      },
    },
    setup(props) {
      const BAI_DU_MAP_URL =
        'https://api.map.baidu.com/getscript?v=3.0&ak=7uOPPyAHn2Y2ZryeQqHtcRqtIY374vKa';
      const wrapRef = ref<HTMLDivElement | null>(null);
      const { toPromise } = useScript({ src: BAI_DU_MAP_URL });

      async function initMap(longitude, latitude, address) {
        await toPromise();
        await nextTick();
        const wrapEl = unref(wrapRef);
        const BMap = (window as any).BMap;
        if (!wrapEl) return;
        const map = new BMap.Map(wrapEl);
        let myIcon = new BMap.Icon(
          'http://api.map.baidu.com/img/markers.png',
          new BMap.Size(40, 25),
          {
            offset: new BMap.Size(0, 0), // 指定定位位置
            imageOffset: new BMap.Size(20, -260), // 设置图片偏移
          }
        );
        const point = new BMap.Point(Number(longitude), Number(latitude));
        var content = `我在 ${address}`;
        var label = new BMap.Label(content, {
          // 创建文本标注
          position: point,
          offset: new BMap.Size(15, -35),
        });
        map.addOverlay(label); // 将标注添加到地图中
        label.setStyle({
          // 设置label的样式
          color: '#000',
          fontSize: '10px',
          border: '1px solid #1E90FF',
        });
        let marker = new BMap.Marker(point, { icon: myIcon });
        map.centerAndZoom(point, 15);
        map.enableScrollWheelZoom(true);
        map.addOverlay(marker);
      }
      const { createMessage } = useMessage();
      const { clipboardRef } = useCopyToClipboard();
      const copyDeviceId = () => {
        clipboardRef.value = props.deviceDetail.id;
        if (unref(clipboardRef)) {
          createMessage.success('复制成功~');
        }
      };
      const copyToken = () => {
        clipboardRef.value = props.deviceDetail.deviceToken;
        if (unref(clipboardRef)) {
          createMessage.success('复制成功~');
        }
      };

      return {
        columns,
        wrapRef,
        copyDeviceId,
        copyToken,
        initMap,
      };
    },
  });
</script>
<style lang="less" scoped></style>