# 爱上萍乡小程序改版 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Redesign the mini-program from "湖南12301文旅专区" to "爱上萍乡" — a tourism card sales platform with 3-tab navigation, visual-impact homepage, and QR code entry page.
**Architecture:** The homepage (`pages/index/index.vue`) is a single-file Vue 3 SFC rebuilt with 4 sections: hero header, announcement swiper, card promotions, and scenic spots list. The QR code page (`pages/qrcode/index.vue`) is a new tab-level page with card swiper, expandable info panel, and feature buttons. Static scenic spot data lives in `src/data/scenic-spots.ts`. All existing API types, request utilities, and store patterns remain unchanged.
**Tech Stack:** Vue 3 + TypeScript + uni-app (WeChat mini-program) + Pinia + SCSS
## Global Constraints
- App name in all navigation bars: "爱上萍乡"
- TabBar: exactly 3 items (首页, 入园码, 我的)
- Homepage card prices: 赣湘全域旅游年卡 ¥300, 超级玩家卡 ¥198
- ~48 scenic spots (merged deduplicated from both cards), hardcoded in Phase 1
- QR code page: framework/placeholder only, no real QR generation logic
- All images use gradient/placeholder until real assets are available
- Announcements use mock data with API interface reserved
- uni-app `
```
- [ ] **Step 4: Update profile page text**
In `src/pages/profile/index.vue`, change line 9 from:
```html
欢迎使用湖南12301文旅专区
```
to:
```html
欢迎使用爱上萍乡
```
- [ ] **Step 5: Verify build succeeds**
Run: `cd /Users/jacobxu/Documents/Project/12301-dscp/zhy-mp-test && pnpm run build:mp-weixin`
Expected: BUILD SUCCESS with no errors. Verify `dist/build/mp-weixin/pages/qrcode/index` exists in output.
- [ ] **Step 6: Commit**
```bash
git add -A
git commit -m "feat: update tabBar to 3 items, add qrcode page skeleton, rename app"
```
---
### Task 2: Scenic Spots Data Module
**Files:**
- Create: `src/data/scenic-spots.ts`
**Interfaces:**
- Consumes: nothing
- Produces: `ScenicSpotItem` interface and `scenicSpots` array (48 items), imported by homepage as `import { scenicSpots } from '../../data/scenic-spots'`
- [ ] **Step 1: Create scenic spots data file**
Create `src/data/scenic-spots.ts`:
```typescript
/** 景点数据类型 */
export interface ScenicSpotItem {
id: number
name: string
region: '萍乡' | '长沙' | '株洲' | '湘潭'
price: number
image: string
}
/**
* 合并去重后的景点列表(48个)
* 来源:赣湘全域旅游年卡(22家) + 超级玩家卡(40家),去重后
* TODO: Phase 2 改为后端 API 获取
*/
export const scenicSpots: ScenicSpotItem[] = [
// === 萍乡 (21家) ===
{ id: 1, name: '武功山金顶景区', region: '萍乡', price: 70, image: '' },
{ id: 2, name: '杨岐山孽龙洞景区', region: '萍乡', price: 68, image: '' },
{ id: 3, name: '仙凤三宝景区', region: '萍乡', price: 50, image: '' },
{ id: 4, name: '武功山君澜温泉', region: '萍乡', price: 228, image: '' },
{ id: 5, name: '凯光新天地生态旅游区', region: '萍乡', price: 90, image: '' },
{ id: 6, name: '山猫王国', region: '萍乡', price: 68, image: '' },
{ id: 7, name: '和平农场·哎马乐园', region: '萍乡', price: 79, image: '' },
{ id: 8, name: '花涧里景区', region: '萍乡', price: 80, image: '' },
{ id: 9, name: '玉皇谷景区', region: '萍乡', price: 50, image: '' },
{ id: 10, name: '龙溪秘境', region: '萍乡', price: 30, image: '' },
{ id: 11, name: '南正街唐朝诡事录', region: '萍乡', price: 158, image: '' },
{ id: 12, name: '孽龙洞水上乐园', region: '萍乡', price: 180, image: '' },
{ id: 13, name: '桐花谷', region: '萍乡', price: 50, image: '' },
{ id: 14, name: '赣西野生动物王国', region: '萍乡', price: 160, image: '' },
{ id: 15, name: '武功山外骨骼登山', region: '萍乡', price: 200, image: '' },
{ id: 16, name: '发光登山杖', region: '萍乡', price: 88, image: '' },
{ id: 17, name: '三只猫青年旅社', region: '萍乡', price: 60, image: '' },
{ id: 18, name: '武功山奖牌', region: '萍乡', price: 19.9, image: '' },
{ id: 19, name: 'AI中医', region: '萍乡', price: 125, image: '' },
// === 长沙 (16家) ===
{ id: 20, name: '长沙方特东方神画', region: '长沙', price: 280, image: '' },
{ id: 21, name: '麦咭乐园红星运动空间站', region: '长沙', price: 278, image: '' },
{ id: 22, name: '宁乡野趣亲子乐园', region: '长沙', price: 88, image: '' },
{ id: 23, name: '长沙乐田派绣乡亲子乐园', region: '长沙', price: 68, image: '' },
{ id: 24, name: '湘东漂流', region: '长沙', price: 168, image: '' },
{ id: 25, name: '长沙黑麋峰森林公园', region: '长沙', price: 27, image: '' },
{ id: 26, name: '湘江游轮', region: '长沙', price: 120, image: '' },
{ id: 27, name: '天心阁', region: '长沙', price: 58, image: '' },
{ id: 28, name: '皇龙峡生态旅游区', region: '长沙', price: 138, image: '' },
{ id: 29, name: '靖港古镇', region: '长沙', price: 80, image: '' },
{ id: 30, name: '西溪磐石大峡谷', region: '长沙', price: 48, image: '' },
{ id: 31, name: '湖南省木偶皮影剧场', region: '长沙', price: 68, image: '' },
{ id: 32, name: '金坑溯溪', region: '长沙', price: 99, image: '' },
{ id: 33, name: '关山古镇', region: '长沙', price: 50, image: '' },
{ id: 34, name: '浏河第一湾', region: '长沙', price: 88, image: '' },
// === 株洲 (6家) ===
{ id: 35, name: '炎帝陵', region: '株洲', price: 62, image: '' },
{ id: 36, name: '酷洛潮漫(株洲馆)', region: '株洲', price: 118, image: '' },
{ id: 37, name: '神农谷风景旅游区', region: '株洲', price: 62, image: '' },
{ id: 38, name: '云上大院', region: '株洲', price: 50, image: '' },
{ id: 39, name: '云阳山', region: '株洲', price: 45, image: '' },
{ id: 40, name: '酒仙湖', region: '株洲', price: 65, image: '' },
// === 湘潭 (7家) ===
{ id: 41, name: '盘龙大观园', region: '湘潭', price: 128, image: '' },
{ id: 42, name: '米莱知识宇宙(湘潭万达馆)', region: '湘潭', price: 326, image: '' },
{ id: 43, name: '滴水洞', region: '湘潭', price: 40, image: '' },
{ id: 44, name: '毛泽东纪念园', region: '湘潭', price: 60, image: '' },
{ id: 45, name: '韶峰景区(含缆车)', region: '湘潭', price: 60, image: '' },
{ id: 46, name: '彭德怀纪念馆', region: '湘潭', price: 98, image: '' },
{ id: 47, name: '《最忆韶山冲》演出', region: '湘潭', price: 298, image: '' },
]
```
- [ ] **Step 2: Verify build succeeds**
Run: `pnpm run build:mp-weixin`
Expected: BUILD SUCCESS (data file has no side effects, just confirms it compiles).
- [ ] **Step 3: Commit**
```bash
git add src/data/scenic-spots.ts
git commit -m "feat: add scenic spots data module (48 spots, hardcoded)"
```
---
### Task 3: Homepage Redesign
**Files:**
- Modify: `src/pages/index/index.vue` (complete rewrite)
**Interfaces:**
- Consumes: `ScenicSpotItem` and `scenicSpots` from `../../data/scenic-spots`
- Produces: nothing (page component, no exports)
- [ ] **Step 1: Write the complete homepage**
Replace the entire contents of `src/pages/index/index.vue` with:
```vue
爱上萍乡
赣湘之间 · 发现旅途美好
🔍
搜索景区、活动...
📢
公告
{{ item.content }}
工会会员专属
赣湘全域旅游年卡
¥
300
/套卡(2张)
✦ 22家景区免门票
✦ 武功山·方特·君澜温泉
✦ 覆盖萍乡/长沙/株洲/湘潭
立即抢购 →
大学生·市民专属
超级玩家卡
¥
198
✦ 40家景区免门票
✦ 武功山·方特·韶山·滴水洞
✦ 含外骨骼登山·青年旅社等
立即抢购 →
{{ spot.region }}
{{ spot.name }}
¥{{ spot.price }}
持卡免门票
```
- [ ] **Step 2: Verify build succeeds**
Run: `pnpm run build:mp-weixin`
Expected: BUILD SUCCESS.
- [ ] **Step 3: Run type check**
Run: `pnpm run type-check`
Expected: No type errors.
- [ ] **Step 4: Visual verification (WeChat devtools)**
Run: `pnpm run dev:mp-weixin`
Open WeChat developer tools and import `dist/dev/mp-weixin`. Verify:
1. Hero header shows gradient background, "爱上萍乡" title, subtitle, search bar
2. Announcement bar scrolls vertically through 3 mock items
3. Two promo cards display with correct gradients, prices (¥300, ¥198), and feature text
4. Scenic spots list shows all 48 spots with gradient images, region tags, prices, and "持卡免门票" tags
5. TabBar shows 3 items: 首页, 入园码, 我的
- [ ] **Step 5: Commit**
```bash
git add src/pages/index/index.vue
git commit -m "feat: redesign homepage with hero, announcements, card promos, scenic spots"
```
---
### Task 4: QR Code Entry Page
**Files:**
- Modify: `src/pages/qrcode/index.vue` (replace skeleton with full implementation)
**Interfaces:**
- Consumes: `useUserStore` from `../../store/user`
- Produces: nothing (page component, no exports)
- [ ] **Step 1: Write the complete QR code page**
Replace the entire contents of `src/pages/qrcode/index.vue` with:
```vue
🎫
您还没有旅游卡
购买旅游卡后即可使用入园码
去购买
爱上萍乡
{{ card.cardName }}
{{ card.userName }}
有效期至 {{ card.expireDate }}
证件类型
{{ currentCard.idType }}
证件号码
{{ currentCard.idNumber }}
手机号码
{{ currentCard.phone }}
入园码
(二维码占位)
⏱ {{ countdown }}秒后自动刷新
📅
景区预约
📋
使用记录
🏔️
权益景区
```
- [ ] **Step 2: Verify build succeeds**
Run: `pnpm run build:mp-weixin`
Expected: BUILD SUCCESS.
- [ ] **Step 3: Run type check**
Run: `pnpm run type-check`
Expected: No type errors.
- [ ] **Step 4: Visual verification (WeChat devtools)**
Open WeChat developer tools, navigate to the "入园码" tab. Verify:
1. Card swiper shows 2 cards with correct gradients, names, user info
2. Left/right swipe switches between cards with dot indicator updating
3. "持卡信息" panel toggles expand/collapse on tap
4. Expanded panel shows: 身份证, 360\*\*\*1234, 138\*\*\*\*5678
5. QR code placeholder area is centered with countdown text
6. Countdown decrements from 60 to 0, then resets
7. 3 feature buttons show with colored circle icons and labels
8. Tapping any feature button shows "功能开发中" toast
- [ ] **Step 5: Commit**
```bash
git add src/pages/qrcode/index.vue
git commit -m "feat: implement QR code entry page with card swiper, info panel, features"
```
---
### Task 5: Final Verification & Polish
**Files:**
- No new files. Verify all modified files.
- [ ] **Step 1: Full build**
Run: `pnpm run build:mp-weixin`
Expected: BUILD SUCCESS with zero errors.
- [ ] **Step 2: Type check**
Run: `pnpm run type-check`
Expected: No type errors.
- [ ] **Step 3: End-to-end visual verification**
Open WeChat developer tools, import `dist/dev/mp-weixin`. Go through this checklist:
1. **TabBar**: 3 tabs visible (首页, 入园码, 我的), all switchable
2. **首页**:
- Hero: gradient background, "爱上萍乡" title, "赣湘之间 · 发现旅途美好" subtitle, search bar
- Announcement: vertical scrolling, 3 items cycling
- Card 1 (赣湘年卡): blue-gold gradient, ¥300, 3 features, "立即抢购" button
- Card 2 (超级玩家卡): orange-purple gradient, ¥198, 3 features, "立即抢购" button
- Scenic spots: 48 spots listed vertically, each with gradient image, region tag, name, price, "持卡免门票" tag
- Scrolling through all spots is smooth
3. **入园码**:
- 2 cards in swiper, switchable
- Expandable info panel works
- QR placeholder with countdown timer
- 3 feature buttons display and show toast on tap
4. **我的**:
- "欢迎使用爱上萍乡" text displayed (not "湖南12301")
- All menu items still functional
5. **Login**: still accessible and functional
- [ ] **Step 4: Final commit**
```bash
git add -A
git commit -m "chore: final verification pass for homepage redesign"
```