在 MineAdmin 前端框架中,当过滤条件为 filter[site.name] 时,在实际发送请求后会将参数转换为 filter[site][name] 结构。需要对 MineAdmin 的 http.ts 进行调整。
文件:src/utils/http.ts
http.interceptors.request.use(
async (config) => {
isLoading.value = true
const userStore = useUserStore()
/**
* 全局拦截请求发送前提交的参数
*/
if (userStore.isLogin && config.headers) {
config.headers = Object.assign({
'Authorization': `Bearer ${userStore.token}`,
'Accept-Language': userStore.getLanguage(),
}, config.headers)
}
// 处理 filter[site.name] 形式的过滤条件
// 在框架中会自动将 filter[site.name] 转换为 filter[site][name],这里统一针对这类过滤条件进行处理(search-submit event 处理存在一些问题,修改参数后搜索表单的过滤条件会丢失)
if (config.params?.filter) {
const flattenedFilter = flattenObject(config.params.filter);
config.params.filter = flattenedFilter;
}
await usePluginStore().callHooks('networkRequest', config)
return config
},
)
// 将嵌套的对象转换为扁平化对象 如:将 { site: { name: 'test', ip: '123' } } 转换为 { site.name: 'test', site.ip: '123' }
function flattenObject(obj, parentKey = '', result = {}) {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
// 构建当前路径
const currentPath = parentKey ? `${parentKey}.${key}` : key;
const value = obj[key];
// 如果是纯对象则递归处理,否则保存值
if (isPlainObject(value)) {
flattenObject(value, currentPath, result);
} else {
result[currentPath] = value;
}
}
}
return result;
}
// 判断是否为纯对象(排除数组、null等其他对象类型)
function isPlainObject(value) {
return typeof value === 'object'
&& value !== null
&& value.constructor === Object;
}
在 MineAdmin 前端框架中,当过滤条件为 filter[site.name] 时,在实际发送请求后会将参数转换为 filter[site][name] 结构。需要对 MineAdmin 的 http.ts 进行调整。
文件:src/utils/http.ts