zlwu 10 miesięcy temu
rodzic
commit
94d01dffef
82 zmienionych plików z 144 dodań i 86 usunięć
  1. 0 0
      frontend/src/assets-bak/Avatar-C.svg
  2. 0 0
      frontend/src/assets-bak/Avatar-hint.png
  3. 0 0
      frontend/src/assets-bak/Conversation-Energy-Stone-hint.png
  4. 0 0
      frontend/src/assets-bak/Conversation-Energy-Stone.png
  5. 0 0
      frontend/src/assets-bak/Group-3465183-1.svg
  6. 0 0
      frontend/src/assets-bak/Group-3465183.svg
  7. 0 0
      frontend/src/assets-bak/IMG_0552.png
  8. 0 0
      frontend/src/assets-bak/Lumi-cap.png
  9. 0 0
      frontend/src/assets-bak/Lumi-image.png
  10. 0 0
      frontend/src/assets-bak/Lumi-no-cap.png
  11. 0 0
      frontend/src/assets-bak/Mission-Energy-Stone-hint.png
  12. 0 0
      frontend/src/assets-bak/Mission-Energy-Stone.png
  13. 0 0
      frontend/src/assets-bak/QQ.png
  14. 0 0
      frontend/src/assets-bak/Rocket.png
  15. 0 0
      frontend/src/assets-bak/Save-btn.png
  16. 0 0
      frontend/src/assets-bak/TapToChat.svg
  17. 0 0
      frontend/src/assets-bak/arrow_right.png
  18. 0 0
      frontend/src/assets-bak/audio-button.png
  19. 0 0
      frontend/src/assets-bak/avatar-anima-zone-copy.png
  20. 0 0
      frontend/src/assets-bak/avatar-gift.png
  21. 0 0
      frontend/src/assets-bak/backbutn.png
  22. 0 0
      frontend/src/assets-bak/bg-happynewyear.png
  23. 0 0
      frontend/src/assets-bak/cancel-icon.svg
  24. 0 0
      frontend/src/assets-bak/chatbot-bg.svg
  25. 0 0
      frontend/src/assets-bak/close-btn.png
  26. 0 0
      frontend/src/assets-bak/confirm-btn.png
  27. 0 0
      frontend/src/assets-bak/continue-btn-a.png
  28. 0 0
      frontend/src/assets-bak/continue-btn.png
  29. 0 0
      frontend/src/assets-bak/continue-chat.png
  30. 0 0
      frontend/src/assets-bak/conversion-energy-stone-count.png
  31. 0 0
      frontend/src/assets-bak/email-login.png
  32. 0 0
      frontend/src/assets-bak/full-progress-bar.png
  33. 0 0
      frontend/src/assets-bak/gift-progress-bar.png
  34. 0 0
      frontend/src/assets-bak/head-cap.png
  35. 0 0
      frontend/src/assets-bak/mic-icon.svg
  36. 0 0
      frontend/src/assets-bak/microphone-icon.svg
  37. 0 0
      frontend/src/assets-bak/mission-energy-stone-count.png
  38. 0 0
      frontend/src/assets-bak/mode_edit_outline.png
  39. 0 0
      frontend/src/assets-bak/phone-login.png
  40. 0 0
      frontend/src/assets-bak/progress-bar-bgl.svg
  41. 0 0
      frontend/src/assets-bak/progress-full.svg
  42. 0 0
      frontend/src/assets-bak/progress-ring.svg
  43. 0 0
      frontend/src/assets-bak/qq-login.png
  44. 0 0
      frontend/src/assets-bak/register-for-gift.png
  45. 0 0
      frontend/src/assets-bak/save.png
  46. 0 0
      frontend/src/assets-bak/send-code-no.png
  47. 0 0
      frontend/src/assets-bak/send-code-wait-no.png
  48. 0 0
      frontend/src/assets-bak/send-code-wait.png
  49. 0 0
      frontend/src/assets-bak/send-code.png
  50. 0 0
      frontend/src/assets-bak/send-icon.svg
  51. 0 0
      frontend/src/assets-bak/share-btn.png
  52. 0 0
      frontend/src/assets-bak/share-progress-bar.png
  53. 0 0
      frontend/src/assets-bak/star-bg.png
  54. 0 0
      frontend/src/assets-bak/tooltips-cancel.svg
  55. 0 0
      frontend/src/assets-bak/tooltips-progress-bar.svg
  56. 0 0
      frontend/src/assets-bak/tooltips-send.svg
  57. 0 0
      frontend/src/assets-bak/wechat-login.png
  58. 0 0
      frontend/src/assets-bak/wechat.png
  59. 4 2
      frontend/src/components/AnimatedCharacter.tsx
  60. 4 2
      frontend/src/components/MissionEnergyStoneModal.tsx
  61. 3 1
      frontend/src/components/ProgressBarCanvas.tsx
  62. 4 2
      frontend/src/components/RecordButton.tsx
  63. 1 1
      frontend/src/index.css
  64. 19 17
      frontend/src/pages/ChatBotPage.tsx
  65. 3 1
      frontend/src/pages/ErrorPage.tsx
  66. 9 7
      frontend/src/pages/FirstLoginPage.tsx
  67. 11 9
      frontend/src/pages/FirstLoginRewardPage.tsx
  68. 3 1
      frontend/src/pages/GreetingPage.tsx
  69. 5 3
      frontend/src/pages/Level34WelcomePage.tsx
  70. 4 2
      frontend/src/pages/Level5WelcomePage.tsx
  71. 8 6
      frontend/src/pages/LoginPage.tsx
  72. 6 4
      frontend/src/pages/LoginVerificationCodePage.tsx
  73. 4 2
      frontend/src/pages/LoginVerificationInputPage.tsx
  74. 3 1
      frontend/src/pages/LumiNamingPage.tsx
  75. 13 11
      frontend/src/pages/ProfilePage.tsx
  76. 5 3
      frontend/src/pages/ShareSuccessPage.tsx
  77. 6 4
      frontend/src/pages/VerificationCodePage.tsx
  78. 6 4
      frontend/src/pages/VerificationInputPage.tsx
  79. 3 1
      frontend/src/pages/VideoIntroPage.tsx
  80. 1 1
      frontend/src/pages/WelcomePage.css
  81. 3 1
      frontend/src/pages/WelcomePage.tsx
  82. 16 0
      frontend/src/utils/oss.ts

