From 1728006c7507dc973e684e0b03040304fa05e08a Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Tue, 27 Aug 2024 17:03:32 +0800
Subject: [PATCH] chore:接入新框架api
---
src/mqtt/config.ts | 28 +
src/pages/page-web/index.vue | 56 ++
src/pages/page-web/projects/project_list/index.vue | 10
env/.env.production | 17
src/api/user.ts | 112 ++++++
src/config/website.ts | 61 +++
src/utils/common.ts | 27 +
src/store/index.ts | 6
src/utils/store.ts | 108 ++++++
src/api/http/request.ts | 166 ++++++++-
src/pages/page-web/projects/project_list/list_page/list.vue | 18
yarn.lock | 20 +
src/components/MediaPanel.vue | 4
src/store/user.ts | 258 +++++++++++++++
src/utils/auth.ts | 37 ++
src/api/manage.ts | 7
src/websocket/util/config.ts | 13
package.json | 4
src/utils/validate.ts | 40 ++
src/pages/page-web/projects/project_list/list_page/components/ProjectList.vue | 10
src/api/drc.ts | 9
21 files changed, 935 insertions(+), 76 deletions(-)
diff --git a/env/.env.production b/env/.env.production
index 647defc..18c02fc 100644
--- a/env/.env.production
+++ b/env/.env.production
@@ -1,6 +1,15 @@
+###
+ # @Author: GuLiMmo 2820890765@qq.com
+ # @Date: 2024-04-24 14:29:01
+ # @LastEditors: GuLiMmo 2820890765@qq.com
+ # @LastEditTime: 2024-08-27 14:44:24
+ # @FilePath: /drone-web/env/.env.production
+ # @Description:
+ # Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+###
VITE_APP_ENVIRONMENT=PROD
VITE_APP_APIGATEWAY_BACKEND_HOST=''
-VITE_API_URL = 'https://wrj.shuixiongit.com/drone-api'
-VITE_MEDIAPANEL_API_URL = 'https://dev.jxpskj.com:8026/cloud-bucket'
-VITE_WS_API_URL = 'wss://wrj.shuixiongit.com/drone-api/api/v1/ws'
-VITE_BASE_API = '/drone-api'
\ No newline at end of file
+VITE_API_URL = 'https://wrj.shuixiongit.com/api'
+VITE_MEDIAPANEL_API_URL = 'https://wrj.shuixiongit.com/minio/cloud-bucket'
+VITE_WS_API_URL = 'wss://wrj.shuixiongit.com/drone-wss/api/v1/ws'
+VITE_BASE_API = '/api'
\ No newline at end of file
diff --git a/package.json b/package.json
index cb2004d..d6deda2 100644
--- a/package.json
+++ b/package.json
@@ -15,12 +15,16 @@
"@amap/amap-jsapi-loader": "^1.0.1",
"@ant-design/icons-vue": "^6.0.1",
"@turf/turf": "^6.5.0",
+ "@types/js-cookie": "^3.0.6",
"@vitejs/plugin-legacy": "^1.6.2",
"agora-rtc-sdk-ng": "^4.12.1",
"ant-design-vue": "^2.2.8",
"axios": "^0.21.1",
"eventemitter3": "^5.0.0",
"file-saver": "^2.0.5",
+ "js-base64": "^3.7.7",
+ "js-cookie": "^3.0.5",
+ "js-md5": "^0.8.3",
"jszip": "^3.10.1",
"lodash": "^4.17.21",
"mitt": "^3.0.0",
diff --git a/src/api/drc.ts b/src/api/drc.ts
index ea415a9..801dfe3 100644
--- a/src/api/drc.ts
+++ b/src/api/drc.ts
@@ -1,3 +1,12 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-03-12 17:59:03
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:56:00
+ * @FilePath: /drone-web/src/api/drc.ts
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
import request, { IWorkspaceResponse } from '/@/api/http/request'
import { ELocalStorageKey } from '/@/types'
diff --git a/src/api/http/request.ts b/src/api/http/request.ts
index b66b2a9..b7e6fec 100644
--- a/src/api/http/request.ts
+++ b/src/api/http/request.ts
@@ -1,56 +1,180 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-03-12 18:01:28
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:16:55
+ * @FilePath: /drone-web/src/api/http/request.ts
+ * @Description: axios配置
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
-import axios from 'axios'
+import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
import { uuidv4 } from '/@/utils/uuid'
import { CURRENT_CONFIG } from './config'
-import { message } from 'ant-design-vue'
+import { useMyStore } from '/@/store'
+import { getToken } from '/@/utils/auth'
+import { serialize } from '/@/utils/common'
+import { message as Message, MessageArgsProps } from 'ant-design-vue'
import router from '/@/router'
import { ELocalStorageKey, ERouterName, EUserType } from '/@/types/enums'
+import { VNodeTypes } from 'vue'
+import website from '/@/config/website'
+import { Base64 } from 'js-base64'
export * from './type'
-const { baseUrl: { apiBaseUrl } } = window.globalApiConfig
+// 自定义响应类型
+interface CustomAxiosResponse<T = any> extends AxiosResponse<T> {
+ data: T
+}
+
+// 定义你的请求类型
+interface CustomAxiosRequestConfig extends AxiosRequestConfig {
+ // 是否开启鉴权
+ authorization?: boolean
+}
+
+type CustomAxiosConfig = {
+ [x: string]: any
+ <T = any, R = CustomAxiosResponse<T>, D = CustomAxiosRequestConfig>(config: D): Promise<R>
+}
const REQUEST_ID = 'X-Request-Id'
-function getAuthToken () {
+const getAuthToken = () => {
return localStorage.getItem(ELocalStorageKey.Token)
}
-const instance = axios.create({
+const instance: CustomAxiosConfig = axios.create({
// withCredentials: true,
headers: {
'Content-Type': 'application/json',
},
- baseURL: apiBaseUrl || import.meta.env.VITE_BASE_API,
+ baseURL: window?.globalApiConfig?.baseUrl?.apiBaseUrl || import.meta.env.VITE_BASE_API,
// timeout: 12000,
+ withCredentials: true,
})
instance.interceptors.request.use(
- config => {
- config.headers[ELocalStorageKey.Token] = localStorage.getItem(ELocalStorageKey.Token)
+ (config: {
+ data: any
+ method: string
+ token: any
+ text: boolean
+ json: boolean
+ meta: {
+ isSerialize: boolean
+ isToken: boolean
+ noCookie: boolean
+ }
+ headers: { [x: string]: string | null }
+ url: string
+ authorization: boolean
+ }) => {
+ if (!config.url.includes('/blade-') && !config.url.includes('https://') && !config.url.includes('http://')) {
+ config.url = '/drone-yw' + config.url
+ }
+ const authorization = config.authorization === false
+ if (!authorization) {
+ config.headers.Authorization = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`
+ }
+ // 让每个请求携带token
+ const meta = config.meta || {}
+ const isToken = meta.isToken === false
+ if (getToken() && !isToken) {
+ config.headers[website.tokenHeader] = 'bearer ' + getToken()
+ }
+ if (meta.noCookie) {
+ delete config.headers.cookie
+ }
+ // headers中配置text请求
+ if (config.text === true) {
+ config.headers['Content-Type'] = 'text/plain'
+ }
+ // headers配置JSON请求
+ if (config.json === true) {
+ config.headers['Content-Type'] = 'application/json'
+ }
+ // 水情预报接口调用
+ if (config.token) {
+ config.headers.Authorization = config.token
+ }
+ // headers中配置serialize为true开启序列化
+ if (config.method === 'post' && meta.isSerialize === true) {
+ config.data = serialize(config.data)
+ }
+ // config.headers[ELocalStorageKey.Token] = localStorage.getItem(ELocalStorageKey.Token)
// config.headers[REQUEST_ID] = uuidv4()
// config.baseURL = CURRENT_CONFIG.baseURL
return config
},
- error => {
+ (error: any) => {
return Promise.reject(error)
},
)
instance.interceptors.response.use(
- response => {
- // console.info('URL: ' + response.config.baseURL + response.config.url, '\nData: ', response.data, '\nResponse:', response)
- const whiteList = ['/manage/api/v1/live/streams/stop']
- if (whiteList.includes(response.config.url)) {
- return Promise.reject(response.data)
+ (res: { data: { code: any; msg: any; message: any; error_description: any }; status: any; config: { url: string; meta: { noCookie: boolean } } }) => {
+ const status = res.data.code || res.status
+ const statusWhiteList = website.statusWhiteList || []
+ const message = res.data.msg || res.data.message || res.data.error_description || '未知错误'
+ // 如果在白名单里则自行catch逻辑处理
+ if ((statusWhiteList as any).includes(status)) return Promise.reject(res)
+ // 洪水预警接口地址放开
+ const hsyjWhiteList = [
+ '/fh-admin/skkr/getFuture',
+ 'https://sk.hubeishuiyi.cn/hsybApi/api/fh-admin/skkr/getFuture',
+ '/hsybApi/api/fh-admin/skkr/getFuture',
+ ]
+ if (hsyjWhiteList.includes(res.config.url)) return Promise.resolve(res)
+ // 如果是401则跳转到登录页面
+ const store = useMyStore()
+ if (status === 401) store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }))
+ // 如果请求为非200否者默认统一处理
+ if (status !== 200) {
+ // 排除海康 code 为 0 情况
+ if (status === 0) {
+ return res
+ }
+ if ('meta' in res.config && 'noCookie' in res.config.meta && res.config.meta.noCookie === true) {
+ return Promise.reject(new Error(message))
+ }
+ if (message === '缺失令牌,鉴权失败') {
+ // message({
+ // message: '登录信息已过期,请重新登录',
+ // type: 'warning',
+ // })
+ Message.warning('登录信息已过期,请重新登录')
+ }
+ if (
+ ![
+ '没有收到消息回复。',
+ '未知消息',
+ '设备端退出drc模式',
+ '未能恢复航路作业。错误码:: 319042',
+ 'success',
+ '缺失令牌,鉴权失败',
+ ].includes(message)
+ ) {
+ Message.warning(message)
+ }
+ return Promise.reject(new Error(message))
}
+ // console.info('URL: ' + response.config.baseURL + response.config.url, '\nData: ', response.data, '\nResponse:', response)
+ // const whiteList = ['/manage/api/v1/live/streams/stop']
+ // if (whiteList.includes(response.config.url)) {
+ // return Promise.reject(response.data)
+ // }
// 处理消息返回
// if (response.data.code && !response.data.success) {
// message.error(response.data.message)
// }
- if (response.data.code && response.data.code !== 0) {
- message.error(response.data.message)
- }
- return response
+ // if (response.data.code && response.data.code !== 0) {
+ // message.error(response.data.message)
+ // }
+ return res
},
- err => {
+ (err: {
+ config: { headers: { [x: string]: any }; url: any; method: any }
+ response: { data: { message: string; result: { message: string } }; status: number }
+ }) => {
const requestId = err?.config?.headers && err?.config?.headers[REQUEST_ID]
if (requestId) {
console.info(REQUEST_ID, ':', requestId)
@@ -66,11 +190,11 @@
}
// @See: https://github.com/axios/axios/issues/383
if (!err.response || !err.response.status) {
- message.error('网络异常,请检查后端服务后重试')
+ Message.error('网络异常,请检查后端服务后重试')
return
}
if (err.response?.status !== 200) {
- message.error(`错误码: ${err.response?.status}`)
+ Message.error(`错误码: ${err.response?.status}`)
}
// if (err.response?.status === 403) {
// // window.location.href = '/'
diff --git a/src/api/manage.ts b/src/api/manage.ts
index a22e272..263adc5 100644
--- a/src/api/manage.ts
+++ b/src/api/manage.ts
@@ -83,6 +83,13 @@
return result.data
}
+// 获取项目
+export const getPlatformByUser = async function (): Promise<IWorkspaceResponse<any>> {
+ const url = HTTP_PREFIX + '/devices/getAirportList'
+ const result = await request.get(url)
+ return result.data
+}
+
// Get User Info
export const getUserInfo = async function (): Promise<IWorkspaceResponse<any>> {
const url = `${HTTP_PREFIX}/users/current`
diff --git a/src/api/user.ts b/src/api/user.ts
new file mode 100644
index 0000000..c4c9b3b
--- /dev/null
+++ b/src/api/user.ts
@@ -0,0 +1,112 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-08-06 15:01:24
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 14:55:01
+ * @FilePath: /drone-web/src/api/user.ts
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+import request, { IPage, IWorkspaceResponse } from '/@/api/http/request'
+import website from '../config/website'
+
+export const loginByUsername = (
+ tenantId: string,
+ deptId: string,
+ roleId: string,
+ username: string,
+ password: string,
+ type: string,
+ key: string,
+ code: string,
+ grant_type: string,
+) =>
+ request({
+ url: '/blade-auth/oauth/token',
+ method: 'post',
+ headers: {
+ 'Tenant-Id': tenantId,
+ 'Dept-Id': website.switchMode ? deptId : '',
+ 'Role-Id': website.switchMode ? roleId : '',
+ 'Captcha-Key': key,
+ 'Captcha-Code': code,
+ },
+ params: {
+ tenantId,
+ username,
+ password,
+ grant_type: 'password',
+ scope: 'all',
+ type,
+ },
+ })
+
+export const refreshToken = (refresh_token: string, tenantId: string, deptId: string, roleId: string) =>
+ request({
+ url: '/blade-auth/oauth/token',
+ method: 'post',
+ headers: {
+ 'Tenant-Id': tenantId,
+ 'Dept-Id': website.switchMode ? deptId : '',
+ 'Role-Id': website.switchMode ? roleId : '',
+ },
+ params: {
+ tenantId,
+ refresh_token,
+ grant_type: 'refresh_token',
+ scope: 'all',
+ },
+ })
+
+interface IRegisterForm {
+ tenantId: string
+ name: string
+ account: string
+ password: string
+}
+
+export const registerGuest = (form: IRegisterForm, oauthId: string) =>
+ request({
+ url: '/blade-user/register-guest',
+ method: 'post',
+ params: {
+ tenantId: form.tenantId,
+ name: form.name,
+ account: form.account,
+ password: form.password,
+ oauthId,
+ },
+ })
+
+export const getButtons = () =>
+ request({
+ url: '/blade-system/menu/buttons?sysType=2',
+ method: 'get',
+ })
+
+export const getCaptcha = () =>
+ request({
+ url: '/blade-auth/oauth/captcha',
+ method: 'get',
+ authorization: false,
+ })
+
+export const logout = () =>
+ request({
+ url: '/blade-auth/oauth/logout',
+ method: 'get',
+ authorization: false,
+ })
+
+export const getUserInfo = () =>
+ request({
+ url: '/blade-auth/oauth/user-info',
+ method: 'get',
+ })
+
+export const clearCache = () =>
+ request({
+ url: '/blade-auth/oauth/clear-cache',
+ method: 'get',
+ authorization: false,
+ })
diff --git a/src/components/MediaPanel.vue b/src/components/MediaPanel.vue
index e8a7c56..79e4794 100644
--- a/src/components/MediaPanel.vue
+++ b/src/components/MediaPanel.vue
@@ -118,15 +118,13 @@
type Key = ColumnProps['key'];
-const { baseUrl: { mediaPanelPrefix } } = window.globalApiConfig
-
const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)!
const loading = ref(false)
const showVideo = ref(false)
const videoPlayerId = ref('videoPlayerId')
// 文件前缀
// const prefix = 'https://dev.jxpskj.com:8026/cloud-bucket'
-const prefix = mediaPanelPrefix || import.meta.env.VITE_MEDIAPANEL_API_URL
+const prefix = window.globalApiConfig?.baseUrl?.mediaPanelPrefix || import.meta.env.VITE_MEDIAPANEL_API_URL
// 搜索栏配置项
const searchPanelOptions = reactive({
size: 'large',
diff --git a/src/config/website.ts b/src/config/website.ts
new file mode 100644
index 0000000..ace6c5a
--- /dev/null
+++ b/src/config/website.ts
@@ -0,0 +1,61 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-08-27 14:51:44
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 14:52:09
+ * @FilePath: /drone-web/src/config/website.js
+ * @Description: website
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+/**
+ * 全局配置文件
+ */
+export default {
+ title: '',
+ logo: 'S',
+ key: 'saber', // 配置主键,目前用于存储
+ indexTitle: 'Saber Admin',
+ clientId: 'saber', // 客户端id
+ clientSecret: 'saber_secret', // 客户端密钥
+ isThirdParty: false, // 是否开启第三放登录
+ tenantMode: false, // 是否开启租户模式
+ tenantId: '000000', // 管理组租户编号
+ captchaMode: false, // 是否开启验证码模式
+ switchMode: false, // 是否开启部门切换模式
+ lockPage: '/lock',
+ tokenTime: 3000,
+ tokenHeader: 'Blade-Auth',
+ // http的status默认放行列表
+ statusWhiteList: [],
+ // 配置首页不可关闭
+ isFirstPage: false,
+ fistPage: {
+ label: '首页',
+ value: '/wel/index',
+ params: {},
+ query: {},
+ meta: {
+ i18n: 'dashboard',
+ },
+ group: [],
+ close: false,
+ },
+ // 配置菜单的属性
+ menu: {
+ iconDefault: 'iconfont icon-caidan',
+ props: {
+ label: 'name',
+ path: 'path',
+ icon: 'source',
+ children: 'children',
+ },
+ },
+ // 第三方系统授权地址
+ authUrl: 'http://localhost/blade-auth/oauth/render',
+ // 报表设计器地址(cloud端口为8108,boot端口为80)
+ reportUrl: 'http://localhost:8108/ureport',
+ // 单点登录系统认证(blade-auth服务的地)
+ ssoUrl: 'http://localhost:8100/oauth/authorize?client_id=saber&response_type=code&redirect_uri=',
+ // 单点登录回调地址(Saber服务的地址)
+ redirectUri: 'http://localhost:1888',
+}
diff --git a/src/mqtt/config.ts b/src/mqtt/config.ts
index c3acd5b..44edae5 100644
--- a/src/mqtt/config.ts
+++ b/src/mqtt/config.ts
@@ -1,8 +1,13 @@
-import {
- IClientOptions,
-} from 'mqtt'
-
-const { mqttConfig: { clientId, username, password, host, protocol, port } } = window.globalApiConfig
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-03-12 18:01:28
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:17:01
+ * @FilePath: /drone-web/src/mqtt/config.ts
+ * @Description: mqtt配置
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+import { IClientOptions } from 'mqtt'
export const OPTIONS: IClientOptions = {
clean: true, // true: 清除会话, false: 保留会话
@@ -10,10 +15,11 @@
resubscribe: true, // 断开重连后,再次订阅原订阅
reconnectPeriod: 10000, // 重连间隔时间: 5s
keepalive: 5, // 心跳间隔时间:1s
- clientId: clientId || 'DroneWeb',
- username: username || 'root',
- password: password || 'root',
- host: host || '139.196.74.78',
- protocol: protocol || 'ws',
- port: port || 8083,
+ clientId: window?.globalApiConfig?.mqttConfig?.clientId || 'DroneWeb',
+ username: window?.globalApiConfig?.mqttConfig?.username || 'root',
+ password: window?.globalApiConfig?.mqttConfig?.password || 'root',
+ host: window?.globalApiConfig?.mqttConfig?.host || '139.196.74.78',
+ protocol: window?.globalApiConfig?.mqttConfig?.protocol || 'wss',
+ // 8083
+ port: window?.globalApiConfig?.mqttConfig?.port || 8084,
}
diff --git a/src/pages/page-web/index.vue b/src/pages/page-web/index.vue
index 87f28d3..8d31268 100644
--- a/src/pages/page-web/index.vue
+++ b/src/pages/page-web/index.vue
@@ -1,9 +1,9 @@
<!--
* @Author: husq 931347610@qq.com
* @Date: 2023-09-13 18:21:08
- * @LastEditors: husq 931347610@qq.com
- * @LastEditTime: 2023-10-08 17:33:16
- * @FilePath: \Cloud-API-Demo-Web\src\pages\page-web\index.vue
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:20:14
+ * @FilePath: /drone-web/src/pages/page-web/index.vue
* @Description:
*
* Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
@@ -46,12 +46,31 @@
import { ELocalStorageKey, ERouterName, EUserType } from '/@/types'
import { encrypt, decrypt } from '/@/utils/crypto'
import router from '/@/router'
+import { useMyStore } from '/@/store'
const root = getRoot()
+const store = useMyStore()
+
const formState: UnwrapRef<LoginBody> = reactive({
- username: 'adminPC',
+ // 租户ID
+ tenantId: '000000',
+ // 部门ID
+ deptId: '',
+ // 角色ID
+ roleId: '',
+ // 用户名
+ username: '',
+ // 密码
password: '',
+ // 账号类型
+ type: 'account',
+ // 验证码的值
+ code: '',
+ // 验证码的索引
+ key: '',
+ // 预加载白色背景
+ image: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
flag: EUserType.Web,
})
@@ -60,18 +79,25 @@
})
const onSubmit = async () => {
+ store
+ .dispatch('LoginByUsername', formState)
+ .then((res) => {
+ root.$router.push(ERouterName.PROJECT_LIST)
+ })
+ .catch(() => {
+ })
// const password = encrypt(formState.password)
- const result = await login(formState)
- 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())
- root.$router.push(ERouterName.PROJECT_LIST)
- } else {
- message.error(result.message)
- }
+ // const result = await login(formState)
+ // 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())
+ // root.$router.push(ERouterName.PROJECT_LIST)
+ // } else {
+ // message.error(result.message)
+ // }
}
</script>
diff --git a/src/pages/page-web/projects/project_list/index.vue b/src/pages/page-web/projects/project_list/index.vue
index 3cb1aa5..79f7c7c 100644
--- a/src/pages/page-web/projects/project_list/index.vue
+++ b/src/pages/page-web/projects/project_list/index.vue
@@ -1,3 +1,12 @@
+<!--
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-03-12 17:59:03
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:51:28
+ * @FilePath: /drone-web/src/pages/page-web/projects/project_list/index.vue
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+-->
<template>
<div class="project_list">
<div :class="[isHidden? 'w50' : 'left_content']">
@@ -35,6 +44,7 @@
return flag
})
const root = getRoot()
+
</script>
<style scoped lang="scss">
diff --git a/src/pages/page-web/projects/project_list/list_page/components/ProjectList.vue b/src/pages/page-web/projects/project_list/list_page/components/ProjectList.vue
index beebb39..7385809 100644
--- a/src/pages/page-web/projects/project_list/list_page/components/ProjectList.vue
+++ b/src/pages/page-web/projects/project_list/list_page/components/ProjectList.vue
@@ -6,7 +6,7 @@
<div class="head mb10 flex-display flex-align-center flex-justify-between">
<div class="head-left flex-display flex-align-center">
<a-tag color="#87d068">{{ status[item.projectStatus] || '进行中' }}</a-tag>
- <span class="head-text">{{ item.workspace_name }}</span>
+ <span class="head-text">{{ item.nickname }}</span>
</div>
<div class="head-right">
<a-dropdown>
@@ -28,12 +28,12 @@
</div>
</div>
<div class="wrapper">
- <div class="introduction mb10">{{ item.workspace_desc || '暂无简介' }}</div>
- <div class="time mb5">创建时间: {{ item.createTime }}</div>
+ <div class="introduction mb10">{{ item.sys_name || '暂无简介' }}</div>
+ <div class="time mb5">创建时间: {{ new Date(item.create_time).toLocaleString() }}</div>
<div class="manager mb5 flex-display flex-align-center">
<user-outlined />
<!-- {{item.memberList[0].userId}} -->
- <div class="user_name ml10">测试角色</div>
+ <div class="user_name ml10">{{ item.dept_name }}</div>
</div>
</div>
</div>
@@ -131,7 +131,7 @@
store.commit('SET_PROJECT_ID', item.workspace_id)
localStorage.setItem(ELocalStorageKey.WorkspaceId, item.workspace_id)
store.commit('SET_POINT_LIST', [])
- store.commit('SET_PROJECT_NAME', item.workspace_name)
+ store.commit('SET_PROJECT_NAME', item.nickname)
router.push({
name: ERouterName.WORKSPACE,
query: { id: item.id, workSpaceId: item.workspace_id },
diff --git a/src/pages/page-web/projects/project_list/list_page/list.vue b/src/pages/page-web/projects/project_list/list_page/list.vue
index 76ed30f..8fd6223 100644
--- a/src/pages/page-web/projects/project_list/list_page/list.vue
+++ b/src/pages/page-web/projects/project_list/list_page/list.vue
@@ -1,9 +1,9 @@
<!--
* @Author: husq 931347610@qq.com
* @Date: 2023-09-13 18:21:08
- * @LastEditors: husq 931347610@qq.com
- * @LastEditTime: 2023-10-08 14:35:54
- * @FilePath: \Cloud-API-Demo-Web\src\pages\page-web\projects\project_list\list_page\list.vue
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:50:42
+ * @FilePath: /drone-web/src/pages/page-web/projects/project_list/list_page/list.vue
* @Description:
*
* Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
@@ -44,7 +44,7 @@
import { ERouterName } from '/@/types/enums'
import { statusOption, sortOption, projectOption, map, sortEnum } from './data'
import { getPage as getProjectPage } from '/@/api/project-page'
-import { getPlatform } from '/@/api/manage'
+import { getPlatform, getPlatformByUser } from '/@/api/manage'
import { PlusCircleOutlined, MonitorOutlined } from '@ant-design/icons-vue'
import { projectCard } from './components/data'
import { useMyStore } from '/@/store'
@@ -78,7 +78,7 @@
router.push({ name: ERouterName.WORKSPACE })
store.commit('SET_POINT_LIST', [])
}
-const cesium = cesiumOperation()
+// const cesium = cesiumOperation()
const goAdd = () => {
router.push({ name: ERouterName.ADD_PROJECT })
store.commit('SET_POINT_LIST', [])
@@ -97,12 +97,12 @@
// 页面初始化
const init = async () => {
spinning.value = true
- const res = await getPlatform(params.value, 1, 20).catch(e => {
+ const res = await getPlatformByUser().catch(e => {
spinning.value = false
})
- cardList.value = res.data.list
- cesium.removeAllPoint()
- cesium.removeAllDataSource()
+ cardList.value = res.data
+ // cesium.removeAllPoint()
+ // cesium.removeAllDataSource()
spinning.value = false
}
onMounted(() => {
diff --git a/src/store/index.ts b/src/store/index.ts
index 53dbca3..04f76a7 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -9,6 +9,7 @@
import createPersistedState from 'vuex-persistedstate' // 导入库
import map from './map'
import common from './common'
+import user from './user'
const initStateFunc = () => ({
Layers: [
@@ -267,12 +268,13 @@
actions,
modules: {
map,
- common
+ common,
+ user
},
plugins: [createPersistedState({
storage: window.sessionStorage,
key: 'drone-client',
- paths: ['map', 'common'],
+ paths: ['map', 'common', 'user'],
})]
}
diff --git a/src/store/user.ts b/src/store/user.ts
new file mode 100644
index 0000000..1864e34
--- /dev/null
+++ b/src/store/user.ts
@@ -0,0 +1,258 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-08-27 14:48:42
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:25:34
+ * @FilePath: /drone-web/src/store/user.ts
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-01-16 13:37:21
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-23 14:56:41
+ * @FilePath: /newBigScreen/src/store/modules/user.js
+ * @Description:
+ *
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
+ */
+import { ELocalStorageKey } from '/@/types/enums'
+import { getButtons, loginByUsername, getUserInfo, logout, refreshToken } from '/@/api/user'
+import { setStore, getStore } from '/@/utils/store'
+import { validatenull } from '/@/utils/validate'
+import md5 from 'js-md5'
+import { message } from 'ant-design-vue'
+import { setToken, setRefreshToken, removeToken, removeRefreshToken } from '/@/utils/auth'
+
+const user = {
+ state: {
+ // userInfo: {},
+ tenantId: getStore({ name: 'tenantId' }) || '',
+ userInfo: getStore({ name: 'userInfo' }) || [],
+ permission: getStore({ name: 'permission' }) || {},
+ authButtons: getStore({ name: 'authButtons' }) || [],
+ roles: [],
+ menuId: {},
+ menu: getStore({ name: 'menu' }) || [],
+ menuAll: getStore({ name: 'menuAll' }) || [],
+ loginFlag: getStore({ name: 'loginFlag' }),
+ token: getStore({ name: 'token' }) || '',
+ refreshToken: getStore({ name: 'refreshToken' }) || '',
+ roleMenu: getStore({ name: 'menuList' }) || [],
+ },
+ actions: {
+ // 根据用户名登录
+ LoginByUsername ({ commit }: any, userInfo: { tenantId: string; deptId: string; roleId: string; username: string; password: any; type: string; key: string; code: string; grant_type: string }) {
+ return new Promise((resolve, reject) => {
+ loginByUsername(
+ userInfo.tenantId,
+ userInfo.deptId,
+ userInfo.roleId,
+ userInfo.username,
+ md5(userInfo.password),
+ userInfo.type,
+ userInfo.key,
+ userInfo.code,
+ userInfo.grant_type,
+ )
+ .then((res) => {
+ const data = res.data
+ if (data.error_description) {
+ message.error(data.error_description)
+ } else {
+ commit('SET_LOGIN_FLAG', true)
+ commit('SET_TOKEN', data.access_token)
+ commit('SET_REFRESH_TOKEN', data.refresh_token)
+ commit('SET_TENANT_ID', data.tenant_id)
+ commit('SET_USER_INFO', data)
+ // localStorage.setItem(ELocalStorageKey.Token, data.access_token)
+ // localStorage.setItem(ELocalStorageKey.Username, data.user_name)
+ // this.dispatch('GetButtons')
+ // commit('SET_SELECTED_WORKSPACE', userInfo);
+ // commit('DEL_ALL_TAG');
+ // commit('CLEAR_LOCK');
+ resolve(true)
+ }
+ })
+ .catch((error) => {
+ reject(error)
+ })
+ })
+ },
+ // 获取用户信息
+ GetUserInfo ({ commit }: any) {
+ return new Promise((resolve, reject) => {
+ getUserInfo()
+ .then((res) => {
+ const data = res.data.data
+ commit('SET_ROLES', data.roles)
+ resolve(data)
+ })
+ .catch((err) => {
+ reject(err)
+ })
+ })
+ },
+ // 获取当前角色按钮权限
+ GetButtons ({ commit }: any) {
+ return new Promise((resolve, reject) => {
+ getButtons()
+ .then((res) => {
+ const data = res.data.data
+ commit('SET_BUTTONS', data)
+ resolve(data)
+ })
+ .catch((err) => {
+ reject(err)
+ })
+ })
+ },
+ // 刷新token
+ refreshToken ({ state, commit }: any, userInfo: { deptId: string; roleId: string }) {
+ return new Promise((resolve, reject) => {
+ refreshToken(
+ state.refreshToken,
+ state.tenantId,
+ !validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id,
+ !validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id,
+ )
+ .then((res) => {
+ const data = res.data
+ commit('SET_LOGIN_FLAG', true)
+ commit('SET_TOKEN', data.access_token)
+ commit('SET_REFRESH_TOKEN', data.refresh_token)
+ commit('SET_USER_INFO', data)
+ resolve('')
+ })
+ .catch((error) => {
+ reject(error)
+ })
+ })
+ },
+ // 登出
+ LogOut ({ commit }: any) {
+ return new Promise((resolve, reject) => {
+ logout()
+ .then(() => {
+ commit('SET_LOGIN_FLAG', false)
+ commit('SET_TOKEN', '')
+ commit('SET_MENU', [])
+ commit('SET_MENU_ALL_NULL', [])
+ commit('SET_ROLES', [])
+ commit('SET_TAG_LIST', [])
+ commit('DEL_ALL_TAG')
+ commit('CLEAR_LOCK')
+ removeToken()
+ removeRefreshToken()
+ resolve('')
+ })
+ .catch((error) => {
+ reject(error)
+ })
+ })
+ },
+ // 注销session
+ FedLogOut ({ commit }: any) {
+ return new Promise((resolve) => {
+ commit('SET_LOGIN_FLAG', false)
+ commit('SET_TOKEN', '')
+ commit('SET_MENU_ALL_NULL', [])
+ commit('SET_MENU', [])
+ commit('SET_ROLES', [])
+ commit('SET_TAG_LIST', [])
+ commit('DEL_ALL_TAG')
+ commit('CLEAR_LOCK')
+ removeToken()
+ removeRefreshToken()
+ resolve('')
+ window.localStorage.clear()
+ })
+ },
+ },
+ mutations: {
+ SET_ROLE_MENU (state: { roleMenu: any; menuList: any }, menuList: any) {
+ state.roleMenu = menuList
+ setStore({ name: 'roleMenu', content: state.menuList })
+ },
+ SET_LOGIN_FLAG: (state: { loginFlag: any }, loginFlag: any) => {
+ state.loginFlag = loginFlag
+ setStore({ name: 'loginFlag', content: state.loginFlag })
+ },
+ SET_TOKEN: (state: { token: string }, token: string) => {
+ setToken(token)
+ state.token = token
+ setStore({ name: 'token', content: state.token })
+ window.localStorage.setItem(ELocalStorageKey.Token, token)
+ },
+ SET_LOCAL_STORAGE_USER_INFO (state: { userInfo: { [x: string]: string } }, userInfo: { [x: string]: string }) {
+ Object.keys(userInfo).forEach((key) => {
+ state.userInfo[key] = userInfo[key]
+ localStorage.setItem(key, userInfo[key])
+ })
+ },
+ CLEAR_LOCAL_STORAGE_USER_INFO (state: { userInfo: {} }) {
+ localStorage.clear()
+ state.userInfo = {}
+ },
+ SET_REFRESH_TOKEN: (state: { refreshToken: string }, refreshToken: string) => {
+ setRefreshToken(refreshToken)
+ state.refreshToken = refreshToken
+ setStore({ name: 'refreshToken', content: state.refreshToken })
+ },
+ SET_TENANT_ID: (state: { tenantId: string }, tenantId: string) => {
+ state.tenantId = tenantId
+ setStore({ name: 'tenantId', content: state.tenantId })
+ },
+ SET_USER_INFO: (state: { userInfo: {} }, userInfo: { account: string }) => {
+ // if (validatenull(userInfo.avatar)) {
+ // userInfo.avatar = '/img/bg/img-logo.png';
+ // }
+ state.userInfo = userInfo
+ setStore({ name: 'userInfo', content: state.userInfo })
+ window.localStorage.setItem('username', userInfo.account)
+ },
+ SET_ROLES: (state: { roles: any }, roles: any) => {
+ state.roles = roles
+ },
+ SET_PERMISSION: (state: { permission: { [x: string]: boolean } }, permission: any) => {
+ const result: any[] = []
+
+ function getCode (list: { children: any; code: string }[]) {
+ list.forEach((ele: { children: any; code: any }) => {
+ if (typeof ele === 'object') {
+ const chiildren = ele.children
+ const code = ele.code
+ if (chiildren) {
+ getCode(chiildren)
+ } else {
+ result.push(code)
+ }
+ }
+ })
+ }
+
+ getCode(permission)
+ state.permission = {}
+ result.forEach((ele) => {
+ state.permission[ele] = true
+ })
+ setStore({ name: 'permission', content: state.permission })
+ },
+ SET_BUTTONS (state: { authButtons: string[] }, buttons: any[]) {
+ const buttonGroup: string[] = []
+ buttons.forEach((button) => {
+ buttonGroup.push(button.code)
+ if (button?.children) {
+ button?.children.forEach((btnChild: { code: string }) => {
+ buttonGroup.push(btnChild.code)
+ })
+ }
+ })
+ state.authButtons = buttonGroup
+ setStore({ name: 'authButtons', content: buttonGroup })
+ },
+ },
+}
+
+export default user
diff --git a/src/utils/auth.ts b/src/utils/auth.ts
new file mode 100644
index 0000000..6f7e248
--- /dev/null
+++ b/src/utils/auth.ts
@@ -0,0 +1,37 @@
+/*
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2023-04-10 09:25:59
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 15:15:20
+ * @FilePath: /drone-web/src/utils/auth.ts
+ * @Description:
+ *
+ * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
+ */
+import Cookies from 'js-cookie'
+const TokenKey = 'saber-access-token'
+const RefreshTokenKey = 'saber-refresh-token'
+
+export function getToken () {
+ return Cookies.get(TokenKey, { path: '/' })
+}
+
+export function setToken (token: string) {
+ return Cookies.set(TokenKey, token, { path: '/' })
+}
+
+export function getRefreshToken () {
+ return Cookies.get(RefreshTokenKey)
+}
+
+export function setRefreshToken (token: string) {
+ return Cookies.set(RefreshTokenKey, token)
+}
+
+export function removeToken () {
+ return Cookies.remove(TokenKey)
+}
+
+export function removeRefreshToken () {
+ return Cookies.remove(RefreshTokenKey)
+}
diff --git a/src/utils/common.ts b/src/utils/common.ts
index 891e618..c0e1549 100644
--- a/src/utils/common.ts
+++ b/src/utils/common.ts
@@ -1,9 +1,21 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-03-12 17:59:03
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:52:42
+ * @FilePath: /drone-web/src/utils/common.ts
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+
+import { validatenull } from './validate'
+
/**
* 下载文件
* @param data
* @param fileName
*/
-export function downloadFile (data: Blob, fileName: string) {
+export const downloadFile = (data: Blob, fileName: string) => {
const lable = document.createElement('a')
lable.href = window.URL.createObjectURL(data)
lable.download = fileName
@@ -11,6 +23,15 @@
URL.revokeObjectURL(lable.href)
}
-export const requireImg = (imgPath: string) => {
- return new URL(`../assets/${imgPath}`, import.meta.url).href
+// 表单序列化
+export const serialize = (data: { [x: string]: any }) => {
+ const list: string[] = []
+ Object.keys(data).forEach((ele) => {
+ list.push(`${ele}=${data[ele]}`)
+ })
+ return list.join('&')
+}
+
+export const requireImg = (path: string) => {
+ return new URL(`/src/assets/${path}`, import.meta.url).href
}
diff --git a/src/utils/store.ts b/src/utils/store.ts
new file mode 100644
index 0000000..17dad42
--- /dev/null
+++ b/src/utils/store.ts
@@ -0,0 +1,108 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-08-27 15:37:44
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 15:55:14
+ * @FilePath: /drone-web/src/utils/store.ts
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+import { validatenull } from '/@/utils/validate'
+
+/**
+ * 存储localStorage
+ */
+export const setStore = (params: { name: string, content: any, type?: any }) => {
+ const { name, content, type } = params
+ const obj = {
+ dataType: typeof content,
+ content: content,
+ type: type,
+ datetime: new Date().getTime(),
+ }
+ if (type) window.sessionStorage.setItem(name, JSON.stringify(obj))
+ else window.localStorage.setItem(name, JSON.stringify(obj))
+}
+/**
+ * 获取localStorage
+ */
+
+export const getStore = (params: { name: any; type?: string; debug?: any }) => {
+ const { name, debug } = params
+ let obj: any = {}
+ let content: string | number = ''
+ obj = window.sessionStorage.getItem(name)
+ if (validatenull(obj)) obj = window.localStorage.getItem(name)
+ if (validatenull(obj)) return
+ try {
+ obj = JSON.parse(obj)
+ } catch {
+ return obj
+ }
+ if (debug) {
+ return obj
+ }
+ if (obj.dataType === 'string') {
+ content = obj.content
+ } else if (obj.dataType === 'number') {
+ content = Number(obj.content)
+ } else if (obj.dataType === 'boolean') {
+ // eslint-disable-next-line no-eval
+ content = eval(obj.content)
+ } else if (obj.dataType === 'object') {
+ content = obj.content
+ }
+ return content
+}
+/**
+ * 删除localStorage
+ */
+export const removeStore = (params: { name: string; type?: string }) => {
+ const { name, type } = params
+ if (type) {
+ window.sessionStorage.removeItem(name)
+ } else {
+ window.localStorage.removeItem(name)
+ }
+}
+
+/**
+ * 获取全部localStorage
+ */
+export const getAllStore = (params: { type: string }) => {
+ const list = []
+ const { type } = params
+ if (type) {
+ for (let i = 0; i <= window.sessionStorage.length; i++) {
+ list.push({
+ name: window.sessionStorage.key(i),
+ content: getStore({
+ name: window.sessionStorage.key(i),
+ type: 'session',
+ }),
+ })
+ }
+ } else {
+ for (let i = 0; i <= window.localStorage.length; i++) {
+ list.push({
+ name: window.localStorage.key(i),
+ content: getStore({
+ name: window.localStorage.key(i),
+ }),
+ })
+ }
+ }
+ return list
+}
+
+/**
+ * 清空全部localStorage
+ */
+export const clearStore = (params: { type: string }) => {
+ const { type } = params
+ if (type) {
+ window.sessionStorage.clear()
+ } else {
+ window.localStorage.clear()
+ }
+}
diff --git a/src/utils/validate.ts b/src/utils/validate.ts
new file mode 100644
index 0000000..9e49d90
--- /dev/null
+++ b/src/utils/validate.ts
@@ -0,0 +1,40 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-08-27 15:20:00
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 15:37:23
+ * @FilePath: /drone-web/src/utils/validate.ts
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+/* 合法uri */
+export const validateURL = (textval: string) => {
+ const urlregex =
+ /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+ return urlregex.test(textval)
+}
+
+/**
+ * 判断是否为空
+ */
+export const validatenull = (val: string | any[] | null | undefined | any) => {
+ if (typeof val === 'boolean') {
+ return false
+ }
+ if (typeof val === 'number') {
+ return false
+ }
+ if (val instanceof Array) {
+ if (val.length === 0) return true
+ } else if (val instanceof Object) {
+ if (JSON.stringify(val) === '{}') return true
+ } else {
+ if (val === 'null' || val == null || val === 'undefined' || val === undefined || val === '') return true
+ return false
+ }
+ return false
+}
+
+export const isURL = (s: string) => {
+ return /^http[s]?:\/\/.*/.test(s)
+}
diff --git a/src/websocket/util/config.ts b/src/websocket/util/config.ts
index 12fa799..38b2f27 100644
--- a/src/websocket/util/config.ts
+++ b/src/websocket/util/config.ts
@@ -1,13 +1,20 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-03-12 18:01:28
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-27 16:10:38
+ * @FilePath: /drone-web/src/websocket/util/config.ts
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
import { ELocalStorageKey } from '/@/types/enums'
import { CURRENT_CONFIG } from '/@/api/http/config'
-
-const { baseUrl: { wsBaseUrl } } = window.globalApiConfig
const user = localStorage.getItem('user_info')
export function getWebsocketUrl () {
const token: string = localStorage.getItem(ELocalStorageKey.Token) || '' as string
// const url = CURRENT_CONFIG.websocketURL
- const url = (wsBaseUrl || import.meta.env.VITE_WS_API_URL) + '?x-auth-token=' + encodeURI(token)
+ const url = (window?.globalApiConfig?.baseUrl?.wsBaseUrl || import.meta.env.VITE_WS_API_URL) + '?x-auth-token=' + encodeURI(token)
return url
}
diff --git a/yarn.lock b/yarn.lock
index 42872f7..46b041a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1758,6 +1758,11 @@
resolved "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca"
integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==
+"@types/js-cookie@^3.0.6":
+ version "3.0.6"
+ resolved "https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-3.0.6.tgz#a04ca19e877687bd449f5ad37d33b104b71fdf95"
+ integrity sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==
+
"@types/json-schema@^7.0.9":
version "7.0.9"
resolved "https://registry.npmmirror.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1637265456183&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz"
@@ -4299,6 +4304,21 @@
resolved "https://registry.npmmirror.com/js-base64/download/js-base64-2.6.4.tgz"
integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+js-base64@^3.7.7:
+ version "3.7.7"
+ resolved "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79"
+ integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==
+
+js-cookie@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc"
+ integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
+
+js-md5@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.npmmirror.com/js-md5/-/js-md5-0.8.3.tgz#921bab7efa95bfc9d62b87ee08a57f8fe4305b69"
+ integrity sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==
+
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz"
--
Gitblit v1.9.3