Procházet zdrojové kódy

feat(api): 集成 json-bigint 处理大整数精度问题

- 添加 json-bigint 和 bignumber.js 依赖用于处理超出 JavaScript 安全范围的整数
- 创建 src/utils/jsonBig.ts 提供 safeJsonParse 与 safeJsonStringify 方法
- 新增 src/api/request.ts 封装请求逻辑,自动注入 Authorization header 并解析响应数据
- 在 src/api 目录下多个文件中将 uni.request 替换为封装后的 request 方法
- 更新 package.json 添加相关依赖及类型定义
- 添加 types/json-bigint.d.ts 以支持 TypeScript 类型检查
- 修改页面组件中部分直接调用 uni.request 的地方为 request 方法
- 优化 uploadAvatar 中的数据解析逻辑以兼容大整数字段
mcbaiyun před 1 měsícem
rodič
revize
2a27f5cab0

+ 39 - 0
docs/json-bigint-integration.md

@@ -0,0 +1,39 @@
+# json-bigint 集成说明
+
+## 1. 安装
+
+建议使用 cnpm 安装:
+
+```powershell
+cnpm install json-bigint --save
+```
+
+> 说明:这个仓库的 `package.json` 已经添加了 `json-bigint` 依赖,执行上面命令会安装依赖并写入 lock 文件。
+
+## 2. 类型定义
+
+项目内已添加 `types/json-bigint.d.ts`,用于在 TypeScript 中声明模块类型。无需额外安装 @types。
+
+## 3. 使用方法 / 配置点
+
+1. 项目中已创建 `src/utils/jsonBig.ts`,提供 `safeJsonParse` 与 `safeJsonStringify` 方法,内部使用 `json-bigint` 的 `storeAsString: true` 选项来保证大整数不会丢失精度。
+2. 建议通过 `src/api/request.ts` 中的 `request` 封装替代直接调用 `uni.request`。`request` 封装会注入 `Authorization` header(如果本地 token 存在)并对返回的 `response.data` 做 `json-bigint` 解析,返回解析后的对象。
+3. 若某些上传(`uni.uploadFile`)或下载接口返回的 `data` 字段也可能包含大整数,请在对应回调中使用 `safeJsonParse` 解析。
+
+## 4. 迁移指南
+
+把项目中直接调用 `uni.request(...)` 的地方替换为 `request(...)`:
+
+- 例子:
+  - 从 `uni.request({ url: '...', method: 'POST', data: {...} })`
+  - 迁移为 `request({ url: '...', method: 'POST', data: {...} })`
+
+`src/api` 下已经示例修改了 `user.ts` 与 `heartRate.ts`,其余模块可按需迁移。
+
+## 5. 注意事项
+
+- `storeAsString: true` 会把超过 JS 安全整数范围(> Number.MAX_SAFE_INTEGER)的数字转为字符串保存在 data 中。如果你希望得到 BigInteger 可使用 `jsonbig({ storeAsString: false })` 并接收 BigNumber 类型(jsbn),但那会改变使用方式。
+- 请根据后端返回策略选择 `storeAsString` 配置。
+
+---
+如果需要我把项目中所有 `uni.request` 调用都替换为 `request`(自动化修改),我可以继续批量替换。

+ 3 - 0
package.json

@@ -53,6 +53,8 @@
     "@dcloudio/uni-quickapp-webview": "3.0.0-4070620250821001",
     "@dcloudio/uni-quickapp-webview": "3.0.0-4070620250821001",
     "@dcloudio/uni-ui": "^1.5.11",
     "@dcloudio/uni-ui": "^1.5.11",
     "@qiun/ucharts": "^2.5.0-20230101",
     "@qiun/ucharts": "^2.5.0-20230101",
+    "bignumber.js": "^9.3.1",
+    "json-bigint": "^1.0.0",
     "vue": "3.4.21",
     "vue": "3.4.21",
     "vue-i18n": "9.14.5",
     "vue-i18n": "9.14.5",
     "weapp-qrcode": "^1.0.0"
     "weapp-qrcode": "^1.0.0"