+ 0 - 0
frontend/src/assets/Avatar-C.svg → frontend/src/assets-bak/Avatar-C.svg


+ 0 - 0
frontend/src/assets/Avatar-hint.png → frontend/src/assets-bak/Avatar-hint.png


+ 0 - 0
frontend/src/assets/Conversation-Energy-Stone-hint.png → frontend/src/assets-bak/Conversation-Energy-Stone-hint.png


+ 0 - 0
frontend/src/assets/Conversation-Energy-Stone.png → frontend/src/assets-bak/Conversation-Energy-Stone.png


+ 0 - 0
frontend/src/assets/Group-3465183-1.svg → frontend/src/assets-bak/Group-3465183-1.svg


+ 0 - 0
frontend/src/assets/Group-3465183.svg → frontend/src/assets-bak/Group-3465183.svg


+ 0 - 0
frontend/src/assets/IMG_0552.png → frontend/src/assets-bak/IMG_0552.png


+ 0 - 0
frontend/src/assets/Lumi-cap.png → frontend/src/assets-bak/Lumi-cap.png


+ 0 - 0
frontend/src/assets/Lumi-image.png → frontend/src/assets-bak/Lumi-image.png


+ 0 - 0
frontend/src/assets/Lumi-no-cap.png → frontend/src/assets-bak/Lumi-no-cap.png


+ 0 - 0
frontend/src/assets/Mission-Energy-Stone-hint.png → frontend/src/assets-bak/Mission-Energy-Stone-hint.png


+ 0 - 0
frontend/src/assets/Mission-Energy-Stone.png → frontend/src/assets-bak/Mission-Energy-Stone.png


+ 0 - 0
frontend/src/assets/QQ.png → frontend/src/assets-bak/QQ.png


+ 0 - 0
frontend/src/assets/Rocket.png → frontend/src/assets-bak/Rocket.png


+ 0 - 0
frontend/src/assets/Save-btn.png → frontend/src/assets-bak/Save-btn.png


+ 0 - 0
frontend/src/assets/TapToChat.svg → frontend/src/assets-bak/TapToChat.svg


+ 0 - 0
frontend/src/assets/arrow_right.png → frontend/src/assets-bak/arrow_right.png


+ 0 - 0
frontend/src/assets/audio-button.png → frontend/src/assets-bak/audio-button.png


+ 0 - 0
frontend/src/assets/avatar-anima-zone-copy.png → frontend/src/assets-bak/avatar-anima-zone-copy.png


