From 8823211fd9d1d346e798a3e931152f73ffeb7057 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Sun, 5 Mar 2023 19:31:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E5=9F=BA=E4=BA=8E?= =?UTF-8?q?=E9=98=BF=E9=87=8C=E5=B7=B4=E5=B7=B4=20Java=20=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=89=8B=E5=86=8C(=E9=BB=84=E5=B1=B1=E7=89=88)?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20Jackson=20=E8=B6=85=E5=A4=A7=E6=95=B4?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.编程规约>前后端规约>第6条: 【强制】对于需要使用超大整数的场景,服务端一律使用 String 字符串类型返回,禁止使用 Long 类型。 说明:Java 服务端如果直接返回 Long 整型数据给前端,Javascript 会自动转换为 Number 类型(注:此类型为双精度浮点数,表示原理与取值范围等同于 Java 中的 Double)。Long 类型能表示的最大值是 263-1,在取值范围之内,超过 253(9007199254740992)的数值转化为Javascript 的 Number 时,有些数值会产生精度损失。 扩展说明,在 Long 取值范围内,任何 2 的指数次的整数都是绝对不会存在精度损失的,所以说精度损失是一个概率问题。若浮点数尾数位与指数位空间不限,则可以精确表示任何整数,但很不幸,双精度浮点数的尾数位只有 52 位。 反例:通常在订单号或交易号大于等于 16 位,大概率会出现前后端订单数据不一致的情况。比如,后端传输的 "orderId":362909601374617692,前端拿到的值却是:362909601374617660 --- .../config/jackson/BigNumberSerializer.java | 55 ------------------- .../config/jackson/JacksonConfiguration.java | 12 ++-- continew-admin-ui/src/api/monitor/log.ts | 8 +-- continew-admin-ui/src/api/system/dept.ts | 8 +-- continew-admin-ui/src/api/system/menu.ts | 8 +-- continew-admin-ui/src/api/system/role.ts | 10 ++-- continew-admin-ui/src/api/system/user.ts | 16 +++--- .../src/store/modules/login/index.ts | 4 +- .../src/store/modules/login/types.ts | 4 +- .../src/views/monitor/log/system/index.vue | 2 +- .../src/views/system/dept/index.vue | 8 +-- .../src/views/system/menu/index.vue | 6 +- .../src/views/system/role/index.vue | 8 +-- .../src/views/system/user/index.vue | 20 +++---- 14 files changed, 57 insertions(+), 112 deletions(-) delete mode 100644 continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/BigNumberSerializer.java diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/BigNumberSerializer.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/BigNumberSerializer.java deleted file mode 100644 index b8579d16..00000000 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/BigNumberSerializer.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package top.charles7c.cnadmin.common.config.jackson; - -import java.io.IOException; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; -import com.fasterxml.jackson.databind.ser.std.NumberSerializer; - -/** - * 大数值序列化器(针对数值超出 JS 最大或最小值的情况,将其转换为字符串) - * - * @author Charles7c - * @since 2022/12/11 13:22 - */ -@JacksonStdImpl -public class BigNumberSerializer extends NumberSerializer { - - /** 静态实例 */ - public static final BigNumberSerializer SERIALIZER_INSTANCE = new BigNumberSerializer(Number.class); - /** JS:Number.MAX_SAFE_INTEGER */ - private static final long MAX_SAFE_INTEGER = 9007199254740991L; - /** JS:Number.MIN_SAFE_INTEGER */ - private static final long MIN_SAFE_INTEGER = -9007199254740991L; - - public BigNumberSerializer(Class rawType) { - super(rawType); - } - - @Override - public void serialize(Number value, JsonGenerator generator, SerializerProvider provider) throws IOException { - // 序列化为字符串 - if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { - super.serialize(value, generator, provider); - } else { - generator.writeString(value.toString()); - } - } -} diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/JacksonConfiguration.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/JacksonConfiguration.java index 9988da00..1140edfe 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/JacksonConfiguration.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/config/jackson/JacksonConfiguration.java @@ -61,11 +61,11 @@ public class JacksonConfiguration { @Bean public Jackson2ObjectMapperBuilderCustomizer customizer() { return builder -> { - // 针对数值类型:Long、BigInteger、BigDecimal 的序列化和反序列化 JavaTimeModule javaTimeModule = new JavaTimeModule(); - javaTimeModule.addSerializer(Long.class, BigNumberSerializer.SERIALIZER_INSTANCE); - javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.SERIALIZER_INSTANCE); - javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.SERIALIZER_INSTANCE); + // 针对数值类型:Long、BigInteger、BigDecimal 的序列化 + javaTimeModule.addSerializer(Long.class, ToStringSerializer.instance); + javaTimeModule.addSerializer(Long.TYPE, ToStringSerializer.instance); + javaTimeModule.addSerializer(BigInteger.class, ToStringSerializer.instance); javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); // 针对时间类型:LocalDateTime、LocalDate、LocalTime 的序列化和反序列化 @@ -80,9 +80,9 @@ public class JacksonConfiguration { DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(StringConsts.NORM_TIME_PATTERN); javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter)); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter)); - builder.modules(javaTimeModule); builder.timeZone(TimeZone.getDefault()); - log.info(">>>初始化 Jackson 配置<<<"); + builder.modules(javaTimeModule); + log.info(">>>初始化 Jackson 序列化配置<<<"); }; } diff --git a/continew-admin-ui/src/api/monitor/log.ts b/continew-admin-ui/src/api/monitor/log.ts index c8571868..feff06a7 100644 --- a/continew-admin-ui/src/api/monitor/log.ts +++ b/continew-admin-ui/src/api/monitor/log.ts @@ -4,7 +4,7 @@ import qs from 'query-string'; const BASE_URL = '/monitor/log'; export interface LogRecord { - logId?: number; + logId?: string; clientIp: string; location: string; browser: string; @@ -65,7 +65,7 @@ export interface OperationLogParam extends Partial { page: number; size: number; sort: Array; - uid?: number; + uid?: string; } export interface OperationLogListRes { @@ -102,6 +102,6 @@ export function listSystemLog(params: SystemLogParam) { }); } -export function getSystemLog(logId: number) { - return axios.get(`${BASE_URL}/system/${logId}`); +export function getSystemLog(id: string) { + return axios.get(`${BASE_URL}/system/${id}`); } diff --git a/continew-admin-ui/src/api/system/dept.ts b/continew-admin-ui/src/api/system/dept.ts index 0a36d3b9..eb209c94 100644 --- a/continew-admin-ui/src/api/system/dept.ts +++ b/continew-admin-ui/src/api/system/dept.ts @@ -4,9 +4,9 @@ import qs from 'query-string'; const BASE_URL = '/system/dept'; export interface DeptRecord { - deptId?: number; + deptId?: string; deptName: string; - parentId?: number; + parentId?: string; description?: string; deptSort: number; status?: number; @@ -32,7 +32,7 @@ export function listDept(params: DeptParam) { }); } -export function getDept(id: number) { +export function getDept(id: string) { return axios.get(`${BASE_URL}/${id}`); } @@ -44,6 +44,6 @@ export function updateDept(req: DeptRecord) { return axios.put(BASE_URL, req); } -export function deleteDept(ids: number | Array) { +export function deleteDept(ids: string | Array) { return axios.delete(`${BASE_URL}/${ids}`); } diff --git a/continew-admin-ui/src/api/system/menu.ts b/continew-admin-ui/src/api/system/menu.ts index c88c046e..7a8b30ad 100644 --- a/continew-admin-ui/src/api/system/menu.ts +++ b/continew-admin-ui/src/api/system/menu.ts @@ -4,9 +4,9 @@ import qs from 'query-string'; const BASE_URL = '/system/menu'; export interface MenuRecord { - menuId?: number; + menuId?: string; menuName: string; - parentId?: number; + parentId?: string; menuType: number; path?: string; name?: string; @@ -40,7 +40,7 @@ export function listMenu(params: MenuParam) { }); } -export function getMenu(id: number) { +export function getMenu(id: string) { return axios.get(`${BASE_URL}/${id}`); } @@ -52,6 +52,6 @@ export function updateMenu(req: MenuRecord) { return axios.put(BASE_URL, req); } -export function deleteMenu(ids: number | Array) { +export function deleteMenu(ids: string | Array) { return axios.delete(`${BASE_URL}/${ids}`); } diff --git a/continew-admin-ui/src/api/system/role.ts b/continew-admin-ui/src/api/system/role.ts index 14e13c91..c206fc16 100644 --- a/continew-admin-ui/src/api/system/role.ts +++ b/continew-admin-ui/src/api/system/role.ts @@ -4,14 +4,14 @@ import qs from 'query-string'; const BASE_URL = '/system/role'; export interface RoleRecord { - roleId?: number; + roleId?: string; roleName: string; roleCode?: string; roleSort?: number; description?: string; - menuIds?: Array; + menuIds?: Array; dataScope: number; - deptIds?: Array; + deptIds?: Array; status?: number; createUserString?: string; createTime?: string; @@ -42,7 +42,7 @@ export function listRole(params: RoleParam) { }); } -export function getRole(id: number) { +export function getRole(id: string) { return axios.get(`${BASE_URL}/${id}`); } @@ -54,6 +54,6 @@ export function updateRole(req: RoleRecord) { return axios.put(BASE_URL, req); } -export function deleteRole(ids: number | Array) { +export function deleteRole(ids: string | Array) { return axios.delete(`${BASE_URL}/${ids}`); } diff --git a/continew-admin-ui/src/api/system/user.ts b/continew-admin-ui/src/api/system/user.ts index e60945c9..a85174aa 100644 --- a/continew-admin-ui/src/api/system/user.ts +++ b/continew-admin-ui/src/api/system/user.ts @@ -4,7 +4,7 @@ import qs from 'query-string'; const BASE_URL = '/system/user'; export interface UserRecord { - userId?: number; + userId?: string; username: string; nickname: string; gender: number; @@ -17,9 +17,9 @@ export interface UserRecord { createTime?: string; updateUserString?: string; updateTime?: string; - deptId?: number; + deptId?: string; deptName?: string; - roleIds?: Array; + roleIds?: Array; roleNames?: Array; disabled?: boolean; } @@ -47,7 +47,7 @@ export function listUser(params: UserParam) { }); } -export function getUser(id: number) { +export function getUser(id: string) { return axios.get(`${BASE_URL}/${id}`); } @@ -59,18 +59,18 @@ export function updateUser(req: UserRecord) { return axios.put(BASE_URL, req); } -export function deleteUser(ids: number | Array) { +export function deleteUser(ids: string | Array) { return axios.delete(`${BASE_URL}/${ids}`); } -export function resetPassword(id: number) { +export function resetPassword(id: string) { return axios.patch(`${BASE_URL}/${id}/password`); } export interface UpdateUserRoleReq { - roleIds?: Array; + roleIds?: Array; } -export function updateUserRole(req: UpdateUserRoleReq, id: number) { +export function updateUserRole(req: UpdateUserRoleReq, id: string) { return axios.patch(`${BASE_URL}/${id}/role`, req); } diff --git a/continew-admin-ui/src/store/modules/login/index.ts b/continew-admin-ui/src/store/modules/login/index.ts index 7a9c6870..5ea60b8e 100644 --- a/continew-admin-ui/src/store/modules/login/index.ts +++ b/continew-admin-ui/src/store/modules/login/index.ts @@ -13,7 +13,7 @@ import useAppStore from '../app'; const useLoginStore = defineStore('user', { state: (): UserState => ({ - userId: 0, + userId: '', username: '', nickname: '', gender: 0, @@ -23,7 +23,7 @@ const useLoginStore = defineStore('user', { description: undefined, pwdResetTime: undefined, registrationDate: undefined, - deptId: 0, + deptId: '', deptName: '', permissions: [], roles: [], diff --git a/continew-admin-ui/src/store/modules/login/types.ts b/continew-admin-ui/src/store/modules/login/types.ts index d08e5d84..ace7c33b 100644 --- a/continew-admin-ui/src/store/modules/login/types.ts +++ b/continew-admin-ui/src/store/modules/login/types.ts @@ -1,5 +1,5 @@ export interface UserState { - userId: number; + userId: string; username: string; nickname: string; gender: number; @@ -9,7 +9,7 @@ export interface UserState { description?: string; pwdResetTime?: string; registrationDate?: string; - deptId?: number; + deptId?: string; deptName?: string; permissions: Array; roles: Array; diff --git a/continew-admin-ui/src/views/monitor/log/system/index.vue b/continew-admin-ui/src/views/monitor/log/system/index.vue index 0196acd4..8796e43b 100644 --- a/continew-admin-ui/src/views/monitor/log/system/index.vue +++ b/continew-admin-ui/src/views/monitor/log/system/index.vue @@ -299,7 +299,7 @@ * * @param id ID */ - const toDetail = async (id: number) => { + const toDetail = async (id: string) => { visible.value = true; loading.value = true; getSystemLog(id).then((res) => { diff --git a/continew-admin-ui/src/views/system/dept/index.vue b/continew-admin-ui/src/views/system/dept/index.vue index fe9a3ff5..512c8080 100644 --- a/continew-admin-ui/src/views/system/dept/index.vue +++ b/continew-admin-ui/src/views/system/dept/index.vue @@ -318,7 +318,7 @@ updateTime: '', parentName: '', }); - const ids = ref>([]); + const ids = ref>([]); const title = ref(''); const single = ref(true); const multiple = ref(true); @@ -384,7 +384,7 @@ * * @param id ID */ - const toUpdate = (id: number) => { + const toUpdate = (id: string) => { reset(); listDeptTree({}).then((res) => { treeData.value = res.data; @@ -448,7 +448,7 @@ * * @param id ID */ - const toDetail = async (id: number) => { + const toDetail = async (id: string) => { if (detailLoading.value) return; detailLoading.value = true; detailVisible.value = true; @@ -493,7 +493,7 @@ * * @param ids ID 列表 */ - const handleDelete = (ids: Array) => { + const handleDelete = (ids: Array) => { deleteDept(ids).then((res) => { proxy.$message.success(res.msg); getList(); diff --git a/continew-admin-ui/src/views/system/menu/index.vue b/continew-admin-ui/src/views/system/menu/index.vue index 738428ef..ee67748c 100644 --- a/continew-admin-ui/src/views/system/menu/index.vue +++ b/continew-admin-ui/src/views/system/menu/index.vue @@ -360,7 +360,7 @@ const { DisEnableStatusEnum } = proxy.useDict('DisEnableStatusEnum'); const menuList = ref([]); - const ids = ref>([]); + const ids = ref>([]); const title = ref(''); const single = ref(true); const multiple = ref(true); @@ -427,7 +427,7 @@ * * @param id ID */ - const toUpdate = (id: number) => { + const toUpdate = (id: string) => { reset(); listMenuTree({}).then((res) => { treeData.value = res.data; @@ -519,7 +519,7 @@ * * @param ids ID 列表 */ - const handleDelete = (ids: Array) => { + const handleDelete = (ids: Array) => { deleteMenu(ids).then((res) => { proxy.$message.success(res.msg); getList(); diff --git a/continew-admin-ui/src/views/system/role/index.vue b/continew-admin-ui/src/views/system/role/index.vue index b6177076..999519a6 100644 --- a/continew-admin-ui/src/views/system/role/index.vue +++ b/continew-admin-ui/src/views/system/role/index.vue @@ -419,7 +419,7 @@ deptIds: undefined, }); const total = ref(0); - const ids = ref>([]); + const ids = ref>([]); const title = ref(''); const single = ref(true); const multiple = ref(true); @@ -494,7 +494,7 @@ * * @param id ID */ - const toUpdate = (id: number) => { + const toUpdate = (id: string) => { reset(); menuCheckStrictly.value = false; deptCheckStrictly.value = false; @@ -644,7 +644,7 @@ * * @param id ID */ - const toDetail = async (id: number) => { + const toDetail = async (id: string) => { if (detailLoading.value) return; getMenuTree(); getDeptTree(); @@ -690,7 +690,7 @@ * * @param ids ID 列表 */ - const handleDelete = (ids: Array) => { + const handleDelete = (ids: Array) => { deleteRole(ids).then((res) => { proxy.$message.success(res.msg); getList(); diff --git a/continew-admin-ui/src/views/system/user/index.vue b/continew-admin-ui/src/views/system/user/index.vue index 58a9dd4a..20eb4a82 100644 --- a/continew-admin-ui/src/views/system/user/index.vue +++ b/continew-admin-ui/src/views/system/user/index.vue @@ -345,7 +345,7 @@ :mask-closable="false" unmount-on-close render-to-body - @ok="handleUpdateUserRole" + @ok="handleUpdateRole" @cancel="handleCancel" > @@ -505,7 +505,7 @@ deptId: undefined, }); const total = ref(0); - const ids = ref>([]); + const ids = ref>([]); const title = ref(''); const single = ref(true); const multiple = ref(true); @@ -598,7 +598,7 @@ * * @param id ID */ - const toUpdate = (id: number) => { + const toUpdate = (id: string) => { reset(); getDeptOptions(); getRoleOptions(); @@ -614,7 +614,7 @@ * * @param id ID */ - const toUpdateRole = (id: number) => { + const toUpdateRole = (id: string) => { reset(); getRoleOptions(); getUser(id).then((res) => { @@ -665,7 +665,7 @@ description: '', status: 1, deptId: undefined, - roleIds: [] as Array, + roleIds: [] as Array, }; proxy.$refs.formRef?.resetFields(); }; @@ -704,9 +704,9 @@ }; /** - * 修改用户角色 + * 修改角色 */ - const handleUpdateUserRole = () => { + const handleUpdateRole = () => { proxy.$refs.userRoleFormRef.validate((valid: any) => { if (!valid && form.value.userId !== undefined) { updateUserRole({ roleIds: form.value.roleIds }, form.value.userId).then( @@ -725,7 +725,7 @@ * * @param id ID */ - const toDetail = async (id: number) => { + const toDetail = async (id: string) => { if (detailLoading.value) return; detailLoading.value = true; detailVisible.value = true; @@ -769,7 +769,7 @@ * * @param ids ID 列表 */ - const handleDelete = (ids: Array) => { + const handleDelete = (ids: Array) => { deleteUser(ids).then((res) => { proxy.$message.success(res.msg); getList(); @@ -781,7 +781,7 @@ * * @param id ID */ - const handleResetPassword = (id: number) => { + const handleResetPassword = (id: string) => { resetPassword(id).then((res) => { proxy.$message.success(res.msg); });