commonFun.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import html2canvas from "html2canvas";
  2. import { uploadBase64 } from "./uploadImg";
  3. import wx from "weixin-js-sdk";
  4. function detectRuntimeEnvironment() {
  5. // Node.js环境
  6. if (typeof process !== "undefined" && process.versions && process.versions.node) {
  7. return "nodejs";
  8. }
  9. // 微信小程序环境
  10. if (typeof wx !== "undefined" && wx && wx.getSystemInfo) {
  11. return "wechat-miniprogram";
  12. }
  13. // WebView环境
  14. if (typeof window !== "undefined" && typeof document !== "undefined") {
  15. // 检查是否在微信内置浏览器中
  16. const ua = navigator.userAgent.toLowerCase();
  17. if (ua.match(/micromessenger/i)) {
  18. return "wechat-webview";
  19. }
  20. return "browser";
  21. }
  22. // React Native环境
  23. if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
  24. return "react-native";
  25. }
  26. // 未知环境
  27. return "unknown";
  28. }
  29. // 深拷贝
  30. function deepClone(obj) {
  31. if (typeof obj !== "object" || obj === null) {
  32. return obj;
  33. }
  34. const target = obj.constructor === Array ? [] : {};
  35. for (var key in obj) {
  36. if (Object.prototype.hasOwnProperty.call(obj, key)) {
  37. if (typeof obj[key] === "object") {
  38. target[key] = deepClone(obj[key]);
  39. } else {
  40. target[key] = obj[key];
  41. }
  42. }
  43. }
  44. return target;
  45. }
  46. function extractCoordinates(input) {
  47. // 使用正则表达式匹配括号内的内容
  48. const match = input.match(/\(([^)]+)\)/);
  49. if (match) {
  50. // 如果找到了匹配项,match[1] 将包含括号内的内容
  51. // 然后我们按照空格分割这个字符串来获取坐标
  52. const coordinates = match[1].split(" ").map(Number); // 将每个坐标转换为数字
  53. return coordinates;
  54. }
  55. // 如果没有找到匹配项,返回null或其他合适的值
  56. return null;
  57. }
  58. // 节流 => 一定时间内只调用一次函数
  59. function throttle(func, wait) {
  60. let timeout = null;
  61. let lastRun = 0;
  62. return function (...args) {
  63. const now = new Date().getTime();
  64. if (!lastRun) {
  65. // 如果 lastRun 没有被设置,表示这是第一次调用
  66. func.apply(this, args);
  67. lastRun = now;
  68. } else {
  69. clearTimeout(timeout);
  70. // 设置一个新的超时,在 wait 时间后再次运行函数
  71. timeout = setTimeout(() => {
  72. if (now - lastRun >= wait) {
  73. func.apply(this, args);
  74. lastRun = now;
  75. }
  76. }, wait - (now - lastRun));
  77. }
  78. };
  79. }
  80. // 处理亩数
  81. function formatArea(val) {
  82. const num = typeof val === 'number' ? val : parseFloat(val);
  83. if (Number.isNaN(num)) return val;
  84. return Number.isInteger(num) ? num : num.toFixed(2);
  85. }
  86. // 下载图片的函数
  87. async function downloadImage(downDom) {
  88. if (downDom) {
  89. const canvas = await html2canvas(downDom, {
  90. useCORS: true, // 支持跨域图片
  91. // scale: 2, // 提高生成图片分辨率
  92. });
  93. // 2. 创建最终合成的 Canvas
  94. const finalCanvas = document.createElement("canvas");
  95. const ctx = finalCanvas.getContext("2d");
  96. // 设置最终图片大小
  97. finalCanvas.width = canvas.width;
  98. finalCanvas.height = canvas.height;
  99. // 绘制 DOM 转换的内容
  100. ctx.drawImage(canvas, 0, 0);
  101. // 3. 加载本地二维码图片
  102. const qrImage = new Image();
  103. // qrImage.src = require("@/assets/img/weather_index/code.png"); // 本地二维码路径
  104. // 等待二维码图片加载完成后绘制到 Canvas
  105. qrImage.onload = () => {
  106. const qrWidth = 48 * 3; // 二维码宽度
  107. const qrHeight = 74 * 3; // 二维码高度
  108. const padding = 8 * 3; // 边距
  109. // 绘制二维码到最终 Canvas 的右上角
  110. ctx.drawImage(
  111. qrImage,
  112. canvas.width - qrWidth - padding, // 右边距
  113. padding, // 上边距
  114. qrWidth,
  115. qrHeight
  116. );
  117. const image = finalCanvas.toDataURL("image/png");
  118. try {
  119. uploadBase64(image);
  120. } catch (error) {
  121. console.error("上传失败:", error);
  122. }
  123. };
  124. // // 创建下载链接
  125. // const link = document.createElement("a");
  126. // link.href = image;
  127. // link.download = "每日三问.png";
  128. // link.click();
  129. }
  130. }
  131. function convertImage(imgUrl) {
  132. return new Promise((resolve, reject) => {
  133. fetch(imgUrl)
  134. .then((response) => {
  135. if (!response.ok) {
  136. throw new Error(`HTTP 错误:${response.status}`);
  137. }
  138. return response.blob(); // 获取图片的二进制数据
  139. })
  140. .then((blob) => {
  141. const reader = new FileReader();
  142. reader.onload = () => {
  143. // 转换成功后返回 Base64 数据
  144. resolve(reader.result); // 通过 resolve 返回 Base64 数据
  145. };
  146. reader.onerror = (error) => {
  147. console.error("文件读取失败:", error);
  148. reject(error); // 出现错误时通过 reject 抛出错误
  149. };
  150. reader.readAsDataURL(blob); // 将 Blob 数据转换为 Base64
  151. })
  152. .catch((error) => {
  153. console.error("图片转换失败:", error);
  154. reject(error); // 捕获错误并通过 reject 抛出
  155. });
  156. });
  157. }
  158. export { deepClone, extractCoordinates, throttle, downloadImage, convertImage, detectRuntimeEnvironment, formatArea };