| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- 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 };
|