Browse Source

修复部分bug

test
qb 1 year ago
parent
commit
fd401d5466
  1. 7
      compoment/BasicContainer/BasicContainer.vue
  2. 41
      compoment/saomiao2.vue
  3. 4
      config/host.js
  4. 4
      manifest.json
  5. 52
      pagesHome/pages/DeliveryCustomerScan/DeliveryCustomerScan.vue
  6. 21
      pagesHome/pages/SearchTray/SearchTray.vue
  7. 79
      pagesHome/pages/orderInquiry/orderInquiry.vue
  8. 16
      pagesTask/pages/dynamicCheckDetails/dynamicCheckDetails.vue
  9. 2
      unpackage/dist/build/app-plus/pagesHome/pages/OrderSortingDetail/OrderSortingDetail.css
  10. 2
      unpackage/dist/build/app-plus/pagesHome/pages/PickingScanList/PickingScanList.css
  11. 2141
      unpackage/dist/dev/app-plus/app-service.js
  12. 31
      unpackage/dist/dev/app-plus/app.css
  13. 4
      unpackage/dist/dev/app-plus/manifest.json
  14. 313
      utils/base64Log.js
  15. 170
      utils/handleFile.js
  16. 205
      utils/log.js
  17. 10
      utils/request.js

7
compoment/BasicContainer/BasicContainer.vue

@ -29,6 +29,7 @@
import {
onLoad,
onUnload,
onReachBottom,
onPullDownRefresh
} from '@dcloudio/uni-app'
@ -67,6 +68,10 @@
// uni.startPullDownRefresh()
})
onUnload(() => {
uni.hideLoading()
})
//
let antiShake : any = null
//
@ -121,7 +126,7 @@
defineExpose({ startPullDownRefresh })
</script>
<style>
<style lang="scss">
.footer-end {
padding: 20upx 0;
text-align: center;

41
compoment/saomiao2.vue

@ -10,13 +10,18 @@
onUnload
} from '@dcloudio/uni-app'
// import { storeToRefs } from 'pinia';
import handleFile from '@/utils/handleFile.js';
import {
reactive,
defineProps
} from "vue";
// import usePdaStore from '../store/uaePdaStore';
// const pdaStore = usePdaStore()
// const { pdaBroadcas } = storeToRefs(pdaStore)
import file from '@/utils/log.js';
const { writeLog, selectLogUrl, delLogFile } = file
const { root, writeTxt, mkdirs, filelist, readTxt } = handleFile
let details = reactive({
activity: null,
receiver: null,
@ -24,8 +29,20 @@
isstart: false,
})
/** 扫码日志 */
const scanLog = reactive<string[]>([])
/** 将扫描的码添加在日志中 */
const handleScanLog = (scancode : string) => {
// 3000,
if (scanLog.length > 3000) scanLog.pop()
scanLog.unshift(scancode)
}
const props = defineProps<{ ishidestop ?: boolean }>()
onLoad(async () => {
//
initScan()
startScan();
console.log('扫描的--------------onLoad');
@ -35,6 +52,7 @@
console.log('扫描的--------------onShow');
})
onHide(() => {
//
console.log('props?.ishidestop :>> ', props?.ishidestop);
if (props?.ishidestop) return
stopScan();
@ -44,6 +62,10 @@
stopScan();
uni.$off('scancodedate')
console.log('扫描的--------------onUnload');
//
// #ifdef APP
delLogFile()
// #endif
})
// uni.getSystemInfoSync().deviceBrand
@ -81,9 +103,20 @@
onReceive: function (context, intent) {
console.log("intent", intent)
plus.android.importClass(intent);
// Pinia广
let content = intent.getStringExtra(pdaBroadcastList[brand].broadcastTag); // 广
//
// let content = intent.getStringExtra('scannerdata'); // 广
console.log('content :>> ', content);
if (!content) return uni.showToast({
title: '码值有误',
icon: 'none'
})
// handleScanLog(content)
// #ifdef APP
writeLog(content + '>>>>>' + content.replace(/\n/g, ""), false)
// #endif
uni.$emit('scancodedate', content.replace(/\n/g, ""))
}
});

4
config/host.js

