Browse Source

Merge branch 'master' of http://git.fmode.cn:3000/18307996893/ai-manager

0235711 1 day ago
parent
commit
fde244df2f

+ 862 - 0
demo/room.html

@@ -0,0 +1,862 @@
+<!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="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
+        }
+        
+        :root {
+            --primary: #1a56db;
+            --secondary: #0e2a53;
+            --accent: #f59e0b;
+            --light: #f8fafc;
+            --dark: #0f172a;
+            --card-bg: rgba(255, 255, 255, 0.95);
+            --glass: rgba(255, 255, 255, 0.1);
+            --glass-border: rgba(255, 255, 255, 0.2);
+            --shadow: 0 8px 32px rgba(31, 38, 135, 0.15);
+        }
+        
+        body {
+            background: linear-gradient(135deg, #0f172a, #1e293b);
+            color: var(--light);
+            min-height: 100vh;
+            padding: 0;
+            position: relative;
+            overflow-x: hidden;
+        }
+        
+        body::before {
+            content: '';
+            position: absolute;
+            top: 0;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            background: 
+                radial-gradient(circle at 10% 20%, rgba(26, 86, 219, 0.15) 0%, transparent 30%),
+                radial-gradient(circle at 90% 80%, rgba(245, 158, 11, 0.15) 0%, transparent 30%);
+            z-index: -1;
+        }
+        
+        /* 顶部导航栏 */
+        .top-nav {
+            background: rgba(15, 23, 42, 0.95);
+            backdrop-filter: blur(10px);
+            border-bottom: 1px solid var(--glass-border);
+            padding: 15px 20px;
+            display: flex;
+            align-items: center;
+            gap: 15px;
+        }
+        
+        .back-btn {
+            width: 40px;
+            height: 40px;
+            border-radius: 50%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            background: rgba(255, 255, 255, 0.1);
+            color: #e2e8f0;
+            cursor: pointer;
+            transition: all 0.3s ease;
+        }
+        
+        .back-btn:hover {
+            background: rgba(255, 255, 255, 0.2);
+            transform: translateX(-3px);
+        }
+        
+        .nav-title {
+            flex: 1;
+        }
+        
+        .nav-title h1 {
+            font-size: 20px;
+            font-weight: 700;
+            background: linear-gradient(to right, #fbcfe8, #c7d2fe);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+        }
+        
+        .nav-actions {
+            display: flex;
+            gap: 10px;
+        }
+        
+        .nav-btn {
+            width: 40px;
+            height: 40px;
+            border-radius: 50%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            background: rgba(255, 255, 255, 0.1);
+            color: #e2e8f0;
+            cursor: pointer;
+            transition: all 0.3s ease;
+        }
+        
+        .nav-btn:hover {
+            background: rgba(26, 86, 219, 0.3);
+        }
+        
+        /* 内容容器 */
+        .content-container {
+            max-width: 1200px;
+            margin: 20px auto 40px;
+            padding: 0 20px;
+        }
+        
+        /* 功能区域 */
+        .action-bar {
+            display: flex;
+            justify-content: space-between;
+            margin-bottom: 20px;
+            padding: 0 10px;
+        }
+        
+        .section-title h2 {
+            font-size: 18px;
+            font-weight: 700;
+            color: #e2e8f0;
+        }
+        
+        .action-buttons {
+            display: flex;
+            gap: 10px;
+        }
+        
+        .btn {
+            padding: 8px 15px;
+            border-radius: 10px;
+            font-weight: 600;
+            cursor: pointer;
+            transition: all 0.3s ease;
+            border: none;
+            display: flex;
+            align-items: center;
+            gap: 8px;
+            font-size: 14px;
+        }
+        
+        .btn-primary {
+            background: linear-gradient(135deg, var(--accent), #fbbf24);
+            color: var(--dark);
+            box-shadow: 0 4px 6px rgba(245, 158, 11, 0.3);
+        }
+        
+        .btn-primary:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 6px 12px rgba(245, 158, 11, 0.4);
+        }
+        
+        .btn-outline {
+            background: transparent;
+            border: 1px solid var(--glass-border);
+            color: #e2e8f0;
+        }
+        
+        .btn-outline:hover {
+            background: rgba(255, 255, 255, 0.1);
+        }
+        
+        /* 筛选区域 */
+        .filter-bar {
+            background: var(--glass);
+            backdrop-filter: blur(10px);
+            border-radius: 15px;
+            border: 1px solid var(--glass-border);
+            padding: 15px;
+            margin-bottom: 25px;
+            display: flex;
+            flex-wrap: wrap;
+            gap: 15px;
+        }
+        
+        .filter-group {
+            display: flex;
+            flex-direction: column;
+            gap: 8px;
+            min-width: 180px;
+            flex: 1;
+        }
+        
+        .filter-group label {
+            font-size: 14px;
+            color: #94a3b8;
+            font-weight: 500;
+        }
+        
+        .filter-group select, 
+        .filter-group input {
+            background: rgba(255, 255, 255, 0.1);
+            border: 1px solid var(--glass-border);
+            border-radius: 10px;
+            padding: 10px 15px;
+            color: #e2e8f0;
+            width: 100%;
+            cursor: pointer;
+        }
+        
+        /* 宴会厅卡片 */
+        .hall-cards {
+            display: grid;
+            grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+            gap: 20px;
+            margin-bottom: 40px;
+        }
+        
+        .hall-card {
+            background: var(--card-bg);
+            border-radius: 15px;
+            border: 1px solid rgba(255, 255, 255, 0.2);
+            overflow: hidden;
+            box-shadow: var(--shadow);
+            transition: all 0.3s ease;
+            color: var(--dark);
+            position: relative;
+        }
+        
+        .hall-card:hover {
+            transform: translateY(-5px);
+            box-shadow: 0 15px 25px rgba(31, 38, 135, 0.2);
+        }
+        
+        .hall-image {
+            height: 180px;
+            background-size: cover;
+            background-position: center;
+            position: relative;
+        }
+        
+        .hall-image::after {
+            content: '';
+            position: absolute;
+            top: 0;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            background: linear-gradient(to top, rgba(0,0,0,0.7), transparent);
+        }
+        
+        .hall-name {
+            position: absolute;
+            bottom: 15px;
+            left: 15px;
+            z-index: 2;
+        }
+        
+        .hall-name h3 {
+            font-size: 20px;
+            font-weight: 700;
+            color: white;
+            margin-bottom: 3px;
+        }
+        
+        .hall-name p {
+            font-size: 14px;
+            color: #e2e8f0;
+        }
+        
+        .hall-price {
+            position: absolute;
+            top: 15px;
+            right: 15px;
+            background: rgba(255, 255, 255, 0.9);
+            padding: 6px 12px;
+            border-radius: 30px;
+            font-weight: 700;
+            font-size: 16px;
+            color: var(--dark);
+            z-index: 2;
+            box-shadow: 0 4px 10px rgba(0,0,0,0.1);
+        }
+        
+        .discount-price {
+            text-decoration: line-through;
+            color: #ef4444;
+            font-size: 12px;
+            margin-left: 5px;
+        }
+        
+        .hall-info {
+            padding: 15px;
+        }
+        
+        .info-row {
+            display: flex;
+            justify-content: space-between;
+            padding: 10px 0;
+            border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+        }
+        
+        .info-row:last-child {
+            border-bottom: none;
+        }
+        
+        .info-label {
+            font-weight: 600;
+            color: #475569;
+            font-size: 14px;
+        }
+        
+        .info-value {
+            font-weight: 600;
+            color: var(--dark);
+            font-size: 14px;
+        }
+        
+        .hall-footer {
+            display: flex;
+            justify-content: space-between;
+            padding: 12px 15px;
+            background: rgba(241, 245, 249, 0.7);
+            border-top: 1px solid rgba(0, 0, 0, 0.05);
+        }
+        
+        .hall-btn {
+            padding: 8px 12px;
+            border-radius: 8px;
+            font-size: 13px;
+            font-weight: 600;
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            gap: 5px;
+            border: none;
+            transition: all 0.2s ease;
+        }
+        
+        .hall-btn:hover {
+            transform: translateY(-2px);
+        }
+        
+        .btn-book {
+            background: linear-gradient(135deg, var(--primary), #3b82f6);
+            color: white;
+        }
+        
+        .btn-details {
+            background: rgba(203, 213, 225, 0.5);
+            color: var(--dark);
+        }
+        
+        /* 响应式调整 */
+        @media (max-width: 768px) {
+            .hall-cards {
+                grid-template-columns: 1fr;
+            }
+            
+            .filter-bar {
+                flex-direction: column;
+            }
+        }
+        
+        /* 结果计数 */
+        .results-count {
+            background: rgba(15, 23, 42, 0.7);
+            border-radius: 10px;
+            padding: 8px 15px;
+            font-size: 14px;
+            margin-bottom: 15px;
+            display: inline-block;
+        }
+        
+        .no-results {
+            grid-column: 1 / -1;
+            text-align: center;
+            padding: 40px 0;
+            color: #94a3b8;
+            font-size: 16px;
+        }
+        
+        .no-results i {
+            font-size: 32px;
+            margin-bottom: 15px;
+            color: #f59e0b;
+        }
+        
+        /* 加载动画 */
+        .loader {
+            display: none;
+            width: 48px;
+            height: 48px;
+            margin: 20px auto;
+            border: 5px solid rgba(255,255,255,0.2);
+            border-radius: 50%;
+            border-top: 5px solid var(--accent);
+            animation: spin 1s linear infinite;
+        }
+        
+        @keyframes spin {
+            0% { transform: rotate(0deg); }
+            100% { transform: rotate(360deg); }
+        }
+    </style>
+</head>
+<body>
+    <!-- 顶部导航栏 -->
+    <div class="top-nav">
+        <div class="back-btn">
+            <i class="fas fa-arrow-left"></i>
+        </div>
+        <div class="nav-title">
+            <h1>宴会厅管理</h1>
+        </div>
+        <div class="nav-actions">
+            <div class="nav-btn">
+                <i class="fas fa-search"></i>
+            </div>
+            <div class="nav-btn">
+                <i class="fas fa-bell"></i>
+            </div>
+        </div>
+    </div>
+    
+    <!-- 内容区域 -->
+    <div class="content-container">
+        <!-- 操作区域 -->
+        <div class="action-bar">
+            <div class="section-title">
+                <h2>宴会厅列表</h2>
+            </div>
+            <div class="action-buttons">
+                <button class="btn btn-outline" id="resetFilters">
+                    <i class="fas fa-sync-alt"></i> 重置筛选
+                </button>
+                <button class="btn btn-primary">
+                    <i class="fas fa-plus"></i> 新增宴会厅
+                </button>
+            </div>
+        </div>
+        
+        <!-- 筛选区域 -->
+        <div class="filter-bar">
+            <div class="filter-group">
+                <label for="area">位置区域</label>
+                <select id="area">
+                    <option value="all">全部区域</option>
+                    <option value="姑苏区">姑苏区</option>
+                    <option value="工业园区">工业园区</option>
+                    <option value="高新区">高新区</option>
+                </select>
+            </div>
+            
+            <div class="filter-group">
+                <label for="tables">容纳桌数</label>
+                <select id="tables">
+                    <option value="all">不限</option>
+                    <option value="0-20">20桌以下</option>
+                    <option value="20-40">20-40桌</option>
+                    <option value="40+">40桌以上</option>
+                </select>
+            </div>
+            
+            <div class="filter-group">
+                <label for="mealPrice">餐标范围</label>
+                <select id="mealPrice">
+                    <option value="all">不限</option>
+                    <option value="1000-1999">1000-1999元</option>
+                    <option value="2000-2999">2000-2999元</option>
+                    <option value="3000+">3000元以上</option>
+                </select>
+            </div>
+            
+            <div class="filter-group">
+                <label for="sort">排序方式</label>
+                <select id="sort">
+                    <option value="default">默认排序</option>
+                    <option value="price-low">价格从低到高</option>
+                    <option value="price-high">价格从高到低</option>
+                    <option value="area-high">面积从大到小</option>
+                </select>
+            </div>
+        </div>
+        
+        <!-- 结果计数 -->
+        <div class="results-count" id="resultsCount">找到 <span id="count">4</span> 个宴会厅</div>
+        
+        <!-- 加载动画 -->
+        <div class="loader" id="loader"></div>
+        
+        <!-- 宴会厅卡片 -->
+        <div class="hall-cards" id="hallCards">
+            <!-- 苏州庄 -->
+            <div class="hall-card" 
+                 data-area="姑苏区" 
+                 data-min-tables="45" 
+                 data-max-tables="60" 
+                 data-meal-price="1999" 
+                 data-hall-price="456888" 
+                 data-area-size="728">
+                <div class="hall-image" style="background-image: url('https://images.unsplash.com/photo-1511795409834-ef04bbd61622?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80');">
+                    <div class="hall-name">
+                        <h3>LUXURS 苏州庄</h3>
+                        <p>古典与现代完美融合</p>
+                    </div>
+                    <div class="hall-price">¥456,888.00</div>
+                </div>
+                <div class="hall-info">
+                    <div class="info-row">
+                        <span class="info-label">餐标</span>
+                        <span class="info-value">1999元/桌</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">宴会厅高</span>
+                        <span class="info-value">4.5m</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">全厅面积</span>
+                        <span class="info-value">728㎡</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">容纳桌数</span>
+                        <span class="info-value">45-60桌</span>
+                    </div>
+                </div>
+                <div class="hall-footer">
+                    <button class="hall-btn btn-details">
+                        <i class="fas fa-info-circle"></i> 详情
+                    </button>
+                    <button class="hall-btn btn-book">
+                        <i class="fas fa-calendar-check"></i> 预订
+                    </button>
+                </div>
+            </div>
+            
+            <!-- 奥斯卡 -->
+            <div class="hall-card" 
+                 data-area="工业园区" 
+                 data-min-tables="30" 
+                 data-max-tables="40" 
+                 data-meal-price="1999" 
+                 data-hall-price="388800" 
+                 data-area-size="500">
+                <div class="hall-image" style="background-image: url('https://images.unsplash.com/photo-1566665797739-1674de7a421a?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80');">
+                    <div class="hall-name">
+                        <h3>OSCARS 奥斯卡</h3>
+                        <p>欧式奢华宴会厅</p>
+                    </div>
+                    <div class="hall-price">¥388,800.00</div>
+                </div>
+                <div class="hall-info">
+                    <div class="info-row">
+                        <span class="info-label">餐标</span>
+                        <span class="info-value">1999元/桌</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">宴会厅高</span>
+                        <span class="info-value">4.5m</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">餐厅面积</span>
+                        <span class="info-value">500㎡</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">容纳桌数</span>
+                        <span class="info-value">30-40桌</span>
+                    </div>
+                </div>
+                <div class="hall-footer">
+                    <button class="hall-btn btn-details">
+                        <i class="fas fa-info-circle"></i> 详情
+                    </button>
+                    <button class="hall-btn btn-book">
+                        <i class="fas fa-calendar-check"></i> 预订
+                    </button>
+                </div>
+            </div>
+            
+            <!-- 星空之镜 -->
+            <div class="hall-card" 
+                 data-area="高新区" 
+                 data-min-tables="25" 
+                 data-max-tables="35" 
+                 data-meal-price="1999" 
+                 data-hall-price="229999" 
+                 data-area-size="428">
+                <div class="hall-image" style="background-image: url('https://images.unsplash.com/photo-1519671482749-fd09be7ccebf?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80');">
+                    <div class="hall-name">
+                        <h3>SHARRY 星空之镜</h3>
+                        <p>梦幻星空主题宴会厅</p>
+                    </div>
+                    <div class="hall-price">¥229,999.00 <span class="discount-price">(原价¥289,999)</span></div>
+                </div>
+                <div class="hall-info">
+                    <div class="info-row">
+                        <span class="info-label">餐标</span>
+                        <span class="info-value">1999元/桌</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">宴会厅高</span>
+                        <span class="info-value">4.5m</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">全厅面积</span>
+                        <span class="info-value">428㎡</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">容纳桌数</span>
+                        <span class="info-value">25-35桌</span>
+                    </div>
+                </div>
+                <div class="hall-footer">
+                    <button class="hall-btn btn-details">
+                        <i class="fas fa-info-circle"></i> 详情
+                    </button>
+                    <button class="hall-btn btn-book">
+                        <i class="fas fa-calendar-check"></i> 预订
+                    </button>
+                </div>
+            </div>
+            
+            <!-- 盛世厅 -->
+            <div class="hall-card" 
+                 data-area="姑苏区" 
+                 data-min-tables="60" 
+                 data-max-tables="80" 
+                 data-meal-price="2999" 
+                 data-hall-price="528000" 
+                 data-area-size="950">
+                <div class="hall-image" style="background-image: url('https://images.unsplash.com/photo-1556911220-ef412ae179a9?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80');">
+                    <div class="hall-name">
+                        <h3>GRAND HALL 盛世厅</h3>
+                        <p>豪华宴会与会议空间</p>
+                    </div>
+                    <div class="hall-price">¥528,000.00</div>
+                </div>
+                <div class="hall-info">
+                    <div class="info-row">
+                        <span class="info-label">餐标</span>
+                        <span class="info-value">2999元/桌</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">宴会厅高</span>
+                        <span class="info-value">5.2m</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">全厅面积</span>
+                        <span class="info-value">950㎡</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">容纳桌数</span>
+                        <span class="info-value">60-80桌</span>
+                    </div>
+                </div>
+                <div class="hall-footer">
+                    <button class="hall-btn btn-details">
+                        <i class="fas fa-info-circle"></i> 详情
+                    </button>
+                    <button class="hall-btn btn-book">
+                        <i class="fas fa-calendar-check"></i> 预订
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+    <script>
+        // 页面加载后初始化
+        document.addEventListener('DOMContentLoaded', function() {
+            // 初始化筛选功能
+            initFilters();
+        });
+        
+        // 初始化筛选功能
+        function initFilters() {
+            // 获取筛选元素
+            const areaFilter = document.getElementById('area');
+            const tablesFilter = document.getElementById('tables');
+            const mealPriceFilter = document.getElementById('mealPrice');
+            const sortFilter = document.getElementById('sort');
+            const resetButton = document.getElementById('resetFilters');
+            
+            // 添加事件监听器
+            areaFilter.addEventListener('change', filterHalls);
+            tablesFilter.addEventListener('change', filterHalls);
+            mealPriceFilter.addEventListener('change', filterHalls);
+            sortFilter.addEventListener('change', filterHalls);
+            resetButton.addEventListener('click', resetFilters);
+            
+            // 初始筛选
+            filterHalls();
+        }
+        
+        // 筛选和排序宴会厅
+        function filterHalls() {
+            // 显示加载动画
+            const loader = document.getElementById('loader');
+            loader.style.display = 'block';
+            
+            // 模拟加载延迟
+            setTimeout(() => {
+                // 获取筛选值
+                const areaValue = document.getElementById('area').value;
+                const tablesValue = document.getElementById('tables').value;
+                const mealPriceValue = document.getElementById('mealPrice').value;
+                const sortValue = document.getElementById('sort').value;
+                
+                // 获取所有卡片
+                const cards = Array.from(document.querySelectorAll('.hall-card'));
+                let visibleCards = cards.slice(); // 初始为所有卡片
+                
+                // 区域筛选
+                if (areaValue !== 'all') {
+                    visibleCards = visibleCards.filter(card => card.dataset.area === areaValue);
+                }
+                
+                // 容纳桌数筛选
+                if (tablesValue !== 'all') {
+                    if (tablesValue === '0-20') {
+                        visibleCards = visibleCards.filter(card => parseInt(card.dataset.maxTables) <= 20);
+                    } else if (tablesValue === '20-40') {
+                        visibleCards = visibleCards.filter(card => 
+                            parseInt(card.dataset.minTables) >= 20 && 
+                            parseInt(card.dataset.maxTables) <= 40
+                        );
+                    } else if (tablesValue === '40+') {
+                        visibleCards = visibleCards.filter(card => parseInt(card.dataset.minTables) >= 40);
+                    }
+                }
+                
+                // 餐标范围筛选
+                if (mealPriceValue !== 'all') {
+                    if (mealPriceValue === '1000-1999') {
+                        visibleCards = visibleCards.filter(card => 
+                            parseInt(card.dataset.mealPrice) >= 1000 && 
+                            parseInt(card.dataset.mealPrice) <= 1999
+                        );
+                    } else if (mealPriceValue === '2000-2999') {
+                        visibleCards = visibleCards.filter(card => 
+                            parseInt(card.dataset.mealPrice) >= 2000 && 
+                            parseInt(card.dataset.mealPrice) <= 2999
+                        );
+                    } else if (mealPriceValue === '3000+') {
+                        visibleCards = visibleCards.filter(card => parseInt(card.dataset.mealPrice) >= 3000);
+                    }
+                }
+                
+                // 排序功能实现
+                if (sortValue !== 'default') {
+                    visibleCards.sort((a, b) => {
+                        const priceA = parseInt(a.dataset.hallPrice);
+                        const priceB = parseInt(b.dataset.hallPrice);
+                        const areaA = parseInt(a.dataset.areaSize);
+                        const areaB = parseInt(b.dataset.areaSize);
+                        
+                        if (sortValue === 'price-low') {
+                            return priceA - priceB;
+                        } else if (sortValue === 'price-high') {
+                            return priceB - priceA;
+                        } else if (sortValue === 'area-high') {
+                            return areaB - areaA;
+                        }
+                        return 0;
+                    });
+                }
+                
+                // 隐藏所有卡片
+                cards.forEach(card => {
+                    card.style.display = 'none';
+                });
+                
+                // 显示符合条件的卡片
+                visibleCards.forEach(card => {
+                    card.style.display = 'block';
+                });
+                
+                // 更新结果计数
+                document.getElementById('count').textContent = visibleCards.length;
+                
+                // 重新排序DOM以反映排序顺序
+                const hallCardsContainer = document.getElementById('hallCards');
+                visibleCards.forEach(card => {
+                    hallCardsContainer.appendChild(card);
+                });
+                
+                // 如果没有结果,显示提示
+                const hallCards = document.getElementById('hallCards');
+                const noResults = document.querySelector('.no-results');
+                
+                if (visibleCards.length === 0) {
+                    if (!noResults) {
+                        const noResultsElement = document.createElement('div');
+                        noResultsElement.className = 'no-results';
+                        noResultsElement.innerHTML = `
+                            <i class="fas fa-search"></i>
+                            <h3>未找到符合条件的宴会厅</h3>
+                            <p>请尝试调整筛选条件</p>
+                        `;
+                        hallCards.appendChild(noResultsElement);
+                    }
+                } else if (noResults) {
+                    hallCards.removeChild(noResults);
+                }
+                
+                // 隐藏加载动画
+                loader.style.display = 'none';
+            }, 500); // 模拟加载时间
+        }
+        
+        // 重置筛选条件
+        function resetFilters() {
+            document.getElementById('area').value = 'all';
+            document.getElementById('tables').value = 'all';
+            document.getElementById('mealPrice').value = 'all';
+            document.getElementById('sort').value = 'default';
+            
+            filterHalls();
+        }
+        
+        // 返回按钮功能
+        document.querySelector('.back-btn').addEventListener('click', function() {
+            alert('返回上一级页面');
+        });
+        
+        // 预订按钮交互
+        const bookButtons = document.querySelectorAll('.btn-book');
+        bookButtons.forEach(button => {
+            button.addEventListener('click', function() {
+                const hallName = this.closest('.hall-card').querySelector('h3').textContent;
+                alert(`您已开始预订: ${hallName} 宴会厅`);
+            });
+        });
+        
+        // 详情按钮交互
+        const detailButtons = document.querySelectorAll('.btn-details');
+        detailButtons.forEach(button => {
+            button.addEventListener('click', function() {
+                const hallName = this.closest('.hall-card').querySelector('h3').textContent;
+                alert(`查看 ${hallName} 的详细信息`);
+            });
+        });
+        
+        // 新增宴会厅按钮
+        document.querySelector('.btn-primary').addEventListener('click', function() {
+            alert('打开新增宴会厅表单');
+        });
+        
+        // 卡片悬停效果
+        const cards = document.querySelectorAll('.hall-card');
+        cards.forEach(card => {
+            card.addEventListener('mouseenter', function() {
+                this.style.transform = 'translateY(-5px)';
+            });
+            
+            card.addEventListener('mouseleave', function() {
+                this.style.transform = 'translateY(0)';
+            });
+        });
+    </script>
+</body>
+</html>

+ 168 - 1
manager-web/src/modules/manager/mobile/page-cart/page-cart.html

@@ -1 +1,168 @@
-<p>page-cart works!</p>
+<!-- page-cart.html -->
+<div class="banquet-management">
+  <!-- 顶部导航栏 -->
+  <div class="top-nav">
+    <div class="back-btn" (click)="goBack()">
+      <i class="fas fa-arrow-left"></i>
+    </div>
+    <div class="nav-title">
+      <h1>宴会厅管理</h1>
+      <div class="nav-subtitle">九州智能宴会管理系统</div>
+    </div>
+    <div class="nav-actions">
+      <div class="nav-btn" (click)="toggleSearch()">
+        <i class="fas fa-search"></i>
+      </div>
+      <div class="nav-btn notification" [class.has-notification]="hasNotification">
+        <i class="fas fa-bell"></i>
+      </div>
+    </div>
+  </div>
+  
+  <!-- 搜索框 -->
+  <div class="search-bar" [class.active]="showSearch">
+    <input 
+      type="text" 
+      placeholder="搜索宴会厅名称、位置或特色..." 
+      [(ngModel)]="searchQuery"
+      (input)="filterHalls()"
+    >
+    <button class="search-close" (click)="toggleSearch()">
+      <i class="fas fa-times"></i>
+    </button>
+  </div>
+  
+  <!-- 内容区域 -->
+  <div class="content-container">
+    <!-- 操作区域 -->
+    <div class="action-bar">
+      <div class="section-title">
+        <h2>宴会厅列表</h2>
+        <div class="info-badge">{{filteredHalls.length}}/{{halls.length}}</div>
+      </div>
+      <div class="action-buttons">
+        <button class="btn btn-refresh" (click)="resetFilters()">
+          <i class="fas fa-sync-alt"></i> 重新筛选
+        </button>
+        <button class="btn btn-primary" (click)="addNewBanquet()">
+          <i class="fas fa-plus"></i> 新增宴会厅
+        </button>
+      </div>
+    </div>
+    
+    <!-- 筛选区域 -->
+    <div class="filter-bar">
+      <div class="filter-group">
+        <label for="area"><i class="fas fa-map-marker-alt"></i> 位置区域</label>
+        <select id="area" [(ngModel)]="selectedArea" (change)="filterHalls()">
+          <option value="all">全部区域</option>
+          <option *ngFor="let area of areas" [value]="area">{{area}}</option>
+        </select>
+      </div>
+      
+      <div class="filter-group">
+        <label for="tables"><i class="fas fa-utensils"></i> 容纳桌数</label>
+        <select id="tables" [(ngModel)]="selectedTableRange" (change)="filterHalls()">
+          <option value="all">不限</option>
+          <option *ngFor="let range of tableRanges" [value]="range.value">{{range.label}}</option>
+        </select>
+      </div>
+      
+      <div class="filter-group">
+        <label for="mealPrice"><i class="fas fa-tag"></i> 餐标范围</label>
+        <select id="mealPrice" [(ngModel)]="selectedMealPrice" (change)="filterHalls()">
+          <option value="all">不限</option>
+          <option *ngFor="let price of mealPrices" [value]="price.value">{{price.label}}</option>
+        </select>
+      </div>
+      
+      <div class="filter-group">
+        <label for="sort"><i class="fas fa-sort"></i> 排序方式</label>
+        <select id="sort" [(ngModel)]="selectedSort" (change)="filterHalls()">
+          <option value="default">默认排序</option>
+          <option *ngFor="let sort of sortOptions" [value]="sort.value">{{sort.label}}</option>
+        </select>
+      </div>
+    </div>
+    
+    <!-- 结果计数 -->
+    <div class="results-count">
+      <i class="fas fa-filter"></i> 找到 <span class="highlight">{{filteredHalls.length}}</span> 个宴会厅
+    </div>
+    
+    <!-- 加载动画 -->
+    <div class="loader" *ngIf="isLoading">
+      <div class="particle"></div>
+      <div class="particle"></div>
+      <div class="particle"></div>
+    </div>
+    
+    <!-- 宴会厅卡片 -->
+    <div class="hall-cards" id="hallCards">
+      <!-- 无结果提示 -->
+      <div class="no-results" *ngIf="filteredHalls.length === 0 && !isLoading">
+        <div class="hologram">
+          <div class="hologram-inner"></div>
+        </div>
+        <h3>未找到符合条件的宴会厅</h3>
+        <p>请尝试调整筛选条件或搜索关键词</p>
+        <button class="btn btn-outline" (click)="resetFilters()">
+          <i class="fas fa-redo"></i> 重置所有筛选
+        </button>
+      </div>
+      
+      <!-- 宴会厅卡片循环 -->
+      <div class="hall-card" 
+           *ngFor="let hall of filteredHalls"
+           [class.featured]="hall.featured"
+           (mouseenter)="hoverCard(hall, true)"
+           (mouseleave)="hoverCard(hall, false)"
+           [class.hover]="hoveredHall === hall.id">
+        <div class="card-corner top-left"></div>
+        <div class="card-corner top-right"></div>
+        <div class="card-corner bottom-left"></div>
+        <div class="card-corner bottom-right"></div>
+        
+        <div class="hall-image" [style.background-image]="'url(' + hall.imageUrl + ')'">
+          <div class="status-badge" [class.available]="hall.available">
+            {{hall.available ? '可预订' : '已订满'}}
+          </div>
+          <div class="hall-name">
+            <h3>{{hall.name}}</h3>
+            <p>{{hall.subtitle}}</p>
+          </div>
+          <div class="hall-price">
+            ¥{{hall.hallPrice | number:'1.0-0'}}元
+            <span class="discount-price" *ngIf="hall.originalPrice">(原价¥{{hall.originalPrice | number:'1.0-0'}}元)</span>
+          </div>
+        </div>
+        <div class="hall-info">
+          <div class="info-row">
+            <span class="info-label"><i class="fas fa-tag"></i> 餐标</span>
+            <span class="info-value">{{hall.mealPrice}}元/桌</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label"><i class="fas fa-ruler-vertical"></i> 厅高</span>
+            <span class="info-value">{{hall.height}}m</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label"><i class="fas fa-vector-square"></i> 面积</span>
+            <span class="info-value">{{hall.areaSize}}㎡</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label"><i class="fas fa-chair"></i> 容纳桌数</span>
+            <span class="info-value">{{hall.minTables}}-{{hall.maxTables}}桌</span>
+          </div>
+        </div>
+        <div class="hall-footer">
+          <button class="hall-btn btn-details" (click)="showDetails(hall)">
+            <i class="fas fa-info-circle"></i> 详情
+          </button>
+          <button class="hall-btn btn-book" [disabled]="!hall.available" (click)="bookHall(hall)">
+            <i class="fas fa-calendar-check"></i> {{hall.available ? '预订' : '已满'}}
+          </button>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>

+ 829 - 0
manager-web/src/modules/manager/mobile/page-cart/page-cart.scss

@@ -0,0 +1,829 @@
+/* page-cart.scss */
+@import url('https://fonts.googleapis.com/css2?family=Exo+2:wght@300;400;500;600;700&display=swap');
+
+:root {
+  --purple-primary: #9c27b0;
+  --purple-light: #ba68c8;
+  --purple-dark: #7b1fa2;
+  --primary: #1e88e5;
+  --primary-light: #42a5f5;
+  --primary-dark: #1565c0;
+  --accent: #ff9800;
+  --accent-light: #ffb74d;
+  --success: #4caf50;
+  --danger: #f44336;
+  --light: #f8fafc;
+  --dark: #0f172a;
+  --card-bg: rgba(26, 29, 45, 0.8);
+  --glass: rgba(255, 255, 255, 0.08);
+  --glass-border: rgba(66, 165, 245, 0.3);
+  --shadow: 0 8px 32px rgba(31, 38, 135, 0.15);
+  --glow: 0 0 15px rgba(66, 165, 245, 0.5);
+}
+
+.banquet-management {
+  * {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+    font-family: 'Exo 2', 'Segoe UI', 'Microsoft YaHei', sans-serif;
+  }
+  
+  body {
+    background: linear-gradient(135deg, #0b1120, #1e293b);
+    color: var(--light);
+    min-height: 100vh;
+    padding: 0;
+    position: relative;
+    overflow-x: hidden;
+    
+    &::before {
+      content: '';
+      position: absolute;
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+      background: 
+        radial-gradient(circle at 10% 20%, rgba(30, 136, 229, 0.15) 0%, transparent 30%),
+        radial-gradient(circle at 90% 80%, rgba(255, 152, 0, 0.15) 0%, transparent 30%);
+      z-index: -1;
+    }
+  }
+  
+  /* 顶部导航栏 */
+  .top-nav {
+    background: linear-gradient(135deg, rgba(15, 23, 42, 0.98), rgba(21, 33, 61, 0.98));
+    backdrop-filter: blur(10px);
+    border-bottom: 1px solid var(--glass-border);
+    padding: 12px 25px;
+    display: flex;
+    align-items: center;
+    gap: 15px;
+    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
+    position: sticky;
+    top: 0;
+    z-index: 100;
+    
+    .back-btn {
+      width: 42px;
+      height: 42px;
+      border-radius: 12px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      background: rgba(255, 255, 255, 0.1);
+      color: #e2e8f0;
+      cursor: pointer;
+      transition: all 0.3s ease;
+      
+      &:hover {
+        background: rgba(66, 165, 245, 0.3);
+        transform: translateX(-3px);
+        box-shadow: var(--glow);
+      }
+      
+      i {
+        font-size: 18px;
+      }
+    }
+    
+    .nav-title {
+      flex: 1;
+      
+      h1 {
+        font-size: 22px;
+        font-weight: 700;
+        background: linear-gradient(to right, var(--primary-light), var(--accent-light));
+        -webkit-background-clip: text;
+        -webkit-text-fill-color: transparent;
+        letter-spacing: 0.5px;
+      }
+      
+      .nav-subtitle {
+        font-size: 12px;
+        color: #bbdefb;
+        font-weight: 300;
+        letter-spacing: 1px;
+        margin-top: 2px;
+      }
+    }
+    
+    .nav-actions {
+      display: flex;
+      gap: 12px;
+      
+      .nav-btn {
+        width: 42px;
+        height: 42px;
+        border-radius: 12px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        background: rgba(255, 255, 255, 0.1);
+        color: #e2e8f0;
+        cursor: pointer;
+        transition: all 0.3s ease;
+        position: relative;
+        
+        &:hover {
+          background: rgba(66, 165, 245, 0.3);
+          box-shadow: var(--glow);
+        }
+        
+        i {
+          font-size: 18px;
+        }
+        
+        &.notification {
+          &::after {
+            content: '';
+            position: absolute;
+            top: 8px;
+            right: 8px;
+            width: 8px;
+            height: 8px;
+            background: var(--danger);
+            border-radius: 50%;
+            opacity: 0;
+            transition: opacity 0.3s;
+          }
+          
+          &.has-notification::after {
+            opacity: 1;
+          }
+        }
+      }
+    }
+  }
+  
+  /* 搜索框 */
+  .search-bar {
+    background: linear-gradient(135deg, rgba(21, 33, 61, 0.95), rgba(15, 23, 42, 0.95));
+    padding: 15px 25px;
+    border-bottom: 1px solid rgba(66, 165, 245, 0.3);
+    transform: translateY(-100%);
+    opacity: 0;
+    transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+    display: flex;
+    
+    input {
+      flex: 1;
+      background: rgba(15, 23, 42, 0.7);
+      border: 1px solid rgba(66, 165, 245, 0.4);
+      border-radius: 12px;
+      padding: 12px 20px;
+      color: var(--light);
+      font-size: 16px;
+      transition: all 0.3s;
+      
+      &:focus {
+        outline: none;
+        border-color: var(--primary-light);
+        box-shadow: 0 0 0 3px rgba(66, 165, 245, 0.3);
+      }
+      
+      &::placeholder {
+        color: #90caf9;
+      }
+    }
+    
+    .search-close {
+      width: 46px;
+      height: 46px;
+      border-radius: 12px;
+      background: rgba(255, 255, 255, 0.1);
+      border: none;
+      color: var(--light);
+      margin-left: 12px;
+      cursor: pointer;
+      transition: all 0.3s;
+      
+      &:hover {
+        background: rgba(239, 68, 68, 0.3);
+      }
+    }
+    
+    &.active {
+      transform: translateY(0);
+      opacity: 1;
+    }
+  }
+  
+  /* 内容容器 */
+  .content-container {
+    max-width: 1400px;
+    margin: 25px auto 50px;
+    padding: 0 25px;
+  }
+  
+  /* 功能区域 */
+  .action-bar {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 25px;
+    padding: 0 15px;
+    align-items: center;
+    
+    .section-title {
+      display: flex;
+      align-items: center;
+      gap: 15px;
+      
+      h2 {
+        font-size: 20px;
+        font-weight: 700;
+        color: var(--purple-primary);
+        position: relative;
+        padding-left: 15px;
+        text-shadow: 0 0 8px rgba(156, 39, 176, 0.5);
+        
+        &::before {
+          content: '';
+          position: absolute;
+          left: 0;
+          top: 50%;
+          transform: translateY(-50%);
+          height: 24px;
+          width: 4px;
+          background: linear-gradient(to bottom, var(--primary), var(--accent));
+          border-radius: 2px;
+        }
+      }
+      
+      .info-badge {
+        background: rgba(66, 165, 245, 0.25);
+        color: #bbdefb;
+        font-size: 14px;
+        font-weight: 600;
+        padding: 4px 12px;
+        border-radius: 20px;
+        border: 1px solid rgba(66, 165, 245, 0.4);
+      }
+    }
+    
+    .action-buttons {
+      display: flex;
+      gap: 15px;
+    }
+  }
+  
+  .btn {
+    padding: 10px 20px;
+    border-radius: 12px;
+    font-weight: 600;
+    cursor: pointer;
+    transition: all 0.3s ease;
+    border: none;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    font-size: 15px;
+    position: relative;
+    overflow: hidden;
+    
+    &::before {
+      content: '';
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      background: rgba(255, 255, 255, 0.1);
+      opacity: 0;
+      transition: opacity 0.3s;
+    }
+    
+    &:hover::before {
+      opacity: 1;
+    }
+    
+    &-primary {
+      background: linear-gradient(135deg, var(--accent), var(--accent-light));
+      color: #5d4037;
+      box-shadow: 0 4px 15px rgba(255, 152, 0, 0.4);
+      
+      &:hover {
+        transform: translateY(-3px);
+        box-shadow: 0 8px 20px rgba(255, 152, 0, 0.5);
+      }
+    }
+    
+    &-refresh {
+      background: transparent;
+      border: 1px solid var(--primary);
+      color: var(--primary);
+      
+      &:hover {
+        background: rgba(66, 165, 245, 0.2);
+        box-shadow: 0 0 10px rgba(66, 165, 245, 0.4);
+        color: #ffffff;
+      }
+    }
+    
+    &-outline {
+      background: transparent;
+      border: 1px solid rgba(66, 165, 245, 0.5);
+      color: #bbdefb;
+      
+      &:hover {
+        background: rgba(255, 255, 255, 0.08);
+        border-color: rgba(66, 165, 245, 0.8);
+        box-shadow: var(--glow);
+      }
+    }
+  }
+  
+  /* 筛选区域 */
+  .filter-bar {
+    background: var(--glass);
+    backdrop-filter: blur(10px);
+    border-radius: 16px;
+    border: 1px solid rgba(66, 165, 245, 0.3);
+    padding: 20px;
+    margin-bottom: 30px;
+    display: flex;
+    flex-wrap: wrap;
+    gap: 20px;
+    box-shadow: var(--shadow);
+  }
+  
+  .filter-group {
+    display: flex;
+    flex-direction: column;
+    gap: 10px;
+    min-width: 200px;
+    flex: 1;
+    
+    label {
+      font-size: 15px;
+      color: var(--purple-light);
+      font-weight: 500;
+      display: flex;
+      align-items: center;
+      gap: 8px;
+    }
+    
+    select {
+      background: rgba(15, 23, 42, 0.7);
+      border: 1px solid rgba(66, 165, 245, 0.3);
+      border-radius: 12px;
+      padding: 12px 18px;
+      color: #e3f2fd;
+      width: 100%;
+      cursor: pointer;
+      transition: all 0.3s;
+      appearance: none;
+      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%2390caf9'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");
+      background-repeat: no-repeat;
+      background-position: right 15px center;
+      background-size: 16px;
+      
+      &:hover, &:focus {
+        border-color: rgba(66, 165, 245, 0.8);
+        box-shadow: var(--glow);
+      }
+      
+      option {
+        background: rgba(15, 23, 42, 0.9);
+      }
+    }
+  }
+  
+  /* 结果计数 */
+  .results-count {
+    background: rgba(15, 23, 42, 0.7);
+    border-radius: 12px;
+    padding: 10px 20px;
+    font-size: 15px;
+    margin-bottom: 20px;
+    display: inline-flex;
+    align-items: center;
+    gap: 10px;
+    border: 1px solid rgba(66, 165, 245, 0.3);
+    color: #bbdefb;
+    
+    .highlight {
+      color: var(--accent-light);
+      font-weight: 700;
+      font-size: 18px;
+    }
+  }
+  
+  /* 宴会厅卡片 */
+  .hall-cards {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+    gap: 25px;
+    margin-bottom: 40px;
+  }
+  
+  .hall-card {
+    background: var(--card-bg);
+    border-radius: 18px;
+    border: 1px solid rgba(66, 165, 245, 0.2);
+    overflow: hidden;
+    box-shadow: var(--shadow);
+    transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+    color: var(--light);
+    position: relative;
+    transform: translateY(0);
+    
+    .card-corner {
+      position: absolute;
+      width: 20px;
+      height: 20px;
+      border: 2px solid var(--primary-light);
+      opacity: 0;
+      transition: opacity 0.3s;
+      
+      &.top-left {
+        top: -1px;
+        left: -1px;
+        border-right: none;
+        border-bottom: none;
+        border-top-left-radius: 18px;
+      }
+      
+      &.top-right {
+        top: -1px;
+        right: -1px;
+        border-left: none;
+        border-bottom: none;
+        border-top-right-radius: 18px;
+      }
+      
+      &.bottom-left {
+        bottom: -1px;
+        left: -1px;
+        border-right: none;
+        border-top: none;
+        border-bottom-left-radius: 18px;
+      }
+      
+      &.bottom-right {
+        bottom: -1px;
+        right: -1px;
+        border-left: none;
+        border-top: none;
+        border-bottom-right-radius: 18px;
+      }
+    }
+    
+    &.featured {
+      border: 1px solid rgba(255, 152, 0, 0.4);
+      box-shadow: 0 10px 30px rgba(255, 152, 0, 0.3);
+      
+      &::before {
+        content: '推荐';
+        position: absolute;
+        top: 15px;
+        left: -30px;
+        width: 120px;
+        padding: 5px 0;
+        background: linear-gradient(135deg, var(--accent), var(--accent-light));
+        color: var(--dark);
+        font-weight: 700;
+        font-size: 14px;
+        text-align: center;
+        transform: rotate(-45deg);
+        z-index: 10;
+      }
+    }
+    
+    &.hover {
+      transform: translateY(-10px);
+      box-shadow: 0 15px 35px rgba(31, 38, 135, 0.25);
+      border-color: rgba(66, 165, 245, 0.5);
+      
+      .card-corner {
+        opacity: 1;
+      }
+    }
+    
+    .hall-image {
+      height: 200px;
+      background-size: cover;
+      background-position: center;
+      position: relative;
+      overflow: hidden;
+      
+      &::before {
+        content: '';
+        position: absolute;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        background: linear-gradient(to top, rgba(0,0,0,0.8), transparent 60%);
+      }
+      
+      &::after {
+        content: '';
+        position: absolute;
+        top: 0;
+        left: -100%;
+        width: 50%;
+        height: 100%;
+        background: linear-gradient(to right, transparent, rgba(255,255,255,0.2), transparent);
+        animation: shimmer 2s infinite;
+      }
+    }
+    
+    .status-badge {
+      position: absolute;
+      top: 15px;
+      left: 15px;
+      padding: 5px 12px;
+      border-radius: 20px;
+      font-size: 13px;
+      font-weight: 600;
+      z-index: 2;
+      background: rgba(15, 23, 42, 0.8);
+      color: #bbdefb;
+      border: 1px solid rgba(255, 255, 255, 0.1);
+      
+      &.available {
+        background: rgba(76, 175, 80, 0.15);
+        color: var(--success);
+        border-color: rgba(76, 175, 80, 0.3);
+      }
+    }
+    
+    .hall-name {
+      position: absolute;
+      bottom: 20px;
+      left: 20px;
+      z-index: 2;
+      
+      h3 {
+        font-size: 22px;
+        font-weight: 700;
+        color: white;
+        margin-bottom: 5px;
+        text-shadow: 0 2px 4px rgba(0,0,0,0.5);
+      }
+      
+      p {
+        font-size: 14px;
+        color: #e0f7fa;
+        opacity: 0.9;
+      }
+    }
+    
+    .hall-price {
+      position: absolute;
+      top: 20px;
+      right: 20px;
+      background: linear-gradient(135deg, var(--primary), var(--primary-dark));
+      padding: 8px 16px;
+      border-radius: 30px;
+      font-weight: 700;
+      font-size: 17px;
+      color: white;
+      z-index: 2;
+      box-shadow: 0 4px 15px rgba(30, 136, 229, 0.4);
+    }
+    
+    .discount-price {
+      text-decoration: line-through;
+      color: #ffcdd2;
+      font-size: 13px;
+      margin-left: 5px;
+      opacity: 0.8;
+    }
+    
+    .hall-info {
+      padding: 20px;
+    }
+    
+    .info-row {
+      display: flex;
+      justify-content: space-between;
+      padding: 12px 0;
+      border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+      
+      &:last-child {
+        border-bottom: none;
+      }
+    }
+    
+    .info-label {
+      font-weight: 500;
+      color: var(--purple-light);
+      font-size: 15px;
+      display: flex;
+      align-items: center;
+      gap: 8px;
+    }
+    
+    .info-value {
+      font-weight: 600;
+      color: var(--purple-light);
+      font-size: 15px;
+    }
+    
+    .hall-footer {
+      display: flex;
+      justify-content: space-between;
+      padding: 15px 20px;
+      background: rgba(30, 41, 59, 0.6);
+      border-top: 1px solid rgba(255, 255, 255, 0.05);
+    }
+  }
+  
+  .hall-btn {
+    padding: 10px 18px;
+    border-radius: 10px;
+    font-size: 14px;
+    font-weight: 600;
+    cursor: pointer;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    border: none;
+    transition: all 0.3s ease;
+    
+    &:hover {
+      transform: translateY(-3px);
+      box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
+    }
+    
+    &:disabled {
+      opacity: 0.6;
+      cursor: not-allowed;
+      transform: none !important;
+      box-shadow: none !important;
+    }
+    
+    &.btn-book {
+      background: linear-gradient(135deg, var(--primary), var(--primary-dark)) !important;
+      color: white !important;
+      
+      &:hover:not(:disabled) {
+        box-shadow: 0 5px 15px rgba(30, 136, 229, 0.4) !important;
+      }
+    }
+    
+    &.btn-details {
+      background: rgba(187, 222, 251, 0.15);
+      color: #bbdefb;
+      
+      &:hover {
+        background: rgba(187, 222, 251, 0.25);
+      }
+    }
+  }
+  
+  /* 无结果提示 */
+  .no-results {
+    grid-column: 1 / -1;
+    text-align: center;
+    padding: 50px 20px;
+    color: #bbdefb;
+    font-size: 16px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    
+    .hologram {
+      width: 120px;
+      height: 120px;
+      border-radius: 50%;
+      background: rgba(66, 165, 245, 0.1);
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      margin-bottom: 30px;
+      position: relative;
+      overflow: hidden;
+      
+      &::before {
+        content: '';
+        position: absolute;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        background: conic-gradient(
+          transparent, 
+          rgba(66, 165, 245, 0.3), 
+          transparent
+        );
+        animation: rotate 3s linear infinite;
+      }
+      
+      .hologram-inner {
+        width: 80px;
+        height: 80px;
+        background: rgba(15, 23, 42, 0.7);
+        border-radius: 50%;
+        z-index: 2;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        
+        i {
+          font-size: 32px;
+          color: var(--primary-light);
+        }
+      }
+    }
+    
+    h3 {
+      font-size: 24px;
+      margin-bottom: 10px;
+      color: #e3f2fd;
+    }
+    
+    p {
+      margin-bottom: 25px;
+      max-width: 500px;
+    }
+  }
+  
+  /* 加载动画 */
+  .loader {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    gap: 12px;
+    height: 100px;
+    
+    .particle {
+      width: 20px;
+      height: 20px;
+      background: var(--primary-light);
+      border-radius: 50%;
+      animation: bounce 1.2s infinite ease-in-out;
+      
+      &:nth-child(1) {
+        animation-delay: -0.32s;
+        background: var(--accent);
+      }
+      
+      &:nth-child(2) {
+        animation-delay: -0.16s;
+        background: var(--primary);
+      }
+    }
+  }
+  
+  /* 响应式调整 */
+  @media (max-width: 992px) {
+    .hall-cards {
+      grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+    }
+  }
+  
+  @media (max-width: 768px) {
+    .top-nav {
+      padding: 12px 15px;
+    }
+    
+    .content-container {
+      padding: 0 15px;
+    }
+    
+    .hall-cards {
+      grid-template-columns: 1fr;
+    }
+    
+    .filter-bar {
+      flex-direction: column;
+      padding: 15px;
+    }
+    
+    .action-bar {
+      flex-direction: column;
+      gap: 15px;
+      align-items: flex-start;
+      
+      .action-buttons {
+        width: 100%;
+        justify-content: flex-end;
+      }
+    }
+  }
+  
+  @keyframes shimmer {
+    100% {
+      left: 200%;
+    }
+  }
+  
+  @keyframes rotate {
+    100% {
+      transform: rotate(360deg);
+    }
+  }
+  
+  @keyframes bounce {
+    0%, 80%, 100% {
+      transform: translateY(0);
+    }
+    40% {
+      transform: translateY(-25px);
+    }
+  }
+}

+ 17 - 17
manager-web/src/modules/manager/mobile/page-cart/page-cart.spec.ts

@@ -1,23 +1,23 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
+  import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { PageCart } from './page-cart';
+  import { PageCart } from './page-cart';
 
-describe('PageCart', () => {
-  let component: PageCart;
-  let fixture: ComponentFixture<PageCart>;
+  describe('PageCart', () => {
+    let component: PageCart;
+    let fixture: ComponentFixture<PageCart>;
 
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [PageCart]
-    })
-    .compileComponents();
+    beforeEach(async () => {
+      await TestBed.configureTestingModule({
+        imports: [PageCart]
+      })
+      .compileComponents();
 
-    fixture = TestBed.createComponent(PageCart);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
+      fixture = TestBed.createComponent(PageCart);
+      component = fixture.componentInstance;
+      fixture.detectChanges();
+    });
 
-  it('should create', () => {
-    expect(component).toBeTruthy();
+    it('should create', () => {
+      expect(component).toBeTruthy();
+    });
   });
-});

+ 298 - 4
manager-web/src/modules/manager/mobile/page-cart/page-cart.ts

@@ -1,11 +1,305 @@
+// page-cart.ts
 import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+interface BanquetHall {
+  id: number;
+  name: string;
+  subtitle: string;
+  area: string;
+  minTables: number;
+  maxTables: number;
+  mealPrice: number;
+  hallPrice: number;
+  areaSize: number;
+  imageUrl: string;
+  height: string;
+  originalPrice?: number;
+  featured?: boolean;
+  available: boolean;
+}
+
+interface FilterOption {
+  value: string;
+  label: string;
+}
 
 @Component({
   selector: 'app-page-cart',
-  imports: [],
+  standalone: true,
+  imports: [CommonModule, FormsModule],
   templateUrl: './page-cart.html',
-  styleUrl: './page-cart.scss'
+  styleUrls: ['./page-cart.scss']
 })
 export class PageCart {
-
-}
+  // 筛选选项
+  areas: string[] = ['姑苏区', '工业园区', '高新区', '吴中区', '相城区'];
+  tableRanges: FilterOption[] = [
+    { value: '0-20', label: '20桌以下' },
+    { value: '20-40', label: '20-40桌' },
+    { value: '40-60', label: '40-60桌' },
+    { value: '60+', label: '60桌以上' }
+  ];
+  mealPrices: FilterOption[] = [
+    { value: '1000-1999', label: '1000-1999元' },
+    { value: '2000-2999', label: '2000-2999元' },
+    { value: '3000-3999', label: '3000-3999元' },
+    { value: '4000+', label: '4000元以上' }
+  ];
+  sortOptions: FilterOption[] = [
+    { value: 'price-low', label: '价格从低到高' },
+    { value: 'price-high', label: '价格从高到低' },
+    { value: 'area-high', label: '面积从大到小' },
+    { value: 'tables-high', label: '容纳桌数从多到少' }
+  ];
+  
+  // 当前筛选状态
+  selectedArea: string = 'all';
+  selectedTableRange: string = 'all';
+  selectedMealPrice: string = 'all';
+  selectedSort: string = 'default';
+  searchQuery: string = '';
+  showSearch: boolean = false;
+  
+  // 通知状态
+  hasNotification: boolean = true;
+  
+  // 宴会厅数据
+  halls: BanquetHall[] = [
+    {
+      id: 1,
+      name: 'LUXURS 苏州庄',
+      subtitle: '古典与现代完美融合',
+      area: '姑苏区',
+      minTables: 45,
+      maxTables: 60,
+      mealPrice: 1999,
+      hallPrice: 456888,
+      areaSize: 728,
+      imageUrl: 'https://images.unsplash.com/photo-1511795409834-ef04bbd61622?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
+      height: '4.5',
+      featured: true,
+      available: true
+    },
+    {
+      id: 2,
+      name: 'OSCARS 奥斯卡',
+      subtitle: '欧式奢华宴会厅',
+      area: '工业园区',
+      minTables: 30,
+      maxTables: 40,
+      mealPrice: 1999,
+      hallPrice: 388800,
+      areaSize: 500,
+      imageUrl: 'https://images.unsplash.com/photo-1566665797739-1674de7a421a?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
+      height: '4.5',
+      available: true
+    },
+    {
+      id: 3,
+      name: 'SHARRY 星空之镜',
+      subtitle: '梦幻星空主题宴会厅',
+      area: '高新区',
+      minTables: 25,
+      maxTables: 35,
+      mealPrice: 1999,
+      hallPrice: 229999,
+      areaSize: 428,
+      imageUrl: 'https://images.unsplash.com/photo-1519671482749-fd09be7ccebf?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
+      height: '4.5',
+      originalPrice: 289999,
+      featured: true,
+      available: false
+    },
+    {
+      id: 4,
+      name: 'GRAND HALL 盛世厅',
+      subtitle: '豪华宴会与会议空间',
+      area: '姑苏区',
+      minTables: 60,
+      maxTables: 80,
+      mealPrice: 2999,
+      hallPrice: 528000,
+      areaSize: 950,
+      imageUrl: 'https://images.unsplash.com/photo-1552168324-d612d77725e3?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
+      height: '5.2',
+      available: true
+    },
+    {
+      id: 5,
+      name: 'AURORA 极光厅',
+      subtitle: '未来科技感宴会空间',
+      area: '工业园区',
+      minTables: 35,
+      maxTables: 50,
+      mealPrice: 3599,
+      hallPrice: 398000,
+      areaSize: 680,
+      imageUrl: 'https://images.unsplash.com/photo-1527525443983-6e60c75fff46?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
+      height: '5.5',
+      featured: true,
+      available: true
+    },
+    {
+      id: 6,
+      name: 'CRYSTAL 水晶宫',
+      subtitle: '透明穹顶自然采光',
+      area: '吴中区',
+      minTables: 20,
+      maxTables: 30,
+      mealPrice: 2599,
+      hallPrice: 298000,
+      areaSize: 380,
+      imageUrl: 'https://images.unsplash.com/photo-1519643381401-22c77e60520e?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
+      height: '6.0',
+      available: true
+    }
+  ];
+  
+  // 过滤后的宴会厅列表
+  filteredHalls: BanquetHall[] = [];
+  
+  // 加载状态
+  isLoading: boolean = false;
+  
+  // 当前悬停的宴会厅ID
+  hoveredHall: number | null = null;
+  
+  ngOnInit() {
+    // 初始化时加载所有宴会厅
+    this.filteredHalls = [...this.halls];
+  }
+  
+  // 切换搜索框显示
+  toggleSearch() {
+    this.showSearch = !this.showSearch;
+    if (this.showSearch) {
+      setTimeout(() => {
+        const searchInput = document.querySelector('.search-bar input') as HTMLInputElement;
+        if (searchInput) searchInput.focus();
+      }, 100);
+    }
+  }
+  
+  // 筛选和排序宴会厅
+  filterHalls() {
+    this.isLoading = true;
+    
+    // 模拟API请求延迟
+    setTimeout(() => {
+      let result = [...this.halls];
+      
+      // 区域筛选
+      if (this.selectedArea !== 'all') {
+        result = result.filter(hall => hall.area === this.selectedArea);
+      }
+      
+      // 容纳桌数筛选
+      if (this.selectedTableRange !== 'all') {
+        if (this.selectedTableRange === '0-20') {
+          result = result.filter(hall => hall.maxTables <= 20);
+        } else if (this.selectedTableRange === '20-40') {
+          result = result.filter(hall => 
+            hall.minTables >= 20 && hall.maxTables <= 40
+          );
+        } else if (this.selectedTableRange === '40-60') {
+          result = result.filter(hall => 
+            hall.minTables >= 40 && hall.maxTables <= 60
+          );
+        } else if (this.selectedTableRange === '60+') {
+          result = result.filter(hall => hall.minTables >= 60);
+        }
+      }
+      
+      // 餐标范围筛选
+      if (this.selectedMealPrice !== 'all') {
+        if (this.selectedMealPrice === '1000-1999') {
+          result = result.filter(hall => 
+            hall.mealPrice >= 1000 && hall.mealPrice <= 1999
+          );
+        } else if (this.selectedMealPrice === '2000-2999') {
+          result = result.filter(hall => 
+            hall.mealPrice >= 2000 && hall.mealPrice <= 2999
+          );
+        } else if (this.selectedMealPrice === '3000-3999') {
+          result = result.filter(hall => 
+            hall.mealPrice >= 3000 && hall.mealPrice <= 3999
+          );
+        } else if (this.selectedMealPrice === '4000+') {
+          result = result.filter(hall => hall.mealPrice >= 4000);
+        }
+      }
+      
+      // 搜索筛选
+      if (this.searchQuery) {
+        const query = this.searchQuery.toLowerCase();
+        result = result.filter(hall => 
+          hall.name.toLowerCase().includes(query) || 
+          hall.subtitle.toLowerCase().includes(query) ||
+          hall.area.toLowerCase().includes(query)
+        );
+      }
+      
+      // 排序
+      if (this.selectedSort !== 'default') {
+        result.sort((a, b) => {
+          if (this.selectedSort === 'price-low') {
+            return a.hallPrice - b.hallPrice;
+          } else if (this.selectedSort === 'price-high') {
+            return b.hallPrice - a.hallPrice;
+          } else if (this.selectedSort === 'area-high') {
+            return b.areaSize - a.areaSize;
+          } else if (this.selectedSort === 'tables-high') {
+            return b.maxTables - a.maxTables;
+          }
+          return 0;
+        });
+      }
+      
+      this.filteredHalls = result;
+      this.isLoading = false;
+    }, 600); // 模拟加载时间
+  }
+  
+  // 重置筛选条件
+  resetFilters() {
+    this.selectedArea = 'all';
+    this.selectedTableRange = 'all';
+    this.selectedMealPrice = 'all';
+    this.selectedSort = 'default';
+    this.searchQuery = '';
+    this.filterHalls();
+  }
+  
+  // 返回上一级
+  goBack() {
+    console.log('返回上一级页面');
+    // 实际项目中这里应该是路由导航
+  }
+  
+  // 新增宴会厅
+  addNewBanquet() {
+    console.log('打开新增宴会厅表单');
+    // 实际项目中这里应该打开模态框或导航到创建页面
+  }
+  
+  // 预订宴会厅
+  bookHall(hall: BanquetHall) {
+    if (hall.available) {
+      console.log(`开始预订: ${hall.name} 宴会厅`);
+      // 实际项目中这里应该打开预订表单
+    }
+  }
+  
+  // 查看详情
+  showDetails(hall: BanquetHall) {
+    console.log(`查看 ${hall.name} 的详细信息`);
+    // 实际项目中这里应该导航到详情页面
+  }
+  
+  // 卡片悬停效果
+  hoverCard(hall: BanquetHall, isHover: boolean) {
+    this.hoveredHall = isHover ? hall.id : null;
+  }
+}