Browse Source

更新多语言文件,调整交易相关字段翻译,新增模拟交易和盈亏字段。

master
TorsenLi 2 days ago
parent
commit
57c39d076a
  1. 27
      src/api/aiStock.js
  2. 21
      src/i18n/de.json
  3. 21
      src/i18n/en.json
  4. 21
      src/i18n/fra.json
  5. 21
      src/i18n/he.json
  6. 21
      src/i18n/it.json
  7. 21
      src/i18n/jp.json
  8. 19
      src/i18n/kor.json
  9. 21
      src/i18n/pt.json
  10. 21
      src/i18n/spa.json
  11. 21
      src/i18n/tr.json
  12. 21
      src/i18n/tw.json
  13. 159
      src/views/ellasAlpha/index.vue

27
src/api/aiStock.js

@ -0,0 +1,27 @@
import server from './server';
class AiStock {
static getAccount(config) {
return server.get('/ai-stock/account', { config });
}
static getOrders(params, config) {
return server.get('/ai-stock/orders', {
params,
config,
});
}
static transferToSpot(data, config) {
return server.post('/ai-stock/transfer-to-spot', data, config);
}
static getTransfers(params, config) {
return server.get('/ai-stock/transfers', {
params,
config,
});
}
}
export default AiStock;

21
src/i18n/de.json

@ -1175,14 +1175,14 @@
"a13":"Währung",
"a14":"Kurs",
"a15":"Änderung",
"a16":"Name / Ticker",
"a17":"Kaufpreis",
"a18":"Verkaufspreis",
"a19":"Menge",
"a20":"Servicegebühr",
"a21":"Transaktionsbetrag",
"a22":"Gewinn",
"a23":"Richtung",
"a16":"Handelszeit",
"a17":"Symbol",
"a18":"Richtung",
"a19":"Preis",
"a20":"Menge",
"a21":"Betrag",
"a22":"G/V",
"a23":"Ergebnis",
"a24":"Kaufzeitpunkt",
"a25":"Verkaufszeitpunkt",
"a26":"Keine Daten verfügbar",
@ -1190,6 +1190,9 @@
"a28":"Mindesteinzahlungsbetrag",
"a29":"Abbrechen",
"a30":"Bestätigen",
"a31":"Bitte Betrag eingeben"
"a31":"Bitte Betrag eingeben",
"a32":"Simuliert",
"a33":"Gewinn",
"a34":"Verlust"
}
}

21
src/i18n/en.json

@ -1280,14 +1280,14 @@
"a13":"Currency",
"a14":"Price",
"a15":"Change",
"a16":"Name / Ticker",
"a17":"Purchase Price",
"a18":"Selling Price",
"a19":"Quantity",
"a20":"Service Fee",
"a21":"Transaction Amount",
"a22":"Profit",
"a23":"Direction",
"a16":"Trade Time",
"a17":"Symbol",
"a18":"Direction",
"a19":"Price",
"a20":"Quantity",
"a21":"Amount",
"a22":"P&L",
"a23":"Result",
"a24":"Purchase Time",
"a25":"Sell Time",
"a26":"No Data Available",
@ -1295,7 +1295,10 @@
"a28":"Minimum Deposit Amount",
"a29":"Cancel",
"a30":"Confirm",
"a31":"Please Enter Amount"
"a31":"Please Enter Amount",
"a32":"Simulated",
"a33":"Profit",
"a34":"Loss"
},
"flashSwap": {
"from": "From",

21
src/i18n/fra.json

@ -1175,14 +1175,14 @@
"a13":"Devise",
"a14":"Prix",
"a15":"Variation",
"a16":"Nom / Symbole boursier",
"a17":"Prix d'achat",
"a18":"Prix de vente",
"a19":"Quantité",
"a20":"Frais de service",
"a21":"Montant de la transaction",
"a22":"Profit",
"a23":"Sens",
"a16":"Heure d'exécution",
"a17":"Symbole",
"a18":"Sens",
"a19":"Prix",
"a20":"Quantité",
"a21":"Montant",
"a22":"P&L",
"a23":"Résultat",
"a24":"Heure d'achat",
"a25":"Heure de vente",
"a26":"Aucune donnée disponible",
@ -1190,6 +1190,9 @@
"a28":"Montant minimum de dépôt",
"a29":"Annuler",
"a30":"Confirmer",
"a31":"Veuillez saisir le montant"
"a31":"Veuillez saisir le montant",
"a32":"Simulé",
"a33":"Profit",
"a34":"Perte"
}
}