@ -10,14 +10,14 @@
// zhy
// const devhost = 'http://192.168.10.48:13000/'
// tjj
// const devhost = 'http://192.168.10.25:13000/'
const devhost = 'http://192.168.10.25:13000/'
// cyz
// const devhost = 'http://192.168.6.122:8777/'
// const devhost = 'http://192.168.6.141:8777/'
// cg
// const devhost = 'http://192.168.10.57:13000/'
// 正式
const devhost = 'https://h5uapi.huitongys.com/'
// const devhost = 'https://h5uapi.huitongys.com/'
// cg
// const devhost = 'http://192.168.10.200:13000/'
/**

4
manifest.json

@ -2,8 +2,8 @@
"name" : "货无忧",
"appid" : "__UNI__EB22F37",
"description" : "",
"versionName" : "1.0.40",
"versionCode" : 1040,
"versionName" : "1.1.01",
"versionCode" : 1101,
"transformPx" : false,
/* 5+App */
"app-plus" : {

52
pagesHome/pages/DeliveryCustomerScan/DeliveryCustomerScan.vue

@ -92,7 +92,9 @@
import {
deliverycustom,
deliveryloadingscan,
deliveryoneloading
deliveryoneloading,
postAbnormalTruckLoading,
deliveryloadinginventory
} from '@/api/user.js'
import {
onLoad,
@ -104,6 +106,7 @@
import { computed, reactive, ref, toRefs } from "vue";
import useSystemSettingsStore from '@/store/useSystemSettingsStore';
import { storeToRefs } from 'pinia';
import utils from '@/utils/utils.js';
const { scanState } = storeToRefs(useSystemSettingsStore())
const option = reactive({
@ -195,6 +198,7 @@
}
})
}
/** 一键装车 */
async function ckoneloading(item) {
tip.value.setdetails({
title: '提示',
@ -224,8 +228,16 @@
})
}
async function scandata() {
let loadingId = uni.getStorageSync('checkvehicle').id
/*
deliveryId: details.id,
loadingId,
type: 1,
barcode: details.scancode
*/
/** 扫描订制品 */
const scanOrder = async (loadingId) => {
let data = {
deliveryId: details.id,
loadingId,
@ -233,10 +245,40 @@
barcode: details.scancode
}
let res = await deliveryloadingscan(data)
console.log(res);
if (res.code == 200) {
const { code, audio } = res
//
if (code === 5000) {
utils.ttsspke('不在本次计划, 请确认客户再异常装车')
}
//
if (code === 3001) utils.ttsspke(audio)
}
/** 扫描库存品 */
const scanStock = async (loadingId) => {
let data = {
reservationId: details.items.id,
deliveryId: details.id,
loadingId,
type: 1,
barcode: details.scancode
}
let res = await deliveryloadinginventory(data)
const { audio } = res
console.log('res :>> ', res);
if (!audio) return
// #ifdef APP
utils.ttsspke(res.audio)
// #endif
}
// , HT
// const reg = /^HT./
/** 扫描执行回调 */
function scandata() {
let loadingId = uni.getStorageSync('checkvehicle').id
scanOrder(loadingId)
}
/**

21
pagesHome/pages/SearchTray/SearchTray.vue

@ -56,7 +56,6 @@
<uni-td align="center">{{item.num}}</uni-td>
</uni-tr>
</block>
</uni-table>
<uni-table v-show="details.isShowSelect" ref="uniTable1" border stripe type="selection" emptyText="暂无更多数据"
@ -87,7 +86,7 @@
<!-- 底部站位 -->
<view class="footer"></view>
<view class="submitBtn" @click="handleSubmit">提交同步</view>
<button type="default" @click="moni">moni</button>
<!-- <button type="default" @click="moni">moni</button> -->
</scroll-view>
</template>
@ -181,7 +180,7 @@
if (code !== 200 || !data) return
details.detauser = data
details.datelist = data.packageList ? data.packageList : []
} catch (err) {
console.log('err :>> ', err);
//TODO handle the exception
@ -209,9 +208,9 @@
return
}
// uni.showLoading({
// mask: true
// })
// uni.showLoading({
// mask: true
// })
try {
const res = await postFindSyncOldTrayData({ trayCode: details.detauser.trayCode })
@ -276,11 +275,11 @@
uni.hideLoading()
}
}
function moni(){
details.scancode = 'T2966'
scandata()
}
// function moni(){
// details.scancode = 'T2966'
// scandata()
// }
const { datelist, detauser } = toRefs(details)
</script>

79
pagesHome/pages/orderInquiry/orderInquiry.vue

@ -100,7 +100,42 @@
<view class="batchOperationBtn" @click="batchPrint">打印</view>
<!-- <view class="batchOperationBtn" @click="handleMaterialReplenishment">物料补充</view> -->
</view>
<u-checkbox-group v-model="checkboxValue" placement="column">
<scroll-view scroll-y="true" style="height: 40vh; margin-top: 10px;">
<uni-table type="selection" border stripe emptyText="暂无更多数据" @selection-change="selectionChange">
<!-- 表头行 -->
<uni-tr>
<uni-th align="left">包条码</uni-th>
<uni-th align="left">库位信息</uni-th>
<uni-th align="left">托盘信息</uni-th>
<uni-th align="left">三级品</uni-th>
<!-- <uni-th align="center">数量</uni-th> -->
<uni-th align="center">商场名称</uni-th>
<uni-th align="center">是否签收</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<block v-for="item in packageList">
<uni-tr>
<!-- 包条码 -->
<uni-td>{{item.orderPackageCode}}</uni-td>
<!-- 库位信息 -->
<uni-td>{{item.warehouse}}</uni-td>
<!-- 托盘信息 -->
<uni-td>{{item.trayName}}</uni-td>
<!-- 三级品 -->
<uni-td>{{item.thirdProduct}}</uni-td>
<!-- <uni-td align="center">{{item.pallet}}</uni-td> -->
<!-- 商场 -->
<uni-td align="center">{{item.materialName}}</uni-td>
<!-- 是否签收 -->
<uni-td align="center">{{item.orderPackageStatus === '70' ? '已签' : '未签'}}</uni-td>
</uni-tr>
</block>
</uni-table>
</scroll-view>
<!-- <u-checkbox-group v-model="checkboxValue" placement="column">
<view :class="{'packagesList__item':true, 'active': item.orderPackageCode === scancode }"
v-for="item in packageList" :key="item.orderPackageCode">
<view>
@ -113,7 +148,7 @@
<text>{{item.materialName}}</text>
<text>{{item.orderPackageStatus === '70' ? '已签' : '未签'}}</text>
</view>
</u-checkbox-group>
</u-checkbox-group> -->
</view>
<!-- 库存品 -->
@ -203,6 +238,9 @@
//
const stockList = shallowRef([])
/** 复选框被选中的值 */
const seletionList = ref([])
//
const orderStateDictionaries = reactive({
'10': '部分入库',
@ -292,6 +330,10 @@
}
}
const selectionChange = (list) => {
seletionList.value = list.detail.index
}
// type
function handleSearchFormType(type : number) {
searchForm.type = type
@ -440,10 +482,10 @@
</script>
<style lang="scss" scoped>
.w100{
width:100%;
.w100 {
width: 100%;
}
//
.container {
padding: 20upx;
@ -535,7 +577,7 @@
margin-bottom: 20upx;
&>view {
padding: 15upx 0 ;
padding: 15upx 0;
flex: 1;
text-align: center;
position: relative;
@ -588,4 +630,29 @@
}
}
}
.uni-table-scroll {
zoom: 0.9;
}
.uni-table-td,
.uni-table-th {
--borderColor: #000;
color: var(--borderColor);
padding: 10upx;
}
.table--border {
--borderColor: #000;
border-color: var(--borderColor);
}
:deep(.checkbox.tr-table--border) {
--borderColor: #000;
border-color: #000;
.checkbox__inner {
border-color: #000;
}
}
</style>

16
pagesTask/pages/dynamicCheckDetails/dynamicCheckDetails.vue

@ -720,10 +720,10 @@
if (_flag || details.pageType === 3) return
try {
uni.showLoading({
title: '数据加载中',
mask: true
});
// uni.showLoading({
// title: '',
// mask: true
// });
const queryData = {
code: details.scancode,
@ -801,7 +801,11 @@
})
return
} else if (code !== 4000) {
}
else if(code === 5001){
return
}
else if (code !== 4000) {
details.addInfo.orderCode = ''
details.stopScan = true
//
@ -855,7 +859,7 @@
console.log('err :>> ', err);
//TODO handle the exception
} finally {
uni.hideLoading()
// uni.hideLoading()
}
}

2
unpackage/dist/build/app-plus/pagesHome/pages/OrderSortingDetail/OrderSortingDetail.css vendored

File diff suppressed because one or more lines are too long

2
unpackage/dist/build/app-plus/pagesHome/pages/PickingScanList/PickingScanList.css vendored

@ -1 +1 @@
.topBox[data-v-6d3cc1fa]{width:100%;display:flex;align-items:center;margin-bottom:.3125rem;border-radius:.3125rem}.topBox .searchInput[data-v-6d3cc1fa]{margin-right:.3125rem;background:#eee;padding:.375rem .625rem;flex:1}.button[data-v-6d3cc1fa]{padding:.3125rem 1.25rem;border-radius:.15625rem;background-color:var(--subjectColor);color:#fff}.scoolv[data-v-6d3cc1fa]{width:100%;height:60vh;margin-top:.625rem}.scoolv .minbx[data-v-6d3cc1fa]{display:flex;flex-direction:column;align-items:center}.scoolv .minbx>.its[data-v-6d3cc1fa]{display:flex;flex-direction:column;align-items:center;width:21.4375rem;background:#FFFFFF;border-radius:.25rem;box-sizing:border-box;margin-bottom:.625rem}.scoolv .minbx>.its[data-v-6d3cc1fa]:nth-last-child(1){margin-bottom:0}.scoolv .minbx>.its .titl[data-v-6d3cc1fa]{width:100%;font-size:1rem;font-weight:400;color:#092c4d;border-bottom:.09375rem solid #EEEEEE;padding:.8125rem .75rem;box-sizing:border-box}.scoolv .minbx>.its .bts[data-v-6d3cc1fa]{display:flex;align-items:center;justify-content:center;padding:.625rem 0}.scoolv .minbx>.its .bts>uni-view[data-v-6d3cc1fa]{width:6.375rem;height:2rem;background:#FFFFFF;border-radius:.25rem;opacity:1;border:.0625rem solid #D3832A;font-size:.875rem;color:#d3832a;display:flex;align-items:center;justify-content:center}.scoolv .minbx>.its .contsx[data-v-6d3cc1fa]{width:100%;display:flex;flex-direction:column;padding:1.0625rem .75rem;box-sizing:border-box;border-bottom:.09375rem solid #EEEEEE}.scoolv .minbx>.its .contsx .content[data-v-6d3cc1fa]{width:100%;display:flex;align-items:center;justify-content:space-between;font-size:.875rem;color:#092c4d}.scoolv .minbx>.its .contsx .content>uni-view[data-v-6d3cc1fa]{flex:1}.scoolv .minbx>.its .contsx .total[data-v-6d3cc1fa]{width:100%;display:flex;align-items:center;justify-content:space-around;margin-top:1.375rem}.scoolv .minbx>.its .contsx .total>uni-view[data-v-6d3cc1fa]{display:flex;flex-direction:column;align-items:center;font-size:.875rem;color:#092c4d}.scoolv .minbx>.its .contsx .total>uni-view:nth-of-type(1)>uni-view[data-v-6d3cc1fa]:nth-of-type(2){color:#0086f1}.scoolv .minbx>.its .contsx .total>uni-view:nth-of-type(2)>uni-view[data-v-6d3cc1fa]:nth-of-type(2){color:#3ad8bc}.scoolv .minbx>.its .contsx .total>uni-view:nth-of-type(3)>uni-view[data-v-6d3cc1fa]:nth-of-type(2){color:#fa8c16}.scoolv .minbx>.its .contsx .total>uni-view>uni-view[data-v-6d3cc1fa]:nth-of-type(2){font-size:1.125rem;color:#0086f1;margin-top:.625rem}.hedtopt[data-v-6d3cc1fa]{display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:#fff;padding:1.125rem 1rem;box-sizing:border-box}.hedtopt .typto[data-v-6d3cc1fa]{display:inline-flex;align-items:center;justify-content:space-between;width:100%;font-size:.875rem;font-weight:400;color:#092c4d;margin-bottom:.625rem}.hedtopt .typto .vibx[data-v-6d3cc1fa]{display:inline-block;min-width:3.125rem;height:1.875rem;padding:.3125rem;box-sizing:border-box;border:.03125rem solid #90A0AF;word-wrap:break-word;word-break:break-all}.hedtopt .typto[data-v-6d3cc1fa]:nth-last-child(1){margin-bottom:0}.hedtopt .typto>uni-view[data-v-6d3cc1fa]{flex:1}.hedtopt .kehupeison[data-v-6d3cc1fa]{width:100%;display:flex;align-items:center;justify-content:space-around;margin-top:.625rem}.hedtopt .kehupeison>uni-view[data-v-6d3cc1fa]{display:flex;flex-direction:column;align-items:center;font-size:.875rem;font-weight:400;color:#092c4d}.hedtopt .kehupeison>uni-view:nth-of-type(1)>uni-view[data-v-6d3cc1fa]:nth-of-type(2){color:#092c4d}.hedtopt .kehupeison>uni-view:nth-of-type(2)>uni-view[data-v-6d3cc1fa]:nth-of-type(2){color:#0086f1}.hedtopt .kehupeison>uni-view:nth-of-type(3)>uni-view[data-v-6d3cc1fa]:nth-of-type(2){color:#3ad8bc}.hedtopt .kehupeison>uni-view:nth-of-type(4)>uni-view[data-v-6d3cc1fa]:nth-of-type(2){color:#fa8c16}.hedtopt .kehupeison>uni-view>uni-view[data-v-6d3cc1fa]:nth-of-type(2){font-size:1.125rem;font-weight:400;color:#092c4d;margin-top:.625rem}
.topBox[data-v-b2ec859f]{width:100%;display:flex;align-items:center;margin-bottom:.3125rem;border-radius:.3125rem}.topBox .searchInput[data-v-b2ec859f]{margin-right:.3125rem;background:#eee;padding:.375rem .625rem;flex:1}.button[data-v-b2ec859f]{padding:.3125rem 1.25rem;border-radius:.15625rem;background-color:var(--subjectColor);color:#fff}.scoolv[data-v-b2ec859f]{width:100%;height:60vh;margin-top:.625rem}.scoolv .minbx[data-v-b2ec859f]{display:flex;flex-direction:column;align-items:center}.scoolv .minbx>.its[data-v-b2ec859f]{display:flex;flex-direction:column;align-items:center;width:21.4375rem;background:#FFFFFF;border-radius:.25rem;box-sizing:border-box;margin-bottom:.625rem}.scoolv .minbx>.its[data-v-b2ec859f]:nth-last-child(1){margin-bottom:0}.scoolv .minbx>.its .titl[data-v-b2ec859f]{width:100%;font-size:1rem;font-weight:400;color:#092c4d;border-bottom:.09375rem solid #EEEEEE;padding:.8125rem .75rem;box-sizing:border-box}.scoolv .minbx>.its .bts[data-v-b2ec859f]{display:flex;align-items:center;justify-content:center;padding:.625rem 0}.scoolv .minbx>.its .bts>uni-view[data-v-b2ec859f]{width:6.375rem;height:2rem;background:#FFFFFF;border-radius:.25rem;opacity:1;border:.0625rem solid #D3832A;font-size:.875rem;color:#d3832a;display:flex;align-items:center;justify-content:center}.scoolv .minbx>.its .contsx[data-v-b2ec859f]{width:100%;display:flex;flex-direction:column;padding:1.0625rem .75rem;box-sizing:border-box;border-bottom:.09375rem solid #EEEEEE}.scoolv .minbx>.its .contsx .content[data-v-b2ec859f]{width:100%;display:flex;align-items:center;justify-content:space-between;font-size:.875rem;color:#092c4d}.scoolv .minbx>.its .contsx .content>uni-view[data-v-b2ec859f]{flex:1}.scoolv .minbx>.its .contsx .total[data-v-b2ec859f]{width:100%;display:flex;align-items:center;justify-content:space-around;margin-top:1.375rem}.scoolv .minbx>.its .contsx .total>uni-view[data-v-b2ec859f]{display:flex;flex-direction:column;align-items:center;font-size:.875rem;color:#092c4d}.scoolv .minbx>.its .contsx .total>uni-view:nth-of-type(1)>uni-view[data-v-b2ec859f]:nth-of-type(2){color:#0086f1}.scoolv .minbx>.its .contsx .total>uni-view:nth-of-type(2)>uni-view[data-v-b2ec859f]:nth-of-type(2){color:#3ad8bc}.scoolv .minbx>.its .contsx .total>uni-view:nth-of-type(3)>uni-view[data-v-b2ec859f]:nth-of-type(2){color:#fa8c16}.scoolv .minbx>.its .contsx .total>uni-view>uni-view[data-v-b2ec859f]:nth-of-type(2){font-size:1.125rem;color:#0086f1;margin-top:.625rem}.hedtopt[data-v-b2ec859f]{display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:#fff;padding:1.125rem 1rem;box-sizing:border-box}.hedtopt .typto[data-v-b2ec859f]{display:inline-flex;align-items:center;justify-content:space-between;width:100%;font-size:.875rem;font-weight:400;color:#092c4d;margin-bottom:.625rem}.hedtopt .typto .vibx[data-v-b2ec859f]{display:inline-block;min-width:3.125rem;height:1.875rem;padding:.3125rem;box-sizing:border-box;border:.03125rem solid #90A0AF;word-wrap:break-word;word-break:break-all}.hedtopt .typto[data-v-b2ec859f]:nth-last-child(1){margin-bottom:0}.hedtopt .typto>uni-view[data-v-b2ec859f]{flex:1}.hedtopt .kehupeison[data-v-b2ec859f]{width:100%;display:flex;align-items:center;justify-content:space-around;margin-top:.625rem}.hedtopt .kehupeison>uni-view[data-v-b2ec859f]{display:flex;flex-direction:column;align-items:center;font-size:.875rem;font-weight:400;color:#092c4d}.hedtopt .kehupeison>uni-view:nth-of-type(1)>uni-view[data-v-b2ec859f]:nth-of-type(2){color:#092c4d}.hedtopt .kehupeison>uni-view:nth-of-type(2)>uni-view[data-v-b2ec859f]:nth-of-type(2){color:#0086f1}.hedtopt .kehupeison>uni-view:nth-of-type(3)>uni-view[data-v-b2ec859f]:nth-of-type(2){color:#3ad8bc}.hedtopt .kehupeison>uni-view:nth-of-type(4)>uni-view[data-v-b2ec859f]:nth-of-type(2){color:#fa8c16}.hedtopt .kehupeison>uni-view>uni-view[data-v-b2ec859f]:nth-of-type(2){font-size:1.125rem;font-weight:400;color:#092c4d;margin-top:.625rem}

2141
unpackage/dist/dev/app-plus/app-service.js vendored

File diff suppressed because it is too large Load Diff

31
unpackage/dist/dev/app-plus/app.css vendored

@ -1116,12 +1116,35 @@ uni-view[data-v-f631659b], uni-scroll-view[data-v-f631659b], uni-swiper-item[dat
font-size: 15px;
margin-left: 3px;
}
/**
* 这里是uni-app内置的常用样式变量
*
* uni-app 官方扩展插件及插件市场https://ext.dcloud.net.cn上很多三方插件均使用了这些样式变量
* 如果你是插件开发者建议你使用scss预处理并在插件代码中直接使用这些变量无需 import 这个文件方便用户通过搭积木的方式开发整体风格一致的App
*
*/
/**
* 如果你是App开发者插件使用者你可以通过修改这些变量来定制自己的插件主题实现自定义主题功能
*
* 如果你的项目同样使用了scss预处理你也可以直接在你的 scss 代码中使用如下变量同时无需 import 这个文件
*/
/* 颜色变量 */
/* 行为相关颜色 */
/* 文字基本颜色 */
/* 背景颜色 */
/* 边框颜色 */
/* 尺寸变量 */
/* 文字尺寸 */
/* 图片尺寸 */
/* Border Radius */
/* 水平间距 */
/* 垂直间距 */
/* 透明度 */
/* 文章场景相关 */
.footer-end[data-v-e1062c8b] {
padding: 0.625rem 0;
text-align: center;
padding: 0.625rem 0;
text-align: center;
}
/**
* 这里是uni-app内置的常用样式变量
*

4
unpackage/dist/dev/app-plus/manifest.json vendored

@ -7,8 +7,8 @@
"id": "__UNI__EB22F37",
"name": "货无忧",
"version": {
"name": "1.0.39",
"code": 1039
"name": "1.1.01",
"code": 1101
},
"description": "",
"developer": {

313
utils/base64Log.js

@ -0,0 +1,313 @@
//
// THIS FILE IS AUTOMATICALLY GENERATED! DO NOT EDIT BY HAND!
//
;(function(global, factory) {
typeof exports === 'object' && typeof module !== 'undefined'
? module.exports = factory()
: typeof define === 'function' && define.amd
? define(factory) :
// cf. https://github.com/dankogai/js-base64/issues/119
(function() {
// existing version for noConflict()
const _Base64 = global.Base64;
const gBase64 = factory();
gBase64.noConflict = () => {
global.Base64 = _Base64;
return gBase64;
};
if (global.Meteor) { // Meteor.js
Base64 = gBase64;
}
global.Base64 = gBase64;
})();
}((typeof self !== 'undefined' ? self
: typeof window !== 'undefined' ? window
: typeof global !== 'undefined' ? global
: this
), function() {
'use strict';
/**
* base64.ts
*
* Licensed under the BSD 3-Clause License.
* http://opensource.org/licenses/BSD-3-Clause
*
* References:
* http://en.wikipedia.org/wiki/Base64
*
* @author Dan Kogai (https://github.com/dankogai)
*/
const version = '3.6.0';
/**
* @deprecated use lowercase `version`.
*/
const VERSION = version;
const _hasatob = typeof atob === 'function';
const _hasbtoa = typeof btoa === 'function';
const _hasBuffer = typeof Buffer === 'function';
const _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;
const _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;
const b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
const b64chs = [...b64ch];
const b64tab = ((a) => {
let tab = {};
a.forEach((c, i) => tab[c] = i);
return tab;
})(b64chs);
const b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
const _fromCC = String.fromCharCode.bind(String);
const _U8Afrom = typeof Uint8Array.from === 'function'
? Uint8Array.from.bind(Uint8Array)
: (it, fn = (x) => x) => new Uint8Array(Array.prototype.slice.call(it, 0).map(fn));
const _mkUriSafe = (src) => src
.replace(/[+\/]/g, (m0) => m0 == '+' ? '-' : '_')
.replace(/=+$/m, '');
const _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\+\/]/g, '');
/**
* polyfill version of `btoa`
*/
const btoaPolyfill = (bin) => {
// console.log('polyfilled');
let u32, c0, c1, c2, asc = '';
const pad = bin.length % 3;
for (let i = 0; i < bin.length;) {
if ((c0 = bin.charCodeAt(i++)) > 255 ||
(c1 = bin.charCodeAt(i++)) > 255 ||
(c2 = bin.charCodeAt(i++)) > 255)
throw new TypeError('invalid character found');
u32 = (c0 << 16) | (c1 << 8) | c2;
asc += b64chs[u32 >> 18 & 63]
+ b64chs[u32 >> 12 & 63]
+ b64chs[u32 >> 6 & 63]
+ b64chs[u32 & 63];
}
return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc;
};
/**
* does what `window.btoa` of web browsers do.
* @param {String} bin binary string
* @returns {string} Base64-encoded string
*/
const _btoa = _hasbtoa ? (bin) => btoa(bin)
: _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')
: btoaPolyfill;
const _fromUint8Array = _hasBuffer
? (u8a) => Buffer.from(u8a).toString('base64')
: (u8a) => {
// cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326
const maxargs = 0x1000;
let strs = [];
for (let i = 0, l = u8a.length; i < l; i += maxargs) {
strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));
}
return _btoa(strs.join(''));
};
/**
* converts a Uint8Array to a Base64 string.
* @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5
* @returns {string} Base64 string
*/
const fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);
// This trick is found broken https://github.com/dankogai/js-base64/issues/130
// const utob = (src: string) => unescape(encodeURIComponent(src));
// reverting good old fationed regexp
const cb_utob = (c) => {
if (c.length < 2) {
var cc = c.charCodeAt(0);
return cc < 0x80 ? c
: cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))
+ _fromCC(0x80 | (cc & 0x3f)))
: (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))
+ _fromCC(0x80 | ((cc >>> 6) & 0x3f))
+ _fromCC(0x80 | (cc & 0x3f)));
}
else {
var cc = 0x10000
+ (c.charCodeAt(0) - 0xD800) * 0x400
+ (c.charCodeAt(1) - 0xDC00);
return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))
+ _fromCC(0x80 | ((cc >>> 12) & 0x3f))
+ _fromCC(0x80 | ((cc >>> 6) & 0x3f))
+ _fromCC(0x80 | (cc & 0x3f)));
}
};
const re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
/**
* @deprecated should have been internal use only.
* @param {string} src UTF-8 string
* @returns {string} UTF-16 string
*/
const utob = (u) => u.replace(re_utob, cb_utob);
//
const _encode = _hasBuffer
? (s) => Buffer.from(s, 'utf8').toString('base64')
: _TE
? (s) => _fromUint8Array(_TE.encode(s))
: (s) => _btoa(utob(s));
/**
* converts a UTF-8-encoded string to a Base64 string.
* @param {boolean} [urlsafe] if `true` make the result URL-safe
* @returns {string} Base64 string
*/
const encode = (src, urlsafe = false) => urlsafe
? _mkUriSafe(_encode(src))
: _encode(src);
/**
* converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.
* @returns {string} Base64 string
*/
const encodeURI = (src) => encode(src, true);
// This trick is found broken https://github.com/dankogai/js-base64/issues/130
// const btou = (src: string) => decodeURIComponent(escape(src));
// reverting good old fationed regexp
const re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g;
const cb_btou = (cccc) => {
switch (cccc.length) {
case 4:
var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
| ((0x3f & cccc.charCodeAt(1)) << 12)
| ((0x3f & cccc.charCodeAt(2)) << 6)
| (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;
return (_fromCC((offset >>> 10) + 0xD800)
+ _fromCC((offset & 0x3FF) + 0xDC00));
case 3:
return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)
| ((0x3f & cccc.charCodeAt(1)) << 6)
| (0x3f & cccc.charCodeAt(2)));
default:
return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)
| (0x3f & cccc.charCodeAt(1)));
}
};
/**
* @deprecated should have been internal use only.
* @param {string} src UTF-16 string
* @returns {string} UTF-8 string
*/
const btou = (b) => b.replace(re_btou, cb_btou);
/**
* polyfill version of `atob`
*/
const atobPolyfill = (asc) => {
// console.log('polyfilled');
asc = asc.replace(/\s+/g, '');
if (!b64re.test(asc))
throw new TypeError('malformed base64.');
asc += '=='.slice(2 - (asc.length & 3));
let u24, bin = '', r1, r2;
for (let i = 0; i < asc.length;) {
u24 = b64tab[asc.charAt(i++)] << 18
| b64tab[asc.charAt(i++)] << 12
| (r1 = b64tab[asc.charAt(i++)]) << 6
| (r2 = b64tab[asc.charAt(i++)]);
bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)
: r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)
: _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);
}
return bin;
};
/**
* does what `window.atob` of web browsers do.
* @param {String} asc Base64-encoded string
* @returns {string} binary string
*/
const _atob = _hasatob ? (asc) => atob(_tidyB64(asc))
: _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')
: atobPolyfill;
//
const _toUint8Array = _hasBuffer
? (a) => _U8Afrom(Buffer.from(a, 'base64'))
: (a) => _U8Afrom(_atob(a), c => c.charCodeAt(0));
/**
* converts a Base64 string to a Uint8Array.
*/
const toUint8Array = (a) => _toUint8Array(_unURI(a));
//
const _decode = _hasBuffer
? (a) => Buffer.from(a, 'base64').toString('utf8')
: _TD
? (a) => _TD.decode(_toUint8Array(a))
: (a) => btou(_atob(a));
const _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));
/**
* converts a Base64 string to a UTF-8 string.
* @param {String} src Base64 string. Both normal and URL-safe are supported
* @returns {string} UTF-8 string
*/
const decode = (src) => _decode(_unURI(src));
/**
* check if a value is a valid Base64 string
* @param {String} src a value to check
*/
const isValid = (src) => {
if (typeof src !== 'string')
return false;
const s = src.replace(/\s+/g, '').replace(/=+$/, '');
return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s);
};
//
const _noEnum = (v) => {
return {
value: v, enumerable: false, writable: true, configurable: true
};
};
/**
* extend String.prototype with relevant methods
*/
const extendString = function () {
const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));
_add('fromBase64', function () { return decode(this); });
_add('toBase64', function (urlsafe) { return encode(this, urlsafe); });
_add('toBase64URI', function () { return encode(this, true); });
_add('toBase64URL', function () { return encode(this, true); });
_add('toUint8Array', function () { return toUint8Array(this); });
};
/**
* extend Uint8Array.prototype with relevant methods
*/
const extendUint8Array = function () {
const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));
_add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });
_add('toBase64URI', function () { return fromUint8Array(this, true); });
_add('toBase64URL', function () { return fromUint8Array(this, true); });
};
/**
* extend Builtin prototypes with relevant methods
*/
const extendBuiltins = () => {
extendString();
extendUint8Array();
};
const gBase64 = {
version: version,
VERSION: VERSION,
atob: _atob,
atobPolyfill: atobPolyfill,
btoa: _btoa,
btoaPolyfill: btoaPolyfill,
fromBase64: decode,
toBase64: encode,
encode: encode,
encodeURI: encodeURI,
encodeURL: encodeURI,
utob: utob,
btou: btou,
decode: decode,
isValid: isValid,
fromUint8Array: fromUint8Array,
toUint8Array: toUint8Array,
extendString: extendString,
extendUint8Array: extendUint8Array,
extendBuiltins: extendBuiltins,
};
//
// export Base64 to the namespace
//
// ES5 is yet to have Object.assign() that may make transpilers unhappy.
// gBase64.Base64 = Object.assign({}, gBase64);
gBase64.Base64 = {};
Object.keys(gBase64).forEach(k => gBase64.Base64[k] = gBase64[k]);
return gBase64;
}));

