This commit is contained in:
aaron 2026-03-29 11:55:16 +08:00
parent e84fd312f4
commit 9b29e19d78

View File

@ -150,6 +150,49 @@
grid-template-columns: 1fr;
}
}
/* Admin Dropdown */
.admin-dropdown {
position: relative;
}
.admin-menu {
position: absolute;
top: 100%;
right: 0;
margin-top: 8px;
background: var(--bg-primary);
border: 1px solid var(--border);
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
min-width: 200px;
z-index: 1000;
}
.admin-menu-item {
display: block;
width: 100%;
padding: 12px 16px;
background: none;
border: none;
text-align: left;
font-size: 14px;
color: var(--text-primary);
cursor: pointer;
transition: all 0.2s;
}
.admin-menu-item:hover {
background: var(--bg-secondary);
}
.admin-menu-item:first-child {
border-radius: var(--radius-md) var(--radius-md) 0 0;
}
.admin-menu-item:last-child {
border-radius: 0 0 var(--radius-md) var(--radius-md);
}
</style>
</head>
<body>
@ -158,7 +201,7 @@
<!-- Header -->
<div class="page-header">
<div>
<div class="page-title">
<div class="page-title" @click="handleTitleClick" style="cursor: pointer;">
XClaw
<span class="paper-badge">AI</span>
</div>
@ -166,12 +209,18 @@
</div>
<div class="header-actions">
<button class="btn btn-secondary" @click="refreshData">刷新</button>
<button class="btn btn-primary" @click="sendReport" :disabled="sendingReport">
{{ sendingReport ? '发送中...' : '发送报告' }}
</button>
<button class="btn btn-danger" @click="resetAccount" v-if="currentTab === 'positions' && openPositions.length > 0">
重置账户
</button>
<!-- 管理员菜单 -->
<div class="admin-dropdown" v-if="adminMode">
<button class="btn btn-secondary" @click="toggleAdminMenu">管理 ▾</button>
<div class="admin-menu" v-if="showAdminMenu">
<button class="admin-menu-item" @click="toggleAdminMode">
🔓 关闭管理员模式
</button>
</div>
</div>
</div>
</div>
@ -182,21 +231,24 @@
<div class="metric-value">${{ account.current_balance ? account.current_balance.toLocaleString() : '0' }}</div>
<div class="metric-sub">可用: ${{ account.available_margin ? account.available_margin.toLocaleString() : '0' }}</div>
</div>
<div class="metric-card">
<div class="metric-label">已用保证金</div>
<div class="metric-value">${{ account.used_margin ? account.used_margin.toLocaleString() : '0' }}</div>
</div>
<div class="metric-card">
<div class="metric-label">持仓价值</div>
<div class="metric-value">${{ account.total_position_value ? account.total_position_value.toLocaleString() : '0' }}</div>
</div>
<div class="metric-card">
<div class="metric-label">已实现盈亏</div>
<div class="metric-value" :class="account.realized_pnl >= 0 ? 'positive' : 'negative'">
${{ account.realized_pnl ? account.realized_pnl.toLocaleString() : '0' }}
<div class="metric-value" :class="stats.total_pnl >= 0 ? 'positive' : 'negative'">
${{ stats.total_pnl ? stats.total_pnl.toLocaleString() : '0' }}
</div>
<div class="metric-sub">{{ stats.total_trades || 0 }} 笔交易</div>
</div>
<div class="metric-card">
<div class="metric-label">收益率</div>
<div class="metric-value" :class="stats.total_pnl_percent >= 0 ? 'positive' : 'negative'">
{{ stats.total_pnl_percent >= 0 ? '+' : '' }}{{ stats.total_pnl_percent ? stats.total_pnl_percent.toFixed(2) : '0.00' }}%
</div>
<div class="metric-sub">初始资金: $10,000</div>
</div>
</div>
<!-- Stats Grid -->
@ -472,7 +524,12 @@
current_total_leverage: 0,
max_total_leverage: 10
},
orders: []
orders: [],
adminMode: false,
showAdminMenu: false,
adminPassword: '223388',
titleClickCount: 0,
titleClickTimer: null
};
},
computed: {
@ -483,7 +540,10 @@
return this.orders.filter(o => o.status === 'pending');
},
orderHistory() {
return this.orders.filter(o => o.status === 'closed');
// 包含所有已关闭的订单closed_tp, closed_sl, closed_be, closed_ts, closed_manual, cancelled
return this.orders.filter(o =>
o.status.startsWith('closed') || o.status === 'cancelled'
);
}
},
methods: {
@ -633,10 +693,56 @@
'signal': '信号'
};
return map[reason] || reason || '-';
},
handleTitleClick() {
this.titleClickCount++;
if (this.titleClickTimer) {
clearTimeout(this.titleClickTimer);
}
this.titleClickTimer = setTimeout(() => {
this.titleClickCount = 0;
}, 2000);
if (this.titleClickCount === 3) {
this.titleClickCount = 0;
this.promptAdminMode();
}
},
promptAdminMode() {
if (this.adminMode) {
this.adminMode = false;
this.showAdminMenu = false;
alert('管理员模式已关闭');
} else {
const password = prompt('请输入管理员密码:');
if (password === this.adminPassword) {
this.adminMode = true;
alert('管理员模式已开启');
} else if (password !== null) {
alert('密码错误');
}
}
},
toggleAdminMenu() {
this.showAdminMenu = !this.showAdminMenu;
},
toggleAdminMode() {
this.promptAdminMode();
}
},
mounted() {
this.refreshData();
// 点击外部关闭管理菜单
document.addEventListener('click', (e) => {
if (this.showAdminMenu && !e.target.closest('.admin-dropdown')) {
this.showAdminMenu = false;
}
});
}
}).mount('#app');
</script>