mrr.sj.front/mixins/mixins.js

255 lines
6.7 KiB
JavaScript
Raw Permalink 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.

// mixins/share.js
import request from '@/utils/request'
export default {
methods: {
formatPriceNumber(num) {
num = Number(num)
let formatted;
formatted = num.toFixed(2);
// 根据数字大小确定保留的小数位数
// if (num >= 100) {
// // 大于等于100时不保留小数
// formatted = Math.floor(num).toString();
// } else if (num >= 10) {
// // 大于等于10时保留1位小数
// formatted = num.toFixed(1);
// } else {
// // 其他情况,保留两位小数
// formatted = num.toFixed(2);
// }
// 处理小数最后一位是0的情况
// 如果包含小数点则检查并移除末尾的0和可能的小数点
// if (formatted.includes(".")) {
// formatted = formatted.replace(/0+$/, "").replace(/\.$/, "");
// }
return formatted;
},
getValueLength(value) {
// 处理null和undefined
if (value === null || value === undefined) {
return 0;
}
// 处理字符串和数组直接使用length属性
if (typeof value === 'string' || Array.isArray(value)) {
return value.length;
}
// 处理对象(返回可枚举自有属性的数量)
if (Object.prototype.toString.call(value) === '[object Object]') {
return Object.keys(value).length;
}
// 处理其他类型(数字、布尔值、函数等无长度概念的类型)
return 0;
},
formatPriceSize(o_num, o_fontSize, type = 1) {
let fontSize = o_fontSize;
const len = this.formatPriceNumber(o_num).length;
//首页拼团立省价格
if (len > 7 && type == 1) {
fontSize -= 4;
}
//分享图立省价格
if (len > 7 && type == 2) {
fontSize -= 3;
}
//分享图拼团价格
if (type === 3) {
if (len > 4) {
fontSize -= 10;
}
if (len > 5) {
fontSize -= 4;
}
if (len > 6) {
fontSize -= 6;
}
if (len > 7) {
fontSize -= 6;
}
}
//分享图原价
if (type === 4) {
if (len > 5) {
fontSize -= 2;
}
if (len > 6) {
fontSize -= 2;
}
}
//首页商家
if (type === 5) {
if (len > 6) {
fontSize -= 6;
}
if (len > 7) {
fontSize -= 4;
}
if (len > 8) {
fontSize -= 4;
}
}
return fontSize;
},
//px转rpx
pxToRpx(px, screenWidth) {
if (typeof px !== 'number') {
throw new Error('请传入数字类型的px值');
}
return px * (750 / screenWidth);
},
//获取rpx值的statusBarHeight
getRpxStatusBarHeight() {
let statusBarHeight = this.$store.state.systemInfo.statusBarHeight
let screenWidth = this.$store.state.systemInfo.screenWidth
return this.pxToRpx(statusBarHeight, screenWidth)
},
//消息数量跟新
messageUpudateNum() {
if (uni.getStorageSync('accessToken')) {
request.post("/sj/push/messageUnreadNum").then(res => {
if (res.code == 200) {
this.$store.commit("setMessageNum", res.data.count)
}
})
}
},
//消息列表跳转阅读
messageRead(id) {
request.post("/sj/push/messageRead", {
id: id
}).then(res => {
console.log("messageRead:", res)
this.messageUpudateNum()
})
},
/**
* 获取图片路径通过条件编译区分环境仅App缓存非App直接返回网络URL
* @param {string | string[]} urls - 单个图片URL或URL数组
* @returns {Promise<string | string[]>} - 单个URL返回字符串数组返回对应路径数组
*/
async getImagePath(urls) {
// ======================
// 条件编译非App环境小程序/H5/快应用等)
// #ifndef APP-PLUS
console.log('【编译期判断】当前非App环境直接返回网络图片路径');
// 格式化返回值:过滤空值,保持入参格式(数组/字符串)
if (Array.isArray(urls)) {
return urls.filter(url => typeof url === 'string' && url.trim());
}
return typeof urls === 'string' && urls.trim() ? urls.trim() : '';
// #endif
// ======================
// 条件编译仅App环境5+App
// #ifdef APP-PLUS
// 参数校验
if (!urls) {
console.error('getImagePath请传入有效的URL字符串/数组)');
return Array.isArray(urls) ? [] : '';
}
// 统一转为数组处理
const isBatch = Array.isArray(urls);
const urlList = isBatch ?
urls.filter(url => typeof url === 'string' && url.trim()) : [urls.trim()];
if (urlList.length === 0) {
return isBatch ? [] : '';
}
// 遍历处理每个URL优先读缓存无缓存则下载
const resultList = [];
for (const url of urlList) {
try {
// 生成唯一缓存Key
const cacheKey = this._getImageCacheKey(url);
// 读取本地缓存
const cachedPath = uni.getStorageSync(cacheKey);
if (cachedPath) {
resultList.push(cachedPath);
continue;
}
// 无缓存则下载并保存
await this._downloadAndCacheImage(url);
// 再次读取缓存(兜底:防止保存失败)
const newCachedPath = uni.getStorageSync(cacheKey);
resultList.push(newCachedPath || url);
} catch (error) {
console.warn(`图片${url}缓存失败,使用网络路径:`, error.message);
resultList.push(url);
}
}
// 按入参格式返回(数组/字符串)
return isBatch ? resultList : resultList[0];
// #endif
},
// ======================
// 以下方法仅App环境编译非App环境会被剔除
// #ifdef APP-PLUS
/**
* 内部方法下载图片并缓存到本地仅App环境
* @param {string} url - 图片URL
* @returns {Promise<void>}
*/
async _downloadAndCacheImage(url) {
// 下载文件
const downloadRes = await new Promise((resolve, reject) => {
uni.downloadFile({
url,
success: resolve,
fail: (err) => reject(new Error(`下载失败:${err.errMsg}`))
});
});
// 校验下载状态
if (downloadRes.statusCode !== 200) {
throw new Error(`下载状态异常:状态码${downloadRes.statusCode}`);
}
// 保存到本地
const saveRes = await new Promise((resolve, reject) => {
uni.saveFile({
tempFilePath: downloadRes.tempFilePath,
success: resolve,
fail: (err) => reject(new Error(`保存失败:${err.errMsg}`))
});
});
// 存储缓存Key与本地路径的映射
const cacheKey = this._getImageCacheKey(url);
uni.setStorageSync(cacheKey, saveRes.savedFilePath);
},
/**
* 内部方法生成URL对应的唯一缓存Key仅App环境
* @param {string} url - 图片URL
* @returns {string}
*/
_getImageCacheKey(url) {
// App环境优先用原生MD5稳定性更高
if (plus.runtime.MD5) {
return `img_cache_${plus.runtime.MD5(url)}`;
}
// 兜底URL编码作为Key
return `img_cache_${encodeURIComponent(url).replace(/[^\w]/g, '_')}`;
},
// #endif
},
};