当前位置: 首页 > news >正文

RuoYi.Net后端返回雪花ID前端精度丢失问题

遇到问题

RuoYi.Net 使用 Oracle库,SYS_MENU 菜单表的 MENU_ID 创建为 NUMBER(19) 类型,Vue 前端新增菜单保存到数据库的 MENU_ID ,以及后端返回给前端的 MENU_ID 没问题(ORM 使用的是SqlSugar,SqlSugar 新增入库时如果主键为 long 类型则自动生成雪花ID),但在前端显示时发现精度丢失,如下:

数据库中 MENUID1978349139955683328
前端显示 MENUID1978349139955683300

解决办法

参见 SqlSugar 官网: https://www.donet5.com/Doc/8nuge/2561

或者在 RuoYi.Admin\Startup.cs 中,修改如下代码:

 .AddNewtonsoftJson(options =>{// 忽略循环引用options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";// 忽略所有 null 属性//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;// long 类型序列化时转 string, 防止 JavaScript 出现精度溢出问题options.SerializerSettings.Converters.AddLongTypeConverters(); // 这一行扩展方法})

RuoYi.Framework\JsonSerialization\Extensions\NewtonsoftJsonExtensions.cs,如下:

using RuoYi.Framework.JsonSerialization;namespace Newtonsoft.Json;/// <summary>
/// Newtonsoft.Json 拓展
/// </summary>
[SuppressSniffer]
public static class NewtonsoftJsonExtensions
{/// <summary>/// 添加 DateTime/DateTime?/DateTimeOffset/DateTimeOffset? 类型序列化处理/// </summary>/// <param name="converters"></param>/// <param name="outputFormat"></param>/// <param name="localized">自动转换 DateTimeOffset 为当地时间</param>/// <returns></returns>public static IList<JsonConverter> AddDateTimeTypeConverters(this IList<JsonConverter> converters, string outputFormat = "yyyy-MM-dd HH:mm:ss", bool localized = false){converters.Add(new NewtonsoftJsonDateTimeJsonConverter(outputFormat));converters.Add(new NewtonsoftNullableJsonDateTimeJsonConverter(outputFormat));converters.Add(new NewtonsoftJsonDateTimeOffsetJsonConverter(outputFormat, localized));converters.Add(new NewtonsoftJsonNullableDateTimeOffsetJsonConverter(outputFormat, localized));return converters;}/// <summary>/// 添加 long/long? 类型序列化处理/// </summary>/// <param name="converters"></param>/// <param name="overMaxLengthOf17">是否超过最大长度 17 再处理</param>/// <remarks></remarks>public static IList<JsonConverter> AddLongTypeConverters(this IList<JsonConverter> converters, bool overMaxLengthOf17 = false){converters.Add(new NewtonsoftJsonLongToStringJsonConverter(overMaxLengthOf17));converters.Add(new NewtonsoftJsonNullableLongToStringJsonConverter(overMaxLengthOf17));return converters;}/// <summary>/// 添加 DateOnly/DateOnly? 类型序列化处理/// </summary>/// <param name="converters"></param>/// <returns></returns>public static IList<JsonConverter> AddDateOnlyConverters(this IList<JsonConverter> converters){
#if !NET5_0converters.Add(new NewtonsoftJsonDateOnlyJsonConverter());converters.Add(new NewtonsoftJsonNullableDateOnlyJsonConverter());
#endifreturn converters;}/// <summary>/// 添加 TimeOnly/TimeOnly? 类型序列化处理/// </summary>/// <param name="converters"></param>/// <returns></returns>public static IList<JsonConverter> AddTimeOnlyConverters(this IList<JsonConverter> converters){
#if !NET5_0converters.Add(new NewtonsoftJsonTimeOnlyJsonConverter());converters.Add(new NewtonsoftJsonNullableTimeOnlyJsonConverter());
#endifreturn converters;}
}

RuoYi.Framework\JsonSerialization\Converters\NewtonsoftJson\NewtonsoftJsonLongToStringJsonConverter.cs,如下:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;namespace RuoYi.Framework.JsonSerialization;/// <summary>
/// 解决 long 精度问题
/// </summary>
[SuppressSniffer]
public class NewtonsoftJsonLongToStringJsonConverter : JsonConverter<long>
{/// <summary>/// 构造函数/// </summary>public NewtonsoftJsonLongToStringJsonConverter(){}/// <summary>/// 构造函数/// </summary>/// <param name="overMaxLengthOf17"></param>public NewtonsoftJsonLongToStringJsonConverter(bool overMaxLengthOf17 = false){OverMaxLengthOf17 = overMaxLengthOf17;}/// <summary>/// 是否超过最大长度 17 再处理/// </summary>public bool OverMaxLengthOf17 { get; set; }/// <summary>/// 反序列化/// </summary>/// <param name="reader"></param>/// <param name="objectType"></param>/// <param name="existingValue"></param>/// <param name="hasExistingValue"></param>/// <param name="serializer"></param>/// <returns></returns>public override long ReadJson(JsonReader reader, Type objectType, long existingValue, bool hasExistingValue, JsonSerializer serializer){var jt = JValue.ReadFrom(reader);return jt.Value<long>();}/// <summary>/// 序列化/// </summary>/// <param name="writer"></param>/// <param name="value"></param>/// <param name="serializer"></param>public override void WriteJson(JsonWriter writer, long value, JsonSerializer serializer){if (OverMaxLengthOf17){if (value.ToString().Length <= 17) writer.WriteValue(value);else writer.WriteValue(value.ToString());}else writer.WriteValue(value.ToString());}
}/// <summary>
/// 解决 long? 精度问题
/// </summary>
[SuppressSniffer]
public class NewtonsoftJsonNullableLongToStringJsonConverter : JsonConverter<long?>
{/// <summary>/// 构造函数/// </summary>public NewtonsoftJsonNullableLongToStringJsonConverter(){}/// <summary>/// 构造函数/// </summary>/// <param name="overMaxLengthOf17"></param>public NewtonsoftJsonNullableLongToStringJsonConverter(bool overMaxLengthOf17 = false){OverMaxLengthOf17 = overMaxLengthOf17;}/// <summary>/// 是否超过最大长度 17 再处理/// </summary>public bool OverMaxLengthOf17 { get; set; }/// <summary>/// 反序列化/// </summary>/// <param name="reader"></param>/// <param name="objectType"></param>/// <param name="existingValue"></param>/// <param name="hasExistingValue"></param>/// <param name="serializer"></param>/// <returns></returns>public override long? ReadJson(JsonReader reader, Type objectType, long? existingValue, bool hasExistingValue, JsonSerializer serializer){var jt = JValue.ReadFrom(reader);return jt.Value<long?>();}/// <summary>/// 序列化/// </summary>/// <param name="writer"></param>/// <param name="value"></param>/// <param name="serializer"></param>public override void WriteJson(JsonWriter writer, long? value, JsonSerializer serializer){if (value == null) writer.WriteNull();else{var newValue = value.Value;if (OverMaxLengthOf17){if (newValue.ToString().Length <= 17) writer.WriteValue(newValue);else writer.WriteValue(newValue.ToString());}else writer.WriteValue(newValue.ToString());}}
}
http://www.dtcms.com/a/488073.html

相关文章:

  • asp网站连不上数据库网站自动化开发
  • 云信im在Android中的使用2
  • 朴素贝叶斯分类
  • pos网站源码wordpress上线需要改什么
  • 阿里巴巴上怎样做自己的网站郑州网站制作
  • 【ComfyUI】SDXL Simple 实现高质量图像生成全流程
  • 基于 STM32CubeMX 实现 FreeRTOS 可视化移植的多任务 LED 控制实践(基于 STM32F103ZET6)
  • 网站制作自己接单微分销代理
  • it项目网站开发的需求文档北京网站设计培训学校
  • Fragment与Fragment、Activity通信的方式?
  • 中建西部建设网站网站网页设计基本理论
  • wordpress网站有哪些免费的ppt模板下载软件
  • 目标检测全解析
  • 微企点网站建设的教学视频小程序定制开发要多少钱
  • 玩机搞机基本常识-------安卓刷机与 ROOT:从基础概念到工具选择指南 基础玩机 一
  • 查看你电脑上某个端口正在被哪个进程占用
  • 垦利网站建设建筑网建筑规范大全
  • wordpress标题标签10个网站用户体验优化的研究结果
  • 没有网站怎么做推广网站开发文献综述
  • 网站建设速成班培训免费公司网址怎么注册
  • 今日训练 ——线段树与二分法
  • PyQt5事件机制
  • 建盏十大高端客户合肥搜索优化排名
  • DeviceNet 转 CC-Link IE 实现欧姆龙 NJ 与西门子 S7-1500 在汽车焊接质量监控系统的集成应用
  • 建立网站的正确方法网站导航排版布局
  • 免费论坛网站大全广州哪个区封了
  • 【JSP程序设计】作用域通信对象 — pageContext对象
  • wordpress视频 小程序志鸿优化设计电子版
  • 专做运动品牌的网站佛山顺德做网站
  • 黔西南州做网站js网站开发视频