dm-design/商家端APP/工作台/会员管理/1.1.2 会员列表/会员详情.html

559 lines
18 KiB
HTML
Raw Normal View History

2025-08-06 08:38:43 +00:00
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>会员详情</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: #f5f5f5;
color: #333;
line-height: 1.4;
}
.container {
max-width: 100%;
margin: 0 auto;
background: white;
min-height: 100vh;
}
/* Header Section */
.header {
padding: 20px 16px;
background: white;
border-bottom: 1px solid #e5e5e5;
}
.member-info {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px 20px;
margin-bottom: 20px;
}
.info-item {
display: flex;
align-items: center;
font-size: 14px;
}
.info-label {
color: #666;
margin-right: 8px;
min-width: 60px;
}
.info-value {
color: #333;
font-weight: 500;
}
/* Stats Cards */
.stats-container {
display: flex;
justify-content: space-around;
margin-top: 20px;
padding: 16px;
background: #f8f9fa;
border-radius: 8px;
}
.stat-item {
text-align: center;
flex: 1;
}
.stat-number {
font-size: 24px;
font-weight: bold;
color: #333;
margin-bottom: 4px;
}
.stat-label {
font-size: 12px;
color: #666;
}
/* Tab Navigation */
.tab-nav {
display: flex;
background: white;
border-bottom: 1px solid #e5e5e5;
overflow-x: auto;
}
.tab-item {
flex: 1;
padding: 16px 12px;
text-align: center;
font-size: 14px;
color: #666;
border-bottom: 2px solid transparent;
cursor: pointer;
transition: all 0.3s;
white-space: nowrap;
min-width: 120px;
}
.tab-item.active {
color: #1890ff;
border-bottom-color: #1890ff;
font-weight: 500;
}
/* Content Area */
.content {
padding: 0 16px 20px;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
/* Table Styles */
.table-container {
background: white;
border-radius: 8px;
overflow: hidden;
margin-top: 16px;
}
.table-header {
display: grid;
background: #f8f9fa;
padding: 12px 8px;
font-size: 12px;
color: #666;
font-weight: 500;
border-bottom: 1px solid #e5e5e5;
}
.table-row {
display: grid;
padding: 12px 8px;
border-bottom: 1px solid #f0f0f0;
font-size: 13px;
align-items: center;
}
.table-row:last-child {
border-bottom: none;
}
/* Coupon Table */
.coupon-header {
grid-template-columns: 1fr 60px 60px 80px 60px;
}
.coupon-row {
grid-template-columns: 1fr 60px 60px 80px 60px;
}
/* Growth Table */
.growth-header {
grid-template-columns: 1fr 80px 1fr 60px;
}
.growth-row {
grid-template-columns: 1fr 80px 1fr 60px;
}
/* Points Table */
.points-header {
grid-template-columns: 1fr 60px 80px 1fr 60px;
}
.points-row {
grid-template-columns: 1fr 60px 80px 1fr 60px;
}
.status-available {
color: #52c41a;
font-size: 12px;
}
.status-expired {
color: #ff4d4f;
font-size: 12px;
}
.status-used {
color: #999;
font-size: 12px;
}
.points-positive {
color: #52c41a;
}
.points-negative {
color: #ff4d4f;
}
.detail-link {
color: #1890ff;
text-decoration: none;
font-size: 12px;
}
/* Pagination */
.pagination {
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
gap: 12px;
}
.pagination button {
padding: 8px 12px;
border: 1px solid #d9d9d9;
background: white;
color: #666;
border-radius: 4px;
font-size: 12px;
cursor: pointer;
}
.pagination button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.pagination .current-page {
color: #333;
font-weight: 500;
}
/* Mobile Optimizations */
@media (max-width: 480px) {
.member-info {
grid-template-columns: 1fr;
gap: 8px;
}
.stats-container {
padding: 12px;
}
.stat-number {
font-size: 20px;
}
.table-container {
font-size: 12px;
}
.table-header,
.table-row {
padding: 8px 4px;
}
/* Stack table cells vertically on very small screens */
.coupon-header,
.coupon-row {
grid-template-columns: 1fr;
gap: 4px;
}
.growth-header,
.growth-row {
grid-template-columns: 1fr;
gap: 4px;
}
.points-header,
.points-row {
grid-template-columns: 1fr;
gap: 4px;
}
.table-row {
padding: 12px 8px;
border-left: 3px solid #1890ff;
margin-bottom: 8px;
border-radius: 0 4px 4px 0;
}
}
/* Loading State */
.loading {
text-align: center;
padding: 40px;
color: #999;
}
/* Empty State */
.empty-state {
text-align: center;
padding: 40px;
color: #999;
}
</style>
</head>
<body>
<div class="container">
<!-- Header Section -->
<div class="header">
<div class="member-info">
<div class="info-item">
<span class="info-label">会员姓名:</span>
<span class="info-value">张三</span>
</div>
<div class="info-item">
<span class="info-label">系统编号:</span>
<span class="info-value">3</span>
</div>
<div class="info-item">
<span class="info-label">手机号:</span>
<span class="info-value">138****1234</span>
</div>
<div class="info-item">
<span class="info-label">生日:</span>
<span class="info-value">1990-05-15</span>
</div>
</div>
<div class="stats-container">
<div class="stat-item">
<div class="stat-number">1250</div>
<div class="stat-label">会员成长值</div>
</div>
<div class="stat-item">
<div class="stat-number">890</div>
<div class="stat-label">会员积分</div>
</div>
<div class="stat-item">
<div class="stat-number">5</div>
<div class="stat-label">会员优惠券</div>
</div>
</div>
</div>
<!-- Tab Navigation -->
<div class="tab-nav">
<div class="tab-item" onclick="switchTab('growth')">会员成长值明细</div>
<div class="tab-item" onclick="switchTab('points')">会员积分明细</div>
<div class="tab-item active" onclick="switchTab('coupons')">会员优惠券</div>
</div>
<!-- Content Area -->
<div class="content">
<!-- Coupons Tab -->
<div id="coupons" class="tab-content active">
<div class="table-container">
<div class="table-header coupon-header">
<div>优惠券名称</div>
<div>类型</div>
<div>面额</div>
<div>使用条件</div>
<div>状态</div>
</div>
<div class="table-row coupon-row">
<div>
<div style="font-weight: 500;">新用户专享券</div>
<div style="font-size: 11px; color: #999; margin-top: 2px;">获得时间: 2024-01-01 10:00:00</div>
<div style="font-size: 11px; color: #999;">有效期: 2024-02-01</div>
</div>
<div>满减券</div>
<div>¥20</div>
<div>满100元可用</div>
<div class="status-available">可使用</div>
</div>
<div class="table-row coupon-row">
<div>
<div style="font-weight: 500;">生日特惠券</div>
<div style="font-size: 11px; color: #999; margin-top: 2px;">获得时间: 2024-01-05 12:30:15</div>
<div style="font-size: 11px; color: #999;">有效期: 2024-02-05</div>
</div>
<div>折扣券</div>
<div>9折</div>
<div>全品类可用</div>
<div class="status-available">可使用</div>
</div>
<div class="table-row coupon-row">
<div>
<div style="font-weight: 500;">积分兑换券</div>
<div style="font-size: 11px; color: #999; margin-top: 2px;">获得时间: 2024-01-10 16:20:30</div>
<div style="font-size: 11px; color: #999;">有效期: 2024-03-10</div>
</div>
<div>满减券</div>
<div>¥50</div>
<div>满300元可用</div>
<div class="status-available">可使用</div>
</div>
<div class="table-row coupon-row">
<div>
<div style="font-weight: 500;">限时抢购券</div>
<div style="font-size: 11px; color: #999; margin-top: 2px;">获得时间: 2023-12-20 14:15:20</div>
<div style="font-size: 11px; color: #999;">有效期: 2024-01-20</div>
</div>
<div>满减券</div>
<div>¥10</div>
<div>满50元可用</div>
<div class="status-expired">已过期</div>
</div>
<div class="table-row coupon-row">
<div>
<div style="font-weight: 500;">会员专属券</div>
<div style="font-size: 11px; color: #999; margin-top: 2px;">获得时间: 2023-12-15 09:45:10</div>
<div style="font-size: 11px; color: #999;">有效期: 2024-01-15</div>
</div>
<div>满减券</div>
<div>¥30</div>
<div>满200元可用</div>
<div class="status-used">已使用</div>
</div>
</div>
</div>
<!-- Growth Tab -->
<div id="growth" class="tab-content">
<div class="table-container">
<div class="table-header growth-header">
<div>变化时间</div>
<div>成长值变动</div>
<div>关联订单</div>
<div>详情</div>
</div>
<div class="table-row growth-row">
<div>2024-01-15 14:30:25</div>
<div class="points-positive">+50</div>
<div>ORDER202401501</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row growth-row">
<div>2024-01-10 09:15:10</div>
<div class="points-positive">+100</div>
<div>ORDER202401002</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row growth-row">
<div>2024-01-05 16:45:33</div>
<div class="points-positive">+30</div>
<div>ORDER202401503</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row growth-row">
<div>2024-01-02 11:20:15</div>
<div class="points-positive">+20</div>
<div>ORDER202401204</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row growth-row">
<div>2023-12-28 13:55:40</div>
<div class="points-positive">+75</div>
<div>ORDER202312805</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
</div>
</div>
<!-- Points Tab -->
<div id="points" class="tab-content">
<div class="table-container">
<div class="table-header points-header">
<div>变化时间</div>
<div>积分变动</div>
<div>变动类型</div>
<div>关联订单</div>
<div>详情</div>
</div>
<div class="table-row points-row">
<div>2024-01-15 14:30:25</div>
<div class="points-positive">+100</div>
<div>购物获得</div>
<div>ORDER202401501</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row points-row">
<div>2024-01-12 10:20:15</div>
<div class="points-negative">-50</div>
<div>积分抵扣</div>
<div>ORDER202401202</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row points-row">
<div>2024-01-10 09:15:10</div>
<div class="points-positive">+200</div>
<div>购物获得</div>
<div>ORDER202401002</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row points-row">
<div>2024-01-08 15:45:30</div>
<div class="points-positive">+10</div>
<div>签到奖励</div>
<div>-</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
<div class="table-row points-row">
<div>2024-01-05 16:45:33</div>
<div class="points-positive">+60</div>
<div>购物获得</div>
<div>ORDER202401503</div>
<div><a href="#" class="detail-link">查看详情</a></div>
</div>
</div>
</div>
<!-- Pagination -->
<div class="pagination">
<button disabled>上一页</button>
<span class="current-page">第1页共1页</span>
<button disabled>下一页</button>
</div>
</div>
</div>
<script>
function switchTab(tabName) {
// Remove active class from all tabs and content
document.querySelectorAll('.tab-item').forEach(tab => {
tab.classList.remove('active');
});
document.querySelectorAll('.tab-content').forEach(content => {
content.classList.remove('active');
});
// Add active class to clicked tab and corresponding content
event.target.classList.add('active');
document.getElementById(tabName).classList.add('active');
}
// Add touch feedback for better mobile experience
document.querySelectorAll('.tab-item, .detail-link').forEach(element => {
element.addEventListener('touchstart', function() {
this.style.opacity = '0.7';
});
element.addEventListener('touchend', function() {
this.style.opacity = '1';
});
});
// Prevent zoom on double tap for better mobile experience
let lastTouchEnd = 0;
document.addEventListener('touchend', function (event) {
const now = (new Date()).getTime();
if (now - lastTouchEnd <= 300) {
event.preventDefault();
}
lastTouchEnd = now;
}, false);
</script>
</body>
</html>