diff --git a/.claude/settings.local.json b/.claude/settings.local.json index d5d6594c..1f58f3d7 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -70,7 +70,9 @@ "Bash(open index.html)", "Bash(git push:*)", "Bash(sed:*)", - "Bash(/Users/xiaoqi/Documents/Dev/Project/2025-09-08_n8nDEMO演示/n8n-n8n-1.109.2/start.bat)" + "Bash(/Users/xiaoqi/Documents/Dev/Project/2025-09-08_n8nDEMO演示/n8n-n8n-1.109.2/start.bat)", + "Bash(curl:*)", + "Bash(node server.js)" ], "defaultMode": "acceptEdits", "additionalDirectories": [ diff --git a/n8n-n8n-1.109.2/n8n-20250908-141135.log b/n8n-n8n-1.109.2/n8n-20250908-141135.log index af526187..2464f1b1 100644 --- a/n8n-n8n-1.109.2/n8n-20250908-141135.log +++ b/n8n-n8n-1.109.2/n8n-20250908-141135.log @@ -22,3 +22,8 @@ http://localhost:5678 (node:12101) [DEP0060] DeprecationWarning: The `util._extend` API is deprecated. Please use Object.assign() instead. (Use `node --trace-deprecation ...` to show where the warning was created) Node does not have any credentials set +Received SIGINT. Shutting down... +[Task Runner]: Received SIGINT signal, shutting down... +[Task Runner]: Task runner stopped + +Stopping n8n... diff --git a/n8n-n8n-1.109.2/n8n-20250908-163158.log b/n8n-n8n-1.109.2/n8n-20250908-163158.log new file mode 100644 index 00000000..8cf76df7 --- /dev/null +++ b/n8n-n8n-1.109.2/n8n-20250908-163158.log @@ -0,0 +1,26 @@ + +> n8n-monorepo@1.109.2 start /Users/xiaoqi/Documents/Dev/Project/2025-09-08_n8nDEMO演示/n8n-n8n-1.109.2 +> run-script-os + + +> n8n-monorepo@1.109.2 start:default +> cd packages/cli/bin && ./n8n + +Permissions 0644 for n8n settings file /Users/xiaoqi/.n8n/config are too wide. This is ignored for now, but in the future n8n will attempt to change the permissions automatically. To automatically enforce correct permissions now set N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true (recommended), or turn this check off set N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false. +Initializing n8n process +n8n ready on ::, port 5678 +n8n Task Broker ready on 127.0.0.1, port 5679 +Initializing AuthRolesService... +AuthRolesService initialized successfully. +[license SDK] Skipping renewal on init: license cert is not initialized +Registered runner "JS Task Runner" (4cCbV_Z_J_3qoaQmjw7fB) +Version: 1.109.2 +Locale: zh-CN + +Editor is now accessible via: +http://localhost:5678 +Received SIGINT. Shutting down... +[Task Runner]: Received SIGINT signal, shutting down... +[Task Runner]: Task runner stopped + +Stopping n8n... diff --git a/n8n-n8n-1.109.2/start.bat b/n8n-n8n-1.109.2/start.bat index 43468aba..90ba46dd 100644 --- a/n8n-n8n-1.109.2/start.bat +++ b/n8n-n8n-1.109.2/start.bat @@ -1,8 +1,9 @@ @echo off chcp 65001 >nul 2>&1 -REM n8n 中文版快速启动脚本 (Windows版) +REM n8n 中文版快速启动脚本 (Windows版 - 增强兼容性) REM 作者: 小齐 REM 最后更新: 2025-09-08 +REM 兼容性: Windows 7/8/10/11, PowerShell/CMD setlocal enabledelayedexpansion @@ -19,6 +20,8 @@ REM 解析命令行参数 set "DEV_MODE=" set "FORCE_BUILD=" set "CHECK_ONLY=" +set "SKIP_DEPS=" +set "USE_NPM=" :parse_args if "%~1"=="" goto main_execution @@ -54,18 +57,33 @@ if /I "%~1"=="--check" ( shift goto parse_args ) +if /I "%~1"=="--skip-deps" ( + set "SKIP_DEPS=true" + shift + goto parse_args +) +if /I "%~1"=="--npm" ( + set "USE_NPM=true" + shift + goto parse_args +) echo [错误] 未知选项: %~1 goto show_help :main_execution +REM 检查操作系统版本 +call :check_os_version + REM 检查并切换到正确目录 call :check_and_change_directory if errorlevel 1 goto error_exit REM 检查依赖 -echo [信息] 正在检查系统依赖... -call :check_dependencies -if errorlevel 1 goto error_exit +if not defined SKIP_DEPS ( + echo [信息] 正在检查系统依赖... + call :check_dependencies + if errorlevel 1 goto error_exit +) REM 检查端口占用 call :check_port @@ -83,16 +101,22 @@ if defined CHECK_ONLY ( goto end ) +REM 安装依赖(如果需要) +if not exist "node_modules\" ( + echo [信息] 检测到缺少依赖,正在安装... + if defined USE_NPM ( + call :install_with_npm + ) else ( + call :install_with_pnpm + ) + if errorlevel 1 goto error_exit +) + REM 强制构建或检查构建状态 if defined FORCE_BUILD ( echo [信息] 强制重新构建项目... - call pnpm build > build.log 2>&1 - if errorlevel 1 ( - echo [错误] 构建失败,请查看 build.log - type build.log | more - goto error_exit - ) - echo [成功] 构建完成 + call :build_project + if errorlevel 1 goto error_exit ) else ( call :check_build if errorlevel 1 goto error_exit @@ -102,7 +126,11 @@ REM 开发模式或正常启动 if defined DEV_MODE ( echo [信息] 正在以开发模式启动 n8n... echo [警告] 开发模式启动时间较长,请耐心等待... - call pnpm dev + if defined USE_NPM ( + call npm run dev + ) else ( + call pnpm dev + ) ) else ( call :start_n8n ) @@ -110,6 +138,34 @@ goto end REM ========== 函数定义 ========== +:check_os_version +REM 检查 Windows 版本兼容性 +ver | findstr /i "5\.1\." >nul +if not errorlevel 1 ( + echo [警告] 检测到 Windows XP,可能存在兼容性问题 +) +ver | findstr /i "6\.0\." >nul +if not errorlevel 1 ( + echo [信息] 检测到 Windows Vista +) +ver | findstr /i "6\.1\." >nul +if not errorlevel 1 ( + echo [信息] 检测到 Windows 7 +) +ver | findstr /i "6\.2\." >nul +if not errorlevel 1 ( + echo [信息] 检测到 Windows 8 +) +ver | findstr /i "6\.3\." >nul +if not errorlevel 1 ( + echo [信息] 检测到 Windows 8.1 +) +ver | findstr /i "10\.0\." >nul +if not errorlevel 1 ( + echo [信息] 检测到 Windows 10/11 +) +exit /b 0 + :check_and_change_directory REM 检查当前目录是否为 n8n 项目目录 if exist "package.json" if exist "packages" ( @@ -117,18 +173,22 @@ if exist "package.json" if exist "packages" ( exit /b 0 ) -REM 获取脚本所在目录 +REM 获取脚本所在目录(兼容不同 Windows 版本) set "SCRIPT_DIR=%~dp0" -set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" +if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" REM 如果脚本在 n8n-n8n-1.109.2 目录内 -echo %SCRIPT_DIR% | findstr /C:"n8n-n8n-1.109.2" >nul +echo %SCRIPT_DIR% | findstr /I /C:"n8n-n8n-1.109.2" >nul if not errorlevel 1 ( - echo [信息] 切换到脚本所在的 n8n 项目目录: %SCRIPT_DIR% - cd /d "%SCRIPT_DIR%" + echo [信息] 切换到脚本所在的 n8n 项目目录 + cd /d "%SCRIPT_DIR%" 2>nul if errorlevel 1 ( - echo [错误] 无法切换到目录: %SCRIPT_DIR% - exit /b 1 + REM 兼容旧版 Windows + cd "%SCRIPT_DIR%" 2>nul + if errorlevel 1 ( + echo [错误] 无法切换到目录: %SCRIPT_DIR% + exit /b 1 + ) ) echo [成功] 已切换到正确的 n8n 项目目录 exit /b 0 @@ -162,38 +222,84 @@ exit /b 0 :check_dependencies REM 检查 Node.js -where node >nul 2>nul +where node >nul 2>&1 if errorlevel 1 ( - echo [错误] Node.js 未安装或未在 PATH 中 - exit /b 1 + REM 尝试常见的 Node.js 安装路径 + if exist "C:\Program Files\nodejs\node.exe" ( + set "PATH=C:\Program Files\nodejs;%PATH%" + ) else if exist "C:\Program Files (x86)\nodejs\node.exe" ( + set "PATH=C:\Program Files (x86)\nodejs;%PATH%" + ) else ( + echo [错误] Node.js 未安装或未在 PATH 中 + echo [信息] 请访问 https://nodejs.org 下载安装 + exit /b 1 + ) ) -REM 检查 pnpm -where pnpm >nul 2>nul -if errorlevel 1 ( - echo [错误] pnpm 未安装或未在 PATH 中 - echo [信息] 请先安装 pnpm: npm install -g pnpm - exit /b 1 +echo [信息] Node.js 版本: +node --version + +REM 检查包管理器 +if not defined USE_NPM ( + where pnpm >nul 2>&1 + if errorlevel 1 ( + echo [警告] pnpm 未安装,尝试使用 npm + set "USE_NPM=true" + ) else ( + echo [信息] 使用 pnpm 作为包管理器 + ) +) else ( + echo [信息] 使用 npm 作为包管理器 ) echo [成功] 依赖检查通过 exit /b 0 +:install_with_pnpm +echo [信息] 使用 pnpm 安装依赖... +where pnpm >nul 2>&1 +if errorlevel 1 ( + echo [信息] 正在安装 pnpm... + call npm install -g pnpm@8 + if errorlevel 1 ( + echo [错误] pnpm 安装失败 + exit /b 1 + ) +) +call pnpm install --no-frozen-lockfile +exit /b %errorlevel% + +:install_with_npm +echo [警告] 使用 npm 安装(可能不兼容 workspace) +echo [信息] 建议安装 pnpm: npm install -g pnpm +call npm install --legacy-peer-deps +exit /b %errorlevel% + :check_port REM 检查端口 5678 是否被占用 -netstat -ano | findstr :5678 >nul 2>nul +netstat -ano 2>nul | findstr ":5678" >nul 2>&1 if not errorlevel 1 ( echo [警告] 端口 5678 已被占用 echo [信息] 正在查看占用进程... - netstat -ano | findstr :5678 + netstat -ano | findstr ":5678" + echo. - set /p "kill_process=是否杀死占用进程?(y/N): " + set /p "kill_process=是否终止占用进程?(y/N): " if /I "!kill_process!"=="y" ( echo [信息] 正在终止占用进程... - for /f "tokens=5" %%a in ('netstat -ano ^| findstr :5678') do ( - taskkill /PID %%a /F >nul 2>nul + for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":5678"') do ( + taskkill /PID %%a /F >nul 2>&1 + if errorlevel 1 ( + REM Windows 7 兼容性 + tskill %%a >nul 2>&1 + ) ) echo [成功] 进程已终止 + timeout /t 2 /nobreak >nul 2>&1 + if errorlevel 1 ( + REM Windows 7 兼容性 + ping -n 3 127.0.0.1 >nul + ) ) else ( echo [错误] 无法启动 n8n,端口被占用 exit /b 1 @@ -205,11 +311,15 @@ exit /b 0 echo [信息] 正在停止现有的 n8n 进程... REM 停止可能存在的 n8n 相关进程 -taskkill /F /IM node.exe /FI "WINDOWTITLE eq *n8n*" >nul 2>nul -taskkill /F /IM node.exe /FI "WINDOWTITLE eq *pnpm*" >nul 2>nul +taskkill /F /IM node.exe /FI "WINDOWTITLE eq *n8n*" >nul 2>&1 +taskkill /F /IM node.exe /FI "WINDOWTITLE eq *pnpm*" >nul 2>&1 +taskkill /F /IM node.exe /FI "WINDOWTITLE eq *npm*" >nul 2>&1 -REM 等待2秒 -timeout /t 2 /nobreak >nul +REM 等待 +timeout /t 2 /nobreak >nul 2>&1 +if errorlevel 1 ( + ping -n 3 127.0.0.1 >nul +) echo [成功] 已停止现有进程 exit /b 0 @@ -222,69 +332,78 @@ set "N8N_SECURE_COOKIE=false" set "DB_SQLITE_POOL_SIZE=5" set "N8N_RUNNERS_ENABLED=true" set "N8N_BLOCK_ENV_ACCESS_IN_NODE=false" +set "NODE_OPTIONS=--max-old-space-size=4096" echo [成功] 环境变量已设置 echo - N8N_DEFAULT_LOCALE=zh-CN echo - N8N_SECURE_COOKIE=false echo - DB_SQLITE_POOL_SIZE=5 +echo - NODE_OPTIONS=--max-old-space-size=4096 exit /b 0 :check_build -if not exist "packages\cli\dist\" ( - goto need_build -) -if not exist "packages\core\dist\" ( - goto need_build -) +if not exist "packages\cli\dist\" goto need_build +if not exist "packages\core\dist\" goto need_build +if not exist "packages\workflow\dist\" goto need_build exit /b 0 :need_build echo [警告] 检测到项目需要构建 set /p "build_project=是否现在构建项目?这可能需要几分钟时间 (y/N): " if /I "!build_project!"=="y" ( - echo [信息] 正在构建项目... - call pnpm build > build.log 2>&1 - if errorlevel 1 ( - echo [错误] 构建失败,请查看 build.log - type build.log | more - exit /b 1 - ) - echo [成功] 项目构建完成 + call :build_project ) exit /b 0 +:build_project +echo [信息] 正在构建项目... +if defined USE_NPM ( + call npm run build > build.log 2>&1 +) else ( + call pnpm build > build.log 2>&1 +) +if errorlevel 1 ( + echo [错误] 构建失败,请查看 build.log + type build.log | more + exit /b 1 +) +echo [成功] 项目构建完成 +exit /b 0 + :start_n8n echo [信息] 正在启动 n8n 中文版... -REM 创建日志文件名 -for /f "tokens=2-4 delims=/ " %%a in ('date /t') do ( - set "today=%%c%%a%%b" -) -for /f "tokens=1-2 delims=: " %%a in ('time /t') do ( - set "now=%%a%%b" -) -set "LOG_FILE=n8n-%today%-%now%.log" -set "LOG_FILE=%LOG_FILE: =%" +REM 创建日志文件名(兼容不同日期格式) +set "LOG_FILE=n8n-%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%.log" +set "LOG_FILE=%LOG_FILE: =0%" -echo 正在启动 n8n 服务... +echo [信息] 正在启动 n8n 服务... +echo [信息] 日志文件: %LOG_FILE% -REM 启动 n8n 在新窗口 -start "n8n Server" /B cmd /c "pnpm start > %LOG_FILE% 2>&1" +REM 启动 n8n +if defined USE_NPM ( + start "n8n Server" /B cmd /c "npm start > %LOG_FILE% 2>&1" +) else ( + start "n8n Server" /B cmd /c "pnpm start > %LOG_FILE% 2>&1" +) REM 等待启动 echo 等待 n8n 启动 set "count=0" :wait_loop set /a count+=1 -if %count% gtr 30 goto start_failed +if %count% gtr 60 goto start_failed REM 检查端口是否开启 -netstat -an | findstr :5678 | findstr LISTENING >nul 2>nul +netstat -an 2>nul | findstr ":5678" | findstr "LISTENING" >nul 2>&1 if not errorlevel 1 goto start_success -REM 显示进度点 -nul +REM 显示进度 +set /p "=." nul 2>&1 +if errorlevel 1 ( + ping -n 2 127.0.0.1 >nul +) goto wait_loop :start_success @@ -292,23 +411,15 @@ echo. echo [成功] n8n 启动成功! echo. echo ========== 启动信息 ========== -echo 📱 访问地址: http://localhost:5678 -echo 🌏 界面语言: 中文 (zh-CN) -echo 📝 日志文件: %LOG_FILE% +echo 访问地址: http://localhost:5678 +echo 界面语言: 中文 (zh-CN) +echo 日志文件: %LOG_FILE% echo ============================= echo. echo [信息] 使用 Ctrl+C 停止服务 +echo [提示] 首次访问需要设置账户 echo. -echo [提示] 正在监控日志输出... -echo. - -REM 持续显示日志 -:tail_log -if exist "%LOG_FILE%" ( - type "%LOG_FILE%" - timeout /t 2 /nobreak >nul - goto tail_log -) +pause exit /b 0 :start_failed @@ -316,32 +427,49 @@ echo. echo [错误] n8n 启动失败 echo [信息] 查看日志文件: %LOG_FILE% if exist "%LOG_FILE%" ( + echo. + echo ===== 错误日志 ===== type "%LOG_FILE%" | more ) +pause exit /b 1 :show_help echo 用法: %~nx0 [选项] echo. echo 选项: -echo -h, --help 显示此帮助信息 -echo -d, --dev 使用开发模式启动 (支持热重载) -echo -b, --build 强制重新构建项目 -echo -c, --check 仅检查系统状态,不启动 +echo -h, --help 显示此帮助信息 +echo -d, --dev 使用开发模式启动 (支持热重载) +echo -b, --build 强制重新构建项目 +echo -c, --check 仅检查系统状态,不启动 +echo --skip-deps 跳过依赖检查 +echo --npm 使用 npm 替代 pnpm echo. echo 示例: -echo %~nx0 # 正常启动 -echo %~nx0 -d # 开发模式启动 -echo %~nx0 -b # 重新构建并启动 +echo %~nx0 # 正常启动 +echo %~nx0 -d # 开发模式启动 +echo %~nx0 -b # 重新构建并启动 +echo %~nx0 --npm # 使用 npm 启动 +echo. +echo 故障排除: +echo 1. 如果 pnpm 安装失败,使用 --npm 选项 +echo 2. 如果端口被占用,脚本会提示终止进程 +echo 3. 构建失败时查看 build.log 文件 echo. goto end :error_exit echo [错误] 脚本执行失败 +echo. +echo 常见问题解决: +echo 1. 确保 Node.js 版本为 18.x 或 20.x +echo 2. 尝试使用管理员权限运行 +echo 3. 使用 --npm 选项如果 pnpm 有问题 +echo 4. 检查网络连接和代理设置 +echo. pause exit /b 1 :end endlocal -pause exit /b 0 \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/css/animations.css b/web_frontend/exhibition-demo/public/web_result/css/animations.css new file mode 100644 index 00000000..02841e1d --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/css/animations.css @@ -0,0 +1,919 @@ +/* 2024长三角国际新能源汽车与智能交通产业博览会 - 高级动画样式 */ + +/* ============================================ + 字体图标引入 + ============================================ */ +@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'); + +/* ============================================ + 自定义字体 + ============================================ */ +@font-face { + font-family: 'TechFont'; + src: url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&display=swap'); +} + +/* ============================================ + 核心动画变量 + ============================================ */ +:root { + /* 动画时长 */ + --anim-fast: 0.2s; + --anim-normal: 0.3s; + --anim-slow: 0.5s; + --anim-slower: 0.8s; + --anim-slowest: 1.2s; + + /* 缓动函数 */ + --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); + --ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55); + --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1); + --ease-sharp: cubic-bezier(0.4, 0, 0.6, 1); + + /* 渐变色 */ + --gradient-electric: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + --gradient-ocean: linear-gradient(135deg, #667eea 0%, #42e695 100%); + --gradient-sunset: linear-gradient(135deg, #fa709a 0%, #fee140 100%); + --gradient-aurora: linear-gradient(135deg, #42e695 0%, #3bb2b8 100%); +} + +/* ============================================ + 基础动画类 + ============================================ */ +/* 淡入向上动画 */ +.animate-fadeInUp { + opacity: 0; + transform: translateY(30px); + animation: fadeInUp 0.8s ease-out forwards; +} + +@keyframes fadeInUp { + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 淡入向左动画 */ +.animate-fadeInLeft { + opacity: 0; + transform: translateX(-30px); + animation: fadeInLeft 0.8s ease-out forwards; +} + +@keyframes fadeInLeft { + to { + opacity: 1; + transform: translateX(0); + } +} + +/* 淡入向右动画 */ +.animate-fadeInRight { + opacity: 0; + transform: translateX(30px); + animation: fadeInRight 0.8s ease-out forwards; +} + +@keyframes fadeInRight { + to { + opacity: 1; + transform: translateX(0); + } +} + +/* 动画延迟类 */ +.animation-delay-100 { animation-delay: 0.1s; } +.animation-delay-200 { animation-delay: 0.2s; } +.animation-delay-300 { animation-delay: 0.3s; } +.animation-delay-400 { animation-delay: 0.4s; } +.animation-delay-500 { animation-delay: 0.5s; } +.animation-delay-600 { animation-delay: 0.6s; } +.animation-delay-700 { animation-delay: 0.7s; } +.animation-delay-800 { animation-delay: 0.8s; } +.animation-delay-900 { animation-delay: 0.9s; } +.animation-delay-1000 { animation-delay: 1s; } +.animation-delay-1100 { animation-delay: 1.1s; } +.animation-delay-2000 { animation-delay: 2s; } +.animation-delay-4000 { animation-delay: 4s; } + +/* ============================================ + 页面加载动画 + ============================================ */ +.page-loader { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + z-index: 9999; + display: flex; + align-items: center; + justify-content: center; + animation: fadeOut 0.5s ease-out 1s forwards; +} + +.loader-content { + text-align: center; +} + +.loader-logo { + width: 100px; + height: 100px; + margin: 0 auto 20px; + background: white; + border-radius: 20px; + display: flex; + align-items: center; + justify-content: center; + animation: pulse 1s infinite; +} + +.loader-text { + color: white; + font-size: 1.2rem; + animation: fadeInUp 0.5s ease-out; +} + +.loader-progress { + width: 200px; + height: 4px; + background: rgba(255, 255, 255, 0.3); + border-radius: 2px; + margin: 20px auto; + overflow: hidden; +} + +.loader-progress-bar { + width: 0%; + height: 100%; + background: white; + animation: loading 1s ease-out forwards; +} + +@keyframes loading { + to { width: 100%; } +} + +/* ============================================ + 入场动画 + ============================================ */ +.fade-in { + opacity: 0; + animation: fadeIn var(--anim-slow) ease-out forwards; +} + +@keyframes fadeIn { + to { + opacity: 1; + } +} + +.fade-in-up { + opacity: 0; + transform: translateY(30px); + animation: fadeInUp var(--anim-slow) ease-out forwards; +} + +@keyframes fadeInUp { + to { + opacity: 1; + transform: translateY(0); + } +} + +.fade-in-down { + opacity: 0; + transform: translateY(-30px); + animation: fadeInDown var(--anim-slow) ease-out forwards; +} + +@keyframes fadeInDown { + to { + opacity: 1; + transform: translateY(0); + } +} + +.fade-in-left { + opacity: 0; + transform: translateX(-30px); + animation: fadeInLeft var(--anim-slow) ease-out forwards; +} + +@keyframes fadeInLeft { + to { + opacity: 1; + transform: translateX(0); + } +} + +.fade-in-right { + opacity: 0; + transform: translateX(30px); + animation: fadeInRight var(--anim-slow) ease-out forwards; +} + +@keyframes fadeInRight { + to { + opacity: 1; + transform: translateX(0); + } +} + +/* ============================================ + 缩放动画 + ============================================ */ +.zoom-in { + opacity: 0; + transform: scale(0.8); + animation: zoomIn var(--anim-slow) var(--ease-bounce) forwards; +} + +@keyframes zoomIn { + to { + opacity: 1; + transform: scale(1); + } +} + +.zoom-out { + opacity: 0; + transform: scale(1.2); + animation: zoomOut var(--anim-slow) var(--ease-bounce) forwards; +} + +@keyframes zoomOut { + to { + opacity: 1; + transform: scale(1); + } +} + +/* ============================================ + 旋转动画 + ============================================ */ +.rotate-in { + opacity: 0; + transform: rotate(-180deg) scale(0.8); + animation: rotateIn var(--anim-slow) var(--ease-bounce) forwards; +} + +@keyframes rotateIn { + to { + opacity: 1; + transform: rotate(0) scale(1); + } +} + +.flip-in-x { + opacity: 0; + transform: rotateX(-90deg); + animation: flipInX var(--anim-slow) ease-out forwards; +} + +@keyframes flipInX { + to { + opacity: 1; + transform: rotateX(0); + } +} + +.flip-in-y { + opacity: 0; + transform: rotateY(-90deg); + animation: flipInY var(--anim-slow) ease-out forwards; +} + +@keyframes flipInY { + to { + opacity: 1; + transform: rotateY(0); + } +} + +/* ============================================ + 弹跳动画 + ============================================ */ +.bounce-in { + opacity: 0; + transform: scale(0.3); + animation: bounceIn var(--anim-slower) var(--ease-bounce) forwards; +} + +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(0.3); + } + 50% { + opacity: 1; + transform: scale(1.05); + } + 70% { + transform: scale(0.9); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +/* ============================================ + 悬停效果 + ============================================ */ +.hover-grow { + transition: transform var(--anim-normal) var(--ease-smooth); +} + +.hover-grow:hover { + transform: scale(1.05); +} + +.hover-shrink { + transition: transform var(--anim-normal) var(--ease-smooth); +} + +.hover-shrink:hover { + transform: scale(0.95); +} + +.hover-rotate { + transition: transform var(--anim-normal) var(--ease-smooth); +} + +.hover-rotate:hover { + transform: rotate(5deg); +} + +.hover-lift { + transition: all var(--anim-normal) var(--ease-smooth); +} + +.hover-lift:hover { + transform: translateY(-8px); + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15); +} + +.hover-sink { + transition: all var(--anim-normal) var(--ease-smooth); +} + +.hover-sink:hover { + transform: translateY(3px); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); +} + +/* ============================================ + 按钮悬停效果 + ============================================ */ +.btn-hover-fill { + position: relative; + overflow: hidden; + transition: color var(--anim-normal); + z-index: 1; +} + +.btn-hover-fill::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: var(--gradient-electric); + transition: left var(--anim-normal) var(--ease-smooth); + z-index: -1; +} + +.btn-hover-fill:hover::before { + left: 0; +} + +.btn-hover-fill:hover { + color: white; +} + +/* 按钮波纹效果 */ +.btn-ripple { + position: relative; + overflow: hidden; +} + +.btn-ripple::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: rgba(255, 255, 255, 0.5); + transform: translate(-50%, -50%); + transition: width 0.6s, height 0.6s; +} + +.btn-ripple:active::after { + width: 300px; + height: 300px; +} + +/* 按钮发光效果 */ +.btn-glow { + transition: all var(--anim-normal); +} + +.btn-glow:hover { + box-shadow: 0 0 20px rgba(102, 126, 234, 0.6), + 0 0 40px rgba(102, 126, 234, 0.4), + 0 0 60px rgba(102, 126, 234, 0.2); +} + +/* ============================================ + 图片悬停效果 + ============================================ */ +.img-hover-zoom { + overflow: hidden; +} + +.img-hover-zoom img { + transition: transform var(--anim-slow) var(--ease-smooth); +} + +.img-hover-zoom:hover img { + transform: scale(1.1); +} + +.img-hover-rotate { + overflow: hidden; +} + +.img-hover-rotate img { + transition: transform var(--anim-slow) var(--ease-smooth); +} + +.img-hover-rotate:hover img { + transform: scale(1.1) rotate(3deg); +} + +.img-hover-blur { + overflow: hidden; +} + +.img-hover-blur img { + transition: all var(--anim-slow) var(--ease-smooth); +} + +.img-hover-blur:hover img { + filter: blur(3px); + transform: scale(1.1); +} + +/* 图片叠加效果 */ +.img-overlay { + position: relative; + overflow: hidden; +} + +.img-overlay::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)); + opacity: 0; + transition: opacity var(--anim-normal); + z-index: 1; +} + +.img-overlay:hover::before { + opacity: 1; +} + +.img-overlay-content { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: white; + text-align: center; + opacity: 0; + transition: opacity var(--anim-normal); + z-index: 2; +} + +.img-overlay:hover .img-overlay-content { + opacity: 1; +} + +/* ============================================ + 文字动画 + ============================================ */ +.text-glow { + animation: textGlow 2s ease-in-out infinite alternate; +} + +@keyframes textGlow { + from { + text-shadow: 0 0 10px rgba(102, 126, 234, 0.5), + 0 0 20px rgba(102, 126, 234, 0.3); + } + to { + text-shadow: 0 0 20px rgba(102, 126, 234, 0.8), + 0 0 30px rgba(102, 126, 234, 0.5); + } +} + +.text-typing { + overflow: hidden; + border-right: 2px solid; + white-space: nowrap; + animation: typing 3.5s steps(40, end), + blink-caret 0.75s step-end infinite; +} + +@keyframes typing { + from { width: 0; } + to { width: 100%; } +} + +@keyframes blink-caret { + from, to { border-color: transparent; } + 50% { border-color: currentColor; } +} + +.text-gradient-animate { + background: linear-gradient(90deg, #667eea, #764ba2, #42e695, #667eea); + background-size: 300% 100%; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + animation: gradientMove 5s ease infinite; +} + +@keyframes gradientMove { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +/* ============================================ + 卡片动画 + ============================================ */ +.card-3d { + transform-style: preserve-3d; + transition: transform var(--anim-slow) var(--ease-smooth); +} + +.card-3d:hover { + transform: rotateY(10deg) rotateX(10deg) translateZ(20px); +} + +.card-flip { + position: relative; + transform-style: preserve-3d; + transition: transform var(--anim-slow); +} + +.card-flip:hover { + transform: rotateY(180deg); +} + +.card-flip-front, +.card-flip-back { + position: absolute; + width: 100%; + height: 100%; + backface-visibility: hidden; +} + +.card-flip-back { + transform: rotateY(180deg); +} + +/* ============================================ + 滚动动画 + ============================================ */ +.scroll-reveal { + opacity: 0; + transform: translateY(50px); + transition: all var(--anim-slower) var(--ease-smooth); +} + +.scroll-reveal.revealed { + opacity: 1; + transform: translateY(0); +} + +.scroll-reveal-left { + opacity: 0; + transform: translateX(-50px); + transition: all var(--anim-slower) var(--ease-smooth); +} + +.scroll-reveal-left.revealed { + opacity: 1; + transform: translateX(0); +} + +.scroll-reveal-right { + opacity: 0; + transform: translateX(50px); + transition: all var(--anim-slower) var(--ease-smooth); +} + +.scroll-reveal-right.revealed { + opacity: 1; + transform: translateX(0); +} + +.scroll-reveal-scale { + opacity: 0; + transform: scale(0.8); + transition: all var(--anim-slower) var(--ease-smooth); +} + +.scroll-reveal-scale.revealed { + opacity: 1; + transform: scale(1); +} + +/* ============================================ + 视差效果 + ============================================ */ +.parallax { + position: relative; + transform-style: preserve-3d; +} + +.parallax-layer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.parallax-layer-back { + transform: translateZ(-1px) scale(2); +} + +.parallax-layer-base { + transform: translateZ(0); +} + +.parallax-layer-front { + transform: translateZ(1px) scale(0.5); +} + +/* ============================================ + 加载动画 + ============================================ */ +.skeleton { + position: relative; + overflow: hidden; + background: #f0f0f0; +} + +.skeleton::after { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent); + animation: skeleton-loading 1.5s infinite; +} + +@keyframes skeleton-loading { + to { + left: 100%; + } +} + +/* ============================================ + 脉冲动画 + ============================================ */ +.pulse { + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { + transform: scale(1); + opacity: 1; + } + 50% { + transform: scale(1.05); + opacity: 0.8; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +.pulse-slow { + animation: pulse 3s infinite; +} + +.pulse-fast { + animation: pulse 1s infinite; +} + +/* ============================================ + 抖动动画 + ============================================ */ +.shake { + animation: shake 0.5s; +} + +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } + 20%, 40%, 60%, 80% { transform: translateX(10px); } +} + +.shake-horizontal { + animation: shakeHorizontal 0.5s; +} + +@keyframes shakeHorizontal { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-5px); } + 75% { transform: translateX(5px); } +} + +/* ============================================ + 浮动动画 + ============================================ */ +.float { + animation: float 3s ease-in-out infinite; +} + +@keyframes float { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-20px); } +} + +.float-slow { + animation: float 5s ease-in-out infinite; +} + +.float-fast { + animation: float 2s ease-in-out infinite; +} + +/* ============================================ + 闪烁动画 + ============================================ */ +.blink { + animation: blink 1s infinite; +} + +@keyframes blink { + 0%, 100% { opacity: 1; } + 50% { opacity: 0; } +} + +.flash { + animation: flash 0.5s; +} + +@keyframes flash { + 0%, 50%, 100% { opacity: 1; } + 25%, 75% { opacity: 0; } +} + +/* ============================================ + 渐变背景动画 + ============================================ */ +.bg-gradient-animate { + background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab); + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; +} + +@keyframes gradientShift { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +/* ============================================ + 光标跟随效果 + ============================================ */ +.cursor-follow { + position: fixed; + width: 20px; + height: 20px; + border: 2px solid #667eea; + border-radius: 50%; + pointer-events: none; + transition: all 0.1s ease; + z-index: 9999; +} + +.cursor-follow.active { + transform: scale(2); + background: rgba(102, 126, 234, 0.1); +} + +/* ============================================ + 工具提示 + ============================================ */ +.tooltip { + position: relative; +} + +.tooltip::after { + content: attr(data-tooltip); + position: absolute; + bottom: 125%; + left: 50%; + transform: translateX(-50%) scale(0); + background: #333; + color: white; + padding: 8px 12px; + border-radius: 6px; + font-size: 14px; + white-space: nowrap; + opacity: 0; + transition: all var(--anim-normal) var(--ease-smooth); + pointer-events: none; +} + +.tooltip::before { + content: ''; + position: absolute; + bottom: 115%; + left: 50%; + transform: translateX(-50%) scale(0); + border: 6px solid transparent; + border-top-color: #333; + opacity: 0; + transition: all var(--anim-normal) var(--ease-smooth); +} + +.tooltip:hover::after, +.tooltip:hover::before { + transform: translateX(-50%) scale(1); + opacity: 1; +} + +/* ============================================ + 交错动画 + ============================================ */ +.stagger-children > * { + opacity: 0; + transform: translateY(20px); + animation: staggerIn var(--anim-slow) var(--ease-smooth) forwards; +} + +.stagger-children > *:nth-child(1) { animation-delay: 0.1s; } +.stagger-children > *:nth-child(2) { animation-delay: 0.2s; } +.stagger-children > *:nth-child(3) { animation-delay: 0.3s; } +.stagger-children > *:nth-child(4) { animation-delay: 0.4s; } +.stagger-children > *:nth-child(5) { animation-delay: 0.5s; } +.stagger-children > *:nth-child(6) { animation-delay: 0.6s; } +.stagger-children > *:nth-child(7) { animation-delay: 0.7s; } +.stagger-children > *:nth-child(8) { animation-delay: 0.8s; } + +@keyframes staggerIn { + to { + opacity: 1; + transform: translateY(0); + } +} + +/* ============================================ + 模糊背景 + ============================================ */ +.blur-background { + backdrop-filter: blur(10px); + background: rgba(255, 255, 255, 0.8); +} + +.glass-morphism { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); +} + +/* ============================================ + 响应式动画 + ============================================ */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/css/styles.css b/web_frontend/exhibition-demo/public/web_result/css/styles.css new file mode 100644 index 00000000..5837176f --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/css/styles.css @@ -0,0 +1,454 @@ +/* 2024长三角国际新能源汽车与智能交通产业博览会 - 全局样式 */ + +/* 根变量定义 */ +:root { + /* 主题色彩系统 */ + --primary-gradient-start: #10b981; + --primary-gradient-end: #3b82f6; + --secondary-gradient-start: #8b5cf6; + --secondary-gradient-end: #ec4899; + --accent-gradient-start: #f59e0b; + --accent-gradient-end: #ef4444; + + /* 中性色 */ + --gray-50: #f9fafb; + --gray-100: #f3f4f6; + --gray-200: #e5e7eb; + --gray-300: #d1d5db; + --gray-400: #9ca3af; + --gray-500: #6b7280; + --gray-600: #4b5563; + --gray-700: #374151; + --gray-800: #1f2937; + --gray-900: #111827; + + /* 间距系统 */ + --spacing-xs: 0.5rem; + --spacing-sm: 1rem; + --spacing-md: 1.5rem; + --spacing-lg: 2rem; + --spacing-xl: 3rem; + --spacing-2xl: 4rem; + + /* 动画时长 */ + --transition-fast: 150ms; + --transition-base: 300ms; + --transition-slow: 500ms; + --transition-slower: 700ms; + + /* 阴影 */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-base: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1); + + /* 圆角 */ + --radius-sm: 0.375rem; + --radius-base: 0.5rem; + --radius-lg: 0.75rem; + --radius-xl: 1rem; + --radius-full: 9999px; +} + +/* 全局重置和基础样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + font-size: 16px; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans SC', 'Microsoft YaHei', sans-serif; + line-height: 1.6; + color: var(--gray-800); + background-color: var(--gray-50); +} + +/* 渐变背景动画 */ +@keyframes gradientShift { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +.gradient-bg { + background: linear-gradient(-45deg, + var(--primary-gradient-start), + var(--primary-gradient-end), + var(--secondary-gradient-start), + var(--secondary-gradient-end)); + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; +} + +.gradient-primary { + background: linear-gradient(135deg, var(--primary-gradient-start), var(--primary-gradient-end)); +} + +.gradient-secondary { + background: linear-gradient(135deg, var(--secondary-gradient-start), var(--secondary-gradient-end)); +} + +.gradient-accent { + background: linear-gradient(135deg, var(--accent-gradient-start), var(--accent-gradient-end)); +} + +/* 导航栏样式 */ +.navbar { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1000; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + box-shadow: var(--shadow-base); + transition: all var(--transition-base) ease; +} + +.navbar.scrolled { + background: rgba(255, 255, 255, 0.98); + box-shadow: var(--shadow-lg); +} + +.nav-link { + position: relative; + padding: var(--spacing-xs) var(--spacing-sm); + color: var(--gray-700); + text-decoration: none; + transition: color var(--transition-fast) ease; + overflow: hidden; +} + +.nav-link::after { + content: ''; + position: absolute; + bottom: 0; + left: 50%; + width: 0; + height: 2px; + background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); + transform: translateX(-50%); + transition: width var(--transition-base) ease; +} + +.nav-link:hover::after, +.nav-link.active::after { + width: 100%; +} + +/* 卡片动画效果 */ +@keyframes cardFloat { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-10px); } +} + +.card { + background: white; + border-radius: var(--radius-lg); + padding: var(--spacing-lg); + box-shadow: var(--shadow-base); + transition: all var(--transition-base) ease; + position: relative; + overflow: hidden; +} + +.card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 4px; + background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); + transform: scaleX(0); + transform-origin: left; + transition: transform var(--transition-base) ease; +} + +.card:hover { + transform: translateY(-5px); + box-shadow: var(--shadow-xl); +} + +.card:hover::before { + transform: scaleX(1); +} + +/* 按钮样式 */ +.btn { + display: inline-block; + padding: var(--spacing-sm) var(--spacing-lg); + border-radius: var(--radius-full); + font-weight: 600; + text-decoration: none; + transition: all var(--transition-base) ease; + position: relative; + overflow: hidden; + cursor: pointer; + border: none; + outline: none; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary-gradient-start), var(--primary-gradient-end)); + color: white; + box-shadow: 0 4px 15px rgba(16, 185, 129, 0.3); +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(16, 185, 129, 0.4); +} + +.btn-secondary { + background: white; + color: var(--gray-700); + border: 2px solid var(--gray-200); +} + +.btn-secondary:hover { + background: var(--gray-50); + border-color: var(--primary-gradient-start); + color: var(--primary-gradient-start); +} + +/* 波纹效果 */ +@keyframes ripple { + 0% { + transform: scale(0); + opacity: 1; + } + 100% { + transform: scale(4); + opacity: 0; + } +} + +.ripple { + position: absolute; + border-radius: 50%; + background: rgba(255, 255, 255, 0.5); + animation: ripple 0.6s ease-out; + pointer-events: none; +} + +/* 加载动画 */ +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.spinner { + display: inline-block; + width: 40px; + height: 40px; + border: 4px solid var(--gray-200); + border-top-color: var(--primary-gradient-start); + border-radius: 50%; + animation: spin 1s linear infinite; +} + +/* 数字滚动动画 */ +@keyframes countUp { + from { opacity: 0; transform: translateY(20px); } + to { opacity: 1; transform: translateY(0); } +} + +.count-up { + animation: countUp var(--transition-slow) ease-out; +} + +/* 淡入动画 */ +@keyframes fadeIn { + from { opacity: 0; transform: translateY(20px); } + to { opacity: 1; transform: translateY(0); } +} + +.fade-in { + animation: fadeIn var(--transition-slower) ease-out; +} + +/* 滑入动画 */ +@keyframes slideInLeft { + from { opacity: 0; transform: translateX(-50px); } + to { opacity: 1; transform: translateX(0); } +} + +@keyframes slideInRight { + from { opacity: 0; transform: translateX(50px); } + to { opacity: 1; transform: translateX(0); } +} + +.slide-in-left { + animation: slideInLeft var(--transition-slow) ease-out; +} + +.slide-in-right { + animation: slideInRight var(--transition-slow) ease-out; +} + +/* 脉冲动画 */ +@keyframes pulse { + 0%, 100% { transform: scale(1); opacity: 1; } + 50% { transform: scale(1.05); opacity: 0.9; } +} + +.pulse { + animation: pulse 2s ease-in-out infinite; +} + +/* 光晕效果 */ +@keyframes glow { + 0%, 100% { box-shadow: 0 0 20px rgba(16, 185, 129, 0.5); } + 50% { box-shadow: 0 0 40px rgba(16, 185, 129, 0.8); } +} + +.glow { + animation: glow 2s ease-in-out infinite; +} + +/* 时间线样式 */ +.timeline { + position: relative; + padding-left: var(--spacing-xl); +} + +.timeline::before { + content: ''; + position: absolute; + left: 15px; + top: 0; + bottom: 0; + width: 2px; + background: linear-gradient(180deg, var(--primary-gradient-start), var(--primary-gradient-end)); +} + +.timeline-item { + position: relative; + padding-bottom: var(--spacing-xl); +} + +.timeline-item::before { + content: ''; + position: absolute; + left: -25px; + top: 5px; + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--primary-gradient-start); + border: 3px solid white; + box-shadow: var(--shadow-base); +} + +/* 网格布局动画 */ +.grid-item { + opacity: 0; + transform: scale(0.9); + animation: gridFadeIn var(--transition-slow) ease-out forwards; +} + +@keyframes gridFadeIn { + to { + opacity: 1; + transform: scale(1); + } +} + +.grid-item:nth-child(1) { animation-delay: 0.1s; } +.grid-item:nth-child(2) { animation-delay: 0.2s; } +.grid-item:nth-child(3) { animation-delay: 0.3s; } +.grid-item:nth-child(4) { animation-delay: 0.4s; } +.grid-item:nth-child(5) { animation-delay: 0.5s; } +.grid-item:nth-child(6) { animation-delay: 0.6s; } + +/* 响应式设计 */ +@media (max-width: 768px) { + :root { + font-size: 14px; + } + + .card { + padding: var(--spacing-md); + } + + .timeline { + padding-left: var(--spacing-lg); + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +/* 打印样式 */ +@media print { + .navbar, + .btn, + .no-print { + display: none !important; + } + + body { + font-size: 12pt; + color: black; + background: white; + } + + .card { + box-shadow: none; + border: 1px solid #ddd; + page-break-inside: avoid; + } +} + +/* 辅助类 */ +.text-gradient { + background: linear-gradient(135deg, var(--primary-gradient-start), var(--primary-gradient-end)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.hover-scale { + transition: transform var(--transition-base) ease; +} + +.hover-scale:hover { + transform: scale(1.05); +} + +.hover-lift { + transition: transform var(--transition-base) ease; +} + +.hover-lift:hover { + transform: translateY(-5px); +} + +.overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.7)); +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 var(--spacing-md); +} \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/index.html b/web_frontend/exhibition-demo/public/web_result/index.html new file mode 100644 index 00000000..7e7e5375 --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/index.html @@ -0,0 +1,604 @@ + + + + + + 2024长三角国际新能源汽车与智能交通产业博览会 + + + + + + + + + + + + + + + + + + + + + +
+
+ +
加载中...
+
+
+
+
+
+ + + + + +
+ +
+
+
+
+
+ + +
+
+
+ +
+
+ +
+ + 2024年6月15-17日 · 苏州国际博览中心 +
+ +

+ 2024 长三角国际 + 新能源汽车与智能交通 + 产业博览会 +

+ +

+ + 引领绿色出行新时代 · 共创智能交通新未来 + +

+ +
+
+
+
+ +
+

展会时间

+

2024年9月

+

12-15日

+
+
+ +
+
+
+ +
+

展会地点

+

国家会展中心

+

上海

+
+
+ +
+
+
+ +
+

展览规模

+

50,000

+

平方米

+
+
+
+ + + +
+
+
+ + +
+ +
+ +
+
+
+
+ +
+
+ 0+ +
+
参展企业
+
+
+
+ +
+
+ 0+ +
+
预计观众
+
+
+
+ +
+
+ 0亿+ +
+
预计成交额
+
+
+
+ +
+
+ 0+ +
+
专业论坛
+
+
+
+
+ + +
+ +
+ + +
+
+
+
+
+
+
+
+

展会亮点

+
+ +
+
+ 小米汽车 +
+
热门展区
+
+
+
+

全产业链展示

+

+ 涵盖整车制造、核心零部件、充电设施、智能网联等全产业链环节,打造一站式采购平台。 +

+ + 了解更多 + +
+
+ + +
+
+ 试驾体验 +
+
互动体验
+
+
+
+

创新技术体验

+

+ 设置自动驾驶体验区、智能交通演示区,让观众亲身体验最新科技成果。 +

+ + 了解更多 + +
+
+ + +
+
+ 论坛峰会 +
+
主题论坛
+
+
+
+

高端论坛峰会

+

+ 汇聚行业领袖、专家学者,探讨产业发展趋势,发布权威研究报告。 +

+ + 了解更多 + +
+
+
+
+
+ + +
+
+

展区规划

+

50,000平方米超大展览空间,打造沉浸式体验

+ +
+
+
+ +
+

整车展示区

+

20,000m²

+

100+品牌车型

+
+ 核心展区 +
+
+ +
+
+ +
+

核心零部件区

+

15,000m²

+

500+供应商

+
+ 技术展示 +
+
+ +
+
+ +
+

智能交通区

+

10,000m²

+

50+解决方案

+
+ 创新科技 +
+
+ +
+
+ +
+

体验互动区

+

5,000m²

+

20+互动项目

+
+ 沉浸体验 +
+
+
+ + +
+
+ 展馆布置图 +
+

展馆3D全景布置图 - 点击查看详情

+
+
+
+
+
+ + +
+
+
+
+
+

精彩瞬间

+
+
+ 展会内部 +
+
+

展馆内部参观

+

宽敞明亮的展示空间,科技感十足

+
+
+
+ +
+ 签到处 +
+
+

智能签到系统

+

快速便捷的入场体验

+
+
+
+ +
+ 展品展示 +
+
+

明星展品

+

最新款新能源汽车亮相

+
+
+
+
+ + +
+
+ 展品1 +
+
+

智能驾驶展示

+
+
+
+
+ 展品2 +
+
+

充电技术革新

+
+
+
+
+ 展品3 +
+
+

电池技术展览

+
+
+
+
+ 展品4 +
+
+

智慧交通系统

+
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/js/main.js b/web_frontend/exhibition-demo/public/web_result/js/main.js new file mode 100644 index 00000000..62b624a0 --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/js/main.js @@ -0,0 +1,709 @@ +// 2024长三角国际新能源汽车与智能交通产业博览会 - 交互脚本 + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', function() { + // 隐藏页面加载器 + hidePageLoader(); + + initNavbar(); + initAnimations(); + initCounters(); + initScrollEffects(); + initRippleEffect(); + initLazyLoading(); + initFormValidation(); + initCharts(); + initTimeline(); + initInteractiveElements(); + handleImageErrors(); +}); + +// 隐藏页面加载器 +function hidePageLoader() { + const loader = document.getElementById('pageLoader'); + if (loader) { + // 添加淡出动画 + loader.style.opacity = '0'; + loader.style.transition = 'opacity 0.5s ease-out'; + + // 500ms后完全移除 + setTimeout(() => { + loader.style.display = 'none'; + // 恢复body滚动 + document.body.style.overflow = 'auto'; + document.body.classList.remove('loading'); + }, 500); + } else { + // 如果没有找到加载器,也要确保恢复滚动 + document.body.style.overflow = 'auto'; + document.body.classList.remove('loading'); + } +} + +// 如果页面加载超过3秒,强制隐藏加载器 +window.addEventListener('load', function() { + setTimeout(() => { + hidePageLoader(); + }, 3000); +}); + +// 导航栏交互 +function initNavbar() { + const navbar = document.querySelector('.navbar'); + const navLinks = document.querySelectorAll('.nav-link'); + const mobileMenuBtn = document.querySelector('.mobile-menu-btn'); + const mobileMenu = document.querySelector('.mobile-menu'); + + // 滚动时改变导航栏样式 + window.addEventListener('scroll', () => { + if (window.scrollY > 100) { + navbar?.classList.add('scrolled'); + } else { + navbar?.classList.remove('scrolled'); + } + }); + + // 高亮当前页面链接 + const currentPath = window.location.pathname; + navLinks.forEach(link => { + if (link.getAttribute('href') === currentPath) { + link.classList.add('active'); + } + }); + + // 移动端菜单切换 + mobileMenuBtn?.addEventListener('click', () => { + mobileMenu?.classList.toggle('open'); + mobileMenuBtn.classList.toggle('active'); + }); + + // 平滑滚动到锚点 + document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function(e) { + e.preventDefault(); + const target = document.querySelector(this.getAttribute('href')); + if (target) { + target.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + } + }); + }); +} + +// 动画初始化 +function initAnimations() { + // Intersection Observer for fade-in animations + const observerOptions = { + threshold: 0.1, + rootMargin: '0px 0px -50px 0px' + }; + + const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('animate-in'); + observer.unobserve(entry.target); + } + }); + }, observerOptions); + + // 观察所有需要动画的元素 + document.querySelectorAll('.fade-in, .slide-in-left, .slide-in-right, .grid-item').forEach(el => { + observer.observe(el); + }); +} + +// 数字计数器动画 +function initCounters() { + const counters = document.querySelectorAll('.counter'); + const speed = 200; // 动画速度 + + const countUp = (counter) => { + const target = +counter.getAttribute('data-target'); + const increment = target / speed; + + const updateCount = () => { + const count = +counter.innerText.replace(/[^0-9]/g, ''); + + if (count < target) { + counter.innerText = Math.ceil(count + increment).toLocaleString(); + setTimeout(updateCount, 1); + } else { + counter.innerText = target.toLocaleString(); + + // 添加单位 + const unit = counter.getAttribute('data-unit'); + if (unit) { + counter.innerText += unit; + } + } + }; + + updateCount(); + }; + + // 使用 Intersection Observer 触发计数 + const counterObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + countUp(entry.target); + counterObserver.unobserve(entry.target); + } + }); + }, { threshold: 0.5 }); + + counters.forEach(counter => { + counter.innerText = '0'; + counterObserver.observe(counter); + }); +} + +// 滚动效果 +function initScrollEffects() { + let lastScrollTop = 0; + const header = document.querySelector('header'); + + window.addEventListener('scroll', () => { + const scrollTop = window.pageYOffset || document.documentElement.scrollTop; + + // 隐藏/显示导航栏 + if (scrollTop > lastScrollTop && scrollTop > 300) { + header?.classList.add('hide'); + } else { + header?.classList.remove('hide'); + } + + lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; + + // 视差效果 + const parallaxElements = document.querySelectorAll('.parallax'); + parallaxElements.forEach(el => { + const speed = el.getAttribute('data-speed') || 0.5; + const yPos = -(scrollTop * speed); + el.style.transform = `translateY(${yPos}px)`; + }); + + // 进度条 + const progressBar = document.querySelector('.progress-bar'); + if (progressBar) { + const winScroll = document.body.scrollTop || document.documentElement.scrollTop; + const height = document.documentElement.scrollHeight - document.documentElement.clientHeight; + const scrolled = (winScroll / height) * 100; + progressBar.style.width = scrolled + '%'; + } + }); +} + +// 波纹效果 +function initRippleEffect() { + document.querySelectorAll('.btn, .card').forEach(element => { + element.addEventListener('click', function(e) { + const ripple = document.createElement('span'); + ripple.classList.add('ripple'); + + const rect = this.getBoundingClientRect(); + const size = Math.max(rect.width, rect.height); + const x = e.clientX - rect.left - size / 2; + const y = e.clientY - rect.top - size / 2; + + ripple.style.width = ripple.style.height = size + 'px'; + ripple.style.left = x + 'px'; + ripple.style.top = y + 'px'; + + this.appendChild(ripple); + + setTimeout(() => { + ripple.remove(); + }, 600); + }); + }); +} + +// 懒加载 +function initLazyLoading() { + const images = document.querySelectorAll('img[data-src]'); + + const imageObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const img = entry.target; + img.src = img.dataset.src; + img.removeAttribute('data-src'); + imageObserver.unobserve(img); + + // 添加加载完成动画 + img.addEventListener('load', () => { + img.classList.add('loaded'); + }); + } + }); + }, { + rootMargin: '50px 0px' + }); + + images.forEach(img => imageObserver.observe(img)); +} + +// 表单验证 +function initFormValidation() { + const forms = document.querySelectorAll('form'); + + forms.forEach(form => { + form.addEventListener('submit', function(e) { + e.preventDefault(); + + let isValid = true; + const inputs = form.querySelectorAll('input[required], textarea[required]'); + + inputs.forEach(input => { + if (!input.value.trim()) { + isValid = false; + input.classList.add('error'); + showError(input, '此字段为必填项'); + } else { + input.classList.remove('error'); + clearError(input); + } + + // 邮箱验证 + if (input.type === 'email' && input.value) { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(input.value)) { + isValid = false; + input.classList.add('error'); + showError(input, '请输入有效的邮箱地址'); + } + } + + // 电话验证 + if (input.type === 'tel' && input.value) { + const phoneRegex = /^1[3-9]\d{9}$/; + if (!phoneRegex.test(input.value)) { + isValid = false; + input.classList.add('error'); + showError(input, '请输入有效的手机号码'); + } + } + }); + + if (isValid) { + // 显示成功消息 + showSuccess('表单提交成功!'); + form.reset(); + } + }); + + // 实时验证 + form.querySelectorAll('input, textarea').forEach(input => { + input.addEventListener('blur', function() { + validateInput(this); + }); + + input.addEventListener('input', function() { + if (this.classList.contains('error')) { + validateInput(this); + } + }); + }); + }); +} + +// 显示错误信息 +function showError(input, message) { + const errorEl = input.nextElementSibling; + if (errorEl && errorEl.classList.contains('error-message')) { + errorEl.textContent = message; + } else { + const error = document.createElement('span'); + error.classList.add('error-message'); + error.textContent = message; + input.parentNode.insertBefore(error, input.nextSibling); + } +} + +// 清除错误信息 +function clearError(input) { + const errorEl = input.nextElementSibling; + if (errorEl && errorEl.classList.contains('error-message')) { + errorEl.remove(); + } +} + +// 验证输入 +function validateInput(input) { + if (input.hasAttribute('required') && !input.value.trim()) { + input.classList.add('error'); + showError(input, '此字段为必填项'); + return false; + } + + input.classList.remove('error'); + clearError(input); + return true; +} + +// 显示成功消息 +function showSuccess(message) { + const toast = document.createElement('div'); + toast.classList.add('toast', 'success'); + toast.textContent = message; + document.body.appendChild(toast); + + setTimeout(() => { + toast.classList.add('show'); + }, 100); + + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => { + toast.remove(); + }, 300); + }, 3000); +} + +// 初始化图表 +function initCharts() { + // 预算分配饼图 + const budgetChart = document.getElementById('budgetChart'); + if (budgetChart) { + const data = [ + { label: '场地租赁', value: 35, color: '#10b981' }, + { label: '营销推广', value: 25, color: '#3b82f6' }, + { label: '运营服务', value: 20, color: '#8b5cf6' }, + { label: '人员成本', value: 15, color: '#f59e0b' }, + { label: '其他费用', value: 5, color: '#ef4444' } + ]; + + drawPieChart(budgetChart, data); + } + + // 参展商类别分布 + const exhibitorChart = document.getElementById('exhibitorChart'); + if (exhibitorChart) { + const data = [ + { label: '整车制造', value: 40 }, + { label: '零部件', value: 30 }, + { label: '充电设施', value: 15 }, + { label: '智能驾驶', value: 10 }, + { label: '其他', value: 5 } + ]; + + drawBarChart(exhibitorChart, data); + } +} + +// 绘制饼图 +function drawPieChart(canvas, data) { + const ctx = canvas.getContext('2d'); + const centerX = canvas.width / 2; + const centerY = canvas.height / 2; + const radius = Math.min(centerX, centerY) - 20; + + let currentAngle = -Math.PI / 2; + const total = data.reduce((sum, item) => sum + item.value, 0); + + data.forEach(item => { + const sliceAngle = (item.value / total) * 2 * Math.PI; + + // 绘制扇形 + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + sliceAngle); + ctx.lineTo(centerX, centerY); + ctx.fillStyle = item.color; + ctx.fill(); + + // 绘制标签 + const labelX = centerX + Math.cos(currentAngle + sliceAngle / 2) * (radius * 0.7); + const labelY = centerY + Math.sin(currentAngle + sliceAngle / 2) * (radius * 0.7); + + ctx.fillStyle = '#fff'; + ctx.font = '14px sans-serif'; + ctx.textAlign = 'center'; + ctx.fillText(item.value + '%', labelX, labelY); + + currentAngle += sliceAngle; + }); +} + +// 绘制柱状图 +function drawBarChart(canvas, data) { + const ctx = canvas.getContext('2d'); + const barWidth = canvas.width / (data.length * 2); + const maxValue = Math.max(...data.map(item => item.value)); + const chartHeight = canvas.height - 40; + + data.forEach((item, index) => { + const barHeight = (item.value / maxValue) * chartHeight; + const x = (index * 2 + 0.5) * barWidth; + const y = canvas.height - barHeight - 20; + + // 绘制柱子 + const gradient = ctx.createLinearGradient(x, y, x, y + barHeight); + gradient.addColorStop(0, '#10b981'); + gradient.addColorStop(1, '#3b82f6'); + + ctx.fillStyle = gradient; + ctx.fillRect(x, y, barWidth, barHeight); + + // 绘制数值 + ctx.fillStyle = '#333'; + ctx.font = '12px sans-serif'; + ctx.textAlign = 'center'; + ctx.fillText(item.value + '%', x + barWidth / 2, y - 5); + }); +} + +// 初始化时间线 +function initTimeline() { + const timelineItems = document.querySelectorAll('.timeline-item'); + + const timelineObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('active'); + } + }); + }, { threshold: 0.5 }); + + timelineItems.forEach(item => { + timelineObserver.observe(item); + }); +} + +// 交互元素初始化 +function initInteractiveElements() { + // 标签页切换 + const tabs = document.querySelectorAll('.tab'); + const tabContents = document.querySelectorAll('.tab-content'); + + tabs.forEach(tab => { + tab.addEventListener('click', () => { + const target = tab.dataset.tab; + + // 切换标签状态 + tabs.forEach(t => t.classList.remove('active')); + tab.classList.add('active'); + + // 切换内容显示 + tabContents.forEach(content => { + if (content.id === target) { + content.classList.add('active'); + content.style.display = 'block'; + } else { + content.classList.remove('active'); + content.style.display = 'none'; + } + }); + }); + }); + + // 手风琴效果 + const accordionHeaders = document.querySelectorAll('.accordion-header'); + + accordionHeaders.forEach(header => { + header.addEventListener('click', () => { + const content = header.nextElementSibling; + const isOpen = header.classList.contains('active'); + + // 关闭其他项 + accordionHeaders.forEach(h => { + h.classList.remove('active'); + h.nextElementSibling.style.maxHeight = null; + }); + + // 切换当前项 + if (!isOpen) { + header.classList.add('active'); + content.style.maxHeight = content.scrollHeight + 'px'; + } + }); + }); + + // 模态框 + const modalTriggers = document.querySelectorAll('[data-modal]'); + const modals = document.querySelectorAll('.modal'); + const modalCloses = document.querySelectorAll('.modal-close'); + + modalTriggers.forEach(trigger => { + trigger.addEventListener('click', () => { + const modalId = trigger.dataset.modal; + const modal = document.getElementById(modalId); + if (modal) { + modal.classList.add('open'); + document.body.style.overflow = 'hidden'; + } + }); + }); + + modalCloses.forEach(close => { + close.addEventListener('click', () => { + const modal = close.closest('.modal'); + modal.classList.remove('open'); + document.body.style.overflow = ''; + }); + }); + + // 点击背景关闭模态框 + modals.forEach(modal => { + modal.addEventListener('click', (e) => { + if (e.target === modal) { + modal.classList.remove('open'); + document.body.style.overflow = ''; + } + }); + }); + + // 工具提示 + const tooltips = document.querySelectorAll('[data-tooltip]'); + + tooltips.forEach(element => { + const tooltip = document.createElement('div'); + tooltip.classList.add('tooltip'); + tooltip.textContent = element.dataset.tooltip; + + element.addEventListener('mouseenter', () => { + document.body.appendChild(tooltip); + const rect = element.getBoundingClientRect(); + tooltip.style.left = rect.left + rect.width / 2 - tooltip.offsetWidth / 2 + 'px'; + tooltip.style.top = rect.top - tooltip.offsetHeight - 10 + 'px'; + tooltip.classList.add('show'); + }); + + element.addEventListener('mouseleave', () => { + tooltip.classList.remove('show'); + setTimeout(() => { + tooltip.remove(); + }, 300); + }); + }); +} + +// 复制到剪贴板 +function copyToClipboard(text) { + const textarea = document.createElement('textarea'); + textarea.value = text; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); + showSuccess('已复制到剪贴板'); +} + +// 分享功能 +function shareContent(platform) { + const url = encodeURIComponent(window.location.href); + const title = encodeURIComponent(document.title); + let shareUrl = ''; + + switch(platform) { + case 'wechat': + // 生成微信分享二维码 + generateQRCode(window.location.href); + break; + case 'weibo': + shareUrl = `https://service.weibo.com/share/share.php?url=${url}&title=${title}`; + break; + case 'linkedin': + shareUrl = `https://www.linkedin.com/sharing/share-offsite/?url=${url}`; + break; + case 'twitter': + shareUrl = `https://twitter.com/intent/tweet?url=${url}&text=${title}`; + break; + } + + if (shareUrl) { + window.open(shareUrl, '_blank', 'width=600,height=400'); + } +} + +// 生成二维码 +function generateQRCode(text) { + const modal = document.createElement('div'); + modal.classList.add('qr-modal'); + modal.innerHTML = ` +
+

微信扫码分享

+
+ +
+ `; + document.body.appendChild(modal); + + // 这里可以集成实际的二维码生成库 + document.getElementById('qrcode').innerHTML = '二维码生成区域'; +} + +// 主题切换 +function initThemeToggle() { + const themeToggle = document.getElementById('themeToggle'); + const currentTheme = localStorage.getItem('theme') || 'light'; + + document.documentElement.setAttribute('data-theme', currentTheme); + + themeToggle?.addEventListener('click', () => { + const theme = document.documentElement.getAttribute('data-theme') === 'light' ? 'dark' : 'light'; + document.documentElement.setAttribute('data-theme', theme); + localStorage.setItem('theme', theme); + }); +} + +// 导出为 PDF +function exportToPDF() { + window.print(); +} + +// 性能监控 +function initPerformanceMonitoring() { + // 页面加载时间 + window.addEventListener('load', () => { + const loadTime = performance.timing.loadEventEnd - performance.timing.navigationStart; + console.log(`页面加载时间: ${loadTime}ms`); + + // 发送到分析服务 + if (window.gtag) { + gtag('event', 'page_load_time', { + value: loadTime, + page_path: window.location.pathname + }); + } + }); + + // 监控长任务 + if ('PerformanceObserver' in window) { + const observer = new PerformanceObserver((list) => { + for (const entry of list.getEntries()) { + console.log('Long Task detected:', entry); + } + }); + + observer.observe({ entryTypes: ['longtask'] }); + } +} + +// 处理图片加载错误 +function handleImageErrors() { + const images = document.querySelectorAll('img'); + const defaultImage = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjMwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjZTJlOGYwIi8+PHRleHQgeD0iNTAlIiB5PSI1MCUiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC1zaXplPSIxOCIgZmlsbD0iIzk0YTNiOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZHk9Ii4zZW0iPuWbvueJh+WKoOi9veS4rTwvdGV4dD48L3N2Zz4='; + + images.forEach(img => { + // 添加错误处理 + img.addEventListener('error', function() { + console.warn('图片加载失败:', this.src); + // 设置默认占位图 + this.src = defaultImage; + this.alt = '图片加载失败'; + this.classList.add('image-error'); + }); + + // 添加加载成功处理 + img.addEventListener('load', function() { + this.classList.add('image-loaded'); + }); + }); +} + +// 初始化性能监控 +initPerformanceMonitoring(); +initThemeToggle(); \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/pages/budget.html b/web_frontend/exhibition-demo/public/web_result/pages/budget.html new file mode 100644 index 00000000..be474237 --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/pages/budget.html @@ -0,0 +1,1121 @@ + + + + + + 预算分析 - 2024长三角国际新能源汽车展 + + + + + + + + + +
+
+
+

+ 智能预算管理系统 +

+

+ 科学规划 · 精准投资 · 价值最大化 +

+
+
+ +

ROI 33.3%

+
+
+ +

总预算 900万

+
+
+ +

预期收入 1200万

+
+
+
+ + +
+ +
+
+ +
+
+ +
+
+ + +
+
+
+

预算总控仪表盘

+

实时监控 · 动态调整 · 风险预警

+
+ + +
+ +
+
+
+ +
+ -5.3% +
+
+

¥900万

+

总支出预算

+
+
+
+ 执行率 + 75% +
+
+
+
+
+
+ + +
+
+
+ +
+ +20% +
+
+

¥1200万

+

预期总收入

+
+
+
+ 完成度 + 85% +
+
+
+
+
+
+ + +
+
+
+ +
+ +15% +
+
+

¥300万

+

预期净利润

+
+
+
+ 利润率 + 25% +
+
+
+
+
+
+ + +
+
+
+ +
+ 优秀 +
+
+

33.3%

+

投资回报率

+
+
+
+ 行业均值 + 20% +
+
+
+
+
+
+
+ + +
+

实时财务监控

+
+
+
+

今日支出

+ +
+

¥5.8万

+

较昨日 -12%

+
+
+
+

今日收入

+ +
+

¥12.3万

+

较昨日 +28%

+
+
+
+

现金流

+ +
+

¥238万

+

流动性充足

+
+
+
+
+
+ + +
+
+
+

支出预算明细分析

+ +
+ +
+

预算分配结构

+
+ + + + + + + + + + + 场地费用: ¥300万 (33.3%) + + + + + 营销推广: ¥200万 (22.2%) + + + + + 人员成本: ¥150万 (16.7%) + + + + + 活动执行: ¥100万 (11.1%) + + + + + 运营保障: ¥80万 (8.9%) + + + + + 应急储备: ¥70万 (7.8%) + + + + + ¥900万 + 总预算 + +
+ + +
+
+
+ 场地费用 33.3% +
+
+
+ 营销推广 22.2% +
+
+
+ 人员成本 16.7% +
+
+
+ 活动执行 11.1% +
+
+
+ 运营保障 8.9% +
+
+
+ 应急储备 7.8% +
+
+
+ + +
+

分项预算执行

+
+ +
+
+

+ 场地费用 +

+ ¥300万 +
+
+
+ 展馆租赁 + ¥180万 +
+
+ 搭建装修 + ¥80万 +
+
+ 设备租赁 + ¥40万 +
+
+
+
+
+

执行率: 90%

+
+ + +
+
+

+ 营销推广 +

+ ¥200万 +
+
+
+ 数字营销 + ¥80万 +
+
+ 线下推广 + ¥60万 +
+
+ 媒体合作 + ¥40万 +
+
+ KOL合作 + ¥20万 +
+
+
+
+
+

执行率: 75%

+
+ + +
+
+

+ 人员成本 +

+ ¥150万 +
+
+
+ 项目团队 + ¥80万 +
+
+ 临时人员 + ¥40万 +
+
+ 专家顾问 + ¥30万 +
+
+
+
+
+

执行率: 85%

+
+
+
+
+
+
+
+ + +
+
+

收入来源与预测

+ + +
+ +
+
+
+
+ +
+

展位收入

+

¥700万

+

占比 58.3%

+
+
+ 标准展位 + 1200个 +
+
+ 特装展位 + 20000㎡ +
+
+
+
+ + +
+
+
+
+ +
+

赞助收入

+

¥300万

+

占比 25%

+
+
+ 冠名赞助 + 1家 +
+
+ 战略合作 + 3家 +
+
+
+
+ + +
+
+
+
+ +
+

广告收入

+

¥100万

+

占比 8.3%

+
+
+ 现场广告 + 50万 +
+
+ 数字广告 + 50万 +
+
+
+
+ + +
+
+
+
+ +
+

其他收入

+

¥100万

+

占比 8.3%

+
+
+ 门票收入 + 30万 +
+
+ 服务费用 + 70万 +
+
+
+
+
+ + +
+

收入增长预测

+
+ +
+

月度收入趋势

+
+
+ 1月 +
+
+
+ ¥120万 +
+
+ 2月 +
+
+
+ ¥180万 +
+
+ 3月 +
+
+
+ ¥280万 +
+
+ 4月(展会) +
+
+
+ ¥620万 +
+
+
+ + +
+

收入类别增长率

+
+
+
+ + 展位收入 +
+
+ +18% + +
+
+
+
+ + 赞助收入 +
+
+ +25% + +
+
+
+
+ + 广告收入 +
+
+ +30% + +
+
+
+
+
+
+
+
+ + +
+
+

投资回报率分析

+ + +
+
+ +
+

综合ROI评分

+
+ + + + +
+
+

33.3%

+

优秀水平

+
+
+
+
+ + +
+

直接收益

+
+
+ 展会净利润 + ¥300万 +
+
+ 现场成交额 + ¥10亿+ +
+
+ 合作签约 + 50+项 +
+
+
+ + +
+

间接收益

+
+
+ 品牌价值 + +¥500万 +
+
+ 媒体曝光 + 1亿+次 +
+
+ 产业带动 + ¥30亿 +
+
+
+
+
+ + +
+
+
+ +
+

投入产出比

+

1:1.33

+

高于行业平均

+
+ +
+
+ +
+

回收周期

+

6个月

+

快速回本

+
+ +
+
+ +
+

综合价值

+

¥1500万

+

含品牌价值

+
+ +
+
+ +
+

投资评级

+

A+

+

推荐投资

+
+
+
+
+ + +
+
+

智能成本控制系统

+ +
+ +
+
+
+ +
+

预算管控

+
+
    +
  • + +
    +

    AI预算监控

    +

    实时预警,智能调配

    +
    +
  • +
  • + +
    +

    分级审批制

    +

    10万以下快速审批

    +
    +
  • +
  • + +
    +

    成本责任制

    +

    KPI考核,奖惩分明

    +
    +
  • +
+
+ + +
+
+
+ +
+

优化措施

+
+
    +
  • + +
    +

    智能采购

    +

    3家比价,最优选择

    +
    +
  • +
  • + +
    +

    资源共享

    +

    合作伙伴资源互换

    +
    +
  • +
  • + +
    +

    数字化管理

    +

    减少30%人工成本

    +
    +
  • +
+
+ + +
+
+
+ +
+

风险储备

+
+
    +
  • + +
    +

    应急基金

    +

    ¥70万专项储备

    +
    +
  • +
  • + +
    +

    保险覆盖

    +

    全面风险保障

    +
    +
  • +
  • + +
    +

    备用方案

    +

    成本可控替代方案

    +
    +
  • +
+
+
+ + +
+

预算预警系统

+
+
+
+ 场地费用 + 正常 +
+
执行率: 90% | 剩余: ¥30万
+
+
+
+ 营销推广 + 注意 +
+
执行率: 75% | 剩余: ¥50万
+
+
+
+ 人员成本 + 预警 +
+
执行率: 95% | 剩余: ¥7.5万
+
+
+
+
+
+ + +
+
+

科学预算,确保展会成功

+

了解风险管控,保障展会顺利进行

+ + 查看风险评估 + +
+
+ + +
+
+
+

© 2024 长三角国际新能源汽车与智能交通产业博览会. All rights reserved.

+

Powered by AI Exhibition Planning System

+
+
+
+ + + + \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/pages/exhibition.html b/web_frontend/exhibition-demo/public/web_result/pages/exhibition.html new file mode 100644 index 00000000..c0f50ee7 --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/pages/exhibition.html @@ -0,0 +1,835 @@ + + + + + + 展会介绍 - 2024长三角国际新能源汽车展 + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ +
+
+ 首页 + + 展会介绍 +
+

+ 展会介绍与预期效果 +

+

+ + 深入了解展会规模、展品范围、参展商与观众构成 +

+
+
+ 2024年9月12-15日 +
+
+ 国家会展中心(上海) +
+
+ 预计10万+参观者 +
+
+
+
+ + +
+
+
+

智行未来,绿动长三角

+

+ 2024长三角国际新能源汽车与智能交通产业博览会,致力于打造全球新能源汽车产业交流合作的重要平台 +

+
+ +
+
+
+ +
+

专业化

+

聚焦新能源汽车全产业链,提供专业展示交流平台

+
+
+
+ +
+

国际化

+

汇聚全球领先企业,促进国际技术交流与合作

+
+
+
+ +
+

品质化

+

高端展会服务,打造行业标杆展会品牌

+
+
+
+
+ + +
+ +
+ +
+

+ + 展会场地 +

+
+
+

+ + 国家会展中心(上海) +

+
+
+ +
+

详细地址

+

上海市青浦区崧泽大道333号

+
+
+
+ +
+

交通便利

+

地铁2号线直达,多条公交线路,充足停车位

+
+
+
+ +
+

场馆规模

+

展览面积50万平方米,亚洲最大会展综合体

+
+
+
+
+ +
+

+ + 场馆优势 +

+
+
+
+ +
+
+

世界级展馆设施

+

配备先进的展览设施和智能化管理系统

+
+
+
+
+ +
+
+

完善的配套服务

+

酒店、餐饮、商务中心一应俱全

+
+
+
+
+ +
+
+

丰富的办展经验

+

成功举办进博会等大型国际展会

+
+
+
+
+ +
+
+

绿色环保理念

+

全馆采用节能环保设计,获得绿色建筑认证

+
+
+
+
+
+
+
+ + +
+
+

+ + 展品范围 +

+
+ +
+
+ 整车展示 +
+ +
+
+
+
+ +
+

整车展区

+
+
    +
  • + + 纯电动汽车:轿车、SUV、MPV、商用车 +
  • +
  • + + 插电式混合动力汽车:增程式、并联式、混联式 +
  • +
  • + + 氢燃料电池汽车:乘用车、商用车、专用车 +
  • +
  • + + 智能网联汽车:L2-L4级自动驾驶展示车 +
  • +
+
+

展览面积:20,000平方米 | 预计展商:120家

+
+
+ + +
+
+ 核心零部件 +
+ +
+
+
+
+ +
+

核心零部件展区

+
+
    +
  • + + 动力电池:锂电池、固态电池、钠离子电池 +
  • +
  • + + 驱动电机:永磁同步、交流异步、轮毂电机 +
  • +
  • + + 电控系统:BMS、VCU、MCU、DC/DC转换器 +
  • +
  • + + 智能驾驶:激光雷达、毫米波雷达、摄像头、芯片 +
  • +
+
+

展览面积:15,000平方米 | 预计展商:150家

+
+
+ + +
+
+ 智能交通 +
+ +
+
+
+
+ +
+

智能交通展区

+
+
    +
  • + + 智慧路网:智能交通信号、车路协同系统 +
  • +
  • + + V2X通信:5G-V2X设备、路侧单元RSU +
  • +
  • + + 智能停车:自动泊车系统、智慧停车场解决方案 +
  • +
  • + + 出行服务:MaaS平台、共享出行、智能调度 +
  • +
+
+

展览面积:10,000平方米 | 预计展商:60家

+
+
+ + +
+
+ 配套服务 +
+ +
+
+
+
+ +
+

配套服务展区

+
+
    +
  • + + 充电设施:充电桩、换电站、无线充电 +
  • +
  • + + 金融服务:汽车金融、保险、融资租赁 +
  • +
  • + + 检测认证:第三方检测、认证机构、标准制定 +
  • +
  • + + 后市场服务:维修保养、二手车、汽车改装 +
  • +
+
+

展览面积:5,000平方米 | 预计展商:20家

+
+
+
+
+
+ + +
+
+

展会日程

+
+
+
+

2024年9月12日 - 15日

+

为期4天的行业盛会

+
+
+ +
+
+
第一天
+
9月12日(周四)
+
+
+
+ 09:00 + 开幕典礼 & 领导致辞 +
+
+ 10:00 + 主题论坛:新能源汽车产业发展高峰论坛 +
+
+ 14:00 + 专业观众参观 & 商务洽谈 +
+
+ 16:00 + 新产品发布会(特斯拉、蔚来等) +
+
+
+ + +
+
+
第二天
+
9月13日(周五)
+
+
+
+ 09:30 + 智能网联汽车技术创新峰会 +
+
+ 10:30 + 自动驾驶体验区开放 +
+
+ 14:00 + 充电基础设施建设研讨会 +
+
+ 15:30 + 供需对接会 & 采购洽谈 +
+
+
+ + +
+
+
第三天
+
9月14日(周六)
+
+
+
+ 09:00 + 公众开放日 - 市民参观体验 +
+
+ 10:00 + 新能源汽车试乘试驾活动 +
+
+ 14:00 + 青少年科技创新大赛 +
+
+ 16:00 + 绿色出行主题活动 +
+
+
+ + +
+
+
第四天
+
9月15日(周日)
+
+
+
+ 09:00 + 产业投资论坛 +
+
+ 11:00 + 项目签约仪式 +
+
+ 14:00 + 行业白皮书发布 +
+
+ 16:00 + 闭幕式 & 成果发布 +
+
+
+
+
+
+
+
+ + +
+
+

目标参与者

+
+ +
+

目标参展商

+
+
+

整车制造企业(30%)

+

特斯拉、比亚迪、上汽、蔚来、理想、小鹏、吉利、长城、广汽等

+
+
+

核心零部件企业(35%)

+

宁德时代、比亚迪电池、华为智能汽车、百度Apollo、博世、大陆等

+
+
+

科技企业(25%)

+

阿里巴巴、腾讯、美团、滴滴、科大讯飞、商汤科技等

+
+
+

服务企业(10%)

+

国家电网、特来电、星星充电、平安保险、建设银行等

+
+
+
+ + +
+

目标观众

+
+
+

专业观众(70%)

+
    +
  • + + 汽车制造商采购及技术人员 +
  • +
  • + + 经销商和4S店负责人 +
  • +
  • + + 政府部门和行业组织代表 +
  • +
  • + + 投资机构和行业分析师 +
  • +
  • + + 科研院所和高校研究人员 +
  • +
+
+
+

普通观众(30%)

+
    +
  • + + 新能源汽车潜在消费者 +
  • +
  • + + 科技爱好者和车迷 +
  • +
  • + + 大学生和青少年群体 +
  • +
  • + + 媒体记者和自媒体博主 +
  • +
+
+
+
+
+
+
+ + +
+
+

预期效果

+
+
+
+ + + + +
+

经济效益

+
+

现场成交额:10亿+

+

意向订单:8亿+

+

带动产业收入:30亿+

+
+
+ +
+
+ + + +
+

社会效益

+
+

媒体曝光:1亿+次

+

专业论坛:20场

+

发布白皮书:2份

+
+
+ +
+
+ + + +
+

品牌效益

+
+

参展商满意度:90%+

+

观众回访率:85%+

+

行业影响力:TOP 3

+
+
+
+
+
+ + +
+
+

加入我们,共创绿色未来

+

立即申请参展,抢占优质展位

+ +
+
+ + +
+
+
+

© 2024 长三角国际新能源汽车与智能交通产业博览会. All rights reserved.

+
+
+
+ + + + + + \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/pages/marketing.html b/web_frontend/exhibition-demo/public/web_result/pages/marketing.html new file mode 100644 index 00000000..62b6dc65 --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/pages/marketing.html @@ -0,0 +1,817 @@ + + + + + + 营销方案 - 2024长三角国际新能源汽车展 + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+
+ +
+
+ 首页 + + 营销方案 +
+

+ + 营销推广方案 +

+

+ 全方位、多渠道、精准化的营销策略 +

+
+
+ 目标观众: 10万+ +
+
+ 预期转化: 30% +
+
+ 覆盖范围: 全国 +
+
+
+
+ + +
+ +
+ +
+

+ + 整体推广策略 +

+
+
+ +
+ + +
+ +
+
+

+ 预热期 +

+

展前6个月

+
+
    +
  • 品牌造势,建立认知
  • +
  • 话题营销,引发关注
  • +
  • KOL合作,扩大影响
  • +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ 2 +
+
+
+

推广期

+

展前3个月

+
+
    +
  • • 精准投放,定向推广
  • +
  • • 观众组织,团体邀请
  • +
  • • 媒体合作,深度报道
  • +
+
+
+
+ + +
+
+

冲刺期

+

展前1个月

+
+
    +
  • • 密集宣传,全面覆盖
  • +
  • • 氛围营造,期待感拉满
  • +
  • • 最后召集,确保参与
  • +
+
+
+
+
+ 3 +
+
+
+
+ + +
+
+
+
+ 4 +
+
+
+

展期

+

9月12-15日

+
+
    +
  • • 现场互动,实时传播
  • +
  • • 媒体报道,扩大影响
  • +
  • • 直播分享,线上参与
  • +
+
+
+
+ + +
+
+

展后

+

展后1个月

+
+
    +
  • • 持续发酵,延长热度
  • +
  • • 成果展示,价值传递
  • +
  • • 下届预热,维系关系
  • +
+
+
+
+
+ 5 +
+
+
+
+
+
+
+
+
+ + +
+
+

线上推广方案

+ + +
+ +
+
+
+ + + +
+

官方网站

+
+
    +
  • ✓ 在线注册系统
  • +
  • ✓ 3D展馆导航
  • +
  • ✓ VR预览体验
  • +
  • ✓ 展商数据库
  • +
  • ✓ 活动预约系统
  • +
+
+
+ 预计访问量 + 100万+ +
+
+
+ + +
+
+
+ + + + +
+

社交媒体

+
+
+
+
+ 微信 + 50万粉丝 +
+
公众号推送、朋友圈广告
+
+
+
+ 微博 + 30万粉丝 +
+
#绿色出行看长三角#
+
+
+
+ 抖音/快手 + 80万粉丝 +
+
短视频、直播互动
+
+
+
+ + +
+
+
+ + + +
+

数字广告

+
+
+
+ 搜索引擎SEM + 200万预算 +
+
+ 信息流广告 + 150万预算 +
+
+ 垂直媒体 + 100万预算 +
+
+
+ + +
+
+
+ + + + +
+

邮件营销

+
+
+
+
+
10万+
+
数据库联系人
+
+
+
2期/月
+
发送频次
+
+
+
+
    +
  • • 展商推介
  • +
  • • 活动预告
  • +
  • • 行业资讯
  • +
+
+ + +
+
+
+ + + +
+

直播营销

+
+
+
+
+ 展前预热直播:5场 +
+
+
+ 展期现场直播:全程 +
+
+
+ 专家访谈:20场 +
+
+
+ + +
+
+
+ + + +
+

KOL合作

+
+
+
+
50+
+
汽车领域KOL
+
+
+
+
探店视频
+
30个
+
+
+
测评内容
+
50篇
+
+
+
+
+
+ + +
+

线上推广预期效果

+
+
+
1亿+
+
总曝光量
+
+
+
500万+
+
互动量
+
+
+
10万+
+
注册用户
+
+
+
85%
+
转化率
+
+
+
+
+
+ + +
+
+

线下推广方案

+ +
+ +
+

传统媒体投放

+
+
+
+
+ + + +
+
+

平面媒体

+

行业杂志、报纸广告

+
+
+
    +
  • • 《中国汽车报》整版广告 x 3期
  • +
  • • 《汽车之家》杂志封面广告
  • +
  • • 《新能源汽车》专题报道
  • +
+
+ +
+
+
+ + + +
+
+

广播电台

+

交通广播黄金时段

+
+
+
    +
  • • 上海交通广播早晚高峰广告
  • +
  • • 专题访谈节目3期
  • +
  • • 路况播报植入
  • +
+
+ +
+
+
+ + + +
+
+

行业活动

+

参展推广、论坛宣传

+
+
+
    +
  • • 北京车展展位推广
  • +
  • • 广州车展路演活动
  • +
  • • 行业峰会主题演讲
  • +
+
+
+
+ + +
+

户外广告投放

+
+
+
+
50块
+
LED大屏广告
+
核心商圈覆盖
+
+
+
200个
+
地铁灯箱
+
2/10/17号线
+
+
+
30块
+
高速广告牌
+
沪宁、沪杭高速
+
+
+
100辆
+
公交车身
+
主要线路
+
+
+ +
+

投放策略

+
+
+
+ 展前3个月开始投放 +
+
+
+ 重点覆盖长三角核心城市 +
+
+
+ 高频次、多触点接触 +
+
+
+
+
+
+
+
+ + +
+
+

精准邀请方案

+ +
+ +
+
+

专业观众邀请体系

+
+
+
+
+
+ + + +
+

呼叫中心

+

20人专业团队

+

日均呼叫1000+

+
+
+
+ + + +
+

一对一邀请

+

VIP客户定制

+

500+重点客户

+
+
+
+ + + +
+

团体邀请

+

协会组织参观

+

50+团体

+
+
+
+
+ + +
+

买家匹配服务

+
+
+

会前

+
    +
  • • 在线预约系统
  • +
  • • AI智能匹配
  • +
  • • 需求精准对接
  • +
+
+
+

展中

+
    +
  • • 商务洽谈区
  • +
  • • 专场对接会
  • +
  • • 现场撮合服务
  • +
+
+
+

展后

+
    +
  • • 持续跟进
  • +
  • • 促成交易
  • +
  • • 效果评估
  • +
+
+
+
+
+
+
+ + +
+
+

营销预算分配

+ +
+
+
+
+
+
+ 线上推广 + 80万 +
+
+
+
+
+
+ +
+
+
+ 线下推广 + 60万 +
+
+
+
+
+
+ +
+
+
+ 媒体合作 + 40万 +
+
+
+
+
+
+ +
+
+
+ 精准邀请 + 20万 +
+
+
+
+
+
+
+ +
+
总预算:200万元
+
预期ROI:500%
+
+
+
+
+
+ + +
+
+

全方位营销,确保展会成功

+

了解现场运营方案,体验展会精彩

+ + 查看现场运营 → + +
+
+ + +
+
+
+

© 2024 长三角国际新能源汽车与智能交通产业博览会. All rights reserved.

+
+
+
+ + \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/pages/operation.html b/web_frontend/exhibition-demo/public/web_result/pages/operation.html new file mode 100644 index 00000000..20725b9a --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/pages/operation.html @@ -0,0 +1,1417 @@ + + + + + + 现场运营 - 2024长三角国际新能源汽车展 + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+
+ +
+
+

+ + 现场运营方案 +

+

+ 智能化管理 · 专业化服务 · 数字化体验 +

+
+
+ + 预计接待: 10万+ 专业观众 +
+
+ + 展馆面积: 50,000㎡ +
+
+ + 服务团队: 500+ 专业人员 +
+
+
+
+
+ + +
+ +
+ +
+
+

+ + 智能展馆布局规划 +

+

基于人流动线设计的科学布局

+
+ + +
+
+ +
+
+
+

+ + A馆 - 旗舰整车展示区 +

+ + 20,000㎡ + +
+ +
+
+

特斯拉专区

+

Model S/3/X/Y全系展示

+

展位: A01-A10

+
+
+

比亚迪专区

+

王朝/海洋系列

+

展位: A11-A20

+
+
+

蔚来专区

+

ET7/ES8/EC6展示

+

展位: A21-A30

+
+
+

理想专区

+

L9/L8/L7全系

+

展位: A31-A40

+
+
+ +
+
+ + 容纳人数: 5000人 +
+
+ + 5G全覆盖 +
+
+
+
+ + +
+
+

+ + B馆 - 核心零部件 +

+ + 15,000㎡ + + +
+
+

+ + 动力电池展区 +

+

宁德时代、比亚迪刀片电池

+
+
+

+ + 驱动电机展区 +

+

精进电动、汇川技术

+
+
+

+ + 电控系统展区 +

+

华为、英飞凌、比亚迪半导体

+
+
+
+
+ + +
+
+

+ + C馆 - 智能交通 +

+ + 10,000㎡ + + +
+
+

+ + V2X通信展示 +

+

车路协同解决方案

+
+
+

+ + 智慧路网系统 +

+

智能交通管理平台

+
+
+

+ + 自动驾驶技术 +

+

L4级自动驾驶演示

+
+
+
+
+
+ + +
+
+
+

+ + 室外体验区 +

+ + 5,000㎡ + +
+
+ + 试乘试驾专业赛道 +
+
+ + 自动泊车演示区 +
+
+ + 超充站体验区 +
+
+
+
+ +
+
+

+ + 配套服务区 +

+
+
+ +

咖啡厅

+
+
+ +

餐饮区

+
+
+ +

休息区

+
+
+ +

纪念品店

+
+
+
+
+ +
+
+

+ + 商务中心 +

+
+
+ VIP会议室 + 10间 +
+
+ 洽谈区 + 50位 +
+
+ 商务服务 + 24h +
+
+
+
+
+
+ + +
+

+ + 智能导览系统 +

+ +
+
+
+ +
+

AR实景导航

+

手机扫码即可获得增强现实导航

+
+
+ + 精准定位展位 +
+
+ + 3D路径指引 +
+
+
+ +
+
+ +
+

AI智能推荐

+

根据兴趣智能规划参观路线

+
+
+ + 个性化推荐 +
+
+ + 最优路径规划 +
+
+
+ +
+
+ +
+

实时热力图

+

显示各展区实时人流密度

+
+
+ + 避开拥挤区域 +
+
+ + 预估等待时间 +
+
+
+ +
+
+ +
+

多语言服务

+

支持8种语言实时翻译

+
+
+ + 语音导览 +
+
+ + 实时翻译 +
+
+
+
+
+ + +
+

+ + 科学参观动线设计 +

+ +
+
+

主要参观路线

+
+
+
+ 1 +
+
+
主入口 - 形象展示区
+

LED巨幕欢迎墙、展会主题展示

+
+ + 预计停留: 5-10分钟 +
+
+
+ +
+
+ 2 +
+
+
A馆 - 整车展示
+

品牌旗舰车型、新品发布区

+
+ + 预计停留: 60-90分钟 +
+
+
+ +
+
+ 3 +
+
+
B馆 - 核心技术
+

三电系统、智能座舱体验

+
+ + 预计停留: 45-60分钟 +
+
+
+ +
+
+ 4 +
+
+
室外 - 互动体验
+

试乘试驾、充电演示

+
+ + 预计停留: 30-45分钟 +
+
+
+
+
+ +
+

专业观众路线

+
+
+
+
+ + VIP快速通道 +
+

专属入口、快速登记、专人接待

+
+ +
+
+ + 商务洽谈路线 +
+

直达商务中心、预约制参观、一对一对接

+
+ +
+
+ + 技术交流路线 +
+

技术论坛、专家讲座、研发展示

+
+ +
+
+ + 媒体采访路线 +
+

新闻中心、采访间、直播区

+
+
+
+
+
+
+
+
+ + +
+ +
+
+
+
+ +
+
+

+ + Duoduo Agent 智能设计系统 +

+

从想法到展位概念的完整可视化流程

+

让学生直接体验AI驱动的设计革新,快速实现创意落地

+
+ + +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+ +
+
+
+

+ 1 + CAD设计图 +

+

精确的工程制图

+
+
+
+ CAD设计图 +
+
+

AutoCAD 2024

+

精度: 0.1mm

+
+
+
+
+
+
+ 2小时 + 已完成 +
+
+
+
+ + +
+
+
+

+ 2 + 概念设计图 +

+

创意概念可视化

+
+
+
+ 概念设计图 +
+
+

Adobe Illustrator

+

矢量设计

+
+
+
+
+
+
+ 3小时 + 已完成 +
+
+
+
+ + +
+
+
+

+ 3 + 三维建模白模 +

+

空间结构展示

+
+
+
+ 三维建模白模 +
+
+

SketchUp Pro

+

多边形: 128K

+
+
+
+
+
+
+ 4小时 + 已完成 +
+
+
+
+ + +
+
+
+

+ 4 + 三维渲染图 +

+

真实感材质渲染

+
+
+
+ 三维渲染图 +
+
+

V-Ray Next

+

4K渲染

+
+
+
+
+
+
+ 6小时 + 已完成 +
+
+
+
+ + +
+
+
+

+ 5 + 展位概念设计 +

+

最终展示方案

+
+
+
+ 展位概念设计图 +
+
+

Final Design

+

Ready to Build

+
+
+
+ + 最终方案 + +
+
+
+
+
+ 总计: 20小时 + 已交付 +
+
+
+
+
+
+ + +
+
+
+
+ +
+
+

AI智能生成

+

基于需求自动设计

+
+
+
    +
  • 自动识别设计需求
  • +
  • 智能优化空间布局
  • +
  • 实时渲染预览效果
  • +
+
+ +
+
+
+ +
+
+

效率提升90%

+

传统流程需要2周

+
+
+
    +
  • 20小时完成全流程
  • +
  • 无需专业设计背景
  • +
  • 一键导出施工图纸
  • +
+
+ +
+
+
+ +
+
+

学生即可上手

+

零基础快速掌握

+
+
+
    +
  • 可视化操作界面
  • +
  • 智能设计建议
  • +
  • 实时协作功能
  • +
+
+
+ + +
+

+ + 支持团队协作 · 云端存储 · 版本管理 +

+
+
+
+
+ + +
+
+
+
+
+ +
+
+

+ + 数字化服务体系 +

+

全方位智能化服务保障

+
+ +
+ +
+
+ +
+

智能登记系统

+
    +
  • + + 人脸识别快速入场 +
  • +
  • + + 电子证件一键生成 +
  • +
  • + + 实时数据统计分析 +
  • +
  • + + VIP专属快速通道 +
  • +
+
+
< 30秒
+
平均登记时间
+
+
+ + +
+
+ +
+

AI服务机器人

+
    +
  • + + 多语言智能问答 +
  • +
  • + + 展位导航引领 +
  • +
  • + + 活动信息推送 +
  • +
  • + + 紧急事件处理 +
  • +
+
+
50+
+
服务机器人数量
+
+
+ + +
+
+ +
+

云端数据中心

+
    +
  • + + 实时客流监控 +
  • +
  • + + 大数据分析报告 +
  • +
  • + + 智能预警系统 +
  • +
  • + + 展商数据服务 +
  • +
+
+
24/7
+
全天候监控
+
+
+ + +
+
+ +
+

智慧安防系统

+
    +
  • + + AI视频监控分析 +
  • +
  • + + 异常行为识别 +
  • +
  • + + 应急响应联动 +
  • +
  • + + 密度预警管控 +
  • +
+
+
1000+
+
监控点位
+
+
+
+
+
+ + +
+
+ +
+
+

+ + 精彩活动安排 +

+

四天展期,精彩不断

+
+ + +
+
+
+

+ + 盛大开幕典礼 +

+

9月12日 09:00-10:30 | 主会场

+
+ +
+
+

+ + 领导致辞 +

+
    +
  • • 工信部领导致辞
  • +
  • • 长三角城市群代表发言
  • +
  • • 行业协会主席讲话
  • +
+
+ +
+

+ + 启动仪式 +

+
    +
  • • 展会正式启动
  • +
  • • 战略合作签约
  • +
  • • 新品全球首发
  • +
+
+ +
+

+ + 媒体直播 +

+
    +
  • • 央视新闻直播
  • +
  • • 50+主流媒体报道
  • +
  • • 全网同步直播
  • +
+
+
+
+
+ + +
+

+ + 高峰论坛日程 +

+ +
+ +
+
+
+

第一天 - 9月12日

+ + 产业发展日 + +
+ +
+
+
+
新能源汽车产业发展论坛
+ 10:00-12:00 +
+

主题:双碳目标下的产业机遇

+
+ + 预计参会: 500人 +
+
+ +
+
+
动力电池技术创新峰会
+ 14:00-16:00 +
+

主题:固态电池商业化进程

+
+ + 预计参会: 300人 +
+
+ +
+
+
智能座舱体验设计论坛
+ 16:30-18:00 +
+

主题:人机交互的未来趋势

+
+ + 预计参会: 200人 +
+
+
+
+
+ + +
+
+
+

第二天 - 9月13日

+ + 技术创新日 + +
+ +
+
+
+
自动驾驶技术峰会
+ 09:00-11:00 +
+

主题:L4级自动驾驶落地实践

+
+ + 预计参会: 400人 +
+
+ +
+
+
充换电基础设施研讨会
+ 14:00-16:00 +
+

主题:超充网络建设与运营

+
+ + 预计参会: 350人 +
+
+ +
+
+
车联网安全技术论坛
+ 16:30-18:00 +
+

主题:智能汽车信息安全挑战

+
+ + 预计参会: 250人 +
+
+
+
+
+
+
+
+
+ + +
+
+
+

+ + 全方位服务保障 +

+

专业团队,贴心服务

+
+ + +
+

服务承诺标准

+ +
+
+
< 3
+
分钟
+
平均排队时间
+
+ +
+
< 5
+
分钟
+
问题响应时间
+
+ +
+
100%
+
覆盖
+
WiFi信号覆盖
+
+ +
+
95%+
+
满意度
+
服务满意目标
+
+
+
+ + +
+
+
+
+ +
+

客服团队

+
+
    +
  • + + 专业客服人员200+ +
  • +
  • + + 8种语言服务支持 +
  • +
  • + + 24小时服务热线 +
  • +
  • + + 现场问题即时处理 +
  • +
+
+ +
+
+
+ +
+

安保团队

+
+
    +
  • + + 专业安保人员300+ +
  • +
  • + + AI智能监控系统 +
  • +
  • + + 应急响应3分钟内 +
  • +
  • + + 全场无死角覆盖 +
  • +
+
+ +
+
+
+ +
+

医疗团队

+
+
    +
  • + + 医护人员50+ +
  • +
  • + + 8个医疗服务点 +
  • +
  • + + 救护车现场待命 +
  • +
  • + + AED设备全覆盖 +
  • +
+
+
+
+
+ + +
+
+
+
+
+ +
+

专业运营,保障展会成功

+

了解展会预算规划与投资回报分析

+ + + 查看预算分析 + +
+
+ + +
+
+
+

© 2024 长三角国际新能源汽车与智能交通产业博览会. All rights reserved.

+
+
+
+ + + + + \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/pages/overview.html b/web_frontend/exhibition-demo/public/web_result/pages/overview.html new file mode 100644 index 00000000..039c85fb --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/pages/overview.html @@ -0,0 +1,523 @@ + + + + + + 策划概述 - 2024长三角国际新能源汽车展 + + + + + + + + + + + + +
+
+ 博览会背景 +
+
+
+
+ +
+
+
+ + 全方位展会规划 +
+

+ 策划概述 +

+

+ + 全面了解展会策划背景、目标与核心价值,打造长三角地区最具影响力的新能源汽车产业盛会 + +

+
+
+
+ + +
+
+
+
+
+ +
3000+
+
产业链企业
+
+
+
+
+ +
8000亿
+
2023年产值
+
+
+
+
+ +
900万+
+
年产销量
+
+
+
+
+ +
40%
+
全国占比
+
+
+
+
+
+ + +
+
+
+
+

+ 策划背景 +

+
+

+ 在全球碳中和目标的大背景下,新能源汽车产业正经历前所未有的发展机遇。中国作为全球最大的新能源汽车市场,2023年产销量均突破900万辆,同比增长超过35%。 +

+

+ 长三角地区作为中国经济最发达、创新能力最强的区域之一,在新能源汽车产业发展中占据举足轻重的地位。该地区聚集了特斯拉、上汽、蔚来、理想、小鹏等众多知名车企,以及宁德时代、华为等核心零部件供应商。 +

+
+

核心数据:

+
    +
  • • 长三角新能源汽车产量占全国40%以上
  • +
  • • 区域内新能源汽车产业链企业超过3000家
  • +
  • • 2023年产值突破8000亿元
  • +
  • • 智能网联汽车测试里程超过500万公里
  • +
+
+
+
+
+
+
+

+ 产业发展机遇 +

+
+
+
1
+
+

政策支持力度空前

+

国家及地方政府出台多项扶持政策,推动产业快速发展

+
+
+
+
2
+
+

技术创新加速突破

+

电池技术、自动驾驶、车联网等关键技术不断革新

+
+
+
+
3
+
+

市场需求持续增长

+

消费者对新能源汽车接受度不断提高,市场潜力巨大

+
+
+
+
4
+
+

产业链日趋完善

+

从研发到制造,从销售到服务,产业生态系统不断成熟

+
+
+
+
+
+
+
+
+ + +
+
+ 展馆布置 +
+
+

+ 策划目标 +

+

明确的目标引领,打造专业高效的展会平台

+
+
+
+ +
+

品牌建设

+

打造长三角地区新能源汽车与智能交通领域第一展会品牌,成为行业风向标

+
+
    +
  • • 品牌知名度提升50%
  • +
  • • 媒体曝光量超1亿次
  • +
  • • 行业认可度达90%
  • +
+
+
+ +
+
+ +
+

商业价值

+

吸引300家优质展商参展,促进产业链上下游合作,实现商业价值最大化

+
+
    +
  • • 现场成交额超10亿元
  • +
  • • 意向订单8亿元
  • +
  • • 投资回报率33.3%
  • +
+
+
+ +
+
+ +
+

行业推动

+

促进技术创新和产业升级,推动新能源汽车产业高质量发展

+
+
    +
  • • 发布行业白皮书2份
  • +
  • • 专业论坛20场
  • +
  • • 技术成果发布50项
  • +
+
+
+ +
+
+ +
+

社会责任

+

推广绿色出行理念,助力碳中和目标实现,促进可持续发展

+
+
    +
  • • 碳减排宣传覆盖10万人
  • +
  • • 绿色出行体验5万人次
  • +
  • • 环保倡议签名3万人
  • +
+
+
+
+
+
+ + +
+
+

政策依据

+
+
+
+
+
+

《新能源汽车产业发展规划(2021-2035年)》

+

国务院办公厅发布,明确了新能源汽车产业发展的指导思想、基本原则和发展愿景。

+
+

+ 核心目标:到2025年,新能源汽车新车销售量达到汽车新车销售总量的20%左右;到2035年,纯电动汽车成为新销售车辆的主流。 +

+
+
+
+ +
+
+
+

《上海市加快新能源汽车产业发展实施计划》

+

上海市人民政府印发,提出打造国际新能源汽车发展高地的具体措施。

+
+

+ 发展目标:到2025年,上海新能源汽车年产量超过120万辆,产值突破3500亿元,打造3-5家具有国际竞争力的整车企业。 +

+
+
+
+ +
+
+
+

《长三角地区新能源汽车产业链协同发展规划》

+

长三角一体化示范区执委会发布,推动区域产业协同发展。

+
+

+ 协同重点:建立跨区域产业协作机制,共建新能源汽车产业创新平台,推动充电基础设施互联互通。 +

+
+
+
+ +
+
+
+

《智能网联汽车道路测试与示范应用管理规范》

+

工业和信息化部、公安部、交通运输部联合发布,规范智能网联汽车测试与应用。

+
+

+ 示范应用:在长三角地区建设5个国家级智能网联汽车测试示范区,累计开放测试道路超过1000公里。 +

+
+
+
+
+
+
+
+ + +
+
+
+
+

+ 市场分析 +

+

深入洞察产业发展趋势,精准把握市场机遇

+
+
+

+ 市场规模 +

+
+
+ 2023年销量 + 949.5万辆 +
+
+ 同比增长 + +37.9% +
+
+ 市场渗透率 + 31.6% +
+
+ 2025年预测 + 1500万辆 +
+
+
+ +
+

+ 产业链分布 +

+
+
+
整车制造
+
+
+
+ 85家 +
+
+
电池电机
+
+
+
+ 156家 +
+
+
智能网联
+
+
+
+ 234家 +
+
+
充电设施
+
+
+
+ 189家 +
+
+
+ +
+

+ 展会需求调研 +

+
+
+
+ 有参展意向 + 89% +
+
+
+
+
+
+
+ 需要B2B对接 + 76% +
+
+
+
+
+
+
+ 关注技术交流 + 82% +
+
+
+
+
+
+
+
+
+
+ + +
+
+

了解更多展会详情

+

深入了解展会规划、参展范围和预期效果

+ + 查看展会介绍 → + +
+
+ + +
+
+
+

© 2024 长三角国际新能源汽车与智能交通产业博览会. All rights reserved.

+
+
+
+ + \ No newline at end of file diff --git a/web_frontend/exhibition-demo/public/web_result/pages/risk.html b/web_frontend/exhibition-demo/public/web_result/pages/risk.html new file mode 100644 index 00000000..1e032acf --- /dev/null +++ b/web_frontend/exhibition-demo/public/web_result/pages/risk.html @@ -0,0 +1,1076 @@ + + + + + + 风险评估 - 2024长三角国际新能源汽车展 + + + + + + + + + +
+
+
+
+
+
+ +
+
+

+ 智能风险管控中心 +

+

+ AI驱动 · 实时监控 · 预警防范 · 应急响应 +

+
+
+
18
+
风险监测点
+
+
+
95%
+
防控覆盖率
+
+
+
24/7
+
实时监控
+
+
+
+
+ + +
+
+
+

+ 风险态势总览 +

+

实时监测 · 动态评估 · 智能预警

+
+ + +
+ +
+ +

高风险事项

+
2
+
+
+ 疫情防控风险 +
+
+ 极端天气风险 +
+
+
+
+
+
+ + +
+
+ +
+

中风险事项

+
5
+
+
+ 人流控制风险 +
+
+ 技术故障风险 +
+
+ 物流延误风险 +
+
+
+
+
+
+ + +
+
+ +
+

低风险事项

+
11
+
+
+ 停车管理风险 +
+
+ 餐饮服务风险 +
+
+ 网络服务风险 +
+
+
+
+
+
+
+ + +
+

风险雷达监测

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
73%
+
安全指数
+
+
+
+ + +
+
+
+ +
+
+

安全风险

+
+
+
+
+ 30% +
+
+
+ +
+
+ +
+
+

财务风险

+
+
+
+
+ 20% +
+
+
+ +
+
+ +
+
+

运营风险

+
+
+
+
+ 25% +
+
+
+ +
+
+ +
+
+

合规风险

+
+
+
+
+ 10% +
+
+
+
+
+
+
+
+ + +
+
+
+

重点风险详细分析

+ + +
+

+ 高优先级风险 +

+ +
+ +
+
+
+

疫情防控风险

+

发生概率: 中 | 影响程度: 高

+
+
+ 高风险 +
+
+ +
+
风险描述
+

大规模人员聚集可能导致疫情传播风险,影响展会正常举办

+
+ +
+
防控措施
+
    +
  • + + 实施健康码、行程码、核酸检测三重验证 +
  • +
  • + + 配备充足防疫物资,设置临时隔离区 +
  • +
  • + + 限流措施,控制场内人数密度 +
  • +
  • + + 建立应急响应机制,与卫生部门联动 +
  • +
+
+ +
+
+ + 负责人: 安全管理部 +
+ +
+
+ + +
+
+
+

极端天气风险

+

发生概率: 低 | 影响程度: 高

+
+
+ 高风险 +
+
+ +
+
风险描述
+

台风、暴雨等极端天气可能影响展会安全和正常运营

+
+ +
+
防控措施
+
    +
  • + + 建立气象监测预警系统,提前72小时预警 +
  • +
  • + + 制定极端天气应急预案和疏散方案 +
  • +
  • + + 购买展会取消保险,降低经济损失 +
  • +
  • + + 加固室外展区设施,做好防风防雨措施 +
  • +
+
+ +
+
+ + 负责人: 应急管理部 +
+ +
+
+
+
+ + +
+

+ 中优先级风险 +

+ +
+ +
+
+
+ +
+

人流控制风险

+
+

高峰期人流量超出预期,可能造成拥挤踩踏

+
+
+ + 智能人流监测系统 +
+
+ + 分时预约入场机制 +
+
+ + 应急疏散通道规划 +
+
+
+ + +
+
+
+ +
+

技术故障风险

+
+

电力、网络、设备故障影响展会正常运行

+
+
+ + 双路供电保障 +
+
+ + 备用发电机组 +
+
+ + 技术支持7×24小时 +
+
+
+ + +
+
+
+ +
+

物流延误风险

+
+

展品运输延误影响布展进度

+
+
+ + 提前3天进场布展 +
+
+ + 多家物流商备选 +
+
+ + 实时追踪系统 +
+
+
+
+
+
+
+
+ + +
+
+

应急响应体系

+ + +
+
+
+ IV +
+

四级响应

+

常规事件

+

现场处理

+
+ +
+
+ III +
+

三级响应

+

一般事件

+

部门协调

+
+ +
+
+ II +
+

二级响应

+

重大事件

+

指挥部介入

+
+ +
+
+ I +
+

一级响应

+

特大事件

+

全面启动

+
+
+ + +
+

+ 应急指挥中心 +

+ +
+ +
+

指挥架构

+
+
+
总指挥
+
展会执行总监
+
+
+
副总指挥
+
安全总监、运营总监
+
+
+
执行小组
+
各部门负责人
+
+
+
+ + +
+

响应时限

+
+
+ 一级响应 + 5分钟 +
+
+ 二级响应 + 10分钟 +
+
+ 三级响应 + 30分钟 +
+
+ 四级响应 + 60分钟 +
+
+
+ + +
+

应急热线

+
+
+
+ +
+
紧急救援
+
120 / 119
+
+
+
+
+
+ +
+
安保中心
+
400-888-8888
+
+
+
+
+
+ +
+
技术支持
+
400-666-6666
+
+
+
+
+
+
+
+
+
+ + +
+
+

风险防控措施

+ +
+ +
+
+ +
+

事前预防

+
    +
  • 风险识别评估
  • +
  • 预案制定演练
  • +
  • 人员培训教育
  • +
  • 设施安全检查
  • +
+
+ + +
+
+ +
+

事中监控

+
    +
  • 实时监测预警
  • +
  • 动态风险评估
  • +
  • 应急快速响应
  • +
  • 信息及时发布
  • +
+
+ + +
+
+ +
+

应急处置

+
    +
  • 启动应急预案
  • +
  • 现场紧急处置
  • +
  • 人员疏散救援
  • +
  • 舆情管控引导
  • +
+
+ + +
+
+ +
+

事后恢复

+
    +
  • 损失评估统计
  • +
  • 保险理赔处理
  • +
  • 经验总结改进
  • +
  • 预案优化更新
  • +
+
+
+
+
+ + +
+
+

保险保障方案

+ +
+
+ +
+

投保险种

+
+
+
+

展会取消险

+ 核心 +
+

覆盖因不可抗力导致的展会取消损失

+
+ 保额 + ¥500万 +
+
+ +
+
+

公众责任险

+ 重要 +
+

覆盖展会期间第三方人身财产损失

+
+ 保额 + ¥1000万 +
+
+ +
+
+

财产综合险

+ 补充 +
+

覆盖展品、设备等财产损失

+
+ 保额 + ¥300万 +
+
+
+
+ + +
+

保障范围

+
+
+
+

+ 人员保障 +

+
    +
  • • 参展人员意外伤害
  • +
  • • 工作人员人身保险
  • +
  • • 第三方人身损害赔偿
  • +
+
+ +
+

+ 财产保障 +

+
    +
  • • 展品损失赔偿
  • +
  • • 设备设施损坏
  • +
  • • 装修材料损失
  • +
+
+ +
+

+ 责任保障 +

+
    +
  • • 第三方责任赔偿
  • +
  • • 法律诉讼费用
  • +
  • • 紧急救援费用
  • +
+
+
+ +
+
+
+

总保费

+

¥15万

+
+
+

最高赔付

+

¥1800万

+
+
+
+
+
+
+
+
+
+ + +
+
+

全方位风险保障

+

构建"预防-监控-响应-恢复"四位一体风险管理体系

+ +
+
+
18个
+
风险监测点
+
+
+
24/7
+
全天候监控
+
+
+
5分钟
+
应急响应
+
+
+
¥1800万
+
保险保障
+
+
+ + +
+
+ + +
+
+
+

© 2024 长三角国际新能源汽车与智能交通产业博览会. All rights reserved.

+

Powered by AI Risk Management System

+
+
+
+ + + + \ No newline at end of file diff --git a/web_frontend/exhibition-demo/src/components/ResultModal.tsx b/web_frontend/exhibition-demo/src/components/ResultModal.tsx index 34aa24d5..178f6f6c 100644 --- a/web_frontend/exhibition-demo/src/components/ResultModal.tsx +++ b/web_frontend/exhibition-demo/src/components/ResultModal.tsx @@ -141,15 +141,13 @@ const ResultModal: React.FC = ({ isOpen, onClose, onViewDetail {/* 操作按钮 */}
- window.open('http://localhost:4155', '_blank')} className="flex-1 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-xl font-medium hover:shadow-lg transform hover:scale-105 transition-all flex items-center justify-center gap-2" > 查看详细方案 - +