c77352877d
主要更新: 1. 统一所有微服务端口配置(19000-19008) 2. 为所有服务创建本地/测试/生产三套环境配置 3. 配置Nacos认证密码(本地:Peanut2817*#, 测试/生产:EmotionMuseum2025) 4. 优化网关路由配置,支持负载均衡和WebSocket 5. 新增emotion-websocket模块,支持实时聊天 6. 前端集成WebSocket,替代HTTP轮询 7. 添加配置验证和管理工具脚本 技术特性: - 完整的环境隔离和服务发现 - WebSocket实时通信支持 - 负载均衡路由配置 - 跨域和安全配置 - 自动重连和心跳检测
151 lines
3.5 KiB
TypeScript
151 lines
3.5 KiB
TypeScript
import axios from 'axios'
|
|
import type {
|
|
LoginRequest,
|
|
LoginResponse,
|
|
RegisterRequest,
|
|
CaptchaResponse,
|
|
ApiResponse,
|
|
RefreshTokenRequest,
|
|
ChangePasswordRequest,
|
|
ForgotPasswordRequest,
|
|
ResetPasswordRequest,
|
|
UserInfo
|
|
} from '@/types/auth'
|
|
|
|
// 创建axios实例
|
|
const authApi = axios.create({
|
|
baseURL: '/api/auth',
|
|
timeout: 10000,
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
})
|
|
|
|
// 请求拦截器
|
|
authApi.interceptors.request.use(
|
|
(config) => {
|
|
const token = localStorage.getItem('token')
|
|
if (token) {
|
|
config.headers.Authorization = `Bearer ${token}`
|
|
}
|
|
return config
|
|
},
|
|
(error) => {
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
// 响应拦截器
|
|
authApi.interceptors.response.use(
|
|
(response) => {
|
|
return response.data
|
|
},
|
|
(error) => {
|
|
if (error.response?.status === 401) {
|
|
// token过期,清除本地存储并跳转到登录页
|
|
localStorage.removeItem('token')
|
|
localStorage.removeItem('userInfo')
|
|
window.location.href = '/login'
|
|
}
|
|
return Promise.reject(error.response?.data || error)
|
|
}
|
|
)
|
|
|
|
export const authService = {
|
|
// 获取验证码
|
|
async getCaptcha(): Promise<CaptchaResponse> {
|
|
const response: ApiResponse<CaptchaResponse> = await authApi.get('/captcha')
|
|
return response.data
|
|
},
|
|
|
|
// 用户登录
|
|
async login(data: LoginRequest): Promise<ApiResponse<LoginResponse>> {
|
|
return await authApi.post('/login', data)
|
|
},
|
|
|
|
// 用户注册
|
|
async register(data: RegisterRequest): Promise<ApiResponse<UserInfo>> {
|
|
return await authApi.post('/register', data)
|
|
},
|
|
|
|
// 刷新token
|
|
async refreshToken(data: RefreshTokenRequest): Promise<ApiResponse<LoginResponse>> {
|
|
return await authApi.post('/refresh-token', data)
|
|
},
|
|
|
|
// 用户登出
|
|
async logout(): Promise<ApiResponse<void>> {
|
|
return await authApi.post('/logout')
|
|
},
|
|
|
|
// 获取用户信息
|
|
async getUserInfo(): Promise<ApiResponse<UserInfo>> {
|
|
return await authApi.get('/user-info')
|
|
},
|
|
|
|
// 修改密码
|
|
async changePassword(data: ChangePasswordRequest): Promise<ApiResponse<void>> {
|
|
return await authApi.post('/change-password', data)
|
|
},
|
|
|
|
// 忘记密码
|
|
async forgotPassword(data: ForgotPasswordRequest): Promise<ApiResponse<void>> {
|
|
return await authApi.post('/forgot-password', data)
|
|
},
|
|
|
|
// 重置密码
|
|
async resetPassword(data: ResetPasswordRequest): Promise<ApiResponse<void>> {
|
|
return await authApi.post('/reset-password', data)
|
|
},
|
|
|
|
// 验证token有效性
|
|
async validateToken(): Promise<ApiResponse<boolean>> {
|
|
return await authApi.get('/validate-token')
|
|
},
|
|
|
|
// 检查账号是否存在
|
|
async checkAccount(account: string): Promise<ApiResponse<boolean>> {
|
|
return await authApi.get(`/check-account?account=${account}`)
|
|
}
|
|
}
|
|
|
|
// 工具函数
|
|
export const authUtils = {
|
|
// 获取token
|
|
getToken(): string | null {
|
|
return localStorage.getItem('token')
|
|
},
|
|
|
|
// 设置token
|
|
setToken(token: string): void {
|
|
localStorage.setItem('token', token)
|
|
},
|
|
|
|
// 移除token
|
|
removeToken(): void {
|
|
localStorage.removeItem('token')
|
|
localStorage.removeItem('userInfo')
|
|
},
|
|
|
|
// 获取用户信息
|
|
getUserInfo(): UserInfo | null {
|
|
const userInfo = localStorage.getItem('userInfo')
|
|
return userInfo ? JSON.parse(userInfo) : null
|
|
},
|
|
|
|
// 设置用户信息
|
|
setUserInfo(userInfo: UserInfo): void {
|
|
localStorage.setItem('userInfo', JSON.stringify(userInfo))
|
|
},
|
|
|
|
// 检查是否已登录
|
|
isLoggedIn(): boolean {
|
|
return !!this.getToken()
|
|
},
|
|
|
|
// 清除所有认证信息
|
|
clearAuth(): void {
|
|
this.removeToken()
|
|
}
|
|
}
|