|
|
@@ -0,0 +1,715 @@
|
|
|
+<!DOCTYPE html>
|
|
|
+<html lang="zh-CN">
|
|
|
+<head>
|
|
|
+ <meta charset="UTF-8">
|
|
|
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
|
|
+ <title>权益专区</title>
|
|
|
+ <script src="https://cdn.tailwindcss.com"></script>
|
|
|
+ <style>
|
|
|
+ /* 隐藏滚动条但保留滚动功能 */
|
|
|
+ .no-scrollbar::-webkit-scrollbar {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ .no-scrollbar {
|
|
|
+ -ms-overflow-style: none;
|
|
|
+ scrollbar-width: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 选中态的红线动画过渡 */
|
|
|
+ .tab-indicator {
|
|
|
+ transition: all 0.3s ease;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 视图切换动画 */
|
|
|
+ .view-transition {
|
|
|
+ transition: transform 0.35s cubic-bezier(0.4, 0.0, 0.2, 1);
|
|
|
+ }
|
|
|
+ </style>
|
|
|
+</head>
|
|
|
+<body class="bg-gray-100 flex justify-center h-screen overflow-hidden font-sans">
|
|
|
+
|
|
|
+ <!-- 侧边全局控制面板 -->
|
|
|
+ <div class="fixed top-[20%] right-0 z-50 flex items-start max-w-sm">
|
|
|
+ <button onclick="toggleSimPanel()" class="bg-black/60 text-white text-[11px] py-1.5 px-2 rounded-l-md shadow-md flex items-center gap-1 backdrop-blur-sm">
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>
|
|
|
+ 状态
|
|
|
+ </button>
|
|
|
+
|
|
|
+ <div id="sim-panel" class="absolute top-8 right-2 bg-white/95 backdrop-blur-md border border-gray-200 p-2 rounded-lg shadow-xl w-[140px] text-[11px] transition-all origin-top-right scale-0 opacity-0 pointer-events-none">
|
|
|
+ <div class="font-bold mb-1.5 text-gray-800 border-b pb-1 text-center">切换等级</div>
|
|
|
+ <div class="flex flex-col gap-1.5">
|
|
|
+ <button onclick="setUserLevel('prospect')" id="btn-state-prospect" class="px-2 py-1.5 rounded bg-gray-100 text-gray-700 transition">潜客</button>
|
|
|
+ <button onclick="setUserLevel('credit_only')" id="btn-state-credit_only" class="px-2 py-1.5 rounded bg-gray-100 text-gray-700 transition">仅持有信用卡客户</button>
|
|
|
+ <button onclick="setUserLevel('advance')" id="btn-state-advance" class="px-2 py-1.5 rounded bg-gray-100 text-gray-700 transition">运筹理财</button>
|
|
|
+ <button onclick="setUserLevel('premier')" id="btn-state-premier" class="px-2 py-1.5 rounded bg-gray-100 text-gray-700 transition">卓越理财</button>
|
|
|
+ <button onclick="setUserLevel('elite')" id="btn-state-elite" class="px-2 py-1.5 rounded bg-gray-100 text-gray-700 transition">卓越理财·尊尚</button>
|
|
|
+ <button onclick="setUserLevel('global')" id="btn-state-global" class="px-2 py-1.5 rounded bg-gray-100 text-gray-700 transition">环球私人银行</button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 移动端模拟容器 -->
|
|
|
+ <div class="w-full max-w-[400px] h-full bg-white flex flex-col relative shadow-2xl overflow-hidden">
|
|
|
+
|
|
|
+ <!-- 顶部状态栏 -->
|
|
|
+ <div class="h-11 w-full flex justify-between items-center px-5 text-black bg-white z-30 relative shrink-0">
|
|
|
+ <span class="text-[15px] font-medium">9:41</span>
|
|
|
+ <div class="flex gap-1.5 items-center">
|
|
|
+ <svg width="18" height="12" viewBox="0 0 18 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 12V9H3.5V12H1.5ZM6 12V6.5H8V12H6ZM10.5 12V3.5H12.5V12H10.5ZM15 12V0H17V12H15Z" fill="black"/></svg>
|
|
|
+ <svg width="16" height="12" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 12C9.10457 12 10 11.1046 10 10C10 8.89543 9.10457 8 8 8C6.89543 8 6 8.89543 6 10C6 11.1046 6.89543 12 8 12Z" fill="black"/><path d="M2.34315 5.65685C5.46734 2.53266 10.5327 2.53266 13.6569 5.65685" stroke="black" stroke-width="1.5" stroke-linecap="round"/><path d="M5.17157 8.48528C6.73367 6.92318 9.26633 6.92318 10.8284 8.48528" stroke="black" stroke-width="1.5" stroke-linecap="round"/></svg>
|
|
|
+ <svg width="25" height="12" viewBox="0 0 25 12" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="0.5" y="0.5" width="21" height="11" rx="2.5" stroke="black"/><rect x="2" y="2" width="18" height="8" rx="1" fill="black"/><path d="M23 4V8" stroke="black" stroke-width="1.5" stroke-linecap="round"/></svg>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- ====== 视图 A: 权益介绍页 (Home View) ====== -->
|
|
|
+ <div id="home-view" class="flex flex-col h-[calc(100%-44px)] w-full absolute top-[44px] left-0 bg-white view-transition translate-x-0 z-10">
|
|
|
+ <header class="h-11 flex items-center justify-between px-4 bg-white z-20 shrink-0">
|
|
|
+ <button class="text-gray-800 p-1">
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"/></svg>
|
|
|
+ </button>
|
|
|
+ <h1 class="text-[17px] font-medium text-gray-900 absolute left-1/2 -translate-x-1/2">权益介绍页</h1>
|
|
|
+ <div class="w-8"></div>
|
|
|
+ </header>
|
|
|
+
|
|
|
+ <div class="flex-1 overflow-y-auto no-scrollbar pb-8 relative">
|
|
|
+ <div id="no-tier-banner" onclick="showZone()" class="px-4 py-3 bg-[#fdfaf8] border-b border-gray-100 flex items-center justify-between cursor-pointer active:bg-gray-50 transition">
|
|
|
+ <div class="flex items-center gap-3">
|
|
|
+ <div class="w-10 h-10 rounded-full bg-gray-100 flex items-center justify-center border border-gray-200">
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="14" x="3" y="8" rx="2"/><path d="M12 5a3 3 0 1 0-3 3"/><path d="M15 8a3 3 0 1 0-3-3"/><path d="M12 8v10"/><path d="M3 12h18"/></svg>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <div class="text-[15px] text-gray-900">权益首页</div>
|
|
|
+ <div class="text-[12px] text-gray-500">一键查看您的所有权益</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <button class="text-[13px] text-gray-500 flex items-center pointer-events-none">
|
|
|
+ 立即查看
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"/></svg>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="flex justify-between px-2 pt-2 border-b border-gray-200 relative">
|
|
|
+ <button onclick="switchTab('premier')" class="flex-1 py-3 text-[14px] font-medium relative text-gray-900" id="tab-btn-premier">
|
|
|
+ 卓越理财
|
|
|
+ </button>
|
|
|
+ <button onclick="switchTab('elite')" class="flex-1 py-3 text-[14px] font-medium relative text-gray-500" id="tab-btn-elite">
|
|
|
+ 卓越理财·尊尚
|
|
|
+ </button>
|
|
|
+ <button onclick="switchTab('global')" class="flex-1 py-3 text-[14px] font-medium relative text-gray-500" id="tab-btn-global">
|
|
|
+ 环球私人银行
|
|
|
+ </button>
|
|
|
+
|
|
|
+ <div id="tab-indicator" class="absolute bottom-0 h-[2px] bg-[#d70014] tab-indicator" style="width: 33.33%; left: 0%;"></div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div id="content-area" class="px-5 pt-5 pb-10">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- ====== 视图 B: 权益首页/专区 (Zone View) ====== -->
|
|
|
+ <div id="zone-view" class="flex flex-col h-[calc(100%-44px)] w-full absolute top-[44px] left-0 bg-[#f4f5f8] view-transition translate-x-full z-20">
|
|
|
+ <header class="h-11 flex items-center justify-between px-4 bg-white z-20 shrink-0 border-b border-gray-100">
|
|
|
+ <button onclick="hideZone()" class="text-gray-800 p-1">
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"/></svg>
|
|
|
+ </button>
|
|
|
+ <h1 class="text-[17px] font-medium text-gray-900 absolute left-1/2 -translate-x-1/2">权益首页</h1>
|
|
|
+ <div class="w-8"></div>
|
|
|
+ </header>
|
|
|
+
|
|
|
+ <div class="flex-1 overflow-y-auto no-scrollbar pb-8 relative" id="zone-content-area">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 积分规则弹窗 (Rule Modal) -->
|
|
|
+ <div id="rule-modal-backdrop" class="absolute inset-0 bg-black/50 z-[60] opacity-0 pointer-events-none transition-opacity duration-300" onclick="closeRuleModal()"></div>
|
|
|
+ <div id="rule-modal" class="absolute bottom-0 left-0 w-full bg-white z-[70] rounded-t-2xl transform translate-y-full transition-transform duration-300 flex flex-col" style="height: 85%;">
|
|
|
+ <div class="flex justify-between items-center px-5 py-4 border-b border-gray-100 shrink-0">
|
|
|
+ <h2 class="text-[17px] font-medium text-gray-900">积分规则</h2>
|
|
|
+ <button onclick="closeRuleModal()" class="text-gray-500 p-1 hover:bg-gray-100 rounded-full transition">
|
|
|
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ <div class="flex-1 overflow-y-auto px-5 py-5 no-scrollbar">
|
|
|
+ <h3 class="text-[14px] font-medium text-gray-800 mb-4">汇丰银行(中国)有限公司积分使用规则</h3>
|
|
|
+ <div class="text-[13px] text-gray-600 leading-[1.8] space-y-4 text-justify">
|
|
|
+ <p>本积分使用规则(“本规则”)为汇丰银行(中国)有限公司(“本行”)的客户(“客户”)使用本行信用卡及借记卡积分(即“汇友荟”汇丰客户关系积分)(简称“汇友荟积分”)兑换本行提供的礼品、里程或刷卡金等项目(具体以本行积分换礼平台正式公布的有效兑换项目为准,以下称“兑换项目”)等需要遵守的使用规则。</p>
|
|
|
+ <p class="font-medium text-gray-800 pt-2">一、 兑换及使用渠道</p>
|
|
|
+ <p>1. 除本规则以下相关兑换项目项下有特别说明外,客户可使用信用卡积分及“汇友荟”汇丰客户关系积分在积分换礼平台兑换相关项目,具体兑换渠道如下:<br>
|
|
|
+ (1) 登录“汇丰中国客户服务”微信服务号,点击“我的汇丰”—“我的积分”—“积分商城”页面兑换;或<br>
|
|
|
+ (2) 登录汇丰银行App,在“我的”点击“我的积分”—“积分商城”页面兑换礼品;<br>
|
|
|
+ (3) 人工服务申请兑换:拨打本行24小时客服热线95366或4008695366(该渠道仅限本行信用卡主卡持卡人兑换部分项目申请时使用)兑换。</p>
|
|
|
+ <p>2. 积分一旦兑换成功,不可撤销、更改或退还。若因系统或网络原因导致兑换失败,积分将自动退回账户。</p>
|
|
|
+ <p class="font-medium text-gray-800 pt-2">二、 积分有效期</p>
|
|
|
+ <p>信用卡积分有效期与信用卡有效期一致。如客户在信用卡有效期届满前未消耗完毕,积分将于信用卡到期次月清零。“汇友荟”积分有效期详见对应活动的具体规则。请客户关注积分到期日并及时兑换。</p>
|
|
|
+ <p class="pt-10 pb-10 text-center text-gray-300">-- 到底了 --</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 余额计算规则弹窗 (Balance Rule Modal) -->
|
|
|
+ <div id="balance-rule-modal-backdrop" class="absolute inset-0 bg-black/50 z-[60] opacity-0 pointer-events-none transition-opacity duration-300" onclick="closeBalanceRuleModal()"></div>
|
|
|
+ <div id="balance-rule-modal" class="absolute bottom-0 left-0 w-full bg-white z-[70] rounded-t-2xl transform translate-y-full transition-transform duration-300 flex flex-col min-h-[220px]">
|
|
|
+ <div class="flex justify-between items-center px-5 py-4 shrink-0 border-b border-gray-50">
|
|
|
+ <h2 class="text-[18px] font-medium text-gray-900">提示</h2>
|
|
|
+ <button onclick="closeBalanceRuleModal()" class="text-gray-500 p-1 hover:bg-gray-100 rounded-full transition">
|
|
|
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ <div class="flex-1 px-5 pb-8 pt-4">
|
|
|
+ <div class="text-[15px] text-gray-700 leading-[1.6]">
|
|
|
+ 月内日均余额 = 当月内每日账户余额之和 / 当月天数。
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 底部 Home Indicator (iOS风格) -->
|
|
|
+ <div class="h-8 w-full flex justify-center items-center z-[80] absolute bottom-0 pointer-events-none">
|
|
|
+ <div class="w-32 h-1 bg-gray-900 rounded-full"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <script>
|
|
|
+ // --- 核心 SVG 图标库 ---
|
|
|
+ const icons = {
|
|
|
+ cap: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 10v6M2 10l10-5 10 5-10 5z"/><path d="M6 12v5c3 3 9 3 12 0v-5"/></svg>`,
|
|
|
+ heart: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"/></svg>`,
|
|
|
+ bulb: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.9 1.2 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg>`,
|
|
|
+ gift: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="14" rx="2"/><path d="M12 5a3 3 0 1 0-3 3"/><path d="M15 8a3 3 0 1 0-3-3"/><path d="M12 8v14"/><path d="M3 12h18"/></svg>`,
|
|
|
+ diamond: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3h12l4 6-10 13L2 9Z"/></svg>`,
|
|
|
+ medbox: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="8" width="16" height="12" rx="2"/><path d="M8 8V6a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><path d="M12 11v4M10 13h4"/></svg>`,
|
|
|
+ car: `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 12 10s-6.7.6-8.5 1.1C2.7 11.3 2 12.1 2 13v3c0 .6.4 1 1 1h2"/><rect width="16" height="8" x="4" y="10" rx="2"/><path d="M7 14h.01"/><path d="M17 14h.01"/><path d="m10 10-1.5-4h7l-1.5 4"/></svg>`,
|
|
|
+ plane: `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><path d="M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.2-1.1.7l-1.2 3.6 7.7 4.4-4.2 4.2-3.1-.8c-.4-.1-.8.1-1 .5l-.8 2.3 5.4 1.8 1.8 5.4 2.3-.8c.4-.2.6-.6.5-1l-.8-3.1 4.2-4.2 4.4 7.7 3.6-1.2c.5-.2.8-.6.7-1.1Z"/></svg>`,
|
|
|
+ globe: `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/><path d="M2 12h20"/></svg>`,
|
|
|
+ coffee: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="#ba6534" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M17 8h1a4 4 0 1 1 0 8h-1"/><path d="M3 8h14v9a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4Z"/><line x1="6" x2="6" y1="2" y2="4"/><line x1="10" x2="10" y1="2" y2="4"/><line x1="14" x2="14" y1="2" y2="4"/></svg>`,
|
|
|
+ planeRed: `<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="#d70014" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.2-1.1.7l-1.2 3.6 7.7 4.4-4.2 4.2-3.1-.8c-.4-.1-.8.1-1 .5l-.8 2.3 5.4 1.8 1.8 5.4 2.3-.8c.4-.2.6-.6.5-1l-.8-3.1 4.2-4.2 4.4 7.7 3.6-1.2c.5-.2.8-.6.7-1.1Z"/></svg>`,
|
|
|
+ help: `<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#999" stroke-width="1.5" class="ml-1 inline-block"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>`,
|
|
|
+ copy: `<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#999" stroke-width="1.5" class="ml-1 inline-block cursor-pointer"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>`,
|
|
|
+ doc: `<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" class="mr-1 inline-block"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>`
|
|
|
+ };
|
|
|
+
|
|
|
+ // --- 权益主页数据 (Home Page Data) ---
|
|
|
+ const tabData = {
|
|
|
+ premier: {
|
|
|
+ id: 'premier', title: '卓越理财', subtitle: '为您和您的家人提供尊崇专属礼遇和权益',
|
|
|
+ imageSrc: 'https://images.unsplash.com/photo-1518893494013-481c1d8ed3fd?q=80&w=800&auto=format&fit=crop',
|
|
|
+ imageStyle: 'filter: sepia(0.4) hue-rotate(330deg);',
|
|
|
+ features: [
|
|
|
+ { title: '国际教育', desc: '享专属国际化学校优惠及背景提升项目' },
|
|
|
+ { title: '酒店礼遇', desc: '高端酒店及商场会籍匹配' },
|
|
|
+ { title: '环球礼遇', desc: '汇丰中国信用卡持卡人,尊享机场贵宾厅及礼宾车等礼遇' },
|
|
|
+ { title: '优选健康荟', desc: '享香港私立医院体检专属折扣' }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ elite: {
|
|
|
+ id: 'elite', title: '卓越理财·尊尚', subtitle: '开启尊尚体验,享受环球出行、高端运动、国际教育等VIP礼遇。',
|
|
|
+ imageSrc: 'https://images.unsplash.com/photo-1610701596007-11502861dcfa?q=80&w=800&auto=format&fit=crop',
|
|
|
+ imageStyle: 'filter: sepia(0.6) hue-rotate(330deg) saturate(1.5);',
|
|
|
+ features: [
|
|
|
+ { title: '国际教育', desc: '享多项升学规划指导、专属国际化学校优惠及背景提升项目' },
|
|
|
+ { title: '专属礼宾服务', desc: '高端酒店及商场会籍匹配、高尔夫练习场畅' },
|
|
|
+ { title: '尊尚生日礼', desc: '尊享体验任选其一' },
|
|
|
+ { title: '「汇享健康」', desc: '三重健康保障,包括专属健保管家、公立医院门诊预约及就医陪同服务等权益' }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ global: {
|
|
|
+ id: 'global', title: '环球私人银行', subtitle: '开启环球「创臻享」及「汇佑健康」之旅。',
|
|
|
+ imageSrc: 'https://images.unsplash.com/photo-1550684848-fac1c5b4e853?q=80&w=800&auto=format&fit=crop',
|
|
|
+ imageStyle: '',
|
|
|
+ features: [
|
|
|
+ { title: '高尔夫权益', desc: '练习场畅达及VIP高尔夫俱乐部免会籍预约' },
|
|
|
+ { title: '臻享体验', desc: '享高端酒店及商场会籍匹配、米其林级别私宴预定服务等' },
|
|
|
+ { title: '环球旅行', desc: '境外礼宾接送机服务及酒店升房礼遇' },
|
|
|
+ { title: '私人生日礼', desc: '尊享体验任选其一' },
|
|
|
+ { title: '「汇佑健康」', desc: '一站式健康管理,包括专属家庭医师团队、公立医院门诊预约及就医陪同服务等权益' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const bottomBannerData = {
|
|
|
+ tag: '精选活动', title: '汇丰卓越理财新户达标礼-东方航空', subtitle: '报名参加汇丰活动,体验更多精彩礼遇',
|
|
|
+ imageSrc: 'https://images.unsplash.com/photo-1436491865332-7a61a109cc05?q=80&w=800&auto=format&fit=crop'
|
|
|
+ };
|
|
|
+
|
|
|
+ // --- 权益专区数据 (Zone Page Data) ---
|
|
|
+ const baseAdvanceExclusives = [
|
|
|
+ { icon: icons.gift, label: '卓越理财迎<br>新礼' }
|
|
|
+ ];
|
|
|
+
|
|
|
+ const zoneData = {
|
|
|
+ 'prospect': {
|
|
|
+ hasAd: false, hasDotsExclusives: false, hasDotsCredit: true, hideIdentity: true,
|
|
|
+ exclusives: baseAdvanceExclusives
|
|
|
+ },
|
|
|
+ 'credit_only': {
|
|
|
+ hasAd: false, hasDotsExclusives: false, hasDotsCredit: true, hideIdentity: true,
|
|
|
+ exclusives: baseAdvanceExclusives
|
|
|
+ },
|
|
|
+ 'advance': {
|
|
|
+ headerBannerUrl: 'https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?w=800&auto=format&fit=crop',
|
|
|
+ tierTitle: 'HSBC Advance', tierSub: '汇丰运筹理财',
|
|
|
+ hasAd: false, hasDotsExclusives: false, hasDotsCredit: true, hideIdentity: false,
|
|
|
+ accountHtml: `
|
|
|
+ <div class="flex justify-between items-end pt-1">
|
|
|
+ <div>
|
|
|
+ <div class="text-[14px] text-gray-800 flex items-center font-medium">账户月内日均余额 <span onclick="openBalanceRuleModal()" class="cursor-pointer ml-1 flex items-center">${icons.help}</span></div>
|
|
|
+ <div class="text-[12px] text-gray-500 mt-1.5">截止日期 XXXX年X月X日</div>
|
|
|
+ </div>
|
|
|
+ <div class="text-[14px] text-gray-600 mb-1.5">8,000,000 人民币元</div>
|
|
|
+ </div>
|
|
|
+ `,
|
|
|
+ exclusives: baseAdvanceExclusives
|
|
|
+ },
|
|
|
+ 'premier': { // 卓越理财
|
|
|
+ headerBannerUrl: 'https://images.unsplash.com/photo-1574678170884-cbabaf60df08?w=800&auto=format&fit=crop',
|
|
|
+ tierTitle: 'HSBC Premier', tierSub: '汇丰卓越理财',
|
|
|
+ hasAd: true, hasDotsExclusives: false, hasDotsCredit: true, hideIdentity: false,
|
|
|
+ accountHtml: `
|
|
|
+ <div class="border-b border-gray-100 pb-3.5 mb-3.5">
|
|
|
+ <div class="text-[14px] text-gray-800 font-medium flex items-center">卓越理财客户</div>
|
|
|
+ <div class="text-[12px] text-gray-500 mt-1 flex items-center">合格(上月日均余额)<span onclick="openBalanceRuleModal()" class="cursor-pointer ml-1 flex items-center">${icons.help}</span></div>
|
|
|
+ </div>
|
|
|
+ <div class="flex justify-between items-end">
|
|
|
+ <div>
|
|
|
+ <div class="text-[14px] text-gray-800 flex items-center font-medium">账户月内日均余额 <span onclick="openBalanceRuleModal()" class="cursor-pointer ml-1 flex items-center">${icons.help}</span></div>
|
|
|
+ <div class="text-[12px] text-gray-500 mt-1.5">截止日期 XXXX年X月X日</div>
|
|
|
+ </div>
|
|
|
+ <div class="text-[14px] text-gray-600 mb-1.5">8,000,000 人民币元</div>
|
|
|
+ </div>
|
|
|
+ `,
|
|
|
+ exclusives: [
|
|
|
+ { icon: icons.cap, label: '国际教育' },
|
|
|
+ { icon: icons.heart, label: '优选健康荟' },
|
|
|
+ { icon: icons.bulb, label: '酒店礼遇' }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ 'elite': { // 卓越理财·尊尚
|
|
|
+ headerBannerUrl: 'https://images.unsplash.com/photo-1610701596007-11502861dcfa?w=800&auto=format&fit=crop',
|
|
|
+ tierTitle: 'HSBC Premier Elite', tierSub: '汇丰卓越理财·尊尚',
|
|
|
+ hasAd: true, hasDotsExclusives: true, hasDotsCredit: true, hideIdentity: false,
|
|
|
+ accountHtml: `
|
|
|
+ <div class="flex justify-between items-center border-b border-gray-100 pb-3.5 mb-3.5">
|
|
|
+ <div>
|
|
|
+ <div class="text-[14px] text-gray-800 font-medium flex items-center">卓越理财尊尚客户</div>
|
|
|
+ <div class="text-[12px] text-gray-500 mt-1 flex items-center">合格(上月日均余额)<span onclick="openBalanceRuleModal()" class="cursor-pointer ml-1 flex items-center">${icons.help}</span></div>
|
|
|
+ </div>
|
|
|
+ <div class="text-[14px] text-gray-600 flex items-center">C1234567890 ${icons.copy}</div>
|
|
|
+ </div>
|
|
|
+ <div class="flex justify-between items-end">
|
|
|
+ <div>
|
|
|
+ <div class="text-[14px] text-gray-800 flex items-center font-medium">账户月内日均余额 <span onclick="openBalanceRuleModal()" class="cursor-pointer ml-1 flex items-center">${icons.help}</span></div>
|
|
|
+ <div class="text-[12px] text-gray-500 mt-1.5">截止日期 XXXX年X月X日</div>
|
|
|
+ </div>
|
|
|
+ <div class="text-[14px] text-gray-600 mb-1.5">8,000,000 人民币元</div>
|
|
|
+ </div>
|
|
|
+ `,
|
|
|
+ exclusives: [
|
|
|
+ { icon: icons.cap, label: '国际教育' },
|
|
|
+ { icon: icons.gift, label: '生日礼' },
|
|
|
+ { icon: icons.diamond, label: '礼宾服务' },
|
|
|
+ { icon: icons.heart, label: '汇享健康' }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ 'global': { // 环球私人银行
|
|
|
+ headerBannerUrl: 'https://images.unsplash.com/photo-1634024344558-8b20d7d3b0c6?w=800&auto=format&fit=crop',
|
|
|
+ tierTitle: 'HSBC Private Bank', tierSub: '汇丰环球私人银行',
|
|
|
+ hasAd: true, hasDotsExclusives: false, hasDotsCredit: true, hideIdentity: false,
|
|
|
+ accountHtml: `
|
|
|
+ <div class="flex justify-between items-center py-1">
|
|
|
+ <div>
|
|
|
+ <div class="text-[14px] text-gray-800 font-medium flex items-center">私行业务ID<span onclick="openBalanceRuleModal()" class="cursor-pointer ml-1 flex items-center">${icons.help}</span></div>
|
|
|
+ <div class="text-[12px] text-gray-500 mt-1">银辉</div>
|
|
|
+ </div>
|
|
|
+ <div class="text-[14px] text-gray-600 flex items-center">C1234567890 ${icons.copy}</div>
|
|
|
+ </div>
|
|
|
+ `,
|
|
|
+ exclusives: [
|
|
|
+ { icon: icons.cap, label: '国际教育' },
|
|
|
+ { icon: icons.heart, label: '创臻享礼宾<br>服务' },
|
|
|
+ { icon: icons.medbox, label: '汇佑健康' },
|
|
|
+ { icon: icons.heart, label: '优选健康荟' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 信用卡权益数据 (通用)
|
|
|
+ const creditCardsData = [
|
|
|
+ { icon: icons.car, title: '境外礼宾车', sub: '共2次', badge: '0/2' },
|
|
|
+ { icon: icons.car, title: '境内礼宾车', sub: '共2次', badge: '0/2' },
|
|
|
+ { icon: icons.plane, title: '贵宾厅', sub: '共2次', badge: '0/2' },
|
|
|
+ { icon: icons.globe, title: '境外消费', sub: '点击查看' }
|
|
|
+ ];
|
|
|
+
|
|
|
+ // --- 状态管理 ---
|
|
|
+ let currentUserLevel = 'advance'; // 'prospect', 'credit_only', 'advance', 'premier', 'elite', 'global'
|
|
|
+ let currentActiveTab = 'premier';
|
|
|
+
|
|
|
+ // --- 初始化 ---
|
|
|
+ document.addEventListener('DOMContentLoaded', () => {
|
|
|
+ renderHomePage();
|
|
|
+ updateControlPanelUI();
|
|
|
+ });
|
|
|
+
|
|
|
+ // --- ====== 主页视图逻辑 ====== ---
|
|
|
+ function renderHomePage() {
|
|
|
+ renderHeaderBanner();
|
|
|
+ renderTabsNav();
|
|
|
+ renderContentArea();
|
|
|
+ }
|
|
|
+
|
|
|
+ function renderHeaderBanner() {
|
|
|
+ const banner = document.getElementById('no-tier-banner');
|
|
|
+ const isBasic = ['prospect', 'credit_only', 'advance'].includes(currentUserLevel);
|
|
|
+ banner.style.display = isBasic ? 'flex' : 'none';
|
|
|
+ }
|
|
|
+
|
|
|
+ function renderTabsNav() {
|
|
|
+ const tabs = ['premier', 'elite', 'global'];
|
|
|
+ tabs.forEach((tab) => {
|
|
|
+ const btn = document.getElementById(`tab-btn-${tab}`);
|
|
|
+ if (tab === currentActiveTab) {
|
|
|
+ btn.className = "flex-1 py-3 text-[14px] font-medium relative text-gray-900";
|
|
|
+ } else {
|
|
|
+ btn.className = "flex-1 py-3 text-[14px] font-medium relative text-gray-500";
|
|
|
+ }
|
|
|
+ });
|
|
|
+ const indicator = document.getElementById('tab-indicator');
|
|
|
+ indicator.style.left = `${tabs.indexOf(currentActiveTab) * 33.33}%`;
|
|
|
+ }
|
|
|
+
|
|
|
+ function renderContentArea() {
|
|
|
+ const container = document.getElementById('content-area');
|
|
|
+ const data = tabData[currentActiveTab];
|
|
|
+
|
|
|
+ const levelWeights = { 'prospect': 0, 'credit_only': 0, 'advance': 0, 'premier': 1, 'elite': 2, 'global': 3 };
|
|
|
+ const isUnlocked = levelWeights[currentUserLevel] >= levelWeights[currentActiveTab];
|
|
|
+
|
|
|
+ let buttonHTML = isUnlocked ? `
|
|
|
+ <button onclick="showZone()" class="w-full py-3 mt-4 mb-6 border border-gray-300 rounded text-[15px] font-medium text-gray-900 bg-white active:bg-gray-50 transition">
|
|
|
+ 进入权益专区
|
|
|
+ </button>
|
|
|
+ ` : `
|
|
|
+ <button class="w-full py-3 mt-4 mb-6 rounded text-[15px] font-medium text-[#b3b3b3] bg-[#f7f7f7] cursor-not-allowed">
|
|
|
+ 待解锁
|
|
|
+ </button>
|
|
|
+ `;
|
|
|
+
|
|
|
+ let featuresHTML = data.features.map(f => `
|
|
|
+ <li class="flex items-start mb-3 relative pl-3">
|
|
|
+ <span class="absolute left-0 top-[8px] w-1 h-1 bg-gray-600 rounded-full"></span>
|
|
|
+ <div>
|
|
|
+ <span class="text-gray-900 font-medium text-[13px] mr-1">${f.title}</span>
|
|
|
+ <p class="text-gray-500 text-[12px] leading-relaxed mt-0.5">${f.desc}</p>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ `).join('');
|
|
|
+
|
|
|
+ const cards = [bottomBannerData, bottomBannerData, bottomBannerData];
|
|
|
+ let carouselItemsHTML = cards.map(card => `
|
|
|
+ <div class="min-w-full flex-none snap-center pb-2 px-0.5">
|
|
|
+ <div class="rounded-sm border border-gray-200 shadow-sm bg-white overflow-hidden">
|
|
|
+ <div class="relative h-[150px] w-full">
|
|
|
+ <img src="${card.imageSrc}" class="w-full h-full object-cover">
|
|
|
+ <div class="absolute top-0 left-0 bg-[#3b5988] text-white text-[13px] px-2.5 py-1.5 z-10">${card.tag}</div>
|
|
|
+ </div>
|
|
|
+ <div class="p-5">
|
|
|
+ <h4 class="text-[17px] text-[#333] font-medium mb-3 leading-snug">${card.title}</h4>
|
|
|
+ <p class="text-[13px] text-[#666] tracking-wide">${card.subtitle}</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ `).join('');
|
|
|
+
|
|
|
+ container.innerHTML = `
|
|
|
+ <div class="w-full h-[150px] overflow-hidden mb-4 rounded-sm">
|
|
|
+ <img src="${data.imageSrc}" style="${data.imageStyle}" class="w-full h-full object-cover">
|
|
|
+ </div>
|
|
|
+ <h2 class="text-xl font-medium text-gray-900 mb-1.5">${data.title}</h2>
|
|
|
+ <p class="text-[13px] text-gray-500 leading-snug">${data.subtitle}</p>
|
|
|
+ ${buttonHTML}
|
|
|
+ <ul class="text-sm">${featuresHTML}</ul>
|
|
|
+ <div class="mt-8 relative -mx-0.5">
|
|
|
+ <div id="banner-carousel" class="flex overflow-x-auto snap-x snap-mandatory no-scrollbar w-full" onscroll="handleCarouselScroll(this, 'carousel-dots')">
|
|
|
+ ${carouselItemsHTML}
|
|
|
+ </div>
|
|
|
+ <div class="flex justify-center items-center gap-2 mt-3 mb-2" id="carousel-dots">
|
|
|
+ <div class="w-[6px] h-[6px] rounded-full bg-black transition-colors"></div>
|
|
|
+ <div class="w-[6px] h-[6px] rounded-full border border-black transition-colors"></div>
|
|
|
+ <div class="w-[6px] h-[6px] rounded-full border border-black transition-colors"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ `;
|
|
|
+ }
|
|
|
+
|
|
|
+ // --- ====== 专区内页视图逻辑 (Zone View) ====== ---
|
|
|
+ function renderZonePage() {
|
|
|
+ // **关键点**:基于用户的真实等级 currentUserLevel 渲染内容
|
|
|
+ const data = zoneData[currentUserLevel];
|
|
|
+ const container = document.getElementById('zone-content-area');
|
|
|
+
|
|
|
+ // 专属礼遇图标组合
|
|
|
+ const exclusiveHtml = data.exclusives.map(item => `
|
|
|
+ <div class="flex flex-col items-center min-w-[70px]">
|
|
|
+ <div class="w-12 h-12 rounded-full border border-gray-200 flex items-center justify-center text-gray-500 mb-2.5 shadow-sm bg-gray-50">
|
|
|
+ ${item.icon}
|
|
|
+ </div>
|
|
|
+ <span class="text-[12px] text-gray-700 text-center leading-tight">${item.label}</span>
|
|
|
+ </div>
|
|
|
+ `).join('');
|
|
|
+
|
|
|
+ // 信用卡权益图标组合
|
|
|
+ const creditHtml = creditCardsData.map(item => `
|
|
|
+ <div class="flex flex-col items-center relative min-w-[70px]">
|
|
|
+ ${item.badge ? `<div class="absolute -top-1 right-0 bg-[#d70014] text-white text-[10px] px-1.5 py-0.5 rounded-full z-10 border-2 border-white font-bold tracking-tighter">${item.badge}</div>` : ''}
|
|
|
+ <div class="w-12 h-12 rounded-full border border-gray-200 flex items-center justify-center text-gray-500 mb-2.5 shadow-sm bg-gray-50">
|
|
|
+ ${item.icon}
|
|
|
+ </div>
|
|
|
+ <span class="text-[12px] text-gray-800 text-center leading-tight">${item.title}</span>
|
|
|
+ <span class="text-[11px] text-gray-400 text-center leading-tight mt-1">${item.sub}</span>
|
|
|
+ </div>
|
|
|
+ `).join('');
|
|
|
+
|
|
|
+ let html = '';
|
|
|
+
|
|
|
+ // 如果不隐藏客户身份模块,则渲染头图和账号信息
|
|
|
+ if (!data.hideIdentity) {
|
|
|
+ html += `
|
|
|
+ <div class="w-full h-[140px] relative shrink-0">
|
|
|
+ <img src="${data.headerBannerUrl}" class="w-full h-full object-cover">
|
|
|
+ <div class="absolute inset-0 bg-gradient-to-r from-black/60 to-transparent"></div>
|
|
|
+ <div class="absolute bottom-5 left-5 text-white">
|
|
|
+ <div class="text-[14px] font-bold opacity-90 tracking-wide">${data.tierTitle}</div>
|
|
|
+ <div class="text-[16px] font-medium tracking-widest mt-0.5">${data.tierSub}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="bg-white px-5 py-4 mb-2">
|
|
|
+ ${data.accountHtml}
|
|
|
+ </div>
|
|
|
+ `;
|
|
|
+ } else {
|
|
|
+ // 如果隐藏身份模块,为了布局美观,顶部加一点空白
|
|
|
+ html += `<div class="w-full h-2 bg-transparent shrink-0"></div>`;
|
|
|
+ }
|
|
|
+
|
|
|
+ html += `
|
|
|
+ <div class="bg-white px-5 py-5 mb-2">
|
|
|
+ <div class="flex justify-between items-center mb-6">
|
|
|
+ <h3 class="text-[16px] font-medium text-gray-900">专属礼遇</h3>
|
|
|
+ <div class="text-[13px] text-gray-900 font-medium flex items-center">我的权益 <svg class="w-4 h-4 ml-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M9 18l6-6-6-6"/></svg></div>
|
|
|
+ </div>
|
|
|
+ <div class="flex ${data.exclusives.length < 4 ? 'justify-start gap-8' : 'justify-between'} px-1">
|
|
|
+ ${exclusiveHtml}
|
|
|
+ </div>
|
|
|
+ ${data.hasDotsExclusives ? `
|
|
|
+ <div class="flex justify-center gap-2 mt-6">
|
|
|
+ <div class="w-[5px] h-[5px] bg-black rounded-full"></div>
|
|
|
+ <div class="w-[5px] h-[5px] border border-black rounded-full"></div>
|
|
|
+ </div>` : ''}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="bg-white px-5 py-5 mb-2">
|
|
|
+ <h3 class="text-[16px] font-medium text-gray-900 mb-6">信用卡权益</h3>
|
|
|
+ <div class="flex justify-between px-1">
|
|
|
+ ${creditHtml}
|
|
|
+ </div>
|
|
|
+ ${data.hasDotsCredit ? `
|
|
|
+ <div class="flex justify-center gap-2 mt-6">
|
|
|
+ <div class="w-[5px] h-[5px] bg-black rounded-full"></div>
|
|
|
+ <div class="w-[5px] h-[5px] border border-black rounded-full"></div>
|
|
|
+ </div>` : ''}
|
|
|
+ </div>
|
|
|
+ `;
|
|
|
+
|
|
|
+ if (data.hasAd) {
|
|
|
+ html += `
|
|
|
+ <div class="bg-white px-5 py-5 mb-2">
|
|
|
+ <div class="w-full bg-gray-100 mb-4 h-[150px]">
|
|
|
+ <img src="https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?w=800&auto=format&fit=crop" class="w-full h-full object-cover">
|
|
|
+ </div>
|
|
|
+ <h4 class="text-[18px] text-gray-900 font-medium mb-1.5">文案文案文案文案</h4>
|
|
|
+ <p class="text-[13px] text-gray-500">报名参加汇丰活动,体验更多精彩礼遇</p>
|
|
|
+ </div>
|
|
|
+ `;
|
|
|
+ }
|
|
|
+
|
|
|
+ const isPointsExpanded = !['prospect', 'credit_only', 'advance'].includes(currentUserLevel);
|
|
|
+
|
|
|
+ html += `
|
|
|
+ <div class="bg-white px-5 py-5 pb-8">
|
|
|
+ <div class="flex justify-between items-center mb-5">
|
|
|
+ <h3 class="text-[16px] font-medium text-gray-900">积分商城</h3>
|
|
|
+ <div class="text-[13px] text-gray-900 font-medium flex items-center">进入积分商城 <svg class="w-4 h-4 ml-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M9 18l6-6-6-6"/></svg></div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="flex justify-between items-center py-2 cursor-pointer border-b border-transparent" onclick="togglePoints()">
|
|
|
+ <div>
|
|
|
+ <div class="text-[20px] font-medium text-gray-800">3,000,000</div>
|
|
|
+ <div class="text-[12px] text-gray-400 mt-1">我的总积分</div>
|
|
|
+ </div>
|
|
|
+ <svg id="points-chevron" class="w-5 h-5 text-gray-500 transition-transform duration-300 ${isPointsExpanded ? 'rotate-180' : ''}" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div id="points-details" class="overflow-hidden transition-all duration-300 ${isPointsExpanded ? 'h-[120px]' : 'h-0'}">
|
|
|
+ <div class="border-t border-gray-100 pt-4 mt-2 text-[13px] space-y-4 pb-2">
|
|
|
+ <div class="flex justify-between text-gray-600"><span>汇友荟积分</span><span class="font-medium text-gray-800">9,000 积分</span></div>
|
|
|
+ <div class="flex justify-between text-gray-600"><span>信用卡积分</span><span class="font-medium text-gray-800">9,000 积分</span></div>
|
|
|
+ <div class="flex justify-between text-gray-600"><span>2025年5月24日到期积分</span><span class="font-medium text-gray-800">5,000 积分</span></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="mt-6">
|
|
|
+ <div class="flex justify-between items-center mb-4">
|
|
|
+ <h3 class="text-[16px] font-medium text-gray-900">常用兑换</h3>
|
|
|
+ <div class="text-[13px] text-gray-800 flex items-center font-medium">${icons.doc}积分明细</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="flex overflow-x-auto no-scrollbar gap-3 pb-2 snap-x" onscroll="handleCarouselScroll(this, 'exchange-dots')">
|
|
|
+ <div class="min-w-[100px] bg-white border border-gray-200 rounded-sm flex flex-col items-center snap-start shadow-sm">
|
|
|
+ <div class="w-full h-[65px] bg-[#f7fbff] flex items-center justify-center">${icons.planeRed}</div>
|
|
|
+ <div class="text-[13px] text-gray-700 py-2.5">航空里程</div>
|
|
|
+ </div>
|
|
|
+ <div class="min-w-[100px] bg-white border border-gray-200 rounded-sm flex flex-col items-center snap-start shadow-sm">
|
|
|
+ <div class="w-full h-[65px] bg-[#fffaf5] flex items-center justify-center">${icons.coffee}</div>
|
|
|
+ <div class="text-[13px] text-gray-700 py-2.5">贵宾厅</div>
|
|
|
+ </div>
|
|
|
+ <div class="min-w-[100px] bg-white border border-gray-200 rounded-sm flex flex-col items-center snap-start shadow-sm">
|
|
|
+ <div class="w-full h-[65px] bg-[#fffdf5] flex items-center justify-center"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#d5aa11" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 12 10s-6.7.6-8.5 1.1C2.7 11.3 2 12.1 2 13v3c0 .6.4 1 1 1h2"/><rect width="16" height="8" x="4" y="10" rx="2"/><path d="M7 14h.01"/><path d="M17 14h.01"/><path d="m10 10-1.5-4h7l-1.5 4"/></svg></div>
|
|
|
+ <div class="text-[13px] text-gray-700 py-2.5">礼宾接送机</div>
|
|
|
+ </div>
|
|
|
+ <div class="min-w-[100px] bg-white border border-gray-200 rounded-sm flex flex-col items-center snap-start shadow-sm">
|
|
|
+ <div class="w-full h-[65px] bg-[#f9fafb] flex items-center justify-center"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#666" stroke-width="1.5"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/></svg></div>
|
|
|
+ <div class="text-[13px] text-gray-700 py-2.5">年费</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex justify-center gap-2 mt-3" id="exchange-dots">
|
|
|
+ <div class="w-[5px] h-[5px] bg-black rounded-full transition-colors"></div>
|
|
|
+ <div class="w-[5px] h-[5px] border border-black rounded-full transition-colors"></div>
|
|
|
+ </div>
|
|
|
+ <div class="flex justify-end mt-6">
|
|
|
+ <div class="text-[12px] text-gray-900 font-medium flex items-center cursor-pointer" onclick="openRuleModal()">${icons.doc} 积分规则</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ `;
|
|
|
+
|
|
|
+ container.innerHTML = html;
|
|
|
+ }
|
|
|
+
|
|
|
+ // --- ====== 交互行为 ====== ---
|
|
|
+
|
|
|
+ function switchTab(tabId) {
|
|
|
+ currentActiveTab = tabId;
|
|
|
+ renderHomePage();
|
|
|
+ }
|
|
|
+
|
|
|
+ function setUserLevel(level) {
|
|
|
+ currentUserLevel = level;
|
|
|
+ const basicLevels = ['prospect', 'credit_only', 'advance'];
|
|
|
+ currentActiveTab = basicLevels.includes(level) ? 'premier' : level;
|
|
|
+
|
|
|
+ renderHomePage();
|
|
|
+ updateControlPanelUI();
|
|
|
+
|
|
|
+ if(document.getElementById('zone-view').classList.contains('translate-x-0')) {
|
|
|
+ renderZonePage();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isSimPanelOpen) toggleSimPanel();
|
|
|
+ }
|
|
|
+
|
|
|
+ function showZone() {
|
|
|
+ renderZonePage();
|
|
|
+
|
|
|
+ const homeView = document.getElementById('home-view');
|
|
|
+ const zoneView = document.getElementById('zone-view');
|
|
|
+
|
|
|
+ homeView.classList.remove('translate-x-0');
|
|
|
+ homeView.classList.add('-translate-x-full');
|
|
|
+
|
|
|
+ zoneView.classList.remove('translate-x-full');
|
|
|
+ zoneView.classList.add('translate-x-0');
|
|
|
+ }
|
|
|
+
|
|
|
+ function hideZone() {
|
|
|
+ const homeView = document.getElementById('home-view');
|
|
|
+ const zoneView = document.getElementById('zone-view');
|
|
|
+
|
|
|
+ homeView.classList.remove('-translate-x-full');
|
|
|
+ homeView.classList.add('translate-x-0');
|
|
|
+
|
|
|
+ zoneView.classList.remove('translate-x-0');
|
|
|
+ zoneView.classList.add('translate-x-full');
|
|
|
+ }
|
|
|
+
|
|
|
+ function openRuleModal() {
|
|
|
+ document.getElementById('rule-modal-backdrop').classList.remove('opacity-0', 'pointer-events-none');
|
|
|
+ document.getElementById('rule-modal').classList.remove('translate-y-full');
|
|
|
+ }
|
|
|
+ function closeRuleModal() {
|
|
|
+ document.getElementById('rule-modal-backdrop').classList.add('opacity-0', 'pointer-events-none');
|
|
|
+ document.getElementById('rule-modal').classList.add('translate-y-full');
|
|
|
+ }
|
|
|
+
|
|
|
+ function openBalanceRuleModal() {
|
|
|
+ document.getElementById('balance-rule-modal-backdrop').classList.remove('opacity-0', 'pointer-events-none');
|
|
|
+ document.getElementById('balance-rule-modal').classList.remove('translate-y-full');
|
|
|
+ }
|
|
|
+ function closeBalanceRuleModal() {
|
|
|
+ document.getElementById('balance-rule-modal-backdrop').classList.add('opacity-0', 'pointer-events-none');
|
|
|
+ document.getElementById('balance-rule-modal').classList.add('translate-y-full');
|
|
|
+ }
|
|
|
+
|
|
|
+ function togglePoints() {
|
|
|
+ const details = document.getElementById('points-details');
|
|
|
+ const chevron = document.getElementById('points-chevron');
|
|
|
+
|
|
|
+ if (details.classList.contains('h-0')) {
|
|
|
+ details.classList.remove('h-0');
|
|
|
+ details.classList.add('h-[120px]');
|
|
|
+ chevron.style.transform = 'rotate(180deg)';
|
|
|
+ } else {
|
|
|
+ details.classList.remove('h-[120px]');
|
|
|
+ details.classList.add('h-0');
|
|
|
+ chevron.style.transform = 'rotate(0deg)';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function handleCarouselScroll(ele, dotsContainerId) {
|
|
|
+ const index = Math.round(ele.scrollLeft / ele.clientWidth);
|
|
|
+ const dots = document.getElementById(dotsContainerId)?.children;
|
|
|
+ if(!dots) return;
|
|
|
+ for(let i=0; i<dots.length; i++) {
|
|
|
+ dots[i].className = (i === index)
|
|
|
+ ? "w-[5px] h-[5px] rounded-full bg-black transition-colors"
|
|
|
+ : "w-[5px] h-[5px] rounded-full border border-black transition-colors";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function updateControlPanelUI() {
|
|
|
+ const levels = ['prospect', 'credit_only', 'advance', 'premier', 'elite', 'global'];
|
|
|
+ levels.forEach(lvl => {
|
|
|
+ const btn = document.getElementById(`btn-state-${lvl}`);
|
|
|
+ if (lvl === currentUserLevel) {
|
|
|
+ btn.className = 'px-2 py-1.5 rounded bg-[#d70014] text-white transition font-medium';
|
|
|
+ } else {
|
|
|
+ btn.className = 'px-2 py-1.5 rounded bg-gray-100 text-gray-700 hover:bg-gray-200 transition';
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ let isSimPanelOpen = false;
|
|
|
+ function toggleSimPanel() {
|
|
|
+ isSimPanelOpen = !isSimPanelOpen;
|
|
|
+ const panel = document.getElementById('sim-panel');
|
|
|
+ if(isSimPanelOpen) {
|
|
|
+ panel.classList.remove('scale-0', 'opacity-0', 'pointer-events-none');
|
|
|
+ panel.classList.add('scale-100', 'opacity-100');
|
|
|
+ } else {
|
|
|
+ panel.classList.remove('scale-100', 'opacity-100');
|
|
|
+ panel.classList.add('scale-0', 'opacity-0', 'pointer-events-none');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ </script>
|
|
|
+</body>
|
|
|
+</html>
|