170
utils/handleFile.js

@ -0,0 +1,170 @@
/*
使用该类应开启以下权限读取和写入
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
*/
/*
文件编码
ansiascii英文标准码0-127包括控制符和其他英文字符编码这在后来一直统一没再变过当然它只需要一个字节保存
gb2312和gbk这两个是ancii码加上汉字的扩展汉字多达10万在ancii编码基础上再加一个字节表示汉字共可表示字符65535个包括了繁体字因此一个中文字符包含两个字节eclipse中默认编码方式为gbk在Windows中文系统中ANSI是默认的编码方式对于英文文件是ASCII编码对于简体中文文件是GB2312编码
Unicode编码顾名思义这是国际统一标准编码在这之前各国标准编码不统一微软等公司需要为各国的计算机系统定制符合不同编码标准的系统显然成本太高并且互联网的出现让不同编码标准的计算机交互变得困难两国的邮件系统会因为使用不同的编码标准而导致接受方收到的邮件是乱码
utf-8和utf-16编码UTF的意思是UCS Transfer Format显然是随着互联网的出现需要解决Unicode在网络上的传输问题顾名思义UTF8就是每次8个位传输数据而UTF16就是每次16个位只不过为了传输时的可靠性从UNICODE到UTF时并不是直接的对应而是要过一些算法和规则来转换UTF-8就是在互联网上使用最广的一种unicode的实现方式
*/
/**
* 获取手机内置存储的根路径
* @return {String}
*/
const root = function() {
const environment = plus.android.importClass("android.os.Environment");
return environment.getExternalStorageDirectory();
}
/**
* 获取指定文件夹下的所有文件和文件夹列表
* @param {String} path 文件夹路径
* @return {Array<String>} 文件和文件夹列表
*/
const filelist = function(dir = '') {
const File = plus.android.importClass("java.io.File");
let list = [];
let file = new File(dir);
let tempList = file.listFiles();
for (let i = 0; i < tempList.length; i++) {
let fileName = tempList[i].getName();
list.push(fileName);
}
return list;
}
/**
* 创建文件
* @return {boolean} flase=失败已存在操作失败true=成功
*/
const createNewFile = function(path = '') {
const File = plus.android.importClass('java.io.File');
let file = new File(path);
if (!file.exists()) {
return file.createNewFile();
}
return false;
}
/**
* 创建文件夹
* @return {boolean} flase=失败已存在操作失败true=成功
*/
const mkdirs = function(path = ''){
const File = plus.android.importClass('java.io.File');
let file = new File(path);
if (!file.exists()) {
return file.mkdirs();
}
return false;
}
/**
* 读取文件
* @param {String} path 文件路径
* @param {String} charset 编码
* @return {Array<String>} 内容列表按行读取,文件不存在或异常则返回false
*/
const readTxt = function(path = '', charset = 'utf-8') {
const File = plus.android.importClass('java.io.File');
const InputStreamReader = plus.android.importClass('java.io.InputStreamReader');
const BufferedReader = plus.android.importClass('java.io.BufferedReader');
const FileInputStream = plus.android.importClass('java.io.FileInputStream');
let file = new File(path);
let inputStreamReader = null;
let bufferedReader = null;
let list = [];
try {
if (!file.exists()) {
return false;
}
inputStreamReader = new InputStreamReader(new FileInputStream(file), charset);
bufferedReader = new BufferedReader(inputStreamReader);
let line = '';
while (null != (line = bufferedReader.readLine())) {
list.push(line);
}
bufferedReader.close();
inputStreamReader.close();
} catch (e) {
if (null != bufferedReader) {
bufferedReader.close();
}
if (null != inputStreamReader) {
inputStreamReader.close();
}
return false;
}
return list;
}
/**
* 写入文件内容
* @param {String} path 文件路径
* @param {String} content 内容
* @param {boolean} append 内容写入类型false=不追加覆盖原有内容true=追加从内容尾部写入
* @param {String} charset 编码
* @return {boolean} true=成功false=失败
*/
const writeTxt = function(path = '', content = '', append = false, charset = 'utf-8') {
const File = plus.android.importClass('java.io.File');
const FileOutputStream = plus.android.importClass('java.io.FileOutputStream');
const OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter');
let outputStreamWriter;
let file = new File(path);
try {
//不存在则创建新的文件
if (!file.exists()) {
file.createNewFile();
}
outputStreamWriter = new OutputStreamWriter(new FileOutputStream(path, append), charset);
outputStreamWriter.write(content);
outputStreamWriter.close();
} catch (e) {
if (null != outputStreamWriter) {
outputStreamWriter.close();
}
return false;
}
return true;
}
/**
* 判断文件是否存在
* @param path 文件路径
* @return true=存在 false=不存在
*/
const isFileExist = function(path = ''){
const File = plus.android.importClass('java.io.File');
return new File(path).exists()
}
/**
* 删除文件
* @param {String} path
*/
const deleteFile = function(path = ''){
const File = plus.android.importClass('java.io.File');
let file = new File(path);
if (file.exists()) {
return file.delete();
}
return false
}
export default {
root,
filelist,
createNewFile,
mkdirs,
readTxt,
writeTxt,
isFileExist,
deleteFile
}

