Files
jurong_circle_frontdesk/src/utils/api.js

266 lines
7.3 KiB
JavaScript
Raw Normal View History

2025-07-26 15:35:53 +08:00
import axios from 'axios'
import { ElMessage, ElLoading } from 'element-plus'
import router from '@/router'
// 创建axios实例
const api = axios.create({
baseURL: '/api',
timeout: 10000,
headers: {
'Content-Type': 'application/json'
}
})
// 初始化时设置token
const token = localStorage.getItem('token')
if (token) {
api.defaults.headers.common['Authorization'] = `Bearer ${token}`
}
// 请求拦截器
let loadingInstance = null
api.interceptors.request.use(
(config) => {
// 从localStorage获取token
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
// 显示加载动画(可选)
if (config.showLoading !== false) {
loadingInstance = ElLoading.service({
text: '加载中...',
background: 'rgba(0, 0, 0, 0.7)'
})
}
return config
},
(error) => {
if (loadingInstance) {
loadingInstance.close()
}
return Promise.reject(error)
}
)
// 响应拦截器
api.interceptors.response.use(
(response) => {
if (loadingInstance) {
loadingInstance.close()
}
return response
},
(error) => {
if (loadingInstance) {
loadingInstance.close()
}
// 处理不同的错误状态码
if (error.response) {
const { status, data } = error.response
switch (status) {
case 401:
2025-08-11 09:40:54 +08:00
// 未授权清除token并根据当前路由跳转到相应的登录页
2025-07-26 15:35:53 +08:00
localStorage.removeItem('token')
2025-08-11 09:40:54 +08:00
localStorage.removeItem('agentInfo') // 清除代理信息
2025-07-26 15:35:53 +08:00
delete api.defaults.headers.common['Authorization']
2025-08-11 09:40:54 +08:00
// 判断当前是否在代理相关页面
const currentPath = router.currentRoute.value.path
if (currentPath.startsWith('/agent')) {
2025-09-03 14:20:40 +08:00
router.push('/agent/mylogin')
2025-08-11 09:40:54 +08:00
ElMessage.error('代理登录已过期,请重新登录')
} else {
2025-09-03 14:20:40 +08:00
router.push({ name: 'MyLogin' })
2025-08-11 09:40:54 +08:00
ElMessage.error('登录已过期,请重新登录')
}
2025-07-26 15:35:53 +08:00
break
case 403:
// 检查是否是用户被拉黑
if (data.code === 'USER_BLACKLISTED') {
// 清除token并跳转到登录页
localStorage.removeItem('token')
delete api.defaults.headers.common['Authorization']
2025-09-03 14:20:40 +08:00
router.push({ name: 'MyLogin' })
2025-07-26 15:35:53 +08:00
ElMessage.error(data.message || '账户已被拉黑,请联系管理员')
2025-09-03 09:13:29 +08:00
} else if (data.code === 'PAYMENT_REQUIRED') {
// 需要支付,跳转到支付页面
// 只在不是支付页面时才跳转和显示消息,避免重复通知
if (router.currentRoute.value.name !== 'Payment') {
router.push({ name: 'Payment' })
ElMessage.warning(data.message || '您的账户尚未激活,请完成支付后再使用')
}
2025-07-26 15:35:53 +08:00
} else {
ElMessage.error(data.message || '权限不足')
}
break
case 404:
ElMessage.error(data.message || '请求的资源不存在')
break
case 422:
ElMessage.error(data.message || '请求参数错误')
break
case 429:
ElMessage.error('请求过于频繁,请稍后再试')
break
case 500:
ElMessage.error('服务器内部错误')
break
2025-08-01 09:33:46 +08:00
case 400:
// 处理业务逻辑错误(如坏账等)
ElMessage.error(data.error?.message || data.message || '请求失败')
break
2025-07-26 15:35:53 +08:00
default:
2025-08-01 09:33:46 +08:00
ElMessage.error(data.error?.message || data.message || '请求失败')
2025-07-26 15:35:53 +08:00
}
} else if (error.request) {
// 网络错误
ElMessage.error('网络连接失败,请检查网络设置')
} else {
// 其他错误
ElMessage.error('请求配置错误')
}
return Promise.reject(error)
}
)
// 封装常用的请求方法
export const request = {
get: (url, config = {}) => api.get(url, config),
post: (url, data = {}, config = {}) => api.post(url, data, config),
put: (url, data = {}, config = {}) => api.put(url, data, config),
delete: (url, config = {}) => api.delete(url, config),
patch: (url, data = {}, config = {}) => api.patch(url, data, config)
}
// 用户相关API
export const userAPI = {
// 获取用户列表
getList: (params = {}) => request.get('/users', { params }),
// 获取用户详情
getDetail: (id) => request.get(`/users/${id}`),
// 更新用户信息
update: (id, data) => request.put(`/users/${id}`, data),
// 删除用户
delete: (id) => request.delete(`/users/${id}`),
// 获取用户统计
getStats: () => request.get('/users/stats/overview')
}
// 认证相关API
export const authAPI = {
// 登录
login: (data) => request.post('/auth/login', data),
// 注册
register: (data) => request.post('/auth/register', data),
// 获取当前用户信息
me: () => request.get('/auth/me'),
// 修改密码
changePassword: (data) => request.put('/auth/change-password', data)
}
// 验证码相关API
export const captchaAPI = {
// 生成验证码
generate: () => request.get('/captcha/generate'),
// 验证验证码
verify: (data) => request.post('/captcha/verify', data)
}
// 文件上传API
export const uploadAPI = {
// 上传图片
uploadImage: (file) => {
const formData = new FormData()
formData.append('image', file)
return request.post('/upload/image', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
},
// 上传文件
uploadFile: (file) => {
const formData = new FormData()
formData.append('file', file)
return request.post('/upload/file', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
}
// 转账相关API
export const transferAPI = {
// 获取公户信息
getPublicAccount: () => request.get('/transfers/public-account'),
// 创建转账记录
create: (data) => {
const formData = new FormData()
Object.keys(data).forEach(key => {
formData.append(key, data[key])
})
return request.post('/transfers', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
},
// 确认转账
confirm: (id) => request.put(`/transfers/${id}/confirm`),
// 拒绝转账
reject: (id) => request.put(`/transfers/${id}/reject`),
// 确认收款
confirmReceived: (id) => request.post('/transfers/confirm-received', { transfer_id: id }),
// 确认未收到款
confirmNotReceived: (id) => request.post('/transfers/confirm-not-received', { transfer_id: id }),
// 获取用户转账记录
getUserTransfers: (params = {}) => request.get('/transfers/user', { params }),
2025-08-21 10:21:57 +08:00
// 获取指定用户的转账记录
getUserTransfersByUserId: (userId, params = {}) => request.get(`/transfers/user/${userId}`, { params }),
2025-07-26 15:35:53 +08:00
// 获取待确认转账
getPendingTransfers: (params = {}) => request.get('/transfers/pending', { params }),
// 获取用户账户信息
getUserAccount: () => request.get('/transfers/account'),
// 获取转账列表(管理员)
getList: (params = {}) => request.get('/transfers', { params }),
// 获取转账统计
getStats: () => request.get('/transfers/stats')
}
export default api