From 2af0025c3e4430793322b3fc5b6b3d41ef77e5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=94=A6=E9=BA=9F=20=E7=8E=8B?= Date: Thu, 18 Jun 2026 11:33:23 +0800 Subject: [PATCH] feat(mobile): stage 11 - events + join landing pages (final stage) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - new EventListMobile.vue: upcoming/past sections + expandable detail with RSVP (going/interested/maybe) + comments + realtime subscription - new CreateEventSheetMobile.vue: title/desc/location/start/end/max-participants - new JoinGroupPageMobile.vue: group invite landing (login/join/approval flow) - new JoinTeamPageMobile.vue: team invite landing (login/join/source-group check) - GroupViewMobile: add '活动' tab, wire EventListMobile; all 8 tabs now live - router: wire JoinGroup/JoinTeam mobile views; remove unused mobilePlaceholder - reuses uat event store (loadEvents/rsvp/cancelRSVP/addComment/removeEvent) + sessions API (getTeamSession/joinTeamSession) All 11 stages complete. Full mobile frontend on uat covering all PC features including uat-exclusive bulletin board, events, group-scoped games, and invite landing pages. build verified: vue-tsc + vite build pass --- .../event/CreateEventSheetMobile.vue | 168 +++++++++ .../event/EventListMobile.vue | 328 ++++++++++++++++++ frontend/src/router/index.ts | 16 +- frontend/src/views-mobile/GroupViewMobile.vue | 11 +- .../src/views-mobile/JoinGroupPageMobile.vue | 222 ++++++++++++ .../src/views-mobile/JoinTeamPageMobile.vue | 229 ++++++++++++ 6 files changed, 953 insertions(+), 21 deletions(-) create mode 100644 frontend/src/components-mobile/event/CreateEventSheetMobile.vue create mode 100644 frontend/src/components-mobile/event/EventListMobile.vue create mode 100644 frontend/src/views-mobile/JoinGroupPageMobile.vue create mode 100644 frontend/src/views-mobile/JoinTeamPageMobile.vue diff --git a/frontend/src/components-mobile/event/CreateEventSheetMobile.vue b/frontend/src/components-mobile/event/CreateEventSheetMobile.vue new file mode 100644 index 0000000..e933ecf --- /dev/null +++ b/frontend/src/components-mobile/event/CreateEventSheetMobile.vue @@ -0,0 +1,168 @@ + + + + + + + diff --git a/frontend/src/components-mobile/event/EventListMobile.vue b/frontend/src/components-mobile/event/EventListMobile.vue new file mode 100644 index 0000000..317c1c8 --- /dev/null +++ b/frontend/src/components-mobile/event/EventListMobile.vue @@ -0,0 +1,328 @@ + + + + + + + diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 1ce2e8d..5f68f1c 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -15,17 +15,6 @@ function view(desktop: () => Promise, mobile: () => Promise) { return isMobile() ? mobile : desktop } -// 阶段 1 占位:尚未实现的 mobile 视图统一指向 Placeholder,后续阶段逐个替换为真实组件 -// 阶段 2: LoginMobile / RegisterMobile -// 阶段 3: HomeMobile / GroupsMobile / NotificationsMobile -// 阶段 4: GroupViewMobile -// 阶段 5: VoiceRoomMobile -// 阶段 7: GamesLibraryMobile -// 阶段 8: LedgerMobile / AssetMobile / BlacklistMobile -// 阶段 9: ProfileMobile / SettingsMobile / ChangelogMobile -// 阶段 11: JoinGroupPageMobile / JoinTeamPageMobile -const mobilePlaceholder = () => import('@/views-mobile/Placeholder.vue') - // 路由配置 const routes: RouteRecordRaw[] = [ { @@ -161,10 +150,9 @@ const routes: RouteRecordRaw[] = [ { path: '/join/group/:groupId', name: 'JoinGroup', - // 邀请落地页:手机端组件阶段 11 填充,现先用 Placeholder 让分流跑通 component: view( () => import('@/views/JoinGroupPage.vue'), - mobilePlaceholder + () => import('@/views-mobile/JoinGroupPageMobile.vue') ), props: true }, @@ -173,7 +161,7 @@ const routes: RouteRecordRaw[] = [ name: 'JoinTeam', component: view( () => import('@/views/JoinTeamPage.vue'), - mobilePlaceholder + () => import('@/views-mobile/JoinTeamPageMobile.vue') ), props: true }, diff --git a/frontend/src/views-mobile/GroupViewMobile.vue b/frontend/src/views-mobile/GroupViewMobile.vue index 0605cd5..4eab946 100644 --- a/frontend/src/views-mobile/GroupViewMobile.vue +++ b/frontend/src/views-mobile/GroupViewMobile.vue @@ -13,6 +13,7 @@ import BetListMobile from '@/components-mobile/bet/BetListMobile.vue' import MemoryGridMobile from '@/components-mobile/memory/MemoryGridMobile.vue' import StatsPanelMobile from '@/components-mobile/stats/StatsPanelMobile.vue' import BulletinListMobile from '@/components-mobile/bulletin/BulletinListMobile.vue' +import EventListMobile from '@/components-mobile/event/EventListMobile.vue' import Placeholder from '@/views-mobile/Placeholder.vue' import { Wallet, Box, Warning } from '@element-plus/icons-vue' @@ -57,11 +58,11 @@ onUnmounted(async () => { } }) -// 标签配置 -// polls/bets/memories/stats 子组件已迁移;bulletin 阶段 10 新增;events 阶段 11 新增 +// 标签配置(全部 tab 已接入) const tabs = [ { name: 'activity', label: '动态' }, { name: 'bulletin', label: '公告' }, + { name: 'events', label: '活动' }, { name: 'polls', label: '投票' }, { name: 'bets', label: '竞猜' }, { name: 'members', label: '成员' }, @@ -125,18 +126,14 @@ function goBlacklist() { >
- - - - - +
diff --git a/frontend/src/views-mobile/JoinGroupPageMobile.vue b/frontend/src/views-mobile/JoinGroupPageMobile.vue new file mode 100644 index 0000000..3507a2d --- /dev/null +++ b/frontend/src/views-mobile/JoinGroupPageMobile.vue @@ -0,0 +1,222 @@ + + + + + + + diff --git a/frontend/src/views-mobile/JoinTeamPageMobile.vue b/frontend/src/views-mobile/JoinTeamPageMobile.vue new file mode 100644 index 0000000..977c4cd --- /dev/null +++ b/frontend/src/views-mobile/JoinTeamPageMobile.vue @@ -0,0 +1,229 @@ + + + + + + +