21
src/i18n/he.json

@ -1192,14 +1192,14 @@
"a13":"מטבע",
"a14":"מחיר",
"a15":"עודף",
"a16":"שם / טיקר",
"a17":"מחיר קנייה",
"a18":"מחיר מכירה",
"a19":"כמות",
"a20":"עמלת שירות",
"a21":"עסקה סכום",
"a22":"רווח",
"a23":"כיוון",
"a16":"זמן עסקה",
"a17":"סימול",
"a18":"כיוון",
"a19":"מחיר",
"a20":"כמות",
"a21":"סכום",
"a22":"רווח/הפסד",
"a23":"תוצאה",
"a24":"זמן רכישה",
"a25":"זמן מכירה",
"a26":"אין נתונים זמינים",
@ -1207,6 +1207,9 @@
"a28":"סכום הפקדה מינימלי",
"a29":"ביטול",
"a30":"אישור",
"a31":"אנא הזן סכום"
"a31":"אנא הזן סכום",
"a32":"מסחר מדומה",
"a33":"רווח",
"a34":"הפסד"
}
}

21
src/i18n/it.json

@ -1174,14 +1174,14 @@
"a13":"Valuta",
"a14":"Prezzo",
"a15":"Variazione",
"a16":"Nome / Ticker",
"a17":"Prezzo di Acquisto",
"a18":"Prezzo di Vendita",
"a19":"Quantità",
"a20":"Commissione di Servizio",
"a21":"Importo della Transazione",
"a22":"Profitto",
"a23":"Direzione",
"a16":"Ora esecuzione",
"a17":"Simbolo",
"a18":"Direzione",
"a19":"Prezzo",
"a20":"Quantità",
"a21":"Importo",
"a22":"P&L",
"a23":"Risultato",
"a24":"Ora di Acquisto",
"a25":"Ora di Vendita",
"a26":"Nessun Dato Disponibile",
@ -1189,6 +1189,9 @@
"a28":"Importo Minimo di Deposito",
"a29":"Annulla",
"a30":"Conferma",
"a31":"Inserisci l'Importo"
"a31":"Inserisci l'Importo",
"a32":"Simulato",
"a33":"Profitto",
"a34":"Perdita"
}
}

21
src/i18n/jp.json

@ -1173,14 +1173,14 @@
"a13":"通貨",
"a14":"価格",
"a15":"変動",
"a16":"名称 / ティッカー",
"a17":"購入価格",
"a18":"売却価格",
"a19":"数量",
"a20":"手数料",
"a21":"取引額",
"a22":"益",
"a23":"方向",
"a16":"約定時間",
"a17":"銘柄",
"a18":"方向",
"a19":"約定価格",
"a20":"数量",
"a21":"取引額",
"a22":"益",
"a23":"結果",
"a24":"購入日時",
"a25":"売却日時",
"a26":"データなし",
@ -1188,6 +1188,9 @@
"a28":"最低入金額",
"a29":"キャンセル",
"a30":"確定",
"a31":"金額を入力してください"
"a31":"金額を入力してください",
"a32":"模擬取引",
"a33":"利益",
"a34":"損失"
}
}

19
src/i18n/kor.json

