2025-12-05 16:10:52 +08:00
|
|
|
|
2025-11-27 03:55:38 +08:00
|
|
|
//import i18n from '@/locales'
|
|
|
|
|
import base from '@/common/config';
|
|
|
|
|
//import store from "@/store";
|
2025-12-11 22:33:31 +08:00
|
|
|
import IMSDK from "openim-uniapp-polyfill";
|
2025-12-05 16:10:52 +08:00
|
|
|
const isString = (v)=> {
|
|
|
|
|
return typeof v === 'string' || v instanceof String;
|
|
|
|
|
},
|
|
|
|
|
isNumber=(v) =>{
|
|
|
|
|
return typeof v === 'number' && !isNaN(v);
|
|
|
|
|
},
|
|
|
|
|
isInteger=(v) =>{
|
|
|
|
|
return typeof v === 'number' && isFinite(v) && Math.floor(v) === v;
|
|
|
|
|
},
|
|
|
|
|
isBoolean=(v) =>{
|
|
|
|
|
return typeof v === 'boolean';
|
|
|
|
|
},
|
|
|
|
|
isArray=(v) =>{
|
|
|
|
|
return Array.isArray(v);
|
|
|
|
|
},
|
|
|
|
|
isObject=(v) =>{
|
|
|
|
|
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
|
|
|
},
|
|
|
|
|
isFunction=(v) =>{
|
|
|
|
|
return typeof v === 'function';
|
|
|
|
|
},
|
|
|
|
|
isNull=(v) =>{
|
|
|
|
|
return v === null;
|
|
|
|
|
},
|
|
|
|
|
isUndefined=(v) =>{
|
|
|
|
|
return typeof v === 'undefined';
|
|
|
|
|
},
|
|
|
|
|
isSymbol=(v) =>{
|
|
|
|
|
return typeof v === 'symbol';
|
|
|
|
|
},
|
|
|
|
|
isDate=(v) =>{
|
|
|
|
|
return Object.prototype.toString.call(v) === '[object Date]';
|
|
|
|
|
},
|
|
|
|
|
isRegExp=(v) =>{
|
|
|
|
|
return Object.prototype.toString.call(v) === '[object RegExp]';
|
|
|
|
|
},
|
|
|
|
|
isError=(v) =>{
|
|
|
|
|
return v instanceof Error;
|
|
|
|
|
},
|
|
|
|
|
isMap=(v) =>{
|
|
|
|
|
return v instanceof Map;
|
|
|
|
|
},
|
|
|
|
|
isSet=(v) =>{
|
|
|
|
|
return v instanceof Set;
|
|
|
|
|
},
|
|
|
|
|
isWeakMap=(v) =>{
|
|
|
|
|
return v instanceof WeakMap;
|
|
|
|
|
},
|
|
|
|
|
isWeakSet=(v) =>{
|
|
|
|
|
return v instanceof WeakSet;
|
|
|
|
|
};
|
2025-11-27 03:55:38 +08:00
|
|
|
export default{
|
2025-12-05 16:10:52 +08:00
|
|
|
isString :isString,
|
|
|
|
|
isNumber :isNumber,
|
|
|
|
|
isInteger :isInteger,
|
|
|
|
|
isBoolean :isBoolean,
|
|
|
|
|
isArray :isArray,
|
|
|
|
|
isObject :isObject,
|
|
|
|
|
isFunction :isFunction,
|
|
|
|
|
isNull :isNull,
|
|
|
|
|
isUndefined :isUndefined,
|
|
|
|
|
isSymbol :isSymbol,
|
|
|
|
|
isDate :isDate,
|
|
|
|
|
isRegExp :isRegExp,
|
|
|
|
|
isError :isError,
|
|
|
|
|
isMap :isMap,
|
|
|
|
|
isSet :isSet,
|
|
|
|
|
isWeakMap :isWeakMap,
|
|
|
|
|
isWeakSet :isWeakSet,
|
2025-11-27 03:55:38 +08:00
|
|
|
cdn(v){
|
|
|
|
|
v= v || "";
|
|
|
|
|
v = v.replace(/\\/ig,"/").replace('/\/\/ig',"/");
|
2025-12-08 02:29:46 +08:00
|
|
|
//console.log(v);
|
2025-12-05 16:10:52 +08:00
|
|
|
if(isString(v)){
|
|
|
|
|
if(v.startsWith('blob:')){
|
2025-11-27 03:55:38 +08:00
|
|
|
return v;
|
|
|
|
|
}
|
2025-12-05 16:10:52 +08:00
|
|
|
if(v.startsWith('file://')){
|
|
|
|
|
return v;
|
|
|
|
|
}
|
|
|
|
|
v= v.startsWith('/') ? v : '/'+v;
|
2025-11-27 03:55:38 +08:00
|
|
|
return base.cdnUrl+''+v;
|
|
|
|
|
}
|
|
|
|
|
return "";
|
|
|
|
|
},
|
|
|
|
|
goto(url,type){
|
2025-12-08 02:29:46 +08:00
|
|
|
//console.log(url);
|
2025-11-27 03:55:38 +08:00
|
|
|
type = type || '0'; //0 navigateTo 1 redirectTo
|
|
|
|
|
if(url){
|
2025-12-05 16:10:52 +08:00
|
|
|
if(isInteger(url)){
|
2025-11-27 03:55:38 +08:00
|
|
|
uni.navigateBack({
|
|
|
|
|
delta:url,
|
|
|
|
|
})
|
|
|
|
|
}else{
|
|
|
|
|
url+="";
|
|
|
|
|
if(url.substr(0,6) != '/pages'){
|
|
|
|
|
url='/pages'+url
|
|
|
|
|
}
|
|
|
|
|
if(type == '1'){
|
|
|
|
|
return uni.redirectTo({
|
|
|
|
|
url:url
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-12-08 02:29:46 +08:00
|
|
|
if(type == '2'){
|
|
|
|
|
return uni.switchTab({
|
|
|
|
|
url:url
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-11-27 03:55:38 +08:00
|
|
|
uni.navigateTo({
|
|
|
|
|
url:url
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
showToast(msg,url,icon){
|
|
|
|
|
const _this = this;
|
|
|
|
|
//msg = i18n.t(msg);
|
|
|
|
|
// #ifdef APP
|
|
|
|
|
plus.nativeUI.closeToast();
|
|
|
|
|
plus.nativeUI.toast(msg,{
|
|
|
|
|
align:'center',
|
|
|
|
|
verticalAlign:"center",
|
|
|
|
|
style:"inline",
|
|
|
|
|
icon:icon=='error' ? '/static/img/common/error.png' : '/static/img/common/success.png',
|
|
|
|
|
iconWidth:24,
|
|
|
|
|
iconHeight:24
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if(url){
|
|
|
|
|
setTimeout(()=>{
|
|
|
|
|
_this.goto(url);
|
|
|
|
|
},3000)
|
|
|
|
|
}
|
|
|
|
|
// #endif
|
|
|
|
|
// #ifndef APP
|
|
|
|
|
uni.showToast({
|
|
|
|
|
//image:icon=='error' ? '/static/img/common/error.png' : '/static/img/common/success.png',
|
|
|
|
|
icon:icon=='error' ? icon : 'success',
|
|
|
|
|
title:msg,
|
|
|
|
|
showToast:3000,
|
|
|
|
|
complete:()=>{
|
|
|
|
|
if(url){
|
|
|
|
|
setTimeout(()=>{
|
|
|
|
|
_this.goto(url);
|
|
|
|
|
},3000)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
// #endif
|
|
|
|
|
},
|
|
|
|
|
error(msg,url){
|
|
|
|
|
this.showToast(msg,url,'error');
|
|
|
|
|
},
|
|
|
|
|
success(msg,url){
|
|
|
|
|
this.showToast(msg,url,'success');
|
|
|
|
|
},
|
|
|
|
|
scan(){
|
|
|
|
|
uni.scanCode({
|
|
|
|
|
success(res){
|
|
|
|
|
/**
|
|
|
|
|
* result 所扫码的内容
|
|
|
|
|
scanType 所扫码的类型 App、微信小程序、百度小程序、QQ小程序、京东小程序、支付宝小程序
|
|
|
|
|
charSet 所扫码的字符集 App、微信小程序、百度小程序(所扫码的字符集,仅支持 Android 系统)、QQ小程序、京东小程序
|
|
|
|
|
path 当所扫的码为当前应用的合法二维码时,会返回此字段,内容为二维码携带的 path。 微信小程序、QQ小程序、京东小程序
|
|
|
|
|
rawData 原始数据,base64 编码 微信小程序、QQ小程序、京东小程序、支付宝小程序
|
|
|
|
|
code 扫码所得数据 支付宝小程序
|
|
|
|
|
qrCode 扫描二维码时返回二维码数据 支付宝小程序
|
|
|
|
|
barCode 扫描条形码时返回条形码数据 支付宝小程序
|
|
|
|
|
imageChannel 来源 支付宝小程序
|
|
|
|
|
*/
|
|
|
|
|
if(res.result){
|
|
|
|
|
if(res.result.indexOf('blackcatp:/')){
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
url:res.result.substring(11)
|
|
|
|
|
})
|
|
|
|
|
}else{
|
|
|
|
|
this.success(res.result)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
fail(res){
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
complete(res){
|
|
|
|
|
console.log(res)
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
copy(v){
|
|
|
|
|
let that = this;
|
|
|
|
|
uni.setClipboardData({
|
|
|
|
|
data:v+'',
|
|
|
|
|
success() {
|
|
|
|
|
that.success('复制成功');
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
toDate(time) {
|
|
|
|
|
var date = new Date(time * 1000);
|
|
|
|
|
var fmt = 'yyyy-MM-dd hh:mm:ss';
|
|
|
|
|
var o = {
|
|
|
|
|
'M+': date.getMonth() + 1, //月份
|
|
|
|
|
'd+': date.getDate(), //日
|
|
|
|
|
'h+': date.getHours(), //小时
|
|
|
|
|
'm+': date.getMinutes(), //分
|
|
|
|
|
's+': date.getSeconds(), //秒
|
|
|
|
|
'q+': Math.floor((date.getMonth() + 3) / 3), //季度
|
|
|
|
|
S: date.getMilliseconds() //毫秒
|
|
|
|
|
};
|
|
|
|
|
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.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;
|
|
|
|
|
},
|
|
|
|
|
formatAmount(v,wei){
|
|
|
|
|
if(!v){return 0.00;}
|
|
|
|
|
v=v+"";
|
|
|
|
|
v = parseFloat(v).toFixed(wei || 2);
|
|
|
|
|
return parseFloat(v);
|
2025-12-05 16:10:52 +08:00
|
|
|
},
|
2025-12-11 22:33:31 +08:00
|
|
|
imapi(method,data){
|
|
|
|
|
return IMSDK.asyncApi(method,IMSDK.uuid(),data);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
async fileExsit(fn){
|
|
|
|
|
return await new Promise((resolve) => {
|
|
|
|
|
plus.io.resolveLocalFileSystemURL(fn, function(entry) { resolve(true); }, function() { resolve(false); });
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
downloadFile (url, savepath, successCb, errorCb, progressCb) {
|
|
|
|
|
if (!url) {
|
|
|
|
|
errorCb && errorCb(new Error('empty url'));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const startDownload = () => {
|
|
|
|
|
try {
|
|
|
|
|
const task = plus.downloader.createDownload(url, { filename: savepath, timeout: 120000 }, function(d, status) {
|
|
|
|
|
if (status === 200) {
|
|
|
|
|
const local = d && d.filename ? d.filename : savepath;
|
|
|
|
|
successCb && successCb(local);
|
|
|
|
|
} else {
|
|
|
|
|
errorCb && errorCb(new Error('download status ' + status));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
try {
|
|
|
|
|
if (task && typeof task.addEventListener === 'function') {
|
|
|
|
|
task.addEventListener('statechanged', function(t, status) {
|
|
|
|
|
if (t.state === 3) {
|
|
|
|
|
var downloaded = t.downloadedSize || t.downloaded || 0;
|
|
|
|
|
var total = t.totalSize || t.total || 0;
|
|
|
|
|
var prog = 0;
|
|
|
|
|
if (total > 0) prog = Math.min(100, Math.floor(downloaded / total * 100));
|
|
|
|
|
progressCb && progressCb(prog);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// ignore
|
|
|
|
|
}
|
|
|
|
|
task.start();
|
|
|
|
|
} catch (e) {
|
|
|
|
|
errorCb && errorCb(e);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 确保父目录存在
|
|
|
|
|
try {
|
|
|
|
|
const parent = savepath.substring(0, savepath.lastIndexOf('/'));
|
|
|
|
|
plus.io.resolveLocalFileSystemURL(parent, function(entry) {
|
|
|
|
|
startDownload();
|
|
|
|
|
}, function() {
|
|
|
|
|
// 目录不存在,尝试创建(针对 _doc/<conversationID> 结构)
|
|
|
|
|
let rel = parent;
|
|
|
|
|
if (rel.indexOf('_doc/') === 0) rel = rel.replace(/^_doc\//, '');
|
|
|
|
|
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
|
|
|
|
|
fs.root.getDirectory(rel, { create: true }, function(entry) {
|
|
|
|
|
startDownload();
|
|
|
|
|
}, function(e) {
|
|
|
|
|
// 创建失败也尝试下载,可能运行时会自动创建
|
|
|
|
|
startDownload();
|
|
|
|
|
});
|
|
|
|
|
}, function(e) {
|
|
|
|
|
startDownload();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
} catch (e) {
|
|
|
|
|
startDownload();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|