首先采用数据库mysql id字段类型为bigint;
问题场景:使用IdWork.uuid();获取随机20位长整型数字;在vue页面进行根据id查询时,数据查不到;因为id和原纪录id不对应;最后几位全部是0;
之前采取的是后台java程序中将返回的vo实体id修改string类型;可以得到解决;
@TableId(value = "id",type = IdType.ID_WORKER)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
近期又遇到该问题,难道不能再前端解决吗?于是在一篇文档中查看了一个引入插件jsonbigint解决的方式,试了一下果然可以;
本人是在若依(ruoyi.vip)平台基础上做的调整,这里把原有的自增id修改为雪花id;
修改前端配置如下:
首先在vue端找到request.js 在axios统一处理时增加如下:
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
import JSONbig from 'json-bigint'
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API,
// `transformResponse` 在传递给 then/catch 前,允许修改响应数据
transformResponse: [function(data) {
try {
// 作用1:把json字符串转为js对象
// 作用2:把里面的大数字做安全处理
return JSONbig.parse(data)
} catch (e) {
return data
}
}],
// 超时
timeout: 10000
})
具体参考链接:https://blog.csdn.net/wz5208/article/details/111479717
补充:
最近使用这个遇到一个大神坑;生成id处理后;是分段处理的;存储为bignumber数组;如果第二段是0开头,就会丢失一位;真艹蛋;后续增加了验证方法;
方法如下(摒弃):
/**
* 解决JSONbig插件第二段为0开头丢失一位问题
* @param {*} data JSONbig 数组
*/
export function repairJSONbigBug(data) {
let val=String(data.join(""))
if(val.length<19){
val=val.slice(0, 5) + '0' + val.slice(5);
}
return val;
}
完善:
因为在处理数据时如果第二段内容有多个0开头被忽略,导致存储id和真实id不匹配,所以需要进行特殊处理:
export function repairJSONbigBug(data) {
let val=String(data.join(""))
if(val.length<19){
let count=19-val.length;
// 0的填充
let zeroCount='';
for(let a=0;a<count;a++){
zeroCount=zeroCount+'0'
}
val=val.slice(0, 5) + zeroCount + val.slice(5);
}
return val;
}
在应用端将这个值传入后重新接收:
that.messageAuthList.filter(item=>{
console.log("item.authId.c::"+item.authId.c)
let jsoNbigBug = repairJSONbigBug(item.authId.c)
console.log("jsoNbigBug::"+jsoNbigBug)
item.authId=jsoNbigBug
})