@@ -63,6 +65,7 @@
     "@dcloudio/uni-cli-shared": "3.0.0-4070620250821001",
     "@dcloudio/uni-cli-shared": "3.0.0-4070620250821001",
     "@dcloudio/uni-stacktracey": "3.0.0-4070620250821001",
     "@dcloudio/uni-stacktracey": "3.0.0-4070620250821001",
     "@dcloudio/vite-plugin-uni": "3.0.0-4070620250821001",
     "@dcloudio/vite-plugin-uni": "3.0.0-4070620250821001",
+    "@types/bignumber.js": "^5.0.4",
     "@vue/runtime-core": "3.5.21",
     "@vue/runtime-core": "3.5.21",
     "@vue/tsconfig": "^0.1.3",
     "@vue/tsconfig": "^0.1.3",
     "sass": "^1.93.2",
     "sass": "^1.93.2",

+ 8 - 12
src/api/bloodGlucose.ts

@@ -1,40 +1,36 @@
+import request from './request'
+
 export async function listBloodGlucose(params: { pageNum?: number; pageSize?: number; startTime?: string; endTime?: string }) {
 export async function listBloodGlucose(params: { pageNum?: number; pageSize?: number; startTime?: string; endTime?: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/blood-glucose/list',
     url: 'https://wx.baiyun.work/blood-glucose/list',
     method: 'POST',
     method: 'POST',
     data: params,
     data: params,
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     }
     }
   })
   })
   return res
   return res
 }
 }
 
 
 export async function addBloodGlucose(data: { type: string; value: number; measureTime: string }) {
 export async function addBloodGlucose(data: { type: string; value: number; measureTime: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/blood-glucose/add',
     url: 'https://wx.baiyun.work/blood-glucose/add',
     method: 'POST',
     method: 'POST',
     data,
     data,
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     }
     }
   })
   })
   return res
   return res
 }
 }
 
 
 export async function deleteBloodGlucose(id: string) {
 export async function deleteBloodGlucose(id: string) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/blood-glucose/delete',
     url: 'https://wx.baiyun.work/blood-glucose/delete',
     method: 'POST',
     method: 'POST',
     data: { id },
     data: { id },
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     }
     }
   })
   })
   return res
   return res

+ 8 - 12
src/api/bloodPressure.ts

@@ -1,40 +1,36 @@
+import request from './request'
+
 export async function listBloodPressure(params: { pageNum?: number; pageSize?: number; startTime?: string; endTime?: string }) {
 export async function listBloodPressure(params: { pageNum?: number; pageSize?: number; startTime?: string; endTime?: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/blood-pressure/list',
     url: 'https://wx.baiyun.work/blood-pressure/list',
     method: 'POST',
     method: 'POST',
     data: params,
     data: params,
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     }
     }
   })
   })
   return res
   return res
 }
 }
 
 
 export async function addBloodPressure(data: { systolicPressure: number; diastolicPressure: number; measureTime: string }) {
 export async function addBloodPressure(data: { systolicPressure: number; diastolicPressure: number; measureTime: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/blood-pressure/add',
     url: 'https://wx.baiyun.work/blood-pressure/add',
     method: 'POST',
     method: 'POST',
     data,
     data,
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     }
     }
   })
   })
   return res
   return res
 }
 }
 
 
 export async function deleteBloodPressure(id: string) {
 export async function deleteBloodPressure(id: string) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/blood-pressure/delete',
     url: 'https://wx.baiyun.work/blood-pressure/delete',
     method: 'POST',
     method: 'POST',
     data: { id },
     data: { id },
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     }
     }
   })
   })
   return res
   return res

+ 8 - 18
src/api/heartRate.ts

