Browse Source

单点登录项目空间ID问题修复

李富豪 1 year ago
parent
commit
e4bd3fa607
30 changed files with 235 additions and 242 deletions
  1. 15 17
      Web/src/api/custom/index.ts
  2. 7 9
      Web/src/api/device-log/index.ts
  3. 4 5
      Web/src/api/device-setting/index.ts
  4. 7 8
      Web/src/api/drc.ts
  5. 6 8
      Web/src/api/drone-control/drone.ts
  6. 5 7
      Web/src/api/drone-control/payload.ts
  7. 13 15
      Web/src/api/flight-area/index.ts
  8. 10 19
      Web/src/api/layer.ts
  9. 16 17
      Web/src/components/MediaPanel.vue
  10. 27 32
      Web/src/components/devices/DeviceFirmwareStatus.vue
  11. 8 5
      Web/src/components/devices/device-hms/DeviceHmsDrawer.vue
  12. 32 15
      Web/src/components/flight-area/FlightAreaDevicePanel.vue
  13. 1 1
      Web/src/components/flight-area/FlightAreaItem.vue
  14. 5 6
      Web/src/components/task/CreatePlan.vue
  15. 8 12
      Web/src/components/task/TaskPanel.vue
  16. 3 2
      Web/src/hooks/use-g-map-tsa.ts
  17. 24 19
      Web/src/pages/page-pilot/pilot-bind.vue
  18. 4 3
      Web/src/pages/page-pilot/pilot-home.vue
  19. 1 1
      Web/src/pages/page-pilot/pilot-index.vue
  20. 1 2
      Web/src/pages/page-pilot/pilot-liveshare.vue
  21. 1 2
      Web/src/pages/page-pilot/pilot-media.vue
  22. 5 6
      Web/src/pages/page-web/projects/Firmwares.vue
  23. 3 3
      Web/src/pages/page-web/projects/dock.vue
  24. 2 2
      Web/src/pages/page-web/projects/media/detail/components/FileInfo.vue
  25. 2 1
      Web/src/pages/page-web/projects/media/detail/components/Search.vue
  26. 2 2
      Web/src/pages/page-web/projects/media/detail/index.vue
  27. 2 4
      Web/src/pages/page-web/projects/member/index.vue
  28. 4 3
      Web/src/pages/page-web/projects/tsa.vue
  29. 6 6
      Web/src/pages/page-web/projects/wayline.vue
  30. 11 10
      Web/src/router/index.ts

+ 15 - 17
Web/src/api/custom/index.ts

@@ -1,7 +1,5 @@
 import request from '/@/api/http/request';
