From 5f00696dfb25bc90034448ceb634ed1ef256681a Mon Sep 17 00:00:00 2001
From: qiyunfeng-create <1940665526@qq.com>
Date: 星期四, 21 八月 2025 21:13:35 +0800
Subject: [PATCH] Merge branch 'master' of http://182.92.203.7:2001/r/xiehe_website

---
 src/components/sliderImg/sliderImg.js |  262 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 262 insertions(+), 0 deletions(-)

diff --git a/src/components/sliderImg/sliderImg.js b/src/components/sliderImg/sliderImg.js
new file mode 100644
index 0000000..db9063b
--- /dev/null
+++ b/src/components/sliderImg/sliderImg.js
@@ -0,0 +1,262 @@
+(function (window) {
+  let l = 50, // 婊戝潡杈归暱
+    r = 0, // 婊戝潡鍗婂緞
+    w = 300, // canvas瀹藉害
+    h = 150, // canvas楂樺害
+    PI = Math.PI;
+  let L = l + r * 2; // 婊戝潡瀹為檯杈归暱
+
+  function createCanvas(width, height) {
+    const canvas = createElement("canvas");
+    canvas.width = width;
+    canvas.height = height;
+    return canvas;
+  }
+
+  function createImg(onload, info) {
+    const img = createElement("img");
+    img.crossOrigin = "Anonymous";
+    img.onload = onload;
+    img.onerror = () => {
+      img.src = getRandomImg(info.backgroundImage);
+    };
+    img.src = getRandomImg(info.backgroundImage);
+    return img;
+  }
+
+  function createImg2(onload, info) {
+    const block = createElement("img");
+    block.crossOrigin = "Anonymous";
+    block.onload = onload;
+    block.onerror = () => {
+      block.src = getRandomImg(info.frontImage);
+    };
+    block.src = getRandomImg(info.frontImage);
+    return block;
+  }
+
+  function createElement(tagName) {
+    return document.createElement(tagName);
+  }
+
+  function addClass(tag, className) {
+    tag.classList.add(className);
+  }
+
+  function removeClass(tag, className) {
+    tag.classList.remove(className);
+  }
+
+  function getRandomImg(val) {
+    return val;
+  }
+
+  function sum(x, y) {
+    return x + y;
+  }
+
+  function square(x) {
+    return x * x;
+  }
+
+  function clear(obj) {
+    obj.canvasCtx.clearRect(0, 0, w, h);
+    obj.blockCtx.clearRect(0, 0, w, h);
+    obj.block.width = w;
+    document.getElementById("msg").innerHTML = null;
+    document.getElementById("captcha").innerHTML = null;
+  }
+
+  class jigsaw {
+    constructor(el, success, fail, info, parent) {
+      this.el = el;
+      this.success = success;
+      this.fail = fail;
+      this.info = info;
+      this.parent = parent;
+    }
+
+    init() {
+      if (this.info) {
+        const { backgroundHeight, backgroundWidth, frontHeight, frontWidth } =
+          this.info;
+        l = frontHeight;
+        r = 0;
+        w = backgroundWidth;
+        h = backgroundHeight;
+        L = frontWidth;
+      }
+      this.initDOM();
+      this.initImg();
+      this.bindEvents();
+    }
+
+    initDOM() {
+      const canvas = createCanvas(w, h); // 鐢诲竷
+      const block = canvas.cloneNode(true); // 婊戝潡
+      const msg = createElement("div");
+      const sliderContainer = createElement("div");
+      const refreshIcon = createElement("div");
+      const sliderMask = createElement("div");
+      const slider = createElement("div");
+      const sliderIcon = createElement("span");
+      const text = createElement("span");
+
+      block.className = "block";
+      msg.id = "msg";
+      sliderContainer.className = "sliderContainer";
+      refreshIcon.className = "refreshIcon";
+      sliderMask.className = "sliderMask";
+      slider.className = "slider";
+      sliderIcon.className = "sliderIcon";
+      text.innerHTML = "鍚戝彸婊戝姩婊戝潡濉厖鎷煎浘";
+      text.className = "sliderText";
+
+      const el = this.el;
+      el.appendChild(canvas);
+      el.appendChild(refreshIcon);
+      el.appendChild(block);
+      el.appendChild(msg);
+      slider.appendChild(sliderIcon);
+      sliderMask.appendChild(slider);
+      sliderContainer.appendChild(sliderMask);
+      sliderContainer.appendChild(text);
+      el.appendChild(sliderContainer);
+
+      Object.assign(this, {
+        canvas,
+        block,
+        sliderContainer,
+        refreshIcon,
+        slider,
+        sliderMask,
+        sliderIcon,
+        text,
+        msg,
+        canvasCtx: canvas.getContext("2d"),
+        blockCtx: block.getContext("2d"),
+        addClass,
+        clear,
+      });
+    }
+
+    initImg() {
+      const block = createImg2(() => {
+        this.blockCtx.drawImage(block, 0, 0, w, h);
+      }, this.info);
+      const img = createImg(() => {
+        this.canvasCtx.drawImage(img, 0, 0, w, h);
+      }, this.info);
+      this.img = img;
+    }
+
+    clean() {
+      this.canvasCtx.clearRect(0, 0, w, h);
+      this.blockCtx.clearRect(0, 0, w, h);
+      this.block.width = w;
+    }
+
+    bindEvents() {
+      this.el.onselectstart = () => false;
+      this.refreshIcon.onclick = () => {
+        this.reset();
+      };
+
+      let originX,
+        originY,
+        trail = [],
+        isMouseDown = false;
+      var that = this;
+
+      var handleDragStart = function (e) {
+        originX = e.clientX || e.touches[0].clientX;
+        originY = e.clientY || e.touches[0].clientY;
+        // (originX = e.x), (originY = e.y);
+        isMouseDown = true;
+      };
+
+      var handleDragMove = function (e) {
+        if (!isMouseDown) return false;
+        var eventX = e.clientX || e.touches[0].clientX;
+        var eventY = e.clientY || e.touches[0].clientY;
+        const moveX = eventX - originX;
+        const moveY = eventY - originY;
+        if (moveX < 0 || moveX + 38 >= w) return false;
+        that.slider.style.left = moveX + "px";
+        var blockLeft = ((w - 40 - 20) / (w - 40)) * moveX;
+        that.block.style.left = blockLeft + "px";
+        addClass(that.sliderContainer, "sliderContainer_active");
+        that.sliderMask.style.width = moveX + "px";
+        console.log(that.sliderMask.offsetLeft, 4545);
+        trail.push(moveY);
+      };
+
+      var handleDragEnd = function (e) {
+        if (!isMouseDown) return false;
+        isMouseDown = false;
+        var eventX = e.clientX || e.changedTouches[0].clientX;
+        if (eventX == originX) return false;
+        removeClass(that.sliderContainer, "sliderContainer_active");
+        that.trail = trail;
+        const { left } = that.verify();
+        const { prefix } = that.info;
+        if (left && prefix) {
+          that.success(left, prefix, that);
+        } else {
+          addClass(that.sliderContainer, "sliderContainer_fail");
+          that.fail && that.fail(left, prefix);
+          setTimeout(() => {
+            that.reset();
+          }, 1000);
+        }
+      };
+      this.slider.addEventListener("mousedown", handleDragStart);
+      this.slider.addEventListener("touchstart", handleDragStart);
+      document.addEventListener("mousemove", handleDragMove);
+      document.addEventListener("touchmove", handleDragMove);
+      document.addEventListener("mouseup", handleDragEnd);
+      document.addEventListener("touchend", handleDragEnd);
+
+      document.addEventListener("mousedown", function () {
+        return false;
+      });
+      document.addEventListener("touchstart", function () {
+        return false;
+      });
+      // this.slider.addEventListener("mousedown");
+      // document.addEventListener("mousemove");
+      // document.addEventListener("mouseup");
+    }
+
+    verify() {
+      const arr = this.trail; // 鎷栧姩鏃秠杞寸殑绉诲姩璺濈
+      const average = arr.reduce(sum) / arr.length; // 骞冲潎鍊�
+      const deviations = arr.map((x) => x - average); // 鍋忓樊鏁扮粍
+      const stddev = Math.sqrt(deviations.map(square).reduce(sum) / arr.length); // 鏍囧噯宸�
+      const left = parseInt(this.block.style.left);
+      return {
+        // spliced: Math.abs(left - this.x) < 10,
+        // TuringTest: average !== stddev, // 鍙槸绠�鍗曠殑楠岃瘉鎷栧姩杞ㄨ抗锛岀浉绛夋椂涓�鑸负0锛岃〃绀哄彲鑳介潪浜轰负鎿嶄綔
+        left,
+        // x: this.x,
+      };
+    }
+
+    reset() {
+      this.sliderContainer.className = "sliderContainer";
+      this.slider.style.left = 0;
+      this.block.style.left = 0;
+      this.sliderMask.style.width = 0;
+      clear(this);
+      // this.initImg();
+      this.parent.getImg();
+      console.log(this.parent);
+    }
+  }
+
+  window.jigsaw = {
+    init: function (element, success, fail, info, callback) {
+      new jigsaw(element, success, fail, info, callback).init();
+    },
+  };
+})(window);

--
Gitblit v1.9.1