This repository has been archived on 2026-06-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
carwash_order/packages.php
T
wsh5485 e109890b7e feat: 添加VIP管理入口并创建测试页面
在bookings.php和packages.php中添加VIP管理导航链接
创建test_vip_entries.php测试页面验证功能
2025-11-19 18:26:02 +08:00

305 lines
16 KiB
PHP

<?php
require_once 'db_connect.php';
$message = '';
// 处理套餐操作
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
try {
if ($action === 'add') {
$package_name = trim($_POST['package_name']);
$description = trim($_POST['description']);
$base_duration = (int)$_POST['base_duration'];
$price = (float)$_POST['price'];
$services = implode(',', array_filter(array_map('trim', $_POST['services'] ?? [])));
$stmt = $pdo->prepare("INSERT INTO packages (package_name, description, base_duration, price, services) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$package_name, $description, $base_duration, $price, $services]);
$message = "套餐添加成功!";
} elseif ($action === 'update') {
$id = (int)$_POST['id'];
$package_name = trim($_POST['package_name']);
$description = trim($_POST['description']);
$base_duration = (int)$_POST['base_duration'];
$price = (float)$_POST['price'];
$services = implode(',', array_filter(array_map('trim', $_POST['services'] ?? [])));
$is_active = isset($_POST['is_active']) ? 1 : 0;
$stmt = $pdo->prepare("UPDATE packages SET package_name = ?, description = ?, base_duration = ?, price = ?, services = ?, is_active = ? WHERE id = ?");
$stmt->execute([$package_name, $description, $base_duration, $price, $services, $is_active, $id]);
$message = "套餐更新成功!";
} elseif ($action === 'delete') {
$id = (int)$_POST['id'];
$stmt = $pdo->prepare("DELETE FROM packages WHERE id = ?");
$stmt->execute([$id]);
$message = "套餐删除成功!";
}
} catch (Exception $e) {
$message = "操作失败:" . $e->getMessage();
}
}
// 获取套餐列表
$stmt = $pdo->query("SELECT * FROM packages ORDER BY created_at DESC");
$packages = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="format-detection" content="telephone=no">
<meta name="description" content="洗车套餐管理系统">
<meta name="keywords" content="洗车,套餐,管理">
<link rel="apple-touch-icon" href="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkyIiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDE5MiAxOTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxOTIiIGhlaWdodD0iMTkyIiByeD0iMjQiIGZpbGw9IiMzMDk1RjQiLz4KPHN2ZyB4PSI0OCIgeT0iNDgiIHdpZHRoPSI5NiIgaGVpZ2h0PSI5NiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJ3aGl0ZSI+CjxwYXRoIGQ9Ik0yMS4yIDQuNEMyMS42IDMuNiAyMi4xIDMuMSAyMi41IDIuN0MyMy40IDIuMSAyNC41IDIuMSAyNS4yIDIuN0MyNS44IDMuMSAyNi4zIDMuNiAyNi43IDQuNEMyNy4xIDUuMSAyNy4xIDYuMiAyNi43IDcuMUMyNi4zIDcuOCAyNS44IDguMyAyNS4yIDguN0MyNC43IDkuMSAyMy42IDkuMSAyMi45IDguN0MyMi4zIDguMyAyMS44IDcuOCAyMS40IDcuMUMyMS4wIDYuMiAyMS4wIDUuMSAyMS4yIDQuNFoiLz4KPHN2ZyB4PSIyMCIgeT0iMTIiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJ3aGl0ZSI+CjxwYXRoIGQ9Ik0yMSAyMy41QzIwLjUgMjMuNSAyMCAyMyAyMCAyMi41VjEyQzIwIDExLjUgMjAuNSAxMSAyMSAxMUg5QzguNSAxMSAxMi41IDEwLjUgMTIgMTBIMjBWMTBCMjAgMTAuNSAyMC41IDExIDIxIDExVjIzLjVaIi8+CjxwYXRoIGQ9Ik0xOCAyMFYxN0gxNFY4SDVWMTNIMTlWMTVIMTlWMjBaIi8+CjxwYXRoIGQ9Ik04IDEwSDVWN0g4VjEwWiIvPgo8L3N2Zz4KPC9zdmc+">
<title>套餐管理 - 洗车预约系统</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<header class="header">
<h1>🛠️ 套餐管理</h1>
<nav class="nav">
<a href="index.php" class="nav-link">预约洗车</a>
<a href="bookings.php" class="nav-link">预约管理</a>
<a href="packages.php" class="nav-link active">套餐管理</a>
<a href="vip.php" class="nav-link">VIP管理</a>
</nav>
</header>
<?php if ($message): ?>
<div class="message <?= strpos($message, '成功') !== false ? 'success-message' : 'error-message' ?>"
style="<?= strpos($message, '成功') !== false ? '' : 'background-color: #fee; color: #c33; border-color: #fcc;' ?>">
<?= htmlspecialchars($message) ?>
</div>
<?php endif; ?>
<div class="package-form-container">
<h2>添加新套餐</h2>
<form method="POST" class="form">
<input type="hidden" name="action" value="add">
<div class="form-group">
<label for="package_name">套餐名称:</label>
<input type="text" id="package_name" name="package_name" required>
</div>
<div class="form-group">
<label for="description">套餐描述:</label>
<textarea id="description" name="description" rows="3"></textarea>
</div>
<div class="form-row">
<div class="form-group">
<label for="base_duration">基础时长(分钟):</label>
<input type="number" id="base_duration" name="base_duration" min="15" step="15" value="60" required>
</div>
<div class="form-group">
<label for="price">价格(元):</label>
<input type="number" id="price" name="price" min="0" step="0.01" required>
</div>
</div>
<div class="form-group">
<label>服务项目:</label>
<div class="services-container">
<div class="service-item">
<input type="text" name="services[]" placeholder="服务项目1" value="外观清洗">
<button type="button" class="btn-remove" onclick="removeService(this)">删除</button>
</div>
<div class="service-item">
<input type="text" name="services[]" placeholder="服务项目2" value="内饰清洁">
<button type="button" class="btn-remove" onclick="removeService(this)">删除</button>
</div>
</div>
<button type="button" class="btn-add" onclick="addService()">+ 添加服务项目</button>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">添加套餐</button>
</div>
</form>
</div>
<div class="packages-list">
<h2>套餐列表</h2>
<?php if (empty($packages)): ?>
<p class="empty-message">暂无套餐数据</p>
<?php else: ?>
<?php foreach ($packages as $package): ?>
<div class="package-card <?= $package['is_active'] ? '' : 'inactive' ?>">
<div class="package-header">
<h3><?= htmlspecialchars($package['package_name']) ?></h3>
<div class="package-status">
<span class="status-badge <?= $package['is_active'] ? 'active' : 'inactive' ?>">
<?= $package['is_active'] ? '启用' : '禁用' ?>
</span>
</div>
</div>
<?php if ($package['description']): ?>
<p class="package-description"><?= htmlspecialchars($package['description']) ?></p>
<?php endif; ?>
<div class="package-details">
<div class="detail-item">
<span class="detail-label">基础时长:</span>
<span class="detail-value"><?= $package['base_duration'] ?>分钟</span>
</div>
<div class="detail-item">
<span class="detail-label">价格:</span>
<span class="detail-value">¥<?= number_format($package['price'], 2) ?></span>
</div>
</div>
<?php
$services = explode(',', $package['services']);
if ($services && !empty(trim($services[0]))):
?>
<div class="package-services">
<span class="detail-label">包含服务:</span>
<div class="services-tags">
<?php foreach ($services as $service): ?>
<?php if (trim($service)): ?>
<span class="service-tag"><?= htmlspecialchars(trim($service)) ?></span>
<?php endif; ?>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<div class="package-actions">
<button class="btn btn-sm" onclick="editPackage(<?= $package['id'] ?>)">编辑</button>
<form method="POST" style="display: inline;" onsubmit="return confirmDelete()">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="<?= $package['id'] ?>">
<button type="submit" class="btn btn-danger btn-sm">删除</button>
</form>
</div>
<!-- 编辑表单 -->
<form method="POST" class="edit-form" id="edit-form-<?= $package['id'] ?>" style="display: none;">
<input type="hidden" name="action" value="update">
<input type="hidden" name="id" value="<?= $package['id'] ?>">
<div class="form-group">
<label>套餐名称:</label>
<input type="text" name="package_name" value="<?= htmlspecialchars($package['package_name']) ?>" required>
</div>
<div class="form-group">
<label>套餐描述:</label>
<textarea name="description" rows="2"><?= htmlspecialchars($package['description']) ?></textarea>
</div>
<div class="form-row">
<div class="form-group">
<label>基础时长(分钟):</label>
<input type="number" name="base_duration" min="15" step="15" value="<?= $package['base_duration'] ?>" required>
</div>
<div class="form-group">
<label>价格(元):</label>
<input type="number" name="price" min="0" step="0.01" value="<?= $package['price'] ?>" required>
</div>
</div>
<div class="form-group">
<label>服务项目:</label>
<div class="services-container">
<?php
$services = explode(',', $package['services']);
foreach ($services as $service):
if (trim($service)):
?>
<div class="service-item">
<input type="text" name="services[]" value="<?= htmlspecialchars(trim($service)) ?>">
<button type="button" class="btn-remove" onclick="removeService(this)">删除</button>
</div>
<?php
endif;
endforeach;
?>
</div>
<button type="button" class="btn-add" onclick="addService()">+ 添加服务项目</button>
</div>
<div class="form-group">
<label>
<input type="checkbox" name="is_active" <?= $package['is_active'] ? 'checked' : '' ?>>
启用此套餐
</label>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">保存更改</button>
<button type="button" class="btn" onclick="cancelEdit(<?= $package['id'] ?>)">取消</button>
</div>
</form>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</div>
<script>
function addService() {
const container = document.querySelector('.services-container');
const serviceItem = document.createElement('div');
serviceItem.className = 'service-item';
serviceItem.innerHTML = `
<input type="text" name="services[]" placeholder="服务项目">
<button type="button" class="btn-remove" onclick="removeService(this)">删除</button>
`;
container.appendChild(serviceItem);
}
function removeService(button) {
const container = button.closest('.services-container');
const items = container.querySelectorAll('.service-item');
if (items.length > 1) {
button.parentElement.remove();
} else {
alert('至少需要保留一个服务项目');
}
}
function editPackage(id) {
// 隐藏所有编辑表单
document.querySelectorAll('.edit-form').forEach(form => {
form.style.display = 'none';
});
// 显示当前编辑表单
const editForm = document.getElementById(`edit-form-${id}`);
if (editForm) {
editForm.style.display = 'block';
editForm.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
}
function cancelEdit(id) {
const editForm = document.getElementById(`edit-form-${id}`);
if (editForm) {
editForm.style.display = 'none';
}
}
function confirmDelete() {
return confirm('确定要删除这个套餐吗?此操作不可恢复。');
}
// 移动端优化
if (/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {
document.body.classList.add('mobile-device');
}
</script>
</body>
</html>