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 => { http.interceptors.response.use(res => {
return res.data 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 => { }, err => {
if (err.response.status >= 500) { if (err.response?.status >= 500) {
ElMessage.error('服务器内部错误') ElMessage.error('服务器内部错误')
} else if (err.response.status >= 400) { } else if (err.response?.status >= 400) {
if (typeof err.response.data.message === 'string') { const message = err.response.data?.message
ElMessage.warning(err.response.data.message) if (typeof message === 'string') {
} else if (Array.isArray(err.response.data.message)) { ElMessage.error(message)
let message = err.response.data.message.join('<br/>') } else if (Array.isArray(message)) {
ElMessage.warning(message) ElMessage.error(message.join('<br/>'))
} }
if (err.response.status === 403) { if (err.response.status === 403) {
router.push('/login') router.push('/login')

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -36,7 +36,7 @@ const ruleValidate = computed(() => ({
{ required: true, message: '请输入配置项名称', trigger: 'blur' }, { required: true, message: '请输入配置项名称', trigger: 'blur' },
{ validator: (rule: object, value: string, callback: Function) => { { 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 => { 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('配置项名称已存在')) callback(new Error('配置项名称已存在'))
} else { } else {
callback() 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}) const data = await http.get<{params: SystemRolePage}, any>('/api/v2/system/role/list', {params: search})
loading.value = false loading.value = false
total.value = data.total total.value = data.total
systemRoleData.value = data.data systemRoleData.value = data.list
} }
setLoadData(loadData) setLoadData(loadData)
@ -195,14 +195,10 @@ function update(row: SystemRoleModel) {
function remove(row: SystemRoleModel) { function remove(row: SystemRoleModel) {
ElMessageBox.confirm(`是否确认删除 ${row.name} 角色?`, '确认删除', {type: 'warning'}).then(async () => { 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}}) await http.delete<{params: {id: string}}, any>('/api/v2/system/role/delete', {params: {id: row._id}})
if(data.code === 0) { ElMessage.success('删除成功')
ElMessage.success(data.message) loadData()
loadData() })
} else {
ElMessage.warning(data.message)
}
}).catch(() => {})
} }
async function save() { async function save() {

View File

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