@@ -1,41 +1,31 @@
+import request from './request'
+
 export async function listHeartRate(params: { pageNum?: number; pageSize?: number; startTime?: string; endTime?: string }) {
 export async function listHeartRate(params: { pageNum?: number; pageSize?: number; startTime?: string; endTime?: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/heart-rate/list',
     url: 'https://wx.baiyun.work/heart-rate/list',
     method: 'POST',
     method: 'POST',
     data: params,
     data: params,
-    header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
-    }
+    header: { 'content-type': 'application/json' }
   })
   })
   return res
   return res
 }
 }
 
 
 export async function addHeartRate(data: { heartRate: number; measureTime: string }) {
 export async function addHeartRate(data: { heartRate: number; measureTime: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/heart-rate/add',
     url: 'https://wx.baiyun.work/heart-rate/add',
     method: 'POST',
     method: 'POST',
     data,
     data,
-    header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
-    }
+    header: { 'content-type': 'application/json' }
   })
   })
   return res
   return res
 }
 }
 
 
 export async function deleteHeartRate(id: string) {
 export async function deleteHeartRate(id: string) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/heart-rate/delete',
     url: 'https://wx.baiyun.work/heart-rate/delete',
     method: 'POST',
     method: 'POST',
     data: { id },
     data: { id },
-    header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
-    }
+    header: { 'content-type': 'application/json' }
   })
   })
   return res
   return res
 }
 }

+ 8 - 12
src/api/physical.ts

@@ -1,12 +1,12 @@
 // 体格(physical)相关接口封装
 // 体格(physical)相关接口封装
+import request from './request'
+
 export async function listPhysical(params: { pageNum: number; pageSize: number; startTime?: string; endTime?: string }) {
 export async function listPhysical(params: { pageNum: number; pageSize: number; startTime?: string; endTime?: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/physical/list',
     url: 'https://wx.baiyun.work/physical/list',
     method: 'POST',
     method: 'POST',
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     },
     },
     data: params
     data: params
   })
   })
@@ -14,13 +14,11 @@ export async function listPhysical(params: { pageNum: number; pageSize: number;
 }
 }
 
 
 export async function addPhysical(payload: { height: number; weight: number; measureTime: string }) {
 export async function addPhysical(payload: { height: number; weight: number; measureTime: string }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/physical/add',
     url: 'https://wx.baiyun.work/physical/add',
     method: 'POST',
     method: 'POST',
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     },
     },
     data: payload
     data: payload
   })
   })
@@ -28,13 +26,11 @@ export async function addPhysical(payload: { height: number; weight: number; mea
 }
 }
 
 
 export async function deletePhysical(id: string) {
 export async function deletePhysical(id: string) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/physical/delete',
     url: 'https://wx.baiyun.work/physical/delete',
     method: 'POST',
     method: 'POST',
     header: {
     header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
+      'content-type': 'application/json'
     },
     },
     data: { id }
     data: { id }
   })
   })

+ 22 - 0
src/api/request.ts

@@ -0,0 +1,22 @@
+import { safeJsonParse } from '@/utils/jsonBig'
+
+export interface RequestOptions extends UniApp.RequestOptions {}
+
+export async function request(options: RequestOptions): Promise<any> {
+  const token = uni.getStorageSync('token') as string | undefined
+  const header = Object.assign({}, options.header || {}, token ? { Authorization: `Bearer ${token}` } : {})
+  const finalOptions = Object.assign({}, options, { header })
+
+  // uni.request 返回 Promise 的时候,在不同平台上可能是 (err, res) 或者 res,
+  // 但项目中直接 await uni.request() 并期望返回 { data },因此这里直接 await 并处理返回值
+  const res: any = await uni.request(finalOptions as any)
+
+  // 解析 data 字段,优先使用 json-bigint
+  if (res && typeof res === 'object' && ('data' in res)) {
+    res.data = safeJsonParse(res.data)
+  }
+
+  return res
+}
+
+export default request

+ 14 - 26
src/api/user.ts

