From e75ec0161493a46a920647c86b68c0dcb1c35c39 Mon Sep 17 00:00:00 2001
From: xiaoquan <838115837@qq.com>
Date: Sun, 10 May 2026 10:45:13 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=AD=E4=BB=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.claude/settings.local.json | 4 +-
apps/merchant-admin/src/api/review.ts | 2 +-
apps/miniapp/src/api/user/invite.ts | 22 +-
apps/miniapp/src/components/RoomCard.vue | 361 ++++++-----
.../src/components/base/BaseButton.vue | 315 +++++++++
apps/miniapp/src/components/base/BaseCard.vue | 198 ++++++
.../miniapp/src/components/base/BaseModal.vue | 253 ++++++++
.../src/components/base/EmptyState.vue | 220 +++++++
.../src/components/base/LoadingState.vue | 203 ++++++
.../src/components/base/StatusBadge.vue | 275 ++++++++
.../src/components/business/ActionSheet.vue | 219 +++++++
.../components/business/DateRangeSelector.vue | 189 ++++++
.../src/components/business/FilterBar.vue | 264 ++++++++
.../src/components/business/FormField.vue | 287 +++++++++
.../src/components/business/GuestSelector.vue | 127 ++++
.../src/components/business/ImageUploader.vue | 277 ++++++++
.../src/components/business/MenuList.vue | 105 +++
.../src/components/business/MerchantCard.vue | 289 +++++++++
.../components/business/MerchantHeader.vue | 234 +++++++
.../src/components/business/OrderCard.vue | 281 ++++++++
.../src/components/business/OrderQuickNav.vue | 149 +++++
.../src/components/business/PriceTag.vue | 207 ++++++
.../src/components/business/RatingStars.vue | 182 ++++++
.../src/components/business/ReviewCard.vue | 166 +++++
.../src/components/business/SearchBar.vue | 343 ++++++++++
.../src/components/business/SectionHeader.vue | 133 ++++
.../src/components/business/TagList.vue | 310 +++++++++
.../src/components/business/ToolGrid.vue | 111 ++++
.../src/components/business/UserProfile.vue | 92 +++
apps/miniapp/src/pages.json | 23 +-
apps/miniapp/src/pages/about/index.vue | 164 ++---
apps/miniapp/src/pages/activity/index.vue | 212 ++++++
apps/miniapp/src/pages/agreement/index.vue | 69 +-
apps/miniapp/src/pages/index/index.vue | 545 ++++++++--------
apps/miniapp/src/pages/invite/cashbacks.vue | 93 +--
apps/miniapp/src/pages/invite/index.vue | 165 ++---
apps/miniapp/src/pages/invite/poster.vue | 109 ++--
apps/miniapp/src/pages/invite/records.vue | 74 ++-
apps/miniapp/src/pages/invite/withdraw.vue | 130 ++--
apps/miniapp/src/pages/invite/withdrawals.vue | 92 +--
.../src/pages/location-search/index.vue | 109 ++--
apps/miniapp/src/pages/login/index.vue | 18 +-
.../src/pages/merchant-detail/index.vue | 605 +++++-------------
apps/miniapp/src/pages/mine/index.vue | 299 ++++-----
apps/miniapp/src/pages/order-create/index.vue | 270 ++++----
apps/miniapp/src/pages/order-detail/index.vue | 427 ++++++------
apps/miniapp/src/pages/order/index.vue | 306 ++++-----
apps/miniapp/src/pages/room-detail/index.vue | 362 +++++++----
apps/miniapp/src/pages/search/index.vue | 283 ++++----
apps/miniapp/src/pages/seller/home.vue | 273 ++++----
.../miniapp/src/pages/seller/order-detail.vue | 209 +++---
apps/miniapp/src/pages/seller/orders.vue | 412 +++++++-----
apps/miniapp/src/pages/seller/register.vue | 222 +++----
.../src/pages/seller/room-calendar.vue | 206 +++---
apps/miniapp/src/pages/seller/room-form.vue | 123 ++--
apps/miniapp/src/pages/seller/rooms.vue | 222 ++++---
apps/miniapp/src/pages/seller/shop-create.vue | 197 +++---
apps/miniapp/src/pages/seller/shop-edit.vue | 132 ++--
apps/miniapp/src/static/img/icon/activity.png | Bin 0 -> 6442 bytes
.../src/static/img/icon/order-list.png | Bin 0 -> 5279 bytes
apps/miniapp/src/static/img/icon/order.png | Bin 2871 -> 0 bytes
apps/miniapp/src/static/styles/common.scss | 224 ++++---
.../src/static/styles/design-tokens.scss | 226 +++++++
apps/miniapp/src/static/styles/mixins.scss | 382 +++++++++++
apps/server/src/config/jwt.config.ts | 2 +-
.../entities/mkt-user-invite-stats.entity.ts | 5 +-
.../activity/activity-public.controller.ts | 67 ++
.../src/modules/activity/activity.module.ts | 3 +-
.../review/review-seller.controller.ts | 6 +-
database/migrations/001_init_schema.sql | 2 +-
70 files changed, 9783 insertions(+), 3303 deletions(-)
create mode 100644 apps/miniapp/src/components/base/BaseButton.vue
create mode 100644 apps/miniapp/src/components/base/BaseCard.vue
create mode 100644 apps/miniapp/src/components/base/BaseModal.vue
create mode 100644 apps/miniapp/src/components/base/EmptyState.vue
create mode 100644 apps/miniapp/src/components/base/LoadingState.vue
create mode 100644 apps/miniapp/src/components/base/StatusBadge.vue
create mode 100644 apps/miniapp/src/components/business/ActionSheet.vue
create mode 100644 apps/miniapp/src/components/business/DateRangeSelector.vue
create mode 100644 apps/miniapp/src/components/business/FilterBar.vue
create mode 100644 apps/miniapp/src/components/business/FormField.vue
create mode 100644 apps/miniapp/src/components/business/GuestSelector.vue
create mode 100644 apps/miniapp/src/components/business/ImageUploader.vue
create mode 100644 apps/miniapp/src/components/business/MenuList.vue
create mode 100644 apps/miniapp/src/components/business/MerchantCard.vue
create mode 100644 apps/miniapp/src/components/business/MerchantHeader.vue
create mode 100644 apps/miniapp/src/components/business/OrderCard.vue
create mode 100644 apps/miniapp/src/components/business/OrderQuickNav.vue
create mode 100644 apps/miniapp/src/components/business/PriceTag.vue
create mode 100644 apps/miniapp/src/components/business/RatingStars.vue
create mode 100644 apps/miniapp/src/components/business/ReviewCard.vue
create mode 100644 apps/miniapp/src/components/business/SearchBar.vue
create mode 100644 apps/miniapp/src/components/business/SectionHeader.vue
create mode 100644 apps/miniapp/src/components/business/TagList.vue
create mode 100644 apps/miniapp/src/components/business/ToolGrid.vue
create mode 100644 apps/miniapp/src/components/business/UserProfile.vue
create mode 100644 apps/miniapp/src/pages/activity/index.vue
create mode 100644 apps/miniapp/src/static/img/icon/activity.png
create mode 100644 apps/miniapp/src/static/img/icon/order-list.png
delete mode 100644 apps/miniapp/src/static/img/icon/order.png
create mode 100644 apps/miniapp/src/static/styles/design-tokens.scss
create mode 100644 apps/miniapp/src/static/styles/mixins.scss
create mode 100644 apps/server/src/modules/activity/activity-public.controller.ts
diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index fe9d0de..0373277 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -25,7 +25,9 @@
"Bash(cat)",
"Bash(node create-icons.js)",
"Bash(curl -X POST http://localhost:3000/api/orders/1/pay -H \"Content-Type: application/json\" -H \"Authorization: Bearer test\" -d '{\"paymentMethod\":\"wechat\"}' -v)",
- "Bash(curl -X POST http://localhost:3000/api/orders/1/pay -v)"
+ "Bash(curl -X POST http://localhost:3000/api/orders/1/pay -v)",
+ "Bash(xargs grep -l \"jwt\\\\|JWT\")",
+ "Bash(xargs grep -l \"invite\")"
]
}
}
diff --git a/apps/merchant-admin/src/api/review.ts b/apps/merchant-admin/src/api/review.ts
index 14cb5fd..9102776 100644
--- a/apps/merchant-admin/src/api/review.ts
+++ b/apps/merchant-admin/src/api/review.ts
@@ -1,4 +1,4 @@
-import request from './request';
+import request from '../utils/request';
export interface Review {
id: number;
diff --git a/apps/miniapp/src/api/user/invite.ts b/apps/miniapp/src/api/user/invite.ts
index 75a2a00..2b4cd1f 100644
--- a/apps/miniapp/src/api/user/invite.ts
+++ b/apps/miniapp/src/api/user/invite.ts
@@ -1,25 +1,33 @@
-import { request } from '@/utils/request';
+import { get, post } from '@/utils/request';
+
+// 获取活动列表
+export const getActivityList = () =>
+ get('/activity/list');
+
+// 获取邀请活动配置
+export const getInviteConfig = () =>
+ get('/activity/invite/config');
// 获取我的邀请统计
export const getInviteStats = () =>
- request.get('/user/activity/invite/stats');
+ get('/user/activity/invite/stats');
// 绑定邀请关系
export const bindInvitation = (inviteCode: string) =>
- request.post('/user/activity/invite/bind', { inviteCode });
+ post('/user/activity/invite/bind', { inviteCode });
// 邀请记录列表
export const getInviteRecords = (params?: { page?: number; pageSize?: number }) =>
- request.get('/user/activity/invite/records', { params });
+ get('/user/activity/invite/records', params);
// 返现记录列表
export const getCashbackRecords = (params?: { page?: number; pageSize?: number }) =>
- request.get('/user/activity/invite/cashbacks', { params });
+ get('/user/activity/invite/cashbacks', params);
// 申请提现
export const createInviteWithdrawal = (amount: number) =>
- request.post('/user/activity/invite/withdraw', { amount });
+ post('/user/activity/invite/withdraw', { amount });
// 提现记录列表
export const getInviteWithdrawals = (params?: { page?: number; pageSize?: number }) =>
- request.get('/user/activity/invite/withdrawals', { params });
+ get('/user/activity/invite/withdrawals', params);
diff --git a/apps/miniapp/src/components/RoomCard.vue b/apps/miniapp/src/components/RoomCard.vue
index 865af9a..8ac6233 100644
--- a/apps/miniapp/src/components/RoomCard.vue
+++ b/apps/miniapp/src/components/RoomCard.vue
@@ -1,37 +1,76 @@
-
-
-
-
- 所选日期已满房
-
-
- {{ room.name }}
-
- {{ room.address }}
-
-
- {{ typeLabels[room.type] || room.type }}
- {{ room.bedType }}
-
-
-
- ★
- {{ room.rating }}
- ({{ room.reviewCount }}条评价)
+
+
+
+
+
+
+
+
+ 已满房
+
+
+
+
+ 特价
+
+
+
+
+ 推荐
+
+
+
+
+
+ {{ room.name }}
+
+
+ {{ room.address }}
+
+
+
+
+
+
+
+
+
+
+
-
- ¥
- {{ room.price }}
- /晚
-
-
+
+
+
订
@@ -41,91 +80,170 @@
diff --git a/apps/miniapp/src/components/base/BaseButton.vue b/apps/miniapp/src/components/base/BaseButton.vue
new file mode 100644
index 0000000..e0f7ee3
--- /dev/null
+++ b/apps/miniapp/src/components/base/BaseButton.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/base/BaseCard.vue b/apps/miniapp/src/components/base/BaseCard.vue
new file mode 100644
index 0000000..ca68a97
--- /dev/null
+++ b/apps/miniapp/src/components/base/BaseCard.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/base/BaseModal.vue b/apps/miniapp/src/components/base/BaseModal.vue
new file mode 100644
index 0000000..2b8dd6e
--- /dev/null
+++ b/apps/miniapp/src/components/base/BaseModal.vue
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/base/EmptyState.vue b/apps/miniapp/src/components/base/EmptyState.vue
new file mode 100644
index 0000000..b6adac9
--- /dev/null
+++ b/apps/miniapp/src/components/base/EmptyState.vue
@@ -0,0 +1,220 @@
+
+
+
+
+
+
+
+
+
+ {{ text }}
+ {{ description }}
+
+
+
+
+ {{ buttonText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/base/LoadingState.vue b/apps/miniapp/src/components/base/LoadingState.vue
new file mode 100644
index 0000000..eabead0
--- /dev/null
+++ b/apps/miniapp/src/components/base/LoadingState.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/base/StatusBadge.vue b/apps/miniapp/src/components/base/StatusBadge.vue
new file mode 100644
index 0000000..b9ae60f
--- /dev/null
+++ b/apps/miniapp/src/components/base/StatusBadge.vue
@@ -0,0 +1,275 @@
+
+
+
+
+
+
+ {{ displayText }}
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/ActionSheet.vue b/apps/miniapp/src/components/business/ActionSheet.vue
new file mode 100644
index 0000000..5bf360a
--- /dev/null
+++ b/apps/miniapp/src/components/business/ActionSheet.vue
@@ -0,0 +1,219 @@
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{ description }}
+
+
+
+
+
+
+ {{ action.text }}
+ {{ action.subtext }}
+
+
+
+
+
+ {{ cancelText }}
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/DateRangeSelector.vue b/apps/miniapp/src/components/business/DateRangeSelector.vue
new file mode 100644
index 0000000..11f1b93
--- /dev/null
+++ b/apps/miniapp/src/components/business/DateRangeSelector.vue
@@ -0,0 +1,189 @@
+
+
+
+
+
+ {{ checkInLabel }}
+
+ {{ checkInMonth }}
+ 月
+ {{ checkInDay }}
+ 日
+
+ {{ checkInWeekday }}
+
+
+
+
+
+
+ {{ nightCount }}晚
+
+
+
+
+
+
+ {{ checkOutLabel }}
+
+ {{ checkOutMonth }}
+ 月
+ {{ checkOutDay }}
+ 日
+
+ {{ checkOutWeekday }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/FilterBar.vue b/apps/miniapp/src/components/business/FilterBar.vue
new file mode 100644
index 0000000..50347d2
--- /dev/null
+++ b/apps/miniapp/src/components/business/FilterBar.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+ {{ filter.label }}
+
+
+
+
+
+
+ 筛选
+ {{ filterCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/FormField.vue b/apps/miniapp/src/components/business/FormField.vue
new file mode 100644
index 0000000..39eda33
--- /dev/null
+++ b/apps/miniapp/src/components/business/FormField.vue
@@ -0,0 +1,287 @@
+
+
+
+
+ {{ label }}
+ *
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ displayValue || placeholder }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ errorMessage }}
+
+
+
+
+ {{ tip }}
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/GuestSelector.vue b/apps/miniapp/src/components/business/GuestSelector.vue
new file mode 100644
index 0000000..fc1aeba
--- /dev/null
+++ b/apps/miniapp/src/components/business/GuestSelector.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+ {{ roomCount }}
+ 间
+
+
+
+ {{ adultCount }}
+ 成人
+
+
+
+ {{ childCount }}
+ 儿童
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/ImageUploader.vue b/apps/miniapp/src/components/business/ImageUploader.vue
new file mode 100644
index 0000000..75acf5b
--- /dev/null
+++ b/apps/miniapp/src/components/business/ImageUploader.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ uploadText }}
+ {{ imageList.length }}/{{ maxCount }}
+
+
+
+
+
+ {{ tip }}
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/MenuList.vue b/apps/miniapp/src/components/business/MenuList.vue
new file mode 100644
index 0000000..b01ce96
--- /dev/null
+++ b/apps/miniapp/src/components/business/MenuList.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/MerchantCard.vue b/apps/miniapp/src/components/business/MerchantCard.vue
new file mode 100644
index 0000000..e503329
--- /dev/null
+++ b/apps/miniapp/src/components/business/MerchantCard.vue
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+ ▶
+
+
+
+
+
+
+ {{ merchant.name }}
+
+
+ {{ merchant.type }}
+
+
+
+ {{ merchant.rating }}
+ {{ merchant.rating ? getRatingLabel(merchant.rating) : '' }}
+ {{ merchant.reviewCount }}评价
+
+
+
+
+
+ 距你{{ formatDistance(merchant.distance) }}
+ {{ merchant.nearbyLandmark }}附近
+
+
+
+
+
+
+ {{ facility }}
+
+
+
+
+ {{ merchant.recentPurchase }}
+
+
+
+
+ ¥{{ merchant.originalPrice }}
+ ¥{{ merchant.minPrice }}
+
+ {{ merchant.promotion }}
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/MerchantHeader.vue b/apps/miniapp/src/components/business/MerchantHeader.vue
new file mode 100644
index 0000000..829ae74
--- /dev/null
+++ b/apps/miniapp/src/components/business/MerchantHeader.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/OrderCard.vue b/apps/miniapp/src/components/business/OrderCard.vue
new file mode 100644
index 0000000..91e15af
--- /dev/null
+++ b/apps/miniapp/src/components/business/OrderCard.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ order.roomName }}
+ {{ order.nights }}间, 共{{ order.nights }}晚
+
+
+
+ {{ formatFullDate(order.checkInDate) }} - {{ formatFullDate(order.checkOutDate) }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/OrderQuickNav.vue b/apps/miniapp/src/components/business/OrderQuickNav.vue
new file mode 100644
index 0000000..cf3e434
--- /dev/null
+++ b/apps/miniapp/src/components/business/OrderQuickNav.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+ {{ item.badge > 99 ? '99+' : item.badge }}
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/PriceTag.vue b/apps/miniapp/src/components/business/PriceTag.vue
new file mode 100644
index 0000000..5cf9d4a
--- /dev/null
+++ b/apps/miniapp/src/components/business/PriceTag.vue
@@ -0,0 +1,207 @@
+
+
+
+ {{ symbol }}
+
+
+ {{ displayPrice }}
+
+
+ {{ unit }}
+
+
+ {{ symbol }}{{ originalPrice }}
+
+
+ {{ discount }}
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/RatingStars.vue b/apps/miniapp/src/components/business/RatingStars.vue
new file mode 100644
index 0000000..758e162
--- /dev/null
+++ b/apps/miniapp/src/components/business/RatingStars.vue
@@ -0,0 +1,182 @@
+
+
+
+
+
+ ★
+
+
+
+
+ {{ displayScore }}
+
+
+ {{ label }}
+
+
+ ({{ count }}条评价)
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/ReviewCard.vue b/apps/miniapp/src/components/business/ReviewCard.vue
new file mode 100644
index 0000000..6657699
--- /dev/null
+++ b/apps/miniapp/src/components/business/ReviewCard.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+ {{ review.content }}
+
+
+
+
+
+
+
+
+ {{ review.reply }}
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/SearchBar.vue b/apps/miniapp/src/components/business/SearchBar.vue
new file mode 100644
index 0000000..41d05b2
--- /dev/null
+++ b/apps/miniapp/src/components/business/SearchBar.vue
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+ {{ modelValue || placeholder }}
+
+
+
+
+
+
+
+
+
+
+ {{ buttonText }}
+
+
+
+
+ 取消
+
+
+
+
+
+
+
+
+ {{ keyword }}
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/SectionHeader.vue b/apps/miniapp/src/components/business/SectionHeader.vue
new file mode 100644
index 0000000..fddeed4
--- /dev/null
+++ b/apps/miniapp/src/components/business/SectionHeader.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/TagList.vue b/apps/miniapp/src/components/business/TagList.vue
new file mode 100644
index 0000000..a067eed
--- /dev/null
+++ b/apps/miniapp/src/components/business/TagList.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+ {{ getTagLabel(tag) }}
+
+
+
+
+
+ {{ expanded ? '收起' : `+${tags.length - limit}` }}
+
+
+
+
+
+
+
+ {{ getTagLabel(tag) }}
+
+
+
+
+
+ {{ expanded ? '收起' : `+${tags.length - limit}` }}
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/ToolGrid.vue b/apps/miniapp/src/components/business/ToolGrid.vue
new file mode 100644
index 0000000..5db6bad
--- /dev/null
+++ b/apps/miniapp/src/components/business/ToolGrid.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+ {{ tool.label }}
+
+ {{ tool.badge }}
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/components/business/UserProfile.vue b/apps/miniapp/src/components/business/UserProfile.vue
new file mode 100644
index 0000000..31ef025
--- /dev/null
+++ b/apps/miniapp/src/components/business/UserProfile.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+ {{ name }}
+ {{ phone }}
+
+
+ 登录/注册
+
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/pages.json b/apps/miniapp/src/pages.json
index ca28028..9006148 100644
--- a/apps/miniapp/src/pages.json
+++ b/apps/miniapp/src/pages.json
@@ -67,6 +67,13 @@
"navigationBarTitleText": "个人中心"
}
},
+ {
+ "path": "pages/activity/index",
+ "style": {
+ "navigationBarTitleText": "活动",
+ "enablePullDownRefresh": true
+ }
+ },
{
"path": "pages/seller/home",
"style": {
@@ -182,7 +189,7 @@
},
"tabBar": {
"color": "#8a8a8a",
- "selectedColor": "#6b4d9e",
+ "selectedColor": "#FF6B35",
"backgroundColor": "#ffffff",
"borderStyle": "white",
"list": [
@@ -192,15 +199,21 @@
"iconPath": "static/img/icon/home.png",
"selectedIconPath": "static/img/icon/home.png"
},
+ {
+ "pagePath": "pages/activity/index",
+ "text": "活动",
+ "iconPath": "static/img/icon/activity.png",
+ "selectedIconPath": "static/img/icon/activity.png"
+ },
{
"pagePath": "pages/order/index",
- "text": "服务",
- "iconPath": "static/img/icon/order.png",
- "selectedIconPath": "static/img/icon/order.png"
+ "text": "订单",
+ "iconPath": "static/img/icon/order-list.png",
+ "selectedIconPath": "static/img/icon/order-list.png"
},
{
"pagePath": "pages/mine/index",
- "text": "会员",
+ "text": "我的",
"iconPath": "static/img/icon/my.png",
"selectedIconPath": "static/img/icon/my.png"
}
diff --git a/apps/miniapp/src/pages/about/index.vue b/apps/miniapp/src/pages/about/index.vue
index 708f019..fed946e 100644
--- a/apps/miniapp/src/pages/about/index.vue
+++ b/apps/miniapp/src/pages/about/index.vue
@@ -168,9 +168,11 @@ function showAgreement(name: string) {
diff --git a/apps/miniapp/src/pages/activity/index.vue b/apps/miniapp/src/pages/activity/index.vue
new file mode 100644
index 0000000..3d1a61b
--- /dev/null
+++ b/apps/miniapp/src/pages/activity/index.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
+ {{ activity.icon }}
+
+ {{ activity.title }}
+ {{ activity.description }}
+
+
+
+ 立即参与
+ ›
+
+
+
+
+ 最高奖励 ¥{{ activity.config.maxCashback }}
+
+
+ 首单返{{ (activity.config.firstOrderRate * 100).toFixed(1) }}%
+
+
+
+
+
+
+ 📭
+ 暂无活动
+ 敬请期待更多精彩活动
+
+
+
+
+
+
+
+
diff --git a/apps/miniapp/src/pages/agreement/index.vue b/apps/miniapp/src/pages/agreement/index.vue
index a1bbb87..d33a015 100644
--- a/apps/miniapp/src/pages/agreement/index.vue
+++ b/apps/miniapp/src/pages/agreement/index.vue
@@ -434,9 +434,11 @@ function goBack() {
diff --git a/apps/miniapp/src/pages/index/index.vue b/apps/miniapp/src/pages/index/index.vue
index be0a9e7..395d096 100644
--- a/apps/miniapp/src/pages/index/index.vue
+++ b/apps/miniapp/src/pages/index/index.vue
@@ -1,91 +1,122 @@
-
+
+
+
+
+
-
-
+
+
+
+
+ {{ checkInDesc }}入住
+ {{ checkInLabel }}
+
+ 共{{ nightCount }}晚
+
+ {{ checkOutDesc }}离店
+ {{ checkOutLabel }}
+
+
+
+
+
-
-
- 正在获取当前位置
-
-
- 我的位置
+
+
+
+
+
+
-
-
-
-
-
- {{ checkInDesc }}入住
- {{ checkInLabel }}
-
- 共{{ nightCount }}晚
-
- {{ checkOutDesc }}离店
- {{ checkOutLabel }}
-
-
-
-
-
-
- {{ searchKeyword || '输入关键词搜索酒店' }}
-
-
-
-
-
-
- {{ priceLabel }}
-
-
-
-
-
-
- 查询
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- {{ merchant.shopName }}
-
- {{ merchant.city }}
- {{ merchant.rating }}分
-
- {{ merchant.description || '暂无简介' }}
-
-
+ :merchant="formatMerchant(merchant)"
+ @click="goMerchant(merchant.id)"
+ >
- 加载中...
- 没有更多了
-
+
+
+
+
+
+ 没有更多了
+
+
+
+
@@ -110,6 +141,12 @@ import CityPicker from '@/components/CityPicker.vue';
import DatePicker from '@/components/DatePicker.vue';
import RoomGuestPicker from '@/components/RoomGuestPicker.vue';
import PricePicker from '@/components/PricePicker.vue';
+import BaseCard from '@/components/base/BaseCard.vue';
+import BaseButton from '@/components/base/BaseButton.vue';
+import FormField from '@/components/business/FormField.vue';
+import MerchantCard from '@/components/business/MerchantCard.vue';
+import LoadingState from '@/components/base/LoadingState.vue';
+import EmptyState from '@/components/base/EmptyState.vue';
// 默认日期:今天和明天
const today = new Date();
@@ -307,6 +344,26 @@ function goMerchant(id: number) {
uni.navigateTo({ url: `/pages/merchant-detail/index?${params}` });
}
+// 格式化商家数据以适配 MerchantCard 组件
+function formatMerchant(merchant: any) {
+ return {
+ id: merchant.id,
+ name: merchant.shopName,
+ coverImage: merchant.logo || '/static/default-avatar.png',
+ cityName: merchant.city,
+ rating: merchant.rating,
+ reviewCount: merchant.reviewCount,
+ description: merchant.description || '暂无简介',
+ facilities: merchant.facilities || [],
+ minPrice: merchant.minPrice || 0,
+ roomCount: merchant.roomCount,
+ distance: merchant.distance,
+ isRecommend: merchant.isRecommend,
+ isHot: merchant.isHot,
+ isNew: merchant.isNew
+ };
+}
+
onMounted(() => {
// 检查是否有位置搜索回传的关键字
const kw = (uni as any).__locationSearchKeyword;
@@ -328,244 +385,156 @@ onActivated(() => {
diff --git a/apps/miniapp/src/pages/invite/cashbacks.vue b/apps/miniapp/src/pages/invite/cashbacks.vue
index adbea37..bb7fc17 100644
--- a/apps/miniapp/src/pages/invite/cashbacks.vue
+++ b/apps/miniapp/src/pages/invite/cashbacks.vue
@@ -72,9 +72,11 @@ function goBack() { uni.navigateBack(); }
diff --git a/apps/miniapp/src/pages/invite/index.vue b/apps/miniapp/src/pages/invite/index.vue
index d2e5681..bf8fd52 100644
--- a/apps/miniapp/src/pages/invite/index.vue
+++ b/apps/miniapp/src/pages/invite/index.vue
@@ -127,37 +127,39 @@ function goPoster() {
diff --git a/apps/miniapp/src/pages/invite/poster.vue b/apps/miniapp/src/pages/invite/poster.vue
index 3f35e8f..fae9ee5 100644
--- a/apps/miniapp/src/pages/invite/poster.vue
+++ b/apps/miniapp/src/pages/invite/poster.vue
@@ -78,9 +78,11 @@ function copyLink() {
diff --git a/apps/miniapp/src/pages/invite/records.vue b/apps/miniapp/src/pages/invite/records.vue
index 3162ec0..a48ac78 100644
--- a/apps/miniapp/src/pages/invite/records.vue
+++ b/apps/miniapp/src/pages/invite/records.vue
@@ -72,9 +72,11 @@ function goBack() { uni.navigateBack(); }
diff --git a/apps/miniapp/src/pages/invite/withdraw.vue b/apps/miniapp/src/pages/invite/withdraw.vue
index 594f764..f9169b9 100644
--- a/apps/miniapp/src/pages/invite/withdraw.vue
+++ b/apps/miniapp/src/pages/invite/withdraw.vue
@@ -99,154 +99,160 @@ function goBack() { uni.navigateBack(); }
diff --git a/apps/miniapp/src/pages/invite/withdrawals.vue b/apps/miniapp/src/pages/invite/withdrawals.vue
index 69db363..7a583dd 100644
--- a/apps/miniapp/src/pages/invite/withdrawals.vue
+++ b/apps/miniapp/src/pages/invite/withdrawals.vue
@@ -73,9 +73,11 @@ function goBack() { uni.navigateBack(); }
diff --git a/apps/miniapp/src/pages/location-search/index.vue b/apps/miniapp/src/pages/location-search/index.vue
index 5149807..d9e9a92 100644
--- a/apps/miniapp/src/pages/location-search/index.vue
+++ b/apps/miniapp/src/pages/location-search/index.vue
@@ -112,103 +112,136 @@ function goBack() {
diff --git a/apps/miniapp/src/pages/login/index.vue b/apps/miniapp/src/pages/login/index.vue
index b0d0aee..5d4ff0f 100644
--- a/apps/miniapp/src/pages/login/index.vue
+++ b/apps/miniapp/src/pages/login/index.vue
@@ -1,21 +1,6 @@
-
-
-
- H
-
- 品住会
-
-
-
-
- 下载品住会App,领¥300新客礼包
-
- 立即下载
- ›
-
-
+
@@ -196,6 +181,7 @@ async function handleLogin() {
}
.login-form {
+ padding-top: 150rpx;
.form-title {
font-size: 36rpx;
color: #1a1a1a;
diff --git a/apps/miniapp/src/pages/merchant-detail/index.vue b/apps/miniapp/src/pages/merchant-detail/index.vue
index 7e982f1..7560373 100644
--- a/apps/miniapp/src/pages/merchant-detail/index.vue
+++ b/apps/miniapp/src/pages/merchant-detail/index.vue
@@ -1,87 +1,61 @@
-
-
-
-
-
-
-
- 🏨
-
-
-
+
+
-
-
- {{ merchant.shopName }}
-
- {{ merchant.rating || '5.0' }}
- 分
- {{ merchant.reviewCount || 0 }}条评价
-
-
- 📍
- {{ fullAddress }}
-
- {{ merchant.description }}
-
+
+
+
+
-
-
-
-
- {{ checkInDesc }}
-
- {{ checkInMonth }}
- 月
- {{ checkInDay }}
- 日
- -
-
-
-
- {{ checkOutDesc }}
-
- {{ checkOutMonth }}
- 月
- {{ checkOutDay }}
- 日
-
-
-
- 共{{ nightCount }}晚
-
-
-
-
-
- 间数人数
-
- {{ roomCount }}
- 间
- {{ adultCount }}
- 成人
- {{ childCount }}
- 儿童
-
-
-
+
+
-
+
-
- 加载中...
-
+
+
+
+
+
+
+
+
+
+
+
-
- 暂无满足条件的房源
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
- {{ review.content }}
- {{ formatDate(review.createdAt) }}
-
- 商家回复:
- {{ review.merchantReply }}
-
-
- 暂无评价
-
@@ -133,6 +101,13 @@ import { getReviewList } from '@/api/user/review';
import RoomCard from '@/components/RoomCard.vue';
import DatePicker from '@/components/DatePicker.vue';
import RoomGuestPicker from '@/components/RoomGuestPicker.vue';
+import MerchantHeader from '@/components/business/MerchantHeader.vue';
+import DateRangeSelector from '@/components/business/DateRangeSelector.vue';
+import GuestSelector from '@/components/business/GuestSelector.vue';
+import SectionHeader from '@/components/business/SectionHeader.vue';
+import ReviewCard from '@/components/business/ReviewCard.vue';
+import EmptyState from '@/components/base/EmptyState.vue';
+import LoadingState from '@/components/base/LoadingState.vue';
const merchant = ref({});
const roomList = ref([]);
@@ -150,19 +125,6 @@ const childCount = ref(0);
const datePickerRef = ref();
const roomGuestRef = ref();
-const nightCount = computed(() => {
- const diff = new Date(checkOutDate.value).getTime() - new Date(checkInDate.value).getTime();
- return Math.max(1, Math.ceil(diff / (1000 * 60 * 60 * 24)));
-});
-
-const checkInMonth = computed(() => new Date(checkInDate.value).getMonth() + 1);
-const checkInDay = computed(() => new Date(checkInDate.value).getDate());
-const checkOutMonth = computed(() => new Date(checkOutDate.value).getMonth() + 1);
-const checkOutDay = computed(() => new Date(checkOutDate.value).getDate());
-
-const checkInDesc = computed(() => getDateDesc(checkInDate.value));
-const checkOutDesc = computed(() => getDateDesc(checkOutDate.value));
-
const fullAddress = computed(() => {
const parts: string[] = [];
if (merchant.value.province) parts.push(merchant.value.province);
@@ -172,19 +134,6 @@ const fullAddress = computed(() => {
return parts.join(' ');
});
-function getDateDesc(dateStr: string): string {
- const d = new Date(dateStr);
- const today = new Date();
- today.setHours(0, 0, 0, 0);
- d.setHours(0, 0, 0, 0);
- const diffDays = Math.round((d.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
- if (diffDays === 0) return '今天';
- if (diffDays === 1) return '明天';
- if (diffDays === 2) return '后天';
- const weekDays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
- return weekDays[d.getDay()];
-}
-
function initFromUrl() {
const pages = getCurrentPages();
const page = pages[pages.length - 1] as any;
@@ -231,10 +180,18 @@ async function fetchReviews() {
}
}
-function formatDate(dateStr: string) {
- if (!dateStr) return '';
- const d = new Date(dateStr);
- return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
+// 格式化评价数据以适配 ReviewCard 组件
+function formatReview(review: any) {
+ return {
+ id: review.id,
+ userName: review.isAnonymous ? '匿名用户' : `用户${review.userId}`,
+ userAvatar: review.userAvatar || '/static/default-avatar.png',
+ rating: review.rating,
+ content: review.content || '',
+ images: review.images || [],
+ reply: review.merchantReply || '',
+ createdAt: review.createdAt
+ };
}
async function fetchRooms() {
@@ -277,15 +234,20 @@ function openRoomGuestPicker() {
roomGuestRef.value?.open();
}
-function copyAddress() {
- if (fullAddress.value) {
- uni.setClipboardData({
- data: fullAddress.value,
- success: () => {
- uni.showToast({ title: '地址已复制', icon: 'success' });
- },
- });
- }
+function handleNavigation(address: string) {
+ // 打开地图导航
+ uni.openLocation({
+ latitude: merchant.value.latitude || 0,
+ longitude: merchant.value.longitude || 0,
+ name: merchant.value.shopName,
+ address: address,
+ success: () => {
+ console.log('打开地图成功');
+ },
+ fail: () => {
+ uni.showToast({ title: '打开地图失败', icon: 'none' });
+ }
+ });
}
function goRoomDetail(roomId: number) {
@@ -308,347 +270,74 @@ function goOrderCreate(room: any) {
diff --git a/apps/miniapp/src/pages/mine/index.vue b/apps/miniapp/src/pages/mine/index.vue
index 65c4346..7ea6e76 100644
--- a/apps/miniapp/src/pages/mine/index.vue
+++ b/apps/miniapp/src/pages/mine/index.vue
@@ -1,43 +1,57 @@
-
+
-
-
- {{ userInfo?.nickname || '用户' }}
- {{ userInfo?.phone }}
-
-
+
-
+
+
+
+
+
-
+
+
-
+
+
-
+
+
+
+ 退出登录
+
@@ -46,11 +60,42 @@
import { computed } from 'vue';
import { useUserStore } from '@/store/user';
import { useSellerStore } from '@/store/seller';
+import UserProfile from '@/components/business/UserProfile.vue';
+import OrderQuickNav from '@/components/business/OrderQuickNav.vue';
+import ToolGrid from '@/components/business/ToolGrid.vue';
+import MenuList from '@/components/business/MenuList.vue';
+import BaseButton from '@/components/base/BaseButton.vue';
const userStore = useUserStore();
const sellerStore = useSellerStore();
const userInfo = computed(() => userStore.userInfo);
+// 常用工具列表
+const toolList = [
+ { key: 'invite', label: '邀请返现', icon: 'gift', iconColor: '#1A1A1A', bgColor: '#FFFFFF' },
+ // { key: 'coupon', label: '优惠券', icon: 'coupon', iconColor: '#1A1A1A', bgColor: '#FFFFFF', badge: 3 },
+ // { key: 'favorite', label: '我的收藏', icon: 'heart', iconColor: '#1A1A1A', bgColor: '#FFFFFF' },
+ { key: 'service', label: '联系客服', icon: 'chat', iconColor: '#1A1A1A', bgColor: '#FFFFFF' }
+];
+
+// 商家服务菜单
+const merchantMenuItems = [
+ { key: 'merchant-center', label: '商家中心', icon: 'home', iconColor: '#1A1A1A', bgColor: '#FFFFFF' },
+ { key: 'merchant-entry', label: '商家入驻', icon: 'star', iconColor: '#1A1A1A', bgColor: '#FFFFFF' }
+];
+
+// 设置菜单
+const settingMenuItems = [
+ { key: 'about', label: '关于我们', icon: 'info-circle', iconColor: '#1A1A1A', bgColor: '#FFFFFF' },
+ { key: 'settings', label: '设置', icon: 'setting', iconColor: '#1A1A1A', bgColor: '#FFFFFF' }
+];
+
+function handleProfileTap() {
+ if (!userStore.isLoggedIn()) {
+ goLogin();
+ }
+}
+
function goLogin() {
uni.navigateTo({ url: '/pages/login/index' });
}
@@ -63,22 +108,67 @@ function navigateTo(url: string) {
uni.navigateTo({ url });
}
+function handleOrderTap(status: string) {
+ navigateTo(`/pages/order/index?status=${status}`);
+}
+
+function goAllOrders() {
+ navigateTo('/pages/order/index');
+}
+
+function handleToolTap(key: string) {
+ switch (key) {
+ case 'invite':
+ goInvite();
+ break;
+ case 'coupon':
+ showComingSoon('优惠券');
+ break;
+ case 'favorite':
+ showComingSoon('收藏');
+ break;
+ case 'service':
+ showComingSoon('客服');
+ break;
+ }
+}
+
+function handleMerchantMenuTap(key: string) {
+ console.log(key)
+ switch (key) {
+ case 'merchant-center':
+ goMerchantCenter();
+ break;
+ case 'merchant-entry':
+ goMerchantEntry();
+ break;
+ }
+}
+
+function handleSettingMenuTap(key: string) {
+ switch (key) {
+ case 'about':
+ goAbout();
+ break;
+ case 'settings':
+ showComingSoon('设置');
+ break;
+ }
+}
+
function goMerchantEntry() {
if (!userStore.isLoggedIn()) {
goLogin();
return;
}
- // 商家入驻:跳转到注册模式
uni.navigateTo({ url: '/pages/seller/register?mode=register' });
}
function goMerchantCenter() {
if (!sellerStore.isSellerLoggedIn()) {
- // 未登录商家账号,跳转登录模式
uni.navigateTo({ url: '/pages/seller/register?mode=login' });
return;
}
- // 已登录商家账号,跳转商家中心
uni.navigateTo({ url: '/pages/seller/home' });
}
@@ -115,145 +205,26 @@ function handleLogout() {
diff --git a/apps/miniapp/src/pages/order-create/index.vue b/apps/miniapp/src/pages/order-create/index.vue
index e39ddaf..4082085 100644
--- a/apps/miniapp/src/pages/order-create/index.vue
+++ b/apps/miniapp/src/pages/order-create/index.vue
@@ -5,15 +5,8 @@
{{ room.name }}
-
- {{ typeLabels[room.type] || room.type }}
- {{ room.bedType }}
-
-
- ¥
- {{ room.price }}
- /晚
-
+
+
@@ -62,40 +55,34 @@
房费合计
- ¥{{ totalPrice }}
+
联系人信息
-
- 姓名
+
-
-
- 手机号
+
+
-
-
- 身份证号
+
+
-
-
- 备注
+
+
-
+
应付金额
- ¥{{ totalPrice }}
-
-
- 提交订单
+
+ 提交订单
@@ -114,6 +101,10 @@ import { ref, computed, onMounted, watch } from 'vue';
import { getRoomDetail, getRoomCalendar } from '@/api/user/room';
import { createOrder } from '@/api/user/order';
import RoomCalendarPicker from '@/components/RoomCalendarPicker.vue';
+import BaseButton from '@/components/base/BaseButton.vue';
+import PriceTag from '@/components/business/PriceTag.vue';
+import TagList from '@/components/business/TagList.vue';
+import FormField from '@/components/business/FormField.vue';
const roomId = ref(0);
const merchantId = ref(0);
@@ -139,6 +130,18 @@ const typeLabels: Record = {
hostel: '青旅',
};
+// 房源标签
+const roomTags = computed(() => {
+ const tags = [];
+ if (room.value?.type) {
+ tags.push(typeLabels[room.value.type] || room.value.type);
+ }
+ if (room.value?.bedType) {
+ tags.push(room.value.bedType);
+ }
+ return tags;
+});
+
const nightCount = computed(() => {
if (!checkInDate.value || !checkOutDate.value) return 1;
const diff = new Date(checkOutDate.value).getTime() - new Date(checkInDate.value).getTime();
@@ -309,53 +312,55 @@ function onDateChange(checkIn: string, checkOut: string) {
\ No newline at end of file
diff --git a/apps/miniapp/src/pages/order-detail/index.vue b/apps/miniapp/src/pages/order-detail/index.vue
index a38abb6..3991c8c 100644
--- a/apps/miniapp/src/pages/order-detail/index.vue
+++ b/apps/miniapp/src/pages/order-detail/index.vue
@@ -2,8 +2,8 @@
-
- {{ statusLabels[order.status] }}
+
+ {{ getStatusText(order.status) }}
@@ -67,7 +67,7 @@
实付金额
- ¥{{ order.payAmount }}
+
@@ -98,14 +98,14 @@
-
-
+ 取消订单
+ 去支付
-
+ 取消订单
-
+ 评价
已评价
@@ -115,15 +115,11 @@
加载中...
-
-
-
+
+
支付金额
- ¥{{ order.payAmount }}
+
@@ -137,41 +133,33 @@
✓
-
+ 确认支付
-
+
-
-
-
@@ -179,16 +167,10 @@
import { ref, onMounted } from 'vue';
import { getOrderDetail, cancelOrder, payOrder } from '@/api/user/order';
import { createReview, checkOrderReviewed } from '@/api/user/review';
-
-const statusLabels: Record = {
- pending_pay: '待支付',
- pending_confirm: '待确认',
- pending_checkin: '待入住',
- checked_in: '已入住',
- completed: '已完成',
- cancelled: '已取消',
- refunded: '已退款',
-};
+import BaseButton from '@/components/base/BaseButton.vue';
+import BaseModal from '@/components/base/BaseModal.vue';
+import PriceTag from '@/components/business/PriceTag.vue';
+import RatingStars from '@/components/business/RatingStars.vue';
const paymentMethodLabels: Record = {
wechat: '微信支付',
@@ -196,6 +178,22 @@ const paymentMethodLabels: Record = {
balance: '余额支付',
};
+const statusLabels: Record = {
+ pending_pay: '待支付',
+ pending_confirm: '待确认',
+ confirmed: '已确认',
+ pending_checkin: '待入住',
+ checked_in: '已入住',
+ completed: '已完成',
+ cancelled: '已取消',
+ refunding: '退款中',
+ refunded: '已退款',
+};
+
+function getStatusText(status: string): string {
+ return statusLabels[status] || status;
+}
+
const order = ref({});
const orderId = ref(0);
const showPayModal = ref(false);
@@ -307,17 +305,17 @@ async function submitReview() {
diff --git a/apps/miniapp/src/pages/order/index.vue b/apps/miniapp/src/pages/order/index.vue
index d95751a..55687ad 100644
--- a/apps/miniapp/src/pages/order/index.vue
+++ b/apps/miniapp/src/pages/order/index.vue
@@ -1,79 +1,80 @@
-
-
- {{ tab.label }}
-
-
+
+
+
+
+ {{ tab.label }}
+
+
+
+
+
-
-
-
-
-
- {{ order.room?.name }}
- {{ order.checkInDate }} ~ {{ order.checkOutDate }}
- {{ order.nights }}晚
-
-
-
-
+
- 暂无订单
+
+
+
diff --git a/apps/miniapp/src/pages/room-detail/index.vue b/apps/miniapp/src/pages/room-detail/index.vue
index 97f5ec6..f5b53e9 100644
--- a/apps/miniapp/src/pages/room-detail/index.vue
+++ b/apps/miniapp/src/pages/room-detail/index.vue
@@ -13,21 +13,19 @@
{{ room.name }}
-
-
- ★
-
- {{ room.rating || 4.8 }}
- {{ room.reviewCount || 0 }}条评价
-
+
-
- {{ typeLabels[room.type] || '房源' }}
- {{ room.bedType }}
- {{ room.area }}m²
- 最多{{ room.maxGuests }}人
-
+
@@ -50,12 +48,11 @@
设施服务
-
-
- {{ f.icon }}
- {{ f.name }}
-
-
+
{{ showAllFacilities ? '收起' : `查看全部${room.facilities.length}项设施` }}
@@ -98,14 +95,28 @@
-
- ¥
- {{ room.price }}
- /晚
-
+
-
-
+
+ 联系房东
+
+
+ {{ canBook ? '立即预订' : '当天无房' }}
+
@@ -113,7 +124,11 @@
diff --git a/apps/miniapp/src/pages/search/index.vue b/apps/miniapp/src/pages/search/index.vue
index ac1a17c..a9aa207 100644
--- a/apps/miniapp/src/pages/search/index.vue
+++ b/apps/miniapp/src/pages/search/index.vue
@@ -49,55 +49,25 @@
@refresherrefresh="onRefresh"
>
-
-
-
-
-
- {{ merchant.rating || '5.0' }}
-
-
-
-
-
-
- {{ merchant.description || '舒适住宿,温馨服务' }}
-
-
-
-
+ :merchant="formatMerchant(merchant)"
+ @click="goMerchant(merchant.id)"
+ />
-
- 加载中...
-
+
+
— 已经到底了 —
-
-
- 未找到相关酒店
- 试试调整搜索条件
-
+
+
@@ -105,6 +75,9 @@
diff --git a/apps/miniapp/src/pages/seller/home.vue b/apps/miniapp/src/pages/seller/home.vue
index 687fc6a..5f40980 100644
--- a/apps/miniapp/src/pages/seller/home.vue
+++ b/apps/miniapp/src/pages/seller/home.vue
@@ -3,53 +3,51 @@
请先注册/登录商家账号
-
+ 去注册/登录
-
+
{{ sellerStore.sellerInfo?.contactName }}
{{ sellerStore.sellerInfo?.phone }}
-
+
创建店铺
完成店铺信息填写,提交审核后即可营业
-
-
+ 创建店铺
+ 退出商家账号
-
- 加载中...
-
+
-