205
utils/log.js

@ -0,0 +1,205 @@
import
Base64
from './base64.js'
import handleFile from '@/utils/handleFile.js';
// #ifdef APP
// 保存文字
let logTextData = '';
const {
root
} = handleFile
const file = `${root()}/scanLogs`
// #endif
/**
* js 日期格式化
* 传时间戳参数进行时间戳转换不传时返回当前时间返回年月日时分秒格式
* @param {Object} timeStamp 时间戳参数 非必传
* @param {Object} format 格式化样式 非必传
*/
function getTimeStampDatetime(format = 'yyyy-MM-dd HH:mm:ss', timeStamp) {
let nowDatetime = new Date()
timeStamp ? nowDatetime = new Date(timeStamp) : nowDatetime = new Date()
return nowDatetime.Format(format)
}
Date.prototype.Format = function(fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"H+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((
"00" + o[
k]).substr(("" + o[k]).length)));
return fmt;
}
// 获取日志文件名称
function getLogFileName() {
// 今日日期
let nowDate = getTimeStampDatetime("yyyy-MM-dd")
// 当前时间精确到秒
let nowTime = getTimeStampDatetime("HH:mm:ss")
// 文件名称
let fileName = 'app-log.txt'
// fileName = nowDate + 'log.txt'
fileName = nowDate + '.txt'
// 内容换行符(自定义)
let newLine = "\r\n" + "======================================" + "\r\n" + nowTime + " =>>>" + "\r\n"
return {
nowDate: nowDate,
newLine: newLine,
fileName: fileName
}
}
/**
* 日志内容写入
* 文件写入手机地址华为Android/data/应用包名/documents/app-log/2021-01-17log.text
* @param {Object} params 写入内容
* @param {Object} encryption 是否加密
*/
// 防抖
let writelogtime = null;
function writeLog(params, encryption) {
let text = JSON.stringify(params)
if (encryption) {
logTextData += (getLogFileName().newLine + " " + Base64.encode(text));
} else {
logTextData += (getLogFileName().newLine + " " + text);
}
if (writelogtime) {
clearTimeout(writelogtime)
}
//不然就创建新的定时器 3秒没有新日志再执行写入操作
writelogtime = setTimeout(function() {
writeLogTxt()
}, 3000)
}
function writeLogTxt() {
plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {
// 可通过fs操作PUBLIC_DOCUMENTS文件系统
// 创建日志文件夹
fs.root.getDirectory("app-log", {
create: true,
exclusive: false
}, function(dir) {
dir.getDirectory(getLogFileName().nowDate, {
create: true,
exclusive: false
}, function(dir) {
// 创建或写入文件
console.log("Directory Entry Name: " + dir.fullPath + getLogFileName().fileName);
dir.getFile(getLogFileName().fileName, {
create: true
}, function(fileEntry) {
// 找到文件准备写入操作
fileEntry.file(function(file) {
// create a FileWriter to write to the file
fileEntry.createWriter(function(writer) {
// Write data to file.
writer.seek(file.size - 1)
// 换行插入日志文件
writer.write(logTextData);
console.log('111 :>> ', 111);
logTextData = '';
}, function(e) {
console.error("日志写入错误", error)
});
});
});
}, function(err) {
console.error("文件夹创建失败", err)
});
}, function(err) {
console.error("文件夹创建失败", err)
});
}, function(error) {
console.error("文件系统进入错误", error)
});
}
function delLogFile() {
console.log("日志删除")
plus.io.resolveLocalFileSystemURL(
file, //指定的目录
function(entry) {
var directoryReader = entry.createReader(); //获取读取目录对象
directoryReader.readEntries(
function(entries) { //历遍子目录即可
for (var i = 0; i < entries.length; i++) {
console.log("文件信息:" + entries[i].name);
let twoDate = Date.parse(getLogFileName().nowDate) - (86400000 * 2);
console.log("保留三天内日志", twoDate)
if (Date.parse(entries[i].name) < twoDate) {
entries[i].removeRecursively(function(entry) {
writeLog("日志删除成功" + entries[i].name, false);
}, function(e) {
writeLog("日志删除成功" + e.message, false);
});
}
}
},
function(err) {
console.log("没有异常日志");
});
},
function(err) {
console.log("没有异常日志");
});
}
// 查询本地日志文件(直接当前页面调用,该接口未使用)
function selectLogUrl() {
plus.io.resolveLocalFileSystemURL(
file, //指定的目录
function(entry) {
var directoryReader = entry.createReader(); //获取读取目录对象
directoryReader.readEntries(
function(entries) { //历遍子目录即可
let isLog = false;
for (var i = 0; i < entries.length; i++) {
console.log("文件信息:" + entries[i].name);
if (entries[i].name == getLogFileName().nowDate) {
console.log("获取到当天文件为", entries[i].name)
var url = file + '/' + entries[i].name + '/' + getLogFileName().nowDate + '.txt';
var path = plus.io.convertLocalFileSystemURL(url);
var newurl = plus.io.convertAbsoluteFileSystem(path);
isLog = true;
return newurl;
}
}
if (isLog) {
return '';
}
},
function(err) {
console.log("访问目录失败");
});
},
function(err) {
console.log("访问目录失败");
});
}
export default {
writeLog,
delLogFile,
getLogFileName,
selectLogUrl
}