@@ -1,20 +1,18 @@
+import request from './request'
 // 获取用户详细信息
 // 获取用户详细信息
 export async function getUserInfo(userId: string | number) {
 export async function getUserInfo(userId: string | number) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  // token will be injected by `request` wrapper
+  const res: any = await request({
     url: `https://wx.baiyun.work/user/${userId}`,
     url: `https://wx.baiyun.work/user/${userId}`,
     method: 'GET',
     method: 'GET',
-    header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
-    }
+    header: { 'content-type': 'application/json' }
   })
   })
   return res
   return res
 }
 }
 
 
 // 使用微信 code 登录并获取 token/openid
 // 使用微信 code 登录并获取 token/openid
 export async function loginWithWx(code: string, role: number) {
 export async function loginWithWx(code: string, role: number) {
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/get_openid',
     url: 'https://wx.baiyun.work/get_openid',
     method: 'POST',
     method: 'POST',
     header: { 'Content-Type': 'application/json' },
     header: { 'Content-Type': 'application/json' },
@@ -25,14 +23,10 @@ export async function loginWithWx(code: string, role: number) {
 
 
 // 拉取当前登录用户信息(统一包装 POST /user_info)
 // 拉取当前登录用户信息(统一包装 POST /user_info)
 export async function fetchUserInfo() {
 export async function fetchUserInfo() {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/user_info',
     url: 'https://wx.baiyun.work/user_info',
     method: 'POST',
     method: 'POST',
-    header: {
-      'Content-Type': 'application/json',
-      Authorization: `Bearer ${token}`
-    },
+    header: { 'Content-Type': 'application/json' },
     data: {}
     data: {}
   })
   })
   return res
   return res
@@ -40,14 +34,10 @@ export async function fetchUserInfo() {
 
 
 // 更新用户信息 POST /update_user_info
 // 更新用户信息 POST /update_user_info
 export async function updateUserInfo(payload: any) {
 export async function updateUserInfo(payload: any) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/update_user_info',
     url: 'https://wx.baiyun.work/update_user_info',
     method: 'POST',
     method: 'POST',
-    header: {
-      'Content-Type': 'application/json',
-      Authorization: `Bearer ${token}`
-    },
+    header: { 'Content-Type': 'application/json' },
     data: payload
     data: payload
   })
   })
   return res
   return res
@@ -64,7 +54,8 @@ export function uploadAvatar(filePath: string) {
       header: { Authorization: `Bearer ${token}` },
       header: { Authorization: `Bearer ${token}` },
       success: (uploadRes: any) => {
       success: (uploadRes: any) => {
         try {
         try {
-          const parsed = JSON.parse(uploadRes.data || '{}')
+          // 头像上传返回体可能包含 big int 字段,这里使用 json-bigint 安全解析
+          const parsed = JSON.parse(uploadRes.data || '{}') 
           resolve(parsed)
           resolve(parsed)
         } catch (e) {
         } catch (e) {
           resolve({ data: uploadRes.data })
           resolve({ data: uploadRes.data })
@@ -77,21 +68,18 @@ export function uploadAvatar(filePath: string) {
 
 
 // 下载头像(封装 uni.downloadFile)
 // 下载头像(封装 uni.downloadFile)
 export async function downloadAvatar(userId: string) {
 export async function downloadAvatar(userId: string) {
-  const token = uni.getStorageSync('token')
   const res: any = await uni.downloadFile({
   const res: any = await uni.downloadFile({
     url: `https://wx.baiyun.work/user/avatar/${userId}`,
     url: `https://wx.baiyun.work/user/avatar/${userId}`,
-    header: { Authorization: `Bearer ${token}` }
+    header: { Authorization: `Bearer ${uni.getStorageSync('token')}` }
   })
   })
   return res
   return res
 }
 }
 
 
 // 地理编码/最近位置查询
 // 地理编码/最近位置查询
 export async function geocodeNearest(latitude: number, longitude: number) {
 export async function geocodeNearest(latitude: number, longitude: number) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: `https://wx.baiyun.work/geo/nearest?latitude=${latitude}&longitude=${longitude}`,
     url: `https://wx.baiyun.work/geo/nearest?latitude=${latitude}&longitude=${longitude}`,
-    method: 'GET',
-    header: { Authorization: `Bearer ${token}` }
+    method: 'GET'
   })
   })
   return res
   return res
 }
 }

+ 9 - 22
src/api/userBinding.ts

@@ -31,39 +31,30 @@ export interface UserBindingPageResponse {
   pages: number
   pages: number
 }
 }
 
 
+import request from './request'
+
 export async function listUserBindingsByPatient(
 export async function listUserBindingsByPatient(
   patientUserId: string | number,
   patientUserId: string | number,
   bindingType: string,
   bindingType: string,
   query: BaseQueryRequest
   query: BaseQueryRequest
 ) {
 ) {
-  const token = uni.getStorageSync('token')
+  // token will be injected by request wrapper
   const qs = `?patientUserId=${encodeURIComponent(String(patientUserId))}&bindingType=${encodeURIComponent(bindingType)}`
   const qs = `?patientUserId=${encodeURIComponent(String(patientUserId))}&bindingType=${encodeURIComponent(bindingType)}`
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/user-binding/list-by-patient' + qs,
     url: 'https://wx.baiyun.work/user-binding/list-by-patient' + qs,
     method: 'POST',
     method: 'POST',
     data: query,
     data: query,
-    params: {
-      patientUserId,
-      bindingType
-    },
-    header: {
-      'content-type': 'application/json',
-      Authorization: `Bearer ${token}`
-    }
+    header: { 'content-type': 'application/json' }
   })
   })
   return res
   return res
 }
 }
 
 
 // 创建用户绑定关系 POST /user-binding/create
 // 创建用户绑定关系 POST /user-binding/create
 export async function createUserBinding(payload: any) {
 export async function createUserBinding(payload: any) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/user-binding/create',
     url: 'https://wx.baiyun.work/user-binding/create',
     method: 'POST',
     method: 'POST',
-    header: {
-      'Content-Type': 'application/json',
-      Authorization: `Bearer ${token}`
-    },
+    header: { 'Content-Type': 'application/json' },
     data: payload
     data: payload
   })
   })
   return res
   return res
