首先采用数据库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 
        })

Logo

快速构建 Web 应用程序

更多推荐