diff --git a/.gitignore b/.gitignore
index 3d379e0..2b3446a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
node_modules/
dist/
+docs/
apps/*/dist/
.env
.env.local
diff --git a/AGENTS.md b/AGENTS.md
index 1dfc082..e7348ab 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -271,6 +271,8 @@ yarn dev:mp-weixin
- `WonderQ-MiniAPP` 使用 Vue 3 SFC、`
-
-
diff --git a/WonderQ-MiniAPP/src/components/TopHeader.vue b/WonderQ-MiniAPP/src/components/TopHeader.vue
index b0b6c1e..5facdc4 100644
--- a/WonderQ-MiniAPP/src/components/TopHeader.vue
+++ b/WonderQ-MiniAPP/src/components/TopHeader.vue
@@ -9,7 +9,7 @@
+ :class="search ? 'w-[calc(100%-136px)]' : 'w-[calc(100%-88px)]'">
{{ title }}
{{ subtitle
}}
@@ -20,11 +20,6 @@
aria-label="搜索" @click="$emit('search')">
-
-
-
@@ -40,7 +35,6 @@ defineProps<{
defineEmits<{
back: [];
search: [];
- support: [];
}>();
diff --git a/WonderQ-MiniAPP/src/lib/support.ts b/WonderQ-MiniAPP/src/lib/support.ts
deleted file mode 100644
index 4c0f569..0000000
--- a/WonderQ-MiniAPP/src/lib/support.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { SUPPORT_PHONE } from "./types";
-
-const WECOM_CUSTOMER_SERVICE_URL = String(import.meta.env.VITE_WECOM_CUSTOMER_SERVICE_URL ?? "");
-const WECOM_CORP_ID = String(import.meta.env.VITE_WECOM_CORP_ID ?? "");
-
-type CustomerServiceOptions = {
- extInfo: { url: string };
- corpId: string;
- success?: (result: unknown) => void;
- fail?: (error: unknown) => void;
- complete?: (result: unknown) => void;
-};
-
-type WechatRuntime = {
- openCustomerServiceChat?: (options: CustomerServiceOptions) => void;
-};
-
-export function openOnlineSupport() {
- const runtime = (uni as unknown as WechatRuntime).openCustomerServiceChat
- ? (uni as unknown as WechatRuntime)
- : ((globalThis as { wx?: WechatRuntime }).wx ?? {});
-
- if (!runtime.openCustomerServiceChat) {
- uni.showToast({ title: "请在微信内联系服务管家", icon: "none" });
- return false;
- }
-
- if (!WECOM_CUSTOMER_SERVICE_URL || !WECOM_CORP_ID) {
- console.info("Missing WeCom customer service env: VITE_WECOM_CUSTOMER_SERVICE_URL or VITE_WECOM_CORP_ID.");
- uni.showToast({ title: "客服配置待完善", icon: "none" });
- return false;
- }
-
- runtime.openCustomerServiceChat({
- extInfo: { url: WECOM_CUSTOMER_SERVICE_URL },
- corpId: WECOM_CORP_ID,
- fail(error) {
- console.warn("Failed to open WeCom customer service.", error);
- uni.showToast({ title: "暂未打开客服", icon: "none" });
- },
- });
- return true;
-}
-
-export function callSupport() {
- uni.makePhoneCall({
- phoneNumber: SUPPORT_PHONE,
- fail() {
- uni.showToast({ title: `可拨打 ${SUPPORT_PHONE}`, icon: "none" });
- },
- });
-}
diff --git a/WonderQ-MiniAPP/src/pages.json b/WonderQ-MiniAPP/src/pages.json
index c5d7164..1745d97 100644
--- a/WonderQ-MiniAPP/src/pages.json
+++ b/WonderQ-MiniAPP/src/pages.json
@@ -8,51 +8,16 @@
}
},
{
- "path": "pages/destination/index",
+ "path": "pages/play/index",
"style": {
- "navigationBarTitleText": "目的地",
+ "navigationBarTitleText": "玩法",
"navigationStyle": "custom"
}
},
{
- "path": "pages/destination-picker/index",
+ "path": "pages/concierge/index",
"style": {
- "navigationBarTitleText": "选择目的地",
- "navigationStyle": "custom"
- }
- },
- {
- "path": "pages/search/index",
- "style": {
- "navigationBarTitleText": "搜索结果",
- "navigationStyle": "custom"
- }
- },
- {
- "path": "pages/campaign/index",
- "style": {
- "navigationBarTitleText": "活动",
- "navigationStyle": "custom"
- }
- },
- {
- "path": "pages/demand/index",
- "style": {
- "navigationBarTitleText": "提交需求",
- "navigationStyle": "custom"
- }
- },
- {
- "path": "pages/benefits/index",
- "style": {
- "navigationBarTitleText": "万趣权益",
- "navigationStyle": "custom"
- }
- },
- {
- "path": "pages/booking/index",
- "style": {
- "navigationBarTitleText": "预订咨询",
+ "navigationBarTitleText": "管家",
"navigationStyle": "custom"
}
},
diff --git a/WonderQ-MiniAPP/src/pages/benefits/index.vue b/WonderQ-MiniAPP/src/pages/benefits/index.vue
deleted file mode 100644
index 3fc5166..0000000
--- a/WonderQ-MiniAPP/src/pages/benefits/index.vue
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
- {{ BRAND_FULL_NAME }}
- 把复杂的贵州旅行交给服务管家
- 小车小团、弹性动线、酒店资源和行前沟通统一协同。
-
-
-
-
-
-
- 0{{ index + 1 }}
-
- {{ item.title }}
- {{ item.desc }}
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/WonderQ-MiniAPP/src/pages/booking/index.vue b/WonderQ-MiniAPP/src/pages/booking/index.vue
deleted file mode 100644
index 231b5ba..0000000
--- a/WonderQ-MiniAPP/src/pages/booking/index.vue
+++ /dev/null
@@ -1,195 +0,0 @@
-
-
-
-
-
-
-
- 需求已提交
- 服务管家会结合线路、日期、人数和备注给你确认方案。
-
-
-
-
-
-
-
-
-
- {{ stripTitle(product.title) }}
- {{ product.tags.slice(0, 3).join(" / ") }}
- ¥{{ formatWan(product.price) }}万/人起
-
-
-
-
-
- {{ item }}
-
-
-
-
-
- 选择行程偏好
-
-
-
-
-
-
- 同行人数
- 按人数估算参考总价
-
-
-
- {{ peopleCount }}
-
-
-
-
-
-
- 留下联系方式
-
-
-
-
-
-
- 确认咨询信息
-
- {{ label }}
- {{ value }}
-
-
-
-
- {{ message }}
-
-
- 参考总价
- ¥{{ totalLabel }}万
-
-
-
-
-
-
-
-
-
-
diff --git a/WonderQ-MiniAPP/src/pages/campaign/index.vue b/WonderQ-MiniAPP/src/pages/campaign/index.vue
deleted file mode 100644
index bb04d4a..0000000
--- a/WonderQ-MiniAPP/src/pages/campaign/index.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{ BRAND_FULL_NAME }}
- {{ campaignTitle }}
- {{ campaignCopy }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeAdvisor.vue b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeAdvisor.vue
new file mode 100644
index 0000000..8f0f578
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeAdvisor.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+ {{ advisor.name }}
+ {{ advisor.role }}
+
+
+
+
+
+
+
+
+
+ {{ detail.label }}
+
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeContactSheet.vue b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeContactSheet.vue
new file mode 100644
index 0000000..840d1c4
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeContactSheet.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+ CONTACT ADVISOR
+ 添加专属管家
+
+
+
+
+
+
+
+
+
+ {{ advisor.name }}
+ {{ advisor.role }}
+
+
+
+
+
+ 长按二维码识别,添加管家好友
+ 添加后可沟通路线、预算、酒店和用车安排
+
+
+
+
+
+ {{ detail.label }}
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeHero.vue b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeHero.vue
new file mode 100644
index 0000000..d43a11f
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergeHero.vue
@@ -0,0 +1,10 @@
+
+
+ BESPOKE SERVICE
+ 专属私享管家
+ 一对一高定咨询与行程重塑
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/concierge/components/ConciergePrinciples.vue b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergePrinciples.vue
new file mode 100644
index 0000000..a77e070
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/concierge/components/ConciergePrinciples.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+ {{ principle.title }}
+ {{ principle.description }}
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/concierge/components/conciergeTypes.ts b/WonderQ-MiniAPP/src/pages/concierge/components/conciergeTypes.ts
new file mode 100644
index 0000000..bbb44df
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/concierge/components/conciergeTypes.ts
@@ -0,0 +1,10 @@
+export type ConciergeAdvisor = {
+ avatar: string;
+ name: string;
+ role: string;
+ details: Array<{
+ icon: string;
+ label: string;
+ }>;
+ qrImage: string;
+};
diff --git a/WonderQ-MiniAPP/src/pages/concierge/index.vue b/WonderQ-MiniAPP/src/pages/concierge/index.vue
new file mode 100644
index 0000000..182f555
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/concierge/index.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/demand/index.vue b/WonderQ-MiniAPP/src/pages/demand/index.vue
deleted file mode 100644
index 795b2e7..0000000
--- a/WonderQ-MiniAPP/src/pages/demand/index.vue
+++ /dev/null
@@ -1,180 +0,0 @@
-
-
-
-
-
-
-
-
- {{
- demandHero.kicker }}
- {{ demandHero.title }}
- {{ demandHero.description }}
-
-
- {{ step }}
-
-
-
-
-
-
-
-
- {{ card.title }}
- {{ card.description }}
-
-
-
-
-
-
-
- {{ chip }}
-
-
-
-
-
- {{
- message }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/WonderQ-MiniAPP/src/pages/destination-picker/index.vue b/WonderQ-MiniAPP/src/pages/destination-picker/index.vue
deleted file mode 100644
index 1496b9a..0000000
--- a/WonderQ-MiniAPP/src/pages/destination-picker/index.vue
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/WonderQ-MiniAPP/src/pages/destination/index.vue b/WonderQ-MiniAPP/src/pages/destination/index.vue
deleted file mode 100644
index 32831dc..0000000
--- a/WonderQ-MiniAPP/src/pages/destination/index.vue
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- {{ destinationHero.kicker }}
- {{ destinationHero.title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/WonderQ-MiniAPP/src/pages/detail/index.vue b/WonderQ-MiniAPP/src/pages/detail/index.vue
index 5315013..c785fbb 100644
--- a/WonderQ-MiniAPP/src/pages/detail/index.vue
+++ b/WonderQ-MiniAPP/src/pages/detail/index.vue
@@ -9,7 +9,6 @@
-
@@ -70,12 +69,10 @@
-
-
-
+
+
-
@@ -85,7 +82,6 @@ import { onLoad, onShow } from "@dcloudio/uni-app";
import AppShell from "@/components/AppShell.vue";
import ProductList from "@/components/ProductList.vue";
import SectionHeading from "@/components/SectionHeading.vue";
-import SupportSheet from "@/components/SupportSheet.vue";
import { formatWan, getDetailMeta, getProductDetailSections, productKey, stripTitle } from "@/lib/data";
import { goBack, goBooking, goDetail } from "@/lib/navigation";
import { appState, findProduct, isProductFavorite, loadAppData, rememberProduct, toggleFavoriteProduct } from "@/lib/store";
@@ -93,7 +89,6 @@ import type { Product } from "@/lib/types";
const product = ref(findProduct());
const activeTab = ref("overview");
-const supportOpen = ref(false);
onLoad((query) => {
product.value = findProduct(typeof query?.product === "string" ? decodeURIComponent(query.product) : undefined);
diff --git a/WonderQ-MiniAPP/src/pages/home/components/HomeExperienceCard.vue b/WonderQ-MiniAPP/src/pages/home/components/HomeExperienceCard.vue
new file mode 100644
index 0000000..a24fd40
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/HomeExperienceCard.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+ {{ item.badge }}
+ {{ item.category }}
+
+ {{ item.title }}
+ {{ item.englishTitle }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/home/components/HomeExperienceList.vue b/WonderQ-MiniAPP/src/pages/home/components/HomeExperienceList.vue
new file mode 100644
index 0000000..13038bd
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/HomeExperienceList.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/home/components/HomeHeroCarousel.vue b/WonderQ-MiniAPP/src/pages/home/components/HomeHeroCarousel.vue
new file mode 100644
index 0000000..52d3e74
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/HomeHeroCarousel.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/home/components/HomeTeamBuilding.vue b/WonderQ-MiniAPP/src/pages/home/components/HomeTeamBuilding.vue
new file mode 100644
index 0000000..c5cc3dc
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/HomeTeamBuilding.vue
@@ -0,0 +1,43 @@
+
+
+
+
+ 团队共创
+ 团建旅行
+
+ TEAM BUILDING
+
+
+
+
+
+
+
+ {{ item.tag }}
+
+
+ {{ item.title }}
+ {{ item.description }}
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/home/components/HomeVehicleGrid.vue b/WonderQ-MiniAPP/src/pages/home/components/HomeVehicleGrid.vue
new file mode 100644
index 0000000..6dc1b9a
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/HomeVehicleGrid.vue
@@ -0,0 +1,39 @@
+
+
+
+ 万趣用车
+ 2-8人小团,按人数和行李匹配车型
+
+
+
+
+
+
+
+ {{ vehicle.title }}
+
+
+ {{ vehicle.description }}
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/home/components/HomeWildArchives.vue b/WonderQ-MiniAPP/src/pages/home/components/HomeWildArchives.vue
new file mode 100644
index 0000000..567cb39
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/HomeWildArchives.vue
@@ -0,0 +1,48 @@
+
+
+
+
+ 极境视界
+ 客片案例
+
+ WILD ARCHIVES
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+ 查看更多
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/home/components/homeExperienceData.ts b/WonderQ-MiniAPP/src/pages/home/components/homeExperienceData.ts
new file mode 100644
index 0000000..f592424
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/homeExperienceData.ts
@@ -0,0 +1,30 @@
+export type HomeExperience = {
+ id: string;
+ badge: string;
+ category: string;
+ title: string;
+ englishTitle: string;
+ image: string;
+ searchKeyword: string;
+};
+
+export const homeExperienceMocks: HomeExperience[] = [
+ {
+ id: "waterfall-descent",
+ badge: "玩过推荐",
+ category: "瀑降体验",
+ title: "悬崖瀑降",
+ englishTitle: "WATERFALL DESCENT",
+ image: "/assets/guizhou/tiankeng-pool.jpg",
+ searchKeyword: "悬崖瀑降",
+ },
+ {
+ id: "cave-exploration",
+ badge: "玩过推荐",
+ category: "地心探险",
+ title: "森林&探洞",
+ englishTitle: "CAVE EXPLORATION",
+ image: "/assets/guizhou/zhijin-cave-pool.jpg",
+ searchKeyword: "地心探险",
+ },
+];
diff --git a/WonderQ-MiniAPP/src/pages/home/components/homeTeamBuildingData.ts b/WonderQ-MiniAPP/src/pages/home/components/homeTeamBuildingData.ts
new file mode 100644
index 0000000..cd730e0
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/homeTeamBuildingData.ts
@@ -0,0 +1,35 @@
+export type HomeTeamBuilding = {
+ id: string;
+ tag: string;
+ title: string;
+ description: string;
+ image: string;
+ searchKeyword: string;
+};
+
+export const homeTeamBuildingMocks: HomeTeamBuilding[] = [
+ {
+ id: "wild-challenge",
+ tag: "户外挑战",
+ title: "山野挑战,共同完成一次极境任务",
+ description: "洞穴、瀑降与协作任务组合,适合 10-30 人团队。",
+ image: "/assets/guizhou/tiankeng-sunbeam-group.jpg",
+ searchKeyword: "户外团建",
+ },
+ {
+ id: "canyon-teamwork",
+ tag: "团队协作",
+ title: "峡谷溯溪,把默契带进自然",
+ description: "轻户外水线和分组任务,兼顾参与感与安全保障。",
+ image: "/assets/guizhou/shuichunhe-rafting.jpg",
+ searchKeyword: "峡谷团建",
+ },
+ {
+ id: "village-gathering",
+ tag: "人文聚会",
+ title: "苗寨共聚,换一种方式认识彼此",
+ description: "夜游、长桌宴与在地文化体验,适合企业团建收尾。",
+ image: "/assets/guizhou/xijiang-miao-village.jpg",
+ searchKeyword: "贵州团建",
+ },
+];
diff --git a/WonderQ-MiniAPP/src/pages/home/components/homeWildArchivesData.ts b/WonderQ-MiniAPP/src/pages/home/components/homeWildArchivesData.ts
new file mode 100644
index 0000000..058785a
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/home/components/homeWildArchivesData.ts
@@ -0,0 +1,33 @@
+export type HomeWildArchive = {
+ id: string;
+ title: string;
+ image: string;
+ searchKeyword: string;
+};
+
+export const homeWildArchiveMocks: HomeWildArchive[] = [
+ {
+ id: "hundred-meter-descent",
+ title: "百米自降",
+ image: "/assets/guizhou/tiankeng-pool.jpg",
+ searchKeyword: "悬崖瀑降",
+ },
+ {
+ id: "shilong-cave",
+ title: "石龙洞",
+ image: "/assets/guizhou/zhijin-cave-pool.jpg",
+ searchKeyword: "地心探险",
+ },
+ {
+ id: "cliff-current",
+ title: "绝壁迎流",
+ image: "/assets/guizhou/gorge-paddle.jpg",
+ searchKeyword: "峡谷探险",
+ },
+ {
+ id: "canyon-streaming",
+ title: "峡谷溯溪",
+ image: "/assets/guizhou/shuichunhe-rafting.jpg",
+ searchKeyword: "峡谷溯溪",
+ },
+];
diff --git a/WonderQ-MiniAPP/src/pages/home/index.vue b/WonderQ-MiniAPP/src/pages/home/index.vue
index 431c3b8..a035923 100644
--- a/WonderQ-MiniAPP/src/pages/home/index.vue
+++ b/WonderQ-MiniAPP/src/pages/home/index.vue
@@ -1,93 +1,56 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{
- vehicle.title
- }}
- {{ vehicle.description }}
-
-
-
-
+
+
+
+
+
+
-
-
- {{
- BRAND_FULL_NAME
- }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/WonderQ-MiniAPP/src/pages/login/index.vue b/WonderQ-MiniAPP/src/pages/login/index.vue
index 0a63620..3039c91 100644
--- a/WonderQ-MiniAPP/src/pages/login/index.vue
+++ b/WonderQ-MiniAPP/src/pages/login/index.vue
@@ -1,7 +1,7 @@
-
+
@@ -40,7 +40,6 @@
-
@@ -48,7 +47,6 @@
import { ref } from "vue";
import { onLoad } from "@dcloudio/uni-app";
import AppShell from "@/components/AppShell.vue";
-import SupportSheet from "@/components/SupportSheet.vue";
import TopHeader from "@/components/TopHeader.vue";
import { loginWithPhoneCode } from "@/lib/auth";
import { goRoot } from "@/lib/navigation";
@@ -64,7 +62,6 @@ type PhoneNumberEvent = {
const redirect = ref("/pages/mine/index");
const loading = ref(false);
const message = ref("");
-const supportOpen = ref(false);
function safeRedirect(value: unknown) {
if (typeof value !== "string") return "/pages/mine/index";
diff --git a/WonderQ-MiniAPP/src/pages/mine/index.vue b/WonderQ-MiniAPP/src/pages/mine/index.vue
index c55f013..5969b73 100644
--- a/WonderQ-MiniAPP/src/pages/mine/index.vue
+++ b/WonderQ-MiniAPP/src/pages/mine/index.vue
@@ -1,7 +1,7 @@
-
+
@@ -42,7 +42,6 @@
{{ appState.latestBooking.product.tags.slice(0, 3).join(" / ") }}
-
@@ -73,7 +72,6 @@
-
@@ -84,7 +82,6 @@ import AppShell from "@/components/AppShell.vue";
import BottomNav from "@/components/BottomNav.vue";
import EmptyState from "@/components/EmptyState.vue";
import MineProductRow from "@/components/MineProductRow.vue";
-import SupportSheet from "@/components/SupportSheet.vue";
import TopHeader from "@/components/TopHeader.vue";
import { getAuthSession, redirectToLogin } from "@/lib/auth";
import { productKey, stripTitle } from "@/lib/data";
@@ -95,7 +92,6 @@ import type { Product } from "@/lib/types";
type MineTab = "requests" | "favorites" | "history";
const tab = ref("requests");
-const supportOpen = ref(false);
const customerLine = ref("已登录,可查看当前设备的需求、收藏和浏览记录。");
const tabs = computed(() => [
{ id: "requests" as MineTab, label: "需求", count: appState.latestBooking ? 1 : 0 },
diff --git a/WonderQ-MiniAPP/src/pages/play/components/PlayCategorySidebar.vue b/WonderQ-MiniAPP/src/pages/play/components/PlayCategorySidebar.vue
new file mode 100644
index 0000000..fcf5b2d
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/play/components/PlayCategorySidebar.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/play/components/PlayRouteCard.vue b/WonderQ-MiniAPP/src/pages/play/components/PlayRouteCard.vue
new file mode 100644
index 0000000..d4bf5e6
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/play/components/PlayRouteCard.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+ {{ route.routeCount }} 条路线
+
+
+
+ {{ route.title }}
+ {{ route.subtitle }}
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/play/components/PlayTopBar.vue b/WonderQ-MiniAPP/src/pages/play/components/PlayTopBar.vue
new file mode 100644
index 0000000..cc2a048
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/play/components/PlayTopBar.vue
@@ -0,0 +1,14 @@
+
+
+
+
+ {{ title }}
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/play/components/playData.ts b/WonderQ-MiniAPP/src/pages/play/components/playData.ts
new file mode 100644
index 0000000..9d2fd8f
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/play/components/playData.ts
@@ -0,0 +1,87 @@
+export type PlayRoute = {
+ id: string;
+ title: string;
+ subtitle: string;
+ image: string;
+ routeCount: number;
+ searchKeyword: string;
+};
+
+export type PlayCategory = {
+ id: string;
+ label: string;
+ routes: PlayRoute[];
+};
+
+const route = (
+ id: string,
+ title: string,
+ subtitle: string,
+ image: string,
+ routeCount: number,
+ searchKeyword = title,
+): PlayRoute => ({
+ id,
+ title,
+ subtitle,
+ image: `/public/assets/guizhou/${image}.jpg`,
+ routeCount,
+ searchKeyword,
+});
+
+export const playCategories: PlayCategory[] = [
+ {
+ id: "family-route",
+ label: "亲子路线",
+ routes: [
+ route("family-water", "亲子玩水", "贵州·轻松节奏与自然课堂", "libo-xiaoqikong", 4, "亲子玩水"),
+ route("family-village", "亲子村寨漫游", "贵州·苗寨、古城与在地体验", "xijiang-miao-village", 3, "亲子村寨漫游"),
+ route("family-grassland", "高原亲子假期", "贵州·草甸、花海与轻徒步", "wumeng-grassland", 2, "高原亲子假期"),
+ ],
+ },
+ {
+ id: "photo-route",
+ label: "旅拍路线",
+ routes: [
+ route("miao-photo", "苗寨人文旅拍", "黔东南·村寨与非遗影像", "miao-costume", 3, "苗寨旅拍"),
+ route("peak-photo", "峰林风光旅拍", "黔西南·峰林与峡谷取景", "wanfenglin", 2, "万峰林旅拍"),
+ route("terrace-photo", "梯田日落旅拍", "黔东南·侗寨与山野光影", "jiabang-terrace", 2, "梯田旅拍"),
+ ],
+ },
+ {
+ id: "healing-route",
+ label: "疗愈路线",
+ routes: [
+ route("mountain-healing", "山野慢游", "贵州·森林、溪谷与松弛时光", "mountain-resort", 3, "山野慢游"),
+ route("hot-spring-healing", "温泉与村寨", "黔东南·泡汤、慢行与在地风味", "jianhe-hot-spring", 2, "温泉与村寨"),
+ route("river-healing", "清凉河谷", "荔波·水线轻徒步与自然疗愈", "libo-water-forest", 3, "清凉河谷"),
+ ],
+ },
+ {
+ id: "team-building",
+ label: "团建",
+ routes: [
+ route("team-challenge", "山野挑战", "贵州·峡谷协作与户外任务", "gorge-paddle", 3, "山野挑战"),
+ route("team-stream", "溪谷共创", "贵州·溯溪、协作与团队复盘", "shuichunhe-rafting", 2, "溪谷共创"),
+ route("team-culture", "苗寨共聚", "黔东南·人文体验与团队共创", "miao-dragon-boat", 2, "苗寨共聚"),
+ ],
+ },
+ {
+ id: "guizhou-panorama",
+ label: "贵州全景",
+ routes: [
+ route("classic-panorama", "经典贵州全景", "贵州·瀑布、苗寨、古城与梵净山", "huangguoshu-waterfall", 8, "经典人文打卡线路"),
+ route("mountain-panorama", "山水人文全景", "贵州·小七孔、侗寨与山地风光", "xijiang-miao-village", 6, "贵州全景"),
+ route("wild-panorama", "山野户外全景", "贵州·溶洞、峰林与野咖路线", "wanfenglin", 7, "山野户外全景"),
+ ],
+ },
+ {
+ id: "private-custom",
+ label: "私人定制",
+ routes: [
+ route("private-family", "家庭专属定制", "贵州·按同行人和节奏安排", "zhenyuan-ancient-town", 1, "家庭专属定制"),
+ route("private-business", "企业专属定制", "贵州·团建、会议与奖励旅行", "wanfenglin", 1, "企业专属定制"),
+ route("private-wild", "山野深度定制", "贵州·溶洞、瀑降与小众目的地", "zhijin-cave", 1, "山野深度定制"),
+ ],
+ },
+];
diff --git a/WonderQ-MiniAPP/src/pages/play/index.vue b/WonderQ-MiniAPP/src/pages/play/index.vue
new file mode 100644
index 0000000..04c533e
--- /dev/null
+++ b/WonderQ-MiniAPP/src/pages/play/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WonderQ-MiniAPP/src/pages/search/index.vue b/WonderQ-MiniAPP/src/pages/search/index.vue
deleted file mode 100644
index fba9e19..0000000
--- a/WonderQ-MiniAPP/src/pages/search/index.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ product.title }}
- {{ product.tags.join(" / ") ||
- product.summary }}
-
- {{ product.destinationName || "贵州" }}
- ¥{{ formatWan(product.price) }}万起
-
-
-
-
-
- 暂无匹配线路
- 可以提交需求,让管家按你的想法重新匹配。
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/public-api.md b/docs/public-api.md
index a02898e..8bb38a6 100644
--- a/docs/public-api.md
+++ b/docs/public-api.md
@@ -42,7 +42,7 @@
MiniAPP 兼容说明:
- Public API 使用 `name` 表示目的地名称;MiniAPP 会在 `src/lib/data.ts` 中归一化为页面内部使用的 `label`。
-- 目的地页 `src/pages/destination/index.vue` 直接消费归一化后的 `appState.data.destinations`,不读取 `slug`、`region` 或后台专用计数字段。
+- 玩法页 `src/pages/play/index.vue` 当前使用 `src/pages/play/components/playData.ts` 的本地模拟分类和线路数据,后续接入 Public API 时再按页面契约替换。
- `isActive=false` 的目的地不得出现在 Public `site-config.destinations`;Admin API 仍需返回未启用项供后台维护。
### `DestinationHero`