Skip to content

MineAdmin中会自动将过滤条件 filter[site.name] 转换为 filter[site][name] #1

@daixinguo

Description

@daixinguo

在 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;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions