From 5bbe57d56b1ac34d994e2ceae7b15958a281cebc Mon Sep 17 00:00:00 2001 From: "mula.liu" Date: Tue, 2 Dec 2025 18:54:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E9=A1=B5=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 22 + .env.production | 7 + .gitignore | 29 + DEPLOYMENT.md | 251 ++++++ README.md | 1459 +++++++++++++++++++++++++++++++ design.png | Bin 0 -> 223265 bytes index.html | 13 + package.json | 25 + src/App.jsx | 39 + src/components/Header.css | 128 +++ src/components/Header.jsx | 49 ++ src/components/Toast.css | 105 +++ src/components/Toast.jsx | 38 + src/main.jsx | 9 + src/pages/Home/Home.css | 473 ++++++++++ src/pages/Home/Home.jsx | 242 +++++ src/pages/Login/Login.css | 128 +++ src/pages/Login/Login.jsx | 122 +++ src/pages/Meetings/Meetings.css | 628 +++++++++++++ src/pages/Meetings/Meetings.jsx | 410 +++++++++ src/pages/Record/Record.css | 507 +++++++++++ src/pages/Record/Record.jsx | 376 ++++++++ src/services/api.js | 54 ++ src/services/audio.js | 44 + src/services/auth.js | 54 ++ src/services/meeting.js | 29 + src/styles/global.css | 46 + vite.config.js | 16 + yarn.lock | 921 +++++++++++++++++++ 29 files changed, 6224 insertions(+) create mode 100644 .env.example create mode 100644 .env.production create mode 100644 .gitignore create mode 100644 DEPLOYMENT.md create mode 100644 README.md create mode 100644 design.png create mode 100644 index.html create mode 100644 package.json create mode 100644 src/App.jsx create mode 100644 src/components/Header.css create mode 100644 src/components/Header.jsx create mode 100644 src/components/Toast.css create mode 100644 src/components/Toast.jsx create mode 100644 src/main.jsx create mode 100644 src/pages/Home/Home.css create mode 100644 src/pages/Home/Home.jsx create mode 100644 src/pages/Login/Login.css create mode 100644 src/pages/Login/Login.jsx create mode 100644 src/pages/Meetings/Meetings.css create mode 100644 src/pages/Meetings/Meetings.jsx create mode 100644 src/pages/Record/Record.css create mode 100644 src/pages/Record/Record.jsx create mode 100644 src/services/api.js create mode 100644 src/services/audio.js create mode 100644 src/services/auth.js create mode 100644 src/services/meeting.js create mode 100644 src/styles/global.css create mode 100644 vite.config.js create mode 100644 yarn.lock diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0fcf912 --- /dev/null +++ b/.env.example @@ -0,0 +1,22 @@ +# API 后端地址配置示例 +# 开发环境可以使用代理(vite.config.js中配置),或直接指定后端地址 + +# 后端 API 地址(不需要 /api 后缀,会自动添加) +VITE_API_BASE_URL=http://localhost:8000/api + +# 录音配置 +# 分片上传间隔(毫秒),默认10000(10秒) +VITE_AUDIO_CHUNK_INTERVAL=10000 + +# 其他示例: +# 生产环境 +# VITE_API_BASE_URL=https://api.yourserver.com/api + +# 其他服务器 +# VITE_API_BASE_URL=http://192.168.1.100:8000/api + +# 更频繁的上传(5秒) +# VITE_AUDIO_CHUNK_INTERVAL=5000 + +# 更长的上传间隔(30秒) +# VITE_AUDIO_CHUNK_INTERVAL=30000 diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..6b3990d --- /dev/null +++ b/.env.production @@ -0,0 +1,7 @@ +# 生产环境配置 +# 后端 API 地址(部署时请修改为实际的后端地址) +VITE_API_BASE_URL=http://api.imeeting.unisspace.com/api + +# 录音配置 +# 分片上传间隔(毫秒),默认10000(10秒) +VITE_AUDIO_CHUNK_INTERVAL=10000 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2d1f044 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Environment variables +.env +.env.local +.env.*.local diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..a7daab7 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,251 @@ +# iMeeting Client 部署指南 + +## 前后端分离部署说明 + +iMeeting Client 是一个独立的前端应用,可以部署到任何静态文件服务器,与后端服务器完全分离。 + +## 配置后端地址 + +### 1. 环境变量配置 + +前端通过环境变量 `VITE_API_BASE_URL` 配置后端API地址。 + +**开发环境** (`.env`): +```bash +VITE_API_BASE_URL=http://localhost:8000/api +``` + +**生产环境** (`.env.production`): +```bash +VITE_API_BASE_URL=https://your-backend-server.com/api +``` + +### 2. 配置文件说明 + +- `.env` - 本地开发环境配置(不提交到git) +- `.env.production` - 生产环境配置(需要修改为实际后端地址) +- `.env.example` - 配置示例文件(提交到git供参考) + +## 部署方案 + +### 方案一:同一服务器不同端口 + +**后端**: `http://your-server.com:8000` +**前端**: `http://your-server.com:3002` + +修改 `.env.production`: +```bash +VITE_API_BASE_URL=http://your-server.com:8000/api +``` + +### 方案二:不同服务器 + +**后端**: `http://backend-server.com:8000` +**前端**: `http://frontend-server.com` + +修改 `.env.production`: +```bash +VITE_API_BASE_URL=http://backend-server.com:8000/api +``` + +### 方案三:使用域名(推荐) + +**后端**: `https://api.yourdomain.com` +**前端**: `https://meeting.yourdomain.com` + +修改 `.env.production`: +```bash +VITE_API_BASE_URL=https://api.yourdomain.com/api +``` + +## 构建和部署步骤 + +### 1. 修改生产环境配置 + +编辑 `.env.production` 文件,设置正确的后端地址: +```bash +VITE_API_BASE_URL=https://your-actual-backend.com/api +``` + +### 2. 安装依赖 + +```bash +npm install +# 或 +yarn install +``` + +### 3. 构建生产版本 + +```bash +npm run build +# 或 +yarn build +``` + +构建完成后,会在 `dist` 目录生成静态文件。 + +### 4. 部署静态文件 + +将 `dist` 目录部署到任何静态文件服务器: + +#### 使用 Nginx +```nginx +server { + listen 80; + server_name your-frontend-domain.com; + + root /path/to/imeeting/client/dist; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + # 如果需要CORS(跨域),添加以下配置 + # location /api { + # proxy_pass http://your-backend-server:8000; + # proxy_set_header Host $host; + # proxy_set_header X-Real-IP $remote_addr; + # } +} +``` + +#### 使用 Apache +```apache + + ServerName your-frontend-domain.com + DocumentRoot /path/to/imeeting/client/dist + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + # 支持SPA路由 + RewriteEngine On + RewriteBase / + RewriteRule ^index\.html$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.html [L] + + +``` + +#### 使用 Node.js (serve) +```bash +npm install -g serve +serve -s dist -p 3002 +``` + +#### 使用 Docker +创建 `Dockerfile`: +```dockerfile +FROM nginx:alpine + +# 复制构建产物 +COPY dist /usr/share/nginx/html + +# 复制nginx配置(支持SPA路由) +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] +``` + +创建 `nginx.conf`: +```nginx +server { + listen 80; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } +} +``` + +构建和运行: +```bash +docker build -t imeeting-client . +docker run -d -p 3002:80 imeeting-client +``` + +## CORS 跨域配置 + +如果前后端部署在不同域名,需要在**后端**配置CORS: + +**FastAPI 后端** (`main.py`): +```python +from fastapi.middleware.cors import CORSMiddleware + +app.add_middleware( + CORSMiddleware, + allow_origins=[ + "http://your-frontend-domain.com", + "https://your-frontend-domain.com" + ], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) +``` + +## 环境变量优先级 + +1. `.env.production` - 生产环境(`npm run build` 时使用) +2. `.env` - 本地开发环境(`npm run dev` 时使用) +3. 默认值 - `/api`(如果未配置环境变量,则使用相对路径) + +## 验证部署 + +1. 访问前端地址,检查页面是否正常加载 +2. 打开浏览器开发者工具 - Network +3. 尝试登录,查看API请求是否指向正确的后端地址 +4. 检查是否有CORS错误 + +## 常见问题 + +### 1. API请求404 +检查 `.env.production` 中的地址是否正确,包括端口号和路径。 + +### 2. CORS错误 +在后端添加CORS中间件,允许前端域名。 + +### 3. 刷新页面404 +配置服务器(Nginx/Apache)支持SPA路由,将所有请求重定向到 `index.html`。 + +### 4. 环境变量未生效 +- 重新构建:删除 `dist` 目录后重新 `npm run build` +- 确认环境变量名以 `VITE_` 开头 +- 重启开发服务器(开发环境) + +## 生产环境检查清单 + +- [ ] 修改 `.env.production` 为实际后端地址 +- [ ] 运行 `npm run build` 构建生产版本 +- [ ] 后端配置CORS允许前端域名 +- [ ] 配置Web服务器支持SPA路由 +- [ ] 测试登录功能 +- [ ] 测试录音功能 +- [ ] 测试会议列表 +- [ ] 检查浏览器控制台无错误 + +## 更新部署 + +每次更新前端代码后: +```bash +# 1. 拉取最新代码 +git pull + +# 2. 重新构建 +npm run build + +# 3. 更新静态文件 +# 将 dist 目录内容复制到Web服务器 +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000..77081ae --- /dev/null +++ b/README.md @@ -0,0 +1,1459 @@ +# iMeeting Web Client - 技术设计文档 + +## 一、项目概述 + +### 1.1 项目定位 +iMeeting Web Client 是一个基于 React 的纯前端轻量级会议录音客户端,专注于快速录音和会议管理功能。 + +### 1.2 核心特性 +- 🎤 **一键录音**:点击即录,实时流式上传 +- 📚 **会议列表**:快速查看历史会议,生成分享二维码 +- 📱 **响应式设计**:支持桌面端、平板、移动端 +- 🚀 **纯前端实现**:无需额外服务器,直接调用现有API + +--- + +## 二、界面设计分析 + +### 2.1 主界面布局(参考 design.png) + +采用 2x2 网格卡片布局: + +``` +┌─────────────┬─────────────┐ +│ 麦克风 │ AI │ +│ (橙色) │ (灰色) │ +│ [激活] │ [预留] │ +├─────────────┼─────────────┤ +│ 大脑 │ 知识库 │ +│ (灰色) │ (橙色) │ +│ [预留] │ [激活] │ +└─────────────┴─────────────┘ +``` + +**功能状态:** +- ✅ **麦克风(左上,橙色)**:一键录音功能 - **已激活** +- ⏸ **AI(右上,灰色)**:AI分析功能 - 预留 +- ⏸ **大脑(左下,灰色)**:智能功能 - 预留 +- ✅ **知识库(右下,橙色)**:会议列表 - **已激活** + +### 2.2 页面结构 +``` +/ - 主页(4个功能卡片) +├── /record - 录音页面(点击麦克风进入) +└── /meetings - 会议列表页(点击知识库进入) + └── /:id - 会议详情(简介+二维码) +``` + +### 2.3 响应式断点 +```css +/* 移动端 */ +@media (max-width: 768px) { + /* 单列布局,卡片堆叠 */ +} + +/* 平板 */ +@media (min-width: 768px) and (max-width: 1024px) { + /* 2x2布局,卡片适中 */ +} + +/* 桌面 */ +@media (min-width: 1024px) { + /* 2x2布局,卡片标准 */ +} +``` + +--- + +## 三、技术架构 + +### 3.1 技术栈选型 + +#### 核心框架 +- **React 18**:UI框架 +- **React Router v6**:路由管理 +- **Vite**:构建工具(快速、轻量) + +#### 样式方案 +- **CSS Modules**:模块化样式 +- **响应式布局**:CSS Grid + Flexbox + +#### 状态管理 +- **React Context API**:全局状态(用户、录音状态) +- **useState/useReducer**:局部状态 + +#### 核心库 +```json +{ + "react": "^18.2.0", + "react-router-dom": "^6.20.0", + "axios": "^1.6.0", + "qrcode.react": "^3.1.0", + "lucide-react": "^0.292.0" +} +``` + +### 3.2 项目结构 +``` +client/ +├── public/ +│ └── index.html +├── src/ +│ ├── components/ # 公共组件 +│ │ ├── Layout/ +│ │ │ └── MainLayout.jsx +│ │ ├── FeatureCard/ # 功能卡片 +│ │ │ ├── FeatureCard.jsx +│ │ │ └── FeatureCard.module.css +│ │ ├── RecordButton/ # 录音按钮 +│ │ └── QRCodeModal/ # 二维码弹窗 +│ ├── pages/ +│ │ ├── Home/ # 主页(2x2卡片) +│ │ │ ├── Home.jsx +│ │ │ └── Home.module.css +│ │ ├── Record/ # 录音页 +│ │ │ ├── Record.jsx +│ │ │ └── Record.module.css +│ │ └── Meetings/ # 会议列表 +│ │ ├── MeetingList.jsx +│ │ ├── MeetingDetail.jsx +│ │ └── Meetings.module.css +│ ├── hooks/ # 自定义Hooks +│ │ ├── useAudioRecorder.js +│ │ ├── useStreamUpload.js +│ │ └── useAuth.js +│ ├── services/ # API服务 +│ │ ├── api.js # Axios封装 +│ │ ├── auth.js +│ │ ├── meeting.js +│ │ └── upload.js +│ ├── utils/ +│ │ ├── audio.js # 音频工具 +│ │ └── format.js +│ ├── styles/ +│ │ └── global.css +│ ├── App.jsx +│ └── main.jsx +├── package.json +├── vite.config.js +└── README.md +``` + +--- + +## 四、核心功能实现 + +### 4.1 一键录音功能 + +#### 4.1.1 录音流程 +``` +用户点击 → 请求麦克风权限 → 开始录音 → +分片收集 → 实时上传 → 停止录音 → +创建会议记录 → 跳转到会议详情 +``` + +#### 4.1.2 技术实现 + +**(1)使用 MediaRecorder API** +```javascript +// hooks/useAudioRecorder.js +import { useState, useRef, useCallback } from 'react'; + +export const useAudioRecorder = () => { + const [isRecording, setIsRecording] = useState(false); + const [duration, setDuration] = useState(0); + const mediaRecorderRef = useRef(null); + const streamRef = useRef(null); + const chunksRef = useRef([]); + + const startRecording = useCallback(async () => { + try { + // 请求麦克风权限 + const stream = await navigator.mediaDevices.getUserMedia({ + audio: { + echoCancellation: true, // 回声消除 + noiseSuppression: true, // 降噪 + sampleRate: 44100 // 采样率 + } + }); + + streamRef.current = stream; + + // 选择合适的MIME类型 + const mimeType = getSupportedMimeType(); + + const mediaRecorder = new MediaRecorder(stream, { + mimeType, + audioBitsPerSecond: 128000 + }); + + // 每秒收集一次数据(用于流式上传) + mediaRecorder.start(1000); + + mediaRecorder.ondataavailable = (event) => { + if (event.data.size > 0) { + chunksRef.current.push(event.data); + // 触发流式上传 + onChunkAvailable(event.data); + } + }; + + mediaRecorderRef.current = mediaRecorder; + setIsRecording(true); + + } catch (error) { + handleRecordingError(error); + } + }, []); + + const stopRecording = useCallback(() => { + if (mediaRecorderRef.current) { + mediaRecorderRef.current.stop(); + streamRef.current?.getTracks().forEach(track => track.stop()); + setIsRecording(false); + } + }, []); + + return { isRecording, duration, startRecording, stopRecording }; +}; + +// 获取浏览器支持的MIME类型 +const getSupportedMimeType = () => { + const types = [ + 'audio/webm;codecs=opus', + 'audio/webm', + 'audio/ogg;codecs=opus', + 'audio/mp4' + ]; + return types.find(type => MediaRecorder.isTypeSupported(type)) || ''; +}; +``` + +**(2)流式上传实现** + +##### 方案一:分片上传(推荐) + +**优点:** +- ✅ HTTP协议,简单稳定 +- ✅ 可断点续传 +- ✅ 兼容现有后端 + +**实现:** +```javascript +// hooks/useStreamUpload.js +import { useState, useCallback } from 'react'; +import { uploadAudioChunk, completeUpload } from '../services/upload'; + +export const useStreamUpload = () => { + const [uploadProgress, setUploadProgress] = useState(0); + const [sessionId, setSessionId] = useState(null); + const chunkIndexRef = useRef(0); + + const startSession = useCallback(async (meetingId) => { + // 初始化上传会话 + const session = await initUploadSession(meetingId); + setSessionId(session.session_id); + return session; + }, []); + + const uploadChunk = useCallback(async (chunk) => { + if (!sessionId) return; + + const formData = new FormData(); + formData.append('chunk', chunk); + formData.append('chunk_index', chunkIndexRef.current); + formData.append('session_id', sessionId); + + try { + await uploadAudioChunk(formData); + chunkIndexRef.current++; + setUploadProgress(prev => prev + 1); + } catch (error) { + console.error('Upload chunk failed:', error); + // 可以实现重试逻辑 + } + }, [sessionId]); + + const finishUpload = useCallback(async (meetingId) => { + if (!sessionId) return; + + return await completeUpload({ + session_id: sessionId, + meeting_id: meetingId, + total_chunks: chunkIndexRef.current + }); + }, [sessionId]); + + return { startSession, uploadChunk, finishUpload, uploadProgress }; +}; +``` + +**后端需要新增的接口:** +```javascript +// 需要后端提供这些接口 +POST /api/audio/upload-init // 初始化上传会话 +POST /api/audio/upload-chunk // 上传分片 +POST /api/audio/upload-complete // 完成上传,合并分片 +``` + +##### 方案二:简化方案(先录完再传) + +如果后端暂时不支持分片,可以先实现简化版本: + +```javascript +const stopAndUpload = useCallback(async () => { + mediaRecorder.stop(); + + // 等待所有数据收集完毕 + mediaRecorder.onstop = async () => { + const audioBlob = new Blob(chunksRef.current, { type: mimeType }); + + // 一次性上传完整音频 + const formData = new FormData(); + formData.append('audio_file', audioBlob, 'recording.webm'); + formData.append('meeting_id', meetingId); + + await uploadAudio(formData); + }; +}, []); +``` + +**推荐:先实现方案二(简单快速),后续优化为方案一** + +#### 4.1.3 录音界面设计 + +``` +┌─────────────────────────────────┐ +│ 正在录音... │ +│ │ +│ ⏺ [动画波形] │ +│ │ +│ 00:03:24 │ +│ │ +│ ━━━━━━━━━━━━━━━━━━━━ │ +│ │ +│ [暂停] [停止并保存] │ +└─────────────────────────────────┘ +``` + +**关键元素:** +- 录音状态指示(红点闪烁) +- 实时时长显示 +- 简单的音量可视化(可选) +- 暂停/继续按钮 +- 停止按钮 + +**错误处理:** +```javascript +const handleRecordingError = (error) => { + switch(error.name) { + case 'NotAllowedError': + showError('需要麦克风权限,请在浏览器设置中允许'); + break; + case 'NotFoundError': + showError('未检测到麦克风设备'); + break; + case 'NotReadableError': + showError('麦克风被其他应用占用'); + break; + default: + showError('录音失败,请重试'); + } +}; +``` + +--- + +### 4.2 会议列表功能 + +#### 4.2.1 列表页实现 + +```javascript +// pages/Meetings/MeetingList.jsx +import { useState, useEffect } from 'react'; +import { getMeetings } from '../../services/meeting'; +import QRCodeModal from '../../components/QRCodeModal'; + +const MeetingList = () => { + const [meetings, setMeetings] = useState([]); + const [selectedMeeting, setSelectedMeeting] = useState(null); + const [showQR, setShowQR] = useState(false); + + useEffect(() => { + loadMeetings(); + }, []); + + const loadMeetings = async () => { + const response = await getMeetings({ + user_id: currentUser.user_id, + page: 1, + page_size: 50 + }); + setMeetings(response.data.meetings); + }; + + const handleShowQR = (meeting) => { + setSelectedMeeting(meeting); + setShowQR(true); + }; + + return ( +
+ {meetings.map(meeting => ( +
+

{meeting.title}

+

{formatDateTime(meeting.meeting_time)}

+

{meeting.summary?.substring(0, 100)}...

+ +
+ ))} + + {showQR && ( + setShowQR(false)} + /> + )} +
+ ); +}; +``` + +#### 4.2.2 二维码组件 + +```javascript +// components/QRCodeModal/QRCodeModal.jsx +import { QRCodeSVG } from 'qrcode.react'; + +const QRCodeModal = ({ meeting, onClose }) => { + const qrUrl = `${window.location.origin}/meetings/preview/${meeting.meeting_id}`; + + return ( +
+
e.stopPropagation()}> +

