若依导出详解(导出传数组的优化)
导入若依框架,找到若依对应的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, "数据");
}
测试,成功接收;