Files
TakeoutSaaS.Prototypes/pages/mbr-members.html
MSuMshk 7463c595a2 feat: 新增订单管理、评价管理、营销中心、会员中心模块
- 订单管理(4页): 订单大厅(看板)、全部订单、退款售后、订单设置
- 评价管理(1页): 评价列表+统计+回复抽屉
- 营销中心(5页): 优惠券、满减活动、限时折扣(含周期循环)、秒杀活动、新客有礼
- 会员中心(5页): 会员管理、储值卡、积分商城、客户画像、消息触达
- 侧边栏菜单重构: 营销中心拆分为营销中心+会员中心两个一级菜单
2026-02-12 12:08:28 +08:00

403 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- 会员管理页 -->
<style>
.mm-toolbar { display:flex; align-items:center; gap:12px; margin-bottom:16px; box-shadow:var(--g-shadow-sm); border-radius:10px; padding:12px 16px; background:#fff; flex-wrap:wrap; }
.mm-toolbar .mm-right { margin-left:auto; display:flex; gap:8px; }
.mm-stats { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-bottom:16px; }
.mm-stat-card { background:#fff; border-radius:10px; padding:16px 20px; box-shadow:var(--g-shadow-sm); transition:all var(--g-transition); }
.mm-stat-card:hover { box-shadow:var(--g-shadow-md); transform:translateY(-1px); }
.mm-stat-label { font-size:13px; color:var(--g-text-muted); margin-bottom:6px; }
.mm-stat-value { font-size:24px; font-weight:700; color:var(--g-text); }
.mm-stat-value.blue { color:var(--primary); }
.mm-stat-value.green { color:var(--g-success); }
.mm-stat-value.orange { color:var(--g-warning); }
.mm-stat-sub { font-size:11px; color:var(--g-text-muted); margin-top:4px; }
.mm-table-wrap { background:#fff; border-radius:10px; box-shadow:var(--g-shadow-sm); overflow:hidden; }
.mm-member-cell { display:flex; align-items:center; gap:10px; }
.mm-avatar { width:34px; height:34px; border-radius:50%; display:flex; align-items:center; justify-content:center; color:#fff; font-size:13px; font-weight:600; flex-shrink:0; }
/* 等级体系 Tab */
.mm-level-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin-bottom:24px; }
.mm-level-card { background:#fff; border-radius:10px; padding:24px 20px; box-shadow:var(--g-shadow-sm); border:1px solid var(--g-border); transition:all var(--g-transition); display:flex; flex-direction:column; align-items:center; text-align:center; }
.mm-level-card:hover { box-shadow:var(--g-shadow-md); transform:translateY(-1px); }
.mm-level-icon { width:56px; height:56px; border-radius:50%; display:flex; align-items:center; justify-content:center; margin-bottom:12px; }
.mm-level-name { font-size:16px; font-weight:600; color:var(--g-text); margin-bottom:4px; }
.mm-level-cond { font-size:12px; color:var(--g-text-muted); margin-bottom:14px; padding:3px 10px; background:var(--g-bg-subtle); border-radius:10px; }
.mm-level-perks { width:100%; text-align:left; margin-bottom:16px; }
.mm-level-perk { display:flex; align-items:center; gap:6px; font-size:13px; color:var(--g-text-secondary); padding:5px 0; }
.mm-level-perk i { color:var(--g-success); flex-shrink:0; }
.mm-section-hd { font-size:15px; font-weight:600; color:var(--g-text); padding-left:10px; border-left:3px solid var(--primary); margin-bottom:16px; }
.mm-day-card { background:#fff; border-radius:10px; padding:20px 24px; box-shadow:var(--g-shadow-sm); border:1px solid var(--g-border); }
.mm-day-row { display:flex; align-items:center; gap:16px; margin-bottom:14px; }
.mm-day-row:last-child { margin-bottom:0; }
.mm-day-label { width:80px; font-size:13px; color:var(--g-text-secondary); flex-shrink:0; }
/* 抽屉内 */
.mm-drawer-header { display:flex; align-items:center; gap:14px; margin-bottom:20px; padding-bottom:16px; border-bottom:1px solid #f5f5f5; }
.mm-drawer-avatar { width:48px; height:48px; border-radius:50%; display:flex; align-items:center; justify-content:center; color:#fff; font-size:18px; font-weight:600; flex-shrink:0; background:var(--primary); }
.mm-drawer-name { font-size:16px; font-weight:600; color:var(--g-text); }
.mm-drawer-meta { font-size:12px; color:var(--g-text-muted); margin-top:3px; }
.mm-overview { display:grid; grid-template-columns:repeat(5,1fr); gap:12px; margin-bottom:20px; }
.mm-ov-item { text-align:center; padding:12px 8px; background:var(--g-bg-subtle); border-radius:8px; }
.mm-ov-val { font-size:18px; font-weight:700; color:var(--g-text); }
.mm-ov-label { font-size:11px; color:var(--g-text-muted); margin-top:4px; }
.mm-mini-table { width:100%; border-collapse:collapse; font-size:12px; margin-top:10px; }
.mm-mini-table th { text-align:left; padding:8px 10px; background:var(--g-bg-subtle); color:var(--g-text-muted); font-weight:500; font-size:11px; }
.mm-mini-table td { padding:8px 10px; border-bottom:1px solid #f5f5f5; color:var(--g-text); }
.mm-tag-list { display:flex; gap:6px; flex-wrap:wrap; margin-top:10px; }
</style>
<div>
<!-- 分段切换 -->
<div class="g-seg" style="width:240px;margin-bottom:16px;">
<div class="g-seg-item active" onclick="switchMmTab(this,'list')">会员列表</div>
<div class="g-seg-item" onclick="switchMmTab(this,'levels')">等级体系</div>
</div>
<!-- ==================== TAB 1: 会员列表 ==================== -->
<div id="mmTabList">
<!-- 工具栏 -->
<div class="mm-toolbar">
<select class="g-select" style="width:180px;">
<option>全部门店</option>
<option>老三家外卖(朝阳店)</option>
<option>老三家外卖(海淀店)</option>
<option>老三家外卖(望京店)</option>
</select>
<select class="g-select" style="width:140px;" id="mmLevelFilter">
<option value="">全部等级</option>
<option>普通会员</option>
<option>银卡</option>
<option>金卡</option>
<option>钻石</option>
</select>
<div style="position:relative;">
<i data-lucide="search" style="position:absolute;left:10px;top:50%;transform:translateY(-50%);width:14px;height:14px;color:var(--g-text-muted);pointer-events:none;"></i>
<input class="g-input" style="width:200px;padding-left:32px;" placeholder="搜索姓名/手机号">
</div>
<div class="mm-right">
<button class="g-btn"><i data-lucide="download" style="width:14px;height:14px;"></i>导出</button>
</div>
</div>
<!-- 统计卡片 -->
<div class="mm-stats">
<div class="mm-stat-card">
<div class="mm-stat-label">会员总数</div>
<div class="mm-stat-value blue">1,286</div>
</div>
<div class="mm-stat-card">
<div class="mm-stat-label">本月新增</div>
<div class="mm-stat-value green">86</div>
</div>
<div class="mm-stat-card">
<div class="mm-stat-label">活跃会员</div>
<div class="mm-stat-value">658</div>
<div class="mm-stat-sub">30天内有消费</div>
</div>
<div class="mm-stat-card">
<div class="mm-stat-label">沉睡会员</div>
<div class="mm-stat-value orange">328</div>
</div>
</div>
<!-- 表格 -->
<div class="mm-table-wrap">
<table class="g-table">
<thead>
<tr>
<th>会员</th>
<th>手机号</th>
<th>等级</th>
<th>累计消费</th>
<th>消费次数</th>
<th>最近消费</th>
<th>储值余额</th>
<th>积分</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#1890ff;"></div><span>张**</span></div></td>
<td>138****6721</td>
<td><span class="g-tag" style="color:#722ed1;background:#f9f0ff;border:1px solid #d3adf7;">钻石</span></td>
<td>&yen;15,280</td>
<td>186</td>
<td>2026-02-11</td>
<td>&yen;2,350.00</td>
<td>8,620</td>
<td><a class="g-action" onclick="openMmDrawer(0)">详情</a></td>
</tr>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#fa8c16;"></div><span>李**</span></div></td>
<td>139****3345</td>
<td><span class="g-tag g-tag-orange">金卡</span></td>
<td>&yen;4,560</td>
<td>72</td>
<td>2026-02-10</td>
<td>&yen;800.00</td>
<td>3,240</td>
<td><a class="g-action" onclick="openMmDrawer(1)">详情</a></td>
</tr>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#52c41a;"></div><span>王**</span></div></td>
<td>136****8890</td>
<td><span class="g-tag g-tag-blue">银卡</span></td>
<td>&yen;1,230</td>
<td>28</td>
<td>2026-02-08</td>
<td>&yen;200.00</td>
<td>1,560</td>
<td><a class="g-action" onclick="openMmDrawer(2)">详情</a></td>
</tr>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#722ed1;"></div><span>赵**</span></div></td>
<td>158****2210</td>
<td><span class="g-tag g-tag-gray">普通</span></td>
<td>&yen;320</td>
<td>8</td>
<td>2026-01-25</td>
<td>&yen;0.00</td>
<td>420</td>
<td><a class="g-action" onclick="openMmDrawer(3)">详情</a></td>
</tr>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#eb2f96;"></div><span>陈**</span></div></td>
<td>137****5567</td>
<td><span class="g-tag g-tag-orange">金卡</span></td>
<td>&yen;3,890</td>
<td>56</td>
<td>2026-02-09</td>
<td>&yen;1,200.00</td>
<td>2,780</td>
<td><a class="g-action" onclick="openMmDrawer(4)">详情</a></td>
</tr>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#13c2c2;"></div><span>刘**</span></div></td>
<td>155****9901</td>
<td><span class="g-tag g-tag-blue">银卡</span></td>
<td>&yen;980</td>
<td>18</td>
<td>2026-02-05</td>
<td>&yen;150.00</td>
<td>890</td>
<td><a class="g-action" onclick="openMmDrawer(5)">详情</a></td>
</tr>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#f5222d;"></div><span>孙**</span></div></td>
<td>186****4432</td>
<td><span class="g-tag" style="color:#722ed1;background:#f9f0ff;border:1px solid #d3adf7;">钻石</span></td>
<td>&yen;12,600</td>
<td>142</td>
<td>2026-02-12</td>
<td>&yen;3,800.00</td>
<td>7,150</td>
<td><a class="g-action" onclick="openMmDrawer(6)">详情</a></td>
</tr>
<tr>
<td><div class="mm-member-cell"><div class="mm-avatar" style="background:#2f54eb;"></div><span>周**</span></div></td>
<td>133****7788</td>
<td><span class="g-tag g-tag-gray">普通</span></td>
<td>&yen;160</td>
<td>4</td>
<td>2026-01-18</td>
<td>&yen;0.00</td>
<td>210</td>
<td><a class="g-action" onclick="openMmDrawer(7)">详情</a></td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<div class="g-pagination">
<span style="margin-right:8px;">共 1,286 条</span>
<button class="g-page-btn" disabled>&lt;</button>
<button class="g-page-btn active">1</button>
<button class="g-page-btn">2</button>
<button class="g-page-btn">3</button>
<button class="g-page-btn">...</button>
<button class="g-page-btn">129</button>
<button class="g-page-btn">&gt;</button>
</div>
</div>
<!-- ==================== TAB 2: 等级体系 ==================== -->
<div id="mmTabLevels" style="display:none;">
<div class="mm-section-hd">会员等级</div>
<div class="mm-level-grid">
<!-- 普通 -->
<div class="mm-level-card">
<div class="mm-level-icon" style="background:#f5f5f5;color:#999;">
<i data-lucide="user" style="width:28px;height:28px;"></i>
</div>
<div class="mm-level-name">普通会员</div>
<div class="mm-level-cond">注册即享</div>
<div class="mm-level-perks">
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>积分累计</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>会员价商品</div>
</div>
<button class="g-btn g-btn-sm" style="width:100%;">编辑</button>
</div>
<!-- 银卡 -->
<div class="mm-level-card">
<div class="mm-level-icon" style="background:#e6f7ff;color:#1890ff;">
<i data-lucide="award" style="width:28px;height:28px;"></i>
</div>
<div class="mm-level-name" style="color:#1890ff;">银卡会员</div>
<div class="mm-level-cond">累计消费满 &yen;500</div>
<div class="mm-level-perks">
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>全场9.8折</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>生日专属券</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>积分1.2倍</div>
</div>
<button class="g-btn g-btn-sm" style="width:100%;">编辑</button>
</div>
<!-- 金卡 -->
<div class="mm-level-card">
<div class="mm-level-icon" style="background:#fff7e6;color:#fa8c16;">
<i data-lucide="trophy" style="width:28px;height:28px;"></i>
</div>
<div class="mm-level-name" style="color:#fa8c16;">金卡会员</div>
<div class="mm-level-cond">累计消费满 &yen;2,000</div>
<div class="mm-level-perks">
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>全场9.5折</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>生日双倍积分</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>每月专属优惠券</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>积分1.5倍</div>
</div>
<button class="g-btn g-btn-sm" style="width:100%;">编辑</button>
</div>
<!-- 钻石 -->
<div class="mm-level-card">
<div class="mm-level-icon" style="background:#f9f0ff;color:#722ed1;">
<i data-lucide="gem" style="width:28px;height:28px;"></i>
</div>
<div class="mm-level-name" style="color:#722ed1;">钻石会员</div>
<div class="mm-level-cond">累计消费满 &yen;5,000</div>
<div class="mm-level-perks">
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>全场9折</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>生日礼品</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>专属客服</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>优先配送</div>
<div class="mm-level-perk"><i data-lucide="check" style="width:14px;height:14px;"></i>积分2倍</div>
</div>
<button class="g-btn g-btn-sm" style="width:100%;">编辑</button>
</div>
</div>
<!-- 会员日设置 -->
<div class="mm-section-hd">会员日设置</div>
<div class="mm-day-card">
<div class="mm-day-row">
<div class="mm-day-label">启用会员日</div>
<div class="g-toggle on" onclick="this.classList.toggle('on')"></div>
</div>
<div class="mm-day-row">
<div class="mm-day-label">会员日</div>
<select class="g-select" style="width:160px;">
<option>每周二</option>
<option>每周一</option>
<option>每周三</option>
<option>每周四</option>
<option>每周五</option>
<option>每周六</option>
<option>每周日</option>
</select>
</div>
<div class="mm-day-row">
<div class="mm-day-label">会员日权益</div>
<div style="display:flex;align-items:center;gap:8px;">
<span style="font-size:13px;color:var(--g-text-secondary);">额外</span>
<input class="g-input" style="width:80px;text-align:center;" placeholder="如9" value="9">
<span style="font-size:13px;color:var(--g-text-secondary);">折优惠</span>
</div>
</div>
</div>
</div>
</div>
<!-- 会员详情抽屉 -->
<div class="g-drawer-mask" id="mmDrawerMask" onclick="closeMmDrawer()"></div>
<div class="g-drawer" id="mmDrawer" style="width:560px;">
<div class="g-drawer-hd">
<div class="g-drawer-title">会员详情</div>
<button class="g-drawer-close" onclick="closeMmDrawer()"><i data-lucide="x" style="width:18px;height:18px;"></i></button>
</div>
<div class="g-drawer-bd">
<!-- 头部信息 -->
<div class="mm-drawer-header">
<div class="mm-drawer-avatar" id="mmDrAvatar"></div>
<div>
<div style="display:flex;align-items:center;gap:8px;">
<span class="mm-drawer-name" id="mmDrName">张**</span>
<span class="g-tag" id="mmDrLevel" style="color:#722ed1;background:#f9f0ff;border:1px solid #d3adf7;">钻石</span>
</div>
<div class="mm-drawer-meta" id="mmDrMeta">138****6721 | 注册于 2024-03-15</div>
</div>
</div>
<!-- 消费概览 -->
<div class="mm-section-hd">消费概览</div>
<div class="mm-overview" id="mmDrOverview">
<div class="mm-ov-item"><div class="mm-ov-val">&yen;15,280</div><div class="mm-ov-label">累计消费</div></div>
<div class="mm-ov-item"><div class="mm-ov-val">186</div><div class="mm-ov-label">消费次数</div></div>
<div class="mm-ov-item"><div class="mm-ov-val">&yen;82.2</div><div class="mm-ov-label">平均客单价</div></div>
<div class="mm-ov-item"><div class="mm-ov-val">&yen;2,350</div><div class="mm-ov-label">储值余额</div></div>
<div class="mm-ov-item"><div class="mm-ov-val">8,620</div><div class="mm-ov-label">积分</div></div>
</div>
<!-- 最近订单 -->
<div class="mm-section-hd">最近订单</div>
<table class="mm-mini-table">
<thead><tr><th>日期</th><th>订单号</th><th>金额</th><th>状态</th></tr></thead>
<tbody id="mmDrOrders">
<tr><td>2026-02-11</td><td>OD20260211086</td><td>&yen;68.00</td><td><span class="g-tag g-tag-green">已完成</span></td></tr>
<tr><td>2026-02-08</td><td>OD20260208052</td><td>&yen;95.50</td><td><span class="g-tag g-tag-green">已完成</span></td></tr>
<tr><td>2026-02-05</td><td>OD20260205031</td><td>&yen;42.00</td><td><span class="g-tag g-tag-green">已完成</span></td></tr>
</tbody>
</table>
<!-- 会员标签 -->
<div style="margin-top:20px;">
<div class="mm-section-hd">会员标签</div>
<div class="mm-tag-list">
<span class="g-pill checked" onclick="this.classList.toggle('checked')">高频</span>
<span class="g-pill checked" onclick="this.classList.toggle('checked')">午餐常客</span>
<span class="g-pill checked" onclick="this.classList.toggle('checked')">偏好辣味</span>
<span class="g-pill" onclick="this.classList.toggle('checked')">下午茶</span>
<span class="g-pill" onclick="this.classList.toggle('checked')">家庭聚餐</span>
<span class="g-pill" onclick="this.classList.toggle('checked')">外卖为主</span>
</div>
</div>
</div>
<div class="g-drawer-ft">
<button class="g-btn" onclick="closeMmDrawer()">关闭</button>
</div>
</div>
<script>
/* Tab 切换 */
function switchMmTab(el, tab) {
el.parentElement.querySelectorAll('.g-seg-item').forEach(function(s){ s.classList.remove('active'); });
el.classList.add('active');
document.getElementById('mmTabList').style.display = tab === 'list' ? '' : 'none';
document.getElementById('mmTabLevels').style.display = tab === 'levels' ? '' : 'none';
if (typeof lucide !== 'undefined') lucide.createIcons();
}
/* 抽屉 */
function openMmDrawer(idx) {
document.getElementById('mmDrawerMask').classList.add('open');
document.getElementById('mmDrawer').classList.add('open');
if (typeof lucide !== 'undefined') lucide.createIcons();
}
function closeMmDrawer() {
document.getElementById('mmDrawerMask').classList.remove('open');
document.getElementById('mmDrawer').classList.remove('open');
}
if (typeof lucide !== 'undefined') lucide.createIcons();
</script>