refactor: 重构数据库配置为SQLite开发环境并移除冗余文档
This commit is contained in:
235
mini_program/utils/common.js
Normal file
235
mini_program/utils/common.js
Normal file
@@ -0,0 +1,235 @@
|
||||
// 通用工具函数
|
||||
const utils = {
|
||||
// 格式化时间
|
||||
formatTime(date) {
|
||||
const year = date.getFullYear();
|
||||
const month = date.getMonth() + 1;
|
||||
const day = date.getDate();
|
||||
const hour = date.getHours();
|
||||
const minute = date.getMinutes();
|
||||
const second = date.getSeconds();
|
||||
|
||||
return `${[year, month, day].map(this.formatNumber).join('/')} ${[hour, minute, second].map(this.formatNumber).join(':')}`;
|
||||
},
|
||||
|
||||
// 格式化日期
|
||||
formatDate(date) {
|
||||
const year = date.getFullYear();
|
||||
const month = date.getMonth() + 1;
|
||||
const day = date.getDate();
|
||||
|
||||
return [year, month, day].map(this.formatNumber).join('-');
|
||||
},
|
||||
|
||||
// 数字补零
|
||||
formatNumber(n) {
|
||||
n = n.toString();
|
||||
return n[1] ? n : `0${n}`;
|
||||
},
|
||||
|
||||
// 防抖函数
|
||||
debounce(func, wait) {
|
||||
let timeout;
|
||||
return function executedFunction(...args) {
|
||||
const later = () => {
|
||||
clearTimeout(timeout);
|
||||
func(...args);
|
||||
};
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
};
|
||||
},
|
||||
|
||||
// 节流函数
|
||||
throttle(func, limit) {
|
||||
let inThrottle;
|
||||
return function() {
|
||||
const args = arguments;
|
||||
const context = this;
|
||||
if (!inThrottle) {
|
||||
func.apply(context, args);
|
||||
inThrottle = true;
|
||||
setTimeout(() => inThrottle = false, limit);
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
// 深拷贝
|
||||
deepClone(obj) {
|
||||
if (obj === null || typeof obj !== 'object') return obj;
|
||||
if (obj instanceof Date) return new Date(obj.getTime());
|
||||
if (obj instanceof Array) return obj.map(item => this.deepClone(item));
|
||||
if (typeof obj === 'object') {
|
||||
const clonedObj = {};
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
clonedObj[key] = this.deepClone(obj[key]);
|
||||
}
|
||||
}
|
||||
return clonedObj;
|
||||
}
|
||||
},
|
||||
|
||||
// 生成唯一ID
|
||||
generateId() {
|
||||
return Date.now().toString(36) + Math.random().toString(36).substr(2);
|
||||
},
|
||||
|
||||
// 验证手机号
|
||||
validatePhone(phone) {
|
||||
const phoneReg = /^1[3-9]\d{9}$/;
|
||||
return phoneReg.test(phone);
|
||||
},
|
||||
|
||||
// 验证邮箱
|
||||
validateEmail(email) {
|
||||
const emailReg = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
return emailReg.test(email);
|
||||
},
|
||||
|
||||
// 验证身份证号
|
||||
validateIdCard(idCard) {
|
||||
const idCardReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
|
||||
return idCardReg.test(idCard);
|
||||
},
|
||||
|
||||
// 格式化文件大小
|
||||
formatFileSize(bytes) {
|
||||
if (bytes === 0) return '0 Bytes';
|
||||
const k = 1024;
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
||||
},
|
||||
|
||||
// 获取文件扩展名
|
||||
getFileExtension(filename) {
|
||||
return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2);
|
||||
},
|
||||
|
||||
// 数组去重
|
||||
uniqueArray(arr) {
|
||||
return [...new Set(arr)];
|
||||
},
|
||||
|
||||
// 数组分组
|
||||
groupBy(arr, key) {
|
||||
return arr.reduce((groups, item) => {
|
||||
const group = (groups[item[key]] || []);
|
||||
group.push(item);
|
||||
groups[item[key]] = group;
|
||||
return groups;
|
||||
}, {});
|
||||
},
|
||||
|
||||
// 计算两个日期之间的天数
|
||||
daysBetween(date1, date2) {
|
||||
const oneDay = 24 * 60 * 60 * 1000;
|
||||
const firstDate = new Date(date1);
|
||||
const secondDate = new Date(date2);
|
||||
return Math.round(Math.abs((firstDate - secondDate) / oneDay));
|
||||
},
|
||||
|
||||
// 获取当前位置
|
||||
getCurrentLocation() {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.getLocation({
|
||||
type: 'gcj02',
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 选择图片
|
||||
chooseImage(options = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.chooseImage({
|
||||
count: options.count || 1,
|
||||
sizeType: options.sizeType || ['original', 'compressed'],
|
||||
sourceType: options.sourceType || ['album', 'camera'],
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 上传文件
|
||||
uploadFile(filePath, url, formData = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.uploadFile({
|
||||
url,
|
||||
filePath,
|
||||
name: 'file',
|
||||
formData,
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 下载文件
|
||||
downloadFile(url) {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.downloadFile({
|
||||
url,
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 保存图片到相册
|
||||
saveImageToPhotosAlbum(filePath) {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.saveImageToPhotosAlbum({
|
||||
filePath,
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 扫码
|
||||
scanCode() {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.scanCode({
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 设置剪贴板
|
||||
setClipboardData(data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.setClipboardData({
|
||||
data,
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 获取剪贴板
|
||||
getClipboardData() {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.getClipboardData({
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 震动
|
||||
vibrateShort() {
|
||||
wx.vibrateShort();
|
||||
},
|
||||
|
||||
// 长震动
|
||||
vibrateLong() {
|
||||
wx.vibrateLong();
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = utils;
|
||||
Reference in New Issue
Block a user