diff --git a/pages/index/gesture-canvas-page.vue b/pages/index/gesture-canvas-page.vue index f4661c2..f85e7a3 100644 --- a/pages/index/gesture-canvas-page.vue +++ b/pages/index/gesture-canvas-page.vue @@ -86,10 +86,10 @@ export default { // 计算点击坐标(考虑dpr) const x = (e.detail.x - this.containerRect.left) * dpr; const y = (e.detail.y - this.containerRect.top) * dpr; - console.log('handleCanvasClick',x,y) + // console.log('handleCanvasClick',x,y) if (this.currentView === 'area') { const hitArea = this.$refs.canvasRef.checkHitArea(x, y); - console.log('handleCanvasClick',hitArea) + // console.log('handleCanvasClick',hitArea) if (hitArea) { uni.showModal({ title: '请确认', @@ -117,22 +117,31 @@ export default { toggleSeatSelection(seat) { - if (seat.status !== 1) return; // 只允许选择可用座位 - - if (this.selectedCodes.has(seat.code)) { - this.selectedCodes.delete(seat.code); - } else { - // 限制最多选择4个座位 - if (this.selectedCodes.size < 4) { - this.selectedCodes.add(seat.code); - } else { - uni.showToast({ - title: '最多只能选择4个座位', - icon: 'none' - }); - } - } - this.$refs.canvasRef.redraw(); // 触发重绘 + if (seat.status !== 1) return; // 只允许选择可用座位 + + // 创建新的 Set 实例,确保响应式更新 + const newSet = new Set(this.selectedCodes); + + if (newSet.has(seat.id)) { + newSet.delete(seat.id); + } else { + if (newSet.size < 6) { + newSet.add(seat.id); + } else { + uni.showToast({ + title: '最多只能选择6个座位', + icon: 'none' + }); + } + } + + // 更新选中状态 + this.selectedCodes = newSet; + + // 强制更新视图 + this.$nextTick(() => { + this.$refs.canvasRef.redraw(); + }); }, async getContainerPosition() { @@ -173,7 +182,7 @@ export default { this.gestureHandler = new GestureHandler(this, this.transformMatrix, { container: this.containerRect }); - console.log( 'initGestureHandler', this.gestureHandler ) + // console.log( 'initGestureHandler', this.gestureHandler ) } catch (e) { console.error('手势处理器初始化失败:', e); // 简化降级方案 @@ -248,7 +257,7 @@ export default { }, async handleTouchEvent(event) { - console.log(event,'handleTouchEvent') + // console.log(event,'handleTouchEvent') // 更新触点数量 this.touchPoints = event.touches.length; diff --git a/pages/index/gesture-handler.js b/pages/index/gesture-handler.js index 28907a7..cc7c6fc 100644 --- a/pages/index/gesture-handler.js +++ b/pages/index/gesture-handler.js @@ -118,6 +118,7 @@ class GestureHandler { this.panStarted = false; } else if (event.type === 'panmove') { + console.log('移动') const distance = Math.sqrt(event.deltaX**2 + event.deltaY**2); if (!this.panStarted && distance < this.panThreshold) return; diff --git a/pages/index/transform-canvas.vue b/pages/index/transform-canvas.vue index 1677be4..bec1d16 100644 --- a/pages/index/transform-canvas.vue +++ b/pages/index/transform-canvas.vue @@ -45,15 +45,17 @@ export default { watch: { selectedCodes:{ handler(newVal) { - this.nowSelectedCodes = newVal + this.nowSelectedCodes = new Set(newVal); }, - immediate: true + immediate: true, + deep: true // 添加深度监听 }, imgUrl: { handler(newUrl) { if (newUrl) this.loadImage(newUrl); }, - immediate: true + immediate: true, + }, width: { handler() { @@ -104,7 +106,7 @@ export default { // 转换坐标到原始画布空间 const inverted = this.matrix.invertPoint(x, y, this.dpr); - console.log('checkHitArea',inverted) + // console.log('checkHitArea',inverted) // 遍历所有区域检测 for (const area of this.areaData) { if (this.pointInPolygon(inverted.x, inverted.y, area.polygon)) { @@ -317,62 +319,74 @@ export default { }); }, drawSeats() { - this.ctx.save(); - - // 应用变换矩阵 - const { a, b, c, d, tx, ty } = this.matrix; - this.ctx.setTransform(a, b, c, d, tx, ty); - - // 获取当前缩放比例 - const scale = Math.sqrt(a * a + b * b); - - this.seatData.forEach(seat => { - const x = seat.x; - const y = seat.y; - - // 根据缩放调整座位大小 - const radius = 8 / scale; - - console.log(this.nowSelectedCodes,'nowSelectedCodesnowSelectedCodesnowSelectedCodes') - // 修改1:为选中座位添加特殊样式 - if (this.nowSelectedCodes.has(seat.code) && seat.status === 1) { - // 1. 绘制金色边框 - this.ctx.beginPath(); - this.ctx.arc(x, y, radius + 1, 0, Math.PI * 2); - this.ctx.strokeStyle = '#FFD700'; // 金色 - this.ctx.lineWidth = 2 / scale; - this.ctx.stroke(); - - // 2. 绘制半透明金色背景 - this.ctx.beginPath(); - this.ctx.arc(x, y, radius, 0, Math.PI * 2); - this.ctx.fillStyle = 'rgba(255, 215, 0, 0.3)'; - this.ctx.fill(); - - // 3. 绘制白色对勾(缩小版) - this.ctx.strokeStyle = '#fff'; - this.ctx.lineWidth = 1 / scale; - this.ctx.lineCap = 'round'; - this.ctx.beginPath(); - this.ctx.moveTo(x - 2.5, y); - this.ctx.lineTo(x - 0.5, y + 1.5); - this.ctx.lineTo(x + 2.5, y - 2); - this.ctx.stroke(); - } else { - // 普通座位的绘制保持不变 - this.ctx.beginPath(); - this.ctx.arc(x, y, radius, 0, Math.PI * 2); - this.ctx.fillStyle = seat.status === 1 ? '#4cd964' : '#dd524d'; - this.ctx.fill(); - } - - // 仅在缩放足够大时显示文字 - - }); - - this.ctx.restore(); - } - + this.ctx.save(); + + // 应用变换矩阵 + const { a, b, c, d, tx, ty } = this.matrix; + this.ctx.setTransform(a, b, c, d, tx, ty); + + // 获取当前缩放比例 + const scale = Math.sqrt(a * a + b * b); + + // 确保 nowSelectedCodes 是 Set 类型 + const selectedSet = this.nowSelectedCodes instanceof Set + ? this.nowSelectedCodes + : new Set(this.nowSelectedCodes || []); + + + this.seatData.forEach(seat => { + const x = seat.x; + const y = seat.y; + + // 根据缩放调整座位大小 + const radius = 8 / scale; + // console. + // 检查座位是否被选中 + const isSelected = selectedSet.has(seat.id) && seat.status === 1; + // console.log('selectedSet',selectedSet) + // console.log('seat',seat) + if (isSelected) { + // 绘制选中样式 + this.ctx.beginPath(); + this.ctx.arc(x, y, radius + 1, 0, Math.PI * 2); + this.ctx.strokeStyle = '#FFD700'; // 金色边框 + this.ctx.lineWidth = 2 / scale; + this.ctx.stroke(); + + this.ctx.beginPath(); + this.ctx.arc(x, y, radius, 0, Math.PI * 2); + this.ctx.fillStyle = 'rgba(255, 215, 0, 0.3)'; // 半透明金色背景 + this.ctx.fill(); + + // 绘制对勾 + this.ctx.strokeStyle = '#fff'; + this.ctx.lineWidth = 1 / scale; + this.ctx.lineCap = 'round'; + this.ctx.beginPath(); + this.ctx.moveTo(x - 2.5, y); + this.ctx.lineTo(x - 0.5, y + 1.5); + this.ctx.lineTo(x + 2.5, y - 2); + this.ctx.stroke(); + } else { + // 绘制普通座位 + this.ctx.beginPath(); + this.ctx.arc(x, y, radius, 0, Math.PI * 2); + this.ctx.fillStyle = seat.status === 1 ? '#4cd964' : '#dd524d'; + this.ctx.fill(); + } + + // 不需要此段代码了 + // if (scale > 0.5) { + // this.ctx.fillStyle = '#fff'; + // this.ctx.font = `bold ${Math.max(10 / scale, 8)}px sans-serif`; + // this.ctx.textAlign = 'center'; + // this.ctx.textBaseline = 'middle'; + // this.ctx.fillText(seat.name, x, y); + // } + }); + + this.ctx.restore(); + } } } \ No newline at end of file diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/gesture-handler.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/gesture-handler.js.map index edf98bb..44eb7a5 100644 --- a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/gesture-handler.js.map +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/gesture-handler.js.map @@ -1 +1 @@ -{"version":3,"file":"gesture-handler.js","sources":["pages/index/gesture-handler.js"],"sourcesContent":["class GestureHandler {\n constructor(context, transformMatrix, { container }) {\n this.transformMatrix = transformMatrix;\n this.containerRect = container;\n this.panThreshold = 5;\n this.panStarted = false;\n\t\t// 保存父组件上下文\n\t\tthis.context = context;\n // 判断是否是小程序环境\n this.isMiniProgram = typeof wx !== 'undefined' || typeof uni !== 'undefined';\n \n // 小程序环境下直接使用降级方案\n if (this.isMiniProgram) {\n console.log('小程序环境,使用降级手势处理器');\n this.catchEvent = this.createSimpleGestureHandler();\n return;\n }\n \n // 非小程序环境尝试使用AnyTouch\n try {\n const atOptions = {\n getPoint: touch => ({\n x: touch.clientX - this.containerRect.left,\n y: touch.clientY - this.containerRect.top\n }),\n preventDefault: false\n };\n \n // 提供兼容小程序的虚拟元素\n atOptions.element = {\n style: {},\n addEventListener: () => {},\n removeEventListener: () => {},\n ownerDocument: {\n documentElement: {\n style: {}\n }\n }\n };\n \n // 动态导入AnyTouch避免小程序环境问题\n import('any-touch').then(AnyTouch => {\n this.at = new AnyTouch.default(atOptions);\n this.setupGestures();\n console.log('AnyTouch手势处理器已初始化');\n }).catch(e => {\n console.error('AnyTouch加载失败:', e);\n this.catchEvent = this.createSimpleGestureHandler();\n });\n } catch (e) {\n console.error('AnyTouch初始化失败:', e);\n this.catchEvent = this.createSimpleGestureHandler();\n }\n }\n \n createSimpleGestureHandler() {\n let isClick = true;\n let startPoint = null;\n let startTime = null;\n let lastPoint = null;\n \n return (event) => {\n // 移除了视图判断\n const touches = event.touches || [];\n \n if (touches.length === 1) {\n const getPoint = (t) => ({\n x: t.x || (t.clientX - this.containerRect.left),\n y: t.y || (t.clientY - this.containerRect.top)\n });\n \n const currentPoint = getPoint(touches[0]);\n \n if (!startPoint) {\n startPoint = currentPoint;\n startTime = Date.now();\n }\n \n const dx = currentPoint.x - startPoint.x;\n const dy = currentPoint.y - startPoint.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n \n // 区分点击和拖拽\n if (isClick && distance < 5 && Date.now() - startTime < 200) {\n return;\n }\n \n isClick = false;\n \n if (lastPoint) {\n const moveDx = currentPoint.x - lastPoint.x;\n const moveDy = currentPoint.y - lastPoint.y;\n \n this.transformMatrix.tx += moveDx;\n this.transformMatrix.ty += moveDy;\n }\n \n lastPoint = currentPoint;\n } else if (touches.length > 1) {\n this._handlePinch(touches);\n }\n \n // 重置状态\n if (event.type === 'touchend' || event.type === 'touchcancel') {\n isClick = true;\n startPoint = null;\n startTime = null;\n lastPoint = null;\n }\n };\n }\n \n \n setupGestures() {\n // 平移手势\n this.at.on('pan', (event) => {\n if (event.type === 'panstart') {\n this.panStarted = false;\n }\n else if (event.type === 'panmove') {\n const distance = Math.sqrt(event.deltaX**2 + event.deltaY**2);\n \n if (!this.panStarted && distance < this.panThreshold) return;\n \n if (!this.panStarted) {\n this.panStarted = true;\n }\n \n const currentScale = Math.sqrt(\n this.transformMatrix.a * this.transformMatrix.a +\n this.transformMatrix.b * this.transformMatrix.b\n );\n \n const dx = event.deltaX / currentScale;\n const dy = event.deltaY / currentScale;\n \n this.transformMatrix.translate(dx, dy);\n } else if (event.type === 'panend') {\n this.panStarted = false;\n }\n });\n \n // 缩放手势\n this.at.on('pinch', (event) => {\n if (event.type === 'pinchstart') {\n this.lastScale = 1;\n }\n else if (event.type === 'pinchmove') {\n const scaleChange = event.scale / this.lastScale;\n this.lastScale = event.scale;\n \n const centerX = event.center.x;\n const centerY = event.center.y;\n \n this.transformMatrix.scale(scaleChange, scaleChange, centerX, centerY);\n }\n });\n }\n \n // 公共接口\n catchEvent(event) {\n\t\t// 当触摸点数量变化时终止当前手势\n\t\tif (this.lastTouchCount !== event.touches.length) {\n\t\t\tthis.panStarted = false;\n\t\t\tthis.lastPoints = null;\n\t\t}\n\t\tthis.lastTouchCount = event.touches.length;\n\t\t\n try {\n if (this.at) {\n this.at.run(event);\n } else if (this.catchEvent) {\n this.catchEvent(event);\n }\n } catch (e) {\n console.error('手势处理错误:', e);\n }\n }\n \n // 基础平移手势处理\n _handlePan(touch) {\n const getPoint = (t) => ({\n x: t.x || (t.clientX - this.containerRect.left),\n y: t.y || (t.clientY - this.containerRect.top)\n });\n \n const currentPoint = getPoint(touch);\n \n if (this.lastPoint) {\n const dx = currentPoint.x - this.lastPoint.x;\n const dy = currentPoint.y - this.lastPoint.y;\n \n this.transformMatrix.tx += dx;\n this.transformMatrix.ty += dy;\n }\n \n this.lastPoint = currentPoint;\n }\n \n // 基础缩放手势处理\n _handlePinch(touches) {\n const point1 = touches[0];\n const point2 = touches[1];\n \n const getPoint = (touch) => ({\n x: touch.x || (touch.clientX - this.containerRect.left),\n y: touch.y || (t.clientY - this.containerRect.top)\n });\n \n const currentPoints = [getPoint(point1), getPoint(point2)];\n \n if (this.lastPoints) {\n const currentDistance = Math.sqrt(\n Math.pow(currentPoints[1].x - currentPoints[0].x, 2) + \n Math.pow(currentPoints[1].y - currentPoints[0].y, 2)\n );\n \n const prevDistance = Math.sqrt(\n Math.pow(this.lastPoints[1].x - this.lastPoints[0].x, 2) + \n Math.pow(this.lastPoints[1].y - this.lastPoints[0].y, 2)\n );\n \n if (prevDistance > 0 && currentDistance > 0) {\n const scaleChange = currentDistance / prevDistance;\n \n const centerX = (currentPoints[0].x + currentPoints[1].x) / 2;\n const centerY = (currentPoints[0].y + currentPoints[1].y) / 2;\n \n this.transformMatrix.scale(scaleChange, scaleChange, centerX, centerY);\n }\n }\n \n this.lastPoints = currentPoints;\n }\n}\n\nexport default GestureHandler;"],"names":["wx","uni","t"],"mappings":";;AAAA,MAAM,eAAe;AAAA,EACnB,YAAY,SAAS,iBAAiB,EAAE,UAAS,GAAI;AACnD,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,SAAK,aAAa;AAEpB,SAAK,UAAU;AAEb,SAAK,gBAAgB,OAAOA,cAAAA,SAAO,eAAe,OAAOC,cAAG,UAAK;AAGjE,QAAI,KAAK,eAAe;AACtBA,oBAAAA,2DAAY,iBAAiB;AAC7B,WAAK,aAAa,KAAK;AACvB;AAAA,IACD;AAGD,QAAI;AACF,YAAM,YAAY;AAAA,QAChB,UAAU,YAAU;AAAA,UAClB,GAAG,MAAM,UAAU,KAAK,cAAc;AAAA,UACtC,GAAG,MAAM,UAAU,KAAK,cAAc;AAAA,QAChD;AAAA,QACQ,gBAAgB;AAAA,MACxB;AAGM,gBAAU,UAAU;AAAA,QAClB,OAAO,CAAE;AAAA,QACT,kBAAkB,MAAM;AAAA,QAAE;AAAA,QAC1B,qBAAqB,MAAM;AAAA,QAAE;AAAA,QAC7B,eAAe;AAAA,UACb,iBAAiB;AAAA,YACf,OAAO,CAAE;AAAA,UACV;AAAA,QACF;AAAA,MACT;AAGM,MAAO,yBAAW,KAAA,OAAA,EAAA,QAAA,EAAE,KAAK,cAAY;AACnC,aAAK,KAAK,IAAI,SAAS,QAAQ,SAAS;AACxC,aAAK,cAAa;AAClBA,sBAAAA,MAAA,MAAA,OAAA,wCAAY,mBAAmB;AAAA,MACvC,CAAO,EAAE,MAAM,OAAK;AACZA,sBAAc,MAAA,MAAA,SAAA,wCAAA,iBAAiB,CAAC;AAChC,aAAK,aAAa,KAAK;MAC/B,CAAO;AAAA,IACF,SAAQ,GAAG;AACVA,oBAAc,MAAA,MAAA,SAAA,wCAAA,kBAAkB,CAAC;AACjC,WAAK,aAAa,KAAK;IACxB;AAAA,EACF;AAAA,EAEF,6BAA6B;AACzB,QAAI,UAAU;AACd,QAAI,aAAa;AACjB,QAAI,YAAY;AAChB,QAAI,YAAY;AAEhB,WAAO,CAAC,UAAU;AAEhB,YAAM,UAAU,MAAM,WAAW;AAEjC,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,WAAW,CAACC,QAAO;AAAA,UACvB,GAAGA,GAAE,KAAMA,GAAE,UAAU,KAAK,cAAc;AAAA,UAC1C,GAAGA,GAAE,KAAMA,GAAE,UAAU,KAAK,cAAc;AAAA,QACrD;AAES,cAAM,eAAe,SAAS,QAAQ,CAAC,CAAC;AAExC,YAAI,CAAC,YAAY;AACf,uBAAa;AACb,sBAAY,KAAK;QAClB;AAED,cAAM,KAAK,aAAa,IAAI,WAAW;AACvC,cAAM,KAAK,aAAa,IAAI,WAAW;AACvC,cAAM,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAG5C,YAAI,WAAW,WAAW,KAAK,KAAK,IAAK,IAAG,YAAY,KAAK;AAC3D;AAAA,QACD;AAED,kBAAU;AAEV,YAAI,WAAW;AACb,gBAAM,SAAS,aAAa,IAAI,UAAU;AAC1C,gBAAM,SAAS,aAAa,IAAI,UAAU;AAE1C,eAAK,gBAAgB,MAAM;AAC3B,eAAK,gBAAgB,MAAM;AAAA,QAC5B;AAED,oBAAY;AAAA,MACrB,WAAkB,QAAQ,SAAS,GAAG;AAC7B,aAAK,aAAa,OAAO;AAAA,MAC1B;AAGD,UAAI,MAAM,SAAS,cAAc,MAAM,SAAS,eAAe;AAC7D,kBAAU;AACV,qBAAa;AACb,oBAAY;AACZ,oBAAY;AAAA,MACb;AAAA,IACR;AAAA,EACI;AAAA,EAGF,gBAAgB;AAEd,SAAK,GAAG,GAAG,OAAO,CAAC,UAAU;AAC3B,UAAI,MAAM,SAAS,YAAY;AAC7B,aAAK,aAAa;AAAA,MACnB,WACQ,MAAM,SAAS,WAAW;AACjC,cAAM,WAAW,KAAK,KAAK,MAAM,UAAQ,IAAI,MAAM,UAAQ,CAAC;AAE5D,YAAI,CAAC,KAAK,cAAc,WAAW,KAAK;AAAc;AAEtD,YAAI,CAAC,KAAK,YAAY;AACpB,eAAK,aAAa;AAAA,QACnB;AAED,cAAM,eAAe,KAAK;AAAA,UACxB,KAAK,gBAAgB,IAAI,KAAK,gBAAgB,IAC9C,KAAK,gBAAgB,IAAI,KAAK,gBAAgB;AAAA,QACxD;AAEQ,cAAM,KAAK,MAAM,SAAS;AAC1B,cAAM,KAAK,MAAM,SAAS;AAE1B,aAAK,gBAAgB,UAAU,IAAI,EAAE;AAAA,MAC7C,WAAiB,MAAM,SAAS,UAAU;AAClC,aAAK,aAAa;AAAA,MACnB;AAAA,IACP,CAAK;AAGD,SAAK,GAAG,GAAG,SAAS,CAAC,UAAU;AAC7B,UAAI,MAAM,SAAS,cAAc;AAC/B,aAAK,YAAY;AAAA,MAClB,WACQ,MAAM,SAAS,aAAa;AACnC,cAAM,cAAc,MAAM,QAAQ,KAAK;AACvC,aAAK,YAAY,MAAM;AAEvB,cAAM,UAAU,MAAM,OAAO;AAC7B,cAAM,UAAU,MAAM,OAAO;AAE7B,aAAK,gBAAgB,MAAM,aAAa,aAAa,SAAS,OAAO;AAAA,MACtE;AAAA,IACP,CAAK;AAAA,EACF;AAAA;AAAA,EAGD,WAAW,OAAO;AAElB,QAAI,KAAK,mBAAmB,MAAM,QAAQ,QAAQ;AACjD,WAAK,aAAa;AAClB,WAAK,aAAa;AAAA,IAClB;AACD,SAAK,iBAAiB,MAAM,QAAQ;AAElC,QAAI;AACF,UAAI,KAAK,IAAI;AACX,aAAK,GAAG,IAAI,KAAK;AAAA,MACzB,WAAiB,KAAK,YAAY;AAC1B,aAAK,WAAW,KAAK;AAAA,MACtB;AAAA,IACF,SAAQ,GAAG;AACVD,oBAAA,MAAA,MAAA,SAAA,yCAAc,WAAW,CAAC;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAGD,WAAW,OAAO;AAChB,UAAM,WAAW,CAACC,QAAO;AAAA,MACvB,GAAGA,GAAE,KAAMA,GAAE,UAAU,KAAK,cAAc;AAAA,MAC1C,GAAGA,GAAE,KAAMA,GAAE,UAAU,KAAK,cAAc;AAAA,IAChD;AAEI,UAAM,eAAe,SAAS,KAAK;AAEnC,QAAI,KAAK,WAAW;AAClB,YAAM,KAAK,aAAa,IAAI,KAAK,UAAU;AAC3C,YAAM,KAAK,aAAa,IAAI,KAAK,UAAU;AAE3C,WAAK,gBAAgB,MAAM;AAC3B,WAAK,gBAAgB,MAAM;AAAA,IAC5B;AAED,SAAK,YAAY;AAAA,EAClB;AAAA;AAAA,EAGD,aAAa,SAAS;AACpB,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,SAAS,QAAQ,CAAC;AAExB,UAAM,WAAW,CAAC,WAAW;AAAA,MAC3B,GAAG,MAAM,KAAM,MAAM,UAAU,KAAK,cAAc;AAAA,MAClD,GAAG,MAAM,KAAM,EAAE,UAAU,KAAK,cAAc;AAAA,IACpD;AAEI,UAAM,gBAAgB,CAAC,SAAS,MAAM,GAAG,SAAS,MAAM,CAAC;AAEzD,QAAI,KAAK,YAAY;AACnB,YAAM,kBAAkB,KAAK;AAAA,QAC3B,KAAK,IAAI,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,EAAE,GAAG,CAAC,IACnD,KAAK,IAAI,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,EAAE,GAAG,CAAC;AAAA,MAC3D;AAEM,YAAM,eAAe,KAAK;AAAA,QACxB,KAAK,IAAI,KAAK,WAAW,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC,EAAE,GAAG,CAAC,IACvD,KAAK,IAAI,KAAK,WAAW,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC,EAAE,GAAG,CAAC;AAAA,MAC/D;AAEM,UAAI,eAAe,KAAK,kBAAkB,GAAG;AAC3C,cAAM,cAAc,kBAAkB;AAEtC,cAAM,WAAW,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,EAAE,KAAK;AAC5D,cAAM,WAAW,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,EAAE,KAAK;AAE5D,aAAK,gBAAgB,MAAM,aAAa,aAAa,SAAS,OAAO;AAAA,MACtE;AAAA,IACF;AAED,SAAK,aAAa;AAAA,EACnB;AACH;;"} \ No newline at end of file +{"version":3,"file":"gesture-handler.js","sources":["pages/index/gesture-handler.js"],"sourcesContent":["class GestureHandler {\n constructor(context, transformMatrix, { container }) {\n this.transformMatrix = transformMatrix;\n this.containerRect = container;\n this.panThreshold = 5;\n this.panStarted = false;\n\t\t// 保存父组件上下文\n\t\tthis.context = context;\n // 判断是否是小程序环境\n this.isMiniProgram = typeof wx !== 'undefined' || typeof uni !== 'undefined';\n \n // 小程序环境下直接使用降级方案\n if (this.isMiniProgram) {\n console.log('小程序环境,使用降级手势处理器');\n this.catchEvent = this.createSimpleGestureHandler();\n return;\n }\n \n // 非小程序环境尝试使用AnyTouch\n try {\n const atOptions = {\n getPoint: touch => ({\n x: touch.clientX - this.containerRect.left,\n y: touch.clientY - this.containerRect.top\n }),\n preventDefault: false\n };\n \n // 提供兼容小程序的虚拟元素\n atOptions.element = {\n style: {},\n addEventListener: () => {},\n removeEventListener: () => {},\n ownerDocument: {\n documentElement: {\n style: {}\n }\n }\n };\n \n // 动态导入AnyTouch避免小程序环境问题\n import('any-touch').then(AnyTouch => {\n this.at = new AnyTouch.default(atOptions);\n this.setupGestures();\n console.log('AnyTouch手势处理器已初始化');\n }).catch(e => {\n console.error('AnyTouch加载失败:', e);\n this.catchEvent = this.createSimpleGestureHandler();\n });\n } catch (e) {\n console.error('AnyTouch初始化失败:', e);\n this.catchEvent = this.createSimpleGestureHandler();\n }\n }\n \n createSimpleGestureHandler() {\n let isClick = true;\n let startPoint = null;\n let startTime = null;\n let lastPoint = null;\n \n return (event) => {\n // 移除了视图判断\n const touches = event.touches || [];\n \n if (touches.length === 1) {\n const getPoint = (t) => ({\n x: t.x || (t.clientX - this.containerRect.left),\n y: t.y || (t.clientY - this.containerRect.top)\n });\n \n const currentPoint = getPoint(touches[0]);\n \n if (!startPoint) {\n startPoint = currentPoint;\n startTime = Date.now();\n }\n \n const dx = currentPoint.x - startPoint.x;\n const dy = currentPoint.y - startPoint.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n \n // 区分点击和拖拽\n if (isClick && distance < 5 && Date.now() - startTime < 200) {\n return;\n }\n \n isClick = false;\n \n if (lastPoint) {\n const moveDx = currentPoint.x - lastPoint.x;\n const moveDy = currentPoint.y - lastPoint.y;\n \n this.transformMatrix.tx += moveDx;\n this.transformMatrix.ty += moveDy;\n }\n \n lastPoint = currentPoint;\n } else if (touches.length > 1) {\n this._handlePinch(touches);\n }\n \n // 重置状态\n if (event.type === 'touchend' || event.type === 'touchcancel') {\n isClick = true;\n startPoint = null;\n startTime = null;\n lastPoint = null;\n }\n };\n }\n \n \n setupGestures() {\n // 平移手势\n this.at.on('pan', (event) => {\n if (event.type === 'panstart') {\n this.panStarted = false;\n }\n else if (event.type === 'panmove') {\n\t\t\t\tconsole.log('移动')\n const distance = Math.sqrt(event.deltaX**2 + event.deltaY**2);\n \n if (!this.panStarted && distance < this.panThreshold) return;\n \n if (!this.panStarted) {\n this.panStarted = true;\n }\n \n const currentScale = Math.sqrt(\n this.transformMatrix.a * this.transformMatrix.a +\n this.transformMatrix.b * this.transformMatrix.b\n );\n \n const dx = event.deltaX / currentScale;\n const dy = event.deltaY / currentScale;\n \n this.transformMatrix.translate(dx, dy);\n } else if (event.type === 'panend') {\n this.panStarted = false;\n }\n });\n \n // 缩放手势\n this.at.on('pinch', (event) => {\n if (event.type === 'pinchstart') {\n this.lastScale = 1;\n }\n else if (event.type === 'pinchmove') {\n const scaleChange = event.scale / this.lastScale;\n this.lastScale = event.scale;\n \n const centerX = event.center.x;\n const centerY = event.center.y;\n \n this.transformMatrix.scale(scaleChange, scaleChange, centerX, centerY);\n }\n });\n }\n \n // 公共接口\n catchEvent(event) {\n\t\t// 当触摸点数量变化时终止当前手势\n\t\tif (this.lastTouchCount !== event.touches.length) {\n\t\t\tthis.panStarted = false;\n\t\t\tthis.lastPoints = null;\n\t\t}\n\t\tthis.lastTouchCount = event.touches.length;\n\t\t\n try {\n if (this.at) {\n this.at.run(event);\n } else if (this.catchEvent) {\n this.catchEvent(event);\n }\n } catch (e) {\n console.error('手势处理错误:', e);\n }\n }\n \n // 基础平移手势处理\n _handlePan(touch) {\n const getPoint = (t) => ({\n x: t.x || (t.clientX - this.containerRect.left),\n y: t.y || (t.clientY - this.containerRect.top)\n });\n \n const currentPoint = getPoint(touch);\n \n if (this.lastPoint) {\n const dx = currentPoint.x - this.lastPoint.x;\n const dy = currentPoint.y - this.lastPoint.y;\n \n this.transformMatrix.tx += dx;\n this.transformMatrix.ty += dy;\n }\n \n this.lastPoint = currentPoint;\n }\n \n // 基础缩放手势处理\n _handlePinch(touches) {\n const point1 = touches[0];\n const point2 = touches[1];\n \n const getPoint = (touch) => ({\n x: touch.x || (touch.clientX - this.containerRect.left),\n y: touch.y || (t.clientY - this.containerRect.top)\n });\n \n const currentPoints = [getPoint(point1), getPoint(point2)];\n \n if (this.lastPoints) {\n const currentDistance = Math.sqrt(\n Math.pow(currentPoints[1].x - currentPoints[0].x, 2) + \n Math.pow(currentPoints[1].y - currentPoints[0].y, 2)\n );\n \n const prevDistance = Math.sqrt(\n Math.pow(this.lastPoints[1].x - this.lastPoints[0].x, 2) + \n Math.pow(this.lastPoints[1].y - this.lastPoints[0].y, 2)\n );\n \n if (prevDistance > 0 && currentDistance > 0) {\n const scaleChange = currentDistance / prevDistance;\n \n const centerX = (currentPoints[0].x + currentPoints[1].x) / 2;\n const centerY = (currentPoints[0].y + currentPoints[1].y) / 2;\n \n this.transformMatrix.scale(scaleChange, scaleChange, centerX, centerY);\n }\n }\n \n this.lastPoints = currentPoints;\n }\n}\n\nexport default GestureHandler;"],"names":["wx","uni","t"],"mappings":"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"} \ No newline at end of file diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/transform-canvas.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/transform-canvas.js.map index 9a4cc9c..e83cc35 100644 --- a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/transform-canvas.js.map +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/transform-canvas.js.map @@ -1 +1 @@ -{"version":3,"file":"transform-canvas.js","sources":["/Users/sunmeng/Desktop/wx/canvas/pages/index/transform-canvas.vue?type=component"],"sourcesContent":["import Component from '/Users/sunmeng/Desktop/wx/canvas/pages/index/transform-canvas.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,gBAAgB,SAAS;"} \ No newline at end of file +{"version":3,"file":"transform-canvas.js","sources":["/Users/sunmeng/Desktop/wx/canvas/pages/index/transform-canvas.vue?type=component"],"sourcesContent":["import Component from '/Users/sunmeng/Desktop/wx/canvas/pages/index/transform-canvas.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,gBAAgB,SAAS;"} \ No newline at end of file diff --git a/unpackage/dist/dev/mp-weixin/common/vendor.js b/unpackage/dist/dev/mp-weixin/common/vendor.js index 91afa99..ee9ca09 100644 --- a/unpackage/dist/dev/mp-weixin/common/vendor.js +++ b/unpackage/dist/dev/mp-weixin/common/vendor.js @@ -6882,7 +6882,7 @@ function initOnError() { function initRuntimeSocketService() { const hosts = "127.0.0.1,172.10.0.127"; const port = "8090"; - const id = "mp-weixin_3NWJxu"; + const id = "mp-weixin_05amPE"; const lazy = typeof swan !== "undefined"; let restoreError = lazy ? () => { } : initOnError(); diff --git a/unpackage/dist/dev/mp-weixin/pages/index/gesture-canvas-page.js b/unpackage/dist/dev/mp-weixin/pages/index/gesture-canvas-page.js index fffb283..1a60d5b 100644 --- a/unpackage/dist/dev/mp-weixin/pages/index/gesture-canvas-page.js +++ b/unpackage/dist/dev/mp-weixin/pages/index/gesture-canvas-page.js @@ -44,10 +44,8 @@ const _sfc_main = { const dpr = this.$refs.canvasRef.dpr || 1; const x = (e.detail.x - this.containerRect.left) * dpr; const y = (e.detail.y - this.containerRect.top) * dpr; - common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:89", "handleCanvasClick", x, y); if (this.currentView === "area") { const hitArea = this.$refs.canvasRef.checkHitArea(x, y); - common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:92", "handleCanvasClick", hitArea); if (hitArea) { common_vendor.index.showModal({ title: "请确认", @@ -73,19 +71,23 @@ const _sfc_main = { toggleSeatSelection(seat) { if (seat.status !== 1) return; - if (this.selectedCodes.has(seat.code)) { - this.selectedCodes.delete(seat.code); + const newSet = new Set(this.selectedCodes); + if (newSet.has(seat.id)) { + newSet.delete(seat.id); } else { - if (this.selectedCodes.size < 4) { - this.selectedCodes.add(seat.code); + if (newSet.size < 6) { + newSet.add(seat.id); } else { common_vendor.index.showToast({ - title: "最多只能选择4个座位", + title: "最多只能选择6个座位", icon: "none" }); } } - this.$refs.canvasRef.redraw(); + this.selectedCodes = newSet; + this.$nextTick(() => { + this.$refs.canvasRef.redraw(); + }); }, async getContainerPosition() { let retryCount = 0; @@ -108,7 +110,7 @@ const _sfc_main = { return; } } catch (e) { - common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:162", "获取容器位置失败:", e); + common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:171", "获取容器位置失败:", e); } await new Promise((r) => setTimeout(r, 100)); retryCount++; @@ -119,9 +121,8 @@ const _sfc_main = { this.gestureHandler = new pages_index_gestureHandler.GestureHandler(this, this.transformMatrix, { container: this.containerRect }); - common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:176", "initGestureHandler", this.gestureHandler); } catch (e) { - common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:178", "手势处理器初始化失败:", e); + common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:187", "手势处理器初始化失败:", e); this.gestureHandler = { catchEvent: this.createGestureFallback(), setScale: (scale) => { @@ -177,7 +178,6 @@ const _sfc_main = { }, async handleTouchEvent(event) { var _a; - common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:251", event, "handleTouchEvent"); this.touchPoints = event.touches.length; if (event.type === "touchstart") { this.gestureStatus = event.touches.length > 1 ? "双指开始" : "单指开始"; @@ -528,7 +528,7 @@ const _sfc_main = { }; this.seatAreas = response.data; } catch (e) { - common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:618", "加载区域数据失败:", e); + common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:627", "加载区域数据失败:", e); } }, async loadSeatData(areaCode) { @@ -567,7 +567,7 @@ const _sfc_main = { } }); } catch (e) { - common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:676", "加载座位数据失败:", e); + common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:685", "加载座位数据失败:", e); common_vendor.index.showToast({ title: "加载座位失败", icon: "none" }); } } diff --git a/unpackage/dist/dev/mp-weixin/pages/index/gesture-handler.js b/unpackage/dist/dev/mp-weixin/pages/index/gesture-handler.js index 83be726..0b01284 100644 --- a/unpackage/dist/dev/mp-weixin/pages/index/gesture-handler.js +++ b/unpackage/dist/dev/mp-weixin/pages/index/gesture-handler.js @@ -93,6 +93,7 @@ class GestureHandler { if (event.type === "panstart") { this.panStarted = false; } else if (event.type === "panmove") { + common_vendor.index.__f__("log", "at pages/index/gesture-handler.js:121", "移动"); const distance = Math.sqrt(event.deltaX ** 2 + event.deltaY ** 2); if (!this.panStarted && distance < this.panThreshold) return; @@ -135,7 +136,7 @@ class GestureHandler { this.catchEvent(event); } } catch (e) { - common_vendor.index.__f__("error", "at pages/index/gesture-handler.js:176", "手势处理错误:", e); + common_vendor.index.__f__("error", "at pages/index/gesture-handler.js:177", "手势处理错误:", e); } } // 基础平移手势处理 diff --git a/unpackage/dist/dev/mp-weixin/pages/index/transform-canvas.js b/unpackage/dist/dev/mp-weixin/pages/index/transform-canvas.js index 68ab765..6d2d7c3 100644 --- a/unpackage/dist/dev/mp-weixin/pages/index/transform-canvas.js +++ b/unpackage/dist/dev/mp-weixin/pages/index/transform-canvas.js @@ -41,9 +41,11 @@ const _sfc_main = { watch: { selectedCodes: { handler(newVal) { - this.nowSelectedCodes = newVal; + this.nowSelectedCodes = new Set(newVal); }, - immediate: true + immediate: true, + deep: true + // 添加深度监听 }, imgUrl: { handler(newUrl) { @@ -98,7 +100,6 @@ const _sfc_main = { if (!this.areaData) return null; const inverted = this.matrix.invertPoint(x, y, this.dpr); - common_vendor.index.__f__("log", "at pages/index/transform-canvas.vue:107", "checkHitArea", inverted); for (const area of this.areaData) { if (this.pointInPolygon(inverted.x, inverted.y, area.polygon)) { return area; @@ -185,7 +186,7 @@ const _sfc_main = { }); this.redraw(); } catch (e) { - common_vendor.index.__f__("error", "at pages/index/transform-canvas.vue:238", "图片加载失败:", e); + common_vendor.index.__f__("error", "at pages/index/transform-canvas.vue:240", "图片加载失败:", e); this.image = null; } }, @@ -258,11 +259,13 @@ const _sfc_main = { const { a, b, c, d, tx, ty } = this.matrix; this.ctx.setTransform(a, b, c, d, tx, ty); const scale = Math.sqrt(a * a + b * b); + const selectedSet = this.nowSelectedCodes instanceof Set ? this.nowSelectedCodes : new Set(this.nowSelectedCodes || []); this.seatData.forEach((seat) => { const x = seat.x; const y = seat.y; const radius = 8 / scale; - if (this.nowSelectedCodes.has(seat.code) && seat.status === 1) { + const isSelected = selectedSet.has(seat.id) && seat.status === 1; + if (isSelected) { this.ctx.beginPath(); this.ctx.arc(x, y, radius + 1, 0, Math.PI * 2); this.ctx.strokeStyle = "#FFD700";