+ 0 - 0
frontend/src/assets/avatar-gift.png → frontend/src/assets-bak/avatar-gift.png


+ 0 - 0
frontend/src/assets/backbutn.png → frontend/src/assets-bak/backbutn.png


+ 0 - 0
frontend/src/assets/bg-happynewyear.png → frontend/src/assets-bak/bg-happynewyear.png


+ 0 - 0
frontend/src/assets/cancel-icon.svg → frontend/src/assets-bak/cancel-icon.svg


+ 0 - 0
frontend/src/assets/chatbot-bg.svg → frontend/src/assets-bak/chatbot-bg.svg


+ 0 - 0
frontend/src/assets/close-btn.png → frontend/src/assets-bak/close-btn.png


+ 0 - 0
frontend/src/assets/confirm-btn.png → frontend/src/assets-bak/confirm-btn.png


+ 0 - 0
frontend/src/assets/continue-btn-a.png → frontend/src/assets-bak/continue-btn-a.png


+ 0 - 0
frontend/src/assets/continue-btn.png → frontend/src/assets-bak/continue-btn.png


+ 0 - 0
frontend/src/assets/continue-chat.png → frontend/src/assets-bak/continue-chat.png


+ 0 - 0
frontend/src/assets/conversion-energy-stone-count.png → frontend/src/assets-bak/conversion-energy-stone-count.png


+ 0 - 0
frontend/src/assets/email-login.png → frontend/src/assets-bak/email-login.png


+ 0 - 0
frontend/src/assets/full-progress-bar.png → frontend/src/assets-bak/full-progress-bar.png


+ 0 - 0
frontend/src/assets/gift-progress-bar.png → frontend/src/assets-bak/gift-progress-bar.png


+ 0 - 0
frontend/src/assets/head-cap.png → frontend/src/assets-bak/head-cap.png


+ 0 - 0
frontend/src/assets/mic-icon.svg → frontend/src/assets-bak/mic-icon.svg


+ 0 - 0
frontend/src/assets/microphone-icon.svg → frontend/src/assets-bak/microphone-icon.svg


+ 0 - 0
frontend/src/assets/mission-energy-stone-count.png → frontend/src/assets-bak/mission-energy-stone-count.png


+ 0 - 0
frontend/src/assets/mode_edit_outline.png → frontend/src/assets-bak/mode_edit_outline.png


+ 0 - 0
frontend/src/assets/phone-login.png → frontend/src/assets-bak/phone-login.png


+ 0 - 0
frontend/src/assets/progress-bar-bgl.svg → frontend/src/assets-bak/progress-bar-bgl.svg


+ 0 - 0
frontend/src/assets/progress-full.svg → frontend/src/assets-bak/progress-full.svg


+ 0 - 0
frontend/src/assets/progress-ring.svg → frontend/src/assets-bak/progress-ring.svg


+ 0 - 0
frontend/src/assets/qq-login.png → frontend/src/assets-bak/qq-login.png


+ 0 - 0
frontend/src/assets/register-for-gift.png → frontend/src/assets-bak/register-for-gift.png


+ 0 - 0
frontend/src/assets/save.png → frontend/src/assets-bak/save.png


+ 0 - 0
frontend/src/assets/send-code-no.png → frontend/src/assets-bak/send-code-no.png


+ 0 - 0
frontend/src/assets/send-code-wait-no.png → frontend/src/assets-bak/send-code-wait-no.png


+ 0 - 0
frontend/src/assets/send-code-wait.png → frontend/src/assets-bak/send-code-wait.png


+ 0 - 0
frontend/src/assets/send-code.png → frontend/src/assets-bak/send-code.png


+ 0 - 0
frontend/src/assets/send-icon.svg → frontend/src/assets-bak/send-icon.svg


+ 0 - 0
frontend/src/assets/share-btn.png → frontend/src/assets-bak/share-btn.png


+ 0 - 0
frontend/src/assets/share-progress-bar.png → frontend/src/assets-bak/share-progress-bar.png


+ 0 - 0
frontend/src/assets/star-bg.png → frontend/src/assets-bak/star-bg.png


+ 0 - 0
frontend/src/assets/tooltips-cancel.svg → frontend/src/assets-bak/tooltips-cancel.svg


+ 0 - 0
frontend/src/assets/tooltips-progress-bar.svg → frontend/src/assets-bak/tooltips-progress-bar.svg


