【若依框架导出优化(导出传参对象数组的优化)】

导入若依框架,找到若依对应的request.js文件

若依不得不说,作为低代码平台属实有点捞,看了看,很多东西都是把其他组件引入进来集成,并没有做几个自定义的东西,也没有对集成的东西进行优化,好像明着告诉你:“想扩展功能就去自己扩展,哎,我们只是集成了许多现成的组件”;并且,这些就都不说啥了,关键问题,耦合性太强了,想扩展又要tmd的去改封装好的底层,框架也有一堆毛病
吐槽就先到这,有些人因为需求问题,也是需要进行一定的优化的,讲讲如何去优化;
首先,导入若依框架,前后端分离版本,这也是最常用的版本了,然后找到request.js,一般在src/utils这个文件夹下面;

找到request.js下面的download方法,然后详细研究

一般页面中导出使用的就是download方法,写法自己生成代码或者自己去百度都能查到,一般都是this.download,而我的优化写法是:

    /** 导出按钮操作 */
    handleExport(row) {
      const ids = row.id || this.ids;
      this.$confirm("是否确认导出所选用户数据项?", "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          console.log(ids);
          this.download(
            "deblock/taskRequest/exportAcc",
            ids,
            `明细_${new Date().getTime()}.xlsx`
          );
        })
        .catch(function () { });
    },

这个ids是个数组,因为业务需求原因,我要将数组传递过去,但是我怎么操作都不行,最后翻看底层代码,知道了一切,你们也可以自己看,会发现有一段:

return service
    .post(url, params, {
      transformRequest: [
        (params) => {
          return tansParams(params);
        },
      ],
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
      },
      responseType: "blob",
      ...config,
    })

这一段中,tansParams(params);这个方法,看底层:

/**
* 参数处理
* @param {*} params  参数
*/
export function tansParams(params) {
  let result = ''
  for (const propName of Object.keys(params)) {
    const value = params[propName];
    var part = encodeURIComponent(propName) + "=";
    if (value !== null && value !== "" && typeof (value) !== "undefined") {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
            let params = propName + '[' + key + ']';
            var subPart = encodeURIComponent(params) + "=";
            result += subPart + encodeURIComponent(value[key]) + "&";
          }
        }
      } else {
        result += part + encodeURIComponent(value) + "&";
      }
    }
  }
  return result
}

看见了吗?好好捋一捋,发现不管什么数据进去都会被转成get请求后面拼接的那种参数格式;是不是发现了问题,使用的post请求,然后用的拼接参数的格式,那么我数组格式ids: [1, 2, 3]必定会被转成ids[0]: 1, ids[1]: 2, ids: [3]这种,当然,这种是解析过的,没有解析过的你们想看就自己f12操作;
接下来,既然知道了逻辑,也就很好操作了;

修改若依框架中他们写的很捞的download方法

我的修改很简单,直接使用三目运算:

return service
    .post(url, params, {
      transformRequest: [
        (params) => {
          return Array.isArray(params)
            ? JSON.stringify(params)
            : tansParams(params);
        },
      ],
      headers: {
        "Content-Type": Array.isArray(params)
          ? "application/json;charset=UTF-8"
          : "application/x-www-form-urlencoded;charset=utf-8",
      },
      responseType: "blob",
      ...config,
    })

我直接修改了return tansParams(params);这一段,修改为

return Array.isArray(params)
            ? JSON.stringify(params)
            : tansParams(params);

如果是数组,那么就使用JSON.stringify方法转换为json对象,如果不是数组,那么使用tansParams方法转换为拼接格式;然后细心的人应该发现了,我请求头也修改了,改成了三目运算:

      headers: {
        "Content-Type": Array.isArray(params)
          ? "application/json;charset=UTF-8"
          : "application/x-www-form-urlencoded;charset=utf-8",
      },

这一块,我建议也加上为好,因为我本来对网络这块也不熟,我也是问了ai,查了百度,然后写了这一段逻辑,但是经过几轮测试,我觉得数据格式应该跟这俩没关系,但测试下来,后端的@RequestBody和这俩是有关系的,建议加上,如果是数组要传到后端,然后使用@RequestBody接收的话,好像必须是要"application/json;charset=UTF-8"这个格式;

后端进行测试

/**
     * 导出解封数据
     */
    @PostMapping("/deblock/taskRequest/exportAcc")
    @ResponseBody
    public void export(HttpServletResponse response,@RequestBody List<String> ids)
    {
        QueryWrapper<TaskInfoEntity> taskInfoEntityQueryWrapper = new QueryWrapper<TaskInfoEntity>();
        taskInfoEntityQueryWrapper.in("id", ids);
        List<TaskInfoEntity> list = taskInfoRequestService.list(taskInfoEntityQueryWrapper);
        List<AccVo> accVos = accDetailService.toVo(list);
        ExcelUtil<AccVo> util = new ExcelUtil<AccVo>(AccVo.class);
        //不显示任务明细ID
        util.hideColumn("id");
        util.exportExcel(response,accVos, "数据");
    }

测试,成功接收;

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫罗兰永恒花圜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值