@ -1173,14 +1173,14 @@
"a13":"통화",
"a14":"가격",
"a15":"변동",
"a16":"종목명 / 티커",
"a17":"매수가",
"a18":"매도가",
"a19":"수량",
"a20":"수수료",
"a16":"체결 시간",
"a17":"종목",
"a18":"방향",
"a19":"체결가",
"a20":"수",
"a21":"거래 금액",
"a22":"익",
"a23":"방향",
"a22":"익",
"a23":"결과",
"a24":"매수 시간",
"a25":"매도 시간",
"a26":"데이터 없음",
@ -1188,6 +1188,9 @@
"a28":"최소 입금액",
"a29":"취소",
"a30":"확인",
"a31":"금액을 입력해 주세요"
"a31":"금액을 입력해 주세요",
"a32":"모의 거래",
"a33":"수익",
"a34":"손실"
}
}

21
src/i18n/pt.json

@ -1174,14 +1174,14 @@
"a13":"Moeda",
"a14":"Preço",
"a15":"Variação",
"a16":"Nome / Ticker",
"a17":"Preço de Compra",
"a18":"Preço de Venda",
"a19":"Quantidade",
"a20":"Taxa de Serviço",
"a21":"Valor da Transação",
"a22":"Lucro",
"a23":"Direção",
"a16":"Hora da execução",
"a17":"Símbolo",
"a18":"Direção",
"a19":"Preço",
"a20":"Quantidade",
"a21":"Valor",
"a22":"P&L",
"a23":"Resultado",
"a24":"Hora da Compra",
"a25":"Hora da Venda",
"a26":"Nenhum Dado Disponível",
@ -1189,6 +1189,9 @@
"a28":"Valor Mínimo de Depósito",
"a29":"Cancelar",
"a30":"Confirmar",
"a31":"Por favor, insira o valor"
"a31":"Por favor, insira o valor",
"a32":"Simulado",
"a33":"Lucro",
"a34":"Prejuízo"
}
}

21
src/i18n/spa.json

@ -1174,14 +1174,14 @@
"a13":"Divisa",
"a14":"Precio",
"a15":"Variación",
"a16":"Nombre / Símbolo",
"a17":"Precio de compra",
"a18":"Precio de venta",
"a19":"Cantidad",
"a20":"Comisión de servicio",
"a21":"Importe de la transacción",
"a22":"Ganancia",
"a23":"Dirección",
"a16":"Hora de ejecución",
"a17":"Símbolo",
"a18":"Dirección",
"a19":"Precio",
"a20":"Cantidad",
"a21":"Importe",
"a22":"P&L",
"a23":"Resultado",
"a24":"Hora de compra",
"a25":"Hora de venta",
"a26":"Sin datos disponibles",
@ -1189,6 +1189,9 @@
"a28":"Importe mínimo de depósito",
"a29":"Cancelar",
"a30":"Confirmar",
"a31":"Por favor, introduzca el importe"
"a31":"Por favor, introduzca el importe",
"a32":"Simulado",
"a33":"Ganancia",
"a34":"Pérdida"
}
}

21
src/i18n/tr.json

@ -1174,14 +1174,14 @@
"a13":"Para Birimi",
"a14":"Fiyat",
"a15":"Değişim",
"a16":sim / Sembol",
"a17":"Alış Fiyatı",
"a18":"Satış Fiyatı",
"a19":"Miktar",
"a20":"Hizmet Ücreti",
"a21":"İşlem Tutarı",
"a22":"Kazanç",
"a23":"Yön",
"a16":şlem Zamanı",
"a17":"Sembol",
"a18":"Yön",
"a19":"Fiyat",
"a20":"Miktar",
"a21":"Tutar",
"a22":"K/Z",
"a23":"Sonuç",
"a24":"Alış Zamanı",
"a25":"Satış Zamanı",
"a26":"Veri Bulunmuyor",
@ -1189,6 +1189,9 @@
"a28":"Minimum Yatırma Tutarı",
"a29":"İptal",
"a30":"Onayla",
"a31":"Lütfen Tutar Girin"
"a31":"Lütfen Tutar Girin",
"a32":"Simüle",
"a33":"Kâr",
"a34":"Zarar"
}
}

