import html2canvas from "html2canvas";
import { uploadBase64 } from "./uploadImg";
import wx from "weixin-js-sdk";
function detectRuntimeEnvironment() {
// Node.js环境
if (typeof process !== "undefined" && process.versions && process.versions.node) {
return "nodejs";
}
// 微信小程序环境
if (typeof wx !== "undefined" && wx && wx.getSystemInfo) {
return "wechat-miniprogram";
}
// WebView环境
if (typeof window !== "undefined" && typeof document !== "undefined") {
// 检查是否在微信内置浏览器中
const ua = navigator.userAgent.toLowerCase();
if (ua.match(/micromessenger/i)) {
return "wechat-webview";
}
return "browser";
}
// React Native环境
if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
return "react-native";
}
// 未知环境
return "unknown";
}
// 深拷贝
function deepClone(obj) {
if (typeof obj !== "object" || obj === null) {
return obj;
}
const target = obj.constructor === Array ? [] : {};
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
if (typeof obj[key] === "object") {
target[key] = deepClone(obj[key]);
} else {
target[key] = obj[key];
}
}
}
return target;
}
function extractCoordinates(input) {
// 使用正则表达式匹配括号内的内容
const match = input.match(/\(([^)]+)\)/);
if (match) {
// 如果找到了匹配项,match[1] 将包含括号内的内容
// 然后我们按照空格分割这个字符串来获取坐标
const coordinates = match[1].split(" ").map(Number); // 将每个坐标转换为数字
return coordinates;
}
// 如果没有找到匹配项,返回null或其他合适的值
return null;
}
// 节流 => 一定时间内只调用一次函数
function throttle(func, wait) {
let timeout = null;
let lastRun = 0;
return function (...args) {
const now = new Date().getTime();
if (!lastRun) {
// 如果 lastRun 没有被设置,表示这是第一次调用
func.apply(this, args);
lastRun = now;
} else {
clearTimeout(timeout);
// 设置一个新的超时,在 wait 时间后再次运行函数
timeout = setTimeout(() => {
if (now - lastRun >= wait) {
func.apply(this, args);
lastRun = now;
}
}, wait - (now - lastRun));
}
};
}
// 处理亩数
function formatArea(val) {
const num = typeof val === 'number' ? val : parseFloat(val);
if (Number.isNaN(num)) return val;
return Number.isInteger(num) ? num : num.toFixed(2);
}
// 下载图片的函数
async function downloadImage(downDom) {
if (downDom) {
const canvas = await html2canvas(downDom, {
useCORS: true, // 支持跨域图片
// scale: 2, // 提高生成图片分辨率
});
// 2. 创建最终合成的 Canvas
const finalCanvas = document.createElement("canvas");
const ctx = finalCanvas.getContext("2d");
// 设置最终图片大小
finalCanvas.width = canvas.width;
finalCanvas.height = canvas.height;
// 绘制 DOM 转换的内容
ctx.drawImage(canvas, 0, 0);
// 3. 加载本地二维码图片
const qrImage = new Image();
// qrImage.src = require("@/assets/img/weather_index/code.png"); // 本地二维码路径
// 等待二维码图片加载完成后绘制到 Canvas
qrImage.onload = () => {
const qrWidth = 48 * 3; // 二维码宽度
const qrHeight = 74 * 3; // 二维码高度
const padding = 8 * 3; // 边距
// 绘制二维码到最终 Canvas 的右上角
ctx.drawImage(
qrImage,
canvas.width - qrWidth - padding, // 右边距
padding, // 上边距
qrWidth,
qrHeight
);
const image = finalCanvas.toDataURL("image/png");
try {
uploadBase64(image);
} catch (error) {
console.error("上传失败:", error);
}
};
// // 创建下载链接
// const link = document.createElement("a");
// link.href = image;
// link.download = "每日三问.png";
// link.click();
}
}
function convertImage(imgUrl) {
return new Promise((resolve, reject) => {
fetch(imgUrl)
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP 错误:${response.status}`);
}
return response.blob(); // 获取图片的二进制数据
})
.then((blob) => {
const reader = new FileReader();
reader.onload = () => {
// 转换成功后返回 Base64 数据
resolve(reader.result); // 通过 resolve 返回 Base64 数据
};
reader.onerror = (error) => {
console.error("文件读取失败:", error);
reject(error); // 出现错误时通过 reject 抛出错误
};
reader.readAsDataURL(blob); // 将 Blob 数据转换为 Base64
})
.catch((error) => {
console.error("图片转换失败:", error);
reject(error); // 捕获错误并通过 reject 抛出
});
});
}
export { deepClone, extractCoordinates, throttle, downloadImage, convertImage, detectRuntimeEnvironment, formatArea };