{meeting.title}

+ +
+ +
+ +

扫描二维码查看会议详情

+ +
+

会议时间:{formatDateTime(meeting.meeting_time)}

+

创建人:{meeting.creator_username}

+

参会人数:{meeting.attendees?.length || 0}

+
+ + +
+
+ ); +}; +``` + +**二维码跳转:** +- URL: `/meetings/preview/{meetingId}` +- 这个页面已经在后端实现(无需登录即可查看) + +--- + +## 五、API接口清单 + +### 5.1 复用现有接口 + +#### 用户认证 +```javascript +POST /api/auth/login // 登录 +GET /api/auth/me // 获取当前用户信息 +``` + +#### 会议管理 +```javascript +POST /api/meetings // 创建会议 +GET /api/meetings // 获取会议列表 + ?user_id=xxx&page=1&page_size=20 +GET /api/meetings/{id} // 获取会议详情 +DELETE /api/meetings/{id} // 删除会议 + +POST /api/meetings/upload-audio // 上传音频(完整文件) + - meeting_id + - audio_file + - auto_summarize (false) +``` + +### 5.2 需要新增的接口(分片上传,可选) + +```javascript +POST /api/audio/upload-init +// 初始化分片上传 +Request: { + meeting_id: number, + estimated_duration: number, // 预计时长(秒) + mime_type: string +} +Response: { + session_id: string +} + +POST /api/audio/upload-chunk +// 上传音频分片 +Request: FormData { + session_id: string, + chunk_index: number, + chunk: Blob +} +Response: { + success: boolean +} + +POST /api/audio/upload-complete +// 完成上传 +Request: { + session_id: string, + meeting_id: number, + total_chunks: number +} +Response: { + file_path: string, + task_id: string // 转录任务ID +} +``` + +--- + +## 六、关键技术实现 + +### 6.1 音频格式兼容性 + +| 浏览器 | 推荐格式 | 备选格式 | +|--------|---------|---------| +| Chrome | webm(opus) | webm | +| Safari | mp4(aac) | - | +| Firefox | webm(opus) | ogg | +| Edge | webm(opus) | webm | + +**检测代码:** +```javascript +const getSupportedMimeType = () => { + const types = [ + 'audio/webm;codecs=opus', // Chrome, Firefox, Edge + 'audio/mp4', // Safari + 'audio/webm', // 通用webm + 'audio/ogg;codecs=opus' // Firefox fallback + ]; + + for (const type of types) { + if (MediaRecorder.isTypeSupported(type)) { + console.log('Using MIME type:', type); + return type; + } + } + + throw new Error('No supported audio MIME type found'); +}; +``` + +### 6.2 权限管理 + +```javascript +// utils/permissions.js +export const requestMicrophonePermission = async () => { + try { + // 尝试获取麦克风流 + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + + // 立即停止流(仅用于权限检查) + stream.getTracks().forEach(track => track.stop()); + + return { granted: true }; + } catch (error) { + if (error.name === 'NotAllowedError') { + return { + granted: false, + error: '用户拒绝了麦克风权限' + }; + } else if (error.name === 'NotFoundError') { + return { + granted: false, + error: '未找到麦克风设备' + }; + } else { + return { + granted: false, + error: '获取麦克风权限失败' + }; + } + } +}; +``` + +### 6.3 状态管理(Context) + +```javascript +// context/AppContext.jsx +import { createContext, useContext, useState } from 'react'; + +const AppContext = createContext(); + +export const AppProvider = ({ children }) => { + const [user, setUser] = useState(null); + const [isRecording, setIsRecording] = useState(false); + + const value = { + user, + setUser, + isRecording, + setIsRecording + }; + + return ( + + {children} + + ); +}; + +export const useApp = () => { + const context = useContext(AppContext); + if (!context) { + throw new Error('useApp must be used within AppProvider'); + } + return context; +}; +``` + +### 6.4 响应式布局实现 + +```css +/* pages/Home/Home.module.css */ +.home { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; +} + +.grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 20px; + max-width: 600px; + width: 100%; +} + +/* 移动端 */ +@media (max-width: 768px) { + .grid { + grid-template-columns: 1fr; + max-width: 400px; + } +} + +/* 功能卡片 */ +.card { + aspect-ratio: 1; + border-radius: 20px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; + transition: transform 0.2s, box-shadow 0.2s; +} + +.card:hover { + transform: translateY(-5px); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); +} + +.card.active { + background: linear-gradient(135deg, #FF8C42 0%, #FF6B35 100%); + color: white; +} + +.card.inactive { + background: #E0E0E0; + color: #999; + cursor: not-allowed; +} + +.card.inactive:hover { + transform: none; +} +``` + +--- + +## 七、用户体验优化 + +### 7.1 录音反馈 +```javascript +// 视觉反馈:录音按钮呼吸动画 +@keyframes pulse { + 0%, 100% { transform: scale(1); } + 50% { transform: scale(1.05); } +} + +.recording { + animation: pulse 1.5s ease-in-out infinite; +} + +// 红点闪烁 +@keyframes blink { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.3; } +} + +.recording-indicator { + animation: blink 1s infinite; +} +``` + +### 7.2 加载状态 +```javascript +const [loading, setLoading] = useState(false); + +// 上传时显示进度 +{loading && ( +
+
+

正在上传录音...

+
+)} +``` + +### 7.3 错误提示 +```javascript +// components/Toast.jsx +const Toast = ({ message, type = 'info' }) => ( +
+ {message} +
+); + +// 使用 +showToast('录音已保存', 'success'); +showToast('上传失败,请重试', 'error'); +``` + +--- + +## 八、安全性考虑 + +### 8.1 Token管理 +```javascript +// services/api.js +import axios from 'axios'; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL +}); + +// 请求拦截器:添加Token +api.interceptors.request.use(config => { + const token = localStorage.getItem('token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}); + +// 响应拦截器:处理401 +api.interceptors.response.use( + response => response, + error => { + if (error.response?.status === 401) { + localStorage.removeItem('token'); + window.location.href = '/login'; + } + return Promise.reject(error); + } +); + +export default api; +``` + +### 8.2 数据加密 +- HTTPS传输(生产环境必须) +- 录音数据不在本地长期存储 +- Token使用JWT,设置合理过期时间 + +--- + +## 九、部署方案 + +### 9.1 构建配置 + +```javascript +// vite.config.js +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], + server: { + port: 3002, + proxy: { + '/api': { + target: 'http://localhost:8000', + changeOrigin: true + } + } + }, + build: { + outDir: 'dist', + sourcemap: false, + minify: 'terser' + } +}); +``` + +### 9.2 环境变量 + +```bash +# .env.development +VITE_API_BASE_URL=http://localhost:8000 + +# .env.production +VITE_API_BASE_URL=https://api.yourdomain.com +``` + +### 9.3 部署方式 + +**方案1:独立部署(推荐)** +```bash +npm run build +# 将 dist/ 部署到 Nginx/CDN +``` + +**Nginx配置:** +```nginx +server { + listen 80; + server_name client.yourdomain.com; + + root /var/www/client/dist; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location /api { + proxy_pass http://backend:8000; + } +} +``` + +**方案2:集成到现有frontend** +``` +frontend/ +├── src/ # 原有管理端 +└── client/ # 新客户端 + └── build后集成 +``` + +--- + +## 十、后端接口规划 + +### 10.1 用户认证接口 + +#### 1. 用户登录 +```javascript +POST /api/auth/login + +Request: +{ + "username": "string", + "password": "string" +} + +Response: +{ + "code": "200", + "message": "登录成功", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "user": { + "user_id": 1, + "username": "testuser", + "caption": "测试用户" + } + } +} + +Error Response: +{ + "code": "401", + "message": "用户名或密码错误", + "data": null +} +``` + +#### 2. 获取当前用户信息 +```javascript +GET /api/auth/me + +Headers: +{ + "Authorization": "Bearer {token}" +} + +Response: +{ + "code": "200", + "message": "获取成功", + "data": { + "user_id": 1, + "username": "testuser", + "caption": "测试用户", + "created_at": "2025-01-20T10:00:00" + } +} +``` + +--- + +### 10.2 会议管理接口 + +#### 1. 创建会议 +```javascript +POST /api/meetings + +Headers: +{ + "Authorization": "Bearer {token}" +} + +Request: +{ + "title": "临时会议", // 可选,默认"临时会议-时间戳" + "meeting_time": "2025-01-25T14:30:00", // 可选,默认当前时间 + "attendee_ids": [], // 可选,参会人员ID数组 + "tags": "" // 可选,标签 +} + +Response: +{ + "code": "200", + "message": "会议创建成功", + "data": { + "meeting_id": 123, + "title": "临时会议-20250125143000", + "meeting_time": "2025-01-25T14:30:00", + "user_id": 1, + "created_at": "2025-01-25T14:30:00" + } +} + +说明: +- Web客户端录音前先调用此接口创建会议记录 +- 录音完成后,使用meeting_id上传音频 +``` + +#### 2. 获取会议列表 +```javascript +GET /api/meetings + +Headers: +{ + "Authorization": "Bearer {token}" +} + +Query Parameters: +{ + "user_id": 1, // 必填:当前用户ID + "page": 1, // 可选:页码,默认1 + "page_size": 20, // 可选:每页数量,默认20 + "filter_type": "created" // 可选:筛选类型 (created/attended/all),默认created +} + +Response: +{ + "code": "200", + "message": "获取会议列表成功", + "data": { + "meetings": [ + { + "meeting_id": 123, + "title": "产品需求讨论会", + "meeting_time": "2025-01-25T14:30:00", + "summary": "会议讨论了新版本的产品需求...", + "created_at": "2025-01-25T14:25:00", + "audio_file_path": "/uploads/audio/123/xxx.webm", + "creator_id": 1, + "creator_username": "张三", + "attendees": [ + { "user_id": 2, "caption": "李四" }, + { "user_id": 3, "caption": "王五" } + ], + "tags": [ + { "id": 1, "name": "产品", "color": "#FF5733" } + ] + } + ], + "total": 45, + "page": 1, + "page_size": 20, + "total_pages": 3, + "has_more": true + } +} +``` + +--- + +### 10.3 流式音频上传接口(新增) + +#### 1. 初始化上传会话 +```javascript +POST /api/audio/stream/init + +Headers: +{ + "Authorization": "Bearer {token}", + "Content-Type": "application/json" +} + +Request: +{ + "meeting_id": 123, + "mime_type": "audio/webm;codecs=opus", // 前端录音格式 + "estimated_duration": 300 // 预计时长(秒),可选 +} + +Response: +{ + "code": "200", + "message": "上传会话初始化成功", + "data": { + "session_id": "sess_1737804123456_abc123", + "chunk_size": 1024000, // 建议分片大小(字节),1MB + "max_chunks": 1000 // 最大分片数量 + } +} + +说明: +- 后端创建临时目录存储分片 +- session_id用于后续上传分片 +- 返回建议的分片大小 +``` + +#### 2. 上传音频分片 +```javascript +POST /api/audio/stream/chunk + +Headers: +{ + "Authorization": "Bearer {token}", + "Content-Type": "multipart/form-data" +} + +Request: FormData +{ + "session_id": "sess_1737804123456_abc123", + "chunk_index": 0, // 分片序号,从0开始 + "chunk": , // 音频分片数据 + "is_last": false // 是否为最后一片 +} + +Response: +{ + "code": "200", + "message": "分片上传成功", + "data": { + "session_id": "sess_1737804123456_abc123", + "chunk_index": 0, + "received": true, + "total_received": 1 // 已接收的分片总数 + } +} + +Error Response (需要重传): +{ + "code": "500", + "message": "分片上传失败", + "data": { + "session_id": "sess_1737804123456_abc123", + "chunk_index": 0, + "should_retry": true + } +} + +说明: +- 前端每1秒收集一次音频数据(MediaRecorder.start(1000)) +- 实时上传每个分片,不等待录音结束 +- 支持失败重传 +- chunk_index连续递增 +``` + +#### 3. 完成上传并合并 +```javascript +POST /api/audio/stream/complete + +Headers: +{ + "Authorization": "Bearer {token}", + "Content-Type": "application/json" +} + +Request: +{ + "session_id": "sess_1737804123456_abc123", + "meeting_id": 123, + "total_chunks": 180, // 总分片数 + "mime_type": "audio/webm;codecs=opus", + "auto_transcribe": true // 是否自动启动转录 +} + +Response: +{ + "code": "200", + "message": "音频上传完成", + "data": { + "meeting_id": 123, + "file_path": "/uploads/audio/123/abc123.webm", + "file_size": 184320000, // 字节 + "duration": 180, // 秒 + "task_id": "task_transcription_123", // 转录任务ID(如果auto_transcribe=true) + "task_status": "pending" + } +} + +Error Response (合并失败): +{ + "code": "500", + "message": "音频合并失败:部分分片丢失", + "data": { + "missing_chunks": [5, 12, 34], // 缺失的分片序号 + "should_retry": true + } +} + +说明: +- 后端按序合并所有分片 +- 验证分片完整性 +- 保存最终音频文件 +- 可选自动启动转录任务 +- 清理临时分片文件 +``` + +#### 4. 取消上传会话 +```javascript +DELETE /api/audio/stream/cancel + +Headers: +{ + "Authorization": "Bearer {token}", + "Content-Type": "application/json" +} + +Request: +{ + "session_id": "sess_1737804123456_abc123" +} + +Response: +{ + "code": "200", + "message": "上传会话已取消", + "data": { + "session_id": "sess_1737804123456_abc123", + "cleaned": true + } +} + +说明: +- 用户中途停止录音或取消上传时调用 +- 后端清理临时分片文件 +- 释放会话资源 +``` + +--- + +### 10.4 接口调用流程 + +#### 完整录音上传流程 + +``` +1. 用户点击录音按钮 + ↓ +2. 前端:创建会议 + POST /api/meetings + → 获得 meeting_id + ↓ +3. 前端:初始化上传会话 + POST /api/audio/stream/init + → 获得 session_id + ↓ +4. 前端:开始录音(MediaRecorder) + ↓ +5. 每1秒收集音频数据 + ↓ +6. 实时上传分片 + POST /api/audio/stream/chunk + (chunk_index: 0, 1, 2, ...) + ↓ +7. 用户点击停止 + ↓ +8. 前端:完成上传 + POST /api/audio/stream/complete + (is_last=true, total_chunks=N) + ↓ +9. 后端:合并分片 → 启动转录 + ↓ +10. 前端:跳转到会议详情页 + /meetings/{meeting_id} +``` + +#### 错误恢复流程 + +``` +分片上传失败 + ↓ +前端:重试该分片(最多3次) + ↓ + 成功 → 继续下一分片 + ↓ + 失败 → 提示用户,取消上传 + DELETE /api/audio/stream/cancel +``` + +--- + +### 10.5 后端实现要点 + +#### 1. 分片存储策略 +```python +# 后端临时目录结构 +/tmp/audio_uploads/ + └── sess_1737804123456_abc123/ + ├── chunk_0000.webm + ├── chunk_0001.webm + ├── chunk_0002.webm + └── metadata.json + +# metadata.json +{ + "session_id": "sess_1737804123456_abc123", + "meeting_id": 123, + "mime_type": "audio/webm;codecs=opus", + "total_chunks": null, # 初始为null,完成时填入 + "received_chunks": [0, 1, 2, ...], + "created_at": "2025-01-25T14:30:00", + "expires_at": "2025-01-25T15:30:00" # 1小时后过期 +} +``` + +#### 2. 分片合并逻辑 +```python +def merge_audio_chunks(session_id, total_chunks): + """合并音频分片""" + session_dir = f"/tmp/audio_uploads/{session_id}" + + # 1. 验证分片完整性 + missing = [] + for i in range(total_chunks): + if not os.path.exists(f"{session_dir}/chunk_{i:04d}.webm"): + missing.append(i) + + if missing: + raise ValueError(f"Missing chunks: {missing}") + + # 2. 按序合并 + output_path = f"/app/uploads/audio/{meeting_id}/{uuid.uuid4()}.webm" + with open(output_path, 'wb') as outfile: + for i in range(total_chunks): + chunk_path = f"{session_dir}/chunk_{i:04d}.webm" + with open(chunk_path, 'rb') as infile: + outfile.write(infile.read()) + + # 3. 清理临时文件 + shutil.rmtree(session_dir) + + return output_path +``` + +#### 3. 会话过期清理 +```python +# 定时任务:清理1小时前的过期会话 +@scheduler.scheduled_job('interval', hours=1) +def cleanup_expired_sessions(): + """清理过期的上传会话""" + now = datetime.now() + upload_dir = "/tmp/audio_uploads" + + for session_dir in os.listdir(upload_dir): + metadata_path = f"{upload_dir}/{session_dir}/metadata.json" + if os.path.exists(metadata_path): + with open(metadata_path) as f: + metadata = json.load(f) + + expires_at = datetime.fromisoformat(metadata['expires_at']) + if now > expires_at: + shutil.rmtree(f"{upload_dir}/{session_dir}") + print(f"Cleaned up expired session: {session_dir}") +``` + +#### 4. 音频格式处理 +```python +# 支持的音频格式 +SUPPORTED_MIME_TYPES = { + 'audio/webm;codecs=opus': '.webm', + 'audio/webm': '.webm', + 'audio/ogg;codecs=opus': '.ogg', + 'audio/mp4': '.m4a' +} + +def validate_mime_type(mime_type): + """验证MIME类型""" + if mime_type not in SUPPORTED_MIME_TYPES: + raise ValueError(f"Unsupported MIME type: {mime_type}") + return SUPPORTED_MIME_TYPES[mime_type] +``` + +--- + +### 10.6 性能优化建议 + +#### 1. 并发控制 +```python +# 限制每个用户的并发上传会话数 +MAX_CONCURRENT_SESSIONS_PER_USER = 2 + +# 使用Redis记录用户的活跃会话 +redis.sadd(f"user:{user_id}:sessions", session_id) +if redis.scard(f"user:{user_id}:sessions") > MAX_CONCURRENT_SESSIONS_PER_USER: + raise TooManyConcurrentSessions() +``` + +#### 2. 分片上传队列 +```python +# 使用Celery异步处理分片保存 +@celery.task +def save_audio_chunk(session_id, chunk_index, chunk_data): + """异步保存音频分片""" + session_dir = f"/tmp/audio_uploads/{session_id}" + chunk_path = f"{session_dir}/chunk_{chunk_index:04d}.webm" + + with open(chunk_path, 'wb') as f: + f.write(chunk_data) + + # 更新metadata + update_session_metadata(session_id, chunk_index) +``` + +#### 3. 带宽优化 +```python +# 配置Nginx限速(可选) +location /api/audio/stream/chunk { + limit_req zone=upload_rate burst=5; + limit_rate 2m; # 限制每个连接2MB/s +} +``` + +--- + +### 10.7 安全性措施 + +#### 1. 文件大小限制 +```python +MAX_CHUNK_SIZE = 2 * 1024 * 1024 # 2MB per chunk +MAX_TOTAL_SIZE = 500 * 1024 * 1024 # 500MB total +MAX_DURATION = 3600 # 1 hour max recording + +@app.post("/api/audio/stream/chunk") +async def upload_chunk( + chunk: UploadFile = File(...), + session_id: str = Form(...), + chunk_index: int = Form(...) +): + # 验证分片大小 + if chunk.size > MAX_CHUNK_SIZE: + raise HTTPException(400, "Chunk too large") + + # 验证总大小 + session_total = get_session_total_size(session_id) + if session_total + chunk.size > MAX_TOTAL_SIZE: + raise HTTPException(400, "Total size exceeds limit") +``` + +#### 2. 防止目录遍历攻击 +```python +def validate_session_id(session_id: str): + """验证session_id格式,防止路径注入""" + if not re.match(r'^sess_\d+_[a-zA-Z0-9]+$', session_id): + raise ValueError("Invalid session_id format") + return session_id +``` + +#### 3. 权限验证 +```python +@app.post("/api/audio/stream/complete") +async def complete_upload( + request: CompleteUploadRequest, + current_user: dict = Depends(get_current_user) +): + # 验证会议所有权 + meeting = get_meeting(request.meeting_id) + if meeting.user_id != current_user['user_id']: + raise HTTPException(403, "Permission denied") +``` + +--- + +### 10.8 监控与日志 + +#### 关键指标 +```python +# 记录以下指标 +- 上传会话数(总数、活跃数) +- 分片上传成功率 +- 平均上传速度 +- 合并耗时 +- 失败原因统计 + +# 日志格式 +{ + "event": "chunk_upload", + "session_id": "sess_xxx", + "chunk_index": 10, + "chunk_size": 1024000, + "upload_time_ms": 234, + "user_id": 1, + "timestamp": "2025-01-25T14:30:00" +} +``` + +--- + +## 十一、快速开始 + +```bash +# 1. 安装依赖 +npm install + +# 2. 启动开发服务器 +npm run dev + +# 3. 构建生产版本 +npm run build + +# 4. 预览生产构建 +npm run preview +``` + +--- + +**文档版本**:v1.0 +**最后更新**:2025-01-25 diff --git a/design.png b/design.png new file mode 100644 index 0000000000000000000000000000000000000000..4dbe288bd8082a5a51bcd31497dcd6aebc9380d8 GIT binary patch literal 223265 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
  • f^C7fynR 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..9d1dc87 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + iMeeting - 微客户端 + + +

    + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..52fe8a8 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "imeeting-client", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.20.0", + "axios": "^1.6.0", + "qrcode.react": "^3.1.0", + "lucide-react": "^0.292.0" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@vitejs/plugin-react": "^4.2.1", + "vite": "^5.0.8" + } +} diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..fbf466b --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,39 @@ +import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; +import Home from './pages/Home/Home'; +import Record from './pages/Record/Record'; +import Meetings from './pages/Meetings/Meetings'; +import { authService } from './services/auth'; +import './styles/global.css'; + +// 私有路由保护 +function PrivateRoute({ children }) { + return authService.isAuthenticated() ? children : ; +} + +function App() { + return ( + + + } /> + + + + } + /> + + + + } + /> + + + ); +} + +export default App; diff --git a/src/components/Header.css b/src/components/Header.css new file mode 100644 index 0000000..761b003 --- /dev/null +++ b/src/components/Header.css @@ -0,0 +1,128 @@ +.app-header { + background-color: #ffffff; + padding: 16px 24px; + border-bottom: 1px solid #e0e0e0; + box-shadow: 0 2px 4px rgba(0,0,0,0.05); +} + +.header-content { + max-width: 1400px; + margin: 0 auto; + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo { + display: flex; + align-items: center; + gap: 10px; +} + +.logo-icon { + color: var(--primary-orange, #FF8C42); + width: 32px; + height: 32px; +} + +.logo-text { + font-size: 1.5rem; + font-weight: 600; + color: #2c3e50; +} + +.user-actions { + position: relative; +} + +.user-menu-trigger { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 16px; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.2s; + user-select: none; +} + +.user-menu-trigger:hover { + background-color: #f5f5f5; +} + +.welcome-text { + font-size: 14px; + color: #2c3e50; + font-weight: 500; +} + +.dropdown-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 999; +} + +.user-menu-dropdown { + position: absolute; + top: calc(100% + 8px); + right: 0; + background: white; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + min-width: 160px; + padding: 8px 0; + z-index: 1000; + animation: slideDown 0.2s ease-out; +} + +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.dropdown-item { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 16px; + cursor: pointer; + transition: background-color 0.2s; + font-size: 14px; + color: #2c3e50; +} + +.dropdown-item:hover { + background-color: #f5f5f5; +} + +.dropdown-item svg { + color: #8c8c8c; +} + +@media (max-width: 768px) { + .app-header { + padding: 12px 16px; + } + + .logo-text { + font-size: 1.25rem; + } + + .welcome-text { + display: none; + } + + .user-menu-trigger { + padding: 8px; + } +} + diff --git a/src/components/Header.jsx b/src/components/Header.jsx new file mode 100644 index 0000000..4e41129 --- /dev/null +++ b/src/components/Header.jsx @@ -0,0 +1,49 @@ +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ChevronDown, LogOut, MessageSquare } from 'lucide-react'; +import { authService } from '../services/auth'; +import './Header.css'; + +const Header = () => { + const [showDropdown, setShowDropdown] = useState(false); + const navigate = useNavigate(); + const user = authService.getLocalUser(); + + const handleLogout = () => { + authService.logout(); + navigate('/login'); + }; + + return ( +
    +
    +
    + + iMeeting +
    +
    +
    setShowDropdown(!showDropdown)} + > + 欢迎,{user?.caption || user?.username} + +
    + {showDropdown && ( + <> +
    setShowDropdown(false)} /> +
    +
    + + 退出登录 +
    +
    + + )} +
    +
    +
    + ); +}; + +export default Header; diff --git a/src/components/Toast.css b/src/components/Toast.css new file mode 100644 index 0000000..5843a6f --- /dev/null +++ b/src/components/Toast.css @@ -0,0 +1,105 @@ +.toast { + position: fixed; + top: 24px; + right: 24px; + min-width: 320px; + max-width: 480px; + padding: 16px 20px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + display: flex; + align-items: center; + gap: 12px; + z-index: 3000; + animation: slideInRight 0.3s ease-out; + background: white; +} + +@keyframes slideInRight { + from { + opacity: 0; + transform: translateX(100%); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.toast-icon { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.toast-message { + flex: 1; + font-size: 14px; + line-height: 1.5; + color: #262626; +} + +.toast-close { + background: none; + border: none; + color: #8c8c8c; + font-size: 20px; + cursor: pointer; + padding: 0; + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + transition: color 0.2s; +} + +.toast-close:hover { + color: #262626; +} + +/* 不同类型的样式 */ +.toast-success { + border-left: 4px solid #52c41a; +} + +.toast-success .toast-icon { + color: #52c41a; +} + +.toast-error { + border-left: 4px solid #ff4d4f; +} + +.toast-error .toast-icon { + color: #ff4d4f; +} + +.toast-warning { + border-left: 4px solid #fa8c16; +} + +.toast-warning .toast-icon { + color: #fa8c16; +} + +.toast-info { + border-left: 4px solid #1890ff; +} + +.toast-info .toast-icon { + color: #1890ff; +} + +/* 响应式 */ +@media (max-width: 640px) { + .toast { + top: 12px; + right: 12px; + left: 12px; + min-width: auto; + max-width: none; + } +} diff --git a/src/components/Toast.jsx b/src/components/Toast.jsx new file mode 100644 index 0000000..d8e0fd3 --- /dev/null +++ b/src/components/Toast.jsx @@ -0,0 +1,38 @@ +import React, { useEffect } from 'react'; +import { CheckCircle, XCircle, AlertCircle, Info } from 'lucide-react'; +import './Toast.css'; + +const Toast = ({ message, type = 'info', duration = 3000, onClose }) => { + useEffect(() => { + if (duration > 0) { + const timer = setTimeout(() => { + onClose(); + }, duration); + return () => clearTimeout(timer); + } + }, [duration, onClose]); + + const getIcon = () => { + switch (type) { + case 'success': + return ; + case 'error': + return ; + case 'warning': + return ; + case 'info': + default: + return ; + } + }; + + return ( +
    +
    {getIcon()}
    +
    {message}
    + +
    + ); +}; + +export default Toast; diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..d76b758 --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; + +ReactDOM.createRoot(document.getElementById('root')).render( + + + +); diff --git a/src/pages/Home/Home.css b/src/pages/Home/Home.css new file mode 100644 index 0000000..9bca55e --- /dev/null +++ b/src/pages/Home/Home.css @@ -0,0 +1,473 @@ +.home-page { + min-height: 100vh; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + display: flex; + align-items: center; + justify-content: center; + padding: 20px; +} + +.home-container { + width: 100%; + max-width: 576px; /* 72%: 800 * 0.72 = 576 */ +} + +.features-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 14px; /* 72%: 20 * 0.72 ≈ 14 */ +} + +.feature-card { + aspect-ratio: 4/3; + background: white; + border-radius: 24px; + border: none; + cursor: pointer; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 12px; /* 72%: 16 * 0.72 ≈ 12 */ + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: + 0 4px 12px rgba(0, 0, 0, 0.08), + 0 2px 4px rgba(0, 0, 0, 0.04), + inset 0 -1px 0 rgba(0, 0, 0, 0.04); + position: relative; + overflow: hidden; +} + +.feature-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0) 50%); + opacity: 0; + transition: opacity 0.3s; +} + +.feature-card::after { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%); + opacity: 0; + transition: opacity 0.3s; +} + +.feature-card:hover::before { + opacity: 1; +} + +.feature-card:hover::after { + opacity: 1; +} + +.feature-card.active:hover { + transform: translateY(-6px) scale(1.02); + box-shadow: + 0 12px 32px rgba(0, 0, 0, 0.12), + 0 6px 12px rgba(0, 0, 0, 0.08), + inset 0 -1px 0 rgba(0, 0, 0, 0.04); +} + +.feature-card.active:active { + transform: translateY(-2px); +} + +.feature-card.inactive { + opacity: 0.5; + cursor: not-allowed; +} + +.feature-card svg { + width: 46px; /* 72%: 64 * 0.72 ≈ 46 */ + height: 46px; + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); + transition: all 0.3s; + position: relative; + z-index: 1; +} + +.feature-card.active:hover svg { + transform: scale(1.1); + filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.15)); +} + +/* 橙色主题 - 增强渐变和质感 */ +.feature-card.orange.active { + background: linear-gradient(135deg, #FF8C42 0%, #FF6B35 100%); + color: white; + box-shadow: + 0 4px 16px rgba(255, 107, 53, 0.3), + 0 2px 8px rgba(255, 107, 53, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.2), + inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.feature-card.orange.active:hover { + box-shadow: + 0 12px 40px rgba(255, 107, 53, 0.4), + 0 6px 16px rgba(255, 107, 53, 0.25), + inset 0 1px 0 rgba(255, 255, 255, 0.3), + inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +/* 灰色主题 - 增强质感 */ +.feature-card.gray { + background: linear-gradient(135deg, #E8E8E8 0%, #D5D5D5 100%); + color: #999; + box-shadow: + 0 4px 12px rgba(0, 0, 0, 0.06), + inset 0 -1px 0 rgba(0, 0, 0, 0.08); +} + +/* 蓝色主题 - 用户卡片,增强渐变和质感 */ +.feature-card.blue.active { + color: #667eea; + background: linear-gradient(135deg, #f0f4ff 0%, #e0e7ff 100%); + box-shadow: + 0 4px 16px rgba(102, 126, 234, 0.2), + 0 2px 8px rgba(102, 126, 234, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.5), + inset 0 -1px 0 rgba(102, 126, 234, 0.1); +} + +.feature-card.blue.active:hover { + box-shadow: + 0 12px 40px rgba(102, 126, 234, 0.25), + 0 6px 16px rgba(102, 126, 234, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.6), + inset 0 -1px 0 rgba(102, 126, 234, 0.1); +} + +.feature-title { + font-size: 19px; /* 72%: 20 * 0.8 * 1.2 ≈ 19 */ + font-weight: 600; + text-align: center; + padding: 0 8px; + position: relative; + z-index: 1; +} + +/* 用户统计信息 - 增强质感 */ +.user-stats { + display: flex; + gap: 12px; /* 72%: 16 * 0.72 ≈ 12 */ + font-size: 13px; /* 72%: 14 * 0.85 * 1.1 ≈ 13 */ + color: #667eea; + font-weight: 500; + margin-top: 6px; + position: relative; + z-index: 1; +} + +.user-stats span { + padding: 4px 10px; /* 增大尺寸 */ + background: rgba(102, 126, 234, 0.12); + border-radius: 12px; + backdrop-filter: blur(4px); + box-shadow: 0 2px 4px rgba(102, 126, 234, 0.1); + transition: all 0.3s; +} + +.feature-card.blue.active:hover .user-stats span { + background: rgba(102, 126, 234, 0.18); + transform: translateY(-1px); + box-shadow: 0 3px 6px rgba(102, 126, 234, 0.15); +} + +/* 模态框覆盖层 */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + animation: fadeIn 0.2s ease; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* 登录模态框 */ +.login-modal { + background: white; + border-radius: 20px; + padding: 40px; + max-width: 400px; + width: 90%; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + animation: slideUp 0.3s ease; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.login-modal h3 { + margin: 0 0 24px 0; + font-size: 24px; + font-weight: 600; + color: #1e293b; + text-align: center; +} + +.login-form { + display: flex; + flex-direction: column; + gap: 16px; +} + +.login-form input { + padding: 14px 16px; + border: 2px solid #e2e8f0; + border-radius: 12px; + font-size: 15px; + transition: all 0.2s; + outline: none; +} + +.login-form input:focus { + border-color: #667eea; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); +} + +.login-form input:disabled { + background: #f1f5f9; + cursor: not-allowed; +} + +.modal-actions { + display: flex; + gap: 12px; + margin-top: 8px; +} + +.modal-actions button { + flex: 1; + padding: 14px; + border-radius: 12px; + font-size: 15px; + font-weight: 600; + border: none; + cursor: pointer; + transition: all 0.2s; +} + +.cancel-btn { + background: #f1f5f9; + color: #64748b; +} + +.cancel-btn:hover:not(:disabled) { + background: #e2e8f0; +} + +.submit-btn { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; +} + +.submit-btn:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4); +} + +.modal-actions button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* 退出确认模态框 */ +.logout-modal { + background: white; + border-radius: 20px; + padding: 40px; + max-width: 400px; + width: 90%; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + text-align: center; + animation: slideUp 0.3s ease; +} + +.logout-icon { + width: 80px; + height: 80px; + margin: 0 auto 20px; + border-radius: 50%; + background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); + display: flex; + align-items: center; + justify-content: center; + color: #f59e0b; +} + +.logout-modal h3 { + margin: 0 0 12px 0; + font-size: 22px; + font-weight: 600; + color: #1e293b; +} + +.logout-hint { + font-size: 15px; + color: #64748b; + margin: 0 0 24px 0; + line-height: 1.6; +} + +.logout-btn { + background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); + color: white; +} + +.logout-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(245, 158, 11, 0.4); +} + +/* 响应式 - 高度不足时横向排列 */ +@media (max-height: 600px) { + .home-container { + max-width: 100%; + } + + .features-grid { + grid-template-columns: repeat(4, 1fr); + max-width: 1000px; + margin: 0 auto; + } + + .user-stats { + flex-direction: column; + gap: 4px; + font-size: 11px; + } +} + +/* 响应式 - 小屏幕 */ +@media (max-width: 768px) { + .home-container { + max-width: 400px; + } + + .features-grid { + gap: 10px; + } + + .feature-card { + gap: 8px; + } + + .feature-card svg { + width: 32px; + height: 32px; + } + + .feature-title { + font-size: 14px; + } + + .user-stats { + font-size: 11px; + gap: 8px; + } +} + +/* 响应式 - 横屏手机或矮屏幕 */ +@media (max-width: 768px) and (max-height: 500px) { + .features-grid { + grid-template-columns: repeat(4, 1fr); + max-width: 100%; + } + + .feature-card { + gap: 6px; + } + + .feature-card svg { + width: 28px; + height: 28px; + } + + .feature-title { + font-size: 13px; + } + + .user-stats { + flex-direction: column; + gap: 3px; + font-size: 10px; + } +} + +/* 响应式 - 超小屏幕 */ +@media (max-width: 480px) { + .home-page { + padding: 16px; + } + + .home-container { + max-width: 320px; + } + + .features-grid { + gap: 8px; + } + + .feature-card { + border-radius: 16px; + gap: 6px; + } + + .feature-card svg { + width: 28px; + height: 28px; + } + + .feature-title { + font-size: 13px; + } + + .user-stats { + flex-direction: column; + gap: 4px; + font-size: 10px; + } + + .login-modal, + .logout-modal { + padding: 30px 24px; + } + + .login-modal h3, + .logout-modal h3 { + font-size: 20px; + } +} diff --git a/src/pages/Home/Home.jsx b/src/pages/Home/Home.jsx new file mode 100644 index 0000000..f9ce847 --- /dev/null +++ b/src/pages/Home/Home.jsx @@ -0,0 +1,242 @@ +import { useState, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Mic, Brain, FileText, User, LogOut } from 'lucide-react'; +import { authService } from '../../services/auth'; +import Toast from '../../components/Toast'; +import './Home.css'; + +function Home() { + const navigate = useNavigate(); + const [user, setUser] = useState(null); + const [userStats, setUserStats] = useState(null); + const [showLoginModal, setShowLoginModal] = useState(false); + const [showLogoutModal, setShowLogoutModal] = useState(false); + const [loginForm, setLoginForm] = useState({ username: '', password: '' }); + const [isLoggingIn, setIsLoggingIn] = useState(false); + const [toast, setToast] = useState(null); + + useEffect(() => { + checkAuthStatus(); + }, []); + + const checkAuthStatus = () => { + const currentUser = authService.getLocalUser(); + setUser(currentUser); + if (currentUser) { + fetchUserStats(); + } + }; + + const fetchUserStats = async () => { + // 从会议统计接口获取统计信息 + try { + const currentUser = authService.getLocalUser(); + if (!currentUser?.user_id) return; + + const response = await authService.getUserStats(currentUser.user_id); + setUserStats(response.data); + } catch (error) { + console.error('Failed to fetch user stats:', error); + } + }; + + const handleLogin = async (e) => { + e.preventDefault(); + if (!loginForm.username || !loginForm.password) { + setToast({ message: '请输入用户名和密码', type: 'error' }); + return; + } + + setIsLoggingIn(true); + try { + await authService.login(loginForm.username, loginForm.password); + setToast({ message: '登录成功!', type: 'success' }); + setShowLoginModal(false); + setLoginForm({ username: '', password: '' }); + checkAuthStatus(); + } catch (err) { + console.error('Login error:', err); + setToast({ + message: err.response?.data?.message || '登录失败,请检查用户名和密码', + type: 'error' + }); + } finally { + setIsLoggingIn(false); + } + }; + + const handleLogout = () => { + authService.logout(); + setUser(null); + setUserStats(null); + setShowLogoutModal(false); + setToast({ message: '已退出登录', type: 'success' }); + }; + + const handleFeatureClick = (feature) => { + if (!user && feature.requireAuth) { + setToast({ message: '请先登录', type: 'error' }); + setShowLoginModal(true); + return; + } + if (feature.onClick) { + feature.onClick(); + } + }; + + const features = [ + { + id: 'user', + title: user ? user.caption : '请点击登录', + icon: User, + active: true, + color: 'blue', + isUserCard: true, + requireAuth: false, + onClick: () => { + if (user) { + setShowLogoutModal(true); + } else { + setShowLoginModal(true); + } + } + }, + { + id: 'record', + title: '会议录音', + icon: Mic, + active: true, + color: 'orange', + requireAuth: true, + onClick: () => navigate('/record') + }, + { + id: 'records', + title: '会议记录', + icon: FileText, + active: true, + color: 'orange', + requireAuth: true, + onClick: () => navigate('/meetings') + }, + { + id: 'ai', + title: 'AI', + icon: Brain, + active: false, + color: 'gray', + requireAuth: false, + onClick: null + } + ]; + + return ( +
    + {toast && ( + setToast(null)} + /> + )} + +
    +
    + {features.map((feature) => { + const Icon = feature.icon; + return ( + + ); + })} +
    +
    + + {/* 登录模态框 */} + {showLoginModal && ( +
    setShowLoginModal(false)}> +
    e.stopPropagation()}> +

    登录 iMeeting

    +
    + setLoginForm({ ...loginForm, username: e.target.value })} + disabled={isLoggingIn} + autoFocus + /> + setLoginForm({ ...loginForm, password: e.target.value })} + disabled={isLoggingIn} + /> +
    + + +
    +
    +
    +
    + )} + + {/* 退出确认模态框 */} + {showLogoutModal && ( +
    setShowLogoutModal(false)}> +
    e.stopPropagation()}> +
    + +
    +

    确认退出登录?

    +

    退出后需要重新登录才能使用录音和记录功能

    +
    + + +
    +
    +
    + )} +
    + ); +} + +export default Home; diff --git a/src/pages/Login/Login.css b/src/pages/Login/Login.css new file mode 100644 index 0000000..8e423c7 --- /dev/null +++ b/src/pages/Login/Login.css @@ -0,0 +1,128 @@ +.login-page { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; +} + +.login-container { + width: 100%; + max-width: 400px; +} + +.login-card { + background: white; + border-radius: 20px; + padding: 40px 30px; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); +} + +.login-title { + font-size: 32px; + font-weight: bold; + color: var(--primary-orange); + text-align: center; + margin-bottom: 8px; +} + +.login-subtitle { + font-size: 16px; + color: var(--text-gray); + text-align: center; + margin-bottom: 30px; +} + +.login-form { + display: flex; + flex-direction: column; + gap: 16px; +} + +.form-group { + display: flex; + flex-direction: column; +} + +.form-input { + height: 48px; + padding: 0 16px; + border: 2px solid #E0E0E0; + border-radius: 10px; + font-size: 15px; + transition: border-color 0.2s; +} + +.form-input:focus { + outline: none; + border-color: var(--primary-orange); +} + +.form-input:disabled { + background: #F5F5F5; + cursor: not-allowed; +} + +.remember-me { + display: flex; + align-items: center; + margin-top: -8px; + margin-bottom: -8px; +} + +.remember-me label { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + user-select: none; + font-size: 14px; + color: var(--text-gray); +} + +.remember-me input[type="checkbox"] { + cursor: pointer; + width: 16px; + height: 16px; + accent-color: var(--primary-orange); +} + +.error-message { + color: #E53E3E; + font-size: 14px; + padding: 10px; + background: #FFF5F5; + border-radius: 8px; + border: 1px solid #FEB2B2; +} + +.login-button { + height: 48px; + background: linear-gradient(135deg, var(--primary-orange) 0%, var(--primary-orange-dark) 100%); + color: white; + border-radius: 10px; + font-size: 16px; + font-weight: 600; + transition: transform 0.2s, box-shadow 0.2s; + margin-top: 8px; +} + +.login-button:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(255, 140, 66, 0.3); +} + +.login-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +@media (max-width: 480px) { + .login-card { + padding: 30px 20px; + } + + .login-title { + font-size: 28px; + } +} diff --git a/src/pages/Login/Login.jsx b/src/pages/Login/Login.jsx new file mode 100644 index 0000000..90fd7dc --- /dev/null +++ b/src/pages/Login/Login.jsx @@ -0,0 +1,122 @@ +import { useState, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { authService } from '../../services/auth'; +import Toast from '../../components/Toast'; +import './Login.css'; + +function Login() { + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [loading, setLoading] = useState(false); + const [rememberMe, setRememberMe] = useState(false); + const [toast, setToast] = useState(null); + const navigate = useNavigate(); + + // 组件挂载时,从localStorage读取保存的用户名 + useEffect(() => { + const savedUsername = localStorage.getItem('rememberedUsername'); + const isRemembered = localStorage.getItem('rememberMe') === 'true'; + + if (savedUsername && isRemembered) { + setUsername(savedUsername); + setRememberMe(true); + } + }, []); + + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!username || !password) { + const errorMsg = '请输入用户名和密码'; + setToast({ message: errorMsg, type: 'error' }); + return; + } + + setLoading(true); + + try { + await authService.login(username, password); + + // 处理记住用户名 + if (rememberMe) { + localStorage.setItem('rememberedUsername', username); + localStorage.setItem('rememberMe', 'true'); + } else { + localStorage.removeItem('rememberedUsername'); + localStorage.removeItem('rememberMe'); + } + + setToast({ message: '登录成功!', type: 'success' }); + setTimeout(() => { + navigate('/'); + }, 500); + } catch (err) { + console.error('Login error:', err); + const errorMsg = err.response?.data?.message || '登录失败,请检查用户名和密码'; + setToast({ message: errorMsg, type: 'error' }); + } finally { + setLoading(false); + } + }; + + return ( +
    + {toast && ( + setToast(null)} + /> + )} + +
    +
    +

    iMeeting

    +

    微客户端

    + +
    +
    + setUsername(e.target.value)} + className="form-input" + disabled={loading} + /> +
    + +
    + setPassword(e.target.value)} + className="form-input" + disabled={loading} + /> +
    + +
    + +
    + + +
    +
    +
    +
    + ); +} + +export default Login; diff --git a/src/pages/Meetings/Meetings.css b/src/pages/Meetings/Meetings.css new file mode 100644 index 0000000..b12cf25 --- /dev/null +++ b/src/pages/Meetings/Meetings.css @@ -0,0 +1,628 @@ +.meetings-page { + min-height: 100vh; + display: flex; + flex-direction: column; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); +} + +/* 页面头部 - 返回按钮 + 标题 */ +.page-header { + padding: 20px 24px; + display: flex; + align-items: center; + gap: 16px; + position: relative; +} + +.back-button { + background: rgba(255, 255, 255, 0.2); + border: none; + border-radius: 12px; + width: 44px; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + transition: all 0.3s; + backdrop-filter: blur(10px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.back-button:hover { + background: rgba(255, 255, 255, 0.3); + transform: translateX(-2px); + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.15); +} + +.back-button:active { + transform: translateX(-1px) scale(0.98); +} + +.page-title { + font-size: 1.75rem; + font-weight: 600; + color: white; + margin: 0; + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} + +.meetings-container { + flex: 1; + max-width: 800px; + width: 100%; + margin: 0 auto; + padding: 40px 20px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.loading-state, +.empty-state { + text-align: center; + padding: 60px 20px; + color: white; + font-size: 18px; +} + +.meetings-list { + display: flex; + flex-direction: column; + gap: 16px; + flex: 1; +} + +.meetings-content-wrapper { + display: flex; + gap: 20px; + align-items: center; +} + +.meeting-item { + background: white; + border-radius: 12px; + padding: 20px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + border-left: 4px solid; + display: flex; + align-items: center; + gap: 16px; + transition: all 0.3s ease; + min-height: 80px; +} + +.meeting-item:hover { + transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); +} + +/* 自己创建的 - 橙色边框 */ +.meeting-item.created-by-me { + border-left-color: #FF8C42; +} + +/* 别人创建的 - 绿色边框 */ +.meeting-item.attended-by-me { + border-left-color: #34d399; +} + +.meeting-main { + flex: 1; + cursor: pointer; +} + +.meeting-info { + display: flex; + flex-direction: column; + gap: 12px; +} + +.meeting-title { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #1e293b; +} + +.meeting-meta { + display: flex; + gap: 24px; + flex-wrap: wrap; +} + +.meta-item { + display: flex; + align-items: center; + gap: 6px; + color: #64748b; + font-size: 14px; +} + +.meta-item svg { + flex-shrink: 0; +} + +/* 会议操作按钮组 */ +.meeting-actions { + display: flex; + gap: 8px; + align-items: center; +} + +.qr-btn, +.delete-btn { + flex-shrink: 0; + width: 40px; + height: 40px; + border-radius: 8px; + background: #f1f5f9; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s; + border: none; + cursor: pointer; +} + +.qr-btn { + color: #667eea; +} + +.qr-btn:hover { + background: #667eea; + color: white; + transform: scale(1.1); +} + +.delete-btn { + color: #ef4444; +} + +.delete-btn:hover { + background: #ef4444; + color: white; + transform: scale(1.1); +} + +/* 竖直分页器 */ +.vertical-pagination { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + background: white; + border-radius: 50px; + padding: 12px 8px; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + position: sticky; + top: 50%; + transform: translateY(-50%); +} + +.pagination-arrow-btn { + width: 44px; + height: 44px; + border-radius: 50%; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3); +} + +.pagination-arrow-btn:hover:not(:disabled) { + transform: scale(1.15); + box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4); + background: linear-gradient(135deg, #764ba2 0%, #667eea 100%); +} + +.pagination-arrow-btn:active:not(:disabled) { + transform: scale(1.05); +} + +.pagination-arrow-btn:disabled { + opacity: 0.3; + cursor: not-allowed; + background: #e2e8f0; + color: #94a3b8; + box-shadow: none; +} + +.pagination-page-info { + font-size: 12px; + font-weight: 600; + color: #667eea; + padding: 4px 0; + text-align: center; + min-width: 36px; +} + +/* QR码模态框 */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + animation: fadeIn 0.2s ease; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.qr-modal { + background: white; + border-radius: 16px; + padding: 32px; + max-width: 400px; + width: 90%; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); + text-align: center; + animation: slideUp 0.3s ease; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.qr-modal h3 { + margin: 0 0 24px 0; + font-size: 20px; + font-weight: 600; + color: #2c3e50; +} + +.qr-code-container { + display: flex; + justify-content: center; + margin-bottom: 20px; + padding: 20px; + background: #f8fafc; + border-radius: 12px; +} + +.qr-code-container img { + width: 200px; + height: 200px; +} + +.qr-url { + font-size: 12px; + color: #64748b; + word-break: break-all; + margin: 0 0 20px 0; + padding: 12px; + background: #f1f5f9; + border-radius: 8px; +} + +.qr-modal .close-btn { + width: 100%; + padding: 12px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border-radius: 8px; + font-size: 14px; + font-weight: 600; + transition: all 0.2s; +} + +.qr-modal .close-btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); +} + +/* 删除确认模态框 */ +.delete-modal { + background: white; + border-radius: 16px; + padding: 32px; + max-width: 450px; + width: 90%; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); + text-align: center; + animation: slideUp 0.3s ease; +} + +.delete-icon { + width: 80px; + height: 80px; + margin: 0 auto 20px; + border-radius: 50%; + background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%); + display: flex; + align-items: center; + justify-content: center; + color: #ef4444; +} + +.delete-modal h3 { + margin: 0 0 16px 0; + font-size: 22px; + font-weight: 600; + color: #1e293b; +} + +.delete-warning { + font-size: 16px; + color: #475569; + margin: 0 0 12px 0; + line-height: 1.6; +} + +.delete-warning strong { + color: #ef4444; + font-weight: 600; +} + +.delete-hint { + font-size: 14px; + color: #94a3b8; + margin: 0 0 24px 0; + line-height: 1.5; +} + +.modal-actions { + display: flex; + gap: 12px; + justify-content: center; +} + +.modal-actions button { + flex: 1; + padding: 12px 24px; + border-radius: 8px; + font-size: 15px; + font-weight: 600; + transition: all 0.2s; + cursor: pointer; + border: none; +} + +.cancel-btn { + background: #f1f5f9; + color: #64748b; +} + +.cancel-btn:hover:not(:disabled) { + background: #e2e8f0; +} + +.confirm-delete-btn { + background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); + color: white; +} + +.confirm-delete-btn:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4); +} + +.modal-actions button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* 响应式 */ +@media (max-width: 768px) { + .meetings-page-header { + padding: 12px 16px; + } + + .meetings-page-header .logo-text { + font-size: 1.25rem; + } + + .meetings-page-header h1 { + font-size: 1.25rem; + } + + .meetings-container { + padding: 20px 16px; + } + + .meetings-content-wrapper { + flex-direction: column; + gap: 16px; + } + + .vertical-pagination { + flex-direction: row; + position: static; + transform: none; + width: 100%; + justify-content: center; + padding: 8px 12px; + border-radius: 50px; + } + + .pagination-arrow-btn { + width: 40px; + height: 40px; + } + + .meeting-item { + padding: 16px; + flex-direction: column; + align-items: flex-start; + } + + .meeting-actions { + align-self: flex-end; + margin-top: 8px; + } + + .meeting-meta { + flex-direction: column; + gap: 8px; + } +} + +/* 行内音频播放器 */ +.meeting-item.playing { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + border-color: transparent; +} + +.meeting-item.playing .meeting-main { + cursor: default; +} + +.audio-player { + display: flex; + align-items: center; + gap: 16px; + width: 100%; + padding: 4px 0; +} + +.audio-player .play-btn { + background: rgba(255, 255, 255, 0.2); + border: none; + border-radius: 50%; + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + transition: all 0.3s; + flex-shrink: 0; +} + +.audio-player .play-btn:hover { + background: rgba(255, 255, 255, 0.3); + transform: scale(1.05); +} + +.audio-player .play-btn:active { + transform: scale(0.95); +} + +.player-info { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; + min-width: 0; +} + +.player-title { + font-size: 15px; + font-weight: 600; + color: white; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.progress-container { + display: flex; + align-items: center; + gap: 12px; +} + +.time-current, +.time-duration { + font-size: 12px; + color: rgba(255, 255, 255, 0.9); + font-weight: 500; + min-width: 40px; + text-align: center; +} + +.progress-bar { + flex: 1; + height: 6px; + background: rgba(255, 255, 255, 0.2); + border-radius: 3px; + cursor: pointer; + position: relative; + overflow: hidden; +} + +.progress-bar:hover { + height: 8px; +} + +.progress-fill { + height: 100%; + background: white; + border-radius: 3px; + transition: width 0.1s linear; + box-shadow: 0 0 8px rgba(255, 255, 255, 0.5); +} + +.close-player-btn { + background: rgba(255, 255, 255, 0.2); + border: none; + border-radius: 50%; + width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + transition: all 0.3s; + flex-shrink: 0; +} + +.close-player-btn:hover { + background: rgba(255, 255, 255, 0.3); + transform: rotate(90deg); +} + +.close-player-btn:active { + transform: rotate(90deg) scale(0.9); +} + +/* 响应式 - 播放器 */ +@media (max-width: 768px) { + .audio-player { + gap: 12px; + } + + .audio-player .play-btn { + width: 42px; + height: 42px; + } + + .player-title { + font-size: 14px; + } + + .time-current, + .time-duration { + font-size: 11px; + min-width: 35px; + } + + .close-player-btn { + width: 32px; + height: 32px; + } +} diff --git a/src/pages/Meetings/Meetings.jsx b/src/pages/Meetings/Meetings.jsx new file mode 100644 index 0000000..f4b7542 --- /dev/null +++ b/src/pages/Meetings/Meetings.jsx @@ -0,0 +1,410 @@ +import { useState, useEffect, useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ArrowLeft, Clock, User, QrCode, ChevronUp, ChevronDown, Trash2, Play, Pause, X } from 'lucide-react'; +import { meetingService } from '../../services/meeting'; +import { authService } from '../../services/auth'; +import Toast from '../../components/Toast'; +import './Meetings.css'; + +function Meetings() { + const navigate = useNavigate(); + const [meetings, setMeetings] = useState([]); + const [loading, setLoading] = useState(true); + const [pagination, setPagination] = useState({ + page: 1, + page_size: 5, + total: 0, + total_pages: 0 + }); + const [toast, setToast] = useState(null); + const [showQRModal, setShowQRModal] = useState(false); + const [selectedMeetingUrl, setSelectedMeetingUrl] = useState(''); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [deletingMeeting, setDeletingMeeting] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); + const currentUser = authService.getLocalUser(); + + // 音频播放相关状态 + const [playingMeetingId, setPlayingMeetingId] = useState(null); + const [isPlaying, setIsPlaying] = useState(false); + const [currentTime, setCurrentTime] = useState(0); + const [duration, setDuration] = useState(0); + const audioRef = useRef(null); + + useEffect(() => { + fetchMeetings(1); + }, []); + + const fetchMeetings = async (page) => { + setLoading(true); + try { + const response = await meetingService.getMeetings({ + page, + page_size: pagination.page_size + }); + + // API响应格式: { code, message, data: { meetings, page, page_size, total, total_pages } } + const data = response.data; + setMeetings(data.meetings || []); + setPagination({ + page: data.page, + page_size: data.page_size, + total: data.total, + total_pages: data.total_pages + }); + } catch (error) { + console.error('Failed to fetch meetings:', error); + setToast({ message: '加载会议列表失败', type: 'error' }); + } finally { + setLoading(false); + } + }; + + const handlePageChange = (newPage) => { + if (newPage >= 1 && newPage <= pagination.total_pages) { + fetchMeetings(newPage); + } + }; + + const handleShowQR = (meetingId) => { + const url = `${window.location.origin}/meetings/preview/${meetingId}`; + setSelectedMeetingUrl(url); + setShowQRModal(true); + }; + + const handleDeleteClick = (meeting, e) => { + e.stopPropagation(); + setDeletingMeeting(meeting); + setShowDeleteModal(true); + }; + + const handleConfirmDelete = async () => { + if (!deletingMeeting) return; + + setIsDeleting(true); + try { + await meetingService.deleteMeeting(deletingMeeting.meeting_id); + setToast({ message: '会议删除成功', type: 'success' }); + setShowDeleteModal(false); + setDeletingMeeting(null); + + // 重新加载当前页 + // 如果当前页只有一条记录且不是第一页,则返回上一页 + const isLastItemOnPage = meetings.length === 1 && pagination.page > 1; + const targetPage = isLastItemOnPage ? pagination.page - 1 : pagination.page; + fetchMeetings(targetPage); + } catch (error) { + console.error('Failed to delete meeting:', error); + setToast({ + message: error.response?.data?.message || '删除会议失败', + type: 'error' + }); + } finally { + setIsDeleting(false); + } + }; + + const handleCancelDelete = () => { + setShowDeleteModal(false); + setDeletingMeeting(null); + }; + + // 音频播放相关函数 + const handlePlayAudio = (meetingId, e) => { + e.stopPropagation(); + + // 如果点击的是同一个会议,且正在播放,则暂停 + if (playingMeetingId === meetingId && isPlaying) { + audioRef.current?.pause(); + setIsPlaying(false); + return; + } + + // 如果点击的是不同的会议,或者同一个会议但暂停状态 + if (playingMeetingId !== meetingId) { + // 停止之前的播放 + if (audioRef.current) { + audioRef.current.pause(); + audioRef.current = null; + } + + // 创建新的音频元素 + const audio = new Audio(`/api/meetings/${meetingId}/audio/stream`); + audioRef.current = audio; + + // 监听音频事件 + audio.addEventListener('loadedmetadata', () => { + setDuration(audio.duration); + }); + + audio.addEventListener('timeupdate', () => { + setCurrentTime(audio.currentTime); + }); + + audio.addEventListener('ended', () => { + setIsPlaying(false); + setCurrentTime(0); + }); + + audio.addEventListener('error', (e) => { + console.error('Audio error:', e); + setToast({ message: '音频加载失败', type: 'error' }); + setPlayingMeetingId(null); + setIsPlaying(false); + }); + + setPlayingMeetingId(meetingId); + setCurrentTime(0); + audio.play(); + setIsPlaying(true); + } else { + // 同一个会议,从暂停恢复播放 + audioRef.current?.play(); + setIsPlaying(true); + } + }; + + const handlePlayPause = (e) => { + e.stopPropagation(); + if (isPlaying) { + audioRef.current?.pause(); + setIsPlaying(false); + } else { + audioRef.current?.play(); + setIsPlaying(true); + } + }; + + const handleSeek = (e) => { + const progressBar = e.currentTarget; + const rect = progressBar.getBoundingClientRect(); + const percent = (e.clientX - rect.left) / rect.width; + const newTime = percent * duration; + + if (audioRef.current) { + audioRef.current.currentTime = newTime; + setCurrentTime(newTime); + } + }; + + const handleClosePlayer = (e) => { + e.stopPropagation(); + if (audioRef.current) { + audioRef.current.pause(); + audioRef.current = null; + } + setPlayingMeetingId(null); + setIsPlaying(false); + setCurrentTime(0); + setDuration(0); + }; + + const formatTime = (seconds) => { + if (isNaN(seconds)) return '0:00'; + const mins = Math.floor(seconds / 60); + const secs = Math.floor(seconds % 60); + return `${mins}:${secs.toString().padStart(2, '0')}`; + }; + + const formatDateTime = (dateString) => { + const date = new Date(dateString); + return date.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }); + }; + + return ( +
    + {toast && ( + setToast(null)} + /> + )} + +
    + +

    会议记录

    +
    + +
    + {loading ? ( +
    +

    加载中...

    +
    + ) : meetings.length === 0 ? ( +
    +

    暂无会议记录

    +
    + ) : ( + <> +
    +
    + {meetings.map((meeting) => { + const isCreator = String(meeting.creator_id) === String(currentUser?.user_id); + const cardClass = isCreator ? 'created-by-me' : 'attended-by-me'; + const isPlaying = playingMeetingId === meeting.meeting_id; + + return ( +
    +
    { + if (!isPlaying) { + handlePlayAudio(meeting.meeting_id, e); + } + }} + > + {isPlaying ? ( + /* 播放器模式 */ +
    + + +
    +
    {meeting.title}
    +
    + {formatTime(currentTime)} +
    +
    +
    + {formatTime(duration)} +
    +
    + + +
    + ) : ( + /* 正常信息显示 */ +
    +

    {meeting.title}

    +
    +
    + + {formatDateTime(meeting.meeting_time)} +
    +
    + + 创建人: {meeting.creator_username} +
    +
    +
    + )} +
    + {!isPlaying && ( +
    + + {isCreator && ( + + )} +
    + )} +
    + ); + })} +
    + + {/* 竖直分页器 */} + {pagination.total_pages > 1 && ( +
    + +
    + {pagination.page}/{pagination.total_pages} +
    + +
    + )} +
    + + )} +
    + + {/* QR码模态框 */} + {showQRModal && ( +
    setShowQRModal(false)}> +
    e.stopPropagation()}> +

    扫码查看会议

    +
    + QR Code +
    +

    {selectedMeetingUrl}

    + +
    +
    + )} + + {/* 删除确认模态框 */} + {showDeleteModal && ( +
    +
    e.stopPropagation()}> +
    + +
    +

    确认删除会议?

    +

    + 确定要删除会议 "{deletingMeeting?.title}" 吗? +

    +
    + + +
    +
    +
    + )} +
    + ); +} + +export default Meetings; diff --git a/src/pages/Record/Record.css b/src/pages/Record/Record.css new file mode 100644 index 0000000..390d4d8 --- /dev/null +++ b/src/pages/Record/Record.css @@ -0,0 +1,507 @@ +.record-page { + min-height: 100vh; + display: flex; + flex-direction: column; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); +} + +/* 页面头部 - 返回按钮 + 标题 */ +.page-header { + padding: 20px 24px; + display: flex; + align-items: center; + gap: 16px; + position: relative; +} + +.back-button { + background: rgba(255, 255, 255, 0.2); + border: none; + border-radius: 12px; + width: 44px; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + transition: all 0.3s; + backdrop-filter: blur(10px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.back-button:hover { + background: rgba(255, 255, 255, 0.3); + transform: translateX(-2px); + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.15); +} + +.back-button:active { + transform: translateX(-1px) scale(0.98); +} + +.page-title { + font-size: 1.75rem; + font-weight: 600; + color: white; + margin: 0; + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} + +/* 主容器 */ +.record-container { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; +} + +.record-card { + background: white; + border-radius: 30px; + padding: 40px 40px; + max-width: 600px; + width: 100%; + aspect-ratio: 4/3; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; +} + +/* 顶部提示文字区域 */ +.status-text-area { + text-align: center; + flex: 0 0 auto; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 10px; +} + +.status-text { + font-size: 28px; + font-weight: 600; + color: #2c3e50; + margin: 0; +} + +.status-text.success { + color: #10B981; +} + +.status-text.recording-pulse { + animation: colorPulse 2s ease-in-out infinite; +} + +@keyframes colorPulse { + 0%, 100% { + color: #2c3e50; + } + 50% { + color: #E53E3E; + } +} + +.status-hint { + font-size: 16px; + color: #64748b; + margin: 0; +} + +/* 中心按钮区域 */ +.center-button-area { + position: relative; + display: flex; + align-items: center; + justify-content: center; + flex: 1; +} + +/* 音频源选择按钮组 */ +.audio-source-buttons { + display: flex; + gap: 30px; + align-items: center; + justify-content: center; +} + +.source-button { + width: 160px; + aspect-ratio: 4/3; + border-radius: 20px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 12px; + border: none; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15); + color: white; + font-size: 16px; + font-weight: 600; +} + +.source-button.microphone { + background: linear-gradient(135deg, #FF8C42 0%, #FF6B35 100%); +} + +.source-button.microphone:hover { + transform: translateY(-5px); + box-shadow: 0 12px 40px rgba(255, 107, 53, 0.4); +} + +.source-button.system { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); +} + +.source-button.system:hover { + transform: translateY(-5px); + box-shadow: 0 12px 40px rgba(102, 126, 234, 0.4); +} + +.source-button:active { + transform: translateY(-2px); +} + +.source-button span { + font-size: 14px; +} + +/* 中心麦克风按钮 */ +.center-mic-button { + width: 200px; + height: 200px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + border: none; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); + background: linear-gradient(135deg, #FF8C42 0%, #FF6B35 100%); + color: white; + position: relative; + z-index: 10; +} + +.center-mic-button:hover { + transform: scale(1.05); + box-shadow: 0 15px 50px rgba(255, 107, 53, 0.4); +} + +.center-mic-button:active { + transform: scale(0.98); +} + +/* 录音状态 - 红色停止按钮 */ +.center-mic-button.recording { + background: linear-gradient(135deg, #E53E3E 0%, #C53030 100%); +} + +.center-mic-button.recording:hover { + box-shadow: 0 15px 50px rgba(197, 48, 48, 0.4); +} + +/* 加载状态 - 灰色 */ +.center-mic-button.loading { + background: linear-gradient(135deg, #E0E0E0 0%, #BDBDBD 100%); + color: #757575; + cursor: not-allowed; +} + +.center-mic-button.loading:hover { + transform: none; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); +} + +/* 完成状态 - 绿色 */ +.center-mic-button.completed { + background: linear-gradient(135deg, #10B981 0%, #059669 100%); + animation: successPop 0.5s ease-out; +} + +@keyframes successPop { + 0% { + transform: scale(0.8); + opacity: 0; + } + 50% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +/* 录音容器 - 包含波纹 */ +.recording-container { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 240px; + height: 240px; +} + +/* 波纹动画 */ +.ripple-wave { + position: absolute; + border-radius: 50%; + border: 3px solid #FF8C42; + opacity: 0; + animation: ripple 2s ease-out infinite; +} + +.ripple-wave.wave-1 { + animation-delay: 0s; +} + +.ripple-wave.wave-2 { + animation-delay: 0.7s; +} + +.ripple-wave.wave-3 { + animation-delay: 1.4s; +} + +@keyframes ripple { + 0% { + width: 200px; + height: 200px; + opacity: 0.8; + } + 100% { + width: 400px; + height: 400px; + opacity: 0; + } +} + +/* 旋转动画 */ +.spin { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* 时长显示 */ +.duration-display { + flex: 0 0 auto; + font-size: 56px; + font-weight: 700; + color: #2c3e50; + font-variant-numeric: tabular-nums; + letter-spacing: 4px; + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +/* 通用淡入动画 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 响应式 */ +@media (max-width: 768px) { + .record-page-header { + padding: 12px 16px; + } + + .record-page-header .logo-text { + font-size: 1.25rem; + } + + .record-page-header h1 { + font-size: 1.25rem; + } + + .record-card { + padding: 30px 20px; + } + + .status-text-area { + flex: 0 0 auto; + } + + .status-text { + font-size: 24px; + } + + .center-button-area { + flex: 1; + } + + .audio-source-buttons { + gap: 20px; + } + + .source-button { + width: 130px; + aspect-ratio: 4/3; + gap: 8px; + } + + .source-button svg { + width: 50px; + height: 50px; + } + + .source-button span { + font-size: 13px; + } + + .center-mic-button { + width: 160px; + height: 160px; + } + + .center-mic-button svg { + width: 60px; + height: 60px; + } + + .recording-container { + width: 200px; + height: 200px; + } + + .ripple-wave { + animation: ripple-mobile 2s ease-out infinite; + } + + @keyframes ripple-mobile { + 0% { + width: 160px; + height: 160px; + opacity: 0.8; + } + 100% { + width: 320px; + height: 320px; + opacity: 0; + } + } + + .duration-display { + font-size: 48px; + } +} + +@media (max-width: 480px) { + .record-page-header .header-content { + gap: 12px; + } + + .record-page-header .logo-icon { + width: 24px; + height: 24px; + } + + .record-page-header .logo-text { + font-size: 1.1rem; + } + + .record-page-header h1 { + font-size: 1.1rem; + } + + .record-card { + padding: 25px 20px; + } + + .status-text-area { + flex: 0 0 auto; + } + + .status-text { + font-size: 20px; + } + + .status-hint { + font-size: 14px; + } + + .center-button-area { + flex: 1; + } + + .audio-source-buttons { + flex-direction: column; + gap: 15px; + } + + .source-button { + width: 200px; + aspect-ratio: 4/3; + border-radius: 15px; + flex-direction: row; + gap: 12px; + } + + .source-button svg { + width: 32px; + height: 32px; + } + + .source-button span { + font-size: 14px; + } + + .center-mic-button { + width: 140px; + height: 140px; + } + + .center-mic-button svg { + width: 50px; + height: 50px; + } + + .recording-container { + width: 180px; + height: 180px; + } + + @keyframes ripple-small { + 0% { + width: 140px; + height: 140px; + opacity: 0.8; + } + 100% { + width: 280px; + height: 280px; + opacity: 0; + } + } + + .ripple-wave { + animation: ripple-small 2s ease-out infinite; + } + + .duration-display { + font-size: 40px; + letter-spacing: 2px; + } +} diff --git a/src/pages/Record/Record.jsx b/src/pages/Record/Record.jsx new file mode 100644 index 0000000..a6b0e92 --- /dev/null +++ b/src/pages/Record/Record.jsx @@ -0,0 +1,376 @@ +import { useState, useRef, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Mic, Square, Loader, ArrowLeft, Monitor } from 'lucide-react'; +import { meetingService } from '../../services/meeting'; +import { audioService } from '../../services/audio'; +import { authService } from '../../services/auth'; +import Toast from '../../components/Toast'; +import './Record.css'; + +function Record() { + const navigate = useNavigate(); + const [isRecording, setIsRecording] = useState(false); + const [duration, setDuration] = useState(0); + const [status, setStatus] = useState('idle'); // idle, requesting-permission, recording, uploading, completed + const [audioSource, setAudioSource] = useState(null); // 'microphone' or 'system' + const [toast, setToast] = useState(null); + + const mediaRecorderRef = useRef(null); + const streamRef = useRef(null); + const chunksRef = useRef([]); + const durationIntervalRef = useRef(null); + const sessionIdRef = useRef(null); + const meetingIdRef = useRef(null); + const chunkIndexRef = useRef(0); + + useEffect(() => { + return () => { + // 清理资源 + if (streamRef.current) { + streamRef.current.getTracks().forEach(track => track.stop()); + } + if (durationIntervalRef.current) { + clearInterval(durationIntervalRef.current); + } + }; + }, []); + + const getSupportedMimeType = () => { + const types = [ + 'audio/mp4', // 优先使用 mp4 格式 + 'audio/webm;codecs=opus', + 'audio/webm', + 'audio/ogg;codecs=opus' + ]; + for (const type of types) { + if (MediaRecorder.isTypeSupported(type)) { + return type; + } + } + return ''; + }; + + const formatDuration = (seconds) => { + const mins = Math.floor(seconds / 60); + const secs = seconds % 60; + return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + }; + + const handleStartRecording = async (source = 'microphone') => { + try { + setStatus('requesting-permission'); + setAudioSource(source); + + let stream; + + // 1. 根据音频源类型请求权限 + if (source === 'system') { + // 录制系统音频(需要屏幕共享) + try { + // getDisplayMedia 必须包含 video,即使我们只需要音频 + const displayStream = await navigator.mediaDevices.getDisplayMedia({ + video: true, // 必须为 true,否则会报错 + audio: { + echoCancellation: false, // 系统音频不需要回声消除 + noiseSuppression: false, + autoGainControl: false + } + }); + + // 检查是否成功获取音频轨道 + const audioTracks = displayStream.getAudioTracks(); + if (audioTracks.length === 0) { + // 用户没有勾选"共享音频" + displayStream.getTracks().forEach(track => track.stop()); + setToast({ + message: '请在屏幕共享时勾选"共享音频"选项', + type: 'error' + }); + setStatus('idle'); + setAudioSource(null); + return; + } + + // 停止视频轨道,只保留音频 + displayStream.getVideoTracks().forEach(track => track.stop()); + + // 创建只包含音频的新 stream + stream = new MediaStream(audioTracks); + + } catch (err) { + // 如果用户取消屏幕共享 + if (err.name === 'NotAllowedError' || err.name === 'AbortError') { + setToast({ + message: '已取消屏幕共享', + type: 'error' + }); + setStatus('idle'); + setAudioSource(null); + return; + } else if (err.name === 'NotSupportedError') { + setToast({ + message: '您的浏览器不支持系统音频录制,请使用 Chrome 或 Edge 浏览器', + type: 'error' + }); + setStatus('idle'); + setAudioSource(null); + return; + } + throw err; + } + } else { + // 录制麦克风音频 + stream = await navigator.mediaDevices.getUserMedia({ + audio: { + echoCancellation: true, + noiseSuppression: true, + sampleRate: 44100 + } + }); + } + + streamRef.current = stream; + setStatus('recording'); + + // 2. 创建会议 + const user = authService.getLocalUser(); + const meetingResponse = await meetingService.createMeeting({ + title: `录音会议-${new Date().toLocaleString('zh-CN')}`, + meeting_time: new Date().toISOString(), + user_id: user.user_id, + attendee_ids: [user.user_id], + tags: '客户端快速会议' + }); + + meetingIdRef.current = meetingResponse.data.meeting_id; + console.log('Meeting created:', meetingIdRef.current); + + // 3. 创建MediaRecorder + const mimeType = getSupportedMimeType(); + if (!mimeType) { + throw new Error('浏览器不支持录音功能'); + } + + console.log('Using MIME type:', mimeType); + + // 4. 初始化上传会话 + const sessionResponse = await audioService.initUploadSession( + meetingIdRef.current, + mimeType + ); + + sessionIdRef.current = sessionResponse.data.session_id; + console.log('Upload session initialized:', sessionIdRef.current); + + // 5. 创建并启动MediaRecorder + const mediaRecorder = new MediaRecorder(stream, { + mimeType, + audioBitsPerSecond: 128000 + }); + + mediaRecorder.ondataavailable = async (event) => { + if (event.data.size > 0) { + chunksRef.current.push(event.data); + + // 实时上传分片 + try { + await audioService.uploadChunk( + sessionIdRef.current, + chunkIndexRef.current, + event.data + ); + console.log(`Chunk ${chunkIndexRef.current} uploaded`); + chunkIndexRef.current++; + } catch (err) { + console.error('Error uploading chunk:', err); + // 继续录音,不中断 + } + } + }; + + mediaRecorder.start( + Number(import.meta.env.VITE_AUDIO_CHUNK_INTERVAL) || 10000 + ); // 从配置文件读取分片上传间隔,默认10秒 + mediaRecorderRef.current = mediaRecorder; + setIsRecording(true); + + // 6. 启动计时器 + durationIntervalRef.current = setInterval(() => { + setDuration(prev => prev + 1); + }, 1000); + + } catch (err) { + console.error('Start recording error:', err); + let errorMessage = '启动录音失败'; + let showPermissionHelp = false; + + if (err.name === 'NotAllowedError') { + errorMessage = '麦克风权限被拒绝,请在浏览器设置中允许使用麦克风'; + showPermissionHelp = true; + } else if (err.name === 'NotFoundError') { + errorMessage = '未检测到麦克风设备'; + } else if (err.name === 'NotReadableError') { + errorMessage = '麦克风被其他应用占用'; + } else if (err.message) { + errorMessage = err.message; + } + + setToast({ message: errorMessage, type: 'error' }); + setStatus('idle'); + setAudioSource(null); + + // 清理资源 + if (streamRef.current) { + streamRef.current.getTracks().forEach(track => track.stop()); + streamRef.current = null; + } + } + }; + + const handleStopRecording = async () => { + if (!mediaRecorderRef.current || !isRecording) return; + + setIsRecording(false); + setStatus('uploading'); + + // 停止计时 + if (durationIntervalRef.current) { + clearInterval(durationIntervalRef.current); + } + + // 停止录音 + mediaRecorderRef.current.stop(); + + // 停止麦克风 + if (streamRef.current) { + streamRef.current.getTracks().forEach(track => track.stop()); + } + + // 等待最后的数据 + mediaRecorderRef.current.onstop = async () => { + try { + // 完成上传 + const mimeType = getSupportedMimeType(); + await audioService.completeUpload( + sessionIdRef.current, + meetingIdRef.current, + chunkIndexRef.current, + mimeType + ); + + console.log('Upload completed successfully'); + setStatus('completed'); + setToast({ message: '录音完成!', type: 'success' }); + + // 跳转到会议详情页 + setTimeout(() => { + navigate('/meetings'); + }, 2000); + + } catch (err) { + console.error('Complete upload error:', err); + setToast({ + message: '上传完成失败: ' + (err.response?.data?.message || err.message), + type: 'error' + }); + setStatus('idle'); + setAudioSource(null); + } + }; + }; + + return ( +
    + {toast && ( + setToast(null)} + /> + )} + +
    + +

    会议录音

    +
    + +
    +
    + {/* 提示文字 */} +
    + {status === 'idle' &&

    选择录音方式

    } + {status === 'requesting-permission' && ( + <> +

    正在请求{audioSource === 'system' ? '屏幕共享' : '麦克风'}权限

    +

    请在浏览器弹窗中允许{audioSource === 'system' ? '共享屏幕音频' : '使用麦克风'}

    + + )} + {status === 'recording' &&

    正在录音中...

    } + {status === 'uploading' &&

    正在上传处理...

    } + {status === 'completed' &&

    录音完成!

    } +
    + + {/* 中心按钮区域 */} +
    + {/* 空闲状态 - 两个音频源选择按钮 */} + {status === 'idle' && ( +
    + + +
    + )} + + {/* 请求权限 - 加载动画 */} + {status === 'requesting-permission' && ( +
    + +
    + )} + + {/* 录音中 - 停止按钮 + 波纹 */} + {status === 'recording' && ( +
    +
    +
    +
    + +
    + )} + + {/* 上传中 - 加载动画 */} + {status === 'uploading' && ( +
    + +
    + )} + + {/* 完成 - 成功图标 */} + {status === 'completed' && ( +
    + +
    + )} +
    + + {/* 时长显示 - 始终占位,保持高度一致 */} +
    + {(status === 'recording' || status === 'uploading') ? formatDuration(duration) : '\u00A0'} +
    +
    +
    +
    + ); +} + +export default Record; diff --git a/src/services/api.js b/src/services/api.js new file mode 100644 index 0000000..951a5b5 --- /dev/null +++ b/src/services/api.js @@ -0,0 +1,54 @@ +import axios from 'axios'; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL || '/api', + timeout: 30000, +}); + +// 请求拦截器:添加token +api.interceptors.request.use( + (config) => { + const token = localStorage.getItem('token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error) => Promise.reject(error) +); + +// 响应拦截器:处理统一格式 +api.interceptors.response.use( + (response) => { + // 后端返回格式: { code, message, data } + // 统一提取 data 字段 + if (response.data && response.data.data !== undefined) { + // 如果是标准格式,检查 code + const code = response.data.code; + if (code !== "200") { + // 如果 code 不是 200,抛出错误 + return Promise.reject({ + response: { + data: { + message: response.data.message || '请求失败' + } + } + }); + } + // 返回完整的 response.data,保留 code, message, data + return response.data; + } + // 如果不是标准格式,直接返回 + return response; + }, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('token'); + localStorage.removeItem('user'); + window.location.href = '/login'; + } + return Promise.reject(error); + } +); + +export default api; diff --git a/src/services/audio.js b/src/services/audio.js new file mode 100644 index 0000000..c845c52 --- /dev/null +++ b/src/services/audio.js @@ -0,0 +1,44 @@ +import api from './api'; + +export const audioService = { + // 初始化上传会话 + initUploadSession: async (meetingId, mimeType) => { + return await api.post('/audio/stream/init', { + meeting_id: meetingId, + mime_type: mimeType + }); + }, + + // 上传音频分片 + uploadChunk: async (sessionId, chunkIndex, chunk) => { + const formData = new FormData(); + formData.append('session_id', sessionId); + formData.append('chunk_index', chunkIndex); + formData.append('chunk', chunk); + + return await api.post('/audio/stream/chunk', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + }, + + // 完成上传 + completeUpload: async (sessionId, meetingId, totalChunks, mimeType) => { + return await api.post('/audio/stream/complete', { + session_id: sessionId, + meeting_id: meetingId, + total_chunks: totalChunks, + mime_type: mimeType, + auto_transcribe: true, + auto_summarize: true + }); + }, + + // 取消上传 + cancelUpload: async (sessionId) => { + return await api.delete('/audio/stream/cancel', { + data: { session_id: sessionId } + }); + } +}; diff --git a/src/services/auth.js b/src/services/auth.js new file mode 100644 index 0000000..5176b92 --- /dev/null +++ b/src/services/auth.js @@ -0,0 +1,54 @@ +import api from './api'; + +export const authService = { + // 登录 + login: async (username, password) => { + const response = await api.post('/auth/login', { username, password }); + // 响应格式: { code, message, data: { user_id, username, caption, email, token, role_id } } + if (response.data?.token) { + localStorage.setItem('token', response.data.token); + // 保存用户信息,不包括 token + const { token, ...userInfo } = response.data; + localStorage.setItem('user', JSON.stringify(userInfo)); + } + return response; + }, + + // 获取当前用户 + getCurrentUser: async () => { + return await api.get('/auth/me'); + }, + + // 退出登录 + logout: () => { + localStorage.removeItem('token'); + localStorage.removeItem('user'); + }, + + // 检查是否已登录 + isAuthenticated: () => { + return !!localStorage.getItem('token'); + }, + + // 获取本地用户信息 + getLocalUser: () => { + const userStr = localStorage.getItem('user'); + // 防止解析 "undefined" 或 "null" 字符串 + if (!userStr || userStr === 'undefined' || userStr === 'null') { + return null; + } + try { + return JSON.parse(userStr); + } catch (error) { + console.error('Failed to parse user data:', error); + return null; + } + }, + + // 获取用户统计信息 + getUserStats: async (userId) => { + return await api.get('/meetings/stats', { + params: { user_id: userId } + }); + } +}; diff --git a/src/services/meeting.js b/src/services/meeting.js new file mode 100644 index 0000000..e956b31 --- /dev/null +++ b/src/services/meeting.js @@ -0,0 +1,29 @@ +import api from './api'; + +export const meetingService = { + // 创建会议 + createMeeting: async (data) => { + return await api.post('/meetings', { + user_id: data.user_id, + title: data.title || `临时会议-${new Date().getTime()}`, + meeting_time: data.meeting_time || new Date().toISOString(), + attendee_ids: data.attendee_ids || [], + tags: data.tags || '' + }); + }, + + // 获取会议列表 + getMeetings: async (params) => { + return await api.get('/meetings', { params }); + }, + + // 获取会议详情 + getMeetingDetail: async (meetingId) => { + return await api.get(`/meetings/${meetingId}`); + }, + + // 删除会议 + deleteMeeting: async (meetingId) => { + return await api.delete(`/meetings/${meetingId}`); + } +}; diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..01f279c --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,46 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + --primary-orange: #FF8C42; + --primary-orange-dark: #FF6B35; + --inactive-gray: #E0E0E0; + --text-dark: #333; + --text-gray: #666; + --text-light: #999; + --white: #FFFFFF; + --shadow: rgba(0, 0, 0, 0.1); + --shadow-hover: rgba(0, 0, 0, 0.2); +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; +} + +#root { + min-height: 100vh; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} + +button { + border: none; + cursor: pointer; + font-family: inherit; +} + +input { + font-family: inherit; +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..851e48e --- /dev/null +++ b/vite.config.js @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + port: 3002, + proxy: { + '/api': { + target: 'http://localhost:8000', + changeOrigin: true + } + } + } +}) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..6fc33f2 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,921 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2": + version "7.28.5" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" + integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== + +"@babel/core@^7.28.0": + version "7.28.5" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.28.5": + version "7.28.5" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== + dependencies: + "@babel/parser" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.4" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": + version "7.28.5" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== + dependencies: + "@babel/types" "^7.28.5" + +"@babel/plugin-transform-react-jsx-self@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-source@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": + version "7.28.5" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.5" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.5" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.5" + debug "^4.3.1" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5": + version "7.28.5" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@remix-run/router@1.23.1": + version "1.23.1" + resolved "https://registry.npmmirror.com/@remix-run/router/-/router-1.23.1.tgz#0ce8857b024e24fc427585316383ad9d295b3a7f" + integrity sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ== + +"@rolldown/pluginutils@1.0.0-beta.27": + version "1.0.0-beta.27" + resolved "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz#47d2bf4cef6d470b22f5831b420f8964e0bf755f" + integrity sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== + +"@rollup/rollup-android-arm-eabi@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz#7e478b66180c5330429dd161bf84dad66b59c8eb" + integrity sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w== + +"@rollup/rollup-android-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz#2b025510c53a5e3962d3edade91fba9368c9d71c" + integrity sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w== + +"@rollup/rollup-darwin-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz#3577c38af68ccf34c03e84f476bfd526abca10a0" + integrity sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA== + +"@rollup/rollup-darwin-x64@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz#2bf5f2520a1f3b551723d274b9669ba5b75ed69c" + integrity sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ== + +"@rollup/rollup-freebsd-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz#4bb9cc80252564c158efc0710153c71633f1927c" + integrity sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w== + +"@rollup/rollup-freebsd-x64@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz#2301289094d49415a380cf942219ae9d8b127440" + integrity sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz#1d03d776f2065e09fc141df7d143476e94acca88" + integrity sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw== + +"@rollup/rollup-linux-arm-musleabihf@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz#8623de0e040b2fd52a541c602688228f51f96701" + integrity sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg== + +"@rollup/rollup-linux-arm64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz#ce2d1999bc166277935dde0301cde3dd0417fb6e" + integrity sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w== + +"@rollup/rollup-linux-arm64-musl@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz#88c2523778444da952651a2219026416564a4899" + integrity sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A== + +"@rollup/rollup-linux-loong64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz#578ca2220a200ac4226c536c10c8cc6e4f276714" + integrity sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g== + +"@rollup/rollup-linux-ppc64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz#aa338d3effd4168a20a5023834a74ba2c3081293" + integrity sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw== + +"@rollup/rollup-linux-riscv64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz#16ba582f9f6cff58119aa242782209b1557a1508" + integrity sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g== + +"@rollup/rollup-linux-riscv64-musl@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz#e404a77ebd6378483888b8064c703adb011340ab" + integrity sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A== + +"@rollup/rollup-linux-s390x-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz#92ad52d306227c56bec43d96ad2164495437ffe6" + integrity sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg== + +"@rollup/rollup-linux-x64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz#fd0dea3bb9aa07e7083579f25e1c2285a46cb9fa" + integrity sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w== + +"@rollup/rollup-linux-x64-musl@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz#37a3efb09f18d555f8afc490e1f0444885de8951" + integrity sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q== + +"@rollup/rollup-openharmony-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz#c489bec9f4f8320d42c9b324cca220c90091c1f7" + integrity sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw== + +"@rollup/rollup-win32-arm64-msvc@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz#152832b5f79dc22d1606fac3db946283601b7080" + integrity sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw== + +"@rollup/rollup-win32-ia32-msvc@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz#54d91b2bb3bf3e9f30d32b72065a4e52b3a172a5" + integrity sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA== + +"@rollup/rollup-win32-x64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz#df9df03e61a003873efec8decd2034e7f135c71e" + integrity sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg== + +"@rollup/rollup-win32-x64-msvc@4.53.3": + version "4.53.3" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz#38ae84f4c04226c1d56a3b17296ef1e0460ecdfe" + integrity sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ== + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.27.0" + resolved "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.28.0" + resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== + dependencies: + "@babel/types" "^7.28.2" + +"@types/estree@1.0.8": + version "1.0.8" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/prop-types@*": + version "15.7.15" + resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== + +"@types/react-dom@^18.2.17": + version "18.3.7" + resolved "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz#b89ddf2cd83b4feafcc4e2ea41afdfb95a0d194f" + integrity sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ== + +"@types/react@^18.2.43": + version "18.3.27" + resolved "https://registry.npmmirror.com/@types/react/-/react-18.3.27.tgz#74a3b590ea183983dc65a474dc17553ae1415c34" + integrity sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w== + dependencies: + "@types/prop-types" "*" + csstype "^3.2.2" + +"@vitejs/plugin-react@^4.2.1": + version "4.7.0" + resolved "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz#647af4e7bb75ad3add578e762ad984b90f4a24b9" + integrity sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== + dependencies: + "@babel/core" "^7.28.0" + "@babel/plugin-transform-react-jsx-self" "^7.27.1" + "@babel/plugin-transform-react-jsx-source" "^7.27.1" + "@rolldown/pluginutils" "1.0.0-beta.27" + "@types/babel__core" "^7.20.5" + react-refresh "^0.17.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.6.0: + version "1.13.2" + resolved "https://registry.npmmirror.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687" + integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.4" + proxy-from-env "^1.1.0" + +baseline-browser-mapping@^2.8.25: + version "2.8.31" + resolved "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz#16c0f1814638257932e0486dbfdbb3348d0a5710" + integrity sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw== + +browserslist@^4.24.0: + version "4.28.0" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.0.tgz#9cefece0a386a17a3cd3d22ebf67b9deca1b5929" + integrity sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ== + dependencies: + baseline-browser-mapping "^2.8.25" + caniuse-lite "^1.0.30001754" + electron-to-chromium "^1.5.249" + node-releases "^2.0.27" + update-browserslist-db "^1.1.4" + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +caniuse-lite@^1.0.30001754: + version "1.0.30001757" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz#a46ff91449c69522a462996c6aac4ef95d7ccc5e" + integrity sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + +debug@^4.1.0, debug@^4.3.1: + version "4.4.3" + resolved "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +electron-to-chromium@^1.5.249: + version "1.5.260" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.260.tgz#73f555d3e9b9fd16ff48fc406bbad84efa9b86c7" + integrity sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA== + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +follow-redirects@^1.15.6: + version "1.15.11" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + +form-data@^4.0.4: + version "4.0.5" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lucide-react@^0.292.0: + version "0.292.0" + resolved "https://registry.npmmirror.com/lucide-react/-/lucide-react-0.292.0.tgz#c8a06b2ccd8a348a88669def3c0291c035de2884" + integrity sha512-rRgUkpEHWpa5VCT66YscInCQmQuPCB1RFRzkkxMxg4b+jaL0V12E3riWWR2Sh5OIiUhCwGW/ZExuEO4Az32E6Q== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +postcss@^8.4.43: + version "8.5.6" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +qrcode.react@^3.1.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/qrcode.react/-/qrcode.react-3.2.0.tgz#97daabd4ff641a3f3c678f87be106ebc55f9cd07" + integrity sha512-YietHHltOHA4+l5na1srdaMx4sVSOjV9tamHs+mwiLWAMr6QVACRUw1Neax5CptFILcNoITctJY0Ipyn5enQ8g== + +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-refresh@^0.17.0: + version "0.17.0" + resolved "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== + +react-router-dom@^6.20.0: + version "6.30.2" + resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.30.2.tgz#ee8c161bce4890d34484b552f8510f9af0e22b01" + integrity sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q== + dependencies: + "@remix-run/router" "1.23.1" + react-router "6.30.2" + +react-router@6.30.2: + version "6.30.2" + resolved "https://registry.npmmirror.com/react-router/-/react-router-6.30.2.tgz#c78a3b40f7011f49a373b1df89492e7d4ec12359" + integrity sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA== + dependencies: + "@remix-run/router" "1.23.1" + +react@^18.2.0: + version "18.3.1" + resolved "https://registry.npmmirror.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +rollup@^4.20.0: + version "4.53.3" + resolved "https://registry.npmmirror.com/rollup/-/rollup-4.53.3.tgz#dbc8cd8743b38710019fb8297e8d7a76e3faa406" + integrity sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.53.3" + "@rollup/rollup-android-arm64" "4.53.3" + "@rollup/rollup-darwin-arm64" "4.53.3" + "@rollup/rollup-darwin-x64" "4.53.3" + "@rollup/rollup-freebsd-arm64" "4.53.3" + "@rollup/rollup-freebsd-x64" "4.53.3" + "@rollup/rollup-linux-arm-gnueabihf" "4.53.3" + "@rollup/rollup-linux-arm-musleabihf" "4.53.3" + "@rollup/rollup-linux-arm64-gnu" "4.53.3" + "@rollup/rollup-linux-arm64-musl" "4.53.3" + "@rollup/rollup-linux-loong64-gnu" "4.53.3" + "@rollup/rollup-linux-ppc64-gnu" "4.53.3" + "@rollup/rollup-linux-riscv64-gnu" "4.53.3" + "@rollup/rollup-linux-riscv64-musl" "4.53.3" + "@rollup/rollup-linux-s390x-gnu" "4.53.3" + "@rollup/rollup-linux-x64-gnu" "4.53.3" + "@rollup/rollup-linux-x64-musl" "4.53.3" + "@rollup/rollup-openharmony-arm64" "4.53.3" + "@rollup/rollup-win32-arm64-msvc" "4.53.3" + "@rollup/rollup-win32-ia32-msvc" "4.53.3" + "@rollup/rollup-win32-x64-gnu" "4.53.3" + "@rollup/rollup-win32-x64-msvc" "4.53.3" + fsevents "~2.3.2" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +update-browserslist-db@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a" + integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +vite@^5.0.8: + version "5.4.21" + resolved "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" + integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==