116 lines
2.9 KiB
JavaScript
116 lines
2.9 KiB
JavaScript
import axios from 'axios'
|
||
|
||
// 婚礼纪业务 API:统一走 /api 代理到 Go 后端 (:8080)
|
||
// 后端返回约定:{ code: 200, data, msg } 视为成功
|
||
const service = axios.create({
|
||
baseURL: '/api',
|
||
timeout: 15000,
|
||
})
|
||
|
||
// 请求拦截:受保护接口自动携带后台 token
|
||
service.interceptors.request.use((config) => {
|
||
const token = localStorage.getItem('admin_token')
|
||
if (token) {
|
||
config.headers = config.headers || {}
|
||
config.headers['Authorization'] = `Bearer ${token}`
|
||
}
|
||
return config
|
||
})
|
||
|
||
// 响应拦截:统一把 { code: 200, data } 形态解包
|
||
service.interceptors.response.use(
|
||
(response) => {
|
||
const body = response.data
|
||
// 后端标准包:{ code, data/msg/error }
|
||
if (body && typeof body === 'object' && 'code' in body) {
|
||
if (body.code === 200) return body
|
||
return Promise.reject(new Error(body.msg || body.error || '请求失败'))
|
||
}
|
||
// 没有 code 包裹(如 401 {error})视为失败
|
||
if (body && typeof body === 'object' && 'error' in body) {
|
||
return Promise.reject(new Error(body.error))
|
||
}
|
||
return body
|
||
},
|
||
(error) => {
|
||
const status = error?.response?.status
|
||
if (status === 401) {
|
||
localStorage.removeItem('admin_token')
|
||
localStorage.removeItem('admin_user')
|
||
}
|
||
const body = error?.response?.data
|
||
const msg = body?.error || body?.msg || error.message || '请求失败'
|
||
return Promise.reject(new Error(msg))
|
||
}
|
||
)
|
||
|
||
export function getConfig() {
|
||
return service.get('/config')
|
||
}
|
||
|
||
export function getAlbumImages() {
|
||
return service.get('/album')
|
||
}
|
||
|
||
export function saveConfig(payload) {
|
||
return service.post('/config', payload)
|
||
}
|
||
|
||
export function getUploadConfig() {
|
||
return service.get('/upload/config')
|
||
}
|
||
|
||
export function saveUploadConfig(payload) {
|
||
return service.post('/upload/config', payload)
|
||
}
|
||
|
||
export function uploadImage(file) {
|
||
const form = new FormData()
|
||
form.append('file', file)
|
||
return service.post('/upload', form, {
|
||
headers: { 'Content-Type': 'multipart/form-data' },
|
||
})
|
||
}
|
||
|
||
export function submitRsvp(form) {
|
||
return service.post('/rsvp', form)
|
||
}
|
||
|
||
export function getRsvpList() {
|
||
return service.get('/rsvp/list')
|
||
}
|
||
|
||
export function getDanmaku(params) {
|
||
return service.get('/danmaku', { params })
|
||
}
|
||
|
||
export function submitDanmaku(form) {
|
||
return service.post('/danmaku', form)
|
||
}
|
||
|
||
export function generateAiBlessing({ style }) {
|
||
return service.post('/ai/blessing', { style }, { timeout: 45000 })
|
||
}
|
||
|
||
export function getDanmakuList(params) {
|
||
return service.get('/danmaku/list', { params })
|
||
}
|
||
|
||
export function updateDanmakuStatus(id, status) {
|
||
return service.post(`/danmaku/${id}/status`, { status })
|
||
}
|
||
|
||
export function getLikeStatus(clientId) {
|
||
return service.get('/like', { params: { client_id: clientId } })
|
||
}
|
||
|
||
export function submitLike(clientId) {
|
||
return service.post('/like', { client_id: clientId })
|
||
}
|
||
|
||
export function adminLogin(credentials) {
|
||
return service.post('/admin/login', credentials)
|
||
}
|
||
|
||
export default service
|