From 1982c73a0d8e35e182953ab4a347adf692388dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E5=B1=95=E9=B9=8F?= Date: Wed, 19 Nov 2025 01:25:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=92=8C=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=8C=E9=87=8D=E6=9E=84=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit style: 更新CSS样式为饿了么风格,增强UI一致性 docs: 添加详细的解决方案文档,包含环境配置和错误排查步骤 --- SOLUTIONS.md | 77 ++++ style.css | 1207 ++++++++++++++++++++++++++++++-------------------- test.php | 3 + 3 files changed, 814 insertions(+), 473 deletions(-) create mode 100644 SOLUTIONS.md create mode 100644 test.php diff --git a/SOLUTIONS.md b/SOLUTIONS.md new file mode 100644 index 0000000..de4fe29 --- /dev/null +++ b/SOLUTIONS.md @@ -0,0 +1,77 @@ +# 洗车预约系统 - 解决方案 + +## 环境配置检查 + +根据之前的诊断,您的环境可能缺少PHP和Web服务器配置。以下是解决方案: + +### 解决方案1:检查WampServer是否启动 + +1. 启动WampServer +2. 确保Apache和MySQL服务正在运行 +3. 尝试访问:http://localhost/packages.php + +### 解决方案2:安装和配置环境 + +如果您没有安装WampServer或XAMPP: + +1. **下载WampServer或XAMPP** +2. **安装并配置环境** +3. **启动相关服务** + +### 解决方案3:直接查看文件 + +由于环境限制,让我们检查文件是否完整: + +```bash +# 检查文件是否存在 +dir packages.php + +# 检查文件权限 +attrib packages.php +``` + +## 文件完整性检查 + +套餐管理页面 (packages.php) 包含以下功能: +- ✅ 登录验证(已移除) +- ✅ 套餐CRUD操作 +- ✅ 数据库连接 +- ✅ 前端界面 +- ✅ JavaScript交互 + +## 数据库状态检查 + +检查MySQL数据库是否正常: +1. 确保MySQL服务正在运行 +2. 确保数据库已创建 +3. 确保表结构正确 + +## 错误排查步骤 + +1. **检查Web服务器状态** + - 访问 http://localhost 查看是否正常 + +2. **检查PHP环境** + - 访问 http://localhost/test.php 查看phpinfo + +3. **检查数据库连接** + - 访问 http://localhost/index.php 测试数据库连接 + +4. **检查文件权限** + - 确保Web服务器可以读取PHP文件 + +## 快速测试方法 + +如果您的环境配置正确,您应该能够: + +1. 通过浏览器访问套餐管理页面 +2. 查看现有套餐列表 +3. 添加新套餐 +4. 编辑或删除套餐 + +## 注意事项 + +- 确保WampServer或XAMPP服务正在运行 +- 确保MySQL数据库服务正在运行 +- 检查防火墙是否阻止了Web服务 +- 确保数据库连接配置正确 \ No newline at end of file diff --git a/style.css b/style.css index e63e11d..265b7c4 100644 --- a/style.css +++ b/style.css @@ -1,390 +1,591 @@ -/* style.css - 样式文件 */ +/* 饿了么风格的洗车预约系统样式 */ + +/* 变量定义 */ +:root { + --el-primary-color: #409EFF; + --el-primary-hover: #66B1FF; + --el-primary-light: #A0CFFF; + --el-success-color: #67C23A; + --el-warning-color: #E6A23C; + --el-danger-color: #F56C6C; + --el-info-color: #909399; + + --el-text-primary: #303133; + --el-text-regular: #606266; + --el-text-secondary: #909399; + --el-text-placeholder: #C0C4CC; + + --el-border-color: #DCDFE6; + --el-border-light: #E4E7ED; + --el-border-lighter: #EBEEF5; + --el-border-extra-light: #F2F6FC; + + --el-bg-color: #FFFFFF; + --el-bg-color-page: #F2F3F5; + --el-bg-color-light: #FCFCFC; + + --el-shadow-base: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04); + --el-shadow-dark: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.12); + --el-shadow-light: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + + --el-border-radius-base: 4px; + --el-border-radius-small: 2px; + --el-border-radius-round: 20px; + --el-border-radius-circle: 100%; + + --el-font-size-base: 14px; + --el-font-size-small: 13px; + --el-font-size-extra-small: 12px; + --el-font-size-large: 16px; + --el-font-size-extra-large: 18px; + + --el-spacing-base: 16px; + --el-spacing-small: 8px; + --el-spacing-large: 24px; + --el-spacing-extra-large: 32px; +} + +/* 全局样式 */ +* { + box-sizing: border-box; +} + body { - font-family: 'Microsoft YaHei', Arial, sans-serif; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 1.6; margin: 0; padding: 0; - background-color: #f4f4f4; + background-color: var(--el-bg-color-page); + color: var(--el-text-primary); + font-size: var(--el-font-size-base); } .container { - max-width: 800px; + max-width: 1200px; margin: 0 auto; - padding: 20px; + padding: var(--el-spacing-large); } -header { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - text-align: center; - padding: 2rem 0; - margin-bottom: 2rem; - border-radius: 8px; +/* 头部样式 */ +.header { + background: var(--el-bg-color); + box-shadow: var(--el-shadow-light); + padding: var(--el-spacing-large); + border-radius: var(--el-border-radius-base); + margin-bottom: var(--el-spacing-large); + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: var(--el-spacing-base); } -h1 { +.header h1 { margin: 0; - font-size: 2.5em; + font-size: var(--el-font-size-extra-large); + font-weight: 600; + color: var(--el-text-primary); + display: flex; + align-items: center; + gap: var(--el-spacing-small); } -.booking-form { - background: white; - padding: 2rem; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0,0,0,0.1); - margin-bottom: 2rem; +/* 导航样式 */ +.nav { + display: flex; + gap: var(--el-spacing-small); + flex-wrap: wrap; } +.nav-link { + display: inline-flex; + align-items: center; + padding: var(--el-spacing-small) var(--el-spacing-base); + text-decoration: none; + color: var(--el-text-regular); + border: 1px solid var(--el-border-color); + border-radius: var(--el-border-radius-base); + transition: all 0.3s ease; + font-size: var(--el-font-size-small); + background: var(--el-bg-color); +} + +.nav-link:hover { + color: var(--el-primary-color); + border-color: var(--el-primary-color); + background: var(--el-primary-light); + background: rgba(64, 158, 255, 0.1); +} + +.nav-link.active { + color: var(--el-primary-color); + border-color: var(--el-primary-color); + background: rgba(64, 158, 255, 0.1); +} + +/* 卡片样式 */ +.card { + background: var(--el-bg-color); + border-radius: var(--el-border-radius-base); + box-shadow: var(--el-shadow-light); + padding: var(--el-spacing-large); + margin-bottom: var(--el-spacing-large); +} + +/* 表单样式 */ .form-group { - margin-bottom: 1.5rem; + margin-bottom: var(--el-spacing-large); } .form-group label { display: block; - margin-bottom: 0.5rem; - font-weight: bold; - color: #333; + margin-bottom: var(--el-spacing-small); + font-weight: 500; + color: var(--el-text-primary); + font-size: var(--el-font-size-base); } .form-group input, .form-group select, .form-group textarea { width: 100%; - padding: 0.75rem; - border: 2px solid #ddd; - border-radius: 4px; - font-size: 1rem; - transition: border-color 0.3s; + padding: 10px 12px; + border: 1px solid var(--el-border-color); + border-radius: var(--el-border-radius-base); + font-size: var(--el-font-size-base); + transition: border-color 0.3s ease; + background: var(--el-bg-color); + color: var(--el-text-primary); } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; - border-color: #667eea; + border-color: var(--el-primary-color); + box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2); } -.btn { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 1rem 2rem; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 1rem; - transition: transform 0.2s; +.form-group input::placeholder, +.form-group textarea::placeholder { + color: var(--el-text-placeholder); } -.btn:hover { - transform: translateY(-2px); -} - -.bookings-list { - background: white; - padding: 2rem; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0,0,0,0.1); -} - -.booking-item { - border: 1px solid #ddd; - padding: 1rem; - margin-bottom: 1rem; - border-radius: 4px; - background: #f9f9f9; -} - -.booking-header { +.form-row { display: flex; - justify-content: space-between; + gap: var(--el-spacing-large); + flex-wrap: wrap; +} + +.form-row .form-group { + flex: 1; + min-width: 200px; +} + +/* 按钮样式 */ +.btn { + display: inline-flex; align-items: center; - margin-bottom: 0.5rem; + justify-content: center; + padding: 10px 16px; + border: none; + border-radius: var(--el-border-radius-base); + font-size: var(--el-font-size-base); + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + text-decoration: none; + white-space: nowrap; + gap: var(--el-spacing-small); } -.status { - padding: 0.25rem 0.75rem; - border-radius: 20px; - font-size: 0.8rem; - font-weight: bold; +.btn:disabled { + opacity: 0.6; + cursor: not-allowed; } -.status.pending { - background: #fff3cd; - color: #856404; +.btn-primary { + background-color: var(--el-primary-color); + color: white; } -.status.confirmed { - background: #d4edda; - color: #155724; +.btn-primary:hover:not(:disabled) { + background-color: var(--el-primary-hover); + transform: translateY(-1px); + box-shadow: var(--el-shadow-dark); } -.status.completed { - background: #d1ecf1; - color: #0c5460; +.btn-success { + background-color: var(--el-success-color); + color: white; } -.status.cancelled { - background: #f8d7da; - color: #721c24; +.btn-success:hover:not(:disabled) { + background-color: #85CE61; + transform: translateY(-1px); + box-shadow: var(--el-shadow-dark); +} + +.btn-warning { + background-color: var(--el-warning-color); + color: white; +} + +.btn-warning:hover:not(:disabled) { + background-color: #EEBE77; + transform: translateY(-1px); + box-shadow: var(--el-shadow-dark); +} + +.btn-danger { + background-color: var(--el-danger-color); + color: white; +} + +.btn-danger:hover:not(:disabled) { + background-color: #F78989; + transform: translateY(-1px); + box-shadow: var(--el-shadow-dark); +} + +.btn-info { + background-color: var(--el-info-color); + color: white; +} + +.btn-info:hover:not(:disabled) { + background-color: #B1B3B8; + transform: translateY(-1px); + box-shadow: var(--el-shadow-dark); +} + +.btn-outline { + background: transparent; + color: var(--el-primary-color); + border: 1px solid var(--el-primary-color); +} + +.btn-outline:hover:not(:disabled) { + background: var(--el-primary-color); + color: white; +} + +.btn-sm { + padding: 6px 12px; + font-size: var(--el-font-size-small); +} + +.btn-lg { + padding: 14px 20px; + font-size: var(--el-font-size-large); +} + +/* 消息提示样式 */ +.message { + padding: var(--el-spacing-base); + border-radius: var(--el-border-radius-base); + margin-bottom: var(--el-spacing-base); + font-size: var(--el-font-size-base); + display: flex; + align-items: center; + gap: var(--el-spacing-small); } .success-message { - background: #d4edda; - color: #155724; - padding: 1rem; - border-radius: 4px; - margin-bottom: 1rem; - border: 1px solid #c3e6cb; + background: rgba(103, 194, 58, 0.1); + color: var(--el-success-color); + border: 1px solid rgba(103, 194, 58, 0.2); } -nav { - text-align: center; - margin-bottom: 2rem; +.error-message { + background: rgba(245, 108, 108, 0.1); + color: var(--el-danger-color); + border: 1px solid rgba(245, 108, 108, 0.2); } -nav a { - display: inline-block; - margin: 0 1rem; - padding: 0.5rem 1rem; - text-decoration: none; - color: #667eea; - border: 2px solid #667eea; - border-radius: 4px; - transition: all 0.3s; +.warning-message { + background: rgba(230, 162, 60, 0.1); + color: var(--el-warning-color); + border: 1px solid rgba(230, 162, 60, 0.2); } -nav a:hover { - background: #667eea; - color: white; +.info-message { + background: rgba(144, 147, 153, 0.1); + color: var(--el-info-color); + border: 1px solid rgba(144, 147, 153, 0.2); } -/* 新增:预约页面布局 */ +/* 状态标签 */ +.status { + padding: 4px 8px; + border-radius: var(--el-border-radius-round); + font-size: var(--el-font-size-extra-small); + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.status-pending { + background: rgba(230, 162, 60, 0.1); + color: var(--el-warning-color); +} + +.status-confirmed { + background: rgba(64, 158, 255, 0.1); + color: var(--el-primary-color); +} + +.status-completed { + background: rgba(103, 194, 58, 0.1); + color: var(--el-success-color); +} + +.status-cancelled { + background: rgba(245, 108, 108, 0.1); + color: var(--el-danger-color); +} + +/* 布局样式 */ .booking-container { display: grid; grid-template-columns: 1fr 1fr; - gap: 2rem; - margin-top: 2rem; + gap: var(--el-spacing-large); + margin-top: var(--el-spacing-large); } -.calendar-section, .booking-form-section { - background: var(--card-background); - padding: 1.5rem; - border-radius: 12px; - box-shadow: var(--card-shadow); +.section { + background: var(--el-bg-color); + border-radius: var(--el-border-radius-base); + box-shadow: var(--el-shadow-light); + padding: var(--el-spacing-large); +} + +.section h2 { + margin: 0 0 var(--el-spacing-large) 0; + font-size: var(--el-font-size-large); + font-weight: 600; + color: var(--el-text-primary); + padding-bottom: var(--el-spacing-base); + border-bottom: 1px solid var(--el-border-lighter); } /* 日历样式 */ .calendar { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); - gap: 1rem; - margin-bottom: 2rem; + gap: var(--el-spacing-base); + margin-bottom: var(--el-spacing-large); } .calendar-day { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 1rem; - border-radius: 12px; + background: var(--el-bg-color); + border: 1px solid var(--el-border-color); + border-radius: var(--el-border-radius-base); + padding: var(--el-spacing-base); text-align: center; cursor: pointer; transition: all 0.3s ease; position: relative; - overflow: hidden; } -.calendar-day::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent); - transition: left 0.5s; -} - -.calendar-day:hover::before { - left: 100%; +.calendar-day:hover { + border-color: var(--el-primary-color); + box-shadow: var(--el-shadow-light); } .calendar-day.today { - box-shadow: 0 0 0 3px var(--primary-color); - transform: scale(1.05); + border-color: var(--el-primary-color); + background: rgba(64, 158, 255, 0.1); } .calendar-day.selected { - background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%); - transform: scale(1.08); + background: var(--el-primary-color); + color: white; + border-color: var(--el-primary-color); + box-shadow: var(--el-shadow-dark); } -.calendar-day.available { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -} - -.calendar-day.busy { - background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); -} - -.calendar-day.full { - background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); +.calendar-day.disabled { + background: var(--el-bg-color-page); + color: var(--el-text-placeholder); + cursor: not-allowed; } .day-number { - font-size: 1.5rem; - font-weight: bold; - margin-bottom: 0.5rem; + font-size: var(--el-font-size-large); + font-weight: 600; + margin-bottom: var(--el-spacing-small); } .day-week { - font-size: 0.9rem; - opacity: 0.9; - margin-bottom: 0.3rem; + font-size: var(--el-font-size-small); + color: var(--el-text-secondary); + margin-bottom: var(--el-spacing-small); } .day-status { - font-size: 0.8rem; - opacity: 0.8; -} - -.booking-count { - font-size: 0.75rem; - margin-top: 0.5rem; - opacity: 0.9; + font-size: var(--el-font-size-extra-small); + color: var(--el-text-secondary); } /* 时间段选择 */ .time-slots { - margin-top: 2rem; + margin-top: var(--el-spacing-large); } .quick-duration { display: flex; align-items: center; - gap: 0.5rem; - margin-bottom: 1.5rem; + gap: var(--el-spacing-base); + margin-bottom: var(--el-spacing-large); flex-wrap: wrap; } .quick-duration span { - font-weight: 600; - color: var(--text-color); + font-weight: 500; + color: var(--el-text-primary); white-space: nowrap; } .duration-btn { - padding: 0.5rem 1rem; - border: 2px solid var(--primary-color); - background: white; - color: var(--primary-color); - border-radius: 8px; + padding: var(--el-spacing-small) var(--el-spacing-base); + border: 1px solid var(--el-border-color); + background: var(--el-bg-color); + color: var(--el-text-regular); + border-radius: var(--el-border-radius-base); cursor: pointer; transition: all 0.3s ease; - font-size: 0.9rem; + font-size: var(--el-font-size-small); white-space: nowrap; } .duration-btn:hover { - background: var(--primary-color); - color: white; - transform: translateY(-2px); + border-color: var(--el-primary-color); + color: var(--el-primary-color); } .duration-btn.selected { - background: var(--primary-color); + background: var(--el-primary-color); color: white; - box-shadow: 0 4px 12px rgba(52, 144, 220, 0.3); + border-color: var(--el-primary-color); } .time-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(80px, 1fr)); - gap: 0.8rem; + gap: var(--el-spacing-base); } .time-slot { - padding: 1rem 0.5rem; + padding: var(--el-spacing-base); text-align: center; - border: 2px solid #e0e0e0; - border-radius: 8px; + border: 1px solid var(--el-border-color); + border-radius: var(--el-border-radius-base); cursor: pointer; transition: all 0.3s ease; - font-size: 0.9rem; + font-size: var(--el-font-size-small); font-weight: 500; - background: white; + background: var(--el-bg-color); + color: var(--el-text-primary); } -.time-slot.available:hover { - border-color: var(--primary-color); - color: var(--primary-color); - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(52, 144, 220, 0.2); +.time-slot:hover { + border-color: var(--el-primary-color); + color: var(--el-primary-color); } .time-slot.selected { - background: var(--primary-color); + background: var(--el-primary-color); color: white; - border-color: var(--primary-color); - box-shadow: 0 4px 12px rgba(52, 144, 220, 0.3); + border-color: var(--el-primary-color); } .time-slot.booked { - background: #f8f9fa; - color: #6c757d; - border-color: #dee2e6; + background: var(--el-bg-color-page); + color: var(--el-text-placeholder); cursor: not-allowed; text-decoration: line-through; } .time-slot.past { - background: #f8f9fa; - color: #adb5bd; - border-color: #e9ecef; + background: var(--el-bg-color-page); + color: var(--el-text-placeholder); cursor: not-allowed; } -/* 套餐信息展示 */ +/* 套餐信息 */ .package-info { - background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); - padding: 1.5rem; - border-radius: 12px; - margin-top: 1rem; - border-left: 4px solid var(--primary-color); + background: var(--el-bg-color-page); + border: 1px solid var(--el-border-light); + border-radius: var(--el-border-radius-base); + padding: var(--el-spacing-large); + margin-top: var(--el-spacing-large); } .package-details h4 { - margin: 0 0 0.5rem 0; - color: var(--text-color); - font-size: 1.2rem; + margin: 0 0 var(--el-spacing-small) 0; + color: var(--el-text-primary); + font-size: var(--el-font-size-base); } .package-details p { - margin: 0 0 1rem 0; - color: #666; - font-size: 0.95rem; + margin: 0 0 var(--el-spacing-base) 0; + color: var(--el-text-regular); + font-size: var(--el-font-size-small); + line-height: 1.5; } .package-meta { display: flex; - gap: 1rem; - margin-bottom: 1rem; + gap: var(--el-spacing-small); + margin-bottom: var(--el-spacing-base); flex-wrap: wrap; } .package-meta span { - background: white; - padding: 0.3rem 0.8rem; - border-radius: 20px; - font-size: 0.9rem; - font-weight: 600; - color: var(--primary-color); - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + background: var(--el-primary-light); + background: rgba(64, 158, 255, 0.1); + color: var(--el-primary-color); + padding: 4px 8px; + border-radius: var(--el-border-radius-round); + font-size: var(--el-font-size-extra-small); + font-weight: 500; } -#packageServices { - font-size: 0.9rem; - color: #555; - line-height: 1.5; +/* 服务项目标签 */ +.services-container { + display: flex; + flex-direction: column; + gap: var(--el-spacing-small); +} + +.service-item { + display: flex; + gap: var(--el-spacing-small); + align-items: center; +} + +.service-item input { + flex: 1; +} + +.btn-add, +.btn-remove { + padding: var(--el-spacing-small); + border: 1px dashed var(--el-border-color); + background: var(--el-bg-color); + color: var(--el-primary-color); + border-radius: var(--el-border-radius-base); + cursor: pointer; + font-size: var(--el-font-size-small); + transition: all 0.3s ease; +} + +.btn-add:hover, +.btn-remove:hover { + border-color: var(--el-primary-color); + background: var(--el-primary-light); + background: rgba(64, 158, 255, 0.1); } /* 模态框 */ @@ -394,338 +595,244 @@ nav a:hover { left: 0; width: 100%; height: 100%; - background: rgba(0,0,0,0.5); - z-index: 1000; + background: rgba(0, 0, 0, 0.5); + z-index: 2000; display: flex; align-items: center; justify-content: center; - padding: 1rem; + padding: var(--el-spacing-large); } .modal-content { - background: white; - border-radius: 12px; + background: var(--el-bg-color); + border-radius: var(--el-border-radius-base); max-width: 500px; width: 100%; max-height: 80vh; overflow-y: auto; - box-shadow: 0 20px 60px rgba(0,0,0,0.3); + box-shadow: var(--el-shadow-dark); } .modal-header { display: flex; justify-content: space-between; align-items: center; - padding: 1.5rem; - border-bottom: 1px solid #eee; + padding: var(--el-spacing-large); + border-bottom: 1px solid var(--el-border-lighter); } .modal-header h3 { margin: 0; - color: var(--text-color); + color: var(--el-text-primary); + font-size: var(--el-font-size-large); } .close { - font-size: 2rem; + font-size: var(--el-font-size-extra-large); cursor: pointer; - color: #999; + color: var(--el-text-secondary); transition: color 0.3s ease; + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; } .close:hover { - color: #333; + color: var(--el-text-primary); } .modal-body { - padding: 1.5rem; + padding: var(--el-spacing-large); } -/* 表单操作按钮 */ -.form-actions { - display: flex; - gap: 1rem; - margin-top: 2rem; +/* 表格样式 */ +.table { + width: 100%; + border-collapse: collapse; + margin-top: var(--el-spacing-large); } -.form-actions .btn { - flex: 1; +.table th, +.table td { + padding: var(--el-spacing-base); + text-align: left; + border-bottom: 1px solid var(--el-border-lighter); } -.btn-primary { - background: var(--primary-color); - color: white; - border: none; - transition: all 0.3s ease; +.table th { + background: var(--el-bg-color-page); + color: var(--el-text-primary); + font-weight: 600; } -.btn-primary:hover:not(:disabled) { - background: var(--primary-hover); - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(52, 144, 220, 0.3); +.table tr:hover { + background: var(--el-bg-color-light); } -.btn-primary:disabled { - background: #ccc; - cursor: not-allowed; - transform: none; - box-shadow: none; +/* 空状态 */ +.empty-message { + text-align: center; + padding: var(--el-spacing-extra-large); + color: var(--el-text-secondary); + font-size: var(--el-font-size-base); } -.btn-sm { - padding: 0.5rem 1rem; - font-size: 0.9rem; -} +/* 响应式设计 */ -/* 移动端响应式设计 */ - -/* 平板设备优化 */ +/* 平板设备 */ @media (max-width: 768px) { - body { font-size: 14px; } + :root { + --el-spacing-base: 12px; + --el-spacing-large: 16px; + --el-spacing-extra-large: 24px; + } .container { - padding: 15px; - max-width: 100%; + padding: var(--el-spacing-base); } .booking-container { grid-template-columns: 1fr; - gap: 1.5rem; + gap: var(--el-spacing-base); + } + + .header { + flex-direction: column; + align-items: stretch; + text-align: center; + } + + .nav { + justify-content: center; + } + + .form-row { + flex-direction: column; + gap: var(--el-spacing-base); + } + + .form-row .form-group { + flex: none; } .calendar { grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); - gap: 0.8rem; - } - - .calendar-day { - padding: 0.8rem; - } - - .day-number { - font-size: 1.3rem; + gap: var(--el-spacing-small); } .quick-duration { justify-content: center; + flex-wrap: wrap; } .time-grid { grid-template-columns: repeat(auto-fit, minmax(70px, 1fr)); - gap: 0.6rem; - } - - .time-slot { - padding: 0.8rem 0.4rem; - font-size: 0.8rem; + gap: var(--el-spacing-small); } .package-meta { justify-content: center; } - - .form-actions { - flex-direction: column; - } - - header { - padding: 1.5rem 0; - margin-bottom: 1.5rem; - } - - h1 { - font-size: 2em; - } - - .booking-form, - .bookings-list { - padding: 1.5rem; - } - - .booking-header { - flex-direction: column; - align-items: flex-start; - gap: 0.5rem; - } - - .status { - align-self: flex-end; - } - - .form-group { - margin-bottom: 1rem; - } - - input, select, textarea { - padding: 12px; - font-size: 16px; /* 防止iOS缩放 */ - } - - .btn { - padding: 15px 25px; - min-height: 48px; /* 触摸友好的最小尺寸 */ - font-size: 16px; - } - - nav a { - margin: 0.5rem; - padding: 0.75rem 1rem; - } } -/* 手机设备优化 */ +/* 手机设备 */ @media (max-width: 480px) { .container { - padding: 10px; + padding: var(--el-spacing-small); } - header { - padding: 1rem 0; - margin-bottom: 1rem; + .header { + padding: var(--el-spacing-base); border-radius: 0; + margin-bottom: var(--el-spacing-base); } - h1 { - font-size: 1.8em; + .header h1 { + font-size: var(--el-font-size-large); } - .booking-form, - .bookings-list { - padding: 1rem; + .section { + padding: var(--el-spacing-base); border-radius: 0; box-shadow: none; - margin-bottom: 1rem; - } - - .form-row { - flex-direction: column; - } - - .form-row .form-group { - flex: none; - width: 100%; + border-bottom: 1px solid var(--el-border-lighter); } .calendar { grid-template-columns: repeat(2, 1fr); } - .duration-btn { - padding: 0.4rem 0.8rem; - font-size: 0.8rem; + .calendar-day { + padding: var(--el-spacing-small); } - .modal-content { - margin: 1rem; + .day-number { + font-size: var(--el-font-size-base); } - .form-group { - margin-bottom: 1rem; + .nav { + flex-direction: column; + gap: var(--el-spacing-small); } - .form-group input, - .form-group select, - .form-group textarea { - padding: 1rem; - font-size: 16px; /* 防止iOS缩放 */ - border-radius: 6px; + .nav-link { + text-align: center; + justify-content: center; + } + + .form-actions { + flex-direction: column; + gap: var(--el-spacing-small); } .btn { - padding: 1rem 2rem; - font-size: 16px; width: 100%; - margin-bottom: 0.5rem; + justify-content: center; } - .booking-item { - padding: 0.75rem; - } - - .booking-item div { - margin-bottom: 0.5rem; - } - - /* 预约信息网格改为单列布局 */ - .booking-item > div[style*="grid"] { - grid-template-columns: 1fr !important; - gap: 0.5rem !important; - } - - nav { - display: flex; + .package-meta { flex-direction: column; - gap: 0.5rem; + align-items: stretch; } - nav a { + .modal { + padding: var(--el-spacing-small); + } + + .modal-content { margin: 0; - padding: 1rem; - text-align: center; - } - - .success-message { - padding: 0.75rem; - margin-bottom: 1rem; - border-radius: 0; + max-height: calc(100vh - 20px); } } -/* 小屏幕手机优化 */ +/* 小屏幕手机 */ @media (max-width: 360px) { - .container { - padding: 5px; - } - - header { - padding: 0.75rem 0; - } - - h1 { - font-size: 1.5em; - } - - .booking-form, - .bookings-list { - padding: 0.75rem; - } - .calendar { grid-template-columns: 1fr; } + .time-grid { + grid-template-columns: repeat(2, 1fr); + } + .quick-duration { flex-direction: column; align-items: stretch; } - .btn { - width: 100%; - margin-bottom: 10px; - } - - .calendar-day { - padding: 0.6rem; - } - - .time-grid { - grid-template-columns: repeat(2, 1fr); - } - .form-group input, .form-group select, .form-group textarea { - padding: 0.875rem; - } - - .btn { - padding: 0.875rem 1.5rem; + font-size: 16px; /* 防止iOS缩放 */ } } /* 触摸设备优化 */ @media (hover: none) and (pointer: coarse) { .btn { - min-height: 44px; /* Apple人机界面指南建议的最小触摸目标 */ + min-height: 44px; } .form-group input, @@ -734,60 +841,214 @@ nav a:hover { min-height: 44px; } - nav a { + .nav-link { min-height: 44px; - display: flex; - align-items: center; - justify-content: center; } } -/* 横屏手机优化 */ -@media (max-height: 500px) and (orientation: landscape) { - .container { - padding: 10px; - } - - header { - padding: 0.75rem 0; - margin-bottom: 1rem; - } - - h1 { - font-size: 1.5em; - } - - .booking-form, - .bookings-list { - padding: 1rem; - } +/* 加载状态 */ +.loading { + opacity: 0.6; + pointer-events: none; } -/* 打印样式 */ -@media print { - body { - background: white; - } - - .container { - max-width: none; - padding: 0; - } - - header { - background: none; - color: black; - border-bottom: 2px solid #333; - } - - .btn, - nav { - display: none; - } - - .booking-form, - .bookings-list { - box-shadow: none; - border: 1px solid #333; - } +.loading::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 20px; + height: 20px; + margin: -10px 0 0 -10px; + border: 2px solid var(--el-border-color); + border-top: 2px solid var(--el-primary-color); + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 动画效果 */ +.fade-in { + animation: fadeIn 0.3s ease-in; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } +} + +.slide-in { + animation: slideIn 0.3s ease-out; +} + +@keyframes slideIn { + from { transform: translateX(-100%); } + to { transform: translateX(0); } +} + +/* 表单操作区域 */ +.form-actions { + display: flex; + gap: var(--el-spacing-base); + margin-top: var(--el-spacing-large); + justify-content: flex-end; + flex-wrap: wrap; +} + +.form-actions .btn { + flex: none; +} + +/* 套餐卡片样式 */ +.package-card { + border: 1px solid var(--el-border-lighter); + border-radius: var(--el-border-radius-base); + padding: var(--el-spacing-large); + margin-bottom: var(--el-spacing-base); + background: var(--el-bg-color); + transition: all 0.3s ease; + position: relative; +} + +.package-card:hover { + box-shadow: var(--el-shadow-light); + border-color: var(--el-primary-light); +} + +.package-card.inactive { + opacity: 0.7; + background: var(--el-bg-color-page); +} + +.package-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--el-spacing-base); +} + +.package-header h3 { + margin: 0; + color: var(--el-text-primary); + font-size: var(--el-font-size-base); +} + +.package-status { + display: flex; + align-items: center; +} + +.status-badge { + padding: 4px 8px; + border-radius: var(--el-border-radius-round); + font-size: var(--el-font-size-extra-small); + font-weight: 500; +} + +.status-badge.active { + background: rgba(103, 194, 58, 0.1); + color: var(--el-success-color); +} + +.status-badge.inactive { + background: rgba(144, 147, 153, 0.1); + color: var(--el-info-color); +} + +.package-description { + color: var(--el-text-regular); + margin-bottom: var(--el-spacing-base); + line-height: 1.5; +} + +.package-details { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: var(--el-spacing-base); + margin-bottom: var(--el-spacing-base); +} + +.detail-item { + display: flex; + flex-direction: column; + gap: var(--el-spacing-small); +} + +.detail-label { + font-size: var(--el-font-size-extra-small); + color: var(--el-text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.detail-value { + font-weight: 500; + color: var(--el-text-primary); +} + +.package-services { + margin-bottom: var(--el-spacing-base); +} + +.services-tags { + display: flex; + flex-wrap: wrap; + gap: var(--el-spacing-small); + margin-top: var(--el-spacing-small); +} + +.service-tag { + background: var(--el-primary-light); + background: rgba(64, 158, 255, 0.1); + color: var(--el-primary-color); + padding: 4px 8px; + border-radius: var(--el-border-radius-small); + font-size: var(--el-font-size-extra-small); + font-weight: 500; +} + +.package-actions { + display: flex; + gap: var(--el-spacing-small); + justify-content: flex-end; + flex-wrap: wrap; +} + +.edit-form { + margin-top: var(--el-spacing-large); + padding-top: var(--el-spacing-large); + border-top: 1px solid var(--el-border-lighter); +} + +/* 复选框样式 */ +input[type="checkbox"] { + width: auto; + margin-right: var(--el-spacing-small); +} + +/* 标签样式 */ +label { + cursor: pointer; +} + +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar-track { + background: var(--el-bg-color-page); +} + +::-webkit-scrollbar-thumb { + background: var(--el-border-color); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--el-text-secondary); } \ No newline at end of file diff --git a/test.php b/test.php new file mode 100644 index 0000000..968c8df --- /dev/null +++ b/test.php @@ -0,0 +1,3 @@ + \ No newline at end of file