uniapp-ZHSQ/utils/index.js

291 lines
7.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// const RequsetUrl = 'https://huishang.magicany.cc/api/v1'; // 请求地址前缀
const RequsetUrl = 'https://test.hshuishang.com/api/v1'; // 请求地址前缀
export const picUrl = 'https://huishang.magicany.cc'; // 图片地址前缀
/**
* @description 小程序跳转方法二次封装
* @method NavgateTo
* @param {String} path - 跳转的目标页面路径
* @param {Object} options - 配置选项对象
* @param {Boolean} options.isLogin - 是否需要校验登录态,默认为 true
*/
export const NavgateTo = (path, options = {}) => {
const { isLogin = true } = options;
const userId = uni.getStorageSync('userId'); // 假设这个方法存在并返回用户信息
if (isLogin) {
if (!userId) {
uni.navigateTo({ url: '/pages/login/login' })
return
} else {
uni.navigateTo({
url: path
});
return;
}
}
uni.navigateTo({ url: path })
}
/**
* 封装请求方法
* @param {string} url 请求地址
* @param {string} method 请求方法
* @param {Object} data 请求参数
* @param {Object} options 配置选项对象
* @param {Boolean} options.silent - 是否显示loading默认为 true
* @param {Boolean} options.nested - 是否平铺接口返回参数,默认为 false
* @returns {Promise} 返回一个Promise对象
*/
export const request = (url, method = 'POST', data = {}, options = {}) => {
console.log('request 请求拓展参数 options', options);
const { silent = true, nested = false } = options;
let ctoken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkZWFsZXJfaWQiOjAsImV4cCI6MTc0NjY3MTk2NywiaW1nIjoiL3N0YXRpYy9pbWFnZXMvMjAyNS0wNS0wNi9kOW94b3EwYzJoZjV2Z2pxZGYucG5nIiwibXNob3BfaWQiOjAsIm9wZW5faWQiOiJvV2MxODY3b2dYZ0RHektneWtkLUpTM0dVT2tFIiwicm9sZV9pZCI6MSwidXNlcl9pZCI6NzIsInVzZXJfbmFtZSI6IuW-ruS_oeeUqOaItyIsIndzaG9wX2lkIjowfQ.MZTEOQOWDqu9mWelUSJd5QfMnn8WjZaYe9jnWkqvRrM';
// if (options.token) {
// ctoken = options.token;
// } else {
// ctoken = uni.getStorageSync('ctoken'); // 后续接口强依赖强校验该字段
// }
if (silent) {
uni.showLoading({
title: '加载中',
mask: true
})
};
let params = {
user_id: uni.getStorageSync('userId') || 67,
...data,
}
return new Promise((resolve, reject) => {
uni.request({
url: RequsetUrl + url,
method: method,
data: params,
header: {
'Content-Type': 'application/json',
'Authorization': ctoken,
// ...header,
},
success: (res) => {
console.log('请求成功,接口返参', res);
if (res.statusCode == 401) {
uni.showModal({
title: '提示',
content: '请登录后查看',
confirmText:"去登陆",
complete: (res) => {
console.log('11131', res)
if (res.cancel) {
uni.hideLoading();
return
}
if (res.confirm) {
uni.navigateTo({
url: '/pages/login/login',
})
}
}
})
return
}
if (res.statusCode === 200) {
if (silent) {
uni.hideLoading();
}
if (options?.nested) {
let data = {
...res.data,
}
resolve(data); // 请求成功
return;
}
resolve(res.data.data); // 请求成功
} else {
console.log('走到这列');
uni.hideLoading();
uni.showToast({
title: res.data.msg || '请求失败',
icon: 'none'
})
reject({
code: res.statusCode,
message: res.data.msg || '请求失败',
data: res.data,
});
}
},
fail: (err) => {
uni.hideLoading();
uni.showToast({
title: res.data.msg || '请求失败',
icon: 'none'
})
reject({
code: -1,
message: '接口异常,请稍后重试',
error: err,
});
},
});
});
}
/**
* 校验手机号是否合法
* @param {string} option 请求方法
* @returns {Boolean} 手机号是否正确
*/
export const isPhone = (option) => {
if(option.length != 11){
return false
}
if (!(/^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/.test(option))) {
return false
} else {
return true
}
}
/**
* 精确的浮点数运算
* @param {number} num1 - 第一个数字
* @param {number} num2 - 第二个数字
* @param {string} operator - 运算符,支持 '+', '-', '*', '/', '+='
* @returns {number} - 运算结果
*/
export const floatCalculate = (num1, num2, operator) => {
// 获取小数位数
function getPrecision(num) {
const str = num.toString();
const decimalIndex = str.indexOf('.');
return decimalIndex === -1 ? 0 : str.length - decimalIndex - 1;
}
// 计算放大倍数
const precision1 = getPrecision(num1);
const precision2 = getPrecision(num2);
const maxPrecision = Math.max(precision1, precision2);
const factor = Math.pow(10, maxPrecision);
// 将数字转换为整数
const intNum1 = Math.round(num1 * factor);
const intNum2 = Math.round(num2 * factor);
// 根据运算符进行计算
let result;
switch (operator) {
case '+':
result = (intNum1 + intNum2) / factor;
break;
case '-':
result = (intNum1 - intNum2) / factor;
break;
case '*':
result = (intNum1 * intNum2) / (factor * factor);
break;
case '/':
result = intNum1 / intNum2;
break;
case '+=':
result = (intNum1 + intNum2) / factor;
break;
default:
throw new Error('不支持的运算符');
}
return result;
}
/**
* 图片上传
* @param {string} filename - 图片上传地址
* @param {Function} fn - 接口回调函数
*/
export const upload = (filename, fn) => {
uni.uploadFile({
url: RequsetUrl + '/public/upload-image',
filePath: filename,
name: 'image',
formData: {
'uid': uni.getStorageSync('uid'),
},
success: (f) => {
fn(f.data);
},
fail: (res) => {
console.log(res);
uni.showToast({
title: '上传文件失败',
icon: 'none'
})
},
complete: () => {}
});
}
//
export const menuButtonInfo = () => {
const systemInfo = uni.getSystemInfoSync();
const platform = systemInfo.platform;
if (platform === 'ios') {
// TODO: ios待测试
return {
height: systemInfo.statusBarHeight,
top: 44,
};
}
if (platform === 'android') {
return {
height: systemInfo.statusBarHeight,
top: 44, // 自定义导航栏默认高度
};
}
if (systemInfo.uniPlatform === 'mp-weixin') {
console.log('走到这列 小程序');
// 微信小程序、支付宝小程序等,平台标识以 'mp-' 开头
return uni.getMenuButtonBoundingClientRect()
} else {
return 'Unknown';
}
}
/**
* 获取服务供应商
* @param {string} opt - 服务类型
* @returns {Promise} 返回一个Promise对象
*/
export const getProviderPromise = (opt) => {
return new Promise((resolve, reject) => {
uni.getProvider({
service: opt,
success: (res) => {
console.log('获取支付服务提供商成功:', res.provider);
resolve(res.provider);
},
fail: (err) => {
console.error('获取支付服务提供商失败:', err);
reject(err);
}
});
});
}
//数组去重
export const uniqueByField = (arr, field) => {
const seen = {};
return arr.filter(item => {
const key = item[field];
return seen.hasOwnProperty(key) ? false : (seen[key] = true);
});
}