2026-07-30 18:00:27 +08:00
|
|
|
|
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')
|
|
|
|
|
|
}
|
|
|
|
|
|
return Promise.reject(error)
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
export function getConfig() {
|
|
|
|
|
|
return service.get('/config')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-01 12:36:58 +08:00
|
|
|
|
export function getAlbumImages() {
|
|
|
|
|
|
return service.get('/album')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-30 18:00:27 +08:00
|
|
|
|
export function saveConfig(payload) {
|
|
|
|
|
|
return service.post('/config', payload)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-31 13:09:49 +08:00
|
|
|
|
export function getUploadConfig() {
|
|
|
|
|
|
return service.get('/upload/config')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function saveUploadConfig(payload) {
|
|
|
|
|
|
return service.post('/upload/config', payload)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-30 18:00:27 +08:00
|
|
|
|
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 adminLogin(credentials) {
|
|
|
|
|
|
return service.post('/admin/login', credentials)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default service
|