10
utils/request.js

@ -9,7 +9,9 @@ import base64 from '@/utils/base64.js';
import {
hexMD5
} from '@/utils/md5.js'
import { nextTick } from 'vue';
import {
nextTick
} from 'vue';
/**
* 刷新token
@ -124,7 +126,7 @@ const HandleRequest = (params, key, loadingObj) => {
// 开启loading
if (loadingObj.isShowLoading !== false) uni.showLoading({
title: content,
mask:true
mask: true
})
let urlhd = ''
if (uni.getStorageSync('setip')) {
@ -224,7 +226,7 @@ const HandleRequest = (params, key, loadingObj) => {
if (_isRefreshToken._isRefreshToken) {
_isRefreshToken._isRefreshToken.then(() => {
// 递归重新请求
HandleRequest(requestObj[key], key).then((res) => {
HandleRequest(requestObj[key], key, loadingObj).then((res) => {
relove(res)
})
})
@ -234,7 +236,7 @@ const HandleRequest = (params, key, loadingObj) => {
const refreshFn = HandleRefreshToken(header, urlhd, refresh_token, user)
refreshFn.then(res => {
// 递归重新请求
HandleRequest(requestObj[key], key).then((res) => {
HandleRequest(requestObj[key], key, loadingObj).then((res) => {
relove(res)
})
}).catch(() => {

Loading…
Cancel
Save