+ 0 - 0
frontend/src/assets/tooltips-send.svg → frontend/src/assets-bak/tooltips-send.svg


+ 0 - 0
frontend/src/assets/wechat-login.png → frontend/src/assets-bak/wechat-login.png


+ 0 - 0
frontend/src/assets/wechat.png → frontend/src/assets-bak/wechat.png


+ 4 - 2
frontend/src/components/AnimatedCharacter.tsx

@@ -1,7 +1,9 @@
 import React, { useEffect, useState } from 'react';
 import type { EmotionType, AnimationState } from '@/types';
-import avatarImage from '@/assets/IMG_0552.png';
-// import ellipseShadow from '@/assets/Ellipse-3677.png';
+import { getOssUrl } from '@/utils/oss';
+
+const avatarImage = getOssUrl('IMG_0552.png');
+// const ellipseShadow = getOssUrl('Ellipse-3677.png');
 
 interface AnimatedCharacterProps {
   emotion: EmotionType;

+ 4 - 2
frontend/src/components/MissionEnergyStoneModal.tsx

@@ -1,8 +1,10 @@
 import React, { useEffect } from 'react';
 import { px2vmin, px2vw } from '@/utils/viewport';
 import './MissionEnergyStoneModal.css';
-import missionEnergyStoneImage from '@/assets/Mission-Energy-Stone.png';
-import conversationEnergyStoneImage from '@/assets/Conversation-Energy-Stone.png';
+import { getOssUrl } from '@/utils/oss';
+
+const missionEnergyStoneImage = getOssUrl('Mission-Energy-Stone.png');
+const conversationEnergyStoneImage = getOssUrl('Conversation-Energy-Stone.png');
 
 interface MissionEnergyStoneModalProps {
   visible: boolean;

+ 3 - 1
frontend/src/components/ProgressBarCanvas.tsx

@@ -1,5 +1,7 @@
 import { useEffect, useRef } from 'react';
-import progressBarBgSvg from '@/assets/progress-bar-bgl.svg';
+import { getOssUrl } from '@/utils/oss';
+
+const progressBarBgSvg = getOssUrl('progress-bar-bgl.svg');
 
 interface ProgressBarCanvasProps {
   width: number;

+ 4 - 2
frontend/src/components/RecordButton.tsx

@@ -3,8 +3,10 @@ import { Button, Space } from 'antd';
 import { SendOutlined, CloseOutlined } from '@ant-design/icons';
 import type { ClientState } from '@/types';
 import { px2vw } from '@/utils/viewport';
-import progressRing from '@/assets/progress-ring.svg';
-import micIcon from '@/assets/mic-icon.svg';
+import { getOssUrl } from '@/utils/oss';
+
+const progressRing = getOssUrl('progress-ring.svg');
+const micIcon = getOssUrl('mic-icon.svg');
 
 interface RecordButtonProps {
   state: ClientState;

+ 1 - 1
frontend/src/index.css

@@ -50,7 +50,7 @@ body {
   padding: 0;
   /* 全局背景:在宽度超过 600px 时,左右区域仍然使用应用背景而不是纯白色 */
   background-color: #E8E8E8;
-  background-image: url("./assets/chatbot-bg.svg");
+  background-image: url("https://lyrria-pro.oss-cn-beijing.aliyuncs.com/chatbot-bg.svg");
   background-size: cover;
   background-position: center;
   background-repeat: no-repeat;

+ 19 - 17
frontend/src/pages/ChatBotPage.tsx

@@ -28,24 +28,26 @@ import { getUserInfo, updateUserUIState, getUserUIState, getAvatarGifs, type Ava
 import { px2vw, px2vh, px2vmin } from '@/utils/viewport';
 import type { Message, EnergyStoneSpawnMessage } from '@/types';
 import '@/styles/chatbot-fix.css';
-import avatarC from '@/assets/Avatar-C.svg';
-import avatarGift from '@/assets/avatar-gift.png';
-import audioButton from '@/assets/audio-button.png';
-import avatarHint from '@/assets/Avatar-hint.png';
+import { getOssUrl } from '@/utils/oss';
 import { AudioWave, type AudioWaveHandle } from '@/components/AudioWave';
-import microphoneIcon from '@/assets/microphone-icon.svg';
-import progressRing from '@/assets/progress-ring.svg';
-import progressFull from '@/assets/progress-full.svg';
-import tapToChat from '@/assets/TapToChat.svg';
-import cancelIcon from '@/assets/cancel-icon.svg';
-import sendIcon from '@/assets/send-icon.svg';
-import tooltipsCancel from '@/assets/tooltips-cancel.svg';
-import tooltipsSend from '@/assets/tooltips-send.svg';
-import tooltipsProgressBar from '@/assets/tooltips-progress-bar.svg';
-import missionEnergyStone from '@/assets/Mission-Energy-Stone.png';
-import conversationEnergyStone from '@/assets/Conversation-Energy-Stone.png';
-import missionEnergyStoneHint from '@/assets/Mission-Energy-Stone-hint.png';
-import conversationEnergyStoneHint from '@/assets/Conversation-Energy-Stone-hint.png';
+
+const avatarC = getOssUrl('Avatar-C.svg');
+const avatarGift = getOssUrl('avatar-gift.png');
+const audioButton = getOssUrl('audio-button.png');
+const avatarHint = getOssUrl('Avatar-hint.png');
+const microphoneIcon = getOssUrl('microphone-icon.svg');
+const progressRing = getOssUrl('progress-ring.svg');
+const progressFull = getOssUrl('progress-full.svg');
+const tapToChat = getOssUrl('TapToChat.svg');
+const cancelIcon = getOssUrl('cancel-icon.svg');
+const sendIcon = getOssUrl('send-icon.svg');
+const tooltipsCancel = getOssUrl('tooltips-cancel.svg');
+const tooltipsSend = getOssUrl('tooltips-send.svg');
+const tooltipsProgressBar = getOssUrl('tooltips-progress-bar.svg');
+const missionEnergyStone = getOssUrl('Mission-Energy-Stone.png');
+const conversationEnergyStone = getOssUrl('Conversation-Energy-Stone.png');
+const missionEnergyStoneHint = getOssUrl('Mission-Energy-Stone-hint.png');
+const conversationEnergyStoneHint = getOssUrl('Conversation-Energy-Stone-hint.png');
 import { useEnergyStones, type EnergyStoneEventPayload } from '@/hooks/useEnergyStones';
 import { MissionEnergyStoneModal } from '@/components/MissionEnergyStoneModal';
 

+ 3 - 1
frontend/src/pages/ErrorPage.tsx

@@ -1,7 +1,9 @@
 import React from 'react';
 import { useNavigate } from 'react-router-dom';
 import { px2vw, px2vh, px2fluidFontSize } from '@/utils/viewport';
-import lumiImage from '@/assets/Lumi-image.png';
+import { getOssUrl } from '@/utils/oss';
+
+const lumiImage = getOssUrl('Lumi-image.png');
 import './WelcomePage.css';
 
 /**

+ 9 - 7
frontend/src/pages/FirstLoginPage.tsx

@@ -3,13 +3,15 @@ import { useLocation, useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import { px2vmin, px2vw, px2vh } from '@/utils/viewport';
-import giftProgressBar from '@/assets/gift-progress-bar.png';
-// import wechatLogin from '@/assets/wechat-login.png';
-import qqLogin from '@/assets/qq-login.png';
-import phoneLogin from '@/assets/phone-login.png';
-import emailLogin from '@/assets/email-login.png';
-import continueBtn from '@/assets/continue-btn.png';
-import continueBtnA from '@/assets/continue-btn-a.png';
+import { getOssUrl } from '@/utils/oss';
+
+const giftProgressBar = getOssUrl('gift-progress-bar.png');
+// const wechatLogin = getOssUrl('wechat-login.png');
+const qqLogin = getOssUrl('qq-login.png');
+const phoneLogin = getOssUrl('phone-login.png');
+const emailLogin = getOssUrl('email-login.png');
+const continueBtn = getOssUrl('continue-btn.png');
+const continueBtnA = getOssUrl('continue-btn-a.png');
 
 interface LocationState {
   loginType?: 'phone' | 'qq' | 'email';

+ 11 - 9
frontend/src/pages/FirstLoginRewardPage.tsx

@@ -3,15 +3,17 @@ import { useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import { px2vmin, px2vw } from '@/utils/viewport';
-import backButton from '@/assets/backbutn.png';
-import shareProgressBar from '@/assets/share-progress-bar.png';
-import avatarAnimaZone from '@/assets/avatar-anima-zone-copy.png';
-import shareBtn from '@/assets/share-btn.png';
-import closeBtn from '@/assets/close-btn.png';
-import wechatIcon from '@/assets/wechat.png';
-import qqIcon from '@/assets/QQ.png';
-import saveIcon from '@/assets/save.png';
-import saveBtnImage from '@/assets/Save-btn.png';
+import { getOssUrl } from '@/utils/oss';
+
+const backButton = getOssUrl('backbutn.png');
+const shareProgressBar = getOssUrl('share-progress-bar.png');
+const avatarAnimaZone = getOssUrl('avatar-anima-zone-copy.png');
+const shareBtn = getOssUrl('share-btn.png');
+const closeBtn = getOssUrl('close-btn.png');
+const wechatIcon = getOssUrl('wechat.png');
+const qqIcon = getOssUrl('QQ.png');
+const saveIcon = getOssUrl('save.png');
+const saveBtnImage = getOssUrl('Save-btn.png');
 import { shareImages as fallbackShareImages } from '@/data/shareImages';
 import { getShareImages, type ShareImageItem } from '@/utils/api';
 

+ 3 - 1
frontend/src/pages/GreetingPage.tsx

@@ -14,7 +14,9 @@ import {
 } from '../utils/storage';
 import { getUserInfo, updateUsername, updateUserUIState, createUser } from '../utils/api';
 import { px2vw, px2vh, px2vmin } from '../utils/viewport';
-import ConfirmBtnImage from '../assets/confirm-btn.png';
+import { getOssUrl } from '../utils/oss';
+
+const ConfirmBtnImage = getOssUrl('confirm-btn.png');
 
 const isBackendGeneratedName = (name: string): boolean => /^User\d+$/.test(name.trim());
 

+ 5 - 3
frontend/src/pages/Level34WelcomePage.tsx

@@ -3,9 +3,11 @@ import { useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes, getUserLevel } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import { px2vw, px2vh, px2vmin } from '@/utils/viewport';
-import giftProgressBar from '@/assets/gift-progress-bar.png';
-import registerForGift from '@/assets/register-for-gift.png';
-import backButton from '@/assets/backbutn.png';
+import { getOssUrl } from '@/utils/oss';
+
+const giftProgressBar = getOssUrl('gift-progress-bar.png');
+const registerForGift = getOssUrl('register-for-gift.png');
+const backButton = getOssUrl('backbutn.png');
 
 export const Level34WelcomePage = () => {
   const navigate = useNavigate();

+ 4 - 2
frontend/src/pages/Level5WelcomePage.tsx

@@ -3,8 +3,10 @@ import { useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import { px2vw, px2vh, px2vmin } from '@/utils/viewport';
-import giftProgressBar from '@/assets/gift-progress-bar.png';
-import registerForGift from '@/assets/register-for-gift.png';
+import { getOssUrl } from '@/utils/oss';
+
+const giftProgressBar = getOssUrl('gift-progress-bar.png');
+const registerForGift = getOssUrl('register-for-gift.png');
 
 export const Level5WelcomePage = () => {
   const navigate = useNavigate();

+ 8 - 6
frontend/src/pages/LoginPage.tsx

@@ -3,12 +3,14 @@ import { useLocation, useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import { px2vmin, px2vw, px2vh } from '@/utils/viewport';
-import qqLogin from '@/assets/qq-login.png';
-import phoneLogin from '@/assets/phone-login.png';
-import emailLogin from '@/assets/email-login.png';
-import continueBtn from '@/assets/continue-btn.png';
-import continueBtnA from '@/assets/continue-btn-a.png';
-import backButton from '@/assets/backbutn.png';
+import { getOssUrl } from '@/utils/oss';
+
+const qqLogin = getOssUrl('qq-login.png');
+const phoneLogin = getOssUrl('phone-login.png');
+const emailLogin = getOssUrl('email-login.png');
+const continueBtn = getOssUrl('continue-btn.png');
+const continueBtnA = getOssUrl('continue-btn-a.png');
+const backButton = getOssUrl('backbutn.png');
 
 interface LocationState {
   loginType?: 'phone' | 'qq' | 'email';

+ 6 - 4
frontend/src/pages/LoginVerificationCodePage.tsx

@@ -4,10 +4,12 @@ import { message } from 'antd';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState, sendCode } from '@/utils/api';
 import { px2vmin, px2vw, px2vh } from '@/utils/viewport';
-import giftProgressBar from '@/assets/gift-progress-bar.png';
-import sendCodeNo from '@/assets/send-code-no.png';
-import sendCodeImage from '@/assets/send-code.png';
-import backButton from '@/assets/backbutn.png';
+import { getOssUrl } from '@/utils/oss';
+
+const giftProgressBar = getOssUrl('gift-progress-bar.png');
+const sendCodeNo = getOssUrl('send-code-no.png');
+const sendCodeImage = getOssUrl('send-code.png');
+const backButton = getOssUrl('backbutn.png');
 
 interface LocationState {
   loginType?: 'phone' | 'email';

+ 4 - 2
frontend/src/pages/LoginVerificationInputPage.tsx

@@ -4,8 +4,10 @@ import { message } from 'antd';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState, verifyCode, loginWithPhone, loginWithEmail } from '@/utils/api';
 import { px2vmin, px2vw } from '@/utils/viewport';
-import sendCodeWaitNo from '@/assets/send-code-wait-no.png';
-import backButton from '@/assets/backbutn.png';
+import { getOssUrl } from '@/utils/oss';
+
+const sendCodeWaitNo = getOssUrl('send-code-wait-no.png');
+const backButton = getOssUrl('backbutn.png');
 
 interface LocationState {
   loginType?: 'phone' | 'email';

+ 3 - 1
frontend/src/pages/LumiNamingPage.tsx

@@ -3,7 +3,9 @@ import { useNavigate } from 'react-router-dom';
 import { getStorage, setStorage, STORAGE_KEYS, markRouteVisited, getUserId, getVisitedRoutes } from '../utils/storage';
 import { updateBotName, updateUserUIState } from '../utils/api';
 import { px2vw, px2vh, px2vmin } from '../utils/viewport';
-import ConfirmBtnImage from '../assets/confirm-btn.png';
+import { getOssUrl } from '../utils/oss';
+
+const ConfirmBtnImage = getOssUrl('confirm-btn.png');
 
 const DEFAULT_LUMI_NAME = 'Lumi';
 

+ 13 - 11
frontend/src/pages/ProfilePage.tsx

@@ -3,17 +3,19 @@ import { useNavigate } from 'react-router-dom';
 import { px2vmin, px2vmax, px2vw } from '@/utils/viewport';
 import { getUserInfo, updateUsername, updateBotName } from '@/utils/api';
 import { getUserId, getStorage, setStorage, STORAGE_KEYS } from '@/utils/storage';
-import closeBtn from '@/assets/close-btn.png';
-import editIcon from '@/assets/mode_edit_outline.png';
-import missionEnergyStoneCount from '@/assets/mission-energy-stone-count.png';
-import conversationEnergyStoneCount from '@/assets/conversion-energy-stone-count.png';
-import lumiNoCap from '@/assets/Lumi-no-cap.png';
-import lumiCap from '@/assets/Lumi-cap.png';
-import arrowRight from '@/assets/arrow_right.png';
-import headCap from '@/assets/head-cap.png';
-import bgHappyNewYear from '@/assets/bg-happynewyear.png';
-import starBg from '@/assets/star-bg.png';
-import rocketIcon from '@/assets/Rocket.png';
+import { getOssUrl } from '@/utils/oss';
+
+const closeBtn = getOssUrl('close-btn.png');
+const editIcon = getOssUrl('mode_edit_outline.png');
+const missionEnergyStoneCount = getOssUrl('mission-energy-stone-count.png');
+const conversationEnergyStoneCount = getOssUrl('conversion-energy-stone-count.png');
+const lumiNoCap = getOssUrl('Lumi-no-cap.png');
+const lumiCap = getOssUrl('Lumi-cap.png');
+const arrowRight = getOssUrl('arrow_right.png');
+const headCap = getOssUrl('head-cap.png');
+const bgHappyNewYear = getOssUrl('bg-happynewyear.png');
+const starBg = getOssUrl('star-bg.png');
+const rocketIcon = getOssUrl('Rocket.png');
 
 
 export const ProfilePage = () => {

+ 5 - 3
frontend/src/pages/ShareSuccessPage.tsx

@@ -3,9 +3,11 @@ import { useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import { px2vmin } from '@/utils/viewport';
-import fullProgressBar from '@/assets/full-progress-bar.png';
-import avatarAnimaZone from '@/assets/avatar-anima-zone-copy.png';
-import continueChatBtn from '@/assets/continue-chat.png';
+import { getOssUrl } from '@/utils/oss';
+
+const fullProgressBar = getOssUrl('full-progress-bar.png');
+const avatarAnimaZone = getOssUrl('avatar-anima-zone-copy.png');
+const continueChatBtn = getOssUrl('continue-chat.png');
 
 const BACKGROUND_IMAGE_URL = 'https://lyrria-pro.oss-cn-beijing.aliyuncs.com/happynewyear.jpg';
 

+ 6 - 4
frontend/src/pages/VerificationCodePage.tsx

@@ -3,10 +3,12 @@ import { useLocation, useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import { px2vmin, px2vw, px2vh } from '@/utils/viewport';
-import giftProgressBar from '@/assets/gift-progress-bar.png';
-import sendCodeNo from '@/assets/send-code-no.png';
-import sendCode from '@/assets/send-code.png';
-import backButton from '@/assets/backbutn.png';
+import { getOssUrl } from '@/utils/oss';
+
+const giftProgressBar = getOssUrl('gift-progress-bar.png');
+const sendCodeNo = getOssUrl('send-code-no.png');
+const sendCode = getOssUrl('send-code.png');
+const backButton = getOssUrl('backbutn.png');
 
 interface LocationState {
   loginType?: 'phone' | 'email';

+ 6 - 4
frontend/src/pages/VerificationInputPage.tsx

@@ -3,10 +3,12 @@ import { useLocation, useNavigate } from 'react-router-dom';
 import { setStorage, STORAGE_KEYS, getUserId, getVisitedRoutes } from '@/utils/storage';
 import { updateUserUIState, verifyCode } from '@/utils/api';
 import { px2vmin, px2vw } from '@/utils/viewport';
-import giftProgressBar from '@/assets/gift-progress-bar.png';
-import sendCodeWaitNo from '@/assets/send-code-wait-no.png';
-import registerForGift from '@/assets/register-for-gift.png';
-import backButton from '@/assets/backbutn.png';
+import { getOssUrl } from '@/utils/oss';
+
+const giftProgressBar = getOssUrl('gift-progress-bar.png');
+const sendCodeWaitNo = getOssUrl('send-code-wait-no.png');
+const registerForGift = getOssUrl('register-for-gift.png');
+const backButton = getOssUrl('backbutn.png');
 
 interface LocationState {
   loginType?: 'phone' | 'email';

+ 3 - 1
frontend/src/pages/VideoIntroPage.tsx

@@ -5,7 +5,9 @@ import { setStorage, STORAGE_KEYS, getVisitedRoutes, markRouteVisited, getUserId
 import { updateUserUIState } from '@/utils/api';
 import 'video.js/dist/video-js.css';
 import './VideoIntroPage.css';
-import chatbotBg from '@/assets/chatbot-bg.svg';
+import { getOssUrl } from '@/utils/oss';
+
+const chatbotBg = getOssUrl('chatbot-bg.svg');
 
 // 扩展 videojs 的类型定义
 type VideoJsPlayer = ReturnType<typeof videojs>;

+ 1 - 1
frontend/src/pages/WelcomePage.css

@@ -40,7 +40,7 @@
   background-size: cover;
   background-position: center;
   background-repeat: no-repeat;
-  background-image: url('../assets/chatbot-bg.svg');
+  background-image: url('https://lyrria-pro.oss-cn-beijing.aliyuncs.com/chatbot-bg.svg');
   z-index: 0;
 }
 

+ 3 - 1
frontend/src/pages/WelcomePage.tsx

@@ -5,7 +5,9 @@ import videojs from 'video.js';
 import { setStorage, STORAGE_KEYS, markRouteVisited, getVisitedRoutes, getUserId, getStorage } from '@/utils/storage';
 import { updateUserUIState } from '@/utils/api';
 import 'video.js/dist/video-js.css';
-import lumiImage from '@/assets/Lumi-image.png';
+import { getOssUrl } from '@/utils/oss';
+
+const lumiImage = getOssUrl('Lumi-image.png');
 import './WelcomePage.css';
 
 // 扩展 videojs 的类型定义

+ 16 - 0
frontend/src/utils/oss.ts

@@ -0,0 +1,16 @@
+/**
+ * OSS 资源工具类
+ * 统一管理 OSS 资源地址
+ */
+
+const OSS_BASE_URL = 'https://lyrria-pro.oss-cn-beijing.aliyuncs.com';
+
+/**
+ * 获取 OSS 资源 URL
+ * @param filename 文件名(包含扩展名)
+ * @returns OSS 资源完整 URL
+ */
+export const getOssUrl = (filename: string): string => {
+  return `${OSS_BASE_URL}/${filename}`;
+};
+