|
|
|
|
|
/*
|
|
|
|
|
|
* 公共方法
|
|
|
|
|
|
*
|
|
|
|
|
|
*/
|
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
|
import { ROOTPATH } from "@/common/config.js"
|
|
|
|
|
|
const base = {
|
|
|
|
|
|
toast : (msg, time, callback) => {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
icon: "none",
|
|
|
|
|
|
title: msg,
|
|
|
|
|
|
duration: time || 2000,
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
if (callback && typeof(callback) == 'function') {
|
|
|
|
|
|
console.log(callback)
|
|
|
|
|
|
callback()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
// 验证是否为空
|
|
|
|
|
|
isNull : (p) => {
|
|
|
|
|
|
return p == '' || p == undefined || p == null || p == 'undefined' || p == 'null';
|
|
|
|
|
|
},
|
|
|
|
|
|
getAgeFromId(idNumber) {
|
|
|
|
|
|
if (!idNumber || idNumber.length !== 18) {
|
|
|
|
|
|
return ''
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const today = new Date();
|
|
|
|
|
|
const birthDate = new Date(idNumber.substring(6, 10), idNumber.substring(10, 12) - 1, idNumber.substring(12, 14));
|
|
|
|
|
|
|
|
|
|
|
|
let age = today.getFullYear() - birthDate.getFullYear();
|
|
|
|
|
|
const m = today.getMonth() - birthDate.getMonth();
|
|
|
|
|
|
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
|
|
|
|
|
|
age--;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return age + '岁';
|
|
|
|
|
|
},
|
|
|
|
|
|
// 格式化中国日期,兼容iOS
|
|
|
|
|
|
formatChinaDate : (dateStr) => {
|
|
|
|
|
|
if (!dateStr) return '';
|
|
|
|
|
|
|
|
|
|
|
|
// 处理iOS不支持的日期格式
|
|
|
|
|
|
let processedDateStr = dateStr;
|
|
|
|
|
|
if (typeof dateStr === 'string') {
|
|
|
|
|
|
// 将 "2025-06-25 01:31:10" 格式转换为 "2025-06-25T01:31:10"
|
|
|
|
|
|
if (dateStr.includes('-') && dateStr.includes(' ') && dateStr.includes(':')) {
|
|
|
|
|
|
processedDateStr = dateStr.replace(' ', 'T');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const date = new Date(processedDateStr);
|
|
|
|
|
|
|
|
|
|
|
|
// 检查日期是否有效
|
|
|
|
|
|
if (isNaN(date.getTime())) {
|
|
|
|
|
|
console.warn('Invalid date format:', dateStr);
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const y = date.getFullYear();
|
|
|
|
|
|
const m = String(date.getMonth() + 1).padStart(2, '0');
|
|
|
|
|
|
const d = String(date.getDate()).padStart(2, '0');
|
|
|
|
|
|
return `${y}-${m}-${d}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// URL工具类
|
|
|
|
|
|
const urlUtils = {
|
|
|
|
|
|
// 处理敏感参数
|
|
|
|
|
|
handleSensitiveParams(url, sensitiveParams = ['code', 'state', 'access_token']) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
|
const params = new URLSearchParams(urlObj.search);
|
|
|
|
|
|
const storedParams = {};
|
|
|
|
|
|
|
|
|
|
|
|
// 检查并存储敏感参数
|
|
|
|
|
|
sensitiveParams.forEach(param => {
|
|
|
|
|
|
if (params.has(param)) {
|
|
|
|
|
|
storedParams[param] = params.get(param);
|
|
|
|
|
|
params.delete(param);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 如果有敏感参数,存储到localStorage
|
|
|
|
|
|
if (Object.keys(storedParams).length > 0) {
|
|
|
|
|
|
const storageKey = `sensitive_params_${Date.now()}`;
|
|
|
|
|
|
const storageData = {
|
|
|
|
|
|
params: storedParams,
|
|
|
|
|
|
timestamp: Date.now(),
|
|
|
|
|
|
expires: Date.now() + 5 * 60 * 1000 // 5分钟过期
|
|
|
|
|
|
};
|
|
|
|
|
|
localStorage.setItem(storageKey, JSON.stringify(storageData));
|
|
|
|
|
|
|
|
|
|
|
|
// 更新URL
|
|
|
|
|
|
urlObj.search = params.toString();
|
|
|
|
|
|
return {
|
|
|
|
|
|
url: urlObj.toString(),
|
|
|
|
|
|
storageKey: storageKey
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return { url: url, storageKey: null };
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.warn('处理敏感参数时出错:', error);
|
|
|
|
|
|
return { url: url, storageKey: null };
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 生成安全的分享链接
|
|
|
|
|
|
generateSafeShareUrl(originalUrl, additionalParams = {}) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const result = this.handleSensitiveParams(originalUrl);
|
|
|
|
|
|
const urlObj = new URL(result.url);
|
|
|
|
|
|
|
|
|
|
|
|
// 添加额外参数
|
|
|
|
|
|
Object.keys(additionalParams).forEach(key => {
|
|
|
|
|
|
urlObj.searchParams.set(key, additionalParams[key]);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return urlObj.toString();
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.warn('生成安全分享链接时出错:', error);
|
|
|
|
|
|
return originalUrl;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 恢复敏感参数
|
|
|
|
|
|
restoreSensitiveParams(url, storageKey) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
if (!storageKey) return url;
|
|
|
|
|
|
|
|
|
|
|
|
const storedData = localStorage.getItem(storageKey);
|
|
|
|
|
|
if (!storedData) return url;
|
|
|
|
|
|
|
|
|
|
|
|
const data = JSON.parse(storedData);
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否过期
|
|
|
|
|
|
if (Date.now() > data.expires) {
|
|
|
|
|
|
localStorage.removeItem(storageKey);
|
|
|
|
|
|
return url;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
|
Object.keys(data.params).forEach(key => {
|
|
|
|
|
|
urlObj.searchParams.set(key, data.params[key]);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return urlObj.toString();
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.warn('恢复敏感参数时出错:', error);
|
|
|
|
|
|
return url;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export {
|
|
|
|
|
|
base,
|
|
|
|
|
|
urlUtils
|
|
|
|
|
|
}
|