日常更新

This commit is contained in:
2025-11-20 14:28:57 +08:00
parent c7cee78798
commit a02c287715
9 changed files with 246 additions and 20 deletions

View File

@@ -5,10 +5,8 @@
// - 其他币种: 最多6位小数 // - 其他币种: 最多6位小数
// 返回 { text, truncated, full } // 返回 { text, truncated, full }
export function getMaxDecimalsByCoin(coin) { export function getMaxDecimalsByCoin() {
const c = (coin || '').toString().toUpperCase(); // 全站统一:最多 6 位小数
if (c === 'ETH') return 8;
// USDT 与其他币种都按 6 位
return 6; return 6;
} }
@@ -36,3 +34,8 @@ export function truncateAmountByCoin(value, coin) {
return truncateAmountRaw(value, max); return truncateAmountRaw(value, max);
} }
// 默认 6 位截断(非币种语境也可复用)
export function truncateTo6(value) {
return truncateAmountRaw(value, 6);
}

View File

@@ -43,17 +43,94 @@
<el-table-column prop="miner" label="机器编号" /> <el-table-column prop="miner" label="机器编号" />
<el-table-column prop="algorithm" label="算法" /> <el-table-column prop="algorithm" label="算法" />
<el-table-column prop="powerDissipation" label="功耗(kw/h)" /> <el-table-column prop="powerDissipation" label="功耗(kw/h)">
<el-table-column prop="theoryPower" label="理论算力" > <template #default="scope">
<template #default="scope">{{ scope.row.theoryPower }} <span v-show="scope.row.theoryPower">{{ scope.row.unit }}</span></template> <span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.powerDissipation).truncated"
:content="formatNum6(scope.row.powerDissipation).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.powerDissipation).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.powerDissipation).text }}</span>
</span>
</template>
</el-table-column>
<el-table-column prop="theoryPower" label="理论算力">
<template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.theoryPower).truncated"
:content="formatNum6(scope.row.theoryPower).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.theoryPower).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.theoryPower).text }}</span>
</span>
<span v-show="scope.row.theoryPower"> {{ scope.row.unit }} </span>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="computingPower" label="实际算力"> <el-table-column prop="computingPower" label="实际算力">
<template #default="scope">{{ scope.row.computingPower }} <span v-show="scope.row.computingPower">{{ scope.row.unit }}</span></template> <template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.computingPower).truncated"
:content="formatNum6(scope.row.computingPower).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.computingPower).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.computingPower).text }}</span>
</span>
<span v-show="scope.row.computingPower"> {{ scope.row.unit }} </span>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="theoryIncome" label="单机理论收入(每日/币种)"> <el-table-column prop="theoryIncome" label="单机理论收入(每日/币种)">
<template #default="scope">{{ scope.row.theoryIncome }} <span v-show="scope.row.coin">{{ toUpperText(scope.row.coin) }}</span></template> <template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.theoryIncome).truncated"
:content="formatNum6(scope.row.theoryIncome).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.theoryIncome).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.theoryIncome).text }}</span>
</span>
<span v-show="scope.row.coin"> {{ toUpperText(scope.row.coin) }} </span>
</template>
</el-table-column>
<el-table-column prop="theoryUsdtIncome" label="单机理论收入(每日/USDT)">
<template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.theoryUsdtIncome).truncated"
:content="formatNum6(scope.row.theoryUsdtIncome).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.theoryUsdtIncome).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.theoryUsdtIncome).text }}</span>
</span>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="theoryUsdtIncome" label="单机理论收入(每日/USDT)"/>
<!-- <el-table-column prop="state" label="状态" min-width="100" > <!-- <el-table-column prop="state" label="状态" min-width="100" >
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.state === 1 ? 'info' : 'success'"> <el-tag :type="scope.row.state === 1 ? 'info' : 'success'">
@@ -199,7 +276,20 @@
<div class="summary-actions" style="margin-top:16px;display:flex;gap:12px;justify-content:flex-end;"> <div class="summary-actions" style="margin-top:16px;display:flex;gap:12px;justify-content:flex-end;">
<div class="summary-inline" style="color:#666;"> <div class="summary-inline" style="color:#666;">
已选机器:<b>{{ selectedMachineCount }}</b> 台 已选机器:<b>{{ selectedMachineCount }}</b> 台
<span style="margin-left:12px;">金额合计(USDT)<b>{{ formatTrunc(selectedTotal, 2) }}</b></span> <span style="margin-left:12px;">金额合计(USDT)</span>
<span class="price-strong">
<el-tooltip
v-if="formatAmount(selectedTotal, 'USDT').truncated"
:content="formatAmount(selectedTotal, 'USDT').full"
placement="top"
>
<span>
{{ formatAmount(selectedTotal, 'USDT').text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatAmount(selectedTotal, 'USDT').text }}</span>
</span>
</div> </div>
<div class="actions-inline" style="display:flex;gap:12px;"> <div class="actions-inline" style="display:flex;gap:12px;">
<el-button type="danger" :disabled="!selectedMachineCount" @click="handleRemoveSelectedMachines">删除所选机器</el-button> <el-button type="danger" :disabled="!selectedMachineCount" @click="handleRemoveSelectedMachines">删除所选机器</el-button>
@@ -401,7 +491,7 @@
<script> <script>
import { getGoodsList, deleteBatchGoods as apiDeleteBatchGoods ,deleteBatchGoodsForIsDelete} from '../../api/shoppingCart' import { getGoodsList, deleteBatchGoods as apiDeleteBatchGoods ,deleteBatchGoodsForIsDelete} from '../../api/shoppingCart'
import { addOrders,cancelOrder,getOrdersByIds,getOrdersByStatus , getChainAndListForSeller,getCoinPrice } from '../../api/order' import { addOrders,cancelOrder,getOrdersByIds,getOrdersByStatus , getChainAndListForSeller,getCoinPrice } from '../../api/order'
import { truncateAmountByCoin } from '../../utils/amount' import { truncateAmountByCoin, truncateTo6 } from '../../utils/amount'
export default { export default {
name: 'Cart', name: 'Cart',
@@ -526,6 +616,14 @@ export default {
formatAmount(value, coin) { formatAmount(value, coin) {
return truncateAmountByCoin(value, coin) return truncateAmountByCoin(value, coin)
}, },
/**
* 数值格式化最多6位小数截断不四舍五入不补0
* @param {number|string} value
* @returns {{text:string,truncated:boolean,full:string}}
*/
formatNum6(value) {
return truncateTo6(value)
},
/** /**
* 将金额转为整分整数,避免浮点误差 * 将金额转为整分整数,避免浮点误差
* @param {number|string} v * @param {number|string} v
@@ -1922,6 +2020,11 @@ export default {
margin-left: 4px; margin-left: 4px;
} }
.num-strong {
font-weight: inherit;
color: inherit;
}
::v-deep .el-input__prefix, .el-input__suffix{ ::v-deep .el-input__prefix, .el-input__suffix{
top:24%; top:24%;

View File

@@ -3,7 +3,7 @@ import { getProductById } from '../../utils/productService'
import { addToCart } from '../../utils/cartManager' import { addToCart } from '../../utils/cartManager'
import { getMachineInfo, getPayTypes } from '../../api/products' import { getMachineInfo, getPayTypes } from '../../api/products'
import { addCart, getGoodsList } from '../../api/shoppingCart' import { addCart, getGoodsList } from '../../api/shoppingCart'
import { truncateAmountByCoin } from '../../utils/amount' import { truncateAmountByCoin, truncateTo6 } from '../../utils/amount'
export default { export default {
name: 'ProductDetail', name: 'ProductDetail',
@@ -174,6 +174,10 @@ export default {
formatAmount(value, coin) { formatAmount(value, coin) {
return truncateAmountByCoin(value, coin) return truncateAmountByCoin(value, coin)
}, },
// 数值格式化最多6位小数截断不补0
formatNum6(value) {
return truncateTo6(value)
},
/** /**
* 首次加载时,将“支付方式筛选”的默认选中值设为与价格列币种一致, * 首次加载时,将“支付方式筛选”的默认选中值设为与价格列币种一致,
* 并同步 filters.chain/filters.coin仅执行一次不触发额外查询。 * 并同步 filters.chain/filters.coin仅执行一次不触发额外查询。

View File

@@ -136,7 +136,22 @@
<el-table-column prop="theoryPower" label="理论算力" header-align="left" align="left" show-overflow-tooltip> <el-table-column prop="theoryPower" label="理论算力" header-align="left" align="left" show-overflow-tooltip>
<template #default="scope">{{ scope.row.theoryPower }} {{ scope.row.unit }}</template> <template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.theoryPower).truncated"
:content="formatNum6(scope.row.theoryPower).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.theoryPower).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.theoryPower).text }}</span>
</span>
{{ scope.row.unit }}
</template>
</el-table-column> </el-table-column>
<el-table-column header-align="left" align="left" show-overflow-tooltip> <el-table-column header-align="left" align="left" show-overflow-tooltip>
@@ -146,7 +161,22 @@
<i class="sort-arrow" :class="[(sortStates && sortStates.powerSort) ? 'asc' : 'desc', activeSortField==='powerSort' ? 'active' : '']"></i> <i class="sort-arrow" :class="[(sortStates && sortStates.powerSort) ? 'asc' : 'desc', activeSortField==='powerSort' ? 'active' : '']"></i>
</span> </span>
</template> </template>
<template #default="scope">{{ scope.row.computingPower }} {{ scope.row.unit }}</template> <template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.computingPower).truncated"
:content="formatNum6(scope.row.computingPower).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.computingPower).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.computingPower).text }}</span>
</span>
{{ scope.row.unit }}
</template>
</el-table-column> </el-table-column>
<el-table-column prop="powerDissipation" header-align="left" align="left"> <el-table-column prop="powerDissipation" header-align="left" align="left">
@@ -164,8 +194,39 @@
单机理论收入(每日) 单机理论收入(每日)
<span v-if="getFirstCoinSymbol()">{{ getFirstCoinSymbol() }}</span> <span v-if="getFirstCoinSymbol()">{{ getFirstCoinSymbol() }}</span>
</template> </template>
<template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.theoryIncome).truncated"
:content="formatNum6(scope.row.theoryIncome).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.theoryIncome).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.theoryIncome).text }}</span>
</span>
</template>
</el-table-column>
<el-table-column prop="theoryUsdtIncome" label="单机理论收入(每日/USDT)" header-align="left" align="left">
<template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.theoryUsdtIncome).truncated"
:content="formatNum6(scope.row.theoryUsdtIncome).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.theoryUsdtIncome).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.theoryUsdtIncome).text }}</span>
</span>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="theoryUsdtIncome" label="单机理论收入(每日/USDT)" header-align="left" align="left" />
<el-table-column prop="type" label="矿机型号" header-align="left" align="left" /> <el-table-column prop="type" label="矿机型号" header-align="left" align="left" />
<el-table-column label="最大可租赁(天)" header-align="left" align="left"> <el-table-column label="最大可租赁(天)" header-align="left" align="left">
@@ -228,13 +289,59 @@
<div> <div>
<el-table :data="confirmAddDialog.items" height="360" border stripe :header-cell-style="{ textAlign: 'left' }" :cell-style="{ textAlign: 'left' }"> <el-table :data="confirmAddDialog.items" height="360" border stripe :header-cell-style="{ textAlign: 'left' }" :cell-style="{ textAlign: 'left' }">
<el-table-column prop="theoryPower" label="理论算力" header-align="left" align="left"> <el-table-column prop="theoryPower" label="理论算力" header-align="left" align="left">
<template #default="scope">{{ scope.row.theoryPower }} {{ scope.row.unit }}</template> <template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.theoryPower).truncated"
:content="formatNum6(scope.row.theoryPower).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.theoryPower).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.theoryPower).text }}</span>
</span>
{{ scope.row.unit }}
</template>
</el-table-column> </el-table-column>
<el-table-column label="实际算力" header-align="left" align="left"> <el-table-column label="实际算力" header-align="left" align="left">
<template #default="scope">{{ scope.row.computingPower }} {{ scope.row.unit }}</template> <template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.computingPower).truncated"
:content="formatNum6(scope.row.computingPower).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.computingPower).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.computingPower).text }}</span>
</span>
{{ scope.row.unit }}
</template>
</el-table-column> </el-table-column>
<el-table-column prop="algorithm" label="算法" width="120" header-align="left" align="left" /> <el-table-column prop="algorithm" label="算法" width="120" header-align="left" align="left" />
<el-table-column prop="powerDissipation" label="功耗(kw/h)" header-align="left" align="left" /> <el-table-column prop="powerDissipation" label="功耗(kw/h)" header-align="left" align="left">
<template #default="scope">
<span class="num-strong">
<el-tooltip
v-if="formatNum6(scope.row.powerDissipation).truncated"
:content="formatNum6(scope.row.powerDissipation).full"
placement="top"
>
<span>
{{ formatNum6(scope.row.powerDissipation).text }}
<i class="el-icon-more amount-more"></i>
</span>
</el-tooltip>
<span v-else>{{ formatNum6(scope.row.powerDissipation).text }}</span>
</span>
</template>
</el-table-column>
<el-table-column label="租赁天数(天)" header-align="left" align="left"> <el-table-column label="租赁天数(天)" header-align="left" align="left">
<template #default="scope">{{ Number(scope.row.leaseTime || 1) }}</template> <template #default="scope">{{ Number(scope.row.leaseTime || 1) }}</template>
</el-table-column> </el-table-column>
@@ -627,6 +734,11 @@ export default {
color: #e74c3c; color: #e74c3c;
} }
.num-strong {
font-weight: inherit;
color: inherit;
}
/* 支付方式区域(视觉更友好 + 可达性) */ /* 支付方式区域(视觉更友好 + 可达性) */
.pay-methods { .pay-methods {
display: flex; display: flex;

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>power_leasing</title><script defer="defer" src="/js/chunk-vendors.f4da7ffe.js"></script><script defer="defer" src="/js/app.d22501a6.js"></script><link href="/css/chunk-vendors.10dd4e95.css" rel="stylesheet"><link href="/css/app.c82f27e9.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but power_leasing doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>power_leasing</title><script defer="defer" src="/js/chunk-vendors.f4da7ffe.js"></script><script defer="defer" src="/js/app.d49ccc2c.js"></script><link href="/css/chunk-vendors.10dd4e95.css" rel="stylesheet"><link href="/css/app.ca4b7f36.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but power_leasing doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long