| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- <template>
- <div class="guide-card wide">
- <div class="guide-illustration" style="background: linear-gradient(135deg, #e87722 0%, #f9ca24 100%);">
- <div class="illus-bubble bubble-1">🎫</div>
- <div class="illus-bubble bubble-2">🎁</div>
- <div class="illus-center">🎟️</div>
- </div>
- <div class="guide-body">
- <div class="guide-badge">Step 8</div>
- <h2 class="guide-title">个人中心 — 礼品券兑换</h2>
- <p class="guide-desc">在「我的礼品券」Tab 管理你的礼品券,支持三种状态:</p>
- <!-- 状态说明 -->
- <div class="tab-list">
- <div class="tab-item" v-for="item in statusList" :key="item.id">
- <div class="tab-num">{{ item.icon }}</div>
- <div class="tab-info">
- <div class="tab-title">{{ item.title }}</div>
- <div class="tab-desc">{{ item.desc }}</div>
- </div>
- </div>
- </div>
- <!-- 兑换流程 -->
- <div class="redeem-flow">
- <span class="flow-tip">🎫 礼品券兑换路径:</span>
- <div class="flow-steps">
- <span v-for="(step, i) in flowSteps" :key="i" class="flow-step-wrap">
- <span class="flow-step">{{ step }}</span>
- <span v-if="i < flowSteps.length - 1" class="flow-arrow">→</span>
- </span>
- </div>
- </div>
- </div>
- <div class="guide-footer">
- <button class="btn-primary" @click="handleGoCoupon">
- <span>🎫</span> 查看礼品券
- </button>
- <button class="btn-prev" v-if="!isFirst" @click="$emit('prev')">
- ← 上一步
- </button>
- </div>
- </div>
- </template>
- <script>
- import { setTab } from '@/utils/auth'
- export default {
- name: 'CouponGuide',
- props: {
- isLast: { type: Boolean, default: false },
- isFirst: { type: Boolean, default: false },
- isReplay: { type: Boolean, default: false },
- },
- data() {
- return {
- statusList: [
- { id: 1, icon: '🟢', title: '去使用', desc: '礼品券未使用,点击「去使用」即可兑换' },
- { id: 2, icon: '⚪', title: '已使用', desc: '礼品券已完成兑换' },
- { id: 3, icon: '🔴', title: '已超期', desc: '礼品券已过期,无法使用' },
- ],
- flowSteps: ['选择商品', '确认订单', '礼品券抵扣', '兑换成功'],
- }
- },
- methods: {
- handleGoCoupon() {
- setTab('welfare')
- // 先跳首页再跳 myCenter,确保组件重新 created 读取 Cookie
- this.$router.push('/home').then(() => {
- this.$router.push('/myCenter')
- })
- setTimeout(() => this.$emit('next'), 800)
- },
- },
- }
- </script>
- <style scoped>
- .guide-card {
- width: 440px;
- max-width: 90vw;
- background: #fff;
- border-radius: 20px;
- overflow: hidden;
- box-shadow: 0 20px 60px rgba(0,0,0,0.25);
- animation: cardFloat 0.5s ease-out;
- }
- .guide-card.wide { width: 500px; }
- @keyframes cardFloat {
- from { opacity: 0; transform: translateY(30px) scale(0.95); }
- to { opacity: 1; transform: translateY(0) scale(1); }
- }
- .guide-illustration {
- position: relative;
- height: 130px;
- display: flex;
- align-items: center;
- justify-content: center;
- overflow: hidden;
- }
- .illus-center { font-size: 52px; z-index: 2; }
- .illus-bubble {
- position: absolute;
- font-size: 22px;
- animation: bubbleFloat 4s ease-in-out infinite;
- }
- .bubble-1 { top: 18px; left: 28px; animation-delay: 0s; }
- .bubble-2 { bottom: 18px; right: 28px; animation-delay: 2s; }
- @keyframes bubbleFloat {
- 0%, 100% { transform: translateY(0); }
- 50% { transform: translateY(-8px); }
- }
- .guide-body { padding: 20px 28px 14px; }
- .guide-badge {
- display: inline-block;
- padding: 3px 12px;
- font-size: 12px;
- font-weight: 600;
- color: #e87722;
- background: #fff4e8;
- border-radius: 12px;
- margin-bottom: 10px;
- }
- .guide-title {
- font-size: 18px;
- font-weight: 700;
- color: #1d2129;
- margin: 0 0 6px;
- }
- .guide-desc {
- font-size: 13px;
- line-height: 1.6;
- color: #86909c;
- margin: 0 0 14px;
- }
- .tab-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }
- .tab-item {
- display: flex;
- align-items: center;
- gap: 10px;
- padding: 10px 12px;
- background: #f7f9fc;
- border-radius: 10px;
- transition: all 0.25s;
- }
- .tab-item:hover { background: #fff4e8; }
- .tab-num {
- width: 28px;
- height: 28px;
- line-height: 28px;
- text-align: center;
- font-size: 16px;
- flex-shrink: 0;
- }
- .tab-info { flex: 1; }
- .tab-title { font-size: 13px; font-weight: 600; color: #1d2129; }
- .tab-desc { font-size: 12px; color: #86909c; margin-top: 2px; }
- .redeem-flow {
- padding: 10px 12px;
- background: linear-gradient(135deg, #fff9f0, #fff4e0);
- border-radius: 10px;
- border-left: 3px solid #e87722;
- }
- .flow-tip { font-size: 12px; color: #e87722; font-weight: 600; display: block; margin-bottom: 6px; }
- .flow-steps { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; }
- .flow-step-wrap { display: flex; align-items: center; gap: 4px; }
- .flow-step {
- padding: 3px 8px;
- background: #fff;
- border: 1px solid #e87722;
- border-radius: 6px;
- font-size: 11px;
- color: #e87722;
- font-weight: 500;
- }
- .flow-arrow { font-size: 12px; color: #e87722; }
- .guide-footer {
- padding: 14px 28px 22px;
- display: flex;
- flex-direction: column;
- gap: 10px;
- }
- .btn-primary {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 8px;
- height: 44px;
- font-size: 15px;
- font-weight: 600;
- color: #fff;
- background: linear-gradient(135deg, #e87722, #f9ca24);
- border: none;
- border-radius: 22px;
- cursor: pointer;
- transition: all 0.3s;
- box-shadow: 0 4px 14px rgba(232,119,34,0.3);
- }
- .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 6px 18px rgba(232,119,34,0.45); }
- .btn-prev {
- height: 40px;
- font-size: 14px;
- font-weight: 500;
- color: #86909c;
- background: #f7f9fc;
- border: none;
- border-radius: 20px;
- cursor: pointer;
- transition: all 0.25s;
- }
- .btn-prev:hover { color: #4e5969; background: #eef1f6; }
- </style>
|