diff --git a/src/config/urls.js b/src/config/urls.js index 68dafbc..87c9f45 100644 --- a/src/config/urls.js +++ b/src/config/urls.js @@ -2,10 +2,12 @@ export const BASE_URL = '/api' // Auth +export const AUTH_CAPTCHA = '/v1/auth/captcha' export const AUTH_LOGIN = '/v1/auth/login' export const AUTH_REGISTER = '/v1/auth/register' export const AUTH_SMS_CODE = '/v1/auth/sms-code' export const AUTH_RESET_PASSWORD = '/v1/auth/reset-password' +export const AUTH_LOGOUT = '/v1/auth/logout' // Docks export const DOCKS = '/v1/docks' @@ -46,9 +48,18 @@ export const ALARM_RESOLVE = (id) => `/v1/alarms/${id}/resolve` export const COMMANDS = '/v1/commands' // Account +export const ACCOUNT_PROFILE = '/v1/account/profile' export const TRAFFIC_BALANCE = '/v1/account/traffic/balance' export const TRAFFIC_ORDERS = '/v1/account/traffic/orders' export const TRAFFIC_USAGE = '/v1/account/traffic/usage' +export const ACCOUNT_RESOURCE_SUMMARY = '/v1/account/resource-summary' +export const ACCOUNT_DOWNLOADS = '/v1/account/downloads' +export const ACCOUNT_CHANGE_PASSWORD = '/v1/account/security/change-password' +export const ACCOUNT_SESSIONS = '/v1/account/security/sessions' +export const INVOICE_PROFILES = '/v1/account/invoice-profiles' +export const INVOICE_PROFILE = (id) => `/v1/account/invoice-profiles/${id}` +export const INVOICE_ORDERS = '/v1/account/invoice-orders' +export const INVOICE_REQUESTS = '/v1/account/invoice-requests' export const SIM_CARDS = '/v1/account/sim-cards' export const SIM_RECHARGE_LOGS = '/v1/account/sim-recharge-logs' export const SIM_CARD_RECHARGE = (id) => `/v1/account/sim-cards/${id}/recharge` diff --git a/src/layout/components/SideMenu.vue b/src/layout/components/SideMenu.vue index 3985b4a..7857b14 100644 --- a/src/layout/components/SideMenu.vue +++ b/src/layout/components/SideMenu.vue @@ -3,6 +3,8 @@ import { computed, ref, watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import { useUserStore } from '@/stores/modules/userStore' import { useUiStore } from '@/stores/modules/uiStore' +import request from '@/utils/http' +import * as urls from '@/config/urls' const route = useRoute() const router = useRouter() @@ -64,6 +66,11 @@ async function logout() { '清除本地凭证', ]) if (ok) { + try { + await request.post(urls.AUTH_LOGOUT, { refreshToken: userStore.refreshToken }) + } catch { + // 本地凭证仍需清理 + } userStore.logout() router.push('/login') ui.toast('已退出登录') diff --git a/src/stores/modules/devicesStore.js b/src/stores/modules/devicesStore.js index e0cc148..d93bc2e 100644 --- a/src/stores/modules/devicesStore.js +++ b/src/stores/modules/devicesStore.js @@ -184,7 +184,7 @@ export const useDeviceStore = defineStore('devices', () => { const id = String(d.id) const detail = dockDetails[i] || {} const rt = detail.realtime || {} - const online = detail.online ?? d.status === 'online' + const online = Boolean(detail.online) const registerStatus = d.registerStatus || 'registered' const pending = registerStatus === 'pending' && !online const st = pending @@ -228,7 +228,7 @@ export const useDeviceStore = defineStore('devices', () => { const armed = ['1', 'true', 1, true].includes(rt.armed) const altitude = coordinate(rt.altitude, -1000, 100000) const flying = armed || (altitude != null && altitude > 0) - const online = detail.online ?? d.status !== 'offline' + const online = Boolean(detail.online) const st = !online ? { status: '离线', statusClass: 'offline' } : flying diff --git a/src/stores/modules/userStore.js b/src/stores/modules/userStore.js index 2076289..f8813f3 100644 --- a/src/stores/modules/userStore.js +++ b/src/stores/modules/userStore.js @@ -3,23 +3,29 @@ import { ref } from 'vue' export const useUserStore = defineStore('user', () => { const token = ref(localStorage.getItem('token') || '') + const refreshToken = ref(localStorage.getItem('refreshToken') || '') const user = ref(JSON.parse(localStorage.getItem('user') || 'null')) - function setLogin(tokenVal, userVal) { + function setLogin(tokenVal, userVal, refreshTokenVal = '') { const nextToken = tokenVal == null ? '' : String(tokenVal) if (!nextToken) { throw new Error('登录凭证为空') } token.value = nextToken + refreshToken.value = refreshTokenVal == null ? '' : String(refreshTokenVal) user.value = userVal localStorage.setItem('token', nextToken) + if (refreshToken.value) localStorage.setItem('refreshToken', refreshToken.value) + else localStorage.removeItem('refreshToken') localStorage.setItem('user', JSON.stringify(userVal)) } function logout() { token.value = '' + refreshToken.value = '' user.value = null localStorage.removeItem('token') + localStorage.removeItem('refreshToken') localStorage.removeItem('user') } @@ -27,5 +33,5 @@ export const useUserStore = defineStore('user', () => { return !!user.value && user.value.role === 'admin' } - return { token, user, setLogin, logout, isAdmin } + return { token, refreshToken, user, setLogin, logout, isAdmin } }) diff --git a/src/utils/http.js b/src/utils/http.js index 3895cfd..90185ee 100644 --- a/src/utils/http.js +++ b/src/utils/http.js @@ -18,6 +18,9 @@ request.interceptors.request.use((config) => { request.interceptors.response.use( (response) => { + if (response.config.responseType === 'blob') { + return response.data + } const res = response.data if (res && res.code === 200) { return res.data diff --git a/src/views/AccountView/AccountView.vue b/src/views/AccountView/AccountView.vue index 398e6f8..0bd2447 100644 --- a/src/views/AccountView/AccountView.vue +++ b/src/views/AccountView/AccountView.vue @@ -1,17 +1,12 @@ diff --git a/src/views/LoginView/LoginView.vue b/src/views/LoginView/LoginView.vue index 1609b1f..815f8ac 100644 --- a/src/views/LoginView/LoginView.vue +++ b/src/views/LoginView/LoginView.vue @@ -1,5 +1,5 @@