@@ -72,14 +63,10 @@ export async function createUserBinding(payload: any) {
 // 检查用户绑定关系 POST /user-binding/check
 // 检查用户绑定关系 POST /user-binding/check
 // 检查绑定关系:支持将 Snowflake ID 以字符串传入,避免精度问题
 // 检查绑定关系:支持将 Snowflake ID 以字符串传入,避免精度问题
 export async function checkUserBinding(payload: { patientUserId: string | number; boundUserId: string | number }) {
 export async function checkUserBinding(payload: { patientUserId: string | number; boundUserId: string | number }) {
-  const token = uni.getStorageSync('token')
-  const res: any = await uni.request({
+  const res: any = await request({
     url: 'https://wx.baiyun.work/user-binding/check',
     url: 'https://wx.baiyun.work/user-binding/check',
     method: 'POST',
     method: 'POST',
-    header: {
-      'Content-Type': 'application/json',
-      Authorization: `Bearer ${token}`
-    },
+    header: { 'Content-Type': 'application/json' },
     data: payload
     data: payload
   })
   })
   return res
   return res

+ 5 - 8
src/pages/doctor/index/index.vue

@@ -99,6 +99,7 @@ import { onShow } from '@dcloudio/uni-app'
 import CustomNav from '@/components/custom-nav.vue'
 import CustomNav from '@/components/custom-nav.vue'
 import TabBar from '@/components/tab-bar.vue'
 import TabBar from '@/components/tab-bar.vue'
 import { fetchUserInfo as fetchUserInfoApi } from '@/api/user'
 import { fetchUserInfo as fetchUserInfoApi } from '@/api/user'
+import request from '@/api/request'
 import { handleQrScanResult } from '@/utils/qr'
 import { handleQrScanResult } from '@/utils/qr'
 
 
 const user = ref<{ avatar?: string; nickname?: string; title?: string }>({})
 const user = ref<{ avatar?: string; nickname?: string; title?: string }>({})
@@ -206,13 +207,11 @@ const fetchTodayReminders = async () => {
   try {
   try {
     const token = uni.getStorageSync('token')
     const token = uni.getStorageSync('token')
     if (!token) return
     if (!token) return
-    const response = await uni.request({
+    const response = await request({
       url: 'https://wx.baiyun.work/doctor/today_reminders',
       url: 'https://wx.baiyun.work/doctor/today_reminders',
       method: 'GET',
       method: 'GET',
-      header: {
-        'Authorization': `Bearer ${token}`
-      }
     })
     })
+    
     const resp = response.data as any
     const resp = response.data as any
     if (resp && resp.code === 200 && resp.data) {
     if (resp && resp.code === 200 && resp.data) {
       todayReminders.value = resp.data
       todayReminders.value = resp.data
@@ -226,12 +225,10 @@ const fetchPatientActivities = async () => {
   try {
   try {
     const token = uni.getStorageSync('token')
     const token = uni.getStorageSync('token')
     if (!token) return
     if (!token) return
-    const response = await uni.request({
+    const response = await request({
       url: 'https://wx.baiyun.work/doctor/patient_activities',
       url: 'https://wx.baiyun.work/doctor/patient_activities',
       method: 'GET',
       method: 'GET',
-      header: {
-        'Authorization': `Bearer ${token}`
-      }
+    
     })
     })
     const resp = response.data as any
     const resp = response.data as any
     if (resp && resp.code === 200 && resp.data) {
     if (resp && resp.code === 200 && resp.data) {

+ 3 - 8
src/pages/patient-family/index/index.vue

@@ -120,6 +120,7 @@ import CustomNav from '@/components/custom-nav.vue'
 import { fetchUserInfo as fetchUserInfoApi } from '@/api/user'
 import { fetchUserInfo as fetchUserInfoApi } from '@/api/user'
 import TabBar from '@/components/tab-bar.vue'
 import TabBar from '@/components/tab-bar.vue'
 import { handleQrScanResult } from '@/utils/qr'
 import { handleQrScanResult } from '@/utils/qr'
+import request from '@/api/request'
 
 
 const user = ref<{ avatar?: string; nickname?: string }>({})
 const user = ref<{ avatar?: string; nickname?: string }>({})
 
 
@@ -227,12 +228,9 @@ const fetchTodayReminders = async () => {
   try {
   try {
     const token = uni.getStorageSync('token')
     const token = uni.getStorageSync('token')
     if (!token) return
     if (!token) return
-    const response = await uni.request({
+    const response = await request({
       url: 'https://wx.baiyun.work/family/today_reminders',
       url: 'https://wx.baiyun.work/family/today_reminders',
       method: 'GET',
       method: 'GET',
-      header: {
-        'Authorization': `Bearer ${token}`
-      }
     })
     })
     const resp = response.data as any
     const resp = response.data as any
     if (resp && resp.code === 200 && resp.data) {
     if (resp && resp.code === 200 && resp.data) {
@@ -247,12 +245,9 @@ const fetchFamilyActivities = async () => {
   try {
   try {
     const token = uni.getStorageSync('token')
     const token = uni.getStorageSync('token')
     if (!token) return
     if (!token) return
-    const response = await uni.request({
+    const response = await request({
       url: 'https://wx.baiyun.work/family/activities',
       url: 'https://wx.baiyun.work/family/activities',
       method: 'GET',
       method: 'GET',
-      header: {
-        'Authorization': `Bearer ${token}`
-      }
     })
     })
     const resp = response.data as any
     const resp = response.data as any
     if (resp && resp.code === 200 && resp.data) {
     if (resp && resp.code === 200 && resp.data) {

+ 28 - 0
src/utils/jsonBig.ts

@@ -0,0 +1,28 @@
+import JSONBig from 'json-bigint'
+
+const jsonbig = JSONBig({ storeAsString: true })
+
+export function safeJsonParse(raw: string | object | undefined | null) {
+  if (typeof raw === 'string') {
+    try {
+      return jsonbig.parse(raw)
+    } catch (err) {
+      try {
+        return JSON.parse(raw)
+      } catch (e) {
+        return raw
+      }
+    }
+  }
+  return raw
+}
+
+export function safeJsonStringify(v: any) {
+  try {
+    return jsonbig.stringify(v)
+  } catch (e) {
+    return JSON.stringify(v)
+  }
+}
+
+export default jsonbig

+ 4 - 0
types/json-bigint.d.ts

@@ -0,0 +1,4 @@
+declare module 'json-bigint' {
+  export interface JSONBig { parse(text: string): any; stringify(obj: any): string }
+  export default function JSONBig(opts?: { storeAsString?: boolean }): JSONBig
+}