-import { ELocalStorageKey } from "/@/types";
-
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '';
+import { getWorkspaceId } from '/@/utils/index';
 
 // Api参数类型
 export type SignLoginApiParams = {
@@ -105,7 +103,7 @@ const signLoginApi: SignLoginApi = async (data) => {
 
 // 获取负载列表
 const fetchPayloadListApi: FetchPayloadListApi = async () => {
-    const res = await request.get(`/manage/api/v1/devices/${workspaceId}/payloads`);
+    const res = await request.get(`/manage/api/v1/devices/${getWorkspaceId()}/payloads`);
     return res.data;
 };
 
@@ -117,7 +115,7 @@ const fetchFeedbackRecordListApi: FetchFeedbackRecordListApi = async (data) => {
 
 // 获取变化记录列表
 const fetchChangeRecordListApi: FetchChangeRecordListApi = async (params) => {
-    const res = await request.get(`/manage/api/v1/oprlogs/${workspaceId}/devices/logs`, { params: params });
+    const res = await request.get(`/manage/api/v1/oprlogs/${getWorkspaceId()}/devices/logs`, { params: params });
     return res.data;
 };
 
@@ -129,13 +127,13 @@ const fetchProjectListApi: FetchProjectListApi = async () => {
 
 // 获取文件夹列表
 const fetchMediaFileListApi: FetchMediaFileListApi = async (params) => {
-    const res = await request.get(`/media/api/v1/files/${workspaceId}/dirs`, { params: params });
+    const res = await request.get(`/media/api/v1/files/${getWorkspaceId()}/dirs`, { params: params });
     return res.data;
 };
 
 // 批量下载文件夹
 const batchDownloadMediaFileApi: BatchDownloadMediaFileApi = async (params) => {
-    const res = await request.get(`/media/api/v1/files/${workspaceId}/fileDownList`, {
+    const res = await request.get(`/media/api/v1/files/${getWorkspaceId()}/fileDownList`, {
         responseType: 'blob',
         params: params
     });
@@ -144,19 +142,19 @@ const batchDownloadMediaFileApi: BatchDownloadMediaFileApi = async (params) => {
 
 // 获取文件夹下所有文件
 const fetchFileListByFolderApi: FetchFileListByFolderApi = async (dirId, params) => {
-    const res = await request.get(`/media/api/v1/files/${workspaceId}/files/${dirId}`, { params: params });
+    const res = await request.get(`/media/api/v1/files/${getWorkspaceId()}/files/${dirId}`, { params: params });
     return res.data;
 };
 
 // 获取文件详情
 const fetchFileDetailApi: FetchFileDetailApi = async (fileId) => {
-    const res = await request.get(`/media/api/v1/files/${workspaceId}/file/${fileId}`);
+    const res = await request.get(`/media/api/v1/files/${getWorkspaceId()}/file/${fileId}`);
     return res.data;
 };
 
 // 批量下载文件
 const batchDownloadFileApi: BatchDownloadFileApi = async (params) => {
-    const res = await request.get(`/media/api/v1/files/${workspaceId}/downloadFiles`, {
+    const res = await request.get(`/media/api/v1/files/${getWorkspaceId()}/downloadFiles`, {
         responseType: 'blob',
         params: params
     });
@@ -165,48 +163,48 @@ const batchDownloadFileApi: BatchDownloadFileApi = async (params) => {
 
 // 添加图片元素
 const createMapElementApi: CreateMapElementApi = async (fileId) => {
-    const url = `/media/api/v1/files/workspaces/${workspaceId}/createMapElement/${fileId}`
+    const url = `/media/api/v1/files/workspaces/${getWorkspaceId()}/createMapElement/${fileId}`
     const result = await request.post(url)
     return result.data;
 }
 
 // 删除图片元素
 const deleteMapElementApi: DeleteMapElementApi = async (fileId) => {
-    const url = `/media/api/v1/files/workspaces/${workspaceId}/deleteMapElement/${fileId}`
+    const url = `/media/api/v1/files/workspaces/${getWorkspaceId()}/deleteMapElement/${fileId}`
     const result = await request.delete(url)
     return result.data;
 }
 
 // 更新文件名称
 const updateFileNameApi: UpdateFileNameApi = async (fileId, data) => {
-    const url = `/media/api/v1/files/${workspaceId}/updateFile/${fileId}`
+    const url = `/media/api/v1/files/${getWorkspaceId()}/updateFile/${fileId}`
     const result = await request.put(url, data)
     return result.data
 }
 
 // 批量删除图片
 const batchDeletePictureApi: BatchDeletePictureApi = async (data) => {
-    const res = await request.delete(`/media/api/v1/files/${workspaceId}/deleteFiles`, { params: data });
+    const res = await request.delete(`/media/api/v1/files/${getWorkspaceId()}/deleteFiles`, { params: data });
     return res.data;
 };
 
 // 获取轨迹列表
 const fetchTrajectoryListApi: FetchTrajectoryListApi = async (params) => {
-    const url = `/map/api/v1/workspaces/${workspaceId}/flight-tasks`
+    const url = `/map/api/v1/workspaces/${getWorkspaceId()}/flight-tasks`
     const res = await request.get(url, { params: params });
     return res.data;
 };
 
 // 获取轨迹地图
 const fetchTrajectoryMapApi: FetchTrajectoryMapApi = async (taskId) => {
-    const url = `/map/api/v1/workspaces/${workspaceId}/flight-task/${taskId}`
+    const url = `/map/api/v1/workspaces/${getWorkspaceId()}/flight-task/${taskId}`
     const res = await request.get(url);
     return res.data;
 };
 
 // 添加飞行员
 const addPilotApi: AddPilotApi = async (data) => {
-    const url = `/manage/api/v1/users/${workspaceId}/savePilotUser`
+    const url = `/manage/api/v1/users/${getWorkspaceId()}/savePilotUser`
     const res = await request.post(url, data);
     return res.data;
 };

+ 7 - 9
Web/src/api/device-log/index.ts

@@ -1,12 +1,10 @@
 import request, { IWorkspaceResponse, IListWorkspaceResponse } from '/@/api/http/request'
 import { DeviceValue, DOMAIN } from '/@/types/device'
 import { DeviceLogUploadStatusEnum } from '/@/types/device-log'
-import { ELocalStorageKey } from '/@/types'
+import { getWorkspaceId } from '/@/utils/index';
 
 const MNG_API_PREFIX = '/manage/api/v1'
 
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
-
 export interface GetDeviceUploadLogListParams {
   device_sn: string,
   page: number,
@@ -73,7 +71,7 @@ export interface GetDeviceUploadLogListRsp {
  * @returns
  */
 export async function getDeviceUploadLogList(params: GetDeviceUploadLogListParams): Promise<IListWorkspaceResponse<GetDeviceUploadLogListRsp>> {
-  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${params.device_sn}/logs-uploaded`, {
+  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${getWorkspaceId()}/devices/${params.device_sn}/logs-uploaded`, {
     params: params
   })
   return resp.data
@@ -91,7 +89,7 @@ export interface GetDeviceLogListParams {
  */
 export async function getDeviceLogList(params: GetDeviceLogListParams): Promise<IWorkspaceResponse<DeviceLogFileListInfo>> {
   const domain = params.domain ? params.domain : []
-  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${params.device_sn}/logs`, {
+  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${getWorkspaceId()}/devices/${params.device_sn}/logs`, {
     params: {
       domain_list: domain.join(',')
     }
@@ -116,7 +114,7 @@ export interface UploadDeviceLogBody {
  * @returns
  */
 export async function postDeviceUpgrade(body: UploadDeviceLogBody): Promise<IWorkspaceResponse<{}>> {
-  const resp = await request.post(`${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${body.device_sn}/logs`, body)
+  const resp = await request.post(`${MNG_API_PREFIX}/workspaces/${getWorkspaceId()}/devices/${body.device_sn}/logs`, body)
   return resp.data
 }
 
@@ -130,7 +128,7 @@ export interface CancelDeviceLogUploadBody {
 
 // 取消上传
 export async function cancelDeviceLogUpload(body: CancelDeviceLogUploadBody): Promise<IWorkspaceResponse<{}>> {
-  const url = `${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${body.device_sn}/logs`
+  const url = `${MNG_API_PREFIX}/workspaces/${getWorkspaceId()}/devices/${body.device_sn}/logs`
   const result = await request.delete(url, {
     data: body
   })
@@ -144,7 +142,7 @@ export interface DeleteDeviceLogUploadBody {
 
 // 取消上传
 export async function deleteDeviceLogUpload(body: DeleteDeviceLogUploadBody): Promise<IWorkspaceResponse<{}>> {
-  const url = `${MNG_API_PREFIX}/workspaces/${workspaceId}/devices/${body.device_sn}/logs/${body.logs_id}`
+  const url = `${MNG_API_PREFIX}/workspaces/${getWorkspaceId()}/devices/${body.device_sn}/logs/${body.logs_id}`
   const result = await request.delete(url, {
     data: body
   })
@@ -166,6 +164,6 @@ export interface GetUploadDeviceLogUrlParams {
  * @returns
  */
 export async function getUploadDeviceLogUrl(params: GetUploadDeviceLogUrlParams): Promise<IWorkspaceResponse<string>> {
-  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${workspaceId}/logs/${params.logs_id}/url/${params.file_id}`)
+  const resp = await request.get(`${MNG_API_PREFIX}/workspaces/${getWorkspaceId()}/logs/${params.logs_id}/url/${params.file_id}`)
   return resp.data
 }

+ 4 - 5
Web/src/api/device-setting/index.ts

@@ -1,9 +1,8 @@
 import request, { IWorkspaceResponse } from '/@/api/http/request'
-import { ELocalStorageKey } from '/@/types'
 import { NightLightsStateEnum, DistanceLimitStatus, ObstacleAvoidance } from '/@/types/device-setting'
+import { getWorkspaceId } from '/@/utils/index';
 
 const MNG_API_PREFIX = '/manage/api/v1'
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
 
 export interface PutDevicePropsBody {
   night_lights_state?: NightLightsStateEnum;// 夜航灯开关
@@ -18,7 +17,7 @@ export interface PutDevicePropsBody {
  * @returns
  */
 //  /manage/api/v1/devices/{{workspace_id}}/devices/{{device_sn}}/property
-export async function putDeviceProps (deviceSn: string, body: PutDevicePropsBody): Promise<IWorkspaceResponse<{}>> {
-  const resp = await request.put(`${MNG_API_PREFIX}/devices/${workspaceId}/devices/${deviceSn}/property`, body)
+export async function putDeviceProps(deviceSn: string, body: PutDevicePropsBody): Promise<IWorkspaceResponse<{}>> {
+  const resp = await request.put(`${MNG_API_PREFIX}/devices/${getWorkspaceId()}/devices/${deviceSn}/property`, body)
   return resp.data
-}
+}

+ 7 - 8
Web/src/api/drc.ts

@@ -1,9 +1,8 @@
 import request, { IWorkspaceResponse } from '/@/api/http/request'
-import { ELocalStorageKey } from '/@/types'
+import { getWorkspaceId } from '/@/utils/index';
 
 // DRC 链路
 const DRC_API_PREFIX = '/control/api/v1'
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
 
 export interface PostDrcBody {
   client_id?: string // token过期时,用于续期则必填
@@ -20,8 +19,8 @@ export interface DrcParams {
 }
 
 // 获取 mqtt 连接认证
-export async function postDrc (body: PostDrcBody): Promise<IWorkspaceResponse<DrcParams>> {
-  const resp = await request.post(`${DRC_API_PREFIX}/workspaces/${workspaceId}/drc/connect`, body)
+export async function postDrc(body: PostDrcBody): Promise<IWorkspaceResponse<DrcParams>> {
+  const resp = await request.post(`${DRC_API_PREFIX}/workspaces/${getWorkspaceId()}/drc/connect`, body)
   return resp.data
 }
 
@@ -41,8 +40,8 @@ export interface DrcEnterResp {
 }
 
 // 进入飞行控制 (建立drc连接&获取云控控制权)
-export async function postDrcEnter (body: DrcEnterBody): Promise<IWorkspaceResponse<DrcEnterResp>> {
-  const resp = await request.post(`${DRC_API_PREFIX}/workspaces/${workspaceId}/drc/enter`, body)
+export async function postDrcEnter(body: DrcEnterBody): Promise<IWorkspaceResponse<DrcEnterResp>> {
+  const resp = await request.post(`${DRC_API_PREFIX}/workspaces/${getWorkspaceId()}/drc/enter`, body)
   return resp.data
 }
 
@@ -52,7 +51,7 @@ export interface DrcExitBody {
 }
 
 // 退出飞行控制 (退出drc连接&退出云控控制权)
-export async function postDrcExit (body: DrcExitBody): Promise<IWorkspaceResponse<null>> {
-  const resp = await request.post(`${DRC_API_PREFIX}/workspaces/${workspaceId}/drc/exit`, body)
+export async function postDrcExit(body: DrcExitBody): Promise<IWorkspaceResponse<null>> {
+  const resp = await request.post(`${DRC_API_PREFIX}/workspaces/${getWorkspaceId()}/drc/exit`, body)
   return resp.data
 }

+ 6 - 8
Web/src/api/drone-control/drone.ts

@@ -1,11 +1,9 @@
-import request, { IWorkspaceResponse } from '/@/api/http/request'
-// import { ELocalStorageKey } from '/@/types'
+import request, { IWorkspaceResponse } from '/@/api/http/request';
 
 const API_PREFIX = '/control/api/v1'
-// const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '
 
 // 获取飞行控制权
-export async function postFlightAuth (sn: string): Promise<IWorkspaceResponse<null>> {
+export async function postFlightAuth(sn: string): Promise<IWorkspaceResponse<null>> {
   const resp = await request.post(`${API_PREFIX}/devices/${sn}/authority/flight`)
   return resp.data
 }
@@ -41,18 +39,18 @@ export interface PostFlyToPointBody {
 }
 
 // 飞向目标点
-export async function postFlyToPoint (sn: string, body: PostFlyToPointBody): Promise<IWorkspaceResponse<null>> {
+export async function postFlyToPoint(sn: string, body: PostFlyToPointBody): Promise<IWorkspaceResponse<null>> {
   const resp = await request.post(`${API_PREFIX}/devices/${sn}/jobs/fly-to-point`, body)
   return resp.data
 }
 
 // 停止飞向目标点
-export async function deleteFlyToPoint (sn: string): Promise<IWorkspaceResponse<null>> {
+export async function deleteFlyToPoint(sn: string): Promise<IWorkspaceResponse<null>> {
   const resp = await request.delete(`${API_PREFIX}/devices/${sn}/jobs/fly-to-point`)
   return resp.data
 }
 
-export interface PostTakeoffToPointBody{
+export interface PostTakeoffToPointBody {
   target_height: number;
   target_latitude: number;
   target_longitude: number;
@@ -68,7 +66,7 @@ export interface PostTakeoffToPointBody{
 }
 
 // 一键起飞
-export async function postTakeoffToPoint (sn: string, body: PostTakeoffToPointBody): Promise<IWorkspaceResponse<null>> {
+export async function postTakeoffToPoint(sn: string, body: PostTakeoffToPointBody): Promise<IWorkspaceResponse<null>> {
   const resp = await request.post(`${API_PREFIX}/devices/${sn}/jobs/takeoff-to-point`, body)
   return resp.data
 }

+ 5 - 7
Web/src/api/drone-control/payload.ts

@@ -1,17 +1,15 @@
 import request, { IWorkspaceResponse } from '/@/api/http/request'
 import { CameraType, CameraMode } from '/@/types/live-stream'
 import { GimbalResetMode } from '/@/types/drone-control'
-// import { ELocalStorageKey } from '/@/types'
 
 const API_PREFIX = '/control/api/v1'
-// const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '
 
 export interface PostPayloadAuthBody {
   payload_index: string
 }
 
 // 获取负载控制权
-export async function postPayloadAuth (sn: string, body: PostPayloadAuthBody): Promise<IWorkspaceResponse<null>> {
+export async function postPayloadAuth(sn: string, body: PostPayloadAuthBody): Promise<IWorkspaceResponse<null>> {
   const resp = await request.post(`${API_PREFIX}/devices/${sn}/authority/payload`, body)
   return resp.data
 }
@@ -50,12 +48,12 @@ export interface PostCameraFocalLengthBody {
   zoom_factor: number
 }
 
-export interface PostGimbalResetBody{
+export interface PostGimbalResetBody {
   payload_index: string,
   reset_mode: GimbalResetMode,
 }
 
-export interface PostCameraAimBody{
+export interface PostCameraAimBody {
   payload_index: string,
   camera_type: CameraType,
   locked: boolean,
@@ -87,7 +85,7 @@ export type PostPayloadCommandsBody = {
 }
 
 // 发送负载名称
-export async function postPayloadCommands (sn: string, body: PostPayloadCommandsBody): Promise<IWorkspaceResponse<null>> {
+export async function postPayloadCommands(sn: string, body: PostPayloadCommandsBody): Promise<IWorkspaceResponse<null>> {
   const resp = await request.post(`${API_PREFIX}/devices/${sn}/payload/commands`, body)
   return resp.data
-}
+}

+ 13 - 15
Web/src/api/flight-area/index.ts

@@ -1,8 +1,8 @@
 import request from '../http/request'
 import { IWorkspaceResponse } from '../http/type'
 import { EFlightAreaType, ESyncStatus, FlightAreaContent } from './../../types/flight-area'
-import { ELocalStorageKey } from '/@/types/enums'
 import { GeojsonCoordinate } from '/@/utils/genjson'
+import { getWorkspaceId } from '/@/utils/index';
 
 export interface GetFlightArea {
   area_id: string,
@@ -48,34 +48,32 @@ export interface GetDeviceStatus {
 
 const MAP_API_PREFIX = '/map/api/v1'
 
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
-
-export async function getFlightAreaList (): Promise<IWorkspaceResponse<GetFlightArea[]>> {
-  const resp = await request.get(`${MAP_API_PREFIX}/workspaces/${workspaceId}/flight-areas`)
+export async function getFlightAreaList(): Promise<IWorkspaceResponse<GetFlightArea[]>> {
+  const resp = await request.get(`${MAP_API_PREFIX}/workspaces/${getWorkspaceId()}/flight-areas`)
   return resp.data
 }
 
-export async function changeFlightAreaStatus (area_id: string, status: boolean): Promise<IWorkspaceResponse<any>> {
-  const resp = await request.put(`${MAP_API_PREFIX}/workspaces/${workspaceId}/flight-area/${area_id}`, { status })
+export async function changeFlightAreaStatus(area_id: string, status: boolean): Promise<IWorkspaceResponse<any>> {
+  const resp = await request.put(`${MAP_API_PREFIX}/workspaces/${getWorkspaceId()}/flight-area/${area_id}`, { status })
   return resp.data
 }
 
-export async function saveFlightArea (body: PostFlightAreaBody): Promise<IWorkspaceResponse<any>> {
-  const resp = await request.post(`${MAP_API_PREFIX}/workspaces/${workspaceId}/flight-area`, body)
+export async function saveFlightArea(body: PostFlightAreaBody): Promise<IWorkspaceResponse<any>> {
+  const resp = await request.post(`${MAP_API_PREFIX}/workspaces/${getWorkspaceId()}/flight-area`, body)
   return resp.data
 }
 
-export async function deleteFlightArea (area_id: string): Promise<IWorkspaceResponse<any>> {
-  const resp = await request.delete(`${MAP_API_PREFIX}/workspaces/${workspaceId}/flight-area/${area_id}`)
+export async function deleteFlightArea(area_id: string): Promise<IWorkspaceResponse<any>> {
+  const resp = await request.delete(`${MAP_API_PREFIX}/workspaces/${getWorkspaceId()}/flight-area/${area_id}`)
   return resp.data
 }
 
-export async function syncFlightArea (device_sn: string[]): Promise<IWorkspaceResponse<any>> {
-  const resp = await request.post(`${MAP_API_PREFIX}/workspaces/${workspaceId}/flight-area/sync`, { device_sn })
+export async function syncFlightArea(device_sn: string[]): Promise<IWorkspaceResponse<any>> {
+  const resp = await request.post(`${MAP_API_PREFIX}/workspaces/${getWorkspaceId()}/flight-area/sync`, { device_sn })
   return resp.data
 }
 
-export async function getDeviceStatus (): Promise<IWorkspaceResponse<GetDeviceStatus[]>> {
-  const resp = await request.get(`${MAP_API_PREFIX}/workspaces/${workspaceId}/device-status`)
+export async function getDeviceStatus(): Promise<IWorkspaceResponse<GetDeviceStatus[]>> {
+  const resp = await request.get(`${MAP_API_PREFIX}/workspaces/${getWorkspaceId()}/device-status`)
   return resp.data
 }

+ 10 - 19
Web/src/api/layer.ts

@@ -1,53 +1,44 @@
-import { ELocalStorageKey } from '../types/enums'
 import request, { IWorkspaceResponse } from '/@/api/http/request'
 import { mapLayers } from '/@/constants/mock-layers'
 import { elementGroupsReq, PostElementsBody, PutElementsBody } from '/@/types/mapLayer'
+import { getWorkspaceId } from '/@/utils/index';
+
 const PREFIX = '/map/api/v1'
-const workspace_id = localStorage.getItem(ELocalStorageKey.WorkspaceId)
+
 type UnknownResponse = Promise<IWorkspaceResponse<unknown>>
-// get elements group
-// export const getLayers = async (reqParams: elementGroupsReq): UnknownResponse => {
-//   const url = `${PREFIX}/workspaces/${workspace_id}/element_groups`
-//   const result = await request.get(url, {
-//     params: {
-//       group_id: reqParams.groupId,
-//       is_distributed: reqParams.isDistributed
-//     },
-//   })
-//   return result.data
-// }
+
 export const getLayers = async (reqParams: elementGroupsReq): UnknownResponse => {
   return mapLayers
 }
 
 // Get elements groups request
 export const getElementGroupsReq = async (body: elementGroupsReq): Promise<IWorkspaceResponse<any>> => {
-  const url = `${PREFIX}/workspaces/` + workspace_id + '/element-groups'
+  const url = `${PREFIX}/workspaces/` + getWorkspaceId() + '/element-groups'
   const result = await request.get(url, body)
   return result.data
 }
 // add element
 export const postElementsReq = async (pid: string, body: PostElementsBody): Promise<IWorkspaceResponse<{ id: string }>> => {
-  const url = `${PREFIX}/workspaces/` + workspace_id + `/element-groups/${pid}/elements`
+  const url = `${PREFIX}/workspaces/` + getWorkspaceId() + `/element-groups/${pid}/elements`
   const result = await request.post(url, body)
   return result.data
 }
 // Update map element request
 export const updateElementsReq = async (id: string, body: PutElementsBody): Promise<IWorkspaceResponse<{ id: string }>> => {
-  const url = `${PREFIX}/workspaces/` + workspace_id + `/elements/${id}`
+  const url = `${PREFIX}/workspaces/` + getWorkspaceId() + `/elements/${id}`
   const result = await request.put(url, body)
   return result.data
 }
 // Delete map element
 export const deleteElementReq = async (id: string, body: {}): Promise<any> => {
-  const url = `${PREFIX}/workspaces/` + workspace_id + `/elements/${id}`
+  const url = `${PREFIX}/workspaces/` + getWorkspaceId() + `/elements/${id}`
   const result = await request.delete(url, body)
   return result.data
 }
 
 // Delete layer elements
 export const deleteLayerEleReq = async (id: string, body: {}): Promise<any> => {
-  const url = `${PREFIX}/workspaces/` + workspace_id + `/element-groups/${id}/elements`
+  const url = `${PREFIX}/workspaces/` + getWorkspaceId() + `/element-groups/${id}/elements`
   const result = await request.delete(url, body)
   return result.data
-}
+}

+ 16 - 17
Web/src/components/MediaPanel.vue

@@ -6,8 +6,8 @@
         :pagination="paginationProp" :scroll="{ x: '100%', y: 600 }" @change="refreshData">
         <template v-for="col in ['name', 'path']" #[col]="{ text }" :key="col">
           <a-tooltip :title="text">
-              <a v-if="col === 'name'">{{ text }}</a>
-              <span v-else>{{ text }}</span>
+            <a v-if="col === 'name'">{{ text }}</a>
+            <span v-else>{{ text }}</span>
           </a-tooltip>
         </template>
         <template #original="{ text }">
@@ -15,7 +15,9 @@
         </template>
         <template #action="{ record }">
           <a-tooltip title="download">
-            <a class="fz18" @click="downloadMedia(record)"><DownloadOutlined /></a>
+            <a class="fz18" @click="downloadMedia(record)">
+              <DownloadOutlined />
+            </a>
           </a-tooltip>
         </template>
       </a-table>
@@ -24,17 +26,15 @@
 </template>
 
 <script setup lang="ts">
+import { onMounted, reactive, ref } from 'vue'
+import { Pagination } from 'ant-design-vue'
 import { TableState } from 'ant-design-vue/lib/table/interface'
-import { onMounted, reactive,ref} from 'vue'
 import { IPage } from '../api/http/type'
-import { ELocalStorageKey } from '../types/enums'
 import { downloadFile } from '../utils/common'
 import { downloadMediaFile, getMediaFiles } from '/@/api/media'
 import { DownloadOutlined } from '@ant-design/icons-vue'
-import { message, Pagination } from 'ant-design-vue'
-import { load } from '@amap/amap-jsapi-loader'
+import { getWorkspaceId } from '/@/utils/index';
 
-const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
 const loading = ref(false)
 
 const columns = [
@@ -50,10 +50,6 @@ const columns = [
     ellipsis: true,
     slots: { customRender: 'path' }
   },
-  // {
-  //   title: 'FileSize',
-  //   dataIndex: 'size',
-  // },
   {
     title: '设备',
     dataIndex: 'drone'
@@ -111,8 +107,8 @@ onMounted(() => {
   getFiles()
 })
 
-function getFiles () {
-  getMediaFiles(workspaceId, body).then(res => {
+function getFiles() {
+  getMediaFiles(getWorkspaceId(), body).then(res => {
     mediaData.data = res.data.list
     paginationProp.total = res.data.pagination.total
     paginationProp.current = res.data.pagination.page
@@ -120,15 +116,15 @@ function getFiles () {
   })
 }
 
-function refreshData (page: Pagination) {
+function refreshData(page: Pagination) {
   body.page = page?.current!
   body.page_size = page?.pageSize!
   getFiles()
 }
 
-function downloadMedia (media: MediaFile) {
+function downloadMedia(media: MediaFile) {
   loading.value = true
-  downloadMediaFile(workspaceId, media.file_id).then(res => {
+  downloadMediaFile(getWorkspaceId(), media.file_id).then(res => {
     if (!res) {
       return
     }
@@ -145,15 +141,18 @@ function downloadMedia (media: MediaFile) {
 .media-panel-wrapper {
   width: 100%;
   padding: 16px;
+
   .media-table {
     background: #fff;
     margin-top: 10px;
   }
+
   .action-area {
     color: $primary;
     cursor: pointer;
   }
 }
+
 .header {
   width: 100%;
   height: 60px;

+ 27 - 32
Web/src/components/devices/DeviceFirmwareStatus.vue

@@ -1,45 +1,38 @@
 <template>
-<div>
-  <span class="status-tag pointer">
-    <a-popconfirm
-      :title="getTitle()"
-      ok-text="Yes"
-      cancel-text="No"
-      placement="left"
-      @confirm="onFirmwareStatusClick(firmware)"
-    >
-      <a-tag :color="firmware.firmware_status ? commonColor.NORMAL : commonColor.FAIL"
+  <div>
+    <span class="status-tag pointer">
+      <a-popconfirm :title="getTitle()" ok-text="Yes" cancel-text="No" placement="left"
+        @confirm="onFirmwareStatusClick(firmware)">
+        <a-tag :color="firmware.firmware_status ? commonColor.NORMAL : commonColor.FAIL"
           :class="firmware.firmware_status ? 'border-corner ' : 'status-disable border-corner'">
-        {{ getText(firmware.firmware_status) }}
-      </a-tag>
-    </a-popconfirm>
-  </span>
-</div>
+          {{ getText(firmware.firmware_status) }}
+        </a-tag>
+      </a-popconfirm>
+    </span>
+  </div>
 </template>
 
 <script lang="ts" setup>
-import { defineProps, defineEmits, ref, watch, computed } from 'vue'
+import { defineProps } from 'vue'
 import { changeFirmareStatus } from '/@/api/manage'
-import { ELocalStorageKey } from '/@/types'
 import { Firmware, FirmwareStatusEnum } from '/@/types/device-firmware'
 import { commonColor } from '/@/utils/color'
+import { getWorkspaceId } from '/@/utils/index'
 
 const props = defineProps<{
   firmware: Firmware
 }>()
 
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
-
-function getTitle () {
+function getTitle() {
   return `Are you sure to set this firmware to ${getText(!props.firmware.firmware_status)}?`
 }
 
-function getText (status: boolean) {
+function getText(status: boolean) {
   return status ? FirmwareStatusEnum.TRUE : FirmwareStatusEnum.FALSE
 }
 
-function onFirmwareStatusClick (record: Firmware) {
-  changeFirmareStatus(workspaceId, record.firmware_id, { status: !record.firmware_status }).then((res) => {
+function onFirmwareStatusClick(record: Firmware) {
+  changeFirmareStatus(getWorkspaceId(), record.firmware_id, { status: !record.firmware_status }).then((res) => {
     if (res.code === 0) {
       record.firmware_status = !record.firmware_status
     }
@@ -49,13 +42,15 @@ function onFirmwareStatusClick (record: Firmware) {
 </script>
 
 <style lang="scss" scoped>
-  .status-disable{
-    opacity: 0.4;
-  }
-  .border-corner {
-    border-radius: 3px;
-  }
-  .pointer {
-    cursor: pointer;
-  }
+.status-disable {
+  opacity: 0.4;
+}
+
+.border-corner {
+  border-radius: 3px;
+}
+
+.pointer {
+  cursor: pointer;
+}
 </style>

+ 8 - 5
Web/src/components/devices/device-hms/DeviceHmsDrawer.vue

@@ -58,21 +58,22 @@
 
 <!-- 暂时只抽取该组件 -->
 <script lang="ts" setup>
-import { watchEffect, reactive, ref, defineProps, defineEmits, watch } from 'vue'
+import { reactive, ref, defineProps, defineEmits, watch } from 'vue'
 import { getDeviceHms, HmsQueryBody } from '/@/api/manage'
-import moment from 'moment'
 import { ColumnProps, TableState } from 'ant-design-vue/lib/table/interface'
 import { Device, DeviceHms } from '/@/types/device'
 import { IPage } from '/@/api/http/type'
-import { EDeviceTypeName, EHmsLevel, ELocalStorageKey } from '/@/types'
+import { EDeviceTypeName, EHmsLevel } from '/@/types'
+import { getWorkspaceId } from '/@/utils/index'
+import moment from 'moment'
 
 const props = defineProps<{
   visible: boolean,
   device: null | Device,
 }>()
+
 const emit = defineEmits(['update:visible', 'ok', 'cancel'])
 
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
 // 健康状态
 const sVisible = ref(false)
 
@@ -206,7 +207,7 @@ const time = ref([moment(param.begin_time), moment(param.end_time)])
 
 function getHms() {
   loading.value = true
-  getDeviceHms(param, workspaceId, getPaginationBody())
+  getDeviceHms(param, getWorkspaceId(), getPaginationBody())
     .then(res => {
       hmsPaginationProp.total = res.data.pagination.total
       hmsPaginationProp.current = res.data.pagination.page
@@ -249,3 +250,5 @@ function onLevelSelect(val: number) {
   getHms()
 }
 </script>
+
+<style lang="scss" scoped></style>

+ 32 - 15
Web/src/components/flight-area/FlightAreaDevicePanel.vue

@@ -2,21 +2,27 @@
   <div class="flight-area-device-panel">
     <Title title="Choose Synchronous Devices">
       <div style="position: absolute; right: 10px;">
-        <a style="color: white;" @click="closePanel"><CloseOutlined /></a>
+        <a style="color: white;" @click="closePanel">
+          <CloseOutlined />
+        </a>
       </div>
     </Title>
     <div class="scrollbar">
       <div id="data" v-if="data.length !== 0">
         <div v-for="dock in data" :key="dock.device_sn">
-          <div class="pt5 panel flex-row" @click="selectDock(dock)" :style="{opacity: selectedDocksMap[dock.device_sn] ? 1 : 0.5 }">
+          <div class="pt5 panel flex-row" @click="selectDock(dock)"
+            :style="{ opacity: selectedDocksMap[dock.device_sn] ? 1 : 0.5 }">
             <div style="width: 88%">
               <div class="title">
-                <RobotFilled class="fz20"/>
+                <RobotFilled class="fz20" />
                 <a-tooltip :title="dock.nickname">
-                  <div class="pr10 ml5" style="width: 120px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;">{{ dock.nickname }}</div>
+                  <div class="pr10 ml5"
+                    style="width: 120px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;">{{
+                      dock.nickname }}</div>
                 </a-tooltip>
               </div>
-              <div class="ml10 mr10 pr5 pl5 flex-align-center flex-row flex-justify-between" style="background: #595959;">
+              <div class="ml10 mr10 pr5 pl5 flex-align-center flex-row flex-justify-between"
+                style="background: #595959;">
                 <div>
                   Custom Flight Area
                 </div>
@@ -26,19 +32,21 @@
                       <ApiOutlined />
                     </a-tooltip>
                   </div>
-                  <div v-else-if="deviceStatusMap[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.SYNCHRONIZED">
+                  <div
+                    v-else-if="deviceStatusMap[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.SYNCHRONIZED">
                     <a-tooltip title="Data synced">
-                      <CheckCircleTwoTone twoToneColor="#28d445"/>
+                      <CheckCircleTwoTone twoToneColor="#28d445" />
                     </a-tooltip>
                   </div>
                   <div v-else-if="deviceStatusMap[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.SYNCHRONIZING
-                                  || deviceStatusMap[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.WAIT_SYNC">
+                    || deviceStatusMap[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.WAIT_SYNC">
                     <a-tooltip title="To be synced">
                       <SyncOutlined spin />
                     </a-tooltip>
                   </div>
                   <div v-else>
-                    <a-tooltip :title="deviceStatusMap[dock.device_sn]?.flight_area_status?.sync_msg || 'No synchronization'">
+                    <a-tooltip
+                      :title="deviceStatusMap[dock.device_sn]?.flight_area_status?.sync_msg || 'No synchronization'">
                       <ExclamationCircleTwoTone twoToneColor="#e70102" />
                     </a-tooltip>
                   </div>
@@ -67,22 +75,25 @@
 </template>
 
 <script lang="ts" setup>
+import { defineEmits, onMounted, ref, defineProps, computed } from 'vue'
+import { message } from 'ant-design-vue'
 import { CloseOutlined, RobotFilled, CheckOutlined, ApiOutlined, CheckCircleTwoTone, SyncOutlined, ExclamationCircleTwoTone } from '@ant-design/icons-vue'
 import Title from '/@/components/workspace/Title.vue'
-import { defineEmits, onMounted, ref, defineProps, computed } from 'vue'
 import { getBindingDevices } from '/@/api/manage'
-import { EDeviceTypeName, ELocalStorageKey } from '/@/types'
+import { EDeviceTypeName } from '/@/types'
 import { IPage } from '/@/api/http/type'
 import { Device } from '/@/types/device'
 import DividerLine from '../workspace/DividerLine.vue'
-import { message } from 'ant-design-vue'
 import { GetDeviceStatus, syncFlightArea } from '/@/api/flight-area'
 import { ESyncStatus } from '/@/types/flight-area'
+import { getWorkspaceId } from '/@/utils/index'
 
 const props = defineProps<{
   data: GetDeviceStatus[]
 }>()
+
 const emit = defineEmits(['closePanel'])
+
 const closePanel = () => {
   emit('closePanel', false)
 }
@@ -93,17 +104,19 @@ const deviceStatusMap = computed(() => props.data.reduce((obj: Record<string, Ge
   obj[val.device_sn] = val
   return obj
 }, {} as Record<string, GetDeviceStatus>))
-const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
+
 const body: IPage = {
   page: 1,
   total: 0,
   page_size: 10,
 }
+
 const data = ref<Device[]>([])
+
 const selectedDocksMap = ref<Record<string, boolean>>({})
 
 const getDocks = async () => {
-  await getBindingDevices(workspaceId, body, EDeviceTypeName.Dock).then(res => {
+  await getBindingDevices(getWorkspaceId(), body, EDeviceTypeName.Dock).then(res => {
     if (res.code !== 0) {
       return
     }
@@ -120,7 +133,7 @@ const selectDock = (dock: Device) => {
     return
   }
   if (deviceStatusMap.value[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.SYNCHRONIZING ||
-      deviceStatusMap.value[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.WAIT_SYNC) {
+    deviceStatusMap.value[dock.device_sn]?.flight_area_status?.sync_status === ESyncStatus.WAIT_SYNC) {
     message.info('The dock is synchronizing.')
     return
   }
@@ -175,20 +188,24 @@ const syncDeviceFlightArea = () => {
   z-index: 1000;
   color: white;
   background: #282828;
+
   .footer {
     position: absolute;
     width: 100%;
     bottom: 10px;
     padding: 10px;
+
     button {
       width: 45%;
       border: 0;
     }
   }
+
   .scrollbar {
     overflow-y: auto;
     height: calc(100vh - 150px);
   }
+
   .box {
     font-size: 22px;
     line-height: 60px;

+ 1 - 1
Web/src/components/flight-area/FlightAreaItem.vue

@@ -86,4 +86,4 @@ const clickLocation = () => {
   opacity: 50%;
 }
 
-</style>
+</style>

+ 5 - 6
Web/src/components/task/CreatePlan.vue

@@ -159,21 +159,20 @@
 
 <script lang="ts" setup>
 import { computed, reactive, ref } from 'vue'
-import { ELocalStorageKey, ERouterName } from '/@/types'
+import { ERouterName } from '/@/types'
 import { useMyStore } from '/@/store'
-import { WaylineType, WaylineFile } from '/@/types/wayline'
+import { WaylineFile } from '/@/types/wayline'
 import { Device, DEVICE_NAME } from '/@/types/device'
 import { createPlan, CreatePlan } from '/@/api/wayline'
 import { getRoot } from '/@/root'
 import { TaskType, OutOfControlActionOptions, OutOfControlAction, TaskTypeOptions } from '/@/types/task'
-import moment from 'moment';
 import { RuleObject } from 'ant-design-vue/es/form/interface'
+import { getWorkspaceId } from '/@/utils/index'
+import moment from 'moment';
 
 const root = getRoot()
 const store = useMyStore()
 
-const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
-
 const wayline = computed<WaylineFile>(() => {
   return store.state.waylineInfo
 })
@@ -295,7 +294,7 @@ function onSubmit() {
     if (wayline.value && wayline.value.template_types && wayline.value.template_types.length > 0) {
       createPlanBody.wayline_type = wayline.value.template_types[0]
     }
-    createPlan(workspaceId, createPlanBody)
+    createPlan(getWorkspaceId(), createPlanBody)
       .then(res => {
         disabled.value = false
       }).finally(() => {

+ 8 - 12
Web/src/components/task/TaskPanel.vue

@@ -86,20 +86,16 @@
 <script setup lang="ts">
 import { message } from 'ant-design-vue'
 import { TableState } from 'ant-design-vue/lib/table/interface'
-import { onMounted, reactive} from 'vue'
+import { onMounted, reactive } from 'vue'
 import { IPage } from '/@/api/http/type'
 import { deleteTask, updateTaskStatus, UpdateTaskStatus, getWaylineJobs, Task, uploadMediaFileNow } from '/@/api/wayline'
-import { useMyStore } from '/@/store'
-import { ELocalStorageKey } from '/@/types/enums'
 import { useFormatTask } from './use-format-task'
 import { TaskStatus, TaskProgressInfo, TaskProgressStatus, TaskProgressWsStatusMap, MediaStatus, MediaStatusProgressInfo, TaskMediaHighestPriorityProgressInfo } from '/@/types/task'
 import { useTaskWsEvent } from './use-task-ws-event'
 import { getErrorMessage } from '/@/utils/error-code/index'
 import { commonColor } from '/@/utils/color'
 import { ExclamationCircleOutlined, UploadOutlined } from '@ant-design/icons-vue'
-
-const store = useMyStore()
-const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
+import { getWorkspaceId } from '/@/utils/index'
 
 const body: IPage = {
   page: 1,
@@ -249,7 +245,7 @@ onMounted(() => {
 })
 
 function getPlans() {
-  getWaylineJobs(workspaceId, body).then(res => {
+  getWaylineJobs(getWorkspaceId(), body).then(res => {
     if (res.code !== 0) {
       return
     }
@@ -267,7 +263,7 @@ function refreshData(page: Pagination) {
 
 // 删除任务
 async function onDeleteTask(jobId: string) {
-  const { code } = await deleteTask(workspaceId, {
+  const { code } = await deleteTask(getWorkspaceId(), {
     job_id: jobId
   })
   if (code === 0) {
@@ -278,7 +274,7 @@ async function onDeleteTask(jobId: string) {
 
 // 挂起任务
 async function onSuspendTask(jobId: string) {
-  const { code } = await updateTaskStatus(workspaceId, {
+  const { code } = await updateTaskStatus(getWorkspaceId(), {
     job_id: jobId,
     status: UpdateTaskStatus.Suspend
   })
@@ -290,7 +286,7 @@ async function onSuspendTask(jobId: string) {
 
 // 解除挂起任务
 async function onResumeTask(jobId: string) {
-  const { code } = await updateTaskStatus(workspaceId, {
+  const { code } = await updateTaskStatus(getWorkspaceId(), {
     job_id: jobId,
     status: UpdateTaskStatus.Resume
   })
@@ -302,7 +298,7 @@ async function onResumeTask(jobId: string) {
 
 // 立即上传媒体
 async function onUploadMediaFileNow(jobId: string) {
-  const { code } = await uploadMediaFileNow(workspaceId, jobId)
+  const { code } = await uploadMediaFileNow(getWorkspaceId(), jobId)
   if (code === 0) {
     message.success('Upload Media File successfully')
     getPlans()
@@ -348,4 +344,4 @@ async function onUploadMediaFileNow(jobId: string) {
   text-align: start;
   color: #000;
 }
-</style>
+</style>

+ 3 - 2
Web/src/hooks/use-g-map-tsa.ts

@@ -1,11 +1,12 @@
 import store from '/@/store'
 import { getRoot } from '/@/root'
-import { ELocalStorageKey, EDeviceTypeName } from '/@/types'
+import { EDeviceTypeName } from '/@/types'
 import { getDeviceBySn } from '/@/api/manage'
 import { message } from 'ant-design-vue'
 import dockIcon from '/@/assets/icons/dock.png'
 import rcIcon from '/@/assets/icons/rc.png'
 import droneIcon from '/@/assets/icons/drone.png'
+import { getWorkspaceId } from '/@/utils/index'
 
 export function deviceTsaUpdate() {
   const root = getRoot()
@@ -75,7 +76,7 @@ export function deviceTsaUpdate() {
   }
 
   function addMarker(sn: string, lng?: number, lat?: number) {
-    getDeviceBySn(localStorage.getItem(ELocalStorageKey.WorkspaceId)!, sn)
+    getDeviceBySn(getWorkspaceId(), sn)
       .then(data => {
         if (data.code !== 0) {
           message.error(data.message)

+ 24 - 19
Web/src/pages/page-pilot/pilot-bind.vue

@@ -1,33 +1,36 @@
 <template>
   <a-layout class="flex-display" style="height: 100vh; background-color: white;">
-  <div class="height100 width100 flex-column flex-justify-start flex-align-start">
-    <a-row class="pt20 pl20" style="height: 45px; width: 100vw" align="middle">
-      <a-col :span="1">
-        <span style="color: #1fa3f6" class="fz26"><SendOutlined rotate="90" /></span>
-      </a-col>
-      <a-col :span="20">
-        <span class="fz20 pl5">{{ drone.data.model }}</span>
-      </a-col>
-      <a-col :span="3">
-        <span class="fz16" v-if="drone.data.bound_status" style="color: #737373">Bound</span>
-        <a-button type="primary" @click="onBindDevice" v-else>Bind</a-button>
-      </a-col>
-    </a-row>
-  </div>
+    <div class="height100 width100 flex-column flex-justify-start flex-align-start">
+      <a-row class="pt20 pl20" style="height: 45px; width: 100vw" align="middle">
+        <a-col :span="1">
+          <span style="color: #1fa3f6" class="fz26">
+            <SendOutlined rotate="90" />
+          </span>
+        </a-col>
+        <a-col :span="20">
+          <span class="fz20 pl5">{{ drone.data.model }}</span>
+        </a-col>
+        <a-col :span="3">
+          <span class="fz16" v-if="drone.data.bound_status" style="color: #737373">Bound</span>
+          <a-button type="primary" @click="onBindDevice" v-else>Bind</a-button>
+        </a-col>
+      </a-row>
+    </div>
   </a-layout>
 </template>
 
 <script lang="ts" setup>
-import { SendOutlined } from '@ant-design/icons-vue'
+import { reactive } from 'vue'
 import { message } from 'ant-design-vue'
-import { onMounted, reactive, ref } from 'vue'
+import { SendOutlined } from '@ant-design/icons-vue'
 import { BindBody, bindDevice } from '/@/api/manage'
-import apiPilot from '/@/api/pilot-bridge'
 import { getRoot } from '/@/root'
 import { ELocalStorageKey } from '/@/types'
 import { DeviceStatus } from '/@/types/device'
+import { getWorkspaceId } from '/@/utils'
 
 const root = getRoot()
+
 interface DeviceStatusData {
   data: DeviceStatus
 }
@@ -35,11 +38,11 @@ const drone = reactive<DeviceStatusData>({
   data: JSON.parse(localStorage.getItem(ELocalStorageKey.Device)!)
 })
 
-function onBindDevice () {
+function onBindDevice() {
   const bindParam: BindBody = {
     device_sn: drone.data.sn,
     user_id: localStorage.getItem(ELocalStorageKey.UserId)!,
-    workspace_id: localStorage.getItem(ELocalStorageKey.WorkspaceId)!
+    workspace_id: getWorkspaceId()
   }
   bindDevice(bindParam).then(bindRes => {
     if (bindRes.code !== 0) {
@@ -52,3 +55,5 @@ function onBindDevice () {
   })
 }
 </script>
+
+<style lang="scss" scoped></style>

+ 4 - 3
Web/src/pages/page-pilot/pilot-home.vue

@@ -133,11 +133,12 @@ import apiPilot, { ApiParam, MapParam, ThingParam, WsParam } from '/@/api/pilot-
 import { getRoot } from '/@/root'
 import { EBizCode, EComponentName, EDownloadOwner, ELocalStorageKey, ERouterName, EStatusValue } from '/@/types'
 import cloudapi from '/@/assets/icons/cloudapi.png'
-import { SwapOutlined, RightOutlined, CloudSyncOutlined, SyncOutlined } from '@ant-design/icons-vue'
+import { RightOutlined, CloudSyncOutlined, SyncOutlined } from '@ant-design/icons-vue'
 import { useMyStore } from '/@/store'
 import { DeviceStatus } from '/@/types/device'
 import { useConnectWebSocket } from '/@/hooks/use-connect-websocket'
 import { apis } from "/@/api/custom/index";
+import { getWorkspaceId } from '/@/utils'
 
 const root = getRoot()
 const gatewayState = ref<boolean>(localStorage.getItem(ELocalStorageKey.GatewayOnline) === 'true')
@@ -151,7 +152,7 @@ const mediaState = ref(EStatusValue.DISCONNECT)
 const waylineState = ref(EStatusValue.DISCONNECT)
 const workspaceName = ref<string>(localStorage.getItem(ELocalStorageKey.WorkspaceName)!)
 const username = ref(localStorage.getItem(ELocalStorageKey.Username)!)
-const wsId = ref(localStorage.getItem(ELocalStorageKey.WorkspaceId)!)
+const wsId = ref(getWorkspaceId())
 const components = apiPilot.init()
 const exitVisible = ref(false)
 const drawerVisible = ref(false)
@@ -574,4 +575,4 @@ function getDeviceInfo() {
   left: 15vw;
   line-height: 10vh;
 }
-</style>
+</style>

+ 1 - 1
Web/src/pages/page-pilot/pilot-index.vue

@@ -132,4 +132,4 @@ function verifyLicense() {
 .logo {
   color: $primary;
 }
-</style>
+</style>

+ 1 - 2
Web/src/pages/page-pilot/pilot-liveshare.vue

@@ -313,5 +313,4 @@ const onStop = () => {
 }
 </script>
 
-<style lang="scss" scoped>
-// @import '/@/styles/index.scss';</style>
+<style lang="scss" scoped></style>

+ 1 - 2
Web/src/pages/page-pilot/pilot-media.vue

@@ -74,5 +74,4 @@ onMounted(() => {
 })
 </script>
 
-<style lang="scss" scoped>
-// @import '/@/styles/index.scss';</style>
+<style lang="scss" scoped></style>

+ 5 - 6
Web/src/pages/page-web/projects/Firmwares.vue

@@ -79,17 +79,17 @@
   </div>
 </template>
 <script lang="ts" setup>
+import { onMounted, reactive, ref } from 'vue'
 import { message, notification } from 'ant-design-vue'
+import { UploadOutlined } from '@ant-design/icons-vue'
 import { TableState } from 'ant-design-vue/lib/table/interface'
-import { onMounted, reactive, ref } from 'vue'
 import { IPage } from '/@/api/http/type'
 import { getFirmwares, importFirmareFile } from '/@/api/manage'
 import DeviceFirmwareStatus from '/@/components/devices/DeviceFirmwareStatus.vue'
-import { ELocalStorageKey } from '/@/types'
-import { UploadOutlined } from '@ant-design/icons-vue'
 import { Firmware, FirmwareQueryParam, FirmwareStatusEnum, DeviceNameEnum, FirmwareUploadParam } from '/@/types/device-firmware'
 import { commonColor } from '/@/utils/color'
 import { bytesToSize } from '/@/utils/bytes'
+import { getWorkspaceId } from '/@/utils'
 import moment from 'moment'
 
 interface FirmwareData {
@@ -129,7 +129,6 @@ const pageParam: IPage = {
   total: 0,
   page_size: 50
 }
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
 
 const param = reactive<FirmwareQueryParam>({
   product_version: '',
@@ -152,7 +151,7 @@ function refreshData(page: Pagination) {
 }
 
 function getAllFirmwares(page: IPage) {
-  getFirmwares(workspaceId, page, param).then(res => {
+  getFirmwares(getWorkspaceId(), page, param).then(res => {
     const firmwareList: Firmware[] = res.data.list
     data.firmware = firmwareList
     paginationProp.total = res.data.pagination.total
@@ -232,7 +231,7 @@ const uploadFile = async () => {
       description: `[${file.name}] is uploading... `,
       duration: null
     })
-    importFirmareFile(workspaceId, fileData).then((res) => {
+    importFirmareFile(getWorkspaceId(), fileData).then((res) => {
       if (res.code === 0) {
         notification.success({
           message: `Uploaded  ${moment().format()}`,

+ 3 - 3
Web/src/pages/page-web/projects/dock.vue

@@ -36,12 +36,13 @@
 <script lang="ts" setup>
 import { onMounted, reactive, ref } from 'vue'
 import { deleteWaylineFile, downloadWaylineFile, getWaylineFiles } from '/@/api/wayline'
-import { EDeviceTypeName, ELocalStorageKey } from '/@/types'
+import { EDeviceTypeName } from '/@/types'
 import { RocketOutlined } from '@ant-design/icons-vue'
 import { Device } from '/@/types/device'
 import { useMyStore } from '/@/store'
 import { getBindingDevices } from '/@/api/manage'
 import { IPage } from '/@/api/http/type'
+import { getWorkspaceId } from '/@/utils'
 
 const store = useMyStore()
 
@@ -49,7 +50,6 @@ const docksData = reactive({
   data: [] as Device[]
 })
 
-const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
 const scorllHeight = ref()
 const canRefresh = ref(true)
 
@@ -80,7 +80,7 @@ async function getDocks() {
   }
   canRefresh.value = false
 
-  await getBindingDevices(workspaceId, body, EDeviceTypeName.Dock).then(res => {
+  await getBindingDevices(getWorkspaceId(), body, EDeviceTypeName.Dock).then(res => {
     if (res.code !== 0) {
       return
     }

+ 2 - 2
Web/src/pages/page-web/projects/media/detail/components/FileInfo.vue

@@ -153,8 +153,8 @@ import Panoramic from '/@/components/panoramic/index.vue';
 import { useGMapManage } from '/@/hooks/use-g-map';
 import { apis } from '/@/api/custom';
 import { downloadFile } from '/@/utils/common';
-import { ELocalStorageKey } from '/@/types';
 import { downloadMediaFile } from '/@/api/media';
+import { getWorkspaceId } from '/@/utils/index'
 
 interface Props {
   fileId: string,
@@ -238,7 +238,7 @@ onMounted(async () => {
 const onClickDownload = async () => {
   state.downloadLoading = true;
   try {
-    const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '';
+    const workspaceId: string = getWorkspaceId();
     const res = await downloadMediaFile(workspaceId, state.info.file_id)
     if (!res) {
       return

+ 2 - 1
Web/src/pages/page-web/projects/media/detail/components/Search.vue

@@ -67,6 +67,7 @@ import { message } from 'ant-design-vue'
 import { SearchOutlined, ReloadOutlined } from '@ant-design/icons-vue';
 import router from '/@/router';
 import { ELocalStorageKey } from '/@/types'
+import { getWorkspaceId } from '/@/utils/index'
 import moment from 'moment';
 
 interface Props {
@@ -95,7 +96,7 @@ const state = reactive({
   visible: false,
 })
 
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '';
+const workspaceId: string = getWorkspaceId();
 const dirId = router.currentRoute.value.params?.id;
 const uploadUrl = `/api/media/api/v1/files/${workspaceId}/file/${dirId}/upload`
 

+ 2 - 2
Web/src/pages/page-web/projects/media/detail/index.vue

@@ -102,7 +102,7 @@ import { apis } from '/@/api/custom';
 import router from '/@/router/index';
 import { downloadFile } from '/@/utils/common';
 import { downloadMediaFile } from '/@/api/media';
-import { ELocalStorageKey } from '/@/types';
+import { getWorkspaceId } from '/@/utils/index'
 
 interface State {
   query: any,
@@ -344,7 +344,7 @@ const onClickDelete = async (record: any) => {
 const onClickDownload = async (record: any) => {
   state.downloadLoading = true;
   try {
-    const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '';
+    const workspaceId: string = getWorkspaceId();
     const res = await downloadMediaFile(workspaceId, record.file_id)
     if (!res) {
       return

+ 2 - 4
Web/src/pages/page-web/projects/member/index.vue

@@ -27,7 +27,7 @@ import Search from './components/Search.vue';
 import AddModal from './components/AddModal.vue';
 import { getAllUsersInfo } from '/@/api/manage';
 import { apis } from '/@/api/custom/index';
-import { ELocalStorageKey } from '/@/types';
+import { getWorkspaceId } from '/@/utils/index'
 
 export interface Member {
   user_id: string,
@@ -63,12 +63,10 @@ const paginationConfig = reactive({
   total: 0
 })
 
-const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
-
 const fetchList = async (query?: any) => {
   state.listLoading = true;
   try {
-    const res = await getAllUsersInfo(workspaceId, {
+    const res = await getAllUsersInfo(getWorkspaceId(), {
       ...query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize,

+ 4 - 3
Web/src/pages/page-web/projects/tsa.vue

@@ -96,7 +96,7 @@
                           style="width: 18px; height: 16px; text-align: center;">
                           <span :style="hmsInfo[dock.sn].length > 99 ? 'font-size: 11px' : 'font-size: 12px'">{{
                             hmsInfo[dock.sn].length
-                          }}</span>
+                            }}</span>
                           <span class="fz10">{{ hmsInfo[dock.sn].length > 99 ? '+' : '' }}</span>
                         </div>
                         <a-popover trigger="click" placement="bottom" color="black"
@@ -247,13 +247,14 @@ import { useMyStore } from '/@/store'
 import { getDeviceTopo, getUnreadDeviceHms, updateDeviceHms } from '/@/api/manage'
 import { EHmsLevel, ERouterName } from '/@/types/enums'
 import { OnlineDevice, EModeCode, EDockModeCode } from '/@/types/device'
-import { EDeviceTypeName, ELocalStorageKey } from '/@/types'
+import { EDeviceTypeName } from '/@/types'
 import { getRoot } from '/@/root'
 import { wgs84togcj02 } from '/@/vendors/coordtransform'
 import { getTextByModeCode } from '/@/utils/index'
+import { getWorkspaceId } from '/@/utils/index'
 
 const store = useMyStore()
-const workspaceId = ref(localStorage.getItem(ELocalStorageKey.WorkspaceId)!)
+const workspaceId = ref(getWorkspaceId())
 const osdVisible = computed(() => store.state.osdVisible)
 const hmsVisible = new Map<string, boolean>()
 const scorllHeight = ref()

+ 6 - 6
Web/src/pages/page-web/projects/wayline.vue

@@ -90,7 +90,7 @@
 import { message } from 'ant-design-vue'
 import { onMounted, reactive, ref } from 'vue'
 import { deleteWaylineFile, downloadWaylineFile, getWaylineFiles, importKmzFile } from '/@/api/wayline'
-import { ELocalStorageKey, ERouterName } from '/@/types'
+import { ERouterName } from '/@/types'
 import { EllipsisOutlined, RocketOutlined, CameraFilled, UserOutlined, SelectOutlined } from '@ant-design/icons-vue'
 import { DEVICE_NAME } from '/@/types/device'
 import { useMyStore } from '/@/store'
@@ -98,6 +98,7 @@ import { WaylineFile } from '/@/types/wayline'
 import { downloadFile } from '/@/utils/common'
 import { IPage } from '/@/api/http/type'
 import { getRoot } from '/@/root'
+import { getWorkspaceId } from '/@/utils/index'
 
 const loading = ref(false)
 const store = useMyStore()
@@ -112,7 +113,6 @@ const waylinesData = reactive({
 })
 
 const root = getRoot()
-const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
 const deleteTip = ref(false)
 const deleteWaylineId = ref<string>('')
 const canRefresh = ref(true)
@@ -140,7 +140,7 @@ function getWaylines() {
     return
   }
   canRefresh.value = false
-  getWaylineFiles(workspaceId, {
+  getWaylineFiles(getWorkspaceId(), {
     page: pagination.page,
     page_size: pagination.page_size,
     order_by: 'update_time desc'
@@ -162,7 +162,7 @@ function showWaylineTip(waylineId: string) {
 }
 
 function deleteWayline() {
-  deleteWaylineFile(workspaceId, deleteWaylineId.value).then(res => {
+  deleteWaylineFile(getWorkspaceId(), deleteWaylineId.value).then(res => {
     if (res.code === 0) {
       message.success('Wayline file deleted')
     }
@@ -177,7 +177,7 @@ function deleteWayline() {
 
 function downloadWayline(waylineId: string, fileName: string) {
   loading.value = true
-  downloadWaylineFile(workspaceId, waylineId).then(res => {
+  downloadWaylineFile(getWorkspaceId(), waylineId).then(res => {
     if (!res) {
       return
     }
@@ -223,7 +223,7 @@ const uploadFile = async () => {
   fileList.value.forEach(async (file: FileItem) => {
     const fileData = new FormData()
     fileData.append('file', file, file.name)
-    await importKmzFile(workspaceId, fileData).then((res) => {
+    await importKmzFile(getWorkspaceId(), fileData).then((res) => {
       if (res.code === 0) {
         message.success(`${file.name} file uploaded successfully`)
         canRefresh.value = true

+ 11 - 10
Web/src/router/index.ts

@@ -105,16 +105,17 @@ const router = createRouter({
 
 const updateToken = async (data: SignLoginApiParams) => {
   try {
-    const result = await apis.signLogin(data);
-    if (result.code === 0) {
-      localStorage.setItem(ELocalStorageKey.Token, result.data.access_token)
-      localStorage.setItem(ELocalStorageKey.WorkspaceId, result.data.workspace_id)
-      localStorage.setItem(ELocalStorageKey.Username, result.data.username)
-      localStorage.setItem(ELocalStorageKey.UserId, result.data.user_id)
-      localStorage.setItem(ELocalStorageKey.Flag, EUserType.Web.toString())
-    } else {
-      message.error(result.message)
-    }
+    // const result = await apis.signLogin(data);
+    // if (result.code === 0) {
+    //   localStorage.setItem(ELocalStorageKey.Token, result.data.access_token)
+    //   localStorage.setItem(ELocalStorageKey.WorkspaceId, result.data.workspace_id)
+    //   localStorage.setItem(ELocalStorageKey.Username, result.data.username)
+    //   localStorage.setItem(ELocalStorageKey.UserId, result.data.user_id)
+    //   localStorage.setItem(ELocalStorageKey.Flag, EUserType.Web.toString())
+    // } else {
+    //   message.error(result.message)
+    // }
+    localStorage.setItem(ELocalStorageKey.WorkspaceId, data.workspace_id)
   } catch (e) {
     console.error(e);
   }