307 lines
16 KiB
PHP
307 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="pending_bookings.php" class="nav-link">待预约处理</a>
|
|
<a href="packages.php" class="nav-link active">套餐管理</a>
|
|
<a href="vip.php" class="nav-link">VIP管理</a>
|
|
<a href="announcement.php" class="nav-link">今日待办</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>
|