问题排查首先在每一个用到a-silder中的值的代码中去添加打印语句,发现是因为postAction提交请求后将请求数据体中的数值类型转化为了字符串类型,源码如下
export function postAction(url,parameter) {
//这一步中将请求参数中的数值类型转化为了字符串
let sign = signMd5Utils.getSign(url, parameter);
//将签名和时间戳,添加在请求接口 Header
// update-begin--author:taoyan---date:20220421--for: VUEN-410【签名改造】 X-TIMESTAMP牵扯
let signHeader = {"X-Sign": sign,"X-TIMESTAMP": signMd5Utils.getTimestamp()};
// update-end--author:taoyan---date:20220421--for: VUEN-410【签名改造】 X-TIMESTAMP牵扯
return axios({
url: url,
method:'post' ,
data: parameter,
headers: signHeader
})
}
点击getSign跳转到对应的实现方法,中的mergeObject将请求参数中的数值类型转化为了字符串类型
static getSign(url, requestParams) {
let urlParams = this.parseQueryString(url);
let jsonObj = this.mergeObject(urlParams, requestParams);
//console.log("sign jsonObj: ",jsonObj)
let requestBody = this.sortAsc(jsonObj);
//清空对象
console.log("sign requestBody: ",requestBody)
return md5(JSON.stringify(requestBody) + signatureSecret).toUpperCase();
}
/**
* @returns {*} 将两个对象合并成一个
*/
static mergeObject(objectOne, objectTwo) {
if (objectTwo && Object.keys(objectTwo).length > 0) {
for (let key in objectTwo) {
if (objectTwo.hasOwnProperty(key) === true) {
//数字值转为string类型,前后端加密规则保持一致
if(this.myIsNaN(objectTwo[key])){
objectTwo[key] = objectTwo[key].toString()
}
objectOne[key] = objectTwo[key];
}
}
}
return objectOne;
}
找到问题的关键后,我们使用Object.assgin新建一个临时对象copy请求参数,然后通过这个copy的请求参数对象去获取sign,在获取成功后将copy的请求参数清空,修改后的代码如下:
static getSign(url, requestParams) {
let urlParams = this.parseQueryString(url);
//解决对象中数值类型转化为字符串问题页面报错
let tempParams = Object.assign({}, requestParams);
let jsonObj = this.mergeObject(urlParams, tempParams);
//console.log("sign jsonObj: ",jsonObj)
let requestBody = this.sortAsc(jsonObj);
//清空对象
Object.assign(tempParams, {});
console.log("sign requestBody: ",requestBody)
return md5(JSON.stringify(requestBody) + signatureSecret).toUpperCase();
}