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 ae3ed1e58f feat(ui): 更新页面标题和样式,增强移动端体验
refactor: 优化套餐管理页面布局和交互效果
2025-12-06 02:45:16 +08:00

346 lines
18 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">
<title>套餐管理 - 洗车预约系统</title>
<link rel="stylesheet" href="style.css">
<style>
/* 套餐管理页面特定样式 */
.pending-bookings-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
/* 加载动画 */
.loading { display: none; }
/* 页面淡入效果 */
body {
animation: fadeIn 0.5s ease;
}
</style>
</head>
<body>
<div class="pending-bookings-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="package-form">
<input type="hidden" name="action" value="add">
<div class="form-group">
<label for="package_name" class="required">套餐名称</label>
<input type="text" id="package_name" name="package_name" required placeholder="请输入套餐名称(如:标准洗车套餐)" class="form-control">
</div>
<div class="form-group">
<label for="description">套餐描述</label>
<textarea id="description" name="description" rows="3" placeholder="请详细描述套餐内容和特点" class="form-control"></textarea>
</div>
<div class="form-row">
<div class="form-group">
<label for="base_duration" class="required">基础时长</label>
<div class="input-group">
<input type="number" id="base_duration" name="base_duration" min="15" step="15" value="60" required class="form-control">
<span class="input-group-addon">分钟</span>
</div>
</div>
<div class="form-group">
<label for="price" class="required">价格</label>
<div class="input-group">
<span class="input-group-addon">¥</span>
<input type="number" id="price" name="price" min="0" step="0.01" required placeholder="0.00" class="form-control">
</div>
</div>
</div>
<div class="form-group">
<label>服务项目</label>
<div class="services-container">
<div class="service-item">
<input type="text" name="services[]" placeholder="请输入服务项目(如:外观清洗)" value="外观清洗" class="form-control">
<button type="button" class="btn-danger btn-sm" onclick="removeService(this)"><span>删除</span></button>
</div>
<div class="service-item">
<input type="text" name="services[]" placeholder="请输入服务项目(如:内饰清洁)" value="内饰清洁" class="form-control">
<button type="button" class="btn-danger btn-sm" onclick="removeService(this)"><span>删除</span></button>
</div>
</div>
<button type="button" class="btn-outline btn-sm" onclick="addService()"><span>+ 添加服务项目</span></button>
</div>
<div class="form-actions">
<button type="submit" class="btn-primary btn-lg"><span>✨ 添加套餐</span></button>
</div>
</form>
</div>
<div class="packages-list">
<h2>📊 套餐列表</h2>
<?php if (empty($packages)): ?>
<div class="empty-state">
<div class="empty-icon">📦</div>
<p class="empty-message">暂无套餐数据</p>
<p class="empty-submessage">点击上方"添加套餐"按钮创建第一个套餐吧!</p>
</div>
<?php else: ?>
<div class="packages-grid">
<?php foreach ($packages as $package): ?>
<div class="package-card <?= $package['is_active'] ? '' : 'inactive' ?>" data-package-id="<?= $package['id'] ?>">
<div class="package-header">
<h3 class="package-title"><?= 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"><strong><?= $package['base_duration'] ?></strong>分钟</span>
</div>
<div class="detail-item">
<span class="detail-label">价格</span>
<span class="detail-value price"><strong>¥<?= number_format($package['price'], 2) ?></strong></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-primary btn-sm" onclick="editPackage(<?= $package['id'] ?>)"><span>✏️ 编辑</span></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-danger btn-sm"><span>🗑️ 删除</span></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'] ?>">
<h4>✏️ 编辑套餐</h4>
<div class="form-group">
<label class="required">套餐名称</label>
<input type="text" name="package_name" value="<?= htmlspecialchars($package['package_name']) ?>" required placeholder="请输入套餐名称" class="form-control">
</div>
<div class="form-group">
<label>套餐描述</label>
<textarea name="description" rows="2" placeholder="请输入套餐描述" class="form-control"><?= htmlspecialchars($package['description']) ?></textarea>
</div>
<div class="form-row">
<div class="form-group">
<label class="required">基础时长</label>
<div class="input-group">
<input type="number" name="base_duration" min="15" step="15" value="<?= $package['base_duration'] ?>" required class="form-control">
<span class="input-group-addon">分钟</span>
</div>
</div>
<div class="form-group">
<label class="required">价格</label>
<div class="input-group">
<span class="input-group-addon">¥</span>
<input type="number" name="price" min="0" step="0.01" value="<?= $package['price'] ?>" required placeholder="0.00" class="form-control">
</div>
</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)) ?>" placeholder="请输入服务项目" class="form-control">
<button type="button" class="btn-danger btn-sm" onclick="removeService(this)"><span>删除</span></button>
</div>
<?php
endif;
endforeach;
?>
</div>
<button type="button" class="btn-outline btn-sm" onclick="addService()"><span>+ 添加服务项目</span></button>
</div>
<div class="form-group">
<label class="checkbox-label">
<input type="checkbox" name="is_active" <?= $package['is_active'] ? 'checked' : '' ?>>
<span class="checkbox-text">启用此套餐</span>
</label>
</div>
<div class="form-actions">
<button type="submit" class="btn-primary"><span>💾 保存更改</span></button>
<button type="button" class="btn-outline" onclick="cancelEdit(<?= $package['id'] ?>)"><span>❌ 取消</span></button>
</div>
</form>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
</div>
<script>
function addService() {
const container = document.querySelector('.services-container');
const serviceItem = document.createElement('div');
serviceItem.className = 'service-item';
serviceItem.style.display = 'flex';
serviceItem.style.gap = 'var(--el-spacing-base)';
serviceItem.style.marginBottom = 'var(--el-spacing-base)';
serviceItem.style.alignItems = 'flex-end';
serviceItem.innerHTML = `
<div style="flex: 1;">
<input type="text" name="service_names[]" placeholder="请输入服务名称" class="form-control" required>
</div>
<div style="flex: 0 0 120px;">
<input type="number" name="service_prices[]" placeholder="价格 (¥)" step="0.01" class="form-control" required>
</div>
<button type="button" class="btn-danger btn-sm" onclick="removeService(this)"><span>删除</span></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>