0235699曾露 11 месяцев назад
Сommit
c2dd79fd52
40 измененных файлов с 18362 добавлено и 0 удалено
  1. 8 0
      .editorconfig
  2. 1 0
      .gitattributes
  3. 30 0
      .gitignore
  4. 6 0
      .prettierrc.json
  5. 8 0
      .vscode/extensions.json
  6. 1646 0
      API接口规范文档.md
  7. 48 0
      README.md
  8. 1 0
      env.d.ts
  9. 22 0
      eslint.config.ts
  10. 13 0
      index.html
  11. 6283 0
      package-lock.json
  12. 43 0
      package.json
  13. BIN
      public/favicon.ico
  14. 32 0
      src/App.vue
  15. 21 0
      src/main.ts
  16. 607 0
      src/page/competition/award-mgmt/index.vue
  17. 329 0
      src/page/competition/index.vue
  18. 760 0
      src/page/competition/personal/index.vue
  19. 560 0
      src/page/competition/query/index.vue
  20. 228 0
      src/page/edu-industry/components/ActionCard.vue
  21. 157 0
      src/page/edu-industry/components/ChartContainer.vue
  22. 109 0
      src/page/edu-industry/components/PageHeader.vue
  23. 190 0
      src/page/edu-industry/components/StatCard.vue
  24. 21 0
      src/page/edu-industry/components/index.ts
  25. 345 0
      src/page/edu-industry/index.vue
  26. 1402 0
      src/page/edu-industry/lifecycle/index.vue
  27. 652 0
      src/page/edu-industry/matching/index.vue
  28. 466 0
      src/page/edu-industry/styles/common.scss
  29. 1207 0
      src/page/edu-industry/transformation/index.vue
  30. 645 0
      src/page/home/index.vue
  31. 237 0
      src/page/studio-mgmt/index.vue
  32. 114 0
      src/router/index.ts
  33. 12 0
      src/stores/counter.ts
  34. 12 0
      tsconfig.app.json
  35. 11 0
      tsconfig.json
  36. 19 0
      tsconfig.node.json
  37. 18 0
      vite.config.ts
  38. 769 0
      产品结构书.md
  39. 1151 0
      数据库设计文档.sql
  40. 179 0
      系统架构图.svg

+ 8 - 0
.editorconfig

@@ -0,0 +1,8 @@
+[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}]
+charset = utf-8
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+end_of_line = lf
+max_line_length = 100

+ 1 - 0
.gitattributes

@@ -0,0 +1 @@
+* text=auto eol=lf

+ 30 - 0
.gitignore

@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo

+ 6 - 0
.prettierrc.json

@@ -0,0 +1,6 @@
+{
+  "$schema": "https://json.schemastore.org/prettierrc",
+  "semi": false,
+  "singleQuote": true,
+  "printWidth": 100
+}

+ 8 - 0
.vscode/extensions.json

@@ -0,0 +1,8 @@
+{
+  "recommendations": [
+    "Vue.volar",
+    "dbaeumer.vscode-eslint",
+    "EditorConfig.EditorConfig",
+    "esbenp.prettier-vscode"
+  ]
+}

+ 1646 - 0
API接口规范文档.md

@@ -0,0 +1,1646 @@
+# 科研创新与学科竞赛综合管理系统 API接口规范文档
+
+## 文档信息
+- **版本**: v1.0
+- **创建日期**: 2024年
+- **API版本**: v1
+- **基础URL**: `https://api.inno-res-comp.edu.cn/v1`
+
+## 目录
+1. [接口设计原则](#接口设计原则)
+2. [通用规范](#通用规范)
+3. [认证与授权](#认证与授权)
+4. [用户管理模块API](#用户管理模块api)
+5. [产教融合模块API](#产教融合模块api)
+6. [学科竞赛模块API](#学科竞赛模块api)
+7. [实验室管理模块API](#实验室管理模块api)
+8. [工作室建设与管理模块API](#工作室建设与管理模块api)
+9. [科研与国际化模块API](#科研与国际化模块api)
+10. [系统管理模块API](#系统管理模块api)
+11. [错误码定义](#错误码定义)
+
+## 接口设计原则
+
+### RESTful设计原则
+- 使用HTTP动词表示操作:GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)
+- 使用名词表示资源,避免动词
+- 使用复数形式表示资源集合
+- 使用嵌套路径表示资源关系
+
+### 响应格式统一
+所有API响应均采用以下JSON格式:
+```json
+{
+  "code": 200,
+  "message": "success",
+  "data": {},
+  "timestamp": "2024-01-01T12:00:00Z",
+  "requestId": "uuid"
+}
+```
+
+### 分页格式统一
+```json
+{
+  "code": 200,
+  "message": "success",
+  "data": {
+    "list": [],
+    "pagination": {
+      "page": 1,
+      "size": 20,
+      "total": 100,
+      "pages": 5
+    }
+  }
+}
+```
+
+## 通用规范
+
+### 请求头
+```
+Content-Type: application/json
+Authorization: Bearer {token}
+X-Request-ID: {uuid}
+X-Client-Version: 1.0.0
+```
+
+### 状态码
+- 200: 成功
+- 201: 创建成功
+- 400: 请求参数错误
+- 401: 未授权
+- 403: 权限不足
+- 404: 资源不存在
+- 409: 资源冲突
+- 422: 数据验证失败
+- 500: 服务器内部错误
+
+### 时间格式
+统一使用ISO 8601格式:`2024-01-01T12:00:00Z`
+
+### 分页参数
+- `page`: 页码,从1开始
+- `size`: 每页大小,默认20,最大100
+- `sort`: 排序字段,格式:`field,direction`(如:`createdAt,desc`)
+
+## 认证与授权
+
+### 登录认证
+```http
+POST /auth/login
+Content-Type: application/json
+
+{
+  "username": "string",
+  "password": "string",
+  "captcha": "string",
+  "captchaId": "string"
+}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "message": "登录成功",
+  "data": {
+    "accessToken": "eyJhbGciOiJIUzI1NiIs...",
+    "refreshToken": "eyJhbGciOiJIUzI1NiIs...",
+    "expiresIn": 7200,
+    "user": {
+      "id": 1,
+      "username": "admin",
+      "realName": "管理员",
+      "email": "admin@example.com",
+      "roles": ["ADMIN"],
+      "permissions": ["*"]
+    }
+  }
+}
+```
+
+### 刷新Token
+```http
+POST /auth/refresh
+Content-Type: application/json
+
+{
+  "refreshToken": "string"
+}
+```
+
+### 登出
+```http
+POST /auth/logout
+Authorization: Bearer {token}
+```
+
+## 用户管理模块API
+
+### 用户信息管理
+
+#### 获取用户列表
+```http
+GET /users?page=1&size=20&keyword=&departmentId=&status=
+Authorization: Bearer {token}
+```
+
+**查询参数**:
+- `keyword`: 关键词搜索(用户名、姓名、邮箱)
+- `departmentId`: 部门ID
+- `status`: 用户状态(0-禁用,1-启用)
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "list": [
+      {
+        "id": 1,
+        "username": "student001",
+        "realName": "张三",
+        "email": "zhangsan@example.com",
+        "phone": "13800138000",
+        "department": {
+          "id": 1,
+          "name": "计算机学院"
+        },
+        "roles": ["STUDENT"],
+        "status": 1,
+        "lastLoginTime": "2024-01-01T12:00:00Z",
+        "createdAt": "2024-01-01T10:00:00Z"
+      }
+    ],
+    "pagination": {
+      "page": 1,
+      "size": 20,
+      "total": 100,
+      "pages": 5
+    }
+  }
+}
+```
+
+#### 获取用户详情
+```http
+GET /users/{id}
+Authorization: Bearer {token}
+```
+
+#### 创建用户
+```http
+POST /users
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "username": "string",
+  "password": "string",
+  "realName": "string",
+  "email": "string",
+  "phone": "string",
+  "departmentId": 1,
+  "roleIds": [1, 2],
+  "gender": 1,
+  "birthDate": "1990-01-01"
+}
+```
+
+#### 更新用户
+```http
+PUT /users/{id}
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "realName": "string",
+  "email": "string",
+  "phone": "string",
+  "departmentId": 1,
+  "status": 1
+}
+```
+
+#### 删除用户
+```http
+DELETE /users/{id}
+Authorization: Bearer {token}
+```
+
+#### 重置密码
+```http
+POST /users/{id}/reset-password
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "newPassword": "string"
+}
+```
+
+### 角色权限管理
+
+#### 获取角色列表
+```http
+GET /roles?page=1&size=20
+Authorization: Bearer {token}
+```
+
+#### 创建角色
+```http
+POST /roles
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "roleName": "string",
+  "roleCode": "string",
+  "description": "string",
+  "permissions": ["permission1", "permission2"]
+}
+```
+
+#### 更新角色
+```http
+PUT /roles/{id}
+Authorization: Bearer {token}
+```
+
+#### 删除角色
+```http
+DELETE /roles/{id}
+Authorization: Bearer {token}
+```
+
+### 部门管理
+
+#### 获取部门树
+```http
+GET /departments/tree
+Authorization: Bearer {token}
+```
+
+#### 创建部门
+```http
+POST /departments
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "name": "string",
+  "code": "string",
+  "parentId": 0,
+  "managerId": 1,
+  "description": "string"
+}
+```
+
+## 产教融合模块API
+
+### 企业管理
+
+#### 获取企业列表
+```http
+GET /enterprises?page=1&size=20&keyword=&industry=&enterpriseType=
+Authorization: Bearer {token}
+```
+
+**查询参数**:
+- `keyword`: 企业名称关键词
+- `industry`: 所属行业
+- `enterpriseType`: 企业类型(1-国企,2-民企,3-外企,4-合资)
+
+#### 创建企业
+```http
+POST /enterprises
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "name": "string",
+  "shortName": "string",
+  "unifiedSocialCreditCode": "string",
+  "enterpriseType": 1,
+  "industry": "string",
+  "scale": 1,
+  "contactPerson": "string",
+  "contactPhone": "string",
+  "contactEmail": "string",
+  "address": "string",
+  "website": "string",
+  "businessScope": "string",
+  "tags": ["技术领域1", "设备类型1"]
+}
+```
+
+#### 智能匹配推荐
+```http
+POST /enterprises/match-recommendations
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "departmentId": 1,
+  "technicalFields": ["AI", "大数据"],
+  "cooperationType": 1,
+  "budgetRange": [10000, 100000]
+}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "recommendations": [
+      {
+        "enterprise": {
+          "id": 1,
+          "name": "科技公司A",
+          "industry": "人工智能"
+        },
+        "matchScore": 8.5,
+        "matchReasons": ["技术领域匹配", "合作历史良好"],
+        "cooperationPotential": "高"
+      }
+    ],
+    "heatMap": {
+      "demandSupplyGap": {
+        "AI": 0.8,
+        "大数据": 0.6
+      }
+    }
+  }
+}
+```
+
+### 校企合作项目管理
+
+#### 获取合作项目列表
+```http
+GET /cooperation-projects?page=1&size=20&projectType=&progressStatus=&enterpriseId=
+Authorization: Bearer {token}
+```
+
+#### 创建合作项目
+```http
+POST /cooperation-projects
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectName": "string",
+  "projectCode": "string",
+  "enterpriseId": 1,
+  "departmentId": 1,
+  "projectType": 1,
+  "cooperationMode": 1,
+  "projectLeaderId": 1,
+  "startDate": "2024-01-01",
+  "endDate": "2024-12-31",
+  "budget": 100000,
+  "projectDescription": "string",
+  "objectives": "string",
+  "deliverables": "string"
+}
+```
+
+#### 更新项目进度
+```http
+PUT /cooperation-projects/{id}/progress
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "progressStatus": 2,
+  "progressPercentage": 50,
+  "progressDescription": "string",
+  "nextMilestone": "string",
+  "riskAssessment": "string"
+}
+```
+
+#### 三维进度管理
+```http
+GET /cooperation-projects/{id}/progress-dashboard
+Authorization: Bearer {token}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "administrativeProgress": {
+      "percentage": 60,
+      "milestones": [
+        {
+          "name": "合同签署",
+          "status": "completed",
+          "completedAt": "2024-01-15T10:00:00Z"
+        }
+      ]
+    },
+    "academicProgress": {
+      "percentage": 45,
+      "milestones": [
+        {
+          "name": "需求分析",
+          "status": "in_progress",
+          "expectedAt": "2024-02-01T10:00:00Z"
+        }
+      ]
+    },
+    "financialProgress": {
+      "percentage": 30,
+      "budgetUsed": 30000,
+      "budgetTotal": 100000,
+      "milestones": [
+        {
+          "name": "首期款项",
+          "status": "completed",
+          "amount": 30000
+        }
+      ]
+    },
+    "riskWarnings": [
+      {
+        "level": "medium",
+        "message": "学术进度略有延迟",
+        "suggestion": "建议增加人力投入"
+      }
+    ]
+  }
+}
+```
+
+### 技术成熟度评估
+
+#### 创建评估
+```http
+POST /tech-maturity-assessments
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectId": 1,
+  "technologyReadinessLevel": 5,
+  "marketReadinessScore": 7.5,
+  "commercialPotentialScore": 8.0,
+  "riskLevel": 2,
+  "assessmentContent": "string",
+  "improvementSuggestions": "string",
+  "nextMilestone": "string"
+}
+```
+
+#### 获取评估历史
+```http
+GET /tech-maturity-assessments?projectId=1
+Authorization: Bearer {token}
+```
+
+### 路演匹配系统
+
+#### 自动推送投资机构
+```http
+POST /roadshow-matches/auto-match
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectId": 1,
+  "investmentStage": "A轮",
+  "fundingAmount": 5000000,
+  "industryPreference": ["人工智能", "大数据"]
+}
+```
+
+#### 创建路演安排
+```http
+POST /roadshow-matches
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectId": 1,
+  "investorType": 2,
+  "investorName": "string",
+  "contactPerson": "string",
+  "contactInfo": "string",
+  "roadshowDate": "2024-02-01T14:00:00Z"
+}
+```
+
+## 学科竞赛模块API
+
+### 竞赛信息管理
+
+#### 获取竞赛列表
+```http
+GET /competitions?page=1&size=20&competitionType=&level=&year=&status=
+Authorization: Bearer {token}
+```
+
+#### 创建竞赛
+```http
+POST /competitions
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "name": "string",
+  "englishName": "string",
+  "competitionCode": "string",
+  "competitionType": 1,
+  "level": 2,
+  "category": "string",
+  "organizer": "string",
+  "competitionYear": 2024,
+  "registrationStartDate": "2024-03-01",
+  "registrationEndDate": "2024-03-31",
+  "competitionStartDate": "2024-04-01",
+  "competitionEndDate": "2024-04-30",
+  "venue": "string",
+  "description": "string",
+  "prizeSetting": "string",
+  "maxTeamSize": 5
+}
+```
+
+### 获奖信息管理
+
+#### 提交获奖信息
+```http
+POST /awards
+Authorization: Bearer {token}
+Content-Type: multipart/form-data
+
+{
+  "competitionId": 1,
+  "awardName": "string",
+  "awardLevel": 2,
+  "teamName": "string",
+  "isTeam": 1,
+  "teamLeaderId": 1,
+  "teamMembers": [2, 3, 4],
+  "instructorId": 5,
+  "workTitle": "string",
+  "workDescription": "string",
+  "certificateNumber": "string",
+  "awardDate": "2024-04-30",
+  "certificate": "file",
+  "supportingMaterials": ["file1", "file2"]
+}
+```
+
+#### 获奖信息审核
+```http
+PUT /awards/{id}/audit
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "auditStatus": 1,
+  "auditComment": "string",
+  "requiredMaterials": "string"
+}
+```
+
+#### 智能查询系统
+```http
+GET /awards/search?keyword=&competitionType=&level=&awardLevel=&year=&instructorId=&studentId=&auditStatus=
+Authorization: Bearer {token}
+```
+
+**查询参数**:
+- `keyword`: 关键词(竞赛名称、获奖名称、作品标题)
+- `competitionType`: 竞赛类型
+- `level`: 竞赛级别
+- `awardLevel`: 获奖等级
+- `year`: 获奖年份
+- `instructorId`: 指导教师ID
+- `studentId`: 学生ID
+- `auditStatus`: 审核状态
+
+#### 一键Excel导出
+```http
+GET /awards/export?format=excel&filters={}
+Authorization: Bearer {token}
+```
+
+**响应**: 返回Excel文件流
+
+### 个人空间模块
+
+#### 获取个人获奖记录
+```http
+GET /awards/personal?userId=1&page=1&size=20
+Authorization: Bearer {token}
+```
+
+#### 获奖记录进度追踪
+```http
+GET /awards/{id}/progress
+Authorization: Bearer {token}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "currentStatus": "审核中",
+    "progressSteps": [
+      {
+        "step": "提交申请",
+        "status": "completed",
+        "completedAt": "2024-01-01T10:00:00Z"
+      },
+      {
+        "step": "材料审核",
+        "status": "in_progress",
+        "startedAt": "2024-01-02T09:00:00Z"
+      },
+      {
+        "step": "公示期",
+        "status": "pending"
+      },
+      {
+        "step": "审核完成",
+        "status": "pending"
+      }
+    ],
+    "estimatedCompletionTime": "2024-01-10T17:00:00Z",
+    "nextAction": "等待审核结果"
+  }
+}
+```
+
+## 实验室管理模块API
+
+### 实验室信息管理
+
+#### 获取实验室列表
+```http
+GET /laboratories?page=1&size=20&labType=&departmentId=&status=
+Authorization: Bearer {token}
+```
+
+#### 创建实验室
+```http
+POST /laboratories
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "name": "string",
+  "labCode": "string",
+  "labType": 1,
+  "departmentId": 1,
+  "building": "string",
+  "floor": "string",
+  "roomNumber": "string",
+  "area": 100.5,
+  "capacity": 30,
+  "managerId": 1,
+  "assistantManagers": [2, 3],
+  "safetyLevel": 2,
+  "accessControl": 1,
+  "openingHours": "string",
+  "description": "string",
+  "rules": "string"
+}
+```
+
+### 设备管理
+
+#### 获取设备列表
+```http
+GET /equipment?page=1&size=20&labId=&equipmentType=&status=&usageStatus=
+Authorization: Bearer {token}
+```
+
+#### 创建设备
+```http
+POST /equipment
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "labId": 1,
+  "equipmentName": "string",
+  "equipmentCode": "string",
+  "equipmentType": 1,
+  "brand": "string",
+  "model": "string",
+  "specifications": "string",
+  "purchaseDate": "2024-01-01",
+  "purchasePrice": 50000,
+  "supplier": "string",
+  "warrantyPeriod": 36,
+  "location": "string",
+  "responsiblePersonId": 1,
+  "remoteControllable": 1,
+  "remoteControlUrl": "string"
+}
+```
+
+#### 设备状态监控
+```http
+GET /equipment/{id}/status
+Authorization: Bearer {token}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "equipmentId": 1,
+    "equipmentName": "高性能计算机",
+    "networkStatus": 1,
+    "powerStatus": 1,
+    "usageStatus": 0,
+    "currentUser": null,
+    "temperature": 45.5,
+    "cpuUsage": 15.2,
+    "memoryUsage": 32.8,
+    "diskUsage": 68.5,
+    "lastHeartbeat": "2024-01-01T12:00:00Z",
+    "uptime": "72:15:30"
+  }
+}
+```
+
+### 设备借用管理
+
+#### 申请设备借用
+```http
+POST /equipment-borrowings
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "equipmentId": 1,
+  "borrowerType": 1,
+  "purpose": "string",
+  "projectId": 1,
+  "plannedStartTime": "2024-01-01T09:00:00Z",
+  "plannedEndTime": "2024-01-01T17:00:00Z",
+  "usageNotes": "string"
+}
+```
+
+#### 审批借用申请
+```http
+PUT /equipment-borrowings/{id}/approve
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "approved": true,
+  "approvalComment": "string"
+}
+```
+
+#### 设备归还
+```http
+PUT /equipment-borrowings/{id}/return
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "returnCondition": "string",
+  "damageDescription": "string",
+  "rating": 5,
+  "feedback": "string"
+}
+```
+
+#### 获取借用记录
+```http
+GET /equipment-borrowings?page=1&size=20&equipmentId=&borrowerId=&status=&startDate=&endDate=
+Authorization: Bearer {token}
+```
+
+### 远程设备控制
+
+#### 远程开机
+```http
+POST /equipment/{id}/remote-control/power-on
+Authorization: Bearer {token}
+```
+
+#### 远程关机
+```http
+POST /equipment/{id}/remote-control/power-off
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "force": false,
+  "delaySeconds": 60
+}
+```
+
+#### 远程重启
+```http
+POST /equipment/{id}/remote-control/restart
+Authorization: Bearer {token}
+```
+
+#### 获取远程控制日志
+```http
+GET /equipment/{id}/remote-control/logs?page=1&size=20
+Authorization: Bearer {token}
+```
+
+#### 网络连接提醒
+```http
+POST /equipment/{id}/network-reminder
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "message": "请勿拔除网线,以免影响远程控制功能",
+  "reminderType": "popup"
+}
+```
+
+## 工作室建设与管理模块API
+
+### 学生能力信息化
+
+#### 获取学生技能标签
+```http
+GET /student-skills?studentId=1&skillCategory=&verified=
+Authorization: Bearer {token}
+```
+
+#### 添加技能标签
+```http
+POST /student-skills
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "studentId": 1,
+  "skillCategory": 1,
+  "skillName": "Java编程",
+  "skillLevel": 3,
+  "proficiencyScore": 8.5,
+  "certificationName": "Oracle Java认证",
+  "certificationUrl": "string",
+  "certificationDate": "2024-01-01",
+  "selfAssessment": "string",
+  "projectExperience": "string"
+}
+```
+
+#### 技能验证
+```http
+PUT /student-skills/{id}/verify
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "verified": true,
+  "teacherAssessment": "string",
+  "adjustedLevel": 3,
+  "adjustedScore": 8.0
+}
+```
+
+#### 获取学生可用时间
+```http
+GET /student-availability?studentId=1&semester=2024春
+Authorization: Bearer {token}
+```
+
+#### 设置可用时间
+```http
+POST /student-availability
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "studentId": 1,
+  "semester": "2024春",
+  "weekDay": 1,
+  "startTime": "09:00:00",
+  "endTime": "17:00:00",
+  "availabilityType": 1,
+  "description": "空闲时间",
+  "isFlexible": 1,
+  "priority": 3
+}
+```
+
+### 项目管理
+
+#### 获取项目列表
+```http
+GET /projects?page=1&size=20&projectType=&teacherId=&departmentId=&recruitmentStatus=&projectStatus=
+Authorization: Bearer {token}
+```
+
+#### 创建项目
+```http
+POST /projects
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectName": "string",
+  "projectCode": "string",
+  "projectType": 1,
+  "projectCategory": "string",
+  "teacherId": 1,
+  "coTeachers": [2, 3],
+  "departmentId": 1,
+  "projectDescription": "string",
+  "objectives": "string",
+  "expectedOutcomes": "string",
+  "technicalRequirements": "string",
+  "skillRequirements": ["Java", "Spring Boot", "MySQL"],
+  "teamSizeMin": 3,
+  "teamSizeMax": 6,
+  "difficultyLevel": 2,
+  "estimatedDuration": 120,
+  "startDate": "2024-01-01",
+  "endDate": "2024-05-01",
+  "budget": 10000
+}
+```
+
+#### 项目可视化仪表盘
+```http
+GET /projects/{id}/dashboard
+Authorization: Bearer {token}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "projectOverview": {
+      "id": 1,
+      "name": "智能推荐系统",
+      "status": "进行中",
+      "phase": "开发阶段",
+      "progressPercentage": 65,
+      "healthStatus": "健康",
+      "daysRemaining": 45
+    },
+    "teamComposition": {
+      "totalMembers": 5,
+      "memberRoles": [
+        {"role": "组长", "count": 1},
+        {"role": "核心成员", "count": 2},
+        {"role": "普通成员", "count": 2}
+      ],
+      "workloadDistribution": [
+        {"memberId": 1, "memberName": "张三", "workloadPercentage": 25},
+        {"memberId": 2, "memberName": "李四", "workloadPercentage": 20}
+      ]
+    },
+    "taskStatistics": {
+      "totalTasks": 20,
+      "completedTasks": 13,
+      "inProgressTasks": 5,
+      "pendingTasks": 2,
+      "tasksByType": [
+        {"type": "需求分析", "count": 3, "completed": 3},
+        {"type": "设计", "count": 5, "completed": 4},
+        {"type": "开发", "count": 8, "completed": 4},
+        {"type": "测试", "count": 4, "completed": 2}
+      ]
+    },
+    "qualityMetrics": {
+      "qualityScore": 8.5,
+      "reworkCount": 3,
+      "reworkRate": 15,
+      "codeReviewPassRate": 85,
+      "testCoverage": 78
+    },
+    "riskAssessment": {
+      "overallRisk": "低",
+      "riskFactors": [
+        {
+          "factor": "进度风险",
+          "level": "低",
+          "description": "当前进度正常"
+        },
+        {
+          "factor": "质量风险",
+          "level": "中",
+          "description": "部分模块需要重构"
+        }
+      ]
+    }
+  }
+}
+```
+
+#### 智能匹配推荐
+```http
+POST /projects/{id}/match-students
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "requiredSkills": ["Java", "Spring Boot"],
+  "preferredLevel": 2,
+  "timeRequirement": 20,
+  "teamRole": 2
+}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "recommendations": [
+      {
+        "student": {
+          "id": 1,
+          "name": "王五",
+          "department": "计算机学院",
+          "grade": "大三"
+        },
+        "matchScore": 9.2,
+        "skillMatch": {
+          "Java": {"level": 3, "score": 8.5},
+          "Spring Boot": {"level": 2, "score": 7.0}
+        },
+        "availableTime": 25,
+        "previousProjects": 2,
+        "averageRating": 4.5,
+        "matchReasons": [
+          "技能匹配度高",
+          "时间充足",
+          "项目经验丰富"
+        ]
+      }
+    ]
+  }
+}
+```
+
+### 项目成员管理
+
+#### 获取项目成员
+```http
+GET /projects/{id}/members
+Authorization: Bearer {token}
+```
+
+#### 添加项目成员
+```http
+POST /projects/{id}/members
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "studentId": 1,
+  "memberRole": 2,
+  "responsibilities": "string",
+  "plannedWorkload": 20
+}
+```
+
+#### 更新成员表现
+```http
+PUT /project-members/{id}/performance
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "actualWorkload": 22,
+  "contributionRate": 18.5,
+  "performanceScore": 8.5,
+  "attendanceRate": 95,
+  "taskCompletionRate": 90,
+  "qualityRating": 4,
+  "collaborationRating": 5,
+  "innovationRating": 4,
+  "achievements": "string",
+  "feedbackFromTeacher": "string"
+}
+```
+
+### 任务管理
+
+#### 获取项目任务
+```http
+GET /projects/{id}/tasks?assigneeId=&taskStatus=&taskType=
+Authorization: Bearer {token}
+```
+
+#### 创建任务
+```http
+POST /project-tasks
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectId": 1,
+  "parentTaskId": 0,
+  "taskName": "string",
+  "taskDescription": "string",
+  "taskType": 3,
+  "priority": 3,
+  "difficulty": 2,
+  "estimatedHours": 16,
+  "assigneeId": 1,
+  "reviewerId": 2,
+  "plannedStartDate": "2024-01-01",
+  "plannedEndDate": "2024-01-05",
+  "acceptanceCriteria": "string"
+}
+```
+
+#### 更新任务进度
+```http
+PUT /project-tasks/{id}/progress
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "progressPercentage": 50,
+  "actualHours": 8,
+  "progressDescription": "string",
+  "deliverables": "string",
+  "notes": "string"
+}
+```
+
+#### 任务返工追踪
+```http
+POST /project-tasks/{id}/rework
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "reworkReason": "string",
+  "qualityIssues": "string",
+  "improvementPlan": "string"
+}
+```
+
+### 项目申请与遴选
+
+#### 学生申请加入项目
+```http
+POST /project-applications
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectId": 1,
+  "applicationType": 1,
+  "desiredRole": 2,
+  "motivation": "string",
+  "relevantSkills": ["Java", "MySQL"],
+  "previousExperience": "string",
+  "availableTimePerWeek": 20,
+  "expectedContribution": "string",
+  "portfolioUrl": "string"
+}
+```
+
+#### 教师审核申请
+```http
+PUT /project-applications/{id}/review
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "applicationStatus": 2,
+  "reviewComment": "string",
+  "interviewRequired": 1,
+  "interviewTime": "2024-01-05T14:00:00Z"
+}
+```
+
+#### 获取申请列表
+```http
+GET /project-applications?projectId=1&studentId=&applicationStatus=
+Authorization: Bearer {token}
+```
+
+## 科研与国际化模块API
+
+### 短期交流项目
+
+#### 获取交流项目列表
+```http
+GET /exchange-programs?page=1&size=20&programType=&partnerCountry=&targetAudience=&programStatus=
+Authorization: Bearer {token}
+```
+
+#### 创建交流项目
+```http
+POST /exchange-programs
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "programName": "string",
+  "programCode": "string",
+  "programType": 1,
+  "partnerInstitution": "string",
+  "partnerCountry": "string",
+  "partnerCity": "string",
+  "programDuration": 30,
+  "startDate": "2024-06-01",
+  "endDate": "2024-06-30",
+  "applicationDeadline": "2024-04-01",
+  "maxParticipants": 20,
+  "targetAudience": 1,
+  "languageRequirement": "英语四级",
+  "gpaRequirement": 3.0,
+  "majorRequirements": ["计算机", "软件工程"],
+  "programDescription": "string",
+  "learningObjectives": "string",
+  "activities": "string",
+  "accommodationInfo": "string",
+  "costInfo": "string",
+  "scholarshipAvailable": 1,
+  "scholarshipAmount": 5000
+}
+```
+
+#### 快速报名
+```http
+POST /exchange-programs/{id}/apply
+Authorization: Bearer {token}
+Content-Type: multipart/form-data
+
+{
+  "applicationForm": "json",
+  "motivationLetter": "file",
+  "recommendationLetters": ["file1", "file2"],
+  "transcript": "file",
+  "languageCertificate": "file",
+  "passport": "file",
+  "currentGpa": 3.5,
+  "languageProficiency": "CET-6",
+  "previousExperience": "string",
+  "specialRequirements": "string",
+  "emergencyContact": "json"
+}
+```
+
+#### 申请状态查询
+```http
+GET /exchange-applications/{id}/status
+Authorization: Bearer {token}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "applicationId": 1,
+    "currentStatus": "初审通过",
+    "statusCode": 2,
+    "progressSteps": [
+      {
+        "step": "提交申请",
+        "status": "completed",
+        "completedAt": "2024-01-01T10:00:00Z"
+      },
+      {
+        "step": "材料审核",
+        "status": "completed",
+        "completedAt": "2024-01-05T15:00:00Z"
+      },
+      {
+        "step": "面试环节",
+        "status": "scheduled",
+        "scheduledAt": "2024-01-10T14:00:00Z"
+      },
+      {
+        "step": "最终录取",
+        "status": "pending"
+      }
+    ],
+    "nextAction": "准备面试",
+    "interviewInfo": {
+      "time": "2024-01-10T14:00:00Z",
+      "location": "国际交流中心201室",
+      "interviewer": "张教授",
+      "requirements": "请携带相关证书原件"
+    },
+    "estimatedResult": "2024-01-15T17:00:00Z"
+  }
+}
+```
+
+### 科研项目管理
+
+#### 获取科研项目列表
+```http
+GET /research-projects?page=1&size=20&projectType=&researchField=&currentPhase=&projectStatus=
+Authorization: Bearer {token}
+```
+
+#### 创建科研项目
+```http
+POST /research-projects
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "projectName": "string",
+  "projectCode": "string",
+  "projectType": 1,
+  "fundingAgency": "string",
+  "principalInvestigatorId": 1,
+  "coInvestigators": [2, 3],
+  "departmentId": 1,
+  "researchField": "string",
+  "keywords": ["AI", "机器学习"],
+  "projectAbstract": "string",
+  "researchObjectives": "string",
+  "researchMethodology": "string",
+  "expectedOutcomes": "string",
+  "innovationPoints": "string",
+  "totalBudget": 500000,
+  "startDate": "2024-01-01",
+  "endDate": "2024-12-31",
+  "milestonePlan": "json"
+}
+```
+
+#### 项目进展报告
+```http
+POST /research-projects/{id}/progress-report
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "reportPeriod": "2024年第一季度",
+  "progressSummary": "string",
+  "achievedMilestones": ["里程碑1", "里程碑2"],
+  "currentPhase": 3,
+  "progressPercentage": 25,
+  "budgetUsage": {
+    "used": 125000,
+    "remaining": 375000,
+    "categories": [
+      {"category": "人员费", "used": 80000},
+      {"category": "设备费", "used": 30000},
+      {"category": "材料费", "used": 15000}
+    ]
+  },
+  "achievements": [
+    {
+      "type": "论文",
+      "title": "基于深度学习的图像识别研究",
+      "journal": "计算机学报",
+      "status": "已发表"
+    }
+  ],
+  "challenges": "string",
+  "nextSteps": "string",
+  "riskAssessment": "string"
+}
+```
+
+## 系统管理模块API
+
+### 系统配置
+
+#### 获取系统配置
+```http
+GET /system-configs?configGroup=&configKey=
+Authorization: Bearer {token}
+```
+
+#### 更新系统配置
+```http
+PUT /system-configs/{key}
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "configValue": "string",
+  "description": "string"
+}
+```
+
+### 文件管理
+
+#### 文件上传
+```http
+POST /files/upload
+Authorization: Bearer {token}
+Content-Type: multipart/form-data
+
+{
+  "file": "file",
+  "businessType": "string",
+  "businessId": 1,
+  "accessLevel": 1
+}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "fileId": 1,
+    "originalName": "document.pdf",
+    "storedName": "20240101_abc123.pdf",
+    "filePath": "/uploads/2024/01/01/20240101_abc123.pdf",
+    "fileSize": 1024000,
+    "fileType": "pdf",
+    "downloadUrl": "https://api.example.com/files/download/1"
+  }
+}
+```
+
+#### 文件下载
+```http
+GET /files/download/{id}
+Authorization: Bearer {token}
+```
+
+#### 文件删除
+```http
+DELETE /files/{id}
+Authorization: Bearer {token}
+```
+
+### 通知管理
+
+#### 发送通知
+```http
+POST /notifications
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "title": "string",
+  "content": "string",
+  "notificationType": 1,
+  "receiverIds": [1, 2, 3],
+  "businessType": "string",
+  "businessId": 1,
+  "priority": 3
+}
+```
+
+#### 获取通知列表
+```http
+GET /notifications?page=1&size=20&isRead=&notificationType=
+Authorization: Bearer {token}
+```
+
+#### 标记已读
+```http
+PUT /notifications/{id}/read
+Authorization: Bearer {token}
+```
+
+#### 批量标记已读
+```http
+PUT /notifications/batch-read
+Authorization: Bearer {token}
+Content-Type: application/json
+
+{
+  "notificationIds": [1, 2, 3]
+}
+```
+
+### 操作日志
+
+#### 获取操作日志
+```http
+GET /operation-logs?page=1&size=20&userId=&operationType=&startDate=&endDate=
+Authorization: Bearer {token}
+```
+
+### 数据统计
+
+#### 系统概览统计
+```http
+GET /statistics/overview
+Authorization: Bearer {token}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "data": {
+    "userStatistics": {
+      "totalUsers": 1500,
+      "activeUsers": 1200,
+      "newUsersThisMonth": 50,
+      "usersByRole": [
+        {"role": "学生", "count": 1000},
+        {"role": "教师", "count": 400},
+        {"role": "管理员", "count": 100}
+      ]
+    },
+    "projectStatistics": {
+      "totalProjects": 200,
+      "activeProjects": 150,
+      "completedProjects": 45,
+      "projectsByType": [
+        {"type": "科研项目", "count": 80},
+        {"type": "竞赛项目", "count": 70},
+        {"type": "实训项目", "count": 50}
+      ]
+    },
+    "competitionStatistics": {
+      "totalCompetitions": 50,
+      "totalAwards": 300,
+      "awardsByLevel": [
+        {"level": "国家级", "count": 50},
+        {"level": "省部级", "count": 100},
+        {"level": "校级", "count": 150}
+      ]
+    },
+    "labStatistics": {
+      "totalLabs": 30,
+      "totalEquipment": 500,
+      "equipmentUtilization": 75.5,
+      "activeBorrowings": 45
+    }
+  }
+}
+```
+
+## 错误码定义
+
+### 通用错误码
+- `200`: 成功
+- `400`: 请求参数错误
+- `401`: 未授权
+- `403`: 权限不足
+- `404`: 资源不存在
+- `409`: 资源冲突
+- `422`: 数据验证失败
+- `500`: 服务器内部错误
+
+### 业务错误码
+- `10001`: 用户名或密码错误
+- `10002`: 验证码错误
+- `10003`: 账户已被禁用
+- `10004`: Token已过期
+- `10005`: Token无效
+
+- `20001`: 项目不存在
+- `20002`: 项目已满员
+- `20003`: 重复申请
+- `20004`: 申请已截止
+
+- `30001`: 竞赛不存在
+- `30002`: 获奖信息重复
+- `30003`: 证书文件无效
+- `30004`: 审核权限不足
+
+- `40001`: 实验室不存在
+- `40002`: 设备不可用
+- `40003`: 借用时间冲突
+- `40004`: 远程控制失败
+
+- `50001`: 交流项目不存在
+- `50002`: 申请材料不完整
+- `50003`: 不符合申请条件
+- `50004`: 申请已截止
+
+### 错误响应格式
+```json
+{
+  "code": 400,
+  "message": "请求参数错误",
+  "details": "用户名不能为空",
+  "timestamp": "2024-01-01T12:00:00Z",
+  "requestId": "uuid",
+  "path": "/api/v1/users"
+}
+```
+
+---
+
+## 版本历史
+- **v1.0** (2024年): 初始版本,包含所有核心功能模块的API接口定义
+
+## 联系信息
+- **技术支持**: tech-support@inno-res-comp.edu.cn
+- **API文档**: https://docs.inno-res-comp.edu.cn/api
+- **开发者社区**: https://community.inno-res-comp.edu.cn

+ 48 - 0
README.md

@@ -0,0 +1,48 @@
+# inno-res-comp-ms
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Recommended Browser Setup
+
+- Chromium-based browsers (Chrome, Edge, Brave, etc.):
+  - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) 
+  - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters)
+- Firefox:
+  - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/)
+  - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/)
+
+## Type Support for `.vue` Imports in TS
+
+TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vite.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+npm run build
+```
+
+### Lint with [ESLint](https://eslint.org/)
+
+```sh
+npm run lint
+```

+ 1 - 0
env.d.ts

@@ -0,0 +1 @@
+/// <reference types="vite/client" />

+ 22 - 0
eslint.config.ts

@@ -0,0 +1,22 @@
+import { globalIgnores } from 'eslint/config'
+import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'
+import pluginVue from 'eslint-plugin-vue'
+import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'
+
+// To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
+// import { configureVueProject } from '@vue/eslint-config-typescript'
+// configureVueProject({ scriptLangs: ['ts', 'tsx'] })
+// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup
+
+export default defineConfigWithVueTs(
+  {
+    name: 'app/files-to-lint',
+    files: ['**/*.{ts,mts,tsx,vue}'],
+  },
+
+  globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
+
+  pluginVue.configs['flat/essential'],
+  vueTsConfigs.recommended,
+  skipFormatting,
+)

+ 13 - 0
index.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta charset="UTF-8">
+    <link rel="icon" href="/favicon.ico">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Vite App</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 6283 - 0
package-lock.json

@@ -0,0 +1,6283 @@
+{
+  "name": "inno-res-comp-ms",
+  "version": "0.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "inno-res-comp-ms",
+      "version": "0.0.0",
+      "dependencies": {
+        "@element-plus/icons-vue": "^2.3.2",
+        "element-plus": "^2.11.4",
+        "pinia": "^3.0.3",
+        "vue": "^3.5.22",
+        "vue-router": "^4.5.1"
+      },
+      "devDependencies": {
+        "@tsconfig/node22": "^22.0.2",
+        "@types/node": "^22.18.6",
+        "@vitejs/plugin-vue": "^6.0.1",
+        "@vue/eslint-config-prettier": "^10.2.0",
+        "@vue/eslint-config-typescript": "^14.6.0",
+        "@vue/tsconfig": "^0.8.1",
+        "eslint": "^9.33.0",
+        "eslint-plugin-vue": "~10.4.0",
+        "jiti": "^2.5.1",
+        "npm-run-all2": "^8.0.4",
+        "prettier": "3.6.2",
+        "sass-embedded": "^1.93.2",
+        "typescript": "~5.9.0",
+        "vite": "^7.1.7",
+        "vite-plugin-vue-devtools": "^8.0.2",
+        "vue-tsc": "^3.1.0"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz",
+      "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.27.1",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.28.4",
+      "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.4.tgz",
+      "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.28.4",
+      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.4.tgz",
+      "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.27.1",
+        "@babel/generator": "^7.28.3",
+        "@babel/helper-compilation-targets": "^7.27.2",
+        "@babel/helper-module-transforms": "^7.28.3",
+        "@babel/helpers": "^7.28.4",
+        "@babel/parser": "^7.28.4",
+        "@babel/template": "^7.27.2",
+        "@babel/traverse": "^7.28.4",
+        "@babel/types": "^7.28.4",
+        "@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"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.28.3",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.3.tgz",
+      "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.28.3",
+        "@babel/types": "^7.28.2",
+        "@jridgewell/gen-mapping": "^0.3.12",
+        "@jridgewell/trace-mapping": "^0.3.28",
+        "jsesc": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.27.3",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+      "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.27.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.27.2",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+      "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.28.3",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
+      "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "@babel/helper-member-expression-to-functions": "^7.27.1",
+        "@babel/helper-optimise-call-expression": "^7.27.1",
+        "@babel/helper-replace-supers": "^7.27.1",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+        "@babel/traverse": "^7.28.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-globals": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+      "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
+      "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.27.1",
+        "@babel/types": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+      "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.27.1",
+        "@babel/types": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.28.3",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+      "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.27.1",
+        "@babel/helper-validator-identifier": "^7.27.1",
+        "@babel/traverse": "^7.28.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+      "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+      "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
+      "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-member-expression-to-functions": "^7.27.1",
+        "@babel/helper-optimise-call-expression": "^7.27.1",
+        "@babel/traverse": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+      "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.27.1",
+        "@babel/types": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+      "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+      "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.28.4",
+      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.4.tgz",
+      "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.27.2",
+        "@babel/types": "^7.28.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.28.4",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz",
+      "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.28.4"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-decorators": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz",
+      "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/plugin-syntax-decorators": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-decorators": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz",
+      "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
+      "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
+      "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
+      "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typescript": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz",
+      "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "@babel/helper-create-class-features-plugin": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+        "@babel/plugin-syntax-typescript": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.27.2",
+      "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz",
+      "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.27.1",
+        "@babel/parser": "^7.27.2",
+        "@babel/types": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.28.4",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.4.tgz",
+      "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.27.1",
+        "@babel/generator": "^7.28.3",
+        "@babel/helper-globals": "^7.28.0",
+        "@babel/parser": "^7.28.4",
+        "@babel/template": "^7.27.2",
+        "@babel/types": "^7.28.4",
+        "debug": "^4.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.28.4",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz",
+      "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.27.1",
+        "@babel/helper-validator-identifier": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@bufbuild/protobuf": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.9.0.tgz",
+      "integrity": "sha512-rnJenoStJ8nvmt9Gzye8nkYd6V22xUAnu4086ER7h1zJ508vStko4pMvDeQ446ilDTFpV5wnoc5YS7XvMwwMqA==",
+      "dev": true,
+      "license": "(Apache-2.0 AND BSD-3-Clause)"
+    },
+    "node_modules/@ctrl/tinycolor": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@element-plus/icons-vue": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
+      "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
+      "license": "MIT",
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz",
+      "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.10.tgz",
+      "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz",
+      "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.10.tgz",
+      "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz",
+      "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz",
+      "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz",
+      "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz",
+      "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz",
+      "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz",
+      "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz",
+      "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz",
+      "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz",
+      "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz",
+      "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz",
+      "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz",
+      "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz",
+      "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz",
+      "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz",
+      "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz",
+      "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz",
+      "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz",
+      "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz",
+      "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz",
+      "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz",
+      "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz",
+      "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+      "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^3.4.3"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.12.1",
+      "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@eslint/config-array": {
+      "version": "0.21.0",
+      "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.21.0.tgz",
+      "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/object-schema": "^2.1.6",
+        "debug": "^4.3.1",
+        "minimatch": "^3.1.2"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/@eslint/config-array/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/@eslint/config-helpers": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.4.0.tgz",
+      "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/core": "^0.16.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/core": {
+      "version": "0.16.0",
+      "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.16.0.tgz",
+      "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+      "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/@eslint/js": {
+      "version": "9.37.0",
+      "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.37.0.tgz",
+      "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
+      }
+    },
+    "node_modules/@eslint/object-schema": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/plugin-kit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
+      "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/core": "^0.16.0",
+        "levn": "^0.4.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@floating-ui/core": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.3.tgz",
+      "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.10"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.4.tgz",
+      "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/core": "^1.7.3",
+        "@floating-ui/utils": "^0.2.10"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
+      "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+      "license": "MIT"
+    },
+    "node_modules/@humanfs/core": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz",
+      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanfs/node": {
+      "version": "0.16.7",
+      "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.7.tgz",
+      "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@humanfs/core": "^0.19.1",
+        "@humanwhocodes/retry": "^0.4.0"
+      },
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/retry": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+      "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.13",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+      "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/remapping": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+      "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+      "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.31",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+      "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@parcel/watcher": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz",
+      "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "detect-libc": "^1.0.3",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "node-addon-api": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher-android-arm64": "2.5.1",
+        "@parcel/watcher-darwin-arm64": "2.5.1",
+        "@parcel/watcher-darwin-x64": "2.5.1",
+        "@parcel/watcher-freebsd-x64": "2.5.1",
+        "@parcel/watcher-linux-arm-glibc": "2.5.1",
+        "@parcel/watcher-linux-arm-musl": "2.5.1",
+        "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+        "@parcel/watcher-linux-arm64-musl": "2.5.1",
+        "@parcel/watcher-linux-x64-glibc": "2.5.1",
+        "@parcel/watcher-linux-x64-musl": "2.5.1",
+        "@parcel/watcher-win32-arm64": "2.5.1",
+        "@parcel/watcher-win32-ia32": "2.5.1",
+        "@parcel/watcher-win32-x64": "2.5.1"
+      }
+    },
+    "node_modules/@parcel/watcher-android-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+      "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+      "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+      "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-freebsd-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+      "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+      "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+      "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+      "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+      "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+      "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+      "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+      "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-ia32": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+      "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+      "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@pkgr/core": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmmirror.com/@pkgr/core/-/core-0.2.9.tgz",
+      "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/pkgr"
+      }
+    },
+    "node_modules/@polka/url": {
+      "version": "1.0.0-next.29",
+      "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz",
+      "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@popperjs/core": {
+      "name": "@sxzz/popperjs-es",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
+    "node_modules/@rolldown/pluginutils": {
+      "version": "1.0.0-beta.29",
+      "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz",
+      "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz",
+      "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz",
+      "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz",
+      "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz",
+      "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz",
+      "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz",
+      "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz",
+      "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz",
+      "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz",
+      "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz",
+      "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-gnu": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz",
+      "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz",
+      "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz",
+      "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-musl": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz",
+      "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz",
+      "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz",
+      "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz",
+      "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-openharmony-arm64": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz",
+      "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz",
+      "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz",
+      "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-gnu": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz",
+      "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz",
+      "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@sec-ant/readable-stream": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+      "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@sindresorhus/merge-streams": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+      "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@tsconfig/node22": {
+      "version": "22.0.2",
+      "resolved": "https://registry.npmmirror.com/@tsconfig/node22/-/node22-22.0.2.tgz",
+      "integrity": "sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.15",
+      "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/lodash-es": {
+      "version": "4.17.12",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/lodash": "*"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "22.18.9",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.18.9.tgz",
+      "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~6.21.0"
+      }
+    },
+    "node_modules/@types/web-bluetooth": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
+      "license": "MIT"
+    },
+    "node_modules/@typescript-eslint/eslint-plugin": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+      "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/regexpp": "^4.10.0",
+        "@typescript-eslint/scope-manager": "8.46.0",
+        "@typescript-eslint/type-utils": "8.46.0",
+        "@typescript-eslint/utils": "8.46.0",
+        "@typescript-eslint/visitor-keys": "8.46.0",
+        "graphemer": "^1.4.0",
+        "ignore": "^7.0.0",
+        "natural-compare": "^1.4.0",
+        "ts-api-utils": "^2.1.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "@typescript-eslint/parser": "^8.46.0",
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz",
+      "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/@typescript-eslint/parser": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+      "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/scope-manager": "8.46.0",
+        "@typescript-eslint/types": "8.46.0",
+        "@typescript-eslint/typescript-estree": "8.46.0",
+        "@typescript-eslint/visitor-keys": "8.46.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/project-service": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+      "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/tsconfig-utils": "^8.46.0",
+        "@typescript-eslint/types": "^8.46.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+      "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.46.0",
+        "@typescript-eslint/visitor-keys": "8.46.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/tsconfig-utils": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+      "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/type-utils": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+      "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.46.0",
+        "@typescript-eslint/typescript-estree": "8.46.0",
+        "@typescript-eslint/utils": "8.46.0",
+        "debug": "^4.3.4",
+        "ts-api-utils": "^2.1.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/types": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.46.0.tgz",
+      "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+      "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/project-service": "8.46.0",
+        "@typescript-eslint/tsconfig-utils": "8.46.0",
+        "@typescript-eslint/types": "8.46.0",
+        "@typescript-eslint/visitor-keys": "8.46.0",
+        "debug": "^4.3.4",
+        "fast-glob": "^3.3.2",
+        "is-glob": "^4.0.3",
+        "minimatch": "^9.0.4",
+        "semver": "^7.6.0",
+        "ts-api-utils": "^2.1.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/utils": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+      "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.7.0",
+        "@typescript-eslint/scope-manager": "8.46.0",
+        "@typescript-eslint/types": "8.46.0",
+        "@typescript-eslint/typescript-estree": "8.46.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+      "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.46.0",
+        "eslint-visitor-keys": "^4.2.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz",
+      "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rolldown/pluginutils": "1.0.0-beta.29"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "peerDependencies": {
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@volar/language-core": {
+      "version": "2.4.23",
+      "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.23.tgz",
+      "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/source-map": "2.4.23"
+      }
+    },
+    "node_modules/@volar/source-map": {
+      "version": "2.4.23",
+      "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.23.tgz",
+      "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@volar/typescript": {
+      "version": "2.4.23",
+      "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.23.tgz",
+      "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.23",
+        "path-browserify": "^1.0.1",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@vue/babel-helper-vue-transform-on": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz",
+      "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vue/babel-plugin-jsx": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz",
+      "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/plugin-syntax-jsx": "^7.27.1",
+        "@babel/template": "^7.27.2",
+        "@babel/traverse": "^7.28.0",
+        "@babel/types": "^7.28.2",
+        "@vue/babel-helper-vue-transform-on": "1.5.0",
+        "@vue/babel-plugin-resolve-type": "1.5.0",
+        "@vue/shared": "^3.5.18"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vue/babel-plugin-resolve-type": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz",
+      "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.27.1",
+        "@babel/helper-module-imports": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/parser": "^7.28.0",
+        "@vue/compiler-sfc": "^3.5.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sxzz"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz",
+      "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.28.4",
+        "@vue/shared": "3.5.22",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz",
+      "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.22",
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz",
+      "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.28.4",
+        "@vue/compiler-core": "3.5.22",
+        "@vue/compiler-dom": "3.5.22",
+        "@vue/compiler-ssr": "3.5.22",
+        "@vue/shared": "3.5.22",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.19",
+        "postcss": "^8.5.6",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz",
+      "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.22",
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
+      "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.7"
+      }
+    },
+    "node_modules/@vue/devtools-core": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-8.0.2.tgz",
+      "integrity": "sha512-V7eKTTHoS6KfK8PSGMLZMhGv/9yNDrmv6Qc3r71QILulnzPnqK2frsTyx3e2MrhdUZnENPEm6hcb4z0GZOqNhw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^8.0.2",
+        "@vue/devtools-shared": "^8.0.2",
+        "mitt": "^3.0.1",
+        "nanoid": "^5.1.5",
+        "pathe": "^2.0.3",
+        "vite-hot-client": "^2.1.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/@vue/devtools-core/node_modules/@vue/devtools-kit": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.0.2.tgz",
+      "integrity": "sha512-yjZKdEmhJzQqbOh4KFBfTOQjDPMrjjBNCnHBvnTGJX+YLAqoUtY2J+cg7BE+EA8KUv8LprECq04ts75wCoIGWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-shared": "^8.0.2",
+        "birpc": "^2.5.0",
+        "hookable": "^5.5.3",
+        "mitt": "^3.0.1",
+        "perfect-debounce": "^2.0.0",
+        "speakingurl": "^14.0.1",
+        "superjson": "^2.2.2"
+      }
+    },
+    "node_modules/@vue/devtools-core/node_modules/@vue/devtools-shared": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.0.2.tgz",
+      "integrity": "sha512-mLU0QVdy5Lp40PMGSixDw/Kbd6v5dkQXltd2r+mdVQV7iUog2NlZuLxFZApFZ/mObUBDhoCpf0T3zF2FWWdeHw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "rfdc": "^1.4.1"
+      }
+    },
+    "node_modules/@vue/devtools-core/node_modules/nanoid": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.6.tgz",
+      "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.js"
+      },
+      "engines": {
+        "node": "^18 || >=20"
+      }
+    },
+    "node_modules/@vue/devtools-core/node_modules/perfect-debounce": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.0.0.tgz",
+      "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vue/devtools-kit": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
+      "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-shared": "^7.7.7",
+        "birpc": "^2.3.0",
+        "hookable": "^5.5.3",
+        "mitt": "^3.0.1",
+        "perfect-debounce": "^1.0.0",
+        "speakingurl": "^14.0.1",
+        "superjson": "^2.2.2"
+      }
+    },
+    "node_modules/@vue/devtools-shared": {
+      "version": "7.7.7",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
+      "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==",
+      "license": "MIT",
+      "dependencies": {
+        "rfdc": "^1.4.1"
+      }
+    },
+    "node_modules/@vue/eslint-config-prettier": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz",
+      "integrity": "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-config-prettier": "^10.0.1",
+        "eslint-plugin-prettier": "^5.2.2"
+      },
+      "peerDependencies": {
+        "eslint": ">= 8.21.0",
+        "prettier": ">= 3.0.0"
+      }
+    },
+    "node_modules/@vue/eslint-config-typescript": {
+      "version": "14.6.0",
+      "resolved": "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-14.6.0.tgz",
+      "integrity": "sha512-UpiRY/7go4Yps4mYCjkvlIbVWmn9YvPGQDxTAlcKLphyaD77LjIu3plH4Y9zNT0GB4f3K5tMmhhtRhPOgrQ/bQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/utils": "^8.35.1",
+        "fast-glob": "^3.3.3",
+        "typescript-eslint": "^8.35.1",
+        "vue-eslint-parser": "^10.2.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "peerDependencies": {
+        "eslint": "^9.10.0",
+        "eslint-plugin-vue": "^9.28.0 || ^10.0.0",
+        "typescript": ">=4.8.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vue/language-core": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.1.1.tgz",
+      "integrity": "sha512-qjMY3Q+hUCjdH+jLrQapqgpsJ0rd/2mAY02lZoHG3VFJZZZKLjAlV+Oo9QmWIT4jh8+Rx8RUGUi++d7T9Wb6Mw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.23",
+        "@vue/compiler-dom": "^3.5.0",
+        "@vue/shared": "^3.5.0",
+        "alien-signals": "^3.0.0",
+        "muggle-string": "^0.4.1",
+        "path-browserify": "^1.0.1",
+        "picomatch": "^4.0.2"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vue/language-core/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.22.tgz",
+      "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.22.tgz",
+      "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.22",
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz",
+      "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.22",
+        "@vue/runtime-core": "3.5.22",
+        "@vue/shared": "3.5.22",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.22.tgz",
+      "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.22",
+        "@vue/shared": "3.5.22"
+      },
+      "peerDependencies": {
+        "vue": "3.5.22"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.22.tgz",
+      "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==",
+      "license": "MIT"
+    },
+    "node_modules/@vue/tsconfig": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.8.1.tgz",
+      "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "typescript": "5.x",
+        "vue": "^3.4.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/core": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "license": "MIT",
+      "dependencies": {
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.15.0",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/alien-signals": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.0.0.tgz",
+      "integrity": "sha512-JHoRJf18Y6HN4/KZALr3iU+0vW9LKG+8FMThQlbn4+gv8utsLIkwpomjElGPccGeNwh0FI2HN6BLnyFLo6OyLQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/ansis": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/ansis/-/ansis-4.2.0.tgz",
+      "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "node_modules/async-validator": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+      "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
+      "license": "MIT"
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/baseline-browser-mapping": {
+      "version": "2.8.16",
+      "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz",
+      "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "baseline-browser-mapping": "dist/cli.js"
+      }
+    },
+    "node_modules/birpc": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.6.1.tgz",
+      "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/brace-expansion": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.26.3",
+      "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.26.3.tgz",
+      "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "baseline-browser-mapping": "^2.8.9",
+        "caniuse-lite": "^1.0.30001746",
+        "electron-to-chromium": "^1.5.227",
+        "node-releases": "^2.0.21",
+        "update-browserslist-db": "^1.1.3"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer-builder": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/buffer-builder/-/buffer-builder-0.2.0.tgz",
+      "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==",
+      "dev": true,
+      "license": "MIT/X11"
+    },
+    "node_modules/bundle-name": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz",
+      "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "run-applescript": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001749",
+      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz",
+      "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "CC-BY-4.0"
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz",
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/colorjs.io": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz",
+      "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/copy-anything": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz",
+      "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+      "license": "MIT",
+      "dependencies": {
+        "is-what": "^4.1.8"
+      },
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "license": "MIT"
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.18",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.18.tgz",
+      "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
+      "license": "MIT"
+    },
+    "node_modules/debug": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz",
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/default-browser": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.2.1.tgz",
+      "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bundle-name": "^4.1.0",
+        "default-browser-id": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/default-browser-id": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.0.tgz",
+      "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/define-lazy-prop": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+      "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "bin": {
+        "detect-libc": "bin/detect-libc.js"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.5.234",
+      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz",
+      "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/element-plus": {
+      "version": "2.11.4",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.4.tgz",
+      "integrity": "sha512-sLq+Ypd0cIVilv8wGGMEGvzRVBBsRpJjnAS5PsI/1JU1COZXqzH3N1UYMUc/HCdvdjf6dfrBy80Sj7KcACsT7w==",
+      "license": "MIT",
+      "dependencies": {
+        "@ctrl/tinycolor": "^3.4.1",
+        "@element-plus/icons-vue": "^2.3.1",
+        "@floating-ui/dom": "^1.0.1",
+        "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+        "@types/lodash": "^4.17.20",
+        "@types/lodash-es": "^4.17.12",
+        "@vueuse/core": "^9.1.0",
+        "async-validator": "^4.2.5",
+        "dayjs": "^1.11.13",
+        "escape-html": "^1.0.3",
+        "lodash": "^4.17.21",
+        "lodash-es": "^4.17.21",
+        "lodash-unified": "^1.0.3",
+        "memoize-one": "^6.0.0",
+        "normalize-wheel-es": "^1.2.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/error-stack-parser-es": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz",
+      "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.25.10",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.10.tgz",
+      "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.25.10",
+        "@esbuild/android-arm": "0.25.10",
+        "@esbuild/android-arm64": "0.25.10",
+        "@esbuild/android-x64": "0.25.10",
+        "@esbuild/darwin-arm64": "0.25.10",
+        "@esbuild/darwin-x64": "0.25.10",
+        "@esbuild/freebsd-arm64": "0.25.10",
+        "@esbuild/freebsd-x64": "0.25.10",
+        "@esbuild/linux-arm": "0.25.10",
+        "@esbuild/linux-arm64": "0.25.10",
+        "@esbuild/linux-ia32": "0.25.10",
+        "@esbuild/linux-loong64": "0.25.10",
+        "@esbuild/linux-mips64el": "0.25.10",
+        "@esbuild/linux-ppc64": "0.25.10",
+        "@esbuild/linux-riscv64": "0.25.10",
+        "@esbuild/linux-s390x": "0.25.10",
+        "@esbuild/linux-x64": "0.25.10",
+        "@esbuild/netbsd-arm64": "0.25.10",
+        "@esbuild/netbsd-x64": "0.25.10",
+        "@esbuild/openbsd-arm64": "0.25.10",
+        "@esbuild/openbsd-x64": "0.25.10",
+        "@esbuild/openharmony-arm64": "0.25.10",
+        "@esbuild/sunos-x64": "0.25.10",
+        "@esbuild/win32-arm64": "0.25.10",
+        "@esbuild/win32-ia32": "0.25.10",
+        "@esbuild/win32-x64": "0.25.10"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "license": "MIT"
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "9.37.0",
+      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.37.0.tgz",
+      "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.8.0",
+        "@eslint-community/regexpp": "^4.12.1",
+        "@eslint/config-array": "^0.21.0",
+        "@eslint/config-helpers": "^0.4.0",
+        "@eslint/core": "^0.16.0",
+        "@eslint/eslintrc": "^3.3.1",
+        "@eslint/js": "9.37.0",
+        "@eslint/plugin-kit": "^0.4.0",
+        "@humanfs/node": "^0.16.6",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@humanwhocodes/retry": "^0.4.2",
+        "@types/estree": "^1.0.6",
+        "@types/json-schema": "^7.0.15",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.6",
+        "debug": "^4.3.2",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
+        "esquery": "^1.5.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^8.0.0",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
+      },
+      "peerDependencies": {
+        "jiti": "*"
+      },
+      "peerDependenciesMeta": {
+        "jiti": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-config-prettier": {
+      "version": "10.1.8",
+      "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+      "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "eslint-config-prettier": "bin/cli.js"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint-config-prettier"
+      },
+      "peerDependencies": {
+        "eslint": ">=7.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-prettier": {
+      "version": "5.5.4",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz",
+      "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prettier-linter-helpers": "^1.0.0",
+        "synckit": "^0.11.7"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint-plugin-prettier"
+      },
+      "peerDependencies": {
+        "@types/eslint": ">=8.0.0",
+        "eslint": ">=8.0.0",
+        "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
+        "prettier": ">=3.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/eslint": {
+          "optional": true
+        },
+        "eslint-config-prettier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-plugin-vue": {
+      "version": "10.4.0",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz",
+      "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "natural-compare": "^1.4.0",
+        "nth-check": "^2.1.1",
+        "postcss-selector-parser": "^6.0.15",
+        "semver": "^7.6.3",
+        "xml-name-validator": "^4.0.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "peerDependencies": {
+        "@typescript-eslint/parser": "^7.0.0 || ^8.0.0",
+        "eslint": "^8.57.0 || ^9.0.0",
+        "vue-eslint-parser": "^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@typescript-eslint/parser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "8.4.0",
+      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.4.0.tgz",
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/eslint/node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/espree": {
+      "version": "10.4.0",
+      "resolved": "https://registry.npmmirror.com/espree/-/espree-10.4.0.tgz",
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.15.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^4.2.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/espree/node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz",
+      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "license": "MIT"
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/execa": {
+      "version": "9.6.0",
+      "resolved": "https://registry.npmmirror.com/execa/-/execa-9.6.0.tgz",
+      "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@sindresorhus/merge-streams": "^4.0.0",
+        "cross-spawn": "^7.0.6",
+        "figures": "^6.1.0",
+        "get-stream": "^9.0.0",
+        "human-signals": "^8.0.1",
+        "is-plain-obj": "^4.1.0",
+        "is-stream": "^4.0.1",
+        "npm-run-path": "^6.0.0",
+        "pretty-ms": "^9.2.0",
+        "signal-exit": "^4.1.0",
+        "strip-final-newline": "^4.0.0",
+        "yoctocolors": "^2.1.1"
+      },
+      "engines": {
+        "node": "^18.19.0 || >=20.5.0"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-diff": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz",
+      "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.8"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fast-glob/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fastq": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz",
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/figures": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz",
+      "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-unicode-supported": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz",
+      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.4"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz",
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-9.0.1.tgz",
+      "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@sec-ant/readable-stream": "^0.4.1",
+        "is-stream": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/globals": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz",
+      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/hookable": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
+      "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+      "license": "MIT"
+    },
+    "node_modules/human-signals": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-8.0.1.tgz",
+      "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/immutable": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz",
+      "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz",
+      "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-inside-container": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz",
+      "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^3.0.0"
+      },
+      "bin": {
+        "is-inside-container": "cli.js"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-plain-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-4.0.1.tgz",
+      "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-unicode-supported": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+      "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "4.1.16",
+      "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz",
+      "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz",
+      "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-inside-container": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/jiti": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz",
+      "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jiti": "lib/jiti-cli.mjs"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz",
+      "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/kolorist": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz",
+      "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "license": "MIT"
+    },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+      "license": "MIT"
+    },
+    "node_modules/lodash-unified": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/lodash-es": "*",
+        "lodash": "*",
+        "lodash-es": "*"
+      }
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.19",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.19.tgz",
+      "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.5"
+      }
+    },
+    "node_modules/memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+      "license": "MIT"
+    },
+    "node_modules/memorystream": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz",
+      "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+      "license": "MIT"
+    },
+    "node_modules/mrmime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz",
+      "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/muggle-string": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz",
+      "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/node-addon-api": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
+      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.23",
+      "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.23.tgz",
+      "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/normalize-wheel-es": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/npm-normalize-package-bin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
+      "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
+    "node_modules/npm-run-all2": {
+      "version": "8.0.4",
+      "resolved": "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-8.0.4.tgz",
+      "integrity": "sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^6.2.1",
+        "cross-spawn": "^7.0.6",
+        "memorystream": "^0.3.1",
+        "picomatch": "^4.0.2",
+        "pidtree": "^0.6.0",
+        "read-package-json-fast": "^4.0.0",
+        "shell-quote": "^1.7.3",
+        "which": "^5.0.0"
+      },
+      "bin": {
+        "npm-run-all": "bin/npm-run-all/index.js",
+        "npm-run-all2": "bin/npm-run-all/index.js",
+        "run-p": "bin/run-p/index.js",
+        "run-s": "bin/run-s/index.js"
+      },
+      "engines": {
+        "node": "^20.5.0 || >=22.0.0",
+        "npm": ">= 10"
+      }
+    },
+    "node_modules/npm-run-all2/node_modules/ansi-styles": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz",
+      "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/npm-run-all2/node_modules/isexe": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz",
+      "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/npm-run-all2/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/npm-run-all2/node_modules/which": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/which/-/which-5.0.0.tgz",
+      "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^3.1.1"
+      },
+      "bin": {
+        "node-which": "bin/which.js"
+      },
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz",
+      "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^4.0.0",
+        "unicorn-magic": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/npm-run-path/node_modules/path-key": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz",
+      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/ohash": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz",
+      "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/open": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmmirror.com/open/-/open-10.2.0.tgz",
+      "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "default-browser": "^5.2.1",
+        "define-lazy-prop": "^3.0.0",
+        "is-inside-container": "^1.0.0",
+        "wsl-utils": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-ms": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-4.0.0.tgz",
+      "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pathe": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/perfect-debounce": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+      "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+      "license": "MIT"
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pidtree": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz",
+      "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "pidtree": "bin/pidtree.js"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/pinia": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz",
+      "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^7.7.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.4.4",
+        "vue": "^2.7.0 || ^3.5.11"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.5.6",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.11",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prettier": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz",
+      "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
+    "node_modules/prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-diff": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/pretty-ms": {
+      "version": "9.3.0",
+      "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-9.3.0.tgz",
+      "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parse-ms": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/read-package-json-fast": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz",
+      "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "json-parse-even-better-errors": "^4.0.0",
+        "npm-normalize-package-bin": "^4.0.0"
+      },
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">= 14.18.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rfdc": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "license": "MIT"
+    },
+    "node_modules/rollup": {
+      "version": "4.52.4",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.52.4.tgz",
+      "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.8"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.52.4",
+        "@rollup/rollup-android-arm64": "4.52.4",
+        "@rollup/rollup-darwin-arm64": "4.52.4",
+        "@rollup/rollup-darwin-x64": "4.52.4",
+        "@rollup/rollup-freebsd-arm64": "4.52.4",
+        "@rollup/rollup-freebsd-x64": "4.52.4",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.52.4",
+        "@rollup/rollup-linux-arm-musleabihf": "4.52.4",
+        "@rollup/rollup-linux-arm64-gnu": "4.52.4",
+        "@rollup/rollup-linux-arm64-musl": "4.52.4",
+        "@rollup/rollup-linux-loong64-gnu": "4.52.4",
+        "@rollup/rollup-linux-ppc64-gnu": "4.52.4",
+        "@rollup/rollup-linux-riscv64-gnu": "4.52.4",
+        "@rollup/rollup-linux-riscv64-musl": "4.52.4",
+        "@rollup/rollup-linux-s390x-gnu": "4.52.4",
+        "@rollup/rollup-linux-x64-gnu": "4.52.4",
+        "@rollup/rollup-linux-x64-musl": "4.52.4",
+        "@rollup/rollup-openharmony-arm64": "4.52.4",
+        "@rollup/rollup-win32-arm64-msvc": "4.52.4",
+        "@rollup/rollup-win32-ia32-msvc": "4.52.4",
+        "@rollup/rollup-win32-x64-gnu": "4.52.4",
+        "@rollup/rollup-win32-x64-msvc": "4.52.4",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/run-applescript": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.1.0.tgz",
+      "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/rxjs": {
+      "version": "7.8.2",
+      "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz",
+      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/sass": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.93.2.tgz",
+      "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "chokidar": "^4.0.0",
+        "immutable": "^5.0.2",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher": "^2.4.1"
+      }
+    },
+    "node_modules/sass-embedded": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.93.2.tgz",
+      "integrity": "sha512-FvQdkn2dZ8DGiLgi0Uf4zsj7r/BsiLImNa5QJ10eZalY6NfZyjrmWGFcuCN5jNwlDlXFJnftauv+UtvBKLvepQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@bufbuild/protobuf": "^2.5.0",
+        "buffer-builder": "^0.2.0",
+        "colorjs.io": "^0.5.0",
+        "immutable": "^5.0.2",
+        "rxjs": "^7.4.0",
+        "supports-color": "^8.1.1",
+        "sync-child-process": "^1.0.2",
+        "varint": "^6.0.0"
+      },
+      "bin": {
+        "sass": "dist/bin/sass.js"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "optionalDependencies": {
+        "sass-embedded-all-unknown": "1.93.2",
+        "sass-embedded-android-arm": "1.93.2",
+        "sass-embedded-android-arm64": "1.93.2",
+        "sass-embedded-android-riscv64": "1.93.2",
+        "sass-embedded-android-x64": "1.93.2",
+        "sass-embedded-darwin-arm64": "1.93.2",
+        "sass-embedded-darwin-x64": "1.93.2",
+        "sass-embedded-linux-arm": "1.93.2",
+        "sass-embedded-linux-arm64": "1.93.2",
+        "sass-embedded-linux-musl-arm": "1.93.2",
+        "sass-embedded-linux-musl-arm64": "1.93.2",
+        "sass-embedded-linux-musl-riscv64": "1.93.2",
+        "sass-embedded-linux-musl-x64": "1.93.2",
+        "sass-embedded-linux-riscv64": "1.93.2",
+        "sass-embedded-linux-x64": "1.93.2",
+        "sass-embedded-unknown-all": "1.93.2",
+        "sass-embedded-win32-arm64": "1.93.2",
+        "sass-embedded-win32-x64": "1.93.2"
+      }
+    },
+    "node_modules/sass-embedded-all-unknown": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.93.2.tgz",
+      "integrity": "sha512-GdEuPXIzmhRS5J7UKAwEvtk8YyHQuFZRcpnEnkA3rwRUI27kwjyXkNeIj38XjUQ3DzrfMe8HcKFaqWGHvblS7Q==",
+      "cpu": [
+        "!arm",
+        "!arm64",
+        "!riscv64",
+        "!x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "sass": "1.93.2"
+      }
+    },
+    "node_modules/sass-embedded-android-arm": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.93.2.tgz",
+      "integrity": "sha512-I8bpO8meZNo5FvFx5FIiE7DGPVOYft0WjuwcCCdeJ6duwfkl6tZdatex1GrSigvTsuz9L0m4ngDcX/Tj/8yMow==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-arm64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.93.2.tgz",
+      "integrity": "sha512-346f4iVGAPGcNP6V6IOOFkN5qnArAoXNTPr5eA/rmNpeGwomdb7kJyQ717r9rbJXxOG8OAAUado6J0qLsjnjXQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-riscv64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.93.2.tgz",
+      "integrity": "sha512-hSMW1s4yJf5guT9mrdkumluqrwh7BjbZ4MbBW9tmi1DRDdlw1Wh9Oy1HnnmOG8x9XcI1qkojtPL6LUuEJmsiDg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-x64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.93.2.tgz",
+      "integrity": "sha512-JqktiHZduvn+ldGBosE40ALgQ//tGCVNAObgcQ6UIZznEJbsHegqStqhRo8UW3x2cgOO2XYJcrInH6cc7wdKbw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-arm64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.93.2.tgz",
+      "integrity": "sha512-qI1X16qKNeBJp+M/5BNW7v/JHCDYWr1/mdoJ7+UMHmP0b5AVudIZtimtK0hnjrLnBECURifd6IkulybR+h+4UA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-x64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.93.2.tgz",
+      "integrity": "sha512-4KeAvlkQ0m0enKUnDGQJZwpovYw99iiMb8CTZRSsQm8Eh7halbJZVmx67f4heFY/zISgVOCcxNg19GrM5NTwtA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.93.2.tgz",
+      "integrity": "sha512-N3+D/ToHtzwLDO+lSH05Wo6/KRxFBPnbjVHASOlHzqJnK+g5cqex7IFAp6ozzlRStySk61Rp6d+YGrqZ6/P0PA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.93.2.tgz",
+      "integrity": "sha512-9ftX6nd5CsShJqJ2WRg+ptaYvUW+spqZfJ88FbcKQBNFQm6L87luj3UI1rB6cP5EWrLwHA754OKxRJyzWiaN6g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.93.2.tgz",
+      "integrity": "sha512-XBTvx66yRenvEsp3VaJCb3HQSyqCsUh7R+pbxcN5TuzueybZi0LXvn9zneksdXcmjACMlMpIVXi6LyHPQkYc8A==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.93.2.tgz",
+      "integrity": "sha512-+3EHuDPkMiAX5kytsjEC1bKZCawB9J6pm2eBIzzLMPWbf5xdx++vO1DpT7hD4bm4ZGn0eVHgSOKIfP6CVz6tVg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-riscv64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.93.2.tgz",
+      "integrity": "sha512-0sB5kmVZDKTYzmCSlTUnjh6mzOhzmQiW/NNI5g8JS4JiHw2sDNTvt1dsFTuqFkUHyEOY3ESTsfHHBQV8Ip4bEA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-x64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.93.2.tgz",
+      "integrity": "sha512-t3ejQ+1LEVuHy7JHBI2tWHhoMfhedUNDjGJR2FKaLgrtJntGnyD1RyX0xb3nuqL/UXiEAtmTmZY+Uh3SLUe1Hg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-riscv64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.93.2.tgz",
+      "integrity": "sha512-e7AndEwAbFtXaLy6on4BfNGTr3wtGZQmypUgYpSNVcYDO+CWxatKVY4cxbehMPhxG9g5ru+eaMfynvhZt7fLaA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-x64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.93.2.tgz",
+      "integrity": "sha512-U3EIUZQL11DU0xDDHXexd4PYPHQaSQa2hzc4EzmhHqrAj+TyfYO94htjWOd+DdTPtSwmLp+9cTWwPZBODzC96w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-unknown-all": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.93.2.tgz",
+      "integrity": "sha512-7VnaOmyewcXohiuoFagJ3SK5ddP9yXpU0rzz+pZQmS1/+5O6vzyFCUoEt3HDRaLctH4GT3nUGoK1jg0ae62IfQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "!android",
+        "!darwin",
+        "!linux",
+        "!win32"
+      ],
+      "dependencies": {
+        "sass": "1.93.2"
+      }
+    },
+    "node_modules/sass-embedded-win32-arm64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.93.2.tgz",
+      "integrity": "sha512-Y90DZDbQvtv4Bt0GTXKlcT9pn4pz8AObEjFF8eyul+/boXwyptPZ/A1EyziAeNaIEIfxyy87z78PUgCeGHsx3Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-win32-x64": {
+      "version": "1.93.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.93.2.tgz",
+      "integrity": "sha512-BbSucRP6PVRZGIwlEBkp+6VQl2GWdkWFMN+9EuOTPrLxCJZoq+yhzmbjspd3PeM8+7WJ7AdFu/uRYdO8tor1iQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.7.3",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
+      "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shell-quote": {
+      "version": "1.8.3",
+      "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz",
+      "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sirv": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.2.tgz",
+      "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@polka/url": "^1.0.0-next.24",
+        "mrmime": "^2.0.0",
+        "totalist": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/speakingurl": {
+      "version": "14.0.1",
+      "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
+      "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+      "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/superjson": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz",
+      "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "copy-anything": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/sync-child-process": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz",
+      "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "sync-message-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/sync-message-port": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.1.3.tgz",
+      "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/synckit": {
+      "version": "0.11.11",
+      "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.11.11.tgz",
+      "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@pkgr/core": "^0.2.9"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/synckit"
+      }
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.15",
+      "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz",
+      "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/tinyglobby/node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tinyglobby/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/totalist": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz",
+      "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ts-api-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+      "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.12"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "dev": true,
+      "license": "0BSD"
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.9.3",
+      "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz",
+      "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/typescript-eslint": {
+      "version": "8.46.0",
+      "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.46.0.tgz",
+      "integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/eslint-plugin": "8.46.0",
+        "@typescript-eslint/parser": "8.46.0",
+        "@typescript-eslint/typescript-estree": "8.46.0",
+        "@typescript-eslint/utils": "8.46.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/unicorn-magic": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+      "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/unplugin-utils": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.1.tgz",
+      "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "pathe": "^2.0.3",
+        "picomatch": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=20.19.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sxzz"
+      }
+    },
+    "node_modules/unplugin-utils/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/varint": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz",
+      "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vite": {
+      "version": "7.1.9",
+      "resolved": "https://registry.npmmirror.com/vite/-/vite-7.1.9.tgz",
+      "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.25.0",
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3",
+        "postcss": "^8.5.6",
+        "rollup": "^4.43.0",
+        "tinyglobby": "^0.2.15"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^20.19.0 || >=22.12.0",
+        "jiti": ">=1.21.0",
+        "less": "^4.0.0",
+        "lightningcss": "^1.21.0",
+        "sass": "^1.70.0",
+        "sass-embedded": "^1.70.0",
+        "stylus": ">=0.54.8",
+        "sugarss": "^5.0.0",
+        "terser": "^5.16.0",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-dev-rpc": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz",
+      "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "birpc": "^2.4.0",
+        "vite-hot-client": "^2.1.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0"
+      }
+    },
+    "node_modules/vite-hot-client": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-2.1.0.tgz",
+      "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-inspect": {
+      "version": "11.3.3",
+      "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz",
+      "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansis": "^4.1.0",
+        "debug": "^4.4.1",
+        "error-stack-parser-es": "^1.0.5",
+        "ohash": "^2.0.11",
+        "open": "^10.2.0",
+        "perfect-debounce": "^2.0.0",
+        "sirv": "^3.0.1",
+        "unplugin-utils": "^0.3.0",
+        "vite-dev-rpc": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^6.0.0 || ^7.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@nuxt/kit": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-inspect/node_modules/perfect-debounce": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.0.0.tgz",
+      "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vite-plugin-vue-devtools": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.0.2.tgz",
+      "integrity": "sha512-1069qvMBcyAu3yXQlvYrkwoyLOk0lSSR/gTKy/vy+Det7TXnouGei6ZcKwr5TIe938v/14oLlp0ow6FSJkkORA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-core": "^8.0.2",
+        "@vue/devtools-kit": "^8.0.2",
+        "@vue/devtools-shared": "^8.0.2",
+        "execa": "^9.6.0",
+        "sirv": "^3.0.2",
+        "vite-plugin-inspect": "^11.3.3",
+        "vite-plugin-vue-inspector": "^5.3.2"
+      },
+      "engines": {
+        "node": ">=v14.21.3"
+      },
+      "peerDependencies": {
+        "vite": "^6.0.0 || ^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-kit": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.0.2.tgz",
+      "integrity": "sha512-yjZKdEmhJzQqbOh4KFBfTOQjDPMrjjBNCnHBvnTGJX+YLAqoUtY2J+cg7BE+EA8KUv8LprECq04ts75wCoIGWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-shared": "^8.0.2",
+        "birpc": "^2.5.0",
+        "hookable": "^5.5.3",
+        "mitt": "^3.0.1",
+        "perfect-debounce": "^2.0.0",
+        "speakingurl": "^14.0.1",
+        "superjson": "^2.2.2"
+      }
+    },
+    "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-shared": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.0.2.tgz",
+      "integrity": "sha512-mLU0QVdy5Lp40PMGSixDw/Kbd6v5dkQXltd2r+mdVQV7iUog2NlZuLxFZApFZ/mObUBDhoCpf0T3zF2FWWdeHw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "rfdc": "^1.4.1"
+      }
+    },
+    "node_modules/vite-plugin-vue-devtools/node_modules/perfect-debounce": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.0.0.tgz",
+      "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vite-plugin-vue-inspector": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.2.tgz",
+      "integrity": "sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.23.0",
+        "@babel/plugin-proposal-decorators": "^7.23.0",
+        "@babel/plugin-syntax-import-attributes": "^7.22.5",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-transform-typescript": "^7.22.15",
+        "@vue/babel-plugin-jsx": "^1.1.5",
+        "@vue/compiler-dom": "^3.3.4",
+        "kolorist": "^1.8.0",
+        "magic-string": "^0.30.4"
+      },
+      "peerDependencies": {
+        "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0"
+      }
+    },
+    "node_modules/vite/node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/vscode-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz",
+      "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vue": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.22.tgz",
+      "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.22",
+        "@vue/compiler-sfc": "3.5.22",
+        "@vue/runtime-dom": "3.5.22",
+        "@vue/server-renderer": "3.5.22",
+        "@vue/shared": "3.5.22"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-eslint-parser": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz",
+      "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.4.0",
+        "eslint-scope": "^8.2.0",
+        "eslint-visitor-keys": "^4.2.0",
+        "espree": "^10.3.0",
+        "esquery": "^1.6.0",
+        "semver": "^7.6.3"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0"
+      }
+    },
+    "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz",
+      "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/vue-router/node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
+    "node_modules/vue-tsc": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.1.1.tgz",
+      "integrity": "sha512-fyixKxFniOVgn+L/4+g8zCG6dflLLt01Agz9jl3TO45Bgk87NZJRmJVPsiK+ouq3LB91jJCbOV+pDkzYTxbI7A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/typescript": "2.4.23",
+        "@vue/language-core": "3.1.1"
+      },
+      "bin": {
+        "vue-tsc": "bin/vue-tsc.js"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wsl-utils": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.1.0.tgz",
+      "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-wsl": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/xml-name-validator": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+      "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/yoctocolors": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.2.tgz",
+      "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    }
+  }
+}

+ 43 - 0
package.json

@@ -0,0 +1,43 @@
+{
+  "name": "inno-res-comp-ms",
+  "version": "0.0.0",
+  "private": true,
+  "type": "module",
+  "engines": {
+    "node": "^20.19.0 || >=22.12.0"
+  },
+  "scripts": {
+    "dev": "vite",
+    "build": "run-p type-check \"build-only {@}\" --",
+    "preview": "vite preview",
+    "build-only": "vite build",
+    "type-check": "vue-tsc --build",
+    "lint": "eslint . --fix",
+    "format": "prettier --write src/"
+  },
+  "dependencies": {
+    "@element-plus/icons-vue": "^2.3.2",
+    "element-plus": "^2.11.4",
+    "pinia": "^3.0.3",
+    "vue": "^3.5.22",
+    "vue-router": "^4.5.1"
+  },
+  "devDependencies": {
+    "@tsconfig/node22": "^22.0.2",
+    "@types/node": "^22.18.6",
+    "@vitejs/plugin-vue": "^6.0.1",
+    "@vue/eslint-config-prettier": "^10.2.0",
+    "@vue/eslint-config-typescript": "^14.6.0",
+    "@vue/tsconfig": "^0.8.1",
+    "eslint": "^9.33.0",
+    "eslint-plugin-vue": "~10.4.0",
+    "jiti": "^2.5.1",
+    "npm-run-all2": "^8.0.4",
+    "prettier": "3.6.2",
+    "sass-embedded": "^1.93.2",
+    "typescript": "~5.9.0",
+    "vite": "^7.1.7",
+    "vite-plugin-vue-devtools": "^8.0.2",
+    "vue-tsc": "^3.1.0"
+  }
+}

BIN
public/favicon.ico


+ 32 - 0
src/App.vue

@@ -0,0 +1,32 @@
+<script setup lang="ts">
+import { useRouter } from 'vue-router'
+
+const router = useRouter()
+</script>
+
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<style>
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+
+#app {
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  width: 100%;
+  height: 100vh;
+}
+
+body {
+  margin: 0;
+  padding: 0;
+}
+</style>

+ 21 - 0
src/main.ts

@@ -0,0 +1,21 @@
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+
+import App from './App.vue'
+import router from './router'
+
+const app = createApp(App)
+
+// 注册所有图标
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component)
+}
+
+app.use(createPinia())
+app.use(router)
+app.use(ElementPlus)
+
+app.mount('#app')

+ 607 - 0
src/page/competition/award-mgmt/index.vue

@@ -0,0 +1,607 @@
+<template>
+  <div class="award-mgmt-container">
+    <!-- 页面头部 -->
+    <PageHeader
+      title="获奖信息管理"
+      description="标准化提交流程,佐证材料管理,双状态审核系统"
+      :icon="Document"
+      :breadcrumbs="breadcrumbs"
+    />
+
+    <!-- 操作栏 -->
+    <div class="action-bar">
+      <el-row :gutter="16" justify="space-between">
+        <el-col :span="12">
+          <el-button type="primary" :icon="Plus" @click="showAddDialog = true">
+            新增获奖信息
+          </el-button>
+          <el-button :icon="Upload" @click="showImportDialog = true">
+            批量导入
+          </el-button>
+          <el-button :icon="Download" @click="exportData">
+            导出数据
+          </el-button>
+        </el-col>
+        <el-col :span="12">
+          <div class="search-bar">
+            <el-input
+              v-model="searchKeyword"
+              placeholder="搜索获奖信息..."
+              :prefix-icon="Search"
+              @input="handleSearch"
+              clearable
+            />
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 筛选器 -->
+    <div class="filter-bar">
+      <el-row :gutter="16">
+        <el-col :span="4">
+          <el-select v-model="filters.status" placeholder="审核状态" @change="handleFilter">
+            <el-option label="全部" value="" />
+            <el-option label="待审核" value="pending" />
+            <el-option label="已通过" value="approved" />
+            <el-option label="已驳回" value="rejected" />
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select v-model="filters.level" placeholder="获奖等级" @change="handleFilter">
+            <el-option label="全部" value="" />
+            <el-option label="国家级" value="national" />
+            <el-option label="省级" value="provincial" />
+            <el-option label="市级" value="municipal" />
+            <el-option label="校级" value="school" />
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select v-model="filters.category" placeholder="竞赛类别" @change="handleFilter">
+            <el-option label="全部" value="" />
+            <el-option label="学科竞赛" value="subject" />
+            <el-option label="创新创业" value="innovation" />
+            <el-option label="技能竞赛" value="skill" />
+            <el-option label="文体竞赛" value="culture" />
+          </el-select>
+        </el-col>
+        <el-col :span="6">
+          <el-date-picker
+            v-model="filters.dateRange"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            @change="handleFilter"
+          />
+        </el-col>
+        <el-col :span="6">
+          <el-button @click="resetFilters">重置筛选</el-button>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 数据表格 -->
+    <div class="table-container">
+      <el-table
+        :data="filteredAwardList"
+        v-loading="loading"
+        stripe
+        border
+        style="width: 100%"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="id" label="编号" width="80" />
+        <el-table-column prop="studentName" label="学生姓名" width="120" />
+        <el-table-column prop="competitionName" label="竞赛名称" min-width="200" />
+        <el-table-column prop="level" label="获奖等级" width="100">
+          <template #default="{ row }">
+            <el-tag :type="getLevelTagType(row.level)">
+              {{ getLevelText(row.level) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="rank" label="获奖等次" width="100">
+          <template #default="{ row }">
+            <el-tag :type="getRankTagType(row.rank)">
+              {{ getRankText(row.rank) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="instructor" label="指导教师" width="120" />
+        <el-table-column prop="awardDate" label="获奖时间" width="120" />
+        <el-table-column prop="status" label="审核状态" width="100">
+          <template #default="{ row }">
+            <el-tag :type="getStatusTagType(row.status)">
+              {{ getStatusText(row.status) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="200" fixed="right">
+          <template #default="{ row }">
+            <el-button size="small" @click="viewDetail(row)">查看</el-button>
+            <el-button size="small" type="primary" @click="editAward(row)" v-if="row.status !== 'approved'">
+              编辑
+            </el-button>
+            <el-button size="small" type="success" @click="approveAward(row)" v-if="row.status === 'pending'">
+              通过
+            </el-button>
+            <el-button size="small" type="danger" @click="rejectAward(row)" v-if="row.status === 'pending'">
+              驳回
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <!-- 分页 -->
+    <div class="pagination-container">
+      <el-pagination
+        v-model:current-page="pagination.currentPage"
+        v-model:page-size="pagination.pageSize"
+        :page-sizes="[10, 20, 50, 100]"
+        :total="pagination.total"
+        layout="total, sizes, prev, pager, next, jumper"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+
+    <!-- 新增/编辑对话框 -->
+    <el-dialog
+      v-model="showAddDialog"
+      :title="editingAward ? '编辑获奖信息' : '新增获奖信息'"
+      width="800px"
+      @close="resetForm"
+    >
+      <el-form
+        ref="awardFormRef"
+        :model="awardForm"
+        :rules="awardFormRules"
+        label-width="120px"
+      >
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="学生姓名" prop="studentName">
+              <el-input v-model="awardForm.studentName" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="学号" prop="studentId">
+              <el-input v-model="awardForm.studentId" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="竞赛名称" prop="competitionName">
+          <el-input v-model="awardForm.competitionName" />
+        </el-form-item>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="竞赛类别" prop="category">
+              <el-select v-model="awardForm.category" style="width: 100%">
+                <el-option label="学科竞赛" value="subject" />
+                <el-option label="创新创业" value="innovation" />
+                <el-option label="技能竞赛" value="skill" />
+                <el-option label="文体竞赛" value="culture" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="获奖等级" prop="level">
+              <el-select v-model="awardForm.level" style="width: 100%">
+                <el-option label="国家级" value="national" />
+                <el-option label="省级" value="provincial" />
+                <el-option label="市级" value="municipal" />
+                <el-option label="校级" value="school" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="获奖等次" prop="rank">
+              <el-select v-model="awardForm.rank" style="width: 100%">
+                <el-option label="一等奖" value="first" />
+                <el-option label="二等奖" value="second" />
+                <el-option label="三等奖" value="third" />
+                <el-option label="优秀奖" value="excellent" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="获奖时间" prop="awardDate">
+              <el-date-picker
+                v-model="awardForm.awardDate"
+                type="date"
+                placeholder="选择获奖时间"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="指导教师" prop="instructor">
+          <el-input v-model="awardForm.instructor" />
+        </el-form-item>
+        <el-form-item label="佐证材料" prop="attachments">
+          <el-upload
+            ref="uploadRef"
+            :file-list="awardForm.attachments"
+            :on-change="handleFileChange"
+            :on-remove="handleFileRemove"
+            :before-upload="beforeUpload"
+            :auto-upload="false"
+            multiple
+            accept=".pdf,.jpg,.jpeg,.png"
+          >
+            <el-button :icon="Upload">选择文件</el-button>
+            <template #tip>
+              <div class="el-upload__tip">
+                支持PDF、JPG、PNG格式,单个文件不超过10MB
+              </div>
+            </template>
+          </el-upload>
+        </el-form-item>
+        <el-form-item label="备注说明">
+          <el-input
+            v-model="awardForm.remarks"
+            type="textarea"
+            :rows="3"
+            placeholder="请输入备注说明"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="showAddDialog = false">取消</el-button>
+        <el-button type="primary" @click="submitForm">确定</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref, computed, onMounted } from 'vue'
+import { useRouter } from 'vue-router'
+import {
+  Document,
+  Plus,
+  Upload,
+  Download,
+  Search
+} from '@element-plus/icons-vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import PageHeader from '../../edu-industry/components/PageHeader.vue'
+
+const router = useRouter()
+
+// 面包屑导航
+const breadcrumbs = ref([
+  { label: '首页', path: '/' },
+  { label: '学科竞赛管理', path: '/competition' },
+  { label: '获奖信息管理', path: '/competition/award-mgmt' }
+])
+
+// 数据状态
+const loading = ref(false)
+const showAddDialog = ref(false)
+const showImportDialog = ref(false)
+const editingAward = ref(null)
+const searchKeyword = ref('')
+
+// 筛选条件
+const filters = reactive({
+  status: '',
+  level: '',
+  category: '',
+  dateRange: null
+})
+
+// 分页
+const pagination = reactive({
+  currentPage: 1,
+  pageSize: 20,
+  total: 0
+})
+
+// 获奖信息列表
+const awardList = ref([
+  {
+    id: 1,
+    studentName: '张三',
+    studentId: '2021001',
+    competitionName: '全国大学生数学建模竞赛',
+    category: 'subject',
+    level: 'national',
+    rank: 'first',
+    instructor: '李教授',
+    awardDate: '2023-12-15',
+    status: 'pending',
+    attachments: [],
+    remarks: ''
+  },
+  {
+    id: 2,
+    studentName: '李四',
+    studentId: '2021002',
+    competitionName: 'ACM程序设计竞赛',
+    category: 'subject',
+    level: 'provincial',
+    rank: 'second',
+    instructor: '王教授',
+    awardDate: '2023-11-20',
+    status: 'approved',
+    attachments: [],
+    remarks: ''
+  }
+  // 更多模拟数据...
+])
+
+// 表单数据
+const awardForm = reactive({
+  studentName: '',
+  studentId: '',
+  competitionName: '',
+  category: '',
+  level: '',
+  rank: '',
+  instructor: '',
+  awardDate: '',
+  attachments: [],
+  remarks: ''
+})
+
+// 表单验证规则
+const awardFormRules = {
+  studentName: [{ required: true, message: '请输入学生姓名', trigger: 'blur' }],
+  studentId: [{ required: true, message: '请输入学号', trigger: 'blur' }],
+  competitionName: [{ required: true, message: '请输入竞赛名称', trigger: 'blur' }],
+  category: [{ required: true, message: '请选择竞赛类别', trigger: 'change' }],
+  level: [{ required: true, message: '请选择获奖等级', trigger: 'change' }],
+  rank: [{ required: true, message: '请选择获奖等次', trigger: 'change' }],
+  awardDate: [{ required: true, message: '请选择获奖时间', trigger: 'change' }]
+}
+
+// 计算属性 - 过滤后的列表
+const filteredAwardList = computed(() => {
+  let result = awardList.value
+
+  // 搜索过滤
+  if (searchKeyword.value) {
+    result = result.filter(item =>
+      item.studentName.includes(searchKeyword.value) ||
+      item.competitionName.includes(searchKeyword.value) ||
+      item.instructor.includes(searchKeyword.value)
+    )
+  }
+
+  // 状态过滤
+  if (filters.status) {
+    result = result.filter(item => item.status === filters.status)
+  }
+
+  // 等级过滤
+  if (filters.level) {
+    result = result.filter(item => item.level === filters.level)
+  }
+
+  // 类别过滤
+  if (filters.category) {
+    result = result.filter(item => item.category === filters.category)
+  }
+
+  pagination.total = result.length
+  return result
+})
+
+// 获取等级标签类型
+const getLevelTagType = (level: string) => {
+  const types = {
+    national: 'danger',
+    provincial: 'warning',
+    municipal: 'info',
+    school: 'success'
+  }
+  return types[level] || 'info'
+}
+
+// 获取等级文本
+const getLevelText = (level: string) => {
+  const texts = {
+    national: '国家级',
+    provincial: '省级',
+    municipal: '市级',
+    school: '校级'
+  }
+  return texts[level] || level
+}
+
+// 获取等次标签类型
+const getRankTagType = (rank: string) => {
+  const types = {
+    first: 'danger',
+    second: 'warning',
+    third: 'info',
+    excellent: 'success'
+  }
+  return types[rank] || 'info'
+}
+
+// 获取等次文本
+const getRankText = (rank: string) => {
+  const texts = {
+    first: '一等奖',
+    second: '二等奖',
+    third: '三等奖',
+    excellent: '优秀奖'
+  }
+  return texts[rank] || rank
+}
+
+// 获取状态标签类型
+const getStatusTagType = (status: string) => {
+  const types = {
+    pending: 'warning',
+    approved: 'success',
+    rejected: 'danger'
+  }
+  return types[status] || 'info'
+}
+
+// 获取状态文本
+const getStatusText = (status: string) => {
+  const texts = {
+    pending: '待审核',
+    approved: '已通过',
+    rejected: '已驳回'
+  }
+  return texts[status] || status
+}
+
+// 事件处理
+const handleSearch = () => {
+  // 搜索逻辑已在计算属性中处理
+}
+
+const handleFilter = () => {
+  // 筛选逻辑已在计算属性中处理
+}
+
+const resetFilters = () => {
+  filters.status = ''
+  filters.level = ''
+  filters.category = ''
+  filters.dateRange = null
+  searchKeyword.value = ''
+}
+
+const handleSelectionChange = (selection: any[]) => {
+  console.log('Selection changed:', selection)
+}
+
+const handleSizeChange = (size: number) => {
+  pagination.pageSize = size
+}
+
+const handleCurrentChange = (page: number) => {
+  pagination.currentPage = page
+}
+
+const viewDetail = (row: any) => {
+  console.log('View detail:', row)
+}
+
+const editAward = (row: any) => {
+  editingAward.value = row
+  Object.assign(awardForm, row)
+  showAddDialog.value = true
+}
+
+const approveAward = async (row: any) => {
+  try {
+    await ElMessageBox.confirm('确认通过该获奖信息?', '确认操作')
+    row.status = 'approved'
+    ElMessage.success('审核通过')
+  } catch {
+    // 用户取消
+  }
+}
+
+const rejectAward = async (row: any) => {
+  try {
+    const { value } = await ElMessageBox.prompt('请输入驳回原因', '驳回获奖信息', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消'
+    })
+    row.status = 'rejected'
+    row.rejectReason = value
+    ElMessage.success('已驳回')
+  } catch {
+    // 用户取消
+  }
+}
+
+const exportData = () => {
+  ElMessage.success('数据导出功能开发中...')
+}
+
+const resetForm = () => {
+  Object.keys(awardForm).forEach(key => {
+    awardForm[key] = ''
+  })
+  awardForm.attachments = []
+  editingAward.value = null
+}
+
+const submitForm = () => {
+  // 表单提交逻辑
+  ElMessage.success(editingAward.value ? '修改成功' : '添加成功')
+  showAddDialog.value = false
+  resetForm()
+}
+
+const handleFileChange = (file: any, fileList: any[]) => {
+  awardForm.attachments = fileList
+}
+
+const handleFileRemove = (file: any, fileList: any[]) => {
+  awardForm.attachments = fileList
+}
+
+const beforeUpload = (file: any) => {
+  const isValidType = ['application/pdf', 'image/jpeg', 'image/png'].includes(file.type)
+  const isLt10M = file.size / 1024 / 1024 < 10
+
+  if (!isValidType) {
+    ElMessage.error('只能上传PDF、JPG、PNG格式的文件!')
+    return false
+  }
+  if (!isLt10M) {
+    ElMessage.error('文件大小不能超过10MB!')
+    return false
+  }
+  return true
+}
+
+onMounted(() => {
+  pagination.total = awardList.value.length
+})
+</script>
+
+<style scoped lang="scss">
+.award-mgmt-container {
+  padding: 24px;
+  background: #ffffff;
+  min-height: 100vh;
+}
+
+.action-bar {
+  margin-bottom: 16px;
+  
+  .search-bar {
+    display: flex;
+    justify-content: flex-end;
+  }
+}
+
+.filter-bar {
+  margin-bottom: 16px;
+  padding: 16px;
+  background: rgba(255, 255, 255, 0.9);
+  border-radius: 8px;
+}
+
+.table-container {
+  background: rgba(255, 255, 255, 0.95);
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 16px;
+}
+
+.pagination-container {
+  display: flex;
+  justify-content: center;
+  padding: 16px;
+  background: rgba(255, 255, 255, 0.9);
+  border-radius: 8px;
+}
+</style>

+ 329 - 0
src/page/competition/index.vue

@@ -0,0 +1,329 @@
+<template>
+  <div class="competition-container">
+    <!-- 页面头部 -->
+    <PageHeader
+      title="学科竞赛管理"
+      description="全方位竞赛组织管理,从报名到评审的完整流程数字化"
+      :icon="Trophy"
+      :breadcrumbs="breadcrumbs"
+    />
+
+    <!-- 数据概览 -->
+    <div class="overview-section">
+      <el-row :gutter="24">
+        <el-col :span="6">
+          <StatCard
+            title="总获奖数"
+            :number="overviewData.totalAwards"
+            icon="Trophy"
+            color="#f093fb"
+            :trend="{ value: 15, type: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            title="待审核"
+            :number="overviewData.pendingReview"
+            icon="Clock"
+            color="#ff9a9e"
+            :trend="{ value: 3, type: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            title="本月新增"
+            :number="overviewData.monthlyNew"
+            icon="TrendCharts"
+            color="#a8edea"
+            :trend="{ value: 8, type: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            title="参与学生"
+            :number="overviewData.totalStudents"
+            icon="UserFilled"
+            color="#ffecd2"
+            :trend="{ value: 12, type: 'up' }"
+          />
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 核心功能区 -->
+    <div class="core-functions">
+      <h2 class="section-title">核心功能</h2>
+      <el-row :gutter="24">
+        <el-col :span="8" v-for="func in coreFunctions" :key="func.id">
+          <ActionCard
+            :title="func.title"
+            :description="func.description"
+            :icon="func.icon"
+            :clickable="true"
+            :stats="func.stats"
+            @click="navigateToFunction(func.path)"
+          >
+            <template #meta>
+              <el-tag :type="func.status === 'active' ? 'success' : 'warning'" size="small">
+                {{ func.statusText }}
+              </el-tag>
+            </template>
+          </ActionCard>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 快捷操作 -->
+    <div class="quick-actions">
+      <h2 class="section-title">快捷操作</h2>
+      <el-row :gutter="16">
+        <el-col :span="4" v-for="action in quickActions" :key="action.id">
+          <el-button
+            type="primary"
+            :icon="action.icon"
+            @click="handleQuickAction(action.id)"
+            class="quick-action-btn"
+          >
+            {{ action.label }}
+          </el-button>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 最新动态 -->
+    <div class="recent-activities">
+      <h2 class="section-title">最新动态</h2>
+      <el-card class="activity-card">
+        <el-timeline>
+          <el-timeline-item
+            v-for="activity in recentActivities"
+            :key="activity.id"
+            :timestamp="activity.timestamp"
+            :type="activity.type"
+          >
+            <div class="activity-content">
+              <h4>{{ activity.title }}</h4>
+              <p>{{ activity.description }}</p>
+            </div>
+          </el-timeline-item>
+        </el-timeline>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import {
+  Trophy,
+  Clock,
+  TrendCharts,
+  UserFilled,
+  Document,
+  Search,
+  User,
+  Plus,
+  Download,
+  Setting,
+  Upload
+} from '@element-plus/icons-vue'
+import PageHeader from '../edu-industry/components/PageHeader.vue'
+import StatCard from '../edu-industry/components/StatCard.vue'
+import ActionCard from '../edu-industry/components/ActionCard.vue'
+
+const router = useRouter()
+
+// 面包屑导航
+const breadcrumbs = ref([
+  { label: '首页', path: '/' },
+  { label: '学科竞赛管理', path: '/competition' }
+])
+
+// 数据概览
+const overviewData = reactive({
+  totalAwards: 267,
+  pendingReview: 12,
+  monthlyNew: 23,
+  totalStudents: 189
+})
+
+// 核心功能
+const coreFunctions = reactive([
+  {
+    id: 'award-mgmt',
+    title: '获奖信息管理',
+    description: '标准化提交流程,佐证材料管理,双状态审核系统',
+    icon: Document,
+    path: '/competition/award-mgmt',
+    stats: { total: 267, pending: 12 },
+    status: 'active',
+    statusText: '运行中'
+  },
+  {
+    id: 'query-system',
+    title: '智能查询系统',
+    description: '多条件组合检索,数据导出功能,统计分析',
+    icon: Search,
+    path: '/competition/query',
+    stats: { queries: 1456, exports: 89 },
+    status: 'active',
+    statusText: '运行中'
+  },
+  {
+    id: 'personal-space',
+    title: '个人空间模块',
+    description: '获奖记录库,进度追踪,数据修改管理',
+    icon: User,
+    path: '/competition/personal',
+    stats: { users: 189, records: 267 },
+    status: 'active',
+    statusText: '运行中'
+  }
+])
+
+// 快捷操作
+const quickActions = reactive([
+  { id: 'new-award', label: '新增获奖', icon: Plus },
+  { id: 'batch-import', label: '批量导入', icon: Upload },
+  { id: 'export-data', label: '数据导出', icon: Download },
+  { id: 'review-pending', label: '待审核', icon: Clock },
+  { id: 'statistics', label: '统计报表', icon: TrendCharts },
+  { id: 'settings', label: '系统设置', icon: Setting }
+])
+
+// 最新动态
+const recentActivities = reactive([
+  {
+    id: 1,
+    title: '张三提交了全国大学生数学建模竞赛获奖信息',
+    description: '等级:国家级一等奖,等待审核中',
+    timestamp: '2024-01-15 14:30',
+    type: 'primary'
+  },
+  {
+    id: 2,
+    title: '李四的ACM程序设计竞赛获奖信息审核通过',
+    description: '等级:省级二等奖,已完成审核',
+    timestamp: '2024-01-15 10:20',
+    type: 'success'
+  },
+  {
+    id: 3,
+    title: '王五修改了互联网+创新创业大赛获奖信息',
+    description: '补充了佐证材料,重新提交审核',
+    timestamp: '2024-01-14 16:45',
+    type: 'warning'
+  },
+  {
+    id: 4,
+    title: '系统完成了本月获奖数据统计',
+    description: '本月新增获奖记录23条,审核通过率95%',
+    timestamp: '2024-01-14 09:00',
+    type: 'info'
+  }
+])
+
+// 导航到功能页面
+const navigateToFunction = (path: string) => {
+  router.push(path)
+}
+
+// 处理快捷操作
+const handleQuickAction = (actionId: string) => {
+  switch (actionId) {
+    case 'new-award':
+      router.push('/competition/award-mgmt?action=new')
+      break
+    case 'review-pending':
+      router.push('/competition/award-mgmt?filter=pending')
+      break
+    case 'export-data':
+      router.push('/competition/query?action=export')
+      break
+    default:
+      console.log('Quick action:', actionId)
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.competition-container {
+  padding: 16px;
+  background: #ffffff;
+  min-height: 100vh;
+}
+
+.overview-section {
+  margin-bottom: 20px;
+}
+
+.core-functions {
+  margin-bottom: 20px;
+}
+
+.section-title {
+  font-size: 20px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin-bottom: 16px;
+  display: flex;
+  align-items: center;
+  
+  &::before {
+    content: '';
+    width: 4px;
+    height: 20px;
+    background: #f093fb;
+    margin-right: 12px;
+    border-radius: 2px;
+  }
+}
+
+.quick-actions {
+  margin-bottom: 32px;
+  
+  .quick-action-btn {
+    width: 100%;
+    height: 48px;
+    font-size: 14px;
+    border-radius: 8px;
+    background: #f8f9fa;
+    border: 1px solid #e9ecef;
+    color: #495057;
+    transition: all 0.3s ease;
+    
+    &:hover {
+      background: #e9ecef;
+      transform: translateY(-2px);
+      box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
+      color: #2c3e50;
+    }
+  }
+}
+
+.recent-activities {
+  .activity-card {
+    background: rgba(255, 255, 255, 0.95);
+    border-radius: 12px;
+    border: none;
+    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+  }
+  
+  .activity-content {
+    h4 {
+      margin: 0 0 8px 0;
+      font-size: 16px;
+      font-weight: 600;
+      color: #333;
+    }
+    
+    p {
+      margin: 0;
+      font-size: 14px;
+      color: #666;
+      line-height: 1.5;
+    }
+  }
+}
+</style>

+ 760 - 0
src/page/competition/personal/index.vue

@@ -0,0 +1,760 @@
+<template>
+  <div class="personal-space-container">
+    <!-- 页面头部 -->
+    <PageHeader
+      title="个人空间"
+      description="个人获奖记录库,进度追踪,数据管理"
+      :icon="User"
+      :breadcrumbs="breadcrumbs"
+    />
+
+    <!-- 个人信息卡片 -->
+    <div class="profile-section">
+      <el-card class="profile-card">
+        <div class="profile-content">
+          <div class="avatar-section">
+            <el-avatar :size="80" :src="userInfo.avatar" />
+            <div class="user-info">
+              <h3>{{ userInfo.name }}</h3>
+              <p>{{ userInfo.studentId }} | {{ userInfo.major }}</p>
+              <p>{{ userInfo.class }}</p>
+            </div>
+          </div>
+          <div class="stats-section">
+            <div class="stat-item">
+              <div class="stat-number">{{ userStats.totalAwards }}</div>
+              <div class="stat-label">总获奖数</div>
+            </div>
+            <div class="stat-item">
+              <div class="stat-number">{{ userStats.nationalAwards }}</div>
+              <div class="stat-label">国家级</div>
+            </div>
+            <div class="stat-item">
+              <div class="stat-number">{{ userStats.provincialAwards }}</div>
+              <div class="stat-label">省级</div>
+            </div>
+            <div class="stat-item">
+              <div class="stat-number">{{ userStats.pendingReview }}</div>
+              <div class="stat-label">待审核</div>
+            </div>
+          </div>
+        </div>
+      </el-card>
+    </div>
+
+    <!-- 功能导航 -->
+    <div class="nav-section">
+      <el-card class="nav-card">
+        <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+          <el-tab-pane label="获奖记录" name="records">
+            <div class="records-content">
+              <!-- 筛选工具栏 -->
+              <div class="toolbar">
+                <el-input
+                  v-model="searchKeyword"
+                  placeholder="搜索竞赛名称或获奖等级"
+                  style="width: 300px;"
+                  :prefix-icon="Search"
+                  @input="filterRecords"
+                />
+                <el-select v-model="statusFilter" placeholder="筛选状态" style="width: 150px;" @change="filterRecords">
+                  <el-option label="全部" value="" />
+                  <el-option label="待审核" value="pending" />
+                  <el-option label="已通过" value="approved" />
+                  <el-option label="已驳回" value="rejected" />
+                </el-select>
+                <el-button type="primary" :icon="Plus" @click="showAddDialog = true">新增获奖</el-button>
+              </div>
+
+              <!-- 获奖记录列表 -->
+              <div class="records-list">
+                <el-table :data="filteredRecords" v-loading="loading" stripe>
+                  <el-table-column prop="competitionName" label="竞赛名称" min-width="200" show-overflow-tooltip />
+                  <el-table-column prop="level" label="获奖等级" width="100">
+                    <template #default="{ row }">
+                      <el-tag :type="getLevelTagType(row.level)">
+                        {{ getLevelText(row.level) }}
+                      </el-tag>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="rank" label="获奖等次" width="100">
+                    <template #default="{ row }">
+                      <el-tag :type="getRankTagType(row.rank)">
+                        {{ getRankText(row.rank) }}
+                      </el-tag>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="awardDate" label="获奖时间" width="120" />
+                  <el-table-column prop="status" label="审核状态" width="100">
+                    <template #default="{ row }">
+                      <el-tag :type="getStatusTagType(row.status)">
+                        {{ getStatusText(row.status) }}
+                      </el-tag>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" width="200" fixed="right">
+                    <template #default="{ row }">
+                      <el-button size="small" @click="viewRecord(row)">查看</el-button>
+                      <el-button 
+                        size="small" 
+                        type="primary" 
+                        @click="editRecord(row)"
+                        :disabled="row.status === 'approved'"
+                      >
+                        编辑
+                      </el-button>
+                      <el-button 
+                        size="small" 
+                        type="danger" 
+                        @click="deleteRecord(row)"
+                        :disabled="row.status === 'approved'"
+                      >
+                        删除
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </div>
+          </el-tab-pane>
+
+          <el-tab-pane label="进度追踪" name="progress">
+            <div class="progress-content">
+              <el-timeline>
+                <el-timeline-item
+                  v-for="item in progressTimeline"
+                  :key="item.id"
+                  :timestamp="item.timestamp"
+                  :type="item.type"
+                  :icon="item.icon"
+                >
+                  <el-card class="timeline-card">
+                    <h4>{{ item.title }}</h4>
+                    <p>{{ item.description }}</p>
+                    <div v-if="item.feedback" class="feedback">
+                      <el-alert :title="item.feedback" type="info" show-icon :closable="false" />
+                    </div>
+                  </el-card>
+                </el-timeline-item>
+              </el-timeline>
+            </div>
+          </el-tab-pane>
+
+          <el-tab-pane label="数据管理" name="management">
+            <div class="management-content">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <el-card class="management-card">
+                    <template #header>
+                      <span>个人信息修改</span>
+                    </template>
+                    <el-form :model="editUserInfo" label-width="100px">
+                      <el-form-item label="姓名">
+                        <el-input v-model="editUserInfo.name" />
+                      </el-form-item>
+                      <el-form-item label="学号">
+                        <el-input v-model="editUserInfo.studentId" disabled />
+                      </el-form-item>
+                      <el-form-item label="专业">
+                        <el-input v-model="editUserInfo.major" />
+                      </el-form-item>
+                      <el-form-item label="班级">
+                        <el-input v-model="editUserInfo.class" />
+                      </el-form-item>
+                      <el-form-item label="联系电话">
+                        <el-input v-model="editUserInfo.phone" />
+                      </el-form-item>
+                      <el-form-item label="邮箱">
+                        <el-input v-model="editUserInfo.email" />
+                      </el-form-item>
+                      <el-form-item>
+                        <el-button type="primary" @click="updateUserInfo">保存修改</el-button>
+                      </el-form-item>
+                    </el-form>
+                  </el-card>
+                </el-col>
+                <el-col :span="12">
+                  <el-card class="management-card">
+                    <template #header>
+                      <span>数据导出</span>
+                    </template>
+                    <div class="export-options">
+                      <el-button type="primary" :icon="Download" @click="exportPersonalData">
+                        导出个人获奖记录
+                      </el-button>
+                      <el-button type="success" :icon="Document" @click="generateReport">
+                        生成获奖报告
+                      </el-button>
+                      <el-button type="warning" :icon="Share" @click="shareProfile">
+                        分享个人档案
+                      </el-button>
+                    </div>
+                  </el-card>
+                  
+                  <el-card class="management-card" style="margin-top: 20px;">
+                    <template #header>
+                      <span>材料补充</span>
+                    </template>
+                    <div class="material-upload">
+                      <el-upload
+                        class="upload-demo"
+                        drag
+                        action="#"
+                        multiple
+                        :before-upload="beforeUpload"
+                      >
+                        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                        <div class="el-upload__text">
+                          将文件拖到此处,或<em>点击上传</em>
+                        </div>
+                        <template #tip>
+                          <div class="el-upload__tip">
+                            支持 PDF、JPG、PNG 格式,单个文件不超过 10MB
+                          </div>
+                        </template>
+                      </el-upload>
+                    </div>
+                  </el-card>
+                </el-col>
+              </el-row>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </el-card>
+    </div>
+
+    <!-- 新增/编辑获奖对话框 -->
+    <el-dialog
+      v-model="showAddDialog"
+      :title="editingRecord ? '编辑获奖信息' : '新增获奖信息'"
+      width="800px"
+    >
+      <el-form :model="recordForm" :rules="recordRules" ref="recordFormRef" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="竞赛名称" prop="competitionName">
+              <el-input v-model="recordForm.competitionName" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="竞赛类别" prop="category">
+              <el-select v-model="recordForm.category" style="width: 100%">
+                <el-option label="学科竞赛" value="subject" />
+                <el-option label="创新创业" value="innovation" />
+                <el-option label="技能竞赛" value="skill" />
+                <el-option label="文体竞赛" value="culture" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="获奖等级" prop="level">
+              <el-select v-model="recordForm.level" style="width: 100%">
+                <el-option label="国家级" value="national" />
+                <el-option label="省级" value="provincial" />
+                <el-option label="市级" value="municipal" />
+                <el-option label="校级" value="school" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="获奖等次" prop="rank">
+              <el-select v-model="recordForm.rank" style="width: 100%">
+                <el-option label="一等奖" value="first" />
+                <el-option label="二等奖" value="second" />
+                <el-option label="三等奖" value="third" />
+                <el-option label="优秀奖" value="excellent" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="指导教师" prop="instructor">
+              <el-input v-model="recordForm.instructor" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="获奖时间" prop="awardDate">
+              <el-date-picker
+                v-model="recordForm.awardDate"
+                type="date"
+                placeholder="选择获奖时间"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="获奖描述">
+          <el-input
+            v-model="recordForm.description"
+            type="textarea"
+            :rows="3"
+            placeholder="请输入获奖描述"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="showAddDialog = false">取消</el-button>
+          <el-button type="primary" @click="saveRecord">保存</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref, computed, onMounted } from 'vue'
+import { useRouter } from 'vue-router'
+import {
+  User,
+  Search,
+  Plus,
+  Download,
+  Document,
+  Share,
+  UploadFilled
+} from '@element-plus/icons-vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import PageHeader from '../../edu-industry/components/PageHeader.vue'
+
+const router = useRouter()
+
+// 面包屑导航
+const breadcrumbs = ref([
+  { label: '首页', path: '/' },
+  { label: '学科竞赛管理', path: '/competition' },
+  { label: '个人空间', path: '/competition/personal' }
+])
+
+// 数据状态
+const loading = ref(false)
+const activeTab = ref('records')
+const showAddDialog = ref(false)
+const editingRecord = ref(null)
+const searchKeyword = ref('')
+const statusFilter = ref('')
+
+// 用户信息
+const userInfo = reactive({
+  name: '张三',
+  studentId: '2021001',
+  major: '计算机科学与技术',
+  class: '计科2101班',
+  avatar: '',
+  phone: '13800138000',
+  email: 'zhangsan@example.com'
+})
+
+const editUserInfo = reactive({ ...userInfo })
+
+// 用户统计
+const userStats = reactive({
+  totalAwards: 8,
+  nationalAwards: 2,
+  provincialAwards: 3,
+  pendingReview: 1
+})
+
+// 获奖记录
+const personalRecords = ref([
+  {
+    id: 1,
+    competitionName: '全国大学生数学建模竞赛',
+    category: 'subject',
+    level: 'national',
+    rank: 'first',
+    instructor: '李教授',
+    awardDate: '2023-12-15',
+    status: 'approved',
+    description: '团队合作完成数学建模项目'
+  },
+  {
+    id: 2,
+    competitionName: 'ACM程序设计竞赛',
+    category: 'subject',
+    level: 'provincial',
+    rank: 'second',
+    instructor: '王教授',
+    awardDate: '2023-11-20',
+    status: 'approved',
+    description: '算法设计与编程实现'
+  },
+  {
+    id: 3,
+    competitionName: '互联网+创新创业大赛',
+    category: 'innovation',
+    level: 'school',
+    rank: 'third',
+    instructor: '赵教授',
+    awardDate: '2023-10-10',
+    status: 'pending',
+    description: '创新项目设计与实施'
+  }
+])
+
+// 进度时间线
+const progressTimeline = ref([
+  {
+    id: 1,
+    timestamp: '2023-12-20 14:30',
+    title: '获奖信息审核通过',
+    description: '全国大学生数学建模竞赛获奖信息已通过审核',
+    type: 'success',
+    icon: 'Check'
+  },
+  {
+    id: 2,
+    timestamp: '2023-12-18 09:15',
+    title: '材料补充完成',
+    description: '已上传获奖证书扫描件',
+    type: 'primary',
+    icon: 'Upload'
+  },
+  {
+    id: 3,
+    timestamp: '2023-12-15 16:45',
+    title: '提交获奖信息',
+    description: '提交全国大学生数学建模竞赛获奖信息',
+    type: 'info',
+    icon: 'Document'
+  },
+  {
+    id: 4,
+    timestamp: '2023-11-25 11:20',
+    title: '获奖信息被驳回',
+    description: 'ACM程序设计竞赛获奖信息需要补充材料',
+    type: 'warning',
+    icon: 'Warning',
+    feedback: '请补充获奖证书原件扫描件,并确保信息填写完整准确。'
+  }
+])
+
+// 表单数据
+const recordForm = reactive({
+  competitionName: '',
+  category: '',
+  level: '',
+  rank: '',
+  instructor: '',
+  awardDate: '',
+  description: ''
+})
+
+const recordRules = {
+  competitionName: [{ required: true, message: '请输入竞赛名称', trigger: 'blur' }],
+  category: [{ required: true, message: '请选择竞赛类别', trigger: 'change' }],
+  level: [{ required: true, message: '请选择获奖等级', trigger: 'change' }],
+  rank: [{ required: true, message: '请选择获奖等次', trigger: 'change' }],
+  instructor: [{ required: true, message: '请输入指导教师', trigger: 'blur' }],
+  awardDate: [{ required: true, message: '请选择获奖时间', trigger: 'change' }]
+}
+
+// 筛选后的记录
+const filteredRecords = computed(() => {
+  let records = personalRecords.value
+  
+  if (searchKeyword.value) {
+    records = records.filter(record => 
+      record.competitionName.includes(searchKeyword.value) ||
+      getLevelText(record.level).includes(searchKeyword.value) ||
+      getRankText(record.rank).includes(searchKeyword.value)
+    )
+  }
+  
+  if (statusFilter.value) {
+    records = records.filter(record => record.status === statusFilter.value)
+  }
+  
+  return records
+})
+
+// 工具函数
+const getLevelTagType = (level: string) => {
+  const types = {
+    national: 'danger',
+    provincial: 'warning',
+    municipal: 'info',
+    school: 'success'
+  }
+  return types[level] || 'info'
+}
+
+const getLevelText = (level: string) => {
+  const texts = {
+    national: '国家级',
+    provincial: '省级',
+    municipal: '市级',
+    school: '校级'
+  }
+  return texts[level] || level
+}
+
+const getRankTagType = (rank: string) => {
+  const types = {
+    first: 'danger',
+    second: 'warning',
+    third: 'info',
+    excellent: 'success'
+  }
+  return types[rank] || 'info'
+}
+
+const getRankText = (rank: string) => {
+  const texts = {
+    first: '一等奖',
+    second: '二等奖',
+    third: '三等奖',
+    excellent: '优秀奖'
+  }
+  return texts[rank] || rank
+}
+
+const getStatusTagType = (status: string) => {
+  const types = {
+    pending: 'warning',
+    approved: 'success',
+    rejected: 'danger'
+  }
+  return types[status] || 'info'
+}
+
+const getStatusText = (status: string) => {
+  const texts = {
+    pending: '待审核',
+    approved: '已通过',
+    rejected: '已驳回'
+  }
+  return texts[status] || status
+}
+
+// 事件处理
+const handleTabChange = (tabName: string) => {
+  console.log('Tab changed to:', tabName)
+}
+
+const filterRecords = () => {
+  // 筛选逻辑已在计算属性中实现
+}
+
+const viewRecord = (record: any) => {
+  console.log('View record:', record)
+  ElMessage.info('查看详情功能开发中...')
+}
+
+const editRecord = (record: any) => {
+  editingRecord.value = record
+  Object.assign(recordForm, record)
+  showAddDialog.value = true
+}
+
+const deleteRecord = (record: any) => {
+  ElMessageBox.confirm(
+    '确定要删除这条获奖记录吗?',
+    '确认删除',
+    {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    }
+  ).then(() => {
+    const index = personalRecords.value.findIndex(r => r.id === record.id)
+    if (index > -1) {
+      personalRecords.value.splice(index, 1)
+      ElMessage.success('删除成功')
+    }
+  })
+}
+
+const saveRecord = () => {
+  // 表单验证和保存逻辑
+  if (editingRecord.value) {
+    // 编辑模式
+    Object.assign(editingRecord.value, recordForm)
+    ElMessage.success('修改成功')
+  } else {
+    // 新增模式
+    const newRecord = {
+      id: Date.now(),
+      ...recordForm,
+      status: 'pending'
+    }
+    personalRecords.value.unshift(newRecord)
+    ElMessage.success('新增成功')
+  }
+  
+  showAddDialog.value = false
+  editingRecord.value = null
+  Object.keys(recordForm).forEach(key => {
+    recordForm[key] = ''
+  })
+}
+
+const updateUserInfo = () => {
+  Object.assign(userInfo, editUserInfo)
+  ElMessage.success('个人信息更新成功')
+}
+
+const exportPersonalData = () => {
+  ElMessage.success('正在导出个人获奖记录...')
+}
+
+const generateReport = () => {
+  ElMessage.success('正在生成获奖报告...')
+}
+
+const shareProfile = () => {
+  ElMessage.success('个人档案分享链接已生成')
+}
+
+const beforeUpload = (file: File) => {
+  const isValidType = ['application/pdf', 'image/jpeg', 'image/png'].includes(file.type)
+  const isLt10M = file.size / 1024 / 1024 < 10
+
+  if (!isValidType) {
+    ElMessage.error('只能上传 PDF、JPG、PNG 格式的文件!')
+    return false
+  }
+  if (!isLt10M) {
+    ElMessage.error('文件大小不能超过 10MB!')
+    return false
+  }
+  
+  ElMessage.success('文件上传成功')
+  return false // 阻止自动上传
+}
+
+onMounted(() => {
+  // 初始化数据
+})
+</script>
+
+<style scoped lang="scss">
+.personal-space-container {
+  padding: 24px;
+  background: #ffffff;
+  min-height: 100vh;
+}
+
+.profile-section {
+  margin-bottom: 24px;
+}
+
+.nav-section {
+  margin-bottom: 24px;
+}
+
+.profile-card,
+.nav-card,
+.management-card {
+  background: rgba(255, 255, 255, 0.95);
+  border: none;
+  border-radius: 12px;
+  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+}
+
+.profile-content {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  
+  .avatar-section {
+    display: flex;
+    align-items: center;
+    gap: 20px;
+    
+    .user-info {
+      h3 {
+        margin: 0 0 8px 0;
+        color: #333;
+      }
+      
+      p {
+        margin: 4px 0;
+        color: #666;
+        font-size: 14px;
+      }
+    }
+  }
+  
+  .stats-section {
+    display: flex;
+    gap: 40px;
+    
+    .stat-item {
+      text-align: center;
+      
+      .stat-number {
+        font-size: 32px;
+        font-weight: bold;
+        color: #409eff;
+        margin-bottom: 8px;
+      }
+      
+      .stat-label {
+        font-size: 14px;
+        color: #666;
+      }
+    }
+  }
+}
+
+.toolbar {
+  display: flex;
+  gap: 16px;
+  margin-bottom: 20px;
+  align-items: center;
+}
+
+.records-list {
+  margin-top: 20px;
+}
+
+.progress-content {
+  padding: 20px 0;
+}
+
+.timeline-card {
+  margin-bottom: 16px;
+  
+  h4 {
+    margin: 0 0 8px 0;
+    color: #333;
+  }
+  
+  p {
+    margin: 0 0 12px 0;
+    color: #666;
+  }
+  
+  .feedback {
+    margin-top: 12px;
+  }
+}
+
+.management-content {
+  padding: 20px 0;
+}
+
+.export-options {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+  
+  .el-button {
+    justify-content: flex-start;
+  }
+}
+
+.material-upload {
+  margin-top: 16px;
+}
+
+.dialog-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 12px;
+}
+</style>

+ 560 - 0
src/page/competition/query/index.vue

@@ -0,0 +1,560 @@
+<template>
+  <div class="query-system-container">
+    <!-- 页面头部 -->
+    <PageHeader
+      title="智能查询系统"
+      description="多条件组合检索,数据导出功能,统计分析"
+      :icon="Search"
+      :breadcrumbs="breadcrumbs"
+    />
+
+    <!-- 查询条件区 -->
+    <div class="query-section">
+      <el-card class="query-card">
+        <template #header>
+          <div class="card-header">
+            <span>查询条件</span>
+            <el-button type="text" @click="resetQuery">重置</el-button>
+          </div>
+        </template>
+        
+        <el-form :model="queryForm" label-width="100px" :inline="false">
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <el-form-item label="学生姓名">
+                <el-input v-model="queryForm.studentName" placeholder="请输入学生姓名" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="学号">
+                <el-input v-model="queryForm.studentId" placeholder="请输入学号" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="竞赛名称">
+                <el-input v-model="queryForm.competitionName" placeholder="请输入竞赛名称" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <el-form-item label="竞赛类别">
+                <el-select v-model="queryForm.category" placeholder="请选择竞赛类别" style="width: 100%">
+                  <el-option label="全部" value="" />
+                  <el-option label="学科竞赛" value="subject" />
+                  <el-option label="创新创业" value="innovation" />
+                  <el-option label="技能竞赛" value="skill" />
+                  <el-option label="文体竞赛" value="culture" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="获奖等级">
+                <el-select v-model="queryForm.level" placeholder="请选择获奖等级" style="width: 100%">
+                  <el-option label="全部" value="" />
+                  <el-option label="国家级" value="national" />
+                  <el-option label="省级" value="provincial" />
+                  <el-option label="市级" value="municipal" />
+                  <el-option label="校级" value="school" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="获奖等次">
+                <el-select v-model="queryForm.rank" placeholder="请选择获奖等次" style="width: 100%">
+                  <el-option label="全部" value="" />
+                  <el-option label="一等奖" value="first" />
+                  <el-option label="二等奖" value="second" />
+                  <el-option label="三等奖" value="third" />
+                  <el-option label="优秀奖" value="excellent" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <el-form-item label="指导教师">
+                <el-input v-model="queryForm.instructor" placeholder="请输入指导教师" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="审核状态">
+                <el-select v-model="queryForm.status" placeholder="请选择审核状态" style="width: 100%">
+                  <el-option label="全部" value="" />
+                  <el-option label="待审核" value="pending" />
+                  <el-option label="已通过" value="approved" />
+                  <el-option label="已驳回" value="rejected" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="获奖时间">
+                <el-date-picker
+                  v-model="queryForm.dateRange"
+                  type="daterange"
+                  range-separator="至"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          
+          <el-row>
+            <el-col :span="24">
+              <el-form-item>
+                <el-button type="primary" :icon="Search" @click="handleQuery">查询</el-button>
+                <el-button :icon="Download" @click="exportResults">导出结果</el-button>
+                <el-button :icon="TrendCharts" @click="showStatistics = true">统计分析</el-button>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </el-card>
+    </div>
+
+    <!-- 查询结果区 -->
+    <div class="results-section">
+      <el-card class="results-card">
+        <template #header>
+          <div class="card-header">
+            <span>查询结果 (共 {{ queryResults.length }} 条)</span>
+            <div class="header-actions">
+              <el-button size="small" :icon="Download" @click="exportSelected">导出选中</el-button>
+              <el-button size="small" :icon="Refresh" @click="handleQuery">刷新</el-button>
+            </div>
+          </div>
+        </template>
+        
+        <el-table
+          :data="paginatedResults"
+          v-loading="loading"
+          @selection-change="handleSelectionChange"
+          stripe
+          border
+          style="width: 100%"
+        >
+          <el-table-column type="selection" width="55" />
+          <el-table-column prop="id" label="编号" width="80" />
+          <el-table-column prop="studentName" label="学生姓名" width="120" />
+          <el-table-column prop="studentId" label="学号" width="120" />
+          <el-table-column prop="competitionName" label="竞赛名称" min-width="200" show-overflow-tooltip />
+          <el-table-column prop="category" label="竞赛类别" width="100">
+            <template #default="{ row }">
+              {{ getCategoryText(row.category) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="level" label="获奖等级" width="100">
+            <template #default="{ row }">
+              <el-tag :type="getLevelTagType(row.level)">
+                {{ getLevelText(row.level) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="rank" label="获奖等次" width="100">
+            <template #default="{ row }">
+              <el-tag :type="getRankTagType(row.rank)">
+                {{ getRankText(row.rank) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="instructor" label="指导教师" width="120" />
+          <el-table-column prop="awardDate" label="获奖时间" width="120" />
+          <el-table-column prop="status" label="审核状态" width="100">
+            <template #default="{ row }">
+              <el-tag :type="getStatusTagType(row.status)">
+                {{ getStatusText(row.status) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="120" fixed="right">
+            <template #default="{ row }">
+              <el-button size="small" @click="viewDetail(row)">查看详情</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        
+        <!-- 分页 -->
+        <div class="pagination-container">
+          <el-pagination
+            v-model:current-page="pagination.currentPage"
+            v-model:page-size="pagination.pageSize"
+            :page-sizes="[10, 20, 50, 100]"
+            :total="queryResults.length"
+            layout="total, sizes, prev, pager, next, jumper"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+        </div>
+      </el-card>
+    </div>
+
+    <!-- 统计分析对话框 -->
+    <el-dialog v-model="showStatistics" title="统计分析" width="1000px">
+      <div class="statistics-content">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <div class="chart-container">
+              <h4>获奖等级分布</h4>
+              <div ref="levelChartRef" style="height: 300px;"></div>
+            </div>
+          </el-col>
+          <el-col :span="12">
+            <div class="chart-container">
+              <h4>竞赛类别分布</h4>
+              <div ref="categoryChartRef" style="height: 300px;"></div>
+            </div>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20" style="margin-top: 20px;">
+          <el-col :span="12">
+            <div class="chart-container">
+              <h4>获奖趋势分析</h4>
+              <div ref="trendChartRef" style="height: 300px;"></div>
+            </div>
+          </el-col>
+          <el-col :span="12">
+            <div class="chart-container">
+              <h4>指导教师排行</h4>
+              <div ref="instructorChartRef" style="height: 300px;"></div>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref, computed, onMounted } from 'vue'
+import { useRouter } from 'vue-router'
+import {
+  Search,
+  Download,
+  TrendCharts,
+  Refresh
+} from '@element-plus/icons-vue'
+import { ElMessage } from 'element-plus'
+import PageHeader from '../../edu-industry/components/PageHeader.vue'
+
+const router = useRouter()
+
+// 面包屑导航
+const breadcrumbs = ref([
+  { label: '首页', path: '/' },
+  { label: '学科竞赛管理', path: '/competition' },
+  { label: '智能查询系统', path: '/competition/query' }
+])
+
+// 数据状态
+const loading = ref(false)
+const showStatistics = ref(false)
+const selectedRows = ref([])
+
+// 查询表单
+const queryForm = reactive({
+  studentName: '',
+  studentId: '',
+  competitionName: '',
+  category: '',
+  level: '',
+  rank: '',
+  instructor: '',
+  status: '',
+  dateRange: null
+})
+
+// 分页
+const pagination = reactive({
+  currentPage: 1,
+  pageSize: 20
+})
+
+// 模拟数据
+const allAwards = ref([
+  {
+    id: 1,
+    studentName: '张三',
+    studentId: '2021001',
+    competitionName: '全国大学生数学建模竞赛',
+    category: 'subject',
+    level: 'national',
+    rank: 'first',
+    instructor: '李教授',
+    awardDate: '2023-12-15',
+    status: 'approved'
+  },
+  {
+    id: 2,
+    studentName: '李四',
+    studentId: '2021002',
+    competitionName: 'ACM程序设计竞赛',
+    category: 'subject',
+    level: 'provincial',
+    rank: 'second',
+    instructor: '王教授',
+    awardDate: '2023-11-20',
+    status: 'approved'
+  },
+  {
+    id: 3,
+    studentName: '王五',
+    studentId: '2021003',
+    competitionName: '互联网+创新创业大赛',
+    category: 'innovation',
+    level: 'national',
+    rank: 'third',
+    instructor: '赵教授',
+    awardDate: '2023-10-10',
+    status: 'pending'
+  },
+  {
+    id: 4,
+    studentName: '赵六',
+    studentId: '2021004',
+    competitionName: '全国大学生电子设计竞赛',
+    category: 'skill',
+    level: 'provincial',
+    rank: 'first',
+    instructor: '李教授',
+    awardDate: '2023-09-25',
+    status: 'approved'
+  },
+  {
+    id: 5,
+    studentName: '钱七',
+    studentId: '2021005',
+    competitionName: '大学生艺术展演',
+    category: 'culture',
+    level: 'school',
+    rank: 'excellent',
+    instructor: '孙教授',
+    awardDate: '2023-08-15',
+    status: 'approved'
+  }
+])
+
+// 查询结果
+const queryResults = ref([...allAwards.value])
+
+// 分页后的结果
+const paginatedResults = computed(() => {
+  const start = (pagination.currentPage - 1) * pagination.pageSize
+  const end = start + pagination.pageSize
+  return queryResults.value.slice(start, end)
+})
+
+// 工具函数
+const getCategoryText = (category: string) => {
+  const texts = {
+    subject: '学科竞赛',
+    innovation: '创新创业',
+    skill: '技能竞赛',
+    culture: '文体竞赛'
+  }
+  return texts[category] || category
+}
+
+const getLevelTagType = (level: string) => {
+  const types = {
+    national: 'danger',
+    provincial: 'warning',
+    municipal: 'info',
+    school: 'success'
+  }
+  return types[level] || 'info'
+}
+
+const getLevelText = (level: string) => {
+  const texts = {
+    national: '国家级',
+    provincial: '省级',
+    municipal: '市级',
+    school: '校级'
+  }
+  return texts[level] || level
+}
+
+const getRankTagType = (rank: string) => {
+  const types = {
+    first: 'danger',
+    second: 'warning',
+    third: 'info',
+    excellent: 'success'
+  }
+  return types[rank] || 'info'
+}
+
+const getRankText = (rank: string) => {
+  const texts = {
+    first: '一等奖',
+    second: '二等奖',
+    third: '三等奖',
+    excellent: '优秀奖'
+  }
+  return texts[rank] || rank
+}
+
+const getStatusTagType = (status: string) => {
+  const types = {
+    pending: 'warning',
+    approved: 'success',
+    rejected: 'danger'
+  }
+  return types[status] || 'info'
+}
+
+const getStatusText = (status: string) => {
+  const texts = {
+    pending: '待审核',
+    approved: '已通过',
+    rejected: '已驳回'
+  }
+  return texts[status] || status
+}
+
+// 事件处理
+const handleQuery = () => {
+  loading.value = true
+  
+  // 模拟查询延迟
+  setTimeout(() => {
+    let results = [...allAwards.value]
+    
+    // 应用查询条件
+    if (queryForm.studentName) {
+      results = results.filter(item => item.studentName.includes(queryForm.studentName))
+    }
+    if (queryForm.studentId) {
+      results = results.filter(item => item.studentId.includes(queryForm.studentId))
+    }
+    if (queryForm.competitionName) {
+      results = results.filter(item => item.competitionName.includes(queryForm.competitionName))
+    }
+    if (queryForm.category) {
+      results = results.filter(item => item.category === queryForm.category)
+    }
+    if (queryForm.level) {
+      results = results.filter(item => item.level === queryForm.level)
+    }
+    if (queryForm.rank) {
+      results = results.filter(item => item.rank === queryForm.rank)
+    }
+    if (queryForm.instructor) {
+      results = results.filter(item => item.instructor.includes(queryForm.instructor))
+    }
+    if (queryForm.status) {
+      results = results.filter(item => item.status === queryForm.status)
+    }
+    
+    queryResults.value = results
+    pagination.currentPage = 1
+    loading.value = false
+    
+    ElMessage.success(`查询完成,共找到 ${results.length} 条记录`)
+  }, 1000)
+}
+
+const resetQuery = () => {
+  Object.keys(queryForm).forEach(key => {
+    queryForm[key] = ''
+  })
+  queryForm.dateRange = null
+  queryResults.value = [...allAwards.value]
+  pagination.currentPage = 1
+}
+
+const exportResults = () => {
+  ElMessage.success('正在导出查询结果...')
+  // 实际导出逻辑
+}
+
+const exportSelected = () => {
+  if (selectedRows.value.length === 0) {
+    ElMessage.warning('请先选择要导出的记录')
+    return
+  }
+  ElMessage.success(`正在导出选中的 ${selectedRows.value.length} 条记录...`)
+}
+
+const handleSelectionChange = (selection: any[]) => {
+  selectedRows.value = selection
+}
+
+const handleSizeChange = (size: number) => {
+  pagination.pageSize = size
+}
+
+const handleCurrentChange = (page: number) => {
+  pagination.currentPage = page
+}
+
+const viewDetail = (row: any) => {
+  console.log('View detail:', row)
+  ElMessage.info('查看详情功能开发中...')
+}
+
+onMounted(() => {
+  // 初始化查询
+  handleQuery()
+})
+</script>
+
+<style scoped lang="scss">
+.query-system-container {
+  padding: 24px;
+  background: #ffffff;
+  min-height: 100vh;
+}
+
+.query-section {
+  margin-bottom: 24px;
+}
+
+.results-section {
+  margin-bottom: 24px;
+}
+
+.query-card,
+.results-card {
+  background: rgba(255, 255, 255, 0.95);
+  border: none;
+  border-radius: 12px;
+  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-weight: 600;
+  
+  .header-actions {
+    display: flex;
+    gap: 8px;
+  }
+}
+
+.pagination-container {
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+
+.statistics-content {
+  .chart-container {
+    background: #f8f9fa;
+    border-radius: 8px;
+    padding: 16px;
+    
+    h4 {
+      margin: 0 0 16px 0;
+      text-align: center;
+      color: #333;
+    }
+  }
+}
+</style>

+ 228 - 0
src/page/edu-industry/components/ActionCard.vue

@@ -0,0 +1,228 @@
+<template>
+  <div
+    class="action-card"
+    :class="{
+      'action-card--clickable': clickable,
+      'action-card--disabled': disabled,
+      'action-card--active': active
+    }"
+    @click="handleClick"
+  >
+    <div class="card-icon" v-if="icon">
+      <el-icon>
+        <component :is="icon" />
+      </el-icon>
+    </div>
+
+    <div class="card-content">
+      <h4 class="card-title">{{ title }}</h4>
+      <p class="card-description" v-if="description">{{ description }}</p>
+
+      <div class="card-meta" v-if="$slots.meta">
+        <slot name="meta"></slot>
+      </div>
+
+      <div class="card-stats" v-if="stats && stats.length > 0">
+        <div
+          v-for="(stat, index) in stats"
+          :key="index"
+          class="stat-item"
+        >
+          <span class="stat-value">{{ stat.value }}</span>
+          <span class="stat-label">{{ stat.label }}</span>
+        </div>
+      </div>
+    </div>
+
+    <div class="card-actions" v-if="$slots.actions">
+      <slot name="actions"></slot>
+    </div>
+
+    <div class="card-badge" v-if="badge">
+      <el-tag :type="badge.type" size="small">{{ badge.text }}</el-tag>
+    </div>
+
+    <div class="card-arrow" v-if="clickable && !disabled">
+      <el-icon>
+        <ArrowRight />
+      </el-icon>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ArrowRight } from '@element-plus/icons-vue'
+
+interface Stat {
+  value: string | number
+  label: string
+}
+
+interface Badge {
+  text: string
+  type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'
+}
+
+const props = defineProps<{
+  title: string
+  description?: string
+  icon?: any
+  clickable?: boolean
+  disabled?: boolean
+  active?: boolean
+  stats?: Stat[]
+  badge?: Badge
+}>()
+
+const emit = defineEmits<{
+  click: []
+}>()
+
+const handleClick = () => {
+  if (props.clickable && !props.disabled) {
+    emit('click')
+  }
+}
+</script>
+
+<style scoped>
+.action-card {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+  border: 1px solid #e4e7ed;
+  transition: all 0.3s ease;
+  position: relative;
+  overflow: hidden;
+}
+
+.action-card--clickable {
+  cursor: pointer;
+}
+
+.action-card--clickable:hover {
+  transform: translateY(-4px);
+  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
+  border-color: #4facfe;
+}
+
+.action-card--active {
+  border-color: #4facfe;
+  background: linear-gradient(135deg, #f8fbff, #ffffff);
+}
+
+.action-card--active::before {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 4px;
+  height: 100%;
+  background: #4facfe;
+}
+
+.action-card--disabled {
+  opacity: 0.6;
+  cursor: not-allowed;
+}
+
+.action-card--disabled:hover {
+  transform: none;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+  border-color: #e4e7ed;
+}
+
+.card-icon {
+  width: 48px;
+  height: 48px;
+  border-radius: 12px;
+  background: linear-gradient(135deg, #4facfe, #00f2fe);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-bottom: 16px;
+  font-size: 24px;
+  color: white;
+}
+
+.card-content {
+  flex: 1;
+}
+
+.card-title {
+  margin: 0 0 8px 0;
+  color: #2c3e50;
+  font-size: 18px;
+  font-weight: 600;
+  line-height: 1.3;
+}
+
+.card-description {
+  margin: 0 0 16px 0;
+  color: #7f8c8d;
+  font-size: 14px;
+  line-height: 1.5;
+}
+
+.card-meta {
+  margin-bottom: 16px;
+}
+
+.card-stats {
+  display: flex;
+  gap: 20px;
+  margin-bottom: 16px;
+}
+
+.stat-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  text-align: center;
+}
+
+.stat-value {
+  font-size: 20px;
+  font-weight: 600;
+  color: #2c3e50;
+  line-height: 1;
+}
+
+.stat-label {
+  font-size: 12px;
+  color: #7f8c8d;
+  margin-top: 4px;
+}
+
+.card-actions {
+  margin-top: 16px;
+  display: flex;
+  gap: 8px;
+}
+
+.card-badge {
+  position: absolute;
+  top: 16px;
+  right: 16px;
+}
+
+.card-arrow {
+  position: absolute;
+  top: 50%;
+  right: 16px;
+  transform: translateY(-50%);
+  color: #7f8c8d;
+  font-size: 16px;
+  transition: all 0.3s ease;
+}
+
+.action-card--clickable:hover .card-arrow {
+  color: #4facfe;
+  transform: translateY(-50%) translateX(4px);
+}
+
+.action-card--disabled .card-arrow {
+  display: none;
+}
+</style>

+ 157 - 0
src/page/edu-industry/components/ChartContainer.vue

@@ -0,0 +1,157 @@
+<template>
+  <div class="chart-container" :class="{ 'chart-container--loading': loading }">
+    <div class="chart-header" v-if="title || $slots.header">
+      <div class="chart-title" v-if="title">
+        <h4>{{ title }}</h4>
+        <p v-if="subtitle">{{ subtitle }}</p>
+      </div>
+      <div class="chart-actions" v-if="$slots.header">
+        <slot name="header"></slot>
+      </div>
+    </div>
+
+    <div class="chart-content" :style="{ height: height }">
+      <div v-if="loading" class="chart-loading">
+        <el-icon class="loading-icon">
+          <Loading />
+        </el-icon>
+        <p>数据加载中...</p>
+      </div>
+
+      <div v-else-if="!hasData" class="chart-placeholder">
+        <el-icon class="placeholder-icon">
+          <component :is="placeholderIcon" />
+        </el-icon>
+        <p>{{ placeholderText }}</p>
+      </div>
+
+      <div v-else class="chart-wrapper">
+        <slot></slot>
+      </div>
+    </div>
+
+    <div class="chart-footer" v-if="$slots.footer">
+      <slot name="footer"></slot>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue'
+import { Loading, TrendCharts } from '@element-plus/icons-vue'
+
+const props = defineProps<{
+  title?: string
+  subtitle?: string
+  height?: string
+  loading?: boolean
+  hasData?: boolean
+  placeholderText?: string
+  placeholderIcon?: any
+}>()
+
+const placeholderIcon = computed(() => props.placeholderIcon || TrendCharts)
+const placeholderText = computed(() => props.placeholderText || '暂无数据')
+</script>
+
+<style scoped>
+.chart-container {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+  border: 1px solid #e4e7ed;
+  transition: all 0.3s ease;
+}
+
+.chart-container:hover {
+  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
+}
+
+.chart-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  margin-bottom: 20px;
+  padding-bottom: 16px;
+  border-bottom: 1px solid #f0f2f5;
+}
+
+.chart-title h4 {
+  margin: 0 0 4px 0;
+  color: #2c3e50;
+  font-size: 18px;
+  font-weight: 600;
+}
+
+.chart-title p {
+  margin: 0;
+  color: #7f8c8d;
+  font-size: 14px;
+}
+
+.chart-actions {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.chart-content {
+  position: relative;
+  min-height: 200px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.chart-wrapper {
+  width: 100%;
+  height: 100%;
+}
+
+.chart-loading,
+.chart-placeholder {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+  color: #7f8c8d;
+}
+
+.loading-icon,
+.placeholder-icon {
+  font-size: 48px;
+  margin-bottom: 12px;
+  color: #4facfe;
+}
+
+.loading-icon {
+  animation: rotate 2s linear infinite;
+}
+
+.chart-loading p,
+.chart-placeholder p {
+  margin: 0;
+  font-size: 16px;
+}
+
+.chart-footer {
+  margin-top: 16px;
+  padding-top: 16px;
+  border-top: 1px solid #f0f2f5;
+}
+
+.chart-container--loading {
+  pointer-events: none;
+}
+
+@keyframes rotate {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+</style>

+ 109 - 0
src/page/edu-industry/components/PageHeader.vue

@@ -0,0 +1,109 @@
+<template>
+  <div class="page-header">
+    <div class="header-content">
+      <div class="header-left">
+        <el-breadcrumb separator="/" v-if="breadcrumbs.length > 0">
+          <el-breadcrumb-item
+            v-for="(item, index) in breadcrumbs"
+            :key="index"
+            :to="item.path"
+          >
+            {{ item.label }}
+          </el-breadcrumb-item>
+        </el-breadcrumb>
+        <h1 class="page-title">
+          <el-icon class="title-icon" v-if="icon">
+            <component :is="icon" />
+          </el-icon>
+          {{ title }}
+        </h1>
+        <p class="page-description" v-if="description">
+          {{ description }}
+        </p>
+      </div>
+      <div class="header-right" v-if="$slots.actions">
+        <slot name="actions"></slot>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { defineProps } from 'vue'
+
+interface Breadcrumb {
+  label: string
+  path?: string
+}
+
+defineProps<{
+  title: string
+  description?: string
+  icon?: any
+  breadcrumbs?: Breadcrumb[]
+}>()
+</script>
+
+<style scoped>
+.page-header {
+  background: white;
+  border-radius: 12px;
+  padding: 16px 20px;
+  margin-bottom: 16px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+  border: 1px solid #e4e7ed;
+}
+
+.header-content {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+}
+
+.header-left {
+  flex: 1;
+}
+
+.page-title {
+  display: flex;
+  align-items: center;
+  font-size: 28px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin: 8px 0 6px 0;
+  line-height: 1.2;
+}
+
+.title-icon {
+  margin-right: 12px;
+  color: #4facfe;
+  font-size: 32px;
+}
+
+.page-description {
+  color: #7f8c8d;
+  font-size: 16px;
+  margin: 0;
+  line-height: 1.5;
+}
+
+.header-right {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  margin-left: 24px;
+}
+
+:deep(.el-breadcrumb) {
+  font-size: 14px;
+}
+
+:deep(.el-breadcrumb__item) {
+  color: #7f8c8d;
+}
+
+:deep(.el-breadcrumb__item:last-child .el-breadcrumb__inner) {
+  color: #4facfe;
+  font-weight: 500;
+}
+</style>

+ 190 - 0
src/page/edu-industry/components/StatCard.vue

@@ -0,0 +1,190 @@
+<template>
+  <div class="stat-card" :class="[`stat-card--${type}`, { 'stat-card--hover': hover }]">
+    <div class="card-icon" :class="`card-icon--${type}`">
+      <el-icon>
+        <component :is="icon" />
+      </el-icon>
+    </div>
+    <div class="card-content">
+      <div class="card-number">{{ number }}</div>
+      <div class="card-label">{{ label }}</div>
+      <div class="card-trend" v-if="trend">
+        <el-icon :class="getTrendClass()">
+          <component :is="getTrendIcon()" />
+        </el-icon>
+        <span :class="getTrendClass()">{{ trend.value }}{{ trend.unit }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue'
+import { ArrowUp, ArrowDown, Minus } from '@element-plus/icons-vue'
+
+interface Trend {
+  value: number
+  unit?: string
+  direction?: 'up' | 'down' | 'stable'
+}
+
+const props = defineProps<{
+  icon: any
+  number: number | string
+  label: string
+  type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'
+  trend?: Trend
+  hover?: boolean
+}>()
+
+const getTrendIcon = () => {
+  if (!props.trend) return Minus
+  switch (props.trend.direction) {
+    case 'up':
+      return ArrowUp
+    case 'down':
+      return ArrowDown
+    default:
+      return Minus
+  }
+}
+
+const getTrendClass = () => {
+  if (!props.trend) return ''
+  switch (props.trend.direction) {
+    case 'up':
+      return 'trend-up'
+    case 'down':
+      return 'trend-down'
+    default:
+      return 'trend-stable'
+  }
+}
+</script>
+
+<style scoped>
+.stat-card {
+  background: white;
+  border-radius: 12px;
+  padding: 24px;
+  display: flex;
+  align-items: center;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+  border: 1px solid #e4e7ed;
+  transition: all 0.3s ease;
+  position: relative;
+  overflow: hidden;
+}
+
+.stat-card::before {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 4px;
+  height: 100%;
+  background: var(--card-color);
+  transition: width 0.3s ease;
+}
+
+.stat-card--hover:hover {
+  transform: translateY(-4px);
+  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
+}
+
+.stat-card--hover:hover::before {
+  width: 8px;
+}
+
+.stat-card--primary {
+  --card-color: #4facfe;
+}
+
+.stat-card--success {
+  --card-color: #00b894;
+}
+
+.stat-card--warning {
+  --card-color: #fdcb6e;
+}
+
+.stat-card--danger {
+  --card-color: #e17055;
+}
+
+.stat-card--info {
+  --card-color: #74b9ff;
+}
+
+.card-icon {
+  width: 56px;
+  height: 56px;
+  border-radius: 14px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-right: 20px;
+  font-size: 28px;
+  color: white;
+  position: relative;
+}
+
+.card-icon--primary {
+  background: linear-gradient(135deg, #667eea, #764ba2);
+}
+
+.card-icon--success {
+  background: linear-gradient(135deg, #00b894, #00cec9);
+}
+
+.card-icon--warning {
+  background: linear-gradient(135deg, #fdcb6e, #e17055);
+}
+
+.card-icon--danger {
+  background: linear-gradient(135deg, #fd79a8, #e84393);
+}
+
+.card-icon--info {
+  background: linear-gradient(135deg, #74b9ff, #0984e3);
+}
+
+.card-content {
+  flex: 1;
+}
+
+.card-number {
+  font-size: 32px;
+  font-weight: 700;
+  color: #2c3e50;
+  line-height: 1;
+  margin-bottom: 4px;
+}
+
+.card-label {
+  font-size: 16px;
+  color: #7f8c8d;
+  margin-bottom: 8px;
+  font-weight: 500;
+}
+
+.card-trend {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  font-size: 14px;
+  font-weight: 500;
+}
+
+.trend-up {
+  color: #00b894;
+}
+
+.trend-down {
+  color: #e17055;
+}
+
+.trend-stable {
+  color: #7f8c8d;
+}
+</style>

+ 21 - 0
src/page/edu-industry/components/index.ts

@@ -0,0 +1,21 @@
+// 产教融合模块共用组件导出
+
+import PageHeader from './PageHeader.vue'
+import StatCard from './StatCard.vue'
+import ChartContainer from './ChartContainer.vue'
+import ActionCard from './ActionCard.vue'
+
+export {
+  PageHeader,
+  StatCard,
+  ChartContainer,
+  ActionCard
+}
+
+// 默认导出所有组件
+export default {
+  PageHeader,
+  StatCard,
+  ChartContainer,
+  ActionCard
+}

+ 345 - 0
src/page/edu-industry/index.vue

@@ -0,0 +1,345 @@
+<template>
+  <div class="edu-industry-container">
+    <!-- 页面头部 -->
+    <PageHeader
+      title="产教融合管理平台"
+      description="智能化校企合作,推动产学研深度融合,构建协同创新生态体系"
+      :icon="School"
+      :breadcrumbs="breadcrumbs"
+    >
+      <template #actions>
+        <el-button type="primary" @click="handleQuickStart">
+          <el-icon><Star /></el-icon>
+          快速开始
+        </el-button>
+      </template>
+    </PageHeader>
+
+    <!-- 数据概览卡片 -->
+    <div class="overview-cards">
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <StatCard
+            :icon="Briefcase"
+            :number="overviewData.totalProjects"
+            label="合作项目"
+            type="primary"
+            :hover="true"
+            :trend="{ value: 12, unit: '%', direction: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            :icon="TrendCharts"
+            :number="overviewData.activeProjects"
+            label="进行中"
+            type="success"
+            :hover="true"
+            :trend="{ value: 8, unit: '%', direction: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            :icon="OfficeBuilding"
+            :number="overviewData.partners"
+            label="合作企业"
+            type="warning"
+            :hover="true"
+            :trend="{ value: 5, unit: '%', direction: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            :icon="Trophy"
+            :number="overviewData.achievements"
+            label="转化成果"
+            type="info"
+            :hover="true"
+            :trend="{ value: 15, unit: '%', direction: 'up' }"
+          />
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 三大子系统 -->
+    <div class="main-systems">
+      <h2 class="section-title">三大核心子系统</h2>
+      <el-row :gutter="24">
+        <el-col :span="8">
+          <ActionCard
+            title="智能校企资源匹配系统"
+            description="基于AI算法的智能匹配引擎,实现校企资源精准对接"
+            :icon="Connection"
+            :clickable="true"
+            :stats="[
+              { value: systemStats.matching.success, label: '成功匹配' },
+              { value: systemStats.matching.accuracy + '%', label: '匹配精度' }
+            ]"
+            @click="navigateToMatching"
+          >
+            <template #meta>
+              <ul class="feature-list">
+                <li>动态标签库管理</li>
+                <li>AI算法推荐引擎</li>
+                <li>热力图看板</li>
+              </ul>
+            </template>
+            <template #actions>
+              <el-button type="primary" plain>进入系统</el-button>
+            </template>
+          </ActionCard>
+        </el-col>
+
+        <el-col :span="8">
+          <ActionCard
+            title="产学研成果转化加速器"
+            description="全流程成果转化服务,加速科研成果产业化进程"
+            :icon="Promotion"
+            :clickable="true"
+            :stats="[
+              { value: systemStats.transformation.projects, label: '转化项目' },
+              { value: systemStats.transformation.value + '万', label: '转化价值' }
+            ]"
+            @click="navigateToTransformation"
+          >
+            <template #meta>
+              <ul class="feature-list">
+                <li>技术成熟度评估仪表盘</li>
+                <li>路演匹配系统</li>
+                <li>成果展示平台</li>
+              </ul>
+            </template>
+            <template #actions>
+              <el-button type="primary" plain>进入系统</el-button>
+            </template>
+          </ActionCard>
+        </el-col>
+
+        <el-col :span="8">
+          <ActionCard
+            title="全生命周期项目管理平台"
+            description="项目全流程数字化管理,实现协同高效的项目运营"
+            :icon="Management"
+            :clickable="true"
+            :stats="[
+              { value: systemStats.lifecycle.projects, label: '管理项目' },
+              { value: systemStats.lifecycle.efficiency + '%', label: '效率提升' }
+            ]"
+            @click="navigateToLifecycle"
+          >
+            <template #meta>
+              <ul class="feature-list">
+                <li>三维进度管理</li>
+                <li>风险预警系统</li>
+                <li>知识产权沙盒协作</li>
+              </ul>
+            </template>
+            <template #actions>
+              <el-button type="primary" plain>进入系统</el-button>
+            </template>
+          </ActionCard>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 快捷操作 -->
+    <div class="quick-actions">
+      <h2 class="section-title">快捷操作</h2>
+      <el-row :gutter="16">
+        <el-col :span="6" v-for="action in quickActions" :key="action.id">
+          <ActionCard
+            :title="action.title"
+            :description="action.description"
+            :icon="action.icon"
+            :clickable="true"
+            size="small"
+            @click="handleQuickAction(action.id)"
+          />
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted, reactive } from 'vue'
+import { useRouter } from 'vue-router'
+import {
+  Connection,
+  Plus,
+  OfficeBuilding,
+  Briefcase,
+  Trophy,
+  TrendCharts,
+  DataBoard,
+  Management,
+  Promotion,
+  School,
+  Search,
+  Setting,
+  Star,
+  Timer,
+  User
+} from '@element-plus/icons-vue'
+import { PageHeader, StatCard, ActionCard } from './components'
+
+const router = useRouter()
+
+// 面包屑导航
+const breadcrumbs = ref([
+  { label: '首页', path: '/' },
+  { label: '产教融合', path: '/edu-industry' }
+])
+
+// 概览数据
+const overviewData = ref({
+  totalProjects: 89,
+  activeProjects: 56,
+  partners: 156,
+  achievements: 234
+})
+
+// 系统统计数据
+const systemStats = reactive({
+  matching: {
+    success: 156,
+    accuracy: 92
+  },
+  transformation: {
+    projects: 43,
+    value: 2850
+  },
+  lifecycle: {
+    projects: 28,
+    efficiency: 85
+  }
+})
+
+// 快捷操作数据
+const quickActions = reactive([
+  {
+    id: 'enterprise',
+    title: '企业信息管理',
+    description: '添加和管理合作企业信息',
+    icon: OfficeBuilding
+  },
+  {
+    id: 'project',
+    title: '项目申报',
+    description: '创建新的校企合作项目',
+    icon: Briefcase
+  },
+  {
+    id: 'matching',
+    title: '智能匹配',
+    description: '获取AI推荐的合作伙伴',
+    icon: Connection
+  },
+  {
+    id: 'assessment',
+    title: '成果评估',
+    description: '技术成熟度评估与分析',
+    icon: DataBoard
+  }
+])
+
+// 页面方法
+const handleQuickStart = () => {
+  // 快速开始引导
+  console.log('快速开始')
+}
+
+// 导航方法
+const navigateToMatching = () => {
+  router.push('/edu-industry/matching')
+}
+
+const navigateToTransformation = () => {
+  router.push('/edu-industry/transformation')
+}
+
+const navigateToLifecycle = () => {
+  router.push('/edu-industry/lifecycle')
+}
+
+// 快捷操作处理
+const handleQuickAction = (actionId) => {
+  switch (actionId) {
+    case 'enterprise':
+      // 跳转到企业管理页面
+      break
+    case 'project':
+      // 跳转到项目申报页面
+      break
+    case 'matching':
+      navigateToMatching()
+      break
+    case 'assessment':
+      navigateToTransformation()
+      break
+  }
+}
+
+onMounted(() => {
+  // 加载数据
+  console.log('产教融合模块已加载')
+})
+</script>
+
+<style scoped lang="scss">
+@import './styles/common.scss';
+
+.edu-industry-container {
+  padding: 24px;
+  background: #f5f7fa;
+  min-height: 100vh;
+}
+
+.section-title {
+  font-size: 20px;
+  font-weight: 600;
+  color: #303133;
+  margin-bottom: 20px;
+
+  &::before {
+    content: '';
+    display: inline-block;
+    width: 4px;
+    height: 20px;
+    background: linear-gradient(135deg, #409eff, #67c23a);
+    margin-right: 12px;
+    vertical-align: middle;
+  }
+}
+
+.main-systems {
+  margin-bottom: 32px;
+
+  .feature-list {
+    list-style: none;
+    padding: 0;
+    margin: 12px 0;
+
+    li {
+      color: #909399;
+      font-size: 14px;
+      margin-bottom: 6px;
+      position: relative;
+      padding-left: 16px;
+
+      &::before {
+        content: '•';
+        color: #409eff;
+        position: absolute;
+        left: 0;
+      }
+    }
+  }
+}
+
+.quick-actions {
+  .feature-list {
+    display: none; // 快捷操作卡片不显示功能列表
+  }
+}
+</style>

+ 1402 - 0
src/page/edu-industry/lifecycle/index.vue

@@ -0,0 +1,1402 @@
+<template>
+  <div class="lifecycle-container">
+    <!-- 页面头部 -->
+    <div class="page-header">
+      <div class="header-content">
+        <div class="header-left">
+          <el-breadcrumb separator="/">
+            <el-breadcrumb-item :to="{ path: '/edu-industry' }">产教融合</el-breadcrumb-item>
+            <el-breadcrumb-item>全生命周期项目管理平台</el-breadcrumb-item>
+          </el-breadcrumb>
+          <h1 class="page-title">
+            <el-icon class="title-icon"><Management /></el-icon>
+            全生命周期项目管理平台
+          </h1>
+        </div>
+        <div class="header-right">
+          <el-button type="primary" @click="handleCreateProject">
+            <el-icon><Plus /></el-icon>
+            创建项目
+          </el-button>
+        </div>
+      </div>
+    </div>
+
+    <!-- 项目概览卡片 -->
+    <div class="overview-cards">
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <div class="overview-card">
+            <div class="card-icon total">
+              <el-icon><Briefcase /></el-icon>
+            </div>
+            <div class="card-content">
+              <div class="card-number">{{ projectStats.total }}</div>
+              <div class="card-label">总项目数</div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <div class="overview-card">
+            <div class="card-icon active">
+              <el-icon><Timer /></el-icon>
+            </div>
+            <div class="card-content">
+              <div class="card-number">{{ projectStats.active }}</div>
+              <div class="card-label">进行中</div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <div class="overview-card">
+            <div class="card-icon warning">
+              <el-icon><Warning /></el-icon>
+            </div>
+            <div class="card-content">
+              <div class="card-number">{{ projectStats.warning }}</div>
+              <div class="card-label">风险预警</div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <div class="overview-card">
+            <div class="card-icon completed">
+              <el-icon><CircleCheck /></el-icon>
+            </div>
+            <div class="card-content">
+              <div class="card-number">{{ projectStats.completed }}</div>
+              <div class="card-label">已完成</div>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 功能导航标签 -->
+    <div class="function-tabs">
+      <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+        <el-tab-pane label="三维进度管理" name="progress">
+          <div class="tab-content">
+            <!-- 三维进度管理 -->
+            <div class="progress-management">
+              <el-row :gutter="24">
+                <!-- 项目列表 -->
+                <el-col :span="8">
+                  <div class="project-list">
+                    <div class="section-header">
+                      <h3>项目列表</h3>
+                      <el-select v-model="projectFilter" placeholder="筛选项目" size="small">
+                        <el-option label="全部项目" value="all" />
+                        <el-option label="进行中" value="active" />
+                        <el-option label="已延期" value="delayed" />
+                        <el-option label="已完成" value="completed" />
+                      </el-select>
+                    </div>
+                    <div class="project-items">
+                      <div
+                        v-for="project in filteredProjects"
+                        :key="project.id"
+                        class="project-item"
+                        :class="{ active: selectedProject?.id === project.id }"
+                        @click="selectProject(project)"
+                      >
+                        <div class="project-info">
+                          <h4>{{ project.name }}</h4>
+                          <p>{{ project.description }}</p>
+                          <div class="project-meta">
+                            <el-tag :type="getProjectStatusType(project.status)" size="small">
+                              {{ project.status }}
+                            </el-tag>
+                            <span class="project-progress">{{ project.progress }}%</span>
+                          </div>
+                        </div>
+                        <div class="project-chart">
+                          <el-progress
+                            type="circle"
+                            :percentage="project.progress"
+                            :width="40"
+                            :stroke-width="4"
+                          />
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+
+                <!-- 三维进度视图 -->
+                <el-col :span="16">
+                  <div class="progress-view" v-if="selectedProject">
+                    <div class="view-header">
+                      <h3>{{ selectedProject.name }} - 三维进度管理</h3>
+                      <div class="view-controls">
+                        <el-button-group>
+                          <el-button
+                            :type="progressView === 'admin' ? 'primary' : 'default'"
+                            @click="progressView = 'admin'"
+                          >
+                            行政节点
+                          </el-button>
+                          <el-button
+                            :type="progressView === 'teaching' ? 'primary' : 'default'"
+                            @click="progressView = 'teaching'"
+                          >
+                            教学节点
+                          </el-button>
+                          <el-button
+                            :type="progressView === 'finance' ? 'primary' : 'default'"
+                            @click="progressView = 'finance'"
+                          >
+                            财务节点
+                          </el-button>
+                        </el-button-group>
+                      </div>
+                    </div>
+
+                    <!-- 进度时间轴 -->
+                    <div class="progress-timeline">
+                      <el-timeline>
+                        <el-timeline-item
+                          v-for="milestone in getCurrentMilestones()"
+                          :key="milestone.id"
+                          :timestamp="milestone.date"
+                          :type="getMilestoneType(milestone.status)"
+                          :icon="getMilestoneIcon(milestone.status)"
+                        >
+                          <div class="milestone-content">
+                            <h4>{{ milestone.title }}</h4>
+                            <p>{{ milestone.description }}</p>
+                            <div class="milestone-details">
+                              <div class="detail-item">
+                                <span class="label">负责人:</span>
+                                <span>{{ milestone.assignee }}</span>
+                              </div>
+                              <div class="detail-item">
+                                <span class="label">预计完成:</span>
+                                <span>{{ milestone.expectedDate }}</span>
+                              </div>
+                              <div class="detail-item" v-if="milestone.documents">
+                                <span class="label">相关文档:</span>
+                                <el-link
+                                  v-for="doc in milestone.documents"
+                                  :key="doc.id"
+                                  type="primary"
+                                  @click="handleViewDocument(doc)"
+                                >
+                                  {{ doc.name }}
+                                </el-link>
+                              </div>
+                            </div>
+                            <div class="milestone-actions" v-if="milestone.status === 'pending'">
+                              <el-button size="small" @click="handleUpdateMilestone(milestone)">
+                                更新进度
+                              </el-button>
+                              <el-button size="small" type="primary" @click="handleCompleteMilestone(milestone)">
+                                标记完成
+                              </el-button>
+                            </div>
+                          </div>
+                        </el-timeline-item>
+                      </el-timeline>
+                    </div>
+
+                    <!-- 进度统计 -->
+                    <div class="progress-stats">
+                      <el-row :gutter="16">
+                        <el-col :span="8">
+                          <div class="stat-card">
+                            <h4>行政进度</h4>
+                            <el-progress :percentage="selectedProject.adminProgress" />
+                          </div>
+                        </el-col>
+                        <el-col :span="8">
+                          <div class="stat-card">
+                            <h4>教学进度</h4>
+                            <el-progress :percentage="selectedProject.teachingProgress" />
+                          </div>
+                        </el-col>
+                        <el-col :span="8">
+                          <div class="stat-card">
+                            <h4>财务进度</h4>
+                            <el-progress :percentage="selectedProject.financeProgress" />
+                          </div>
+                        </el-col>
+                      </el-row>
+                    </div>
+                  </div>
+                  <div v-else class="no-selection">
+                    <el-empty description="请选择一个项目查看进度详情" />
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </el-tab-pane>
+
+        <el-tab-pane label="风险预警系统" name="risk">
+          <div class="tab-content">
+            <!-- 风险预警系统 -->
+            <div class="risk-warning-system">
+              <!-- 风险概览 -->
+              <div class="risk-overview">
+                <el-row :gutter="20">
+                  <el-col :span="6">
+                    <div class="risk-card high">
+                      <div class="risk-level">高风险</div>
+                      <div class="risk-count">{{ riskStats.high }}</div>
+                      <div class="risk-label">项目</div>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <div class="risk-card medium">
+                      <div class="risk-level">中风险</div>
+                      <div class="risk-count">{{ riskStats.medium }}</div>
+                      <div class="risk-label">项目</div>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <div class="risk-card low">
+                      <div class="risk-level">低风险</div>
+                      <div class="risk-count">{{ riskStats.low }}</div>
+                      <div class="risk-label">项目</div>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <div class="risk-card safe">
+                      <div class="risk-level">安全</div>
+                      <div class="risk-count">{{ riskStats.safe }}</div>
+                      <div class="risk-label">项目</div>
+                    </div>
+                  </el-col>
+                </el-row>
+              </div>
+
+              <!-- 风险预警列表 -->
+              <div class="risk-warnings">
+                <div class="section-header">
+                  <h3>风险预警</h3>
+                  <el-button type="primary" @click="handleCreateRiskRule">
+                    <el-icon><Plus /></el-icon>
+                    添加预警规则
+                  </el-button>
+                </div>
+                <el-table :data="riskWarnings" style="width: 100%">
+                  <el-table-column prop="projectName" label="项目名称" width="200" />
+                  <el-table-column prop="riskType" label="风险类型" width="120">
+                    <template #default="{ row }">
+                      <el-tag :type="getRiskTypeColor(row.riskType)">
+                        {{ row.riskType }}
+                      </el-tag>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="riskLevel" label="风险等级" width="100">
+                    <template #default="{ row }">
+                      <el-tag :type="getRiskLevelColor(row.riskLevel)">
+                        {{ row.riskLevel }}
+                      </el-tag>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="description" label="风险描述" />
+                  <el-table-column prop="triggerDate" label="触发时间" width="150" />
+                  <el-table-column label="操作" width="200">
+                    <template #default="{ row }">
+                      <el-button size="small" @click="handleViewRisk(row)">查看</el-button>
+                      <el-button size="small" type="warning" @click="handleHandleRisk(row)">
+                        处理
+                      </el-button>
+                      <el-button size="small" type="success" @click="handleResolveRisk(row)">
+                        解决
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+
+              <!-- 风险分析图表 -->
+              <div class="risk-analysis">
+                <el-row :gutter="24">
+                  <el-col :span="12">
+                    <div class="chart-container">
+                      <h4>风险趋势分析</h4>
+                      <div class="chart-placeholder">
+                        <el-icon class="chart-icon"><TrendCharts /></el-icon>
+                        <p>风险趋势图表</p>
+                      </div>
+                    </div>
+                  </el-col>
+                  <el-col :span="12">
+                    <div class="chart-container">
+                      <h4>风险分布分析</h4>
+                      <div class="chart-placeholder">
+                        <el-icon class="chart-icon"><PieChart /></el-icon>
+                        <p>风险分布饼图</p>
+                      </div>
+                    </div>
+                  </el-col>
+                </el-row>
+              </div>
+            </div>
+          </div>
+        </el-tab-pane>
+
+        <el-tab-pane label="知识产权沙盒协作" name="ip">
+          <div class="tab-content">
+            <!-- 知识产权沙盒协作 -->
+            <div class="ip-collaboration">
+              <el-row :gutter="24">
+                <!-- 知识产权管理 -->
+                <el-col :span="12">
+                  <div class="ip-management">
+                    <div class="section-header">
+                      <h3>知识产权管理</h3>
+                      <el-button type="primary" size="small" @click="handleAddIP">
+                        <el-icon><Plus /></el-icon>
+                        添加IP
+                      </el-button>
+                    </div>
+                    <div class="ip-list">
+                      <div
+                        v-for="ip in intellectualProperties"
+                        :key="ip.id"
+                        class="ip-item"
+                      >
+                        <div class="ip-header">
+                          <div class="ip-info">
+                            <h4>{{ ip.title }}</h4>
+                            <p>{{ ip.description }}</p>
+                          </div>
+                          <div class="ip-type">
+                            <el-tag :type="getIPTypeColor(ip.type)">
+                              {{ ip.type }}
+                            </el-tag>
+                          </div>
+                        </div>
+                        <div class="ip-details">
+                          <div class="detail-row">
+                            <span class="label">申请人:</span>
+                            <span>{{ ip.applicant }}</span>
+                          </div>
+                          <div class="detail-row">
+                            <span class="label">申请日期:</span>
+                            <span>{{ ip.applicationDate }}</span>
+                          </div>
+                          <div class="detail-row">
+                            <span class="label">状态:</span>
+                            <el-tag :type="getIPStatusColor(ip.status)" size="small">
+                              {{ ip.status }}
+                            </el-tag>
+                          </div>
+                        </div>
+                        <div class="ip-actions">
+                          <el-button size="small" @click="handleViewIP(ip)">查看详情</el-button>
+                          <el-button size="small" type="primary" @click="handleEditIP(ip)">
+                            编辑
+                          </el-button>
+                          <el-button size="small" type="warning" @click="handleShareIP(ip)">
+                            共享
+                          </el-button>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+
+                <!-- 协作沙盒 -->
+                <el-col :span="12">
+                  <div class="collaboration-sandbox">
+                    <div class="section-header">
+                      <h3>协作沙盒</h3>
+                      <el-button type="primary" size="small" @click="handleCreateSandbox">
+                        <el-icon><Plus /></el-icon>
+                        创建沙盒
+                      </el-button>
+                    </div>
+                    <div class="sandbox-list">
+                      <div
+                        v-for="sandbox in collaborationSandboxes"
+                        :key="sandbox.id"
+                        class="sandbox-item"
+                      >
+                        <div class="sandbox-header">
+                          <h4>{{ sandbox.name }}</h4>
+                          <el-tag :type="getSandboxStatusColor(sandbox.status)">
+                            {{ sandbox.status }}
+                          </el-tag>
+                        </div>
+                        <div class="sandbox-content">
+                          <p>{{ sandbox.description }}</p>
+                          <div class="sandbox-participants">
+                            <span class="label">参与者:</span>
+                            <el-avatar-group :max="3">
+                              <el-avatar
+                                v-for="participant in sandbox.participants"
+                                :key="participant.id"
+                                :src="participant.avatar"
+                                :title="participant.name"
+                              />
+                            </el-avatar-group>
+                          </div>
+                          <div class="sandbox-resources">
+                            <span class="label">共享资源:</span>
+                            <div class="resource-list">
+                              <el-tag
+                                v-for="resource in sandbox.sharedResources"
+                                :key="resource.id"
+                                size="small"
+                                type="info"
+                              >
+                                {{ resource.name }}
+                              </el-tag>
+                            </div>
+                          </div>
+                        </div>
+                        <div class="sandbox-actions">
+                          <el-button size="small" @click="handleEnterSandbox(sandbox)">
+                            进入沙盒
+                          </el-button>
+                          <el-button size="small" type="primary" @click="handleManageSandbox(sandbox)">
+                            管理
+                          </el-button>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+
+              <!-- 协作活动时间线 -->
+              <div class="collaboration-timeline">
+                <h3>协作活动时间线</h3>
+                <el-timeline>
+                  <el-timeline-item
+                    v-for="activity in collaborationActivities"
+                    :key="activity.id"
+                    :timestamp="activity.timestamp"
+                    :type="getActivityType(activity.type)"
+                  >
+                    <div class="activity-content">
+                      <h4>{{ activity.title }}</h4>
+                      <p>{{ activity.description }}</p>
+                      <div class="activity-meta">
+                        <span class="actor">{{ activity.actor }}</span>
+                        <span class="action">{{ activity.action }}</span>
+                        <span class="target">{{ activity.target }}</span>
+                      </div>
+                    </div>
+                  </el-timeline-item>
+                </el-timeline>
+              </div>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, computed, onMounted } from 'vue'
+import {
+  Management,
+  Plus,
+  Briefcase,
+  Timer,
+  Warning,
+  CircleCheck,
+  TrendCharts,
+  PieChart
+} from '@element-plus/icons-vue'
+
+// 活动标签
+const activeTab = ref('progress')
+
+// 项目统计数据
+const projectStats = ref({
+  total: 45,
+  active: 28,
+  warning: 8,
+  completed: 17
+})
+
+// 项目筛选
+const projectFilter = ref('all')
+
+// 选中的项目
+const selectedProject = ref(null)
+
+// 进度视图
+const progressView = ref('admin')
+
+// 项目数据
+const projects = ref([
+  {
+    id: 1,
+    name: '智能制造产教融合项目',
+    description: '与华为合作的智能制造技术研发项目',
+    status: '进行中',
+    progress: 75,
+    adminProgress: 80,
+    teachingProgress: 70,
+    financeProgress: 75
+  },
+  {
+    id: 2,
+    name: '新能源汽车技术研发',
+    description: '与比亚迪合作的新能源汽车核心技术研发',
+    status: '延期',
+    progress: 45,
+    adminProgress: 50,
+    teachingProgress: 40,
+    financeProgress: 45
+  },
+  {
+    id: 3,
+    name: '人工智能教育平台',
+    description: '与腾讯合作的AI教育平台开发项目',
+    status: '已完成',
+    progress: 100,
+    adminProgress: 100,
+    teachingProgress: 100,
+    financeProgress: 100
+  }
+])
+
+// 里程碑数据
+const milestones = ref({
+  admin: [
+    {
+      id: 1,
+      title: '项目立项审批',
+      description: '完成项目立项申请和审批流程',
+      date: '2024-01-15',
+      expectedDate: '2024-01-20',
+      status: 'completed',
+      assignee: '张主任',
+      documents: [
+        { id: 1, name: '项目申请书.pdf' },
+        { id: 2, name: '审批意见.pdf' }
+      ]
+    },
+    {
+      id: 2,
+      title: '合同签署',
+      description: '与合作企业签署正式合作协议',
+      date: '2024-02-01',
+      expectedDate: '2024-02-05',
+      status: 'pending',
+      assignee: '李经理',
+      documents: [
+        { id: 3, name: '合作协议草案.pdf' }
+      ]
+    }
+  ],
+  teaching: [
+    {
+      id: 1,
+      title: '课程设计',
+      description: '设计项目相关的教学课程',
+      date: '2024-01-20',
+      expectedDate: '2024-01-25',
+      status: 'completed',
+      assignee: '王教授',
+      documents: [
+        { id: 4, name: '课程大纲.pdf' }
+      ]
+    },
+    {
+      id: 2,
+      title: '学分认定',
+      description: '确定项目参与学生的学分认定方案',
+      date: '2024-02-10',
+      expectedDate: '2024-02-15',
+      status: 'pending',
+      assignee: '刘副教授'
+    }
+  ],
+  finance: [
+    {
+      id: 1,
+      title: '预算审核',
+      description: '审核项目预算和资金使用计划',
+      date: '2024-01-25',
+      expectedDate: '2024-01-30',
+      status: 'completed',
+      assignee: '财务处',
+      documents: [
+        { id: 5, name: '预算明细.xlsx' }
+      ]
+    },
+    {
+      id: 2,
+      title: '首期拨款',
+      description: '发放项目首期启动资金',
+      date: '2024-02-05',
+      expectedDate: '2024-02-10',
+      status: 'pending',
+      assignee: '财务处'
+    }
+  ]
+})
+
+// 风险统计
+const riskStats = ref({
+  high: 3,
+  medium: 8,
+  low: 12,
+  safe: 22
+})
+
+// 风险预警数据
+const riskWarnings = ref([
+  {
+    id: 1,
+    projectName: '智能制造产教融合项目',
+    riskType: '进度延期',
+    riskLevel: '高',
+    description: '项目进度落后于计划,存在延期风险',
+    triggerDate: '2024-02-01'
+  },
+  {
+    id: 2,
+    projectName: '新能源汽车技术研发',
+    riskType: '预算超支',
+    riskLevel: '中',
+    description: '项目支出超出预算10%',
+    triggerDate: '2024-02-03'
+  },
+  {
+    id: 3,
+    projectName: '人工智能教育平台',
+    riskType: '质量问题',
+    riskLevel: '低',
+    description: '部分功能测试未通过',
+    triggerDate: '2024-02-05'
+  }
+])
+
+// 知识产权数据
+const intellectualProperties = ref([
+  {
+    id: 1,
+    title: '智能语音识别算法',
+    description: '基于深度学习的多语言语音识别核心算法',
+    type: '发明专利',
+    applicant: '江西财经大学',
+    applicationDate: '2024-01-15',
+    status: '申请中'
+  },
+  {
+    id: 2,
+    title: '产教融合管理系统',
+    description: '校企合作项目管理软件系统',
+    type: '软件著作权',
+    applicant: '江西财经大学',
+    applicationDate: '2024-01-20',
+    status: '已授权'
+  },
+  {
+    id: 3,
+    title: '新能源电池管理技术',
+    description: '电动汽车电池智能管理技术方案',
+    type: '实用新型',
+    applicant: '江西财经大学',
+    applicationDate: '2024-01-25',
+    status: '审查中'
+  }
+])
+
+// 协作沙盒数据
+const collaborationSandboxes = ref([
+  {
+    id: 1,
+    name: '智能制造技术沙盒',
+    description: '智能制造相关技术的协作研发环境',
+    status: '活跃',
+    participants: [
+      { id: 1, name: '张教授', avatar: '/avatars/teacher1.jpg' },
+      { id: 2, name: '李工程师', avatar: '/avatars/engineer1.jpg' },
+      { id: 3, name: '王学生', avatar: '/avatars/student1.jpg' }
+    ],
+    sharedResources: [
+      { id: 1, name: '技术文档' },
+      { id: 2, name: '代码仓库' },
+      { id: 3, name: '测试数据' }
+    ]
+  },
+  {
+    id: 2,
+    name: 'AI算法研发沙盒',
+    description: '人工智能算法的协作开发平台',
+    status: '筹备中',
+    participants: [
+      { id: 4, name: '刘博士', avatar: '/avatars/teacher2.jpg' },
+      { id: 5, name: '陈研究员', avatar: '/avatars/researcher1.jpg' }
+    ],
+    sharedResources: [
+      { id: 4, name: '算法模型' },
+      { id: 5, name: '训练数据集' }
+    ]
+  }
+])
+
+// 协作活动数据
+const collaborationActivities = ref([
+  {
+    id: 1,
+    title: '专利申请提交',
+    description: '智能语音识别算法专利申请已提交',
+    timestamp: '2024-02-01 14:30',
+    type: 'success',
+    actor: '张教授',
+    action: '提交了',
+    target: '发明专利申请'
+  },
+  {
+    id: 2,
+    title: '沙盒资源共享',
+    description: '新增技术文档到智能制造技术沙盒',
+    timestamp: '2024-02-02 09:15',
+    type: 'primary',
+    actor: '李工程师',
+    action: '共享了',
+    target: '技术文档'
+  },
+  {
+    id: 3,
+    title: '协作会议',
+    description: 'AI算法研发团队举行线上协作会议',
+    timestamp: '2024-02-03 16:00',
+    type: 'info',
+    actor: '刘博士',
+    action: '组织了',
+    target: '协作会议'
+  }
+])
+
+// 计算属性
+const filteredProjects = computed(() => {
+  if (projectFilter.value === 'all') return projects.value
+  return projects.value.filter(project => {
+    switch (projectFilter.value) {
+      case 'active':
+        return project.status === '进行中'
+      case 'delayed':
+        return project.status === '延期'
+      case 'completed':
+        return project.status === '已完成'
+      default:
+        return true
+    }
+  })
+})
+
+// 方法
+const handleTabChange = (tabName: string) => {
+  console.log('切换标签:', tabName)
+}
+
+const handleCreateProject = () => {
+  console.log('创建项目')
+}
+
+const selectProject = (project: any) => {
+  selectedProject.value = project
+}
+
+const getCurrentMilestones = () => {
+  return milestones.value[progressView.value] || []
+}
+
+const getProjectStatusType = (status: string) => {
+  const typeMap = {
+    '进行中': 'success',
+    '延期': 'danger',
+    '已完成': 'info'
+  }
+  return typeMap[status] || 'info'
+}
+
+const getMilestoneType = (status: string) => {
+  const typeMap = {
+    'completed': 'success',
+    'pending': 'primary',
+    'delayed': 'danger'
+  }
+  return typeMap[status] || 'primary'
+}
+
+const getMilestoneIcon = (status: string) => {
+  const iconMap = {
+    'completed': 'CircleCheck',
+    'pending': 'Timer',
+    'delayed': 'Warning'
+  }
+  return iconMap[status] || 'Timer'
+}
+
+const getRiskTypeColor = (type: string) => {
+  const colorMap = {
+    '进度延期': 'danger',
+    '预算超支': 'warning',
+    '质量问题': 'info'
+  }
+  return colorMap[type] || 'info'
+}
+
+const getRiskLevelColor = (level: string) => {
+  const colorMap = {
+    '高': 'danger',
+    '中': 'warning',
+    '低': 'success'
+  }
+  return colorMap[level] || 'info'
+}
+
+const getIPTypeColor = (type: string) => {
+  const colorMap = {
+    '发明专利': 'primary',
+    '软件著作权': 'success',
+    '实用新型': 'warning'
+  }
+  return colorMap[type] || 'info'
+}
+
+const getIPStatusColor = (status: string) => {
+  const colorMap = {
+    '申请中': 'warning',
+    '已授权': 'success',
+    '审查中': 'info'
+  }
+  return colorMap[status] || 'info'
+}
+
+const getSandboxStatusColor = (status: string) => {
+  const colorMap = {
+    '活跃': 'success',
+    '筹备中': 'warning',
+    '暂停': 'info'
+  }
+  return colorMap[status] || 'info'
+}
+
+const getActivityType = (type: string) => {
+  const typeMap = {
+    'success': 'success',
+    'primary': 'primary',
+    'info': 'info',
+    'warning': 'warning'
+  }
+  return typeMap[type] || 'primary'
+}
+
+// 事件处理方法
+const handleUpdateMilestone = (milestone: any) => {
+  console.log('更新里程碑:', milestone)
+}
+
+const handleCompleteMilestone = (milestone: any) => {
+  console.log('完成里程碑:', milestone)
+}
+
+const handleViewDocument = (doc: any) => {
+  console.log('查看文档:', doc)
+}
+
+const handleCreateRiskRule = () => {
+  console.log('创建风险规则')
+}
+
+const handleViewRisk = (risk: any) => {
+  console.log('查看风险:', risk)
+}
+
+const handleHandleRisk = (risk: any) => {
+  console.log('处理风险:', risk)
+}
+
+const handleResolveRisk = (risk: any) => {
+  console.log('解决风险:', risk)
+}
+
+const handleAddIP = () => {
+  console.log('添加知识产权')
+}
+
+const handleViewIP = (ip: any) => {
+  console.log('查看知识产权:', ip)
+}
+
+const handleEditIP = (ip: any) => {
+  console.log('编辑知识产权:', ip)
+}
+
+const handleShareIP = (ip: any) => {
+  console.log('共享知识产权:', ip)
+}
+
+const handleCreateSandbox = () => {
+  console.log('创建协作沙盒')
+}
+
+const handleEnterSandbox = (sandbox: any) => {
+  console.log('进入沙盒:', sandbox)
+}
+
+const handleManageSandbox = (sandbox: any) => {
+  console.log('管理沙盒:', sandbox)
+}
+
+onMounted(() => {
+  // 默认选择第一个项目
+  if (projects.value.length > 0) {
+    selectedProject.value = projects.value[0]
+  }
+  console.log('全生命周期项目管理平台已加载')
+})
+</script>
+
+<style scoped>
+.lifecycle-container {
+  padding: 20px;
+  background: #f5f7fa;
+  min-height: 100vh;
+}
+
+/* 页面头部 */
+.page-header {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+}
+
+.header-content {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.page-title {
+  display: flex;
+  align-items: center;
+  font-size: 24px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin: 8px 0 0 0;
+}
+
+.title-icon {
+  margin-right: 8px;
+  color: #4facfe;
+}
+
+/* 概览卡片 */
+.overview-cards {
+  margin-bottom: 20px;
+}
+
+.overview-card {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  display: flex;
+  align-items: center;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+  transition: transform 0.3s ease;
+}
+
+.overview-card:hover {
+  transform: translateY(-4px);
+}
+
+.card-icon {
+  width: 48px;
+  height: 48px;
+  border-radius: 12px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-right: 16px;
+  font-size: 24px;
+  color: white;
+}
+
+.card-icon.total {
+  background: linear-gradient(135deg, #667eea, #764ba2);
+}
+
+.card-icon.active {
+  background: linear-gradient(135deg, #f093fb, #f5576c);
+}
+
+.card-icon.warning {
+  background: linear-gradient(135deg, #ffeaa7, #fab1a0);
+}
+
+.card-icon.completed {
+  background: linear-gradient(135deg, #00b894, #00cec9);
+}
+
+.card-number {
+  font-size: 24px;
+  font-weight: 600;
+  color: #2c3e50;
+  line-height: 1;
+}
+
+.card-label {
+  font-size: 14px;
+  color: #7f8c8d;
+  margin-top: 4px;
+}
+
+/* 功能标签 */
+.function-tabs {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+}
+
+.tab-content {
+  padding-top: 20px;
+}
+
+/* 项目列表 */
+.project-list {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+  height: 600px;
+  overflow-y: auto;
+}
+
+.section-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+}
+
+.section-header h3 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.project-item {
+  background: white;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 12px;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.project-item:hover,
+.project-item.active {
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+  border-left: 4px solid #4facfe;
+}
+
+.project-info h4 {
+  margin: 0 0 8px 0;
+  color: #2c3e50;
+}
+
+.project-info p {
+  margin: 0 0 12px 0;
+  color: #7f8c8d;
+  font-size: 14px;
+}
+
+.project-meta {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+}
+
+.project-progress {
+  font-size: 12px;
+  color: #95a5a6;
+}
+
+/* 进度视图 */
+.progress-view {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+  height: 600px;
+  overflow-y: auto;
+}
+
+.view-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 24px;
+}
+
+.view-header h3 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.progress-timeline {
+  margin-bottom: 24px;
+}
+
+.milestone-content h4 {
+  margin: 0 0 8px 0;
+  color: #2c3e50;
+}
+
+.milestone-content p {
+  margin: 0 0 12px 0;
+  color: #7f8c8d;
+}
+
+.milestone-details {
+  margin-bottom: 12px;
+}
+
+.detail-item {
+  margin-bottom: 4px;
+  display: flex;
+  align-items: center;
+}
+
+.detail-item .label {
+  font-weight: 600;
+  margin-right: 8px;
+  min-width: 80px;
+}
+
+.milestone-actions {
+  text-align: right;
+}
+
+.progress-stats {
+  background: white;
+  border-radius: 8px;
+  padding: 16px;
+}
+
+.stat-card h4 {
+  margin: 0 0 12px 0;
+  color: #2c3e50;
+  text-align: center;
+}
+
+.no-selection {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 400px;
+}
+
+/* 风险预警 */
+.risk-overview {
+  margin-bottom: 24px;
+}
+
+.risk-card {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  text-align: center;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+  transition: transform 0.3s ease;
+}
+
+.risk-card:hover {
+  transform: translateY(-4px);
+}
+
+.risk-card.high {
+  border-left: 4px solid #e74c3c;
+}
+
+.risk-card.medium {
+  border-left: 4px solid #f39c12;
+}
+
+.risk-card.low {
+  border-left: 4px solid #f1c40f;
+}
+
+.risk-card.safe {
+  border-left: 4px solid #27ae60;
+}
+
+.risk-level {
+  font-size: 14px;
+  color: #7f8c8d;
+  margin-bottom: 8px;
+}
+
+.risk-count {
+  font-size: 32px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin-bottom: 4px;
+}
+
+.risk-label {
+  font-size: 14px;
+  color: #7f8c8d;
+}
+
+.risk-warnings {
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+  margin-bottom: 24px;
+}
+
+.risk-analysis {
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+}
+
+.chart-container {
+  text-align: center;
+}
+
+.chart-container h4 {
+  margin: 0 0 20px 0;
+  color: #2c3e50;
+}
+
+.chart-placeholder {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  height: 200px;
+  background: #f8f9fa;
+  border-radius: 8px;
+  color: #7f8c8d;
+}
+
+.chart-icon {
+  font-size: 48px;
+  margin-bottom: 12px;
+  color: #4facfe;
+}
+
+/* 知识产权 */
+.ip-management,
+.collaboration-sandbox {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+  height: 500px;
+  overflow-y: auto;
+}
+
+.ip-item,
+.sandbox-item {
+  background: white;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 16px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.ip-header,
+.sandbox-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 12px;
+}
+
+.ip-info h4,
+.sandbox-header h4 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.ip-info p {
+  margin: 4px 0 0 0;
+  color: #7f8c8d;
+  font-size: 14px;
+}
+
+.ip-details,
+.sandbox-content {
+  margin-bottom: 12px;
+}
+
+.detail-row {
+  display: flex;
+  margin-bottom: 4px;
+}
+
+.detail-row .label {
+  font-weight: 600;
+  margin-right: 8px;
+  min-width: 80px;
+}
+
+.ip-actions,
+.sandbox-actions {
+  text-align: right;
+}
+
+.sandbox-participants,
+.sandbox-resources {
+  margin-bottom: 12px;
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.sandbox-participants .label,
+.sandbox-resources .label {
+  font-weight: 600;
+  min-width: 80px;
+}
+
+.resource-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+
+.collaboration-timeline {
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+  margin-top: 24px;
+}
+
+.collaboration-timeline h3 {
+  margin: 0 0 20px 0;
+  color: #2c3e50;
+}
+
+.activity-content h4 {
+  margin: 0 0 8px 0;
+  color: #2c3e50;
+}
+
+.activity-content p {
+  margin: 0 0 8px 0;
+  color: #7f8c8d;
+}
+
+.activity-meta {
+  font-size: 12px;
+  color: #95a5a6;
+}
+
+.activity-meta .actor {
+  font-weight: 600;
+  color: #4facfe;
+}
+</style>

+ 652 - 0
src/page/edu-industry/matching/index.vue

@@ -0,0 +1,652 @@
+<template>
+  <div class="matching-system-container">
+    <!-- 页面头部 -->
+    <div class="page-header">
+      <div class="header-content">
+        <div class="header-left">
+          <el-breadcrumb separator="/">
+            <el-breadcrumb-item :to="{ path: '/edu-industry' }">产教融合</el-breadcrumb-item>
+            <el-breadcrumb-item>智能校企资源匹配系统</el-breadcrumb-item>
+          </el-breadcrumb>
+          <h1 class="page-title">
+            <el-icon class="title-icon"><Connection /></el-icon>
+            智能校企资源匹配系统
+          </h1>
+        </div>
+        <div class="header-right">
+          <el-button type="primary" @click="handleNewMatching">
+            <el-icon><Plus /></el-icon>
+            新建匹配
+          </el-button>
+        </div>
+      </div>
+    </div>
+
+    <!-- 功能导航标签 -->
+    <div class="function-tabs">
+      <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+        <el-tab-pane label="动态标签库管理" name="tags">
+          <div class="tab-content">
+            <!-- 标签库管理 -->
+            <div class="tags-management">
+              <el-row :gutter="24">
+                <!-- 企业标签管理 -->
+                <el-col :span="12">
+                  <div class="tag-section">
+                    <div class="section-header">
+                      <h3>企业标签管理</h3>
+                      <el-button type="primary" size="small" @click="handleAddEnterpriseTag">
+                        <el-icon><Plus /></el-icon>
+                        添加标签
+                      </el-button>
+                    </div>
+                    <div class="tag-categories">
+                      <div class="category-item">
+                        <h4>技术领域</h4>
+                        <div class="tag-list">
+                          <el-tag
+                            v-for="tag in enterpriseTags.technology"
+                            :key="tag.id"
+                            :type="tag.type"
+                            closable
+                            @close="handleRemoveTag('enterprise', 'technology', tag.id)"
+                          >
+                            {{ tag.name }}
+                          </el-tag>
+                        </div>
+                      </div>
+                      <div class="category-item">
+                        <h4>设备类型</h4>
+                        <div class="tag-list">
+                          <el-tag
+                            v-for="tag in enterpriseTags.equipment"
+                            :key="tag.id"
+                            type="success"
+                            closable
+                            @close="handleRemoveTag('enterprise', 'equipment', tag.id)"
+                          >
+                            {{ tag.name }}
+                          </el-tag>
+                        </div>
+                      </div>
+                      <div class="category-item">
+                        <h4>合作历史</h4>
+                        <div class="tag-list">
+                          <el-tag
+                            v-for="tag in enterpriseTags.cooperation"
+                            :key="tag.id"
+                            type="warning"
+                            closable
+                            @close="handleRemoveTag('enterprise', 'cooperation', tag.id)"
+                          >
+                            {{ tag.name }}
+                          </el-tag>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+
+                <!-- 院系标签管理 -->
+                <el-col :span="12">
+                  <div class="tag-section">
+                    <div class="section-header">
+                      <h3>院系标签管理</h3>
+                      <el-button type="primary" size="small" @click="handleAddDepartmentTag">
+                        <el-icon><Plus /></el-icon>
+                        添加标签
+                      </el-button>
+                    </div>
+                    <div class="tag-categories">
+                      <div class="category-item">
+                        <h4>专业方向</h4>
+                        <div class="tag-list">
+                          <el-tag
+                            v-for="tag in departmentTags.major"
+                            :key="tag.id"
+                            type="info"
+                            closable
+                            @close="handleRemoveTag('department', 'major', tag.id)"
+                          >
+                            {{ tag.name }}
+                          </el-tag>
+                        </div>
+                      </div>
+                      <div class="category-item">
+                        <h4>研究领域</h4>
+                        <div class="tag-list">
+                          <el-tag
+                            v-for="tag in departmentTags.research"
+                            :key="tag.id"
+                            type="success"
+                            closable
+                            @close="handleRemoveTag('department', 'research', tag.id)"
+                          >
+                            {{ tag.name }}
+                          </el-tag>
+                        </div>
+                      </div>
+                      <div class="category-item">
+                        <h4>师资力量</h4>
+                        <div class="tag-list">
+                          <el-tag
+                            v-for="tag in departmentTags.faculty"
+                            :key="tag.id"
+                            type="danger"
+                            closable
+                            @close="handleRemoveTag('department', 'faculty', tag.id)"
+                          >
+                            {{ tag.name }}
+                          </el-tag>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </el-tab-pane>
+
+        <el-tab-pane label="AI算法推荐引擎" name="ai">
+          <div class="tab-content">
+            <!-- AI推荐引擎 -->
+            <div class="ai-recommendation">
+              <el-row :gutter="24">
+                <!-- 推荐配置 -->
+                <el-col :span="8">
+                  <div class="recommendation-config">
+                    <h3>推荐配置</h3>
+                    <el-form :model="aiConfig" label-width="100px">
+                      <el-form-item label="匹配算法">
+                        <el-select v-model="aiConfig.algorithm" placeholder="选择算法">
+                          <el-option label="余弦相似度" value="cosine" />
+                          <el-option label="欧几里得距离" value="euclidean" />
+                          <el-option label="皮尔逊相关" value="pearson" />
+                        </el-select>
+                      </el-form-item>
+                      <el-form-item label="相似度阈值">
+                        <el-slider v-model="aiConfig.threshold" :min="0" :max="1" :step="0.1" />
+                      </el-form-item>
+                      <el-form-item label="推荐数量">
+                        <el-input-number v-model="aiConfig.count" :min="1" :max="20" />
+                      </el-form-item>
+                      <el-form-item>
+                        <el-button type="primary" @click="handleRunRecommendation">
+                          <el-icon><MagicStick /></el-icon>
+                          运行推荐
+                        </el-button>
+                      </el-form-item>
+                    </el-form>
+                  </div>
+                </el-col>
+
+                <!-- 推荐结果 -->
+                <el-col :span="16">
+                  <div class="recommendation-results">
+                    <h3>推荐结果</h3>
+                    <div class="result-list">
+                      <div
+                        v-for="result in recommendationResults"
+                        :key="result.id"
+                        class="result-item"
+                      >
+                        <div class="result-header">
+                          <div class="result-info">
+                            <h4>{{ result.name }}</h4>
+                            <p>{{ result.description }}</p>
+                          </div>
+                          <div class="result-score">
+                            <el-progress
+                              type="circle"
+                              :percentage="Math.round(result.similarity * 100)"
+                              :width="60"
+                            />
+                          </div>
+                        </div>
+                        <div class="result-tags">
+                          <el-tag
+                            v-for="tag in result.matchedTags"
+                            :key="tag"
+                            size="small"
+                            type="success"
+                          >
+                            {{ tag }}
+                          </el-tag>
+                        </div>
+                        <div class="result-actions">
+                          <el-button size="small" @click="handleViewDetail(result)">查看详情</el-button>
+                          <el-button size="small" type="primary" @click="handleInitiateCooperation(result)">
+                            发起合作
+                          </el-button>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </el-tab-pane>
+
+        <el-tab-pane label="热力图看板" name="heatmap">
+          <div class="tab-content">
+            <!-- 热力图看板 -->
+            <div class="heatmap-dashboard">
+              <div class="dashboard-controls">
+                <el-row :gutter="16">
+                  <el-col :span="6">
+                    <el-select v-model="heatmapConfig.dimension" placeholder="选择维度">
+                      <el-option label="技术领域" value="technology" />
+                      <el-option label="地理位置" value="location" />
+                      <el-option label="合作规模" value="scale" />
+                    </el-select>
+                  </el-col>
+                  <el-col :span="6">
+                    <el-date-picker
+                      v-model="heatmapConfig.dateRange"
+                      type="daterange"
+                      placeholder="选择时间范围"
+                    />
+                  </el-col>
+                  <el-col :span="4">
+                    <el-button type="primary" @click="handleUpdateHeatmap">更新热力图</el-button>
+                  </el-col>
+                </el-row>
+              </div>
+
+              <div class="heatmap-container">
+                <div class="heatmap-chart" ref="heatmapChart">
+                  <!-- 这里将集成热力图组件 -->
+                  <div class="chart-placeholder">
+                    <el-icon class="chart-icon"><DataAnalysis /></el-icon>
+                    <p>热力图数据可视化</p>
+                    <p class="chart-desc">实时显示供需匹配度分布</p>
+                  </div>
+                </div>
+              </div>
+
+              <div class="heatmap-stats">
+                <el-row :gutter="16">
+                  <el-col :span="6">
+                    <div class="stat-card">
+                      <div class="stat-number">{{ heatmapStats.hotSpots }}</div>
+                      <div class="stat-label">热点区域</div>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <div class="stat-card">
+                      <div class="stat-number">{{ heatmapStats.avgMatching }}%</div>
+                      <div class="stat-label">平均匹配度</div>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <div class="stat-card">
+                      <div class="stat-number">{{ heatmapStats.activeEntities }}</div>
+                      <div class="stat-label">活跃实体</div>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <div class="stat-card">
+                      <div class="stat-number">{{ heatmapStats.newConnections }}</div>
+                      <div class="stat-label">新增连接</div>
+                    </div>
+                  </el-col>
+                </el-row>
+              </div>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from 'vue'
+import {
+  Connection,
+  Plus,
+  MagicStick,
+  DataAnalysis
+} from '@element-plus/icons-vue'
+
+// 活动标签
+const activeTab = ref('tags')
+
+// 企业标签数据
+const enterpriseTags = ref({
+  technology: [
+    { id: 1, name: '人工智能', type: 'primary' },
+    { id: 2, name: '大数据', type: 'primary' },
+    { id: 3, name: '云计算', type: 'primary' },
+    { id: 4, name: '物联网', type: 'primary' }
+  ],
+  equipment: [
+    { id: 1, name: '服务器集群', type: 'success' },
+    { id: 2, name: '实验设备', type: 'success' },
+    { id: 3, name: '测试平台', type: 'success' }
+  ],
+  cooperation: [
+    { id: 1, name: '长期合作', type: 'warning' },
+    { id: 2, name: '项目合作', type: 'warning' },
+    { id: 3, name: '技术转让', type: 'warning' }
+  ]
+})
+
+// 院系标签数据
+const departmentTags = ref({
+  major: [
+    { id: 1, name: '计算机科学', type: 'info' },
+    { id: 2, name: '软件工程', type: 'info' },
+    { id: 3, name: '数据科学', type: 'info' }
+  ],
+  research: [
+    { id: 1, name: '机器学习', type: 'success' },
+    { id: 2, name: '数据挖掘', type: 'success' },
+    { id: 3, name: '网络安全', type: 'success' }
+  ],
+  faculty: [
+    { id: 1, name: '教授级', type: 'danger' },
+    { id: 2, name: '副教授级', type: 'danger' },
+    { id: 3, name: '博士导师', type: 'danger' }
+  ]
+})
+
+// AI推荐配置
+const aiConfig = ref({
+  algorithm: 'cosine',
+  threshold: 0.7,
+  count: 10
+})
+
+// 推荐结果
+const recommendationResults = ref([
+  {
+    id: 1,
+    name: '华为技术有限公司',
+    description: '全球领先的ICT基础设施和智能终端提供商',
+    similarity: 0.92,
+    matchedTags: ['人工智能', '云计算', '5G技术']
+  },
+  {
+    id: 2,
+    name: '阿里巴巴集团',
+    description: '以电子商务为核心的数字经济体',
+    similarity: 0.87,
+    matchedTags: ['大数据', '云计算', '电子商务']
+  },
+  {
+    id: 3,
+    name: '腾讯科技',
+    description: '中国领先的互联网增值服务提供商',
+    similarity: 0.83,
+    matchedTags: ['人工智能', '社交网络', '游戏技术']
+  }
+])
+
+// 热力图配置
+const heatmapConfig = ref({
+  dimension: 'technology',
+  dateRange: []
+})
+
+// 热力图统计数据
+const heatmapStats = ref({
+  hotSpots: 15,
+  avgMatching: 78,
+  activeEntities: 234,
+  newConnections: 42
+})
+
+// 方法
+const handleTabChange = (tabName: string) => {
+  console.log('切换标签:', tabName)
+}
+
+const handleNewMatching = () => {
+  console.log('新建匹配')
+}
+
+const handleAddEnterpriseTag = () => {
+  console.log('添加企业标签')
+}
+
+const handleAddDepartmentTag = () => {
+  console.log('添加院系标签')
+}
+
+const handleRemoveTag = (type: string, category: string, id: number) => {
+  console.log('删除标签:', type, category, id)
+}
+
+const handleRunRecommendation = () => {
+  console.log('运行AI推荐')
+}
+
+const handleViewDetail = (result: any) => {
+  console.log('查看详情:', result)
+}
+
+const handleInitiateCooperation = (result: any) => {
+  console.log('发起合作:', result)
+}
+
+const handleUpdateHeatmap = () => {
+  console.log('更新热力图')
+}
+
+onMounted(() => {
+  console.log('智能校企资源匹配系统已加载')
+})
+</script>
+
+<style scoped>
+.matching-system-container {
+  padding: 20px;
+  background: #f5f7fa;
+  min-height: 100vh;
+}
+
+/* 页面头部 */
+.page-header {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+}
+
+.header-content {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.page-title {
+  display: flex;
+  align-items: center;
+  font-size: 24px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin: 8px 0 0 0;
+}
+
+.title-icon {
+  margin-right: 8px;
+  color: #667eea;
+}
+
+/* 功能标签 */
+.function-tabs {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+}
+
+.tab-content {
+  padding-top: 20px;
+}
+
+/* 标签管理 */
+.tag-section {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+  height: 100%;
+}
+
+.section-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+}
+
+.section-header h3 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.category-item {
+  margin-bottom: 20px;
+}
+
+.category-item h4 {
+  margin: 0 0 12px 0;
+  color: #5a6c7d;
+  font-size: 14px;
+}
+
+.tag-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+
+/* AI推荐 */
+.recommendation-config {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+}
+
+.recommendation-config h3 {
+  margin: 0 0 20px 0;
+  color: #2c3e50;
+}
+
+.recommendation-results {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+}
+
+.recommendation-results h3 {
+  margin: 0 0 20px 0;
+  color: #2c3e50;
+}
+
+.result-item {
+  background: white;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 16px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.result-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  margin-bottom: 12px;
+}
+
+.result-info h4 {
+  margin: 0 0 4px 0;
+  color: #2c3e50;
+}
+
+.result-info p {
+  margin: 0;
+  color: #7f8c8d;
+  font-size: 14px;
+}
+
+.result-tags {
+  margin-bottom: 12px;
+}
+
+.result-tags .el-tag {
+  margin-right: 8px;
+}
+
+.result-actions {
+  text-align: right;
+}
+
+/* 热力图 */
+.heatmap-dashboard {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+}
+
+.dashboard-controls {
+  margin-bottom: 20px;
+}
+
+.heatmap-container {
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+  margin-bottom: 20px;
+  min-height: 400px;
+}
+
+.chart-placeholder {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  height: 360px;
+  color: #7f8c8d;
+}
+
+.chart-icon {
+  font-size: 64px;
+  margin-bottom: 16px;
+  color: #667eea;
+}
+
+.chart-desc {
+  font-size: 14px;
+  margin: 8px 0 0 0;
+}
+
+.heatmap-stats {
+  display: flex;
+  gap: 16px;
+}
+
+.stat-card {
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+  text-align: center;
+  flex: 1;
+}
+
+.stat-number {
+  font-size: 24px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin-bottom: 8px;
+}
+
+.stat-label {
+  font-size: 14px;
+  color: #7f8c8d;
+}
+</style>

+ 466 - 0
src/page/edu-industry/styles/common.scss

@@ -0,0 +1,466 @@
+// 产教融合模块通用样式
+
+// 颜色变量
+:root {
+  // 主色调
+  --primary-color: #4facfe;
+  --primary-light: #74c0fc;
+  --primary-dark: #339af0;
+  --primary-gradient: linear-gradient(135deg, #4facfe, #00f2fe);
+
+  // 辅助色
+  --success-color: #00b894;
+  --warning-color: #fdcb6e;
+  --danger-color: #e17055;
+  --info-color: #74b9ff;
+
+  // 中性色
+  --text-primary: #2c3e50;
+  --text-secondary: #7f8c8d;
+  --text-placeholder: #95a5a6;
+  --border-color: #e4e7ed;
+  --border-light: #f0f2f5;
+  --bg-color: #f5f7fa;
+  --bg-white: #ffffff;
+
+  // 阴影
+  --shadow-light: 0 2px 12px rgba(0, 0, 0, 0.08);
+  --shadow-medium: 0 4px 16px rgba(0, 0, 0, 0.12);
+  --shadow-heavy: 0 8px 24px rgba(0, 0, 0, 0.16);
+
+  // 圆角
+  --border-radius-small: 6px;
+  --border-radius-medium: 8px;
+  --border-radius-large: 12px;
+  --border-radius-xl: 16px;
+
+  // 间距
+  --spacing-xs: 4px;
+  --spacing-sm: 8px;
+  --spacing-md: 12px;
+  --spacing-lg: 16px;
+  --spacing-xl: 20px;
+  --spacing-xxl: 24px;
+  --spacing-xxxl: 32px;
+}
+
+// 混合器
+@mixin card-style {
+  background: var(--bg-white);
+  border-radius: var(--border-radius-large);
+  box-shadow: var(--shadow-light);
+  border: 1px solid var(--border-color);
+  transition: all 0.3s ease;
+}
+
+@mixin hover-lift {
+  &:hover {
+    transform: translateY(-4px);
+    box-shadow: var(--shadow-medium);
+  }
+}
+
+@mixin gradient-background($color1: #4facfe, $color2: #00f2fe) {
+  background: linear-gradient(135deg, $color1, $color2);
+}
+
+@mixin flex-center {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+@mixin flex-between {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+@mixin text-ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+@mixin multi-line-ellipsis($lines: 2) {
+  display: -webkit-box;
+  -webkit-line-clamp: $lines;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+}
+
+// 基础样式
+.edu-industry-container {
+  padding: var(--spacing-xl);
+  background: var(--bg-color);
+  min-height: 100vh;
+
+  * {
+    box-sizing: border-box;
+  }
+}
+
+// 页面布局
+.page-layout {
+  max-width: 1400px;
+  margin: 0 auto;
+}
+
+.section {
+  @include card-style;
+  padding: var(--spacing-xxl);
+  margin-bottom: var(--spacing-xl);
+
+  &__header {
+    @include flex-between;
+    margin-bottom: var(--spacing-xl);
+    padding-bottom: var(--spacing-lg);
+    border-bottom: 1px solid var(--border-light);
+
+    h3 {
+      margin: 0;
+      color: var(--text-primary);
+      font-size: 20px;
+      font-weight: 600;
+    }
+  }
+
+  &__content {
+    flex: 1;
+  }
+
+  &__actions {
+    display: flex;
+    align-items: center;
+    gap: var(--spacing-sm);
+  }
+}
+
+// 网格布局
+.grid {
+  display: grid;
+  gap: var(--spacing-xl);
+
+  &--2 {
+    grid-template-columns: repeat(2, 1fr);
+  }
+
+  &--3 {
+    grid-template-columns: repeat(3, 1fr);
+  }
+
+  &--4 {
+    grid-template-columns: repeat(4, 1fr);
+  }
+
+  @media (max-width: 1200px) {
+    &--4 {
+      grid-template-columns: repeat(2, 1fr);
+    }
+  }
+
+  @media (max-width: 768px) {
+    &--2,
+    &--3,
+    &--4 {
+      grid-template-columns: 1fr;
+    }
+  }
+}
+
+// 卡片样式
+.card {
+  @include card-style;
+  padding: var(--spacing-xl);
+
+  &--hover {
+    @include hover-lift;
+    cursor: pointer;
+  }
+
+  &--active {
+    border-color: var(--primary-color);
+    background: linear-gradient(135deg, #f8fbff, #ffffff);
+
+    &::before {
+      content: '';
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 4px;
+      height: 100%;
+      background: var(--primary-color);
+    }
+  }
+
+  &__header {
+    @include flex-between;
+    margin-bottom: var(--spacing-lg);
+
+    h4 {
+      margin: 0;
+      color: var(--text-primary);
+      font-size: 18px;
+      font-weight: 600;
+    }
+  }
+
+  &__content {
+    flex: 1;
+  }
+
+  &__footer {
+    margin-top: var(--spacing-lg);
+    padding-top: var(--spacing-lg);
+    border-top: 1px solid var(--border-light);
+  }
+}
+
+// 按钮样式增强
+.btn {
+  &--gradient {
+    @include gradient-background;
+    color: white;
+    border: none;
+
+    &:hover {
+      @include gradient-background(#339af0, #00d4fe);
+    }
+  }
+
+  &--icon {
+    @include flex-center;
+    gap: var(--spacing-sm);
+  }
+}
+
+// 标签样式
+.tag {
+  &--gradient {
+    @include gradient-background;
+    color: white;
+    border: none;
+  }
+}
+
+// 图标样式
+.icon {
+  &--primary {
+    color: var(--primary-color);
+  }
+
+  &--gradient {
+    background: var(--primary-gradient);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    background-clip: text;
+  }
+
+  &--large {
+    font-size: 24px;
+  }
+
+  &--xl {
+    font-size: 32px;
+  }
+}
+
+// 文本样式
+.text {
+  &--primary {
+    color: var(--text-primary);
+  }
+
+  &--secondary {
+    color: var(--text-secondary);
+  }
+
+  &--placeholder {
+    color: var(--text-placeholder);
+  }
+
+  &--ellipsis {
+    @include text-ellipsis;
+  }
+
+  &--multi-ellipsis {
+    @include multi-line-ellipsis(2);
+  }
+
+  &--gradient {
+    background: var(--primary-gradient);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    background-clip: text;
+    font-weight: 600;
+  }
+}
+
+// 动画
+@keyframes fadeInUp {
+  from {
+    opacity: 0;
+    transform: translateY(20px);
+  }
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+@keyframes fadeInLeft {
+  from {
+    opacity: 0;
+    transform: translateX(-20px);
+  }
+  to {
+    opacity: 1;
+    transform: translateX(0);
+  }
+}
+
+@keyframes pulse {
+  0%, 100% {
+    transform: scale(1);
+  }
+  50% {
+    transform: scale(1.05);
+  }
+}
+
+.animate {
+  &--fade-in-up {
+    animation: fadeInUp 0.6s ease-out;
+  }
+
+  &--fade-in-left {
+    animation: fadeInLeft 0.6s ease-out;
+  }
+
+  &--pulse {
+    animation: pulse 2s infinite;
+  }
+}
+
+// 响应式工具类
+.responsive {
+  &--hide-mobile {
+    @media (max-width: 768px) {
+      display: none !important;
+    }
+  }
+
+  &--hide-desktop {
+    @media (min-width: 769px) {
+      display: none !important;
+    }
+  }
+
+  &--mobile-full {
+    @media (max-width: 768px) {
+      width: 100% !important;
+    }
+  }
+}
+
+// 工具类
+.utils {
+  &--full-width {
+    width: 100%;
+  }
+
+  &--text-center {
+    text-align: center;
+  }
+
+  &--text-right {
+    text-align: right;
+  }
+
+  &--margin-bottom {
+    margin-bottom: var(--spacing-xl);
+  }
+
+  &--no-margin {
+    margin: 0;
+  }
+
+  &--no-padding {
+    padding: 0;
+  }
+}
+
+// Element Plus 样式覆盖
+.el-card {
+  border-radius: var(--border-radius-large);
+  box-shadow: var(--shadow-light);
+  border-color: var(--border-color);
+}
+
+.el-button {
+  border-radius: var(--border-radius-medium);
+
+  &.is-plain {
+    &:hover {
+      background: var(--primary-color);
+      border-color: var(--primary-color);
+      color: white;
+    }
+  }
+}
+
+.el-tag {
+  border-radius: var(--border-radius-small);
+}
+
+.el-input {
+  .el-input__wrapper {
+    border-radius: var(--border-radius-medium);
+  }
+}
+
+.el-select {
+  .el-input__wrapper {
+    border-radius: var(--border-radius-medium);
+  }
+}
+
+.el-table {
+  border-radius: var(--border-radius-large);
+  overflow: hidden;
+}
+
+.el-dialog {
+  border-radius: var(--border-radius-large);
+}
+
+// 滚动条样式
+::-webkit-scrollbar {
+  width: 6px;
+  height: 6px;
+}
+
+::-webkit-scrollbar-track {
+  background: #f1f1f1;
+  border-radius: 3px;
+}
+
+::-webkit-scrollbar-thumb {
+  background: #c1c1c1;
+  border-radius: 3px;
+
+  &:hover {
+    background: #a8a8a8;
+  }
+}
+
+// 打印样式
+@media print {
+  .no-print {
+    display: none !important;
+  }
+
+  .page-break {
+    page-break-after: always;
+  }
+}

+ 1207 - 0
src/page/edu-industry/transformation/index.vue

@@ -0,0 +1,1207 @@
+<template>
+  <div class="transformation-container">
+    <!-- 页面头部 -->
+    <div class="page-header">
+      <div class="header-content">
+        <div class="header-left">
+          <el-breadcrumb separator="/">
+            <el-breadcrumb-item :to="{ path: '/edu-industry' }">产教融合</el-breadcrumb-item>
+            <el-breadcrumb-item>产学研成果转化加速器</el-breadcrumb-item>
+          </el-breadcrumb>
+          <h1 class="page-title">
+            <el-icon class="title-icon"><TrendCharts /></el-icon>
+            产学研成果转化加速器
+          </h1>
+        </div>
+        <div class="header-right">
+          <el-button type="primary" @click="handleAddAchievement">
+            <el-icon><Plus /></el-icon>
+            添加成果
+          </el-button>
+        </div>
+      </div>
+    </div>
+
+    <!-- 功能导航标签 -->
+    <div class="function-tabs">
+      <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+        <el-tab-pane label="技术成熟度评估仪表盘" name="assessment">
+          <div class="tab-content">
+            <!-- 技术成熟度评估 -->
+            <div class="assessment-dashboard">
+              <el-row :gutter="24">
+                <!-- 评估项目列表 -->
+                <el-col :span="8">
+                  <div class="assessment-list">
+                    <div class="section-header">
+                      <h3>待评估项目</h3>
+                      <el-button type="primary" size="small" @click="handleNewAssessment">
+                        <el-icon><Plus /></el-icon>
+                        新建评估
+                      </el-button>
+                    </div>
+                    <div class="project-list">
+                      <div
+                        v-for="project in assessmentProjects"
+                        :key="project.id"
+                        class="project-item"
+                        :class="{ active: selectedProject?.id === project.id }"
+                        @click="selectProject(project)"
+                      >
+                        <div class="project-info">
+                          <h4>{{ project.name }}</h4>
+                          <p>{{ project.description }}</p>
+                          <div class="project-meta">
+                            <el-tag :type="getStatusType(project.status)" size="small">
+                              {{ project.status }}
+                            </el-tag>
+                            <span class="project-date">{{ project.createDate }}</span>
+                          </div>
+                        </div>
+                        <div class="project-score">
+                          <el-progress
+                            type="circle"
+                            :percentage="project.maturityScore"
+                            :width="50"
+                            :stroke-width="6"
+                          />
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+
+                <!-- 评估详情 -->
+                <el-col :span="16">
+                  <div class="assessment-detail" v-if="selectedProject">
+                    <div class="detail-header">
+                      <h3>{{ selectedProject.name }} - 技术成熟度评估</h3>
+                      <el-button type="primary" @click="handleStartAssessment">开始评估</el-button>
+                    </div>
+
+                    <!-- 评估维度 -->
+                    <div class="assessment-dimensions">
+                      <el-row :gutter="16">
+                        <el-col :span="12">
+                          <div class="dimension-card">
+                            <h4>技术可行性</h4>
+                            <div class="dimension-content">
+                              <el-rate
+                                v-model="assessmentScores.feasibility"
+                                :max="10"
+                                show-score
+                                text-color="#ff9900"
+                              />
+                              <div class="score-desc">
+                                <p>评估技术实现的可行性和成熟度</p>
+                              </div>
+                            </div>
+                          </div>
+                        </el-col>
+                        <el-col :span="12">
+                          <div class="dimension-card">
+                            <h4>市场潜力</h4>
+                            <div class="dimension-content">
+                              <el-rate
+                                v-model="assessmentScores.market"
+                                :max="10"
+                                show-score
+                                text-color="#ff9900"
+                              />
+                              <div class="score-desc">
+                                <p>评估市场需求和商业化前景</p>
+                              </div>
+                            </div>
+                          </div>
+                        </el-col>
+                        <el-col :span="12">
+                          <div class="dimension-card">
+                            <h4>团队能力</h4>
+                            <div class="dimension-content">
+                              <el-rate
+                                v-model="assessmentScores.team"
+                                :max="10"
+                                show-score
+                                text-color="#ff9900"
+                              />
+                              <div class="score-desc">
+                                <p>评估研发团队的技术实力</p>
+                              </div>
+                            </div>
+                          </div>
+                        </el-col>
+                        <el-col :span="12">
+                          <div class="dimension-card">
+                            <h4>资源配置</h4>
+                            <div class="dimension-content">
+                              <el-rate
+                                v-model="assessmentScores.resources"
+                                :max="10"
+                                show-score
+                                text-color="#ff9900"
+                              />
+                              <div class="score-desc">
+                                <p>评估资金、设备等资源配置</p>
+                              </div>
+                            </div>
+                          </div>
+                        </el-col>
+                      </el-row>
+                    </div>
+
+                    <!-- 综合评估结果 -->
+                    <div class="assessment-result">
+                      <h4>综合评估结果</h4>
+                      <div class="result-content">
+                        <div class="result-chart">
+                          <el-progress
+                            type="circle"
+                            :percentage="overallScore"
+                            :width="120"
+                            :stroke-width="8"
+                          >
+                            <template #default="{ percentage }">
+                              <span class="percentage-value">{{ percentage }}%</span>
+                              <span class="percentage-label">综合得分</span>
+                            </template>
+                          </el-progress>
+                        </div>
+                        <div class="result-analysis">
+                          <div class="analysis-item">
+                            <span class="label">成熟度等级:</span>
+                            <el-tag :type="getMaturityType(overallScore)">
+                              {{ getMaturityLevel(overallScore) }}
+                            </el-tag>
+                          </div>
+                          <div class="analysis-item">
+                            <span class="label">转化建议:</span>
+                            <span>{{ getTransformationAdvice(overallScore) }}</span>
+                          </div>
+                          <div class="analysis-item">
+                            <span class="label">风险评估:</span>
+                            <span>{{ getRiskAssessment(overallScore) }}</span>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+
+                    <!-- 专家评价 -->
+                    <div class="expert-reviews">
+                      <h4>专家评价</h4>
+                      <div class="review-list">
+                        <div
+                          v-for="review in expertReviews"
+                          :key="review.id"
+                          class="review-item"
+                        >
+                          <div class="reviewer-info">
+                            <el-avatar :src="review.avatar" :size="40" />
+                            <div class="reviewer-details">
+                              <h5>{{ review.name }}</h5>
+                              <p>{{ review.title }}</p>
+                            </div>
+                          </div>
+                          <div class="review-content">
+                            <el-rate v-model="review.score" disabled show-score />
+                            <p>{{ review.comment }}</p>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div v-else class="no-selection">
+                    <el-empty description="请选择一个项目进行评估" />
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </el-tab-pane>
+
+        <el-tab-pane label="路演匹配系统" name="roadshow">
+          <div class="tab-content">
+            <!-- 路演匹配系统 -->
+            <div class="roadshow-system">
+              <el-row :gutter="24">
+                <!-- 路演项目 -->
+                <el-col :span="12">
+                  <div class="roadshow-projects">
+                    <div class="section-header">
+                      <h3>路演项目</h3>
+                      <el-button type="primary" size="small" @click="handleCreateRoadshow">
+                        <el-icon><Plus /></el-icon>
+                        创建路演
+                      </el-button>
+                    </div>
+                    <div class="project-cards">
+                      <div
+                        v-for="project in roadshowProjects"
+                        :key="project.id"
+                        class="roadshow-card"
+                      >
+                        <div class="card-header">
+                          <h4>{{ project.name }}</h4>
+                          <el-tag :type="getRoadshowStatusType(project.status)">
+                            {{ project.status }}
+                          </el-tag>
+                        </div>
+                        <div class="card-content">
+                          <p>{{ project.description }}</p>
+                          <div class="project-tags">
+                            <el-tag
+                              v-for="tag in project.tags"
+                              :key="tag"
+                              size="small"
+                              type="info"
+                            >
+                              {{ tag }}
+                            </el-tag>
+                          </div>
+                          <div class="project-stats">
+                            <div class="stat-item">
+                              <span class="label">融资需求:</span>
+                              <span class="value">{{ project.funding }}万元</span>
+                            </div>
+                            <div class="stat-item">
+                              <span class="label">路演时间:</span>
+                              <span class="value">{{ project.roadshowDate }}</span>
+                            </div>
+                          </div>
+                        </div>
+                        <div class="card-actions">
+                          <el-button size="small" @click="handleViewRoadshow(project)">
+                            查看详情
+                          </el-button>
+                          <el-button size="small" type="primary" @click="handleMatchInvestors(project)">
+                            匹配投资方
+                          </el-button>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+
+                <!-- 投资机构匹配 -->
+                <el-col :span="12">
+                  <div class="investor-matching">
+                    <div class="section-header">
+                      <h3>投资机构匹配</h3>
+                      <el-button type="primary" size="small" @click="handleRefreshMatching">
+                        <el-icon><Refresh /></el-icon>
+                        刷新匹配
+                      </el-button>
+                    </div>
+                    <div class="matching-results">
+                      <div
+                        v-for="investor in matchedInvestors"
+                        :key="investor.id"
+                        class="investor-card"
+                      >
+                        <div class="investor-header">
+                          <div class="investor-info">
+                            <h4>{{ investor.name }}</h4>
+                            <p>{{ investor.type }}</p>
+                          </div>
+                          <div class="match-score">
+                            <el-progress
+                              type="circle"
+                              :percentage="Math.round(investor.matchScore * 100)"
+                              :width="60"
+                            />
+                          </div>
+                        </div>
+                        <div class="investor-details">
+                          <div class="detail-item">
+                            <span class="label">投资领域:</span>
+                            <span>{{ investor.fields.join(', ') }}</span>
+                          </div>
+                          <div class="detail-item">
+                            <span class="label">投资规模:</span>
+                            <span>{{ investor.investmentRange }}</span>
+                          </div>
+                          <div class="detail-item">
+                            <span class="label">投资阶段:</span>
+                            <span>{{ investor.stage }}</span>
+                          </div>
+                        </div>
+                        <div class="investor-actions">
+                          <el-button size="small" @click="handleViewInvestor(investor)">
+                            查看详情
+                          </el-button>
+                          <el-button size="small" type="primary" @click="handleContactInvestor(investor)">
+                            发起联系
+                          </el-button>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+
+              <!-- 路演日程 -->
+              <div class="roadshow-schedule">
+                <h3>路演日程</h3>
+                <el-calendar v-model="calendarValue">
+                  <template #date-cell="{ data }">
+                    <div class="calendar-cell">
+                      <p>{{ data.day.split('-').slice(2).join('-') }}</p>
+                      <div v-if="getRoadshowEvents(data.day).length > 0" class="events">
+                        <div
+                          v-for="event in getRoadshowEvents(data.day)"
+                          :key="event.id"
+                          class="event-item"
+                        >
+                          {{ event.title }}
+                        </div>
+                      </div>
+                    </div>
+                  </template>
+                </el-calendar>
+              </div>
+            </div>
+          </div>
+        </el-tab-pane>
+
+        <el-tab-pane label="成果展示平台" name="showcase">
+          <div class="tab-content">
+            <!-- 成果展示平台 -->
+            <div class="showcase-platform">
+              <div class="showcase-header">
+                <h3>成果展示平台</h3>
+                <div class="header-actions">
+                  <el-input
+                    v-model="searchKeyword"
+                    placeholder="搜索成果"
+                    style="width: 200px; margin-right: 12px;"
+                  >
+                    <template #prefix>
+                      <el-icon><Search /></el-icon>
+                    </template>
+                  </el-input>
+                  <el-button type="primary" @click="handleUploadAchievement">
+                    <el-icon><Upload /></el-icon>
+                    上传成果
+                  </el-button>
+                </div>
+              </div>
+
+              <!-- 成果展示网格 -->
+              <div class="achievement-grid">
+                <el-row :gutter="20">
+                  <el-col
+                    v-for="achievement in achievements"
+                    :key="achievement.id"
+                    :span="8"
+                  >
+                    <div class="achievement-card">
+                      <div class="card-media">
+                        <img :src="achievement.thumbnail" :alt="achievement.title" />
+                        <div class="media-overlay">
+                          <el-button type="primary" circle @click="handlePreview(achievement)">
+                            <el-icon><View /></el-icon>
+                          </el-button>
+                        </div>
+                      </div>
+                      <div class="card-content">
+                        <h4>{{ achievement.title }}</h4>
+                        <p>{{ achievement.description }}</p>
+                        <div class="achievement-meta">
+                          <div class="meta-item">
+                            <el-icon><User /></el-icon>
+                            <span>{{ achievement.author }}</span>
+                          </div>
+                          <div class="meta-item">
+                            <el-icon><Calendar /></el-icon>
+                            <span>{{ achievement.publishDate }}</span>
+                          </div>
+                        </div>
+                        <div class="achievement-tags">
+                          <el-tag
+                            v-for="tag in achievement.tags"
+                            :key="tag"
+                            size="small"
+                            type="success"
+                          >
+                            {{ tag }}
+                          </el-tag>
+                        </div>
+                      </div>
+                      <div class="card-actions">
+                        <el-button size="small" @click="handleViewAchievement(achievement)">
+                          查看详情
+                        </el-button>
+                        <el-button size="small" type="primary" @click="handleDownload(achievement)">
+                          下载资料
+                        </el-button>
+                      </div>
+                    </div>
+                  </el-col>
+                </el-row>
+              </div>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, computed, onMounted } from 'vue'
+import {
+  TrendCharts,
+  Plus,
+  Refresh,
+  Search,
+  Upload,
+  View,
+  User,
+  Calendar
+} from '@element-plus/icons-vue'
+
+// 活动标签
+const activeTab = ref('assessment')
+
+// 选中的项目
+const selectedProject = ref(null)
+
+// 评估项目数据
+const assessmentProjects = ref([
+  {
+    id: 1,
+    name: '智能语音识别系统',
+    description: '基于深度学习的多语言语音识别技术',
+    status: '评估中',
+    maturityScore: 75,
+    createDate: '2024-01-15'
+  },
+  {
+    id: 2,
+    name: '区块链供应链管理',
+    description: '去中心化的供应链追溯与管理平台',
+    status: '待评估',
+    maturityScore: 60,
+    createDate: '2024-01-20'
+  },
+  {
+    id: 3,
+    name: '新能源电池技术',
+    description: '高能量密度锂电池技术研发',
+    status: '已完成',
+    maturityScore: 85,
+    createDate: '2024-01-10'
+  }
+])
+
+// 评估分数
+const assessmentScores = ref({
+  feasibility: 7,
+  market: 8,
+  team: 6,
+  resources: 7
+})
+
+// 综合得分
+const overallScore = computed(() => {
+  const scores = assessmentScores.value
+  return Math.round((scores.feasibility + scores.market + scores.team + scores.resources) * 2.5)
+})
+
+// 专家评价
+const expertReviews = ref([
+  {
+    id: 1,
+    name: '张教授',
+    title: '人工智能专家',
+    avatar: '/avatars/expert1.jpg',
+    score: 4,
+    comment: '技术方案具有创新性,但需要进一步验证市场需求。'
+  },
+  {
+    id: 2,
+    name: '李博士',
+    title: '产业化专家',
+    avatar: '/avatars/expert2.jpg',
+    score: 5,
+    comment: '商业化前景良好,建议加强团队建设。'
+  }
+])
+
+// 路演项目
+const roadshowProjects = ref([
+  {
+    id: 1,
+    name: '智能医疗诊断系统',
+    description: '基于AI的医学影像诊断辅助系统',
+    status: '路演中',
+    tags: ['人工智能', '医疗健康', '图像识别'],
+    funding: 500,
+    roadshowDate: '2024-02-15'
+  },
+  {
+    id: 2,
+    name: '绿色能源管理平台',
+    description: '智能化的新能源发电管理系统',
+    status: '准备中',
+    tags: ['新能源', '物联网', '大数据'],
+    funding: 800,
+    roadshowDate: '2024-02-20'
+  }
+])
+
+// 匹配的投资机构
+const matchedInvestors = ref([
+  {
+    id: 1,
+    name: '红杉资本',
+    type: '风险投资',
+    matchScore: 0.92,
+    fields: ['人工智能', '医疗健康'],
+    investmentRange: '1000万-5000万',
+    stage: 'A轮-B轮'
+  },
+  {
+    id: 2,
+    name: '经纬中国',
+    type: '创业投资',
+    matchScore: 0.87,
+    fields: ['企业服务', '新能源'],
+    investmentRange: '500万-2000万',
+    stage: '天使轮-A轮'
+  }
+])
+
+// 日历值
+const calendarValue = ref(new Date())
+
+// 搜索关键词
+const searchKeyword = ref('')
+
+// 成果展示数据
+const achievements = ref([
+  {
+    id: 1,
+    title: '智能制造控制系统',
+    description: '工业4.0智能制造生产线控制系统',
+    author: '王教授团队',
+    publishDate: '2024-01-15',
+    thumbnail: '/images/achievement1.jpg',
+    tags: ['智能制造', '工业4.0', '自动化']
+  },
+  {
+    id: 2,
+    title: '环保材料研发成果',
+    description: '可降解生物材料的研发与应用',
+    author: '李博士团队',
+    publishDate: '2024-01-20',
+    thumbnail: '/images/achievement2.jpg',
+    tags: ['环保材料', '生物技术', '可持续发展']
+  },
+  {
+    id: 3,
+    title: '金融科技创新平台',
+    description: '基于区块链的数字金融服务平台',
+    author: '张副教授团队',
+    publishDate: '2024-01-25',
+    thumbnail: '/images/achievement3.jpg',
+    tags: ['金融科技', '区块链', '数字货币']
+  }
+])
+
+// 方法
+const handleTabChange = (tabName: string) => {
+  console.log('切换标签:', tabName)
+}
+
+const handleAddAchievement = () => {
+  console.log('添加成果')
+}
+
+const selectProject = (project: any) => {
+  selectedProject.value = project
+}
+
+const getStatusType = (status: string) => {
+  const typeMap = {
+    '评估中': 'warning',
+    '待评估': 'info',
+    '已完成': 'success'
+  }
+  return typeMap[status] || 'info'
+}
+
+const getMaturityType = (score: number) => {
+  if (score >= 80) return 'success'
+  if (score >= 60) return 'warning'
+  return 'danger'
+}
+
+const getMaturityLevel = (score: number) => {
+  if (score >= 80) return '高成熟度'
+  if (score >= 60) return '中等成熟度'
+  return '低成熟度'
+}
+
+const getTransformationAdvice = (score: number) => {
+  if (score >= 80) return '建议立即启动产业化进程'
+  if (score >= 60) return '需要进一步完善技术方案'
+  return '建议继续研发,暂不适合转化'
+}
+
+const getRiskAssessment = (score: number) => {
+  if (score >= 80) return '低风险'
+  if (score >= 60) return '中等风险'
+  return '高风险'
+}
+
+const getRoadshowStatusType = (status: string) => {
+  const typeMap = {
+    '路演中': 'success',
+    '准备中': 'warning',
+    '已结束': 'info'
+  }
+  return typeMap[status] || 'info'
+}
+
+const getRoadshowEvents = (date: string) => {
+  // 模拟路演事件数据
+  const events = {
+    '2024-02-15': [{ id: 1, title: '智能医疗诊断系统路演' }],
+    '2024-02-20': [{ id: 2, title: '绿色能源管理平台路演' }]
+  }
+  return events[date] || []
+}
+
+const handleNewAssessment = () => {
+  console.log('新建评估')
+}
+
+const handleStartAssessment = () => {
+  console.log('开始评估')
+}
+
+const handleCreateRoadshow = () => {
+  console.log('创建路演')
+}
+
+const handleViewRoadshow = (project: any) => {
+  console.log('查看路演:', project)
+}
+
+const handleMatchInvestors = (project: any) => {
+  console.log('匹配投资方:', project)
+}
+
+const handleRefreshMatching = () => {
+  console.log('刷新匹配')
+}
+
+const handleViewInvestor = (investor: any) => {
+  console.log('查看投资方:', investor)
+}
+
+const handleContactInvestor = (investor: any) => {
+  console.log('联系投资方:', investor)
+}
+
+const handleUploadAchievement = () => {
+  console.log('上传成果')
+}
+
+const handlePreview = (achievement: any) => {
+  console.log('预览成果:', achievement)
+}
+
+const handleViewAchievement = (achievement: any) => {
+  console.log('查看成果详情:', achievement)
+}
+
+const handleDownload = (achievement: any) => {
+  console.log('下载成果资料:', achievement)
+}
+
+onMounted(() => {
+  // 默认选择第一个项目
+  if (assessmentProjects.value.length > 0) {
+    selectedProject.value = assessmentProjects.value[0]
+  }
+  console.log('产学研成果转化加速器已加载')
+})
+</script>
+
+<style scoped>
+.transformation-container {
+  padding: 20px;
+  background: #f5f7fa;
+  min-height: 100vh;
+}
+
+/* 页面头部 */
+.page-header {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+}
+
+.header-content {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.page-title {
+  display: flex;
+  align-items: center;
+  font-size: 24px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin: 8px 0 0 0;
+}
+
+.title-icon {
+  margin-right: 8px;
+  color: #f093fb;
+}
+
+/* 功能标签 */
+.function-tabs {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+}
+
+.tab-content {
+  padding-top: 20px;
+}
+
+/* 评估仪表盘 */
+.assessment-list {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+  height: 600px;
+  overflow-y: auto;
+}
+
+.section-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+}
+
+.section-header h3 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.project-item {
+  background: white;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 12px;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.project-item:hover,
+.project-item.active {
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+  border-left: 4px solid #f093fb;
+}
+
+.project-info h4 {
+  margin: 0 0 8px 0;
+  color: #2c3e50;
+}
+
+.project-info p {
+  margin: 0 0 12px 0;
+  color: #7f8c8d;
+  font-size: 14px;
+}
+
+.project-meta {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+}
+
+.project-date {
+  font-size: 12px;
+  color: #95a5a6;
+}
+
+.assessment-detail {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+  height: 600px;
+  overflow-y: auto;
+}
+
+.detail-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 24px;
+}
+
+.detail-header h3 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.assessment-dimensions {
+  margin-bottom: 24px;
+}
+
+.dimension-card {
+  background: white;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 16px;
+}
+
+.dimension-card h4 {
+  margin: 0 0 12px 0;
+  color: #2c3e50;
+}
+
+.dimension-content {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.score-desc p {
+  margin: 0;
+  font-size: 12px;
+  color: #7f8c8d;
+}
+
+.assessment-result {
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+  margin-bottom: 24px;
+}
+
+.assessment-result h4 {
+  margin: 0 0 16px 0;
+  color: #2c3e50;
+}
+
+.result-content {
+  display: flex;
+  gap: 24px;
+  align-items: center;
+}
+
+.percentage-value {
+  display: block;
+  font-size: 20px;
+  font-weight: 600;
+}
+
+.percentage-label {
+  display: block;
+  font-size: 12px;
+  color: #7f8c8d;
+}
+
+.result-analysis {
+  flex: 1;
+}
+
+.analysis-item {
+  margin-bottom: 12px;
+  display: flex;
+  align-items: center;
+}
+
+.analysis-item .label {
+  font-weight: 600;
+  margin-right: 8px;
+  min-width: 80px;
+}
+
+.expert-reviews {
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+}
+
+.expert-reviews h4 {
+  margin: 0 0 16px 0;
+  color: #2c3e50;
+}
+
+.review-item {
+  display: flex;
+  gap: 16px;
+  margin-bottom: 16px;
+  padding-bottom: 16px;
+  border-bottom: 1px solid #eee;
+}
+
+.reviewer-info {
+  display: flex;
+  gap: 12px;
+  align-items: center;
+  min-width: 200px;
+}
+
+.reviewer-details h5 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.reviewer-details p {
+  margin: 4px 0 0 0;
+  font-size: 12px;
+  color: #7f8c8d;
+}
+
+.review-content {
+  flex: 1;
+}
+
+.review-content p {
+  margin: 8px 0 0 0;
+  color: #5a6c7d;
+}
+
+.no-selection {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 400px;
+}
+
+/* 路演系统 */
+.roadshow-projects,
+.investor-matching {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+  height: 500px;
+  overflow-y: auto;
+}
+
+.roadshow-card,
+.investor-card {
+  background: white;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 16px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.card-header,
+.investor-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 12px;
+}
+
+.card-header h4,
+.investor-info h4 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.card-content p,
+.investor-info p {
+  margin: 4px 0 12px 0;
+  color: #7f8c8d;
+  font-size: 14px;
+}
+
+.project-tags {
+  margin-bottom: 12px;
+}
+
+.project-tags .el-tag {
+  margin-right: 8px;
+}
+
+.project-stats,
+.investor-details {
+  margin-bottom: 12px;
+}
+
+.stat-item,
+.detail-item {
+  display: flex;
+  margin-bottom: 4px;
+}
+
+.stat-item .label,
+.detail-item .label {
+  font-weight: 600;
+  margin-right: 8px;
+  min-width: 80px;
+}
+
+.card-actions,
+.investor-actions {
+  text-align: right;
+}
+
+.roadshow-schedule {
+  margin-top: 24px;
+  background: white;
+  border-radius: 8px;
+  padding: 20px;
+}
+
+.roadshow-schedule h3 {
+  margin: 0 0 20px 0;
+  color: #2c3e50;
+}
+
+.calendar-cell {
+  height: 100%;
+  padding: 4px;
+}
+
+.calendar-cell p {
+  margin: 0;
+  text-align: center;
+}
+
+.events {
+  margin-top: 4px;
+}
+
+.event-item {
+  background: #f093fb;
+  color: white;
+  font-size: 10px;
+  padding: 2px 4px;
+  border-radius: 2px;
+  margin-bottom: 2px;
+}
+
+/* 成果展示 */
+.showcase-platform {
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 20px;
+}
+
+.showcase-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 24px;
+}
+
+.showcase-header h3 {
+  margin: 0;
+  color: #2c3e50;
+}
+
+.header-actions {
+  display: flex;
+  align-items: center;
+}
+
+.achievement-grid {
+  margin-top: 20px;
+}
+
+.achievement-card {
+  background: white;
+  border-radius: 12px;
+  overflow: hidden;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+  transition: transform 0.3s ease;
+  margin-bottom: 20px;
+}
+
+.achievement-card:hover {
+  transform: translateY(-4px);
+}
+
+.card-media {
+  position: relative;
+  height: 200px;
+  overflow: hidden;
+}
+
+.card-media img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+
+.media-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.5);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  opacity: 0;
+  transition: opacity 0.3s ease;
+}
+
+.achievement-card:hover .media-overlay {
+  opacity: 1;
+}
+
+.card-content {
+  padding: 16px;
+}
+
+.card-content h4 {
+  margin: 0 0 8px 0;
+  color: #2c3e50;
+}
+
+.card-content p {
+  margin: 0 0 12px 0;
+  color: #7f8c8d;
+  font-size: 14px;
+  line-height: 1.5;
+}
+
+.achievement-meta {
+  display: flex;
+  gap: 16px;
+  margin-bottom: 12px;
+}
+
+.meta-item {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  font-size: 12px;
+  color: #95a5a6;
+}
+
+.achievement-tags {
+  margin-bottom: 12px;
+}
+
+.achievement-tags .el-tag {
+  margin-right: 8px;
+}
+
+.card-actions {
+  padding: 0 16px 16px;
+  text-align: right;
+}
+</style>

+ 645 - 0
src/page/home/index.vue

@@ -0,0 +1,645 @@
+<template>
+  <div class="home-container">
+    <!-- 页面头部 -->
+    <div class="home-header">
+      <div class="header-content">
+        <h1 class="main-title">
+          <el-icon class="title-icon">
+            <House />
+          </el-icon>
+          创新资源竞争力管理系统
+        </h1>
+        <p class="subtitle">Innovation Resource Competitiveness Management System</p>
+        <div class="welcome-text">
+          <p>欢迎使用创新资源竞争力管理系统,请选择您要进入的功能模块</p>
+        </div>
+      </div>
+      <div class="header-decoration">
+        <div class="decoration-circle circle-1"></div>
+        <div class="decoration-circle circle-2"></div>
+        <div class="decoration-circle circle-3"></div>
+      </div>
+    </div>
+
+    <!-- 系统概览 -->
+    <div class="system-overview">
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <div class="overview-card">
+            <el-icon class="overview-icon">
+              <DataBoard />
+            </el-icon>
+            <div class="overview-content">
+              <div class="overview-number">{{ systemStats.totalProjects }}</div>
+              <div class="overview-label">总项目数</div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <div class="overview-card">
+            <el-icon class="overview-icon">
+              <User />
+            </el-icon>
+            <div class="overview-content">
+              <div class="overview-number">{{ systemStats.activeUsers }}</div>
+              <div class="overview-label">活跃用户</div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <div class="overview-card">
+            <el-icon class="overview-icon">
+              <Trophy />
+            </el-icon>
+            <div class="overview-content">
+              <div class="overview-number">{{ systemStats.achievements }}</div>
+              <div class="overview-label">成果转化</div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <div class="overview-card">
+            <el-icon class="overview-icon">
+              <TrendCharts />
+            </el-icon>
+            <div class="overview-content">
+              <div class="overview-number">{{ systemStats.efficiency }}%</div>
+              <div class="overview-label">系统效率</div>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 功能模块导航 -->
+    <div class="modules-section">
+      <h2 class="section-title">功能模块</h2>
+      <el-row :gutter="24">
+        <el-col :span="12" v-for="module in modules" :key="module.id">
+          <div
+            class="module-card"
+            @click="navigateToModule(module.path)"
+            :style="{ '--module-color': module.color }"
+          >
+            <div class="module-icon">
+              <el-icon>
+                <component :is="module.icon" />
+              </el-icon>
+            </div>
+            <div class="module-content">
+              <h3 class="module-title">{{ module.title }}</h3>
+              <p class="module-description">{{ module.description }}</p>
+              <div class="module-features">
+                <el-tag
+                  v-for="feature in module.features"
+                  :key="feature"
+                  size="small"
+                  type="info"
+                  effect="plain"
+                >
+                  {{ feature }}
+                </el-tag>
+              </div>
+              <div class="module-stats">
+                <div class="stat-item">
+                  <span class="stat-value">{{ module.stats.projects }}</span>
+                  <span class="stat-label">项目</span>
+                </div>
+                <div class="stat-item">
+                  <span class="stat-value">{{ module.stats.users }}</span>
+                  <span class="stat-label">用户</span>
+                </div>
+              </div>
+            </div>
+            <div class="module-arrow">
+              <el-icon>
+                <ArrowRight />
+              </el-icon>
+            </div>
+            <div class="module-status" :class="module.status">
+              <el-icon>
+                <component :is="getStatusIcon(module.status)" />
+              </el-icon>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 快捷操作 -->
+    <div class="quick-actions">
+      <h2 class="section-title">快捷操作</h2>
+      <el-row :gutter="16">
+        <el-col :span="4" v-for="action in quickActions" :key="action.id">
+          <div class="quick-action-card" @click="handleQuickAction(action.id)">
+            <el-icon class="action-icon">
+              <component :is="action.icon" />
+            </el-icon>
+            <span class="action-label">{{ action.label }}</span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive } from 'vue'
+import { useRouter } from 'vue-router'
+import {
+  House,
+  DataBoard,
+  User,
+  Trophy,
+  TrendCharts,
+  ArrowRight,
+  OfficeBuilding,
+  Management,
+  Promotion,
+  School,
+  Monitor,
+  Plus,
+  Search,
+  Setting,
+  Bell,
+  Document,
+  Star
+} from '@element-plus/icons-vue'
+
+const router = useRouter()
+
+// 系统统计数据
+const systemStats = reactive({
+  totalProjects: 328,
+  activeUsers: 156,
+  achievements: 89,
+  efficiency: 94
+})
+
+// 功能模块配置
+const modules = reactive([
+  {
+    id: 'edu-industry',
+    title: '产教融合管理',
+    description: '智能化校企合作,推动产学研深度融合,构建协同创新生态体系',
+    icon: School,
+    color: '#4facfe',
+    path: '/edu-industry',
+    features: ['智能匹配', '成果转化', '项目管理'],
+    stats: { projects: 89, users: 45 },
+    status: 'active'
+  },
+  {
+    id: 'competition',
+    title: '竞赛管理系统',
+    description: '全方位竞赛组织管理,从报名到评审的完整流程数字化',
+    icon: Trophy,
+    color: '#f093fb',
+    path: '/competition',
+    features: ['赛事组织', '评审管理', '成绩统计'],
+    stats: { projects: 67, users: 89 },
+    status: 'active'
+  },
+  {
+    id: 'lab-mgmt',
+    title: '实验室管理',
+    description: '实验室资源统一管理,设备预约、使用监控、维护记录一体化',
+    icon: Monitor,
+    color: '#48cae4',
+    path: '/lab-mgmt',
+    features: ['设备管理', '预约系统', '使用统计'],
+    stats: { projects: 34, users: 67 },
+    status: 'maintenance'
+  },
+  {
+    id: 'research',
+    title: '科研项目管理',
+    description: '科研项目全生命周期管理,从立项申请到结题验收的完整追踪',
+    icon: Management,
+    color: '#06ffa5',
+    path: '/research',
+    features: ['项目申报', '进度跟踪', '成果管理'],
+    stats: { projects: 78, users: 56 },
+    status: 'active'
+  },
+  {
+    id: 'studio-mgmt',
+    title: '工作室建设与管理',
+    description: '创新工作室全方位管理,空间规划、设备配置、团队协作一站式服务',
+    icon: OfficeBuilding,
+    color: '#ff6b6b',
+    path: '/studio-mgmt',
+    features: ['空间管理', '设备配置', '团队协作'],
+    stats: { projects: 42, users: 38 },
+    status: 'active'
+  }
+])
+
+// 快捷操作
+const quickActions = reactive([
+  { id: 'new-project', label: '新建项目', icon: Plus },
+  { id: 'search', label: '全局搜索', icon: Search },
+  { id: 'notifications', label: '消息通知', icon: Bell },
+  { id: 'reports', label: '数据报表', icon: Document },
+  { id: 'settings', label: '系统设置', icon: Setting },
+  { id: 'favorites', label: '我的收藏', icon: Star }
+])
+
+// 导航到模块
+const navigateToModule = (path: string) => {
+  router.push(path)
+}
+
+// 获取状态图标
+const getStatusIcon = (status: string) => {
+  switch (status) {
+    case 'active':
+      return Star
+    case 'maintenance':
+      return Setting
+    default:
+      return Star
+  }
+}
+
+// 快捷操作处理
+const handleQuickAction = (actionId: string) => {
+  console.log('快捷操作:', actionId)
+  // 这里可以添加具体的快捷操作逻辑
+}
+</script>
+
+<style scoped lang="scss">
+.home-container {
+  min-height: 100vh;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  padding: 0;
+  position: relative;
+  overflow-x: hidden;
+}
+
+.home-header {
+  position: relative;
+  padding: 60px 40px 40px;
+  text-align: center;
+  color: white;
+  overflow: hidden;
+
+  .header-content {
+    position: relative;
+    z-index: 2;
+  }
+
+  .main-title {
+    font-size: 48px;
+    font-weight: 700;
+    margin: 0 0 16px 0;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 16px;
+
+    .title-icon {
+      font-size: 52px;
+      color: #ffd700;
+    }
+  }
+
+  .subtitle {
+    font-size: 18px;
+    opacity: 0.9;
+    margin: 0 0 24px 0;
+    font-weight: 300;
+    letter-spacing: 1px;
+  }
+
+  .welcome-text {
+    font-size: 16px;
+    opacity: 0.8;
+    max-width: 600px;
+    margin: 0 auto;
+  }
+
+  .header-decoration {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    pointer-events: none;
+
+    .decoration-circle {
+      position: absolute;
+      border-radius: 50%;
+      background: rgba(255, 255, 255, 0.1);
+      animation: float 6s ease-in-out infinite;
+
+      &.circle-1 {
+        width: 200px;
+        height: 200px;
+        top: -100px;
+        right: -100px;
+        animation-delay: 0s;
+      }
+
+      &.circle-2 {
+        width: 150px;
+        height: 150px;
+        bottom: -75px;
+        left: -75px;
+        animation-delay: 2s;
+      }
+
+      &.circle-3 {
+        width: 100px;
+        height: 100px;
+        top: 50%;
+        right: 10%;
+        animation-delay: 4s;
+      }
+    }
+  }
+}
+
+@keyframes float {
+  0%, 100% { transform: translateY(0px) rotate(0deg); }
+  50% { transform: translateY(-20px) rotate(180deg); }
+}
+
+.system-overview {
+  padding: 0 40px 40px;
+  margin-top: -20px;
+  position: relative;
+  z-index: 3;
+
+  .overview-card {
+    background: rgba(255, 255, 255, 0.95);
+    backdrop-filter: blur(10px);
+    border-radius: 16px;
+    padding: 24px;
+    display: flex;
+    align-items: center;
+    gap: 16px;
+    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+    border: 1px solid rgba(255, 255, 255, 0.2);
+    transition: all 0.3s ease;
+
+    &:hover {
+      transform: translateY(-4px);
+      box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
+    }
+
+    .overview-icon {
+      font-size: 32px;
+      color: #4facfe;
+      background: linear-gradient(135deg, #4facfe, #00f2fe);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+
+    .overview-content {
+      .overview-number {
+        font-size: 28px;
+        font-weight: 700;
+        color: #2c3e50;
+        line-height: 1;
+      }
+
+      .overview-label {
+        font-size: 14px;
+        color: #7f8c8d;
+        margin-top: 4px;
+      }
+    }
+  }
+}
+
+.modules-section {
+  background: white;
+  padding: 40px;
+  margin: 0 40px;
+  border-radius: 24px 24px 0 0;
+  box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.1);
+}
+
+.section-title {
+  font-size: 24px;
+  font-weight: 600;
+  color: #2c3e50;
+  margin-bottom: 32px;
+  position: relative;
+  padding-left: 20px;
+
+  &::before {
+    content: '';
+    position: absolute;
+    left: 0;
+    top: 50%;
+    transform: translateY(-50%);
+    width: 4px;
+    height: 24px;
+    background: linear-gradient(135deg, #4facfe, #00f2fe);
+    border-radius: 2px;
+  }
+}
+
+.module-card {
+  background: white;
+  border-radius: 20px;
+  padding: 32px;
+  margin-bottom: 24px;
+  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);
+  border: 2px solid transparent;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  position: relative;
+  overflow: hidden;
+
+  &::before {
+    content: '';
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 4px;
+    background: var(--module-color);
+    transform: scaleX(0);
+    transition: transform 0.3s ease;
+  }
+
+  &:hover {
+    transform: translateY(-8px);
+    box-shadow: 0 16px 48px rgba(0, 0, 0, 0.12);
+    border-color: var(--module-color);
+
+    &::before {
+      transform: scaleX(1);
+    }
+
+    .module-arrow {
+      transform: translateX(8px);
+    }
+  }
+
+  .module-icon {
+    width: 64px;
+    height: 64px;
+    border-radius: 16px;
+    background: linear-gradient(135deg, var(--module-color), rgba(255, 255, 255, 0.2));
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-bottom: 20px;
+
+    .el-icon {
+      font-size: 32px;
+      color: white;
+    }
+  }
+
+  .module-content {
+    .module-title {
+      font-size: 20px;
+      font-weight: 600;
+      color: #2c3e50;
+      margin: 0 0 8px 0;
+    }
+
+    .module-description {
+      color: #7f8c8d;
+      font-size: 14px;
+      line-height: 1.6;
+      margin: 0 0 16px 0;
+    }
+
+    .module-features {
+      margin-bottom: 20px;
+      display: flex;
+      flex-wrap: wrap;
+      gap: 8px;
+    }
+
+    .module-stats {
+      display: flex;
+      gap: 24px;
+
+      .stat-item {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+
+        .stat-value {
+          font-size: 18px;
+          font-weight: 600;
+          color: var(--module-color);
+        }
+
+        .stat-label {
+          font-size: 12px;
+          color: #95a5a6;
+          margin-top: 2px;
+        }
+      }
+    }
+  }
+
+  .module-arrow {
+    position: absolute;
+    top: 32px;
+    right: 32px;
+    font-size: 20px;
+    color: #bdc3c7;
+    transition: all 0.3s ease;
+  }
+
+  .module-status {
+    position: absolute;
+    top: 16px;
+    right: 16px;
+    width: 24px;
+    height: 24px;
+    border-radius: 50%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 12px;
+
+    &.active {
+      background: #27ae60;
+      color: white;
+    }
+
+    &.maintenance {
+      background: #f39c12;
+      color: white;
+    }
+  }
+}
+
+.quick-actions {
+  background: white;
+  padding: 40px;
+  margin: 0 40px 40px;
+
+  .quick-action-card {
+    background: #f8f9fa;
+    border-radius: 12px;
+    padding: 20px;
+    text-align: center;
+    cursor: pointer;
+    transition: all 0.3s ease;
+    border: 2px solid transparent;
+
+    &:hover {
+      background: #4facfe;
+      color: white;
+      transform: translateY(-4px);
+      box-shadow: 0 8px 24px rgba(79, 172, 254, 0.3);
+
+      .action-icon {
+        color: white;
+        transform: scale(1.1);
+      }
+    }
+
+    .action-icon {
+      font-size: 24px;
+      color: #4facfe;
+      margin-bottom: 8px;
+      transition: all 0.3s ease;
+    }
+
+    .action-label {
+      font-size: 14px;
+      font-weight: 500;
+    }
+  }
+}
+
+@media (max-width: 768px) {
+  .home-container {
+    padding: 0;
+  }
+
+  .home-header {
+    padding: 40px 20px 20px;
+
+    .main-title {
+      font-size: 32px;
+      flex-direction: column;
+      gap: 8px;
+    }
+  }
+
+  .system-overview,
+  .modules-section,
+  .quick-actions {
+    margin: 0 20px;
+    padding: 20px;
+  }
+
+  .module-card {
+    padding: 20px;
+  }
+}
+</style>

+ 237 - 0
src/page/studio-mgmt/index.vue

@@ -0,0 +1,237 @@
+<template>
+  <div class="studio-mgmt-container">
+    <!-- 页面头部 -->
+    <PageHeader
+      title="工作室建设与管理"
+      description="创新工作室全方位管理,空间规划、设备配置、团队协作一站式服务"
+      :icon="OfficeBuilding"
+      :breadcrumbs="breadcrumbs"
+    />
+
+    <!-- 数据概览 -->
+    <div class="overview-section">
+      <el-row :gutter="24">
+        <el-col :span="6">
+          <StatCard
+            title="工作室总数"
+            :number="overviewData.totalStudios"
+            icon="OfficeBuilding"
+            color="#ff6b6b"
+            :trend="{ value: 12, type: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            title="活跃团队"
+            :number="overviewData.activeTeams"
+            icon="UserFilled"
+            color="#4facfe"
+            :trend="{ value: 8, type: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            title="设备总数"
+            :number="overviewData.totalEquipment"
+            icon="Monitor"
+            color="#06ffa5"
+            :trend="{ value: 5, type: 'up' }"
+          />
+        </el-col>
+        <el-col :span="6">
+          <StatCard
+            title="使用率"
+            :number="`${overviewData.utilizationRate}%`"
+            icon="TrendCharts"
+            color="#f093fb"
+            :trend="{ value: 3, type: 'up' }"
+          />
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 核心功能区 -->
+    <div class="core-functions">
+      <h2 class="section-title">核心功能</h2>
+      <el-row :gutter="24">
+        <el-col :span="8" v-for="func in coreFunctions" :key="func.id">
+          <ActionCard
+            :title="func.title"
+            :description="func.description"
+            :icon="func.icon"
+            :clickable="true"
+            :stats="func.stats"
+            @click="navigateToFunction(func.path)"
+          >
+            <template #meta>
+              <el-tag :type="func.status === 'active' ? 'success' : 'warning'" size="small">
+                {{ func.statusText }}
+              </el-tag>
+            </template>
+          </ActionCard>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 快捷操作 -->
+    <div class="quick-actions">
+      <h2 class="section-title">快捷操作</h2>
+      <el-row :gutter="16">
+        <el-col :span="4" v-for="action in quickActions" :key="action.id">
+          <el-button
+            type="primary"
+            :icon="action.icon"
+            @click="handleQuickAction(action.id)"
+            class="quick-action-btn"
+          >
+            {{ action.label }}
+          </el-button>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import {
+  OfficeBuilding,
+  UserFilled,
+  Monitor,
+  TrendCharts,
+  Setting,
+  Plus,
+  Search,
+  Document,
+  Tools,
+  Calendar
+} from '@element-plus/icons-vue'
+import PageHeader from '../edu-industry/components/PageHeader.vue'
+import StatCard from '../edu-industry/components/StatCard.vue'
+import ActionCard from '../edu-industry/components/ActionCard.vue'
+
+const router = useRouter()
+
+// 面包屑导航
+const breadcrumbs = ref([
+  { label: '首页', path: '/' },
+  { label: '工作室建设与管理', path: '/studio-mgmt' }
+])
+
+// 数据概览
+const overviewData = reactive({
+  totalStudios: 42,
+  activeTeams: 38,
+  totalEquipment: 156,
+  utilizationRate: 87
+})
+
+// 核心功能
+const coreFunctions = reactive([
+  {
+    id: 'space-mgmt',
+    title: '空间管理',
+    description: '工作室空间规划、布局设计、使用情况监控',
+    icon: OfficeBuilding,
+    path: '/studio-mgmt/space',
+    stats: { total: 42, active: 38 },
+    status: 'active',
+    statusText: '运行中'
+  },
+  {
+    id: 'equipment-mgmt',
+    title: '设备配置',
+    description: '设备采购、维护、使用记录、故障处理',
+    icon: Monitor,
+    path: '/studio-mgmt/equipment',
+    stats: { total: 156, active: 142 },
+    status: 'active',
+    statusText: '运行中'
+  },
+  {
+    id: 'team-collaboration',
+    title: '团队协作',
+    description: '团队组建、项目协作、成果展示、交流分享',
+    icon: UserFilled,
+    path: '/studio-mgmt/team',
+    stats: { total: 38, active: 35 },
+    status: 'active',
+    statusText: '运行中'
+  }
+])
+
+// 快捷操作
+const quickActions = reactive([
+  { id: 'new-studio', label: '新建工作室', icon: Plus },
+  { id: 'search-equipment', label: '设备查询', icon: Search },
+  { id: 'maintenance', label: '设备维护', icon: Tools },
+  { id: 'booking', label: '空间预约', icon: Calendar },
+  { id: 'reports', label: '使用报告', icon: Document },
+  { id: 'settings', label: '系统设置', icon: Setting }
+])
+
+// 导航到功能页面
+const navigateToFunction = (path: string) => {
+  router.push(path)
+}
+
+// 处理快捷操作
+const handleQuickAction = (actionId: string) => {
+  console.log('Quick action:', actionId)
+  // 这里可以添加具体的快捷操作逻辑
+}
+</script>
+
+<style scoped lang="scss">
+.studio-mgmt-container {
+  padding: 24px;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  min-height: 100vh;
+}
+
+.overview-section {
+  margin-bottom: 32px;
+}
+
+.core-functions {
+  margin-bottom: 32px;
+}
+
+.section-title {
+  font-size: 20px;
+  font-weight: 600;
+  color: #fff;
+  margin-bottom: 16px;
+  display: flex;
+  align-items: center;
+  
+  &::before {
+    content: '';
+    width: 4px;
+    height: 20px;
+    background: #ff6b6b;
+    margin-right: 12px;
+    border-radius: 2px;
+  }
+}
+
+.quick-actions {
+  .quick-action-btn {
+    width: 100%;
+    height: 48px;
+    font-size: 14px;
+    border-radius: 8px;
+    background: rgba(255, 255, 255, 0.1);
+    border: 1px solid rgba(255, 255, 255, 0.2);
+    color: #fff;
+    transition: all 0.3s ease;
+    
+    &:hover {
+      background: rgba(255, 255, 255, 0.2);
+      transform: translateY(-2px);
+      box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
+    }
+  }
+}
+</style>

+ 114 - 0
src/router/index.ts

@@ -0,0 +1,114 @@
+import { createRouter, createWebHistory } from 'vue-router'
+
+const router = createRouter({
+  history: createWebHistory(import.meta.env.BASE_URL),
+  routes: [
+    {
+      path: '/',
+      name: 'Home',
+      component: () => import('../page/home/index.vue'),
+      meta: {
+        title: '首页'
+      }
+    },
+    {
+      path: '/edu-industry',
+      name: 'EduIndustry',
+      component: () => import('../page/edu-industry/index.vue'),
+      meta: {
+        title: '产教融合'
+      }
+    },
+    {
+      path: '/edu-industry/matching',
+      name: 'EduIndustryMatching',
+      component: () => import('../page/edu-industry/matching/index.vue'),
+      meta: {
+        title: '智能校企资源匹配系统'
+      }
+    },
+    {
+      path: '/edu-industry/transformation',
+      name: 'EduIndustryTransformation',
+      component: () => import('../page/edu-industry/transformation/index.vue'),
+      meta: {
+        title: '产学研成果转化加速器'
+      }
+    },
+    {
+      path: '/edu-industry/lifecycle',
+      name: 'EduIndustryLifecycle',
+      component: () => import('../page/edu-industry/lifecycle/index.vue'),
+      meta: {
+        title: '全生命周期项目管理平台'
+      }
+    },
+    {
+      path: '/studio-mgmt',
+      name: 'StudioMgmt',
+      component: () => import('../page/studio-mgmt/index.vue'),
+      meta: {
+        title: '工作室建设与管理'
+      }
+    },
+    {
+      path: '/competition',
+      name: 'Competition',
+      component: () => import('../page/competition/index.vue'),
+      meta: {
+        title: '学科竞赛管理'
+      }
+    },
+    {
+      path: '/competition/award-mgmt',
+      name: 'CompetitionAwardMgmt',
+      component: () => import('../page/competition/award-mgmt/index.vue'),
+      meta: {
+        title: '获奖信息管理'
+      }
+    },
+    {
+      path: '/competition/query',
+      name: 'CompetitionQuery',
+      component: () => import('../page/competition/query/index.vue'),
+      meta: {
+        title: '智能查询系统'
+      }
+    },
+    {
+      path: '/competition/personal',
+      name: 'CompetitionPersonal',
+      component: () => import('../page/competition/personal/index.vue'),
+      meta: {
+        title: '个人空间'
+      }
+    }
+    // 其他模块路由暂时注释,等待模块创建后再启用
+    // {
+    //   path: '/lab-mgmt',
+    //   name: 'LabMgmt',
+    //   component: () => import('../page/lab-mgmt/index.vue'),
+    //   meta: {
+    //     title: '实验室管理'
+    //   }
+    // },
+    // {
+    //   path: '/research',
+    //   name: 'Research',
+    //   component: () => import('../page/research/index.vue'),
+    //   meta: {
+    //     title: '科研项目管理'
+    //   }
+    // },
+    // {
+    //   path: '/studio-mgmt',
+    //   name: 'StudioMgmt',
+    //   component: () => import('../page/studio-mgmt/index.vue'),
+    //   meta: {
+    //     title: '工作室管理'
+    //   }
+    // }
+  ],
+})
+
+export default router

+ 12 - 0
src/stores/counter.ts

@@ -0,0 +1,12 @@
+import { ref, computed } from 'vue'
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore('counter', () => {
+  const count = ref(0)
+  const doubleCount = computed(() => count.value * 2)
+  function increment() {
+    count.value++
+  }
+
+  return { count, doubleCount, increment }
+})

+ 12 - 0
tsconfig.app.json

@@ -0,0 +1,12 @@
+{
+  "extends": "@vue/tsconfig/tsconfig.dom.json",
+  "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+  "exclude": ["src/**/__tests__/*"],
+  "compilerOptions": {
+    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  }
+}

+ 11 - 0
tsconfig.json

@@ -0,0 +1,11 @@
+{
+  "files": [],
+  "references": [
+    {
+      "path": "./tsconfig.node.json"
+    },
+    {
+      "path": "./tsconfig.app.json"
+    }
+  ]
+}

+ 19 - 0
tsconfig.node.json

@@ -0,0 +1,19 @@
+{
+  "extends": "@tsconfig/node22/tsconfig.json",
+  "include": [
+    "vite.config.*",
+    "vitest.config.*",
+    "cypress.config.*",
+    "nightwatch.conf.*",
+    "playwright.config.*",
+    "eslint.config.*"
+  ],
+  "compilerOptions": {
+    "noEmit": true,
+    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+
+    "module": "ESNext",
+    "moduleResolution": "Bundler",
+    "types": ["node"]
+  }
+}

+ 18 - 0
vite.config.ts

@@ -0,0 +1,18 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import vueDevTools from 'vite-plugin-vue-devtools'
+
+// https://vite.dev/config/
+export default defineConfig({
+  plugins: [
+    vue(),
+    vueDevTools(),
+  ],
+  resolve: {
+    alias: {
+      '@': fileURLToPath(new URL('./src', import.meta.url))
+    },
+  },
+})

+ 769 - 0
产品结构书.md

@@ -0,0 +1,769 @@
+# 科研创新与学科竞赛综合管理系统产品结构书
+
+## 文档信息
+- **文档版本**: v1.0
+- **创建日期**: 2024年
+- **文档类型**: 产品结构书
+- **适用范围**: 科研创新与学科竞赛综合管理系统
+
+---
+
+## 目录
+1. [产品概述](#1-产品概述)
+2. [系统架构设计](#2-系统架构设计)
+3. [用户角色与权限体系](#3-用户角色与权限体系)
+4. [功能模块结构](#4-功能模块结构)
+5. [技术架构](#5-技术架构)
+6. [数据架构](#6-数据架构)
+7. [接口设计](#7-接口设计)
+8. [部署架构](#8-部署架构)
+9. [安全架构](#9-安全架构)
+10. [扩展性设计](#10-扩展性设计)
+
+---
+
+## 1. 产品概述
+
+### 1.1 产品定位
+科研创新与学科竞赛综合管理系统是面向高校的一体化数字化平台,旨在实现科研项目、学科竞赛、工作室建设与产教协同管理的统一管理。
+
+### 1.2 核心价值
+- **一体化管理**: 整合科研、竞赛、实验室、工作室、国际化五大业务领域
+- **智能化匹配**: 基于AI算法的资源匹配与推荐系统
+- **数字化转型**: 从传统纸质流程向数字化管理转变
+- **协同化运作**: 实现校企合作、师生协作的高效协同
+
+### 1.3 目标用户
+- **管理员**: 系统维护、数据审核、权限分配
+- **教师**: 竞赛指导、项目发布、学生管理
+- **学生**: 信息填报、项目参与、成果申报
+- **企业用户**: 产学研合作、资源匹配、成果转化
+
+---
+
+## 2. 系统架构设计
+
+### 2.1 总体架构
+系统采用**微服务架构**,基于**前后端分离**的设计模式,确保系统的可扩展性、可维护性和高可用性。
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│                        前端层 (Frontend)                      │
+├─────────────────────────────────────────────────────────────┤
+│  Web端(Vue3)  │  移动端(H5)  │  管理后台(Vue3+Element Plus)   │
+└─────────────────────────────────────────────────────────────┘
+                              │
+                         API Gateway
+                              │
+┌─────────────────────────────────────────────────────────────┐
+│                        服务层 (Services)                      │
+├─────────────────────────────────────────────────────────────┤
+│ 产教融合服务 │ 学科竞赛服务 │ 实验室服务 │ 工作室服务 │ 科研服务 │
+└─────────────────────────────────────────────────────────────┘
+                              │
+┌─────────────────────────────────────────────────────────────┐
+│                        数据层 (Data)                         │
+├─────────────────────────────────────────────────────────────┤
+│    MySQL主库    │    Redis缓存    │    文件存储    │    日志系统   │
+└─────────────────────────────────────────────────────────────┘
+```
+
+### 2.2 架构特点
+- **模块化设计**: 五大核心模块独立部署,松耦合
+- **服务化拆分**: 每个业务领域独立服务,便于维护
+- **统一网关**: API Gateway统一处理认证、限流、监控
+- **数据共享**: 通过统一数据接口实现模块间数据互通
+
+---
+
+## 3. 用户角色与权限体系
+
+### 3.1 角色定义
+
+#### 3.1.1 系统管理员 (System Admin)
+**职责范围**:
+- 系统配置与维护
+- 用户账号管理
+- 权限分配与审核
+- 数据备份与恢复
+- 系统监控与日志管理
+
+**权限清单**:
+- 所有模块的完全访问权限
+- 用户管理权限
+- 系统配置权限
+- 数据导入导出权限
+
+#### 3.1.2 教师用户 (Teacher)
+**职责范围**:
+- 竞赛项目指导
+- 学生团队管理
+- 项目发布与审核
+- 成果评估与认定
+
+**权限清单**:
+- 学科竞赛模块: 项目发布、学生管理、成果审核
+- 工作室模块: 项目管理、学生能力评估
+- 实验室模块: 设备借用审批、远程控制
+- 科研模块: 项目申报、成果管理
+
+#### 3.1.3 学生用户 (Student)
+**职责范围**:
+- 个人信息维护
+- 项目参与申请
+- 竞赛成果申报
+- 实验室设备使用
+
+**权限清单**:
+- 个人空间: 信息查看、修改、进度追踪
+- 竞赛模块: 成果提交、证书上传
+- 工作室模块: 项目报名、任务执行
+- 实验室模块: 设备借用申请
+
+#### 3.1.4 企业用户 (Enterprise)
+**职责范围**:
+- 产学研合作
+- 技术需求发布
+- 成果转化对接
+- 资源共享
+
+**权限清单**:
+- 产教融合模块: 需求发布、项目对接、成果评估
+- 有限的学生信息查看权限
+- 合作项目管理权限
+
+### 3.2 权限控制机制
+- **基于角色的访问控制 (RBAC)**
+- **细粒度权限控制**: 精确到功能点级别
+- **动态权限分配**: 支持临时权限授予
+- **权限继承**: 支持角色权限继承关系
+
+---
+
+## 4. 功能模块结构
+
+### 4.1 产教融合模块
+
+#### 4.1.1 模块架构
+```
+产教融合模块
+├── 智能校企资源匹配系统
+│   ├── 动态标签库管理
+│   ├── AI算法推荐引擎
+│   └── 热力图看板
+├── 产学研成果转化加速器
+│   ├── 技术成熟度评估仪表盘
+│   └── 路演匹配系统
+└── 全生命周期项目管理平台
+    ├── 三维进度管理
+    ├── 风险预警系统
+    └── 知识产权沙盒协作
+```
+
+#### 4.1.2 核心功能
+**智能校企资源匹配系统**:
+- 企业标签管理: 技术领域、设备类型、合作历史
+- 院系标签管理: 专业方向、研究领域、师资力量
+- AI双向推荐: 基于标签相似度的智能匹配
+- 热力图看板: 实时显示供需匹配度
+
+**产学研成果转化加速器**:
+- 技术成熟度评估: 企业专家打分系统
+- 路演匹配系统: 自动推送投资机构
+- 成果展示平台: 多媒体成果展示
+
+**全生命周期项目管理**:
+- 行政节点管理: 审批流程、文档管理
+- 教学节点管理: 课程安排、学分认定
+- 财务节点管理: 预算控制、报销流程
+- 风险预警: 进度延期、质量问题预警
+- 知识产权保护: 专利申请、版权管理
+
+### 4.2 学科竞赛模块
+
+#### 4.2.1 模块架构
+```
+学科竞赛模块
+├── 获奖信息管理
+│   ├── 标准化提交流程
+│   ├── 佐证材料管理
+│   └── 双状态审核系统
+├── 智能查询系统
+│   ├── 多条件组合检索
+│   └── 数据导出功能
+└── 个人空间模块
+    ├── 获奖记录库
+    ├── 进度追踪
+    └── 数据修改
+```
+
+#### 4.2.2 核心功能
+**获奖信息管理**:
+- 标准化表单: 统一的信息录入格式
+- 文件上传: 支持PDF/JPG格式证书
+- 审核流程: 通过/驳回双状态,支持修改意见
+- 版本控制: 记录修改历史
+
+**智能查询系统**:
+- 多维度检索: 按时间、类别、等级、指导教师等
+- 高级筛选: 支持复合条件查询
+- 数据导出: 一键Excel导出功能
+- 统计分析: 获奖趋势分析
+
+**个人空间**:
+- 个人档案: 完整的获奖记录
+- 进度查看: 实时审核状态
+- 数据管理: 信息修改、补充材料
+
+### 4.3 实验室管理模块
+
+#### 4.3.1 模块架构
+```
+实验室管理模块
+├── 实验设备借用管理
+│   ├── 线上申请系统
+│   ├── 审批流程
+│   └── 使用记录
+└── 远程设备控制
+    ├── 远程关机功能
+    ├── 设备状态监控
+    └── 提醒机制
+```
+
+#### 4.3.2 核心功能
+**设备借用管理**:
+- 在线申请: 替代纸质登记流程
+- 设备清单: 实时设备状态查看
+- 审批流程: 教师审批、自动分配
+- 使用记录: 完整的借用历史
+
+**远程设备控制**:
+- 一键关机: 远程设备电源管理
+- 状态监控: 实时设备运行状态
+- 网络监控: 防止学生拔网线
+- 提醒系统: 异常情况及时通知
+
+### 4.4 工作室建设与管理模块
+
+#### 4.4.1 模块架构
+```
+工作室建设与管理模块
+├── 学生能力信息化
+│   ├── 能力标签库
+│   ├── 任务状态管理
+│   └── 智能匹配算法
+├── 项目可视化信息
+│   ├── 项目概览仪表盘
+│   ├── 进度管理
+│   └── 质量管控
+└── 比赛与项目遴选
+    ├── 项目发布
+    ├── 学生报名
+    └── 筛选匹配
+```
+
+#### 4.4.2 核心功能
+**学生能力信息化**:
+- 技能标签: 编程语言、专业技能、工具使用
+- 软技能: 沟通能力、团队协作、领导力
+- 可用时间: 课程安排、空闲时间管理
+- 任务状态: 当前参与项目、工作负荷
+
+**项目可视化**:
+- 项目仪表盘: 阶段进度、健康状态
+- 任务分工: 团队成员职责分配
+- 工作量统计: 个人贡献度分析
+- 返工追踪: 质量问题记录与改进
+- 里程碑管理: 关键节点控制
+
+**遴选管理**:
+- 项目挂载: 教师发布项目需求
+- 学生报名: 在线申请参与
+- 智能匹配: 基于能力标签的推荐
+- 筛选机制: 教师选择合适学生
+
+### 4.5 科研与国际化模块
+
+#### 4.5.1 模块架构
+```
+科研与国际化模块
+├── 短期交流项目
+│   ├── 项目信息库
+│   ├── 快速报名系统
+│   └── 进度跟踪
+├── 科研项目管理
+│   ├── 项目申报
+│   ├── 过程管理
+│   └── 成果管理
+└── 国际合作平台
+    ├── 合作机构管理
+    ├── 交流活动
+    └── 成果展示
+```
+
+#### 4.5.2 核心功能
+**短期交流项目**:
+- 项目信息化: 完整的项目信息库
+- 快速报名: 简化的申请流程
+- 资格审核: 自动化初审机制
+- 进度跟踪: 申请状态实时更新
+
+**科研项目管理**:
+- 项目申报: 在线申报系统
+- 过程监控: 阶段性进展报告
+- 经费管理: 预算执行监控
+- 成果管理: 论文、专利、奖项记录
+
+---
+
+## 5. 技术架构
+
+### 5.1 前端技术栈
+```
+前端架构
+├── 框架: Vue 3.x
+├── UI组件库: Element Plus
+├── 状态管理: Pinia
+├── 路由管理: Vue Router 4.x
+├── HTTP客户端: Axios
+├── 构建工具: Vite
+├── 代码规范: ESLint + Prettier
+└── 类型检查: TypeScript
+```
+
+### 5.2 后端技术栈
+```
+后端架构
+├── 框架: Spring Boot 2.7.x
+├── 安全框架: Spring Security + OAuth2.0
+├── 数据访问: MyBatis Plus
+├── 缓存: Redis 6.x
+├── 消息队列: RabbitMQ
+├── 任务调度: Quartz
+├── 文档生成: Swagger 3.x
+└── 监控: Spring Boot Actuator
+```
+
+### 5.3 数据库技术栈
+```
+数据存储
+├── 关系数据库: MySQL 8.0
+├── 缓存数据库: Redis 6.x
+├── 文件存储: MinIO / 阿里云OSS
+├── 搜索引擎: Elasticsearch (可选)
+└── 数据备份: MySQL Backup + 定时任务
+```
+
+### 5.4 部署技术栈
+```
+部署架构
+├── 容器化: Docker + Docker Compose
+├── 反向代理: Nginx
+├── 负载均衡: Nginx Upstream
+├── 监控: Prometheus + Grafana
+├── 日志: ELK Stack (可选)
+└── CI/CD: Jenkins / GitLab CI
+```
+
+---
+
+## 6. 数据架构
+
+### 6.1 数据库设计原则
+- **规范化设计**: 遵循第三范式,减少数据冗余
+- **性能优化**: 合理使用索引,优化查询性能
+- **扩展性**: 预留扩展字段,支持业务发展
+- **安全性**: 敏感数据加密存储
+
+### 6.2 核心数据表结构
+
+#### 6.2.1 用户管理相关表
+```sql
+-- 用户基础信息表
+users (
+    id, username, password, email, phone, 
+    real_name, role_id, status, created_at, updated_at
+)
+
+-- 角色权限表
+roles (
+    id, role_name, role_code, description, 
+    permissions, created_at, updated_at
+)
+
+-- 用户角色关联表
+user_roles (
+    id, user_id, role_id, created_at
+)
+```
+
+#### 6.2.2 产教融合相关表
+```sql
+-- 企业信息表
+enterprises (
+    id, name, type, industry, contact_person,
+    contact_phone, address, tags, created_at, updated_at
+)
+
+-- 校企合作项目表
+cooperation_projects (
+    id, project_name, enterprise_id, department_id,
+    start_date, end_date, status, budget, created_at, updated_at
+)
+
+-- 技术成熟度评估表
+tech_maturity_assessments (
+    id, project_id, assessor_id, score,
+    assessment_content, created_at, updated_at
+)
+```
+
+#### 6.2.3 学科竞赛相关表
+```sql
+-- 竞赛信息表
+competitions (
+    id, name, type, level, organizer,
+    start_date, end_date, description, created_at, updated_at
+)
+
+-- 获奖记录表
+awards (
+    id, competition_id, student_id, teacher_id,
+    award_level, certificate_url, status, created_at, updated_at
+)
+
+-- 审核记录表
+audit_records (
+    id, award_id, auditor_id, status,
+    audit_comment, created_at, updated_at
+)
+```
+
+#### 6.2.4 实验室管理相关表
+```sql
+-- 实验室信息表
+laboratories (
+    id, name, location, manager_id,
+    capacity, equipment_count, created_at, updated_at
+)
+
+-- 设备信息表
+equipment (
+    id, lab_id, name, model, status,
+    purchase_date, last_maintenance, created_at, updated_at
+)
+
+-- 设备借用记录表
+equipment_borrowings (
+    id, equipment_id, borrower_id, approver_id,
+    borrow_date, return_date, status, created_at, updated_at
+)
+```
+
+#### 6.2.5 工作室管理相关表
+```sql
+-- 学生能力标签表
+student_skills (
+    id, student_id, skill_name, skill_level,
+    certification_url, created_at, updated_at
+)
+
+-- 项目信息表
+projects (
+    id, name, description, teacher_id, status,
+    start_date, end_date, created_at, updated_at
+)
+
+-- 项目成员表
+project_members (
+    id, project_id, student_id, role,
+    join_date, contribution_rate, created_at, updated_at
+)
+```
+
+### 6.3 数据关系图
+```
+用户表 ──┐
+         ├── 角色权限体系
+角色表 ──┘
+
+学生表 ──┐
+         ├── 竞赛获奖管理
+竞赛表 ──┤
+获奖表 ──┘
+
+企业表 ──┐
+         ├── 产教融合管理
+项目表 ──┘
+
+实验室表 ──┐
+           ├── 设备管理
+设备表 ────┤
+借用记录表 ┘
+
+工作室表 ──┐
+           ├── 项目管理
+项目表 ────┤
+成员表 ────┘
+```
+
+---
+
+## 7. 接口设计
+
+### 7.1 API设计规范
+- **RESTful风格**: 遵循REST设计原则
+- **统一响应格式**: 标准化的JSON响应结构
+- **版本控制**: 通过URL路径进行版本管理
+- **错误处理**: 统一的错误码和错误信息
+
+### 7.2 统一响应格式
+```json
+{
+    "code": 200,
+    "message": "success",
+    "data": {},
+    "timestamp": "2024-01-01T00:00:00Z",
+    "requestId": "uuid"
+}
+```
+
+### 7.3 核心API接口
+
+#### 7.3.1 用户认证接口
+```
+POST /api/v1/auth/login          # 用户登录
+POST /api/v1/auth/logout         # 用户登出
+POST /api/v1/auth/refresh        # 刷新Token
+GET  /api/v1/auth/userinfo       # 获取用户信息
+```
+
+#### 7.3.2 产教融合接口
+```
+GET    /api/v1/cooperation/enterprises     # 获取企业列表
+POST   /api/v1/cooperation/enterprises     # 创建企业信息
+GET    /api/v1/cooperation/projects        # 获取合作项目
+POST   /api/v1/cooperation/projects        # 创建合作项目
+GET    /api/v1/cooperation/matching        # 智能匹配推荐
+POST   /api/v1/cooperation/assessment      # 技术成熟度评估
+```
+
+#### 7.3.3 学科竞赛接口
+```
+GET    /api/v1/competitions                # 获取竞赛列表
+POST   /api/v1/competitions                # 创建竞赛信息
+GET    /api/v1/awards                      # 获取获奖记录
+POST   /api/v1/awards                      # 提交获奖信息
+PUT    /api/v1/awards/{id}/audit           # 审核获奖信息
+GET    /api/v1/awards/export               # 导出获奖数据
+```
+
+#### 7.3.4 实验室管理接口
+```
+GET    /api/v1/laboratories                # 获取实验室列表
+GET    /api/v1/equipment                   # 获取设备列表
+POST   /api/v1/equipment/borrow            # 申请借用设备
+PUT    /api/v1/equipment/{id}/return       # 归还设备
+POST   /api/v1/equipment/{id}/remote       # 远程控制设备
+```
+
+#### 7.3.5 工作室管理接口
+```
+GET    /api/v1/students/skills             # 获取学生技能
+POST   /api/v1/students/skills             # 添加学生技能
+GET    /api/v1/projects                    # 获取项目列表
+POST   /api/v1/projects                    # 创建项目
+POST   /api/v1/projects/{id}/apply         # 申请参与项目
+GET    /api/v1/projects/{id}/dashboard     # 项目仪表盘
+```
+
+### 7.4 文件上传接口
+```
+POST   /api/v1/files/upload                # 通用文件上传
+GET    /api/v1/files/{id}                  # 文件下载
+DELETE /api/v1/files/{id}                  # 删除文件
+```
+
+---
+
+## 8. 部署架构
+
+### 8.1 部署环境规划
+```
+生产环境
+├── Web服务器: Nginx (负载均衡 + 静态资源)
+├── 应用服务器: Spring Boot (业务逻辑处理)
+├── 数据库服务器: MySQL Master-Slave
+├── 缓存服务器: Redis Cluster
+├── 文件服务器: MinIO Cluster
+└── 监控服务器: Prometheus + Grafana
+```
+
+### 8.2 容器化部署
+```yaml
+# docker-compose.yml
+version: '3.8'
+services:
+  nginx:
+    image: nginx:alpine
+    ports:
+      - "80:80"
+      - "443:443"
+    volumes:
+      - ./nginx.conf:/etc/nginx/nginx.conf
+      - ./dist:/usr/share/nginx/html
+  
+  backend:
+    image: inno-res-comp-ms:latest
+    ports:
+      - "8080:8080"
+    environment:
+      - SPRING_PROFILES_ACTIVE=prod
+      - MYSQL_HOST=mysql
+      - REDIS_HOST=redis
+    depends_on:
+      - mysql
+      - redis
+  
+  mysql:
+    image: mysql:8.0
+    environment:
+      - MYSQL_ROOT_PASSWORD=password
+      - MYSQL_DATABASE=inno_res_comp_ms
+    volumes:
+      - mysql_data:/var/lib/mysql
+  
+  redis:
+    image: redis:6-alpine
+    volumes:
+      - redis_data:/data
+
+volumes:
+  mysql_data:
+  redis_data:
+```
+
+### 8.3 负载均衡配置
+```nginx
+upstream backend {
+    server backend1:8080 weight=1;
+    server backend2:8080 weight=1;
+    server backend3:8080 weight=1;
+}
+
+server {
+    listen 80;
+    server_name your-domain.com;
+    
+    location /api/ {
+        proxy_pass http://backend;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    }
+    
+    location / {
+        root /usr/share/nginx/html;
+        try_files $uri $uri/ /index.html;
+    }
+}
+```
+
+---
+
+## 9. 安全架构
+
+### 9.1 认证与授权
+- **JWT Token**: 无状态的用户认证
+- **OAuth2.0**: 第三方登录支持
+- **RBAC权限控制**: 基于角色的访问控制
+- **API签名**: 接口调用安全验证
+
+### 9.2 数据安全
+- **数据加密**: 敏感数据AES加密存储
+- **传输加密**: HTTPS/TLS传输加密
+- **SQL注入防护**: 参数化查询
+- **XSS防护**: 输入输出过滤
+
+### 9.3 系统安全
+- **访问控制**: IP白名单、访问频率限制
+- **日志审计**: 完整的操作日志记录
+- **备份策略**: 定期数据备份与恢复测试
+- **漏洞扫描**: 定期安全漏洞检测
+
+### 9.4 安全配置示例
+```yaml
+# Spring Security配置
+security:
+  jwt:
+    secret: your-secret-key
+    expiration: 86400000  # 24小时
+  oauth2:
+    enabled: true
+    providers:
+      - github
+      - wechat
+  cors:
+    allowed-origins: 
+      - https://your-domain.com
+    allowed-methods:
+      - GET
+      - POST
+      - PUT
+      - DELETE
+```
+
+---
+
+## 10. 扩展性设计
+
+### 10.1 水平扩展
+- **微服务架构**: 服务独立部署,按需扩展
+- **数据库分片**: 支持数据水平分割
+- **缓存集群**: Redis集群支持
+- **CDN加速**: 静态资源分发
+
+### 10.2 功能扩展
+- **插件机制**: 支持第三方功能插件
+- **API开放**: 提供开放API供第三方集成
+- **模块化设计**: 新功能模块独立开发
+- **配置化**: 业务规则配置化管理
+
+### 10.3 性能优化
+- **缓存策略**: 多级缓存机制
+- **数据库优化**: 索引优化、查询优化
+- **异步处理**: 耗时操作异步化
+- **CDN部署**: 静态资源CDN加速
+
+### 10.4 监控与运维
+```yaml
+# 监控配置
+monitoring:
+  metrics:
+    - application_performance
+    - database_performance
+    - cache_performance
+    - business_metrics
+  alerts:
+    - cpu_usage > 80%
+    - memory_usage > 85%
+    - response_time > 3s
+    - error_rate > 5%
+  logging:
+    level: INFO
+    retention: 30d
+    format: JSON
+```
+
+---
+
+## 总结
+
+本产品结构书详细描述了科研创新与学科竞赛综合管理系统的完整架构设计,包括:
+
+1. **模块化架构**: 五大核心模块独立设计,职责清晰
+2. **技术选型**: 现代化的技术栈,确保系统稳定性和扩展性
+3. **安全设计**: 完善的安全机制,保障数据和系统安全
+4. **扩展性**: 良好的扩展性设计,支持未来业务发展
+
+该架构设计充分考虑了高校科研管理的复杂性和多样性,通过统一的平台实现了科研、竞赛、实验室、工作室和国际化业务的一体化管理,为高校数字化转型提供了完整的解决方案。

+ 1151 - 0
数据库设计文档.sql

@@ -0,0 +1,1151 @@
+-- =====================================================
+-- 科研创新与学科竞赛综合管理系统数据库设计
+-- 版本: v1.0
+-- 创建日期: 2024年
+-- 数据库: MySQL 8.0
+-- 字符集: utf8mb4
+-- 排序规则: utf8mb4_unicode_ci
+-- =====================================================
+
+-- 创建数据库
+CREATE DATABASE IF NOT EXISTS inno_res_comp_ms 
+CHARACTER SET utf8mb4 
+COLLATE utf8mb4_unicode_ci;
+
+USE inno_res_comp_ms;
+
+-- =====================================================
+-- 1. 用户管理模块表结构
+-- =====================================================
+
+-- 用户基础信息表
+CREATE TABLE users (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
+    username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
+    password VARCHAR(255) NOT NULL COMMENT '密码(加密)',
+    email VARCHAR(100) UNIQUE COMMENT '邮箱',
+    phone VARCHAR(20) COMMENT '手机号',
+    real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
+    avatar_url VARCHAR(500) COMMENT '头像URL',
+    gender TINYINT DEFAULT 0 COMMENT '性别: 0-未知, 1-男, 2-女',
+    birth_date DATE COMMENT '出生日期',
+    id_card VARCHAR(18) COMMENT '身份证号',
+    department_id BIGINT COMMENT '所属部门ID',
+    status TINYINT DEFAULT 1 COMMENT '状态: 0-禁用, 1-启用',
+    last_login_time DATETIME COMMENT '最后登录时间',
+    last_login_ip VARCHAR(45) COMMENT '最后登录IP',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_username (username),
+    INDEX idx_email (email),
+    INDEX idx_phone (phone),
+    INDEX idx_department (department_id),
+    INDEX idx_status (status),
+    INDEX idx_created_at (created_at)
+) COMMENT '用户基础信息表';
+
+-- 角色表
+CREATE TABLE roles (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID',
+    role_name VARCHAR(50) NOT NULL COMMENT '角色名称',
+    role_code VARCHAR(50) NOT NULL UNIQUE COMMENT '角色编码',
+    description TEXT COMMENT '角色描述',
+    permissions JSON COMMENT '权限列表(JSON格式)',
+    is_system TINYINT DEFAULT 0 COMMENT '是否系统角色: 0-否, 1-是',
+    status TINYINT DEFAULT 1 COMMENT '状态: 0-禁用, 1-启用',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_role_code (role_code),
+    INDEX idx_status (status)
+) COMMENT '角色表';
+
+-- 用户角色关联表
+CREATE TABLE user_roles (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '关联ID',
+    user_id BIGINT NOT NULL COMMENT '用户ID',
+    role_id BIGINT NOT NULL COMMENT '角色ID',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    UNIQUE KEY uk_user_role (user_id, role_id),
+    INDEX idx_user_id (user_id),
+    INDEX idx_role_id (role_id),
+    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
+    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
+) COMMENT '用户角色关联表';
+
+-- 部门表
+CREATE TABLE departments (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '部门ID',
+    name VARCHAR(100) NOT NULL COMMENT '部门名称',
+    code VARCHAR(50) UNIQUE COMMENT '部门编码',
+    parent_id BIGINT DEFAULT 0 COMMENT '父部门ID',
+    level TINYINT DEFAULT 1 COMMENT '部门层级',
+    sort_order INT DEFAULT 0 COMMENT '排序',
+    manager_id BIGINT COMMENT '部门负责人ID',
+    description TEXT COMMENT '部门描述',
+    status TINYINT DEFAULT 1 COMMENT '状态: 0-禁用, 1-启用',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_parent_id (parent_id),
+    INDEX idx_code (code),
+    INDEX idx_manager_id (manager_id),
+    INDEX idx_status (status)
+) COMMENT '部门表';
+
+-- =====================================================
+-- 2. 产教融合模块表结构
+-- =====================================================
+
+-- 企业信息表
+CREATE TABLE enterprises (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '企业ID',
+    name VARCHAR(200) NOT NULL COMMENT '企业名称',
+    short_name VARCHAR(100) COMMENT '企业简称',
+    unified_social_credit_code VARCHAR(18) UNIQUE COMMENT '统一社会信用代码',
+    enterprise_type TINYINT NOT NULL COMMENT '企业类型: 1-国企, 2-民企, 3-外企, 4-合资',
+    industry VARCHAR(100) COMMENT '所属行业',
+    scale TINYINT COMMENT '企业规模: 1-大型, 2-中型, 3-小型, 4-微型',
+    contact_person VARCHAR(50) COMMENT '联系人',
+    contact_phone VARCHAR(20) COMMENT '联系电话',
+    contact_email VARCHAR(100) COMMENT '联系邮箱',
+    address VARCHAR(500) COMMENT '企业地址',
+    website VARCHAR(200) COMMENT '企业官网',
+    business_scope TEXT COMMENT '经营范围',
+    tags JSON COMMENT '企业标签(技术领域、设备类型等)',
+    cooperation_history JSON COMMENT '合作历史记录',
+    credit_rating TINYINT DEFAULT 5 COMMENT '信用评级(1-10)',
+    status TINYINT DEFAULT 1 COMMENT '状态: 0-禁用, 1-启用',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_name (name),
+    INDEX idx_industry (industry),
+    INDEX idx_enterprise_type (enterprise_type),
+    INDEX idx_scale (scale),
+    INDEX idx_status (status),
+    INDEX idx_credit_rating (credit_rating)
+) COMMENT '企业信息表';
+
+-- 校企合作项目表
+CREATE TABLE cooperation_projects (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '项目ID',
+    project_name VARCHAR(200) NOT NULL COMMENT '项目名称',
+    project_code VARCHAR(50) UNIQUE COMMENT '项目编号',
+    enterprise_id BIGINT NOT NULL COMMENT '合作企业ID',
+    department_id BIGINT NOT NULL COMMENT '学校部门ID',
+    project_type TINYINT NOT NULL COMMENT '项目类型: 1-技术开发, 2-人才培养, 3-实习实训, 4-成果转化',
+    cooperation_mode TINYINT NOT NULL COMMENT '合作模式: 1-委托开发, 2-合作开发, 3-技术服务, 4-人才交流',
+    project_leader_id BIGINT COMMENT '项目负责人ID',
+    enterprise_contact_id BIGINT COMMENT '企业联系人ID',
+    start_date DATE NOT NULL COMMENT '开始日期',
+    end_date DATE NOT NULL COMMENT '结束日期',
+    budget DECIMAL(15,2) DEFAULT 0 COMMENT '项目预算',
+    actual_amount DECIMAL(15,2) DEFAULT 0 COMMENT '实际金额',
+    project_description TEXT COMMENT '项目描述',
+    objectives TEXT COMMENT '项目目标',
+    deliverables TEXT COMMENT '交付成果',
+    risk_assessment TEXT COMMENT '风险评估',
+    progress_status TINYINT DEFAULT 1 COMMENT '进度状态: 1-立项, 2-进行中, 3-验收, 4-完成, 5-暂停, 6-终止',
+    quality_score DECIMAL(3,1) DEFAULT 0 COMMENT '质量评分(0-10)',
+    satisfaction_score DECIMAL(3,1) DEFAULT 0 COMMENT '满意度评分(0-10)',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_project_code (project_code),
+    INDEX idx_enterprise_id (enterprise_id),
+    INDEX idx_department_id (department_id),
+    INDEX idx_project_type (project_type),
+    INDEX idx_progress_status (progress_status),
+    INDEX idx_start_date (start_date),
+    INDEX idx_end_date (end_date),
+    FOREIGN KEY (enterprise_id) REFERENCES enterprises(id),
+    FOREIGN KEY (department_id) REFERENCES departments(id),
+    FOREIGN KEY (project_leader_id) REFERENCES users(id)
+) COMMENT '校企合作项目表';
+
+-- 技术成熟度评估表
+CREATE TABLE tech_maturity_assessments (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '评估ID',
+    project_id BIGINT NOT NULL COMMENT '项目ID',
+    assessor_id BIGINT NOT NULL COMMENT '评估人ID',
+    assessment_round TINYINT DEFAULT 1 COMMENT '评估轮次',
+    technology_readiness_level TINYINT NOT NULL COMMENT '技术成熟度等级(1-9)',
+    market_readiness_score DECIMAL(3,1) COMMENT '市场成熟度评分(0-10)',
+    commercial_potential_score DECIMAL(3,1) COMMENT '商业化潜力评分(0-10)',
+    risk_level TINYINT COMMENT '风险等级: 1-低, 2-中, 3-高',
+    assessment_content TEXT COMMENT '评估内容',
+    improvement_suggestions TEXT COMMENT '改进建议',
+    next_milestone TEXT COMMENT '下一里程碑',
+    assessment_date DATE NOT NULL COMMENT '评估日期',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_project_id (project_id),
+    INDEX idx_assessor_id (assessor_id),
+    INDEX idx_assessment_date (assessment_date),
+    INDEX idx_trl (technology_readiness_level),
+    FOREIGN KEY (project_id) REFERENCES cooperation_projects(id),
+    FOREIGN KEY (assessor_id) REFERENCES users(id)
+) COMMENT '技术成熟度评估表';
+
+-- 路演匹配表
+CREATE TABLE roadshow_matches (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '匹配ID',
+    project_id BIGINT NOT NULL COMMENT '项目ID',
+    investor_type TINYINT NOT NULL COMMENT '投资机构类型: 1-天使投资, 2-VC, 3-PE, 4-产业基金',
+    investor_name VARCHAR(200) COMMENT '投资机构名称',
+    contact_person VARCHAR(50) COMMENT '联系人',
+    contact_info VARCHAR(200) COMMENT '联系方式',
+    match_score DECIMAL(3,1) COMMENT '匹配度评分(0-10)',
+    match_reason TEXT COMMENT '匹配原因',
+    roadshow_date DATETIME COMMENT '路演时间',
+    roadshow_result TINYINT COMMENT '路演结果: 1-通过, 2-待定, 3-拒绝',
+    feedback TEXT COMMENT '反馈意见',
+    follow_up_actions TEXT COMMENT '后续行动',
+    status TINYINT DEFAULT 1 COMMENT '状态: 1-待路演, 2-已路演, 3-已签约, 4-已拒绝',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_project_id (project_id),
+    INDEX idx_investor_type (investor_type),
+    INDEX idx_roadshow_date (roadshow_date),
+    INDEX idx_status (status),
+    FOREIGN KEY (project_id) REFERENCES cooperation_projects(id)
+) COMMENT '路演匹配表';
+
+-- =====================================================
+-- 3. 学科竞赛模块表结构
+-- =====================================================
+
+-- 竞赛信息表
+CREATE TABLE competitions (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '竞赛ID',
+    name VARCHAR(200) NOT NULL COMMENT '竞赛名称',
+    english_name VARCHAR(200) COMMENT '英文名称',
+    competition_code VARCHAR(50) UNIQUE COMMENT '竞赛编号',
+    competition_type TINYINT NOT NULL COMMENT '竞赛类型: 1-学科竞赛, 2-创新创业, 3-技能竞赛, 4-文体竞赛',
+    level TINYINT NOT NULL COMMENT '竞赛级别: 1-国际级, 2-国家级, 3-省部级, 4-市厅级, 5-校级',
+    category VARCHAR(100) COMMENT '竞赛类别',
+    organizer VARCHAR(200) COMMENT '主办单位',
+    co_organizer VARCHAR(500) COMMENT '协办单位',
+    competition_year YEAR NOT NULL COMMENT '竞赛年度',
+    registration_start_date DATE COMMENT '报名开始日期',
+    registration_end_date DATE COMMENT '报名结束日期',
+    competition_start_date DATE COMMENT '竞赛开始日期',
+    competition_end_date DATE COMMENT '竞赛结束日期',
+    venue VARCHAR(200) COMMENT '竞赛地点',
+    official_website VARCHAR(200) COMMENT '官方网站',
+    description TEXT COMMENT '竞赛描述',
+    rules_document_url VARCHAR(500) COMMENT '竞赛规则文档URL',
+    prize_setting TEXT COMMENT '奖项设置',
+    registration_fee DECIMAL(10,2) DEFAULT 0 COMMENT '报名费用',
+    max_team_size INT DEFAULT 1 COMMENT '最大团队人数',
+    status TINYINT DEFAULT 1 COMMENT '状态: 0-禁用, 1-启用, 2-已结束',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_competition_code (competition_code),
+    INDEX idx_competition_type (competition_type),
+    INDEX idx_level (level),
+    INDEX idx_competition_year (competition_year),
+    INDEX idx_status (status),
+    INDEX idx_registration_dates (registration_start_date, registration_end_date),
+    INDEX idx_competition_dates (competition_start_date, competition_end_date)
+) COMMENT '竞赛信息表';
+
+-- 获奖记录表
+CREATE TABLE awards (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '获奖ID',
+    competition_id BIGINT NOT NULL COMMENT '竞赛ID',
+    award_name VARCHAR(200) NOT NULL COMMENT '获奖名称',
+    award_level TINYINT NOT NULL COMMENT '获奖等级: 1-特等奖, 2-一等奖, 3-二等奖, 4-三等奖, 5-优秀奖, 6-其他',
+    team_name VARCHAR(200) COMMENT '团队名称',
+    is_team TINYINT DEFAULT 0 COMMENT '是否团队: 0-个人, 1-团队',
+    team_leader_id BIGINT COMMENT '团队负责人ID',
+    team_members JSON COMMENT '团队成员ID列表',
+    instructor_id BIGINT COMMENT '指导教师ID',
+    co_instructors JSON COMMENT '协助指导教师ID列表',
+    work_title VARCHAR(200) COMMENT '作品标题',
+    work_description TEXT COMMENT '作品描述',
+    certificate_number VARCHAR(100) COMMENT '证书编号',
+    certificate_url VARCHAR(500) COMMENT '证书文件URL',
+    supporting_materials JSON COMMENT '佐证材料URL列表',
+    award_date DATE NOT NULL COMMENT '获奖日期',
+    points DECIMAL(5,2) DEFAULT 0 COMMENT '获奖积分',
+    bonus_amount DECIMAL(10,2) DEFAULT 0 COMMENT '奖金金额',
+    publicity_period_start DATE COMMENT '公示期开始',
+    publicity_period_end DATE COMMENT '公示期结束',
+    audit_status TINYINT DEFAULT 0 COMMENT '审核状态: 0-待审核, 1-审核通过, 2-审核驳回, 3-需要补充材料',
+    audit_comment TEXT COMMENT '审核意见',
+    auditor_id BIGINT COMMENT '审核人ID',
+    audit_time DATETIME COMMENT '审核时间',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_competition_id (competition_id),
+    INDEX idx_award_level (award_level),
+    INDEX idx_team_leader_id (team_leader_id),
+    INDEX idx_instructor_id (instructor_id),
+    INDEX idx_award_date (award_date),
+    INDEX idx_audit_status (audit_status),
+    INDEX idx_auditor_id (auditor_id),
+    FOREIGN KEY (competition_id) REFERENCES competitions(id),
+    FOREIGN KEY (team_leader_id) REFERENCES users(id),
+    FOREIGN KEY (instructor_id) REFERENCES users(id),
+    FOREIGN KEY (auditor_id) REFERENCES users(id)
+) COMMENT '获奖记录表';
+
+-- 审核记录表
+CREATE TABLE audit_records (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '审核记录ID',
+    award_id BIGINT NOT NULL COMMENT '获奖记录ID',
+    auditor_id BIGINT NOT NULL COMMENT '审核人ID',
+    audit_action TINYINT NOT NULL COMMENT '审核动作: 1-提交审核, 2-审核通过, 3-审核驳回, 4-要求补充',
+    audit_status_before TINYINT COMMENT '审核前状态',
+    audit_status_after TINYINT COMMENT '审核后状态',
+    audit_comment TEXT COMMENT '审核意见',
+    required_materials TEXT COMMENT '要求补充的材料',
+    audit_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '审核时间',
+    ip_address VARCHAR(45) COMMENT '审核IP地址',
+    INDEX idx_award_id (award_id),
+    INDEX idx_auditor_id (auditor_id),
+    INDEX idx_audit_time (audit_time),
+    FOREIGN KEY (award_id) REFERENCES awards(id),
+    FOREIGN KEY (auditor_id) REFERENCES users(id)
+) COMMENT '审核记录表';
+
+-- =====================================================
+-- 4. 实验室管理模块表结构
+-- =====================================================
+
+-- 实验室信息表
+CREATE TABLE laboratories (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '实验室ID',
+    name VARCHAR(200) NOT NULL COMMENT '实验室名称',
+    lab_code VARCHAR(50) UNIQUE COMMENT '实验室编号',
+    lab_type TINYINT NOT NULL COMMENT '实验室类型: 1-教学实验室, 2-科研实验室, 3-开放实验室, 4-虚拟实验室',
+    department_id BIGINT NOT NULL COMMENT '所属部门ID',
+    building VARCHAR(100) COMMENT '所在建筑',
+    floor VARCHAR(20) COMMENT '楼层',
+    room_number VARCHAR(50) COMMENT '房间号',
+    area DECIMAL(8,2) COMMENT '面积(平方米)',
+    capacity INT DEFAULT 0 COMMENT '容纳人数',
+    manager_id BIGINT COMMENT '实验室负责人ID',
+    assistant_managers JSON COMMENT '实验室管理员ID列表',
+    equipment_count INT DEFAULT 0 COMMENT '设备数量',
+    total_value DECIMAL(15,2) DEFAULT 0 COMMENT '设备总价值',
+    safety_level TINYINT DEFAULT 1 COMMENT '安全等级: 1-一般, 2-较高, 3-高',
+    access_control TINYINT DEFAULT 1 COMMENT '门禁控制: 0-无, 1-刷卡, 2-指纹, 3-人脸识别',
+    opening_hours VARCHAR(200) COMMENT '开放时间',
+    booking_required TINYINT DEFAULT 1 COMMENT '是否需要预约: 0-否, 1-是',
+    description TEXT COMMENT '实验室描述',
+    rules TEXT COMMENT '使用规则',
+    emergency_contact VARCHAR(200) COMMENT '紧急联系方式',
+    status TINYINT DEFAULT 1 COMMENT '状态: 0-停用, 1-正常, 2-维护中, 3-装修中',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_lab_code (lab_code),
+    INDEX idx_lab_type (lab_type),
+    INDEX idx_department_id (department_id),
+    INDEX idx_manager_id (manager_id),
+    INDEX idx_status (status),
+    FOREIGN KEY (department_id) REFERENCES departments(id),
+    FOREIGN KEY (manager_id) REFERENCES users(id)
+) COMMENT '实验室信息表';
+
+-- 设备信息表
+CREATE TABLE equipment (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '设备ID',
+    lab_id BIGINT NOT NULL COMMENT '所属实验室ID',
+    equipment_name VARCHAR(200) NOT NULL COMMENT '设备名称',
+    equipment_code VARCHAR(50) UNIQUE COMMENT '设备编号',
+    equipment_type TINYINT NOT NULL COMMENT '设备类型: 1-计算机, 2-测量仪器, 3-实验装置, 4-其他',
+    brand VARCHAR(100) COMMENT '品牌',
+    model VARCHAR(100) COMMENT '型号',
+    specifications TEXT COMMENT '技术规格',
+    purchase_date DATE COMMENT '购买日期',
+    purchase_price DECIMAL(12,2) COMMENT '购买价格',
+    supplier VARCHAR(200) COMMENT '供应商',
+    warranty_period INT COMMENT '保修期(月)',
+    warranty_end_date DATE COMMENT '保修到期日期',
+    depreciation_years INT DEFAULT 5 COMMENT '折旧年限',
+    current_value DECIMAL(12,2) COMMENT '当前价值',
+    location VARCHAR(200) COMMENT '存放位置',
+    responsible_person_id BIGINT COMMENT '责任人ID',
+    usage_instructions TEXT COMMENT '使用说明',
+    maintenance_cycle INT COMMENT '维护周期(天)',
+    last_maintenance_date DATE COMMENT '上次维护日期',
+    next_maintenance_date DATE COMMENT '下次维护日期',
+    maintenance_records JSON COMMENT '维护记录',
+    remote_controllable TINYINT DEFAULT 0 COMMENT '是否支持远程控制: 0-否, 1-是',
+    remote_control_url VARCHAR(500) COMMENT '远程控制地址',
+    network_status TINYINT DEFAULT 0 COMMENT '网络状态: 0-离线, 1-在线',
+    power_status TINYINT DEFAULT 0 COMMENT '电源状态: 0-关闭, 1-开启',
+    usage_status TINYINT DEFAULT 0 COMMENT '使用状态: 0-空闲, 1-使用中, 2-故障, 3-维护中',
+    booking_required TINYINT DEFAULT 1 COMMENT '是否需要预约: 0-否, 1-是',
+    max_booking_duration INT DEFAULT 240 COMMENT '最大预约时长(分钟)',
+    status TINYINT DEFAULT 1 COMMENT '设备状态: 0-报废, 1-正常, 2-故障, 3-维修中',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_equipment_code (equipment_code),
+    INDEX idx_lab_id (lab_id),
+    INDEX idx_equipment_type (equipment_type),
+    INDEX idx_responsible_person_id (responsible_person_id),
+    INDEX idx_usage_status (usage_status),
+    INDEX idx_status (status),
+    INDEX idx_network_status (network_status),
+    FOREIGN KEY (lab_id) REFERENCES laboratories(id),
+    FOREIGN KEY (responsible_person_id) REFERENCES users(id)
+) COMMENT '设备信息表';
+
+-- 设备借用记录表
+CREATE TABLE equipment_borrowings (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '借用记录ID',
+    equipment_id BIGINT NOT NULL COMMENT '设备ID',
+    borrower_id BIGINT NOT NULL COMMENT '借用人ID',
+    borrower_type TINYINT NOT NULL COMMENT '借用人类型: 1-学生, 2-教师, 3-外部人员',
+    purpose TEXT NOT NULL COMMENT '借用目的',
+    project_id BIGINT COMMENT '关联项目ID',
+    course_id BIGINT COMMENT '关联课程ID',
+    planned_start_time DATETIME NOT NULL COMMENT '计划开始时间',
+    planned_end_time DATETIME NOT NULL COMMENT '计划结束时间',
+    actual_start_time DATETIME COMMENT '实际开始时间',
+    actual_end_time DATETIME COMMENT '实际结束时间',
+    approver_id BIGINT COMMENT '审批人ID',
+    approval_time DATETIME COMMENT '审批时间',
+    approval_comment TEXT COMMENT '审批意见',
+    usage_notes TEXT COMMENT '使用说明',
+    return_condition TEXT COMMENT '归还状态说明',
+    damage_description TEXT COMMENT '损坏描述',
+    compensation_amount DECIMAL(10,2) DEFAULT 0 COMMENT '赔偿金额',
+    borrowing_status TINYINT DEFAULT 1 COMMENT '借用状态: 1-申请中, 2-已批准, 3-使用中, 4-已归还, 5-逾期, 6-已拒绝',
+    reminder_sent TINYINT DEFAULT 0 COMMENT '是否已发送提醒: 0-否, 1-是',
+    rating TINYINT COMMENT '使用评价(1-5星)',
+    feedback TEXT COMMENT '使用反馈',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_equipment_id (equipment_id),
+    INDEX idx_borrower_id (borrower_id),
+    INDEX idx_approver_id (approver_id),
+    INDEX idx_borrowing_status (borrowing_status),
+    INDEX idx_planned_times (planned_start_time, planned_end_time),
+    INDEX idx_actual_times (actual_start_time, actual_end_time),
+    FOREIGN KEY (equipment_id) REFERENCES equipment(id),
+    FOREIGN KEY (borrower_id) REFERENCES users(id),
+    FOREIGN KEY (approver_id) REFERENCES users(id)
+) COMMENT '设备借用记录表';
+
+-- 远程控制日志表
+CREATE TABLE remote_control_logs (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '日志ID',
+    equipment_id BIGINT NOT NULL COMMENT '设备ID',
+    operator_id BIGINT NOT NULL COMMENT '操作人ID',
+    operation_type TINYINT NOT NULL COMMENT '操作类型: 1-开机, 2-关机, 3-重启, 4-状态查询, 5-其他',
+    operation_command VARCHAR(500) COMMENT '操作命令',
+    operation_result TINYINT COMMENT '操作结果: 0-失败, 1-成功',
+    result_message TEXT COMMENT '结果消息',
+    ip_address VARCHAR(45) COMMENT '操作IP地址',
+    user_agent VARCHAR(500) COMMENT '用户代理',
+    operation_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
+    INDEX idx_equipment_id (equipment_id),
+    INDEX idx_operator_id (operator_id),
+    INDEX idx_operation_type (operation_type),
+    INDEX idx_operation_time (operation_time),
+    FOREIGN KEY (equipment_id) REFERENCES equipment(id),
+    FOREIGN KEY (operator_id) REFERENCES users(id)
+) COMMENT '远程控制日志表';
+
+-- =====================================================
+-- 5. 工作室建设与管理模块表结构
+-- =====================================================
+
+-- 学生技能标签表
+CREATE TABLE student_skills (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '技能ID',
+    student_id BIGINT NOT NULL COMMENT '学生ID',
+    skill_category TINYINT NOT NULL COMMENT '技能类别: 1-编程语言, 2-开发框架, 3-工具软件, 4-专业技能, 5-软技能',
+    skill_name VARCHAR(100) NOT NULL COMMENT '技能名称',
+    skill_level TINYINT NOT NULL COMMENT '技能水平: 1-初级, 2-中级, 3-高级, 4-专家',
+    proficiency_score DECIMAL(3,1) COMMENT '熟练度评分(0-10)',
+    certification_name VARCHAR(200) COMMENT '认证名称',
+    certification_url VARCHAR(500) COMMENT '认证证书URL',
+    certification_date DATE COMMENT '认证日期',
+    certification_expiry DATE COMMENT '认证到期日期',
+    self_assessment TEXT COMMENT '自我评价',
+    teacher_assessment TEXT COMMENT '教师评价',
+    project_experience TEXT COMMENT '项目经验',
+    learning_resources TEXT COMMENT '学习资源',
+    improvement_plan TEXT COMMENT '提升计划',
+    last_used_date DATE COMMENT '最后使用日期',
+    usage_frequency TINYINT COMMENT '使用频率: 1-很少, 2-偶尔, 3-经常, 4-每天',
+    is_verified TINYINT DEFAULT 0 COMMENT '是否已验证: 0-否, 1-是',
+    verifier_id BIGINT COMMENT '验证人ID',
+    verification_date DATE COMMENT '验证日期',
+    status TINYINT DEFAULT 1 COMMENT '状态: 0-已删除, 1-有效',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_student_id (student_id),
+    INDEX idx_skill_category (skill_category),
+    INDEX idx_skill_name (skill_name),
+    INDEX idx_skill_level (skill_level),
+    INDEX idx_is_verified (is_verified),
+    INDEX idx_status (status),
+    FOREIGN KEY (student_id) REFERENCES users(id),
+    FOREIGN KEY (verifier_id) REFERENCES users(id)
+) COMMENT '学生技能标签表';
+
+-- 学生可用时间表
+CREATE TABLE student_availability (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '可用时间ID',
+    student_id BIGINT NOT NULL COMMENT '学生ID',
+    semester VARCHAR(20) NOT NULL COMMENT '学期',
+    week_day TINYINT NOT NULL COMMENT '星期几(1-7)',
+    start_time TIME NOT NULL COMMENT '开始时间',
+    end_time TIME NOT NULL COMMENT '结束时间',
+    availability_type TINYINT NOT NULL COMMENT '时间类型: 1-空闲, 2-课程, 3-项目, 4-其他',
+    description VARCHAR(200) COMMENT '描述',
+    is_flexible TINYINT DEFAULT 1 COMMENT '是否灵活: 0-固定, 1-灵活',
+    priority TINYINT DEFAULT 3 COMMENT '优先级: 1-低, 2-中, 3-高',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_student_id (student_id),
+    INDEX idx_semester (semester),
+    INDEX idx_week_day (week_day),
+    INDEX idx_availability_type (availability_type),
+    FOREIGN KEY (student_id) REFERENCES users(id)
+) COMMENT '学生可用时间表';
+
+-- 项目信息表
+CREATE TABLE projects (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '项目ID',
+    project_name VARCHAR(200) NOT NULL COMMENT '项目名称',
+    project_code VARCHAR(50) UNIQUE COMMENT '项目编号',
+    project_type TINYINT NOT NULL COMMENT '项目类型: 1-科研项目, 2-竞赛项目, 3-实训项目, 4-创业项目',
+    project_category VARCHAR(100) COMMENT '项目类别',
+    teacher_id BIGINT NOT NULL COMMENT '指导教师ID',
+    co_teachers JSON COMMENT '协助教师ID列表',
+    department_id BIGINT COMMENT '所属部门ID',
+    project_description TEXT COMMENT '项目描述',
+    objectives TEXT COMMENT '项目目标',
+    expected_outcomes TEXT COMMENT '预期成果',
+    technical_requirements TEXT COMMENT '技术要求',
+    skill_requirements JSON COMMENT '技能要求',
+    team_size_min INT DEFAULT 1 COMMENT '最小团队人数',
+    team_size_max INT DEFAULT 10 COMMENT '最大团队人数',
+    difficulty_level TINYINT NOT NULL COMMENT '难度等级: 1-初级, 2-中级, 3-高级, 4-专家',
+    estimated_duration INT COMMENT '预计持续时间(天)',
+    start_date DATE COMMENT '开始日期',
+    end_date DATE COMMENT '结束日期',
+    budget DECIMAL(12,2) DEFAULT 0 COMMENT '项目预算',
+    funding_source VARCHAR(200) COMMENT '资金来源',
+    recruitment_status TINYINT DEFAULT 1 COMMENT '招募状态: 0-未开始, 1-招募中, 2-已满员, 3-已结束',
+    project_status TINYINT DEFAULT 1 COMMENT '项目状态: 1-立项, 2-进行中, 3-暂停, 4-完成, 5-终止',
+    progress_percentage DECIMAL(5,2) DEFAULT 0 COMMENT '进度百分比',
+    health_status TINYINT DEFAULT 1 COMMENT '健康状态: 1-健康, 2-风险, 3-问题',
+    quality_score DECIMAL(3,1) DEFAULT 0 COMMENT '质量评分(0-10)',
+    innovation_score DECIMAL(3,1) DEFAULT 0 COMMENT '创新性评分(0-10)',
+    practical_score DECIMAL(3,1) DEFAULT 0 COMMENT '实用性评分(0-10)',
+    final_score DECIMAL(3,1) DEFAULT 0 COMMENT '最终评分(0-10)',
+    achievements TEXT COMMENT '项目成果',
+    lessons_learned TEXT COMMENT '经验教训',
+    next_steps TEXT COMMENT '后续计划',
+    visibility TINYINT DEFAULT 1 COMMENT '可见性: 0-私有, 1-公开, 2-部门内',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_project_code (project_code),
+    INDEX idx_project_type (project_type),
+    INDEX idx_teacher_id (teacher_id),
+    INDEX idx_department_id (department_id),
+    INDEX idx_recruitment_status (recruitment_status),
+    INDEX idx_project_status (project_status),
+    INDEX idx_difficulty_level (difficulty_level),
+    INDEX idx_start_date (start_date),
+    INDEX idx_end_date (end_date),
+    FOREIGN KEY (teacher_id) REFERENCES users(id),
+    FOREIGN KEY (department_id) REFERENCES departments(id)
+) COMMENT '项目信息表';
+
+-- 项目成员表
+CREATE TABLE project_members (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '成员ID',
+    project_id BIGINT NOT NULL COMMENT '项目ID',
+    student_id BIGINT NOT NULL COMMENT '学生ID',
+    member_role TINYINT NOT NULL COMMENT '成员角色: 1-组长, 2-核心成员, 3-普通成员, 4-实习成员',
+    responsibilities TEXT COMMENT '职责描述',
+    join_date DATE NOT NULL COMMENT '加入日期',
+    leave_date DATE COMMENT '离开日期',
+    planned_workload DECIMAL(5,2) DEFAULT 0 COMMENT '计划工作量(小时/周)',
+    actual_workload DECIMAL(5,2) DEFAULT 0 COMMENT '实际工作量(小时/周)',
+    contribution_rate DECIMAL(5,2) DEFAULT 0 COMMENT '贡献度百分比',
+    performance_score DECIMAL(3,1) DEFAULT 0 COMMENT '表现评分(0-10)',
+    attendance_rate DECIMAL(5,2) DEFAULT 100 COMMENT '出勤率百分比',
+    task_completion_rate DECIMAL(5,2) DEFAULT 0 COMMENT '任务完成率百分比',
+    quality_rating TINYINT DEFAULT 3 COMMENT '质量评级: 1-差, 2-一般, 3-良好, 4-优秀, 5-卓越',
+    collaboration_rating TINYINT DEFAULT 3 COMMENT '协作评级: 1-差, 2-一般, 3-良好, 4-优秀, 5-卓越',
+    innovation_rating TINYINT DEFAULT 3 COMMENT '创新评级: 1-差, 2-一般, 3-良好, 4-优秀, 5-卓越',
+    learning_growth TEXT COMMENT '学习成长',
+    achievements TEXT COMMENT '个人成果',
+    feedback_from_teacher TEXT COMMENT '教师反馈',
+    feedback_from_peers TEXT COMMENT '同伴反馈',
+    self_reflection TEXT COMMENT '自我反思',
+    member_status TINYINT DEFAULT 1 COMMENT '成员状态: 1-活跃, 2-请假, 3-已退出, 4-被移除',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    UNIQUE KEY uk_project_student (project_id, student_id),
+    INDEX idx_project_id (project_id),
+    INDEX idx_student_id (student_id),
+    INDEX idx_member_role (member_role),
+    INDEX idx_member_status (member_status),
+    INDEX idx_join_date (join_date),
+    FOREIGN KEY (project_id) REFERENCES projects(id),
+    FOREIGN KEY (student_id) REFERENCES users(id)
+) COMMENT '项目成员表';
+
+-- 项目任务表
+CREATE TABLE project_tasks (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '任务ID',
+    project_id BIGINT NOT NULL COMMENT '项目ID',
+    parent_task_id BIGINT DEFAULT 0 COMMENT '父任务ID',
+    task_name VARCHAR(200) NOT NULL COMMENT '任务名称',
+    task_description TEXT COMMENT '任务描述',
+    task_type TINYINT NOT NULL COMMENT '任务类型: 1-需求分析, 2-设计, 3-开发, 4-测试, 5-文档, 6-其他',
+    priority TINYINT DEFAULT 3 COMMENT '优先级: 1-低, 2-中, 3-高, 4-紧急',
+    difficulty TINYINT DEFAULT 2 COMMENT '难度: 1-简单, 2-中等, 3-困难, 4-很困难',
+    estimated_hours DECIMAL(6,2) DEFAULT 0 COMMENT '预估工时',
+    actual_hours DECIMAL(6,2) DEFAULT 0 COMMENT '实际工时',
+    assignee_id BIGINT COMMENT '负责人ID',
+    reviewer_id BIGINT COMMENT '审核人ID',
+    planned_start_date DATE COMMENT '计划开始日期',
+    planned_end_date DATE COMMENT '计划结束日期',
+    actual_start_date DATE COMMENT '实际开始日期',
+    actual_end_date DATE COMMENT '实际结束日期',
+    progress_percentage DECIMAL(5,2) DEFAULT 0 COMMENT '进度百分比',
+    task_status TINYINT DEFAULT 1 COMMENT '任务状态: 1-待开始, 2-进行中, 3-待审核, 4-已完成, 5-已取消, 6-已延期',
+    quality_score DECIMAL(3,1) DEFAULT 0 COMMENT '质量评分(0-10)',
+    rework_count INT DEFAULT 0 COMMENT '返工次数',
+    rework_reason TEXT COMMENT '返工原因',
+    deliverables TEXT COMMENT '交付物',
+    acceptance_criteria TEXT COMMENT '验收标准',
+    notes TEXT COMMENT '备注',
+    tags JSON COMMENT '标签',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_project_id (project_id),
+    INDEX idx_parent_task_id (parent_task_id),
+    INDEX idx_assignee_id (assignee_id),
+    INDEX idx_reviewer_id (reviewer_id),
+    INDEX idx_task_status (task_status),
+    INDEX idx_priority (priority),
+    INDEX idx_planned_dates (planned_start_date, planned_end_date),
+    FOREIGN KEY (project_id) REFERENCES projects(id),
+    FOREIGN KEY (assignee_id) REFERENCES users(id),
+    FOREIGN KEY (reviewer_id) REFERENCES users(id)
+) COMMENT '项目任务表';
+
+-- 项目申请表
+CREATE TABLE project_applications (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '申请ID',
+    project_id BIGINT NOT NULL COMMENT '项目ID',
+    student_id BIGINT NOT NULL COMMENT '申请学生ID',
+    application_type TINYINT NOT NULL COMMENT '申请类型: 1-加入项目, 2-退出项目, 3-角色变更',
+    desired_role TINYINT COMMENT '期望角色: 1-组长, 2-核心成员, 3-普通成员',
+    motivation TEXT NOT NULL COMMENT '申请动机',
+    relevant_skills JSON COMMENT '相关技能',
+    previous_experience TEXT COMMENT '相关经验',
+    available_time_per_week DECIMAL(4,1) COMMENT '每周可投入时间(小时)',
+    expected_contribution TEXT COMMENT '预期贡献',
+    portfolio_url VARCHAR(500) COMMENT '作品集URL',
+    recommendation_letter_url VARCHAR(500) COMMENT '推荐信URL',
+    application_status TINYINT DEFAULT 1 COMMENT '申请状态: 1-待审核, 2-已通过, 3-已拒绝, 4-已撤回',
+    reviewer_id BIGINT COMMENT '审核人ID',
+    review_comment TEXT COMMENT '审核意见',
+    review_time DATETIME COMMENT '审核时间',
+    interview_required TINYINT DEFAULT 0 COMMENT '是否需要面试: 0-否, 1-是',
+    interview_time DATETIME COMMENT '面试时间',
+    interview_feedback TEXT COMMENT '面试反馈',
+    rejection_reason TEXT COMMENT '拒绝原因',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_project_id (project_id),
+    INDEX idx_student_id (student_id),
+    INDEX idx_application_status (application_status),
+    INDEX idx_reviewer_id (reviewer_id),
+    INDEX idx_created_at (created_at),
+    FOREIGN KEY (project_id) REFERENCES projects(id),
+    FOREIGN KEY (student_id) REFERENCES users(id),
+    FOREIGN KEY (reviewer_id) REFERENCES users(id)
+) COMMENT '项目申请表';
+
+-- =====================================================
+-- 6. 科研与国际化模块表结构
+-- =====================================================
+
+-- 短期交流项目表
+CREATE TABLE exchange_programs (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '项目ID',
+    program_name VARCHAR(200) NOT NULL COMMENT '项目名称',
+    program_code VARCHAR(50) UNIQUE COMMENT '项目编号',
+    program_type TINYINT NOT NULL COMMENT '项目类型: 1-学术交流, 2-实习实训, 3-文化交流, 4-研究合作',
+    partner_institution VARCHAR(200) NOT NULL COMMENT '合作机构',
+    partner_country VARCHAR(100) NOT NULL COMMENT '合作国家',
+    partner_city VARCHAR(100) COMMENT '合作城市',
+    program_duration INT NOT NULL COMMENT '项目时长(天)',
+    start_date DATE NOT NULL COMMENT '开始日期',
+    end_date DATE NOT NULL COMMENT '结束日期',
+    application_deadline DATE NOT NULL COMMENT '申请截止日期',
+    max_participants INT DEFAULT 0 COMMENT '最大参与人数',
+    current_participants INT DEFAULT 0 COMMENT '当前参与人数',
+    target_audience TINYINT NOT NULL COMMENT '目标群体: 1-本科生, 2-研究生, 3-博士生, 4-教师, 5-全部',
+    language_requirement VARCHAR(100) COMMENT '语言要求',
+    gpa_requirement DECIMAL(3,2) COMMENT 'GPA要求',
+    major_requirements JSON COMMENT '专业要求',
+    program_description TEXT COMMENT '项目描述',
+    learning_objectives TEXT COMMENT '学习目标',
+    activities TEXT COMMENT '活动安排',
+    accommodation_info TEXT COMMENT '住宿信息',
+    cost_info TEXT COMMENT '费用信息',
+    scholarship_available TINYINT DEFAULT 0 COMMENT '是否有奖学金: 0-否, 1-是',
+    scholarship_amount DECIMAL(10,2) DEFAULT 0 COMMENT '奖学金金额',
+    application_requirements TEXT COMMENT '申请要求',
+    required_documents JSON COMMENT '所需文档',
+    contact_person VARCHAR(100) COMMENT '联系人',
+    contact_email VARCHAR(100) COMMENT '联系邮箱',
+    contact_phone VARCHAR(20) COMMENT '联系电话',
+    program_status TINYINT DEFAULT 1 COMMENT '项目状态: 1-招募中, 2-已满员, 3-进行中, 4-已结束, 5-已取消',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_program_code (program_code),
+    INDEX idx_program_type (program_type),
+    INDEX idx_partner_country (partner_country),
+    INDEX idx_target_audience (target_audience),
+    INDEX idx_application_deadline (application_deadline),
+    INDEX idx_program_status (program_status),
+    INDEX idx_start_date (start_date)
+) COMMENT '短期交流项目表';
+
+-- 交流项目申请表
+CREATE TABLE exchange_applications (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '申请ID',
+    program_id BIGINT NOT NULL COMMENT '项目ID',
+    applicant_id BIGINT NOT NULL COMMENT '申请人ID',
+    application_form JSON COMMENT '申请表单数据',
+    motivation_letter_url VARCHAR(500) COMMENT '动机信URL',
+    recommendation_letters JSON COMMENT '推荐信URL列表',
+    transcript_url VARCHAR(500) COMMENT '成绩单URL',
+    language_certificate_url VARCHAR(500) COMMENT '语言证书URL',
+    passport_url VARCHAR(500) COMMENT '护照URL',
+    other_documents JSON COMMENT '其他文档URL列表',
+    current_gpa DECIMAL(3,2) COMMENT '当前GPA',
+    language_proficiency VARCHAR(100) COMMENT '语言水平',
+    previous_exchange_experience TEXT COMMENT '以往交流经验',
+    special_requirements TEXT COMMENT '特殊要求',
+    emergency_contact JSON COMMENT '紧急联系人信息',
+    application_status TINYINT DEFAULT 1 COMMENT '申请状态: 1-待审核, 2-初审通过, 3-面试通过, 4-最终录取, 5-已拒绝, 6-已撤回',
+    reviewer_id BIGINT COMMENT '审核人ID',
+    review_score DECIMAL(3,1) DEFAULT 0 COMMENT '审核评分(0-10)',
+    review_comment TEXT COMMENT '审核意见',
+    interview_required TINYINT DEFAULT 0 COMMENT '是否需要面试: 0-否, 1-是',
+    interview_time DATETIME COMMENT '面试时间',
+    interview_score DECIMAL(3,1) DEFAULT 0 COMMENT '面试评分(0-10)',
+    interview_feedback TEXT COMMENT '面试反馈',
+    final_decision TINYINT COMMENT '最终决定: 1-录取, 2-候补, 3-拒绝',
+    decision_reason TEXT COMMENT '决定原因',
+    notification_sent TINYINT DEFAULT 0 COMMENT '是否已发送通知: 0-否, 1-是',
+    acceptance_deadline DATE COMMENT '接受截止日期',
+    participant_response TINYINT COMMENT '参与者回复: 1-接受, 2-拒绝',
+    response_time DATETIME COMMENT '回复时间',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_program_id (program_id),
+    INDEX idx_applicant_id (applicant_id),
+    INDEX idx_application_status (application_status),
+    INDEX idx_reviewer_id (reviewer_id),
+    INDEX idx_created_at (created_at),
+    FOREIGN KEY (program_id) REFERENCES exchange_programs(id),
+    FOREIGN KEY (applicant_id) REFERENCES users(id),
+    FOREIGN KEY (reviewer_id) REFERENCES users(id)
+) COMMENT '交流项目申请表';
+
+-- 科研项目表
+CREATE TABLE research_projects (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '科研项目ID',
+    project_name VARCHAR(200) NOT NULL COMMENT '项目名称',
+    project_code VARCHAR(50) UNIQUE COMMENT '项目编号',
+    project_type TINYINT NOT NULL COMMENT '项目类型: 1-国家级, 2-省部级, 3-市厅级, 4-校级, 5-企业合作',
+    funding_agency VARCHAR(200) COMMENT '资助机构',
+    principal_investigator_id BIGINT NOT NULL COMMENT '项目负责人ID',
+    co_investigators JSON COMMENT '合作研究者ID列表',
+    department_id BIGINT COMMENT '所属部门ID',
+    research_field VARCHAR(100) COMMENT '研究领域',
+    keywords JSON COMMENT '关键词',
+    project_abstract TEXT COMMENT '项目摘要',
+    research_objectives TEXT COMMENT '研究目标',
+    research_methodology TEXT COMMENT '研究方法',
+    expected_outcomes TEXT COMMENT '预期成果',
+    innovation_points TEXT COMMENT '创新点',
+    total_budget DECIMAL(15,2) DEFAULT 0 COMMENT '总预算',
+    approved_budget DECIMAL(15,2) DEFAULT 0 COMMENT '批准预算',
+    used_budget DECIMAL(15,2) DEFAULT 0 COMMENT '已使用预算',
+    start_date DATE NOT NULL COMMENT '开始日期',
+    end_date DATE NOT NULL COMMENT '结束日期',
+    current_phase TINYINT DEFAULT 1 COMMENT '当前阶段: 1-申报, 2-立项, 3-执行, 4-结题, 5-验收',
+    progress_percentage DECIMAL(5,2) DEFAULT 0 COMMENT '进度百分比',
+    milestone_plan JSON COMMENT '里程碑计划',
+    risk_assessment TEXT COMMENT '风险评估',
+    quality_control_plan TEXT COMMENT '质量控制计划',
+    ethics_approval_required TINYINT DEFAULT 0 COMMENT '是否需要伦理审批: 0-否, 1-是',
+    ethics_approval_status TINYINT DEFAULT 0 COMMENT '伦理审批状态: 0-未申请, 1-审批中, 2-已通过, 3-被拒绝',
+    intellectual_property_plan TEXT COMMENT '知识产权计划',
+    collaboration_agreements JSON COMMENT '合作协议',
+    project_status TINYINT DEFAULT 1 COMMENT '项目状态: 1-申报中, 2-立项, 3-执行中, 4-暂停, 5-完成, 6-终止',
+    final_report_url VARCHAR(500) COMMENT '结题报告URL',
+    achievements JSON COMMENT '项目成果',
+    publications JSON COMMENT '发表论文',
+    patents JSON COMMENT '专利申请',
+    awards JSON COMMENT '获得奖项',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_project_code (project_code),
+    INDEX idx_project_type (project_type),
+    INDEX idx_principal_investigator_id (principal_investigator_id),
+    INDEX idx_department_id (department_id),
+    INDEX idx_research_field (research_field),
+    INDEX idx_current_phase (current_phase),
+    INDEX idx_project_status (project_status),
+    INDEX idx_start_date (start_date),
+    INDEX idx_end_date (end_date),
+    FOREIGN KEY (principal_investigator_id) REFERENCES users(id),
+    FOREIGN KEY (department_id) REFERENCES departments(id)
+) COMMENT '科研项目表';
+
+-- =====================================================
+-- 7. 系统管理表结构
+-- =====================================================
+
+-- 系统配置表
+CREATE TABLE system_configs (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '配置ID',
+    config_key VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键',
+    config_value TEXT COMMENT '配置值',
+    config_type TINYINT DEFAULT 1 COMMENT '配置类型: 1-字符串, 2-数字, 3-布尔, 4-JSON',
+    config_group VARCHAR(50) COMMENT '配置分组',
+    description TEXT COMMENT '配置描述',
+    is_system TINYINT DEFAULT 0 COMMENT '是否系统配置: 0-否, 1-是',
+    is_encrypted TINYINT DEFAULT 0 COMMENT '是否加密: 0-否, 1-是',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_config_key (config_key),
+    INDEX idx_config_group (config_group)
+) COMMENT '系统配置表';
+
+-- 文件管理表
+CREATE TABLE file_storage (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '文件ID',
+    original_name VARCHAR(255) NOT NULL COMMENT '原始文件名',
+    stored_name VARCHAR(255) NOT NULL COMMENT '存储文件名',
+    file_path VARCHAR(500) NOT NULL COMMENT '文件路径',
+    file_size BIGINT NOT NULL COMMENT '文件大小(字节)',
+    file_type VARCHAR(100) COMMENT '文件类型',
+    mime_type VARCHAR(100) COMMENT 'MIME类型',
+    file_hash VARCHAR(64) COMMENT '文件哈希值',
+    uploader_id BIGINT NOT NULL COMMENT '上传者ID',
+    business_type VARCHAR(50) COMMENT '业务类型',
+    business_id BIGINT COMMENT '业务ID',
+    access_level TINYINT DEFAULT 1 COMMENT '访问级别: 1-公开, 2-登录可见, 3-权限控制',
+    download_count INT DEFAULT 0 COMMENT '下载次数',
+    is_deleted TINYINT DEFAULT 0 COMMENT '是否已删除: 0-否, 1-是',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_stored_name (stored_name),
+    INDEX idx_uploader_id (uploader_id),
+    INDEX idx_business (business_type, business_id),
+    INDEX idx_file_hash (file_hash),
+    INDEX idx_created_at (created_at),
+    FOREIGN KEY (uploader_id) REFERENCES users(id)
+) COMMENT '文件管理表';
+
+-- 操作日志表
+CREATE TABLE operation_logs (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '日志ID',
+    user_id BIGINT COMMENT '操作用户ID',
+    username VARCHAR(50) COMMENT '用户名',
+    operation_type VARCHAR(50) NOT NULL COMMENT '操作类型',
+    operation_name VARCHAR(100) NOT NULL COMMENT '操作名称',
+    operation_method VARCHAR(10) COMMENT '请求方法',
+    operation_url VARCHAR(500) COMMENT '请求URL',
+    operation_params TEXT COMMENT '请求参数',
+    operation_result TINYINT DEFAULT 1 COMMENT '操作结果: 0-失败, 1-成功',
+    error_message TEXT COMMENT '错误信息',
+    execution_time INT DEFAULT 0 COMMENT '执行时间(毫秒)',
+    ip_address VARCHAR(45) COMMENT 'IP地址',
+    user_agent VARCHAR(500) COMMENT '用户代理',
+    browser VARCHAR(100) COMMENT '浏览器',
+    operating_system VARCHAR(100) COMMENT '操作系统',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    INDEX idx_user_id (user_id),
+    INDEX idx_operation_type (operation_type),
+    INDEX idx_operation_result (operation_result),
+    INDEX idx_created_at (created_at),
+    INDEX idx_ip_address (ip_address),
+    FOREIGN KEY (user_id) REFERENCES users(id)
+) COMMENT '操作日志表';
+
+-- 通知消息表
+CREATE TABLE notifications (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '通知ID',
+    title VARCHAR(200) NOT NULL COMMENT '通知标题',
+    content TEXT NOT NULL COMMENT '通知内容',
+    notification_type TINYINT NOT NULL COMMENT '通知类型: 1-系统通知, 2-项目通知, 3-竞赛通知, 4-审核通知',
+    sender_id BIGINT COMMENT '发送者ID',
+    receiver_id BIGINT NOT NULL COMMENT '接收者ID',
+    business_type VARCHAR(50) COMMENT '业务类型',
+    business_id BIGINT COMMENT '业务ID',
+    priority TINYINT DEFAULT 2 COMMENT '优先级: 1-低, 2-中, 3-高, 4-紧急',
+    is_read TINYINT DEFAULT 0 COMMENT '是否已读: 0-未读, 1-已读',
+    read_time DATETIME COMMENT '阅读时间',
+    is_deleted TINYINT DEFAULT 0 COMMENT '是否已删除: 0-否, 1-是',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_receiver_id (receiver_id),
+    INDEX idx_sender_id (sender_id),
+    INDEX idx_notification_type (notification_type),
+    INDEX idx_is_read (is_read),
+    INDEX idx_created_at (created_at),
+    FOREIGN KEY (sender_id) REFERENCES users(id),
+    FOREIGN KEY (receiver_id) REFERENCES users(id)
+) COMMENT '通知消息表';
+
+-- =====================================================
+-- 8. 初始化数据
+-- =====================================================
+
+-- 插入默认角色
+INSERT INTO roles (role_name, role_code, description, is_system, permissions) VALUES
+('系统管理员', 'ADMIN', '系统管理员,拥有所有权限', 1, '["*"]'),
+('教师', 'TEACHER', '教师角色,可以指导项目和竞赛', 1, '["project:manage", "competition:manage", "student:view"]'),
+('学生', 'STUDENT', '学生角色,可以参与项目和竞赛', 1, '["project:join", "competition:join", "profile:manage"]'),
+('企业用户', 'ENTERPRISE', '企业用户,可以参与产教融合', 1, '["cooperation:manage", "project:view"]'),
+('实验室管理员', 'LAB_ADMIN', '实验室管理员,管理实验室和设备', 1, '["lab:manage", "equipment:manage"]');
+
+-- 插入默认部门
+INSERT INTO departments (name, code, parent_id, level, description) VALUES
+('计算机学院', 'CS', 0, 1, '计算机科学与技术学院'),
+('电子信息学院', 'EE', 0, 1, '电子信息工程学院'),
+('机械工程学院', 'ME', 0, 1, '机械工程学院'),
+('管理学院', 'MBA', 0, 1, '工商管理学院'),
+('科研处', 'RESEARCH', 0, 1, '科学研究处'),
+('教务处', 'ACADEMIC', 0, 1, '教务处'),
+('学生处', 'STUDENT_AFFAIRS', 0, 1, '学生工作处');
+
+-- 插入系统配置
+INSERT INTO system_configs (config_key, config_value, config_type, config_group, description) VALUES
+('system.name', '科研创新与学科竞赛综合管理系统', 1, 'system', '系统名称'),
+('system.version', '1.0.0', 1, 'system', '系统版本'),
+('file.upload.max_size', '104857600', 2, 'file', '文件上传最大大小(字节)'),
+('file.upload.allowed_types', '["pdf","doc","docx","xls","xlsx","ppt","pptx","jpg","jpeg","png","gif"]', 4, 'file', '允许上传的文件类型'),
+('notification.email.enabled', 'true', 3, 'notification', '是否启用邮件通知'),
+('notification.sms.enabled', 'false', 3, 'notification', '是否启用短信通知'),
+('security.password.min_length', '8', 2, 'security', '密码最小长度'),
+('security.session.timeout', '7200', 2, 'security', '会话超时时间(秒)'),
+('competition.auto_audit', 'false', 3, 'competition', '竞赛获奖是否自动审核'),
+('project.max_members', '10', 2, 'project', '项目最大成员数');
+
+-- =====================================================
+-- 9. 视图定义
+-- =====================================================
+
+-- 用户详细信息视图
+CREATE VIEW v_user_details AS
+SELECT 
+    u.id,
+    u.username,
+    u.email,
+    u.phone,
+    u.real_name,
+    u.avatar_url,
+    u.gender,
+    u.birth_date,
+    u.status,
+    u.last_login_time,
+    d.name AS department_name,
+    d.code AS department_code,
+    GROUP_CONCAT(r.role_name) AS roles,
+    GROUP_CONCAT(r.role_code) AS role_codes,
+    u.created_at,
+    u.updated_at
+FROM users u
+LEFT JOIN departments d ON u.department_id = d.id
+LEFT JOIN user_roles ur ON u.id = ur.user_id
+LEFT JOIN roles r ON ur.role_id = r.id
+WHERE u.status = 1
+GROUP BY u.id;
+
+-- 项目统计视图
+CREATE VIEW v_project_statistics AS
+SELECT 
+    p.id,
+    p.project_name,
+    p.project_code,
+    p.project_type,
+    p.project_status,
+    p.teacher_id,
+    t.real_name AS teacher_name,
+    d.name AS department_name,
+    COUNT(pm.id) AS member_count,
+    COUNT(pt.id) AS task_count,
+    AVG(pt.progress_percentage) AS avg_task_progress,
+    p.progress_percentage,
+    p.health_status,
+    p.start_date,
+    p.end_date,
+    DATEDIFF(p.end_date, CURDATE()) AS days_remaining
+FROM projects p
+LEFT JOIN users t ON p.teacher_id = t.id
+LEFT JOIN departments d ON p.department_id = d.id
+LEFT JOIN project_members pm ON p.id = pm.project_id AND pm.member_status = 1
+LEFT JOIN project_tasks pt ON p.id = pt.project_id
+GROUP BY p.id;
+
+-- 竞赛获奖统计视图
+CREATE VIEW v_competition_award_statistics AS
+SELECT 
+    c.id AS competition_id,
+    c.name AS competition_name,
+    c.competition_type,
+    c.level,
+    c.competition_year,
+    COUNT(a.id) AS total_awards,
+    COUNT(CASE WHEN a.award_level = 1 THEN 1 END) AS special_awards,
+    COUNT(CASE WHEN a.award_level = 2 THEN 1 END) AS first_awards,
+    COUNT(CASE WHEN a.award_level = 3 THEN 1 END) AS second_awards,
+    COUNT(CASE WHEN a.award_level = 4 THEN 1 END) AS third_awards,
+    COUNT(CASE WHEN a.award_level = 5 THEN 1 END) AS excellent_awards,
+    SUM(a.points) AS total_points,
+    SUM(a.bonus_amount) AS total_bonus
+FROM competitions c
+LEFT JOIN awards a ON c.id = a.competition_id AND a.audit_status = 1
+GROUP BY c.id;
+
+-- 实验室设备使用统计视图
+CREATE VIEW v_lab_equipment_usage AS
+SELECT 
+    l.id AS lab_id,
+    l.name AS lab_name,
+    l.lab_code,
+    COUNT(e.id) AS total_equipment,
+    COUNT(CASE WHEN e.status = 1 THEN 1 END) AS normal_equipment,
+    COUNT(CASE WHEN e.status = 2 THEN 1 END) AS fault_equipment,
+    COUNT(CASE WHEN e.usage_status = 1 THEN 1 END) AS in_use_equipment,
+    COUNT(eb.id) AS total_borrowings,
+    COUNT(CASE WHEN eb.borrowing_status = 3 THEN 1 END) AS current_borrowings,
+    AVG(eb.rating) AS avg_rating
+FROM laboratories l
+LEFT JOIN equipment e ON l.id = e.lab_id
+LEFT JOIN equipment_borrowings eb ON e.id = eb.equipment_id
+GROUP BY l.id;
+
+-- =====================================================
+-- 10. 存储过程
+-- =====================================================
+
+DELIMITER //
+
+-- 自动计算项目进度的存储过程
+CREATE PROCEDURE UpdateProjectProgress(IN project_id BIGINT)
+BEGIN
+    DECLARE total_tasks INT DEFAULT 0;
+    DECLARE completed_tasks INT DEFAULT 0;
+    DECLARE progress_percentage DECIMAL(5,2) DEFAULT 0;
+    
+    -- 计算任务总数和完成数
+    SELECT COUNT(*), COUNT(CASE WHEN task_status = 4 THEN 1 END)
+    INTO total_tasks, completed_tasks
+    FROM project_tasks 
+    WHERE project_id = project_id;
+    
+    -- 计算进度百分比
+    IF total_tasks > 0 THEN
+        SET progress_percentage = (completed_tasks / total_tasks) * 100;
+    END IF;
+    
+    -- 更新项目进度
+    UPDATE projects 
+    SET progress_percentage = progress_percentage,
+        updated_at = CURRENT_TIMESTAMP
+    WHERE id = project_id;
+END //
+
+-- 发送通知的存储过程
+CREATE PROCEDURE SendNotification(
+    IN p_title VARCHAR(200),
+    IN p_content TEXT,
+    IN p_notification_type TINYINT,
+    IN p_sender_id BIGINT,
+    IN p_receiver_id BIGINT,
+    IN p_business_type VARCHAR(50),
+    IN p_business_id BIGINT,
+    IN p_priority TINYINT
+)
+BEGIN
+    INSERT INTO notifications (
+        title, content, notification_type, sender_id, receiver_id,
+        business_type, business_id, priority
+    ) VALUES (
+        p_title, p_content, p_notification_type, p_sender_id, p_receiver_id,
+        p_business_type, p_business_id, p_priority
+    );
+END //
+
+DELIMITER ;
+
+-- =====================================================
+-- 11. 触发器
+-- =====================================================
+
+-- 项目成员变更时更新项目统计
+DELIMITER //
+CREATE TRIGGER tr_project_member_update
+AFTER INSERT ON project_members
+FOR EACH ROW
+BEGIN
+    UPDATE projects 
+    SET updated_at = CURRENT_TIMESTAMP
+    WHERE id = NEW.project_id;
+END //
+
+-- 任务状态变更时自动更新项目进度
+CREATE TRIGGER tr_task_status_update
+AFTER UPDATE ON project_tasks
+FOR EACH ROW
+BEGIN
+    IF OLD.task_status != NEW.task_status THEN
+        CALL UpdateProjectProgress(NEW.project_id);
+    END IF;
+END //
+
+-- 设备借用状态变更时更新设备状态
+CREATE TRIGGER tr_equipment_borrowing_update
+AFTER UPDATE ON equipment_borrowings
+FOR EACH ROW
+BEGIN
+    IF OLD.borrowing_status != NEW.borrowing_status THEN
+        IF NEW.borrowing_status = 3 THEN -- 使用中
+            UPDATE equipment SET usage_status = 1 WHERE id = NEW.equipment_id;
+        ELSEIF NEW.borrowing_status = 4 THEN -- 已归还
+            UPDATE equipment SET usage_status = 0 WHERE id = NEW.equipment_id;
+        END IF;
+    END IF;
+END //
+
+DELIMITER ;
+
+-- =====================================================
+-- 12. 索引优化建议
+-- =====================================================
+
+-- 复合索引优化
+CREATE INDEX idx_awards_competition_level_date ON awards(competition_id, award_level, award_date);
+CREATE INDEX idx_projects_status_teacher_date ON projects(project_status, teacher_id, start_date);
+CREATE INDEX idx_equipment_lab_status_type ON equipment(lab_id, status, equipment_type);
+CREATE INDEX idx_borrowings_equipment_status_date ON equipment_borrowings(equipment_id, borrowing_status, planned_start_time);
+CREATE INDEX idx_tasks_project_status_assignee ON project_tasks(project_id, task_status, assignee_id);
+CREATE INDEX idx_notifications_receiver_read_type ON notifications(receiver_id, is_read, notification_type);
+
+-- =====================================================
+-- 数据库设计文档完成
+-- 版本: v1.0
+-- 最后更新: 2024年
+-- =====================================================

+ 179 - 0
系统架构图.svg

@@ -0,0 +1,179 @@
+<svg width="1200" height="800" xmlns="http://www.w3.org/2000/svg">
+  <defs>
+    <style>
+      .title { font-family: Arial, sans-serif; font-size: 24px; font-weight: bold; fill: #2c3e50; }
+      .module-title { font-family: Arial, sans-serif; font-size: 14px; font-weight: bold; fill: #34495e; }
+      .module-text { font-family: Arial, sans-serif; font-size: 12px; fill: #7f8c8d; }
+      .layer-title { font-family: Arial, sans-serif; font-size: 16px; font-weight: bold; fill: #2980b9; }
+      .frontend { fill: #3498db; stroke: #2980b9; stroke-width: 2; }
+      .gateway { fill: #e74c3c; stroke: #c0392b; stroke-width: 2; }
+      .service { fill: #2ecc71; stroke: #27ae60; stroke-width: 2; }
+      .data { fill: #f39c12; stroke: #e67e22; stroke-width: 2; }
+      .arrow { stroke: #34495e; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
+    </style>
+    <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
+      <polygon points="0 0, 10 3.5, 0 7" fill="#34495e" />
+    </marker>
+  </defs>
+  
+  <!-- 标题 -->
+  <text x="600" y="30" text-anchor="middle" class="title">科研创新与学科竞赛综合管理系统架构图</text>
+  
+  <!-- 前端层 -->
+  <text x="50" y="80" class="layer-title">前端层 (Frontend Layer)</text>
+  <rect x="50" y="90" width="200" height="80" class="frontend" rx="5"/>
+  <text x="150" y="110" text-anchor="middle" class="module-title">Web端</text>
+  <text x="150" y="125" text-anchor="middle" class="module-text">Vue3 + Element Plus</text>
+  <text x="150" y="140" text-anchor="middle" class="module-text">TypeScript</text>
+  <text x="150" y="155" text-anchor="middle" class="module-text">Pinia状态管理</text>
+  
+  <rect x="300" y="90" width="200" height="80" class="frontend" rx="5"/>
+  <text x="400" y="110" text-anchor="middle" class="module-title">移动端</text>
+  <text x="400" y="125" text-anchor="middle" class="module-text">H5响应式</text>
+  <text x="400" y="140" text-anchor="middle" class="module-text">PWA支持</text>
+  <text x="400" y="155" text-anchor="middle" class="module-text">移动端优化</text>
+  
+  <rect x="550" y="90" width="200" height="80" class="frontend" rx="5"/>
+  <text x="650" y="110" text-anchor="middle" class="module-title">管理后台</text>
+  <text x="650" y="125" text-anchor="middle" class="module-text">Vue3 + Element Plus</text>
+  <text x="650" y="140" text-anchor="middle" class="module-text">权限管理</text>
+  <text x="650" y="155" text-anchor="middle" class="module-text">数据可视化</text>
+  
+  <!-- API网关 -->
+  <text x="50" y="220" class="layer-title">API网关层 (Gateway Layer)</text>
+  <rect x="300" y="230" width="300" height="60" class="gateway" rx="5"/>
+  <text x="450" y="250" text-anchor="middle" class="module-title">API Gateway</text>
+  <text x="450" y="265" text-anchor="middle" class="module-text">统一认证 | 限流控制 | 路由转发 | 监控日志</text>
+  <text x="450" y="280" text-anchor="middle" class="module-text">OAuth2.0 + JWT</text>
+  
+  <!-- 服务层 -->
+  <text x="50" y="340" class="layer-title">服务层 (Service Layer)</text>
+  
+  <!-- 产教融合服务 -->
+  <rect x="50" y="350" width="180" height="120" class="service" rx="5"/>
+  <text x="140" y="370" text-anchor="middle" class="module-title">产教融合服务</text>
+  <text x="140" y="390" text-anchor="middle" class="module-text">• 智能资源匹配</text>
+  <text x="140" y="405" text-anchor="middle" class="module-text">• 成果转化加速器</text>
+  <text x="140" y="420" text-anchor="middle" class="module-text">• 项目全生命周期</text>
+  <text x="140" y="435" text-anchor="middle" class="module-text">• AI推荐算法</text>
+  <text x="140" y="450" text-anchor="middle" class="module-text">• 热力图看板</text>
+  
+  <!-- 学科竞赛服务 -->
+  <rect x="250" y="350" width="180" height="120" class="service" rx="5"/>
+  <text x="340" y="370" text-anchor="middle" class="module-title">学科竞赛服务</text>
+  <text x="340" y="390" text-anchor="middle" class="module-text">• 获奖信息管理</text>
+  <text x="340" y="405" text-anchor="middle" class="module-text">• 智能查询系统</text>
+  <text x="340" y="420" text-anchor="middle" class="module-text">• 个人空间模块</text>
+  <text x="340" y="435" text-anchor="middle" class="module-text">• 双状态审核</text>
+  <text x="340" y="450" text-anchor="middle" class="module-text">• 数据导出</text>
+  
+  <!-- 实验室服务 -->
+  <rect x="450" y="350" width="180" height="120" class="service" rx="5"/>
+  <text x="540" y="370" text-anchor="middle" class="module-title">实验室服务</text>
+  <text x="540" y="390" text-anchor="middle" class="module-text">• 设备借用管理</text>
+  <text x="540" y="405" text-anchor="middle" class="module-text">• 远程设备控制</text>
+  <text x="540" y="420" text-anchor="middle" class="module-text">• 状态监控</text>
+  <text x="540" y="435" text-anchor="middle" class="module-text">• 提醒机制</text>
+  <text x="540" y="450" text-anchor="middle" class="module-text">• 使用记录</text>
+  
+  <!-- 工作室服务 -->
+  <rect x="650" y="350" width="180" height="120" class="service" rx="5"/>
+  <text x="740" y="370" text-anchor="middle" class="module-title">工作室服务</text>
+  <text x="740" y="390" text-anchor="middle" class="module-text">• 学生能力信息化</text>
+  <text x="740" y="405" text-anchor="middle" class="module-text">• 项目可视化</text>
+  <text x="740" y="420" text-anchor="middle" class="module-text">• 智能匹配</text>
+  <text x="740" y="435" text-anchor="middle" class="module-text">• 遴选管理</text>
+  <text x="740" y="450" text-anchor="middle" class="module-text">• 进度追踪</text>
+  
+  <!-- 科研国际化服务 -->
+  <rect x="850" y="350" width="180" height="120" class="service" rx="5"/>
+  <text x="940" y="370" text-anchor="middle" class="module-title">科研国际化服务</text>
+  <text x="940" y="390" text-anchor="middle" class="module-text">• 短期交流项目</text>
+  <text x="940" y="405" text-anchor="middle" class="module-text">• 快速报名系统</text>
+  <text x="940" y="420" text-anchor="middle" class="module-text">• 科研项目管理</text>
+  <text x="940" y="435" text-anchor="middle" class="module-text">• 国际合作平台</text>
+  <text x="940" y="450" text-anchor="middle" class="module-text">• 成果展示</text>
+  
+  <!-- 数据层 -->
+  <text x="50" y="530" class="layer-title">数据层 (Data Layer)</text>
+  
+  <!-- MySQL数据库 -->
+  <rect x="100" y="540" width="200" height="100" class="data" rx="5"/>
+  <text x="200" y="560" text-anchor="middle" class="module-title">MySQL 8.0</text>
+  <text x="200" y="580" text-anchor="middle" class="module-text">• 用户权限数据</text>
+  <text x="200" y="595" text-anchor="middle" class="module-text">• 业务核心数据</text>
+  <text x="200" y="610" text-anchor="middle" class="module-text">• 主从复制</text>
+  <text x="200" y="625" text-anchor="middle" class="module-text">• 读写分离</text>
+  
+  <!-- Redis缓存 -->
+  <rect x="350" y="540" width="200" height="100" class="data" rx="5"/>
+  <text x="450" y="560" text-anchor="middle" class="module-title">Redis 6.x</text>
+  <text x="450" y="580" text-anchor="middle" class="module-text">• 会话缓存</text>
+  <text x="450" y="595" text-anchor="middle" class="module-text">• 热点数据缓存</text>
+  <text x="450" y="610" text-anchor="middle" class="module-text">• 分布式锁</text>
+  <text x="450" y="625" text-anchor="middle" class="module-text">• 消息队列</text>
+  
+  <!-- 文件存储 -->
+  <rect x="600" y="540" width="200" height="100" class="data" rx="5"/>
+  <text x="700" y="560" text-anchor="middle" class="module-title">MinIO/OSS</text>
+  <text x="700" y="580" text-anchor="middle" class="module-text">• 证书文件存储</text>
+  <text x="700" y="595" text-anchor="middle" class="module-text">• 项目文档存储</text>
+  <text x="700" y="610" text-anchor="middle" class="module-text">• 多媒体资源</text>
+  <text x="700" y="625" text-anchor="middle" class="module-text">• CDN加速</text>
+  
+  <!-- 监控日志 -->
+  <rect x="850" y="540" width="200" height="100" class="data" rx="5"/>
+  <text x="950" y="560" text-anchor="middle" class="module-title">监控日志</text>
+  <text x="950" y="580" text-anchor="middle" class="module-text">• Prometheus监控</text>
+  <text x="950" y="595" text-anchor="middle" class="module-text">• Grafana可视化</text>
+  <text x="950" y="610" text-anchor="middle" class="module-text">• ELK日志分析</text>
+  <text x="950" y="625" text-anchor="middle" class="module-text">• 告警通知</text>
+  
+  <!-- 连接线 -->
+  <!-- 前端到网关 -->
+  <line x1="150" y1="170" x2="400" y2="230" class="arrow"/>
+  <line x1="400" y1="170" x2="450" y2="230" class="arrow"/>
+  <line x1="650" y1="170" x2="500" y2="230" class="arrow"/>
+  
+  <!-- 网关到服务 -->
+  <line x1="350" y1="290" x2="140" y2="350" class="arrow"/>
+  <line x1="400" y1="290" x2="340" y2="350" class="arrow"/>
+  <line x1="450" y1="290" x2="540" y2="350" class="arrow"/>
+  <line x1="500" y1="290" x2="740" y2="350" class="arrow"/>
+  <line x1="550" y1="290" x2="940" y2="350" class="arrow"/>
+  
+  <!-- 服务到数据 -->
+  <line x1="140" y1="470" x2="200" y2="540" class="arrow"/>
+  <line x1="340" y1="470" x2="450" y2="540" class="arrow"/>
+  <line x1="540" y1="470" x2="450" y2="540" class="arrow"/>
+  <line x1="740" y1="470" x2="700" y2="540" class="arrow"/>
+  <line x1="940" y1="470" x2="950" y2="540" class="arrow"/>
+  
+  <!-- 数据层内部连接 -->
+  <line x1="300" y1="590" x2="350" y2="590" class="arrow"/>
+  <line x1="550" y1="590" x2="600" y2="590" class="arrow"/>
+  <line x1="800" y1="590" x2="850" y2="590" class="arrow"/>
+  
+  <!-- 用户角色说明 -->
+  <text x="50" y="700" class="layer-title">用户角色体系</text>
+  
+  <rect x="50" y="710" width="150" height="60" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" rx="3"/>
+  <text x="125" y="730" text-anchor="middle" class="module-title">管理员</text>
+  <text x="125" y="745" text-anchor="middle" class="module-text">系统维护</text>
+  <text x="125" y="760" text-anchor="middle" class="module-text">权限分配</text>
+  
+  <rect x="220" y="710" width="150" height="60" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" rx="3"/>
+  <text x="295" y="730" text-anchor="middle" class="module-title">教师</text>
+  <text x="295" y="745" text-anchor="middle" class="module-text">竞赛指导</text>
+  <text x="295" y="760" text-anchor="middle" class="module-text">项目管理</text>
+  
+  <rect x="390" y="710" width="150" height="60" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" rx="3"/>
+  <text x="465" y="730" text-anchor="middle" class="module-title">学生</text>
+  <text x="465" y="745" text-anchor="middle" class="module-text">信息填报</text>
+  <text x="465" y="760" text-anchor="middle" class="module-text">项目参与</text>
+  
+  <rect x="560" y="710" width="150" height="60" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" rx="3"/>
+  <text x="635" y="730" text-anchor="middle" class="module-title">企业用户</text>
+  <text x="635" y="745" text-anchor="middle" class="module-text">产学研合作</text>
+  <text x="635" y="760" text-anchor="middle" class="module-text">成果转化</text>
+</svg>