From 0d411ea77e1ed8b81c7b7e39e85bcad21b73e418 Mon Sep 17 00:00:00 2001 From: zcode Date: Mon, 15 Jun 2026 17:05:05 +0800 Subject: [PATCH] feat(mobile): complete mobile frontend - all pages + code splitting --- .../components-mobile/bet/BetListMobile.vue | 410 ++++++++++++++++ .../group/ActivityFeedMobile.vue | 400 +++++++++++++++ .../group/MemberListMobile.vue | 315 ++++++++++++ .../memory/MemoryGridMobile.vue | 211 ++++++++ .../components-mobile/poll/PollListMobile.vue | 463 ++++++++++++++++++ .../stats/StatsPanelMobile.vue | 109 +++++ frontend/src/router/index.ts | 28 +- frontend/src/views-mobile/AssetMobile.vue | 230 +++++++++ frontend/src/views-mobile/BlacklistMobile.vue | 278 +++++++++++ frontend/src/views-mobile/ChangelogMobile.vue | 101 ++++ .../src/views-mobile/GamesLibraryMobile.vue | 170 +++++++ frontend/src/views-mobile/GroupViewMobile.vue | 231 +++++++++ frontend/src/views-mobile/GroupsMobile.vue | 381 ++++++++++++++ frontend/src/views-mobile/HomeMobile.vue | 463 ++++++++++++++++++ frontend/src/views-mobile/LedgerMobile.vue | 260 ++++++++++ frontend/src/views-mobile/LoginMobile.vue | 158 ++++++ .../src/views-mobile/NotificationsMobile.vue | 393 +++++++++++++++ frontend/src/views-mobile/ProfileMobile.vue | 137 ++++++ frontend/src/views-mobile/RegisterMobile.vue | 166 +++++++ frontend/src/views-mobile/SettingsMobile.vue | 59 +++ frontend/src/views-mobile/VoiceRoomMobile.vue | 255 ++++++++++ frontend/vite.config.ts | 19 + 22 files changed, 5223 insertions(+), 14 deletions(-) create mode 100644 frontend/src/components-mobile/bet/BetListMobile.vue create mode 100644 frontend/src/components-mobile/group/ActivityFeedMobile.vue create mode 100644 frontend/src/components-mobile/group/MemberListMobile.vue create mode 100644 frontend/src/components-mobile/memory/MemoryGridMobile.vue create mode 100644 frontend/src/components-mobile/poll/PollListMobile.vue create mode 100644 frontend/src/components-mobile/stats/StatsPanelMobile.vue create mode 100644 frontend/src/views-mobile/AssetMobile.vue create mode 100644 frontend/src/views-mobile/BlacklistMobile.vue create mode 100644 frontend/src/views-mobile/ChangelogMobile.vue create mode 100644 frontend/src/views-mobile/GamesLibraryMobile.vue create mode 100644 frontend/src/views-mobile/GroupViewMobile.vue create mode 100644 frontend/src/views-mobile/GroupsMobile.vue create mode 100644 frontend/src/views-mobile/HomeMobile.vue create mode 100644 frontend/src/views-mobile/LedgerMobile.vue create mode 100644 frontend/src/views-mobile/LoginMobile.vue create mode 100644 frontend/src/views-mobile/NotificationsMobile.vue create mode 100644 frontend/src/views-mobile/ProfileMobile.vue create mode 100644 frontend/src/views-mobile/RegisterMobile.vue create mode 100644 frontend/src/views-mobile/SettingsMobile.vue create mode 100644 frontend/src/views-mobile/VoiceRoomMobile.vue diff --git a/frontend/src/components-mobile/bet/BetListMobile.vue b/frontend/src/components-mobile/bet/BetListMobile.vue new file mode 100644 index 0000000..347ea80 --- /dev/null +++ b/frontend/src/components-mobile/bet/BetListMobile.vue @@ -0,0 +1,410 @@ + + + + + + + diff --git a/frontend/src/components-mobile/group/ActivityFeedMobile.vue b/frontend/src/components-mobile/group/ActivityFeedMobile.vue new file mode 100644 index 0000000..8ad9bfc --- /dev/null +++ b/frontend/src/components-mobile/group/ActivityFeedMobile.vue @@ -0,0 +1,400 @@ + + + + + + + diff --git a/frontend/src/components-mobile/group/MemberListMobile.vue b/frontend/src/components-mobile/group/MemberListMobile.vue new file mode 100644 index 0000000..79b48b0 --- /dev/null +++ b/frontend/src/components-mobile/group/MemberListMobile.vue @@ -0,0 +1,315 @@ + + + + + + + diff --git a/frontend/src/components-mobile/memory/MemoryGridMobile.vue b/frontend/src/components-mobile/memory/MemoryGridMobile.vue new file mode 100644 index 0000000..5f2bff8 --- /dev/null +++ b/frontend/src/components-mobile/memory/MemoryGridMobile.vue @@ -0,0 +1,211 @@ + + + + + + + diff --git a/frontend/src/components-mobile/poll/PollListMobile.vue b/frontend/src/components-mobile/poll/PollListMobile.vue new file mode 100644 index 0000000..377bab9 --- /dev/null +++ b/frontend/src/components-mobile/poll/PollListMobile.vue @@ -0,0 +1,463 @@ + + + + + + + diff --git a/frontend/src/components-mobile/stats/StatsPanelMobile.vue b/frontend/src/components-mobile/stats/StatsPanelMobile.vue new file mode 100644 index 0000000..28a1e12 --- /dev/null +++ b/frontend/src/components-mobile/stats/StatsPanelMobile.vue @@ -0,0 +1,109 @@ + + + + + + + diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 4bd0a4e..0cb2285 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -22,7 +22,7 @@ const routes: RouteRecordRaw[] = [ name: 'Login', component: view( () => import('@/views/Login.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 2 替换为 LoginMobile + () => import('@/views-mobile/LoginMobile.vue') ), meta: { requiresGuest: true } }, @@ -31,7 +31,7 @@ const routes: RouteRecordRaw[] = [ name: 'Register', component: view( () => import('@/views/Register.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 2 替换为 RegisterMobile + () => import('@/views-mobile/RegisterMobile.vue') ), meta: { requiresGuest: true } }, @@ -45,7 +45,7 @@ const routes: RouteRecordRaw[] = [ name: 'Home', component: view( () => import('@/views/Home.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 3 替换为 HomeMobile + () => import('@/views-mobile/HomeMobile.vue') ) }, { @@ -53,7 +53,7 @@ const routes: RouteRecordRaw[] = [ name: 'MobileGroups', component: view( () => import('@/views/Home.vue'), // 桌面端无此路由,回退首页 - () => import('@/views-mobile/Placeholder.vue') // 阶段 3 替换为 GroupsMobile + () => import('@/views-mobile/GroupsMobile.vue') ) }, { @@ -61,7 +61,7 @@ const routes: RouteRecordRaw[] = [ name: 'MobileNotifications', component: view( () => import('@/views/Home.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 3 替换为 NotificationsMobile + () => import('@/views-mobile/NotificationsMobile.vue') ) }, { @@ -69,7 +69,7 @@ const routes: RouteRecordRaw[] = [ name: 'GroupView', component: view( () => import('@/views/GroupView.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 4 替换为 GroupViewMobile + () => import('@/views-mobile/GroupViewMobile.vue') ), props: true }, @@ -78,7 +78,7 @@ const routes: RouteRecordRaw[] = [ name: 'LedgerView', component: view( () => import('@/views/LedgerView.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 8 替换为 LedgerMobile + () => import('@/views-mobile/LedgerMobile.vue') ), props: true }, @@ -87,7 +87,7 @@ const routes: RouteRecordRaw[] = [ name: 'AssetView', component: view( () => import('@/views/AssetView.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 8 替换为 AssetMobile + () => import('@/views-mobile/AssetMobile.vue') ), props: true }, @@ -96,7 +96,7 @@ const routes: RouteRecordRaw[] = [ name: 'BlacklistView', component: view( () => import('@/views/BlacklistView.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 8 替换为 BlacklistMobile + () => import('@/views-mobile/BlacklistMobile.vue') ), props: true }, @@ -105,7 +105,7 @@ const routes: RouteRecordRaw[] = [ name: 'VoiceRoom', component: view( () => import('@/views/VoiceRoom.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 5 替换为 VoiceRoomMobile + () => import('@/views-mobile/VoiceRoomMobile.vue') ), props: true }, @@ -114,7 +114,7 @@ const routes: RouteRecordRaw[] = [ name: 'GamesLibrary', component: view( () => import('@/views/GamesLibrary.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 7 替换为 GamesLibraryMobile + () => import('@/views-mobile/GamesLibraryMobile.vue') ) }, { @@ -122,7 +122,7 @@ const routes: RouteRecordRaw[] = [ name: 'Profile', component: view( () => import('@/views/Profile.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 9 替换为 ProfileMobile + () => import('@/views-mobile/ProfileMobile.vue') ) }, { @@ -130,7 +130,7 @@ const routes: RouteRecordRaw[] = [ name: 'Settings', component: view( () => import('@/views/Settings.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 9 替换为 SettingsMobile + () => import('@/views-mobile/SettingsMobile.vue') ) }, { @@ -138,7 +138,7 @@ const routes: RouteRecordRaw[] = [ name: 'Changelog', component: view( () => import('@/views/Changelog.vue'), - () => import('@/views-mobile/Placeholder.vue') // 阶段 9 替换为 ChangelogMobile + () => import('@/views-mobile/ChangelogMobile.vue') ) } ] diff --git a/frontend/src/views-mobile/AssetMobile.vue b/frontend/src/views-mobile/AssetMobile.vue new file mode 100644 index 0000000..fe52a33 --- /dev/null +++ b/frontend/src/views-mobile/AssetMobile.vue @@ -0,0 +1,230 @@ + + + + + + + diff --git a/frontend/src/views-mobile/BlacklistMobile.vue b/frontend/src/views-mobile/BlacklistMobile.vue new file mode 100644 index 0000000..5449f0b --- /dev/null +++ b/frontend/src/views-mobile/BlacklistMobile.vue @@ -0,0 +1,278 @@ + + + + + + + diff --git a/frontend/src/views-mobile/ChangelogMobile.vue b/frontend/src/views-mobile/ChangelogMobile.vue new file mode 100644 index 0000000..f8506bf --- /dev/null +++ b/frontend/src/views-mobile/ChangelogMobile.vue @@ -0,0 +1,101 @@ + + + + + + + diff --git a/frontend/src/views-mobile/GamesLibraryMobile.vue b/frontend/src/views-mobile/GamesLibraryMobile.vue new file mode 100644 index 0000000..8a2142f --- /dev/null +++ b/frontend/src/views-mobile/GamesLibraryMobile.vue @@ -0,0 +1,170 @@ + + + + + + + diff --git a/frontend/src/views-mobile/GroupViewMobile.vue b/frontend/src/views-mobile/GroupViewMobile.vue new file mode 100644 index 0000000..f42f948 --- /dev/null +++ b/frontend/src/views-mobile/GroupViewMobile.vue @@ -0,0 +1,231 @@ + + + + + + + diff --git a/frontend/src/views-mobile/GroupsMobile.vue b/frontend/src/views-mobile/GroupsMobile.vue new file mode 100644 index 0000000..e02b82d --- /dev/null +++ b/frontend/src/views-mobile/GroupsMobile.vue @@ -0,0 +1,381 @@ + + + + + + + diff --git a/frontend/src/views-mobile/HomeMobile.vue b/frontend/src/views-mobile/HomeMobile.vue new file mode 100644 index 0000000..d2e71ce --- /dev/null +++ b/frontend/src/views-mobile/HomeMobile.vue @@ -0,0 +1,463 @@ + + + + + + + diff --git a/frontend/src/views-mobile/LedgerMobile.vue b/frontend/src/views-mobile/LedgerMobile.vue new file mode 100644 index 0000000..c11ab2a --- /dev/null +++ b/frontend/src/views-mobile/LedgerMobile.vue @@ -0,0 +1,260 @@ + + + + + + + diff --git a/frontend/src/views-mobile/LoginMobile.vue b/frontend/src/views-mobile/LoginMobile.vue new file mode 100644 index 0000000..311a7e0 --- /dev/null +++ b/frontend/src/views-mobile/LoginMobile.vue @@ -0,0 +1,158 @@ + + + + + + + diff --git a/frontend/src/views-mobile/NotificationsMobile.vue b/frontend/src/views-mobile/NotificationsMobile.vue new file mode 100644 index 0000000..5919b42 --- /dev/null +++ b/frontend/src/views-mobile/NotificationsMobile.vue @@ -0,0 +1,393 @@ + + + + + + + diff --git a/frontend/src/views-mobile/ProfileMobile.vue b/frontend/src/views-mobile/ProfileMobile.vue new file mode 100644 index 0000000..124b091 --- /dev/null +++ b/frontend/src/views-mobile/ProfileMobile.vue @@ -0,0 +1,137 @@ + + + + + + + diff --git a/frontend/src/views-mobile/RegisterMobile.vue b/frontend/src/views-mobile/RegisterMobile.vue new file mode 100644 index 0000000..6400d85 --- /dev/null +++ b/frontend/src/views-mobile/RegisterMobile.vue @@ -0,0 +1,166 @@ + + + + + + + diff --git a/frontend/src/views-mobile/SettingsMobile.vue b/frontend/src/views-mobile/SettingsMobile.vue new file mode 100644 index 0000000..fa2a7e8 --- /dev/null +++ b/frontend/src/views-mobile/SettingsMobile.vue @@ -0,0 +1,59 @@ + + + + + + + diff --git a/frontend/src/views-mobile/VoiceRoomMobile.vue b/frontend/src/views-mobile/VoiceRoomMobile.vue new file mode 100644 index 0000000..8b95979 --- /dev/null +++ b/frontend/src/views-mobile/VoiceRoomMobile.vue @@ -0,0 +1,255 @@ + + + + + + + diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 4a66df3..475eb4a 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -9,6 +9,25 @@ export default defineConfig({ '@': path.resolve(__dirname, 'src') } }, + build: { + rollupOptions: { + output: { + // 代码分割:vendor 按依赖分组,避免单个超大 chunk + manualChunks: { + // Vue 核心运行时(vue + vue-router + pinia) + 'vue-vendor': ['vue', 'vue-router', 'pinia'], + // 桌面端 UI 库 + 'element-plus': ['element-plus', '@element-plus/icons-vue'], + // 手机端 UI 库 + 'vant': ['vant'], + // 后端 SDK + 'pocketbase': ['pocketbase'], + // 语音房依赖(仅 VoiceRoom 用到,体积大,单独拆分) + 'livekit': ['livekit-client'], + } + } + } + }, server: { port: Number(process.env.VITE_PORT) || 5173, proxy: {