1 line
41 KiB
Plaintext
1 line
41 KiB
Plaintext
{"version":3,"sources":["pages/mall/consumer/payment.uvue","pages/mall/consumer/address-list.uvue","uni_modules/ak-req/ak-req.uts","pages/user/change-password.uvue","pages/user/terms.uvue","pages/user/login.uvue","pages/user/register.uvue","pages/user/center.uvue"],"sourcesContent":["<!-- 支付页面 -->\r\n<template>\r\n\t<view class=\"payment-page\">\r\n\t\t<scroll-view class=\"payment-content\" direction=\"vertical\">\r\n\t\t\t<!-- 支付成功样式头部 -->\r\n\t\t\t<view class=\"payment-amount-header\">\r\n\t\t\t\t<text class=\"amount-label\">支付金额</text>\r\n\t\t\t\t<view class=\"amount-value-row\">\r\n\t\t\t\t\t<text class=\"amount-currency\">¥</text>\r\n\t\t\t\t\t<text class=\"amount-number\">{{ amount.toFixed(2) }}</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<text class=\"order-no-text\">订单号: {{ orderNo }}</text>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 支付方式 -->\r\n\t\t\t<view class=\"methods-section-new\">\r\n\t\t\t\t<view class=\"section-header\">\r\n\t\t\t\t\t<text class=\"section-title\">选择支付方式</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"method-list\">\r\n\t\t\t\t\t<view v-for=\"method in paymentMethods\" \r\n\t\t\t\t\t\t\t\t:key=\"method.id\" \r\n\t\t\t\t\t\t\t\tclass=\"method-item-modern\"\r\n\t\t\t\t\t\t\t\t@click=\"selectMethod(method)\">\r\n\t\t\t\t\t\t<view class=\"method-left\">\r\n\t\t\t\t\t\t\t<image class=\"method-img\" :src=\"getMethodBrandIcon(method.id)\" mode=\"aspectFit\" />\r\n\t\t\t\t\t\t\t<view class=\"method-info\">\r\n\t\t\t\t\t\t\t\t<text class=\"method-name\">{{ method.name }}</text>\r\n\t\t\t\t\t\t\t\t<text class=\"method-desc\" v-if=\"method.id === 'balance'\">当前余额: ¥{{ userBalance.toFixed(2) }}</text>\r\n\t\t\t\t\t\t\t\t<text class=\"method-desc\" v-else>{{ method.description }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<view class=\"method-right\">\r\n\t\t\t\t\t\t\t<view :class=\"['radio-circle', { checked: selectedMethod === method.id }]\">\r\n\t\t\t\t\t\t\t\t<view class=\"radio-inner\" v-if=\"selectedMethod === method.id\"></view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 弹窗式密码输入层 -->\r\n\t\t\t<view v-if=\"showPassword\" class=\"password-popup-mask\" @click=\"closePasswordPopup\">\r\n\t\t\t\t<view class=\"password-popup-content\" @click.stop=\"\">\r\n\t\t\t\t\t<view class=\"popup-header\">\r\n\t\t\t\t\t\t<text class=\"popup-close\" @click=\"closePasswordPopup\">✕</text>\r\n\t\t\t\t\t\t<text class=\"popup-title\">请输入支付密码</text>\r\n\t\t\t\t\t\t<view class=\"popup-placeholder\"></view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"popup-amount-info\">\r\n\t\t\t\t\t\t<text class=\"popup-amount-label\">支付金额</text>\r\n\t\t\t\t\t\t<view class=\"popup-amount-row\">\r\n\t\t\t\t\t\t\t<text class=\"popup-currency\">¥</text>\r\n\t\t\t\t\t\t\t<text class=\"popup-value\">{{ amount.toFixed(2) }}</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\r\n\t\t\t\t\t<view class=\"password-input-row\">\r\n\t\t\t\t\t\t<view v-for=\"(_, index) in 6\" \r\n\t\t\t\t\t\t\t\t\t:key=\"index\" \r\n\t\t\t\t\t\t\t\t\tclass=\"password-box\">\r\n\t\t\t\t\t\t\t<view v-if=\"password.length > index\" class=\"password-dot\"></view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<text class=\"forgot-password-link\" @click=\"forgotPassword\">忘记密码?</text>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 这里的密码键盘会被放在页面底部,但我们可以通过 CSS 控制它 -->\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 移动键盘到弹窗内部 -->\r\n\t\t\t\t\t<view class=\"password-keyboard-popup\">\r\n\t\t\t\t\t\t<view class=\"keyboard-grid\">\r\n\t\t\t\t\t\t\t<view v-for=\"num in 9\" \r\n\t\t\t\t\t\t\t\t\t\t:key=\"num\" \r\n\t\t\t\t\t\t\t\t\t\tclass=\"keyboard-key\"\r\n\t\t\t\t\t\t\t\t\t\t@click=\"inputPassword(num.toString())\">\r\n\t\t\t\t\t\t\t\t<text class=\"key-text\">{{ num }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"keyboard-key\"></view>\r\n\t\t\t\t\t\t\t<view class=\"keyboard-key\" @click=\"inputPassword('0')\">\r\n\t\t\t\t\t\t\t\t<text class=\"key-text\">0</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"keyboard-key\" @click=\"deletePassword\">\r\n\t\t\t\t\t\t\t\t<text class=\"key-text\">⌫</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</scroll-view>\r\n\r\n\t\t<!-- 底部支付按钮 -->\r\n\t\t<view class=\"payment-bottom\" v-if=\"!showPassword\">\r\n\t\t\t<view class=\"price-summary\">\r\n\t\t\t\t<text class=\"summary-label\">需支付:</text>\r\n\t\t\t\t<text class=\"summary-price\">¥{{ amount.toFixed(2) }}</text>\r\n\t\t\t</view>\r\n\t\t\t<button class=\"pay-btn\" \r\n\t\t\t\t\t\t\t:class=\"{ disabled: isPaying || (selectedMethod === 'balance' && userBalance < amount) }\"\r\n\t\t\t\t\t\t\t@click=\"confirmPayment\">\r\n\t\t\t\t<text v-if=\"!isPaying\" class=\"pay-text\">{{ getPayButtonText() }}</text>\r\n\t\t\t\t<text v-else class=\"pay-text\">支付中...</text>\r\n\t\t\t</button>\r\n\t\t</view>\r\n\r\n\t</view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, onMounted, watch, computed, onUnmounted } from 'vue'\r\nimport { supabaseService } from '@/utils/supabaseService.uts'\r\n\r\ntype PaymentMethodType = {\r\n\tid: string\r\n\tname: string\r\n\tdescription: string\r\n\ticon: string\r\n\tenabled: boolean\r\n}\r\n\r\nconst orderId = ref<string>('')\r\nconst orderNo = ref<string>('')\r\nconst amount = ref<number>(0)\r\nconst paymentMethods = ref<Array<PaymentMethodType>>([])\r\nconst selectedMethod = ref<string>('wechat')\r\nconst userBalance = ref<number>(0)\r\nconst isPaying = ref<boolean>(false)\r\nconst showPassword = ref<boolean>(false)\r\nconst password = ref<string>('')\r\n\r\n// 价格相关变量\r\nconst productAmount = ref<number>(0) // 商品总价\r\nconst deliveryFee = ref<number>(0) // 运费\r\nconst discountAmount = ref<number>(0) // 优惠减免\r\n\r\n// 加载支付方式(必须在 onMounted 之前定义)\r\nconst loadPaymentMethods = () => {\r\n\tconst methods: PaymentMethodType[] = [\r\n\t\t{\r\n\t\t\tid: 'wechat',\r\n\t\t\tname: '微信支付',\r\n\t\t\tdescription: '推荐安装微信5.0及以上版本使用',\r\n\t\t\ticon: '💳',\r\n\t\t\tenabled: true\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: 'alipay',\r\n\t\t\tname: '支付宝',\r\n\t\t\tdescription: '推荐安装支付宝10.0及以上版本使用',\r\n\t\t\ticon: '💳',\r\n\t\t\tenabled: true\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: 'balance',\r\n\t\t\tname: '余额支付',\r\n\t\t\tdescription: '使用账户余额支付',\r\n\t\t\ticon: '💰',\r\n\t\t\tenabled: true\r\n\t\t},\r\n\t\t{\r\n\t\t\tid: 'bankcard',\r\n\t\t\tname: '银行卡支付',\r\n\t\t\tdescription: '支持储蓄卡、信用卡',\r\n\t\t\ticon: '💳',\r\n\t\t\tenabled: true\r\n\t\t}\r\n\t]\r\n\tpaymentMethods.value = methods\r\n}\r\n\r\n// 加载用户余额(必须在 onMounted 之前定义)\r\nconst loadUserBalance = async () => {\r\n\ttry {\r\n const balance = await supabaseService.getUserBalanceNumber()\r\n userBalance.value = balance\r\n\t} catch (err) {\r\n\t\tconsole.error('加载用户余额异常:', err)\r\n userBalance.value = 0\r\n\t}\r\n}\r\n\r\n// 计算价格明细(必须在 onMounted 之前定义)\r\nconst calculatePriceDetails = (totalAmount: number) => {\r\n\t// 模拟计算各项费用\r\n\t// 假设商品总价占总金额的80%,运费占10%,优惠减免占10%\r\n\tproductAmount.value = totalAmount * 0.8\r\n\tdeliveryFee.value = totalAmount * 0.1\r\n\tdiscountAmount.value = totalAmount * 0.1\r\n\t\r\n\t// 确保总和等于应付金额\r\n\tconst calculatedTotal = productAmount.value + deliveryFee.value - discountAmount.value\r\n\tif (Math.abs(calculatedTotal - totalAmount) > 0.01) {\r\n\t\t// 调整商品总价以匹配应付金额\r\n\t\tproductAmount.value = totalAmount + discountAmount.value - deliveryFee.value\r\n\t}\r\n}\r\n\r\n// 更新本地存储中的订单状态(必须在 onMounted 之前定义)\r\nconst updateOrderInStorage = (targetOrderId: string, status: number) => {\r\n\ttry {\r\n // 尝试从 'orders' 读取 (checkout页面写入的key)\r\n\t\tconst ordersStr = uni.getStorageSync('orders')\r\n\t\tlet orders: Record<string, any>[] = []\r\n\t\tif (ordersStr != null && ordersStr !== '') {\r\n\t\t\tconst parsed = JSON.parse(ordersStr as string)\r\n\t\t\tif (Array.isArray(parsed)) {\r\n\t\t\t\tfor (let i = 0; i < parsed.length; i++) {\r\n // 使用 JSON 序列化转换\r\n const itemStr = JSON.stringify(parsed[i])\r\n const itemParsed = JSON.parse(itemStr)\r\n if (itemParsed != null) {\r\n orders.push(itemParsed as Record<string, any>)\r\n }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tlet foundIndex = -1\r\n\t\tfor (let i = 0; i < orders.length; i++) {\r\n\t\t\tconst o = orders[i]\r\n\t\t\tif (o['id'] === targetOrderId) {\r\n\t\t\t\tfoundIndex = i\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (foundIndex !== -1) {\r\n\t\t\torders[foundIndex]['status'] = status\r\n\t\t\torders[foundIndex]['payment_status'] = status === 2 ? 1 : 0 // 2=待发货(已支付), 1=待支付(未支付)\r\n\t\t\torders[foundIndex]['updated_at'] = new Date().toISOString()\r\n // 确保更新的是 'orders' key\r\n\t\t\tuni.setStorageSync('orders', JSON.stringify(orders))\r\n console.log('订单状态已更新到Storage (orders):', targetOrderId, status)\r\n\t\t} else {\r\n // 本地缓存中没有订单数据是正常的,数据在数据库中\r\n console.log('本地缓存中无订单数据,已忽略:', targetOrderId)\r\n }\r\n\t} catch (e) {\r\n\t\tconsole.error('更新订单状态失败', e)\r\n\t}\r\n}\r\n\r\n// 取消支付,更新订单状态(必须在 goBack 之前定义)\r\nconst cancelPayment = async () => {\r\n\ttry {\r\n\t\t// 这里应该调用API更新订单状态为待支付(status: 1)\r\n\t\t// 模拟更新订单状态\r\n \r\n // 更新本地存储\r\n updateOrderInStorage(orderId.value, 1) // 1: 待支付\r\n\t\t\r\n\t\t// 发布订单更新事件,让profile页面可以刷新数据\r\n\t\tuni.$emit('orderUpdated', { orderId: orderId.value, status: 1 })\r\n\t\t\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '已保存到待支付订单',\r\n\t\t\ticon: 'success'\r\n\t\t})\r\n\t\t\r\n\t\t// 延迟返回,让用户看到提示\r\n\t\tsetTimeout(() => {\r\n\t\t\tuni.navigateBack()\r\n\t\t}, 1500)\r\n\t\t\r\n\t} catch (err) {\r\n\t\tconsole.error('取消支付异常:', err)\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '操作失败',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t}\r\n}\r\n\r\n// 返回(必须在 onBackPress 之前定义)\r\nconst goBack = () => {\r\n\tuni.showModal({\r\n\t\ttitle: '取消支付',\r\n\t\tcontent: '确定要取消支付吗?取消后订单将保存到待支付订单中',\r\n\t\tconfirmText: '取消支付',\r\n\t\tcancelText: '继续支付',\r\n\t\tsuccess: (res) => {\r\n\t\t\tif (res.confirm) {\r\n\t\t\t\t// 用户确认取消支付,更新订单状态为待支付\r\n\t\t\t\tcancelPayment()\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n}\r\n\r\n// 加载订单信息(必须在 onMounted 之前定义)\r\nconst loadOrderInfo = async () => {\r\n\ttry {\r\n if (orderId.value == '') return\r\n\r\n const order = await supabaseService.getOrderDetail(orderId.value)\r\n if (order != null) {\r\n // 使用 JSON 序列化转换对象\r\n const orderStr = JSON.stringify(order)\r\n const orderParsed = JSON.parse(orderStr)\r\n if (orderParsed == null) {\r\n console.error('订单数据解析失败')\r\n return\r\n }\r\n const orderObj = orderParsed as UTSJSONObject\r\n \r\n const orderNoVal = orderObj.getString('order_no')\r\n if (orderNoVal != null) {\r\n orderNo.value = orderNoVal\r\n }\r\n \r\n const totalAmount = orderObj.getNumber('total_amount')\r\n const dbAmount = totalAmount ?? 0\r\n if (dbAmount > 0) {\r\n amount.value = dbAmount\r\n }\r\n const items = orderObj.get('items')\r\n if (items != null && Array.isArray(items) && items.length > 0) {\r\n // Could update product name etc if displayed\r\n }\r\n } else {\r\n // Fallback or error\r\n console.warn('Order not found in DB', orderId.value)\r\n if (orderNo.value == '') orderNo.value = 'ORD_PENDING_' + Date.now()\r\n }\r\n\t} catch (err) {\r\n\t\tconsole.error('加载订单信息异常:', err)\r\n\t}\r\n}\r\n\r\n// 生命周期\r\nonLoad((options) => {\r\n if (options != null) {\r\n const orderIdValue = options['orderId']\r\n if (orderIdValue != null) {\r\n orderId.value = orderIdValue as string\r\n loadOrderInfo()\r\n }\r\n \r\n const amountValue = options['amount']\r\n if (amountValue != null) {\r\n amount.value = parseFloat(amountValue.toString())\r\n }\r\n \r\n // 获取传递的价格详情\r\n const productAmountValue = options['productAmount']\r\n if (productAmountValue != null) {\r\n productAmount.value = parseFloat(productAmountValue.toString())\r\n }\r\n const deliveryFeeValue = options['deliveryFee']\r\n if (deliveryFeeValue != null) {\r\n deliveryFee.value = parseFloat(deliveryFeeValue.toString())\r\n }\r\n const discountAmountValue = options['discountAmount']\r\n if (discountAmountValue != null) {\r\n discountAmount.value = parseFloat(discountAmountValue.toString())\r\n }\r\n \r\n // 如果没有传详情,尝试根据总价估算(兼容旧逻辑,但优先使用传参)\r\n if (productAmountValue == null && amount.value > 0) {\r\n calculatePriceDetails(amount.value)\r\n }\r\n \r\n loadPaymentMethods()\r\n loadUserBalance()\r\n }\r\n})\r\n\r\nonMounted(() => {\r\n // onMounted 中的逻辑已移到 onLoad 中\r\n})\r\n\r\n// 监听返回操作(包含系统返回键和导航栏返回按钮)\r\nonBackPress((options) => {\r\n\t// 如果是通过代码主动调用 navigateBack 返回,则允许\r\n\tif (options.from === 'navigateBack') {\r\n\t\treturn false\r\n\t}\r\n\t\r\n\t// 否则拦截返回,显示确认弹窗\r\n\tgoBack()\r\n\treturn true\r\n})\r\n\r\n// 获取当前用户ID\r\nconst getCurrentUserId = (): string => {\r\n\tconst userStore = uni.getStorageSync('userInfo')\r\n\tif (userStore != null) {\r\n // 使用 JSON 序列化转换\r\n const userStr = JSON.stringify(userStore)\r\n const userParsed = JSON.parse(userStr)\r\n if (userParsed != null) {\r\n const userObj = userParsed as UTSJSONObject\r\n const id = userObj.getString('id')\r\n if (id != null) {\r\n return id\r\n }\r\n }\r\n\t}\r\n\treturn ''\r\n}\r\n\r\n// 获取支付方式图标\r\nconst getMethodIcon = (methodId: string): string => {\r\n\tif (methodId === 'wechat') {\r\n\t\treturn '💳'\r\n\t} else if (methodId === 'alipay') {\r\n\t\treturn '💳'\r\n\t} else if (methodId === 'balance') {\r\n\t\treturn '💰'\r\n\t} else if (methodId === 'bankcard') {\r\n\t\treturn '💳'\r\n\t}\r\n\treturn '💳'\r\n}\r\n\r\n// 获取支付品牌图片\r\nconst getMethodBrandIcon = (methodId: string): string => {\r\n\tif (methodId === 'wechat') {\r\n\t\treturn '/static/logo.png' // 替换为真实的微信支付图标路径\r\n\t} else if (methodId === 'alipay') {\r\n\t\treturn '/static/logo.png' // 替换为真实的支付宝图标路径\r\n\t} else if (methodId === 'balance') {\r\n\t\treturn '/static/logo.png' // 替换为真实的余额支付图标路径\r\n\t} else if (methodId === 'bankcard') {\r\n\t\treturn '/static/logo.png' // 替换为真实的银行卡支付图标路径\r\n\t}\r\n\treturn '/static/logo.png'\r\n}\r\n\r\n// 选择支付方式\r\nconst selectMethod = (method: PaymentMethodType) => {\r\n\tif (!method.enabled) {\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '该支付方式暂不可用',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t\treturn\r\n\t}\r\n\t\r\n\tselectedMethod.value = method.id\r\n\t// 切换方式时,除非点击支付,否则不自动弹出密码\r\n\tshowPassword.value = false\r\n\tpassword.value = '' // 清空密码\r\n}\r\n\r\n// 关闭密码弹窗\r\nconst closePasswordPopup = () => {\r\n\tshowPassword.value = false\r\n\tpassword.value = ''\r\n}\r\n\r\n// 获取支付按钮文本\r\nconst getPayButtonText = (): string => {\r\n\tif (selectedMethod.value === 'balance' && userBalance.value < amount.value) {\r\n\t\treturn '余额不足'\r\n\t}\r\n\t\r\n\tif (selectedMethod.value === 'wechat') {\r\n\t\treturn '微信支付'\r\n\t} else if (selectedMethod.value === 'alipay') {\r\n\t\treturn '支付宝支付'\r\n\t} else if (selectedMethod.value === 'balance') {\r\n\t\treturn '余额支付'\r\n\t} else if (selectedMethod.value === 'bankcard') {\r\n\t\treturn '银行卡支付'\r\n\t}\r\n\treturn '确认支付'\r\n}\r\n\r\n// 减少商品库存\r\n// const reduceStock = (orderId: string) => {\r\n // Update should happen on server side during payment processing\r\n// }\r\n\r\n// 确认支付\r\nconst confirmPayment = async () => {\r\n\tif (isPaying.value) return\r\n\t\r\n\t// 余额支付或银行卡支付检查密码\r\n\tif (selectedMethod.value === 'balance' || selectedMethod.value === 'bankcard') {\r\n\t\tif (selectedMethod.value === 'balance' && userBalance.value < amount.value) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '余额不足',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\t\t\r\n\t\tif (!showPassword.value) {\r\n\t\t\tshowPassword.value = true\r\n\t\t\tpassword.value = ''\r\n\t\t\treturn\r\n\t\t}\r\n\t\t\r\n\t\tif (password.value.length !== 6) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请输入6位支付密码',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\t}\r\n\t\r\n\tisPaying.value = true\r\n\tuni.showLoading({ title: '支付中...' })\r\n\t\r\n\ttry {\r\n console.log('[confirmPayment] 开始支付, orderId:', orderId.value, 'method:', selectedMethod.value)\r\n \r\n const success = await supabaseService.payOrder(orderId.value, selectedMethod.value, amount.value)\r\n console.log('[confirmPayment] 支付结果:', success)\r\n\r\n if (!success) {\r\n console.error('[confirmPayment] payOrder 返回 false')\r\n uni.hideLoading()\r\n uni.showToast({\r\n title: '支付处理失败',\r\n icon: 'none'\r\n })\r\n isPaying.value = false\r\n return\r\n }\r\n\t\t\r\n\t\tuni.hideLoading()\r\n\t\t\r\n\t\tupdateOrderInStorage(orderId.value, 2)\r\n\t\t\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '支付成功',\r\n\t\t\ticon: 'success',\r\n\t\t\tduration: 2000\r\n\t\t})\r\n\t\t\r\n\t\tuni.$emit('orderUpdated', { orderId: orderId.value, status: 2 })\r\n\t\t\r\n\t\tsetTimeout(() => {\r\n\t\t\tuni.redirectTo({\r\n\t\t\t\turl: `/pages/mall/consumer/payment-success?orderId=${orderId.value}`\r\n\t\t\t})\r\n\t\t}, 1500)\r\n\t\t\r\n\t} catch (err) {\r\n\t\tconsole.error('[confirmPayment] 支付异常:', err)\r\n\t\tuni.hideLoading()\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '支付失败',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t\tisPaying.value = false\r\n\t}\r\n}\r\n\r\n// 获取支付方式代码\r\nconst getPaymentMethodCode = (methodId: string): number => {\r\n\tif (methodId === 'wechat') {\r\n\t\treturn 1\r\n\t} else if (methodId === 'alipay') {\r\n\t\treturn 2\r\n\t} else if (methodId === 'balance') {\r\n\t\treturn 3\r\n\t} else if (methodId === 'bankcard') {\r\n\t\treturn 4\r\n\t}\r\n\treturn 0\r\n}\r\n\r\n// 验证密码(必须在 watch 之前定义)\r\nconst verifyPassword = async () => {\r\n\t// 这里应该验证支付密码,这里简单模拟\r\n\tconst userId = getCurrentUserId()\r\n\t\r\n\ttry {\r\n\t\t// 模拟验证\r\n\t\tawait new Promise<void>((resolve: (value: void) => void) => {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tresolve()\r\n\t\t\t}, 500)\r\n\t\t})\r\n\t\t\r\n\t\t// 假设密码正确\r\n\t\tconst isCorrect = true\r\n\t\t\r\n\t\tif (isCorrect) {\r\n\t\t\t// 密码正确,继续支付\r\n\t\t\tconfirmPayment()\r\n\t\t} else {\r\n\t\t\tpassword.value = ''\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '密码错误',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t}\r\n\t\t\r\n\t} catch (err) {\r\n\t\tconsole.error('验证密码异常:', err)\r\n\t}\r\n}\r\n\r\n// 输入密码\r\nconst inputPassword = (num: string) => {\r\n\tif (password.value.length >= 6) return\r\n\tpassword.value += num\r\n}\r\n\r\n// 删除密码\r\nconst deletePassword = () => {\r\n\tif (password.value.length > 0) {\r\n\t\tpassword.value = password.value.slice(0, -1)\r\n\t}\r\n}\r\n\r\n// 监听密码输入\r\nwatch(password, (newPassword: string) => {\r\n\tif (newPassword.length === 6) {\r\n\t\t// 自动验证密码\r\n\t\tverifyPassword()\r\n\t}\r\n})\r\n\r\n// 忘记密码\r\nconst forgotPassword = () => {\r\n\tuni.navigateTo({\r\n\t\turl: '/pages/user/forgot-password'\r\n\t})\r\n}\r\n\r\n// 在组件卸载时移除返回键监听\r\nonUnmounted(() => {\r\n\t// uni.offBackPress() 在uni-app中不需要手动移除\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.payment-page {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tposition: fixed;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tbackground-color: #f5f5f5;\r\n\toverflow: hidden;\r\n}\r\n\r\n.payment-header {\r\n\tbackground-color: #ffffff;\r\n\tpadding: 15px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tborder-bottom: 1px solid #e5e5e5;\r\n}\r\n\r\n.back-btn {\r\n\tfont-size: 24px;\r\n\tcolor: #333333;\r\n\tpadding: 5px;\r\n\tmargin-right: 15px;\r\n}\r\n\r\n.header-title {\r\n\tfont-size: 18px;\r\n\tfont-weight: bold;\r\n\tcolor: #333333;\r\n}\r\n\r\n.payment-content {\r\n\tflex: 1;\r\n\t/* overflow-y: auto; */\r\n\tbackground-color: #f8f8f8;\r\n}\r\n\r\n.payment-amount-header {\r\n\tbackground-color: #ffffff;\r\n\tpadding: 40px 15px;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.amount-label {\r\n\tfont-size: 14px;\r\n\tcolor: #666;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.amount-value-row {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: baseline;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.amount-currency {\r\n font-size: 20px;\r\n font-weight: bold;\r\n color: #333;\r\n margin-right: 4px;\r\n}\r\n\r\n.amount-number {\r\n font-size: 40px;\r\n font-weight: bold;\r\n color: #333;\r\n}\r\n\r\n.order-no-text {\r\n font-size: 13px;\r\n color: #999;\r\n}\r\n\r\n.methods-section-new {\r\n background-color: #ffffff;\r\n margin: 0 12px;\r\n border-radius: 12px;\r\n padding: 15px;\r\n}\r\n\r\n.section-header {\r\n margin-bottom: 15px;\r\n}\r\n\r\n.section-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n\tcolor: #333333;\r\n}\r\n\r\n.method-list {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.method-item-modern {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px 0;\r\n border-bottom: 0.5px solid #f5f5f5;\r\n}\r\n\r\n.method-item-modern:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.method-left {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.method-img {\r\n width: 28px;\r\n height: 28px;\r\n margin-right: 12px;\r\n}\r\n\r\n.method-info {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.method-name {\r\n\tfont-size: 15px;\r\n\tcolor: #333;\r\n}\r\n\r\n.method-desc {\r\n\tfont-size: 11px;\r\n\tcolor: #999;\r\n\tmargin-top: 2px;\r\n}\r\n\r\n.radio-circle {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 10px;\r\n border: 1px solid #ddd;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.radio-circle.checked {\r\n border-color: #ff5000;\r\n background-color: #ff5000;\r\n}\r\n\r\n.radio-inner {\r\n width: 10px;\r\n height: 10px;\r\n border-radius: 5px;\r\n background-color: #ffffff;\r\n}\r\n\r\n.balance-section {\r\n\tbackground-color: #ffffff;\r\n\tpadding: 15px;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.balance-info {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.balance-label {\r\n\tfont-size: 14px;\r\n\tcolor: #333333;\r\n}\r\n\r\n.balance-value {\r\n\tfont-size: 18px;\r\n\tcolor: #ff4757;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.balance-tip {\r\n\tpadding: 10px;\r\n\tbackground-color: #fff0f0;\r\n\tborder-radius: 5px;\r\n}\r\n\r\n.tip-text {\r\n\tfont-size: 12px;\r\n\tcolor: #ff4757;\r\n}\r\n\r\n/* 密码输入弹窗 */\r\n.password-popup-mask {\r\n\tposition: fixed;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\tbackground-color: rgba(0, 0, 0, 0.6);\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tjustify-content: flex-end;\r\n\tz-index: 1000;\r\n}\r\n\r\n.password-popup-content {\r\n\tbackground-color: #ffffff;\r\n\tborder-radius: 16px 16px 0 0;\r\n\tpadding: 20px 0; /* 减少左右内边距,让键盘撑满 */\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tanimation: slideUp 0.3s ease-out;\r\n\twidth: 100%;\r\n}\r\n\r\n@keyframes slideUp {\r\n\tfrom { transform: translateY(100%); }\r\n\tto { transform: translateY(0); }\r\n}\r\n\r\n.popup-header {\r\n\twidth: 100%;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 30px;\r\n\tpadding: 0 20px;\r\n}\r\n\r\n.popup-close {\r\n\tfont-size: 20px;\r\n\tcolor: #999;\r\n\tpadding: 4px;\r\n}\r\n\r\n.popup-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n}\r\n\r\n.popup-placeholder {\r\n\twidth: 28px;\r\n}\r\n\r\n.popup-amount-info {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tmargin-bottom: 30px;\r\n}\r\n\r\n.popup-amount-label {\r\n\tfont-size: 14px;\r\n\tcolor: #666;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.popup-amount-row {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: baseline;\r\n}\r\n\r\n.popup-currency {\r\n\tfont-size: 18px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n\tmargin-right: 2px;\r\n}\r\n\r\n.popup-value {\r\n\tfont-size: 32px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n}\r\n\r\n.password-input-row {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tjustify-content: center;\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.password-box {\r\n\twidth: 45px;\r\n\theight: 45px;\r\n\tborder: 1px solid #ddd;\r\n\tborder-right: none;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tbackground-color: #f9f9f9;\r\n}\r\n\r\n.password-box:first-child {\r\n\tborder-radius: 4px 0 0 4px;\r\n}\r\n\r\n.password-box:last-child {\r\n\tborder-right: 1px solid #ddd;\r\n\tborder-radius: 0 4px 4px 0;\r\n}\r\n\r\n.password-dot {\r\n\twidth: 10px;\r\n\theight: 10px;\r\n\tborder-radius: 5px;\r\n\tbackground-color: #000;\r\n}\r\n\r\n.forgot-password-link {\r\n\tfont-size: 13px;\r\n\tcolor: #576b95;\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.password-section {\r\n /* 移除旧的样式或保持隐藏 */\r\n display: none;\r\n}\r\n\r\n/* 弹窗专用键盘样式 */\r\n.password-keyboard-popup {\r\n\twidth: 100%;\r\n\tbackground-color: #f5f5f5;\r\n\tpadding: 6px;\r\n\tpadding-bottom: env(safe-area-inset-bottom);\r\n}\r\n\r\n/* 键盘样式优化 */\r\n.password-keyboard {\r\n\tdisplay: none; /* 隐藏独立键盘 */\r\n}\r\n\r\n.keyboard-grid {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\tbackground-color: #f5f5f5;\r\n}\r\n\r\n.keyboard-key {\r\n\twidth: 33.33%;\r\n\tbackground-color: #ffffff;\r\n\theight: 54px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder: 3px solid #f5f5f5;\r\n\tbox-sizing: border-box;\r\n\tborder-radius: 8px;\r\n}\r\n\r\n.keyboard-key:active {\r\n\tbackground-color: #e0e0e0;\r\n}\r\n\r\n.key-text {\r\n\tfont-size: 22px;\r\n\tfont-weight: 500;\r\n\tcolor: #333333;\r\n}\r\n\r\n.payment-bottom {\r\n\tbackground-color: #ffffff;\r\n\tborder-top: 1px solid #f0f0f0;\r\n\tpadding: 12px 16px;\r\n padding-bottom: constant(safe-area-inset-bottom);\r\n padding-bottom: env(safe-area-inset-bottom);\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n}\r\n\r\n.price-summary {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: baseline;\r\n}\r\n\r\n.summary-label {\r\n\tfont-size: 14px;\r\n\tcolor: #333333;\r\n\tmargin-right: 4px;\r\n}\r\n\r\n.summary-price {\r\n\tfont-size: 24px;\r\n\tcolor: #ff5000;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.pay-btn {\r\n\tbackground-color: #ff5000;\r\n\tcolor: #ffffff;\r\n\tpadding: 0 40px;\r\n\theight: 44px;\r\n\tline-height: 44px;\r\n\tborder-radius: 22px;\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n\tborder: none;\r\n margin: 0;\r\n}\r\n\r\n.pay-btn.disabled {\r\n\tbackground-color: #cccccc;\r\n\topacity: 0.6;\r\n}\r\n\r\n.password-keyboard {\r\n\tbackground-color: #ffffff;\r\n\tborder-top: 1px solid #e5e5e5;\r\n\tpadding: 10px;\r\n}\r\n\r\n.keyboard-grid {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\t/* grid-template-columns: repeat(3, 1fr); uvue unsupported */\r\n\t/* grid-gap: 1px; uvue unsupported */\r\n\tbackground-color: #e5e5e5;\r\n}\r\n\r\n.keyboard-key {\r\n\twidth: 33.33%;\r\n\tbackground-color: #ffffff;\r\n\theight: 60px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder: 1px solid #f5f5f5; /* mimic grid gap */\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n.key-text {\r\n\tfont-size: 24px;\r\n\tcolor: #333333;\r\n}\r\n</style>\r\n\r\n",null,null,null,null,null,null,null],"names":[],"mappings":"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"} |