feat(admin-frontend): 初始化管理端登录功能

This commit is contained in:
yinjianm
2026-04-21 03:28:04 +08:00
parent 994819e8a0
commit 4cfda0fbf1
38 changed files with 4296 additions and 9 deletions
+8
View File
@@ -0,0 +1,8 @@
import { adminClient } from './client'
import type { ApiResponse, SystemStatus } from '@/types/api'
export function getSystemStatus(): Promise<ApiResponse<SystemStatus>> {
return adminClient
.get<ApiResponse<SystemStatus>>('/system/getSystemStatus')
.then((res) => res.data)
}
+52
View File
@@ -0,0 +1,52 @@
import axios from 'axios'
import type { ApiResponse } from '@/types/api'
import { getApiBaseUrl, getSecurePath } from '@/utils/runtime'
import { getToken, removeToken } from '@/utils/token'
function handleError(error: unknown): never {
if (axios.isAxiosError(error)) {
const status = error.response?.status
const data = error.response?.data as ApiResponse | undefined
if (status === 401 || status === 403) {
removeToken()
window.location.hash = '#/login'
}
throw new Error(data?.message || error.message || '请求失败')
}
throw new Error('网络错误,请检查网络连接')
}
export const passportClient = axios.create({
baseURL: `${getApiBaseUrl()}/passport`,
timeout: 15000,
headers: { 'Content-Type': 'application/json' },
})
export const adminClient = axios.create({
timeout: 15000,
headers: { 'Content-Type': 'application/json' },
})
adminClient.interceptors.request.use((config) => {
const securePath = getSecurePath()
config.baseURL = securePath
? `${getApiBaseUrl()}/${securePath}`
: getApiBaseUrl()
const token = getToken()
if (token) {
config.headers.Authorization = token
}
return config
})
passportClient.interceptors.response.use(
(res) => res,
(err) => handleError(err),
)
adminClient.interceptors.response.use(
(res) => res,
(err) => handleError(err),
)
+8
View File
@@ -0,0 +1,8 @@
import { passportClient } from './client'
import type { ApiResponse, LoginRequest, LoginResponse } from '@/types/api'
export function login(data: LoginRequest): Promise<ApiResponse<LoginResponse>> {
return passportClient
.post<ApiResponse<LoginResponse>>('/auth/login', data)
.then((res) => res.data)
}