21
src/i18n/tw.json

@ -1210,14 +1210,14 @@
"a13":"幣種",
"a14":"價格",
"a15":"漲跌",
"a16":"名稱 / 代碼",
"a17":"購買價格",
"a18":"售價",
"a19":"數量",
"a20":"服務費",
"a21":"成交額",
"a22":"收益",
"a23":"方向",
"a16":"成交時間",
"a17":"股票",
"a18":"方向",
"a19":"成交價",
"a20":"數量",
"a21":"買賣金額",
"a22":"盈虧",
"a23":"結果",
"a24":"購買時間",
"a25":"賣出時間",
"a26":"暫無資料",
@ -1225,7 +1225,10 @@
"a28":"最低存款金額",
"a29":"取消",
"a30":"確認",
"a31":"請輸入金額"
"a31":"請輸入金額",
"a32":"模擬交易",
"a33":"盈利",
"a34":"虧損"
},
"flashSwap": {
"from": "從",

159
src/views/ellasAlpha/index.vue

@ -66,7 +66,7 @@
</div>
<div
:class="['tab-item', subTab === 'history' ? 'active' : '']"
@click="subTab = 'history'"
@click="switchSubTab('history')"
>
{{$t('automation.a12')}}
</div>
@ -118,23 +118,39 @@
<th>{{$t('automation.a20')}}</th>
<th>{{$t('automation.a21')}}</th>
<th>{{$t('automation.a22')}}</th>
<th>{{$t('automation.a23')}}</th>
<th>{{$t('automation.a24')}}</th>
<th class="text-right">{{$t('automation.a25')}}</th>
<th class="text-right">{{$t('automation.a23')}}</th>
</tr>
</thead>
<tbody>
<tr v-if="currentHistory.length === 0">
<td colspan="10" class="empty-text">{{$t('automation.a26')}}</td>
<td colspan="8" class="empty-text">{{$t('automation.a26')}}</td>
</tr>
<tr v-for="item in currentHistory" :key="item.id">
<td>{{ item.trade_time }}</td>
<td>{{ item.symbol }}</td>
<td>{{ formatSide(item.side) }}</td>
<td>{{ item.price }}</td>
<td>{{ item.quantity }}</td>
<td>{{ item.amount }}</td>
<td :class="pnlClass(item.pnl)">{{ item.pnl }}</td>
<td class="text-right">
<span :class="pnlClass(item.pnl)">{{ formatPnlStatus(item.pnl) }}</span>
</td>
</tr>
<!-- 这里可以写 v-for 渲染历史数据 -->
</tbody>
</table>
<!-- 分页占位 -->
<div class="pagination">
<span class="arrow">&lt;</span>
<span class="page-num">1</span>
<span class="arrow">&gt;</span>
<div class="pagination" v-if="orderTotal > 0">
<span
class="arrow"
:class="{ disabled: orderPage <= 1 }"
@click="changeOrderPage(orderPage - 1)"
>&lt;</span>
<span class="page-num">{{ orderPage }}</span>
<span
class="arrow"
:class="{ disabled: orderPage >= orderTotalPages }"
@click="changeOrderPage(orderPage + 1)"
>&gt;</span>
</div>
</div>
</div>
@ -186,6 +202,8 @@
</template>
<script>
import AiStock from '@/api/aiStock';
export default {
name: 'EaTrading',
data() {
@ -194,8 +212,12 @@ export default {
subTab: 'list', // 'list' | 'history'
modalType: '', // '' | 'deposit' | 'withdraw'
formAmount: '',
orderPage: 1,
orderPerPage: 20,
orderTotal: 0,
orderList: [],
// mock
//
accountData: {
stock: {
total: '0.00',
@ -228,10 +250,6 @@ export default {
{ name: 'GRT/USDC', symbol: 'GRT', price: '0.0205', change: -5.94 },
{ name: 'HBAR/USDC', symbol: 'HBAR', price: '0.0815', change: -5.08 },
],
// mock ()
stockHistory: [],
cryptoHistory: []
}
},
computed: {
@ -245,13 +263,114 @@ export default {
return this.mainTab === 'stock' ? this.stockList : this.cryptoList;
},
currentHistory() {
return this.mainTab === 'stock' ? this.stockHistory : this.cryptoHistory;
return this.mainTab === 'stock' ? this.orderList : [];
},
orderTotalPages() {
return Math.ceil(this.orderTotal / this.orderPerPage) || 1;
}
},
watch: {
mainTab(tab) {
if (tab === 'stock') {
this.fetchStockAccount();
}
if (this.subTab === 'history') {
if (tab === 'stock') {
this.fetchOrders(1);
} else {
this.orderList = [];
this.orderTotal = 0;
}
}
}
},
mounted() {
if (this.mainTab === 'stock') {
this.fetchStockAccount();
}
if (this.subTab === 'history' && this.mainTab === 'stock') {
this.fetchOrders(1);
}
},
methods: {
switchMainTab(tab) {
this.mainTab = tab;
//
},
fetchStockAccount() {
const today = this.getTodayDate();
Promise.all([
AiStock.getAccount({ loading: false }),
AiStock.getOrders({ config_date: today, page: 1, per_page: 100 }, { loading: false }),
AiStock.getOrders({ page: 1, per_page: 100 }, { loading: false }),
]).then(([account, todayOrders, allOrders]) => {
const gift = parseFloat(account.gift_balance) || 0;
const profit = parseFloat(account.profit_balance) || 0;
this.accountData.stock = {
total: this.formatAmount(gift + profit),
usable: this.formatAmount(profit),
todayProfit: this.formatAmount(this.sumPnl(todayOrders.list)),
totalProfit: this.formatAmount(this.sumPnl(allOrders.list)),
};
}).catch(() => {
this.accountData.stock = {
total: '0.00',
usable: '0.00',
todayProfit: '0.00',
totalProfit: '0.00',
};
});
},
getTodayDate() {
const d = new Date();
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return `${y}-${m}-${day}`;
},
sumPnl(list) {
return (list || []).reduce((sum, item) => sum + (parseFloat(item.pnl) || 0), 0);
},
formatAmount(value) {
const num = parseFloat(value);
if (Number.isNaN(num)) return '0.00';
return num.toFixed(2);
},
switchSubTab(tab) {
this.subTab = tab;
if (tab === 'history' && this.mainTab === 'stock') {
this.fetchOrders(1);
}
},
fetchOrders(page = this.orderPage) {
if (this.mainTab !== 'stock') return;
AiStock.getOrders({
page,
per_page: this.orderPerPage,
}, { loading: false }).then(data => {
this.orderList = data.list || [];
this.orderTotal = data.total || 0;
this.orderPage = data.page || page;
}).catch(() => {
this.orderList = [];
this.orderTotal = 0;
});
},
changeOrderPage(page) {
if (page < 1 || page > this.orderTotalPages) return;
this.fetchOrders(page);
},
formatSide(side) {
return side === 'buy' ? this.$t('common.buy-in') : this.$t('common.sell-out');
},
pnlClass(pnl) {
const value = parseFloat(pnl);
if (Number.isNaN(value) || value === 0) return '';
return value > 0 ? 'text-green' : 'text-red';
},
formatPnlStatus(pnl) {
const value = parseFloat(pnl);
if (Number.isNaN(value) || value === 0) return '-';
return value > 0 ? this.$t('automation.a33') : this.$t('automation.a34');
},
showModal(type) {
this.modalType = type;
@ -501,6 +620,10 @@ export default {
cursor: pointer;
color: #666;
}
.pagination .arrow.disabled {
color: #ccc;
cursor: not-allowed;
}
/* ================= 弹窗样式 ================= */
.modal-overlay {

Loading…
Cancel
Save