diff --git a/power_leasing/src/utils/amount.js b/power_leasing/src/utils/amount.js index fb5c5fd..2b965dc 100644 --- a/power_leasing/src/utils/amount.js +++ b/power_leasing/src/utils/amount.js @@ -5,10 +5,8 @@ // - 其他币种: 最多6位小数 // 返回 { text, truncated, full } -export function getMaxDecimalsByCoin(coin) { - const c = (coin || '').toString().toUpperCase(); - if (c === 'ETH') return 8; - // USDT 与其他币种都按 6 位 +export function getMaxDecimalsByCoin() { + // 全站统一:最多 6 位小数 return 6; } @@ -36,3 +34,8 @@ export function truncateAmountByCoin(value, coin) { return truncateAmountRaw(value, max); } +// 默认 6 位截断(非币种语境也可复用) +export function truncateTo6(value) { + return truncateAmountRaw(value, 6); +} + diff --git a/power_leasing/src/views/cart/index.vue b/power_leasing/src/views/cart/index.vue index 044bf4b..34e3809 100644 --- a/power_leasing/src/views/cart/index.vue +++ b/power_leasing/src/views/cart/index.vue @@ -43,17 +43,94 @@ - - - + + + + + - + - + + + + - \n \n \n \n\n \n \n \n 矿机\n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n\n \n \n\n \n \n\n\n \n \n\n \n \n\n \n \n\n \n \n \n 上架\n 下架\n \n \n\n \n \n
\n 创建商品\n 重置\n 取消\n
\n
\n \n \n \n\n\n\n\n ","\n\n\n\n\n","/**\r\n * 全局输入表情符号拦截守卫(极简,无侵入)\r\n * 作用:拦截所有原生 input/textarea 的输入事件,移除 Emoji,并重新派发 input 事件以同步 v-model\r\n * 注意:\r\n * - 跳过正在输入法合成阶段(compositionstart ~ compositionend),避免影响中文输入\r\n * - 默认对所有可编辑 input/textarea 生效;如需个别放行,可在元素上加 data-allow-emoji=\"true\"\r\n */\r\nexport const initNoEmojiGuard = () => {\r\n if (typeof window === 'undefined') return\r\n if (window.__noEmojiGuardInitialized) return\r\n window.__noEmojiGuardInitialized = true\r\n\r\n // 覆盖常见 Emoji、旗帜、杂项符号、ZWJ、变体选择符、组合键帽\r\n const emojiPattern = /[\\u{1F300}-\\u{1FAFF}]|[\\u{1F1E6}-\\u{1F1FF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]|[\\u{FE0F}]|[\\u{200D}]|[\\u{20E3}]/gu\r\n\r\n /**\r\n * 判断是否是需要拦截的可编辑元素\r\n * @param {EventTarget} el 事件目标\r\n * @returns {boolean}\r\n */\r\n const isEditableTarget = (el) => {\r\n if (!el || !(el instanceof Element)) return false\r\n if (el.getAttribute && el.getAttribute('data-allow-emoji') === 'true') return false\r\n const tag = el.tagName\r\n if (tag === 'INPUT') {\r\n const type = (el.getAttribute('type') || 'text').toLowerCase()\r\n // 排除不会产生文本的类型\r\n const disallow = ['checkbox', 'radio', 'file', 'hidden', 'button', 'submit', 'reset', 'range', 'color', 'date', 'datetime-local', 'month', 'time', 'week']\r\n return disallow.indexOf(type) === -1\r\n }\r\n if (tag === 'TEXTAREA') return true\r\n return false\r\n }\r\n\r\n // 记录输入法合成状态\r\n const setComposing = (el, composing) => {\r\n try { el.__noEmojiComposing = composing } catch (e) {}\r\n }\r\n const isComposing = (el) => !!(el && el.__noEmojiComposing)\r\n\r\n // 结束合成时做一次清洗\r\n document.addEventListener('compositionstart', (e) => {\r\n if (!isEditableTarget(e.target)) return\r\n setComposing(e.target, true)\r\n }, true)\r\n document.addEventListener('compositionend', (e) => {\r\n if (!isEditableTarget(e.target)) return\r\n setComposing(e.target, false)\r\n sanitizeAndRedispatch(e.target)\r\n }, true)\r\n\r\n // 主输入拦截:捕获阶段尽早处理\r\n document.addEventListener('input', (e) => {\r\n const target = e.target\r\n if (!isEditableTarget(target)) return\r\n if (isComposing(target)) return\r\n sanitizeAndRedispatch(target)\r\n }, true)\r\n\r\n /**\r\n * 清洗目标元素的值并在变更时重新派发 input 事件\r\n * @param {HTMLInputElement|HTMLTextAreaElement} target\r\n */\r\n function sanitizeAndRedispatch(target) {\r\n const before = String(target.value ?? '')\r\n if (!before) return\r\n if (!emojiPattern.test(before)) return\r\n const selectionStart = target.selectionStart\r\n const selectionEnd = target.selectionEnd\r\n const after = before.replace(emojiPattern, '')\r\n if (after === before) return\r\n target.value = after\r\n try {\r\n // 重置光标,尽量贴近原位置\r\n if (typeof selectionStart === 'number' && typeof selectionEnd === 'number') {\r\n const removed = before.length - after.length\r\n const nextPos = Math.max(0, selectionStart - removed)\r\n target.setSelectionRange(nextPos, nextPos)\r\n }\r\n } catch (e) {}\r\n // 重新派发 input 事件以同步 v-model\r\n const evt = new Event('input', { bubbles: true })\r\n target.dispatchEvent(evt)\r\n }\r\n}\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=3ba79d9c&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=js\"\nexport * from \"./index.vue?vue&type=script&lang=js\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=3ba79d9c&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3ba79d9c\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cart-page\"},[_c('h1',{staticClass:\"page-title\"},[_vm._v(\"购物车\")]),(_vm.loading)?_c('div',{staticClass:\"loading\"},[_c('i',{staticClass:\"el-icon-loading\",attrs:{\"aria-label\":\"加载中\",\"role\":\"img\"}}),_vm._v(\" 加载中... \")]):(_vm.isCartEmpty)?_c('div',{staticClass:\"empty-cart\"},[_c('div',{staticClass:\"empty-icon\"},[_vm._v(\"🛒\")]),_c('h2',[_vm._v(\"购物车是空的\")]),_c('p',[_vm._v(\"快去添加一些商品吧!\")]),_c('router-link',{staticClass:\"shop-now-btn\",attrs:{\"to\":\"/productList\"}},[_vm._v(\" 去购物 \")])],1):_c('div',{staticClass:\"cart-content\"},[_c('p',{staticStyle:{\"color\":\"#9E44F1\",\"font-size\":\"14px\",\"margin-bottom\":\"10px\"}},[_vm._v(\"注意:各店铺支持多种支付方式,请选择店铺支付方式后提交订单结算\")]),_c('el-table',{ref:\"shopTable\",staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.shops,\"border\":\"\",\"row-key\":'id',\"expand-row-keys\":_vm.expandedShopKeys,\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }},on:{\"expand-change\":_vm.handleGuardExpand}},[_c('el-table-column',{attrs:{\"type\":\"expand\",\"width\":\"46\",\"expandable\":() => false},scopedSlots:_vm._u([{key:\"default\",fn:function(shopScope){return [_c('el-table',{ref:'innerTable-' + shopScope.row.id,staticStyle:{\"width\":\"100%\"},attrs:{\"data\":shopScope.row.productMachineDtoList || [],\"size\":\"small\",\"border\":\"\",\"row-key\":'id',\"reserve-selection\":\"\",\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }},on:{\"selection-change\":sels => _vm.handleShopInnerSelectionChange(shopScope.row, sels)}},[_c('el-table-column',{attrs:{\"type\":\"selection\",\"width\":\"46\",\"selectable\":row => _vm.isRowSelectableByShop(shopScope.row, row)}}),_c('el-table-column',{attrs:{\"prop\":\"name\",\"label\":\"商品名称\"}}),_c('el-table-column',{attrs:{\"prop\":\"miner\",\"label\":\"机器编号\"}}),_c('el-table-column',{attrs:{\"prop\":\"algorithm\",\"label\":\"算法\"}}),_c('el-table-column',{attrs:{\"prop\":\"powerDissipation\",\"label\":\"功耗(kw/h)\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.powerDissipation).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.powerDissipation).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.powerDissipation).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.powerDissipation).text))])],1)]}}],null,true)}),_c('el-table-column',{attrs:{\"prop\":\"theoryPower\",\"label\":\"理论算力\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.theoryPower).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.theoryPower).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.theoryPower).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.theoryPower).text))])],1),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(scope.row.theoryPower),expression:\"scope.row.theoryPower\"}]},[_vm._v(\" \"+_vm._s(scope.row.unit)+\" \")])]}}],null,true)}),_c('el-table-column',{attrs:{\"prop\":\"computingPower\",\"label\":\"实际算力\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.computingPower).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.computingPower).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.computingPower).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.computingPower).text))])],1),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(scope.row.computingPower),expression:\"scope.row.computingPower\"}]},[_vm._v(\" \"+_vm._s(scope.row.unit)+\" \")])]}}],null,true)}),_c('el-table-column',{attrs:{\"prop\":\"theoryIncome\",\"label\":\"单机理论收入(每日/币种)\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.theoryIncome).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.theoryIncome).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.theoryIncome).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.theoryIncome).text))])],1),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(scope.row.coin),expression:\"scope.row.coin\"}]},[_vm._v(\" \"+_vm._s(_vm.toUpperText(scope.row.coin))+\" \")])]}}],null,true)}),_c('el-table-column',{attrs:{\"prop\":\"theoryUsdtIncome\",\"label\":\"单机理论收入(每日/USDT)\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.theoryUsdtIncome).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.theoryUsdtIncome).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.theoryUsdtIncome).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.theoryUsdtIncome).text))])],1)]}}],null,true)}),_c('el-table-column',{attrs:{\"prop\":\"price\",\"width\":\"120\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_vm._v(\"单价(\"+_vm._s(_vm.getSelectedCoinSymbolForShop(shopScope.row) || 'USDT')+\")\")]},proxy:true},{key:\"default\",fn:function(scope){return [(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row) != null)?[_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row), _vm.getSelectedCoinSymbolForShop(shopScope.row)).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row), _vm.getSelectedCoinSymbolForShop(shopScope.row)).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row), _vm.getSelectedCoinSymbolForShop(shopScope.row)).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row), _vm.getSelectedCoinSymbolForShop(shopScope.row)).text)+\" \")])],1)]:[_vm._v(\"-\")]]}}],null,true)}),_c('el-table-column',{attrs:{\"label\":\"租赁天数\",\"width\":\"145\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input-number',{attrs:{\"min\":1,\"max\":_vm.getRowMaxLeaseDaysLocal(scope.row),\"precision\":0,\"step\":1,\"size\":\"mini\",\"controls-position\":\"right\"},on:{\"change\":function($event){return _vm.handleLeaseTimeChange(scope.row)},\"input\":function($event){return _vm.handleLeaseTimeInput(scope.row, $event)}},model:{value:(scope.row.leaseTime),callback:function ($$v) {_vm.$set(scope.row, \"leaseTime\", $$v)},expression:\"scope.row.leaseTime\"}})]}}],null,true)}),_c('el-table-column',{attrs:{\"label\":\"最大可租(天)\",\"min-width\":\"60\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(scope.row.maxLeaseDays != null ? scope.row.maxLeaseDays : ''))]}}],null,true)}),_c('el-table-column',{attrs:{\"label\":\"机器状态\",\"width\":\"110\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":(Number(scope.row.del) === 1 || Number(scope.row.state) === 1) ? 'info' : 'success'}},[_vm._v(\" \"+_vm._s((Number(scope.row.del) === 1 || Number(scope.row.state) === 1) ? '下架' : '上架')+\" \")])]}}],null,true)}),_c('el-table-column',{attrs:{\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_vm._v(\"机器总价(\"+_vm._s(_vm.getSelectedCoinSymbolForShop(shopScope.row) || 'USDT')+\")\")]},proxy:true},{key:\"default\",fn:function(scope){return [(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row) != null)?[_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row) * Number(scope.row.leaseTime || 1), _vm.getSelectedCoinSymbolForShop(shopScope.row)).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row) * Number(scope.row.leaseTime || 1), _vm.getSelectedCoinSymbolForShop(shopScope.row)).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row) * Number(scope.row.leaseTime || 1), _vm.getSelectedCoinSymbolForShop(shopScope.row)).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.getMachineUnitPriceBySelection(shopScope.row, scope.row) * Number(scope.row.leaseTime || 1), _vm.getSelectedCoinSymbolForShop(shopScope.row)).text)+\" \")])],1)]:[_vm._v(\"-\")]]}}],null,true)})],1)]}}])}),_c('el-table-column',{attrs:{\"prop\":\"name\",\"label\":\"店铺名称\"}}),_c('el-table-column',{attrs:{\"prop\":\"totalMachine\",\"label\":\"机器总数\"}}),_c('el-table-column',{attrs:{\"prop\":\"totalPrice\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_vm._v(\" 总价(\"+_vm._s(_vm.getSelectedCoinSymbolForShopHeader())+\") \")]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(_vm.displayShopTotalBySelection(scope.row), _vm.getSelectedCoinSymbolForShop(scope.row)).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(_vm.displayShopTotalBySelection(scope.row), _vm.getSelectedCoinSymbolForShop(scope.row)).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.displayShopTotalBySelection(scope.row), _vm.getSelectedCoinSymbolForShop(scope.row)).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.displayShopTotalBySelection(scope.row), _vm.getSelectedCoinSymbolForShop(scope.row)).text)+\" \")])],1)]}}])}),_c('el-table-column',{attrs:{\"label\":\"支付方式\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-select',{staticStyle:{\"min-width\":\"180px\"},attrs:{\"placeholder\":\"请选择\",\"size\":\"mini\"},on:{\"change\":val => _vm.handleShopPayChange(scope.row, val)},scopedSlots:_vm._u([{key:\"prefix\",fn:function(){return [(_vm.getSelectedPayIcon(scope.row))?_c('img',{staticStyle:{\"width\":\"16px\",\"height\":\"16px\",\"margin-right\":\"6px\",\"border-radius\":\"3px\"},attrs:{\"src\":_vm.getSelectedPayIcon(scope.row),\"alt\":_vm.getSelectedCoinSymbolForShop(scope.row)}}):_vm._e()]},proxy:true}],null,true),model:{value:(_vm.paySelectionMap[scope.row.id]),callback:function ($$v) {_vm.$set(_vm.paySelectionMap, scope.row.id, $$v)},expression:\"paySelectionMap[scope.row.id]\"}},_vm._l((_vm.getShopPayOptions(scope.row)),function(opt,idx){return _c('el-option',{key:idx,attrs:{\"value\":opt.value,\"label\":opt.label}},[_c('div',{staticStyle:{\"display\":\"flex\",\"align-items\":\"center\",\"gap\":\"8px\"}},[_c('img',{staticStyle:{\"width\":\"18px\",\"height\":\"18px\",\"border-radius\":\"3px\"},attrs:{\"src\":opt.icon,\"alt\":opt.label}}),_c('span',[_vm._v(_vm._s(opt.label))])])])}),1)]}}])})],1),_c('div',{staticClass:\"summary-actions\",staticStyle:{\"margin-top\":\"16px\",\"display\":\"flex\",\"gap\":\"12px\",\"justify-content\":\"flex-end\"}},[_c('div',{staticClass:\"summary-inline\",staticStyle:{\"color\":\"#666\"}},[_vm._v(\" 已选机器:\"),_c('b',[_vm._v(_vm._s(_vm.selectedMachineCount))]),_vm._v(\" 台 \"),_c('span',{staticStyle:{\"margin-left\":\"12px\"}},[_vm._v(\"金额合计(USDT):\")]),_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(_vm.selectedTotal, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(_vm.selectedTotal, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.selectedTotal, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(_vm.selectedTotal, 'USDT').text))])],1)]),_c('div',{staticClass:\"actions-inline\",staticStyle:{\"display\":\"flex\",\"gap\":\"12px\"}},[_c('el-button',{attrs:{\"type\":\"danger\",\"disabled\":!_vm.selectedMachineCount},on:{\"click\":_vm.handleRemoveSelectedMachines}},[_vm._v(\"删除所选机器\")]),_c('el-button',{attrs:{\"type\":\"warning\",\"plain\":\"\",\"loading\":_vm.clearOffLoading},on:{\"click\":_vm.handleClearOffShelf}},[_vm._v(\"清除已下架商品\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"disabled\":!_vm.selectedMachineCount},on:{\"click\":_vm.handleCheckoutSelected}},[_vm._v(\"结算选中机器\")])],1)]),_c('el-dialog',{attrs:{\"visible\":_vm.confirmDialog.visible,\"width\":\"80vw\",\"close-on-click-modal\":false,\"title\":`确认结算(共 ${_vm.confirmDialog.count} 台机器)`},on:{\"update:visible\":function($event){return _vm.$set(_vm.confirmDialog, \"visible\", $event)}},scopedSlots:_vm._u([{key:\"footer\",fn:function(){return [_c('el-button',{on:{\"click\":function($event){_vm.confirmDialog.visible=false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.confirmPay}},[_vm._v(\"确认结算\")])]},proxy:true}])},[_c('div',[_vm._l((_vm.confirmDialog.shops),function(grp){return _c('div',{key:grp.shopId,staticStyle:{\"margin-bottom\":\"18px\"}},[_c('div',{staticStyle:{\"display\":\"flex\",\"align-items\":\"center\",\"justify-content\":\"space-between\",\"margin\":\"8px 0 6px 0\"}},[_c('div',{staticStyle:{\"font-weight\":\"600\",\"color\":\"#2c3e50\"}},[_vm._v(\" 店铺:\"+_vm._s(grp.shopName || grp.shopId)+\" \"),_c('span',{staticStyle:{\"margin-left\":\"12px\",\"color\":\"#666\",\"font-weight\":\"400\"}},[_vm._v(\"支付方式:\"+_vm._s(grp.payLabel))])]),_c('div',[(grp.coinSymbol)?[(grp.enough)?_c('span',{staticStyle:{\"color\":\"#16a34a\",\"font-weight\":\"600\"}},[_vm._v(\" 已满足起付额 \"+_vm._s(_vm.formatAmount(grp.deductibleAmount || 0, grp.coinSymbol).text)+\" \")]):_c('span',{staticStyle:{\"color\":\"#ef4444\",\"font-weight\":\"600\"}},[_vm._v(\" 金额不足最低起付额 \"+_vm._s(_vm.formatAmount(grp.deductibleAmount || 0, grp.coinSymbol).text)+\" ,收取手续费 \"+_vm._s(_vm.formatAmount(grp.fee || 0, grp.coinSymbol).text)+\" \")])]:_vm._e()],2)]),_c('el-table',{attrs:{\"data\":grp.items,\"max-height\":\"260\",\"border\":\"\",\"stripe\":\"\",\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }}},[_c('el-table-column',{attrs:{\"prop\":\"product\",\"label\":\"商品\",\"min-width\":\"160\"}}),_c('el-table-column',{attrs:{\"prop\":\"coin\",\"label\":\"币种\",\"min-width\":\"100\"}}),_c('el-table-column',{attrs:{\"prop\":\"user\",\"label\":\"账户\",\"min-width\":\"120\"}}),_c('el-table-column',{attrs:{\"prop\":\"miner\",\"label\":\"机器编号\",\"min-width\":\"160\"}}),_c('el-table-column',{attrs:{\"prop\":\"unitPrice\",\"min-width\":\"140\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_vm._v(\"单价(\"+_vm._s(grp.coinSymbol || 'USDT')+\")\")]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(scope.row.unitPrice, grp.coinSymbol).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row.unitPrice, grp.coinSymbol).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row.unitPrice, grp.coinSymbol).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row.unitPrice, grp.coinSymbol).text))])],1)]}}],null,true)}),_c('el-table-column',{attrs:{\"prop\":\"leaseTime\",\"label\":\"租赁天数\",\"min-width\":\"120\"}}),_c('el-table-column',{attrs:{\"prop\":\"subtotal\",\"min-width\":\"140\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_vm._v(\"小计(\"+_vm._s(grp.coinSymbol || 'USDT')+\")\")]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(scope.row.subtotal, grp.coinSymbol).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row.subtotal, grp.coinSymbol).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row.subtotal, grp.coinSymbol).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row.subtotal, grp.coinSymbol).text))])],1)]}}],null,true)})],1)],1)}),_c('div',{staticStyle:{\"margin-top\":\"12px\",\"text-align\":\"right\"}},[_c('span',{staticStyle:{\"margin-right\":\"8px\"}},[_vm._v(\"总金额:\")]),(Object.keys(_vm.confirmDialog.totalsByCoin || {}).length)?_vm._l((_vm.confirmDialog.totalsByCoin),function(amt,coin){return _c('span',{key:coin,staticStyle:{\"margin-left\":\"12px\"}},[_vm._v(\" \"+_vm._s(coin)+\": \"),_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(amt, coin).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(amt, coin).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(amt, coin).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(amt, coin).text))])],1)])}):[_vm._v(\"-\")]],2)],2)]),_c('el-dialog',{attrs:{\"visible\":_vm.noticeDialog.visible,\"width\":\"680px\",\"title\":\"下单须知\",\"show-close\":false,\"close-on-click-modal\":false,\"close-on-press-escape\":false},on:{\"update:visible\":function($event){return _vm.$set(_vm.noticeDialog, \"visible\", $event)}},scopedSlots:_vm._u([{key:\"footer\",fn:function(){return [_c('el-button',{attrs:{\"type\":\"primary\",\"disabled\":_vm.noticeDialog.countdown > 0},on:{\"click\":_vm.handleNoticeAcknowledge}},[_vm._v(\" 同意并下单\"+_vm._s(_vm.noticeDialog.countdown > 0 ? `(${_vm.noticeDialog.countdown}s)` : '')+\" \")])]},proxy:true}])},[_c('div',{staticClass:\"notice-content\"},[_c('p',{staticClass:\"notice-title\"},[_vm._v(\"尊敬的客户,感谢您选择我们的服务。在您下单前,请务必仔细阅读并完全理解以下须知条款。一旦您点击\\\" 同意并下单\\\"或完成支付流程,即视为您已充分阅读、理解并同意接受本须知的全部内容约束。\")]),_c('ol',{staticClass:\"notice-list\"},[_c('li',[_c('b',[_vm._v(\"预授权冻结:\")]),_vm._v(\"为保障订单顺利执行,在下单成功后,系统将立即对您数字钱包或账户中与订单全款总额等值的资金进行预授权冻结。此操作并非即时划转,而是为确保您有足够的资金用于每日支付。\")]),_c('li',[_c('b',[_vm._v(\"每日结算支付:\")]),_vm._v(\"本服务采用\\\"按日结算\\\"模式。冻结的资金将根据租赁协议约定的每日费用,每日自动划转相应的金额给卖家。划转操作通常在每个UTC日结束时自动执行。\")]),_c('li',[_c('b',[_vm._v(\"资金解冻:\")]),_vm._v(\"当租赁服务到期或因其他原因终止后,系统中剩余的、未被划转的冻结资金将立即解除冻结,并返还至您的可用余额中。\")]),_c('li',[_c('b',[_vm._v(\"订单生效:\")]),_vm._v(\" 您的订单在支付流程完成且资金成功冻结后立即生效。系统将开始为您配置相应的矿机或算力资源。\")]),_c('li',[_c('b',[_vm._v(\"不可取消政策:\")]),_vm._v(\" 鉴于算力服务一经提供即无法退回的特性,所有订单一旦生效,即不可取消、不可退款、不可转让。您无法在租赁期内单方面中止服务或要求退还已冻结及已支付的费用。\")]),_c('li',[_c('b',[_vm._v(\"免责声明:\")]),_vm._v(\"因不可抗力(如自然灾害、政策变动等)导致订单延迟或无法履行,我们不承担相应责任。\")]),_c('li',[_c('b',[_vm._v(\"算力波动:\")]),_vm._v(\"您所租赁的算力产生的收益取决于区块链网络难度、全球总算力、币价波动、矿池运气等多种外部因素。我们仅提供稳定的算力输出,不对您的最终收益做出任何承诺或保证。\")])]),_c('p',{staticClass:\"notice-title\"},[_vm._v(\"再次提醒:数字资产挖矿存在较高市场风险,收益波动巨大,过去业绩不代表未来表现。请根据自身的风险承受能力谨慎决策。您下单的行为即代表您已充分了解并自愿承担所有相关风险。\")]),_c('div',{staticClass:\"notice-ack\"},[_c('el-checkbox',{staticStyle:{\"color\":\"#e74c3c\"},model:{value:(_vm.noticeDialog.checked),callback:function ($$v) {_vm.$set(_vm.noticeDialog, \"checked\", $$v)},expression:\"noticeDialog.checked\"}},[_vm._v(\"我已阅读并同意上述注意事项\")])],1)])]),_c('el-dialog',{attrs:{\"visible\":_vm.googleCodeDialog.visible,\"width\":\"480px\",\"title\":\"安全验证\",\"show-close\":false,\"close-on-click-modal\":false,\"close-on-press-escape\":false},on:{\"update:visible\":function($event){return _vm.$set(_vm.googleCodeDialog, \"visible\", $event)}},scopedSlots:_vm._u([{key:\"footer\",fn:function(){return [_c('div',{staticClass:\"dialog-footer\"},[_c('el-button',{on:{\"click\":_vm.handleGoogleCodeCancel}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"loading\":_vm.googleCodeDialog.loading,\"disabled\":!_vm.isGoogleCodeValid},on:{\"click\":_vm.handleGoogleCodeSubmit}},[_vm._v(\" \"+_vm._s(_vm.googleCodeDialog.loading ? '验证中...' : '确认验证')+\" \")])],1)]},proxy:true}])},[_c('div',{staticClass:\"google-code-content\"},[_c('div',{staticClass:\"verification-icon\"},[_c('i',{staticClass:\"el-icon-lock\",staticStyle:{\"font-size\":\"48px\",\"color\":\"#409EFF\"}})]),_c('div',{staticClass:\"verification-title\"},[_c('h3',[_vm._v(\"请输入谷歌验证码\")]),_c('p',{staticClass:\"verification-desc\"},[_vm._v(\"为了保障您的账户安全,请输入您的谷歌验证器中的6位验证码\")])]),_c('div',{staticClass:\"code-input-wrapper\"},[_c('el-input',{ref:\"googleCodeInput\",staticClass:\"code-input\",attrs:{\"placeholder\":\"请输入6位验证码\",\"maxlength\":\"6\",\"size\":\"large\"},on:{\"input\":_vm.handleGoogleCodeInput},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.handleGoogleCodeSubmit.apply(null, arguments)}},scopedSlots:_vm._u([{key:\"prepend\",fn:function(){return [_c('i',{staticClass:\"el-icon-key\"})]},proxy:true}]),model:{value:(_vm.googleCodeDialog.code),callback:function ($$v) {_vm.$set(_vm.googleCodeDialog, \"code\", $$v)},expression:\"googleCodeDialog.code\"}})],1),(_vm.googleCodeDialog.error)?_c('div',{staticClass:\"code-error\"},[_c('i',{staticClass:\"el-icon-warning\"}),_c('span',[_vm._v(_vm._s(_vm.googleCodeDialog.error))])]):_vm._e()])])],1),_c('el-dialog',{attrs:{\"visible\":_vm.settlementSuccessfulVisible,\"width\":\"480px\",\"append-to-body\":\"\",\"close-on-click-modal\":false,\"close-on-press-escape\":false},on:{\"update:visible\":function($event){_vm.settlementSuccessfulVisible=$event},\"close\":_vm.handleCloseSuccessDialog},scopedSlots:_vm._u([{key:\"footer\",fn:function(){return [_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleCloseSuccessDialog}},[_vm._v(\"已知晓\")])]},proxy:true}])},[_c('div',{staticStyle:{\"text-align\":\"center\",\"padding\":\"20px 0\"}},[_c('div',{staticStyle:{\"font-size\":\"48px\",\"color\":\"#52c41a\",\"margin-bottom\":\"16px\"}},[_vm._v(\"✓\")]),_c('div',{staticStyle:{\"font-size\":\"18px\",\"color\":\"#333\",\"margin-bottom\":\"12px\"}},[_vm._v(\"请求结算处理成功\")]),_c('div',{staticStyle:{\"color\":\"#666\",\"line-height\":\"1.6\"}},[_vm._v(\" 请在订单列表页面查看结算状态\"),_c('br'),_vm._v(\" 结算成功会自动更新钱包余额 \")])])])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=7050467e&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=js\"\nexport * from \"./index.vue?vue&type=script&lang=js\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=7050467e&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7050467e\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"account-products\"},[_c('div',{staticClass:\"toolbar\"},[_vm._m(0),_c('div',{staticClass:\"right-area\"},[_c('el-input',{staticClass:\"mr-12\",staticStyle:{\"width\":\"280px\"},attrs:{\"placeholder\":\"输入币种或算法关键字后回车/搜索\",\"size\":\"small\",\"clearable\":\"\"},on:{\"clear\":_vm.handleClear},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.handleSearch.apply(null, arguments)}},model:{value:(_vm.searchKeyword),callback:function ($$v) {_vm.searchKeyword=$$v},expression:\"searchKeyword\"}}),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.handleSearch}},[_vm._v(\"搜索\")]),_c('el-button',{staticClass:\"ml-8\",attrs:{\"size\":\"small\"},on:{\"click\":_vm.handleReset}},[_vm._v(\"重置\")])],1)]),_c('el-table',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.tableData,\"border\":\"\",\"stripe\":\"\"}},[_c('el-table-column',{attrs:{\"prop\":\"name\",\"label\":\"名称\"}}),_c('el-table-column',{attrs:{\"prop\":\"coin\",\"label\":\"币种\"}}),_c('el-table-column',{attrs:{\"label\":\"支持结算方式\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('div',{staticClass:\"paytypes\"},_vm._l(((scope.row.payTypes || [])),function(pt,idx){return _c('el-tooltip',{key:idx,attrs:{\"content\":_vm.formatPayType(pt),\"placement\":\"top\",\"open-delay\":80}},[_c('img',{staticClass:\"paytype-icon\",attrs:{\"src\":pt.image,\"alt\":_vm.formatPayType(pt)}})])}),1)]}}])}),_c('el-table-column',{attrs:{\"prop\":\"algorithm\",\"label\":\"算法\"}}),_c('el-table-column',{attrs:{\"prop\":\"type\",\"label\":\"商品类型\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.type === 1 ? 'success' : 'warning'}},[_vm._v(\" \"+_vm._s(scope.row.type === 1 ? '算力套餐' : '挖矿机器')+\" \")])]}}])}),_c('el-table-column',{attrs:{\"prop\":\"saleNumber\",\"label\":\"已售数量\"}}),_c('el-table-column',{attrs:{\"prop\":\"totalMachineNumber\",\"label\":\"该商品总机器数量\"}}),_c('el-table-column',{attrs:{\"prop\":\"state\",\"label\":\"状态\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.state === 1 ? 'info' : 'success'}},[_vm._v(\" \"+_vm._s(scope.row.state === 1 ? '下架' : '上架')+\" \")])]}}])}),_c('el-table-column',{attrs:{\"label\":\"操作\",\"fixed\":\"right\",\"width\":\"220\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.handleView(scope.row)}}},[_vm._v(\"详情\")]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.handleEdit(scope.row)}}},[_vm._v(\"修改\")]),_c('el-button',{staticStyle:{\"color\":\"#f56c6c\"},attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.handleDelete(scope.row)}}},[_vm._v(\"删除\")]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.handleAddMachine(scope.row)}}},[_vm._v(\"添加出售机器\")])]}}])})],1),_c('div',{staticClass:\"pagination\"},[_c('el-pagination',{attrs:{\"background\":\"\",\"layout\":\"total, sizes, prev, pager, next, jumper\",\"total\":_vm.total,\"current-page\":_vm.pagination.pageNum,\"page-sizes\":[10, 20, 50, 100],\"page-size\":_vm.pagination.pageSize},on:{\"update:currentPage\":function($event){return _vm.$set(_vm.pagination, \"pageNum\", $event)},\"update:current-page\":function($event){return _vm.$set(_vm.pagination, \"pageNum\", $event)},\"update:pageSize\":function($event){return _vm.$set(_vm.pagination, \"pageSize\", $event)},\"update:page-size\":function($event){return _vm.$set(_vm.pagination, \"pageSize\", $event)},\"size-change\":_vm.handleSizeChange,\"current-change\":_vm.handleCurrentChange}})],1),_c('el-dialog',{attrs:{\"visible\":_vm.editDialog.visible,\"close-on-click-modal\":false,\"width\":\"620px\",\"title\":'编辑商品 - ' + ((_vm.editDialog.form && _vm.editDialog.form.name) ? _vm.editDialog.form.name : '')},on:{\"update:visible\":function($event){return _vm.$set(_vm.editDialog, \"visible\", $event)}},scopedSlots:_vm._u([{key:\"footer\",fn:function(){return [_c('el-button',{on:{\"click\":function($event){_vm.editDialog.visible = false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"loading\":_vm.editDialog.saving},on:{\"click\":_vm.handleSaveEdit}},[_vm._v(\"保存\")])]},proxy:true}])},[(_vm.editDialog.form)?_c('el-form',{ref:\"editForm\",staticClass:\"edit-form\",attrs:{\"model\":_vm.editDialog.form,\"label-width\":\"100px\"}},[_c('el-form-item',{attrs:{\"label\":\"名称\"}},[_c('el-input',{attrs:{\"maxlength\":\"30\",\"show-word-limit\":\"\"},model:{value:(_vm.editDialog.form.name),callback:function ($$v) {_vm.$set(_vm.editDialog.form, \"name\", $$v)},expression:\"editDialog.form.name\"}})],1),_c('el-form-item',{staticClass:\"align-like-input\",attrs:{\"label\":\"状态\"}},[_c('el-radio-group',{model:{value:(_vm.editDialog.form.state),callback:function ($$v) {_vm.$set(_vm.editDialog.form, \"state\", $$v)},expression:\"editDialog.form.state\"}},[_c('el-radio',{attrs:{\"label\":0}},[_vm._v(\"上架\")]),_c('el-radio',{attrs:{\"label\":1}},[_vm._v(\"下架\")])],1)],1),_c('el-form-item',{attrs:{\"label\":\"描述\"}},[_c('el-input',{attrs:{\"type\":\"textarea\",\"rows\":4,\"maxlength\":\"100\",\"show-word-limit\":\"\"},model:{value:(_vm.editDialog.form.description),callback:function ($$v) {_vm.$set(_vm.editDialog.form, \"description\", $$v)},expression:\"editDialog.form.description\"}})],1)],1):_vm._e()],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"left-area\"},[_c('h2',{staticClass:\"page-title\"},[_vm._v(\"商品列表\")])])\n}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./idnex.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./idnex.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./idnex.vue?vue&type=template&id=0f1fd789\"\nimport script from \"./idnex.vue?vue&type=script&lang=js\"\nexport * from \"./idnex.vue?vue&type=script&lang=js\"\nimport style0 from \"./idnex.vue?vue&type=style&index=0&id=0f1fd789&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import request from '../utils/request'\r\n\r\n//新增机器\r\nexport function addSingleOrBatchMachine(data) {\r\n return request({\r\n url: `/lease/product/machine/addSingleOrBatchMachine`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//根据矿机id 删除商品矿机\r\nexport function deleteMachine(data) {\r\n return request({\r\n url: `/lease/product/machine/delete`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n\r\n //根据挖矿账户获取矿机列表\r\nexport function getUserMachineList(data) {\r\n return request({\r\n url: `/lease/product/machine/getUserMachineList`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n\r\n \r\n //根据 登录账户 获取挖矿账户及挖矿币种集合\r\nexport function getUserMinersList(data) {\r\n return request({\r\n url: `/lease/product/machine/getUserMinersList`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n\r\n //编辑矿机 + 矿机上下架\r\nexport function updateMachine(data) {\r\n return request({\r\n url: `/lease/product/machine/updateMachine`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n\r\n \r\n //获取矿机列表\r\nexport function getMachineListForUpdate(data) {\r\n return request({\r\n url: `/lease/product/machine/getMachineListForUpdate`,\r\n method: 'post',\r\n data\r\n })\r\n }","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./content.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./content.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./content.vue?vue&type=template&id=9935370e&scoped=true\"\nimport script from \"./content.vue?vue&type=script&lang=js\"\nexport * from \"./content.vue?vue&type=script&lang=js\"\nimport style0 from \"./content.vue?vue&type=style&index=0&id=9935370e&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9935370e\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./withdrawalHistory.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./withdrawalHistory.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./withdrawalHistory.vue?vue&type=template&id=37492658&scoped=true\"\nimport script from \"./withdrawalHistory.vue?vue&type=script&lang=js\"\nexport * from \"./withdrawalHistory.vue?vue&type=script&lang=js\"\nimport style0 from \"./withdrawalHistory.vue?vue&type=style&index=0&id=37492658&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"37492658\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport ElementUI from 'element-ui';\r\nimport 'element-ui/lib/theme-chalk/index.css';\r\n// 引入登录信息处理\r\nimport './utils/loginInfo.js';\r\n// 全局输入防表情守卫(极简、无侵入)\r\nimport { initNoEmojiGuard } from './utils/noEmojiGuard.js';\r\n\r\n// console.log = ()=>{} //全局关闭打印\r\n\r\n\r\nVue.config.productionTip = false\r\nVue.use(ElementUI);\r\n// 初始化全局防表情拦截器\r\ninitNoEmojiGuard();\r\nnew Vue({\r\n router,\r\n store,\r\n render: h => h(App)\r\n}).$mount('#app')\r\n","\n\n\n\n","\n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shopNew.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shopNew.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./shopNew.vue?vue&type=template&id=7f00bb86&scoped=true\"\nimport script from \"./shopNew.vue?vue&type=script&lang=js\"\nexport * from \"./shopNew.vue?vue&type=script&lang=js\"\nimport style0 from \"./shopNew.vue?vue&type=style&index=0&id=7f00bb86&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7f00bb86\",\n null\n \n)\n\nexport default component.exports","\r\n\r\n\r\n\r\n\r\n","\n\n\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"account-page\"},[_c('div',{staticClass:\"account-layout\"},[_c('aside',{staticClass:\"sidebar\"},[_c('nav',{staticClass:\"side-nav\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.userEmail),expression:\"userEmail\"}],staticClass:\"user-info-card\",attrs:{\"role\":\"region\",\"aria-label\":\"用户信息\",\"tabindex\":\"0\"}},[_c('div',{staticClass:\"user-meta\"},[_c('div',{staticClass:\"user-email\",attrs:{\"title\":_vm.userEmail || '未登录'}},[_vm._v(_vm._s(_vm.userEmail || '未登录'))])])]),_c('div',{staticClass:\"user-role\",attrs:{\"role\":\"group\",\"aria-label\":\"导航分组切换\"}},[_c('button',{staticClass:\"role-button\",class:{ active: _vm.activeRole === 'buyer' },attrs:{\"aria-pressed\":_vm.activeRole === 'buyer',\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.handleClickRole('buyer')},\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();return _vm.handleClickRole('buyer')},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"]))return null;$event.preventDefault();return _vm.handleClickRole('buyer')}]}},[_vm._v(\"买家相关\")]),_c('button',{staticClass:\"role-button\",class:{ active: _vm.activeRole === 'seller' },attrs:{\"aria-pressed\":_vm.activeRole === 'seller',\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.handleClickRole('seller')},\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();return _vm.handleClickRole('seller')},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"]))return null;$event.preventDefault();return _vm.handleClickRole('seller')}]}},[_vm._v(\"卖家相关\")])]),_vm._l((_vm.displayedLinks),function(item){return _c('router-link',{key:item.to,class:['side-link', _vm.isActiveLink(item.to) ? 'active' : ''],attrs:{\"to\":item.to}},[_vm._v(_vm._s(item.label))])})],2)]),_c('section',{staticClass:\"content\"},[_c('router-view')],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n\r\n\r\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('el-container',{staticClass:\"containerApp\",staticStyle:{\"width\":\"100vw\",\"height\":\"100vh\"}},[_c('el-header',{staticClass:\"el-header\"},[_c('comHeard')],1),_c('el-main',{staticClass:\"el-main\"},[_c('appMain')],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"funds-page\"},[_c('h3',{staticClass:\"title\",staticStyle:{\"margin-bottom\":\"18px\",\"text-align\":\"left\"}},[_vm._v(\"资金流水\")]),_c('div',{staticClass:\"tabs-card\"},[_c('el-tabs',{on:{\"tab-click\":_vm.handleTab},model:{value:(_vm.active),callback:function ($$v) {_vm.active=$$v},expression:\"active\"}},[_c('el-tab-pane',{attrs:{\"label\":\"充值记录\",\"name\":\"recharge\"}},[_c('div',{staticClass:\"list-wrap\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"全部充值 (\"+_vm._s(_vm.rechargeRows.length)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.loadRecharge}},[_vm._v(\"刷新\")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading.recharge),expression:\"loading.recharge\"}],staticClass:\"record-list\"},[_vm._l((_vm.rechargeRows),function(row,idx){return _c('div',{key:_vm.getRowKey(row, idx),staticClass:\"record-item\",class:_vm.statusClass(row.status),on:{\"click\":function($event){return _vm.toggleExpand('recharge', row, idx)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[(_vm.formatAmount(row.amount, row.fromSymbol).truncated)?_c('el-tooltip',{attrs:{\"content\":`${_vm.formatAmount(row.amount, row.fromSymbol).full} ${(row.fromSymbol || 'USDT').toUpperCase()}`,\"placement\":\"top\"}},[_c('span',[_vm._v(\" + \"+_vm._s(_vm.formatAmount(row.amount, row.fromSymbol).text)+\" \"+_vm._s((row.fromSymbol || 'USDT').toUpperCase())+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(\" + \"+_vm._s(_vm.formatAmount(row.amount, row.fromSymbol).text)+\" \"+_vm._s((row.fromSymbol || 'USDT').toUpperCase())+\" \")])],1),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.formatChain(row.fromChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status\"},[_c('el-tag',{attrs:{\"type\":_vm.getRechargeStatusType(row.status),\"size\":\"small\"}},[_vm._v(_vm._s(_vm.getRechargeStatusText(row.status)))])],1),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatFullTime(row.createTime)))])])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isExpanded('recharge', row, idx)),expression:\"isExpanded('recharge', row, idx)\"}],staticClass:\"expand-panel\"},[_c('div',{staticClass:\"expand-grid\"},[_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"充值地址\")]),_c('div',{staticClass:\"value value-row\"},[_c('span',{staticClass:\"mono-ellipsis\",attrs:{\"title\":row.fromAddress}},[_vm._v(_vm._s(row.fromAddress))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"mini\",\"icon\":\"el-icon-document-copy\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.handleCopy(row.fromAddress, '充值地址')}}},[_vm._v(\"复制\")])],1)]),(row.txHash)?_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"交易哈希\")]),_c('div',{staticClass:\"value value-row\"},[_c('span',{staticClass:\"mono-ellipsis\",attrs:{\"title\":row.txHash}},[_vm._v(_vm._s(row.txHash))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"mini\",\"icon\":\"el-icon-document-copy\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.handleCopy(row.txHash, '交易哈希')}}},[_vm._v(\"复制\")])],1)]):_vm._e()])])])}),(!_vm.rechargeRows.length)?_c('div',{staticClass:\"empty\"},[_vm._v(\"暂无充值记录\")]):_vm._e()],2)])]),_c('el-tab-pane',{attrs:{\"label\":\"提现记录\",\"name\":\"withdraw\"}},[_c('div',{staticClass:\"list-wrap\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"全部提现 (\"+_vm._s(_vm.withdrawRows.length)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.loadWithdraw}},[_vm._v(\"刷新\")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading.withdraw),expression:\"loading.withdraw\"}],staticClass:\"record-list\"},[_vm._l((_vm.withdrawRows),function(row,idx){return _c('div',{key:_vm.getRowKey(row, idx),staticClass:\"record-item\",class:_vm.statusClass(row.status),on:{\"click\":function($event){return _vm.toggleExpand('withdraw', row, idx)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[(_vm.formatAmount(row.amount, row.toSymbol).truncated)?_c('el-tooltip',{attrs:{\"content\":`${_vm.formatAmount(row.amount, row.toSymbol).full} ${(row.toSymbol || 'USDT').toUpperCase()}`,\"placement\":\"top\"}},[_c('span',[_vm._v(\" - \"+_vm._s(_vm.formatAmount(row.amount, row.toSymbol).text)+\" \"+_vm._s((row.toSymbol || 'USDT').toUpperCase())+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(\" - \"+_vm._s(_vm.formatAmount(row.amount, row.toSymbol).text)+\" \"+_vm._s((row.toSymbol || 'USDT').toUpperCase())+\" \")])],1),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.formatChain(row.toChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status\"},[_c('el-tag',{attrs:{\"type\":_vm.getWithdrawStatusType(row.status),\"size\":\"small\"}},[_vm._v(_vm._s(_vm.getWithdrawStatusText(row.status)))])],1),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatFullTime(row.createTime)))])])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isExpanded('withdraw', row, idx)),expression:\"isExpanded('withdraw', row, idx)\"}],staticClass:\"expand-panel\"},[_c('div',{staticClass:\"expand-grid\"},[_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"收款地址\")]),_c('div',{staticClass:\"value value-row\"},[_c('span',{staticClass:\"mono-ellipsis\",attrs:{\"title\":row.toAddress}},[_vm._v(_vm._s(row.toAddress))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"mini\",\"icon\":\"el-icon-document-copy\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.handleCopy(row.toAddress, '收款地址')}}},[_vm._v(\"复制\")])],1)]),(row.txHash)?_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"交易哈希\")]),_c('div',{staticClass:\"value value-row\"},[_c('span',{staticClass:\"mono-ellipsis\",attrs:{\"title\":row.txHash}},[_vm._v(_vm._s(row.txHash))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"mini\",\"icon\":\"el-icon-document-copy\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.handleCopy(row.txHash, '交易哈希')}}},[_vm._v(\"复制\")])],1)]):_vm._e()])])])}),(!_vm.withdrawRows.length)?_c('div',{staticClass:\"empty\"},[_vm._v(\"暂无提现记录\")]):_vm._e()],2)])]),_c('el-tab-pane',{attrs:{\"label\":\"消费记录\",\"name\":\"consume\"}},[_c('div',{staticClass:\"list-wrap\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"全部消费 (\"+_vm._s(_vm.consumeRows.length)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.loadConsume}},[_vm._v(\"刷新\")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading.consume),expression:\"loading.consume\"}],staticClass:\"record-list\"},[_vm._l((_vm.consumeRows),function(row,idx){return _c('div',{key:_vm.getRowKey(row, idx),staticClass:\"record-item\",class:_vm.statusClass(row.status),on:{\"click\":function($event){return _vm.toggleExpand('consume', row, idx)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[(_vm.formatAmount(row.realAmount, row.fromSymbol).truncated)?_c('el-tooltip',{attrs:{\"content\":`${_vm.formatAmount(row.realAmount, row.fromSymbol).full} ${(row.fromSymbol || 'USDT').toUpperCase()}`,\"placement\":\"top\"}},[_c('span',[_vm._v(\" - \"+_vm._s(_vm.formatAmount(row.realAmount, row.fromSymbol).text)+\" \"+_vm._s((row.fromSymbol || 'USDT').toUpperCase())+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(\" - \"+_vm._s(_vm.formatAmount(row.realAmount, row.fromSymbol).text)+\" \"+_vm._s((row.fromSymbol || 'USDT').toUpperCase())+\" \")])],1),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.formatChain(row.fromChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status\"},[_c('el-tag',{attrs:{\"type\":_vm.getPayStatusType(row.status),\"size\":\"small\"}},[_vm._v(_vm._s(_vm.getPayStatusText(row.status)))])],1),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatFullTime(row.createTime || row.time)))])])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isExpanded('consume', row, idx)),expression:\"isExpanded('consume', row, idx)\"}],staticClass:\"expand-panel\"},[_c('div',{staticClass:\"expand-grid\"},[_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"订单号\")]),_c('span',{staticClass:\"value mono\"},[_vm._v(_vm._s(row.orderId || ''))])]),_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"支付地址\")]),_c('span',{staticClass:\"value mono-ellipsis\",attrs:{\"title\":row.fromAddress}},[_vm._v(_vm._s(row.fromAddress || ''))])]),_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"收款地址\")]),_c('span',{staticClass:\"value mono-ellipsis\",attrs:{\"title\":row.toAddress}},[_vm._v(_vm._s(row.toAddress || ''))])]),(row.txHash)?_c('div',{staticClass:\"expand-item\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"交易哈希\")]),_c('span',{staticClass:\"value mono-ellipsis\",attrs:{\"title\":row.txHash}},[_vm._v(_vm._s(row.txHash))])]):_vm._e()])])])}),(!_vm.consumeRows.length)?_c('div',{staticClass:\"empty\"},[_vm._v(\"暂无消费记录\")]):_vm._e()],2)])])],1),_c('el-row',[_c('el-col',{staticStyle:{\"display\":\"flex\",\"justify-content\":\"center\"},attrs:{\"span\":24}},[_c('el-pagination',{staticStyle:{\"margin\":\"0 auto\",\"margin-top\":\"10px\"},attrs:{\"current-page\":_vm.currentPage,\"page-sizes\":_vm.pageSizes,\"page-size\":_vm.pagination.pageSize,\"layout\":\"total, sizes, prev, pager, next, jumper\",\"total\":_vm.total},on:{\"size-change\":_vm.handleSizeChange,\"current-change\":_vm.handleCurrentChange,\"update:currentPage\":function($event){_vm.currentPage=$event},\"update:current-page\":function($event){_vm.currentPage=$event}}})],1)],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wallet-container\"},[_c('div',{staticClass:\"wallet-toolbar\",attrs:{\"role\":\"region\",\"aria-label\":\"钱包操作\"}},[_c('el-button',{staticClass:\"create-wallet-btn\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.openCreateWallet}},[_c('i',{staticClass:\"el-icon-plus\",staticStyle:{\"margin-right\":\"6px\"}}),_vm._v(\"充值 \")])],1),_c('section',{staticClass:\"wallet-card-section\"},_vm._l((_vm.walletList),function(w){return _c('div',{key:w.id,staticClass:\"wallet-card\"},[_c('div',{staticClass:\"wallet-header\"},[_c('h2',{staticClass:\"wallet-title\"},[_c('i',{staticClass:\"el-icon-wallet\"}),_vm._v(\" 我的钱包 \"),_c('el-tag',{staticStyle:{\"margin-left\":\"8px\"},attrs:{\"size\":\"mini\",\"effect\":\"dark\"}},[_vm._v(\" \"+_vm._s((w.fromChain || w.chain || '').toUpperCase())+\" \"+_vm._s((w.fromSymbol || w.coin || '').toUpperCase())+\" \")])],1),_c('div',{staticClass:\"wallet-balance\"},[_c('div',{staticClass:\"balance-item\"},[_c('span',{staticClass:\"balance-label\"},[_vm._v(\"可用余额\")]),_c('span',{staticClass:\"balance-amount\"},[_vm._v(_vm._s((w.walletBalance || w.balance || 0))+\" \"+_vm._s(_vm.displaySymbol(w)))])]),_c('div',{staticClass:\"balance-item\"},[_c('el-tooltip',{attrs:{\"placement\":\"top\",\"effect\":\"dark\"}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_vm._v(\" 冻结金额不能使用或提现,以下情况会冻结钱包余额:\"),_c('br'),_vm._v(\" 1. 下单机器后会冻结订单对应金额\"),_c('br'),_vm._v(\" 2. 提交提现后,金额正在提现中 \")]),_c('i',{staticClass:\"el-icon-question balance-tip-icon\"})]),_c('span',{staticClass:\"balance-label\"},[_vm._v(\"冻结余额\")]),_c('span',{staticClass:\"balance-amount frozen\"},[_vm._v(_vm._s((w.blockedBalance || 0))+\" \"+_vm._s(_vm.displaySymbol(w)))])],1),_c('el-button',{staticClass:\"withdraw-inline-btn\",attrs:{\"type\":\"success\",\"size\":\"mini\"},on:{\"click\":function($event){return _vm.handleWithdraw(w)}}},[_vm._v(\" 提现 \")])],1)])])}),0),_c('div',{staticClass:\"transaction-section\"},[_c('h3',{staticClass:\"section-title\"},[_vm._v(\"最近交易\")]),_c('div',{staticClass:\"transaction-list\"},[_vm._l((_vm.recentTransactions),function(transaction){return _c('div',{key:transaction.id,staticClass:\"transaction-item\"},[_c('div',{staticClass:\"transaction-info\"},[_c('span',{staticClass:\"transaction-type\"},[_vm._v(_vm._s(transaction.type))]),_c('span',{staticClass:\"transaction-time\"},[_vm._v(_vm._s(transaction.time))]),_c('el-tag',{staticClass:\"transaction-status\",attrs:{\"size\":\"mini\",\"type\":transaction.statusTagType || 'info'}},[_vm._v(\" \"+_vm._s(transaction.statusText || '-')+\" \")])],1),_c('div',{staticClass:\"transaction-amount\",class:transaction.amount > 0 ? 'positive' : 'negative'},[_vm._v(\" \"+_vm._s(transaction.amount > 0 ? '+' : '')+_vm._s(transaction.amountText)+\" USDT \")])])}),(_vm.recentTransactions.length === 0)?_c('div',{staticClass:\"empty-state\"},[_vm._v(\" 暂无交易记录 \")]):_vm._e()],2)]),_c('el-dialog',{attrs:{\"title\":\"钱包余额充值\",\"visible\":_vm.rechargeDialogVisible,\"width\":\"660px\"},on:{\"update:visible\":function($event){_vm.rechargeDialogVisible=$event},\"close\":_vm.resetRechargeForm}},[_c('div',{staticClass:\"recharge-content\"},[_c('div',{staticClass:\"wallet-address-section\"},[_c('h4',{staticClass:\"section-title\"},[_vm._v(\"钱包地址\")]),_c('div',{staticClass:\"charge-meta\"},[_c('el-tag',{staticClass:\"meta-tag\",attrs:{\"size\":\"small\",\"effect\":\"dark\",\"type\":\"warning\"}},[_c('i',{staticClass:\"el-icon-link\"}),_c('span',{staticClass:\"meta-title\"},[_vm._v(\"充值链:\")]),_c('span',{staticClass:\"meta-val\"},[_vm._v(_vm._s((_vm.WalletData.fromChain || _vm.WalletData.chain || '').toString().toUpperCase()))])]),_c('el-tag',{staticClass:\"meta-tag\",attrs:{\"size\":\"small\",\"effect\":\"dark\",\"type\":\"warning\"}},[_c('i',{staticClass:\"el-icon-coin\"}),_c('span',{staticClass:\"meta-title\"},[_vm._v(\"充值币种:\")]),_c('span',{staticClass:\"meta-val\"},[_vm._v(_vm._s((_vm.WalletData.fromSymbol || _vm.WalletData.coin || '').toString().toUpperCase()))])])],1),_c('div',{staticClass:\"address-container\"},[_c('el-input',{staticClass:\"address-input\",attrs:{\"readonly\":\"\",\"disabled\":true},model:{value:(_vm.WalletData.fromAddress),callback:function ($$v) {_vm.$set(_vm.WalletData, \"fromAddress\", $$v)},expression:\"WalletData.fromAddress\"}}),_c('el-button',{staticClass:\"copy-btn\",attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.copyAddress(_vm.WalletData.fromAddress)}}},[_vm._v(\" 复制 \")])],1),_c('p',{staticClass:\"address-tip\"},[_vm._v(\"请向此地址转账非\"+_vm._s(_vm.displaySymbol(_vm.WalletData))+\"资产,否则资产将无法找回.\")])]),_c('div',{staticClass:\"qr-code-section\"},[_c('h4',{staticClass:\"section-title\"},[_vm._v(\"扫码充值\")]),_c('div',{staticClass:\"qr-code-container\"},[_c('div',{ref:\"qrCodeRef\",staticClass:\"qr-code\"}),_c('p',{staticClass:\"qr-tip\"},[_vm._v(\"使用支持\"+_vm._s(_vm.displaySymbol(_vm.WalletData))+\"的钱包扫描二维码\")])])]),_c('div',{staticClass:\"recharge-notice\"},[_c('h4',{staticClass:\"section-title\"},[_vm._v(\"充值说明\")]),_c('ul',{staticClass:\"notice-list\"},[_c('li',[_vm._v(\"充值后请耐心等待余额更新或在资金流水页面查看最新充值记录\")]),_c('li',[_vm._v(\"最小充值金额:10 \"+_vm._s(_vm.displaySymbol(_vm.WalletData)))])])])]),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.rechargeDialogVisible = false}}},[_vm._v(\"关闭\")])],1)]),_c('el-dialog',{attrs:{\"title\":\"USDT提现\",\"visible\":_vm.withdrawDialogVisible,\"width\":\"720px\",\"close-on-click-modal\":false,\"close-on-press-escape\":false},on:{\"update:visible\":function($event){_vm.withdrawDialogVisible=$event},\"close\":_vm.resetWithdrawForm}},[_c('el-form',{ref:\"withdrawForm\",attrs:{\"model\":_vm.withdrawForm,\"rules\":_vm.withdrawRules,\"label-width\":\"120px\"}},[_c('el-form-item',{attrs:{\"label\":\"提现链\"}},[_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"value\":(_vm.WalletData.fromChain || _vm.WalletData.chain || _vm.withdrawForm.toChain || '').toString().toUpperCase(),\"disabled\":true}})],1),_c('el-form-item',{attrs:{\"label\":\"提现币种\"}},[_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"value\":_vm.displayWithdrawSymbol,\"disabled\":true}})],1),_c('el-form-item',{attrs:{\"label\":\"提现金额\",\"prop\":\"amount\"}},[_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"请输入提现金额\",\"inputmode\":\"decimal\"},on:{\"input\":_vm.handleAmountInput},model:{value:(_vm.withdrawForm.amount),callback:function ($$v) {_vm.$set(_vm.withdrawForm, \"amount\", $$v)},expression:\"withdrawForm.amount\"}},[_c('template',{slot:\"append\"},[_vm._v(_vm._s(_vm.displayWithdrawSymbol))])],2),_c('div',{staticClass:\"balance-info\"},[_c('div',{staticClass:\"balance-total\"},[_vm._v(\"钱包总余额:\"+_vm._s(_vm.totalBalance)+\" \"+_vm._s(_vm.displayWithdrawSymbol))]),_c('div',{staticClass:\"balance-row\"},[_c('span',[_vm._v(\"可用余额:\"+_vm._s(_vm.availableWithdrawBalance)+\" \"+_vm._s(_vm.displayWithdrawSymbol))]),_c('span',{staticClass:\"divider\"},[_vm._v(\"|\")]),_c('span',{staticClass:\"frozen-info\"},[_c('el-tooltip',{attrs:{\"placement\":\"top\",\"effect\":\"dark\"}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_vm._v(\" 冻结金额不能使用或提现,以下情况会冻结钱包余额:\"),_c('br'),_vm._v(\" 1. 下单机器后会冻结订单对应金额\"),_c('br'),_vm._v(\" 2. 提交提现后,金额正在提现中 \")]),_c('i',{staticClass:\"el-icon-question frozen-tip-icon\"})]),_vm._v(\" 冻结余额:\"+_vm._s((_vm.WalletData.blockedBalance || 0))+\" \"+_vm._s(_vm.displayWithdrawSymbol)+\" \"),_c('span',{staticClass:\"frozen-tip\"},[_vm._v(\"(购买机器下单后冻结,不可提现)\")])],1)])])],1),_c('el-form-item',{attrs:{\"label\":\"手续费\"}},[_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"手续费\",\"disabled\":true},model:{value:(_vm.withdrawForm.fee),callback:function ($$v) {_vm.$set(_vm.withdrawForm, \"fee\", $$v)},expression:\"withdrawForm.fee\"}},[_c('template',{slot:\"append\"},[_vm._v(_vm._s(_vm.displayWithdrawSymbol))])],2),_c('div',{staticClass:\"fee-info\"},[_vm._v(\" 网络手续费:\"+_vm._s(_vm.withdrawForm.fee || '0.00')+\" \"+_vm._s(_vm.displayWithdrawSymbol)+\" \")])],1),_c('el-form-item',{attrs:{\"label\":\"实际到账\"}},[_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"实际到账金额\",\"disabled\":true},model:{value:(_vm.actualAmount),callback:function ($$v) {_vm.actualAmount=$$v},expression:\"actualAmount\"}},[_c('template',{slot:\"append\"},[_vm._v(_vm._s(_vm.displayWithdrawSymbol))])],2),_c('div',{staticClass:\"actual-amount-info\"},[_vm._v(\" 实际到账:\"+_vm._s(_vm.actualAmount)+\" \"+_vm._s(_vm.displayWithdrawSymbol)+\" \")])],1),_c('el-form-item',{attrs:{\"label\":\"收款地址\",\"prop\":\"toAddress\"}},[_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"type\":\"textarea\",\"rows\":3,\"placeholder\":\"请输入收款钱包地址\"},model:{value:(_vm.withdrawForm.toAddress),callback:function ($$v) {_vm.$set(_vm.withdrawForm, \"toAddress\", $$v)},expression:\"withdrawForm.toAddress\"}}),_c('div',{staticClass:\"address-tip\"},[_vm._v(\" 请确保地址正确,错误地址将导致资产丢失 \")])],1),_c('el-form-item',{attrs:{\"label\":\"谷歌验证码\",\"prop\":\"googleCode\"}},[_c('el-input',{ref:\"googleCodeInput\",staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"请输入6位谷歌验证码\",\"maxlength\":\"6\"},on:{\"input\":_vm.handleGoogleCodeInput},model:{value:(_vm.withdrawForm.googleCode),callback:function ($$v) {_vm.$set(_vm.withdrawForm, \"googleCode\", $$v)},expression:\"withdrawForm.googleCode\"}},[_c('template',{slot:\"prepend\"},[_c('i',{staticClass:\"el-icon-key\"})])],2),_c('div',{staticClass:\"google-code-tip\"},[_vm._v(\" 为了保障您的账户安全,请输入您的谷歌验证器中的6位验证码 \")])],1)],1),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.withdrawDialogVisible = false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"loading\":_vm.withdrawLoading},on:{\"click\":_vm.confirmWithdraw}},[_vm._v(\"确认提现\")])],1)],1),_c('el-dialog',{attrs:{\"title\":\"链上充值\",\"visible\":_vm.createDialogVisible,\"close-on-click-modal\":false,\"close-on-press-escape\":false,\"width\":\"520px\"},on:{\"update:visible\":function($event){_vm.createDialogVisible=$event}}},[_c('el-form',{attrs:{\"label-width\":\"120px\"}},[_c('el-form-item',{attrs:{\"label\":\"选择充值链/币种\"}},[_c('el-cascader',{staticStyle:{\"width\":\"100%\"},attrs:{\"options\":_vm.options},model:{value:(_vm.createValue),callback:function ($$v) {_vm.createValue=$$v},expression:\"createValue\"}})],1)],1),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.createDialogVisible = false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"loading\":_vm.createLoading},on:{\"click\":_vm.confirmCreateWallet}},[_vm._v(\"确定\")])],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.productListLoading),expression:\"productListLoading\"}],staticClass:\"product-list\"},[_c('section',{staticClass:\"container\"},[_c('h1',{staticClass:\"page-title\"},[_vm._v(\"商品列表\")]),_c('section',{staticClass:\"filter-section\"},[_c('label',{staticClass:\"required\",staticStyle:{\"margin-bottom\":\"10px\"}},[_vm._v(\"币种选择:\")]),_c('div',{staticClass:\"filter-row\"},[_c('el-select',{ref:\"screen\",staticClass:\"input\",attrs:{\"size\":\"middle\",\"placeholder\":\"请选择\",\"clearable\":\"\"},on:{\"change\":_vm.handleCurrencyChange,\"clear\":_vm.handleCurrencyClear},model:{value:(_vm.screenCurrency),callback:function ($$v) {_vm.screenCurrency=$$v},expression:\"screenCurrency\"}},_vm._l((_vm.currencyList),function(item){return _c('el-option',{key:item.value,attrs:{\"label\":item.label,\"value\":item.value}},[_c('div',{staticStyle:{\"display\":\"flex\",\"align-items\":\"center\"}},[_c('img',{staticStyle:{\"float\":\"left\",\"width\":\"20px\"},attrs:{\"src\":item.imgUrl}}),_c('span',{staticStyle:{\"float\":\"left\",\"margin-left\":\"5px\"}},[_vm._v(_vm._s(item.label))])])])}),1),_c('el-input',{staticStyle:{\"width\":\"240px\"},attrs:{\"size\":\"middle\",\"placeholder\":\"输入算法关键词\",\"clearable\":\"\"},on:{\"clear\":_vm.handleAlgorithmClear},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.handleAlgorithmSearch.apply(null, arguments)}},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleAlgorithmSearch}},[_vm._v(\"搜索\")])]},proxy:true}]),model:{value:(_vm.searchAlgorithm),callback:function ($$v) {_vm.searchAlgorithm=$$v},expression:\"searchAlgorithm\"}})],1)]),_c('div',{staticClass:\"product-list-grid\"},[_vm._l((_vm.products),function(product){return _c('div',{key:product.id,staticClass:\"product-item\",attrs:{\"tabindex\":\"0\",\"aria-label\":\"查看详情\"},on:{\"click\":function($event){return _vm.handleProductClick(product)}}},[_c('img',{staticClass:\"product-image\",attrs:{\"src\":require(\"../../assets/imgs/commodity.png\"),\"alt\":product.name}}),_c('div',{staticClass:\"product-info\"},[_c('h4',[_vm._v(\"商品: \"+_vm._s(product.name))]),_c('p',{staticStyle:{\"font-size\":\"16px\",\"margin-top\":\"10px\",\"font-weight\":\"bold\"}},[_vm._v(\"算法: \"+_vm._s(product.algorithm))]),_c('div',{staticClass:\"product-footer\"},[_c('div',{staticClass:\"paytypes\"},[_c('span',{staticClass:\"paytypes-label\"},[_vm._v(\"支付方式:\")]),_vm._l(((product.payTypes || [])),function(pt,idx){return _c('el-tooltip',{key:idx,attrs:{\"content\":_vm.formatPayType(pt),\"placement\":\"top\",\"open-delay\":80}},[_c('img',{staticClass:\"paytype-icon\",attrs:{\"src\":pt.image,\"alt\":_vm.formatPayType(pt)}})])})],2),_c('div',{staticClass:\"right-meta\"},[_c('span',{staticClass:\"product-sold\",attrs:{\"aria-label\":\"已售数量\"}},[_vm._v(\"已售:\"+_vm._s(product && product.saleNumber != null ? product.saleNumber : 0))]),_c('span',{staticClass:\"shop-name\"},[_vm._v(\"店铺:\"+_vm._s(product && (product.shopName || product.name)))])])])])])}),(_vm.products.length === 0 && !_vm.productListLoading)?_c('div',{staticClass:\"empty-state\"},[_c('i',{staticClass:\"el-icon-goods\"}),_c('p',[_vm._v(\"暂无商品数据\")]),_c('p',{staticStyle:{\"font-size\":\"12px\",\"color\":\"#999\",\"margin-top\":\"8px\"}},[_vm._v(\"请检查网络连接或联系管理员\")])]):_vm._e()],2)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"order-detail-page\"},[_c('h2',{staticClass:\"title\"},[_vm._v(\"订单详情\")]),(_vm.loading)?_c('div',{staticClass:\"loading\"},[_vm._v(\"加载中...\")]):_c('div',[_c('el-card',{staticClass:\"section\"},[_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"订单ID:\")]),_c('span',{staticClass:\"value mono\"},[_vm._v(_vm._s(_vm.order.id || '—'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"订单号:\")]),_c('span',{staticClass:\"value mono\"},[_vm._v(_vm._s(_vm.order.orderNumber || '—'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"状态:\")]),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.getOrderStatusText(_vm.order.status)))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"金额(USDT):\")]),_c('span',{staticClass:\"value strong\"},[_vm._v(_vm._s(_vm.order.totalPrice))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"创建时间:\")]),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.formatDateTime(_vm.order.createTime)))])])]),_c('el-card',{staticClass:\"section\",staticStyle:{\"margin-top\":\"12px\"}},[_c('div',{staticClass:\"sub-title\"},[_vm._v(\"机器列表\")]),_c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.items,\"border\":\"\",\"size\":\"small\",\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }}},[_c('el-table-column',{attrs:{\"prop\":\"productMachineId\",\"label\":\"机器ID\",\"min-width\":\"120\"}}),_c('el-table-column',{attrs:{\"prop\":\"name\",\"label\":\"名称\",\"min-width\":\"160\"}}),_c('el-table-column',{attrs:{\"prop\":\"payCoin\",\"label\":\"币种\",\"min-width\":\"100\"}}),_c('el-table-column',{attrs:{\"prop\":\"leaseTime\",\"label\":\"租赁天数\",\"min-width\":\"100\"}}),_c('el-table-column',{attrs:{\"prop\":\"price\",\"label\":\"单价(USDT)\",\"min-width\":\"120\"}}),_c('el-table-column',{attrs:{\"prop\":\"address\",\"label\":\"收款地址\",\"min-width\":\"240\"}})],1)],1),_c('div',{staticClass:\"actions\"},[_c('el-button',{on:{\"click\":function($event){return _vm.$router.back()}}},[_vm._v(\"返回\")])],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"recharge-record-container\"},[_vm._m(0),_c('div',{staticClass:\"tab-container\"},[_c('el-tabs',{on:{\"tab-click\":_vm.handleTabClick},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},[_c('el-tab-pane',{attrs:{\"label\":\"充值中\",\"name\":\"pending\"}},[_c('div',{staticClass:\"tab-content\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"充值中 (\"+_vm._s(_vm.pendingRecharges.length)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.refreshData}},[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\" 刷新 \")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"recharge-list\"},[_vm._l((_vm.pendingRecharges),function(item){return _c('div',{key:item.id,staticClass:\"recharge-item pending\",on:{\"click\":function($event){return _vm.showDetail(item)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[_vm._v(\" \"+_vm._s(item.amount)+\" \"+_vm._s(item.fromSymbol || \"USDT\")+\" \")]),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.getChainName(item.fromChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status pending-status\"},[_c('i',{staticClass:\"el-icon-loading\"}),_vm._v(\" \"+_vm._s(_vm.getStatusText(item.status))+\" \")]),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatTime(item.createTime)))])])]),_c('div',{staticClass:\"item-footer\"},[_c('div',{staticClass:\"footer-left\"},[_c('span',{staticClass:\"address\"},[_vm._v(_vm._s(_vm.formatAddress(item.address)))]),(item.txHash)?_c('span',{staticClass:\"tx-hash\"},[_c('i',{staticClass:\"el-icon-link\"}),_vm._v(\" \"+_vm._s(_vm.formatAddress(item.txHash))+\" \")]):_vm._e()]),_c('i',{staticClass:\"el-icon-arrow-right\"})])])}),(_vm.pendingRecharges.length === 0)?_c('div',{staticClass:\"empty-state\"},[_c('i',{staticClass:\"el-icon-document\"}),_c('p',[_vm._v(\"暂无充值中的记录\")])]):_vm._e()],2)])]),_c('el-tab-pane',{attrs:{\"label\":\"充值成功\",\"name\":\"success\"}},[_c('div',{staticClass:\"tab-content\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"充值成功 (\"+_vm._s(_vm.successRecharges.length)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.refreshData}},[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\" 刷新 \")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"recharge-list\"},[_vm._l((_vm.successRecharges),function(item){return _c('div',{key:item.id,staticClass:\"recharge-item success\",on:{\"click\":function($event){return _vm.showDetail(item)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[_vm._v(\" \"+_vm._s(item.amount)+\" \"+_vm._s(item.fromSymbol || \"USDT\")+\" \")]),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.getChainName(item.fromChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status success-status\"},[_c('i',{staticClass:\"el-icon-check\"}),_vm._v(\" \"+_vm._s(_vm.getStatusText(item.status))+\" \")]),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatTime(item.createTime)))])])]),_c('div',{staticClass:\"item-footer\"},[_c('div',{staticClass:\"footer-left\"},[_c('span',{staticClass:\"address\"},[_vm._v(_vm._s(_vm.formatAddress(item.address)))]),(item.txHash)?_c('span',{staticClass:\"tx-hash\"},[_c('i',{staticClass:\"el-icon-link\"}),_vm._v(\" \"+_vm._s(_vm.formatAddress(item.txHash))+\" \")]):_vm._e()]),_c('i',{staticClass:\"el-icon-arrow-right\"})])])}),(_vm.successRecharges.length === 0)?_c('div',{staticClass:\"empty-state\"},[_c('i',{staticClass:\"el-icon-document\"}),_c('p',[_vm._v(\"暂无充值成功的记录\")])]):_vm._e()],2)])]),_c('el-tab-pane',{attrs:{\"label\":\"充值失败\",\"name\":\"failed\"}},[_c('div',{staticClass:\"tab-content\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"充值失败 (\"+_vm._s(_vm.failedRecharges.length)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.refreshData}},[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\" 刷新 \")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"recharge-list\"},[_vm._l((_vm.failedRecharges),function(item){return _c('div',{key:item.id,staticClass:\"recharge-item failed\",on:{\"click\":function($event){return _vm.showDetail(item)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[_vm._v(\" \"+_vm._s(item.amount)+\" \"+_vm._s(item.fromSymbol || \"USDT\")+\" \")]),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.getChainName(item.fromChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status failed-status\"},[_c('i',{staticClass:\"el-icon-close\"}),_vm._v(\" \"+_vm._s(_vm.getStatusText(item.status))+\" \")]),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatTime(item.createTime)))])])]),_c('div',{staticClass:\"item-footer\"},[_c('div',{staticClass:\"footer-left\"},[_c('span',{staticClass:\"address\"},[_vm._v(_vm._s(_vm.formatAddress(item.address)))]),(item.txHash)?_c('span',{staticClass:\"tx-hash\"},[_c('i',{staticClass:\"el-icon-link\"}),_vm._v(\" \"+_vm._s(_vm.formatAddress(item.txHash))+\" \")]):_vm._e()]),_c('i',{staticClass:\"el-icon-arrow-right\"})])])}),(_vm.failedRecharges.length === 0)?_c('div',{staticClass:\"empty-state\"},[_c('i',{staticClass:\"el-icon-document\"}),_c('p',[_vm._v(\"暂无充值失败的记录\")])]):_vm._e()],2)])])],1),_c('el-row',[_c('el-col',{staticStyle:{\"display\":\"flex\",\"justify-content\":\"center\"},attrs:{\"span\":24}},[_c('el-pagination',{staticStyle:{\"margin\":\"0 auto\",\"margin-top\":\"10px\"},attrs:{\"current-page\":_vm.currentPage,\"page-sizes\":_vm.pageSizes,\"page-size\":_vm.pagination.pageSize,\"layout\":\"total, sizes, prev, pager, next, jumper\",\"total\":_vm.total},on:{\"size-change\":_vm.handleSizeChange,\"current-change\":_vm.handleCurrentChange,\"update:currentPage\":function($event){_vm.currentPage=$event},\"update:current-page\":function($event){_vm.currentPage=$event}}})],1)],1)],1),_c('el-dialog',{attrs:{\"title\":\"充值详情\",\"visible\":_vm.detailDialogVisible,\"width\":\"600px\"},on:{\"update:visible\":function($event){_vm.detailDialogVisible=$event},\"close\":_vm.closeDetail}},[(_vm.selectedItem)?_c('div',{staticClass:\"detail-content\"},[_c('div',{staticClass:\"detail-section\"},[_c('h3',{staticClass:\"section-title\"},[_vm._v(\"基本信息\")]),_c('div',{staticClass:\"detail-list\"},[_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"充值ID\")]),_c('span',{staticClass:\"detail-value\"},[_vm._v(_vm._s(_vm.selectedItem.id))])]),_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"充值金额\")]),_c('span',{staticClass:\"detail-value amount\"},[_vm._v(_vm._s(_vm.selectedItem.amount)+\" \"+_vm._s(_vm.selectedItem.fromSymbol || \"USDT\"))])]),_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"区块链网络\")]),_c('span',{staticClass:\"detail-value\"},[_vm._v(_vm._s(_vm.getChainName(_vm.selectedItem.fromChain)))])]),_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"充值状态\")]),_c('span',{staticClass:\"detail-value\"},[_c('el-tag',{attrs:{\"type\":_vm.getStatusType(_vm.selectedItem.status)}},[_vm._v(\" \"+_vm._s(_vm.getStatusText(_vm.selectedItem.status))+\" \")])],1)])])]),_c('div',{staticClass:\"detail-section\"},[_c('h3',{staticClass:\"section-title\"},[_vm._v(\"地址信息\")]),_c('div',{staticClass:\"detail-list\"},[_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"充值地址\")]),_c('div',{staticClass:\"address-container\"},[_c('span',{staticClass:\"detail-value address\"},[_vm._v(_vm._s(_vm.selectedItem.address))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.copyAddress(_vm.selectedItem.address)}}},[_vm._v(\" 复制 \")])],1)]),(_vm.selectedItem.txHash)?_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"交易哈希\")]),_c('div',{staticClass:\"address-container\"},[_c('span',{staticClass:\"detail-value address\"},[_vm._v(_vm._s(_vm.selectedItem.txHash))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.copyAddress(_vm.selectedItem.txHash)}}},[_vm._v(\" 复制 \")])],1)]):_vm._e()])]),_c('div',{staticClass:\"detail-section\"},[_c('h3',{staticClass:\"section-title\"},[_vm._v(\"时间信息\")]),_c('div',{staticClass:\"detail-list\"},[_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"充值时间\")]),_c('span',{staticClass:\"detail-value\"},[_vm._v(_vm._s(_vm.formatFullTime(_vm.selectedItem.createTime)))])])])])]):_vm._e(),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":_vm.closeDetail}},[_vm._v(\"关闭\")])],1)])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"page-header\"},[_c('h1',{staticClass:\"page-title\"},[_vm._v(\"充值记录\")]),_c('p',{staticClass:\"page-subtitle\"},[_vm._v(\"查看您的充值申请和到账状态\")])])\n}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./productMachineAdd.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./productMachineAdd.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./productMachineAdd.vue?vue&type=template&id=4f1442d6&scoped=true\"\nimport script from \"./productMachineAdd.vue?vue&type=script&lang=js\"\nexport * from \"./productMachineAdd.vue?vue&type=script&lang=js\"\nimport style0 from \"./productMachineAdd.vue?vue&type=style&index=0&id=4f1442d6&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4f1442d6\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.payLoading),expression:\"payLoading\"}]},[(!_vm.safeItems.length)?_c('div',{staticClass:\"empty\"},[_vm._v(_vm._s(_vm.emptyText))]):_c('el-table',{attrs:{\"data\":_vm.safeItems,\"border\":\"\",\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }}},[_c('el-table-column',{attrs:{\"type\":\"expand\",\"width\":\"46\"},scopedSlots:_vm._u([{key:\"default\",fn:function(outer){return [_c('el-table',{attrs:{\"data\":outer.row.orderItemDtoList || [],\"size\":\"small\",\"border\":\"\",\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' },\"row-key\":\"productMachineId\"}},[_c('el-table-column',{attrs:{\"prop\":\"productMachineId\",\"label\":\"机器ID\",\"min-width\":\"120\"}}),_c('el-table-column',{attrs:{\"prop\":\"name\",\"label\":\"名称\",\"min-width\":\"160\"}}),_c('el-table-column',{attrs:{\"prop\":\"payCoin\",\"label\":\"币种\",\"min-width\":\"100\"}}),_c('el-table-column',{attrs:{\"prop\":\"address\",\"label\":\"收款地址\",\"min-width\":\"240\"}}),_c('el-table-column',{attrs:{\"prop\":\"leaseTime\",\"label\":\"租赁天数\",\"min-width\":\"100\"}}),_c('el-table-column',{attrs:{\"prop\":\"price\",\"label\":\"售价(USDT)\",\"min-width\":\"240\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"value strong\"},[(_vm.formatAmount(scope.row.price, scope.row.payCoin || 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row.price, scope.row.payCoin || 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row.price, scope.row.payCoin || 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row.price, scope.row.payCoin || 'USDT').text))])],1)]}}],null,true)})],1)]}}])}),_c('el-table-column',{attrs:{\"label\":\"订单号\",\"min-width\":\"220\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"value mono\"},[_vm._v(_vm._s(scope.row && scope.row.orderNumber || '—'))])]}}])}),_c('el-table-column',{attrs:{\"label\":\"创建时间\",\"min-width\":\"180\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(_vm.formatDateTime(scope.row && scope.row.createTime)))]}}])}),_c('el-table-column',{attrs:{\"label\":\"商品数\",\"min-width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(Array.isArray(scope.row && scope.row.orderItemDtoList) ? scope.row.orderItemDtoList.length : 0))]}}])}),_c('el-table-column',{attrs:{\"label\":\"总金额(USDT)\",\"min-width\":\"140\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"value strong\"},[(_vm.formatAmount(scope.row && scope.row.totalPrice, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row && scope.row.totalPrice, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row && scope.row.totalPrice, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row && scope.row.totalPrice, 'USDT').text))])],1)]}}])}),_c('el-table-column',{attrs:{\"min-width\":\"180\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_c('el-tooltip',{attrs:{\"placement\":\"top\",\"effect\":\"dark\"}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_vm._v(\" 实际支付金额/理论支付金额:\"),_c('br'),_vm._v(\" 1. 实际支付金额是按照矿机实际算力计算支付金额\"),_c('br'),_vm._v(\" 2. 理论支付金额是卖家定义出售价格 \")]),_c('span',{staticStyle:{\"display\":\"inline-flex\",\"align-items\":\"center\",\"gap\":\"6px\"}},[_c('i',{staticClass:\"el-icon-question\",staticStyle:{\"color\":\"#909399\"},attrs:{\"aria-label\":\"说明\",\"role\":\"img\"}}),_vm._v(\" 已支付金额(USDT) \")])])]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"value strong\"},[(_vm.formatAmount(scope.row && scope.row.payAmount, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row && scope.row.payAmount, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row && scope.row.payAmount, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row && scope.row.payAmount, 'USDT').text))])],1)]}}])}),_c('el-table-column',{attrs:{\"label\":\"待支付金额(USDT)\",\"min-width\":\"140\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"value strong\"},[(_vm.formatAmount(scope.row && scope.row.noPayAmount, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row && scope.row.noPayAmount, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row && scope.row.noPayAmount, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row && scope.row.noPayAmount, 'USDT').text))])],1)]}}])}),_c('el-table-column',{attrs:{\"label\":\"操作\",\"min-width\":\"280\",\"fixed\":\"right\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{staticStyle:{\"margin-right\":\"8px\"},attrs:{\"size\":\"mini\"},on:{\"click\":function($event){return _vm.handleGoDetail(scope.row)}}},[_vm._v(\"详情\")]),(_vm.shouldShowActions(scope.row))?[_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"mini\"},on:{\"click\":function($event){return _vm.handleCheckout(scope.row)}}},[_vm._v(\"去结算\")])]:_vm._e()]}}])})],1),_c('el-dialog',{attrs:{\"visible\":_vm.dialogVisible,\"width\":\"520px\",\"title\":\"请扫码支付\"},on:{\"update:visible\":function($event){_vm.dialogVisible=$event}}},[_c('div',{staticStyle:{\"text-align\":\"left\",\"margin-bottom\":\"12px\",\"color\":\"#666\"}},[_c('div',{staticStyle:{\"margin-bottom\":\"6px\"}},[_vm._v(\"总金额(USDT): \"),_c('b',[(_vm.formatAmount(_vm.paymentDialog.totalPrice, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(_vm.paymentDialog.totalPrice, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.paymentDialog.totalPrice, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(_vm.paymentDialog.totalPrice, 'USDT').text))])],1)]),_c('div',{staticStyle:{\"margin-bottom\":\"6px\",\"display\":\"flex\",\"align-items\":\"center\",\"gap\":\"6px\"}},[_c('el-tooltip',{attrs:{\"placement\":\"top\",\"effect\":\"dark\"}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_vm._v(\" 实际支付金额/理论支付金额:\"),_c('br'),_vm._v(\" 1. 实际支付金额是按照矿机实际算力计算支付金额\"),_c('br'),_vm._v(\" 2. 理论支付金额是卖家定义出售价格 \")]),_c('i',{staticClass:\"el-icon-question\",staticStyle:{\"color\":\"#909399\"},attrs:{\"aria-label\":\"说明\",\"role\":\"img\"}})]),_c('span',[_vm._v(\"已支付金额(USDT):\")]),_c('b',{staticClass:\"value strong\"},[(_vm.formatAmount(_vm.paymentDialog.payAmount, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(_vm.paymentDialog.payAmount, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.paymentDialog.payAmount, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(_vm.paymentDialog.payAmount, 'USDT').text))])],1)],1),_c('div',{staticStyle:{\"margin-bottom\":\"6px\"}},[_vm._v(\"待支付金额(USDT): \"),_c('b',{staticClass:\"value strong\"},[(_vm.formatAmount(_vm.paymentDialog.noPayAmount, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(_vm.paymentDialog.noPayAmount, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(_vm.paymentDialog.noPayAmount, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(_vm.paymentDialog.noPayAmount, 'USDT').text))])],1)])]),_c('div',{staticStyle:{\"text-align\":\"center\"}},[(_vm.paymentDialog.img)?_c('img',{staticStyle:{\"width\":\"180px\",\"height\":\"180px\",\"margin-top\":\"18px\"},attrs:{\"src\":_vm.paymentDialog.img,\"alt\":\"支付二维码\"}}):_c('div',{staticStyle:{\"color\":\"#666\"}},[_vm._v(\"未返回支付二维码\")])]),_c('p',{staticStyle:{\"margin-bottom\":\"6px\",\"color\":\"red\",\"text-align\":\"left\"}},[_vm._v(\"注意:如果已经支付对应金额,不要在重复支付,待系统确认后会自动更新订单状态。因个人原因重复支付导致无法退款,平台不承担任何责任。\")]),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.dialogVisible=false}}},[_vm._v(\"关闭\")])],1)])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"product-new\"},[_c('el-card',{staticClass:\"product-form-card\"},[_c('div',{staticClass:\"card-header\",attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('h2',[_vm._v(\"新增商品\")]),_c('p',{staticClass:\"subtitle\"},[_vm._v(\"创建新的商品信息\")])]),_c('el-form',{ref:\"productForm\",staticClass:\"product-form\",attrs:{\"model\":_vm.form,\"rules\":_vm.rules,\"label-width\":\"120px\"}},[_c('el-form-item',{attrs:{\"label\":\"商品名称\",\"prop\":\"name\"}},[_c('el-input',{attrs:{\"placeholder\":\"请输入商品名称,如:Nexa-M2-Miner\",\"maxlength\":\"30\",\"show-word-limit\":\"\"},model:{value:(_vm.form.name),callback:function ($$v) {_vm.$set(_vm.form, \"name\", $$v)},expression:\"form.name\"}})],1),_c('el-form-item',{staticClass:\"align-like-input\",attrs:{\"label\":\"商品类型\",\"prop\":\"type\"}},[_c('el-radio-group',{model:{value:(_vm.form.type),callback:function ($$v) {_vm.$set(_vm.form, \"type\", $$v)},expression:\"form.type\"}},[_c('el-radio',{attrs:{\"label\":0}},[_vm._v(\"矿机\")])],1)],1),_c('el-form-item',{attrs:{\"label\":\"挖矿币种\",\"prop\":\"coin\"}},[_c('el-select',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"请选择挖矿币种\"},model:{value:(_vm.form.coin),callback:function ($$v) {_vm.$set(_vm.form, \"coin\", $$v)},expression:\"form.coin\"}},_vm._l((_vm.coinOptions),function(coin){return _c('el-option',{key:coin.value,attrs:{\"label\":coin.label,\"value\":coin.value}})}),1)],1),_c('el-form-item',{attrs:{\"label\":\"商品描述\",\"prop\":\"description\"}},[_c('el-input',{attrs:{\"type\":\"textarea\",\"rows\":4,\"placeholder\":\"请输入商品描述\",\"maxlength\":\"100\",\"show-word-limit\":\"\"},model:{value:(_vm.form.description),callback:function ($$v) {_vm.$set(_vm.form, \"description\", $$v)},expression:\"form.description\"}})],1),_c('el-form-item',{staticClass:\"align-like-input\",attrs:{\"label\":\"商品状态\",\"prop\":\"state\"}},[_c('el-radio-group',{model:{value:(_vm.form.state),callback:function ($$v) {_vm.$set(_vm.form, \"state\", $$v)},expression:\"form.state\"}},[_c('el-radio',{attrs:{\"label\":0}},[_vm._v(\"上架\")]),_c('el-radio',{attrs:{\"label\":1}},[_vm._v(\"下架\")])],1)],1),_c('el-form-item',{staticClass:\"actions-row\"},[_c('div',{staticClass:\"form-actions\"},[_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"medium\",\"loading\":_vm.submitting},on:{\"click\":_vm.handleSubmit}},[_vm._v(\"创建商品\")]),_c('el-button',{attrs:{\"size\":\"medium\"},on:{\"click\":_vm.handleReset}},[_vm._v(\"重置\")]),_c('el-button',{attrs:{\"size\":\"medium\"},on:{\"click\":_vm.handleCancel}},[_vm._v(\"取消\")])],1)])],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.productDetailLoading),expression:\"productDetailLoading\"}],staticClass:\"product-detail\"},[(_vm.loading)?_c('div',{staticClass:\"loading\"},[_c('i',{staticClass:\"el-icon-loading\",attrs:{\"aria-label\":\"加载中\",\"role\":\"img\"}}),_vm._v(\" 加载中... \")]):(_vm.product)?_c('div',{staticClass:\"detail-container\"},[_c('h2',{staticStyle:{\"margin\":\"10px\",\"text-align\":\"left\",\"margin-top\":\"28px\"}},[_vm._v(\"商品详情-选择矿机\")]),_c('section',{staticClass:\"pay-methods\",attrs:{\"aria-label\":\"支付方式\"}},[_c('div',{staticClass:\"pay-label\",attrs:{\"tabindex\":\"0\",\"aria-label\":\"支付方式标签\"}},[_vm._v(\"支付方式:\")]),_c('ul',{staticClass:\"pay-list\",attrs:{\"role\":\"list\",\"aria-label\":\"支付方式列表\"}},_vm._l((_vm.paymentMethodList),function(item,index){return _c('li',{key:index,staticClass:\"pay-item\",attrs:{\"aria-label\":`支付方式: ${item.payChain}`}},[_c('el-tooltip',{attrs:{\"content\":_vm.formatPayTooltip(item),\"placement\":\"top\",\"open-delay\":80}},[_c('img',{staticClass:\"pay-icon\",attrs:{\"src\":_vm.getPayImageUrl(item),\"alt\":`${(item.payChain || '').toUpperCase()} ${(item.payCoin || '').toUpperCase()}`.trim(),\"title\":_vm.formatPayTooltip(item),\"tabindex\":\"0\",\"role\":\"img\"},on:{\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();return _vm.handlePayIconKeyDown(item)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"]))return null;$event.preventDefault();return _vm.handlePayIconKeyDown(item)}]}})])],1)}),0)]),_c('section',{staticClass:\"filter-bar\",attrs:{\"aria-label\":\"筛选条件\"}},[_c('div',{staticClass:\"filter-grid\"},[_c('div',{staticClass:\"filter-cell\"},[_c('label',{staticClass:\"filter-title\",attrs:{\"for\":\"payFilter\"}},[_vm._v(\"支付方式筛选\")]),_c('el-select',{staticClass:\"filter-control\",attrs:{\"id\":\"payFilter\",\"placeholder\":\"全部\",\"clearable\":\"\",\"filterable\":\"\",\"size\":\"small\"},on:{\"change\":_vm.handlePayFilterChange},scopedSlots:_vm._u([{key:\"prefix\",fn:function(){return [(_vm.getSelectedPayIcon())?_c('img',{staticStyle:{\"width\":\"16px\",\"height\":\"16px\",\"border-radius\":\"3px\",\"margin-right\":\"6px\"},attrs:{\"src\":_vm.getSelectedPayIcon(),\"alt\":\"\"}}):_vm._e()]},proxy:true}]),model:{value:(_vm.selectedPayKey),callback:function ($$v) {_vm.selectedPayKey=$$v},expression:\"selectedPayKey\"}},_vm._l((_vm.paymentMethodList),function(opt,i){return _c('el-option',{key:i,attrs:{\"label\":_vm.formatPayTooltip(opt),\"value\":`${opt.payChain || ''}|${opt.payCoin || ''}`}},[_c('div',{staticClass:\"pay-opt\"},[_c('img',{staticClass:\"pay-icon\",attrs:{\"src\":_vm.getPayImageUrl(opt),\"alt\":\"\"}}),_c('span',[_vm._v(_vm._s((opt.payChain || '').toUpperCase())+\" - \"+_vm._s((opt.payCoin || '').toUpperCase()))])])])}),1)],1),_c('div',{staticClass:\"filter-cell center-title\"},[_c('label',{staticClass:\"filter-title\"},[_vm._v(\"单价区间\"),(_vm.getPriceCoinSymbol())?_c('span',[_vm._v(\"(\"+_vm._s(_vm.getPriceCoinSymbol())+\")\")]):_vm._e()]),_c('div',{staticClass:\"range-controls\"},[_c('el-input-number',{staticClass:\"filter-control\",attrs:{\"min\":0,\"step\":1,\"precision\":0,\"controls\":false,\"size\":\"small\"},model:{value:(_vm.filters.minPrice),callback:function ($$v) {_vm.$set(_vm.filters, \"minPrice\", $$v)},expression:\"filters.minPrice\"}}),_c('span',{staticClass:\"filter-sep\"},[_vm._v(\"-\")]),_c('el-input-number',{staticClass:\"filter-control\",attrs:{\"min\":0,\"step\":1,\"precision\":0,\"controls\":false,\"size\":\"small\"},model:{value:(_vm.filters.maxPrice),callback:function ($$v) {_vm.$set(_vm.filters, \"maxPrice\", $$v)},expression:\"filters.maxPrice\"}})],1)]),_c('div',{staticClass:\"filter-cell center-title\"},[_c('label',{staticClass:\"filter-title\"},[_vm._v(\"实际算力\")]),_c('div',{staticClass:\"range-controls\"},[_c('el-input-number',{staticClass:\"filter-control\",attrs:{\"min\":0,\"step\":0.1,\"precision\":2,\"controls\":false,\"size\":\"small\"},model:{value:(_vm.filters.minPower),callback:function ($$v) {_vm.$set(_vm.filters, \"minPower\", $$v)},expression:\"filters.minPower\"}}),_c('span',{staticClass:\"filter-sep\"},[_vm._v(\"-\")]),_c('el-input-number',{staticClass:\"filter-control\",attrs:{\"min\":0,\"step\":0.1,\"precision\":2,\"controls\":false,\"size\":\"small\"},model:{value:(_vm.filters.maxPower),callback:function ($$v) {_vm.$set(_vm.filters, \"maxPower\", $$v)},expression:\"filters.maxPower\"}}),_c('el-select',{staticClass:\"filter-control\",staticStyle:{\"max-width\":\"140px\"},attrs:{\"placeholder\":\"单位\",\"size\":\"small\"},model:{value:(_vm.filters.unit),callback:function ($$v) {_vm.$set(_vm.filters, \"unit\", $$v)},expression:\"filters.unit\"}},_vm._l((_vm.powerUnitOptions),function(u){return _c('el-option',{key:u,attrs:{\"label\":u,\"value\":u}})}),1)],1)]),_c('div',{staticClass:\"filter-cell filter-cell--span-2 center-title\"},[_c('label',{staticClass:\"filter-title\"},[_vm._v(\"功耗(kw/h)\")]),_c('div',{staticClass:\"range-controls\"},[_c('el-input-number',{staticClass:\"filter-control\",attrs:{\"min\":0,\"step\":0.1,\"precision\":2,\"controls\":false,\"size\":\"small\"},model:{value:(_vm.filters.minPowerDissipation),callback:function ($$v) {_vm.$set(_vm.filters, \"minPowerDissipation\", $$v)},expression:\"filters.minPowerDissipation\"}}),_c('span',{staticClass:\"filter-sep\"},[_vm._v(\"-\")]),_c('el-input-number',{staticClass:\"filter-control\",attrs:{\"min\":0,\"step\":0.1,\"precision\":2,\"controls\":false,\"size\":\"small\"},model:{value:(_vm.filters.maxPowerDissipation),callback:function ($$v) {_vm.$set(_vm.filters, \"maxPowerDissipation\", $$v)},expression:\"filters.maxPowerDissipation\"}}),_c('div',{staticClass:\"filter-actions-inline\"},[_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\",\"aria-label\":\"执行筛选\"},on:{\"click\":_vm.handleSearchFilters}},[_vm._v(\"筛选查询\")]),_c('el-button',{attrs:{\"size\":\"small\",\"aria-label\":\"重置筛选\"},on:{\"click\":_vm.handleResetFilters}},[_vm._v(\"重置\")])],1)],1)])])]),_c('section',{staticClass:\"productList\"},[_c('el-table',{ref:\"machineTable\",staticClass:\"series-table\",staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.machineList,\"row-key\":\"id\",\"row-class-name\":_vm.handleGetRowClass,\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }}},[_c('el-table-column',{attrs:{\"width\":\"46\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-checkbox',{attrs:{\"disabled\":scope.row.saleState === 1 || scope.row.saleState === 2,\"title\":(scope.row.saleState === 1 || scope.row.saleState === 2) ? '该机器已售出或售出中,无法选择' : ''},on:{\"change\":checked => _vm.handleManualSelectFlat(scope.row, checked)},model:{value:(scope.row._selected),callback:function ($$v) {_vm.$set(scope.row, \"_selected\", $$v)},expression:\"scope.row._selected\"}})]}}])}),_c('el-table-column',{attrs:{\"prop\":\"theoryPower\",\"label\":\"理论算力\",\"header-align\":\"left\",\"align\":\"left\",\"show-overflow-tooltip\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.theoryPower).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.theoryPower).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.theoryPower).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.theoryPower).text))])],1),_vm._v(\" \"+_vm._s(scope.row.unit)+\" \")]}}])}),_c('el-table-column',{attrs:{\"header-align\":\"left\",\"align\":\"left\",\"show-overflow-tooltip\":\"\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_c('span',{staticClass:\"sortable\",class:{ active: _vm.activeSortField==='powerSort' },on:{\"click\":function($event){return _vm.handleToggleSort('powerSort')}}},[_vm._v(\" 实际算力 \"),_c('i',{staticClass:\"sort-arrow\",class:[(_vm.sortStates && _vm.sortStates.powerSort) ? 'asc' : 'desc', _vm.activeSortField==='powerSort' ? 'active' : '']})])]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.computingPower).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.computingPower).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.computingPower).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.computingPower).text))])],1),_vm._v(\" \"+_vm._s(scope.row.unit)+\" \")]}}])}),_c('el-table-column',{attrs:{\"prop\":\"powerDissipation\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_c('span',{staticClass:\"sortable\",class:{ active: _vm.activeSortField==='powerDissipationSort' },on:{\"click\":function($event){return _vm.handleToggleSort('powerDissipationSort')}}},[_vm._v(\" 功耗(kw/h) \"),_c('i',{staticClass:\"sort-arrow\",class:[(_vm.sortStates && _vm.sortStates.powerDissipationSort) ? 'asc' : 'desc', _vm.activeSortField==='powerDissipationSort' ? 'active' : '']})])]},proxy:true}])}),_c('el-table-column',{attrs:{\"prop\":\"algorithm\",\"label\":\"算法\",\"header-align\":\"left\",\"align\":\"left\"}}),_c('el-table-column',{attrs:{\"prop\":\"theoryIncome\",\"header-align\":\"left\",\"align\":\"left\",\"show-overflow-tooltip\":\"\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_vm._v(\" 单机理论收入(每日) \"),(_vm.getFirstCoinSymbol())?_c('span',[_vm._v(\"(\"+_vm._s(_vm.getFirstCoinSymbol())+\")\")]):_vm._e()]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.theoryIncome).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.theoryIncome).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.theoryIncome).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.theoryIncome).text))])],1)]}}])}),_c('el-table-column',{attrs:{\"prop\":\"theoryUsdtIncome\",\"label\":\"单机理论收入(每日/USDT)\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.theoryUsdtIncome).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.theoryUsdtIncome).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.theoryUsdtIncome).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.theoryUsdtIncome).text))])],1)]}}])}),_c('el-table-column',{attrs:{\"prop\":\"type\",\"label\":\"矿机型号\",\"header-align\":\"left\",\"align\":\"left\"}}),_c('el-table-column',{attrs:{\"label\":\"最大可租赁(天)\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(_vm.getRowMaxLeaseDays(scope.row)))]}}])}),_c('el-table-column',{attrs:{\"label\":\"租赁天数(天)\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input-number',{attrs:{\"min\":1,\"max\":_vm.getRowMaxLeaseDays(scope.row),\"step\":1,\"precision\":0,\"size\":\"mini\",\"disabled\":scope.row.saleState === 1 || scope.row.saleState === 2,\"controls-position\":\"right\"},on:{\"change\":val => _vm.handleLeaseDaysChange(scope.row, val)},model:{value:(scope.row.leaseTime),callback:function ($$v) {_vm.$set(scope.row, \"leaseTime\", $$v)},expression:\"scope.row.leaseTime\"}})]}}])}),_c('el-table-column',{attrs:{\"prop\":\"price\",\"header-align\":\"left\",\"align\":\"center\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_c('span',{staticClass:\"sortable\",class:{ active: _vm.activeSortField==='priceSort' },on:{\"click\":function($event){return _vm.handleToggleSort('priceSort')}}},[_vm._v(\" 单价 \"),(_vm.getPriceCoinSymbol())?_c('span',[_vm._v(\"(\"+_vm._s(_vm.getPriceCoinSymbol())+\")\")]):_vm._e(),_c('i',{staticClass:\"sort-arrow\",class:[(_vm.sortStates && _vm.sortStates.priceSort) ? 'asc' : 'desc', _vm.activeSortField==='priceSort' ? 'active' : '']})])]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).text))])],1)]}}])}),_c('el-table-column',{attrs:{\"prop\":\"saleState\",\"label\":\"售出状态\",\"width\":\"110\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.saleState === 0 ? 'info' : (scope.row.saleState === 1 ? 'danger' : 'warning')}},[_vm._v(\" \"+_vm._s(scope.row.saleState === 0 ? '未售出' : (scope.row.saleState === 1 ? '已售出' : '售出中'))+\" \")])]}}])})],1)],1),_c('div',{staticStyle:{\"margin\":\"18px\",\"text-align\":\"right\"}},[_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.handleOpenAddToCartDialog}},[_vm._v(\"加入购物车\")])],1),_c('el-dialog',{attrs:{\"visible\":_vm.confirmAddDialog.visible,\"width\":\"80vw\",\"title\":`确认加入购物车(共 ${_vm.confirmAddDialog.items.length} 台)`},on:{\"update:visible\":function($event){return _vm.$set(_vm.confirmAddDialog, \"visible\", $event)}},scopedSlots:_vm._u([{key:\"footer\",fn:function(){return [_c('el-button',{on:{\"click\":function($event){_vm.confirmAddDialog.visible = false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleConfirmAddSelectedToCart}},[_vm._v(\"确认加入\")])]},proxy:true}])},[_c('div',[_c('el-table',{attrs:{\"data\":_vm.confirmAddDialog.items,\"height\":\"360\",\"border\":\"\",\"stripe\":\"\",\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }}},[_c('el-table-column',{attrs:{\"prop\":\"theoryPower\",\"label\":\"理论算力\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.theoryPower).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.theoryPower).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.theoryPower).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.theoryPower).text))])],1),_vm._v(\" \"+_vm._s(scope.row.unit)+\" \")]}}])}),_c('el-table-column',{attrs:{\"label\":\"实际算力\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.computingPower).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.computingPower).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.computingPower).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.computingPower).text))])],1),_vm._v(\" \"+_vm._s(scope.row.unit)+\" \")]}}])}),_c('el-table-column',{attrs:{\"prop\":\"algorithm\",\"label\":\"算法\",\"width\":\"120\",\"header-align\":\"left\",\"align\":\"left\"}}),_c('el-table-column',{attrs:{\"prop\":\"powerDissipation\",\"label\":\"功耗(kw/h)\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"num-strong\"},[(_vm.formatNum6(scope.row.powerDissipation).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatNum6(scope.row.powerDissipation).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatNum6(scope.row.powerDissipation).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatNum6(scope.row.powerDissipation).text))])],1)]}}])}),_c('el-table-column',{attrs:{\"label\":\"租赁天数(天)\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(Number(scope.row.leaseTime || 1)))]}}])}),_c('el-table-column',{attrs:{\"prop\":\"price\",\"header-align\":\"left\",\"align\":\"left\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_vm._v(\" 单价 \"),(_vm.getPriceCoinSymbol())?_c('span',[_vm._v(\"(\"+_vm._s(_vm.getPriceCoinSymbol())+\")\")]):_vm._e()]},proxy:true},{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"price-strong\"},[(_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row.price, _vm.getRowCoin(scope.row)).text))])],1)]}}])})],1)],1)]),_c('el-row',{staticStyle:{\"margin-bottom\":\"20px\"}},[_c('el-col',{staticStyle:{\"display\":\"flex\",\"justify-content\":\"center\"},attrs:{\"span\":24}},[_c('el-pagination',{staticStyle:{\"margin\":\"0 auto\",\"margin-top\":\"10px\"},attrs:{\"current-page\":_vm.currentPage,\"page-sizes\":_vm.pageSizes,\"page-size\":_vm.params.pageSize,\"layout\":\"total, sizes, prev, pager, next, jumper\",\"total\":_vm.total},on:{\"size-change\":_vm.handleSizeChange,\"current-change\":_vm.handleCurrentChange,\"update:currentPage\":function($event){_vm.currentPage=$event},\"update:current-page\":function($event){_vm.currentPage=$event}}})],1)],1)],1):_c('div',{staticClass:\"not-found\"},[_c('h2',[_vm._v(\"商品不存在\")]),_c('p',[_vm._v(\"抱歉,您查找的商品不存在或已被删除。\")]),_c('button',{staticClass:\"back-btn\",on:{\"click\":_vm.handleBack}},[_vm._v(\"返回商品列表\")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @file 路由配置文件\n * @description 定义所有电商页面的路由配置\n */\n\n// 商品相关路由\nexport const productRoutes = [\n {\n path: '/productList',\n name: 'productList',\n \n component: () => import('../views/productList/index.vue'),\n meta: {\n title: '商品列表',\n description: '浏览所有可用商品',\n allAuthority: ['all']\n }\n },\n {\n path: '/product/:id',\n name: 'productDetail',\n component: () => import('../views/productDetail/index.vue'),\n meta: {\n title: '商品详情',\n description: '查看商品详细信息',\n allAuthority: ['all']\n }\n }\n]\n\n// 购物车相关路由\nexport const cartRoutes = [\n {\n path: '/cart',\n name: 'cart',\n component: () => import('../views/cart/index.vue'),\n meta: {\n title: '购物车',\n description: '管理购物车商品',\n allAuthority: ['all']\n }\n }\n]\n\n// 结算相关路由\nexport const checkoutRoutes = [\n {\n path: '/checkout',\n name: 'checkout',\n component: () => import('../views/checkout/index.vue'),\n meta: {\n title: '订单结算',\n description: '完成订单结算',\n allAuthority: ['all']\n }\n }\n]\n\n// 个人中心相关路由\nexport const accountRoutes = [\n {\n path: '/account',\n name: 'account',\n component: () => import('../views/account/index.vue'),\n redirect: '/account/shops',\n meta: {\n title: '个人中心',\n description: '管理个人资料和店铺',\n allAuthority: ['all']\n },\n children: [\n {\n path: 'wallet',\n name: 'Wallet',\n component: () => import('../views/account/wallet.vue'),\n meta: {\n title: '我的钱包',\n description: '查看钱包余额、充值和提现',\n allAuthority: ['all']\n }\n },\n {//充值记录\n path: 'rechargeRecord',\n name: 'RechargeRecord',\n component: () => import('../views/account/rechargeRecord.vue'),\n meta: {\n title: '充值记录',\n description: '查看充值记录',\n allAuthority: ['all']\n }\n },\n {//提现记录\n path: 'withdrawalHistory',\n name: 'WithdrawalHistory',\n component: () => import('../views/account/withdrawalHistory.vue'),\n meta: {\n title: '提现记录',\n description: '查看提现记录',\n allAuthority: ['all']\n }\n },\n {\n path: 'receipt-record',\n name: 'accountReceiptRecord',\n component: () => import('../views/account/receiptRecord.vue'),\n meta: {\n title: '收款记录',\n description: '卖家收款流水记录',\n allAuthority: ['all']\n }\n },\n {\n path: 'shop-new',\n name: 'accountShopNew',\n component: () => import('../views/account/shopNew.vue'),\n meta: {\n title: '新增店铺',\n description: '创建新的店铺',\n allAuthority: ['all']\n }\n },\n {\n path: 'shop-config',\n name: 'accountShopConfig',\n component: () => import('../views/account/shopConfig.vue'),\n meta: {\n title: '钱包绑定',\n description: '绑定店铺收款钱包',\n allAuthority: ['all']\n }\n },\n {\n path: 'shops',\n name: 'accountMyShops',\n component: () => import('../views/account/myShops.vue'),\n meta: {\n title: '我的店铺',\n description: '查看我的店铺信息',\n allAuthority: ['all']\n }\n },\n {\n path: 'product-new',\n name: 'accountProductNew',\n component: () => import('../views/account/productNew.vue'),\n meta: {\n title: '新增商品',\n description: '创建新的商品',\n allAuthority: ['all']\n }\n },\n {\n path: 'products',\n name: 'accountProducts',\n component: () => import('../views/account/products.vue'),\n meta: {\n title: '商品列表',\n description: '管理店铺下的商品列表',\n allAuthority: ['all']\n }\n },\n {\n path: 'purchased',\n name: 'accountPurchased',\n component: () => import('../views/account/purchased.vue'),\n meta: {\n title: '已购商品',\n description: '查看已购买的商品列表',\n allAuthority: ['all']\n }\n },\n {\n path: 'funds-flow',\n name: 'accountFundsFlow',\n component: () => import('../views/account/fundsFlow.vue'),\n meta: {\n title: '资金流水',\n description: '充值/提现/消费记录切换查看',\n allAuthority: ['all']\n }\n },\n {\n path: 'purchased-detail/:id',\n name: 'PurchasedDetail',\n component: () => import('../views/account/purchasedDetail.vue'),\n meta: {\n title: '已购商品详情',\n description: '查看已购商品详细信息',\n allAuthority: ['all']\n }\n },\n {\n path: 'orders',\n name: 'accountOrders',\n component: () => import('../views/account/orders.vue'),\n meta: {\n title: '订单列表',\n description: '查看与管理订单(按状态筛选)',\n allAuthority: ['all']\n }\n },\n {\n path: 'seller-orders',\n name: 'accountSellerOrders',\n component: () => import('../views/account/SellerOrders.vue'),\n meta: {\n title: '已售出订单',\n description: '卖家侧订单列表',\n allAuthority: ['all']\n }\n },\n {\n path: 'order-detail/:id',\n name: 'accountOrderDetail',\n component: () => import('../views/account/orderDetail.vue'),\n meta: {\n title: '订单详情',\n description: '查看订单详细信息',\n allAuthority: ['all']\n }\n },\n {\n path: 'product-detail/:id',\n name: 'accountProductDetail',\n component: () => import('../views/account/productDetail.vue'),\n meta: {\n title: '商品详情',\n description: '个人中心 - 商品详情',\n allAuthority: ['all']\n }\n },\n {\n path: 'product-machine-add',\n name: 'accountProductMachineAdd',\n component: () => import('../views/account/productMachineAdd.vue'),\n meta: {\n title: '添加出售机器',\n description: '为商品添加出售机器',\n allAuthority: ['all']\n }\n }\n ]\n }\n]\n\n// 所有子路由\nexport const childrenRoutes = [\n ...productRoutes,\n ...cartRoutes,\n ...checkoutRoutes,\n ...accountRoutes\n]\n\n// 主路由配置\nexport const mainRoutes = [\n {\n path: '/',\n name: 'Home',\n component: () => import('../Layout/idnex.vue'),\n redirect: '/productList',\n children: childrenRoutes\n },\n // 404页面重定向到商品列表\n {\n path: '*',\n redirect: '/productList'\n }\n]\n\nexport default mainRoutes ","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=59d86c16&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=js\"\nexport * from \"./index.vue?vue&type=script&lang=js\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=59d86c16&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"59d86c16\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SellerOrders.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SellerOrders.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./SellerOrders.vue?vue&type=template&id=c4d1af58&scoped=true\"\nimport script from \"./SellerOrders.vue?vue&type=script&lang=js\"\nexport * from \"./SellerOrders.vue?vue&type=script&lang=js\"\nimport style0 from \"./SellerOrders.vue?vue&type=style&index=0&id=c4d1af58&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c4d1af58\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=639b0fc8&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=js\"\nexport * from \"./index.vue?vue&type=script&lang=js\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=639b0fc8&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"639b0fc8\",\n null\n \n)\n\nexport default component.exports","import request from '../utils/request'\r\n\r\n//创建订单及订单详情\r\nexport function addOrders(data) {\r\n return request({\r\n url: `/lease/order/info/addOrders`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//取消订单\r\nexport function cancelOrder(data) {\r\n return request({\r\n url: `/lease/order/info/cancelOrder`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n\r\n //根据订单id查询订单信息\r\nexport function getOrdersByIds(data) {\r\n return request({\r\n url: `/lease/order/info/getOrdersByIds`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n \r\n //查询订单列表(买家侧)\r\nexport function getOrdersByStatus(data) {\r\n return request({\r\n url: `/lease/order/info/getOrdersByStatus`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n //查询订单列表(卖家侧)\r\nexport function getOrdersByStatusForSeller(data) {\r\n return request({\r\n url: `/lease/order/info/getOrdersByStatusForSeller`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n\r\n //结算前链和币种查询\r\nexport function getChainAndListForSeller(data) {\r\n return request({\r\n url: `/lease/shop/getChainAndListForSeller`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n //获取实时币价\r\n export function getCoinPrice(data) {\r\n return request({\r\n url: `/lease/order/info/getCoinPrice`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./orderDetail.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./orderDetail.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./orderDetail.vue?vue&type=template&id=613e4d6c&scoped=true\"\nimport script from \"./orderDetail.vue?vue&type=script&lang=js\"\nexport * from \"./orderDetail.vue?vue&type=script&lang=js\"\nimport style0 from \"./orderDetail.vue?vue&type=style&index=0&id=613e4d6c&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"613e4d6c\",\n null\n \n)\n\nexport default component.exports","\nimport { getProductById } from '../../utils/productService'\nimport { addToCart } from '../../utils/cartManager'\nimport { getMachineInfo, getPayTypes } from '../../api/products'\nimport { addCart, getGoodsList } from '../../api/shoppingCart'\nimport { truncateAmountByCoin, truncateTo6 } from '../../utils/amount'\n\nexport default {\n name: 'ProductDetail',\n data() {\n return {\n product: null,\n loading: false,\n // 默认展开的行keys\n expandedRowKeys: [],\n selectedMap: {},\n // 新接口:单层矿机列表 & 支付方式\n machineList: [],\n paymentMethodList: [],\n // 筛选状态\n selectedPayKey: null,\n filters: {\n chain: '',\n coin: '',\n minPrice: null,\n maxPrice: null,\n minPower: null,\n maxPower: null,\n minPowerDissipation: null,\n maxPowerDissipation: null,\n unit: 'GH/S'\n },\n // 实际算力单位选项\n powerUnitOptions: ['KH/S', 'MH/S', 'GH/S', 'TH/S', 'PH/S'],\n // 排序状态:true 升序,false 降序\n sortStates: {\n priceSort: true,\n powerSort: true,\n powerDissipationSort: true\n },\n // 当前激活的排序字段(仅当用户点击后才会传参)\n activeSortField: '',\n // 首次进入时是否已按价格币种设置过支付方式筛选默认值\n payFilterDefaultApplied: false,\n params: {\n id: \"\",\n pageNum: 1,\n pageSize: 10,\n\n\n },\n confirmAddDialog: {\n visible: false,\n items: []\n },\n // 购物车中已存在的当前商品机器集合:id 与 user|miner 组合键\n cartMachineIdSet: new Set(),\n cartCompositeKeySet: new Set(),\n cartLoaded: false,\n machinesLoaded: false,\n /**\n * 可展开的产品系列数据\n * 每个系列(group)包含多个可选条目(variants)\n */\n productListData: [\n // {\n // id: 'grp-1',\n // group: 'A系列',\n // summary: {\n // theoryPower: '56T',\n // computingPower: '54T',\n // powerDissipation: '3200W',\n // algorithm: 'power',\n // type: 'A-Pro',\n // count: 3,\n // price: '¥1000+'\n // },\n // variants: [\n // { id: 'A-1', model: 'A1', theoryPower: '14T', computingPower: '13.5T', powerDissipation: '780W', algorithm: 'power', stock: 50, price: 999, quantity: 1 },\n // { id: 'A-2', model: 'A2', theoryPower: '18T', computingPower: '17.2T', powerDissipation: '900W', algorithm: 'power', stock: 40, price: 1299, quantity: 1 },\n // { id: 'A-3', model: 'A3', theoryPower: '24T', computingPower: '23.1T', powerDissipation: '1520W', algorithm: 'power', stock: 30, price: 1699, quantity: 1 }\n // ]\n // },\n // {\n // id: 'grp-2',\n // group: 'B系列',\n // summary: {\n // theoryPower: '72T',\n // computingPower: '70T',\n // powerDissipation: '4100W',\n // algorithm: 'power',\n // type: 'B-Max',\n // count: 2,\n // price: '¥2000+'\n // },\n // variants: [\n // { id: 'B-1', model: 'B1', theoryPower: '32T', computingPower: '31.2T', powerDissipation: '1800W', algorithm: 'power', stock: 28, price: 2199, quantity: 1 },\n // { id: 'B-2', model: 'B2', theoryPower: '40T', computingPower: '38.8T', powerDissipation: '2300W', algorithm: 'power', stock: 18, price: 2699, quantity: 1 }\n // ]\n // }\n ],\n tableData: [\n // {\n // theoryPower: \"55656\",//理论算力\n // computingPower: \"44545\",//实际算力\n // powerDissipation: \"5565\",//功耗\n // algorithm: \"power\",//算法\n // type: \"型号1\",//矿机型号\n // number:2001, \n // cost:\"1000\",//价格 \n // },\n // {\n // theoryPower: \"55656\",//理论算力\n // computingPower: \"44545\",//实际算力\n // powerDissipation: \"5565\",//功耗\n // algorithm: \"power\",//算法\n // type: \"型号1\",//矿机型号\n // number:2001, \n // cost:\"1000\",//价格 \n // },\n // {\n // theoryPower: \"55656\",//理论算力\n // computingPower: \"44545\",//实际算力\n // powerDissipation: \"5565\",//功耗\n // algorithm: \"power\",//算法\n // type: \"型号1\",//矿机型号\n // number:2001, \n // cost:\"1000\",//价格 \n // },\n // {\n // theoryPower: \"55656\",//理论算力\n // computingPower: \"44545\",//实际算力\n // powerDissipation: \"5565\",//功耗\n // algorithm: \"power\",//算法\n // type: \"型号1\",//矿机型号\n // number:2001, \n // cost:\"1000\",//价格 \n // },\n\n ],\n productDetailLoading: false,\n pageSizes: [10, 20, 50],\n currentPage: 1,\n total: 0,\n \n\n }\n },\n mounted() {\n if (this.$route.params.id) {\n this.params.id = this.$route.params.id\n this.product = true\n // 默认展开第一行\n if (this.productListData && this.productListData.length) {\n this.expandedRowKeys = [this.productListData[0].id]\n }\n this.fetchGetMachineInfo(this.params)//priceSort 价格,powerSort 算力,功耗powerDissipationSort 布尔类型,true 升序,false降序\n this.fetchPayTypes()\n } else {\n this.$message.error('商品不存在')\n this.product = false\n }\n this.fetchGetGoodsList()\n },\n methods: {\n // 行币种:优先行内 payCoin > coin,其次取全局表头币种\n getRowCoin(row) {\n try {\n const c = (row && (row.payCoin || row.coin)) || this.getPriceCoinSymbol() || ''\n return String(c).toUpperCase()\n } catch (e) { return '' }\n },\n // 金额格式化:不补0、不四舍五入;返回 {text,truncated,full}\n formatAmount(value, coin) {\n return truncateAmountByCoin(value, coin)\n },\n // 数值格式化:最多6位小数,截断不补0\n formatNum6(value) {\n return truncateTo6(value)\n },\n /**\n * 首次加载时,将“支付方式筛选”的默认选中值设为与价格列币种一致,\n * 并同步 filters.chain/filters.coin;仅执行一次,不触发额外查询。\n */\n ensureDefaultPayFilterSelection() {\n try {\n if (this.payFilterDefaultApplied) return\n const payList = Array.isArray(this.paymentMethodList) ? this.paymentMethodList : []\n if (!payList.length) return\n const coinSymbol = (this.getPriceCoinSymbol && this.getPriceCoinSymbol()) || ''\n if (!coinSymbol) return\n const hit = payList.find(it => String(it && it.payCoin).toUpperCase() === String(coinSymbol).toUpperCase())\n if (!hit) return\n const key = `${hit.payChain || ''}|${hit.payCoin || ''}`\n this.selectedPayKey = key\n this.filters.chain = String(hit.payChain || '').trim()\n this.filters.coin = String(hit.payCoin || '').trim()\n this.payFilterDefaultApplied = true\n } catch (e) { /* noop */ }\n },\n // 切换排序:field in ['priceSort','powerSort','powerDissipationSort']\n handleToggleSort(field) {\n try {\n if (!this.sortStates) this.sortStates = {}\n if (this.activeSortField !== field) {\n // 切换到新的字段:默认从升序开始(true)\n // 先将其它字段复位为升序(▲)\n Object.keys(this.sortStates).forEach(k => { this.sortStates[k] = true })\n this.activeSortField = field\n // 后端默认升序,首次点击应为降序\n this.sortStates[field] = false\n } else {\n // 同一字段:升降序切换\n this.sortStates[field] = !this.sortStates[field]\n }\n const params = this.buildQueryParams()\n this.fetchGetMachineInfo(params)\n } catch (e) { /* noop */ }\n },\n // 组合查询参数(带上商品 id 与筛选条件)\n buildQueryParams() {\n const q = { id: this.params.id }\n // 分页参数始终透传\n try {\n if (this.params && this.params.pageNum != null) q.pageNum = this.params.pageNum\n if (this.params && this.params.pageSize != null) q.pageSize = this.params.pageSize\n } catch (e) { /* noop */ }\n // 仅当用户真实填写(>0)时才传参;默认/空值不传\n const addNum = (obj, key, name) => {\n const raw = obj[key]\n if (raw === null || raw === undefined || raw === '') return\n const n = Number(raw)\n if (Number.isFinite(n) && n > 0) q[name] = n\n }\n // 支付方式条件:有值才传\n if (this.filters.chain && String(this.filters.chain).trim()) q.chain = String(this.filters.chain).trim()\n if (this.filters.coin && String(this.filters.coin).trim()) q.coin = String(this.filters.coin).trim()\n if (this.filters.unit && String(this.filters.unit).trim()) q.unit = String(this.filters.unit).trim()\n addNum(this.filters, 'minPrice', 'minPrice')\n addNum(this.filters, 'maxPrice', 'maxPrice')\n addNum(this.filters, 'minPower', 'minPower')\n addNum(this.filters, 'maxPower', 'maxPower')\n addNum(this.filters, 'minPowerDissipation', 'minPowerDissipation')\n addNum(this.filters, 'maxPowerDissipation', 'maxPowerDissipation')\n // 排序参数:仅在用户点击某一列后传当前列\n try {\n if (this.activeSortField) {\n const s = this.sortStates || {}\n q[this.activeSortField] = !!s[this.activeSortField]\n }\n } catch (e) { /* noop */ }\n return q\n },\n // 拉取支付方式\n async fetchPayTypes() {\n try {\n const res = await getPayTypes({ productId: this.params.id })\n // 接口示例:{ code: 0, data: [ { payChain, payCoin, payCoinImage, shopId } ], msg: '' }\n if (res && (res.code === 0 || res.code === 200)) {\n const list = Array.isArray(res.data) ? res.data : []\n this.paymentMethodList = list\n // 支付方式加载后尝试设置默认筛选\n this.ensureDefaultPayFilterSelection()\n }\n } catch (e) {\n // 忽略错误,保持页面可用\n this.paymentMethodList = []\n }\n },\n\n async fetchGetMachineInfo(params) {\n this.productDetailLoading = true\n const res = await getMachineInfo(params)\n console.log(res)\n if (res && res.code === 200) {\n console.log(res.data, 'res.rows');\n this.total = res.total||0;\n // 新数据结构:机器为扁平 rows 列表;仅当后端返回有效支付方式时才覆盖,避免清空 getPayTypes 的结果\n try {\n const payList = res && res.data && res.data.payConfigList\n if (Array.isArray(payList) && payList.length) {\n this.paymentMethodList = payList\n }\n } catch (e) { /* keep existing paymentMethodList */ }\n const rows = (res && res.data && (res.data.rows || res.data.list)) || (res && res.rows) || []\n const normalized = (Array.isArray(rows) ? rows : []).map((m, idx) => ({\n ...m,\n id: m && (m.id !== undefined && m.id !== null) ? m.id : `m-${idx}`,\n leaseTime: (m && m.leaseTime && Number(m.leaseTime) > 0) ? Number(m.leaseTime) : 1,\n _selected: false\n }))\n this.machineList = normalized\n // 清空旧的两层结构数据,避免误用\n this.productListData = []\n this.expandedRowKeys = []\n // 机器加载后尝试设置默认筛选\n this.ensureDefaultPayFilterSelection()\n this.$nextTick(() => {\n this.machinesLoaded = true\n })\n }\n\n this.productDetailLoading = false\n },\n /**\n * 加载商品详情\n */\n async loadProduct() {\n try {\n this.loading = true\n const productId = this.$route.params.id\n this.product = await getProductById(productId)\n\n if (!this.product) {\n this.$message({\n message: '商品不存在',\n type: 'error',\n showClose: true\n })\n }\n } catch (error) {\n console.error('加载商品详情失败:', error)\n this.$message({\n message: '加载商品详情失败,请稍后重试',\n type: 'error',\n showClose: true\n })\n } finally {\n this.loading = false\n }\n },\n //加入购物车\n async fetchAddCart(params) {\n const res = await addCart(params)\n\n return res\n },\n //查询购物车列表\n async fetchGetGoodsList(params) {\n const res = await getGoodsList(params)\n // 统计当前商品在购物车中已有的机器ID,用于禁用和默认勾选\n try {\n const productId = this.params && this.params.id ? Number(this.params.id) : Number(this.$route.params.id)\n // 兼容两种返回结构:1) 旧:直接是商品分组数组 2) 新:店铺数组 → shoppingCartInfoDtoList\n const rawRows = Array.isArray(res && res.rows)\n ? res.rows\n : Array.isArray(res && res.data && res.data.rows)\n ? res.data.rows\n : Array.isArray(res && res.data)\n ? res.data\n : []\n // 扁平化为商品分组\n const groups = rawRows.length && rawRows[0] && Array.isArray(rawRows[0].shoppingCartInfoDtoList)\n ? rawRows.flatMap(shop => Array.isArray(shop.shoppingCartInfoDtoList) ? shop.shoppingCartInfoDtoList : [])\n : rawRows\n const matched = groups.filter(g => Number(g.productId) === productId)\n const ids = new Set()\n const compositeKeys = new Set()\n matched.forEach(r => {\n const list = Array.isArray(r.productMachineDtoList) ? r.productMachineDtoList : []\n list.forEach(m => {\n if (!m) return\n if (m.id !== undefined && m.id !== null) ids.add(String(m.id))\n if (m.user && m.miner) compositeKeys.add(`${String(m.user)}|${String(m.miner)}`)\n })\n })\n this.cartMachineIdSet = ids\n this.cartCompositeKeySet = compositeKeys\n // 计算购物车总数量并通知头部,避免页面初次加载时徽标显示为0\n try {\n const totalCount = groups.reduce((sum, g) => sum + (Array.isArray(g && g.productMachineDtoList) ? g.productMachineDtoList.length : 0), 0)\n if (Number.isFinite(totalCount)) {\n window.dispatchEvent(new CustomEvent('cart-updated', { detail: { count: totalCount } }))\n }\n } catch (e) { /* noop */ }\n // 展开表格渲染后,默认勾选并禁用这些行\n this.$nextTick(() => {\n this.cartLoaded = true\n this.autoSelectAndDisable()\n })\n } catch (e) {\n console.warn('解析购物车数据失败', e)\n }\n },\n\n /**\n * 处理返回\n */\n handleBack() {\n this.$router.push('/productList')\n },\n\n\n\n /**\n * 点击系列行:切换展开/收起\n * @param {Object} row - 当前行\n */\n handleSeriesRowClick(row) {\n const key = row.id\n const lockedIds = Object.keys(this.selectedMap).filter(k => (this.selectedMap[k] || []).length > 0)\n const opened = this.expandedRowKeys.includes(key)\n if (opened) {\n // 关闭当前行,仅保留已勾选的行展开\n this.expandedRowKeys = lockedIds\n } else {\n // 打开当前行,同时保留已勾选的行展开\n this.expandedRowKeys = Array.from(new Set([key, ...lockedIds]))\n }\n },\n\n /**\n * 外层系列行样式\n */\n handleGetSeriesRowClassName() {\n return 'series-clickable-row'\n },\n\n // 子表选择变化\n handleInnerSelectionChange(parentRow, selections) {\n const key = parentRow.id\n this.$set(this.selectedMap, key, selections)\n const lockedIds = Object.keys(this.selectedMap).filter(k => (this.selectedMap[k] || []).length > 0)\n // 更新展开:锁定的行始终展开\n const openedSet = new Set(this.expandedRowKeys)\n lockedIds.forEach(id => openedSet.add(id))\n // 清理不再勾选且不是当前展开的行\n this.expandedRowKeys = Array.from(openedSet).filter(id => lockedIds.includes(id) || id === key || this.expandedRowKeys.includes(id))\n },\n\n // 展开行变化时:已取消自动与购物车对比,无需勾选/禁用\n handleExpandChange(row, expandedRows) {\n // no-op\n },\n\n // 已取消对比购物车的自动勾选/禁用逻辑\n autoSelectAndDisable() { },\n\n // 选择器可选控制:已在购物车中的机器不可再选\n isSelectable(row, index) {\n // 不再通过 selectable 禁用,以便勾选可见;通过行样式和交互阻止点击\n return true\n },\n\n // 判断在特定父行下是否已选择(配合自定义checkbox使用)\n isSelectedByParent(parentRow, row) {\n const key = parentRow && parentRow.id\n const list = (key && this.selectedMap[key]) || []\n return !!list.find(it => it && it.id === row.id)\n },\n\n // 手动切换选择(自定义checkbox与 selectedMap 同步),并维护每行的 _selected 状态\n handleManualSelect(parentRow, row, checked) {\n // 禁用:已售出或售出中的机器不可选择\n if (row && (row.saleState === 1 || row.saleState === 2)) {\n this.$message.warning('该机器已售出或售出中,无法选择')\n this.$set(row, '_selected', false)\n return\n }\n const key = parentRow.id\n const list = (this.selectedMap[key] && [...this.selectedMap[key]]) || []\n const idx = list.findIndex(it => it && it.id === row.id)\n if (checked && idx === -1) list.push(row)\n if (!checked && idx > -1) list.splice(idx, 1)\n this.$set(this.selectedMap, key, list)\n this.$set(row, '_selected', !!checked)\n },\n\n // 为子表中已在购物车的行添加只读样式,并阻止点击取消\n handleGetInnerRowClass({ row }) {\n if (!row) return ''\n return (row.saleState === 1 || row.saleState === 2) ? 'sold-row' : ''\n },\n\n /**\n * 子行:减少数量\n * @param {number} groupIndex - 系列索引\n * @param {number} variantIndex - 变体索引\n */\n handleDecreaseVariantQuantity(groupIndex, variantIndex) {\n const item = this.productListData[groupIndex].variants[variantIndex]\n if (item.quantity > 1) {\n item.quantity--\n }\n },\n\n /**\n * 子行:增加数量\n * @param {number} groupIndex - 系列索引\n * @param {number} variantIndex - 变体索引\n */\n handleIncreaseVariantQuantity(groupIndex, variantIndex) {\n const item = this.productListData[groupIndex].variants[variantIndex]\n if (item.quantity < 99) {\n item.quantity++\n }\n },\n\n /**\n * 子行:输入数量校验\n * @param {number} groupIndex - 系列索引\n * @param {number} variantIndex - 变体索引\n */\n handleVariantQuantityInput(groupIndex, variantIndex) {\n const item = this.productListData[groupIndex].variants[variantIndex]\n const q = Number(item.quantity)\n if (!q || q < 1) item.quantity = 1\n if (q > 99) item.quantity = 99\n },\n\n /**\n * 子行:加入购物车\n * @param {Object} variant - 子项行数据\n */\n handleAddVariantToCart(variant) {\n if (!variant || !variant.onlyKey) return\n try {\n addToCart({\n id: variant.onlyKey,\n title: variant.model,\n price: variant.price,\n quantity: variant.quantity\n })\n this.$message.success(`已添加 ${variant.quantity} 件 ${variant.model} 到购物车`)\n variant.quantity = 1\n } catch (error) {\n console.error('添加到购物车失败:', error)\n\n }\n },\n // 统一加入购物车\n handleAddSelectedToCart() {\n const allSelected = Object.values(this.selectedMap).flat().filter(Boolean)\n if (!allSelected.length) {\n this.$message.warning('请先勾选至少一台矿机')\n return\n }\n try {\n allSelected.forEach(item => {\n addToCart({\n id: item.onlyKey || item.id,\n title: item.type || item.model || '矿机',\n price: item.price,\n quantity: 1,\n leaseTime: Number(item.leaseTime || 1)\n })\n })\n this.$message.success(`已加入 ${allSelected.length} 台矿机到购物车`)\n this.selectedMap = {}\n } catch (e) {\n console.error('统一加入购物车失败', e)\n\n }\n },\n // 打开确认弹窗:以当前界面勾选(_selected)为准,并在打开后清空左侧勾选状态\n handleOpenAddToCartDialog() {\n // 扫描当前所有系列下被勾选的机器\n const groups = Array.isArray(this.productListData) ? this.productListData : []\n const pickedAll = groups.flatMap(g => Array.isArray(g.productMachines) ? g.productMachines.filter(m => !!m && !!m._selected) : [])\n const picked = pickedAll.filter(m => m && (m.saleState === 0 || m.saleState === undefined || m.saleState === null))\n if (!picked.length) {\n this.$message.warning('请先勾选至少一台矿机')\n return\n }\n if (picked.length < pickedAll.length) {\n this.$message.warning('部分机器已售出或售出中,已自动为您排除')\n }\n // 使用弹窗中的固定快照,避免后续清空勾选影响弹窗显示\n this.confirmAddDialog.items = picked.slice()\n this.confirmAddDialog.visible = true\n // 打开后立即把左侧复选框清空,避免“勾选了两个但弹窗只有一条”的不一致问题\n this.$nextTick(() => {\n try { this.clearAllSelections() } catch (e) { /* noop */ }\n })\n },\n // 确认加入:调用后端购物车接口,传入裸数组 [{ productId, productMachineId }]\n async handleConfirmAddSelectedToCart() {\n // 以弹窗中的列表为准,避免与左侧勾选状态不一致\n const allSelected = Array.isArray(this.confirmAddDialog.items) ? this.confirmAddDialog.items.filter(Boolean) : []\n if (!allSelected.length) {\n this.$message.warning('请先勾选至少一台矿机')\n return\n }\n\n const productId = this.params && this.params.id ? this.params.id : (this.$route && this.$route.params && this.$route.params.id)\n if (!productId) {\n this.$message.error('商品ID缺失,无法加入购物车')\n return\n }\n\n // 裸数组,仅包含后端要求的两个字段\n const payload = allSelected.map(item => ({\n productId: productId,\n productMachineId: item.id,\n leaseTime: Number(item.leaseTime || 1)\n }))\n\n try {\n const res = await this.fetchAddCart(payload)\n // 若后端返回码存在,这里做一下兜底提示\n if (!res || (res.code && Number(res.code) !== 200)) {\n this.$message.error(res && res.msg ? res.msg : '加入购物车失败,请稍后重试')\n return\n }\n // 立即本地更新禁用状态:把刚加入的机器ID合并进本地集合\n try {\n allSelected.forEach(item => {\n if (item && item.id) this.cartMachineIdSet.add(item.id)\n this.$set(item, '_selected', false)\n this.$set(item, '_inCart', true)\n if (!item.leaseTime || Number(item.leaseTime) <= 0) this.$set(item, 'leaseTime', 1)\n })\n this.$nextTick(() => this.autoSelectAndDisable())\n } catch (e) { /* noop */ }\n\n this.$message({\n message: `已加入 ${allSelected.length} 台矿机到购物车`,\n type: 'success',\n duration: 3000,\n showClose: true,\n });\n\n this.confirmAddDialog.visible = false\n // 清空选中映射,然后重新加载数据(数据加载时会自动设置 _selected: false)\n this.selectedMap = {}\n // 重新加载机器信息和购物车数据\n this.fetchGetMachineInfo(this.params)\n this.fetchGetGoodsList()\n // 通知头部刷新服务端购物车数量\n try {\n // 如果没有传数量,header 会主动拉取服务端数量\n window.dispatchEvent(new CustomEvent('cart-updated'))\n } catch (e) { /* noop */ }\n\n } catch (e) {\n console.error('加入购物车失败: ', e)\n this.$message.error('加入购物车失败,请稍后重试')\n }\n },\n\n // 取消所有商品勾选(内层表格的自定义 checkbox)\n clearAllSelections() {\n try {\n // 清空选中映射(遗留字段)\n this.selectedMap = {}\n if (Array.isArray(this.machineList) && this.machineList.length) {\n this.machineList.forEach(m => { if (m) this.$set(m, '_selected', false) })\n return\n }\n const groups = Array.isArray(this.productListData) ? this.productListData : []\n groups.forEach(g => {\n const list = Array.isArray(g.productMachines) ? g.productMachines : []\n list.forEach(m => { if (m) this.$set(m, '_selected', false) })\n })\n } catch (e) { /* noop */ }\n },\n\n /**\n * 减少数量\n * @param {number} rowIndex - 表格行索引\n */\n handleDecreaseQuantity(rowIndex) {\n if (this.tableData[rowIndex].quantity > 1) {\n this.tableData[rowIndex].quantity--\n }\n },\n\n /**\n * 增加数量\n * @param {number} rowIndex - 表格行索引\n */\n handleIncreaseQuantity(rowIndex) {\n if (this.tableData[rowIndex].quantity < 99) {\n this.tableData[rowIndex].quantity++\n }\n },\n\n /**\n * 处理数量输入\n * @param {number} rowIndex - 表格行索引\n */\n handleQuantityInput(rowIndex) {\n const quantity = this.tableData[rowIndex].quantity\n if (quantity < 1) {\n this.tableData[rowIndex].quantity = 1\n } else if (quantity > 99) {\n this.tableData[rowIndex].quantity = 99\n }\n },\n\n /**\n * 处理数量输入框失焦\n * @param {number} rowIndex - 表格行索引\n */\n handleQuantityBlur(rowIndex) {\n const quantity = this.tableData[rowIndex].quantity\n if (!quantity || quantity < 1) {\n this.tableData[rowIndex].quantity = 1\n } else if (quantity > 99) {\n this.tableData[rowIndex].quantity = 99\n }\n },\n\n /**\n * 添加到购物车\n * @param {Object} rowData - 表格行数据\n */\n handleAddToCart(rowData) {\n if (!rowData || rowData.quantity < 1) {\n this.$message.warning('请选择有效的数量')\n return\n }\n\n try {\n addToCart({\n id: rowData.date, // 使用矿机名称作为ID\n title: rowData.date,\n price: rowData.price,\n quantity: rowData.quantity,\n leaseTime: Number(rowData.leaseTime || 1)\n })\n\n this.$message.success(`已添加 ${rowData.quantity} 件 ${rowData.date} 到购物车`)\n\n // 重置数量\n rowData.quantity = 1\n } catch (error) {\n console.error('添加到购物车失败:', error)\n this.$message.error('添加到购物车失败,请稍后重试')\n }\n },\n handleSizeChange(val) {\n console.log(`每页 ${val} 条`);\n this.params.pageSize = val;\n this.params.pageNum = 1;\n this.currentPage = 1;\n // 携带当前激活的排序字段\n this.fetchGetMachineInfo(this.buildQueryParams());\n \n },\n handleCurrentChange(val) {\n console.log(`当前页: ${val}`);\n this.params.pageNum = val;\n // 携带当前激活的排序字段\n this.fetchGetMachineInfo(this.buildQueryParams());\n },\n }\n}","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"purchased-detail-page\"},[_c('h2',{staticClass:\"title\"},[_vm._v(\"已购商品详情\")]),(_vm.loading)?_c('div',{staticClass:\"loading\"},[_vm._v(\"加载中...\")]):_c('div',[_c('el-card',{staticClass:\"section\"},[_c('div',{staticClass:\"sub-title\"},[_vm._v(\"基本信息\")]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"用户:\")]),_c('span',{staticClass:\"value mono\"},[_vm._v(_vm._s(_vm.detail.userId || '—'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"订单项ID:\")]),_c('span',{staticClass:\"value mono\"},[_vm._v(_vm._s(_vm.detail.orderItemId || '—'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"机器ID:\")]),_c('span',{staticClass:\"value mono\"},[_vm._v(_vm._s(_vm.detail.productMachineId || '—'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"商品类型:\")]),_c('span',{staticClass:\"value\"},[_c('el-tag',{attrs:{\"type\":_vm.detail.type === 1 ? 'success' : 'info'}},[_vm._v(\" \"+_vm._s(_vm.detail.type === 1 ? \"算力套餐\" : \"挖矿机器\")+\" \")])],1)]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"状态:\")]),_c('span',{staticClass:\"value\"},[_c('el-tag',{attrs:{\"type\":_vm.detail.status === 0 ? 'success' : 'info'}},[_vm._v(\" \"+_vm._s(_vm.detail.status === 0 ? \"运行中\" : \"已过期\")+\" \")])],1)]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.detail.type === 1),expression:\"detail.type === 1\"}],staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"购买算力:\")]),_c('span',{staticClass:\"value strong\"},[_vm._v(_vm._s(_vm.detail.purchasedComputingPower))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"购买时间:\")]),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.formatDateTime(_vm.detail.createTime)))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"开始时间:\")]),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.formatDateTime(_vm.detail.startTime)))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"结束时间:\")]),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.formatDateTime(_vm.detail.endTime)))])])]),_c('el-card',{staticClass:\"section\",staticStyle:{\"margin-top\":\"12px\"}},[_c('div',{staticClass:\"sub-title\"},[_vm._v(\"收益信息\")]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"当前实际算力:\")]),_c('span',{staticClass:\"value strong\"},[_vm._v(_vm._s(_vm.detail.currentComputingPower || '0'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"币种收益:\")]),_c('span',{staticClass:\"value strong\"},[_vm._v(_vm._s(_vm.detail.currentIncome || '0'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"当前USDT收益:\")]),_c('span',{staticClass:\"value strong\"},[_vm._v(_vm._s(_vm.detail.currentUsdtIncome || '0')+\" USDT\")])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"预估结束总收益:\")]),_c('span',{staticClass:\"value strong\"},[_vm._v(_vm._s(_vm.detail.estimatedEndIncome || '0'))])]),_c('div',{staticClass:\"row\"},[_c('span',{staticClass:\"label\"},[_vm._v(\"预估结束USDT总收益:\")]),_c('span',{staticClass:\"value strong\"},[_vm._v(_vm._s(_vm.detail.estimatedEndUsdtIncome || '0')+\" USDT\")])])]),_c('div',{staticClass:\"actions\"},[_c('el-button',{on:{\"click\":function($event){return _vm.$router.back()}}},[_vm._v(\"返回\")])],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shopConfig.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shopConfig.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./shopConfig.vue?vue&type=template&id=42f7ea7c&scoped=true\"\nimport script from \"./shopConfig.vue?vue&type=script&lang=js\"\nexport * from \"./shopConfig.vue?vue&type=script&lang=js\"\nimport style0 from \"./shopConfig.vue?vue&type=style&index=0&id=42f7ea7c&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"42f7ea7c\",\n null\n \n)\n\nexport default component.exports","// 金额截断显示工具(不补0、不四舍五入)\r\n// 规则:\r\n// - USDT: 最多6位小数\r\n// - ETH: 最多8位小数\r\n// - 其他币种: 最多6位小数\r\n// 返回 { text, truncated, full }\r\n\r\nexport function getMaxDecimalsByCoin() {\r\n // 全站统一:最多 6 位小数\r\n return 6;\r\n}\r\n\r\nexport function truncateAmountRaw(value, maxDecimals) {\r\n if (value === null || value === undefined) {\r\n return { text: '0', truncated: false, full: '0' };\r\n }\r\n const raw = String(value);\r\n if (!raw) return { text: '0', truncated: false, full: '0' };\r\n // 非数字字符串直接返回原值\r\n if (!/^-?\\d+(\\.\\d+)?$/.test(raw)) {\r\n return { text: raw, truncated: false, full: raw };\r\n }\r\n const isNegative = raw.startsWith('-');\r\n const abs = isNegative ? raw.slice(1) : raw;\r\n const [intPart, decPart = ''] = abs.split('.');\r\n const keep = decPart.slice(0, Math.max(0, maxDecimals));\r\n const truncated = decPart.length > maxDecimals;\r\n const text = (isNegative ? '-' : '') + (keep ? `${intPart}.${keep}` : intPart);\r\n return { text, truncated, full: raw };\r\n}\r\n\r\nexport function truncateAmountByCoin(value, coin) {\r\n const max = getMaxDecimalsByCoin(coin);\r\n return truncateAmountRaw(value, max);\r\n}\r\n\r\n// 默认 6 位截断(非币种语境也可复用)\r\nexport function truncateTo6(value) {\r\n return truncateAmountRaw(value, 6);\r\n}\r\n\r\n","// 全局 loading 状态管理器\r\nclass LoadingManager {\r\n constructor() {\r\n this.loadingStates = new Map(); // 存储所有 loading 状态\r\n this.setupListeners();\r\n }\r\n \r\n setupListeners() {\r\n // 监听网络重试完成事件\r\n window.addEventListener('network-retry-complete', () => {\r\n this.resetAllLoadingStates();\r\n });\r\n }\r\n \r\n // 设置 loading 状态\r\n setLoading(componentId, stateKey, value) {\r\n const key = `${componentId}:${stateKey}`;\r\n this.loadingStates.set(key, {\r\n value,\r\n timestamp: Date.now()\r\n });\r\n }\r\n \r\n // 获取 loading 状态\r\n getLoading(componentId, stateKey) {\r\n const key = `${componentId}:${stateKey}`;\r\n const state = this.loadingStates.get(key);\r\n return state ? state.value : false;\r\n }\r\n \r\n // 重置所有 loading 状态\r\n resetAllLoadingStates() {\r\n // 清除所有处于加载状态的组件\r\n const componentsToUpdate = [];\r\n \r\n this.loadingStates.forEach((state, key) => {\r\n if (state.value === true) {\r\n const [componentId, stateKey] = key.split(':');\r\n componentsToUpdate.push({ componentId, stateKey });\r\n this.loadingStates.set(key, { value: false, timestamp: Date.now() });\r\n }\r\n });\r\n \r\n // 使用事件通知各组件更新\r\n window.dispatchEvent(new CustomEvent('reset-loading-states', {\r\n detail: { componentsToUpdate }\r\n }));\r\n }\r\n \r\n // 重置特定组件的所有 loading 状态\r\n resetComponentLoadingStates(componentId) {\r\n const componentsToUpdate = [];\r\n \r\n this.loadingStates.forEach((state, key) => {\r\n if (key.startsWith(`${componentId}:`) && state.value === true) {\r\n const stateKey = key.split(':')[1];\r\n componentsToUpdate.push({ componentId, stateKey });\r\n this.loadingStates.set(key, { value: false, timestamp: Date.now() });\r\n }\r\n });\r\n \r\n return componentsToUpdate;\r\n }\r\n }\r\n \r\n // 创建单例实例\r\n const loadingManager = new LoadingManager();\r\n export default loadingManager;","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"panel\"},[_c('h2',{staticClass:\"panel-title\"},[_vm._v(\"新增店铺\")]),_c('div',{staticClass:\"panel-body\"},[_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"店铺名称\")]),_c('el-input',{attrs:{\"placeholder\":\"请输入店铺名称\",\"maxlength\":30,\"show-word-limit\":\"\"},model:{value:(_vm.form.name),callback:function ($$v) {_vm.$set(_vm.form, \"name\", $$v)},expression:\"form.name\"}})],1),_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"店铺描述\")]),_c('div',{staticClass:\"textarea-wrapper\"},[_c('el-input',{attrs:{\"type\":\"textarea\",\"rows\":4,\"maxlength\":300,\"placeholder\":\"请输入店铺描述\",\"show-word-limit\":\"\"},on:{\"input\":_vm.handleDescriptionInput},model:{value:(_vm.form.description),callback:function ($$v) {_vm.$set(_vm.form, \"description\", $$v)},expression:\"form.description\"}})],1)]),_c('div',{staticClass:\"row\"},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleCreate}},[_vm._v(\"创建店铺\")])],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex)\n\nexport default new Vuex.Store({\n state: {\n },\n getters: {\n },\n mutations: {\n },\n actions: {\n },\n modules: {\n }\n})\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./productDetail.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./productDetail.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./productDetail.vue?vue&type=template&id=69d09b20&scoped=true\"\nimport script from \"./productDetail.vue?vue&type=script&lang=js\"\nexport * from \"./productDetail.vue?vue&type=script&lang=js\"\nimport style0 from \"./productDetail.vue?vue&type=style&index=0&id=69d09b20&prod&scoped=true&lang=css\"\nimport style1 from \"./productDetail.vue?vue&type=style&index=1&id=69d09b20&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"69d09b20\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"content-container\"},[_c('router-view')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=c3bf12ce&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=js\"\nexport * from \"./index.vue?vue&type=script&lang=js\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=c3bf12ce&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c3bf12ce\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"orders-page\"},[_c('h2',{staticClass:\"title\"},[_vm._v(\"订单列表\")]),_c('el-tabs',{on:{\"tab-click\":_vm.handleTabClick},model:{value:(_vm.active),callback:function ($$v) {_vm.active=$$v},expression:\"active\"}},[_c('el-tab-pane',{attrs:{\"label\":\"订单进行中\",\"name\":\"7\"}},[_c('order-list',{attrs:{\"items\":_vm.orders[7],\"show-checkout\":true,\"on-cancel\":_vm.handleCancelOrder,\"empty-text\":\"暂无进行中的订单\"}})],1),_c('el-tab-pane',{attrs:{\"label\":\"订单已完成\",\"name\":\"8\"}},[_c('order-list',{attrs:{\"items\":_vm.orders[8],\"show-checkout\":false,\"empty-text\":\"暂无已完成的订单\"}})],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import request from '../utils/request'\r\n\r\n//商品列表\r\nexport function getAddShop(data) {\r\n return request({\r\n url: `/lease/shop/addShop`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n// 我的店铺(获取当前用户店铺信息)\r\nexport function getMyShop(params) {\r\n return request({\r\n url: `/lease/shop/getShopByUserEmail`,\r\n method: 'get',\r\n params\r\n })\r\n}\r\n\r\n// 更新店铺\r\nexport function updateShop(data) {\r\n return request({\r\n url: `/lease/shop/updateShop`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n// 删除店铺\r\nexport function deleteShop(id) {\r\n return request({\r\n url: `/lease/shop/deleteShop`,\r\n method: 'post',\r\n data: { id }\r\n })\r\n}\r\n\r\n// 查询店铺信息(根据ID)\r\nexport function queryShop(data) {\r\n return request({\r\n url: `/lease/shop/getShopById`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n// 关闭店铺\r\nexport function closeShop(id) {\r\n return request({\r\n url: `/lease/shop/closeShop`,\r\n method: 'post',\r\n data: { id }\r\n })\r\n}\r\n\r\n// 根据 店铺id 查询店铺商品配置信息列表\r\nexport function getShopConfig(id) {\r\n return request({\r\n url: `/lease/shop/getShopConfig`,\r\n method: 'post',\r\n data: { id }\r\n })\r\n}\r\n\r\n\r\n// 新增商铺配置\r\nexport function addShopConfig(data) {\r\n return request({\r\n url: `/lease/shop/addShopConfig`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n// 根据配置id 修改配置\r\nexport function updateShopConfig(data) {\r\n return request({\r\n url: `/lease/shop/updateShopConfig`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n// 根据配置id 删除配置\r\nexport function deleteShopConfig(data) {\r\n return request({\r\n url: `/lease/shop/deleteShopConfig`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n// 钱包配置(用于修改卖家钱包地址)----获取链(一级)和币(二级) 下拉列表(获取本系统支持的链和币种)\r\nexport function getChainAndCoin(data) {\r\n return request({\r\n url: `/lease/shop/getChainAndCoin`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import axios from 'axios'\r\nimport errorCode from './errorCode'\r\nimport { Notification, MessageBox, Message } from 'element-ui'\r\nimport loadingManager from './loadingManager';\r\nimport errorNotificationManager from './errorNotificationManager';\r\n\r\n \r\nconst pendingRequestMap = new Map(); //处理Request aborted 错误\r\n\r\nfunction getRequestKey(config) { //处理Request aborted 错误 生成唯一 key 的函数\r\n const { url, method, params, data } = config;\r\n return [url, method, JSON.stringify(params), JSON.stringify(data)].join('&');\r\n}\r\n// 创建axios实例\r\nconst service = axios.create({\r\n // axios中请求配置有baseURL选项,表示请求URL公共部分\r\n baseURL: process.env.VUE_APP_BASE_API,\r\n // 超时\r\n timeout: 10000,\r\n})\r\n\r\n// 网络错误相关配置\r\nconst NETWORK_ERROR_THROTTLE_TIME = 5000; // 错误提示节流时间\r\nconst RETRY_DELAY = 2000; // 重试间隔时间\r\nconst MAX_RETRY_TIMES = 3; // 最大重试次数\r\nconst RETRY_WINDOW = 60000; // 60秒重试窗口\r\nlet lastNetworkErrorTime = 0; // 上次网络错误提示时间\r\nlet pendingRequests = new Map();\r\n\r\n\r\n// 网络状态监听器\r\n// 网络状态最后提示时间\r\nlet lastNetworkStatusTime = {\r\n online: 0,\r\n offline: 0\r\n};\r\n\r\n// 创建一个全局标志,确保每次网络恢复只显示一次提示\r\nlet networkRecoveryInProgress = false;\r\n\r\n// 网络状态监听器\r\nwindow.addEventListener('online', () => {\r\n const now = Date.now();\r\n \r\n // 避免短时间内多次触发\r\n if (networkRecoveryInProgress) {\r\n console.log('[网络] 网络恢复处理已在进行中,忽略重复事件');\r\n return;\r\n }\r\n \r\n networkRecoveryInProgress = true;\r\n \r\n // 严格检查是否应该显示提示\r\n if (now - lastNetworkStatusTime.online > 30000) { // 30秒内不重复提示\r\n lastNetworkStatusTime.online = now;\r\n \r\n try {\r\n if (window.vm && window.vm.$message) {\r\n // 确保消息只显示一次\r\n window.vm.$message({\r\n message: window.vm.$i18n.t('home.networkReconnected') || '网络已重新连接,正在恢复数据...',\r\n type: 'success',\r\n duration: 5000,\r\n showClose: true,\r\n });\r\n console.log('[网络] 显示网络恢复提示, 时间:', new Date().toLocaleTimeString());\r\n }\r\n } catch (e) {\r\n console.error('[网络] 显示网络恢复提示失败:', e);\r\n }\r\n } else {\r\n console.log('[网络] 抑制重复的网络恢复提示, 间隔过短:', now - lastNetworkStatusTime.online + 'ms');\r\n }\r\n\r\n // 网络恢复时,重试所有待处理的请求\r\n const pendingPromises = [];\r\n \r\n pendingRequests.forEach(async (request, key) => {\r\n if (now - request.timestamp <= RETRY_WINDOW) {\r\n try {\r\n // 获取新的响应数据\r\n const response = await service(request.config);\r\n pendingPromises.push(response);\r\n \r\n // 执行请求特定的回调\r\n if (request.callback && typeof request.callback === 'function') {\r\n request.callback(response);\r\n }\r\n \r\n // 处理特定类型的请求\r\n if (window.vm) {\r\n // 处理图表数据请求\r\n if (request.config.url.includes('getPoolPower') && response && response.data) {\r\n // 触发图表更新事件\r\n window.dispatchEvent(new CustomEvent('chart-data-updated', { \r\n detail: { type: 'poolPower', data: response.data } \r\n }));\r\n }\r\n else if (request.config.url.includes('getNetPower') && response && response.data) {\r\n window.dispatchEvent(new CustomEvent('chart-data-updated', { \r\n detail: { type: 'netPower', data: response.data } \r\n }));\r\n }\r\n else if (request.config.url.includes('getBlockInfo') && response && response.rows) {\r\n window.dispatchEvent(new CustomEvent('chart-data-updated', { \r\n detail: { type: 'blockInfo', data: response.rows } \r\n }));\r\n }\r\n }\r\n \r\n pendingRequests.delete(key);\r\n } catch (error) {\r\n console.error('重试请求失败:', error);\r\n pendingRequests.delete(key);\r\n }\r\n } else {\r\n pendingRequests.delete(key);\r\n }\r\n });\r\n \r\n // 等待所有请求完成\r\n Promise.allSettled(pendingPromises).then(() => {\r\n // 重置所有 loading 状态\r\n if (loadingManager) {\r\n loadingManager.resetAllLoadingStates();\r\n }\r\n \r\n // 手动重置一些关键的 loading 状态\r\n if (window.vm) {\r\n // 常见的加载状态\r\n const commonLoadingProps = [\r\n 'minerChartLoading', 'reportBlockLoading', 'apiPageLoading', \r\n 'MiningLoading', 'miniLoading', 'bthLoading', 'editLoading'\r\n ];\r\n \r\n commonLoadingProps.forEach(prop => {\r\n if (typeof window.vm[prop] !== 'undefined') {\r\n window.vm[prop] = false;\r\n }\r\n });\r\n\r\n // 重置所有以Loading结尾的状态\r\n Object.keys(window.vm).forEach(key => {\r\n if (key.endsWith('Loading')) {\r\n window.vm[key] = false;\r\n }\r\n });\r\n\r\n\r\n }\r\n \r\n // 触发网络重试完成事件\r\n window.dispatchEvent(new CustomEvent('network-retry-complete'));\r\n \r\n // 重置网络恢复标志\r\n setTimeout(() => {\r\n networkRecoveryInProgress = false;\r\n }, 5000); // 5秒后允许再次处理网络恢复\r\n });\r\n});\r\n\r\n // 使用错误提示管理器控制网络断开提示\r\nwindow.addEventListener('offline', () => {\r\n if (window.vm && window.vm.$message && errorNotificationManager.canShowError('networkOffline')) {\r\n window.vm.$message({\r\n message: window.vm.$i18n.t('home.networkOffline') || '网络连接已断开,系统将在恢复连接后自动重试',\r\n type: 'error',\r\n duration: 5000,\r\n showClose: true,\r\n });\r\n }\r\n});\r\n\r\nservice.defaults.retry = 2;// 重试次数\r\nservice.defaults.retryDelay = 2000;\r\nservice.defaults.shouldRetry = (error) => {\r\n // 只有网络错误或超时错误才进行重试\r\n return error.message === \"Network Error\" || error.message.includes(\"timeout\");\r\n};\r\n\r\nlocalStorage.setItem('superReportError', \"\")\r\nlet superReportError = localStorage.getItem('superReportError')\r\nwindow.addEventListener(\"setItem\", () => {\r\n superReportError = localStorage.getItem('superReportError')\r\n});\r\n\r\n// request拦截器\r\nservice.interceptors.request.use(config => {\r\n superReportError = \"\"\r\n // retryCount =0\r\n localStorage.setItem('superReportError', \"\")\r\n // 是否需要设置 token\r\n let token\r\n try {\r\n token = JSON.parse(localStorage.getItem('token'))\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n if (token) {\r\n config.headers['Authorization'] = token\r\n }\r\n\r\nconsole.log(token,\"if就覅飞机飞机\");\r\n\r\n if (config.method == 'get' && config.data) {\r\n config.params = config.data\r\n }\r\n // get请求映射params参数\r\n if (config.method === 'get' && config.params) {\r\n let url = config.url + '?';\r\n for (const propName of Object.keys(config.params)) {\r\n const value = config.params[propName];\r\n var part = encodeURIComponent(propName) + \"=\";\r\n if (value !== null && typeof (value) !== \"undefined\") {\r\n if (typeof value === 'object') {\r\n for (const key of Object.keys(value)) {\r\n if (value[key] !== null && typeof (value[key]) !== 'undefined') {\r\n let params = propName + '[' + key + ']';\r\n let subPart = encodeURIComponent(params) + '=';\r\n url += subPart + encodeURIComponent(value[key]) + '&';\r\n }\r\n }\r\n } else {\r\n url += part + encodeURIComponent(value) + \"&\";\r\n }\r\n }\r\n }\r\n url = url.slice(0, -1);\r\n config.params = {};\r\n config.url = url;\r\n }\r\n\r\n // 生成请求唯一key 处理Request aborted 错误\r\n const requestKey = getRequestKey(config);\r\n\r\n // 如果有相同请求,先取消 处理Request aborted 错误\r\n if (pendingRequestMap.has(requestKey)) {\r\n const cancel = pendingRequestMap.get(requestKey);\r\n cancel(); // 取消上一次请求\r\n pendingRequestMap.delete(requestKey);\r\n }\r\n\r\n // 创建新的CancelToken 处理Request aborted 错误\r\n config.cancelToken = new axios.CancelToken(cancel => {\r\n pendingRequestMap.set(requestKey, cancel);\r\n });\r\n\r\n return config\r\n}, error => {\r\n Promise.reject(error)\r\n})\r\n\r\n// 响应拦截器\r\nservice.interceptors.response.use(res => {\r\n\r\n // 请求完成后移除\r\n const requestKey = getRequestKey(res.config);\r\n pendingRequestMap.delete(requestKey);\r\n // 未设置状态码则默认成功状态\r\n const code = res.data.code || 200;\r\n // 获取错误信息\r\n const msg = errorCode[code] || res.data.msg || errorCode['default']\r\n if (code === 421) {\r\n localStorage.setItem('cs_disconnect_all', Date.now().toString()); //告知客服页面断开连接\r\n localStorage.removeItem('token')\r\n // 系统状态已过期,请重新点击SUPPORT按钮进入 \r\n superReportError = localStorage.getItem('superReportError')\r\n if (!superReportError) {\r\n superReportError = 421\r\n localStorage.setItem('superReportError', superReportError)\r\n MessageBox.confirm(window.vm.$i18n.t(`user.loginExpired`), window.vm.$i18n.t(`user.overduePrompt`), {\r\n distinguishCancelAndClose: true,\r\n confirmButtonText: window.vm.$i18n.t(`user.login`),\r\n cancelButtonText: window.vm.$i18n.t(`user.Home`),\r\n // showCancelButton: false, // 隐藏取消按钮\r\n closeOnClickModal: false, // 点击空白处不关闭对话框\r\n showClose: false, // 隐藏关闭按钮\r\n type: 'warning'\r\n }\r\n ).then(() => {\r\n window.vm.$router.push(`/${window.vm.$i18n.locale}/login`)\r\n localStorage.removeItem('token')\r\n }).catch(() => {\r\n window.vm.$router.push(`/${window.vm.$i18n.locale}/`)\r\n localStorage.removeItem('token')\r\n });\r\n\r\n }\r\n\r\n\r\n return Promise.reject('登录状态已过期')\r\n } else if (code >= 500 && !superReportError) {\r\n superReportError = 500\r\n localStorage.setItem('superReportError', superReportError)\r\n Message({\r\n dangerouslyUseHTMLString: true,\r\n message: msg,\r\n type: 'error',\r\n showClose: true\r\n })\r\n // throw msg; // 抛出错误,中断请求链并触发后续的错误处理逻辑\r\n // return Promise.reject(new Error(msg))\r\n } else if (code !== 200) {\r\n\r\n\r\n\r\n Notification.error({\r\n title: msg\r\n })\r\n return Promise.reject('error')\r\n\r\n } else {\r\n\r\n return res.data\r\n }\r\n\r\n\r\n\r\n\r\n},\r\n error => {\r\n\r\n // 主动取消的请求,直接忽略,不提示\r\n if (\r\n error.code === 'ERR_CANCELED' ||\r\n (error.message && error.message.includes('canceled')) ||\r\n error.message?.includes('Request aborted')\r\n ) {\r\n // 静默处理,不提示,不冒泡\r\n return new Promise(() => {}); // 返回pending Promise,阻止控制台报错\r\n }\r\n\r\n\r\n\r\n \r\n // 请求异常也要移除 处理Request aborted 错误\r\n if (error.config) {\r\n const requestKey = getRequestKey(error.config);\r\n pendingRequestMap.delete(requestKey);\r\n }\r\n\r\n\r\n let { message } = error;\r\n if (message == \"Network Error\" || message.includes(\"timeout\")) {\r\n if (!navigator.onLine) {\r\n // 断网状态,添加到重试队列\r\n const requestKey = JSON.stringify({\r\n url: error.config.url,\r\n method: error.config.method,\r\n params: error.config.params,\r\n data: error.config.data\r\n });\r\n \r\n // 根据URL确定请求类型并记录回调\r\n let callback = null;\r\n if (error.config.url.includes('getPoolPower')) {\r\n callback = (data) => {\r\n if (window.vm) {\r\n // 清除loading状态\r\n window.vm.minerChartLoading = false;\r\n }\r\n };\r\n } else if (error.config.url.includes('getBlockInfo')) {\r\n callback = (data) => {\r\n if (window.vm) {\r\n window.vm.reportBlockLoading = false;\r\n }\r\n };\r\n }\r\n \r\n if (!pendingRequests.has(requestKey)) {\r\n pendingRequests.set(requestKey, {\r\n config: error.config,\r\n timestamp: Date.now(),\r\n retryCount: 0,\r\n callback: callback\r\n });\r\n \r\n console.log('请求已加入断网重连队列:', error.config.url);\r\n }\r\n } else {\r\n // 网络已连接,但请求失败,尝试重试\r\n // 确保 config 中有 __retryCount 字段\r\n error.config.__retryCount = error.config.__retryCount || 0;\r\n \r\n // 判断是否可以重试\r\n if (error.config.__retryCount < service.defaults.retry && service.defaults.shouldRetry(error)) {\r\n // 增加重试计数\r\n error.config.__retryCount += 1;\r\n \r\n console.log(`[请求重试] ${error.config.url} - 第 ${error.config.__retryCount} 次重试`);\r\n \r\n // 创建新的Promise等待一段时间后重试\r\n return new Promise(resolve => {\r\n setTimeout(() => {\r\n resolve(service(error.config));\r\n }, service.defaults.retryDelay);\r\n });\r\n }\r\n \r\n // 达到最大重试次数,不再重试\r\n console.log(`[请求失败] ${error.config.url} - 已达到最大重试次数`);\r\n }\r\n }\r\n\r\n if (!superReportError) {\r\n superReportError = \"error\"\r\n localStorage.setItem('superReportError', superReportError)\r\n //使用错误提示管理器errorNotificationManager\r\n if (errorNotificationManager.canShowError(message)) {\r\n if (message == \"Network Error\") {\r\n Message({\r\n message: window.vm.$i18n.t(`home.NetworkError`),\r\n type: 'error',\r\n duration: 4 * 1000,\r\n showClose: true\r\n });\r\n }\r\n else if (message.includes(\"timeout\")) {\r\n Message({\r\n message: window.vm.$i18n.t(`home.requestTimeout`),\r\n type: 'error',\r\n duration: 5 * 1000,\r\n showClose: true\r\n });\r\n }\r\n else if (message.includes(\"Request failed with status code\")) {\r\n Message({\r\n message: \"系统接口\" + message.substr(message.length - 3) + \"异常\",\r\n type: 'error',\r\n duration: 5 * 1000,\r\n showClose: true\r\n });\r\n } else {\r\n Message({\r\n message: message,\r\n type: 'error',\r\n duration: 5 * 1000,\r\n showClose: true\r\n });\r\n }\r\n } else {\r\n // 避免完全不提示,可以在控制台记录被抑制的错误\r\n console.log('[错误提示] 已抑制重复错误:', message);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n return Promise.reject(error)\r\n\r\n }\r\n)\r\n\r\n\r\n\r\nexport default service","\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./purchased.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./purchased.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./purchased.vue?vue&type=template&id=5597a452&scoped=true\"\nimport script from \"./purchased.vue?vue&type=script&lang=js\"\nexport * from \"./purchased.vue?vue&type=script&lang=js\"\nimport style0 from \"./purchased.vue?vue&type=style&index=0&id=5597a452&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5597a452\",\n null\n \n)\n\nexport default component.exports","import request from '../utils/request'\r\n\r\n//加入购物车\r\nexport function addCart(data) {\r\n return request({\r\n url: `/lease/shopping/cart/addGoods`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//查询购物车列表\r\nexport function getGoodsList(data) {\r\n return request({\r\n url: `/lease/shopping/cart/getGoodsList`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n //删除购物车商品 批量\r\nexport function deleteBatchGoods(data) {\r\n return request({\r\n url: `/lease/shopping/cart/deleteBatchGoods`,\r\n method: 'post',\r\n data\r\n })\r\n }\r\n\r\n \r\n // 批量删除购物车中已下架商品\r\nexport function deleteBatchGoodsForIsDelete(data) {\r\n return request({\r\n url: `/lease/shopping/cart/deleteBatchGoodsForIsDelete`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"panel\"},[_c('h2',{staticClass:\"panel-title\"},[_vm._v(\"我的店铺\")]),_c('div',{staticClass:\"panel-body\"},[_c('el-card',{staticClass:\"guide-card\",staticStyle:{\"margin-bottom\":\"16px\"},attrs:{\"shadow\":\"never\"}},[_c('div',{staticClass:\"guide-header\",attrs:{\"slot\":\"header\"},slot:\"header\"},[_vm._v(\"店铺层级说明\")]),_c('div',{staticClass:\"guide-content\"},[_c('p',{staticClass:\"hierarchy\"},[_vm._v(\"层级结构:店铺 → 商品 → 出售机器\")]),_c('ol',{staticClass:\"guide-steps\"},[_c('li',[_c('b',[_vm._v(\"店铺(唯一)\")]),_vm._v(\":每个用户在平台\"),_c('strong',[_vm._v(\"仅能创建一个店铺\")]),_vm._v(\"。创建成功后, 请在本页点击 \"),_c('b',[_vm._v(\"钱包绑定\")]),_vm._v(\",配置自己的收款地址(支持不同链与币种)。 \")]),_c('li',[_c('b',[_vm._v(\"商品\")]),_vm._v(\":完成钱包绑定后,即可在“我的店铺”页面 \"),_c('b',[_vm._v(\"创建商品\")]),_vm._v(\"。 商品可按 \"),_c('b',[_vm._v(\"币种\")]),_vm._v(\" 进行分类管理,创建的商品会在商城对买家展示。 商品可理解为“不同算法、币种的机器集合分类”。 \")]),_c('li',[_c('b',[_vm._v(\"出售机器\")]),_vm._v(\":创建商品后,请进入 \"),_c('b',[_vm._v(\"商品列表\")]),_vm._v(\" 为该商品 \"),_c('b',[_vm._v(\"添加出售机器明细\")]),_vm._v(\"。 必须添加出售机器,否则买家无法下单。买家点击某个商品后,会看到该商品下的机器明细并进行选购。 \")])]),_c('div',{staticClass:\"guide-note\"},[_vm._v(\"提示:建议先创建店铺 → 完成钱包绑定 → 创建商品 → 添加出售机器的顺序,避免漏配导致无法收款或无法下单。\")])])]),(_vm.loaded && _vm.hasShop)?_c('el-card',{staticClass:\"shop-card\",attrs:{\"shadow\":\"hover\"}},[_c('div',{staticClass:\"shop-row\"},[_c('div',{staticClass:\"shop-cover\"},[_c('img',{attrs:{\"src\":_vm.shop.image || _vm.defaultCover,\"alt\":\"店铺封面\"}})]),_c('div',{staticClass:\"shop-info\"},[_c('div',{staticClass:\"shop-title\"},[_c('span',{staticClass:\"name\"},[_vm._v(_vm._s(_vm.shop.name || '未命名店铺'))]),_c('el-tag',{attrs:{\"size\":\"small\",\"type\":_vm.shopStateTagType}},[_vm._v(\" \"+_vm._s(_vm.shopStateText)+\" \")])],1),_c('div',{staticClass:\"desc\"},[_vm._v(_vm._s(_vm.shop.description || '这家店还没有描述~'))]),_c('div',{staticClass:\"actions\"},[_c('el-button',{attrs:{\"size\":\"small\",\"type\":\"primary\"},on:{\"click\":_vm.handleOpenEdit}},[_vm._v(\"修改店铺\")]),_c('el-button',{attrs:{\"size\":\"small\",\"type\":\"warning\"},on:{\"click\":_vm.handleToggleShop}},[_vm._v(\" \"+_vm._s(_vm.shop.state === 2 ? '开启店铺' : '关闭店铺')+\" \")]),_c('el-button',{attrs:{\"size\":\"small\",\"type\":\"danger\"},on:{\"click\":_vm.handleDelete}},[_vm._v(\"删除店铺\")]),_c('el-button',{attrs:{\"size\":\"small\",\"type\":\"success\"},on:{\"click\":_vm.handleAddProduct}},[_vm._v(\"新增商品\")]),_c('el-button',{attrs:{\"size\":\"small\",\"type\":\"success\"},on:{\"click\":_vm.handleWalletBind}},[_vm._v(\"钱包绑定\")])],1)])])]):_vm._e(),(_vm.loaded && _vm.hasShop)?_c('el-card',{staticClass:\"shop-config-card\",staticStyle:{\"margin-top\":\"16px\"},attrs:{\"shadow\":\"never\"}},[_c('div',{staticClass:\"clearfix\",attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('span',[_vm._v(\"已绑定钱包\")])]),_c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.shopConfigs,\"border\":\"\"}},[_c('el-table-column',{attrs:{\"prop\":\"chain\",\"label\":\"链\",\"width\":\"140\"}}),_c('el-table-column',{attrs:{\"label\":\"支付币种\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('div',{staticClass:\"coin-list\"},[(Array.isArray(scope.row.children) && scope.row.children.length)?_vm._l((scope.row.children),function(c,idx){return _c('el-tooltip',{key:idx,attrs:{\"content\":String(c && c.payCoin ? c.payCoin : '').toUpperCase(),\"placement\":\"top\"}},[(c && c.image)?_c('img',{staticClass:\"coin-img\",attrs:{\"src\":c.image,\"alt\":(c.payCoin || '').toUpperCase()}}):_vm._e()])}):[_vm._v(\" \"+_vm._s(String(scope.row.payCoin || '').toUpperCase())+\" \")]],2)]}}],null,false,569036476)}),_c('el-table-column',{attrs:{\"prop\":\"payAddress\",\"label\":\"收款钱包地址\",\"show-overflow-tooltip\":\"\"}}),_c('el-table-column',{attrs:{\"label\":\"操作\",\"width\":\"180\",\"fixed\":\"right\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"text\"},on:{\"click\":function($event){return _vm.handleEditConfig(scope.row)}}},[_vm._v(\"修改\")]),_c('el-divider',{attrs:{\"direction\":\"vertical\"}}),_c('el-button',{staticStyle:{\"color\":\"#e74c3c\"},attrs:{\"type\":\"text\"},on:{\"click\":function($event){return _vm.handleDeleteConfig(scope.row)}}},[_vm._v(\"删除\")])]}}],null,false,2146652355)})],1)],1):(_vm.loaded && !_vm.hasShop)?_c('div',{staticClass:\"no-shop\"},[_c('el-empty',{attrs:{\"description\":\"暂无店铺\"}},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleGoNew}},[_vm._v(\"新建店铺\")])],1)],1):_c('el-empty',{attrs:{\"description\":\"正在加载店铺信息...\"}}),_c('el-dialog',{attrs:{\"title\":\"修改店铺\",\"visible\":_vm.visibleEdit,\"width\":\"520px\"},on:{\"update:visible\":function($event){_vm.visibleEdit=$event}}},[_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"店铺名称\")]),_c('el-input',{attrs:{\"placeholder\":\"请输入店铺名称\",\"maxlength\":30,\"show-word-limit\":\"\"},model:{value:(_vm.editForm.name),callback:function ($$v) {_vm.$set(_vm.editForm, \"name\", $$v)},expression:\"editForm.name\"}})],1),_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"店铺描述\")]),_c('el-input',{attrs:{\"type\":\"textarea\",\"rows\":3,\"placeholder\":\"请输入描述\",\"maxlength\":300,\"show-word-limit\":\"\"},model:{value:(_vm.editForm.description),callback:function ($$v) {_vm.$set(_vm.editForm, \"description\", $$v)},expression:\"editForm.description\"}})],1),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.visibleEdit=false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.submitEdit}},[_vm._v(\"保存\")])],1)]),_c('el-dialog',{attrs:{\"title\":\"修改配置\",\"visible\":_vm.visibleConfigEdit,\"width\":\"560px\"},on:{\"update:visible\":function($event){_vm.visibleConfigEdit=$event}}},[_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"支付链\")]),_c('el-input',{attrs:{\"placeholder\":\"-\",\"disabled\":\"\"},model:{value:(_vm.configForm.chainLabel),callback:function ($$v) {_vm.$set(_vm.configForm, \"chainLabel\", $$v)},expression:\"configForm.chainLabel\"}})],1),_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"支付币种\")]),_c('el-select',{staticClass:\"input\",attrs:{\"size\":\"middle\",\"multiple\":\"\",\"collapse-tags\":\"\",\"filterable\":\"\",\"placeholder\":\"请选择币种\"},model:{value:(_vm.configForm.payCoins),callback:function ($$v) {_vm.$set(_vm.configForm, \"payCoins\", $$v)},expression:\"configForm.payCoins\"}},_vm._l((_vm.editCoinOptions),function(item){return _c('el-option',{key:item.value,attrs:{\"label\":item.label,\"value\":item.value}})}),1)],1),_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"已选择币种\")]),_c('div',{staticClass:\"selected-coin-list\"},[_vm._l((_vm.selectedCoinLabels),function(c){return _c('el-tag',{key:c,attrs:{\"type\":\"warning\",\"effect\":\"light\",\"closable\":\"\"},on:{\"close\":function($event){return _vm.removeSelectedCoin(c)}}},[_vm._v(_vm._s(c))])}),(!_vm.selectedCoinLabels.length)?_c('span',{staticStyle:{\"color\":\"#c0c4cc\"}},[_vm._v(\"未选择\")]):_vm._e()],2)]),_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"label\"},[_vm._v(\"钱包地址\")]),_c('el-input',{attrs:{\"placeholder\":\"请输入钱包地址\"},model:{value:(_vm.configForm.payAddress),callback:function ($$v) {_vm.$set(_vm.configForm, \"payAddress\", $$v)},expression:\"configForm.payAddress\"}})],1),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.visibleConfigEdit=false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.submitConfigEdit}},[_vm._v(\"确认修改\")])],1)])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @file 购物车管理(轻量,无 Vuex)\n * @description 提供添加、更新、删除、清空、查询购物车的函数。使用 localStorage 持久化。\n */\n\nconst STORAGE_KEY = 'power_leasing_cart_v1';\n\n/**\n * @typedef {Object} CartItem\n * @property {string} id - 商品ID\n * @property {string} title - 商品标题\n * @property {number} price - 单价\n * @property {number} quantity - 数量\n * @property {string} image - 图片URL\n */\n\n/**\n * 读取本地购物车\n * @returns {CartItem[]}\n */\nexport const readCart = () => {\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(Boolean);\n } catch (error) {\n console.error('[cartManager] readCart error:', error);\n return [];\n }\n}\n\n/**\n * 持久化购物车\n * @param {CartItem[]} cart\n */\nconst writeCart = (cart) => {\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(cart));\n // 同步派发购物车更新事件(总数量),用于头部徽标等全局更新\n try {\n const count = cart.reduce((s, c) => s + Number(c.quantity || 0), 0)\n window.dispatchEvent(new CustomEvent('cart-updated', { detail: { count } }))\n } catch (e) { /* noop */ }\n } catch (error) {\n console.error('[cartManager] writeCart error:', error);\n }\n}\n\n/**\n * 添加到购物车(若已存在则数量累加)\n * @param {CartItem} item\n * @returns {CartItem[]}\n */\nexport const addToCart = (item) => {\n if (!item || !item.id) return readCart();\n const cart = readCart();\n const index = cart.findIndex((c) => c.id === item.id);\n if (index >= 0) {\n const next = [...cart];\n next[index] = {\n ...next[index],\n quantity: Math.max(1, Number(next[index].quantity || 0) + Number(item.quantity || 1))\n };\n writeCart(next);\n return next;\n }\n const next = [...cart, { ...item, quantity: Math.max(1, Number(item.quantity || 1)) }];\n writeCart(next);\n return next;\n}\n\n/**\n * 更新数量\n * @param {string} productId\n * @param {number} quantity\n * @returns {CartItem[]}\n */\nexport const updateQuantity = (productId, quantity) => {\n const cart = readCart();\n const next = cart\n .map((c) => (c.id === productId ? { ...c, quantity: Math.max(1, Number(quantity) || 1) } : c));\n writeCart(next);\n return next;\n}\n\n/**\n * 移除商品\n * @param {string} productId\n * @returns {CartItem[]}\n */\nexport const removeFromCart = (productId) => {\n const cart = readCart();\n const next = cart.filter((c) => c.id !== productId);\n writeCart(next);\n return next;\n}\n\n/**\n * 清空购物车\n * @returns {CartItem[]}\n */\nexport const clearCart = () => {\n writeCart([]);\n return [];\n}\n\n/**\n * 计算总价\n * @returns {{ totalQuantity: number, totalPrice: number }}\n */\nexport const computeSummary = () => {\n const cart = readCart();\n const totalQuantity = cart.reduce((sum, cur) => sum + Number(cur.quantity || 0), 0);\n const totalPrice = cart.reduce((sum, cur) => sum + Number(cur.quantity || 0) * Number(cur.price || 0), 0);\n return { totalQuantity, totalPrice };\n}\n\nexport default {\n readCart,\n addToCart,\n updateQuantity,\n removeFromCart,\n clearCart,\n computeSummary\n}\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"receipt-page\"},[_c('div',{staticClass:\"card\",attrs:{\"aria-label\":\"收款记录\",\"tabindex\":\"0\"}},[_vm._m(0),(_vm.loading)?_c('div',{staticClass:\"loading\"},[_c('i',{staticClass:\"el-icon-loading\",attrs:{\"aria-label\":\"加载中\",\"role\":\"img\"}}),_vm._v(\" 加载中... \")]):_c('div',[_c('el-table',{ref:\"receiptTable\",staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.rows,\"border\":\"\",\"stripe\":\"\",\"size\":\"small\",\"row-key\":_vm.getRowKey,\"expand-row-keys\":_vm.expandedRowKeys,\"row-class-name\":_vm.getRowClassName,\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }},on:{\"row-click\":_vm.handleRowClick,\"expand-change\":_vm.handleExpandChange}},[_c('el-table-column',{attrs:{\"type\":\"expand\",\"width\":\"46\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('div',{staticClass:\"detail-panel\"},[_c('div',{staticClass:\"detail-grid\"},[_c('div',{staticClass:\"detail-item\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"订单号\")]),_c('span',{staticClass:\"detail-value mono\"},[_vm._v(_vm._s(scope.row.orderId || '-'))])]),_c('div',{staticClass:\"detail-item\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"付款链\")]),_c('span',{staticClass:\"detail-value\"},[_c('span',{staticClass:\"badge\"},[_vm._v(_vm._s(_vm.formatChain(scope.row.fromChain) || '-'))])])]),_c('div',{staticClass:\"detail-item\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"付款币种\")]),_c('span',{staticClass:\"detail-value\"},[_c('span',{staticClass:\"badge badge-blue\"},[_vm._v(_vm._s(String((scope.row.fromSymbol || scope.row.coin) || '') .toUpperCase()))])])]),_c('div',{staticClass:\"detail-item detail-item-full\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"付款地址\")]),_c('span',{staticClass:\"detail-value address\"},[_c('span',{staticClass:\"mono-ellipsis\",attrs:{\"title\":scope.row.fromAddress}},[_vm._v(_vm._s(scope.row.fromAddress || '-'))]),(scope.row.fromAddress)?_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"mini\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.copy(scope.row.fromAddress)}}},[_vm._v(\"复制\")]):_vm._e()],1)])])])]}}])}),_c('el-table-column',{attrs:{\"label\":\"支付时间\",\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(_vm.formatFullTime(scope.row.createTime)))]}}])}),_c('el-table-column',{attrs:{\"label\":\"收款金额(USDT)\",\"min-width\":\"160\",\"align\":\"right\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"amount-green\"},[(_vm.formatAmount(scope.row.realAmount, scope.row.coin || scope.row.toSymbol || 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":`+${_vm.formatAmount(scope.row.realAmount, scope.row.coin || scope.row.toSymbol || 'USDT').full}`,\"placement\":\"top\"}},[_c('span',[_vm._v(\" +\"+_vm._s(_vm.formatAmount(scope.row.realAmount, scope.row.coin || scope.row.toSymbol || 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(\" +\"+_vm._s(_vm.formatAmount(scope.row.realAmount, scope.row.coin || scope.row.toSymbol || 'USDT').text)+\" \")])],1)]}}])}),_c('el-table-column',{attrs:{\"label\":\"收款链\",\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(_vm.formatChain(scope.row.toChain)))]}}])}),_c('el-table-column',{attrs:{\"label\":\"收款币种\",\"min-width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(String(scope.row.coin || '').toUpperCase()))]}}])}),_c('el-table-column',{attrs:{\"label\":\"收款地址\",\"min-width\":\"260\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"mono-ellipsis\",attrs:{\"title\":scope.row.toAddress}},[_vm._v(_vm._s(scope.row.toAddress))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"mini\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.copy(scope.row.toAddress)}}},[_vm._v(\"复制\")])]}}])}),_c('el-table-column',{attrs:{\"label\":\"交易HASH\",\"min-width\":\"260\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"mono-ellipsis\",attrs:{\"title\":scope.row.txHash}},[_vm._v(_vm._s(scope.row.txHash))]),(scope.row.txHash)?_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"mini\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.copy(scope.row.txHash)}}},[_vm._v(\"复制\")]):_vm._e()]}}])}),_c('el-table-column',{attrs:{\"label\":\"支付状态\",\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":_vm.getStatusType(scope.row.status),\"size\":\"small\"}},[_vm._v(_vm._s(_vm.getStatusText(scope.row.status)))])]}}])}),_c('el-table-column',{attrs:{\"label\":\"状态更新时间\",\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(_vm.formatFullTime(scope.row.updateTime)))]}}])})],1),(!_vm.rows.length)?_c('div',{staticClass:\"empty\"},[_c('div',{staticClass:\"empty-icon\"},[_vm._v(\"💳\")]),_c('div',{staticClass:\"empty-text\"},[_vm._v(\"暂无收款记录\")])]):_vm._e(),_c('div',{staticClass:\"pagination\"},[_c('el-pagination',{attrs:{\"background\":\"\",\"layout\":\"prev, pager, next, jumper\",\"current-page\":_vm.page,\"page-size\":_vm.pageSize,\"total\":_vm.total},on:{\"update:currentPage\":function($event){_vm.page=$event},\"update:current-page\":function($event){_vm.page=$event},\"current-change\":_vm.fetchList}})],1)],1)])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card-header\"},[_c('h3',{staticClass:\"card-title\"},[_vm._v(\"收款记录\")])])\n}]\n\nexport { render, staticRenderFns }","/**\n * @file 导航配置文件\n * @description 定义所有可用的导航链接和菜单结构\n */\n\n// 主导航配置\nexport const mainNavigation = [\n {\n path: '/productList',\n name: '商城',\n icon: '🛍️',\n description: '浏览所有商品'\n },\n {\n path: '/cart',\n name: '购物车',\n icon: '🛒',\n description: '管理购物车商品'\n },\n // {\n // path: '/checkout',\n // name: '结算',\n // icon: '💳',\n // description: '完成订单结算'\n // },\n {\n path: '/account',\n name: '个人中心',\n icon: '👤',\n description: '管理个人资料和店铺'\n }\n]\n\n// 面包屑导航配置\nexport const breadcrumbConfig = {\n '/productList': ['首页', '商品列表'],\n '/product': ['首页', '商品列表', '商品详情'],\n '/cart': ['首页', '购物车'],\n '/checkout': ['首页', '购物车', '订单结算'],\n '/account': ['首页', '个人中心'],\n '/account/wallet': ['首页', '个人中心', '我的钱包'],\n '/account/shop-new': ['首页', '个人中心', '新增店铺'],\n '/account/shop-config': ['首页', '个人中心', '店铺配置'],\n '/account/shops': ['首页', '个人中心', '我的店铺'],\n '/account/product-new': ['首页', '个人中心', '新增商品'],\n '/account/products': ['首页', '个人中心', '商品列表']\n}\n\n// 获取面包屑导航\nexport const getBreadcrumb = (path) => {\n // 处理动态路由\n if (path.startsWith('/product/')) {\n return breadcrumbConfig['/product']\n }\n \n return breadcrumbConfig[path] || ['首页']\n}\n\n// 检查路由权限\nexport const checkRoutePermission = (route, userPermissions = []) => {\n if (!route.meta || !route.meta.allAuthority) {\n return true\n }\n \n const requiredPermissions = route.meta.allAuthority\n \n // 如果权限要求是 'all',则所有人都可以访问\n if (requiredPermissions.includes('all')) {\n return true\n }\n \n // 检查用户是否有所需权限\n return requiredPermissions.some(permission => \n userPermissions.includes(permission)\n )\n}\n\n// 获取页面标题\nexport const getPageTitle = (route) => {\n if (route.meta && route.meta.title) {\n return `${route.meta.title} - Power Leasing`\n }\n return 'Power Leasing - 电商系统'\n}\n\n// 获取页面描述\nexport const getPageDescription = (route) => {\n if (route.meta && route.meta.description) {\n return route.meta.description\n }\n return 'Power Leasing 电商系统 - 专业的电力设备租赁平台'\n}\n\nexport default {\n mainNavigation,\n breadcrumbConfig,\n getBreadcrumb,\n checkRoutePermission,\n getPageTitle,\n getPageDescription\n} ","\n\n\n\n\n\n","import request from '../utils/request'\r\n\r\n//钱包余额\r\nexport function getWalletInfo(data) {\r\n return request({\r\n url: `/lease/user/getWalletInfo`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n//余额提现\r\nexport function withdrawBalance(data) {\r\n return request({\r\n url: `/lease/user/withdrawBalance`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n\r\n//余额充值记录\r\nexport function balanceRechargeList(data) {\r\n return request({\r\n url: `/lease/user/balanceRechargeList`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//提现记录\r\nexport function balanceWithdrawList(data) {\r\n return request({\r\n url: `/lease/user/balanceWithdrawList`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n// 卖家收款记录\r\nexport function sellerReceiptList(data) {\r\n return request({\r\n url: `/lease/user/balancePayList`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//钱包绑定\r\nexport function addWalletShopConfig(data) {\r\n return request({\r\n url: `/lease/shop/addShopConfig`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n//获取支持的链和币种\r\nexport function getChainAndList(data) {\r\n return request({\r\n url: `/lease/shop/getChainAndList`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//获取钱包绑定列表\r\nexport function getShopConfig(data) {\r\n return request({\r\n url: `/lease/shop/getShopConfig`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//创建钱包\r\nexport function bindWallet(data) {\r\n return request({\r\n url: `/lease/user/bindWallet`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n//资金流水\r\nexport function transactionRecord(data) {\r\n return request({\r\n url: `/lease/user/transactionRecord`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n//钱包的最近交易\r\nexport function getRecentlyTransaction(data) {\r\n return request({\r\n url: `/lease/user/getRecentlyTransaction`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n//绑定钱包前查询商品列表\r\nexport function getProductListForShopWalletConfig(data) {\r\n return request({\r\n url: `/lease/product/getProductListForShopWalletConfig`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n//设置之前商品列表的新链的机器价格\r\nexport function updateProductListForShopWalletConfig(data) {\r\n return request({\r\n url: `/lease/product/updateProductListForShopWalletConfig`,\r\n method: 'post',\r\n data\r\n })\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"product-machine-add\"},[_c('div',{staticClass:\"header\"},[_c('el-button',{attrs:{\"type\":\"text\"},on:{\"click\":_vm.handleBack}},[_vm._v(\"返回\")]),_c('h2',{staticClass:\"title\"},[_vm._v(\"添加出售机器\")])],1),_c('el-alert',{staticClass:\"notice-alert\",attrs:{\"type\":\"warning\",\"show-icon\":\"\",\"closable\":false,\"title\":\"新增出售机器必须在 M2pool 有挖矿算力记录才能添加出租\",\"description\":\"建议稳定在 M2pool 矿池挖矿 24 小时之后,再添加出售该机器\"}}),_c('el-card',{staticClass:\"form-card\",attrs:{\"shadow\":\"never\"}},[_c('el-form',{ref:\"machineForm\",attrs:{\"model\":_vm.form,\"rules\":_vm.rules,\"label-width\":\"160px\",\"size\":\"small\"}},[_c('el-form-item',{attrs:{\"label\":\"商品名称\"}},[_c('el-input',{staticStyle:{\"width\":\"50%\"},attrs:{\"disabled\":\"\"},model:{value:(_vm.form.productName),callback:function ($$v) {_vm.$set(_vm.form, \"productName\", $$v)},expression:\"form.productName\"}})],1),_c('el-form-item',{attrs:{\"label\":\"矿机型号\"}},[_c('el-input',{staticStyle:{\"width\":\"50%\"},attrs:{\"placeholder\":\"示例:龍珠\",\"maxlength\":20},on:{\"input\":_vm.handleTypeInput},model:{value:(_vm.form.type),callback:function ($$v) {_vm.$set(_vm.form, \"type\", $$v)},expression:\"form.type\"}})],1),_c('el-form-item',{attrs:{\"label\":\"理论算力\",\"prop\":\"theoryPower\"}},[_c('el-input',{staticStyle:{\"width\":\"50%\"},attrs:{\"placeholder\":\"请输入单机理论算力\",\"inputmode\":\"decimal\"},on:{\"input\":function($event){return _vm.handleNumeric('theoryPower')}},model:{value:(_vm.form.theoryPower),callback:function ($$v) {_vm.$set(_vm.form, \"theoryPower\", $$v)},expression:\"form.theoryPower\"}})],1),_c('el-form-item',{attrs:{\"label\":\"算力单位\",\"prop\":\"unit\"}},[_c('el-select',{attrs:{\"placeholder\":\"请选择算力单位\"},model:{value:(_vm.form.unit),callback:function ($$v) {_vm.$set(_vm.form, \"unit\", $$v)},expression:\"form.unit\"}},[_c('el-option',{attrs:{\"label\":\"KH/S\",\"value\":\"KH/S\"}}),_c('el-option',{attrs:{\"label\":\"MH/S\",\"value\":\"MH/S\"}}),_c('el-option',{attrs:{\"label\":\"GH/S\",\"value\":\"GH/S\"}}),_c('el-option',{attrs:{\"label\":\"TH/S\",\"value\":\"TH/S\"}}),_c('el-option',{attrs:{\"label\":\"PH/S\",\"value\":\"PH/S\"}})],1)],1),_c('el-form-item',{attrs:{\"label\":\"最大租赁天数\",\"prop\":\"maxLeaseDays\"}},[_c('el-input',{staticStyle:{\"width\":\"50%\"},attrs:{\"placeholder\":\"1-365\",\"inputmode\":\"numeric\"},on:{\"input\":function($event){return _vm.handleNumeric('maxLeaseDays')}},model:{value:(_vm.form.maxLeaseDays),callback:function ($$v) {_vm.$set(_vm.form, \"maxLeaseDays\", $$v)},expression:\"form.maxLeaseDays\"}},[_c('template',{slot:\"append\"},[_vm._v(\"天\")])],2)],1),_c('el-form-item',{attrs:{\"label\":\"功耗\",\"prop\":\"powerDissipation\"}},[_c('el-input',{staticStyle:{\"width\":\"50%\"},attrs:{\"inputmode\":\"decimal\"},on:{\"input\":function($event){return _vm.handleNumeric('powerDissipation')}},model:{value:(_vm.form.powerDissipation),callback:function ($$v) {_vm.$set(_vm.form, \"powerDissipation\", $$v)},expression:\"form.powerDissipation\"}},[_c('template',{slot:\"append\"},[_vm._v(\"kw/h\")])],2)],1),_c('el-form-item',{attrs:{\"label\":\"统一售价\",\"prop\":\"cost\"}},[_c('span',{attrs:{\"slot\":\"label\"},slot:\"label\"},[_vm._v(\" 统一售价 \"),_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"placement\":\"top\"}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_vm._v(\" 卖家最终收款金额 = 机器售价 × 波动率\"),_c('br'),_vm._v(\" 波动率规则:\"),_c('br'),_vm._v(\" 1)0% - 5%(包含5%):波动率 = 1(按售价结算)\"),_c('br'),_vm._v(\" 2)5%以上:波动率 = 实际算力 / 理论算力,且不会超过 1,即最终结算时不会超过机器售价 \")]),_c('i',{staticClass:\"el-icon-question label-help\",attrs:{\"aria-label\":\"帮助\",\"tabindex\":\"0\"}})])],1),(_vm.payTypeDefs && _vm.payTypeDefs.length)?_c('div',{staticClass:\"cost-multi\"},_vm._l((_vm.payTypeDefs),function(pt){return _c('div',{key:pt.key,staticClass:\"cost-item\"},[_c('el-input',{staticStyle:{\"width\":\"50%\"},attrs:{\"placeholder\":\"请输入价格\",\"inputmode\":\"decimal\"},on:{\"input\":val => _vm.handleCostMapInput(pt.key, val)},model:{value:(_vm.form.costMap[pt.key]),callback:function ($$v) {_vm.$set(_vm.form.costMap, pt.key, $$v)},expression:\"form.costMap[pt.key]\"}},[_c('template',{slot:\"append\"},[_vm._v(_vm._s(pt.label))])],2)],1)}),0):_c('el-input',{staticStyle:{\"width\":\"50%\"},attrs:{\"placeholder\":\"请输入成本(USDT)\",\"inputmode\":\"decimal\"},on:{\"input\":function($event){return _vm.handleNumeric('cost')}},model:{value:(_vm.form.cost),callback:function ($$v) {_vm.$set(_vm.form, \"cost\", $$v)},expression:\"form.cost\"}},[_c('template',{slot:\"append\"},[_vm._v(\"USDT\")])],2)],1),_c('el-form-item',{attrs:{\"label\":\"选择挖矿账户\"}},[_c('el-select',{attrs:{\"filterable\":\"\",\"clearable\":\"\",\"placeholder\":\"请选择挖矿账户\",\"loading\":_vm.minersLoading},on:{\"change\":_vm.handleMinerChange},model:{value:(_vm.selectedMiner),callback:function ($$v) {_vm.selectedMiner=$$v},expression:\"selectedMiner\"}},_vm._l((_vm.miners),function(m){return _c('el-option',{key:m.user + '_' + m.coin,attrs:{\"label\":m.user + '(' + m.coin + ')',\"value\":m.user + '|' + m.coin}})}),1)],1),_c('el-form-item',{attrs:{\"label\":\"选择机器(可多选)\"}},[_c('el-select',{attrs:{\"multiple\":\"\",\"filterable\":\"\",\"collapse-tags\":\"\",\"placeholder\":\"请选择机器\",\"loading\":_vm.machinesLoading,\"disabled\":!_vm.selectedMiner},model:{value:(_vm.selectedMachines),callback:function ($$v) {_vm.selectedMachines=$$v},expression:\"selectedMachines\"}},_vm._l((_vm.machineOptions),function(m){return _c('el-option',{key:m.user + '_' + m.miner,attrs:{\"label\":m.miner + '(' + m.user + ')',\"value\":m.miner}})}),1)],1)],1)],1),(_vm.selectedMachineRows.length)?_c('el-card',{staticClass:\"form-card\",attrs:{\"shadow\":\"never\"}},[_c('div',{staticClass:\"section-title\",attrs:{\"slot\":\"header\"},slot:\"header\"},[_vm._v(\"已选择机器\")]),_c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.selectedMachineRows,\"border\":\"\",\"stripe\":\"\"}},[_c('el-table-column',{attrs:{\"prop\":\"user\",\"label\":\"挖矿账户\"}}),_c('el-table-column',{attrs:{\"prop\":\"miner\",\"label\":\"机器编号\"}}),_c('el-table-column',{attrs:{\"prop\":\"realPower\",\"label\":\"实际算力(MH/S)\"}},[_c('template',{slot:\"header\"},[_c('el-tooltip',{attrs:{\"content\":\"实际算力为该机器在本矿池过去24H的平均算力\",\"effect\":\"dark\",\"placement\":\"top\"}},[_c('i',{staticClass:\"el-icon-question\",staticStyle:{\"margin-right\":\"4px\",\"color\":\"#909399\"},attrs:{\"aria-label\":\"帮助\",\"tabindex\":\"0\"}})]),_c('span',[_vm._v(\"实际算力(MH/S)\")])],1)],2),_c('el-table-column',{attrs:{\"label\":\"功耗(kw/h)\",\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"示例:0.01\",\"inputmode\":\"decimal\"},on:{\"input\":function($event){return _vm.handleRowPowerDissipationInput(scope.$index)},\"blur\":function($event){return _vm.handleRowPowerDissipationBlur(scope.$index)}},model:{value:(scope.row.powerDissipation),callback:function ($$v) {_vm.$set(scope.row, \"powerDissipation\", $$v)},expression:\"scope.row.powerDissipation\"}},[_c('template',{slot:\"append\"},[_vm._v(\"kw/h\")])],2)]}}],null,false,2461731706)}),_c('el-table-column',{attrs:{\"label\":\"理论算力\",\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('div',{staticStyle:{\"display\":\"flex\",\"align-items\":\"center\",\"gap\":\"8px\"}},[_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"理论算力\",\"inputmode\":\"decimal\"},on:{\"input\":function($event){return _vm.handleRowTheoryPowerInput(scope.$index)},\"blur\":function($event){return _vm.handleRowTheoryPowerBlur(scope.$index)}},model:{value:(scope.row.theoryPower),callback:function ($$v) {_vm.$set(scope.row, \"theoryPower\", $$v)},expression:\"scope.row.theoryPower\"}}),_c('el-select',{staticStyle:{\"width\":\"150px\"},attrs:{\"placeholder\":\"单位\"},on:{\"change\":val => _vm.handleRowUnitChange(scope.$index, val)},model:{value:(scope.row.unit),callback:function ($$v) {_vm.$set(scope.row, \"unit\", $$v)},expression:\"scope.row.unit\"}},[_c('el-option',{attrs:{\"label\":\"KH/S\",\"value\":\"KH/S\"}}),_c('el-option',{attrs:{\"label\":\"MH/S\",\"value\":\"MH/S\"}}),_c('el-option',{attrs:{\"label\":\"GH/S\",\"value\":\"GH/S\"}}),_c('el-option',{attrs:{\"label\":\"TH/S\",\"value\":\"TH/S\"}}),_c('el-option',{attrs:{\"label\":\"PH/S\",\"value\":\"PH/S\"}})],1)],1)]}}],null,false,2316701192)}),_c('el-table-column',{attrs:{\"label\":\"售价(按结算币种)\",\"min-width\":\"220\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('div',{staticClass:\"price-multi\"},[(_vm.payTypeDefs && _vm.payTypeDefs.length)?_c('div',{staticClass:\"price-items\"},_vm._l((_vm.payTypeDefs),function(pt){return _c('div',{key:pt.key,staticClass:\"price-item\"},[_c('el-input',{attrs:{\"placeholder\":\"价格\",\"inputmode\":\"decimal\"},on:{\"input\":() => _vm.handleRowPriceMapInput(scope.$index, pt.key),\"blur\":() => _vm.handleRowPriceMapBlur(scope.$index, pt.key)},model:{value:(scope.row.priceMap[pt.key]),callback:function ($$v) {_vm.$set(scope.row.priceMap, pt.key, $$v)},expression:\"scope.row.priceMap[pt.key]\"}},[_c('template',{slot:\"append\"},[_vm._v(_vm._s(pt.label))])],2)],1)}),0):_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"价格\",\"inputmode\":\"decimal\"},on:{\"input\":function($event){return _vm.handleRowPriceInput(scope.$index)},\"blur\":function($event){return _vm.handleRowPriceBlur(scope.$index)}},model:{value:(scope.row.price),callback:function ($$v) {_vm.$set(scope.row, \"price\", $$v)},expression:\"scope.row.price\"}},[_c('template',{slot:\"append\"},[_vm._v(\"USDT\")])],2)],1)]}}],null,false,3822584807)},[_c('template',{slot:\"header\"},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"placement\":\"top\"}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_vm._v(\" 卖家最终收款金额 = 机器售价 × 波动率\"),_c('br'),_vm._v(\" 波动率规则:\"),_c('br'),_vm._v(\" 1)0% - 5%(包含5%):波动率 = 1(按售价结算)\"),_c('br'),_vm._v(\" 2)5%以上:波动率 = 实际算力 / 理论算力,且不会超过 1,即最终结算时不会超过机器售价 \")]),_c('i',{staticClass:\"el-icon-question label-help\",attrs:{\"aria-label\":\"帮助\",\"tabindex\":\"0\"}})]),_c('span',[_vm._v(\"售价(按结算币种)\")])],1)],2),_c('el-table-column',{attrs:{\"label\":\"最大租赁天数(天)\",\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"1-365\",\"inputmode\":\"numeric\"},on:{\"input\":function($event){return _vm.handleRowMaxLeaseDaysInput(scope.$index)},\"blur\":function($event){return _vm.handleRowMaxLeaseDaysBlur(scope.$index)}},model:{value:(scope.row.maxLeaseDays),callback:function ($$v) {_vm.$set(scope.row, \"maxLeaseDays\", $$v)},expression:\"scope.row.maxLeaseDays\"}},[_c('template',{slot:\"append\"},[_vm._v(\"天\")])],2)]}}],null,false,309661603)}),_c('el-table-column',{attrs:{\"label\":\"矿机型号\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{staticStyle:{\"width\":\"100%\"},attrs:{\"placeholder\":\"矿机型号\",\"maxlength\":20},on:{\"input\":function($event){return _vm.handleRowTypeInput(scope.$index)},\"blur\":function($event){return _vm.handleRowTypeBlur(scope.$index)}},model:{value:(scope.row.type),callback:function ($$v) {_vm.$set(scope.row, \"type\", $$v)},expression:\"scope.row.type\"}})]}}],null,false,1752667191)}),_c('el-table-column',{attrs:{\"label\":\"上下架状态\",\"width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":scope.row.state === 0 ? 'success' : 'info',\"size\":\"mini\"},on:{\"click\":function($event){return _vm.handleToggleState(scope.$index)}}},[_vm._v(\" \"+_vm._s(scope.row.state === 0 ? '上架' : '下架')+\" \")])]}}],null,false,875649026)})],1)],1):_vm._e(),_c('div',{staticClass:\"actions\"},[_c('el-button',{on:{\"click\":_vm.handleBack}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"loading\":_vm.saving},on:{\"click\":_vm.handleSave}},[_vm._v(\"确认添加\")])],1),_c('el-dialog',{attrs:{\"title\":\"请确认上架信息\",\"visible\":_vm.confirmVisible,\"width\":\"400px\"},on:{\"update:visible\":function($event){_vm.confirmVisible=$event}}},[_c('div',[_c('p',[_vm._v(\"请仔细确认已选择机器列表、价格及相关参数定义。\")]),_c('p',{staticStyle:{\"text-align\":\"left\"}},[_vm._v(\"机器上架后,一经售出,在机器出售期间不能修改价格及机器参数。\")])]),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.confirmVisible = false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"loading\":_vm.saving},on:{\"click\":_vm.doSubmit}},[_vm._v(\"确认上架已选择机器\")])],1)])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"header-container\"},[_c('nav',{staticClass:\"navbar\"},_vm._l((_vm.navigation),function(nav){return _c('router-link',{key:nav.path,staticClass:\"nav-btn\",attrs:{\"to\":nav.path,\"active-class\":\"active\",\"title\":nav.description}},[_c('span',{staticClass:\"nav-icon\"},[_vm._v(_vm._s(nav.icon))]),_c('span',{staticClass:\"nav-text\"},[_vm._v(_vm._s(nav.name))]),(nav.path === '/cart')?_c('span',{staticClass:\"cart-count\"},[_vm._v(\"(\"+_vm._s(_vm.cartItemCount)+\")\")]):_vm._e()])}),1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\r\n * 解密函数(与发送端保持一致)\r\n * @param {string} encryptedText - 加密的文本\r\n * @param {string} secretKey - 密钥\r\n * @returns {string} 解密后的字符串\r\n */\r\nfunction decryptData(encryptedText, secretKey) {\r\n try {\r\n // Base64解码\r\n const encrypted = atob(encryptedText);\r\n let decrypted = '';\r\n for (let i = 0; i < encrypted.length; i++) {\r\n decrypted += String.fromCharCode(encrypted.charCodeAt(i) ^ secretKey.charCodeAt(i % secretKey.length));\r\n }\r\n return decrypted;\r\n } catch (error) {\r\n console.error('解密失败:', error);\r\n return null;\r\n }\r\n }\r\n \r\n /**\r\n * 获取并解密URL参数\r\n */\r\n function getDecryptedParams() {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const encryptedData = urlParams.get('data');\r\n const language = urlParams.get('language');\r\n const username = urlParams.get('username');\r\n const source = urlParams.get('source');\r\n const version = urlParams.get('version');\r\n \r\n // 解密敏感数据\r\n const secretKey = 'mining-pool-secret-key-2024'; // 必须与发送端保持一致\r\n let sensitiveData = null;\r\n \r\n if (encryptedData) {\r\n try {\r\n const decryptedJson = decryptData(encryptedData, secretKey);\r\n sensitiveData = JSON.parse(decryptedJson);\r\n } catch (error) {\r\n console.error('解密或解析数据失败:', error);\r\n }\r\n }\r\n \r\n return {\r\n // 敏感数据(已解密)\r\n token: sensitiveData?.token || '',\r\n leasEmail: sensitiveData?.leasEmail || '',\r\n userId: sensitiveData?.userId || '',\r\n timestamp: sensitiveData?.timestamp || null,\r\n \r\n // 非敏感数据(明文)\r\n language: language || 'zh',\r\n username: username || '',\r\n source: source || '',\r\n version: version || '1.0'\r\n };\r\n }\r\n \r\n /**\r\n * 执行自动登录\r\n */\r\n function performAutoLogin(token, userId, leasEmail) {\r\n console.log('执行自动登录:', { userId, leasEmail: leasEmail ? '***' : '' });\r\n // 这里可以添加自动登录的逻辑\r\n // 例如:设置全局状态、跳转页面等\r\n }\r\n \r\n /**\r\n * 设置界面语言\r\n */\r\n function setLanguage(language) {\r\n console.log('设置语言:', language);\r\n // 这里可以添加语言设置的逻辑\r\n // 例如:设置 i18n 语言、更新界面等\r\n }\r\n\r\n // 使用示例\r\n document.addEventListener('DOMContentLoaded', function() {\r\n const params = getDecryptedParams();\r\n if (params.token) {\r\n console.log(params.token,\"params.token 存入\");\r\n \r\n localStorage.setItem('token', params.token);\r\n localStorage.setItem('leasEmail', params.leasEmail);\r\n localStorage.setItem('userId', params.userId);\r\n localStorage.setItem('language', params.language);\r\n localStorage.setItem('username', params.username);\r\n localStorage.setItem('source', params.source);\r\n localStorage.setItem('version', params.version);\r\n }\r\n \r\n console.log('接收到的参数:', {\r\n userId: params.userId ? '***' : '',\r\n leasEmail: params.leasEmail ? '***' : '',\r\n token: params.token ? '***' : '',\r\n language: params.language,\r\n username: params.username,\r\n source: params.source\r\n });\r\n \r\n // 根据参数执行相应操作\r\n if (params.token && params.userId) {\r\n // 执行自动登录\r\n performAutoLogin(params.token, params.userId, params.leasEmail);\r\n }\r\n \r\n if (params.language) {\r\n // 设置界面语言\r\n setLanguage(params.language);\r\n }\r\n });","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./rechargeRecord.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./rechargeRecord.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./rechargeRecord.vue?vue&type=template&id=5cf693fa&scoped=true\"\nimport script from \"./rechargeRecord.vue?vue&type=script&lang=js\"\nexport * from \"./rechargeRecord.vue?vue&type=script&lang=js\"\nimport style0 from \"./rechargeRecord.vue?vue&type=style&index=0&id=5cf693fa&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5cf693fa\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./fundsFlow.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./fundsFlow.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./fundsFlow.vue?vue&type=template&id=32104fd7&scoped=true\"\nimport script from \"./fundsFlow.vue?vue&type=script&lang=js\"\nexport * from \"./fundsFlow.vue?vue&type=script&lang=js\"\nimport style0 from \"./fundsFlow.vue?vue&type=style&index=0&id=32104fd7&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"32104fd7\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"account-purchased\"},[_vm._m(0),_c('el-table',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.tableData,\"border\":\"\",\"stripe\":\"\"}},[_c('el-table-column',{attrs:{\"prop\":\"userId\",\"label\":\"用户\",\"width\":\"180\"}}),_c('el-table-column',{attrs:{\"prop\":\"productMachineId\",\"label\":\"机器ID\",\"width\":\"80\"}}),_c('el-table-column',{attrs:{\"prop\":\"type\",\"label\":\"类型\",\"width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.type === 1 ? 'success' : 'info'}},[_vm._v(\" \"+_vm._s(scope.row.type === 1 ? \"算力套餐\" : \"挖矿机器\")+\" \")])]}}])}),_c('el-table-column',{attrs:{\"prop\":\"estimatedEndIncome\",\"label\":\"预计总收益\",\"min-width\":\"140\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"value strong\"},[(_vm.formatAmount(scope.row.estimatedEndIncome, scope.row.coin || 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row.estimatedEndIncome, scope.row.coin || 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row.estimatedEndIncome, scope.row.coin || 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row.estimatedEndIncome, scope.row.coin || 'USDT').text))])],1)]}}])}),_c('el-table-column',{attrs:{\"prop\":\"estimatedEndUsdtIncome\",\"label\":\"预计USDT总收益\",\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticClass:\"value strong\"},[(_vm.formatAmount(scope.row.estimatedEndUsdtIncome, 'USDT').truncated)?_c('el-tooltip',{attrs:{\"content\":_vm.formatAmount(scope.row.estimatedEndUsdtIncome, 'USDT').full,\"placement\":\"top\"}},[_c('span',[_vm._v(\" \"+_vm._s(_vm.formatAmount(scope.row.estimatedEndUsdtIncome, 'USDT').text)+\" \"),_c('i',{staticClass:\"el-icon-more amount-more\"})])]):_c('span',[_vm._v(_vm._s(_vm.formatAmount(scope.row.estimatedEndUsdtIncome, 'USDT').text))])],1)]}}])}),_c('el-table-column',{attrs:{\"prop\":\"startTime\",\"label\":\"开始时间\",\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',[_vm._v(_vm._s(_vm.formatDateTime(scope.row.startTime)))])]}}])}),_c('el-table-column',{attrs:{\"prop\":\"endTime\",\"label\":\"结束时间\",\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',[_vm._v(_vm._s(_vm.formatDateTime(scope.row.endTime)))])]}}])}),_c('el-table-column',{attrs:{\"prop\":\"status\",\"label\":\"状态\",\"width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.status === 0 ? 'success' : 'info'}},[_vm._v(\" \"+_vm._s(scope.row.status === 0 ? \"运行中\" : \"已过期\")+\" \")])]}}])}),_c('el-table-column',{attrs:{\"label\":\"操作\",\"fixed\":\"right\",\"width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.handleView(scope.row)}}},[_vm._v(\"详情\")])]}}])})],1),_c('div',{staticClass:\"pagination\"},[_c('el-pagination',{attrs:{\"background\":\"\",\"layout\":\"total, sizes, prev, pager, next, jumper\",\"total\":_vm.total,\"current-page\":_vm.pagination.pageNum,\"page-sizes\":[10, 20, 50, 100],\"page-size\":_vm.pagination.pageSize},on:{\"update:currentPage\":function($event){return _vm.$set(_vm.pagination, \"pageNum\", $event)},\"update:current-page\":function($event){return _vm.$set(_vm.pagination, \"pageNum\", $event)},\"update:pageSize\":function($event){return _vm.$set(_vm.pagination, \"pageSize\", $event)},\"update:page-size\":function($event){return _vm.$set(_vm.pagination, \"pageSize\", $event)},\"size-change\":_vm.handleSizeChange,\"current-change\":_vm.handleCurrentChange}})],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"toolbar\"},[_c('div',{staticClass:\"left-area\"},[_c('h2',{staticClass:\"page-title\"},[_vm._v(\"已购商品\")])])])\n}]\n\nexport { render, staticRenderFns }","\n\n\n\n ","/**\r\n * 错误提示管理器\r\n * 用于控制错误提示的频率,避免短时间内重复显示相同类型的错误\r\n */\r\nclass ErrorNotificationManager {\r\n constructor() {\r\n // 记录最近显示的错误信息\r\n this.recentErrors = new Map();\r\n // 默认节流时间 (30秒)\r\n this.throttleTime = 3000;\r\n // 错误类型映射\r\n this.errorTypes = {\r\n 'Network Error': 'network',\r\n 'timeout': 'timeout',\r\n 'Request failed with status code': 'statusCode',\r\n // 添加网络状态类型\r\n 'networkReconnected': 'networkStatus',\r\n 'NetworkError': 'network'\r\n };\r\n }\r\n\r\n /**\r\n * 获取错误类型\r\n * @param {String} message 错误信息\r\n * @returns {String} 错误类型\r\n */\r\n getErrorType(message) {\r\n for (const [key, type] of Object.entries(this.errorTypes)) {\r\n if (message.includes(key)) {\r\n return type;\r\n }\r\n }\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * 检查是否可以显示错误\r\n * @param {String} message 错误信息\r\n * @returns {Boolean} 是否可以显示\r\n */\r\n canShowError(message) {\r\n const errorType = this.getErrorType(message);\r\n const now = Date.now();\r\n \r\n // 检查同类型的错误是否最近已经显示过\r\n if (this.recentErrors.has(errorType)) {\r\n const lastTime = this.recentErrors.get(errorType);\r\n if (now - lastTime < this.throttleTime) {\r\n console.log(`[错误提示] 已抑制重复错误: ${errorType}`);\r\n return false;\r\n }\r\n }\r\n \r\n // 更新最后显示时间\r\n this.recentErrors.set(errorType, now);\r\n return true;\r\n }\r\n\r\n /**\r\n * 清理过期的错误记录\r\n */\r\n cleanup() {\r\n const now = Date.now();\r\n this.recentErrors.forEach((time, type) => {\r\n if (now - time > this.throttleTime) {\r\n this.recentErrors.delete(type);\r\n }\r\n });\r\n }\r\n}\r\n\r\n// 创建单例实例\r\nconst errorNotificationManager = new ErrorNotificationManager();\r\nexport default errorNotificationManager;","\r\n\r\n\r\n\r\n","\n\n\n\n ","/**\r\n * @file 商品数据服务(轻量静态数据源)\r\n * @description 提供商品列表与详情查询。无需后端即可演示。\r\n */\r\n\r\n/**\r\n * @typedef {Object} Product\r\n * @property {string} id - 商品唯一标识\r\n * @property {string} title - 商品标题\r\n * @property {string} description - 商品描述\r\n * @property {number} price - 商品单价(元)\r\n * @property {string} image - 商品图片URL(此处使用占位图)\r\n */\r\n\r\n/**\r\n * 内置演示商品数据\r\n * 使用简短且清晰的字段,满足演示所需\r\n * @type {Product[]}\r\n */\r\nconst products = [\r\n {\r\n id: 'p1001',\r\n title: '新能源充电桩(家用)',\r\n description: '7kW 单相,智能预约,支持远程监控。',\r\n price: 1299,\r\n image: 'https://via.placeholder.com/300x200?text=%E5%85%85%E7%94%B5%E6%A1%A9'\r\n },\r\n {\r\n id: 'p1002',\r\n title: '工业电能表',\r\n description: '三相四线,远程抄表,Modbus 通信。',\r\n price: 899,\r\n image: 'https://via.placeholder.com/300x200?text=%E7%94%B5%E8%83%BD%E8%A1%A8'\r\n },\r\n {\r\n id: 'p1003',\r\n title: '配电柜(入门版)',\r\n description: 'IP54 防护,内置断路器与防雷模块。',\r\n price: 5599,\r\n image: 'https://via.placeholder.com/300x200?text=%E9%85%8D%E7%94%B5%E6%9F%9C'\r\n },\r\n {\r\n id: 'p1004',\r\n title: '工矿照明灯',\r\n description: '120W 高亮,耐腐蚀,适配多场景。',\r\n price: 329,\r\n image: 'https://via.placeholder.com/300x200?text=%E7%85%A7%E6%98%8E%E7%81%AF'\r\n }\r\n]\r\n\r\n/**\r\n * 获取全部商品\r\n * @returns {Promise}\r\n */\r\nexport const listProducts = async () => {\r\n return Promise.resolve(products);\r\n}\r\n\r\n/**\r\n * 根据ID获取商品\r\n * @param {string} productId - 商品ID\r\n * @returns {Promise}\r\n */\r\nexport const getProductById = async (productId) => {\r\n const product = products.find((p) => p.id === productId);\r\n return Promise.resolve(product);\r\n}\r\n\r\nexport default {\r\n listProducts,\r\n getProductById\r\n}\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./myShops.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./myShops.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./myShops.vue?vue&type=template&id=031e6e83&scoped=true\"\nimport script from \"./myShops.vue?vue&type=script&lang=js\"\nexport * from \"./myShops.vue?vue&type=script&lang=js\"\nimport style0 from \"./myShops.vue?vue&type=style&index=0&id=031e6e83&prod&scoped=true&lang=css\"\nimport style1 from \"./myShops.vue?vue&type=style&index=1&id=031e6e83&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"031e6e83\",\n null\n \n)\n\nexport default component.exports","\r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./products.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./products.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./products.vue?vue&type=template&id=d6c9b7e4&scoped=true\"\nimport script from \"./products.vue?vue&type=script&lang=js\"\nexport * from \"./products.vue?vue&type=script&lang=js\"\nimport style0 from \"./products.vue?vue&type=style&index=0&id=d6c9b7e4&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d6c9b7e4\",\n null\n \n)\n\nexport default component.exports","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./orders.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./orders.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./orders.vue?vue&type=template&id=2ad2c7c3&scoped=true\"\nimport script from \"./orders.vue?vue&type=script&lang=js\"\nexport * from \"./orders.vue?vue&type=script&lang=js\"\nimport style0 from \"./orders.vue?vue&type=style&index=0&id=2ad2c7c3&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2ad2c7c3\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./receiptRecord.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./receiptRecord.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./receiptRecord.vue?vue&type=template&id=bd46f398&scoped=true\"\nimport script from \"./receiptRecord.vue?vue&type=script&lang=js\"\nexport * from \"./receiptRecord.vue?vue&type=script&lang=js\"\nimport style0 from \"./receiptRecord.vue?vue&type=style&index=0&id=bd46f398&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"bd46f398\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"account-product-detail\"},[_c('div',{staticClass:\"header\"},[_c('el-button',{attrs:{\"type\":\"text\"},on:{\"click\":_vm.handleBack}},[_vm._v(\"返回\")]),_c('h2',{staticClass:\"title\"},[_vm._v(\"商品详情\")])],1),_c('el-card',{staticClass:\"detail-card\",attrs:{\"shadow\":\"never\"}},[_c('el-form',{staticClass:\"detail-form\",attrs:{\"model\":_vm.product,\"label-width\":\"90px\",\"size\":\"small\"}},[_c('el-row',{attrs:{\"gutter\":16}},[_c('el-col',{attrs:{\"span\":12}},[_c('el-form-item',{attrs:{\"label\":\"商品ID\"}},[_c('el-input',{attrs:{\"value\":_vm.product && _vm.product.id,\"disabled\":\"\"}})],1)],1),_c('el-col',{attrs:{\"span\":12}},[_c('el-form-item',{attrs:{\"label\":\"店铺ID\"}},[_c('el-input',{attrs:{\"value\":_vm.product && _vm.product.shopId,\"disabled\":\"\"}})],1)],1),_c('el-col',{attrs:{\"span\":12}},[_c('el-form-item',{attrs:{\"label\":\"名称\"}},[_c('el-input',{attrs:{\"value\":_vm.product && _vm.product.name,\"disabled\":\"\"}})],1)],1),_c('el-col',{attrs:{\"span\":12}},[_c('el-form-item',{attrs:{\"label\":\"币种\"}},[_c('el-input',{attrs:{\"value\":_vm.product && _vm.product.coin,\"disabled\":\"\"}})],1)],1),_c('el-col',{attrs:{\"span\":12}},[_c('el-form-item',{attrs:{\"label\":\"算法\"}},[_c('el-input',{attrs:{\"value\":_vm.product && _vm.product.algorithm,\"disabled\":\"\"}})],1)],1),_c('el-col',{attrs:{\"span\":12}},[_c('el-form-item',{attrs:{\"label\":\"类型\"}},[_c('el-input',{attrs:{\"value\":_vm.product && (_vm.product.type === 1 ? '算力套餐' : '挖矿机器'),\"disabled\":\"\"}})],1)],1),_c('el-col',{attrs:{\"span\":12}},[_c('el-form-item',{attrs:{\"label\":\"状态\"}},[_c('el-input',{attrs:{\"value\":_vm.product && (_vm.product.state === 1 ? '下架' : '上架'),\"disabled\":\"\"}})],1)],1),_c('el-col',{attrs:{\"span\":12}}),_c('el-col',{attrs:{\"span\":24}},[_c('el-form-item',{attrs:{\"label\":\"描述\"}},[_c('el-input',{attrs:{\"type\":\"textarea\",\"rows\":3,\"value\":_vm.product && _vm.product.description,\"disabled\":\"\"}})],1)],1)],1)],1)],1),_c('el-card',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.updateLoading),expression:\"updateLoading\"}],staticClass:\"detail-card\",attrs:{\"shadow\":\"never\"}},[_c('div',{staticClass:\"section-title\",attrs:{\"slot\":\"header\"},slot:\"header\"},[_vm._v(\"机器组合\")]),(_vm.machineList && _vm.machineList.length)?_c('div',[_c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.machineList,\"border\":\"\",\"stripe\":\"\"}},[_c('el-table-column',{attrs:{\"prop\":\"user\",\"label\":\"挖矿账户\"}}),_c('el-table-column',{attrs:{\"prop\":\"id\",\"label\":\"矿机ID\"}}),_c('el-table-column',{attrs:{\"prop\":\"miner\",\"label\":\"机器编号\"}}),_c('el-table-column',{attrs:{\"label\":\"实际算力\",\"width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(scope.row.computingPower)+\" \"+_vm._s(scope.row.unit || ''))]}}],null,false,881627289)},[_c('template',{slot:\"header\"},[_c('el-tooltip',{attrs:{\"content\":\"实际算力为该机器在本矿池过去24H的平均算力\",\"effect\":\"dark\",\"placement\":\"top\"}},[_c('i',{staticClass:\"el-icon-question label-help\",attrs:{\"aria-label\":\"帮助\",\"tabindex\":\"0\"}})]),_c('span',[_vm._v(\"实际算力\")])],1)],2),_c('el-table-column',{attrs:{\"label\":\"理论算力\",\"min-width\":\"140\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{class:{ 'changed-input': _vm.isCellChanged(scope.row, 'theoryPower') },staticStyle:{\"max-width\":\"260px\"},attrs:{\"size\":\"small\",\"inputmode\":\"decimal\",\"disabled\":_vm.isRowDisabled(scope.row)},on:{\"input\":function($event){return _vm.handleTheoryPowerInput(scope.$index)},\"blur\":function($event){return _vm.handleTheoryPowerBlur(scope.$index)}},model:{value:(scope.row.theoryPower),callback:function ($$v) {_vm.$set(scope.row, \"theoryPower\", $$v)},expression:\"scope.row.theoryPower\"}},[_c('template',{slot:\"append\"},[_c('el-select',{staticClass:\"append-select append-select--unit\",staticStyle:{\"width\":\"90px\"},attrs:{\"size\":\"mini\",\"disabled\":_vm.isRowDisabled(scope.row)},model:{value:(scope.row.unit),callback:function ($$v) {_vm.$set(scope.row, \"unit\", $$v)},expression:\"scope.row.unit\"}},_vm._l((_vm.unitOptions),function(u){return _c('el-option',{key:u,attrs:{\"label\":u,\"value\":u}})}),1)],1)],2)]}}],null,false,1615065668)}),_c('el-table-column',{attrs:{\"label\":\"功耗(kw/h)\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{class:{ 'changed-input': _vm.isCellChanged(scope.row, 'powerDissipation') },staticStyle:{\"max-width\":\"260px\"},attrs:{\"size\":\"small\",\"inputmode\":\"decimal\",\"disabled\":_vm.isRowDisabled(scope.row)},on:{\"input\":function($event){return _vm.handleNumericCell(scope.$index, 'powerDissipation')},\"blur\":function($event){return _vm.handlePowerDissipationBlur(scope.$index)}},model:{value:(scope.row.powerDissipation),callback:function ($$v) {_vm.$set(scope.row, \"powerDissipation\", $$v)},expression:\"scope.row.powerDissipation\"}})]}}],null,false,2013801812)}),_c('el-table-column',{attrs:{\"label\":\"型号\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{class:{ 'changed-input': _vm.isCellChanged(scope.row, 'type') },staticStyle:{\"max-width\":\"180px\"},attrs:{\"size\":\"small\",\"maxlength\":20,\"disabled\":_vm.isRowDisabled(scope.row)},on:{\"input\":function($event){return _vm.handleTypeCell(scope.$index)}},model:{value:(scope.row.type),callback:function ($$v) {_vm.$set(scope.row, \"type\", $$v)},expression:\"scope.row.type\"}})]}}],null,false,4182654038)}),_c('el-table-column',{attrs:{\"label\":\"售价\",\"width\":\"188\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{class:{ 'changed-input': _vm.isCellChanged(scope.row, 'price') },staticStyle:{\"max-width\":\"260px\"},attrs:{\"size\":\"small\",\"inputmode\":\"decimal\",\"disabled\":_vm.isRowDisabled(scope.row)},on:{\"input\":function($event){return _vm.handleNumericCell(scope.$index, 'price')},\"blur\":function($event){return _vm.handlePriceBlur(scope.$index)}},model:{value:(scope.row._priceEditing),callback:function ($$v) {_vm.$set(scope.row, \"_priceEditing\", $$v)},expression:\"scope.row._priceEditing\"}},[_c('template',{slot:\"append\"},[_c('el-select',{staticClass:\"append-select append-select--coin\",staticStyle:{\"width\":\"120px\"},attrs:{\"size\":\"mini\"},on:{\"change\":function($event){return _vm.handlePayTypeChange(scope.$index)}},model:{value:(scope.row._selectedPayIndex),callback:function ($$v) {_vm.$set(scope.row, \"_selectedPayIndex\", $$v)},expression:\"scope.row._selectedPayIndex\"}},_vm._l(((scope.row.priceList || [])),function(pt,i){return _c('el-option',{key:pt.payTypeId || i,attrs:{\"label\":[String(pt.chain||'').toUpperCase(), String(pt.coin||'').toUpperCase()].filter(Boolean).join('-'),\"value\":i}})}),1)],1)],2)]}}],null,false,3035245774)},[_c('template',{slot:\"header\"},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"placement\":\"top\"}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_vm._v(\" 卖家最终收款金额 = 机器售价 × 波动率\"),_c('br'),_vm._v(\" 波动率规则:\"),_c('br'),_vm._v(\" 1)0% - 5%(包含5%):波动率 = 1(按售价结算)\"),_c('br'),_vm._v(\" 2)5%以上:波动率 = 实际算力 / 理论算力,且不会超过 1,即最终结算时不会超过机器售价 \")]),_c('i',{staticClass:\"el-icon-question label-help\",attrs:{\"aria-label\":\"帮助\",\"tabindex\":\"0\"}})]),_c('span',[_vm._v(\"售价(按结算币种)\")])],1)],2),_c('el-table-column',{attrs:{\"label\":\"最大租赁天数(天)\",\"width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{class:{ 'changed-input': _vm.isCellChanged(scope.row, 'maxLeaseDays') },staticStyle:{\"max-width\":\"260px\"},attrs:{\"size\":\"small\",\"inputmode\":\"numeric\",\"disabled\":_vm.isRowDisabled(scope.row)},on:{\"input\":function($event){return _vm.handleMaxLeaseDaysInput(scope.$index)},\"blur\":function($event){return _vm.handleMaxLeaseDaysBlur(scope.$index)}},model:{value:(scope.row.maxLeaseDays),callback:function ($$v) {_vm.$set(scope.row, \"maxLeaseDays\", $$v)},expression:\"scope.row.maxLeaseDays\"}},[_c('template',{slot:\"append\"},[_vm._v(\"天\")])],2)]}}],null,false,3414109227)}),_c('el-table-column',{attrs:{\"label\":\"上下架\",\"min-width\":\"140\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-switch',{attrs:{\"active-value\":0,\"inactive-value\":1,\"active-text\":\"上架\",\"inactive-text\":\"下架\",\"disabled\":_vm.isRowDisabled(scope.row)},on:{\"change\":function($event){return _vm.handleStateChange(scope.$index)}},model:{value:(scope.row.state),callback:function ($$v) {_vm.$set(scope.row, \"state\", $$v)},expression:\"scope.row.state\"}})]}}],null,false,1620801377)}),_c('el-table-column',{attrs:{\"label\":\"售出状态\",\"min-width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.saleState === 0 ? 'info' : (scope.row.saleState === 1 ? 'danger' : 'warning')}},[_vm._v(\" \"+_vm._s(scope.row.saleState === 0 ? '未售出' : (scope.row.saleState === 1 ? '已售出' : '售出中'))+\" \")])]}}],null,false,1904393654)}),_c('el-table-column',{attrs:{\"label\":\"操作\",\"fixed\":\"right\",\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{staticStyle:{\"color\":\"#f56c6c\"},attrs:{\"type\":\"text\",\"size\":\"small\",\"disabled\":_vm.isRowDisabled(scope.row)},on:{\"click\":function($event){return _vm.handleDeleteMachine(scope.row)}}},[_vm._v(\"删除\")])]}}],null,false,979761678)})],1)],1):_c('div',{staticClass:\"empty-text\"},[_vm._v(\"暂无组合数据\")])]),(_vm.machineList && _vm.machineList.length)?_c('div',{staticClass:\"actions\"},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleOpenConfirm}},[_vm._v(\"提交修改机器\")])],1):_vm._e(),_c('el-dialog',{attrs:{\"title\":\"确认提交修改\",\"visible\":_vm.confirmVisible,\"width\":\"520px\"},on:{\"update:visible\":function($event){_vm.confirmVisible=$event}}},[_c('div',[_c('p',[_vm._v(\"请仔细确认已选择机器机器组合里的机器价格及相关参数定义。\")]),_c('p',[_vm._v(\"机器修改上架后,一经售出,在机器出售期间不能修改价格及机器参数。\")])]),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.confirmVisible = false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleSubmitMachines}},[_vm._v(\"确认提交修改\")])],1)])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"withdrawal-history-container\"},[_vm._m(0),_c('div',{staticClass:\"tab-container\"},[_c('el-tabs',{on:{\"tab-click\":_vm.handleTabClick},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},[_c('el-tab-pane',{attrs:{\"label\":\"提现中\",\"name\":\"pending\"}},[_c('div',{staticClass:\"tab-content\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"提现中 (\"+_vm._s(_vm.total)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.refreshData}},[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\" 刷新 \")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"withdrawal-list\"},[_vm._l((_vm.pendingWithdrawals),function(item){return _c('div',{key:item.id,staticClass:\"withdrawal-item pending\",on:{\"click\":function($event){return _vm.showDetail(item)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[_vm._v(_vm._s(item.amount)+\" \"+_vm._s(item.toSymbol || 'USDT'))]),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.getChainName(item.toChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status pending-status\"},[_c('i',{staticClass:\"el-icon-loading\"}),_vm._v(\" \"+_vm._s(_vm.getStatusText(item.status))+\" \")]),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatTime(item.createTime)))])])]),_c('div',{staticClass:\"item-footer\"},[_c('div',{staticClass:\"footer-left\"},[_c('span',{staticClass:\"address\"},[_vm._v(_vm._s(_vm.formatAddress(item.toAddress)))]),(item.txHash)?_c('span',{staticClass:\"tx-hash\"},[_c('i',{staticClass:\"el-icon-link\"}),_vm._v(\" \"+_vm._s(_vm.formatAddress(item.txHash))+\" \")]):_vm._e()]),_c('i',{staticClass:\"el-icon-arrow-right\"})])])}),(_vm.pendingWithdrawals.length === 0)?_c('div',{staticClass:\"empty-state\"},[_c('i',{staticClass:\"el-icon-document\"}),_c('p',[_vm._v(\"暂无提现中的记录\")])]):_vm._e()],2)])]),_c('el-tab-pane',{attrs:{\"label\":\"提现成功\",\"name\":\"success\"}},[_c('div',{staticClass:\"tab-content\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"提现成功 (\"+_vm._s(_vm.total)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.refreshData}},[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\" 刷新 \")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"withdrawal-list\"},[_vm._l((_vm.successWithdrawals),function(item){return _c('div',{key:item.id,staticClass:\"withdrawal-item success\",on:{\"click\":function($event){return _vm.showDetail(item)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[_vm._v(_vm._s(item.amount)+\" \"+_vm._s(item.toSymbol || 'USDT'))]),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.getChainName(item.toChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status success-status\"},[_c('i',{staticClass:\"el-icon-check\"}),_vm._v(\" \"+_vm._s(_vm.getStatusText(item.status))+\" \")]),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatTime(item.createTime)))])])]),_c('div',{staticClass:\"item-footer\"},[_c('div',{staticClass:\"footer-left\"},[_c('span',{staticClass:\"address\"},[_vm._v(_vm._s(_vm.formatAddress(item.toAddress)))]),(item.txHash)?_c('span',{staticClass:\"tx-hash\"},[_c('i',{staticClass:\"el-icon-link\"}),_vm._v(\" \"+_vm._s(_vm.formatAddress(item.txHash))+\" \")]):_vm._e()]),_c('i',{staticClass:\"el-icon-arrow-right\"})])])}),(_vm.successWithdrawals.length === 0)?_c('div',{staticClass:\"empty-state\"},[_c('i',{staticClass:\"el-icon-document\"}),_c('p',[_vm._v(\"暂无提现成功的记录\")])]):_vm._e()],2)])]),_c('el-tab-pane',{attrs:{\"label\":\"提现失败\",\"name\":\"failed\"}},[_c('div',{staticClass:\"tab-content\"},[_c('div',{staticClass:\"list-header\"},[_c('span',{staticClass:\"list-title\"},[_vm._v(\"提现失败 (\"+_vm._s(_vm.total)+\")\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"size\":\"small\"},on:{\"click\":_vm.refreshData}},[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\" 刷新 \")])],1),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"withdrawal-list\"},[_vm._l((_vm.failedWithdrawals),function(item){return _c('div',{key:item.id,staticClass:\"withdrawal-item failed\",on:{\"click\":function($event){return _vm.showDetail(item)}}},[_c('div',{staticClass:\"item-main\"},[_c('div',{staticClass:\"item-left\"},[_c('div',{staticClass:\"amount\"},[_vm._v(_vm._s(item.amount)+\" \"+_vm._s(item.toSymbol || 'USDT'))]),_c('div',{staticClass:\"chain\"},[_vm._v(_vm._s(_vm.getChainName(item.toChain)))])]),_c('div',{staticClass:\"item-right\"},[_c('div',{staticClass:\"status failed-status\"},[_c('i',{staticClass:\"el-icon-close\"}),_vm._v(\" \"+_vm._s(_vm.getStatusText(item.status))+\" \")]),_c('div',{staticClass:\"time\"},[_vm._v(_vm._s(_vm.formatTime(item.createTime)))])])]),_c('div',{staticClass:\"item-footer\"},[_c('div',{staticClass:\"footer-left\"},[_c('span',{staticClass:\"address\"},[_vm._v(_vm._s(_vm.formatAddress(item.toAddress)))]),(item.txHash)?_c('span',{staticClass:\"tx-hash\"},[_c('i',{staticClass:\"el-icon-link\"}),_vm._v(\" \"+_vm._s(_vm.formatAddress(item.txHash))+\" \")]):_vm._e()]),_c('i',{staticClass:\"el-icon-arrow-right\"})])])}),(_vm.failedWithdrawals.length === 0)?_c('div',{staticClass:\"empty-state\"},[_c('i',{staticClass:\"el-icon-document\"}),_c('p',[_vm._v(\"暂无提现失败的记录\")])]):_vm._e()],2)])])],1),_c('el-row',[_c('el-col',{staticStyle:{\"display\":\"flex\",\"justify-content\":\"center\"},attrs:{\"span\":24}},[_c('el-pagination',{staticStyle:{\"margin\":\"0 auto\",\"margin-top\":\"10px\"},attrs:{\"current-page\":_vm.currentPage,\"page-sizes\":_vm.pageSizes,\"page-size\":_vm.pagination.pageSize,\"layout\":\"total, sizes, prev, pager, next, jumper\",\"total\":_vm.total},on:{\"size-change\":_vm.handleSizeChange,\"current-change\":_vm.handleCurrentChange,\"update:currentPage\":function($event){_vm.currentPage=$event},\"update:current-page\":function($event){_vm.currentPage=$event}}})],1)],1)],1),_c('el-dialog',{attrs:{\"title\":\"提现详情\",\"visible\":_vm.detailDialogVisible,\"width\":\"600px\"},on:{\"update:visible\":function($event){_vm.detailDialogVisible=$event},\"close\":_vm.closeDetail}},[(_vm.selectedItem)?_c('div',{staticClass:\"detail-content\"},[_c('div',{staticClass:\"detail-section\"},[_c('h3',{staticClass:\"section-title\"},[_vm._v(\"基本信息\")]),_c('div',{staticClass:\"detail-list\"},[_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"提现ID\")]),_c('span',{staticClass:\"detail-value\"},[_vm._v(_vm._s(_vm.selectedItem.id))])]),_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"提现金额\")]),_c('span',{staticClass:\"detail-value amount\"},[_vm._v(_vm._s(_vm.selectedItem.amount)+\" \"+_vm._s(_vm.selectedItem.toSymbol || 'USDT'))])]),_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"区块链网络\")]),_c('span',{staticClass:\"detail-value\"},[_vm._v(_vm._s(_vm.getChainName(_vm.selectedItem.toChain)))])]),_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"提现状态\")]),_c('span',{staticClass:\"detail-value\"},[_c('el-tag',{attrs:{\"type\":_vm.getStatusType(_vm.selectedItem.status)}},[_vm._v(\" \"+_vm._s(_vm.getStatusText(_vm.selectedItem.status))+\" \")])],1)])])]),_c('div',{staticClass:\"detail-section\"},[_c('h3',{staticClass:\"section-title\"},[_vm._v(\"地址信息\")]),_c('div',{staticClass:\"detail-list\"},[_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"收款地址\")]),_c('div',{staticClass:\"address-container\"},[_c('span',{staticClass:\"detail-value address\"},[_vm._v(_vm._s(_vm.selectedItem.toAddress))]),_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.copyAddress(_vm.selectedItem.toAddress)}}},[_vm._v(\" 复制 \")])],1)]),_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"交易哈希\")]),_c('div',{staticClass:\"address-container\"},[_c('span',{staticClass:\"detail-value address\"},[_vm._v(_vm._s(_vm.selectedItem.txHash))]),(_vm.selectedItem.txHash)?_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},on:{\"click\":function($event){return _vm.copyAddress(_vm.selectedItem.txHash)}}},[_vm._v(\" 复制 \")]):_vm._e()],1)])])]),_c('div',{staticClass:\"detail-section\"},[_c('h3',{staticClass:\"section-title\"},[_vm._v(\"时间信息\")]),_c('div',{staticClass:\"detail-list\"},[_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"提现时间\")]),_c('span',{staticClass:\"detail-value\"},[_vm._v(_vm._s(_vm.formatFullTime(_vm.selectedItem.createTime)))])]),(_vm.selectedItem.updateTime)?_c('div',{staticClass:\"detail-row\"},[_c('span',{staticClass:\"detail-label\"},[_vm._v(\"完成时间\")]),_c('span',{staticClass:\"detail-value\"},[_vm._v(_vm._s(_vm.formatFullTime(_vm.selectedItem.updateTime)))])]):_vm._e()])])]):_vm._e(),_c('div',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":_vm.closeDetail}},[_vm._v(\"关闭\")])],1)])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"page-header\"},[_c('h1',{staticClass:\"page-title\"},[_vm._v(\"提现记录\")]),_c('p',{staticClass:\"page-subtitle\"},[_vm._v(\"查看您的提现申请和交易状态\")])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"panel\"},[_c('h2',{staticClass:\"panel-title page-title\"},[_vm._v(\"钱包绑定\")]),_c('div',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"panel-body\"},[_c('el-form',{staticClass:\"config-form\",attrs:{\"model\":_vm.form,\"label-width\":\"120px\"}},[_c('el-form-item',{attrs:{\"label\":\"选择链/币种\"}},[_c('el-cascader',{staticStyle:{\"width\":\"420px\"},attrs:{\"options\":_vm.options,\"props\":_vm.cascaderProps,\"show-all-levels\":false,\"clearable\":\"\",\"filterable\":\"\"},on:{\"change\":_vm.handleChange,\"expand-change\":_vm.handleExpandChange},scopedSlots:_vm._u([{key:\"default\",fn:function({ node, data }){return [_c('span',{staticClass:\"custom-node\",attrs:{\"aria-label\":\"cascader-item\",\"tabindex\":\"0\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.handleItemClick(node, data)}}},[_c('span',{staticClass:\"node-label\"},[_vm._v(_vm._s(data.label))]),(node.isLeaf && node.checked)?_c('span',{staticClass:\"leaf-checked\",attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"✓\")]):_vm._e()])]}}]),model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})],1),_c('el-form-item',{attrs:{\"label\":\"已选择币种\"}},[_c('div',{staticClass:\"selected-coins\",attrs:{\"aria-label\":\"selected-coins\",\"tabindex\":\"0\"}},[_vm._l((_vm.selectedCoins),function(coin){return _c('el-tag',{key:coin,attrs:{\"type\":\"warning\",\"effect\":\"light\",\"closable\":\"\",\"disable-transitions\":\"\"},on:{\"close\":function($event){return _vm.handleRemoveSelectedCoin(coin)}}},[_vm._v(\" \"+_vm._s(coin)+\" \")])}),(_vm.selectedCoins.length === 0)?_c('span',{staticClass:\"placeholder\"},[_vm._v(\"未选择\")]):_vm._e()],2)]),_c('el-form-item',{attrs:{\"label\":\"收款钱包地址\"}},[_c('el-input',{attrs:{\"placeholder\":\"请输入\"},model:{value:(_vm.form.payAddress),callback:function ($$v) {_vm.$set(_vm.form, \"payAddress\", $$v)},expression:\"form.payAddress\"}})],1),_c('el-form-item',[_c('el-button',{staticStyle:{\"width\":\"200px\"},attrs:{\"type\":\"primary\"},on:{\"click\":_vm.handleSave}},[_vm._v(\"确认绑定\")])],1)],1),_c('el-dialog',{attrs:{\"visible\":_vm.preCheck.visible,\"width\":\"80vw\",\"close-on-click-modal\":false,\"title\":\"检测到关联商品\"},on:{\"update:visible\":function($event){return _vm.$set(_vm.preCheck, \"visible\", $event)},\"close\":_vm.handlePreCheckClose},scopedSlots:_vm._u([{key:\"footer\",fn:function(){return [_c('el-button',{on:{\"click\":function($event){_vm.preCheck.visible = false}}},[_vm._v(\"取消\")]),_c('el-button',{attrs:{\"type\":\"primary\",\"disabled\":!_vm.canSubmitPreCheck},on:{\"click\":_vm.handleConfirmBindAfterPreview}},[_vm._v(\"继续绑定\")])]},proxy:true}])},[_c('div',{staticStyle:{\"margin-bottom\":\"10px\"}},[_c('el-alert',{attrs:{\"type\":\"warning\",\"closable\":false,\"show-icon\":\"\",\"description\":\"检测到以下商品与本次绑定的链/币相关。继续绑定后,可能需要为这些商品配置该新链下的价格。是否继续?\"}})],1),_c('p',{staticStyle:{\"color\":\"red\",\"font-size\":\"12px\",\"margin-top\":\"6px\",\"text-align\":\"right\"}},[_vm._v(\"* 请填写每个商品对应币种的价格,商品包含机器统一设置价格,如需单台修改请在商品列表-详情页操作\")]),_c('el-table',{attrs:{\"data\":_vm.preCheck.rows,\"height\":\"360\",\"border\":\"\",\"header-cell-style\":{ textAlign: 'left' },\"cell-style\":{ textAlign: 'left' }}},[_c('el-table-column',{attrs:{\"label\":\"商品名称\",\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(scope.row.name || scope.row.productName || scope.row.title || scope.row.product || '-'))]}}])}),_c('el-table-column',{attrs:{\"label\":\"链\",\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(){return [_vm._v(\" \"+_vm._s((_vm.form.chain || '').toUpperCase())+\" \")]},proxy:true}])}),_c('el-table-column',{attrs:{\"label\":\"币种\",\"min-width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.form.payCoin.split(',').map(s=>s.trim().toUpperCase()).join(','))+\" \")]},proxy:true}])}),_c('el-table-column',{attrs:{\"label\":\"总矿机数\",\"min-width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(scope.row.totalMachineNumber != null ? scope.row.totalMachineNumber : (scope.row.total || scope.row.totalMachines || '-')))]}}])}),_c('el-table-column',{attrs:{\"label\":\"商品状态\",\"min-width\":\"100\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(_vm._s(Number(scope.row.state) === 1 ? '下架' : '上架'))]}}])}),_vm._l((_vm.coinsForBind),function(sym){return _c('el-table-column',{key:'price-'+sym,attrs:{\"label\":sym + ' 价格',\"min-width\":\"160\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-input',{staticClass:\"price-input\",attrs:{\"size\":\"mini\",\"placeholder\":\"请输入\",\"inputmode\":\"decimal\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_vm._v(_vm._s(sym))]},proxy:true}],null,true),model:{value:(_vm.preCheck.rowPrices[_vm.getRowKey(scope.row, scope.$index)][sym]),callback:function ($$v) {_vm.$set(_vm.preCheck.rowPrices[_vm.getRowKey(scope.row, scope.$index)], sym, $$v)},expression:\"preCheck.rowPrices[getRowKey(scope.row, scope.$index)][sym]\"}})]}}],null,true)})})],2)],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n ","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./purchasedDetail.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./purchasedDetail.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./purchasedDetail.vue?vue&type=template&id=592f2fb3&scoped=true\"\nimport script from \"./purchasedDetail.vue?vue&type=script&lang=js\"\nexport * from \"./purchasedDetail.vue?vue&type=script&lang=js\"\nimport style0 from \"./purchasedDetail.vue?vue&type=style&index=0&id=592f2fb3&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"592f2fb3\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./OrderList.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./OrderList.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./OrderList.vue?vue&type=template&id=5400b150&scoped=true\"\nimport script from \"./OrderList.vue?vue&type=script&lang=js\"\nexport * from \"./OrderList.vue?vue&type=script&lang=js\"\nimport style0 from \"./OrderList.vue?vue&type=style&index=0&id=5400b150&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5400b150\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./wallet.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./wallet.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./wallet.vue?vue&type=template&id=75ddb61b&scoped=true\"\nimport script from \"./wallet.vue?vue&type=script&lang=js\"\nexport * from \"./wallet.vue?vue&type=script&lang=js\"\nimport style0 from \"./wallet.vue?vue&type=style&index=0&id=75ddb61b&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"75ddb61b\",\n null\n \n)\n\nexport default component.exports","import { getProductList } from '../../api/products'\nexport default {\n name: 'ProductList',\n data() {\n return {\n products: [\n // {\n // id: 1,\n // name: \"Nexa\",\n // price: `10000~20000`,\n // image: \"https://img.yzcdn.cn/vant/apple-1.jpg\",\n // desc: \"NexaPow\",\n // },\n // {\n // id: 2,\n // name: \"grs\",\n // price: `10000~20000`,\n // image: \"https://img.yzcdn.cn/vant/apple-1.jpg\",\n // desc: \"groestl\",\n // },\n // {\n // id: 3,\n // name: \"mona\",\n // price: `10000~20000`,\n // image: \"https://img.yzcdn.cn/vant/apple-1.jpg\",\n // desc: \"Lyra2REv2\",\n // },\n // {\n // id: 4,\n // name: \"dgb\",\n // price: `10000~20000`,\n // image: \"https://img.yzcdn.cn/vant/apple-1.jpg\",\n // desc: \"DigiByte(Skein)\",\n // },\n ],\n loading: false,\n powerList: [\n // {\n // value: 1,\n // label: \"NexaPow\",\n // children: [\n // {\n // value: 1 - 1,\n // label: \"挖矿账户1\",\n // },\n // {\n // value: 1 - 2,\n // label: \"挖矿账户2\",\n // },\n // ],\n // },\n // {\n // value: 2,\n // label: \"Grepow\",\n // children: [\n // {\n // value: 2 - 1,\n // label: \"挖矿账户1\",\n // },\n // {\n // value: 2 - 2,\n // label: \"挖矿账户2\",\n // },\n // ],\n // },\n // {\n // value: 3,\n // label: \"mofang\",\n // children: [\n // {\n // value: 3 - 1,\n // label: \"挖矿账户1\",\n // },\n // ],\n // },\n ], \n currencyList: [\n {\n path: \"nexaAccess\",\n value: \"nexa\",\n label: \"nexa\",\n\n imgUrl: `https://m2pool.com/img/nexa.png`,\n name: \"course.NEXAcourse\",\n show: true,\n amount: 10000,\n },\n {\n path: \"grsAccess\",\n value: \"grs\",\n label: \"grs\",\n\n imgUrl: `https://m2pool.com/img/grs.svg`,\n name: \"course.GRScourse\",\n show: true,\n amount: 1,\n },\n {\n path: \"monaAccess\",\n value: \"mona\",\n label: \"mona\",\n\n imgUrl: `https://m2pool.com/img/mona.svg`,\n name: \"course.MONAcourse\",\n show: true,\n amount: 1,\n },\n {\n path: \"dgbsAccess\",\n value: \"dgbs\",\n // label: \"dgb-skein-pool1\",\n label: \"dgb(skein)\",\n\n imgUrl: `https://m2pool.com/img/dgb.svg`,\n name: \"course.dgbsCourse\",\n show: true,\n amount: 1,\n },\n {\n path: \"dgbqAccess\",\n value: \"dgbq\",\n // label: \"dgb(qubit-pool1)\",\n label: \"dgb(qubit)\",\n\n imgUrl: `https://m2pool.com/img/dgb.svg`,\n name: \"course.dgbqCourse\",\n show: true,\n amount: 1,\n },\n {\n path: \"dgboAccess\",\n value: \"dgbo\",\n // label: \"dgb-odocrypt-pool1\",\n label: \"dgb(odocrypt)\",\n\n imgUrl: `https://m2pool.com/img/dgb.svg`,\n name: \"course.dgboCourse\",\n show: true,\n amount: 1,\n },\n {\n path: \"rxdAccess\",\n value: \"rxd\",\n label: \"radiant(rxd)\",\n\n imgUrl: `https://m2pool.com/img/rxd.png`,\n name: \"course.RXDcourse\",\n show: true,\n amount: 100,\n },\n {\n path: \"enxAccess\",\n value: \"enx\",\n label: \"Entropyx(enx)\",\n\n imgUrl: `https://m2pool.com/img/enx.svg`,\n name: \"course.ENXcourse\",\n show: true,\n amount: 5000,\n },\n {\n path: \"alphminingPool\",\n value: \"alph\",\n label: \"alephium\",\n\n imgUrl: `https://m2pool.com/img/alph.svg`,\n name: \"course.alphCourse\",\n show: true,\n amount: 1,\n },\n ],\n screenCurrency: \"\",\n searchAlgorithm: \"\",\n params:{\n coin: \"\",\n algorithm: \"\"\n },\n productListLoading:false,\n }\n },\n mounted() {\n this.fetchGetList()\n },\n methods: {\n /**\n * 价格裁剪为两位小数(不四舍五入)\n * 兼容区间字符串:\"min-max\" 或 单值\n */\n formatPriceRange(input) {\n try {\n if (input === null || input === undefined) return '0.00'\n const raw = String(input)\n if (raw.includes('-')) {\n const [lo, hi] = raw.split('-')\n return `${this._truncate2(lo)}-${this._truncate2(hi)}`\n }\n return this._truncate2(raw)\n } catch (e) {\n return '0.00'\n }\n },\n /**\n * 将任意数字字符串截断为 2 位小数(不四舍五入)。\n */\n _truncate2(val) {\n if (val === null || val === undefined) return '0.00'\n const str = String(val).trim()\n if (!str) return '0.00'\n const [intPart, decPart = ''] = str.split('.')\n const two = decPart.slice(0, 2)\n return `${intPart}.${two.padEnd(2, '0')}`\n },\n handleCurrencyChange(val){\n try{\n // 清空时(el-select 的 clear 同时触发 change),避免重复请求,交由 handleCurrencyClear 处理\n if (val === undefined || val === null || val === '') return\n // 选择具体币种时,合并算法关键词一起查询\n this.params.coin = val\n const keyword = (this.searchAlgorithm || '').trim()\n const req = keyword ? { coin: val, algorithm: keyword } : { coin: val }\n this.fetchGetList(req)\n \n \n // 可在此发起接口:getProductList({ coin: val })\n // this.fetchGetList({ coin: val })\n }catch(e){\n console.error('处理币种变更失败', e)\n }\n },\n\n async fetchGetList(params) {\n this.productListLoading = true\n try {\n const res = await getProductList(params)\n console.log('API响应:', res)\n if (res && res.code === 200) {\n this.products = res.rows || []\n console.log('商品数据:', this.products)\n } else {\n console.error('API返回错误:', res)\n this.products = []\n }\n } catch (error) {\n console.error('获取商品列表失败:', error)\n this.products = []\n // 添加一些测试数据,避免页面空白\n this.products = [\n // {\n // id: 1,\n // name: \"测试商品1\",\n // algorithm: \"测试算法1\",\n // priceRange: \"100-200\",\n // image: \"https://img.yzcdn.cn/vant/apple-1.jpg\"\n // },\n // {\n // id: 2,\n // name: \"测试商品2\", \n // algorithm: \"测试算法2\",\n // priceRange: \"200-300\",\n // image: \"https://img.yzcdn.cn/vant/apple-1.jpg\"\n // }\n ]\n }\n this.productListLoading = false\n },\n // 算法搜索(使用同一接口,传入 algorithm 参数)\n handleAlgorithmSearch() {\n const keyword = (this.searchAlgorithm || '').trim()\n const next = { ...this.params }\n if (keyword) {\n next.algorithm = keyword\n this.params.algorithm = keyword\n } else {\n delete next.algorithm\n this.params.algorithm = \"\"\n }\n // 不重置下拉,只根据算法关键词查询\n if (next.algorithm) this.fetchGetList({ ...next, coin: this.screenCurrency || undefined })\n else this.fetchGetList(this.screenCurrency ? { coin: this.screenCurrency } : undefined)\n \n },\n // 清空下拉时:只清 coin,保留算法条件\n handleCurrencyClear() {\n this.screenCurrency = \"\"\n this.params.coin = \"\"\n const keyword = (this.searchAlgorithm || '').trim()\n if (keyword) this.fetchGetList({ algorithm: keyword })\n else this.fetchGetList()\n },\n // 清空算法时:只清 algorithm,保留下拉 coin\n handleAlgorithmClear() {\n this.searchAlgorithm = \"\"\n this.params.algorithm = \"\"\n const coin = this.screenCurrency\n if (coin) this.fetchGetList({ coin })\n else this.fetchGetList()\n },\n handleProductClick(product) {\n\n if (product.id || product.id == 0) {\n \n this.$router.push(`/product/${product.id}`); \n } \n\n \n },\n\n\n\n }\n}","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=662f903c\"\nvar script = {}\nimport style0 from \"./App.vue?vue&type=style&index=0&id=662f903c&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export const coinList = [\r\n {\r\n path: \"nexaAccess\",\r\n value: \"nexa\",\r\n label: \"nexa\",\r\n\r\n imgUrl: `https://m2pool.com/img/nexa.png`,\r\n name: \"course.NEXAcourse\",\r\n show: true,\r\n amount: 10000,\r\n },\r\n {\r\n path: \"grsAccess\",\r\n value: \"grs\",\r\n label: \"grs\",\r\n\r\n imgUrl: `https://m2pool.com/img/grs.svg`,\r\n name: \"course.GRScourse\",\r\n show: true,\r\n amount: 1,\r\n },\r\n {\r\n path: \"monaAccess\",\r\n value: \"mona\",\r\n label: \"mona\",\r\n\r\n imgUrl: `https://m2pool.com/img/mona.svg`,\r\n name: \"course.MONAcourse\",\r\n show: true,\r\n amount: 1,\r\n },\r\n {\r\n path: \"dgbsAccess\",\r\n value: \"dgbs\",\r\n // label: \"dgb-skein-pool1\",\r\n label: \"dgb(skein)\",\r\n\r\n imgUrl: `https://m2pool.com/img/dgb.svg`,\r\n name: \"course.dgbsCourse\",\r\n show: true,\r\n amount: 1,\r\n },\r\n {\r\n path: \"dgbqAccess\",\r\n value: \"dgbq\",\r\n // label: \"dgb(qubit-pool1)\",\r\n label: \"dgb(qubit)\",\r\n\r\n imgUrl: `https://m2pool.com/img/dgb.svg`,\r\n name: \"course.dgbqCourse\",\r\n show: true,\r\n amount: 1,\r\n },\r\n {\r\n path: \"dgboAccess\",\r\n value: \"dgbo\",\r\n // label: \"dgb-odocrypt-pool1\",\r\n label: \"dgb(odocrypt)\",\r\n\r\n imgUrl: `https://m2pool.com/img/dgb.svg`,\r\n name: \"course.dgboCourse\",\r\n show: true,\r\n amount: 1,\r\n },\r\n {\r\n path: \"rxdAccess\",\r\n value: \"rxd\",\r\n label: \"radiant(rxd)\",\r\n\r\n imgUrl: `https://m2pool.com/img/rxd.png`,\r\n name: \"course.RXDcourse\",\r\n show: true,\r\n amount: 100,\r\n },\r\n {\r\n path: \"enxAccess\",\r\n value: \"enx\",\r\n label: \"Entropyx(enx)\",\r\n\r\n imgUrl: `https://m2pool.com/img/enx.svg`,\r\n name: \"course.ENXcourse\",\r\n show: true,\r\n amount: 5000,\r\n },\r\n {\r\n path: \"alphminingPool\",\r\n value: \"alph\",\r\n label: \"alephium\",\r\n\r\n imgUrl: `https://m2pool.com/img/alph.svg`,\r\n name: \"course.alphCourse\",\r\n show: true,\r\n amount: 1,\r\n },\r\n ]","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./productNew.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./productNew.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./productNew.vue?vue&type=template&id=538996de&scoped=true\"\nimport script from \"./productNew.vue?vue&type=script&lang=js\"\nexport * from \"./productNew.vue?vue&type=script&lang=js\"\nimport style0 from \"./productNew.vue?vue&type=style&index=0&id=538996de&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"538996de\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport { mainRoutes } from './routes'\n\nVue.use(VueRouter)\n\nconst router = new VueRouter({\n mode: 'history',\n base: process.env.BASE_URL,\n routes: mainRoutes\n})\n\n// 路由守卫 - 设置页面标题和权限检查\nrouter.beforeEach((to, from, next) => {\n // 设置页面标题\n if (to.meta && to.meta.title) {\n document.title = `${to.meta.title} - Power Leasing`\n } else {\n document.title = 'Power Leasing - 电商系统'\n }\n \n // 检查权限\n if (to.meta && to.meta.allAuthority) {\n // 这里可以添加权限检查逻辑\n // 目前所有页面都是 ['all'] 权限,所以直接通过\n console.log(`访问页面: ${to.meta.title}, 权限: ${to.meta.allAuthority.join(', ')}`)\n }\n \n next()\n})\n\n// 路由错误处理\nrouter.onError((error) => {\n console.error('路由错误:', error)\n // 可以在这里添加错误处理逻辑,比如跳转到错误页面\n})\n\nexport default router\n","export default {\r\n '401': '认证失败,无法访问系统资源,请重新登录',\r\n '403': '当前操作没有权限',\r\n '404': '访问资源不存在',\r\n 'default': '系统未知错误,请反馈给管理员'\r\n}\r\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"checkout-page\"},[_c('h1',{staticClass:\"page-title\"},[_vm._v(\"订单结算\")]),(_vm.loading)?_c('div',{staticClass:\"loading\"},[_c('el-loading-spinner'),_vm._v(\" 加载中... \")],1):(_vm.cartItems.length === 0)?_c('div',{staticClass:\"empty-cart\"},[_c('div',{staticClass:\"empty-icon\"},[_vm._v(\"🛒\")]),_c('h2',[_vm._v(\"购物车是空的\")]),_c('p',[_vm._v(\"请先添加商品到购物车\")]),_c('router-link',{staticClass:\"shop-now-btn\",attrs:{\"to\":\"/productList\"}},[_vm._v(\" 去购物 \")])],1):_c('div',{staticClass:\"checkout-content\"},[_c('div',{staticClass:\"order-summary\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(\"订单摘要\")]),_c('div',{staticClass:\"order-items\"},_vm._l((_vm.cartItems),function(item){return _c('div',{key:item.id,staticClass:\"order-item\"},[_c('div',{staticClass:\"item-image\"},[_c('img',{attrs:{\"src\":item.image,\"alt\":item.title}})]),_c('div',{staticClass:\"item-info\"},[_c('h3',{staticClass:\"item-title\"},[_vm._v(_vm._s(item.title))]),_c('div',{staticClass:\"item-price\"},[_vm._v(\"¥\"+_vm._s(item.price))])]),_c('div',{staticClass:\"item-quantity\"},[_c('span',{staticClass:\"quantity-label\"},[_vm._v(\"数量:\")]),_c('span',{staticClass:\"quantity-value\"},[_vm._v(_vm._s(item.quantity))])]),_c('div',{staticClass:\"item-total\"},[_c('span',{staticClass:\"total-label\"},[_vm._v(\"小计:\")]),_c('span',{staticClass:\"total-price\"},[_vm._v(\"¥\"+_vm._s((item.price * item.quantity).toFixed(2)))])])])}),0),_c('div',{staticClass:\"order-total\"},[_c('div',{staticClass:\"total-row\"},[_c('span',[_vm._v(\"商品总数:\")]),_c('span',[_vm._v(_vm._s(_vm.summary.totalQuantity)+\" 件\")])]),_c('div',{staticClass:\"total-row\"},[_c('span',[_vm._v(\"商品种类:\")]),_c('span',[_vm._v(_vm._s(_vm.cartItems.length)+\" 种\")])]),_c('div',{staticClass:\"total-row final-total\"},[_c('span',[_vm._v(\"订单总计:\")]),_c('span',{staticClass:\"final-amount\"},[_vm._v(\"¥\"+_vm._s(_vm.summary.totalPrice.toFixed(2)))])])])]),_c('div',{staticClass:\"checkout-form\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(\"收货信息\")]),_c('form',{staticClass:\"form\",on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('div',{staticClass:\"form-row\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"form-label\",attrs:{\"for\":\"name\"}},[_vm._v(\"收货人姓名 *\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.name),expression:\"form.name\"}],staticClass:\"form-input\",attrs:{\"id\":\"name\",\"type\":\"text\",\"required\":\"\",\"placeholder\":\"请输入收货人姓名\",\"aria-describedby\":\"name-error\"},domProps:{\"value\":(_vm.form.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"name\", $event.target.value)}}}),(_vm.errors.name)?_c('div',{staticClass:\"error-message\",attrs:{\"id\":\"name-error\"}},[_vm._v(\" \"+_vm._s(_vm.errors.name)+\" \")]):_vm._e()]),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"form-label\",attrs:{\"for\":\"phone\"}},[_vm._v(\"联系电话 *\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.phone),expression:\"form.phone\"}],staticClass:\"form-input\",attrs:{\"id\":\"phone\",\"type\":\"tel\",\"required\":\"\",\"placeholder\":\"请输入联系电话\",\"aria-describedby\":\"phone-error\"},domProps:{\"value\":(_vm.form.phone)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"phone\", $event.target.value)}}}),(_vm.errors.phone)?_c('div',{staticClass:\"error-message\",attrs:{\"id\":\"phone-error\"}},[_vm._v(\" \"+_vm._s(_vm.errors.phone)+\" \")]):_vm._e()])]),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"form-label\",attrs:{\"for\":\"address\"}},[_vm._v(\"收货地址 *\")]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.address),expression:\"form.address\"}],staticClass:\"form-textarea\",attrs:{\"id\":\"address\",\"rows\":\"3\",\"required\":\"\",\"placeholder\":\"请输入详细收货地址\",\"aria-describedby\":\"address-error\"},domProps:{\"value\":(_vm.form.address)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"address\", $event.target.value)}}}),(_vm.errors.address)?_c('div',{staticClass:\"error-message\",attrs:{\"id\":\"address-error\"}},[_vm._v(\" \"+_vm._s(_vm.errors.address)+\" \")]):_vm._e()]),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"form-label\",attrs:{\"for\":\"note\"}},[_vm._v(\"备注\")]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.note),expression:\"form.note\"}],staticClass:\"form-textarea\",attrs:{\"id\":\"note\",\"rows\":\"2\",\"placeholder\":\"可选:订单备注信息\"},domProps:{\"value\":(_vm.form.note)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"note\", $event.target.value)}}})]),_c('div',{staticClass:\"form-actions\"},[_c('router-link',{staticClass:\"back-btn\",attrs:{\"to\":\"/cart\"}},[_vm._v(\" 返回购物车 \")]),_c('button',{staticClass:\"submit-btn\",attrs:{\"type\":\"submit\",\"disabled\":_vm.submitting,\"aria-label\":\"提交订单\"}},[(_vm.submitting)?_c('span',[_vm._v(\"提交中...\")]):_c('span',[_vm._v(\"提交订单\")])])],1)])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n","import request from '../utils/request'\n\n//商品列表\nexport function getList(data) {\n return request({\n url: `/lease/product/getList`,\n method: 'get',\n data\n })\n}\n\n//创建商品 新增商品\nexport function createProduct(data) {\n return request({\n url: `/lease/product/add`,\n method: 'post',\n data\n })\n}\n\n//获取商品列表\nexport function getProductList(data) {\n return request({\n url: `/lease/product/getList`,\n method: 'post',\n data\n })\n}\n\n// 更新商品\nexport function updateProduct(data) {\n return request({\n url: `/lease/product/update`,\n method: 'post',\n data\n })\n}\n\n// 删除商品\nexport function deleteProduct(id) {\n return request({\n url: `/lease/product/delete`,\n method: 'post',\n data: { id }\n })\n}\n\n\n\n// 查询单个商品详情\nexport function getMachineInfo(data) {\n return request({\n url: `/lease/product/getMachineInfo`,\n method: 'post', \n data\n })\n}\n\n\n// 已购商品\nexport function getOwnedList(data) {\n return request({\n url: `/lease/product/getOwnedList`,\n method: 'post', \n data\n })\n}\n\n\n\n// 已购商品详情\nexport function getOwnedById(data) {\n return request({\n url: `/lease/product/getOwnedById`,\n method: 'post', \n data\n })\n}\n\n// 查商品详情里面的商品信息\nexport function getMachineInfoById(data) {\n return request({\n url: `/lease/product/getMachineInfoById`,\n method: 'post', \n data\n })\n}\n\n\n// 查获取商城商品支持的支付方式\nexport function getPayTypes(data) {\n return request({\n url: `/lease/product/getPayTypes`,\n method: 'post', \n data\n })\n}\n\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"orders-page\"},[_c('h2',{staticClass:\"title\"},[_vm._v(\"已售出订单\")]),_c('el-tabs',{on:{\"tab-click\":_vm.handleTabClick},model:{value:(_vm.active),callback:function ($$v) {_vm.active=$$v},expression:\"active\"}},[_c('el-tab-pane',{attrs:{\"label\":\"订单进行中\",\"name\":\"7\"}},[_c('order-list',{attrs:{\"items\":_vm.orders[7],\"show-checkout\":false,\"empty-text\":\"暂无进行中的订单\"}})],1),_c('el-tab-pane',{attrs:{\"label\":\"订单已完成\",\"name\":\"8\"}},[_c('order-list',{attrs:{\"items\":_vm.orders[8],\"show-checkout\":false,\"empty-text\":\"暂无已完成的订单\"}})],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n ","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./header.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./header.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./header.vue?vue&type=template&id=20c969ee&scoped=true\"\nimport script from \"./header.vue?vue&type=script&lang=js\"\nexport * from \"./header.vue?vue&type=script&lang=js\"\nimport style0 from \"./header.vue?vue&type=style&index=0&id=20c969ee&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"20c969ee\",\n null\n \n)\n\nexport default component.exports","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkpower_leasing\"] = self[\"webpackChunkpower_leasing\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(1406); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_coinList","require","_products","exports","name","data","notOnlySpaces","rule","value","callback","trim","length","Error","containsEmoji","text","emojiPattern","test","noEmoji","submitting","form","type","coin","description","image","state","shopId","rules","required","message","trigger","validator","min","max","computed","coinOptions","coinList","label","created","$route","query","Number","methods","fetchAddProduct","params","res","createProduct","code","$message","msg","showClose","$router","push","handleSubmit","valid","$refs","productForm","validate","error","console","handleReset","resetFields","handleCancel","_order","_OrderList","_interopRequireDefault","components","OrderList","active","orders","loading","urlStatus","status","String","savedStatus","localStorage","getItem","initial","fetchOrders","fetchCancelOrder","cancelOrder","handleCancelOrder","orderId","handleTabClick","tab","setItem","e","warn","key","getOrdersByStatus","payload","list","Array","isArray","rows","$set","log","initNoEmojiGuard","window","__noEmojiGuardInitialized","isEditableTarget","el","Element","getAttribute","tag","tagName","toLowerCase","disallow","indexOf","setComposing","composing","__noEmojiComposing","isComposing","sanitizeAndRedispatch","target","before","selectionStart","selectionEnd","after","replace","removed","nextPos","Math","setSelectionRange","evt","Event","bubbles","dispatchEvent","document","addEventListener","component","_vm","this","_c","_self","staticClass","_v","attrs","isCartEmpty","staticStyle","ref","shops","expandedShopKeys","textAlign","on","handleGuardExpand","expandable","scopedSlots","_u","fn","shopScope","row","id","productMachineDtoList","sels","handleShopInnerSelectionChange","isRowSelectableByShop","scope","formatNum6","powerDissipation","truncated","full","_s","theoryPower","directives","rawName","expression","unit","computingPower","theoryIncome","toUpperText","theoryUsdtIncome","getSelectedCoinSymbolForShop","proxy","getMachineUnitPriceBySelection","formatAmount","getRowMaxLeaseDaysLocal","$event","handleLeaseTimeChange","handleLeaseTimeInput","model","leaseTime","$$v","maxLeaseDays","del","getSelectedCoinSymbolForShopHeader","displayShopTotalBySelection","val","handleShopPayChange","getSelectedPayIcon","_e","paySelectionMap","_l","getShopPayOptions","opt","idx","icon","selectedMachineCount","selectedTotal","handleRemoveSelectedMachines","clearOffLoading","handleClearOffShelf","handleCheckoutSelected","confirmDialog","visible","count","confirmPay","grp","shopName","payLabel","coinSymbol","enough","deductibleAmount","fee","items","unitPrice","subtotal","Object","keys","totalsByCoin","amt","noticeDialog","countdown","handleNoticeAcknowledge","checked","googleCodeDialog","handleGoogleCodeCancel","isGoogleCodeValid","handleGoogleCodeSubmit","handleGoogleCodeInput","nativeOn","_k","keyCode","apply","arguments","settlementSuccessfulVisible","handleCloseSuccessDialog","_machine","product","ranges","machineList","productId","confirmVisible","stateSnapshot","fieldSnapshot","updateLoading","unitOptions","fetchDetail","fetchMachineList","handlePayTypeChange","index","sel","_selectedPayIndex","priceList","_priceEditing","price","isRowDisabled","saleState","handleOpenConfirm","warning","getMachineInfoById","productMachineRangeList","getMachineListForUpdate","map","r","first","refreshStateSnapshot","refreshFieldSnapshot","snapshot","i","priceMap","forEach","p","payTypeId","isCellChanged","snap","pt","pid","cur","ori","current","original","restoreStateSnapshot","currentRow","prevState","updateMachineList","updateMachine","success","deleteMachine","handleTheoryPowerInput","rowItem","v","firstDot","slice","endsWithDot","endsWith","parts","split","intPart","decPart","handleNumericCell","d","handlePriceBlur","raw","pattern","handleMaxLeaseDaysInput","handleMaxLeaseDaysBlur","n","isInteger","handleTheoryPowerBlur","handlePowerDissipationBlur","handleTypeCell","handleStateChange","handleDeleteMachine","$confirm","confirmButtonText","cancelButtonText","handleSubmitMachines","powerPattern","pricePattern","isOnlySpaces","rowLabel","miner","theoryRaw","priceRaw","typeRaw","dissRaw","daysRaw","m","handleBack","back","_m","handleClear","handleSearch","searchKeyword","tableData","payTypes","formatPayType","handleView","handleEdit","handleDelete","handleAddMachine","total","pagination","pageNum","pageSize","handleSizeChange","handleCurrentChange","editDialog","saving","handleSaveEdit","_request","addSingleOrBatchMachine","request","url","method","getUserMachineList","getUserMinersList","activeIndex","userEmail","activeRole","buyerLinks","to","sellerLinks","userInitial","email","toUpperCase","displayedLinks","mounted","getVal","JSON","parse","savedRole","setActiveRoleByRoute","handleClickRole","role","stringify","firstPath","path","qFrom","from","sessionStorage","buyerPrefixes","sellerPrefixes","shouldBuyer","some","shouldSeller","isActiveLink","pathLike","prefixes","watch","immediate","handler","_vue","_App","_router","_store","_elementUi","_noEmojiGuard","Vue","config","productionTip","use","ElementUI","router","store","render","h","App","$mount","_cartManager","_index","mixins","Index","item","chain","handleAddToCart","addToCart","title","quantity","_shops","hasEmoji","str","emojiRegex","fetchAddShop","getAddShop","handleDescriptionInput","substring","handleCreate","hasShop","detail","load","paramsId","getOwnedById","formatDateTime","includes","class","preventDefault","getOrdersByStatusForSeller","handleTab","rechargeRows","loadRecharge","recharge","getRowKey","statusClass","toggleExpand","amount","fromSymbol","formatChain","fromChain","getRechargeStatusType","getRechargeStatusText","formatFullTime","createTime","isExpanded","fromAddress","stopPropagation","handleCopy","txHash","withdrawRows","loadWithdraw","withdraw","toSymbol","toChain","getWithdrawStatusType","getWithdrawStatusText","toAddress","consumeRows","loadConsume","consume","realAmount","getPayStatusType","getPayStatusText","time","currentPage","pageSizes","openCreateWallet","walletList","w","walletBalance","balance","displaySymbol","slot","blockedBalance","handleWithdraw","recentTransactions","transaction","statusTagType","statusText","amountText","rechargeDialogVisible","resetRechargeForm","WalletData","toString","copyAddress","withdrawDialogVisible","resetWithdrawForm","withdrawForm","withdrawRules","displayWithdrawSymbol","handleAmountInput","totalBalance","availableWithdrawBalance","actualAmount","googleCode","withdrawLoading","confirmWithdraw","createDialogVisible","options","createValue","createLoading","confirmCreateWallet","productListLoading","handleCurrencyChange","handleCurrencyClear","screenCurrency","currencyList","imgUrl","handleAlgorithmClear","handleAlgorithmSearch","searchAlgorithm","products","handleProductClick","algorithm","saleNumber","order","orderNumber","getOrderStatusText","totalPrice","_wallet","_amount","expandedKeys","Set","getStatusByTab","loadList","truncateAmountByCoin","pane","clear","tabName","indexPart","stable","__key","updateTime","has","add","typeKey","getTypeKeyByStatus","transactionRecord","mapped","loadByStatus","getTabByStatus","s","tron","trx","eth","ethereum","bsc","polygon","matic","Date","toLocaleString","formatTime","formatTrunc","decimals","num","isFinite","factor","pow","trunc","padded","padEnd","navigator","clipboard","writeText","ta","createElement","style","position","left","body","appendChild","focus","select","execCommand","removeChild","activeTab","pendingRecharges","refreshData","showDetail","getChainName","getStatusText","formatAddress","address","successRecharges","failedRecharges","detailDialogVisible","closeDetail","selectedItem","getStatusType","loaded","defaultCover","shop","visibleEdit","editForm","shopConfigs","visibleConfigEdit","configForm","chainLabel","chainValue","payAddress","payCoins","payCoin","productOptions","editCoinOptionsApi","chainOptions","shopLoading","shopStateText","shopStateTagType","canCreateShop","editCoinOptions","selectedCoinLabels","Map","o","get","fetchMyShop","resetShopState","getMyShop","fetchShopConfigs","getShopConfig","updateShopConfig","deleteShopConfig","handleEditConfig","getChainAndCoin","children","c","preSelected","filter","hasBind","join","payCoinStr","handleDeleteConfig","submitConfigEdit","addr","removeSelectedCoin","labelUpper","handleOpenEdit","queryShop","submitEdit","updateShop","deleteShop","setTimeout","handleToggleShop","isClosed","confirmMsg","closeShop","handleGoNew","handleAddProduct","handleWalletBind","props","default","emptyText","showCheckout","Boolean","onCancel","Function","payLoading","orderDialog","qrContent","dialogVisible","paymentDialog","payAmount","noPayAmount","img","safeItems","buildQrSrc","startsWith","handleCheckout","handleGoDetail","then","catch","shouldShowActions","outer","orderItemDtoList","productName","cost","costMap","payTypeDefs","miners","minersLoading","selectedMiner","machineOptions","machinesLoading","selectedMachines","selectedMachineRows","lastCostBaseline","lastCostMapBaseline","lastTypeBaseline","lastMaxLeaseDaysBaseline","lastPowerDissipationBaseline","lastTheoryPowerBaseline","lastUnitBaseline","productMachineURDVos","initPayTypesFromRoute","fetchMiners","validateCost","arr","decodeURIComponent","defs","it","set","values","initCostMap","handleNumeric","syncMaxLeaseDaysToRows","syncCostToRows","handleCostMapInput","oldBaseline","NaN","shouldFollow","nextPriceMap","handleTypeInput","newCost","priceNum","updateMachineType","updateSelectedMachineRows","nextRows","minerId","existed","find","existedPriceMap","defaultPriceMap","user","realPower","undefined","syncPowerDissipationToRows","newVal","rowNum","syncTheoryPowerToRows","syncUnitToRows","newUnit","rowUnit","handleRowPowerDissipationInput","handleRowPowerDissipationBlur","handleRowTheoryPowerInput","handleRowTheoryPowerBlur","handleRowUnitChange","handleRowMaxLeaseDaysInput","handleRowMaxLeaseDaysBlur","handleRowPriceInput","handleRowPriceMapInput","handleRowPriceMapBlur","handleRowPriceBlur","handleRowTypeInput","handleRowTypeBlur","handleToggleState","currentState","coinKey","additionalProperties1","handleMinerChange","userMinerVo","handleSave","ok","machineForm","invalidTypeRowIndex","findIndex","j","def","rawDays","doSubmit","duration","deep","oldVal","k","productDetailLoading","paymentMethodList","payChain","formatPayTooltip","getPayImageUrl","handlePayIconKeyDown","handlePayFilterChange","selectedPayKey","getPriceCoinSymbol","filters","minPrice","maxPrice","minPower","maxPower","powerUnitOptions","u","minPowerDissipation","maxPowerDissipation","handleSearchFilters","handleResetFilters","handleGetRowClass","handleManualSelectFlat","_selected","activeSortField","handleToggleSort","sortStates","powerSort","powerDissipationSort","getFirstCoinSymbol","getRowMaxLeaseDays","handleLeaseDaysChange","priceSort","getRowCoin","handleOpenAddToCartDialog","confirmAddDialog","handleConfirmAddSelectedToCart","productRoutes","Promise","resolve","_interopRequireWildcard2","meta","allAuthority","cartRoutes","checkoutRoutes","accountRoutes","redirect","childrenRoutes","mainRoutes","addOrders","getOrdersByIds","getChainAndListForSeller","getCoinPrice","page","range","keyword","expandedRowKeys","fetchList","withKeys","__rowKey","handleRowClick","isOpen","handleExpandChange","expandedRows","getRowClassName","copy","area","handleRangeChange","sellerReceiptList","_productService","_shoppingCart","selectedMap","payFilterDefaultApplied","cartMachineIdSet","cartCompositeKeySet","cartLoaded","machinesLoaded","productListData","fetchGetMachineInfo","fetchPayTypes","fetchGetGoodsList","truncateTo6","ensureDefaultPayFilterSelection","payList","hit","field","buildQueryParams","q","addNum","obj","getPayTypes","getMachineInfo","payConfigList","normalized","$nextTick","loadProduct","getProductById","fetchAddCart","addCart","getGoodsList","rawRows","groups","shoppingCartInfoDtoList","flatMap","matched","g","ids","compositeKeys","totalCount","reduce","sum","CustomEvent","autoSelectAndDisable","handleSeriesRowClick","lockedIds","opened","handleGetSeriesRowClassName","handleInnerSelectionChange","parentRow","selections","openedSet","isSelectable","isSelectedByParent","handleManualSelect","splice","handleGetInnerRowClass","handleDecreaseVariantQuantity","groupIndex","variantIndex","variants","handleIncreaseVariantQuantity","handleVariantQuantityInput","handleAddVariantToCart","variant","onlyKey","handleAddSelectedToCart","allSelected","flat","pickedAll","productMachines","picked","clearAllSelections","productMachineId","handleDecreaseQuantity","rowIndex","handleIncreaseQuantity","handleQuantityInput","handleQuantityBlur","rowData","date","userId","orderItemId","purchasedComputingPower","startTime","endTime","currentComputingPower","currentIncome","currentUsdtIncome","estimatedEndIncome","estimatedEndUsdtIncome","currentChain","cascaderProps","multiple","checkStrictly","emitPath","preCheck","prices","rowPrices","getChainAndList","handleRemoveSelectedCoin","coinUpper","next","handleChange","handleItemClick","node","isLeaf","last","lastChain","expanded","expand","nodes","validateAddressByChain","toUpperOptions","src","FetchAddWalletShopConfig","addWalletShopConfig","targetChain","filtered","preCheckBeforeBind","getProductListForShopWalletConfig","coins","submitBindWithPrice","handleConfirmBindAfterPreview","collectMachineGroups","pushId","productMachineIdList","machines","machineIds","machineGroups","priceStr","symbol","productMachineForWalletConfigVoList","updateProductListForShopWalletConfig","resetPreCheckPrices","handlePreCheckClose","coinsForBind","canSubmitPreCheck","selectedCoinsDisplay","selectedCoins","getMaxDecimalsByCoin","truncateAmountRaw","maxDecimals","isNegative","abs","keep","LoadingManager","constructor","loadingStates","setupListeners","resetAllLoadingStates","setLoading","componentId","stateKey","timestamp","now","getLoading","componentsToUpdate","resetComponentLoadingStates","loadingManager","_vuex","Vuex","Store","getters","mutations","actions","modules","addShopConfig","_axios","_errorCode","_loadingManager","_errorNotificationManager","pendingRequestMap","getRequestKey","service","axios","create","baseURL","process","timeout","RETRY_WINDOW","pendingRequests","lastNetworkStatusTime","online","offline","networkRecoveryInProgress","vm","$i18n","t","toLocaleTimeString","pendingPromises","async","response","delete","allSettled","commonLoadingProps","prop","errorNotificationManager","canShowError","defaults","retry","retryDelay","shouldRetry","superReportError","interceptors","token","headers","propName","part","encodeURIComponent","subPart","requestKey","cancel","cancelToken","CancelToken","reject","errorCode","removeItem","MessageBox","confirm","distinguishCancelAndClose","closeOnClickModal","locale","Message","dangerouslyUseHTMLString","Notification","onLine","__retryCount","minerChartLoading","reportBlockLoading","retryCount","substr","rechargeRecords","totalPage","statusFilter","loadRechargeRecords","balanceRechargeList","records","chainNames","statusTypeMap","timeStr","diff","floor","toLocaleDateString","fallbackCopyAddress","textArea","err","viewOnExplorer","explorers","open","statusMap","deleteBatchGoods","deleteBatchGoodsForIsDelete","STORAGE_KEY","readCart","parsed","writeCart","cart","updateQuantity","removeFromCart","clearCart","computeSummary","totalQuantity","mainNavigation","breadcrumbConfig","getBreadcrumb","checkRoutePermission","route","userPermissions","requiredPermissions","permission","getPageTitle","getPageDescription","initOptions","fetchTableData","fetchMachineInfo","coinParam","algorithmParam","lower","hitCoin","$alert","center","closeOnPressEscape","location","href","getProductList","notEmpty","updateProduct","deleteProduct","size","payTypesParam","pts","getWalletInfo","withdrawBalance","balanceWithdrawList","bindWallet","getRecentlyTransaction","$index","input","blur","_wallet2","qrCodeGenerated","validateWithdrawAmount","validateAddress","validateGoogleCode","tokenOptions","availableTokens","amountInt","toScaledInt","feeInt","result","formatDec6FromInt","available","parseFloat","blocked","toFixed","sym","fetchWalletInfo","updateFeeByChain","fetchRecentlyTransaction","walletInfo","generateQRCode","rawAmt","signAmt","typeLabel","statusTextMap","statusTagTypeMap","formatDec6","formatApiTime","match","amountStr","re","RegExp","scale","round","decPartRaw","scaledIntToString","intVal","sign","padStart","fetchBalanceRechargeList","requestParams","fetchBalanceWithdrawList","handleRecharge","wallet","addressToCopy","qrcode","qrContainer","qrCodeRef","innerHTML","alt","width","height","borderRadius","onerror","onChainChange","hasUSDT","walletCharge","charge","feeMap","clearValidate","totalRequired","availableBalance","balanceInt","totalText","isValid","addTransactionRecord","getFullYear","getMonth","getDate","getHours","getMinutes","unshift","navigation","nav","cartItemCount","decryptData","encryptedText","secretKey","encrypted","atob","decrypted","fromCharCode","charCodeAt","getDecryptedParams","urlParams","URLSearchParams","search","encryptedData","language","username","source","version","sensitiveData","decryptedJson","leasEmail","performAutoLogin","setLanguage","cartItems","phone","note","errors","summary","loadCart","validateForm","customer","toISOString","ErrorNotificationManager","recentErrors","throttleTime","errorTypes","getErrorType","entries","errorType","lastTime","cleanup","comHeard","appMain","maxLeaseDay","max_lease_days","payCoinImage","debug","listProducts","getOwnedList","withdrawalRecords","pendingWithdrawals","successWithdrawals","failedWithdrawals","loadWithdrawalRecords","totalMachineNumber","totalMachines","selectedGroups","selectedMachinesMap","expandedGroupKeys","creatingOrder","successDialog","noticeTimer","pendingCheckoutShop","pendingCheckoutAll","payDialog","selectedChain","selectedCoin","selectedPrice","isAllSelected","hasShops","hasGroups","accumulate","canCheckout","payCoinSymbol","startNoticeCountdown","reapplySelectionsForPendingShop","clearInterval","beforeDestroy","toCents","parseInt","decRaw","decTwo","cents","centsToText","isRowSelectable","isOnShelf","fetchChainAndListForSeller","labelSrc","getAllGroups","cfg","hasMachinePriceForSelection","machine","ensureDefaultPaySelection","applyInnerSelectionFromSet","isShopLeaseChanged","totalCents","days","totalPriceList","orig","_origLeaseTime","computeShopTotal","priceCents","computeShopTotalDisplay","backendVal","hasBackend","modified","buildDeletePayload","machineId","fetchAddOrders","orderInfoVoList","fetchDeleteBatchGoods","apiDeleteBatchGoods","handleOuterExpandChange","handleShopExpandChange","withShopKeys","sIdx","sp","handleGroupSelectionChange","handleGroupSelectionChangeForShop","applyInnerSelection","shouldSelectAll","inner","clearSelection","toggleRowSelection","selIds","toggleSelectAll","table","outerTable","calcGroupTotal","group","countMachines","handleCheckoutShop","selectedSet","onShelfMachines","executeCheckout","payloadAll","dataStr","showGoogleCodeDialog","setInterval","showConfirmDialogAll","showConfirmDialog","openPaySelectDialog","selectedIds","baseUnit","leaseDays","cfgList","cfgHit","groupSubtotal","totals","centsAdd","acc","tCents","totalsCentsByCoin","prev","totalsObj","googleCodeInput","numValue","isNaN","handleProductExpandChange","selectedRows","selection","isSelected","isProductSelected","powerList","show","fetchGetList","formatPriceRange","lo","hi","_truncate2","two","req","script","_vueRouter","_routes","VueRouter","mode","base","routes","beforeEach","onError","domProps","one","getList","_navigation","cartServerCount","breadcrumbs","handleStorageChange","loadServerCartCount","handleCartUpdated","removeEventListener","primary","event","handleLogout","getBreadcrumbPath","paths","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","call","amdO","deferred","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","every","definition","defineProperty","enumerable","globalThis","prototype","hasOwnProperty","Symbol","toStringTag","nmd","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","bind","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file