diff --git a/admin/auth.php b/admin/auth.php
new file mode 100644
index 0000000..58357f6
--- /dev/null
+++ b/admin/auth.php
@@ -0,0 +1,13 @@
+
diff --git a/admin/categories.php b/admin/categories.php
new file mode 100644
index 0000000..9ce9bd2
--- /dev/null
+++ b/admin/categories.php
@@ -0,0 +1,118 @@
+prepare("DELETE FROM categories WHERE id = ?");
+ $stmt->execute([$_GET['delete']]);
+ header("Location: categories.php");
+ exit;
+}
+
+// Handle Add/Edit
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ $id = $_POST['id'] ?? null;
+ $name = $_POST['name'];
+ $icon = $_POST['icon'];
+
+ if ($id) {
+ $stmt = $db->prepare("UPDATE categories SET name=?, icon=? WHERE id=?");
+ $stmt->execute([$name, $icon, $id]);
+ } else {
+ $stmt = $db->prepare("INSERT INTO categories (name, icon) VALUES (?, ?)");
+ $stmt->execute([$name, $icon]);
+ }
+ header("Location: categories.php");
+ exit;
+}
+
+$categories = $db->query("SELECT * FROM categories ORDER BY id ASC")->fetchAll();
+
+$edit_cat = null;
+if (isset($_GET['edit'])) {
+ $stmt = $db->prepare("SELECT * FROM categories WHERE id = ?");
+ $stmt->execute([$_GET['edit']]);
+ $edit_cat = $stmt->fetch();
+}
+?>
+
+
+
+
+ 分类管理 - 豪软后台
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 图标
+ 分类名称
+ 操作
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/admin/index.php b/admin/index.php
new file mode 100644
index 0000000..d77b1be
--- /dev/null
+++ b/admin/index.php
@@ -0,0 +1,107 @@
+query("SELECT COUNT(*) FROM orders")->fetchColumn();
+$stats['total_sales'] = $db->query("SELECT SUM(total_amount) FROM orders WHERE status = 'completed'")->fetchColumn() ?: 0;
+$stats['products_count'] = $db->query("SELECT COUNT(*) FROM products")->fetchColumn();
+$stats['users_count'] = $db->query("SELECT COUNT(*) FROM users")->fetchColumn();
+
+$recent_orders = $db->query("SELECT * FROM orders ORDER BY id DESC LIMIT 5")->fetchAll();
+?>
+
+
+
+
+ 管理后台 - 豪软世界
+
+
+
+
+
+
+
+
+
+
数据总览
+
+
+
+
最新订单
+
+
+
+ 订单号
+ 联系方式
+ 金额
+ 状态
+ 日期
+ 操作
+
+
+
+
+
+
+
+ USDT
+
+
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
diff --git a/admin/orders.php b/admin/orders.php
new file mode 100644
index 0000000..b2eeb17
--- /dev/null
+++ b/admin/orders.php
@@ -0,0 +1,158 @@
+prepare("UPDATE orders SET status = ? WHERE id = ?");
+ $stmt->execute([$_POST['status'], $_POST['order_id']]);
+ header("Location: orders.php" . (isset($_GET['id']) ? "?id=".$_POST['order_id'] : ""));
+ exit;
+}
+
+$view_order = null;
+if (isset($_GET['id'])) {
+ $stmt = $db->prepare("SELECT * FROM orders WHERE id = ?");
+ $stmt->execute([$_GET['id']]);
+ $view_order = $stmt->fetch();
+
+ if ($view_order) {
+ $stmt = $db->prepare("SELECT oi.*, p.name FROM order_items oi JOIN products p ON oi.product_id = p.id WHERE oi.order_id = ?");
+ $stmt->execute([$view_order['id']]);
+ $view_order['items'] = $stmt->fetchAll();
+ }
+}
+
+$orders = $db->query("SELECT * FROM orders ORDER BY id DESC")->fetchAll();
+?>
+
+
+
+
+ 订单管理 - 豪软后台
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
商品列表
+
+
+
+ 商品
+ 单价
+ 数量
+ 小计
+
+
+
+
+
+
+ USDT
+
+ USDT
+
+
+
+
+
+ 合计金额
+ USDT
+
+
+
+
+
+
+
+
+
客户信息
+
联系方式:
+
下单时间:
+
支付方式:
+
+
+
+
+
+
订单管理
+
+
+
+
+ 订单号
+ 联系方式
+ 金额
+ 状态
+ 日期
+ 操作
+
+
+
+
+
+
+
+ USDT
+
+
+
+
+
+
+ 查看详情
+
+
+
+
+
+
+
+
+
+
+
diff --git a/admin/products.php b/admin/products.php
new file mode 100644
index 0000000..640c732
--- /dev/null
+++ b/admin/products.php
@@ -0,0 +1,176 @@
+prepare("DELETE FROM products WHERE id = ?");
+ $stmt->execute([$_GET['delete']]);
+ header("Location: products.php");
+ exit;
+}
+
+// Handle Add/Edit
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ $id = $_POST['id'] ?? null;
+ $name = $_POST['name'];
+ $cat_id = $_POST['category_id'];
+ $desc = $_POST['description'];
+ $content = $_POST['content'];
+ $price = $_POST['price_usdt'];
+ $stock = $_POST['stock'];
+ $img = $_POST['image_url'];
+ $is_hot = isset($_POST['is_hot']) ? 1 : 0;
+
+ if ($id) {
+ $stmt = $db->prepare("UPDATE products SET name=?, category_id=?, description=?, content=?, price_usdt=?, stock=?, image_url=?, is_hot=? WHERE id=?");
+ $stmt->execute([$name, $cat_id, $desc, $content, $price, $stock, $img, $is_hot, $id]);
+ } else {
+ $stmt = $db->prepare("INSERT INTO products (name, category_id, description, content, price_usdt, stock, image_url, is_hot) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
+ $stmt->execute([$name, $cat_id, $desc, $content, $price, $stock, $img, $is_hot]);
+ }
+ header("Location: products.php");
+ exit;
+}
+
+$categories = $db->query("SELECT * FROM categories")->fetchAll();
+$products = $db->query("SELECT p.*, c.name as cat_name FROM products p JOIN categories c ON p.category_id = c.id ORDER BY p.id DESC")->fetchAll();
+
+$edit_product = null;
+if (isset($_GET['edit'])) {
+ $stmt = $db->prepare("SELECT * FROM products WHERE id = ?");
+ $stmt->execute([$_GET['edit']]);
+ $edit_product = $stmt->fetch();
+}
+?>
+
+
+
+
+ 商品管理 - 管理后台
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+ 商品
+ 分类
+ 价格
+ 库存
+ 状态
+ 操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+ USDT
+
+
+
+ 热门
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/admin/settings.php b/admin/settings.php
new file mode 100644
index 0000000..ed1eab9
--- /dev/null
+++ b/admin/settings.php
@@ -0,0 +1,72 @@
+ $value) {
+ $stmt = $db->prepare("UPDATE settings SET key_value = ? WHERE key_name = ?");
+ $stmt->execute([$value, $key]);
+ }
+ $message = '设置已更新';
+}
+
+$settings = db()->query("SELECT * FROM settings")->fetchAll();
+?>
+
+
+
+
+ 系统设置 - 管理后台
+
+
+
+
+
+
+
+
+
+
系统设置
+
+
+
+
+
+
+
+
+
+
+ ()
+
+
+
+
+
+
+
+ 保存设置
+
+
+
+
+
+
+
+
diff --git a/admin/sidebar.php b/admin/sidebar.php
new file mode 100644
index 0000000..e4e8b5c
--- /dev/null
+++ b/admin/sidebar.php
@@ -0,0 +1,36 @@
+
+
+
+
豪软后台
+
+
+
+
+
+ 仪表盘
+
+
+ 分类管理
+
+
+ 商品管理
+
+
+ 订单管理
+
+
+ 系统设置
+
+
+
+ 返回首页
+
+
+ 退出登录
+
+
\ No newline at end of file
diff --git a/assets/css/custom.css b/assets/css/custom.css
index 65a1626..9ae9ff3 100644
--- a/assets/css/custom.css
+++ b/assets/css/custom.css
@@ -1,346 +1,190 @@
:root {
- --color-bg: #ffffff;
- --color-text: #1a1a1a;
- --color-primary: #2563EB; /* Vibrant Blue */
- --color-secondary: #000000;
- --color-accent: #A3E635; /* Lime Green */
- --color-surface: #f8f9fa;
- --font-heading: 'Space Grotesk', sans-serif;
- --font-body: 'Inter', sans-serif;
- --border-width: 2px;
- --shadow-hard: 5px 5px 0px #000;
- --shadow-hover: 8px 8px 0px #000;
- --radius-pill: 50rem;
- --radius-card: 1rem;
+ --primary-color: #ff3399;
+ --secondary-color: #ff66b2;
+ --accent-color: #0088cc;
+ --bg-light: #fff5f7;
+ --card-bg: #ffffff;
+ --glass-border: rgba(255, 51, 153, 0.1);
+ --text-dark: #334155;
+ --text-muted: #64748b;
}
body {
- font-family: var(--font-body);
- background-color: var(--color-bg);
- color: var(--color-text);
- overflow-x: hidden;
+ background-color: var(--bg-light);
+ color: var(--text-dark);
+ font-family: 'Inter', sans-serif;
+ background-image:
+ radial-gradient(at 0% 0%, rgba(255, 0, 122, 0.05) 0px, transparent 50%),
+ radial-gradient(at 100% 100%, rgba(255, 51, 153, 0.05) 0px, transparent 50%);
+ background-attachment: fixed;
}
-h1, h2, h3, h4, h5, h6, .navbar-brand {
- font-family: var(--font-heading);
- letter-spacing: -0.03em;
+.glass-card {
+ background: var(--card-bg);
+ border: 1px solid var(--glass-border);
+ border-radius: 1rem;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
}
-/* Utilities */
-.text-primary { color: var(--color-primary) !important; }
-.bg-black { background-color: #000 !important; }
-.text-white { color: #fff !important; }
-.shadow-hard { box-shadow: var(--shadow-hard); }
-.border-2-black { border: var(--border-width) solid #000; }
-.py-section { padding-top: 5rem; padding-bottom: 5rem; }
-
-/* Navbar */
.navbar {
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(10px);
- border-bottom: var(--border-width) solid transparent;
- transition: all 0.3s;
- padding-top: 1rem;
- padding-bottom: 1rem;
+ border-bottom: 1px solid var(--glass-border);
+ box-shadow: 0 1px 3px rgba(0,0,0,0.05);
}
-.navbar.scrolled {
- border-bottom-color: #000;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
-}
-
-.brand-text {
- font-size: 1.5rem;
+.navbar-brand {
font-weight: 800;
+ letter-spacing: -0.025em;
+ text-transform: uppercase;
+ color: var(--primary-color) !important;
}
.nav-link {
- font-weight: 500;
- color: var(--color-text);
- margin-left: 1rem;
- position: relative;
+ font-weight: 600;
+ font-size: 0.95rem;
+ color: var(--text-dark) !important;
+ transition: color 0.3s ease;
}
-.nav-link:hover, .nav-link.active {
- color: var(--color-primary);
-}
-
-/* Buttons */
-.btn {
- font-weight: 700;
- font-family: var(--font-heading);
- padding: 0.8rem 2rem;
- border-radius: var(--radius-pill);
- border: var(--border-width) solid #000;
- transition: all 0.2s cubic-bezier(0.25, 1, 0.5, 1);
- box-shadow: var(--shadow-hard);
-}
-
-.btn:hover {
- transform: translate(-2px, -2px);
- box-shadow: var(--shadow-hover);
-}
-
-.btn:active {
- transform: translate(2px, 2px);
- box-shadow: 0 0 0 #000;
+.nav-link:hover {
+ color: var(--primary-color) !important;
}
.btn-primary {
- background-color: var(--color-primary);
- border-color: #000;
- color: #fff;
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
+ border: none;
+ color: white;
+ font-weight: 700;
}
.btn-primary:hover {
- background-color: #1d4ed8;
- border-color: #000;
- color: #fff;
+ background: linear-gradient(135deg, var(--secondary-color) 0%, var(--primary-color) 100%);
+ transform: translateY(-2px);
+ box-shadow: 0 10px 20px rgba(255, 51, 153, 0.2);
}
-.btn-outline-dark {
- background-color: #fff;
- color: #000;
-}
-
-.btn-cta {
- background-color: var(--color-accent);
- color: #000;
-}
-
-.btn-cta:hover {
- background-color: #8cc629;
- color: #000;
-}
-
-/* Hero Section */
-.hero-section {
- min-height: 100vh;
- padding-top: 80px;
-}
-
-.background-blob {
- position: absolute;
- border-radius: 50%;
- filter: blur(80px);
- opacity: 0.6;
- z-index: 1;
-}
-
-.blob-1 {
- top: -10%;
- right: -10%;
- width: 600px;
- height: 600px;
- background: radial-gradient(circle, var(--color-accent), transparent);
-}
-
-.blob-2 {
- bottom: 10%;
- left: -10%;
- width: 500px;
- height: 500px;
- background: radial-gradient(circle, var(--color-primary), transparent);
-}
-
-.highlight-text {
- background: linear-gradient(120deg, transparent 0%, transparent 40%, var(--color-accent) 40%, var(--color-accent) 100%);
- background-repeat: no-repeat;
- background-size: 100% 40%;
- background-position: 0 88%;
- padding: 0 5px;
-}
-
-.dot { color: var(--color-primary); }
-
-.badge-pill {
- display: inline-block;
- padding: 0.5rem 1rem;
- border: 2px solid #000;
- border-radius: 50px;
- font-weight: 700;
- background: #fff;
- box-shadow: 4px 4px 0 #000;
- font-family: var(--font-heading);
- font-size: 0.9rem;
-}
-
-/* Marquee */
-.marquee-container {
+.product-card {
overflow: hidden;
- white-space: nowrap;
- border-top: 2px solid #000;
- border-bottom: 2px solid #000;
}
-.rotate-divider {
- transform: rotate(-2deg) scale(1.05);
- z-index: 10;
+.product-card:hover {
+ transform: translateY(-5px);
+ border-color: var(--primary-color);
+ box-shadow: 0 10px 25px rgba(255, 51, 153, 0.1);
+}
+
+.product-img-container {
+ aspect-ratio: 1/1;
+ overflow: hidden;
+ border-radius: 0.75rem;
position: relative;
- margin-top: -50px;
- margin-bottom: 30px;
+ background: #f8fafc;
}
-.marquee-content {
- display: inline-block;
- animation: marquee 20s linear infinite;
- font-family: var(--font-heading);
- font-weight: 700;
- font-size: 1.5rem;
- letter-spacing: 2px;
-}
-
-@keyframes marquee {
- 0% { transform: translateX(0); }
- 100% { transform: translateX(-50%); }
-}
-
-/* Portfolio Cards */
-.project-card {
- border: 2px solid #000;
- border-radius: var(--radius-card);
- overflow: hidden;
- background: #fff;
- transition: transform 0.3s ease;
- box-shadow: var(--shadow-hard);
+.product-img {
+ width: 100%;
height: 100%;
- display: flex;
- flex-direction: column;
+ object-fit: contain;
+ padding: 15px;
+ transition: transform 0.5s ease;
}
-.project-card:hover {
- transform: translateY(-10px);
- box-shadow: 8px 8px 0 #000;
+.product-card:hover .product-img {
+ transform: scale(1.1);
}
-.card-img-holder {
- height: 250px;
+.badge-hot {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ background: var(--primary-color);
+ color: white;
+ font-size: 0.7rem;
+ font-weight: 800;
+ padding: 4px 8px;
+ border-radius: 4px;
+ z-index: 2;
+}
+
+.price-tag {
+ font-size: 1.25rem;
+ font-weight: 800;
+ color: var(--primary-color);
+}
+
+.footer-link {
+ color: var(--text-muted);
+ text-decoration: none;
+ transition: all 0.3s ease;
+ display: block;
+ margin-bottom: 0.5rem;
+}
+
+.footer-link:hover {
+ color: var(--primary-color);
+ padding-left: 5px;
+}
+
+/* Carousel Custom Styles */
+.carousel-item {
+ transition: transform 0.6s ease-in-out, opacity 0.6s ease-in-out;
+}
+
+.category-hover-card {
+ cursor: pointer;
+}
+
+.category-hover-card:hover {
+ background: rgba(255, 51, 153, 0.05) !important;
+ border-color: var(--primary-color);
+}
+
+.category-accent {
+ width: 4px;
+ height: 24px;
+ background: var(--primary-color);
+ border-radius: 2px;
+ display: inline-block;
+}
+
+.hover-primary:hover {
+ color: var(--primary-color) !important;
+}
+
+.floating-tg {
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ z-index: 1000;
+ width: 60px;
+ height: 60px;
+ background: #0088cc;
+ color: white;
+ border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
- border-bottom: 2px solid #000;
- position: relative;
- font-size: 4rem;
-}
-
-.placeholder-art {
- transition: transform 0.3s ease;
-}
-
-.project-card:hover .placeholder-art {
- transform: scale(1.2) rotate(10deg);
-}
-
-.bg-soft-blue { background-color: #e0f2fe; }
-.bg-soft-green { background-color: #dcfce7; }
-.bg-soft-purple { background-color: #f3e8ff; }
-.bg-soft-yellow { background-color: #fef9c3; }
-
-.category-tag {
- position: absolute;
- top: 15px;
- right: 15px;
- background: #000;
- color: #fff;
- padding: 5px 12px;
- border-radius: 20px;
- font-size: 0.75rem;
- font-weight: 700;
-}
-
-.card-body { padding: 1.5rem; }
-
-.link-arrow {
+ font-size: 30px;
+ box-shadow: 0 5px 15px rgba(0,0,0,0.1);
+ transition: all 0.3s ease;
text-decoration: none;
- color: #000;
- font-weight: 700;
- display: inline-flex;
- align-items: center;
- margin-top: auto;
}
-.link-arrow i { transition: transform 0.2s; margin-left: 5px; }
-.link-arrow:hover i { transform: translateX(5px); }
-
-/* About */
-.about-image-stack {
- position: relative;
- height: 400px;
- width: 100%;
+.floating-tg:hover {
+ transform: scale(1.1) rotate(10deg);
+ color: white;
}
-.stack-card {
- position: absolute;
- width: 80%;
- height: 100%;
- border-radius: var(--radius-card);
- border: 2px solid #000;
- box-shadow: var(--shadow-hard);
- left: 10%;
- transform: rotate(-3deg);
- background-size: cover;
+.alert.glass-card {
+ background: white;
+ color: var(--text-dark) !important;
}
-/* Forms */
-.form-control {
- border: 2px solid #000;
- border-radius: 0.5rem;
- padding: 1rem;
- font-weight: 500;
- background: #f8f9fa;
+.text-white {
+ color: var(--text-dark) !important;
}
-
-.form-control:focus {
- box-shadow: 4px 4px 0 var(--color-primary);
- border-color: #000;
- background: #fff;
-}
-
-/* Animations */
-.animate-up {
- opacity: 0;
- transform: translateY(30px);
- animation: fadeUp 0.8s ease forwards;
-}
-
-.delay-100 { animation-delay: 0.1s; }
-.delay-200 { animation-delay: 0.2s; }
-
-@keyframes fadeUp {
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* Social */
-.social-links a {
- transition: transform 0.2s;
- display: inline-block;
-}
-.social-links a:hover {
- transform: scale(1.2) rotate(10deg);
- color: var(--color-accent) !important;
-}
-
-/* Responsive */
-@media (max-width: 991px) {
- .rotate-divider {
- transform: rotate(0);
- margin-top: 0;
- margin-bottom: 2rem;
- }
-
- .hero-section {
- padding-top: 120px;
- text-align: center;
- min-height: auto;
- padding-bottom: 100px;
- }
-
- .display-1 { font-size: 3.5rem; }
-
- .blob-1 { width: 300px; height: 300px; right: -20%; }
- .blob-2 { width: 300px; height: 300px; left: -20%; }
+.text-white-50 {
+ color: var(--text-muted) !important;
}
diff --git a/assets/js/main.js b/assets/js/main.js
index fdf2cfd..b4069a6 100644
--- a/assets/js/main.js
+++ b/assets/js/main.js
@@ -1,73 +1,103 @@
-document.addEventListener('DOMContentLoaded', () => {
+// Cart Management
+function addToCart(id, name, price, img) {
+ let cart = JSON.parse(localStorage.getItem('cart') || '[]');
+ let found = cart.find(item => item.id === id);
- // Smooth scrolling for navigation links
+ if (found) {
+ found.qty++;
+ } else {
+ cart.push({ id, name, price, qty: 1, img });
+ }
+
+ localStorage.setItem('cart', JSON.stringify(cart));
+ updateCartBadge();
+ showToast(`${name} 已加入购物车`);
+}
+
+function updateCartBadge() {
+ let cart = JSON.parse(localStorage.getItem('cart') || '[]');
+ let count = cart.reduce((acc, item) => acc + item.qty, 0);
+ let badge = document.getElementById('cart-badge');
+
+ if (badge) {
+ if (count > 0) {
+ badge.textContent = count;
+ badge.classList.remove('d-none');
+ } else {
+ badge.classList.add('d-none');
+ }
+ }
+}
+
+// Toast Notification
+function showToast(message) {
+ let toastContainer = document.getElementById('toast-container');
+ if (!toastContainer) {
+ toastContainer = document.createElement('div');
+ toastContainer.id = 'toast-container';
+ toastContainer.className = 'position-fixed bottom-0 end-0 p-3';
+ toastContainer.style.zIndex = '9999';
+ document.body.appendChild(toastContainer);
+ }
+
+ const toastId = 'toast-' + Date.now();
+ const toastHtml = `
+
+ `;
+
+ toastContainer.insertAdjacentHTML('beforeend', toastHtml);
+ const toastElement = document.getElementById(toastId);
+ const toast = new bootstrap.Toast(toastElement, { delay: 3000 });
+ toast.show();
+
+ toastElement.addEventListener('hidden.bs.toast', () => {
+ toastElement.remove();
+ });
+}
+
+// Initialize on load
+document.addEventListener('DOMContentLoaded', function() {
+ updateCartBadge();
+
+ // Smooth scrolling for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
+ if (this.getAttribute('href') === '#') return;
e.preventDefault();
- const targetId = this.getAttribute('href');
- if (targetId === '#') return;
-
- const targetElement = document.querySelector(targetId);
- if (targetElement) {
- // Close mobile menu if open
- const navbarToggler = document.querySelector('.navbar-toggler');
- const navbarCollapse = document.querySelector('.navbar-collapse');
- if (navbarCollapse.classList.contains('show')) {
- navbarToggler.click();
- }
-
- // Scroll with offset
- const offset = 80;
- const elementPosition = targetElement.getBoundingClientRect().top;
- const offsetPosition = elementPosition + window.pageYOffset - offset;
-
- window.scrollTo({
- top: offsetPosition,
- behavior: "smooth"
+ const target = document.querySelector(this.getAttribute('href'));
+ if (target) {
+ target.scrollIntoView({
+ behavior: 'smooth'
});
}
});
});
- // Navbar scroll effect
- const navbar = document.querySelector('.navbar');
- window.addEventListener('scroll', () => {
- if (window.scrollY > 50) {
- navbar.classList.add('scrolled', 'shadow-sm', 'bg-white');
- navbar.classList.remove('bg-transparent');
- } else {
- navbar.classList.remove('scrolled', 'shadow-sm', 'bg-white');
- navbar.classList.add('bg-transparent');
- }
- });
-
- // Intersection Observer for fade-up animations
+ // Add animation to cards on scroll
const observerOptions = {
- threshold: 0.1,
- rootMargin: "0px 0px -50px 0px"
+ threshold: 0.1
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
- entry.target.classList.add('animate-up');
- entry.target.style.opacity = "1";
- observer.unobserve(entry.target); // Only animate once
+ entry.target.style.opacity = '1';
+ entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
- // Select elements to animate (add a class 'reveal' to them in HTML if not already handled by CSS animation)
- // For now, let's just make sure the hero animations run.
- // If we want scroll animations, we'd add opacity: 0 to elements in CSS and reveal them here.
- // Given the request, the CSS animation I added runs on load for Hero.
- // Let's make the project cards animate in.
-
- const projectCards = document.querySelectorAll('.project-card');
- projectCards.forEach((card, index) => {
- card.style.opacity = "0";
- card.style.animationDelay = `${index * 0.1}s`;
+ document.querySelectorAll('.glass-card').forEach(card => {
+ card.style.opacity = '0';
+ card.style.transform = 'translateY(20px)';
+ card.style.transition = 'all 0.6s cubic-bezier(0.23, 1, 0.32, 1)';
observer.observe(card);
});
-
});
\ No newline at end of file
diff --git a/assets/pasted-20260208-082111-302e08e2.png b/assets/pasted-20260208-082111-302e08e2.png
new file mode 100644
index 0000000..cb96302
Binary files /dev/null and b/assets/pasted-20260208-082111-302e08e2.png differ
diff --git a/cart.php b/cart.php
new file mode 100644
index 0000000..a0c8d20
--- /dev/null
+++ b/cart.php
@@ -0,0 +1,153 @@
+
+
+
+
+
+ 您的购物车
+
+
+
+
+
+
+
+
+
+ 商品信息
+ 单价
+ 数量
+ 小计
+ 操作
+
+
+
+
+
+
+
+
+
+
购物车空空如也
+
快去选购您心仪的软件吧!
+
前往商城
+
+
+
+
+
+
+
订单摘要
+
+ 商品总数
+ 0
+
+
+ 支付币种
+ USDT (TRC20)
+
+
+
+
+
+ 立即下单
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/category.php b/category.php
new file mode 100644
index 0000000..e9fc19e
--- /dev/null
+++ b/category.php
@@ -0,0 +1,57 @@
+prepare("SELECT * FROM categories WHERE id = ?");
+$stmt->execute([$id]);
+$cat = $stmt->fetch();
+
+if (!$cat) {
+ header("Location: index.php");
+ exit;
+}
+
+// Fetch products for this category
+$stmt = db()->prepare("SELECT p.*, c.name as category_name FROM products p JOIN categories c ON p.category_id = c.id WHERE p.category_id = ? ORDER BY p.id DESC");
+$stmt->execute([$id]);
+$cat_products = $stmt->fetchAll();
+?>
+
+
+
+
+
+
+
+
+
暂无相关商品
+
我们正在紧急补货中,请稍后再来。
+
返回首页
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/checkout.php b/checkout.php
new file mode 100644
index 0000000..dd0d66c
--- /dev/null
+++ b/checkout.php
@@ -0,0 +1,136 @@
+prepare("INSERT INTO orders (order_no, total_amount, payment_method, contact_info, status) VALUES (?, ?, ?, '', 'pending')");
+ $stmt->execute([$order_no, $total, $payment_method]);
+ $order_id = $db->lastInsertId();
+
+ // Create order items
+ foreach ($cart_data as $item) {
+ $stmt = $db->prepare("INSERT INTO order_items (order_id, product_id, quantity, price_usdt) VALUES (?, ?, ?, ?)");
+ $stmt->execute([$order_id, $item['id'], $item['qty'], $item['price']]);
+ }
+
+ // Redirect to payment
+ header("Location: payment.php?order_no=" . $order_no);
+ exit;
+}
+?>
+
+
+
+
+
+
+
确认订单信息
+
请核对您的订单商品,确认无误后点击下方按钮进入支付页面。
+
+
+
+
+
+
支付方式
+
+
+
+
+
+
USDT (TRC20)
+
推荐使用,区块链自动确认
+
+
+
+
+
+
+
+
+
+
订单详情
+
+
+
+
+
+ 应付总额
+ 0.00 USDT
+
+
+
+
+ 确认下单并去支付
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/db/migrations/20260208_seed_data.sql b/db/migrations/20260208_seed_data.sql
new file mode 100644
index 0000000..ee9ebaf
--- /dev/null
+++ b/db/migrations/20260208_seed_data.sql
@@ -0,0 +1,31 @@
+-- Clean up existing data to avoid duplicates if re-run
+DELETE FROM products;
+DELETE FROM categories;
+
+-- Categories
+INSERT INTO categories (id, name, icon) VALUES
+(1, '社交账号', 'bi-people-fill'),
+(2, '海外社交', 'bi-globe-central-south-asia'),
+(3, 'AI办公', 'bi-cpu-fill'),
+(4, '邮箱工具', 'bi-envelope-at-fill'),
+(5, '游戏专区', 'bi-controller');
+
+-- Products
+INSERT INTO products (name, category_id, description, content, price_usdt, stock, image_url, is_hot) VALUES
+('Discord 满月老号', 2, '高权重/已过验证', 'Discord 满月老号,纯手工注册,权重极高。已绑定海外手机号并完成邮箱验证。适合加入各种大群、使用各种机器人,不容易被封。发货格式:账号----密码----Token', 5.00, 999, 'https://cdn-icons-png.flaticon.com/512/3670/3670157.png', 1),
+('TikTok 权重号', 2, '千粉/直播权限', 'TikTok 优质权重老号,拥有1000+真实粉丝,已开通直播权限。适合引流、卖货。包含注册邮箱原始密码。发货格式:账号----密码----邮箱----邮箱密码', 15.00, 50, 'https://cdn-icons-png.flaticon.com/512/3046/3046121.png', 1),
+('ChatGPT Plus 共享号', 3, 'GPT-4o/稳定独享', 'ChatGPT Plus 会员共享号,支持最新的 GPT-4o 模型,DALL-E 3 生成图片。稳定不掉线,封号包赔。发货格式:邮箱----密码----Token', 10.00, 100, 'https://cdn-icons-png.flaticon.com/512/12222/12222588.png', 1),
+('小红书 优质老号', 1, '带粉/无违规', '小红书优质权重账号,注册时间长,无任何违规记录。适合做博主、引流。', 8.00, 200, 'https://placehold.co/400x400/ff2442/ffffff?text=Xiaohongshu', 1),
+('抖音 权重老号', 1, '实名/可直播', '抖音实名优质号,高权重,搜索排名靠前。', 12.00, 100, 'https://placehold.co/400x400/000000/ffffff?text=Douyin', 1),
+('Instagram 极品老号', 2, '带粉丝/发帖稳', 'Instagram 2-5年老号,带少量粉丝,权重极高,发帖不容易被屏蔽。', 6.00, 300, 'https://cdn-icons-png.flaticon.com/512/174/174855.png', 0),
+('Telegram 协议号', 2, 'API/Hash格式', 'TG 协议号,支持各路协议软件登录。', 3.00, 5000, 'https://cdn-icons-png.flaticon.com/512/2111/2111646.png', 1),
+('WhatsApp 活跃号', 2, '直登号/耐用', 'WhatsApp 长期活跃号,不容易封禁。', 4.50, 1000, 'https://cdn-icons-png.flaticon.com/512/733/733585.png', 0),
+('WeChat 微信老号', 1, '稳定/不封号', '微信老号,已过实名,朋友圈活跃。', 25.00, 20, 'https://cdn-icons-png.flaticon.com/512/733/733585.png', 1),
+('QQ 极品老号', 1, '等级高/带Q币', 'QQ 10年老号,皇冠等级,适合收藏。', 18.00, 10, 'https://cdn-icons-png.flaticon.com/512/3536/3536647.png', 0),
+('Gmail 优质新号', 4, '独享/带辅助', 'Gmail 全新号,独享注册,带辅助邮箱。', 1.50, 2000, 'https://cdn-icons-png.flaticon.com/512/281/281769.png', 0),
+('Outlook 混合号', 4, '便宜/量大', 'Outlook 邮箱,适合批量注册。', 0.50, 10000, 'https://cdn-icons-png.flaticon.com/512/732/732200.png', 0),
+('Snapchat 满月号', 2, '高权重/耐封', 'Snapchat 满月账号,高权重。', 4.00, 500, 'https://cdn-icons-png.flaticon.com/512/3670/3670174.png', 0),
+('LINE 台湾/日本号', 2, '已验证/直登', 'LINE 账号,已完成手机验证。', 7.00, 100, 'https://cdn-icons-png.flaticon.com/512/124/124025.png', 0),
+('知乎 权重号', 1, '高质量/老号', '知乎高质量账号,适合引流。', 5.50, 200, 'https://placehold.co/400x400/0084ff/ffffff?text=Zhihu', 0),
+('豆瓣小组 进群号', 1, '免审/高活跃', '豆瓣老号,已进各种大组,权重高。', 6.50, 150, 'https://placehold.co/400x400/00b51d/ffffff?text=Douban', 0),
+('Amino 活跃号', 2, '全球版/稳定', 'Amino 账号,稳定耐用。', 4.00, 300, 'https://placehold.co/400x400/121212/ffffff?text=Amino', 0);
diff --git a/faq.php b/faq.php
new file mode 100644
index 0000000..1786ceb
--- /dev/null
+++ b/faq.php
@@ -0,0 +1,77 @@
+
+
+
+
+
+
常见问题
+
您可能遇到的一些疑问,我们在这里为您解答
+
+
+
+
+
+
+
+
+
+ 支付成功后,系统会自动跳转到订单详情页显示卡密。如果您不小心关闭了页面,可以通过页面顶部的“订单查询”功能,输入您的订单号随时找回卡密。
+
+
+
+
+
+
+
+
+ 通常是因为区块链确认延迟或者支付金额不匹配。请确保您支付的是精确的金额。如果 10 分钟后仍未发货,请截图您的支付记录联系我们的 Telegram 客服。
+
+
+
+
+
+
+
+
+ 首先请检查您的网络环境(是否使用了干净的代理 IP)。如果确认是账号问题,请在购买后 24 小时内联系客服进行更换。请勿在同一个 IP 下大量登录账号,这会触发官方风控。
+
+
+
+
+
+
+
+
+ 可以。如果您有大批量、长期稳定的供货需求,请直接联系我们的 TG 商务,我们将为您提供更具竞争力的批发价格和定制化服务。
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/help.php b/help.php
new file mode 100644
index 0000000..793a499
--- /dev/null
+++ b/help.php
@@ -0,0 +1,53 @@
+
+
+
+
+
+
帮助中心
+
手把手教您如何高效、安全地使用我们的服务
+
+
+
+
+
+
+
+
新手入门
+
+
+ 环境准备: 使用账号前请确保代理 IP 纯净。
+ 购买流程: 选择商品 -> 填写联系方式 -> 扫码支付。
+ 提取卡密: 支付后网页自动弹出,或使用订单查询。
+
+
+
+
+
+
+
+
安全建议
+
+
+ 即买即改: 拿到账号后请第一时间修改密码和密保。
+ 指纹浏览器: 批量登录建议使用 AdsPower 或比特浏览器。
+ 避免并发: 刚登录的老号请勿立即群发信息。
+
+
+
+
+
+
关于发货
+
我们的平台采用 API 直连支付系统 和 全自动库存发货系统 。无论是在深夜还是凌晨,只要您完成支付,系统都会在确认到账后的 30 秒内通过页面展示和后台记录双向交付。如果您在支付过程中遇到断网、浏览器崩溃,也不必担心,只需记录下您的订单号,通过“订单查询”即可找回。
+
+
+ 提示:如果长时间未收到卡密,请检查您的钱包是否已经完成区块确认,或直接联系右侧客服咨询。
+
+
+
+
+
+
+
+
diff --git a/includes/footer.php b/includes/footer.php
new file mode 100644
index 0000000..ea1d9db
--- /dev/null
+++ b/includes/footer.php
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我们提供全球优质软件账号服务,支持 24 小时自动发货,质保无忧。
+
+
+
+
+
产品中心
+
+
+
+
+
+
+
用户支持
+
+
+
+
+
+
+
联系我们
+
+ 官方客服:@zhangshihao818
+
+
+ 售后邮箱:support@hao-soft.world
+
+
+
+
+
+
+
+
+
+
+
© . All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+