refactor: 统一接口响应格式处理

- 修改 axios 响应拦截器,统一处理包装后的响应格式:
  - code === 0: 返回 data 中的实际数据
  - code === -1: ElMessage.error 提示 message 并 reject
  - 其他情况: 兼容原始响应格式

- 更新各页面数据取值方式:
  - 分页列表: data.data → data.list
  - SystemUser.vue, SystemRole.vue, Article.vue
  - Music.vue, Hitokoto.vue, PhotoWall.vue, SourceImage.vue
  - SystemConfigAdd.vue: data.data.exists → data.exists

- Home.vue: 简化 verifyToken 响应处理
- SystemConfig.vue: 简化 save 响应处理
- SystemRole.vue/SystemUser.vue: 简化 delete 响应处理

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
灌糖包子 2026-03-21 11:46:15 +08:00
parent 4bad97a81d
commit 4dd48489a5
Signed by: sookie
GPG Key ID: 0599BECB75C1E68D
11 changed files with 54 additions and 67 deletions

View File

@ -23,16 +23,29 @@ http.interceptors.request.use(config => {
})
http.interceptors.response.use(res => {
const responseBody = res.data
// 统一响应格式处理
switch (responseBody.code) {
case 0:
// 成功,直接返回数据
return responseBody.data
case -1:
// 失败,显示错误信息
ElMessage.error(responseBody.message || '请求失败')
return Promise.reject(new Error(responseBody.message || '请求失败'))
default:
// 其他情况,兼容没有包装格式的响应
return res.data
}
}, err => {
if (err.response.status >= 500) {
if (err.response?.status >= 500) {
ElMessage.error('服务器内部错误')
} else if (err.response.status >= 400) {
if (typeof err.response.data.message === 'string') {
ElMessage.warning(err.response.data.message)
} else if (Array.isArray(err.response.data.message)) {
let message = err.response.data.message.join('<br/>')
ElMessage.warning(message)
} else if (err.response?.status >= 400) {
const message = err.response.data?.message
if (typeof message === 'string') {
ElMessage.error(message)
} else if (Array.isArray(message)) {
ElMessage.error(message.join('<br/>'))
}
if (err.response.status === 403) {
router.push('/login')

View File

@ -91,11 +91,9 @@ if (!store.state.loginInfo.token) {
router.push('/login')
} else {
http.post<{token: string}, any>('/api/v2/common/verifyToken', {token: store.state.loginInfo.token}).then(data => {
if (data.status) {
store.commit('login', {token: data.newToken || store.state.loginInfo.token, userInfo: data.userInfo})
} else {
}).catch(() => {
router.push('/login')
}
})
}

View File

@ -105,7 +105,7 @@ async function loadData() {
selectedData = []
loading.value = false
total.value = data.total
hitokotoData.value = data.data
hitokotoData.value = data.list
}
setLoadData(loadData)

View File

@ -211,7 +211,7 @@ async function loadData() {
selectedIds = []
loading.value = false
total.value = data.total
musicData.value = data.data
musicData.value = data.list
}
setLoadData(loadData)

View File

@ -117,7 +117,7 @@ async function loadData() {
selectedData = []
loading.value = false
total.value = data.total
photowallData.value = data.data
photowallData.value = data.list
}
setLoadData(loadData)

View File

@ -112,7 +112,7 @@ async function loadData(): Promise<void> {
selectedData = []
loading.value = false
total.value = data.total
sourceImageData.value = data.data
sourceImageData.value = data.list
}
setLoadData(loadData)

View File

@ -165,7 +165,7 @@ async function loadData() {
selectedData = []
loading.value = false
total.value = data.total
articleData.value = data.data
articleData.value = data.list
}
setLoadData(loadData)
@ -175,24 +175,16 @@ function splitWord() {
return
}
ElMessageBox.confirm(`是否确认对选中的${selectedData.length}篇文章执行分词处理?`, '操作确认', {type: 'info'}).then(async () => {
const data = await http.put<{_ids: string[]}, any>('/api/v2/article/splitWord', {_ids: selectedData})
if (data.status) {
ElMessage.success(data.message)
} else {
ElMessage.warning(data.message)
}
}).catch(() => {})
const successNum = await http.put<{_ids: string[]}, any>('/api/v2/article/splitWord', {_ids: selectedData})
ElMessage.success(`${successNum}篇文章分词处理成功`)
})
}
function pullArticles() {
ElMessageBox.confirm('确认拉取全部文章?', '操作确认', {type: 'info'}).then(async () => {
const data = await http.put<never, any>('/api/v2/article/pull')
if (data.status) {
ElMessage.success(data.message)
const { updateCount, createCount } = await http.put<never, any>('/api/v2/article/pull')
ElMessage.success(`拉取文章完成,更新 ${updateCount} 篇,创建 ${createCount}`)
loadData()
} else {
ElMessage.warning(data.message)
}
}).catch(() => {})
})
}
function dataSelect(selection: ArticleModel[]) {
selectedData = selection.map(item => item._id)

View File

@ -122,14 +122,10 @@ async function save() {
function remove(row: SystemConfigModel) {
ElMessageBox.confirm(`是否确认删除 ${row.name} 配置项?`, '确认删除', {type: 'warning'}).then(async () => {
const data = await http.delete<{params: {id: string}}, any>('/api/v2/system/config/delete', {params: {id: row._id}})
if(data.code === 0) {
ElMessage.success(data.message)
await http.delete<{params: {id: string}}, any>('/api/v2/system/config/delete', {params: {id: row._id}})
ElMessage.success('删除成功')
loadData()
} else {
ElMessage.warning(data.message)
}
}).catch(() => {})
})
}
function datetimeFormat(dateStr: string) {

View File

@ -36,7 +36,7 @@ const ruleValidate = computed(() => ({
{ required: true, message: '请输入配置项名称', trigger: 'blur' },
{ validator: (rule: object, value: string, callback: Function) => {
http.get<any, any>('/api/v2/system/config/exists', {params: {name: value, id: props.formData._id}}).then(data => {
if(data.data.exists) {
if(data.exists) {
callback(new Error('配置项名称已存在'))
} else {
callback()

View File

@ -143,7 +143,7 @@ async function loadData() {
const data = await http.get<{params: SystemRolePage}, any>('/api/v2/system/role/list', {params: search})
loading.value = false
total.value = data.total
systemRoleData.value = data.data
systemRoleData.value = data.list
}
setLoadData(loadData)
@ -195,14 +195,10 @@ function update(row: SystemRoleModel) {
function remove(row: SystemRoleModel) {
ElMessageBox.confirm(`是否确认删除 ${row.name} 角色?`, '确认删除', {type: 'warning'}).then(async () => {
const data = await http.delete<{params: {id: string}}, any>('/api/v2/system/role/delete', {params: {id: row._id}})
if(data.code === 0) {
ElMessage.success(data.message)
await http.delete<{params: {id: string}}, any>('/api/v2/system/role/delete', {params: {id: row._id}})
ElMessage.success('删除成功')
loadData()
} else {
ElMessage.warning(data.message)
}
}).catch(() => {})
})
}
async function save() {

View File

@ -55,7 +55,7 @@
<el-form-item label="昵称" prop="realname">
<el-input v-model="formData.realname" />
</el-form-item>
<el-form-item label="角色" prop="realname">
<el-form-item label="角色" prop="roleIds">
<el-select v-model="formData.roleIds" multiple >
<el-option v-for="role in roles" :key="role._id" :value="role._id" :label="role.name"></el-option>
</el-select>
@ -110,12 +110,8 @@ const ruleValidate = computed(() => ({
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ validator: async (rule: object, value: string, callback: Function) => {
const data = await http.get<any, any>('/api/v2/system/user/exists', {params: {username: value, id: formData._id}})
if(data.data.exists) {
callback(new Error('用户名已存在'))
} else {
callback()
}
const res = await http.get<any, any>('/api/v2/system/user/exists', {params: {username: value, id: formData._id}})
res.exists ? callback(new Error('用户名已存在')) : callback()
}, trigger: 'blur'
}
],
@ -131,7 +127,7 @@ async function loadData() {
const data = await http.get<{params: SystemUserPage}, any>('/api/v2/system/user/list', {params: search})
loading.value = false
total.value = data.total
systemUserData.value = data.data
systemUserData.value = data.list
}
setLoadData(loadData)
@ -174,14 +170,10 @@ async function save() {
function remove(row: SystemUserModel) {
ElMessageBox.confirm(`是否确认删除 ${row.username} 用户?`, '确认删除', {type: 'warning'}).then(async () => {
const data = await http.delete<{params: {id: string}}, any>('/api/v2/system/user/delete', {params: {id: row._id}})
if(data.code === 0) {
ElMessage.success(data.message)
await http.delete<{params: {id: string}}, any>('/api/v2/system/user/delete', {params: {id: row._id}})
ElMessage.success('删除成功')
loadData()
} else {
ElMessage.warning(data.message)
}
}).catch(() => {})
})
}
function clearValidate() {