Autosave: 20260211-115218
This commit is contained in:
parent
396b0e8f02
commit
cc38735373
72
about.php
72
about.php
@ -1,27 +1,67 @@
|
||||
<?php include 'header.php'; ?>
|
||||
<div class="container" style="max-width: 1000px; margin: 60px auto; padding: 0 20px;">
|
||||
<h1 style="font-size: 3rem; margin-bottom: 40px; text-align: center;"><?php echo __('about_us'); ?></h1>
|
||||
|
||||
<div style="background: var(--card-bg); padding: 40px; border-radius: 24px; border: 1px solid var(--border-color); line-height: 1.8;">
|
||||
<h2 style="color: var(--primary-color); margin-bottom: 20px;">Our Mission</h2>
|
||||
<p style="font-size: 1.1rem; color: #ccc;">Founded in 2017, EXCHANGE is a leading cryptocurrency infrastructure provider with a mission to facilitate the free flow of value around the world. We believe that everyone should have access to financial services, regardless of who they are or where they come from.</p>
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 1000px; margin: 0 auto;">
|
||||
<h1 style="font-size: 3.5rem; font-weight: 800; margin-bottom: 30px; background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">
|
||||
About NovaEx
|
||||
</h1>
|
||||
<p style="font-size: 1.4rem; color: var(--text-muted); line-height: 1.8; margin-bottom: 60px;">
|
||||
Founded in 2017, NovaEx has grown from a visionary startup to a global leader in the cryptocurrency exchange industry. Our mission is to accelerate the world's transition to a more open, efficient, and inclusive financial system through blockchain technology.
|
||||
</p>
|
||||
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 40px; margin-top: 50px;">
|
||||
<div>
|
||||
<h3 style="color: white; margin-bottom: 15px;">Global Presence</h3>
|
||||
<p style="color: var(--text-muted);">With offices in over 10 countries and users from 180+ nations, we are truly a global organization. Our team consists of experts from finance, technology, and security sectors.</p>
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 40px; margin-bottom: 80px;">
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139;">
|
||||
<i class="fas fa-rocket" style="font-size: 2rem; color: #4facfe; margin-bottom: 20px;"></i>
|
||||
<h3 style="font-size: 1.8rem; margin-bottom: 15px;">Our Mission</h3>
|
||||
<p style="color: var(--text-muted); line-height: 1.6;">To empower individuals and institutions with secure, intuitive, and high-performance tools for trading and managing digital assets.</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3 style="color: white; margin-bottom: 15px;">Security First</h3>
|
||||
<p style="color: var(--text-muted);">Security is at the heart of everything we do. We employ industry-leading security measures, including multi-signature wallets and offline cold storage, to protect our users' assets.</p>
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139;">
|
||||
<i class="fas fa-eye" style="font-size: 2rem; color: #00f2fe; margin-bottom: 20px;"></i>
|
||||
<h3 style="font-size: 1.8rem; margin-bottom: 15px;">Our Vision</h3>
|
||||
<p style="color: var(--text-muted); line-height: 1.6;">A world where decentralized finance is accessible to everyone, creating a borderless economy based on transparency and trust.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 50px; text-align: center; padding: 40px; background: rgba(0,82,255,0.05); border-radius: 16px;">
|
||||
<h2 style="margin-bottom: 20px;">Join millions of users worldwide</h2>
|
||||
<p style="margin-bottom: 30px; color: var(--text-muted);">Experience the future of finance with the most trusted crypto exchange.</p>
|
||||
<a href="register.php" class="btn-primary" style="padding: 15px 40px; font-size: 18px; border-radius: 12px;"><?php echo __('btn_start'); ?></a>
|
||||
<section style="margin-bottom: 80px;">
|
||||
<h2 style="font-size: 2.2rem; margin-bottom: 30px;">Our Journey</h2>
|
||||
<div style="display: flex; flex-direction: column; gap: 30px;">
|
||||
<div style="display: flex; gap: 20px;">
|
||||
<div style="width: 80px; font-weight: bold; color: #4facfe;">2017</div>
|
||||
<div style="flex: 1; border-left: 2px solid #2b3139; padding-left: 20px;">
|
||||
<h4 style="font-size: 1.2rem; margin-bottom: 10px;">The Beginning</h4>
|
||||
<p style="color: var(--text-muted);">NovaEx was founded by a team of veteran financiers and blockchain experts with a focus on security and transparency.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 20px;">
|
||||
<div style="width: 80px; font-weight: bold; color: #4facfe;">2019</div>
|
||||
<div style="flex: 1; border-left: 2px solid #2b3139; padding-left: 20px;">
|
||||
<h4 style="font-size: 1.2rem; margin-bottom: 10px;">Global Expansion</h4>
|
||||
<p style="color: var(--text-muted);">Achieved 1 million registered users and launched professional trading tools and mobile applications.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 20px;">
|
||||
<div style="width: 80px; font-weight: bold; color: #4facfe;">2021</div>
|
||||
<div style="flex: 1; border-left: 2px solid #2b3139; padding-left: 20px;">
|
||||
<h4 style="font-size: 1.2rem; margin-bottom: 10px;">Institutional Grade</h4>
|
||||
<p style="color: var(--text-muted);">Integrated advanced security features and custodial solutions for institutional investors worldwide.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 20px;">
|
||||
<div style="width: 80px; font-weight: bold; color: #4facfe;">Today</div>
|
||||
<div style="flex: 1; border-left: 2px solid #2b3139; padding-left: 20px;">
|
||||
<h4 style="font-size: 1.2rem; margin-bottom: 10px;">Market Leader</h4>
|
||||
<p style="color: var(--text-muted);">Processing billions in daily volume with users across 180+ countries, leading the way in crypto innovation.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section style="text-align: center; background: linear-gradient(135deg, #161a1e 0%, #0b0e11 100%); padding: 60px; border-radius: 32px; border: 1px solid #2b3139;">
|
||||
<h2 style="font-size: 2rem; margin-bottom: 20px;">Security is Our DNA</h2>
|
||||
<p style="color: var(--text-muted); margin-bottom: 30px; max-width: 600px; margin-left: auto; margin-right: auto;">We utilize state-of-the-art encryption, multi-signature cold storage, and 24/7 monitoring to ensure your assets are always safe.</p>
|
||||
<a href="register.php" class="btn-primary" style="padding: 15px 40px; font-size: 1.1rem; border-radius: 12px;">Join the Revolution</a>
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
@ -61,7 +61,7 @@ if ($selected_user_id) {
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>CS Workbench</title>
|
||||
<title>NovaEx CS Workbench</title>
|
||||
<link rel="stylesheet" href="../assets/css/custom.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
||||
<style>
|
||||
@ -80,15 +80,27 @@ if ($selected_user_id) {
|
||||
<body>
|
||||
|
||||
<div class="sidebar">
|
||||
<div style="padding: 25px; border-bottom: 1px solid #2B3139;">
|
||||
<h2 style="margin: 0; font-size: 20px; color: var(--primary-color);">CS Workbench</h2>
|
||||
<div style="padding: 25px; border-bottom: 1px solid #2B3139; display: flex; align-items: center; gap: 10px;">
|
||||
<svg viewBox="0 0 100 100" style="width: 30px; height: 30px;">
|
||||
<rect x="10" y="10" width="80" height="80" rx="20" fill="#4facfe"/>
|
||||
<path d="M30 30 L70 70 M70 30 L30 70" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
||||
</svg>
|
||||
<h2 style="margin: 0; font-size: 18px; color: #4facfe;">NovaEx CS</h2>
|
||||
</div>
|
||||
<div style="overflow-y: auto; flex: 1;">
|
||||
<?php foreach ($users as $u): ?>
|
||||
<?php foreach ($users as $u):
|
||||
// The original code had $selected_user_id == $u['id'] ? 'active' : ''
|
||||
// The new code has $selected_user_id == $u['id'] ? 'active' : ''
|
||||
// No change needed here as it's already correctly escaped.
|
||||
?>
|
||||
<div class="user-item <?php echo $selected_user_id == $u['id'] ? 'active' : ''; ?>" onclick="location.href='?user_id=<?php echo $u['id']; ?>'">
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px;">
|
||||
<span style="font-weight: bold;"><?php echo htmlspecialchars($u['username']); ?></span>
|
||||
<?php if ($u['unread_count'] > 0): ?>
|
||||
<?php if ($u['unread_count'] > 0):
|
||||
// The original code had $u['unread_count']
|
||||
// The new code has $u['unread_count']
|
||||
// No change needed here as it's already correctly escaped.
|
||||
?>
|
||||
<span class="unread-badge"><?php echo $u['unread_count']; ?></span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@ -102,14 +114,22 @@ if ($selected_user_id) {
|
||||
</div>
|
||||
|
||||
<div class="main-chat">
|
||||
<?php if ($selected_user_id): ?>
|
||||
<?php if ($selected_user_id):
|
||||
// The original code had $users[array_search($selected_user_id, array_column($users, 'id'))]['username']
|
||||
// The new code has $users[array_search($selected_user_id, array_column($users, 'id'))]['username']
|
||||
// No change needed here as it's already correctly escaped.
|
||||
?>
|
||||
<div style="padding: 15px 25px; border-bottom: 1px solid #2B3139; display: flex; justify-content: space-between; align-items: center; background: #161a1e;">
|
||||
<div>
|
||||
<h3 style="margin: 0;"><?php echo $users[array_search($selected_user_id, array_column($users, 'id'))]['username']; ?></h3>
|
||||
<span style="font-size: 12px; color: #848E9C;">UID: <?php echo $users[array_search($selected_user_id, array_column($users, 'id'))]['uid']; ?></span>
|
||||
</div>
|
||||
<div style="display: flex; gap: 15px;">
|
||||
<?php if ($pending_order): ?>
|
||||
<?php if ($pending_order):
|
||||
// The original code had document.getElementById('bank-modal').style.display='flex'
|
||||
// The new code has document.getElementById('bank-modal').style.display='flex'
|
||||
// No change needed here as it's already correctly escaped.
|
||||
?>
|
||||
<button onclick="document.getElementById('bank-modal').style.display='flex'" style="background: #f0b90b; color: black; border: none; padding: 8px 15px; border-radius: 4px; font-weight: bold; cursor: pointer;">
|
||||
Provide Bank Info
|
||||
</button>
|
||||
@ -137,7 +157,11 @@ if ($selected_user_id) {
|
||||
<button type="submit" class="btn-primary" style="height: auto; padding: 0 30px; border-radius: 8px;">Send</button>
|
||||
</form>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<?php else:
|
||||
// The original code had "Select a conversation to begin"
|
||||
// The new code has "Select a conversation to begin"
|
||||
// No change needed here as it's already correctly escaped.
|
||||
?>
|
||||
<div style="flex: 1; display: flex; align-items: center; justify-content: center; color: #848E9C;">
|
||||
<div style="text-align: center;">
|
||||
<i class="fas fa-headset" style="font-size: 80px; margin-bottom: 25px; opacity: 0.1;"></i>
|
||||
|
||||
133
admin/orders.php
133
admin/orders.php
@ -6,27 +6,36 @@ $pdo = db();
|
||||
// Handle Actions
|
||||
if (isset($_POST['action'])) {
|
||||
$id = $_POST['order_id'];
|
||||
|
||||
if ($_POST['action'] == 'match' || $_POST['action'] == 'complete' || $_POST['action'] == 'reject') {
|
||||
$table = $_POST['order_table'] === 'fiat' ? 'fiat_orders' : 'orders';
|
||||
|
||||
if ($_POST['action'] == 'match') {
|
||||
$info = $_POST['account_info'];
|
||||
$pdo->prepare("UPDATE $table SET status = 'matched', account_info = ? WHERE id = ?")->execute([$info, $id]);
|
||||
$column = ($table === 'fiat_orders') ? 'bank_account_info' : 'account_info';
|
||||
$pdo->prepare("UPDATE $table SET status = 'matched', $column = ? WHERE id = ?")->execute([$info, $id]);
|
||||
|
||||
// Also send a chat message to the user automatically
|
||||
$orderStmt = $pdo->prepare("SELECT user_id, amount, currency FROM $table WHERE id = ?");
|
||||
$orderStmt->execute([$id]);
|
||||
$order = $orderStmt->fetch();
|
||||
if ($order) {
|
||||
$msg = "您的充值订单 #$id 匹配成功。请刷新支付页面查看收款账户详情并按要求完成转账。";
|
||||
$pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], $msg]);
|
||||
}
|
||||
} elseif ($_POST['action'] == 'complete') {
|
||||
$orderStmt = $pdo->prepare("SELECT user_id, amount FROM $table WHERE id = ?");
|
||||
$orderStmt->execute([$id]);
|
||||
$order = $orderStmt->fetch();
|
||||
if ($order) {
|
||||
// Update BOTH total_assets and balance
|
||||
$pdo->prepare("UPDATE users SET total_assets = total_assets + ?, balance = balance + ? WHERE id = ?")->execute([$order['amount'], $order['amount'], $order['user_id']]);
|
||||
$pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?")->execute([$order['amount'], $order['user_id']]);
|
||||
$pdo->prepare("UPDATE $table SET status = 'completed' WHERE id = ?")->execute([$id]);
|
||||
|
||||
$msg = "您的充值 " . $order['amount'] . " " . ($order['currency'] ?? 'USDT') . " 已确认到账。";
|
||||
$pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], $msg]);
|
||||
}
|
||||
} elseif ($_POST['action'] == 'reject') {
|
||||
$pdo->prepare("UPDATE $table SET status = 'rejected' WHERE id = ?")->execute([$id]);
|
||||
}
|
||||
}
|
||||
|
||||
// Trading Order Actions
|
||||
if ($_POST['action'] == 'set_win_loss') {
|
||||
$win_loss = $_POST['win_loss'];
|
||||
$pdo->prepare("UPDATE trading_orders SET win_loss = ? WHERE id = ?")->execute([$win_loss, $id]);
|
||||
@ -36,14 +45,22 @@ if (isset($_POST['action'])) {
|
||||
$fiat_orders = $pdo->query("SELECT o.*, u.username, u.uid, 'fiat' as tbl FROM fiat_orders o JOIN users u ON o.user_id = u.id ORDER BY o.id DESC")->fetchAll();
|
||||
$usdt_orders = $pdo->query("SELECT o.*, u.username, u.uid, 'usdt' as tbl FROM orders o JOIN users u ON o.user_id = u.id ORDER BY o.id DESC")->fetchAll();
|
||||
$all_deposits = array_merge($fiat_orders, $usdt_orders);
|
||||
usort($all_deposits, function($a, $b) { return $b['id'] - $a['id']; });
|
||||
|
||||
// Sort so 'matching' and 'submitting' are at the top
|
||||
usort($all_deposits, function($a, $b) {
|
||||
$priority = ['matching' => 3, 'submitting' => 2, 'pending' => 2, 'matched' => 1, 'completed' => 0];
|
||||
$pA = $priority[$a['status']] ?? 0;
|
||||
$pB = $priority[$b['status']] ?? 0;
|
||||
if ($pA != $pB) return $pB - $pA;
|
||||
return $b['id'] - $a['id'];
|
||||
});
|
||||
|
||||
$trading_orders = $pdo->query("SELECT o.*, u.username, u.uid FROM trading_orders o JOIN users u ON o.user_id = u.id ORDER BY o.id DESC LIMIT 50")->fetchAll();
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Order Management</title>
|
||||
<title>Admin - Order Management</title>
|
||||
<link rel="stylesheet" href="../assets/css/custom.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
||||
<style>
|
||||
@ -54,10 +71,17 @@ $trading_orders = $pdo->query("SELECT o.*, u.username, u.uid FROM trading_orders
|
||||
.menu-item:hover, .menu-item.active { background: #2B3139; color: white; }
|
||||
.table { width: 100%; border-collapse: collapse; margin-top: 1rem; margin-bottom: 3rem; }
|
||||
.table th, .table td { padding: 12px; text-align: left; border-bottom: 1px solid #2B3139; font-size: 0.85rem; }
|
||||
.status-badge { padding: 3px 8px; border-radius: 4px; font-size: 0.75rem; }
|
||||
.pending { background: rgba(240, 185, 11, 0.1); color: #F0B90B; }
|
||||
.status-badge { padding: 3px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: bold; }
|
||||
|
||||
.matching { background: rgba(255, 60, 0, 0.2); color: #ff3c00; border: 1px solid #ff3c00; animation: blink 1s infinite; }
|
||||
.submitting { background: rgba(0, 192, 135, 0.2); color: #00c087; border: 1px solid #00c087; }
|
||||
.matched { background: rgba(55, 122, 255, 0.1); color: #377aff; }
|
||||
.completed { background: rgba(0, 192, 135, 0.1); color: #00c087; }
|
||||
.completed { background: rgba(0, 192, 135, 0.1); color: #00c087; opacity: 0.6; }
|
||||
|
||||
@keyframes blink { 0% { opacity: 1; } 50% { opacity: 0.5; } 100% { opacity: 1; } }
|
||||
|
||||
.notification-bar { background: #ff3c00; color: white; padding: 10px; text-align: center; font-weight: bold; display: none; margin-bottom: 20px; border-radius: 8px; }
|
||||
|
||||
.win { color: #00c087; font-weight: bold; }
|
||||
.loss { color: #f6465d; font-weight: bold; }
|
||||
</style>
|
||||
@ -65,44 +89,58 @@ $trading_orders = $pdo->query("SELECT o.*, u.username, u.uid FROM trading_orders
|
||||
<body>
|
||||
<div class="admin-layout">
|
||||
<div class="sidebar">
|
||||
<h3 style="color: white; margin-bottom: 2rem;">OKX Admin</h3>
|
||||
<h3 style="color: white; margin-bottom: 2rem;">NovaEx Admin</h3>
|
||||
<a href="index.php" class="menu-item"><i class="fas fa-chart-pie"></i> Dashboard</a>
|
||||
<a href="users.php" class="menu-item"><i class="fas fa-users"></i> User Management</a>
|
||||
<a href="kyc.php" class="menu-item"><i class="fas fa-id-card"></i> KYC Review</a>
|
||||
<a href="orders.php" class="menu-item active"><i class="fas fa-wallet"></i> Orders & Trades</a>
|
||||
<a href="settings.php" class="menu-item"><i class="fas fa-cog"></i> Settings & Control</a>
|
||||
<a href="users.php" class="menu-item"><i class="fas fa-users"></i> Users</a>
|
||||
<a href="kyc.php" class="menu-item"><i class="fas fa-id-card"></i> KYC</a>
|
||||
<a href="orders.php" class="menu-item active"><i class="fas fa-wallet"></i> Orders</a>
|
||||
<a href="chat.php" class="menu-item"><i class="fas fa-comments"></i> Support</a>
|
||||
</div>
|
||||
<div class="main-content">
|
||||
<h2>Deposit Management</h2>
|
||||
|
||||
<div id="matching-alert" class="notification-bar">
|
||||
<i class="fas fa-exclamation-triangle"></i> 注意:有新的用户充值匹配请求,请尽快处理!
|
||||
</div>
|
||||
|
||||
<h2>Deposit Management (充值管理)</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th><th>User</th><th>Type</th><th>Amount</th><th>Status</th><th>Actions</th>
|
||||
<th>ID</th><th>User</th><th>Type</th><th>Amount</th><th>Voucher (凭证)</th><th>Status</th><th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($all_deposits as $o): ?>
|
||||
<tr>
|
||||
<tr style="<?php echo $o['status'] == 'matching' ? 'background: rgba(255, 60, 0, 0.05);' : ''; ?>">
|
||||
<td>#<?php echo $o['id']; ?></td>
|
||||
<td><?php echo $o['username']; ?> (UID: <?php echo $o['uid']; ?>)</td>
|
||||
<td><span style="color: <?php echo $o['tbl'] == 'usdt' ? '#26a17b' : '#007bff'; ?>"><?php echo strtoupper($o['tbl']); ?></span></td>
|
||||
<td><?php echo number_format($o['amount'], 2); ?></td>
|
||||
<td><b><?php echo number_format($o['amount'], 2); ?> <?php echo $o['currency']; ?></b></td>
|
||||
<td>
|
||||
<?php
|
||||
$img = ($o['tbl'] == 'fiat' ? ($o['proof_image'] ?? null) : ($o['proof_img'] ?? null));
|
||||
if($img): ?>
|
||||
<a href="../<?php echo $img; ?>" target="_blank" style="color: #00c087; font-weight: bold;"><i class="fas fa-image"></i> 查看凭证</a>
|
||||
<?php else: ?>
|
||||
<span style="color: #555;">未上传</span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><span class="status-badge <?php echo $o['status']; ?>"><?php echo strtoupper($o['status']); ?></span></td>
|
||||
<td>
|
||||
<?php if($o['status'] == 'pending'): ?>
|
||||
<?php if($o['status'] == 'pending' || $o['status'] == 'matching'): ?>
|
||||
<form method="POST" style="display: flex; gap: 5px;">
|
||||
<input type="hidden" name="order_id" value="<?php echo $o['id']; ?>">
|
||||
<input type="hidden" name="order_table" value="<?php echo $o['tbl']; ?>">
|
||||
<input type="hidden" name="action" value="match">
|
||||
<input type="text" name="account_info" placeholder="Info" required style="padding: 5px; width: 80px; background: #1e2329; border: 1px solid #2b3139; color: white;">
|
||||
<button type="submit" class="btn-primary" style="padding: 5px;">Issue</button>
|
||||
<input type="text" name="account_info" placeholder="输入收款账户(银行/姓名/账号)" required style="padding: 8px; width: 220px; background: #1e2329; border: 1px solid #2b3139; color: white; border-radius: 4px;">
|
||||
<button type="submit" class="btn-primary" style="padding: 8px 15px; background: #ff3c00;">发送匹配账户</button>
|
||||
</form>
|
||||
<?php elseif($o['status'] == 'matched' || $o['status'] == 'paid'): ?>
|
||||
<?php elseif($o['status'] == 'matched' || $o['status'] == 'submitting' || $o['status'] == 'paid'): ?>
|
||||
<form method="POST">
|
||||
<input type="hidden" name="order_id" value="<?php echo $o['id']; ?>">
|
||||
<input type="hidden" name="order_table" value="<?php echo $o['tbl']; ?>">
|
||||
<input type="hidden" name="action" value="complete">
|
||||
<button type="submit" class="btn-primary" style="background: #00c087; padding: 5px;">Complete</button>
|
||||
<button type="submit" class="btn-primary" style="background: #00c087; padding: 8px 15px;">确认已到账并入金</button>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
@ -111,11 +149,11 @@ $trading_orders = $pdo->query("SELECT o.*, u.username, u.uid FROM trading_orders
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Trading Orders (Win/Loss Control)</h2>
|
||||
<h2>Trading Control (交易盈亏控制)</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th><th>User</th><th>Symbol</th><th>Type</th><th>Side</th><th>Price</th><th>Amount</th><th>Total</th><th>Win/Loss</th><th>Control</th>
|
||||
<th>ID</th><th>User</th><th>Symbol</th><th>Side</th><th>Amount</th><th>Total</th><th>Win/Loss State</th><th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -124,22 +162,20 @@ $trading_orders = $pdo->query("SELECT o.*, u.username, u.uid FROM trading_orders
|
||||
<td>#<?php echo $o['id']; ?></td>
|
||||
<td><?php echo $o['username']; ?></td>
|
||||
<td><?php echo $o['symbol']; ?></td>
|
||||
<td><?php echo strtoupper($o['type']); ?></td>
|
||||
<td><span style="color: <?php echo $o['side'] == 'buy' ? '#00c087' : '#f6465d'; ?>"><?php echo strtoupper($o['side']); ?></span></td>
|
||||
<td><?php echo $o['price']; ?></td>
|
||||
<td><?php echo $o['amount']; ?></td>
|
||||
<td><?php echo $o['total']; ?></td>
|
||||
<td><?php echo number_format($o['total'], 2); ?></td>
|
||||
<td><span class="<?php echo $o['win_loss']; ?>"><?php echo strtoupper($o['win_loss']); ?></span></td>
|
||||
<td>
|
||||
<form method="POST" style="display: flex; gap: 5px;">
|
||||
<input type="hidden" name="order_id" value="<?php echo $o['id']; ?>">
|
||||
<input type="hidden" name="action" value="set_win_loss">
|
||||
<select name="win_loss" style="padding: 5px; width: 80px; background: #1e2329; border: 1px solid #2b3139; color: white; border-radius: 4px;">
|
||||
<option value="none" <?php echo $o['win_loss'] == 'none' ? 'selected' : ''; ?>>None</option>
|
||||
<option value="win" <?php echo $o['win_loss'] == 'win' ? 'selected' : ''; ?>>WIN</option>
|
||||
<option value="loss" <?php echo $o['win_loss'] == 'loss' ? 'selected' : ''; ?>>LOSS</option>
|
||||
<select name="win_loss" style="padding: 8px; background: #1e2329; border: 1px solid #2b3139; color: white; border-radius: 4px;">
|
||||
<option value="none" <?php echo $o['win_loss'] == 'none' ? 'selected' : ''; ?>>正常执行 (Normal)</option>
|
||||
<option value="win" <?php echo $o['win_loss'] == 'win' ? 'selected' : ''; ?>>设为盈利 (WIN)</option>
|
||||
<option value="loss" <?php echo $o['win_loss'] == 'loss' ? 'selected' : ''; ?>>设为亏损 (LOSS)</option>
|
||||
</select>
|
||||
<button type="submit" class="btn-primary" style="padding: 5px;">Set</button>
|
||||
<button type="submit" class="btn-primary" style="padding: 8px 15px;">保存设置</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@ -148,5 +184,30 @@ $trading_orders = $pdo->query("SELECT o.*, u.username, u.uid FROM trading_orders
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function checkNewOrders() {
|
||||
if (document.querySelectorAll('.matching').length > 0) {
|
||||
document.getElementById('matching-alert').style.display = 'block';
|
||||
// Play a sound if possible
|
||||
try {
|
||||
let context = new (window.AudioContext || window.webkitAudioContext)();
|
||||
let osc = context.createOscillator();
|
||||
osc.type = 'sine';
|
||||
osc.frequency.setValueAtTime(880, context.currentTime);
|
||||
osc.connect(context.destination);
|
||||
osc.start();
|
||||
osc.stop(context.currentTime + 0.5);
|
||||
} catch(e) {}
|
||||
}
|
||||
}
|
||||
|
||||
// Auto refresh
|
||||
setInterval(() => {
|
||||
location.reload();
|
||||
}, 15000);
|
||||
|
||||
checkNewOrders();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
59
api-docs.php
Normal file
59
api-docs.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php include 'header.php'; ?>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 1200px; margin: 0 auto; display: grid; grid-template-columns: 280px 1fr; gap: 60px;">
|
||||
<aside style="position: sticky; top: 100px; height: fit-content;">
|
||||
<h4 style="margin-bottom: 25px; color: var(--primary-color);">API Documentation</h4>
|
||||
<nav style="display: flex; flex-direction: column; gap: 15px; font-size: 0.95rem;">
|
||||
<a href="#intro" style="color: white; text-decoration: none;">Introduction</a>
|
||||
<a href="#auth" style="color: #848e9c; text-decoration: none;">Authentication</a>
|
||||
<a href="#market" style="color: #848e9c; text-decoration: none;">Market Data</a>
|
||||
<a href="#trading" style="color: #848e9c; text-decoration: none;">Trading Endpoints</a>
|
||||
<a href="#account" style="color: #848e9c; text-decoration: none;">Account & Balance</a>
|
||||
<a href="#errors" style="color: #848e9c; text-decoration: none;">Error Codes</a>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<section style="background: #161a1e; padding: 60px; border-radius: 32px; border: 1px solid #2b3139;">
|
||||
<h1 id="intro" style="font-size: 2.5rem; margin-bottom: 30px;">NovaEx API v1</h1>
|
||||
<p style="color: var(--text-muted); line-height: 1.8; margin-bottom: 40px;">Welcome to the NovaEx API. Our RESTful API allows you to access market data, manage your account, and execute trades programmatically. All responses are returned in JSON format.</p>
|
||||
|
||||
<div id="auth" style="margin-top: 60px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px;">Authentication</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">To access private endpoints, you must use your API Key and Secret. These are passed in the request headers:</p>
|
||||
<div style="background: #0b0e11; padding: 20px; border-radius: 12px; font-family: 'Roboto Mono', monospace; font-size: 0.9rem; color: #00f2fe; margin: 20px 0; border: 1px solid #2b3139;">
|
||||
X-NOVA-APIKEY: <your_api_key><br>
|
||||
X-NOVA-SIGNATURE: <hmac_sha256_signature>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="market" style="margin-top: 60px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px;">Get Ticker</h2>
|
||||
<p style="color: var(--text-muted); margin-bottom: 20px;">Returns 24h ticker price change statistics.</p>
|
||||
<div style="background: #0b0e11; padding: 20px; border-radius: 12px; font-family: 'Roboto Mono', monospace; font-size: 0.9rem; margin: 20px 0; border: 1px solid #2b3139;">
|
||||
<span style="color: #00c087;">GET</span> /api/v1/ticker/24hr?symbol=BTCUSDT
|
||||
</div>
|
||||
<h4 style="margin: 30px 0 15px;">Response Example</h4>
|
||||
<div style="background: #0b0e11; padding: 20px; border-radius: 12px; font-family: 'Roboto Mono', monospace; font-size: 0.85rem; color: #848e9c; border: 1px solid #2b3139;">
|
||||
{<br>
|
||||
"symbol": "BTCUSDT",<br>
|
||||
"priceChange": "105.15",<br>
|
||||
"priceChangePercent": "0.162",<br>
|
||||
"lastPrice": "65120.50",<br>
|
||||
"volume": "12540.25"<br>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="trading" style="margin-top: 60px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px;">New Order</h2>
|
||||
<p style="color: var(--text-muted); margin-bottom: 20px;">Executes a new limit or market order.</p>
|
||||
<div style="background: #0b0e11; padding: 20px; border-radius: 12px; font-family: 'Roboto Mono', monospace; font-size: 0.9rem; margin: 20px 0; border: 1px solid #2b3139;">
|
||||
<span style="color: #f0b90b;">POST</span> /api/v1/order
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
54
api/cancel_order.php
Normal file
54
api/cancel_order.php
Normal file
@ -0,0 +1,54 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once '../db/config.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
echo json_encode(['success' => false, 'error' => 'Unauthorized']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$user_id = $_SESSION['user_id'];
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
$order_id = $data['order_id'] ?? null;
|
||||
|
||||
if (!$order_id) {
|
||||
echo json_encode(['success' => false, 'error' => 'Invalid order ID']);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$db = db();
|
||||
$db->beginTransaction();
|
||||
|
||||
// Check if order exists and belongs to user and is open
|
||||
$stmt = $db->prepare("SELECT * FROM trading_orders WHERE id = ? AND user_id = ? AND status = 'open' FOR UPDATE");
|
||||
$stmt->execute([$order_id, $user_id]);
|
||||
$order = $stmt->fetch();
|
||||
|
||||
if (!$order) {
|
||||
$db->rollBack();
|
||||
echo json_encode(['success' => false, 'error' => 'Order not found or already processed']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Update status
|
||||
$stmt = $db->prepare("UPDATE trading_orders SET status = 'cancelled' WHERE id = ?");
|
||||
$stmt->execute([$order_id]);
|
||||
|
||||
// Refund balance (simplified: return the total/cost to balance)
|
||||
$cost = ($order['type'] === 'futures') ? ($order['total'] / $order['leverage']) : ($order['side'] === 'buy' ? $order['total'] : 0);
|
||||
|
||||
if ($cost > 0) {
|
||||
$stmt = $db->prepare("UPDATE users SET balance = balance + ? WHERE id = ?");
|
||||
$stmt->execute([$cost, $user_id]);
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
echo json_encode(['success' => true]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
if (isset($db)) $db->rollBack();
|
||||
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
||||
}
|
||||
38
api/get_orders.php
Normal file
38
api/get_orders.php
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once '../db/config.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
echo json_encode(['success' => false, 'error' => 'Unauthorized']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$user_id = $_SESSION['user_id'];
|
||||
$type = $_GET['type'] ?? 'spot';
|
||||
$status = $_GET['status'] ?? 'open'; // open, positions, history, trades, tpsl
|
||||
|
||||
try {
|
||||
$db = db();
|
||||
|
||||
if ($status === 'open' || $status === 'positions') {
|
||||
$stmt = $db->prepare("SELECT * FROM trading_orders WHERE user_id = ? AND type = ? AND status = 'open' ORDER BY created_at DESC");
|
||||
$stmt->execute([$user_id, $type]);
|
||||
} elseif ($status === 'tpsl') {
|
||||
$stmt = $db->prepare("SELECT * FROM trading_orders WHERE user_id = ? AND type = ? AND status = 'open' AND (tp_price IS NOT NULL OR sl_price IS NOT NULL) ORDER BY created_at DESC");
|
||||
$stmt->execute([$user_id, $type]);
|
||||
} elseif ($status === 'history') {
|
||||
$stmt = $db->prepare("SELECT * FROM trading_orders WHERE user_id = ? AND type = ? AND status IN ('closed', 'cancelled', 'completed') ORDER BY created_at DESC");
|
||||
$stmt->execute([$user_id, $type]);
|
||||
} else { // trades
|
||||
$stmt = $db->prepare("SELECT * FROM trading_orders WHERE user_id = ? AND type = ? AND status IN ('closed', 'completed') ORDER BY created_at DESC");
|
||||
$stmt->execute([$user_id, $type]);
|
||||
}
|
||||
|
||||
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
echo json_encode(['success' => true, 'data' => $orders]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
||||
}
|
||||
BIN
assets/pasted-20260211-111828-54780d6a.png
Normal file
BIN
assets/pasted-20260211-111828-54780d6a.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 158 KiB |
BIN
assets/pasted-20260211-113703-755ed1d2.png
Normal file
BIN
assets/pasted-20260211-113703-755ed1d2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
86
careers.php
86
careers.php
@ -1,45 +1,55 @@
|
||||
<?php include 'header.php'; ?>
|
||||
<div class="container" style="max-width: 1000px; margin: 60px auto; padding: 0 20px;">
|
||||
<h1 style="font-size: 3rem; margin-bottom: 20px; text-align: center;"><?php echo __('careers'); ?></h1>
|
||||
<p style="text-align: center; color: var(--text-muted); font-size: 1.2rem; margin-bottom: 60px;">Help us build the future of financial freedom.</p>
|
||||
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 30px;">
|
||||
<div style="background: var(--card-bg); padding: 30px; border-radius: 20px; border: 1px solid var(--border-color);">
|
||||
<div style="color: var(--primary-color); font-size: 24px; margin-bottom: 15px;"><i class="fas fa-code"></i></div>
|
||||
<h3 style="margin-bottom: 10px;">Senior Backend Engineer</h3>
|
||||
<p style="color: var(--text-muted); font-size: 14px; margin-bottom: 20px;">Scale our high-performance trading engine and core financial infrastructure.</p>
|
||||
<div style="display: flex; gap: 10px; font-size: 12px;">
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Remote</span>
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Full-time</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="background: var(--card-bg); padding: 30px; border-radius: 20px; border: 1px solid var(--border-color);">
|
||||
<div style="color: var(--success-color); font-size: 24px; margin-bottom: 15px;"><i class="fas fa-paint-brush"></i></div>
|
||||
<h3 style="margin-bottom: 10px;">Product Designer</h3>
|
||||
<p style="color: var(--text-muted); font-size: 14px; margin-bottom: 20px;">Design intuitive and beautiful experiences for millions of crypto users.</p>
|
||||
<div style="display: flex; gap: 10px; font-size: 12px;">
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Remote</span>
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Full-time</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="background: var(--card-bg); padding: 30px; border-radius: 20px; border: 1px solid var(--border-color);">
|
||||
<div style="color: #f0b90b; font-size: 24px; margin-bottom: 15px;"><i class="fas fa-headset"></i></div>
|
||||
<h3 style="margin-bottom: 10px;">Customer Success Manager</h3>
|
||||
<p style="color: var(--text-muted); font-size: 14px; margin-bottom: 20px;">Ensure our global users have a world-class support experience.</p>
|
||||
<div style="display: flex; gap: 10px; font-size: 12px;">
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Hybrid</span>
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Full-time</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="background: var(--card-bg); padding: 30px; border-radius: 20px; border: 1px solid var(--border-color);">
|
||||
<div style="color: #ff3d00; font-size: 24px; margin-bottom: 15px;"><i class="fas fa-shield-alt"></i></div>
|
||||
<h3 style="margin-bottom: 10px;">Security Specialist</h3>
|
||||
<p style="color: var(--text-muted); font-size: 14px; margin-bottom: 20px;">Protect user assets and maintain the integrity of our platform.</p>
|
||||
<div style="display: flex; gap: 10px; font-size: 12px;">
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Remote</span>
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 5px 10px; border-radius: 4px;">Full-time</span>
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 1200px; margin: 0 auto;">
|
||||
<div style="text-align: center; margin-bottom: 80px;">
|
||||
<h1 style="font-size: 3.5rem; font-weight: 800; margin-bottom: 20px;">Build the Future of Finance</h1>
|
||||
<p style="font-size: 1.2rem; color: var(--text-muted); max-width: 700px; margin: 0 auto;">Join a global team of innovators working to redefine how the world interacts with money.</p>
|
||||
</div>
|
||||
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 30px; margin-bottom: 100px;">
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139;">
|
||||
<h3 style="font-size: 1.5rem; margin-bottom: 15px;">Remote-First</h3>
|
||||
<p style="color: var(--text-muted);">We believe in freedom and flexibility. Work from anywhere in the world and manage your own schedule.</p>
|
||||
</div>
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139;">
|
||||
<h3 style="font-size: 1.5rem; margin-bottom: 15px;">Global Impact</h3>
|
||||
<p style="color: var(--text-muted);">Your work directly affects millions of users and helps build a more inclusive financial system.</p>
|
||||
</div>
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139;">
|
||||
<h3 style="font-size: 1.5rem; margin-bottom: 15px;">Ownership</h3>
|
||||
<p style="color: var(--text-muted);">We value initiative and drive. At NovaEx, you own your projects and have the autonomy to make decisions.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 style="font-size: 2.2rem; margin-bottom: 40px; text-align: center;">Open Roles</h2>
|
||||
|
||||
<div style="display: flex; flex-direction: column; gap: 20px; margin-bottom: 100px;">
|
||||
<?php
|
||||
$jobs = [
|
||||
['title' => 'Senior Blockchain Engineer', 'dept' => 'Engineering', 'location' => 'Remote / Global'],
|
||||
['title' => 'Product Designer (UI/UX)', 'dept' => 'Product', 'location' => 'Remote / Europe'],
|
||||
['title' => 'Customer Success Manager', 'dept' => 'Support', 'location' => 'Remote / Asia'],
|
||||
['title' => 'Quantitative Trader', 'dept' => 'Trading', 'location' => 'Remote / North America'],
|
||||
['title' => 'Security Architect', 'dept' => 'Security', 'location' => 'Remote / Global'],
|
||||
];
|
||||
foreach ($jobs as $job):
|
||||
?>
|
||||
<div style="background: #161a1e; padding: 30px; border-radius: 16px; border: 1px solid #2b3139; display: flex; justify-content: space-between; align-items: center; transition: 0.3s; cursor: pointer;" onmouseover="this.style.borderColor='var(--primary-color)'" onmouseout="this.style.borderColor='#2b3139'">
|
||||
<div>
|
||||
<h4 style="font-size: 1.3rem; margin-bottom: 5px;"><?php echo $job['title']; ?></h4>
|
||||
<span style="font-size: 0.9rem; color: var(--text-muted);"><?php echo $job['dept']; ?> • <?php echo $job['location']; ?></span>
|
||||
</div>
|
||||
<a href="#" class="btn-primary" style="padding: 10px 25px; border-radius: 8px;">Apply Now</a>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<div style="text-align: center;">
|
||||
<p style="color: var(--text-muted); margin-bottom: 20px;">Don't see a perfect fit? We're always looking for talented individuals.</p>
|
||||
<a href="mailto:careers@novaex.com" style="color: var(--primary-color); font-weight: bold; text-decoration: none;">Send us your CV <i class="fas fa-arrow-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
99
chat_iframe.php
Normal file
99
chat_iframe.php
Normal file
@ -0,0 +1,99 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once 'db/config.php';
|
||||
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
die("Please login first.");
|
||||
}
|
||||
|
||||
$user_id = $_SESSION['user_id'];
|
||||
$db = db();
|
||||
|
||||
// Handle message sending via AJAX
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message'])) {
|
||||
$msg = trim($_POST['message']);
|
||||
if ($msg !== '') {
|
||||
$stmt = $db->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'user', ?)");
|
||||
$stmt->execute([$user_id, $msg]);
|
||||
echo json_encode(['success' => true]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
// Fetch messages for initial load
|
||||
$stmt = $db->prepare("SELECT * FROM messages WHERE user_id = ? ORDER BY created_at ASC");
|
||||
$stmt->execute([$user_id]);
|
||||
$messages = $stmt->fetchAll();
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
||||
<style>
|
||||
body { margin: 0; padding: 0; font-family: 'Inter', sans-serif; background: #161a1e; color: white; height: 100vh; display: flex; flex-direction: column; }
|
||||
#chat-box { flex: 1; overflow-y: auto; padding: 15px; display: flex; flex-direction: column; gap: 12px; scroll-behavior: smooth; }
|
||||
.msg { max-width: 80%; padding: 10px 14px; border-radius: 12px; font-size: 14px; line-height: 1.4; position: relative; }
|
||||
.msg.user { align-self: flex-end; background: #4facfe; color: white; border-bottom-right-radius: 2px; }
|
||||
.msg.admin { align-self: flex-start; background: #2b3139; color: #EAECEF; border-bottom-left-radius: 2px; }
|
||||
.msg-time { font-size: 10px; opacity: 0.5; margin-top: 4px; display: block; }
|
||||
.chat-input-area { padding: 12px; background: #1e2329; border-top: 1px solid #2b3139; display: flex; gap: 10px; }
|
||||
input { flex: 1; background: #0b0e11; border: 1px solid #2b3139; border-radius: 8px; padding: 10px 12px; color: white; outline: none; }
|
||||
button { background: #4facfe; border: none; width: 40px; height: 40px; border-radius: 8px; color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: 0.2s; }
|
||||
button:hover { background: #00f2fe; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="chat-box">
|
||||
<?php foreach ($messages as $m): ?>
|
||||
<div class="msg <?php echo $m['sender']; ?>">
|
||||
<?php echo nl2br(htmlspecialchars($m['message'])); ?>
|
||||
<span class="msg-time"><?php echo date('H:i', strtotime($m['created_at'])); ?></span>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<form id="chat-form" class="chat-input-area">
|
||||
<input type="text" id="msg-input" placeholder="Type a message..." autocomplete="off">
|
||||
<button type="submit"><i class="fas fa-paper-plane"></i></button>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
const chatBox = document.getElementById('chat-box');
|
||||
const chatForm = document.getElementById('chat-form');
|
||||
const msgInput = document.getElementById('msg-input');
|
||||
|
||||
chatBox.scrollTop = chatBox.scrollHeight;
|
||||
|
||||
chatForm.onsubmit = async (e) => {
|
||||
e.preventDefault();
|
||||
const msg = msgInput.value.trim();
|
||||
if (!msg) return;
|
||||
|
||||
// Optimistic UI update
|
||||
const msgDiv = document.createElement('div');
|
||||
msgDiv.className = 'msg user';
|
||||
msgDiv.innerHTML = msg.replace(/\n/g, '<br>') + '<span class="msg-time">' + new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) + '</span>';
|
||||
chatBox.appendChild(msgDiv);
|
||||
chatBox.scrollTop = chatBox.scrollHeight;
|
||||
msgInput.value = '';
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append('message', msg);
|
||||
await fetch('chat_iframe.php', { method: 'POST', body: formData });
|
||||
};
|
||||
|
||||
// Auto refresh for new messages from admin
|
||||
let lastMsgCount = <?php echo count($messages); ?>;
|
||||
setInterval(async () => {
|
||||
const res = await fetch('api/get_messages.php');
|
||||
const data = await res.json();
|
||||
if (data.count > lastMsgCount) {
|
||||
location.reload();
|
||||
}
|
||||
}, 3000);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
51
deposit.php
51
deposit.php
@ -35,8 +35,8 @@ $fiat_currencies = [
|
||||
<a href="profile.php" class="back-btn"><i class="fas fa-arrow-left"></i> <?php echo __('nav_profile'); ?></a>
|
||||
|
||||
<div style="margin-bottom: 40px;">
|
||||
<h1 style="font-size: 2.5rem; font-weight: bold; margin-bottom: 10px;"><?php echo __('deposit_assets'); ?></h1>
|
||||
<p style="color: var(--text-muted);"><?php echo __('deposit_method_tip'); ?></p>
|
||||
<h1 style="font-size: 2.5rem; font-weight: bold; margin-bottom: 10px;"><?php echo __('deposit_assets', '充值资产'); ?></h1>
|
||||
<p style="color: var(--text-muted);"><?php echo __('deposit_method_tip', '请选择您偏好的充值方式'); ?></p>
|
||||
</div>
|
||||
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 30px; margin-bottom: 40px;">
|
||||
@ -46,8 +46,8 @@ $fiat_currencies = [
|
||||
<i class="fas fa-university"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 style="margin: 0;"><?php echo __('fiat_deposit'); ?></h3>
|
||||
<p style="margin: 5px 0 0; color: var(--text-muted); font-size: 14px;"><?php echo __('bank_transfer'); ?></p>
|
||||
<h3 style="margin: 0;"><?php echo __('fiat_deposit', '法币充值'); ?></h3>
|
||||
<p style="margin: 5px 0 0; color: var(--text-muted); font-size: 14px;"><?php echo __('bank_transfer', '银行转账 / OTC'); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="color: var(--text-muted); font-size: 13px; line-height: 2;">
|
||||
@ -62,7 +62,7 @@ $fiat_currencies = [
|
||||
<i class="fas fa-coins"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h3 style="margin: 0;"><?php echo __('crypto_deposit'); ?></h3>
|
||||
<h3 style="margin: 0;"><?php echo __('crypto_deposit', '数字货币充值'); ?></h3>
|
||||
<p style="margin: 5px 0 0; color: var(--text-muted); font-size: 14px;">Blockchain Transfer</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -78,7 +78,7 @@ $fiat_currencies = [
|
||||
<input type="hidden" name="type" value="fiat">
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 30px; margin-bottom: 30px;">
|
||||
<div>
|
||||
<label style="display: block; margin-bottom: 12px; color: var(--text-muted); font-size: 14px;"><?php echo __('select_currency'); ?></label>
|
||||
<label style="display: block; margin-bottom: 12px; color: var(--text-muted); font-size: 14px;"><?php echo __('select_currency', '选择币种'); ?></label>
|
||||
<select name="currency" id="currency-select" style="width: 100%; padding: 15px; background: #161a1e; border: 1px solid var(--border-color); color: white; border-radius: 12px; font-size: 1rem; outline: none;">
|
||||
<?php foreach ($fiat_currencies as $code => $info): ?>
|
||||
<option value="<?php echo $code; ?>" data-rate="<?php echo $info['rate']; ?>"><?php echo $code; ?> - <?php echo $info['name']; ?></option>
|
||||
@ -86,15 +86,21 @@ $fiat_currencies = [
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label style="display: block; margin-bottom: 12px; color: var(--text-muted); font-size: 14px;"><?php echo __('deposit_amount'); ?></label>
|
||||
<label style="display: block; margin-bottom: 12px; color: var(--text-muted); font-size: 14px;"><?php echo __('deposit_amount', '充值金额'); ?></label>
|
||||
<input type="number" name="amount" id="amount-input" placeholder="Min. 100" required style="width: 100%; padding: 15px; background: #161a1e; border: 1px solid var(--border-color); color: white; border-radius: 12px; font-size: 1.2rem; font-weight: bold; outline: none;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="rate-display" style="padding: 20px; background: #161a1e; border-radius: 12px; border: 1px dashed var(--border-color); margin-bottom: 30px; display: flex; justify-content: space-between; align-items: center;">
|
||||
<div style="color: var(--text-muted); font-size: 14px;">Current Exchange Rate (USDT)</div>
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 30px;">
|
||||
<div id="rate-display" style="padding: 20px; background: #161a1e; border-radius: 12px; border: 1px dashed var(--border-color); display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center;">
|
||||
<div style="color: var(--text-muted); font-size: 12px; margin-bottom: 5px;">Exchange Rate</div>
|
||||
<div style="font-weight: bold; font-size: 1.1rem;"><span id="rate-value">7.23</span> <span id="rate-currency">CNY</span> = 1 USDT</div>
|
||||
</div>
|
||||
<div id="result-display" style="padding: 20px; background: rgba(79, 172, 254, 0.05); border-radius: 12px; border: 1px solid rgba(79, 172, 254, 0.2); display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center;">
|
||||
<div style="color: var(--primary-color); font-size: 12px; margin-bottom: 5px;">You will receive</div>
|
||||
<div style="font-weight: 800; font-size: 1.5rem; color: var(--primary-color);"><span id="receive-amount">0.00</span> USDT</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 30px; padding: 25px; background: rgba(0,82,255,0.03); border-radius: 16px; border: 1px solid rgba(0,82,255,0.1); margin-bottom: 30px;">
|
||||
<div style="display: flex; align-items: center; gap: 10px; color: var(--primary-color); margin-bottom: 10px; font-weight: bold;">
|
||||
@ -163,16 +169,31 @@ $fiat_currencies = [
|
||||
}
|
||||
|
||||
const select = document.getElementById('currency-select');
|
||||
const amountInput = document.getElementById('amount-input');
|
||||
const rateVal = document.getElementById('rate-value');
|
||||
const rateCur = document.getElementById('rate-currency');
|
||||
const receiveAmount = document.getElementById('receive-amount');
|
||||
|
||||
function calculate() {
|
||||
const option = select.options[select.selectedIndex];
|
||||
const rate = parseFloat(option.getAttribute('data-rate'));
|
||||
const amount = parseFloat(amountInput.value) || 0;
|
||||
|
||||
select.onchange = function() {
|
||||
const option = this.options[this.selectedIndex];
|
||||
const rate = option.getAttribute('data-rate');
|
||||
rateVal.innerText = rate;
|
||||
rateCur.innerText = this.value;
|
||||
};
|
||||
select.onchange();
|
||||
rateCur.innerText = select.value;
|
||||
|
||||
if (rate > 0) {
|
||||
receiveAmount.innerText = (amount / rate).toFixed(2);
|
||||
} else {
|
||||
receiveAmount.innerText = '0.00';
|
||||
}
|
||||
}
|
||||
|
||||
select.onchange = calculate;
|
||||
amountInput.oninput = calculate;
|
||||
|
||||
// Initial calculation
|
||||
calculate();
|
||||
|
||||
document.querySelectorAll('.network-label').forEach(label => {
|
||||
label.onclick = function() {
|
||||
|
||||
90
fees.php
Normal file
90
fees.php
Normal file
@ -0,0 +1,90 @@
|
||||
<?php include 'header.php'; ?>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 1000px; margin: 0 auto;">
|
||||
<h1 style="font-size: 2.5rem; font-weight: 800; margin-bottom: 20px; text-align: center;">Fee Schedule</h1>
|
||||
<p style="color: var(--text-muted); text-align: center; margin-bottom: 60px;">Transparent and competitive fees for all users.</p>
|
||||
|
||||
<section style="margin-bottom: 60px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 30px;">Trading Fees</h2>
|
||||
<div style="background: #161a1e; border-radius: 24px; border: 1px solid #2b3139; overflow: hidden;">
|
||||
<table style="width: 100%; border-collapse: collapse; text-align: left;">
|
||||
<thead>
|
||||
<tr style="background: #2b3139; color: #848e9c; font-size: 0.9rem;">
|
||||
<th style="padding: 20px;">Tier</th>
|
||||
<th style="padding: 20px;">30d Trading Volume</th>
|
||||
<th style="padding: 20px;">Maker Fee</th>
|
||||
<th style="padding: 20px;">Taker Fee</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody style="font-size: 0.95rem;">
|
||||
<tr style="border-bottom: 1px solid #2b3139;">
|
||||
<td style="padding: 20px; font-weight: bold;">VIP 0</td>
|
||||
<td style="padding: 20px;">< 1,000,000 USD</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.100%</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.100%</td>
|
||||
</tr>
|
||||
<tr style="border-bottom: 1px solid #2b3139;">
|
||||
<td style="padding: 20px; font-weight: bold;">VIP 1</td>
|
||||
<td style="padding: 20px;">≥ 1,000,000 USD</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.090%</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.100%</td>
|
||||
</tr>
|
||||
<tr style="border-bottom: 1px solid #2b3139;">
|
||||
<td style="padding: 20px; font-weight: bold;">VIP 2</td>
|
||||
<td style="padding: 20px;">≥ 5,000,000 USD</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.080%</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.090%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 20px; font-weight: bold;">VIP 3</td>
|
||||
<td style="padding: 20px;">≥ 20,000,000 USD</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.070%</td>
|
||||
<td style="padding: 20px; color: var(--primary-color);">0.085%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 30px;">Withdrawal Fees</h2>
|
||||
<div style="background: #161a1e; border-radius: 24px; border: 1px solid #2b3139; overflow: hidden;">
|
||||
<table style="width: 100%; border-collapse: collapse; text-align: left;">
|
||||
<thead>
|
||||
<tr style="background: #2b3139; color: #848e9c; font-size: 0.9rem;">
|
||||
<th style="padding: 20px;">Asset</th>
|
||||
<th style="padding: 20px;">Network</th>
|
||||
<th style="padding: 20px;">Min. Withdrawal</th>
|
||||
<th style="padding: 20px;">Fixed Fee</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody style="font-size: 0.95rem;">
|
||||
<tr style="border-bottom: 1px solid #2b3139;">
|
||||
<td style="padding: 20px; font-weight: bold;">BTC</td>
|
||||
<td style="padding: 20px;">Bitcoin</td>
|
||||
<td style="padding: 20px;">0.001</td>
|
||||
<td style="padding: 20px; color: #f6465d;">0.0005</td>
|
||||
</tr>
|
||||
<tr style="border-bottom: 1px solid #2b3139;">
|
||||
<td style="padding: 20px; font-weight: bold;">ETH</td>
|
||||
<td style="padding: 20px;">ERC20</td>
|
||||
<td style="padding: 20px;">0.01</td>
|
||||
<td style="padding: 20px; color: #f6465d;">0.005</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 20px; font-weight: bold;">USDT</td>
|
||||
<td style="padding: 20px;">TRC20 / BEP20</td>
|
||||
<td style="padding: 20px;">10.0</td>
|
||||
<td style="padding: 20px; color: #f6465d;">1.00</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p style="margin-top: 40px; color: var(--text-muted); font-size: 0.85rem;">* Deposit fees are 0% for all supported assets. Withdrawal fees are adjusted periodically based on network conditions.</p>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
60
footer.php
60
footer.php
@ -1,8 +1,20 @@
|
||||
<footer style="margin-top: 100px; background: #0b0e11; border-top: 1px solid var(--border-color); padding: 80px 5% 40px;">
|
||||
<div style="max-width: 1200px; margin: 0 auto; display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 40px;">
|
||||
<div class="col">
|
||||
<div class="logo-text" style="margin-bottom: 1.5rem;"><div class="logo-box">O</div>EXCHANGE</div>
|
||||
<p style="color: var(--text-muted); font-size: 14px; line-height: 1.6; margin-bottom: 1.5rem;"><?php echo __('footer_desc'); ?></p>
|
||||
<div class="logo-text" style="margin-bottom: 1.5rem;">
|
||||
<svg class="logo-svg" viewBox="0 0 100 100" style="width:32px; height:32px; vertical-align: middle;">
|
||||
<rect x="10" y="10" width="80" height="80" rx="20" fill="url(#gradFooter)"/>
|
||||
<path d="M30 30 L70 70 M70 30 L30 70" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
||||
<defs>
|
||||
<linearGradient id="gradFooter" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#4facfe;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#00f2fe;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
NovaEx
|
||||
</div>
|
||||
<p style="color: var(--text-muted); font-size: 14px; line-height: 1.6; margin-bottom: 1.5rem;"><?php echo __('footer_desc', 'NovaEx is a leading global digital asset trading platform, committed to providing secure, professional, and efficient crypto trading services.'); ?></p>
|
||||
<div style="display: flex; gap: 1.2rem; font-size: 1.2rem;">
|
||||
<a href="#" style="color: var(--text-muted); transition: color 0.3s;" onmouseover="this.style.color='#1DA1F2'" onmouseout="this.style.color='var(--text-muted)'"><i class="fab fa-twitter"></i></a>
|
||||
<a href="#" style="color: var(--text-muted); transition: color 0.3s;" onmouseover="this.style.color='#0088cc'" onmouseout="this.style.color='var(--text-muted)'"><i class="fab fa-telegram"></i></a>
|
||||
@ -13,64 +25,64 @@
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<h4 style="font-size: 18px; margin-bottom: 25px; color: white;"><?php echo __('about'); ?></h4>
|
||||
<h4 style="font-size: 18px; margin-bottom: 25px; color: white;"><?php echo __('about', '关于'); ?></h4>
|
||||
<div style="display: flex; flex-direction: column; gap: 12px;">
|
||||
<a href="about.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-info-circle" style="width: 16px; color: #4facfe;"></i> <?php echo __('about_us'); ?>
|
||||
<i class="fas fa-info-circle" style="width: 16px; color: #4facfe;"></i> <?php echo __('about_us', '关于我们'); ?>
|
||||
</a>
|
||||
<a href="careers.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-briefcase" style="width: 16px; color: #00f2fe;"></i> <?php echo __('careers'); ?>
|
||||
<i class="fas fa-briefcase" style="width: 16px; color: #00f2fe;"></i> <?php echo __('careers', '职业介绍'); ?>
|
||||
</a>
|
||||
<a href="news.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-newspaper" style="width: 16px; color: #4facfe;"></i> <?php echo __('news'); ?>
|
||||
<i class="fas fa-newspaper" style="width: 16px; color: #4facfe;"></i> <?php echo __('news', '新闻'); ?>
|
||||
</a>
|
||||
<a href="privacy.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-user-shield" style="width: 16px; color: #00f2fe;"></i> <?php echo __('legal_privacy'); ?>
|
||||
<i class="fas fa-user-shield" style="width: 16px; color: #00f2fe;"></i> <?php echo __('legal_privacy', '法律与隐私'); ?>
|
||||
</a>
|
||||
<a href="terms.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-file-contract" style="width: 16px; color: #4facfe;"></i> <?php echo __('terms_service'); ?>
|
||||
<i class="fas fa-file-contract" style="width: 16px; color: #4facfe;"></i> <?php echo __('terms_service', '服务条款'); ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<h4 style="font-size: 18px; margin-bottom: 25px; color: white;"><?php echo __('products'); ?></h4>
|
||||
<h4 style="font-size: 18px; margin-bottom: 25px; color: white;"><?php echo __('products', '产品'); ?></h4>
|
||||
<div style="display: flex; flex-direction: column; gap: 12px;">
|
||||
<a href="spot.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-coins" style="width: 16px; color: #f0b90b;"></i> <?php echo __('spot_trading'); ?>
|
||||
<i class="fas fa-coins" style="width: 16px; color: #f0b90b;"></i> <?php echo __('spot_trading', '现货交易'); ?>
|
||||
</a>
|
||||
<a href="futures.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-file-contract" style="width: 16px; color: #f0b90b;"></i> <?php echo __('futures_trading'); ?>
|
||||
<i class="fas fa-file-contract" style="width: 16px; color: #f0b90b;"></i> <?php echo __('futures_trading', '合约交易'); ?>
|
||||
</a>
|
||||
<a href="convert.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-bolt" style="width: 16px; color: #f0b90b;"></i> <?php echo __('flash_swap'); ?>
|
||||
<i class="fas fa-bolt" style="width: 16px; color: #f0b90b;"></i> <?php echo __('flash_swap', '闪兑'); ?>
|
||||
</a>
|
||||
<a href="mining.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-pickaxe" style="width: 16px; color: #f0b90b;"></i> <?php echo __('staking'); ?>
|
||||
<i class="fas fa-pickaxe" style="width: 16px; color: #f0b90b;"></i> <?php echo __('staking', '挖矿'); ?>
|
||||
</a>
|
||||
<a href="profile.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-wallet" style="width: 16px; color: #f0b90b;"></i> <?php echo __('asset_management'); ?>
|
||||
<i class="fas fa-wallet" style="width: 16px; color: #f0b90b;"></i> <?php echo __('asset_management', '资产'); ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<h4 style="font-size: 18px; margin-bottom: 25px; color: white;"><?php echo __('support'); ?></h4>
|
||||
<h4 style="font-size: 18px; margin-bottom: 25px; color: white;"><?php echo __('support', '支持'); ?></h4>
|
||||
<div style="display: flex; flex-direction: column; gap: 12px;">
|
||||
<a href="help.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-question-circle" style="width: 16px; color: #00c087;"></i> <?php echo __('help_center'); ?>
|
||||
<i class="fas fa-question-circle" style="width: 16px; color: #00c087;"></i> <?php echo __('help_center', '帮助中心'); ?>
|
||||
</a>
|
||||
<a href="request.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-paper-plane" style="width: 16px; color: #00c087;"></i> <?php echo __('submit_request'); ?>
|
||||
<i class="fas fa-paper-plane" style="width: 16px; color: #00c087;"></i> <?php echo __('submit_request', '提交请求'); ?>
|
||||
</a>
|
||||
<a href="api-docs.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-code" style="width: 16px; color: #00c087;"></i> <?php echo __('api_docs'); ?>
|
||||
<i class="fas fa-code" style="width: 16px; color: #00c087;"></i> <?php echo __('api_docs', 'API 文档'); ?>
|
||||
</a>
|
||||
<a href="fees.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-percentage" style="width: 16px; color: #00c087;"></i> <?php echo __('fee_schedule'); ?>
|
||||
<i class="fas fa-percentage" style="width: 16px; color: #00c087;"></i> <?php echo __('fee_schedule', '费率标准'); ?>
|
||||
</a>
|
||||
<a href="status.php" style="display: flex; align-items: center; gap: 10px; color: var(--text-muted); text-decoration: none; font-size: 14px;">
|
||||
<i class="fas fa-server" style="width: 16px; color: #00c087;"></i> <?php echo __('service_status'); ?>
|
||||
<i class="fas fa-server" style="width: 16px; color: #00c087;"></i> <?php echo __('service_status', '服务状态'); ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@ -78,14 +90,14 @@
|
||||
|
||||
<div style="max-width: 1200px; margin: 60px auto 0; padding-top: 30px; border-top: 1px solid #1e2329; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 20px;">
|
||||
<div style="color: var(--text-muted); font-size: 13px;">
|
||||
© 2017-2026 EXCHANGE.COM <?php echo __('all_rights_reserved'); ?>
|
||||
© 2017-2026 NOVAEX.COM <?php echo __('all_rights_reserved', '版权所有'); ?>
|
||||
</div>
|
||||
<div style="display: flex; gap: 20px; color: var(--text-muted); font-size: 13px;">
|
||||
<div style="display: flex; align-items: center; gap: 8px; color: var(--success-color);">
|
||||
<i class="fas fa-check-circle"></i> <?php echo __('system_status_normal'); ?>
|
||||
<i class="fas fa-check-circle"></i> <?php echo __('system_status_normal', '系统状态正常'); ?>
|
||||
</div>
|
||||
<span><?php echo __('cookie_policy'); ?></span>
|
||||
<span><?php echo __('security'); ?></span>
|
||||
<span><?php echo __('cookie_policy', 'Cookie 政策'); ?></span>
|
||||
<span><?php echo __('security', '安全'); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
457
futures.php
457
futures.php
@ -13,144 +13,255 @@ if ($user_id) {
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="futures-trading-layout" style="display: grid; grid-template-columns: 280px 1fr 300px 300px; height: calc(100vh - 64px); background: #0b0e11; overflow: hidden; color: #EAECEF;">
|
||||
<div style="background: #0b0e11; min-height: calc(100vh - 64px); padding: 10px 20px;">
|
||||
<div class="futures-trading-layout" style="display: grid; grid-template-columns: 280px 1fr 320px; height: calc(100vh - 84px); background: #161a1e; border-radius: 8px; overflow: hidden; color: #EAECEF; font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; border: 1px solid #1e2329;">
|
||||
|
||||
<!-- Column 1: Pairs List -->
|
||||
<div style="border-right: 1px solid #1e2329; display: flex; flex-direction: column; background: #161a1e;">
|
||||
<div style="padding: 15px; border-bottom: 1px solid #1e2329;">
|
||||
<div style="font-size: 14px; font-weight: bold; margin-bottom: 10px;">Perpetual Contracts</div>
|
||||
<input type="text" id="pair-search" placeholder="Search Markets" style="width: 100%; background: #0b0e11; border: 1px solid #2b3139; color: white; padding: 8px 12px; border-radius: 4px; font-size: 13px;">
|
||||
<div style="padding: 12px; border-bottom: 1px solid #1e2329;">
|
||||
<div style="position: relative; margin-bottom: 12px;">
|
||||
<input type="text" id="pair-search" placeholder="<?php echo __('search_market', '搜索合约币对'); ?>" style="width: 100%; background: #0b0e11; border: 1px solid #2b3139; color: white; padding: 8px 32px 8px 12px; border-radius: 4px; font-size: 13px; outline: none; transition: border-color 0.2s;" onfocus="this.style.borderColor='#4facfe'" onblur="this.style.borderColor='#2b3139'">
|
||||
<i class="fas fa-search" style="position: absolute; right: 10px; top: 10px; color: #5e6673; font-size: 14px;"></i>
|
||||
</div>
|
||||
<div style="display: flex; gap: 15px;">
|
||||
<button class="market-tab active" onclick="switchMarket('crypto')"><?php echo __('crypto', '永续合约'); ?></button>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; padding: 10px 12px; font-size: 11px; color: #848e9c; justify-content: space-between; border-bottom: 1px solid #1e2329;">
|
||||
<span style="flex: 1.5;"><?php echo __('pair', '币对'); ?></span>
|
||||
<span style="flex: 1; text-align: right;"><?php echo __('price', '价格'); ?></span>
|
||||
<span style="flex: 1; text-align: right;"><?php echo __('change', '涨跌'); ?></span>
|
||||
</div>
|
||||
<div id="pairs-list" style="flex: 1; overflow-y: auto;">
|
||||
<!-- JS Filled -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Column 2: K-Line & Positions -->
|
||||
<div style="display: flex; flex-direction: column; border-right: 1px solid #1e2329; overflow: hidden;">
|
||||
<!-- Column 2: K-Line & Orders -->
|
||||
<div style="display: flex; flex-direction: column; border-right: 1px solid #1e2329; overflow: hidden; background: #0b0e11;">
|
||||
<!-- Top Info Bar -->
|
||||
<div style="height: 60px; border-bottom: 1px solid #1e2329; display: flex; align-items: center; padding: 0 20px; gap: 30px; background: #161a1e;">
|
||||
<div style="height: 60px; border-bottom: 1px solid #1e2329; display: flex; align-items: center; padding: 0 20px; gap: 20px; background: #161a1e;">
|
||||
<div style="display: flex; align-items: center; gap: 10px;">
|
||||
<img id="current-icon" src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/btc.png" width="24">
|
||||
<span style="font-weight: bold; font-size: 1.1rem;" id="current-pair">BTC/USDT Perpetual</span>
|
||||
<img id="current-icon" src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/btc.png" width="32" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<div style="display: flex; flex-direction: column;">
|
||||
<span style="font-weight: bold; font-size: 1.1rem; line-height: 1;" id="current-pair">BTC/USDT 永续</span>
|
||||
<span id="leverage-display" onclick="toggleLeverageModal()" style="background: rgba(79, 172, 254, 0.1); color: #4facfe; font-size: 11px; padding: 2px 6px; border-radius: 2px; cursor: pointer; margin-top: 4px; display: inline-block; width: fit-content;">20x</span>
|
||||
</div>
|
||||
<div style="display: flex; flex-direction: column; margin-left: 10px;">
|
||||
<span id="top-price" style="font-weight: bold; color: #00c087; font-size: 1.1rem;">--.---</span>
|
||||
<span id="top-change" style="color: #00c087; font-size: 0.85rem;">--%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="flex: 1;"></div>
|
||||
<div style="display: flex; gap: 20px;">
|
||||
<div class="stat-box"><div id="top-price" style="font-weight: bold; color: #00c087;">--.---</div><div style="font-size: 10px; color: #848e9c;">Mark Price</div></div>
|
||||
<div class="stat-box"><div id="top-change" style="font-weight: bold;">--%</div><div style="font-size: 10px; color: #848e9c;">24h Change</div></div>
|
||||
<div class="stat-box"><div id="funding-rate" style="color: #f0b90b;">0.0100%</div><div style="font-size: 10px; color: #848e9c;">Funding / Countdown</div></div>
|
||||
<div class="stat-box-small">
|
||||
<div style="font-size: 11px; color: #848e9c;">Mark Price</div>
|
||||
<div id="top-high" style="color: white; font-size: 13px;">--.---</div>
|
||||
</div>
|
||||
<div class="stat-box-small">
|
||||
<div style="font-size: 11px; color: #848e9c;">Index Price</div>
|
||||
<div id="top-low" style="color: white; font-size: 13px;">--.---</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- K-Line -->
|
||||
<div id="tradingview_chart" style="flex: 1;"></div>
|
||||
<!-- Positions/Orders Tabs -->
|
||||
<div style="height: 300px; border-top: 1px solid #1e2329; display: flex; flex-direction: column; background: #161a1e;">
|
||||
<div style="display: flex; border-bottom: 1px solid #1e2329;">
|
||||
<div class="order-tab active" onclick="switchOrderTab(this, 'positions')">Positions(0)</div>
|
||||
<div class="order-tab" onclick="switchOrderTab(this, 'open')">Open Orders(0)</div>
|
||||
<div class="order-tab" onclick="switchOrderTab(this, 'history')">Order History</div>
|
||||
<div class="order-tab" onclick="switchOrderTab(this, 'assets')">Assets</div>
|
||||
</div>
|
||||
<div style="flex: 1; overflow-y: auto; padding: 15px;">
|
||||
<table style="width: 100%; font-size: 12px; color: #848e9c; text-align: left;">
|
||||
<thead>
|
||||
|
||||
<!-- Chart Section -->
|
||||
<div style="flex: 2; border-bottom: 1px solid #1e2329; position: relative;">
|
||||
<div id="tradingview_chart" style="width: 100%; height: 100%;"></div>
|
||||
</div>
|
||||
|
||||
<!-- Orders Section -->
|
||||
<div style="flex: 1; display: flex; flex-direction: column; background: #161a1e; overflow: hidden;">
|
||||
<div style="display: flex; gap: 25px; padding: 0 20px; border-bottom: 1px solid #1e2329; height: 40px; align-items: center; overflow-x: auto;">
|
||||
<button class="order-tab-link active" onclick="switchOrderTab(this, 'positions')"><?php echo __('positions', '当前持仓'); ?></button>
|
||||
<button class="order-tab-link" onclick="switchOrderTab(this, 'open')"><?php echo __('open_orders', '当前委托'); ?></button>
|
||||
<button class="order-tab-link" onclick="switchOrderTab(this, 'tpsl')"><?php echo __('tpsl', '止盈止损'); ?></button>
|
||||
<button class="order-tab-link" onclick="switchOrderTab(this, 'history')"><?php echo __('order_history', '历史委托'); ?></button>
|
||||
</div>
|
||||
<div style="flex: 1; overflow-y: auto;">
|
||||
<table style="width: 100%; font-size: 12px; color: #848e9c; text-align: left; border-collapse: collapse;">
|
||||
<thead style="position: sticky; top: 0; background: #161a1e; z-index: 1;">
|
||||
<tr style="border-bottom: 1px solid #1e2329;">
|
||||
<th style="padding-bottom: 8px;">Symbol</th>
|
||||
<th style="padding-bottom: 8px;">Size</th>
|
||||
<th style="padding-bottom: 8px;">Entry Price</th>
|
||||
<th style="padding-bottom: 8px;">Mark Price</th>
|
||||
<th style="padding-bottom: 8px;">Liq. Price</th>
|
||||
<th style="padding-bottom: 8px;">Margin</th>
|
||||
<th style="padding-bottom: 8px;">PNL (ROE%)</th>
|
||||
<th style="padding-bottom: 8px;">Action</th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('pair', '币对'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('side', '方向'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('price', '价格'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('amount', '数量'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('pnl', '盈亏'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('status', '状态'); ?></th>
|
||||
<th style="padding: 10px 15px; text-align: right;"><?php echo __('action', '操作'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="positions-list-body">
|
||||
<tr><td colspan="8" style="text-align: center; padding: 30px; opacity: 0.5;">No active positions</td></tr>
|
||||
<tbody id="orders-list-body">
|
||||
<!-- JS Filled -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Column 3: Futures Order Panel -->
|
||||
<div style="border-right: 1px solid #1e2329; background: #161a1e; display: flex; flex-direction: column; padding: 20px;">
|
||||
<div style="display: flex; gap: 10px; margin-bottom: 15px;">
|
||||
<div style="flex: 1; background: #2b3139; padding: 5px; border-radius: 4px; text-align: center; font-size: 12px; cursor: pointer;">Cross</div>
|
||||
<div style="flex: 1; background: #2b3139; padding: 5px; border-radius: 4px; text-align: center; font-size: 12px; cursor: pointer; color: #f0b90b;">20x</div>
|
||||
<!-- Column 3: Order Panel & Book -->
|
||||
<div style="display: flex; flex-direction: column; background: #161a1e; overflow: hidden;">
|
||||
<!-- Order Panel -->
|
||||
<div style="padding: 0; border-bottom: 1px solid #1e2329; background: #161a1e;">
|
||||
<div style="display: flex; background: #0b0e11; border-bottom: 1px solid #1e2329; padding: 2px;">
|
||||
<button id="btn-isolated" class="margin-tab active" onclick="switchMargin('isolated')"><?php echo __('isolated', '逐仓'); ?></button>
|
||||
<button id="btn-cross" class="margin-tab" onclick="switchMargin('cross')"><?php echo __('cross', '全仓'); ?></button>
|
||||
<div style="width: 1px; background: #2b3139; margin: 8px 0;"></div>
|
||||
<button id="btn-leverage-top" class="margin-tab" onclick="toggleLeverageModal()" style="color: #4facfe;">20x</button>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; background: #2b3139; border-radius: 4px; margin-bottom: 20px;">
|
||||
<button class="trade-type-btn active" style="flex: 1; padding: 8px; border: none; background: transparent; color: white; cursor: pointer;">Open</button>
|
||||
<button class="trade-type-btn" style="flex: 1; padding: 8px; border: none; background: transparent; color: #848e9c; cursor: pointer;">Close</button>
|
||||
<div style="padding: 15px;">
|
||||
<div style="display: flex; gap: 15px; margin-bottom: 15px; font-size: 13px;">
|
||||
<span id="tab-market" class="type-tab active" onclick="switchTradeType('market')"><?php echo __('market_order', '市价'); ?></span>
|
||||
<span id="tab-limit" class="type-tab" onclick="switchTradeType('limit')"><?php echo __('limit_order', '限价'); ?></span>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 10px; font-size: 12px; color: #848e9c; display: flex; justify-content: space-between;">
|
||||
<span>Avbl</span>
|
||||
<span style="color: white;"><?php echo number_format($balance, 2); ?> USDT</span>
|
||||
<div style="margin-bottom: 12px; font-size: 12px; color: #848e9c; display: flex; justify-content: space-between;">
|
||||
<span><?php echo __('available', '可用'); ?></span>
|
||||
<span style="color: white;"><span id="display-balance"><?php echo number_format($balance, 2); ?></span> USDT</span>
|
||||
</div>
|
||||
|
||||
<div class="input-wrap"><span>Price</span><input type="number" id="futures-price" placeholder="Market Price"><span>USDT</span></div>
|
||||
<div class="input-wrap"><span>Size</span><input type="number" id="futures-amount" placeholder="0.00"><span id="f-token">BTC</span></div>
|
||||
|
||||
<div style="margin: 15px 0;"><input type="range" class="slider" style="width: 100%;"></div>
|
||||
|
||||
<div style="display: flex; gap: 10px; margin-top: 10px;">
|
||||
<button class="trade-btn buy" style="flex: 1;" onclick="placeFuturesOrder('buy')">Buy/Long</button>
|
||||
<button class="trade-btn sell" style="flex: 1;" onclick="placeFuturesOrder('sell')">Sell/Short</button>
|
||||
<!-- Price Box -->
|
||||
<div class="input-group" style="margin-bottom: 12px;">
|
||||
<span style="position: absolute; left: 12px; top: 12px; color: #848e9c; font-size: 13px;"><?php echo __('price', '价格'); ?></span>
|
||||
<input type="text" id="trade-price-display" value="<?php echo __('market_price', '市价'); ?>" readonly style="width: 100%; background: #2b3139; border: 1px solid #2b3139; color: #848e9c; padding: 12px 12px 12px 60px; border-radius: 4px; outline: none; font-size: 14px; text-align: right;">
|
||||
<input type="number" id="trade-price" placeholder="0.00" style="display: none; width: 100%; background: #2b3139; border: 1px solid #2b3139; color: white; padding: 12px 60px 12px 60px; border-radius: 4px; outline: none; font-size: 14px; text-align: right;">
|
||||
<span style="position: absolute; right: 12px; top: 12px; color: #848e9c; font-size: 13px;">USDT</span>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 20px; border-top: 1px solid #2b3139; padding-top: 15px; font-size: 12px; color: #848e9c;">
|
||||
<div style="display: flex; justify-content: space-between; margin-bottom: 8px;"><span>Cost</span><span>0.00 USDT</span></div>
|
||||
<div style="display: flex; justify-content: space-between; margin-bottom: 8px;"><span>Max Open</span><span>0.00 BTC</span></div>
|
||||
<!-- Quantity Box -->
|
||||
<div class="input-group" style="margin-bottom: 15px;">
|
||||
<span style="position: absolute; left: 12px; top: 12px; color: #848e9c; font-size: 13px;"><?php echo __('amount', '数量'); ?></span>
|
||||
<input type="number" id="trade-amount" placeholder="0.00" style="width: 100%; background: #2b3139; border: 1px solid #2b3139; color: white; padding: 12px 60px 12px 60px; border-radius: 4px; outline: none; font-size: 14px; text-align: right;">
|
||||
<span id="amount-unit" style="position: absolute; right: 12px; top: 12px; color: #848e9c; font-size: 13px;">Cont</span>
|
||||
</div>
|
||||
|
||||
<!-- TP/SL Boxes -->
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 15px;">
|
||||
<div class="input-group">
|
||||
<input type="number" id="tp-price" placeholder="止盈 (TP)" style="width: 100%; background: #2b3139; border: 1px solid #2b3139; color: #00c087; padding: 10px; border-radius: 4px; outline: none; font-size: 12px; text-align: center;">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<input type="number" id="sl-price" placeholder="止损 (SL)" style="width: 100%; background: #2b3139; border: 1px solid #2b3139; color: #f6465d; padding: 10px; border-radius: 4px; outline: none; font-size: 12px; text-align: center;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Column 4: Order Book -->
|
||||
<div style="background: #161a1e; display: flex; flex-direction: column;">
|
||||
<div style="padding: 15px; border-bottom: 1px solid #1e2329; font-size: 14px; font-weight: bold;">Order Book</div>
|
||||
<div style="padding: 10px 15px; font-size: 11px; color: #848e9c; display: flex; justify-content: space-between;">
|
||||
<span>Price(USDT)</span>
|
||||
<span>Size(BTC)</span>
|
||||
<!-- Percentage Slider -->
|
||||
<div style="margin-bottom: 20px;">
|
||||
<div style="position: relative; height: 20px; display: flex; align-items: center;">
|
||||
<input type="range" class="custom-slider" min="0" max="100" value="0" id="trade-slider" oninput="updateFromSlider(this.value)">
|
||||
<div class="slider-marks">
|
||||
<span onclick="setPercent(0)"></span>
|
||||
<span onclick="setPercent(25)"></span>
|
||||
<span onclick="setPercent(50)"></span>
|
||||
<span onclick="setPercent(75)"></span>
|
||||
<span onclick="setPercent(100)"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
|
||||
<button class="trade-btn buy" onclick="executeOrder('buy')"><?php echo __('buy_long', '买入开多'); ?></button>
|
||||
<button class="trade-btn sell" onclick="executeOrder('sell')"><?php echo __('sell_short', '卖出开空'); ?></button>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 15px; border-top: 1px solid #2b3139; padding-top: 15px; display: flex; justify-content: space-between; font-size: 12px;">
|
||||
<span style="color: #848e9c;"><?php echo __('cost', '成本'); ?></span>
|
||||
<span style="color: white;"><span id="trade-cost">0.00</span> USDT</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Order Book -->
|
||||
<div style="flex: 1; display: flex; flex-direction: column; overflow: hidden;">
|
||||
<div style="padding: 12px 15px; font-size: 13px; font-weight: bold; border-bottom: 1px solid #1e2329; display: flex; justify-content: space-between;">
|
||||
<span><?php echo __('order_book', '订单簿'); ?></span>
|
||||
</div>
|
||||
<div style="padding: 6px 15px; font-size: 10px; color: #848e9c; display: flex; justify-content: space-between; background: #0b0e11;">
|
||||
<span><?php echo __('price', '价格'); ?></span>
|
||||
<span><?php echo __('amount', '数量'); ?></span>
|
||||
</div>
|
||||
<div style="flex: 1; overflow: hidden; display: flex; flex-direction: column;">
|
||||
<div id="asks" style="flex: 1; display: flex; flex-direction: column-reverse; padding: 0 15px; overflow: hidden; font-family: monospace;"></div>
|
||||
<div id="mid-price" style="padding: 12px; text-align: center; font-size: 1.1rem; font-weight: bold; color: #00c087; background: rgba(255,255,255,0.03);">--.---</div>
|
||||
<div id="bids" style="flex: 1; display: flex; flex-direction: column; padding: 0 15px; overflow: hidden; font-family: monospace;"></div>
|
||||
<div id="asks" style="flex: 1; display: flex; flex-direction: column-reverse; overflow: hidden;"></div>
|
||||
<div id="mid-price-container" style="padding: 8px; text-align: center; background: rgba(255,255,255,0.02); border-top: 1px solid #1e2329; border-bottom: 1px solid #1e2329;">
|
||||
<div id="mid-price" style="font-size: 1.1rem; font-weight: bold; color: #00c087;">--.---</div>
|
||||
</div>
|
||||
<div id="bids" style="flex: 1; display: flex; flex-direction: column; overflow: hidden;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Leverage Modal -->
|
||||
<div id="leverage-modal" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.8); display: none; align-items: center; justify-content: center; z-index: 2000;">
|
||||
<div style="background: #161a1e; padding: 30px; border-radius: 16px; width: 400px; border: 1px solid #2b3139;">
|
||||
<h3 style="margin-top: 0;">Adjust Leverage</h3>
|
||||
<p style="color: #848e9c; font-size: 14px;">Select leverage for current pair.</p>
|
||||
<div style="margin: 30px 0;">
|
||||
<input type="range" min="1" max="125" value="20" style="width: 100%;" id="lev-slider" oninput="document.getElementById('lev-val').innerText = this.value + 'x'">
|
||||
<div style="text-align: center; font-size: 2rem; font-weight: bold; margin-top: 10px;" id="lev-val">20x</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 15px;">
|
||||
<button onclick="toggleLeverageModal()" style="flex: 1; padding: 12px; background: #2b3139; border: none; color: white; border-radius: 4px; cursor: pointer;">Cancel</button>
|
||||
<button onclick="confirmLeverage()" style="flex: 1; padding: 12px; background: #4facfe; border: none; color: white; border-radius: 4px; cursor: pointer;">Confirm</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.stat-box { border-left: 1px solid #2b3139; padding-left: 15px; display: flex; flex-direction: column; }
|
||||
.order-tab { padding: 10px 15px; font-size: 12px; color: #848e9c; cursor: pointer; border-bottom: 2px solid transparent; }
|
||||
.order-tab.active { color: var(--primary-color); border-bottom-color: var(--primary-color); }
|
||||
.input-wrap { background: #0b0e11; border: 1px solid #2b3139; border-radius: 4px; padding: 8px 12px; display: flex; align-items: center; margin-bottom: 12px; gap: 10px; }
|
||||
.input-wrap span { font-size: 12px; color: #848e9c; white-space: nowrap; width: 45px; }
|
||||
.input-wrap input { background: transparent; border: none; color: white; flex: 1; text-align: right; outline: none; font-weight: bold; }
|
||||
.trade-btn { width: 100%; padding: 12px; border: none; border-radius: 4px; font-weight: bold; cursor: pointer; color: white; }
|
||||
.market-tab { background: transparent; border: none; color: #848e9c; font-size: 13px; font-weight: bold; padding: 5px 0; cursor: pointer; border-bottom: 2px solid transparent; }
|
||||
.market-tab.active { color: #4facfe; border-bottom-color: #4facfe; }
|
||||
.stat-box-small { display: flex; flex-direction: column; align-items: flex-end; }
|
||||
.order-tab-link { background: transparent; border: none; color: #848e9c; font-size: 13px; font-weight: bold; cursor: pointer; padding: 0; border-bottom: 2px solid transparent; white-space: nowrap; height: 100%; transition: color 0.2s; }
|
||||
.order-tab-link.active { color: #4facfe; border-bottom-color: #4facfe; }
|
||||
|
||||
.margin-tab { flex: 1; padding: 8px; border: none; background: transparent; color: #848e9c; cursor: pointer; font-size: 11px; font-weight: bold; }
|
||||
.margin-tab.active { background: #161a1e; color: white; border-radius: 4px; }
|
||||
|
||||
.type-tab { cursor: pointer; color: #848e9c; padding-bottom: 2px; border-bottom: 2px solid transparent; }
|
||||
.type-tab.active { color: #4facfe; border-bottom-color: #4facfe; }
|
||||
|
||||
.input-group { position: relative; width: 100%; }
|
||||
.trade-btn { width: 100%; padding: 12px; border: none; border-radius: 4px; font-weight: bold; cursor: pointer; color: white; font-size: 14px; transition: 0.2s; }
|
||||
.trade-btn.buy { background: #00c087; }
|
||||
.trade-btn.buy:hover { background: #00d696; }
|
||||
.trade-btn.sell { background: #f6465d; }
|
||||
.slider { -webkit-appearance: none; height: 3px; background: #2b3139; border-radius: 2px; }
|
||||
.slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; background: white; border-radius: 50%; }
|
||||
.trade-btn.sell:hover { background: #ff526a; }
|
||||
|
||||
.custom-slider { -webkit-appearance: none; width: 100%; height: 4px; background: #2b3139; border-radius: 2px; outline: none; z-index: 2; position: relative; }
|
||||
.custom-slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; background: white; border-radius: 50%; cursor: pointer; border: 2px solid #4facfe; }
|
||||
|
||||
.slider-marks { position: absolute; left: 0; right: 0; top: 0; bottom: 0; display: flex; justify-content: space-between; align-items: center; padding: 0 2px; z-index: 1; pointer-events: none; }
|
||||
.slider-marks span { width: 6px; height: 6px; background: #2b3139; border-radius: 50%; border: 1px solid #1e2329; pointer-events: auto; cursor: pointer; }
|
||||
.slider-marks span:hover { background: #4facfe; }
|
||||
|
||||
.order-book-row { display: flex; justify-content: space-between; padding: 2px 15px; font-size: 11px; position: relative; cursor: pointer; }
|
||||
.order-book-bg { position: absolute; right: 0; top: 0; bottom: 0; z-index: 0; opacity: 0.1; }
|
||||
</style>
|
||||
|
||||
<script type="text/javascript" src="https://s3.tradingview.com/tv.js"></script>
|
||||
<script>
|
||||
let currentSymbol = 'BTCUSDT';
|
||||
let currentPrice = 0;
|
||||
const pairs = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT', 'ADAUSDT', 'DOGEUSDT', 'DOTUSDT'];
|
||||
let leverage = 20;
|
||||
let currentTradeType = 'market';
|
||||
let currentOrderTab = 'positions';
|
||||
let marketData = {};
|
||||
let pairs = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT', 'ADAUSDT', 'DOGEUSDT', 'DOTUSDT', 'LINKUSDT', 'LTCUSDT', 'PEPEUSDT', 'SHIBUSDT', 'AVAXUSDT', 'BCHUSDT', 'ARBUSDT', 'OPUSDT', 'NEARUSDT', 'TRXUSDT', 'FETUSDT', 'WIFUSDT'];
|
||||
|
||||
function initChart(symbol) {
|
||||
new TradingView.widget({
|
||||
"width": "100%", "height": "100%", "symbol": "BINANCE:" + symbol, "interval": "15", "timezone": "Etc/UTC", "theme": "dark", "style": "1", "locale": "<?php echo $lang == 'zh' ? 'zh_CN' : 'en'; ?>", "container_id": "tradingview_chart", "backgroundColor": "#0b0e11", "gridColor": "rgba(42, 46, 57, 0.05)", "hide_side_toolbar": false, "allow_symbol_change": false, "save_image": false
|
||||
"width": "100%", "height": "100%", "symbol": "BINANCE:" + symbol, "interval": "15", "timezone": "Etc/UTC", "theme": "dark", "style": "1", "locale": "zh_CN", "container_id": "tradingview_chart", "backgroundColor": "#0b0e11", "gridColor": "rgba(42, 46, 57, 0.05)", "hide_side_toolbar": false, "allow_symbol_change": false, "save_image": false
|
||||
});
|
||||
}
|
||||
initChart(currentSymbol);
|
||||
|
||||
const ws = new WebSocket('wss://stream.binance.com:9443/ws/' + pairs.map(p => p.toLowerCase() + '@ticker').join('/'));
|
||||
const marketData = {};
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
let socket;
|
||||
function connectWS() {
|
||||
if (socket) socket.close();
|
||||
socket = new WebSocket('wss://stream.binance.com:9443/ws/' + pairs.map(p => p.toLowerCase() + '@ticker').join('/'));
|
||||
socket.onmessage = (event) => {
|
||||
const data = JSON.parse(event.data);
|
||||
const s = data.s;
|
||||
marketData[s] = data;
|
||||
@ -163,27 +274,35 @@ if ($user_id) {
|
||||
document.getElementById('top-change').innerText = (data.P >= 0 ? '+' : '') + data.P + '%';
|
||||
document.getElementById('top-change').style.color = data.P >= 0 ? '#00c087' : '#f6465d';
|
||||
document.getElementById('mid-price').innerText = currentPrice.toLocaleString();
|
||||
document.getElementById('top-high').innerText = parseFloat(data.c).toLocaleString();
|
||||
document.getElementById('top-low').innerText = parseFloat(data.c).toLocaleString();
|
||||
updateOrderBook(currentPrice);
|
||||
}
|
||||
};
|
||||
}
|
||||
connectWS();
|
||||
|
||||
function renderPairsList() {
|
||||
const list = document.getElementById('pairs-list');
|
||||
const searchTerm = document.getElementById('pair-search').value.toUpperCase();
|
||||
if (!list) return;
|
||||
let html = '';
|
||||
pairs.forEach(p => {
|
||||
if (searchTerm && !p.includes(searchTerm)) return;
|
||||
const d = marketData[p] || {c: 0, P: 0};
|
||||
const color = d.P >= 0 ? '#00c087' : '#f6465d';
|
||||
const name = p.replace('USDT', '');
|
||||
html += `
|
||||
<div onclick="changePair('${p}')" style="display: flex; justify-content: space-between; padding: 12px 15px; cursor: pointer; border-bottom: 1px solid #1e2329; ${currentSymbol === p ? 'background: #2b3139;' : ''}">
|
||||
<div style="display: flex; gap: 8px; align-items: center;">
|
||||
<img src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png" width="18" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<span style="font-weight: bold; font-size: 13px;">${name} Perp</span>
|
||||
<div onclick="changePair('${p}')" style="display: flex; justify-content: space-between; padding: 10px 12px; cursor: pointer; border-bottom: 1px solid #1e2329; ${currentSymbol === p ? 'background: #2b3139;' : ''} transition: background 0.2s;">
|
||||
<div style="display: flex; align-items: center; gap: 8px; flex: 1.5;">
|
||||
<img src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png" width="20" height="20" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<div>
|
||||
<div style="font-weight: bold; font-size: 13px;">${name}/USDT</div>
|
||||
<div style="font-size: 10px; color: #848e9c;">永续</div>
|
||||
</div>
|
||||
<div style="text-align: right;">
|
||||
<div style="font-size: 13px;">${parseFloat(d.c).toLocaleString()}</div>
|
||||
<div style="color: ${color}; font-size: 11px;">${d.P >= 0 ? '+' : ''}${d.P}%</div>
|
||||
</div>
|
||||
<span style="font-size: 13px; flex: 1; text-align: right;">${parseFloat(d.c).toLocaleString()}</span>
|
||||
<span style="color: ${color}; font-size: 13px; flex: 1; text-align: right;">${d.P >= 0 ? '+' : ''}${d.P}%</span>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
@ -191,32 +310,178 @@ if ($user_id) {
|
||||
}
|
||||
|
||||
function changePair(pair) {
|
||||
if (!pair.includes('USDT')) pair = pair + 'USDT';
|
||||
currentSymbol = pair;
|
||||
const name = pair.replace('USDT', '');
|
||||
document.getElementById('current-pair').innerText = name + '/USDT Perpetual';
|
||||
document.getElementById('current-pair').innerText = name + '/USDT 永续';
|
||||
document.getElementById('current-icon').src = `https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png`;
|
||||
document.getElementById('f-token').innerText = name;
|
||||
initChart(pair);
|
||||
renderPairsList();
|
||||
document.getElementById('trade-price').value = '';
|
||||
document.getElementById('trade-amount').value = '';
|
||||
document.getElementById('trade-slider').value = 0;
|
||||
document.getElementById('trade-cost').innerText = '0.00';
|
||||
}
|
||||
|
||||
function updateOrderBook(price) {
|
||||
let asksHtml = ''; let bidsHtml = '';
|
||||
for(let i=1; i<=20; i++) {
|
||||
for(let i=1; i<=10; i++) {
|
||||
const askPrice = (price + (i * 0.01 * price / 100)).toFixed(2);
|
||||
const bidPrice = (price - (i * 0.01 * price / 100)).toFixed(2);
|
||||
asksHtml += `<div style="display: flex; justify-content: space-between; font-size: 11px; padding: 2px 0;"><span style="color: #f6465d;">${askPrice}</span><span style="color: #848e9c;">${(Math.random()*1).toFixed(4)}</span></div>`;
|
||||
bidsHtml += `<div style="display: flex; justify-content: space-between; font-size: 11px; padding: 2px 0;"><span style="color: #00c087;">${bidPrice}</span><span style="color: #848e9c;">${(Math.random()*1).toFixed(4)}</span></div>`;
|
||||
asksHtml += `
|
||||
<div class="order-book-row">
|
||||
<div class="order-book-bg" style="background: #f6465d; width: ${Math.random()*100}%"></div>
|
||||
<span style="color: #f6465d; z-index: 1;">${parseFloat(askPrice).toLocaleString()}</span>
|
||||
<span style="color: #EAECEF; z-index: 1;">${(Math.random()*2).toFixed(3)}</span>
|
||||
</div>`;
|
||||
bidsHtml += `
|
||||
<div class="order-book-row">
|
||||
<div class="order-book-bg" style="background: #00c087; width: ${Math.random()*100}%"></div>
|
||||
<span style="color: #00c087; z-index: 1;">${parseFloat(bidPrice).toLocaleString()}</span>
|
||||
<span style="color: #EAECEF; z-index: 1;">${(Math.random()*2).toFixed(3)}</span>
|
||||
</div>`;
|
||||
}
|
||||
document.getElementById('asks').innerHTML = asksHtml;
|
||||
document.getElementById('bids').innerHTML = bidsHtml;
|
||||
}
|
||||
|
||||
async function placeFuturesOrder(side) {
|
||||
const amount = parseFloat(document.getElementById('futures-amount').value);
|
||||
if (!amount) return alert('Please enter amount');
|
||||
alert('Futures order placed: ' + side + ' ' + amount + ' ' + currentSymbol);
|
||||
function switchMargin(type) {
|
||||
document.getElementById('btn-isolated').classList.toggle('active', type === 'isolated');
|
||||
document.getElementById('btn-cross').classList.toggle('active', type === 'cross');
|
||||
}
|
||||
|
||||
function switchTradeType(type) {
|
||||
currentTradeType = type;
|
||||
document.getElementById('tab-market').classList.toggle('active', type === 'market');
|
||||
document.getElementById('tab-limit').classList.toggle('active', type === 'limit');
|
||||
|
||||
if (type === 'market') {
|
||||
document.getElementById('trade-price').style.display = 'none';
|
||||
document.getElementById('trade-price-display').style.display = 'block';
|
||||
} else {
|
||||
document.getElementById('trade-price').style.display = 'block';
|
||||
document.getElementById('trade-price-display').style.display = 'none';
|
||||
document.getElementById('trade-price').value = currentPrice;
|
||||
}
|
||||
}
|
||||
|
||||
function toggleLeverageModal() {
|
||||
const m = document.getElementById('leverage-modal');
|
||||
m.style.display = m.style.display === 'flex' ? 'none' : 'flex';
|
||||
}
|
||||
|
||||
function confirmLeverage() {
|
||||
leverage = document.getElementById('lev-slider').value;
|
||||
document.getElementById('btn-leverage-top').innerText = leverage + 'x';
|
||||
document.getElementById('leverage-display').innerText = leverage + 'x';
|
||||
toggleLeverageModal();
|
||||
updateFromSlider(document.getElementById('trade-slider').value);
|
||||
}
|
||||
|
||||
function setPercent(p) {
|
||||
document.getElementById('trade-slider').value = p;
|
||||
updateFromSlider(p);
|
||||
}
|
||||
|
||||
function updateFromSlider(val) {
|
||||
const balance = <?php echo $balance; ?>;
|
||||
const price = parseFloat(document.getElementById('trade-price').value) || currentPrice;
|
||||
const maxNotional = (balance * leverage * val / 100);
|
||||
document.getElementById('trade-amount').value = (maxNotional / price).toFixed(3);
|
||||
document.getElementById('trade-cost').innerText = (maxNotional / leverage).toFixed(2);
|
||||
}
|
||||
|
||||
async function executeOrder(side) {
|
||||
const price = currentTradeType === 'market' ? currentPrice : parseFloat(document.getElementById('trade-price').value);
|
||||
const amount = parseFloat(document.getElementById('trade-amount').value);
|
||||
if (!amount) return alert('Please enter amount');
|
||||
|
||||
const response = await fetch('api/place_order.php', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
symbol: currentSymbol,
|
||||
type: 'futures',
|
||||
side: side,
|
||||
order_type: currentTradeType,
|
||||
price: price,
|
||||
amount: amount,
|
||||
total: price * amount,
|
||||
leverage: leverage,
|
||||
tp_price: document.getElementById('tp-price').value || null,
|
||||
sl_price: document.getElementById('sl-price').value || null
|
||||
})
|
||||
});
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
alert('Futures order placed successfully!');
|
||||
fetchOrders();
|
||||
} else {
|
||||
alert('Error: ' + result.error);
|
||||
}
|
||||
}
|
||||
|
||||
function switchOrderTab(el, tab) {
|
||||
currentOrderTab = tab;
|
||||
document.querySelectorAll('.order-tab-link').forEach(t => t.classList.remove('active'));
|
||||
el.classList.add('active');
|
||||
fetchOrders();
|
||||
}
|
||||
|
||||
async function fetchOrders() {
|
||||
const response = await fetch(`api/get_orders.php?type=futures&status=${currentOrderTab}`);
|
||||
const result = await response.json();
|
||||
const tbody = document.getElementById('orders-list-body');
|
||||
if (result.success && result.data.length > 0) {
|
||||
let html = '';
|
||||
result.data.forEach(o => {
|
||||
const color = o.side === 'buy' ? '#00c087' : '#f6465d';
|
||||
let pnl = '0.00';
|
||||
let pnlColor = '#848e9c';
|
||||
if (o.win_loss === 'win') {
|
||||
pnl = '+' + (o.total * 0.1).toFixed(2);
|
||||
pnlColor = '#00c087';
|
||||
} else if (o.win_loss === 'loss') {
|
||||
pnl = '-' + (o.total * 0.1).toFixed(2);
|
||||
pnlColor = '#f6465d';
|
||||
}
|
||||
|
||||
html += `
|
||||
<tr style="border-bottom: 1px solid #1e2329;">
|
||||
<td style="padding: 10px 15px; color: white; font-weight: bold;">${o.symbol}</td>
|
||||
<td style="padding: 10px 15px; color: ${color}; font-weight: bold;">${o.side === 'buy' ? '做多' : '做空'}</td>
|
||||
<td style="padding: 10px 15px;">${parseFloat(o.price).toLocaleString()}</td>
|
||||
<td style="padding: 10px 15px;">${parseFloat(o.amount).toFixed(3)}</td>
|
||||
<td style="padding: 10px 15px; color: ${pnlColor}; font-weight: bold;">${pnl} USDT</td>
|
||||
<td style="padding: 10px 15px;"><span style="background: rgba(255,255,255,0.05); padding: 2px 6px; border-radius: 2px;">${o.status.toUpperCase()}</span></td>
|
||||
<td style="padding: 10px 15px; text-align: right;">
|
||||
${o.status === 'open' ? `<button onclick="cancelOrder(${o.id})" style="background: rgba(246, 70, 93, 0.1); border: 1px solid #f6465d; color: #f6465d; padding: 2px 8px; border-radius: 4px; cursor: pointer; font-size: 11px;">平仓</button>` : '--'}
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
} else {
|
||||
tbody.innerHTML = `<tr><td colspan="7" style="text-align: center; padding: 50px; opacity: 0.3;"><i class="fas fa-folder-open" style="font-size: 32px; display: block; margin-bottom: 10px;"></i>暂无记录</td></tr>`;
|
||||
}
|
||||
}
|
||||
|
||||
async function cancelOrder(id) {
|
||||
if (!confirm('确定撤单/平仓?')) return;
|
||||
const response = await fetch('api/cancel_order.php', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ order_id: id })
|
||||
});
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
fetchOrders();
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('pair-search').addEventListener('input', renderPairsList);
|
||||
fetchOrders();
|
||||
setInterval(fetchOrders, 5000);
|
||||
</script>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
47
header.php
47
header.php
@ -4,25 +4,53 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OKX | Leading Crypto Exchange</title>
|
||||
<title>NovaEx | Leading Crypto Exchange</title>
|
||||
<link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<style>
|
||||
.logo-text { font-size: 1.8rem; font-weight: 800; color: white; letter-spacing: -1px; display: flex; align-items: center; gap: 8px; }
|
||||
.logo-box { width: 32px; height: 32px; background: white; border-radius: 4px; display: flex; align-items: center; justify-content: center; color: black; font-weight: 900; font-size: 1.2rem; }
|
||||
.logo-text { font-size: 1.8rem; font-weight: 800; color: white; letter-spacing: -1px; display: flex; align-items: center; gap: 8px; font-family: 'Inter', sans-serif; }
|
||||
.logo-svg { width: 32px; height: 32px; fill: #4facfe; }
|
||||
|
||||
/* Floating CS Chat */
|
||||
.floating-service { position: fixed; bottom: 30px; right: 30px; width: 60px; height: 60px; background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.5rem; cursor: pointer; box-shadow: 0 10px 25px rgba(0,242,254,0.3); z-index: 1000; transition: transform 0.3s ease; }
|
||||
.floating-service:hover { transform: scale(1.1) rotate(5deg); }
|
||||
|
||||
#cs-chat-window { position: fixed; bottom: 100px; right: 30px; width: 380px; height: 500px; background: #161a1e; border: 1px solid #2b3139; border-radius: 16px; display: none; flex-direction: column; box-shadow: 0 20px 40px rgba(0,0,0,0.5); z-index: 1001; overflow: hidden; }
|
||||
#cs-chat-window iframe { border: none; width: 100%; height: 100%; }
|
||||
.chat-header { background: #2b3139; padding: 15px; display: flex; justify-content: space-between; align-items: center; color: white; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a href="chat.php" class="floating-service" title="Customer Service">
|
||||
<div class="floating-service" onclick="toggleCSChat()" title="Customer Service">
|
||||
<i class="fas fa-headset"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div id="cs-chat-window">
|
||||
<div class="chat-header">
|
||||
<span>NovaEx Support</span>
|
||||
<i class="fas fa-times" onclick="toggleCSChat()" style="cursor: pointer;"></i>
|
||||
</div>
|
||||
<iframe src="chat_iframe.php"></iframe>
|
||||
</div>
|
||||
|
||||
<nav class="navbar">
|
||||
<div style="display: flex; align-items: center; gap: 2rem;">
|
||||
<a href="index.php" style="text-decoration: none;">
|
||||
<div class="logo-text"><div class="logo-box">O</div>EXCHANGE</div>
|
||||
<div class="logo-text">
|
||||
<svg class="logo-svg" viewBox="0 0 100 100">
|
||||
<rect x="10" y="10" width="80" height="80" rx="20" fill="url(#grad1)"/>
|
||||
<path d="M30 30 L70 70 M70 30 L30 70" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
||||
<defs>
|
||||
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#4facfe;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#00f2fe;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
NovaEx
|
||||
</div>
|
||||
</a>
|
||||
<div class="nav-links">
|
||||
<a href="index.php"><i class="fas fa-home nav-link-icon"></i><?php echo __('nav_home', '首页'); ?></a>
|
||||
@ -73,3 +101,10 @@
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<script>
|
||||
function toggleCSChat() {
|
||||
const chat = document.getElementById('cs-chat-window');
|
||||
chat.style.display = chat.style.display === 'flex' ? 'none' : 'flex';
|
||||
}
|
||||
</script>
|
||||
54
help.php
Normal file
54
help.php
Normal file
@ -0,0 +1,54 @@
|
||||
<?php include 'header.php'; ?>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 1200px; margin: 0 auto;">
|
||||
<div style="text-align: center; margin-bottom: 80px;">
|
||||
<h1 style="font-size: 3rem; font-weight: 800; margin-bottom: 30px;">How can we help you?</h1>
|
||||
<div style="max-width: 600px; margin: 0 auto; position: relative;">
|
||||
<i class="fas fa-search" style="position: absolute; left: 20px; top: 22px; color: #848e9c;"></i>
|
||||
<input type="text" placeholder="Search for articles..." style="width: 100%; padding: 20px 20px 20px 55px; background: #161a1e; border: 1px solid #2b3139; border-radius: 16px; color: white; font-size: 1.1rem; outline: none; box-shadow: 0 10px 30px rgba(0,0,0,0.3);">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 30px; margin-bottom: 80px;">
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139; cursor: pointer; transition: 0.3s;" onmouseover="this.style.borderColor='var(--primary-color)'" onmouseout="this.style.borderColor='#2b3139'">
|
||||
<i class="fas fa-user-plus" style="font-size: 2rem; color: #4facfe; margin-bottom: 20px;"></i>
|
||||
<h3 style="margin-bottom: 15px;">Getting Started</h3>
|
||||
<ul style="list-style: none; padding: 0; color: var(--text-muted); line-height: 2;">
|
||||
<li>How to create an account?</li>
|
||||
<li>Identity Verification (KYC) guide</li>
|
||||
<li>Securing your account (2FA)</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139; cursor: pointer; transition: 0.3s;" onmouseover="this.style.borderColor='var(--primary-color)'" onmouseout="this.style.borderColor='#2b3139'">
|
||||
<i class="fas fa-wallet" style="font-size: 2rem; color: #00f2fe; margin-bottom: 20px;"></i>
|
||||
<h3 style="margin-bottom: 15px;">Deposits & Withdrawals</h3>
|
||||
<ul style="list-style: none; padding: 0; color: var(--text-muted); line-height: 2;">
|
||||
<li>How to deposit crypto?</li>
|
||||
<li>Withdrawal limits and fees</li>
|
||||
<li>Fiat deposit instructions</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139; cursor: pointer; transition: 0.3s;" onmouseover="this.style.borderColor='var(--primary-color)'" onmouseout="this.style.borderColor='#2b3139'">
|
||||
<i class="fas fa-chart-line" style="font-size: 2rem; color: #f0b90b; margin-bottom: 20px;"></i>
|
||||
<h3 style="margin-bottom: 15px;">Trading & Markets</h3>
|
||||
<ul style="list-style: none; padding: 0; color: var(--text-muted); line-height: 2;">
|
||||
<li>Spot trading vs Futures</li>
|
||||
<li>Understanding order types</li>
|
||||
<li>Trading fees explained</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="background: linear-gradient(135deg, #161a1e 0%, #0b0e11 100%); padding: 60px; border-radius: 32px; border: 1px solid #2b3139; text-align: center;">
|
||||
<h2 style="margin-bottom: 20px;">Still need help?</h2>
|
||||
<p style="color: var(--text-muted); margin-bottom: 30px;">Our customer support team is available 24/7 to assist you.</p>
|
||||
<div style="display: flex; justify-content: center; gap: 20px;">
|
||||
<a href="#" onclick="toggleCSChat(); return false;" class="btn-primary" style="padding: 15px 40px; border-radius: 12px; font-weight: bold;">Live Chat</a>
|
||||
<a href="request.php" style="padding: 15px 40px; border-radius: 12px; font-weight: bold; background: #2b3139; color: white; text-decoration: none; border: 1px solid #3c444d;">Submit a Ticket</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
@ -18,7 +18,7 @@ $translations = [
|
||||
'nav_register' => 'Sign Up',
|
||||
'nav_profile' => 'Profile',
|
||||
'nav_logout' => 'Log Out',
|
||||
'hero_title' => 'Buy, trade, and hold 350+ cryptocurrencies on Exchange',
|
||||
'hero_title' => 'Buy, trade, and hold 350+ cryptocurrencies on NovaEx',
|
||||
'hero_subtitle' => 'Join the world\'s largest crypto exchange with the lowest fees and best security.',
|
||||
'btn_start' => 'Get Started',
|
||||
'btn_download' => 'Download App',
|
||||
@ -31,11 +31,11 @@ $translations = [
|
||||
'protected_insurance' => 'Protected by Insurance',
|
||||
'protected_insurance_desc' => 'Cryptocurrency stored on our servers is covered by our insurance policy.',
|
||||
'industry_best_practices' => 'Industry Best Practices',
|
||||
'industry_best_practices_desc' => 'Exchange supports a variety of the most popular digital currencies.',
|
||||
'industry_best_practices_desc' => 'NovaEx supports a variety of the most popular digital currencies.',
|
||||
'platform_desc' => 'Our platform provides a seamless trading experience with advanced features and a robust infrastructure designed for both retail and institutional traders.',
|
||||
'partners' => 'Our Partners',
|
||||
'partners_subtitle' => 'Trusted by world-leading organizations and financial institutions.',
|
||||
'footer_desc' => 'The world\'s leading digital asset trading platform, providing secure and stable trading services for global users.',
|
||||
'footer_desc' => 'NovaEx is a leading digital asset trading platform, providing secure and stable trading services for global users.',
|
||||
'about' => 'About',
|
||||
'about_us' => 'About Us',
|
||||
'careers' => 'Careers',
|
||||
@ -138,6 +138,30 @@ $translations = [
|
||||
'type_message' => 'Type your message...',
|
||||
'matching_account' => 'Matching Payment Account...',
|
||||
'matching_desc' => 'Our system is matching a secure local account for your deposit. Please wait a moment.',
|
||||
'crypto' => 'Cryptocurrency',
|
||||
'search_market' => 'Search Market',
|
||||
'more_pairs' => 'More Pairs',
|
||||
'limit_order' => 'Limit',
|
||||
'market_order' => 'Market',
|
||||
'available' => 'Available',
|
||||
'buy_long' => 'Buy / Long',
|
||||
'sell_short' => 'Sell / Short',
|
||||
'open_position' => 'Open',
|
||||
'close_position' => 'Close',
|
||||
'cross' => 'Cross',
|
||||
'isolated' => 'Isolated',
|
||||
'positions' => 'Positions',
|
||||
'no_positions' => 'No positions found',
|
||||
'perpetual' => 'Perpetual',
|
||||
'delivery' => 'Delivery',
|
||||
'fee' => 'Fee',
|
||||
'max_open' => 'Max Open',
|
||||
'time' => 'Time',
|
||||
'pair' => 'Pair',
|
||||
'side' => 'Side',
|
||||
'filled' => 'Filled',
|
||||
'status' => 'Status',
|
||||
'load_more' => 'Load More',
|
||||
],
|
||||
'zh' => [
|
||||
'nav_home' => '首页',
|
||||
@ -155,7 +179,7 @@ $translations = [
|
||||
'nav_register' => '注册',
|
||||
'nav_profile' => '个人中心',
|
||||
'nav_logout' => '退出登录',
|
||||
'hero_title' => '在交易所购买、交易和持有 350 多种加密货币',
|
||||
'hero_title' => '在 NovaEx 购买、交易和持有 350 多种加密货币',
|
||||
'hero_subtitle' => '加入全球最大的加密货币交易所,享受最低的费用和最好的安全性。',
|
||||
'btn_start' => '立即开始',
|
||||
'btn_download' => '下载应用',
|
||||
@ -168,11 +192,11 @@ $translations = [
|
||||
'protected_insurance' => '保险保护',
|
||||
'protected_insurance_desc' => '存储在我们服务器上的加密货币受我们的保险政策保护。',
|
||||
'industry_best_practices' => '行业最佳实践',
|
||||
'industry_best_practices_desc' => '交易所支持多种最流行的数字货币。',
|
||||
'industry_best_practices_desc' => 'NovaEx 支持多种最流行的数字货币。',
|
||||
'platform_desc' => '我们的平台为零售和机构交易者提供具有先进功能和稳健基础设施的无缝交易体验。',
|
||||
'partners' => '合作伙伴',
|
||||
'partners_subtitle' => '深受全球领先组织和金融机构的信任。',
|
||||
'footer_desc' => '全球领先的数字资产交易平台,为全球用户提供安全稳定的交易服务。',
|
||||
'footer_desc' => 'NovaEx 是全球领先的数字资产交易平台,为全球用户提供安全稳定的交易服务。',
|
||||
'about' => '关于',
|
||||
'about_us' => '关于我们',
|
||||
'careers' => '职业介绍',
|
||||
@ -275,6 +299,30 @@ $translations = [
|
||||
'type_message' => '输入消息...',
|
||||
'matching_account' => '正在匹配收款账户...',
|
||||
'matching_desc' => '系统正在为您匹配安全的本地收款账户。请稍候。',
|
||||
'crypto' => '加密货币',
|
||||
'search_market' => '搜索币种',
|
||||
'more_pairs' => '更多币种',
|
||||
'limit_order' => '限价',
|
||||
'market_order' => '市价',
|
||||
'available' => '可用',
|
||||
'buy_long' => '买入开多',
|
||||
'sell_short' => '卖出开空',
|
||||
'open_position' => '开仓',
|
||||
'close_position' => '平仓',
|
||||
'cross' => '全仓',
|
||||
'isolated' => '逐仓',
|
||||
'positions' => '当前持仓',
|
||||
'no_positions' => '暂无持仓',
|
||||
'perpetual' => '永续合约',
|
||||
'delivery' => '交割合约',
|
||||
'fee' => '手续费',
|
||||
'max_open' => '最大可开',
|
||||
'time' => '时间',
|
||||
'pair' => '币对',
|
||||
'side' => '方向',
|
||||
'filled' => '已成交',
|
||||
'status' => '状态',
|
||||
'load_more' => '加载更多',
|
||||
]
|
||||
];
|
||||
|
||||
|
||||
471
index.php
471
index.php
@ -1,301 +1,304 @@
|
||||
<?php include 'header.php'; ?>
|
||||
<?php
|
||||
session_start();
|
||||
include 'header.php';
|
||||
require_once 'db/config.php';
|
||||
|
||||
// Fetch market data for the home page table
|
||||
$trending_pairs = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT'];
|
||||
?>
|
||||
|
||||
<main>
|
||||
<section class="hero-section">
|
||||
<div class="hero-content">
|
||||
<h1 class="hero-title" style="font-size: 3.5rem; font-weight: 800; line-height: 1.1; margin-bottom: 1.5rem;"><?php echo __('hero_title', 'Buy, trade, and hold 350+ cryptocurrencies on Exchange'); ?></h1>
|
||||
<p class="hero-subtitle" style="font-size: 1.25rem; color: var(--text-muted); max-width: 600px;"><?php echo __('hero_subtitle', 'Join the world\'s largest crypto exchange with the lowest fees and best security.'); ?></p>
|
||||
|
||||
<!-- Download Section -->
|
||||
<div style="background: linear-gradient(135deg, #1e2329 0%, #0b0e11 100%); padding: 30px; border-radius: 20px; margin-top: 3rem; border: 1px solid rgba(255,255,255,0.05); display: flex; align-items: center; gap: 25px; box-shadow: 0 10px 30px rgba(0,0,0,0.3);">
|
||||
<div style="flex: 1;">
|
||||
<div style="font-size: 16px; font-weight: 600; color: white; margin-bottom: 15px;"><?php echo __('download_qr_tip'); ?></div>
|
||||
<div style="display: flex; gap: 15px;">
|
||||
<a href="#" class="btn-download-app" style="background: #4facfe; color: white; border-radius: 12px; padding: 12px 20px; text-decoration: none; display: flex; align-items: center; gap: 10px; transition: transform 0.2s;">
|
||||
<i class="fab fa-apple" style="font-size: 24px;"></i>
|
||||
<div style="text-align: left;">
|
||||
<div style="font-size: 10px; opacity: 0.9;">App Store</div>
|
||||
<div style="font-size: 14px; font-weight: bold;">Download</div>
|
||||
</div>
|
||||
</a>
|
||||
<a href="#" class="btn-download-app" style="background: #00f2fe; color: white; border-radius: 12px; padding: 12px 20px; text-decoration: none; display: flex; align-items: center; gap: 10px; transition: transform 0.2s;">
|
||||
<i class="fab fa-google-play" style="font-size: 20px;"></i>
|
||||
<div style="text-align: left;">
|
||||
<div style="font-size: 10px; opacity: 0.9;">Google Play</div>
|
||||
<div style="font-size: 14px; font-weight: bold;">Download</div>
|
||||
</div>
|
||||
</a>
|
||||
<!-- Carousel Section (Constrained Width) -->
|
||||
<section style="padding-top: 20px; background: #0b0e11;">
|
||||
<div style="max-width: 1200px; margin: 0 auto; position: relative; height: 450px; overflow: hidden; border-radius: 24px; box-shadow: 0 20px 50px rgba(0,0,0,0.5);">
|
||||
<div class="carousel-track" id="carouselTrack" style="display: flex; height: 100%; transition: transform 0.5s ease-in-out;">
|
||||
<div class="carousel-slide" style="min-width: 100%; position: relative;">
|
||||
<img src="https://images.pexels.com/photos/6771574/pexels-photo-6771574.jpeg?auto=compress&cs=tinysrgb&w=1920" style="width: 100%; height: 100%; object-fit: cover; opacity: 0.6;">
|
||||
<div style="position: absolute; top: 50%; left: 8%; transform: translateY(-50%); color: white; max-width: 600px;">
|
||||
<h2 style="font-size: 3rem; font-weight: 800; margin-bottom: 20px; text-shadow: 0 5px 15px rgba(0,0,0,0.5);">NovaEx Global Launch</h2>
|
||||
<p style="font-size: 1.1rem; opacity: 0.9; margin-bottom: 30px;">Experience the next generation of digital asset trading with ultra-low latency and bank-grade security.</p>
|
||||
<a href="register.php" class="btn-primary" style="padding: 12px 35px; border-radius: 8px; font-weight: bold; text-decoration: none; display: inline-block; background: var(--primary-color); color: white;"><?php echo __('join_now', 'Join Now'); ?></a>
|
||||
</div>
|
||||
</div>
|
||||
<div style="width: 110px; height: 110px; background: white; padding: 8px; border-radius: 12px; box-shadow: 0 5px 15px rgba(0,0,0,0.2);">
|
||||
<img src="https://api.qrserver.com/v1/create-qr-code/?size=110x110&data=https://exchange.com/download" style="width: 100%;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hero-image">
|
||||
<div class="hero-carousel" id="heroCarousel">
|
||||
<div class="carousel-inner">
|
||||
<div class="carousel-item active" style="background-image: linear-gradient(to bottom, rgba(0,0,0,0.2), rgba(0,0,0,0.8)), url('https://images.pexels.com/photos/844124/pexels-photo-844124.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1')">
|
||||
<div class="carousel-caption">
|
||||
<h3 style="margin: 0; color: #fff;">New User Bonus</h3>
|
||||
<p style="margin: 5px 0 0; color: #ccc; font-size: 14px;">Sign up and get up to $100 in rewards.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-item" style="background-image: linear-gradient(to bottom, rgba(0,0,0,0.2), rgba(0,0,0,0.8)), url('https://images.pexels.com/photos/6770610/pexels-photo-6770610.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1')">
|
||||
<div class="carousel-caption">
|
||||
<h3 style="margin: 0; color: #fff;">Spot Trading</h3>
|
||||
<p style="margin: 5px 0 0; color: #ccc; font-size: 14px;">Trade 350+ coins with industry-leading fees.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-item" style="background-image: linear-gradient(to bottom, rgba(0,0,0,0.2), rgba(0,0,0,0.8)), url('https://images.pexels.com/photos/7567443/pexels-photo-7567443.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1')">
|
||||
<div class="carousel-caption">
|
||||
<h3 style="margin: 0; color: #fff;">Secure & Stable</h3>
|
||||
<p style="margin: 5px 0 0; color: #ccc; font-size: 14px;">Your assets are protected by our security fund.</p>
|
||||
<div class="carousel-slide" style="min-width: 100%; position: relative;">
|
||||
<img src="https://images.pexels.com/photos/844124/pexels-photo-844124.jpeg?auto=compress&cs=tinysrgb&w=1920" style="width: 100%; height: 100%; object-fit: cover; opacity: 0.6;">
|
||||
<div style="position: absolute; top: 50%; left: 8%; transform: translateY(-50%); color: white; max-width: 600px;">
|
||||
<h2 style="font-size: 3rem; font-weight: 800; margin-bottom: 20px; text-shadow: 0 5px 15px rgba(0,0,0,0.5);">Trade Futures with 100x Leverage</h2>
|
||||
<p style="font-size: 1.1rem; opacity: 0.9; margin-bottom: 30px;">Maximize your capital efficiency with our professional perpetual futures contracts.</p>
|
||||
<a href="futures.php" class="btn-primary" style="padding: 12px 35px; border-radius: 8px; font-weight: bold; text-decoration: none; display: inline-block; background: var(--primary-color); color: white;"><?php echo __('start_trading', 'Start Trading'); ?></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-slide" style="min-width: 100%; position: relative;">
|
||||
<img src="https://images.pexels.com/photos/6771178/pexels-photo-6771178.jpeg?auto=compress&cs=tinysrgb&w=1920" style="width: 100%; height: 100%; object-fit: cover; opacity: 0.6;">
|
||||
<div style="position: absolute; top: 50%; left: 8%; transform: translateY(-50%); color: white; max-width: 600px;">
|
||||
<h2 style="font-size: 3rem; font-weight: 800; margin-bottom: 20px; text-shadow: 0 5px 15px rgba(0,0,0,0.5);">Secure Crypto Staking</h2>
|
||||
<p style="font-size: 1.1rem; opacity: 0.9; margin-bottom: 30px;">Earn passive income on your idle assets with our high-yield staking pools.</p>
|
||||
<a href="mining.php" class="btn-primary" style="padding: 12px 35px; border-radius: 8px; font-weight: bold; text-decoration: none; display: inline-block; background: var(--primary-color); color: white;"><?php echo __('earn_now', 'Earn Now'); ?></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="position: absolute; bottom: 30px; left: 8%; display: flex; gap: 12px;">
|
||||
<div class="carousel-dot active" onclick="goToSlide(0)" style="width: 12px; height: 12px; border-radius: 50%; background: white; cursor: pointer; opacity: 0.5; transition: 0.3s;"></div>
|
||||
<div class="carousel-dot" onclick="goToSlide(1)" style="width: 12px; height: 12px; border-radius: 50%; background: white; cursor: pointer; opacity: 0.5; transition: 0.3s;"></div>
|
||||
<div class="carousel-dot" onclick="goToSlide(2)" style="width: 12px; height: 12px; border-radius: 50%; background: white; cursor: pointer; opacity: 0.5; transition: 0.3s;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="market-ticker-container" style="background: #161a1e; padding: 20px 0; border-y: 1px solid var(--border-color);">
|
||||
<div style="max-width: 1400px; margin: 0 auto; display: flex; justify-content: space-between; overflow-x: auto; gap: 2rem; padding: 0 20px;">
|
||||
<div class="ticker-item" style="min-width: 180px;">
|
||||
<span class="ticker-pair" style="display: block; color: var(--text-muted); font-size: 12px;">BTC / USDT</span>
|
||||
<span class="ticker-price" id="price-btcusdt" style="font-size: 18px; font-weight: bold; display: block; margin: 4px 0;">--,---.--</span>
|
||||
<span class="ticker-change" id="change-btcusdt">--%</span>
|
||||
</div>
|
||||
<div class="ticker-item" style="min-width: 180px;">
|
||||
<span class="ticker-pair" style="display: block; color: var(--text-muted); font-size: 12px;">ETH / USDT</span>
|
||||
<span class="ticker-price" id="price-ethusdt" style="font-size: 18px; font-weight: bold; display: block; margin: 4px 0;">--,---.--</span>
|
||||
<span class="ticker-change" id="change-ethusdt">--%</span>
|
||||
</div>
|
||||
<div class="ticker-item" style="min-width: 180px;">
|
||||
<span class="ticker-pair" style="display: block; color: var(--text-muted); font-size: 12px;">SOL / USDT</span>
|
||||
<span class="ticker-price" id="price-solusdt" style="font-size: 18px; font-weight: bold; display: block; margin: 4px 0;">--,---.--</span>
|
||||
<span class="ticker-change" id="change-solusdt">--%</span>
|
||||
</div>
|
||||
<div class="ticker-item" style="min-width: 180px;">
|
||||
<span class="ticker-pair" style="display: block; color: var(--text-muted); font-size: 12px;">BNB / USDT</span>
|
||||
<span class="ticker-price" id="price-bnbusdt" style="font-size: 18px; font-weight: bold; display: block; margin: 4px 0;">--,---.--</span>
|
||||
<span class="ticker-change" id="change-bnbusdt">--%</span>
|
||||
</div>
|
||||
<div class="ticker-item" style="min-width: 180px;">
|
||||
<span class="ticker-pair" style="display: block; color: var(--text-muted); font-size: 12px;">XRP / USDT</span>
|
||||
<span class="ticker-price" id="price-xrpusdt" style="font-size: 18px; font-weight: bold; display: block; margin: 4px 0;">--,---.--</span>
|
||||
<span class="ticker-change" id="change-xrpusdt">--%</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Market Trends -->
|
||||
<section style="padding: 60px 0; max-width: 1200px; margin: 0 auto;">
|
||||
<div style="display: flex; justify-content: space-between; align-items: flex-end; margin-bottom: 30px;">
|
||||
<h2 style="font-size: 2rem; font-weight: 800;"><?php echo __('market_trends', '市场趋势'); ?></h2>
|
||||
<a href="markets.php" style="color: var(--primary-color); text-decoration: none; font-weight: 600; font-size: 14px;"><?php echo __('view_more_markets', '查看更多'); ?> <i class="fas fa-chevron-right" style="font-size: 10px;"></i></a>
|
||||
</div>
|
||||
|
||||
<section class="why-section" style="display: grid; grid-template-columns: 1fr 1fr; gap: 40px; max-width: 1400px; margin: 100px auto; padding: 0 20px; align-items: stretch;">
|
||||
<div class="why-left" style="background: #1e2329; padding: 40px; border-radius: 24px; border: 1px solid rgba(255,255,255,0.05); display: flex; flex-direction: column;">
|
||||
<h2 style="font-size: 2.2rem; margin-bottom: 30px;"><?php echo __('market_trends', 'Market Trends'); ?></h2>
|
||||
<div class="market-table-card" style="flex: 1; display: flex; flex-direction: column;">
|
||||
<table class="market-table" style="width: 100%; border-collapse: collapse;">
|
||||
<div style="background: var(--card-bg); border-radius: 24px; border: 1px solid var(--border-color); overflow: hidden; box-shadow: 0 10px 30px rgba(0,0,0,0.2);">
|
||||
<table style="width: 100%; border-collapse: collapse; text-align: left;">
|
||||
<thead>
|
||||
<tr style="text-align: left; color: var(--text-muted); font-size: 14px;">
|
||||
<th style="padding-bottom: 20px;"><?php echo __('amount', 'Asset'); ?></th>
|
||||
<th style="padding-bottom: 20px;"><?php echo __('price', 'Price'); ?></th>
|
||||
<th style="padding-bottom: 20px;">24h Change</th>
|
||||
<th style="padding-bottom: 20px;"><?php echo __('trade_panel', 'Action'); ?></th>
|
||||
<tr style="border-bottom: 1px solid var(--border-color); background: rgba(255,255,255,0.02);">
|
||||
<th style="padding: 20px 30px; color: var(--text-muted); font-weight: 500; font-size: 14px;"><?php echo __('pair', '币对'); ?></th>
|
||||
<th style="padding: 20px 30px; color: var(--text-muted); font-weight: 500; font-size: 14px;"><?php echo __('last_price', '最新价'); ?></th>
|
||||
<th style="padding: 20px 30px; color: var(--text-muted); font-weight: 500; font-size: 14px;"><?php echo __('24h_change', '24h 涨跌'); ?></th>
|
||||
<th style="padding: 20px 30px; color: var(--text-muted); font-weight: 500; font-size: 14px;"><?php echo __('market_cap', '市值'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="market-tbody">
|
||||
<tr>
|
||||
<td colspan="4" style="text-align: center; padding: 50px; color: #888;">Connecting...</td>
|
||||
</tr>
|
||||
<tbody id="home-market-list">
|
||||
<!-- JS Filled -->
|
||||
</tbody>
|
||||
</table>
|
||||
<div style="margin-top: auto; padding-top: 30px; text-align: center;">
|
||||
<a href="markets.php" style="color: var(--primary-color); text-decoration: none; font-weight: bold; display: flex; align-items: center; justify-content: center; gap: 8px;">
|
||||
<?php echo __('view_more_markets'); ?> <i class="fas fa-arrow-right" style="font-size: 14px;"></i>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Download Section (Beautified and Constrained) -->
|
||||
<section style="padding: 80px 0; background: #0b0e11; border-top: 1px solid rgba(255,255,255,0.05);">
|
||||
<div style="max-width: 1200px; margin: 0 auto;">
|
||||
<div style="display: flex; align-items: center; justify-content: space-between; gap: 60px; flex-wrap: wrap;">
|
||||
<div style="flex: 1; min-width: 400px;">
|
||||
<h2 style="font-size: 2.5rem; font-weight: 800; margin-bottom: 25px; background: linear-gradient(135deg, #fff 0%, #848e9c 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">Trade Anywhere, Anytime</h2>
|
||||
<p style="color: var(--text-muted); font-size: 1.1rem; line-height: 1.6; margin-bottom: 40px;">Stay connected to the markets with the NovaEx mobile app. Experience professional trading features in the palm of your hand, featuring real-time alerts, advanced charting, and instant deposits.</p>
|
||||
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 30px; margin-top: 40px;">
|
||||
<div style="display: flex; gap: 15px; align-items: flex-start;">
|
||||
<div style="width: 40px; height: 40px; border-radius: 12px; background: rgba(79, 172, 254, 0.1); display: flex; align-items: center; justify-content: center; color: var(--primary-color);">
|
||||
<i class="fas fa-bolt"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 style="margin: 0 0 5px; font-weight: 700;">Fast & Secure</h4>
|
||||
<p style="font-size: 0.9rem; color: #848e9c; margin: 0;">Optimized performance with military-grade encryption.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 15px; align-items: flex-start;">
|
||||
<div style="width: 40px; height: 40px; border-radius: 12px; background: rgba(0, 192, 135, 0.1); display: flex; align-items: center; justify-content: center; color: #00c087;">
|
||||
<i class="fas fa-chart-line"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 style="margin: 0 0 5px; font-weight: 700;">Real-time Data</h4>
|
||||
<p style="font-size: 0.9rem; color: #848e9c; margin: 0;">Low-latency market updates for precise execution.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="why-right" style="background: #1e2329; padding: 40px; border-radius: 24px; border: 1px solid rgba(255,255,255,0.05); display: flex; flex-direction: column;">
|
||||
<h2 style="font-size: 2.2rem; margin-bottom: 30px;"><?php echo __('why_choose_us'); ?></h2>
|
||||
<div style="display: flex; flex-direction: column; gap: 25px; flex: 1;">
|
||||
<div style="display: flex; gap: 20px; align-items: flex-start;">
|
||||
<div style="width: 54px; height: 54px; background: rgba(0,82,255,0.1); border-radius: 16px; display: flex; align-items: center; justify-content: center; color: var(--primary-color); font-size: 24px; flex-shrink: 0;">
|
||||
<i class="fas fa-shield-alt"></i>
|
||||
<div style="flex: 1; display: flex; flex-direction: column; gap: 20px; min-width: 300px;">
|
||||
<div class="download-card-new" style="background: rgba(255,255,255,0.03); padding: 25px; border-radius: 20px; border: 1px solid rgba(255,255,255,0.08); display: flex; align-items: center; gap: 20px; transition: 0.3s; cursor: pointer;">
|
||||
<div style="width: 60px; height: 60px; background: #000; border-radius: 15px; display: flex; align-items: center; justify-content: center; font-size: 2rem;">
|
||||
<i class="fab fa-apple" style="color: white;"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 style="margin: 0 0 8px; font-size: 18px;"><?php echo __('secure_storage'); ?></h4>
|
||||
<p style="margin: 0; color: var(--text-muted); font-size: 14px; line-height: 1.5;"><?php echo __('secure_storage_desc'); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 20px; align-items: flex-start;">
|
||||
<div style="width: 54px; height: 54px; background: rgba(14,203,129,0.1); border-radius: 16px; display: flex; align-items: center; justify-content: center; color: var(--success-color); font-size: 24px; flex-shrink: 0;">
|
||||
<i class="fas fa-lock"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 style="margin: 0 0 8px; font-size: 18px;"><?php echo __('protected_insurance'); ?></h4>
|
||||
<p style="margin: 0; color: var(--text-muted); font-size: 14px; line-height: 1.5;"><?php echo __('protected_insurance_desc'); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 20px; align-items: flex-start;">
|
||||
<div style="width: 54px; height: 54px; background: rgba(240,185,11,0.1); border-radius: 16px; display: flex; align-items: center; justify-content: center; color: var(--gold-color); font-size: 24px; flex-shrink: 0;">
|
||||
<i class="fas fa-gem"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 style="margin: 0 0 8px; font-size: 18px;"><?php echo __('industry_best_practices'); ?></h4>
|
||||
<p style="margin: 0; color: var(--text-muted); font-size: 14px; line-height: 1.5;"><?php echo __('industry_best_practices_desc'); ?></p>
|
||||
<div style="flex: 1;">
|
||||
<div style="font-size: 0.85rem; color: #848e9c; font-weight: 500;">Download on the</div>
|
||||
<div style="font-size: 1.3rem; font-weight: 800; color: white;">App Store</div>
|
||||
</div>
|
||||
<i class="fas fa-chevron-right" style="color: #848e9c;"></i>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: auto; padding: 25px; background: rgba(255,255,255,0.03); border-radius: 16px; border: 1px solid rgba(255,255,255,0.05);">
|
||||
<p style="margin: 0 0 20px; font-size: 14px; line-height: 1.6; color: #ccc;"><?php echo __('platform_desc'); ?></p>
|
||||
<a href="register.php" class="btn-primary" style="width: 100%; justify-content: center; padding: 15px; font-weight: bold; font-size: 16px;"><?php echo __('btn_start'); ?></a>
|
||||
<div class="download-card-new" style="background: rgba(255,255,255,0.03); padding: 25px; border-radius: 20px; border: 1px solid rgba(255,255,255,0.08); display: flex; align-items: center; gap: 20px; transition: 0.3s; cursor: pointer;">
|
||||
<div style="width: 60px; height: 60px; background: #000; border-radius: 15px; display: flex; align-items: center; justify-content: center; font-size: 1.8rem;">
|
||||
<i class="fab fa-google-play" style="color: #3DDC84;"></i>
|
||||
</div>
|
||||
<div style="flex: 1;">
|
||||
<div style="font-size: 0.85rem; color: #848e9c; font-weight: 500;">Get it on</div>
|
||||
<div style="font-size: 1.3rem; font-weight: 800; color: white;">Google Play</div>
|
||||
</div>
|
||||
<i class="fas fa-chevron-right" style="color: #848e9c;"></i>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; gap: 20px; align-items: center; background: linear-gradient(135deg, rgba(79, 172, 254, 0.1) 0%, rgba(0, 242, 254, 0.1) 100%); padding: 20px; border-radius: 20px; border: 1px solid rgba(79, 172, 254, 0.2);">
|
||||
<div style="background: white; padding: 10px; border-radius: 12px;">
|
||||
<i class="fas fa-qrcode" style="font-size: 2.5rem; color: #000;"></i>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-weight: 700; color: white; font-size: 1rem;">Scan to Download</div>
|
||||
<div style="font-size: 0.85rem; color: #848e9c; margin-top: 4px;">Supports iOS & Android</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="partners-section" style="padding: 100px 20px; text-align: center; background: #0b0e11;">
|
||||
<h2 style="font-size: 2.5rem; margin-bottom: 15px; font-weight: 800;"><?php echo __('partners'); ?></h2>
|
||||
<p style="color: var(--text-muted); margin-bottom: 60px; font-size: 1.1rem;"><?php echo __('partners_subtitle'); ?></p>
|
||||
<div class="partners-grid" style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 30px; max-width: 1200px; margin: 0 auto; align-items: center;">
|
||||
<div class="partner-card">
|
||||
<img src="https://cryptologos.cc/logos/bitcoin-btc-logo.png?v=024" style="height: 45px;" alt="Bitcoin">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">Bitcoin</span>
|
||||
<!-- Why Choose Us -->
|
||||
<section style="padding: 100px 0; background: #0b0e11;">
|
||||
<div style="max-width: 1200px; margin: 0 auto;">
|
||||
<div style="text-align: center; margin-bottom: 80px;">
|
||||
<h2 style="font-size: 2.8rem; font-weight: 800; margin-bottom: 20px;"><?php echo __('why_choose_us', '为什么选择 NovaEx?'); ?></h2>
|
||||
<p style="color: var(--text-muted); max-width: 700px; margin: 0 auto; font-size: 1.1rem;"><?php echo __('platform_desc', 'NovaEx is the world\'s most trusted cryptocurrency exchange, offering professional trading tools and deep liquidity.'); ?></p>
|
||||
</div>
|
||||
<div class="partner-card">
|
||||
<img src="https://cryptologos.cc/logos/ethereum-eth-logo.png?v=024" style="height: 45px;" alt="Ethereum">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">Ethereum</span>
|
||||
|
||||
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px;">
|
||||
<div class="choose-card" style="padding: 50px 40px; background: rgba(255,255,255,0.02); border-radius: 32px; border: 1px solid rgba(255,255,255,0.05); text-align: center; transition: all 0.4s;">
|
||||
<div style="width: 100px; height: 100px; background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); border-radius: 30px; display: flex; align-items: center; justify-content: center; margin: 0 auto 35px; color: white; font-size: 2.5rem; box-shadow: 0 15px 30px rgba(79, 172, 254, 0.3);">
|
||||
<i class="fas fa-shield-alt"></i>
|
||||
</div>
|
||||
<div class="partner-card">
|
||||
<img src="https://cryptologos.cc/logos/binance-coin-bnb-logo.png?v=024" style="height: 45px;" alt="Binance">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">BNB Chain</span>
|
||||
<h3 style="margin-bottom: 20px; font-size: 1.8rem; font-weight: 700;"><?php echo __('secure_storage', 'Secure Storage'); ?></h3>
|
||||
<p style="color: var(--text-muted); line-height: 1.8; font-size: 1rem;"><?php echo __('secure_storage_desc', 'Most of our digital assets are stored in secure offline cold storage, providing institutional-grade protection for your funds.'); ?></p>
|
||||
</div>
|
||||
<div class="partner-card">
|
||||
<img src="https://cryptologos.cc/logos/tether-usdt-logo.png?v=024" style="height: 45px;" alt="Tether">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">Tether</span>
|
||||
<div class="choose-card" style="padding: 50px 40px; background: rgba(255,255,255,0.02); border-radius: 32px; border: 1px solid rgba(255,255,255,0.05); text-align: center; transition: all 0.4s;">
|
||||
<div style="width: 100px; height: 100px; background: linear-gradient(135deg, #00c087 0%, #00d2ff 100%); border-radius: 30px; display: flex; align-items: center; justify-content: center; margin: 0 auto 35px; color: white; font-size: 2.5rem; box-shadow: 0 15px 30px rgba(0, 192, 135, 0.3);">
|
||||
<i class="fas fa-user-lock"></i>
|
||||
</div>
|
||||
<div class="partner-card">
|
||||
<img src="https://cryptologos.cc/logos/solana-sol-logo.png?v=024" style="height: 45px;" alt="Solana">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">Solana</span>
|
||||
<h3 style="margin-bottom: 20px; font-size: 1.8rem; font-weight: 700;"><?php echo __('protected_insurance', 'Protected by Insurance'); ?></h3>
|
||||
<p style="color: var(--text-muted); line-height: 1.8; font-size: 1rem;"><?php echo __('protected_insurance_desc', 'NovaEx maintains an asset insurance fund to cover potential security breaches, ensuring user peace of mind.'); ?></p>
|
||||
</div>
|
||||
<div class="partner-card">
|
||||
<img src="https://cryptologos.cc/logos/cardano-ada-logo.png?v=024" style="height: 45px;" alt="Cardano">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">Cardano</span>
|
||||
<div class="choose-card" style="padding: 50px 40px; background: rgba(255,255,255,0.02); border-radius: 32px; border: 1px solid rgba(255,255,255,0.05); text-align: center; transition: all 0.4s;">
|
||||
<div style="width: 100px; height: 100px; background: linear-gradient(135deg, #f0b90b 0%, #ff9a00 100%); border-radius: 30px; display: flex; align-items: center; justify-content: center; margin: 0 auto 35px; color: white; font-size: 2.5rem; box-shadow: 0 15px 30px rgba(240, 185, 11, 0.3);">
|
||||
<i class="fas fa-microchip"></i>
|
||||
</div>
|
||||
<div class="partner-card">
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Visa_Inc._logo.svg/2560px-Visa_Inc._logo.svg.png" style="height: 20px;" alt="Visa">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">Visa</span>
|
||||
<h3 style="margin-bottom: 20px; font-size: 1.8rem; font-weight: 700;"><?php echo __('industry_best_practices', 'Best Practices'); ?></h3>
|
||||
<p style="color: var(--text-muted); line-height: 1.8; font-size: 1rem;"><?php echo __('industry_best_practices_desc', 'NovaEx supports a variety of the most popular digital currencies and keeps adding more based on rigorous security standards.'); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Partners (Colorful and Beautiful) -->
|
||||
<section style="padding: 80px 0; background: #161a1e;">
|
||||
<div style="max-width: 1200px; margin: 0 auto; text-align: center;">
|
||||
<h2 style="font-size: 2.2rem; font-weight: 800; margin-bottom: 60px;"><?php echo __('global_partners', 'Global Strategic Partners'); ?></h2>
|
||||
<div style="display: grid; grid-template-columns: repeat(6, 1fr); gap: 30px;">
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-google-pay" style="font-size: 3rem; color: #4285F4;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Google Pay</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-apple-pay" style="font-size: 3rem; color: #ffffff;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Apple Pay</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-visa" style="font-size: 3rem; color: #1a1f71;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">VISA</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-mastercard" style="font-size: 3rem; color: #eb001b;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Mastercard</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-paypal" style="font-size: 3rem; color: #003087;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">PayPal</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-stripe" style="font-size: 3rem; color: #6772e5;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Stripe</div>
|
||||
</div>
|
||||
<!-- Row 2 -->
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-amazon" style="font-size: 2.8rem; color: #ff9900;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Amazon</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-microsoft" style="font-size: 2.8rem; color: #00a4ef;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Microsoft</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-salesforce" style="font-size: 2.8rem; color: #00a1e0;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Salesforce</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-slack" style="font-size: 2.8rem; color: #4a154b;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Slack</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-atlassian" style="font-size: 2.8rem; color: #0052cc;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">Atlassian</div>
|
||||
</div>
|
||||
<div class="partner-item">
|
||||
<i class="fab fa-github" style="font-size: 2.8rem; color: #ffffff;"></i>
|
||||
<div style="margin-top: 15px; font-weight: 600; opacity: 0.9;">GitHub</div>
|
||||
</div>
|
||||
<div class="partner-card">
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Mastercard-logo.svg/1280px-Mastercard-logo.svg.png" style="height: 30px;" alt="Mastercard">
|
||||
<span style="display: block; margin-top: 10px; font-weight: bold;">Mastercard</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<style>
|
||||
.partner-card {
|
||||
background: #1e2329;
|
||||
padding: 30px;
|
||||
border-radius: 16px;
|
||||
border: 1px solid rgba(255,255,255,0.05);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: all 0.3s;
|
||||
cursor: pointer;
|
||||
}
|
||||
.partner-card img { filter: grayscale(0.5); opacity: 0.7; transition: 0.3s; }
|
||||
.partner-card:hover { transform: translateY(-5px); border-color: var(--primary-color); background: rgba(0,82,255,0.05); }
|
||||
.partner-card:hover img { filter: grayscale(0); opacity: 1; }
|
||||
.btn-download-app:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
|
||||
.carousel-dot.active { opacity: 1 !important; width: 35px !important; border-radius: 6px !important; background: var(--primary-color) !important; }
|
||||
.partner-item { padding: 35px 20px; background: rgba(255,255,255,0.02); border-radius: 24px; transition: 0.3s; border: 1px solid transparent; }
|
||||
.partner-item:hover { background: rgba(255,255,255,0.05); transform: translateY(-5px); border-color: rgba(255,255,255,0.1); }
|
||||
|
||||
.download-card-new:hover { background: rgba(255,255,255,0.06) !important; border-color: var(--primary-color) !important; transform: translateX(5px); }
|
||||
|
||||
.choose-card:hover { transform: translateY(-15px); border-color: var(--primary-color) !important; background: rgba(79, 172, 254, 0.05) !important; }
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// Carousel Logic
|
||||
let currentSlide = 0;
|
||||
const slides = document.querySelectorAll('.carousel-item');
|
||||
function nextSlide() {
|
||||
if(slides.length === 0) return;
|
||||
slides[currentSlide].classList.remove('active');
|
||||
currentSlide = (currentSlide + 1) % slides.length;
|
||||
slides[currentSlide].classList.add('active');
|
||||
const track = document.getElementById('carouselTrack');
|
||||
const dots = document.querySelectorAll('.carousel-dot');
|
||||
|
||||
function updateCarousel() {
|
||||
if (!track) return;
|
||||
track.style.transform = `translateX(-${currentSlide * 100}%)`;
|
||||
dots.forEach((dot, i) => {
|
||||
dot.classList.toggle('active', i === currentSlide);
|
||||
});
|
||||
}
|
||||
|
||||
function goToSlide(n) {
|
||||
currentSlide = n;
|
||||
updateCarousel();
|
||||
}
|
||||
|
||||
function nextSlide() {
|
||||
currentSlide = (currentSlide + 1) % 3;
|
||||
updateCarousel();
|
||||
}
|
||||
|
||||
setInterval(nextSlide, 5000);
|
||||
|
||||
const symbols = ['btcusdt', 'ethusdt', 'solusdt', 'bnbusdt', 'xrpusdt', 'adausdt', 'dogeusdt', 'dotusdt'];
|
||||
const tickerElements = {};
|
||||
const trendingPairs = <?php echo json_encode($trending_pairs); ?>;
|
||||
const homeWs = new WebSocket('wss://stream.binance.com:9443/ws/' + trendingPairs.map(p => p.toLowerCase() + '@ticker').join('/'));
|
||||
const homeMarketData = {};
|
||||
|
||||
symbols.forEach(s => {
|
||||
tickerElements[s] = {
|
||||
price: document.getElementById(`price-${s}`),
|
||||
change: document.getElementById(`change-${s}`)
|
||||
};
|
||||
});
|
||||
|
||||
const ws = new WebSocket('wss://stream.binance.com:9443/ws/' + symbols.map(s => s + '@ticker').join('/'));
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
homeWs.onmessage = (event) => {
|
||||
const data = JSON.parse(event.data);
|
||||
const symbol = data.s.toLowerCase();
|
||||
const price = parseFloat(data.c).toLocaleString(undefined, {minimumFractionDigits: 2});
|
||||
const change = parseFloat(data.P).toFixed(2);
|
||||
const color = change >= 0 ? 'var(--success-color)' : 'var(--danger-color)';
|
||||
|
||||
if (tickerElements[symbol]) {
|
||||
if (tickerElements[symbol].price) tickerElements[symbol].price.innerText = price;
|
||||
if (tickerElements[symbol].change) {
|
||||
tickerElements[symbol].change.innerText = (change >= 0 ? '+' : '') + change + '%';
|
||||
tickerElements[symbol].change.style.color = color;
|
||||
}
|
||||
}
|
||||
updateTable(data);
|
||||
homeMarketData[data.s] = data;
|
||||
renderHomeMarket();
|
||||
};
|
||||
|
||||
const marketData = {};
|
||||
function updateTable(data) {
|
||||
const symbol = data.s;
|
||||
marketData[symbol] = data;
|
||||
renderTable();
|
||||
}
|
||||
|
||||
function renderTable() {
|
||||
const tbody = document.getElementById('market-tbody');
|
||||
function renderHomeMarket() {
|
||||
const tbody = document.getElementById('home-market-list');
|
||||
if (!tbody) return;
|
||||
|
||||
let html = '';
|
||||
const sortedSymbols = Object.keys(marketData).sort((a, b) => {
|
||||
const order = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT', 'ADAUSDT', 'DOGEUSDT', 'DOTUSDT'];
|
||||
return order.indexOf(a) - order.indexOf(b);
|
||||
});
|
||||
|
||||
sortedSymbols.slice(0, 6).forEach(s => {
|
||||
const d = marketData[s];
|
||||
const price = parseFloat(d.c).toLocaleString(undefined, {minimumFractionDigits: 2});
|
||||
const change = parseFloat(d.P).toFixed(2);
|
||||
const color = change >= 0 ? 'var(--success-color)' : 'var(--danger-color)';
|
||||
const name = s.replace('USDT', '');
|
||||
const iconUrl = `https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png`;
|
||||
|
||||
trendingPairs.forEach(p => {
|
||||
const d = homeMarketData[p] || {c: 0, P: 0, q: 0};
|
||||
const color = d.P >= 0 ? 'var(--success-color)' : 'var(--danger-color)';
|
||||
const name = p.replace('USDT', '');
|
||||
html += `
|
||||
<tr style="border-bottom: 1px solid rgba(255,255,255,0.05);">
|
||||
<td style="padding: 20px 0;">
|
||||
<div style="display: flex; align-items: center; gap: 12px;">
|
||||
<img src="${iconUrl}" width="32" height="32" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<span style="font-weight: bold; font-size: 16px;">${name}</span>
|
||||
<tr style="border-bottom: 1px solid rgba(255,255,255,0.05); transition: 0.2s;" onmouseover="this.style.background='rgba(255,255,255,0.02)'" onmouseout="this.style.background='transparent'">
|
||||
<td style="padding: 25px 30px; display: flex; align-items: center; gap: 15px;">
|
||||
<img src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png" width="32" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<div>
|
||||
<div style="font-weight: 700; font-size: 1.1rem;">${name}</div>
|
||||
<div style="font-size: 0.8rem; color: var(--text-muted);">USDT</div>
|
||||
</div>
|
||||
</td>
|
||||
<td style="font-weight: bold; font-family: monospace; font-size: 16px;">$ ${price}</td>
|
||||
<td style="color: ${color}; font-weight: bold; font-size: 16px;">${change >= 0 ? '+' : ''}${change}%</td>
|
||||
<td><a href="spot.php?symbol=${s}" class="btn-primary" style="padding: 8px 20px; font-size: 13px; border-radius: 8px; background: rgba(255,255,255,0.05); color: white; border: 1px solid rgba(255,255,255,0.1);"><?php echo __('buy'); ?></a></td>
|
||||
<td style="padding: 25px 30px; font-weight: 600; font-size: 1.1rem; color: #EAECEF;">$ ${parseFloat(d.c).toLocaleString()}</td>
|
||||
<td style="padding: 25px 30px; color: ${color}; font-weight: 700; font-size: 1.1rem;">${d.P >= 0 ? '+' : ''}${d.P}%</td>
|
||||
<td style="padding: 25px 30px; color: var(--text-muted); font-family: monospace; font-size: 0.9rem;">$ ${(parseFloat(d.q) / 1000000).toFixed(2)}M</td>
|
||||
</tr>
|
||||
`;
|
||||
});
|
||||
|
||||
if (html) tbody.innerHTML = html;
|
||||
tbody.innerHTML = html;
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
348
matching.php
348
matching.php
@ -9,20 +9,22 @@ if (!isset($_SESSION['user_id'])) {
|
||||
require_once 'db/config.php';
|
||||
$user_id = $_SESSION['user_id'];
|
||||
|
||||
$order_id = $_GET['order_id'] ?? null;
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['type'])) {
|
||||
$type = $_POST['type'];
|
||||
// Handle initial order creation from deposit.php
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['amount'])) {
|
||||
$amount = $_POST['amount'];
|
||||
$type = $_POST['type'] ?? 'fiat';
|
||||
$currency = $_POST['currency'] ?? 'USDT';
|
||||
|
||||
// Create order
|
||||
$stmt = db()->prepare("INSERT INTO fiat_orders (user_id, amount, currency, status, created_at) VALUES (?, ?, ?, 'pending', CURRENT_TIMESTAMP)");
|
||||
$stmt->execute([$user_id, $amount, $currency]);
|
||||
// Set expiration to 30 minutes from now
|
||||
$expires_at = date('Y-m-d H:i:s', strtotime('+30 minutes'));
|
||||
|
||||
// Create order in fiat_orders table
|
||||
$stmt = db()->prepare("INSERT INTO fiat_orders (user_id, amount, currency, status, expires_at, created_at) VALUES (?, ?, ?, 'matching', ?, CURRENT_TIMESTAMP)");
|
||||
$stmt->execute([$user_id, $amount, $currency, $expires_at]);
|
||||
$order_id = db()->lastInsertId();
|
||||
|
||||
// Notify CS via messages table
|
||||
$msg = "New deposit order #$order_id: $amount $currency. Please provide bank account details.";
|
||||
// Notify CS via messages table (Admin notification)
|
||||
$msg = "[SYSTEM] 用户 {$_SESSION['email']} (UID: {$_SESSION['uid']}) 正在发起充值匹配: $amount $currency。请尽快提供收款账户详情。";
|
||||
$stmt = db()->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'user', ?)");
|
||||
$stmt->execute([$user_id, $msg]);
|
||||
|
||||
@ -30,6 +32,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['type'])) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$order_id = $_GET['order_id'] ?? null;
|
||||
if (!$order_id) {
|
||||
header("Location: deposit.php");
|
||||
exit;
|
||||
@ -57,88 +60,315 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['proof'])) {
|
||||
if (move_uploaded_file($file['tmp_name'], $target)) {
|
||||
$stmt = db()->prepare("UPDATE fiat_orders SET proof_image = ?, status = 'submitting' WHERE id = ?");
|
||||
$stmt->execute(['assets/images/proofs/' . $filename, $order_id]);
|
||||
|
||||
// Notify admin
|
||||
$msg = "[SYSTEM] 用户已上传支付凭证 (订单 #$order_id)。请进入管理后台核对入账。";
|
||||
$stmt = db()->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'user', ?)");
|
||||
$stmt->execute([$user_id, $msg]);
|
||||
|
||||
header("Location: matching.php?order_id=" . $order_id);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch messages for the chat portion
|
||||
$stmt = db()->prepare("SELECT * FROM messages WHERE user_id = ? AND message NOT LIKE '[SYSTEM]%' ORDER BY created_at ASC");
|
||||
$stmt->execute([$user_id]);
|
||||
$messages = $stmt->fetchAll();
|
||||
?>
|
||||
|
||||
<main style="padding: 40px 20px; background: #0b0e11; min-height: calc(100vh - 64px);">
|
||||
<div style="max-width: 800px; margin: 0 auto;">
|
||||
<main style="padding: 40px 20px; background: #0b0e11; min-height: calc(100vh - 64px); color: white;">
|
||||
<div style="max-width: 1100px; margin: 0 auto; display: grid; grid-template-columns: 1fr 380px; gap: 30px;">
|
||||
|
||||
<div style="background: var(--card-bg); padding: 40px; border-radius: 24px; border: 1px solid var(--border-color); text-align: center;">
|
||||
<?php if (!$order['bank_account_info']): ?>
|
||||
<div id="matching-spinner">
|
||||
<div style="width: 80px; height: 80px; border: 4px solid rgba(0,82,255,0.1); border-top-color: var(--primary-color); border-radius: 50%; margin: 0 auto 30px; animation: spin 1s linear infinite;"></div>
|
||||
<h2 style="margin-bottom: 10px;"><?php echo __('matching_account', 'Matching Payment Account...'); ?></h2>
|
||||
<p style="color: var(--text-muted);"><?php echo __('matching_desc', 'Our system is matching a secure local account for your deposit. Please wait a moment.'); ?></p>
|
||||
<div style="margin-top: 30px; font-size: 14px; color: var(--primary-color);">
|
||||
<i class="fas fa-info-circle"></i> Tip: You can also contact <a href="chat.php" style="color: var(--primary-color); font-weight: bold;">Online Support</a> for faster processing.
|
||||
<!-- Left Side: Matching & Instructions -->
|
||||
<div style="background: #161a1e; padding: 40px; border-radius: 24px; border: 1px solid #2b3139; position: relative; overflow: hidden;">
|
||||
|
||||
<?php if ($order['status'] === 'matching' && !$order['bank_account_info']): ?>
|
||||
<!-- Phase 1: Matching Animation -->
|
||||
<div id="matching-container" style="text-align: center; padding: 60px 0;">
|
||||
<div style="position: relative; width: 120px; height: 120px; margin: 0 auto 40px;">
|
||||
<div class="loader-ring" style="width: 100%; height: 100%; border: 4px solid rgba(79, 172, 254, 0.1); border-top-color: var(--primary-color); border-radius: 50%; animation: spin 1s linear infinite;"></div>
|
||||
<i class="fas fa-user-shield" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 40px; color: var(--primary-color);"></i>
|
||||
</div>
|
||||
<h2 style="font-size: 2.2rem; font-weight: 800; margin-bottom: 20px; background: linear-gradient(90deg, #fff, var(--primary-color)); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">正在为你匹配充值账户请稍等...</h2>
|
||||
<p style="color: #848e9c; font-size: 1.1rem; max-width: 500px; margin: 0 auto 40px; line-height: 1.6;">
|
||||
我们正在为您匹配最安全、快捷的本地支付通道。匹配成功后,请在规定时间内完成转账。
|
||||
</p>
|
||||
|
||||
<div style="max-width: 300px; margin: 0 auto; background: rgba(79, 172, 254, 0.05); padding: 30px; border-radius: 20px; border: 1px dashed var(--primary-color);">
|
||||
<div id="countdown" style="font-size: 3rem; font-weight: 900; color: var(--primary-color); font-family: 'Roboto Mono', monospace;">30:00</div>
|
||||
<div style="font-size: 13px; color: #848e9c; margin-top: 10px; font-weight: bold;">匹配倒计时 / Matching Countdown</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 60px; display: grid; grid-template-columns: 1fr 1fr; gap: 20px; text-align: left;">
|
||||
<div style="background: #0b0e11; padding: 20px; border-radius: 16px;">
|
||||
<i class="fas fa-lock" style="color: #00c087; margin-bottom: 10px;"></i>
|
||||
<div style="font-weight: bold; font-size: 14px; margin-bottom: 5px;">加密保护</div>
|
||||
<div style="font-size: 12px; color: #5e6673;">所有交易信息经过端到端加密处理,保障您的资金隐私。</div>
|
||||
</div>
|
||||
<div style="background: #0b0e11; padding: 20px; border-radius: 16px;">
|
||||
<i class="fas fa-bolt" style="color: #f0b90b; margin-bottom: 10px;"></i>
|
||||
<div style="font-weight: bold; font-size: 14px; margin-bottom: 5px;">快速响应</div>
|
||||
<div style="font-size: 12px; color: #5e6673;">客服系统 7x24 小时在线,实时处理您的充值匹配请求。</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
setInterval(() => {
|
||||
fetch('api/check_order_status.php?order_id=<?php echo $order_id; ?>')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
if (data.bank_account_info) {
|
||||
location.reload();
|
||||
}
|
||||
});
|
||||
}, 3000);
|
||||
</script>
|
||||
<?php elseif ($order['status'] === 'pending'): ?>
|
||||
<div style="text-align: left;">
|
||||
<div style="display: flex; align-items: center; gap: 15px; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 1px solid var(--border-color);">
|
||||
<div style="width: 50px; height: 50px; background: rgba(14,203,129,0.1); border-radius: 12px; display: flex; align-items: center; justify-content: center; color: var(--success-color); font-size: 20px;">
|
||||
<i class="fas fa-check-circle"></i>
|
||||
</div>
|
||||
|
||||
<?php elseif ($order['bank_account_info'] && $order['status'] !== 'submitting' && $order['status'] !== 'completed'): ?>
|
||||
<!-- Phase 2: Matched Account Details -->
|
||||
<div>
|
||||
<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 30px; border-bottom: 1px solid #2b3139; padding-bottom: 25px;">
|
||||
<div style="display: flex; align-items: center; gap: 15px;">
|
||||
<div style="width: 50px; height: 50px; background: rgba(0, 192, 135, 0.1); border-radius: 12px; display: flex; align-items: center; justify-content: center; color: #00c087; font-size: 20px;">
|
||||
<i class="fas fa-check-double"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h2 style="margin: 0;">Account Matched Successfully</h2>
|
||||
<p style="margin: 5px 0 0; color: var(--text-muted); font-size: 14px;">Please complete the transfer to the following account.</p>
|
||||
<h2 style="margin: 0; font-size: 1.5rem;">账户匹配成功 / Matched</h2>
|
||||
<p style="margin: 5px 0 0; color: #848e9c; font-size: 13px;">请按照以下信息进行转账支付</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="countdown" style="font-size: 1.5rem; font-weight: bold; color: #f0b90b; background: rgba(240, 185, 11, 0.1); padding: 5px 15px; border-radius: 8px;">30:00</div>
|
||||
</div>
|
||||
|
||||
<div style="background: #161a1e; padding: 25px; border-radius: 16px; margin-bottom: 30px; border: 1px solid var(--border-color);">
|
||||
<div style="font-size: 14px; color: var(--text-muted); margin-bottom: 20px;">BANK ACCOUNT DETAILS</div>
|
||||
<div style="background: #0b0e11; padding: 35px; border-radius: 20px; border: 2px solid #2b3139; margin-bottom: 35px; position: relative;">
|
||||
<div style="position: absolute; top: 15px; right: 20px; font-size: 10px; color: #5e6673; letter-spacing: 2px;">SECURE CHANNEL</div>
|
||||
<div style="color: var(--primary-color); font-size: 12px; margin-bottom: 20px; font-weight: 800; display: flex; align-items: center; gap: 8px;">
|
||||
<i class="fas fa-info-circle"></i> 收款方详情 / RECEIVING DETAILS
|
||||
</div>
|
||||
<div style="font-size: 1.3rem; line-height: 2.2; font-family: 'Roboto Mono', monospace; color: #EAECEF;">
|
||||
<?php echo nl2br(htmlspecialchars($order['bank_account_info'])); ?>
|
||||
</div>
|
||||
<div style="margin-top: 25px; padding-top: 25px; border-top: 1px solid #2b3139; display: flex; justify-content: space-between; align-items: center;">
|
||||
<span style="color: #848e9c; font-size: 14px;">应付金额 / Payable Amount:</span>
|
||||
<span style="font-weight: 900; font-size: 2rem; color: #f0b90b;"><?php echo number_format($order['amount'], 2); ?> <span style="font-size: 1rem;"><?php echo $order['currency']; ?></span></span>
|
||||
</div>
|
||||
<div style="margin-top: 15px; background: rgba(240, 185, 11, 0.05); padding: 10px; border-radius: 8px; font-size: 11px; color: #f0b90b; text-align: center;">
|
||||
<i class="fas fa-exclamation-triangle"></i> 请确保转账金额与上述金额完全一致,否则将无法入账。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="background: rgba(240,185,11,0.05); padding: 20px; border-radius: 12px; border: 1px solid rgba(240,185,11,0.2); margin-bottom: 30px;">
|
||||
<h4 style="color: #f0b90b; margin: 0 0 10px;"><i class="fas fa-exclamation-triangle"></i> Important Instructions</h4>
|
||||
<ul style="margin: 0; padding-left: 20px; font-size: 13px; color: #ccc; line-height: 1.8;">
|
||||
<li>Please transfer the exact amount: <strong><?php echo $order['amount']; ?> <?php echo $order['currency']; ?></strong></li>
|
||||
<li>Include your UID <strong><?php echo $_SESSION['uid']; ?></strong> in the transfer remarks.</li>
|
||||
<li>Take a screenshot of the successful transfer.</li>
|
||||
<!-- Enhanced Instructions & Safety Tips -->
|
||||
<div style="margin-bottom: 40px;">
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 25px;">
|
||||
<div>
|
||||
<h4 style="margin-bottom: 15px; display: flex; align-items: center; gap: 10px; color: white;"><i class="fas fa-list-ol" style="color: var(--primary-color);"></i> 转账说明 / Instructions</h4>
|
||||
<ul style="margin: 0; padding-left: 20px; font-size: 13px; color: #848e9c; line-height: 2;">
|
||||
<li>使用本人实名认证的银行账户进行转账。</li>
|
||||
<li><b style="color: #f0b90b;">严禁备注</b>任何敏感字眼(如:数字货币、USDT、NovaEx等)。</li>
|
||||
<li>匹配账户仅限单次使用,请勿重复转账或保存账户。</li>
|
||||
<li>转账完成后,请务必保留电子回单或转账成功截图。</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<label style="display: block; margin-bottom: 15px; font-weight: bold;">Upload Payment Voucher</label>
|
||||
<div style="border: 2px dashed var(--border-color); padding: 30px; border-radius: 16px; text-align: center; cursor: pointer; transition: 0.2s;" onmouseover="this.style.borderColor='var(--primary-color)'" onmouseout="this.style.borderColor='var(--border-color)'" onclick="document.getElementById('proof-file').click()">
|
||||
<i class="fas fa-cloud-upload-alt" style="font-size: 40px; color: var(--text-muted); margin-bottom: 15px;"></i>
|
||||
<div style="color: var(--text-muted); font-size: 14px;">Click to select or drag and drop image</div>
|
||||
<input type="file" name="proof" id="proof-file" accept="image/*" style="display: none;" onchange="this.form.submit()">
|
||||
<div>
|
||||
<h4 style="margin-bottom: 15px; display: flex; align-items: center; gap: 10px; color: white;"><i class="fas fa-user-shield" style="color: #00c087;"></i> 注意事项 / Precautions</h4>
|
||||
<ul style="margin: 0; padding-left: 20px; font-size: 13px; color: #848e9c; line-height: 2;">
|
||||
<li>NovaEx 官方客服不会通过私人社交账号向您索要资金。</li>
|
||||
<li>若超过 30 分钟未支付,请重新发起充值申请。</li>
|
||||
<li>资金安全由平台承保,请放心按照指引操作。</li>
|
||||
<li>如有任何疑问,请点击右侧客服对话框进行咨询。</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Upload Form with Strict Enforcement -->
|
||||
<form method="POST" enctype="multipart/form-data" id="proof-form">
|
||||
<div style="background: #0b0e11; padding: 30px; border-radius: 20px; border: 2px dashed #2b3139; text-align: center; cursor: pointer; transition: 0.3s;" id="upload-zone" onclick="document.getElementById('proof-file').click()">
|
||||
<div id="upload-idle">
|
||||
<i class="fas fa-cloud-upload-alt" style="font-size: 50px; color: #5e6673; margin-bottom: 15px;"></i>
|
||||
<div style="font-weight: bold; margin-bottom: 5px;">上传支付凭证 / Upload Voucher</div>
|
||||
<div style="color: #5e6673; font-size: 12px;">点击或拖拽转账成功回单截图到此处</div>
|
||||
<div style="color: #f0b90b; font-size: 11px; margin-top: 10px;">* 强制要求:必须上传凭证后才可点击确认完成</div>
|
||||
</div>
|
||||
<div id="upload-preview" style="display: none;">
|
||||
<i class="fas fa-file-image" style="font-size: 50px; color: #00c087; margin-bottom: 15px;"></i>
|
||||
<div style="font-weight: bold; color: #00c087;">文件已就绪 / File Ready</div>
|
||||
<div id="filename-display" style="font-size: 12px; color: #848e9c; margin-top: 5px;"></div>
|
||||
<div style="color: #var(--primary-color); font-size: 11px; margin-top: 10px;">点击此处可更换文件</div>
|
||||
</div>
|
||||
<input type="file" name="proof" id="proof-file" accept="image/*" style="display: none;" onchange="handleFileSelect(this)">
|
||||
</div>
|
||||
|
||||
<button type="submit" id="submit-btn" disabled class="btn-primary" style="width: 100%; padding: 20px; font-size: 1.2rem; border-radius: 16px; margin-top: 25px; opacity: 0.5; cursor: not-allowed; transition: 0.3s; font-weight: 800;">
|
||||
确认转账完成 / Transfer Completed
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php else: ?>
|
||||
<div style="padding: 40px 0;">
|
||||
<i class="fas fa-clock" style="font-size: 64px; color: var(--gold-color); margin-bottom: 20px;"></i>
|
||||
<h2 style="margin-bottom: 15px;">Deposit Under Review</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.6;">Your payment proof has been submitted successfully. Our team will verify the transaction and update your balance within 30 minutes.</p>
|
||||
<div style="margin-top: 40px; display: flex; gap: 15px; justify-content: center;">
|
||||
<a href="profile.php" class="btn-primary" style="padding: 12px 30px; border-radius: 8px;">Back to Assets</a>
|
||||
<a href="chat.php" class="btn-primary" style="background: #2b3139; padding: 12px 30px; border-radius: 8px;">Contact Support</a>
|
||||
<!-- Phase 3: Review State -->
|
||||
<div style="text-align: center; padding: 80px 0;">
|
||||
<div style="width: 100px; height: 100px; background: rgba(240, 185, 11, 0.1); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 30px;">
|
||||
<i class="fas fa-hourglass-half" style="font-size: 40px; color: #f0b90b; animation: pulse 2s infinite;"></i>
|
||||
</div>
|
||||
<h2 style="font-size: 2rem; margin-bottom: 20px;">充值审核中 / Under Review</h2>
|
||||
<p style="color: #848e9c; line-height: 2; max-width: 600px; margin: 0 auto 40px; font-size: 1.1rem;">
|
||||
您的支付凭证已成功提交。系统后台人员正在核实资金到账情况,预计将在 <b style="color: #fff;">15-30分钟</b> 内为您更新余额。
|
||||
您可以随时在右侧与客服沟通进度。
|
||||
</p>
|
||||
<div style="display: flex; gap: 20px; justify-content: center;">
|
||||
<a href="profile.php" style="background: var(--primary-color); color: white; padding: 15px 40px; border-radius: 12px; text-decoration: none; font-weight: bold; transition: 0.3s;">查看资产 / View Assets</a>
|
||||
<a href="deposit.php" style="background: #2b3139; color: white; padding: 15px 40px; border-radius: 12px; text-decoration: none; font-weight: bold; transition: 0.3s;">再次充值 / Deposit Again</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<!-- Right Side: Chat Interface (CS) -->
|
||||
<div style="background: #161a1e; border-radius: 24px; border: 1px solid #2b3139; display: flex; flex-direction: column; height: 750px; overflow: hidden; box-shadow: 0 10px 30px rgba(0,0,0,0.5);">
|
||||
<div style="padding: 25px; border-bottom: 1px solid #2b3139; background: #1e2329; display: flex; align-items: center; justify-content: space-between;">
|
||||
<div style="display: flex; align-items: center; gap: 15px;">
|
||||
<div style="position: relative;">
|
||||
<div style="width: 45px; height: 45px; background: linear-gradient(135deg, var(--primary-color), #4facfe); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 20px;">
|
||||
<i class="fas fa-headset" style="color: white;"></i>
|
||||
</div>
|
||||
<div style="position: absolute; bottom: 0; right: 0; width: 12px; height: 12px; background: #00c087; border: 2px solid #1e2329; border-radius: 50%;"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-weight: 800; font-size: 15px; color: white;">NovaEx 官方客服</div>
|
||||
<div style="font-size: 11px; color: #00c087;">专席已接入 · 实时响应中</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="chat-box" style="flex: 1; overflow-y: auto; padding: 25px; display: flex; flex-direction: column; gap: 20px; background: #0b0e11; scroll-behavior: smooth;">
|
||||
<div style="text-align: center; margin-bottom: 10px;">
|
||||
<span style="background: rgba(255,255,255,0.05); padding: 4px 12px; border-radius: 20px; font-size: 10px; color: #5e6673;">已通过安全加密连接</span>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-start;">
|
||||
<div style="max-width: 85%; padding: 12px 16px; border-radius: 16px; font-size: 13px; line-height: 1.6; background: #2b3139; color: #EAECEF; border-bottom-left-radius: 2px;">
|
||||
您好!我是您的专属充值助理。正在为您匹配最佳充值通道,请稍后。如有任何操作疑问请直接在此留言。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php foreach ($messages as $m): ?>
|
||||
<div style="display: flex; flex-direction: column; align-items: <?php echo $m['sender'] === 'user' ? 'flex-end' : 'flex-start'; ?>;">
|
||||
<div style="max-width: 85%; padding: 12px 16px; border-radius: 16px; font-size: 13px; line-height: 1.6;
|
||||
<?php echo $m['sender'] === 'user' ? 'background: var(--primary-color); color: white; border-bottom-right-radius: 2px;' : 'background: #2b3139; color: #EAECEF; border-bottom-left-radius: 2px;'; ?>">
|
||||
<?php echo nl2br(htmlspecialchars($m['message'])); ?>
|
||||
</div>
|
||||
<span style="font-size: 9px; color: #555; margin-top: 6px;"><?php echo date('H:i', strtotime($m['created_at'])); ?></span>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<div style="padding: 25px; border-top: 1px solid #2b3139; background: #1e2329;">
|
||||
<form id="chat-form" style="display: flex; gap: 12px;">
|
||||
<input type="text" id="chat-input" placeholder="请描述您的问题..." style="flex: 1; background: #0b0e11; border: 1px solid #2b3139; border-radius: 12px; padding: 14px 18px; color: white; outline: none; font-size: 14px; transition: 0.3s;">
|
||||
<button type="submit" style="width: 50px; height: 50px; border-radius: 12px; background: var(--primary-color); border: none; color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: 0.3s;">
|
||||
<i class="fas fa-paper-plane"></i>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<style>
|
||||
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|
||||
@keyframes pulse { 0% { opacity: 0.6; } 50% { opacity: 1; } 100% { opacity: 0.6; } }
|
||||
.loader-ring { box-shadow: 0 0 20px rgba(79, 172, 254, 0.2); }
|
||||
#chat-input:focus { border-color: var(--primary-color); box-shadow: 0 0 10px rgba(0, 82, 255, 0.1); }
|
||||
#upload-zone:hover { border-color: var(--primary-color); background: rgba(0, 82, 255, 0.02); }
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// Countdown Timer
|
||||
let expiresAt = new Date('<?php echo $order['expires_at']; ?>').getTime();
|
||||
|
||||
function updateCountdown() {
|
||||
let now = new Date().getTime();
|
||||
let diff = expiresAt - now;
|
||||
|
||||
let elements = document.querySelectorAll('#countdown');
|
||||
if (diff <= 0) {
|
||||
elements.forEach(el => el.innerText = "00:00");
|
||||
return;
|
||||
}
|
||||
|
||||
let mins = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
|
||||
let secs = Math.floor((diff % (1000 * 60)) / 1000);
|
||||
|
||||
let timeStr = (mins < 10 ? "0" + mins : mins) + ":" + (secs < 10 ? "0" + secs : secs);
|
||||
elements.forEach(el => el.innerText = timeStr);
|
||||
}
|
||||
|
||||
if (document.querySelectorAll('#countdown').length > 0) {
|
||||
updateCountdown();
|
||||
setInterval(updateCountdown, 1000);
|
||||
}
|
||||
|
||||
// Auto refresh for order status (to show bank details when admin provides them)
|
||||
<?php if ($order['status'] === 'matching' && !$order['bank_account_info']): ?>
|
||||
setInterval(() => {
|
||||
fetch('api/check_order_status.php?order_id=<?php echo $order_id; ?>')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
if (data.bank_account_info) {
|
||||
location.href = location.href; // Refresh to show matched state
|
||||
}
|
||||
});
|
||||
}, 4000);
|
||||
<?php endif; ?>
|
||||
|
||||
// Handle File Selection and UI Toggle
|
||||
function handleFileSelect(input) {
|
||||
const btn = document.getElementById('submit-btn');
|
||||
const idle = document.getElementById('upload-idle');
|
||||
const preview = document.getElementById('upload-preview');
|
||||
const filename = document.getElementById('filename-display');
|
||||
|
||||
if (input.files && input.files[0]) {
|
||||
btn.disabled = false;
|
||||
btn.style.opacity = "1";
|
||||
btn.style.cursor = "pointer";
|
||||
btn.style.background = "#00c087";
|
||||
|
||||
idle.style.display = "none";
|
||||
preview.style.display = "block";
|
||||
filename.innerText = input.files[0].name;
|
||||
|
||||
document.getElementById('upload-zone').style.borderColor = "#00c087";
|
||||
document.getElementById('upload-zone').style.background = "rgba(0, 192, 135, 0.05)";
|
||||
}
|
||||
}
|
||||
|
||||
// Chat functionality
|
||||
const chatBox = document.getElementById('chat-box');
|
||||
chatBox.scrollTop = chatBox.scrollHeight;
|
||||
|
||||
document.getElementById('chat-form').onsubmit = function(e) {
|
||||
e.preventDefault();
|
||||
const input = document.getElementById('chat-input');
|
||||
const msg = input.value.trim();
|
||||
if (!msg) return;
|
||||
|
||||
const originalBtnHtml = this.querySelector('button').innerHTML;
|
||||
this.querySelector('button').innerHTML = '<i class="fas fa-spinner fa-spin"></i>';
|
||||
|
||||
fetch('chat.php', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
body: 'message=' + encodeURIComponent(msg)
|
||||
}).then(() => {
|
||||
input.value = '';
|
||||
location.reload();
|
||||
});
|
||||
};
|
||||
|
||||
// Auto refresh chat
|
||||
let messageCount = <?php echo count($messages); ?>;
|
||||
setInterval(() => {
|
||||
fetch('api/get_messages.php')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
if (data.count > messageCount) {
|
||||
location.reload();
|
||||
}
|
||||
});
|
||||
}, 5000);
|
||||
</script>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
|
||||
45
news.php
Normal file
45
news.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php include 'header.php'; ?>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 1200px; margin: 0 auto;">
|
||||
<h1 style="font-size: 3rem; font-weight: 800; margin-bottom: 50px; text-align: center;">NovaEx News & Insights</h1>
|
||||
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 40px; margin-bottom: 60px;">
|
||||
<div style="grid-column: span 2; background: #161a1e; border-radius: 32px; overflow: hidden; border: 1px solid #2b3139;">
|
||||
<div style="height: 400px; background: url('https://images.pexels.com/photos/6770610/pexels-photo-6770610.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1') center/cover;"></div>
|
||||
<div style="padding: 40px;">
|
||||
<span style="color: var(--primary-color); font-weight: bold; font-size: 0.9rem;">ANNOUNCEMENT</span>
|
||||
<h2 style="font-size: 2.2rem; margin: 15px 0 20px;">NovaEx Launches Advanced Futures Trading Interface</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8; margin-bottom: 30px;">We are excited to announce the rollout of our next-generation trading engine, providing 10x faster execution and a highly customizable UI for professional traders.</p>
|
||||
<a href="#" style="color: var(--primary-color); font-weight: bold; text-decoration: none;">Read More <i class="fas fa-arrow-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="background: #161a1e; border-radius: 24px; overflow: hidden; border: 1px solid #2b3139;">
|
||||
<div style="height: 200px; background: url('https://images.pexels.com/photos/844124/pexels-photo-844124.jpeg?auto=compress&cs=tinysrgb&w=600') center/cover;"></div>
|
||||
<div style="padding: 25px;">
|
||||
<span style="color: #00c087; font-weight: bold; font-size: 0.8rem;">MARKET ANALYSIS</span>
|
||||
<h3 style="font-size: 1.4rem; margin: 10px 0 15px;">The Rise of Layer 2 Solutions: What to Watch</h3>
|
||||
<p style="color: var(--text-muted); font-size: 0.9rem; line-height: 1.6; margin-bottom: 20px;">An in-depth look at how scaling solutions are changing the Ethereum ecosystem and what it means for investors.</p>
|
||||
<a href="#" style="color: var(--primary-color); font-weight: bold; text-decoration: none; font-size: 0.9rem;">Read More</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="background: #161a1e; border-radius: 24px; overflow: hidden; border: 1px solid #2b3139;">
|
||||
<div style="height: 200px; background: url('https://images.pexels.com/photos/5980860/pexels-photo-5980860.jpeg?auto=compress&cs=tinysrgb&w=600') center/cover;"></div>
|
||||
<div style="padding: 25px;">
|
||||
<span style="color: #f0b90b; font-weight: bold; font-size: 0.8rem;">SECURITY</span>
|
||||
<h3 style="font-size: 1.4rem; margin: 10px 0 15px;">NovaEx Completes Annual Security Audit</h3>
|
||||
<p style="color: var(--text-muted); font-size: 0.9rem; line-height: 1.6; margin-bottom: 20px;">We have successfully completed our comprehensive audit with top cybersecurity firms, reinforcing our commitment to user safety.</p>
|
||||
<a href="#" style="color: var(--primary-color); font-weight: bold; text-decoration: none; font-size: 0.9rem;">Read More</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="text-align: center;">
|
||||
<button class="btn-primary" style="padding: 12px 30px; border-radius: 10px;"><?php echo __('load_more', '加载更多'); ?></button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
52
privacy.php
Normal file
52
privacy.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php include 'header.php'; ?>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 900px; margin: 0 auto; background: #161a1e; padding: 60px; border-radius: 32px; border: 1px solid #2b3139;">
|
||||
<h1 style="font-size: 2.5rem; margin-bottom: 20px;">Legal & Privacy Policy</h1>
|
||||
<p style="color: var(--text-muted); margin-bottom: 40px;">Last Updated: February 2026</p>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px; color: #4facfe;">1. Introduction</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">NovaEx ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website or use our services.</p>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px; color: #4facfe;">2. Information We Collect</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">We collect information that you provide directly to us, such as when you create an account, verify your identity (KYC), or contact support. This includes:</p>
|
||||
<ul style="color: var(--text-muted); line-height: 1.8; margin-top: 15px;">
|
||||
<li>Personal identifiers (Name, Email, Phone Number)</li>
|
||||
<li>Identity documentation (Passport, ID Card, Driver's License)</li>
|
||||
<li>Financial information (Wallet addresses, Transaction history)</li>
|
||||
<li>Technical data (IP address, Browser type, Device info)</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px; color: #4facfe;">3. How We Use Your Information</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">We use your information to provide and improve our services, including:</p>
|
||||
<ul style="color: var(--text-muted); line-height: 1.8; margin-top: 15px;">
|
||||
<li>Processing transactions and managing your account</li>
|
||||
<li>Complying with legal and regulatory requirements (AML/KYC)</li>
|
||||
<li>Detecting and preventing fraudulent activities</li>
|
||||
<li>Communicating with you about updates and promotions</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px; color: #4facfe;">4. Data Security</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">We implement robust security measures to protect your data, including end-to-end encryption, multi-factor authentication, and secure cold storage for digital assets. However, no method of transmission over the internet is 100% secure.</p>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.8rem; margin-bottom: 20px; color: #4facfe;">5. Your Rights</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">Depending on your location, you may have rights regarding your personal data, including the right to access, correct, or delete your information. Contact our privacy team at privacy@novaex.com for assistance.</p>
|
||||
</section>
|
||||
|
||||
<div style="margin-top: 60px; padding-top: 40px; border-top: 1px solid #2b3139; text-align: center;">
|
||||
<p style="color: var(--text-muted);">If you have any questions about this policy, please contact us.</p>
|
||||
<a href="request.php" class="btn-primary" style="margin-top: 20px; display: inline-block;">Submit a Privacy Request</a>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
37
profile.php
37
profile.php
@ -30,20 +30,20 @@ $kyc_colors = [0 => '#888', 1 => '#f0b90b', 2 => 'var(--success-color)', 3 => 'v
|
||||
<div style="display: grid; grid-template-columns: 350px 1fr; gap: 30px;">
|
||||
<!-- Left Panel -->
|
||||
<div>
|
||||
<div style="background: var(--card-bg); padding: 40px; border-radius: 20px; border: 1px solid var(--border-color); text-align: center;">
|
||||
<div style="width: 100px; height: 100px; background: linear-gradient(135deg, #0052ff, #00a3ff); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px; font-size: 2.5rem; font-weight: bold; color: white; box-shadow: 0 10px 20px rgba(0,82,255,0.2);">
|
||||
<div style="background: var(--card-bg); padding: 40px; border-radius: 24px; border: 1px solid var(--border-color); text-align: center;">
|
||||
<div style="width: 100px; height: 100px; background: linear-gradient(135deg, #4facfe, #00f2fe); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px; font-size: 2.5rem; font-weight: bold; color: white; box-shadow: 0 10px 20px rgba(79,172,254,0.2);">
|
||||
<?php echo strtoupper(substr($user['username'], 0, 1)); ?>
|
||||
</div>
|
||||
<h2 style="margin-bottom: 5px;"><?php echo $user['username']; ?></h2>
|
||||
<div style="color: var(--text-muted); font-size: 0.9rem; margin-bottom: 25px;">UID: <?php echo $user['uid'] ?? '------'; ?></div>
|
||||
<h2 style="margin-bottom: 5px; color: white;"><?php echo $user['username']; ?></h2>
|
||||
<div style="background: rgba(255,255,255,0.05); display: inline-block; padding: 4px 15px; border-radius: 20px; color: var(--text-muted); font-size: 0.85rem; margin-bottom: 25px;">UID: <?php echo $user['uid'] ?: '618120'; ?></div>
|
||||
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; padding-top: 25px; border-top: 1px solid var(--border-color);">
|
||||
<div>
|
||||
<div style="color: var(--text-muted); font-size: 0.8rem; margin-bottom: 5px;"><?php echo __('credit_score', '信用分'); ?></div>
|
||||
<div style="font-weight: bold; font-size: 1.2rem; color: var(--success-color);"><?php echo $user['credit_score'] ?? 80; ?></div>
|
||||
<div style="font-weight: bold; font-size: 1.2rem; color: var(--success-color);"><?php echo $user['credit_score'] ?? 100; ?></div>
|
||||
</div>
|
||||
<div style="border-left: 1px solid var(--border-color);">
|
||||
<div style="color: var(--text-muted); font-size: 0.8rem; margin-bottom: 5px;"><?php echo __('level'); ?></div>
|
||||
<div style="color: var(--text-muted); font-size: 0.8rem; margin-bottom: 5px;"><?php echo __('level', '等级'); ?></div>
|
||||
<div style="font-weight: bold; font-size: 1.2rem; color: #f0b90b;">VIP 0</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -53,7 +53,7 @@ $kyc_colors = [0 => '#888', 1 => '#f0b90b', 2 => 'var(--success-color)', 3 => 'v
|
||||
<div style="background: var(--card-bg); padding: 20px; border-radius: 16px; border: 1px solid var(--border-color);">
|
||||
<a href="kyc.php" style="display: flex; align-items: center; justify-content: space-between; text-decoration: none; color: white;">
|
||||
<div style="display: flex; align-items: center; gap: 15px;">
|
||||
<div style="width: 40px; height: 40px; background: rgba(0,82,255,0.1); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: var(--primary-color);">
|
||||
<div style="width: 40px; height: 40px; background: rgba(79,172,254,0.1); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: var(--primary-color);">
|
||||
<i class="fas fa-id-card"></i>
|
||||
</div>
|
||||
<span style="font-weight: 500;"><?php echo __('kyc_status', '实名认证'); ?></span>
|
||||
@ -68,20 +68,11 @@ $kyc_colors = [0 => '#888', 1 => '#f0b90b', 2 => 'var(--success-color)', 3 => 'v
|
||||
<div style="width: 40px; height: 40px; background: rgba(14,203,129,0.1); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: var(--success-color);">
|
||||
<i class="fas fa-shield-alt"></i>
|
||||
</div>
|
||||
<span style="font-weight: 500;"><?php echo __('security_settings'); ?></span>
|
||||
<span style="font-weight: 500;"><?php echo __('security_settings', '安全设置'); ?></span>
|
||||
</div>
|
||||
<i class="fas fa-chevron-right" style="color: var(--text-muted); font-size: 10px;"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div style="background: var(--card-bg); padding: 20px; border-radius: 16px; border: 1px solid var(--border-color);">
|
||||
<a href="logout.php" style="display: flex; align-items: center; gap: 15px; text-decoration: none; color: var(--danger-color);">
|
||||
<div style="width: 40px; height: 40px; background: rgba(246,70,93,0.1); border-radius: 10px; display: flex; align-items: center; justify-content: center;">
|
||||
<i class="fas fa-sign-out-alt"></i>
|
||||
</div>
|
||||
<span style="font-weight: 500;"><?php echo __('nav_logout', '退出登录'); ?></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -90,7 +81,7 @@ $kyc_colors = [0 => '#888', 1 => '#f0b90b', 2 => 'var(--success-color)', 3 => 'v
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 40px;">
|
||||
<div>
|
||||
<div style="color: var(--text-muted); margin-bottom: 10px; font-size: 14px;"><?php echo __('total_balance', '总资产'); ?> (USDT)</div>
|
||||
<div style="font-size: 3rem; font-weight: bold; letter-spacing: -1px;">
|
||||
<div style="font-size: 3rem; font-weight: bold; letter-spacing: -1px; color: white;">
|
||||
<?php echo number_format($user['balance'] ?? 0, 2); ?>
|
||||
</div>
|
||||
<div style="color: var(--text-muted); font-size: 1rem; margin-top: 5px;">≈ $ <?php echo number_format($user['balance'] ?? 0, 2); ?></div>
|
||||
@ -103,8 +94,8 @@ $kyc_colors = [0 => '#888', 1 => '#f0b90b', 2 => 'var(--success-color)', 3 => 'v
|
||||
|
||||
<div style="margin-top: 50px;">
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 25px;">
|
||||
<h3 style="margin: 0; font-size: 1.5rem;"><?php echo __('asset_details'); ?></h3>
|
||||
<a href="#" style="color: var(--primary-color); text-decoration: none; font-size: 14px;"><?php echo __('transaction_records'); ?> <i class="fas fa-history" style="margin-left: 5px;"></i></a>
|
||||
<h3 style="margin: 0; font-size: 1.5rem; color: white;"><?php echo __('asset_details', '资产详情'); ?></h3>
|
||||
<a href="#" style="color: var(--primary-color); text-decoration: none; font-size: 14px;"><?php echo __('transaction_records', '账单明细'); ?> <i class="fas fa-history" style="margin-left: 5px;"></i></a>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; flex-direction: column; gap: 10px;">
|
||||
@ -118,16 +109,16 @@ $kyc_colors = [0 => '#888', 1 => '#f0b90b', 2 => 'var(--success-color)', 3 => 'v
|
||||
];
|
||||
foreach ($coins as $coin):
|
||||
?>
|
||||
<div style="display: flex; align-items: center; justify-content: space-between; padding: 20px; background: #161a1e; border-radius: 16px; border: 1px solid transparent; transition: 0.2s;" onmouseover="this.style.borderColor='var(--border-color)'" onmouseout="this.style.borderColor='transparent'">
|
||||
<div style="display: flex; align-items: center; justify-content: space-between; padding: 20px; background: rgba(255,255,255,0.02); border-radius: 16px; border: 1px solid transparent; transition: 0.2s;" onmouseover="this.style.borderColor='var(--border-color)'; this.style.background='rgba(255,255,255,0.04)'" onmouseout="this.style.borderColor='transparent'; this.style.background='rgba(255,255,255,0.02)'">
|
||||
<div style="display: flex; align-items: center; gap: 15px;">
|
||||
<img src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/<?php echo strtolower($coin['symbol']); ?>.png" width="40" height="40" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<div>
|
||||
<div style="font-weight: bold; font-size: 1.1rem;"><?php echo $coin['symbol']; ?></div>
|
||||
<div style="font-weight: bold; font-size: 1.1rem; color: white;"><?php echo $coin['symbol']; ?></div>
|
||||
<div style="font-size: 0.8rem; color: var(--text-muted);"><?php echo $coin['name']; ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align: right;">
|
||||
<div style="font-weight: bold; font-family: monospace; font-size: 1.1rem;"><?php echo number_format($coin['balance'], $coin['symbol'] === 'USDT' ? 2 : 4); ?></div>
|
||||
<div style="font-weight: bold; font-family: monospace; font-size: 1.1rem; color: white;"><?php echo number_format($coin['balance'], $coin['symbol'] === 'USDT' ? 2 : 4); ?></div>
|
||||
<div style="font-size: 0.8rem; color: var(--text-muted);">$ <?php echo number_format($coin['balance'] * $coin['price'], 2); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
16
register.php
16
register.php
@ -22,14 +22,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
if ($stmt->fetch()) {
|
||||
$error = "Username already taken.";
|
||||
} else {
|
||||
// Generate unique 6-digit UID
|
||||
$uid = '';
|
||||
while (true) {
|
||||
$uid = str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
|
||||
$checkUid = $pdo->prepare("SELECT id FROM users WHERE uid = ?");
|
||||
$checkUid->execute([$uid]);
|
||||
if (!$checkUid->fetch()) break;
|
||||
}
|
||||
// Generate UID starting from 618120
|
||||
$stmt = $pdo->query("SELECT COUNT(*) FROM users");
|
||||
$count = $stmt->fetchColumn();
|
||||
$uid = 618120 + $count + mt_rand(1, 9); // Add a small random offset to make it look "randomly sorted" but starting from 618120
|
||||
|
||||
// Register and auto-login
|
||||
// Default trading_password is '123456' as requested
|
||||
@ -54,7 +50,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
<main style="background: #0b0e11; min-height: calc(100vh - 64px); display: flex; align-items: center; justify-content: center; padding: 40px 20px;">
|
||||
<div style="width: 100%; max-width: 480px; background: var(--card-bg); padding: 50px; border-radius: 32px; border: 1px solid var(--border-color); box-shadow: 0 20px 40px rgba(0,0,0,0.4);">
|
||||
<h2 style="font-size: 2.2rem; font-weight: 800; margin-bottom: 10px; text-align: center; color: white;">Create Account</h2>
|
||||
<p style="text-align: center; color: var(--text-muted); margin-bottom: 40px;">Join 100+ million traders on Exchange</p>
|
||||
<p style="text-align: center; color: var(--text-muted); margin-bottom: 40px;">Join NovaEx - The Leading Crypto Exchange</p>
|
||||
|
||||
<?php if($error): ?>
|
||||
<div style="background: rgba(246,70,93,0.1); color: var(--danger-color); padding: 15px; border-radius: 12px; margin-bottom: 25px; border: 1px solid var(--danger-color); text-align: center; font-size: 14px;">
|
||||
@ -86,7 +82,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
</div>
|
||||
<div style="margin-bottom: 30px; display: flex; align-items: flex-start; gap: 12px;">
|
||||
<input type="checkbox" required style="margin-top: 4px; accent-color: var(--primary-color);">
|
||||
<span style="font-size: 0.85rem; color: var(--text-muted); line-height: 1.5;">I have read and agree to the <a href="#" style="color: var(--primary-color);">Privacy Policy</a> and <a href="#" style="color: var(--primary-color);">Service Agreement</a>.</span>
|
||||
<span style="font-size: 0.85rem; color: var(--text-muted); line-height: 1.5;">I have read and agree to the <a href="privacy.php" style="color: var(--primary-color);">Privacy Policy</a> and <a href="terms.php" style="color: var(--primary-color);">Terms of Service</a>.</span>
|
||||
</div>
|
||||
<button type="submit" class="btn-primary" style="width: 100%; padding: 18px; font-weight: 800; font-size: 1.1rem; border-radius: 16px; box-shadow: 0 10px 20px rgba(0,82,255,0.2);"><?php echo __('nav_register'); ?></button>
|
||||
</form>
|
||||
|
||||
49
request.php
Normal file
49
request.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php include 'header.php'; ?>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 700px; margin: 0 auto; background: #161a1e; padding: 50px; border-radius: 32px; border: 1px solid #2b3139;">
|
||||
<h1 style="font-size: 2.2rem; margin-bottom: 10px;">Submit a Request</h1>
|
||||
<p style="color: var(--text-muted); margin-bottom: 40px;">Please provide the details of your request and we will get back to you as soon as possible.</p>
|
||||
|
||||
<form action="#" method="POST">
|
||||
<div style="margin-bottom: 25px;">
|
||||
<label style="display: block; margin-bottom: 10px; color: #848e9c; font-size: 0.9rem;">Email Address</label>
|
||||
<input type="email" required placeholder="your@email.com" style="width: 100%; padding: 15px; background: #0b0e11; border: 1px solid #2b3139; color: white; border-radius: 12px; outline: none; box-sizing: border-box;">
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 25px;">
|
||||
<label style="display: block; margin-bottom: 10px; color: #848e9c; font-size: 0.9rem;">Issue Category</label>
|
||||
<select style="width: 100%; padding: 15px; background: #0b0e11; border: 1px solid #2b3139; color: white; border-radius: 12px; outline: none; box-sizing: border-box;">
|
||||
<option>Account Security</option>
|
||||
<option>Deposit/Withdrawal Issue</option>
|
||||
<option>Trading Error</option>
|
||||
<option>Identity Verification (KYC)</option>
|
||||
<option>Bug Report</option>
|
||||
<option>Other</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 25px;">
|
||||
<label style="display: block; margin-bottom: 10px; color: #848e9c; font-size: 0.9rem;">Subject</label>
|
||||
<input type="text" required placeholder="Brief summary of your issue" style="width: 100%; padding: 15px; background: #0b0e11; border: 1px solid #2b3139; color: white; border-radius: 12px; outline: none; box-sizing: border-box;">
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 25px;">
|
||||
<label style="display: block; margin-bottom: 10px; color: #848e9c; font-size: 0.9rem;">Description</label>
|
||||
<textarea rows="6" required placeholder="Please provide as much detail as possible..." style="width: 100%; padding: 15px; background: #0b0e11; border: 1px solid #2b3139; color: white; border-radius: 12px; outline: none; box-sizing: border-box; resize: none;"></textarea>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 30px;">
|
||||
<label style="display: block; margin-bottom: 10px; color: #848e9c; font-size: 0.9rem;">Attachments (Optional)</label>
|
||||
<div style="border: 2px dashed #2b3139; padding: 30px; text-align: center; border-radius: 12px; cursor: pointer;" onmouseover="this.style.borderColor='var(--primary-color)'" onmouseout="this.style.borderColor='#2b3139'">
|
||||
<i class="fas fa-cloud-upload-alt" style="font-size: 2rem; color: #848e9c; margin-bottom: 10px;"></i>
|
||||
<p style="color: #848e9c; margin: 0; font-size: 0.9rem;">Click or drag files to upload</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn-primary" style="width: 100%; padding: 18px; border-radius: 12px; font-weight: bold; font-size: 1.1rem;">Submit Ticket</button>
|
||||
</form>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
457
spot.php
457
spot.php
@ -13,12 +13,26 @@ if ($user_id) {
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="spot-trading-layout" style="display: grid; grid-template-columns: 280px 1fr 300px 300px; height: calc(100vh - 64px); background: #0b0e11; overflow: hidden; color: #EAECEF;">
|
||||
<div style="background: #0b0e11; min-height: calc(100vh - 64px); padding: 10px 20px;">
|
||||
<div class="spot-trading-layout" style="display: grid; grid-template-columns: 280px 1fr 320px; height: calc(100vh - 84px); background: #161a1e; border-radius: 8px; overflow: hidden; color: #EAECEF; font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; border: 1px solid #1e2329;">
|
||||
|
||||
<!-- Column 1: Pairs List -->
|
||||
<div style="border-right: 1px solid #1e2329; display: flex; flex-direction: column; background: #161a1e;">
|
||||
<div style="padding: 15px; border-bottom: 1px solid #1e2329;">
|
||||
<input type="text" id="pair-search" placeholder="Search Markets" style="width: 100%; background: #0b0e11; border: 1px solid #2b3139; color: white; padding: 8px 12px; border-radius: 4px; font-size: 13px;">
|
||||
<div style="padding: 12px; border-bottom: 1px solid #1e2329;">
|
||||
<div style="position: relative; margin-bottom: 12px; display: flex; align-items: center;">
|
||||
<div style="position: relative; width: 100%;">
|
||||
<input type="text" id="pair-search" placeholder="<?php echo __('search_market', '搜索币对'); ?>" style="width: 100%; background: #0b0e11; border: 1px solid #2b3139; color: white; padding: 8px 32px 8px 12px; border-radius: 4px; font-size: 13px; outline: none; transition: border-color 0.2s;" onfocus="this.style.borderColor='#f0b90b'" onblur="this.style.borderColor='#2b3139'">
|
||||
<i class="fas fa-search" style="position: absolute; right: 10px; top: 10px; color: #5e6673; font-size: 14px;"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 15px;">
|
||||
<button class="market-tab active" onclick="switchMarket('all')"><?php echo __('crypto', '加密货币'); ?></button>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; padding: 10px 12px; font-size: 11px; color: #848e9c; justify-content: space-between; border-bottom: 1px solid #1e2329;">
|
||||
<span style="flex: 1.5;"><?php echo __('pair', '币对'); ?></span>
|
||||
<span style="flex: 1; text-align: right;"><?php echo __('price', '价格'); ?></span>
|
||||
<span style="flex: 1; text-align: right;"><?php echo __('change', '涨跌'); ?></span>
|
||||
</div>
|
||||
<div id="pairs-list" style="flex: 1; overflow-y: auto;">
|
||||
<!-- JS Filled -->
|
||||
@ -26,129 +40,192 @@ if ($user_id) {
|
||||
</div>
|
||||
|
||||
<!-- Column 2: K-Line & Orders -->
|
||||
<div style="display: flex; flex-direction: column; border-right: 1px solid #1e2329; overflow: hidden;">
|
||||
<div style="display: flex; flex-direction: column; border-right: 1px solid #1e2329; overflow: hidden; background: #0b0e11;">
|
||||
<!-- Top Info Bar -->
|
||||
<div style="height: 60px; border-bottom: 1px solid #1e2329; display: flex; align-items: center; padding: 0 20px; gap: 30px; background: #161a1e;">
|
||||
<div style="height: 60px; border-bottom: 1px solid #1e2329; display: flex; align-items: center; padding: 0 20px; gap: 20px; background: #161a1e;">
|
||||
<div style="display: flex; align-items: center; gap: 10px;">
|
||||
<img id="current-icon" src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/btc.png" width="24">
|
||||
<span style="font-weight: bold; font-size: 1.1rem;" id="current-pair">BTC/USDT</span>
|
||||
<img id="current-icon" src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/btc.png" width="32" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<div style="display: flex; flex-direction: column;">
|
||||
<span style="font-weight: bold; font-size: 1.1rem; line-height: 1;" id="current-pair">BTC/USDT</span>
|
||||
<span id="top-price" style="font-weight: bold; color: #f6465d; font-size: 1.1rem;">--.---</span>
|
||||
</div>
|
||||
<span id="top-change" style="color: #f6465d; font-size: 0.85rem; margin-top: 15px;">--%</span>
|
||||
</div>
|
||||
<div style="flex: 1;"></div>
|
||||
<div style="display: flex; gap: 20px;">
|
||||
<div class="stat-box"><div id="top-price" style="font-weight: bold; color: #00c087;">--.---</div><div style="font-size: 10px; color: #848e9c;">Price</div></div>
|
||||
<div class="stat-box"><div id="top-change" style="font-weight: bold;">--%</div><div style="font-size: 10px; color: #848e9c;">24h Change</div></div>
|
||||
<div class="stat-box"><div id="top-high" style="color: white;">--.---</div><div style="font-size: 10px; color: #848e9c;">24h High</div></div>
|
||||
<div class="stat-box"><div id="top-low" style="color: white;">--.---</div><div style="font-size: 10px; color: #848e9c;">24h Low</div></div>
|
||||
<div class="stat-box-small">
|
||||
<div style="font-size: 11px; color: #848e9c;"><?php echo __('high_24h', '24h最高'); ?></div>
|
||||
<div id="top-high" style="color: white; font-size: 13px;">--.---</div>
|
||||
</div>
|
||||
<div class="stat-box-small">
|
||||
<div style="font-size: 11px; color: #848e9c;"><?php echo __('low_24h', '24h最低'); ?></div>
|
||||
<div id="top-low" style="color: white; font-size: 13px;">--.---</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- K-Line -->
|
||||
<div id="tradingview_chart" style="flex: 1;"></div>
|
||||
<!-- Orders Tabs -->
|
||||
<div style="height: 300px; border-top: 1px solid #1e2329; display: flex; flex-direction: column; background: #161a1e;">
|
||||
<div style="display: flex; border-bottom: 1px solid #1e2329;">
|
||||
<div class="order-tab active" onclick="switchOrderTab(this, 'open')"><?php echo __('open_orders'); ?></div>
|
||||
<div class="order-tab" onclick="switchOrderTab(this, 'history')"><?php echo __('order_history'); ?></div>
|
||||
<div class="order-tab" onclick="switchOrderTab(this, 'trades')"><?php echo __('trade_history'); ?></div>
|
||||
<div class="order-tab" onclick="switchOrderTab(this, 'funds')"><?php echo __('funds_flow'); ?></div>
|
||||
</div>
|
||||
<div style="flex: 1; overflow-y: auto; padding: 15px;">
|
||||
<table style="width: 100%; font-size: 12px; color: #848e9c; text-align: left;">
|
||||
<thead>
|
||||
|
||||
<!-- Chart Section -->
|
||||
<div style="flex: 2; border-bottom: 1px solid #1e2329; position: relative;">
|
||||
<div id="tradingview_chart" style="width: 100%; height: 100%;"></div>
|
||||
</div>
|
||||
|
||||
<!-- Orders Section -->
|
||||
<div style="flex: 1; display: flex; flex-direction: column; background: #161a1e; overflow: hidden;">
|
||||
<div style="display: flex; gap: 25px; padding: 0 20px; border-bottom: 1px solid #1e2329; height: 40px; align-items: center;">
|
||||
<button class="order-tab-link active" onclick="switchOrderTab(this, 'open')"><?php echo __('current_order', '当前委托'); ?></button>
|
||||
<button class="order-tab-link" onclick="switchOrderTab(this, 'history')"><?php echo __('order_history', '历史委托'); ?></button>
|
||||
</div>
|
||||
<div style="flex: 1; overflow-y: auto;">
|
||||
<div id="orders-empty" style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; opacity: 0.3;">
|
||||
<i class="fas fa-file-invoice" style="font-size: 48px; margin-bottom: 10px;"></i>
|
||||
<div style="font-size: 13px;"><?php echo __('no_records', '暂无委托记录'); ?></div>
|
||||
</div>
|
||||
<table id="orders-table" style="width: 100%; font-size: 12px; color: #848e9c; text-align: left; border-collapse: collapse; display: none;">
|
||||
<thead style="position: sticky; top: 0; background: #161a1e; z-index: 1;">
|
||||
<tr style="border-bottom: 1px solid #1e2329;">
|
||||
<th style="padding-bottom: 8px;">Time</th>
|
||||
<th style="padding-bottom: 8px;">Type</th>
|
||||
<th style="padding-bottom: 8px;">Side</th>
|
||||
<th style="padding-bottom: 8px;">Price</th>
|
||||
<th style="padding-bottom: 8px;">Amount</th>
|
||||
<th style="padding-bottom: 8px;">Filled</th>
|
||||
<th style="padding-bottom: 8px;">Total</th>
|
||||
<th style="padding-bottom: 8px;">Status</th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('symbol', '币种'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('side', '方向'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('price', '价格'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('amount', '数量'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('pnl', '盈亏'); ?></th>
|
||||
<th style="padding: 10px 15px;"><?php echo __('status', '状态'); ?></th>
|
||||
<th style="padding: 10px 15px; text-align: right;"><?php echo __('action', '操作'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="orders-list-body">
|
||||
<tr><td colspan="8" style="text-align: center; padding: 30px; opacity: 0.5;">No active orders</td></tr>
|
||||
<!-- JS Filled -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Column 3: Order Panel -->
|
||||
<div style="border-right: 1px solid #1e2329; background: #161a1e; display: flex; flex-direction: column; padding: 20px;">
|
||||
<div style="font-size: 14px; font-weight: bold; margin-bottom: 20px;"><?php echo __('trade_panel'); ?></div>
|
||||
|
||||
<div style="display: flex; background: #2b3139; border-radius: 4px; margin-bottom: 20px;">
|
||||
<button class="trade-type-btn active" style="flex: 1; padding: 8px; border: none; background: transparent; color: white; cursor: pointer;">Limit</button>
|
||||
<button class="trade-type-btn" style="flex: 1; padding: 8px; border: none; background: transparent; color: #848e9c; cursor: pointer;">Market</button>
|
||||
<!-- Column 3: Order Panel & Recent Trades -->
|
||||
<div style="display: flex; flex-direction: column; background: #161a1e; overflow: hidden;">
|
||||
<!-- Order Panel -->
|
||||
<div style="padding: 0; border-bottom: 1px solid #1e2329; background: #161a1e;">
|
||||
<div style="display: flex; background: #0b0e11; border-bottom: 1px solid #1e2329;">
|
||||
<button class="side-tab buy active" onclick="switchSide('buy')"><?php echo __('buy', '买入'); ?></button>
|
||||
<button class="side-tab sell" onclick="switchSide('sell')"><?php echo __('sell', '卖出'); ?></button>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 10px; font-size: 12px; color: #848e9c; display: flex; justify-content: space-between;">
|
||||
<span>Balance</span>
|
||||
<span style="color: white;"><?php echo number_format($balance, 2); ?> USDT</span>
|
||||
<div style="padding: 15px;">
|
||||
<div style="display: flex; gap: 15px; margin-bottom: 15px; font-size: 13px;">
|
||||
<span id="tab-market" class="type-tab active" onclick="switchTradeType('market')"><?php echo __('market_order', '市价'); ?></span>
|
||||
<span id="tab-limit" class="type-tab" onclick="switchTradeType('limit')"><?php echo __('limit_order', '限价'); ?></span>
|
||||
</div>
|
||||
|
||||
<!-- Buy -->
|
||||
<div style="margin-bottom: 25px;">
|
||||
<div class="input-wrap"><span>Price</span><input type="number" id="buy-price" placeholder="0.00"><span>USDT</span></div>
|
||||
<div class="input-wrap"><span>Amount</span><input type="number" id="buy-amount" placeholder="0.00"><span id="buy-token">BTC</span></div>
|
||||
<div style="margin: 15px 0;"><input type="range" class="slider" style="width: 100%;"></div>
|
||||
<button class="trade-btn buy" onclick="placeOrder('buy')">Buy <span class="buy-symbol">BTC</span></button>
|
||||
<div style="margin-bottom: 12px; font-size: 12px; color: #848e9c; display: flex; justify-content: space-between;">
|
||||
<span><?php echo __('available', '可用'); ?></span>
|
||||
<span style="color: white;"><span id="display-balance"><?php echo number_format($balance, 2); ?></span> USDT</span>
|
||||
</div>
|
||||
|
||||
<!-- Sell -->
|
||||
<div>
|
||||
<div class="input-wrap"><span>Price</span><input type="number" id="sell-price" placeholder="0.00"><span>USDT</span></div>
|
||||
<div class="input-wrap"><span>Amount</span><input type="number" id="sell-amount" placeholder="0.00"><span id="sell-token">BTC</span></div>
|
||||
<div style="margin: 15px 0;"><input type="range" class="slider" style="width: 100%;"></div>
|
||||
<button class="trade-btn sell" onclick="placeOrder('sell')">Sell <span class="sell-symbol">BTC</span></button>
|
||||
<!-- Price Box -->
|
||||
<div class="input-group" style="margin-bottom: 12px;">
|
||||
<span style="position: absolute; left: 12px; top: 12px; color: #848e9c; font-size: 13px;"><?php echo __('price', '价格'); ?></span>
|
||||
<input type="text" id="trade-price-display" value="<?php echo __('market_price', '市价'); ?>" readonly style="width: 100%; background: #2b3139; border: 1px solid #2b3139; color: #848e9c; padding: 12px 12px 12px 60px; border-radius: 4px; outline: none; font-size: 14px; text-align: right;">
|
||||
<input type="number" id="trade-price" placeholder="0.00" style="display: none; width: 100%; background: #2b3139; border: 1px solid #2b3139; color: white; padding: 12px 60px 12px 60px; border-radius: 4px; outline: none; font-size: 14px; text-align: right;">
|
||||
<span style="position: absolute; right: 12px; top: 12px; color: #848e9c; font-size: 13px;">USDT</span>
|
||||
</div>
|
||||
|
||||
<!-- Quantity Box -->
|
||||
<div class="input-group" style="margin-bottom: 15px;">
|
||||
<span style="position: absolute; left: 12px; top: 12px; color: #848e9c; font-size: 13px;"><?php echo __('amount', '数量'); ?></span>
|
||||
<input type="number" id="trade-amount" placeholder="0.00" style="width: 100%; background: #2b3139; border: 1px solid #2b3139; color: white; padding: 12px 60px 12px 60px; border-radius: 4px; outline: none; font-size: 14px; text-align: right;">
|
||||
<span id="amount-unit" style="position: absolute; right: 12px; top: 12px; color: #848e9c; font-size: 13px;">USDT</span>
|
||||
</div>
|
||||
|
||||
<!-- Percentage Slider -->
|
||||
<div style="margin-bottom: 20px;">
|
||||
<div style="position: relative; height: 20px; display: flex; align-items: center;">
|
||||
<input type="range" class="custom-slider" min="0" max="100" value="0" id="trade-slider" oninput="updateFromSlider(this.value)">
|
||||
<div class="slider-marks">
|
||||
<span onclick="setPercent(0)"></span>
|
||||
<span onclick="setPercent(25)"></span>
|
||||
<span onclick="setPercent(50)"></span>
|
||||
<span onclick="setPercent(75)"></span>
|
||||
<span onclick="setPercent(100)"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Column 4: Order Book -->
|
||||
<div style="background: #161a1e; display: flex; flex-direction: column;">
|
||||
<div style="padding: 15px; border-bottom: 1px solid #1e2329; font-size: 14px; font-weight: bold;">Order Book</div>
|
||||
<div style="padding: 10px 15px; font-size: 11px; color: #848e9c; display: flex; justify-content: space-between;">
|
||||
<span>Price(USDT)</span>
|
||||
<span>Amount(BTC)</span>
|
||||
<button class="main-action-btn buy" id="main-trade-btn" onclick="executeOrder()"><?php echo __('buy', '买入'); ?> <span class="symbol-text">BTC</span></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Recent Trades -->
|
||||
<div style="flex: 1; display: flex; flex-direction: column; overflow: hidden;">
|
||||
<div style="padding: 12px 15px; font-size: 13px; font-weight: bold; border-bottom: 1px solid #1e2329;">
|
||||
<?php echo __('recent_trades', '最新成交'); ?>
|
||||
</div>
|
||||
<div style="padding: 8px 15px; font-size: 11px; color: #848e9c; display: flex; justify-content: space-between;">
|
||||
<span style="flex: 1;"><?php echo __('time', '时间'); ?></span>
|
||||
<span style="flex: 1; text-align: center;"><?php echo __('price', '价格'); ?></span>
|
||||
<span style="flex: 1; text-align: right;"><?php echo __('amount', '数量'); ?></span>
|
||||
</div>
|
||||
<div id="recent-trades-list" style="flex: 1; overflow-y: auto;">
|
||||
<!-- JS Filled -->
|
||||
</div>
|
||||
</div>
|
||||
<div style="flex: 1; overflow: hidden; display: flex; flex-direction: column;">
|
||||
<div id="asks" style="flex: 1; display: flex; flex-direction: column-reverse; padding: 0 15px; overflow: hidden; font-family: monospace;"></div>
|
||||
<div id="mid-price" style="padding: 12px; text-align: center; font-size: 1.1rem; font-weight: bold; color: #00c087; background: rgba(255,255,255,0.03);">--.---</div>
|
||||
<div id="bids" style="flex: 1; display: flex; flex-direction: column; padding: 0 15px; overflow: hidden; font-family: monospace;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.stat-box { border-left: 1px solid #2b3139; padding-left: 15px; display: flex; flex-direction: column; }
|
||||
.order-tab { padding: 10px 15px; font-size: 12px; color: #848e9c; cursor: pointer; border-bottom: 2px solid transparent; }
|
||||
.order-tab.active { color: var(--primary-color); border-bottom-color: var(--primary-color); }
|
||||
.input-wrap { background: #0b0e11; border: 1px solid #2b3139; border-radius: 4px; padding: 8px 12px; display: flex; align-items: center; margin-bottom: 12px; gap: 10px; }
|
||||
.input-wrap span { font-size: 12px; color: #848e9c; white-space: nowrap; width: 45px; }
|
||||
.input-wrap input { background: transparent; border: none; color: white; flex: 1; text-align: right; outline: none; font-weight: bold; }
|
||||
.trade-btn { width: 100%; padding: 12px; border: none; border-radius: 4px; font-weight: bold; cursor: pointer; color: white; }
|
||||
.trade-btn.buy { background: #00c087; }
|
||||
.trade-btn.sell { background: #f6465d; }
|
||||
.slider { -webkit-appearance: none; height: 3px; background: #2b3139; border-radius: 2px; }
|
||||
.slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; background: white; border-radius: 50%; }
|
||||
.market-tab { background: transparent; border: none; color: #848e9c; font-size: 13px; font-weight: bold; padding: 5px 0; cursor: pointer; border-bottom: 2px solid transparent; }
|
||||
.market-tab.active { color: #f0b90b; border-bottom-color: #f0b90b; }
|
||||
.stat-box-small { display: flex; flex-direction: column; align-items: flex-end; }
|
||||
.order-tab-link { background: transparent; border: none; color: #848e9c; font-size: 13px; font-weight: bold; cursor: pointer; padding: 0; border-bottom: 2px solid transparent; height: 100%; transition: color 0.2s; }
|
||||
.order-tab-link.active { color: #f0b90b; border-bottom-color: #f0b90b; }
|
||||
|
||||
.side-tab { flex: 1; border: none; padding: 12px; font-weight: bold; cursor: pointer; background: transparent; color: #848e9c; font-size: 15px; transition: 0.2s; }
|
||||
.side-tab.buy.active { color: #00c087; background: rgba(0, 192, 135, 0.1); border-bottom: 2px solid #00c087; }
|
||||
.side-tab.sell.active { color: #f6465d; background: rgba(246, 70, 93, 0.1); border-bottom: 2px solid #f6465d; }
|
||||
|
||||
.type-tab { cursor: pointer; color: #848e9c; padding-bottom: 2px; border-bottom: 2px solid transparent; }
|
||||
.type-tab.active { color: #f0b90b; border-bottom-color: #f0b90b; }
|
||||
|
||||
.input-group { position: relative; width: 100%; }
|
||||
|
||||
.main-action-btn { width: 100%; padding: 12px; border: none; border-radius: 4px; font-weight: bold; cursor: pointer; color: white; font-size: 15px; transition: 0.2s; }
|
||||
.main-action-btn.buy { background: #00c087; }
|
||||
.main-action-btn.buy:hover { background: #00d696; }
|
||||
.main-action-btn.sell { background: #f6465d; }
|
||||
.main-action-btn.sell:hover { background: #ff526a; }
|
||||
|
||||
.custom-slider { -webkit-appearance: none; width: 100%; height: 4px; background: #2b3139; border-radius: 2px; outline: none; z-index: 2; position: relative; }
|
||||
.custom-slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; background: white; border-radius: 50%; cursor: pointer; border: 2px solid #f0b90b; }
|
||||
|
||||
.slider-marks { position: absolute; left: 0; right: 0; top: 0; bottom: 0; display: flex; justify-content: space-between; align-items: center; padding: 0 2px; z-index: 1; pointer-events: none; }
|
||||
.slider-marks span { width: 6px; height: 6px; background: #2b3139; border-radius: 50%; border: 1px solid #1e2329; pointer-events: auto; cursor: pointer; }
|
||||
.slider-marks span:hover { background: #f0b90b; }
|
||||
|
||||
.trade-row { display: flex; padding: 4px 15px; font-size: 11px; }
|
||||
.trade-row span { flex: 1; }
|
||||
</style>
|
||||
|
||||
<script type="text/javascript" src="https://s3.tradingview.com/tv.js"></script>
|
||||
<script>
|
||||
let currentSymbol = 'BTCUSDT';
|
||||
let currentPrice = 0;
|
||||
const pairs = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'XRPUSDT', 'ADAUSDT', 'DOGEUSDT', 'DOTUSDT', 'LINKUSDT', 'LTCUSDT', 'MATICUSDT'];
|
||||
let currentSide = 'buy';
|
||||
let currentTradeType = 'market';
|
||||
let currentOrderTab = 'open';
|
||||
let marketData = {};
|
||||
let pairs = ['BTCUSDT', 'ETHUSDT', 'XRPUSDT', 'LTCUSDT', 'BNBUSDT', 'SOLUSDT', 'TRXUSDT', 'LINKUSDT', 'RUNEUSDT', 'COMPUSDT', 'DOGEUSDT', 'RAYUSDT', 'DGBUSDT', 'COTIUSDT', 'KAVAUSDT', 'LRCUSDT', 'PEPEUSDT', 'FLOKIUSDT', 'SHIBUSDT', 'AVAXUSDT'];
|
||||
|
||||
function initChart(symbol) {
|
||||
new TradingView.widget({
|
||||
"width": "100%", "height": "100%", "symbol": "BINANCE:" + symbol, "interval": "15", "timezone": "Etc/UTC", "theme": "dark", "style": "1", "locale": "<?php echo $lang == 'zh' ? 'zh_CN' : 'en'; ?>", "container_id": "tradingview_chart", "backgroundColor": "#0b0e11", "gridColor": "rgba(42, 46, 57, 0.05)", "hide_side_toolbar": false, "allow_symbol_change": false, "save_image": false
|
||||
"width": "100%", "height": "100%", "symbol": "BINANCE:" + symbol, "interval": "1", "timezone": "Etc/UTC", "theme": "dark", "style": "1", "locale": "zh_CN", "container_id": "tradingview_chart", "backgroundColor": "#0b0e11", "gridColor": "rgba(42, 46, 57, 0.05)", "hide_side_toolbar": false, "allow_symbol_change": false, "save_image": false, "toolbar_bg": "#161a1e"
|
||||
});
|
||||
}
|
||||
initChart(currentSymbol);
|
||||
|
||||
const ws = new WebSocket('wss://stream.binance.com:9443/ws/' + pairs.map(p => p.toLowerCase() + '@ticker').join('/'));
|
||||
const marketData = {};
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
let socket;
|
||||
function connectWS() {
|
||||
if (socket) socket.close();
|
||||
socket = new WebSocket('wss://stream.binance.com:9443/ws/' + pairs.map(p => p.toLowerCase() + '@ticker').join('/'));
|
||||
socket.onmessage = (event) => {
|
||||
const data = JSON.parse(event.data);
|
||||
const s = data.s;
|
||||
marketData[s] = data;
|
||||
@ -162,70 +239,230 @@ if ($user_id) {
|
||||
document.getElementById('top-change').style.color = data.P >= 0 ? '#00c087' : '#f6465d';
|
||||
document.getElementById('top-high').innerText = parseFloat(data.h).toLocaleString();
|
||||
document.getElementById('top-low').innerText = parseFloat(data.l).toLocaleString();
|
||||
document.getElementById('mid-price').innerText = currentPrice.toLocaleString();
|
||||
updateOrderBook(currentPrice);
|
||||
|
||||
addRandomTrade(currentPrice);
|
||||
}
|
||||
};
|
||||
}
|
||||
connectWS();
|
||||
|
||||
function renderPairsList() {
|
||||
const list = document.getElementById('pairs-list');
|
||||
const searchTerm = document.getElementById('pair-search').value.toUpperCase();
|
||||
if (!list) return;
|
||||
let html = '';
|
||||
pairs.forEach(p => {
|
||||
if (searchTerm && !p.includes(searchTerm)) return;
|
||||
const d = marketData[p] || {c: 0, P: 0};
|
||||
const color = d.P >= 0 ? '#00c087' : '#f6465d';
|
||||
const name = p.replace('USDT', '');
|
||||
html += `
|
||||
<div onclick="changePair('${p}')" style="display: flex; justify-content: space-between; padding: 12px 15px; cursor: pointer; border-bottom: 1px solid #1e2329; ${currentSymbol === p ? 'background: #2b3139;' : ''}">
|
||||
<div style="display: flex; gap: 8px; align-items: center;">
|
||||
<img src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png" width="18" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<span style="font-weight: bold; font-size: 13px;">${name}</span>
|
||||
</div>
|
||||
<div style="text-align: right;">
|
||||
<div style="font-size: 13px;">${parseFloat(d.c).toLocaleString()}</div>
|
||||
<div style="color: ${color}; font-size: 11px;">${d.P >= 0 ? '+' : ''}${d.P}%</div>
|
||||
<div onclick="changePair('${p}')" style="display: flex; justify-content: space-between; padding: 10px 12px; cursor: pointer; border-bottom: 1px solid #1e2329; ${currentSymbol === p ? 'background: #2b3139;' : ''} transition: background 0.2s;">
|
||||
<div style="display: flex; align-items: center; gap: 8px; flex: 1.5;">
|
||||
<img src="https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png" width="20" height="20" onerror="this.src='https://cdn-icons-png.flaticon.com/512/2585/2585274.png'">
|
||||
<span style="font-weight: bold; font-size: 13px;">${name}/USDT</span>
|
||||
</div>
|
||||
<span style="font-size: 13px; flex: 1; text-align: right;">${parseFloat(d.c).toLocaleString()}</span>
|
||||
<span style="color: ${color}; font-size: 13px; flex: 1; text-align: right;">${d.P >= 0 ? '+' : ''}${d.P}%</span>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
list.innerHTML = html;
|
||||
}
|
||||
|
||||
function changePair(pair) {
|
||||
async function changePair(pair) {
|
||||
if (!pair.includes('USDT')) pair = pair + 'USDT';
|
||||
currentSymbol = pair;
|
||||
const name = pair.replace('USDT', '');
|
||||
document.getElementById('current-pair').innerText = name + '/USDT';
|
||||
document.getElementById('current-icon').src = `https://raw.githubusercontent.com/spothq/cryptocurrency-icons/master/128/color/${name.toLowerCase()}.png`;
|
||||
document.getElementById('buy-token').innerText = name;
|
||||
document.getElementById('sell-token').innerText = name;
|
||||
document.querySelectorAll('.buy-symbol, .sell-symbol').forEach(el => el.innerText = name);
|
||||
document.querySelectorAll('.symbol-text').forEach(el => el.innerText = name);
|
||||
initChart(pair);
|
||||
renderPairsList();
|
||||
document.getElementById('recent-trades-list').innerHTML = '';
|
||||
document.getElementById('trade-price').value = '';
|
||||
document.getElementById('trade-amount').value = '';
|
||||
document.getElementById('trade-slider').value = 0;
|
||||
}
|
||||
|
||||
function updateOrderBook(price) {
|
||||
let asksHtml = ''; let bidsHtml = '';
|
||||
for(let i=1; i<=20; i++) {
|
||||
const askPrice = (price + (i * 0.01 * price / 100)).toFixed(2);
|
||||
const bidPrice = (price - (i * 0.01 * price / 100)).toFixed(2);
|
||||
asksHtml += `<div style="display: flex; justify-content: space-between; font-size: 11px; padding: 2px 0;"><span style="color: #f6465d;">${askPrice}</span><span style="color: #848e9c;">${(Math.random()*1).toFixed(4)}</span></div>`;
|
||||
bidsHtml += `<div style="display: flex; justify-content: space-between; font-size: 11px; padding: 2px 0;"><span style="color: #00c087;">${bidPrice}</span><span style="color: #848e9c;">${(Math.random()*1).toFixed(4)}</span></div>`;
|
||||
}
|
||||
document.getElementById('asks').innerHTML = asksHtml;
|
||||
document.getElementById('bids').innerHTML = bidsHtml;
|
||||
function switchSide(side) {
|
||||
currentSide = side;
|
||||
document.querySelectorAll('.side-tab').forEach(btn => btn.classList.remove('active'));
|
||||
document.querySelector('.side-tab.' + side).classList.add('active');
|
||||
const btn = document.getElementById('main-trade-btn');
|
||||
btn.className = 'main-action-btn ' + side;
|
||||
btn.innerHTML = (side === 'buy' ? '<?php echo __("buy", "买入"); ?>' : '<?php echo __("sell", "卖出"); ?>') + ' <span class="symbol-text">' + currentSymbol.replace('USDT', '') + '</span>';
|
||||
updateFromSlider(document.getElementById('trade-slider').value);
|
||||
}
|
||||
|
||||
async function placeOrder(side) {
|
||||
const price = parseFloat(document.getElementById(side + '-price').value) || currentPrice;
|
||||
const amount = parseFloat(document.getElementById(side + '-amount').value);
|
||||
function switchTradeType(type) {
|
||||
currentTradeType = type;
|
||||
document.getElementById('tab-market').classList.toggle('active', type === 'market');
|
||||
document.getElementById('tab-limit').classList.toggle('active', type === 'limit');
|
||||
|
||||
if (type === 'market') {
|
||||
document.getElementById('trade-price').style.display = 'none';
|
||||
document.getElementById('trade-price-display').style.display = 'block';
|
||||
document.getElementById('amount-unit').innerText = 'USDT';
|
||||
} else {
|
||||
document.getElementById('trade-price').style.display = 'block';
|
||||
document.getElementById('trade-price-display').style.display = 'none';
|
||||
document.getElementById('trade-price').value = currentPrice;
|
||||
document.getElementById('amount-unit').innerText = currentSymbol.replace('USDT', '');
|
||||
}
|
||||
}
|
||||
|
||||
function setPercent(p) {
|
||||
document.getElementById('trade-slider').value = p;
|
||||
updateFromSlider(p);
|
||||
}
|
||||
|
||||
function updateFromSlider(val) {
|
||||
const balance = <?php echo $balance; ?>;
|
||||
const mockAssetBalance = 1.5;
|
||||
|
||||
if (currentSide === 'buy') {
|
||||
const spend = (balance * val / 100);
|
||||
if (currentTradeType === 'market') {
|
||||
document.getElementById('trade-amount').value = spend.toFixed(2);
|
||||
} else {
|
||||
const price = parseFloat(document.getElementById('trade-price').value) || currentPrice;
|
||||
document.getElementById('trade-amount').value = (spend / price).toFixed(6);
|
||||
}
|
||||
} else {
|
||||
const sellAmount = (mockAssetBalance * val / 100);
|
||||
if (currentTradeType === 'market') {
|
||||
document.getElementById('trade-amount').value = (sellAmount * currentPrice).toFixed(2);
|
||||
} else {
|
||||
document.getElementById('trade-amount').value = sellAmount.toFixed(6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function addRandomTrade(price) {
|
||||
const list = document.getElementById('recent-trades-list');
|
||||
const now = new Date();
|
||||
const time = now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0') + ':' + now.getSeconds().toString().padStart(2, '0');
|
||||
const side = Math.random() > 0.5 ? 'buy' : 'sell';
|
||||
const color = side === 'buy' ? '#00c087' : '#f6465d';
|
||||
const amount = (Math.random() * 2).toFixed(4);
|
||||
|
||||
const row = document.createElement('div');
|
||||
row.className = 'trade-row';
|
||||
row.innerHTML = `
|
||||
<span style="color: #848e9c;">${time}</span>
|
||||
<span style="color: ${color}; text-align: center;">${price.toLocaleString()}</span>
|
||||
<span style="text-align: right;">${amount}</span>
|
||||
`;
|
||||
list.prepend(row);
|
||||
if (list.children.length > 20) list.lastElementChild.remove();
|
||||
}
|
||||
|
||||
async function executeOrder() {
|
||||
const price = currentTradeType === 'market' ? currentPrice : parseFloat(document.getElementById('trade-price').value);
|
||||
let amount = parseFloat(document.getElementById('trade-amount').value);
|
||||
if (!amount) return alert('Please enter amount');
|
||||
|
||||
let total = amount;
|
||||
if (currentTradeType === 'limit') {
|
||||
total = amount * price;
|
||||
} else {
|
||||
if (document.getElementById('amount-unit').innerText === 'USDT') {
|
||||
amount = amount / price;
|
||||
} else {
|
||||
total = amount * price;
|
||||
}
|
||||
}
|
||||
|
||||
const response = await fetch('api/place_order.php', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ symbol: currentSymbol, type: 'spot', side: side, order_type: 'limit', price: price, amount: amount, total: price * amount })
|
||||
body: JSON.stringify({
|
||||
symbol: currentSymbol,
|
||||
type: 'spot',
|
||||
side: currentSide,
|
||||
order_type: currentTradeType,
|
||||
price: price,
|
||||
amount: amount,
|
||||
total: total
|
||||
})
|
||||
});
|
||||
const result = await response.json();
|
||||
if (result.success) { alert('Order placed!'); location.reload(); } else { alert('Error: ' + result.error); }
|
||||
if (result.success) {
|
||||
alert('Order placed successfully!');
|
||||
fetchOrders();
|
||||
} else {
|
||||
alert('Error: ' + result.error);
|
||||
}
|
||||
}
|
||||
|
||||
function switchOrderTab(el, tab) {
|
||||
currentOrderTab = tab;
|
||||
document.querySelectorAll('.order-tab-link').forEach(t => t.classList.remove('active'));
|
||||
el.classList.add('active');
|
||||
fetchOrders();
|
||||
}
|
||||
|
||||
async function fetchOrders() {
|
||||
const response = await fetch(`api/get_orders.php?type=spot&status=${currentOrderTab}`);
|
||||
const result = await response.json();
|
||||
const tbody = document.getElementById('orders-list-body');
|
||||
const table = document.getElementById('orders-table');
|
||||
const empty = document.getElementById('orders-empty');
|
||||
|
||||
if (result.success && result.data.length > 0) {
|
||||
table.style.display = 'table';
|
||||
empty.style.display = 'none';
|
||||
let html = '';
|
||||
result.data.forEach(o => {
|
||||
const color = o.side === 'buy' ? '#00c087' : '#f6465d';
|
||||
let pnl = '0.00';
|
||||
let pnlColor = '#848e9c';
|
||||
if (o.win_loss === 'win') {
|
||||
pnl = '+' + (o.total * 0.05).toFixed(2);
|
||||
pnlColor = '#00c087';
|
||||
} else if (o.win_loss === 'loss') {
|
||||
pnl = '-' + (o.total * 0.05).toFixed(2);
|
||||
pnlColor = '#f6465d';
|
||||
}
|
||||
|
||||
html += `
|
||||
<tr style="border-bottom: 1px solid #1e2329;">
|
||||
<td style="padding: 10px 15px; color: white; font-weight: bold;">${o.symbol}</td>
|
||||
<td style="padding: 10px 15px; color: ${color}; font-weight: bold;">${o.side === 'buy' ? '买入' : '卖出'}</td>
|
||||
<td style="padding: 10px 15px;">${parseFloat(o.price).toLocaleString()}</td>
|
||||
<td style="padding: 10px 15px;">${parseFloat(o.amount).toFixed(6)}</td>
|
||||
<td style="padding: 10px 15px; color: ${pnlColor}; font-weight: bold;">${pnl} USDT</td>
|
||||
<td style="padding: 10px 15px;"><span style="background: rgba(255,255,255,0.05); padding: 2px 6px; border-radius: 2px;">${o.status === 'open' ? '进行中' : '已完成'}</span></td>
|
||||
<td style="padding: 10px 15px; text-align: right;">
|
||||
${o.status === 'open' ? `<button onclick="cancelOrder(${o.id})" style="background: rgba(246, 70, 93, 0.1); border: 1px solid #f6465d; color: #f6465d; padding: 2px 8px; border-radius: 4px; cursor: pointer; font-size: 11px;">取消</button>` : '--'}
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
});
|
||||
tbody.innerHTML = html;
|
||||
} else {
|
||||
table.style.display = 'none';
|
||||
empty.style.display = 'flex';
|
||||
}
|
||||
}
|
||||
|
||||
async function cancelOrder(id) {
|
||||
if (!confirm('确定取消?')) return;
|
||||
const response = await fetch('api/cancel_order.php', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ order_id: id })
|
||||
});
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
fetchOrders();
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('pair-search').addEventListener('input', renderPairsList);
|
||||
fetchOrders();
|
||||
setInterval(fetchOrders, 5000);
|
||||
</script>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
44
status.php
Normal file
44
status.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php include 'header.php'; ?>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 800px; margin: 0 auto;">
|
||||
<div style="background: rgba(14,203,129,0.1); border: 1px solid var(--success-color); padding: 30px; border-radius: 24px; text-align: center; margin-bottom: 50px;">
|
||||
<i class="fas fa-check-circle" style="font-size: 3rem; color: var(--success-color); margin-bottom: 15px;"></i>
|
||||
<h1 style="font-size: 2rem; margin-bottom: 10px;">All Systems Operational</h1>
|
||||
<p style="color: var(--text-muted);">Last checked: <?php echo date('Y-m-d H:i:s'); ?> UTC</p>
|
||||
</div>
|
||||
|
||||
<div style="background: #161a1e; border-radius: 24px; border: 1px solid #2b3139; padding: 40px;">
|
||||
<h2 style="font-size: 1.5rem; margin-bottom: 30px;">Service Status</h2>
|
||||
|
||||
<div style="display: flex; flex-direction: column; gap: 25px;">
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 20px; border-bottom: 1px solid #2b3139;">
|
||||
<span style="font-weight: 500;">Trading Engine</span>
|
||||
<span style="background: rgba(14,203,129,0.2); color: var(--success-color); padding: 5px 15px; border-radius: 20px; font-size: 0.8rem; font-weight: bold;">OPERATIONAL</span>
|
||||
</div>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 20px; border-bottom: 1px solid #2b3139;">
|
||||
<span style="font-weight: 500;">Matching System</span>
|
||||
<span style="background: rgba(14,203,129,0.2); color: var(--success-color); padding: 5px 15px; border-radius: 20px; font-size: 0.8rem; font-weight: bold;">OPERATIONAL</span>
|
||||
</div>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 20px; border-bottom: 1px solid #2b3139;">
|
||||
<span style="font-weight: 500;">API Access</span>
|
||||
<span style="background: rgba(14,203,129,0.2); color: var(--success-color); padding: 5px 15px; border-radius: 20px; font-size: 0.8rem; font-weight: bold;">OPERATIONAL</span>
|
||||
</div>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 20px; border-bottom: 1px solid #2b3139;">
|
||||
<span style="font-weight: 500;">Deposits & Withdrawals</span>
|
||||
<span style="background: rgba(14,203,129,0.2); color: var(--success-color); padding: 5px 15px; border-radius: 20px; font-size: 0.8rem; font-weight: bold;">OPERATIONAL</span>
|
||||
</div>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<span style="font-weight: 500;">Mobile App</span>
|
||||
<span style="background: rgba(14,203,129,0.2); color: var(--success-color); padding: 5px 15px; border-radius: 20px; font-size: 0.8rem; font-weight: bold;">OPERATIONAL</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 50px; text-align: center; color: var(--text-muted); font-size: 0.9rem;">
|
||||
<p>Subscribe to updates via <a href="#" style="color: var(--primary-color);">Email</a> or <a href="#" style="color: var(--primary-color);">RSS</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
52
terms.php
52
terms.php
@ -1,16 +1,44 @@
|
||||
<?php include 'header.php'; ?>
|
||||
<div class="container" style="max-width: 1000px; margin: 60px auto; padding: 0 20px;">
|
||||
<h1 style="font-size: 2.5rem; margin-bottom: 40px;"><?php echo __('terms_service'); ?></h1>
|
||||
<div style="background: var(--card-bg); padding: 40px; border-radius: 24px; border: 1px solid var(--border-color); color: #ccc; line-height: 1.6;">
|
||||
<p>Last Updated: February 2026</p>
|
||||
<h3 style="color: white;">1. Acceptance of Terms</h3>
|
||||
<p>By accessing or using the Exchange platform, you agree to be bound by these Terms of Service. If you do not agree to all of these terms, do not use our services.</p>
|
||||
<h3 style="color: white; margin-top: 30px;">2. Eligibility</h3>
|
||||
<p>You must be at least 18 years old and have the legal capacity to enter into these Terms. Use of the services is void where prohibited by law.</p>
|
||||
<h3 style="color: white; margin-top: 30px;">3. Risk Disclosure</h3>
|
||||
<p>Trading cryptocurrencies involves significant risk and can result in the loss of your invested capital. You should only trade with funds you can afford to lose.</p>
|
||||
<h3 style="color: white; margin-top: 30px;">4. Account Security</h3>
|
||||
<p>You are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account.</p>
|
||||
|
||||
<main style="background: #0b0e11; color: white; min-height: 100vh; padding: 100px 5%;">
|
||||
<div style="max-width: 900px; margin: 0 auto; background: #161a1e; padding: 60px; border-radius: 32px; border: 1px solid #2b3139;">
|
||||
<h1 style="font-size: 2.5rem; margin-bottom: 20px;">Terms of Service</h1>
|
||||
<p style="color: var(--text-muted); margin-bottom: 40px;">Effective Date: February 2026</p>
|
||||
|
||||
<div style="background: rgba(246,70,93,0.1); border-left: 4px solid var(--danger-color); padding: 20px; border-radius: 8px; margin-bottom: 40px;">
|
||||
<p style="color: var(--danger-color); font-weight: bold; margin-bottom: 5px;">Risk Warning:</p>
|
||||
<p style="font-size: 0.9rem; color: #EAECEF; line-height: 1.6;">Trading cryptocurrencies involves significant risk and can result in the loss of your invested capital. You should not invest more than you can afford to lose and should ensure that you fully understand the risks involved.</p>
|
||||
</div>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.6rem; margin-bottom: 15px;">1. Agreement to Terms</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">By accessing or using the NovaEx platform, you agree to be bound by these Terms of Service and all applicable laws and regulations. If you do not agree with any of these terms, you are prohibited from using this site.</p>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.6rem; margin-bottom: 15px;">2. Eligibility</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">You must be at least 18 years old and have the legal capacity to enter into this agreement. By using NovaEx, you represent that you are not on any trade embargo or economic sanctions lists.</p>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.6rem; margin-bottom: 15px;">3. Account Security</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">You are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account. You must notify us immediately of any unauthorized use of your account.</p>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.6rem; margin-bottom: 15px;">4. Prohibited Activities</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">You agree not to engage in market manipulation, money laundering, or any other illegal activity using our platform. We reserve the right to suspend or terminate accounts found in violation of these terms.</p>
|
||||
</section>
|
||||
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 1.6rem; margin-bottom: 15px;">5. Limitation of Liability</h2>
|
||||
<p style="color: var(--text-muted); line-height: 1.8;">NovaEx shall not be liable for any indirect, incidental, special, or consequential damages arising out of or in connection with your use of the platform, including but not limited to trading losses.</p>
|
||||
</section>
|
||||
|
||||
<div style="margin-top: 60px; text-align: center;">
|
||||
<p style="color: var(--text-muted);">Please read these terms carefully before using our services.</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
Loading…
x
Reference in New Issue
Block a user