commit 492d839e9be7655237866bf943adb75ecbdf8c39 Author: lihanqi <13868246742@163.com> Date: Thu Jan 15 18:16:50 2026 +0800 初始提交:彩票推测系统前端代码 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/.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 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..87e462f --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,195 @@ +# 部署说明文档 + +## 🚀 打包部署流程 + +### 1. 打包前准备 + +确保已安装依赖: +```bash +npm install +``` + +### 2. 执行打包 + +```bash +npm run build +``` + +打包完成后,会在项目根目录生成 `dist` 文件夹。 + +### 3. 缓存控制策略 + +本项目已配置完善的缓存控制策略,避免浏览器缓存导致更新不生效: + +#### ✅ 已配置的缓存方案 + +1. **文件名 Hash 化**(`vite.config.js` 已配置) + - 所有 JS、CSS、图片等资源文件名都会带上 hash 值 + - 例如:`index.a1b2c3d4.js`、`style.e5f6g7h8.css` + - 每次构建后,修改过的文件 hash 会变化,自动避免缓存 + +2. **HTML 文件不缓存** + - `index.html` 设置为不缓存,每次都会获取最新版本 + - 通过服务器配置实现(见下方) + +#### 📝 服务器配置 + +##### Apache 服务器(使用 .htaccess) + +项目已包含 `public/.htaccess` 文件,打包后会自动复制到 `dist` 目录。 + +##### Nginx 服务器 + +参考项目根目录的 `nginx.conf.example` 文件,配置说明: + +```nginx +# HTML 文件不缓存 +location / { + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-cache, no-store, must-revalidate"; +} + +# 静态资源长期缓存 +location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; +} +``` + +### 4. 部署步骤 + +#### 方法一:手动部署 + +1. 将 `dist` 目录下的所有文件上传到服务器 +2. 配置服务器(Apache 或 Nginx) +3. 重启服务器 + +#### 方法二:使用 FTP/SFTP + +```bash +# 上传 dist 目录到服务器 +scp -r dist/* user@your-server:/var/www/html/ +``` + +#### 方法三:使用 Docker(可选) + +创建 `Dockerfile`: +```dockerfile +FROM nginx:alpine +COPY dist /usr/share/nginx/html +COPY nginx.conf.example /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] +``` + +### 5. 更新部署注意事项 + +#### ⚠️ 每次更新部署时: + +1. **清理旧文件** + ```bash + # 删除服务器上的旧文件 + rm -rf /var/www/html/* + ``` + +2. **上传新文件** + ```bash + # 上传新的 dist 文件 + scp -r dist/* user@your-server:/var/www/html/ + ``` + +3. **清理服务器缓存**(如果使用了缓存服务器) + ```bash + # Nginx + nginx -s reload + + # Apache + systemctl reload apache2 + ``` + +4. **通知用户清理浏览器缓存**(可选) + - 可以在系统中添加版本提示 + - 或者使用 Service Worker 强制更新 + +### 6. 验证部署 + +部署完成后,验证步骤: + +1. **清除浏览器缓存** + - Chrome: `Ctrl + Shift + Delete` 或 `Cmd + Shift + Delete` + - 或使用隐身模式访问 + +2. **检查文件版本** + - 打开浏览器开发者工具(F12) + - 查看 Network 标签 + - 确认 JS/CSS 文件名带有新的 hash 值 + +3. **检查 HTML 缓存** + - 查看 `index.html` 的响应头 + - 确认 `Cache-Control: no-cache` + +### 7. 常见问题 + +#### Q1: 用户反馈看到的还是旧版本? + +**解决方案:** +1. 确认服务器配置正确(.htaccess 或 nginx 配置) +2. 清理 CDN 缓存(如果使用了 CDN) +3. 通知用户强制刷新(Ctrl + F5 或 Cmd + Shift + R) + +#### Q2: 静态资源 404 错误? + +**解决方案:** +1. 检查资源路径配置 +2. 确认 `vite.config.js` 中的 `base` 配置正确 +3. 检查服务器的静态文件路径 + +#### Q3: SPA 路由刷新 404? + +**解决方案:** +- Apache: 确保 `.htaccess` 中的 rewrite 规则生效 +- Nginx: 确保配置了 `try_files $uri $uri/ /index.html;` + +### 8. 自动化部署(可选) + +#### 使用 GitHub Actions + +创建 `.github/workflows/deploy.yml`: + +```yaml +name: Deploy + +on: + push: + branches: [ main ] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install dependencies + run: npm install + - name: Build + run: npm run build + - name: Deploy to server + uses: easingthemes/ssh-deploy@main + env: + SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }} + REMOTE_HOST: ${{ secrets.REMOTE_HOST }} + REMOTE_USER: ${{ secrets.REMOTE_USER }} + TARGET: /var/www/html/ +``` + +### 9. 性能优化建议 + +1. **启用 Gzip/Brotli 压缩** +2. **使用 CDN 加速静态资源** +3. **配置 HTTP/2** +4. **启用 HTTPS** + +## 📞 技术支持 + +如有部署问题,请联系技术团队。 + + diff --git a/Home步骤 - 副本.md b/Home步骤 - 副本.md new file mode 100644 index 0000000..15b4343 --- /dev/null +++ b/Home步骤 - 副本.md @@ -0,0 +1,155 @@ +现在大乐透也开放了,预测流程由双色球的5步(推测准备、推测首球、推测随球、推测蓝球、确认结果)变为6步(推测准备、推测前区首球、推测前区随球、推测后区首球、推测前区随球、确认结果)。推测准备(第一步)这一页和双色球的流程一样,只不过是上期红球号码,变为了上期前区号码,上期蓝球号码,变成了上次后区号码,仅10期开奖号码是通过GET http://localhost:8123/api/dlt-draw/recent-10-draw-ids这个接口获取,根据期号获取中奖号码的接口路径是GET http://localhost:8123/api/dlt-draw/draw/{{drawId}}/numbers,响应示例为 + +{ + "code": 0, + "success": true, + "message": "操作成功", + "data": [ + 1, + 7, + 9, + 16, + 30, + 2, + 5 + ] +} + +然后点击继续,调用这个接口POST http://localhost:8123/api/dlt/ball-analysis/predict-first-ball,入参为 + +``` +public class FirstBallPredictionRequest { + private String level; high/middle/low:高位/中位/低位 + private List redBalls; 5个前区号码 + private List blueBalls; 2个后期号码 +} +``` + +响应示例为 + +``` +{ + "code": 0, + "success": true, + "message": "操作成功", + "data": [ + 29, + 20, + 22, + 33, + 35, + 1, + 2, + 3, + 4, + 5, + 11, + 30 + ] +} +``` + +然后进入第二步,解析出12个球号作为推荐的12个前区球号, + +第二步的布局和双色球的的一样,先选择1个球号,在选择2个球号。然后拿上一步选择的位(high/middle/low)+ 3个号码(第二步选择的) + 5个号码(第一步的5个上期前区) + 2个号码(第一步的2个上期后区)去调用接口:POST http://localhost:8123/api/dlt/ball-analysis/predict-follower-ball + +入参为: + +``` +@Data +public class FollowerBallPredictionRequest { + private String level; + private List wellRegardedBalls; + private List previousFrontBalls; + private List previousBackBalls; +} +``` + +响应示例为 + +``` +{ + "code": 0, + "success": true, + "message": "操作成功", + "data": [ + 1, + 2, + 3, + 4, + 5, + 6, + 35, + 29 + ] +} +``` + +然后进入第三步,解析出8个球号作为推荐的8个前区球号, + +先选择4个前区球号,再选择2个后区球号。然后拿第一步选择的位(high/middle/low)+ 5个号码(第二步选择的首球球号+这一步选择的4个球号)+ 5个号码(第一步选择5个上期前区球号) + 2个号码(第一步选择的2个上期后区球号)+ 2个号码(这一步选择的2个下期后区)。去调用接口:POST http://localhost:8123/api/dlt/ball-analysis/predict-back-ball + +入参为 + +``` +{ + "level": "high", + "nextFrontBalls": [1,2,3,4,5], + "previousFrontBalls": [1,2,3,4,5], + "previousBackBalls": [6,7], + "nextBackBalls": [8,9] +} +``` + +响应为 + +``` +{ + "code": 0, + "success": true, + "message": "操作成功", + "data": [ + 1, + 2, + 9, + 7 + ] +} +``` + +然后进入第四步,解析出4个球号作为推荐的4个后区球号, + +选择一个推荐的后区首球。然后拿第一步选择的位(high/middle/low)+ 1个号码(这一步选择的一个后区首球)+ 5个号码(第二步选择的前区首球球号+第三步选择的4个前区随球)+ 5个号码(第一步选择5个上期前区球号) + 2个号码(第一步选择的2个上期后区球号)。去调用接口:POST http://localhost:8123/api/dlt/ball-analysis/predict-follow-back-ball + +入参 + +``` +{ + "level": "high", + "backFirstBall": 6, + "nextFrontBalls": [1,2,3,4,5], + "previousFrontBalls": [1,2,3,4,5], + "previousBackBalls": [6,7] +} +``` + +响应示例为 + +``` +{ + "code": 0, + "success": true, + "message": "操作成功", + "data": [ + 1, + 3, + 5 + ] +} +``` + +然后进入第五步,解析出3个球号作为推荐的3个后区球号, + +选择一个推荐的后区随球,点击继续,进入下一步。 + +第六步:确认推测,这一步跟双色球的第五步一样。 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..645c982 --- /dev/null +++ b/README.md @@ -0,0 +1,134 @@ +# 双色球智能推测系统 + +这是一个基于Vue 3开发的双色球智能推测前端应用,提供智能算法分析、开奖信息查询等功能。 + +## 功能特性 + +### 🎯 主要功能 +- **智能推测**: 5步推测流程,包含首球算法、跟随球分析、蓝球分析 +- **开奖查询**: 支持期号查询和日期范围查询 +- **用户中心**: 个人信息管理和会员权益展示 + +### 📱 页面结构 +1. **首页** - 智能推测功能 + - 选择算法级别(高位/中位/低位) + - 输入上期开奖号码 + - 首球算法分析 + - 跟随球分析 + - 蓝球分析 + - 最终号码确认 + +2. **开奖信息** - 查询历史开奖 + - 期号精确查询 + - 日期范围查询 + - 近期开奖记录展示 + +3. **我的页面** - 用户信息管理 + - 用户信息展示 + - 会员权益介绍 + - 功能菜单导航 + - 使用统计数据 + +## 技术栈 + +- **框架**: Vue 3 +- **路由**: Vue Router 4 +- **HTTP客户端**: Axios +- **构建工具**: Vite +- **CSS**: 原生CSS + Scoped Styles + +## 后端接口 + +应用连接到SpringBoot后端服务,接口前缀:`http://localhost:8123/api` + +### 主要接口 +- `GET /ball-analysis/recent-draws` - 获取近期开奖信息 +- `GET /ball-analysis/query-draws` - 按日期范围查询 +- `GET /ball-analysis/draw/{drawId}` - 根据期号查询 +- `POST /ball-analysis/analyze` - 首球算法分析 +- `POST /ball-analysis/fallow` - 跟随球分析 +- `POST /ball-analysis/blue-ball` - 蓝球分析 +- `POST /ball-analysis/create-predict` - 创建推测记录 + +## 快速开始 + +### 安装依赖 +```bash +npm install +``` + +### 开发环境运行 +```bash +npm run dev +``` + +### 构建生产版本 +```bash +npm run build +``` + +### 预览生产构建 +```bash +npm run preview +``` + +## 项目结构 + +``` +src/ +├── api/ +│ └── index.js # API接口封装 +├── components/ # 公共组件 +├── router/ +│ └── index.js # 路由配置 +├── views/ +│ ├── Home.vue # 主页 - 智能推测 +│ ├── LotteryInfo.vue # 开奖信息页 +│ └── Profile.vue # 我的页面 +├── App.vue # 根组件 +└── main.js # 入口文件 +``` + +## 使用说明 + +### 推测流程 + +1. **第一步**: 选择推测级别(高位/中位/低位),输入开奖期号、日期和上期中奖号码 +2. **第二步**: 查看首球算法推荐的11个红球号码,选择1个首球和2个随球 +3. **第三步**: 查看跟随球分析推荐的8个号码,组合完整的6个红球 +4. **第四步**: 选择2个蓝球进行分析,获得4个推荐蓝球,选择最终蓝球 +5. **第五步**: 确认推测号码并提交 + +### 开奖查询 + +- **期号查询**: 输入具体期号(如2025056)进行精确查询 +- **日期查询**: 设置日期范围进行批量查询 +- **历史记录**: 自动加载最近15期开奖信息 + +## 注意事项 + +⚠️ **重要提醒**: 彩票开奖系统随机,本应用提供的推测结果仅供参考,不保证中奖。投注需谨慎,请理性购彩。 + +## 浏览器支持 + +- Chrome >= 87 +- Firefox >= 78 +- Safari >= 14 +- Edge >= 88 + +## 开发指南 + +### 代码规范 +- 使用ES6+语法 +- 组件采用SFC(Single File Component)格式 +- CSS使用scoped样式避免污染 +- 遵循Vue 3 Composition API最佳实践 + +### API集成 +所有API调用都封装在`src/api/index.js`中,统一处理请求和响应。 + +### 样式规范 +- 采用移动端优先的响应式设计 +- 主色调:红色(#e53e3e),蓝色(#3182ce) +- 遵循Material Design设计原则 + diff --git a/index.html b/index.html new file mode 100644 index 0000000..599987d --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + 精彩数据 + + +
+ + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/nginx.conf.example b/nginx.conf.example new file mode 100644 index 0000000..8f21650 --- /dev/null +++ b/nginx.conf.example @@ -0,0 +1,41 @@ +# Nginx 服务器配置示例 +# 使用方法:将此配置添加到你的 Nginx 配置文件中 + +server { + listen 80; + server_name your-domain.com; # 修改为你的域名 + root /path/to/lottery-app/dist; # 修改为你的项目路径 + index index.html; + + # Gzip 压缩配置 + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss image/svg+xml; + + # HTML 文件不缓存 + location / { + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-cache, no-store, must-revalidate"; + add_header Pragma "no-cache"; + add_header Expires "0"; + } + + # 静态资源长期缓存(带hash的JS、CSS、图片等) + location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + access_log off; + } + + # 代理 API 请求(如果需要) + location /api/ { + proxy_pass http://localhost:8123; # 修改为你的后端地址 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f6052fa --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3760 @@ +{ + "name": "lottery-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lottery-app", + "version": "0.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "axios": "^1.10.0", + "echarts": "^6.0.0", + "element-plus": "^2.11.8", + "qrcode": "^1.5.4", + "vue": "^3.5.13", + "vue-router": "^4.5.1", + "vue-toastification": "^2.0.0-rc.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.3", + "terser": "^5.44.0", + "vite": "^6.2.4", + "vite-plugin-vue-devtools": "^7.7.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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.27.5", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.4", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "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/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "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-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@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.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.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.27.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", + "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", + "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.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@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.27.4", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+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/@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.5", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.2.tgz", + "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.2", + "@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/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz", + "integrity": "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz", + "integrity": "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz", + "integrity": "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz", + "integrity": "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz", + "integrity": "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz", + "integrity": "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz", + "integrity": "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz", + "integrity": "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz", + "integrity": "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz", + "integrity": "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz", + "integrity": "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz", + "integrity": "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz", + "integrity": "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz", + "integrity": "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz", + "integrity": "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz", + "integrity": "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz", + "integrity": "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz", + "integrity": "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz", + "integrity": "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz", + "integrity": "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==", + "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/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "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/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/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz", + "integrity": "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz", + "integrity": "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", + "@vue/babel-helper-vue-transform-on": "1.4.0", + "@vue/babel-plugin-resolve-type": "1.4.0", + "@vue/shared": "^3.5.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.4.0.tgz", + "integrity": "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/parser": "^7.26.9", + "@vue/compiler-sfc": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.16.tgz", + "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.16", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", + "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.16", + "@vue/shared": "3.5.16" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", + "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.2", + "@vue/compiler-core": "3.5.16", + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.3", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", + "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.16", + "@vue/shared": "3.5.16" + } + }, + "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/devtools-core": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-7.7.6.tgz", + "integrity": "sha512-ghVX3zjKPtSHu94Xs03giRIeIWlb9M+gvDRVpIZ/cRIxKHdW6HE/sm1PT3rUYS3aV92CazirT93ne+7IOvGUWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.6", + "@vue/devtools-shared": "^7.7.6", + "mitt": "^3.0.1", + "nanoid": "^5.1.0", + "pathe": "^2.0.3", + "vite-hot-client": "^2.0.4" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "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-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.16.tgz", + "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.16" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.16.tgz", + "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.16", + "@vue/shared": "3.5.16" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", + "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.16", + "@vue/runtime-core": "3.5.16", + "@vue/shared": "3.5.16", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.16.tgz", + "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16" + }, + "peerDependencies": { + "vue": "3.5.16" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.16.tgz", + "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", + "license": "MIT" + }, + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/birpc": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.4.0.tgz", + "integrity": "sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "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": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "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/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001723", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", + "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", + "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/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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==", + "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==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "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==", + "dev": true, + "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/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.19", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.167", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", + "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/element-plus": { + "version": "2.11.8", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.8.tgz", + "integrity": "sha512-2wzSj2uubFU1f0t/gHkkE1d09mUgV18fSZX5excw3Ar6hyWcxph4E57U8dgYLDt7HwkKYv1BiqPyBdy0WqWlOA==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.2", + "@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.18", + "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/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "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": "0.1.5", + "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "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/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/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/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "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/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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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-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==", + "dev": true, + "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/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/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/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/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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.17", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "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/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/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "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-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/open": { + "version": "10.1.2", + "resolved": "https://registry.npmmirror.com/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "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-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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==", + "dev": true, + "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": "4.0.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss": { + "version": "8.5.5", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.5.tgz", + "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==", + "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/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.43.0", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.43.0.tgz", + "integrity": "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.43.0", + "@rollup/rollup-android-arm64": "4.43.0", + "@rollup/rollup-darwin-arm64": "4.43.0", + "@rollup/rollup-darwin-x64": "4.43.0", + "@rollup/rollup-freebsd-arm64": "4.43.0", + "@rollup/rollup-freebsd-x64": "4.43.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.43.0", + "@rollup/rollup-linux-arm-musleabihf": "4.43.0", + "@rollup/rollup-linux-arm64-gnu": "4.43.0", + "@rollup/rollup-linux-arm64-musl": "4.43.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.43.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-musl": "4.43.0", + "@rollup/rollup-linux-s390x-gnu": "4.43.0", + "@rollup/rollup-linux-x64-gnu": "4.43.0", + "@rollup/rollup-linux-x64-musl": "4.43.0", + "@rollup/rollup-win32-arm64-msvc": "4.43.0", + "@rollup/rollup-win32-ia32-msvc": "4.43.0", + "@rollup/rollup-win32-x64-msvc": "4.43.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "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/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.1", + "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.1.tgz", + "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", + "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": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "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/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "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/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "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-hot-client": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-2.0.4.tgz", + "integrity": "sha512-W9LOGAyGMrbGArYJN4LBCdOC5+Zwh7dHvOHC0KmGKkJhsOzaKbpo/jEjpPKVHIW0/jBWj8RZG0NUxfgA8BxgAg==", + "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" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "0.8.9", + "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", + "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "debug": "^4.3.7", + "error-stack-parser-es": "^0.1.5", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.1.1", + "sirv": "^3.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.6.tgz", + "integrity": "sha512-L7nPVM5a7lgit/Z+36iwoqHOaP3wxqVi1UvaDJwGCfblS9Y6vNqf32ILlzJVH9c47aHu90BhDXeZc+rgzHRHcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^7.7.6", + "@vue/devtools-kit": "^7.7.6", + "@vue/devtools-shared": "^7.7.6", + "execa": "^9.5.2", + "sirv": "^3.0.1", + "vite-plugin-inspect": "0.8.9", + "vite-plugin-vue-inspector": "^5.3.1" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", + "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", + "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" + } + }, + "node_modules/vue": { + "version": "3.5.16", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.16.tgz", + "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-sfc": "3.5.16", + "@vue/runtime-dom": "3.5.16", + "@vue/server-renderer": "3.5.16", + "@vue/shared": "3.5.16" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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-toastification": { + "version": "2.0.0-rc.5", + "resolved": "https://registry.npmmirror.com/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz", + "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.2" + } + }, + "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/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "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/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d8e6ed8 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "lottery-app", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "build:clean": "rm -rf dist && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "axios": "^1.10.0", + "echarts": "^6.0.0", + "element-plus": "^2.11.8", + "qrcode": "^1.5.4", + "vue": "^3.5.13", + "vue-router": "^4.5.1", + "vue-toastification": "^2.0.0-rc.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.3", + "terser": "^5.44.0", + "vite": "^6.2.4", + "vite-plugin-vue-devtools": "^7.7.2" + } +} diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..64021b1 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,32 @@ +# 缓存控制配置(Apache服务器) + +# 禁用 HTML 文件的缓存 + + FileETag None + Header unset ETag + Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" + Header set Pragma "no-cache" + Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT" + + +# 静态资源长期缓存(带hash的文件) + + Header set Cache-Control "max-age=31536000, public, immutable" + + +# 启用 Gzip 压缩 + + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml + + +# SPA 路由支持 + + RewriteEngine On + RewriteBase / + RewriteRule ^index\.html$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.html [L] + + + diff --git a/public/assets/admin/logo.svg b/public/assets/admin/logo.svg new file mode 100644 index 0000000..4d00f84 --- /dev/null +++ b/public/assets/admin/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/banner/banner.png b/public/assets/banner/banner.png new file mode 100644 index 0000000..bf55eac Binary files /dev/null and b/public/assets/banner/banner.png differ diff --git a/public/assets/banner/banner.svg b/public/assets/banner/banner.svg new file mode 100644 index 0000000..3c26d43 --- /dev/null +++ b/public/assets/banner/banner.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/banner/banner1.png b/public/assets/banner/banner1.png new file mode 100644 index 0000000..53f8760 Binary files /dev/null and b/public/assets/banner/banner1.png differ diff --git a/public/assets/bottom/faxian-0.svg b/public/assets/bottom/faxian-0.svg new file mode 100644 index 0000000..6f9be96 --- /dev/null +++ b/public/assets/bottom/faxian-0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/bottom/faxian-1.svg b/public/assets/bottom/faxian-1.svg new file mode 100644 index 0000000..6b5c270 --- /dev/null +++ b/public/assets/bottom/faxian-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/bottom/home-0.svg b/public/assets/bottom/home-0.svg new file mode 100644 index 0000000..1f778e4 --- /dev/null +++ b/public/assets/bottom/home-0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/bottom/home-1.svg b/public/assets/bottom/home-1.svg new file mode 100644 index 0000000..f5f8908 --- /dev/null +++ b/public/assets/bottom/home-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/bottom/kaijiang-0.svg b/public/assets/bottom/kaijiang-0.svg new file mode 100644 index 0000000..5b9887c --- /dev/null +++ b/public/assets/bottom/kaijiang-0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/bottom/kaijiang-1.svg b/public/assets/bottom/kaijiang-1.svg new file mode 100644 index 0000000..2cb38c6 --- /dev/null +++ b/public/assets/bottom/kaijiang-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/bottom/tuice-0.svg b/public/assets/bottom/tuice-0.svg new file mode 100644 index 0000000..389fb78 --- /dev/null +++ b/public/assets/bottom/tuice-0.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/bottom/tuice-1.svg b/public/assets/bottom/tuice-1.svg new file mode 100644 index 0000000..2e76033 --- /dev/null +++ b/public/assets/bottom/tuice-1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/bottom/wode-0.svg b/public/assets/bottom/wode-0.svg new file mode 100644 index 0000000..018f86f --- /dev/null +++ b/public/assets/bottom/wode-0.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/assets/bottom/wode-1.svg b/public/assets/bottom/wode-1.svg new file mode 100644 index 0000000..38a8e9f --- /dev/null +++ b/public/assets/bottom/wode-1.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/assets/fenxi/3D-0.svg b/public/assets/fenxi/3D-0.svg new file mode 100644 index 0000000..6b5dccf --- /dev/null +++ b/public/assets/fenxi/3D-0.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/fenxi/3D-1.svg b/public/assets/fenxi/3D-1.svg new file mode 100644 index 0000000..b7842ce --- /dev/null +++ b/public/assets/fenxi/3D-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/fenxi/7lecai-0.svg b/public/assets/fenxi/7lecai-0.svg new file mode 100644 index 0000000..627b903 --- /dev/null +++ b/public/assets/fenxi/7lecai-0.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/fenxi/7lecai-1.svg b/public/assets/fenxi/7lecai-1.svg new file mode 100644 index 0000000..5357370 --- /dev/null +++ b/public/assets/fenxi/7lecai-1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/fenxi/7xingcai-0.svg b/public/assets/fenxi/7xingcai-0.svg new file mode 100644 index 0000000..8e9bc63 --- /dev/null +++ b/public/assets/fenxi/7xingcai-0.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/assets/fenxi/7xingcai-1.svg b/public/assets/fenxi/7xingcai-1.svg new file mode 100644 index 0000000..1d9b737 --- /dev/null +++ b/public/assets/fenxi/7xingcai-1.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/assets/fenxi/daletou-0.svg b/public/assets/fenxi/daletou-0.svg new file mode 100644 index 0000000..902e007 --- /dev/null +++ b/public/assets/fenxi/daletou-0.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/fenxi/daletou-1.svg b/public/assets/fenxi/daletou-1.svg new file mode 100644 index 0000000..620a54e --- /dev/null +++ b/public/assets/fenxi/daletou-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/fenxi/fenxi-1.svg b/public/assets/fenxi/fenxi-1.svg new file mode 100644 index 0000000..d9b50cf --- /dev/null +++ b/public/assets/fenxi/fenxi-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/fenxi/fenxi-2.svg b/public/assets/fenxi/fenxi-2.svg new file mode 100644 index 0000000..7da5070 --- /dev/null +++ b/public/assets/fenxi/fenxi-2.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/fenxi/fenxi-3.svg b/public/assets/fenxi/fenxi-3.svg new file mode 100644 index 0000000..e21b955 --- /dev/null +++ b/public/assets/fenxi/fenxi-3.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/fenxi/fenxi-4.svg b/public/assets/fenxi/fenxi-4.svg new file mode 100644 index 0000000..9f2184c --- /dev/null +++ b/public/assets/fenxi/fenxi-4.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/fenxi/kuaile-0.svg b/public/assets/fenxi/kuaile-0.svg new file mode 100644 index 0000000..d970617 --- /dev/null +++ b/public/assets/fenxi/kuaile-0.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/fenxi/kuaile8-1.svg b/public/assets/fenxi/kuaile8-1.svg new file mode 100644 index 0000000..e180e78 --- /dev/null +++ b/public/assets/fenxi/kuaile8-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/fenxi/pailie-1.svg b/public/assets/fenxi/pailie-1.svg new file mode 100644 index 0000000..b8e4b30 --- /dev/null +++ b/public/assets/fenxi/pailie-1.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/assets/fenxi/pailie3-0.svg b/public/assets/fenxi/pailie3-0.svg new file mode 100644 index 0000000..1bac077 --- /dev/null +++ b/public/assets/fenxi/pailie3-0.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/fenxi/pailie3-1.svg b/public/assets/fenxi/pailie3-1.svg new file mode 100644 index 0000000..7d6f821 --- /dev/null +++ b/public/assets/fenxi/pailie3-1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/fenxi/pailie5.svg b/public/assets/fenxi/pailie5.svg new file mode 100644 index 0000000..58ebe4d --- /dev/null +++ b/public/assets/fenxi/pailie5.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/assets/fenxi/ssq-0.svg b/public/assets/fenxi/ssq-0.svg new file mode 100644 index 0000000..c624296 --- /dev/null +++ b/public/assets/fenxi/ssq-0.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/fenxi/ssq-1.svg b/public/assets/fenxi/ssq-1.svg new file mode 100644 index 0000000..c92603c --- /dev/null +++ b/public/assets/fenxi/ssq-1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/home/about.svg b/public/assets/home/about.svg new file mode 100644 index 0000000..045dcd2 --- /dev/null +++ b/public/assets/home/about.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/home/dingdan.svg b/public/assets/home/dingdan.svg new file mode 100644 index 0000000..c3b4f21 --- /dev/null +++ b/public/assets/home/dingdan.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/home/duihuan.svg b/public/assets/home/duihuan.svg new file mode 100644 index 0000000..2dfe500 --- /dev/null +++ b/public/assets/home/duihuan.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/home/help.svg b/public/assets/home/help.svg new file mode 100644 index 0000000..f88fa08 --- /dev/null +++ b/public/assets/home/help.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/home/jiangjing.svg b/public/assets/home/jiangjing.svg new file mode 100644 index 0000000..b8c0872 --- /dev/null +++ b/public/assets/home/jiangjing.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/home/kefu.svg b/public/assets/home/kefu.svg new file mode 100644 index 0000000..c54d0f8 --- /dev/null +++ b/public/assets/home/kefu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/home/mingzhong.svg b/public/assets/home/mingzhong.svg new file mode 100644 index 0000000..7d50e3b --- /dev/null +++ b/public/assets/home/mingzhong.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/home/qianbao.svg b/public/assets/home/qianbao.svg new file mode 100644 index 0000000..959b23d --- /dev/null +++ b/public/assets/home/qianbao.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/home/tongji.svg b/public/assets/home/tongji.svg new file mode 100644 index 0000000..c8c6660 --- /dev/null +++ b/public/assets/home/tongji.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/home/tuice.svg b/public/assets/home/tuice.svg new file mode 100644 index 0000000..ca4a1e9 --- /dev/null +++ b/public/assets/home/tuice.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/type/3D.svg b/public/assets/type/3D.svg new file mode 100644 index 0000000..e028302 --- /dev/null +++ b/public/assets/type/3D.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/type/7lecai.svg b/public/assets/type/7lecai.svg new file mode 100644 index 0000000..dc5c5e1 --- /dev/null +++ b/public/assets/type/7lecai.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/type/7xingcai.svg b/public/assets/type/7xingcai.svg new file mode 100644 index 0000000..59fccbd --- /dev/null +++ b/public/assets/type/7xingcai.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/type/daletou.svg b/public/assets/type/daletou.svg new file mode 100644 index 0000000..55424f9 --- /dev/null +++ b/public/assets/type/daletou.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/type/kl8.svg b/public/assets/type/kl8.svg new file mode 100644 index 0000000..77fc42b --- /dev/null +++ b/public/assets/type/kl8.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/type/pailie3.svg b/public/assets/type/pailie3.svg new file mode 100644 index 0000000..703a6a7 --- /dev/null +++ b/public/assets/type/pailie3.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/type/pailie5.svg b/public/assets/type/pailie5.svg new file mode 100644 index 0000000..67a278e --- /dev/null +++ b/public/assets/type/pailie5.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/assets/type/ssq.svg b/public/assets/type/ssq.svg new file mode 100644 index 0000000..b7709dc --- /dev/null +++ b/public/assets/type/ssq.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..c21a0e3 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/生成带特定元素的图片 (1) (1).ico b/public/生成带特定元素的图片 (1) (1).ico new file mode 100644 index 0000000..70f87f2 Binary files /dev/null and b/public/生成带特定元素的图片 (1) (1).ico differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..473b1b1 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,511 @@ + + + + + diff --git a/src/api/dlt/index.js b/src/api/dlt/index.js new file mode 100644 index 0000000..2c61376 --- /dev/null +++ b/src/api/dlt/index.js @@ -0,0 +1,380 @@ +import axios from 'axios' + +// 创建大乐透专用的axios实例 +const dltApi = axios.create({ + // baseURL: 'http://localhost:8123/api', + baseURL: 'https://www.yicaishuzhi.com/api', + timeout: 300000, // 5分钟超时时间 + withCredentials: true, // 关键:支持跨域携带cookie和session + headers: { + 'Content-Type': 'application/json' + } +}) + +// 响应拦截器 +dltApi.interceptors.response.use( + response => { + const data = response.data + + // 检查是否是session过期的响应 + if (data && data.success === false) { + const message = data.message || '' + if (message.includes('未登录') || message.includes('登录过期') || message.includes('无权限') || message.includes('Invalid session')) { + console.log('检测到session过期,清除本地登录状态') + + // 动态导入userStore避免循环依赖 + import('../../store/user.js').then(({ userStore }) => { + userStore.logout() + }) + } + } + + return data + }, + error => { + console.error('大乐透API请求错误:', error) + + // 检查HTTP状态码,401/403通常表示未授权/session过期 + if (error.response && (error.response.status === 401 || error.response.status === 403)) { + console.log('检测到401/403错误,可能是session过期或无权限') + + // 动态导入userStore避免循环依赖 + import('../../store/user.js').then(({ userStore }) => { + userStore.logout() + }) + } + + return Promise.reject(error) + } +) + +// 大乐透API接口方法 +export const dltLotteryApi = { + // 获取近10期大乐透开奖期号 + getRecent10DrawIds() { + return dltApi.get('/dlt-draw/recent-10-draw-ids') + }, + + // 根据期号获取大乐透开奖号码 + getDrawNumbersById(drawId) { + return dltApi.get(`/dlt-draw/draw/${drawId}/numbers`) + }, + + // 大乐透前区首球分析 + analyzeFrontBalls(level, frontBalls, backBalls) { + return dltApi.post('/dlt/ball-analysis/predict-first-ball', { + level, + redBalls: frontBalls, // 前区球 + blueBalls: backBalls // 后区球 + }) + }, + + // 大乐透前区随球分析 + analyzeFollowFrontBalls(level, wellRegardedBalls, previousFrontBalls, previousBackBalls) { + return dltApi.post('/dlt/ball-analysis/predict-follower-ball', { + level, + wellRegardedBalls, + previousFrontBalls, + previousBackBalls + }) + }, + + // 大乐透后区球分析 + analyzeBackBalls(level, nextFrontBalls, previousFrontBalls, previousBackBalls, nextBackBalls) { + return dltApi.post('/dlt/ball-analysis/predict-back-ball', { + level, + nextFrontBalls, + previousFrontBalls, + previousBackBalls, + nextBackBalls + }) + }, + + // 大乐透后区随球分析 + analyzeFollowBackBalls(level, backFirstBall, nextFrontBalls, previousFrontBalls, previousBackBalls) { + return dltApi.post('/dlt/ball-analysis/predict-follow-back-ball', { + level, + backFirstBall, + nextFrontBalls, + previousFrontBalls, + previousBackBalls + }) + }, + + // 创建大乐透推测记录 + createPredictRecord(userId, drawId, drawDate, frontBalls, backBalls) { + return dltApi.post('/dlt/ball-analysis/create-predict', { + userId, + drawId, + drawDate, + frontBalls: frontBalls.join(','), + backBalls: backBalls.join(',') + }) + }, + + // 获取大乐透推测记录 + getPredictRecordsByUserId(userId, page = 1) { + return dltApi.get(`/dlt/ball-analysis/predict-records/${userId}?page=${page}`) + }, + + // 获取近期大乐透开奖记录 + getRecentDraws(limit = 10) { + return dltApi.get(`/dlt-draw/recent-draws?limit=${limit}`) + }, + + // 根据期号获取大乐透开奖记录 + getDrawById(drawId) { + return dltApi.get(`/dlt-draw/draw/${drawId}`) + }, + + // 根据日期范围查询大乐透开奖记录 + queryDraws(startDate, endDate) { + return dltApi.get(`/dlt-draw/query-draws?startDate=${startDate}&endDate=${endDate}`) + }, + + // 获取近100期大乐透开奖记录(用于表相查询) + getRecent100Draws() { + return dltApi.get('/dlt-draw/recent-100-draws') + }, + + // 创建大乐透预测记录(新接口) + createDltPredictRecord(userId, drawId, frontBalls, backBalls, drawDate = null) { + const params = new URLSearchParams({ + userId: userId, + drawId: drawId, + frontBalls: frontBalls, + backBalls: backBalls + }) + + if (drawDate) { + params.append('drawDate', drawDate) + } + + return dltApi.post(`/dlt/ball-analysis/create-dlt-predict?${params.toString()}`) + }, + + // 前区与前区的组合性分析 + frontFrontCombinationAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/front-front-combination-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 前区与后区的组合性分析 + frontBackCombinationAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/front-back-combination-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 后区与后区的组合性分析 + backBackCombinationAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/back-back-combination-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 后区与前区的组合性分析 + backFrontCombinationAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/back-front-combination-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 前区与前区的持续性分析 + frontFrontPersistenceAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/front-front-persistence-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 后区与后区的持续性分析 + backBackPersistenceAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/back-back-persistence-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 前区与后区的持续性分析 + frontBackPersistenceAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/front-back-persistence-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 后区与前区的持续性分析 + backFrontPersistenceAnalysis(masterBall, slaveBall) { + return dltApi.get(`/dlt/ball-analysis/back-front-persistence-analysis?masterBall=${masterBall}&slaveBall=${slaveBall}`) + }, + + // 根据用户ID获取大乐透预测记录(新接口) + getDltPredictRecordsByUserId(userId, page = 1, pageSize = 10) { + return dltApi.get(`/dlt-predict/predict-records/${userId}?page=${page}&pageSize=${pageSize}`) + }, + + // 条件查询大乐透预测记录 + queryDltPredictRecords(userId, predictStatus, page = 1, pageSize = 10) { + return dltApi.post('/dlt-predict/query-predict-records', { + userId: userId, + predictStatus: predictStatus, + current: page, + pageSize: pageSize + }) + }, + + // 前区历史数据查询 + getFrontendHistoryAll() { + return dltApi.get('/dlt/ball-active-analysis/frontend-history-all') + }, + + getFrontendHistory100() { + return dltApi.get('/dlt/ball-active-analysis/frontend-history-100') + }, + + getFrontendHistoryTop() { + return dltApi.get('/dlt/ball-active-analysis/frontend-history-top') + }, + + getFrontendHistoryTop100() { + return dltApi.get('/dlt/ball-active-analysis/frontend-history-top-100') + }, + + // 后区历史数据查询 + getBackendHistoryAll() { + return dltApi.get('/dlt/ball-active-analysis/backend-history-all') + }, + + getBackendHistory100() { + return dltApi.get('/dlt/ball-active-analysis/backend-history-100') + }, + + getBackendHistoryTop() { + return dltApi.get('/dlt/ball-active-analysis/backend-history-top') + }, + + getBackendHistoryTop100() { + return dltApi.get('/dlt/ball-active-analysis/backend-history-top-100') + }, + + // Excel数据导入相关API + // 上传Excel文件完整导入大乐透数据(D3-D12工作表) + uploadDltExcelFile(file) { + const formData = new FormData() + formData.append('file', file) + return dltApi.post('/dlt/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + }, + + // 上传Excel文件导入大乐透开奖数据(覆盖)(D1工作表) + uploadDltDrawsFile(file) { + const formData = new FormData() + formData.append('file', file) + return dltApi.post('/dlt/upload-draw-data', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + }, + + // 追加导入大乐透开奖数据(D1工作表) + appendDltDrawsFile(file) { + const formData = new FormData() + formData.append('file', file) + return dltApi.post('/dlt/append-draw-data', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + }, + + // 手动处理待开奖记录(双色球+大乐透) + processPendingPredictions() { + return dltApi.post('/dlt-predict/process-pending') + }, + + // 获取用户大乐透预测统计 + getUserPredictStats(userId) { + return dltApi.get(`/dlt-predict/user-predict-stat/${userId}`) + }, + + // 获取用户大乐透奖金统计 + getPrizeStatistics(userId) { + return dltApi.get('/dlt-predict/prize-statistics', { + params: { + userId: userId + } + }) + }, + + // 大乐透命中率分析接口 + // 前区首球命中率分析 + getFrontFirstBallHitRate() { + return dltApi.get('/dlt-predict/front-first-ball-hit-rate') + }, + + // 前区球号命中率分析 + getFrontBallHitRate() { + return dltApi.get('/dlt-predict/front-ball-hit-rate') + }, + + // 后区首球命中率分析 + getBackFirstBallHitRate() { + return dltApi.get('/dlt-predict/back-first-ball-hit-rate') + }, + + // 后区球号命中率分析 + getBackBallHitRate() { + return dltApi.get('/dlt-predict/back-ball-hit-rate') + }, + + // 精推版大乐透第一步分析 + jtdltFirstStepAnalysis(level, frontBalls, backBalls) { + const params = new URLSearchParams() + params.append('level', level) + params.append('frontBalls', frontBalls) + params.append('backBalls', backBalls) + + return dltApi.post('/jtdlt/analysis/first-step', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 精推版大乐透第二步分析 + jtdltSecondStepAnalysis(level, previousFrontBalls, previousBackBalls, currentFirstBall) { + const params = new URLSearchParams() + params.append('level', level) + params.append('previousFrontBalls', previousFrontBalls) + params.append('previousBackBalls', previousBackBalls) + params.append('currentFirstBall', currentFirstBall) + + return dltApi.post('/jtdlt/analysis/second-step', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 精推版大乐透第三步分析 + jtdltThirdStepAnalysis(level, previousFrontBalls, previousBackBalls, currentFrontBalls) { + const params = new URLSearchParams() + params.append('level', level) + params.append('previousFrontBalls', previousFrontBalls) + params.append('previousBackBalls', previousBackBalls) + params.append('currentFrontBalls', currentFrontBalls) + + return dltApi.post('/jtdlt/analysis/third-step', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 精推版大乐透第四步分析 + jtdltFourthStepAnalysis(level, previousFrontBalls, previousBackBalls, currentFrontBalls, currentBackFirstBall) { + const params = new URLSearchParams() + params.append('level', level) + params.append('previousFrontBalls', previousFrontBalls) + params.append('previousBackBalls', previousBackBalls) + params.append('currentFrontBalls', currentFrontBalls) + params.append('currentBackFirstBall', currentBackFirstBall) + + return dltApi.post('/jtdlt/analysis/fourth-step', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + } +} + +export default dltLotteryApi diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..55f10ad --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,891 @@ +import axios from 'axios' + +// 创建axios实例 +const api = axios.create({ + // baseURL: 'http://localhost:8123/api', + baseURL: 'https://www.yicaishuzhi.com/api', + timeout: 300000, // 5分钟超时时间(300秒) + withCredentials: true, // 关键:支持跨域携带cookie和session + headers: { + 'Content-Type': 'application/json' + } +}) + +// 防止重复提示的标志 +let isKickedOut = false + +// 响应拦截器 +api.interceptors.response.use( + response => { + const data = response.data + + // 检查是否是session过期的响应 + if (data && data.success === false) { + // 可以根据后端返回的错误码或消息判断是否是session过期 + const message = data.message || '' + + // 专门处理账号在其他设备登录的情况 + if (message.includes('其他设备登录') || message.includes('当前会话已失效')) { + if (!isKickedOut) { + isKickedOut = true + console.log('检测到账号在其他设备登录,正在踢出当前会话...') + + // 动态导入 Element Plus 的消息组件 + import('element-plus').then(({ ElMessage }) => { + ElMessage.warning({ + message: '您的账号已在其他设备登录,请重新登录', + duration: 3000, + showClose: true + }) + }) + + // 检查当前路径是否为后台管理路径 + if (window.location.pathname.startsWith('/cpzsadmin') && window.location.pathname !== '/cpzsadmin/login') { + // 后台管理会话 + import('../store/user.js').then(({ userStore }) => { + userStore.adminLogout(true) // 标记为被踢出 + setTimeout(() => { + window.location.href = '/cpzsadmin/login' + isKickedOut = false // 重置标志 + }, 1500) + }) + } else { + // 前台用户会话 + import('../store/user.js').then(({ userStore }) => { + userStore.logout(true) // 标记为被踢出 + setTimeout(() => { + isKickedOut = false // 重置标志 + }, 3000) + }) + } + } + return data + } + + // 处理其他登录/权限相关的错误 + if (message.includes('未登录') || message.includes('登录过期') || message.includes('无权限') || message.includes('Invalid session')) { + console.log('检测到session过期,清除本地登录状态') + + // 检查当前路径是否为后台管理路径 + if (window.location.pathname.startsWith('/cpzsadmin') && window.location.pathname !== '/cpzsadmin/login') { + console.log('后台管理会话过期,正在注销...') + // 动态导入userStore避免循环依赖 + import('../store/user.js').then(({ userStore }) => { + userStore.adminLogout() + window.location.href = '/cpzsadmin/login' + }) + } else { + // 前台用户会话过期处理 + import('../store/user.js').then(({ userStore }) => { + userStore.logout() + }) + } + } + } + + return data + }, + error => { + console.error('API请求错误:', error) + + // 检查HTTP状态码,401/403通常表示未授权/session过期 + if (error.response && (error.response.status === 401 || error.response.status === 403)) { + console.log('检测到401/403错误,可能是session过期或无权限') + + // 检查当前路径是否为后台管理路径 + if (window.location.pathname.startsWith('/cpzsadmin') && window.location.pathname !== '/cpzsadmin/login') { + console.log('后台管理会话过期,正在注销...') + // 动态导入userStore避免循环依赖 + import('../store/user.js').then(({ userStore }) => { + userStore.adminLogout() + window.location.href = '/cpzsadmin/login' + }) + } else { + // 前台用户会话过期处理 + import('../store/user.js').then(({ userStore }) => { + userStore.logout() + }) + } + } + + return Promise.reject(error) + } +) + +// API接口方法 +export const lotteryApi = { + // 用户登录 + userLogin(userAccount, userPassword) { + return api.post('/user/login', { + userAccount, + userPassword + }) + }, + + // 用户注册 + userRegister(userAccount, userPassword, checkPassword, userName) { + return api.post('/user/register', { + userAccount, + userPassword, + checkPassword, + userName + }) + }, + + // 用户注销 + userLogout() { + return api.post('/user/logout') + }, + + // 获取当前登录用户信息 + getLoginUser() { + return api.get('/user/get/login') + }, + + // 获取用户统计信息(总用户数和VIP用户数) + getUserCount() { + return api.get('/user/count') + }, + + // 检查当前用户VIP是否过期 + checkVipExpire() { + return api.get('/user/check-vip-expire') + }, + + // 获取用户推测记录(支持分页) + getPredictRecordsByUserId(userId, page = 1) { + return api.get(`/ball-analysis/predict-records/${userId}?page=${page}`) + }, + + // 按条件查询推测记录(支持分页和状态筛选) + queryPredictRecords(userId, predictStatus, page = 1, pageSize = 10) { + return api.post('/data-analysis/query-predict-records', { + userId: userId, + predictStatus, + current: page, + pageSize + }) + }, + + // 获取近期开奖信息 + getRecentDraws(limit = 6) { + return api.get(`/ball-analysis/recent-draws?limit=${limit}`) + }, + + // 获取最新100条开奖信息(表相查询) + getRecent100Draws() { + return api.get('/ball-analysis/recent-100-draws') + }, + + // 按日期范围查询开奖信息 + queryDraws(startDate, endDate) { + const params = new URLSearchParams() + if (startDate) params.append('startDate', startDate) + if (endDate) params.append('endDate', endDate) + return api.get(`/ball-analysis/query-draws?${params.toString()}`) + }, + + // 根据期号查询开奖信息 + getDrawById(drawId) { + return api.get(`/ball-analysis/draw/${drawId}`) + }, + + // 创建推测记录 + createPredictRecord(userId, drawId, drawDate, redBalls, blueBall) { + const params = new URLSearchParams() + params.append('userId', userId) + params.append('drawId', drawId) + params.append('drawDate', drawDate) + params.append('redBalls', redBalls) + params.append('blueBall', blueBall) + + return api.post('/ball-analysis/create-predict', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 首球算法 + analyzeBalls(userId, level, redBalls, blueBall) { + const params = new URLSearchParams() + params.append('userId', userId) + params.append('level', level) + params.append('redBalls', redBalls) + params.append('blueBall', blueBall) + + return api.post('/ball-analysis/analyze', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 精推版双色球第一步分析 + jtssqFirstStepAnalysis(level, redBalls, blueBall) { + const params = new URLSearchParams() + params.append('level', level) + params.append('redBalls', redBalls) + params.append('blueBall', blueBall) + + return api.post('/jtssq/analysis/first-step', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 精推版双色球第二步分析 + jtssqSecondStepAnalysis(level, redBalls, blueBall, nextFirstBall) { + const params = new URLSearchParams() + params.append('level', level) + params.append('redBalls', redBalls) + params.append('blueBall', blueBall) + params.append('nextFirstBall', nextFirstBall) + + return api.post('/jtssq/analysis/second-step', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 精推版双色球第三步分析 + jtssqThirdStepAnalysis(level, redBalls, blueBall, nextRedBalls) { + const params = new URLSearchParams() + params.append('level', level) + params.append('redBalls', redBalls) + params.append('blueBall', blueBall) + params.append('nextRedBalls', nextRedBalls) + + return api.post('/jtssq/analysis/third-step', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 跟随球号分析算法 + fallowBallAnalysis(userId, level, firstThreeRedBalls, lastSixRedBalls, blueBall) { + const params = new URLSearchParams() + params.append('userId', userId) + params.append('level', level) + params.append('firstThreeRedBalls', firstThreeRedBalls) + params.append('lastSixRedBalls', lastSixRedBalls) + params.append('blueBall', blueBall) + + return api.post('/ball-analysis/fallow', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 蓝球分析算法 + blueBallAnalysis(userId, level, predictedRedBalls, predictedBlueBalls, lastRedBalls, lastBlueBall) { + const params = new URLSearchParams() + params.append('userId', userId) + params.append('level', level) + params.append('predictedRedBalls', predictedRedBalls) + params.append('predictedBlueBalls', predictedBlueBalls) + params.append('lastRedBalls', lastRedBalls) + params.append('lastBlueBall', lastBlueBall) + + return api.post('/ball-analysis/blue-ball', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + }, + + // 获取用户推测统计数据 + getUserPredictStat(userId, lotteryType) { + return api.get(`/data-analysis/user-predict-stat/${userId}`, { + params: { lotteryType } + }) + }, + + // 获取首球命中率统计 + getFirstBallHitRate(lotteryType) { + return api.get('/ball-analysis/first-ball-hit-rate', { + params: { lotteryType } + }) + }, + + // 获取蓝球命中率统计 + getBlueBallHitRate(lotteryType) { + return api.get('/ball-analysis/blue-ball-hit-rate', { + params: { lotteryType } + }) + }, + + // 获取红球命中率统计 + getRedBallHitRate(lotteryType) { + return api.get('/ball-analysis/red-ball-hit-rate', { + params: { lotteryType } + }) + }, + + // 获取奖金统计 + getPrizeStatistics() { + return api.get('/ball-analysis/prize-statistics') + }, + + // 激活会员码 + activateVipCode(userId, code) { + return api.post('/user/activate-vip', { + userId, + code + }) + }, + + // 批量生成会员码 + generateVipCodes(numCodes, vipExpireTime) { + return api.post('/vip-code/generate', { + numCodes, + vipExpireTime + }) + }, + + // 获取可用会员码 + getAvailableVipCode(vipExpireTime) { + return api.get(`/vip-code/available?vipExpireTime=${vipExpireTime}`) + }, + + // 上传Excel文件导入数据(T1-T7 sheet) + uploadExcelFile(file) { + const formData = new FormData() + formData.append('file', file) + return api.post('/excel/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + }, + + // 上传Excel文件导入开奖数据(T10工作表) + uploadLotteryDrawsFile(file) { + const formData = new FormData() + formData.append('file', file) + return api.post('/excel/upload-lottery-draws', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + }, + + // 上传Excel文件追加导入开奖数据(T10工作表) + appendLotteryDrawsFile(file) { + const formData = new FormData() + formData.append('file', file) + return api.post('/excel/append-lottery-draws', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + }, + + // 获取用户兑换记录 + getExchangeRecordsByUserId(userId) { + return api.get(`/vip-exchange-record/user/${userId}`) + }, + + // 获取用户列表 + getUserList(params) { + console.log('调用获取用户列表接口:', params) + const queryParams = new URLSearchParams() + + // 添加查询参数 + if (params?.userAccount) { + queryParams.append('userAccount', params.userAccount) + } + + if (params?.userName) { + queryParams.append('userName', params.userName) + } + + if (params?.phone) { + queryParams.append('phone', params.phone) + } + + if (params?.userRole) { + queryParams.append('userRole', params.userRole) + } + + if (params?.status !== undefined && params?.status !== '') { + queryParams.append('status', params.status) + } + + if (params?.isVip !== undefined && params?.isVip !== '') { + queryParams.append('isVip', params.isVip) + } + + // 分页参数 + if (params?.page) { + queryParams.append('page', params.page) + } + + if (params?.size) { + queryParams.append('size', params.size) + } + + return api.get(`/user/list${queryParams.toString() ? '?' + queryParams.toString() : ''}`) + }, + + // 更新用户状态 + updateUserStatus(params) { + console.log('调用更新用户状态接口:', params) + // 使用Content-Type: application/json 调用接口 + return api.post('/user/update-status', params, { + headers: { + 'Content-Type': 'application/json' + }, + timeout: 10000 // 设置10秒超时 + }).then(response => { + console.log('更新用户状态接口响应:', response) + return response + }).catch(error => { + console.error('更新用户状态接口错误:', error) + throw error + }) + }, + + // 添加用户 + addUser(userForm) { + console.log('调用添加用户接口:', userForm) + return api.post('/user/add', userForm) + }, + + // 更新用户 + updateUser(userForm) { + console.log('调用更新用户接口:', userForm) + return api.post('/user/update', userForm) + }, + + // 删除用户 + deleteUser(userId) { + console.log('调用删除用户接口:', userId) + return api.post('/user/delete', { id: userId }, { + headers: { + 'Content-Type': 'application/json' + } + }) + }, + + // 获取所有推测记录总数 + getTotalPredictCount() { + console.log('调用getTotalPredictCount接口...') + return api.get('/data-analysis/total-predict-count').then(response => { + console.log('getTotalPredictCount接口响应:', response) + return response + }).catch(error => { + console.error('getTotalPredictCount接口错误:', error) + throw error + }) + }, + + // 根据用户ID和操作模块获取操作历史 + getOperationHistoryByUserIdAndModule(userId, operationModule) { + return api.get(`/operation-history/user/${userId}/module/${operationModule}`) + }, + + // 管理员登录 + adminLogin(username, password) { + // 模拟API请求,实际项目中应该调用真实的后端API + return new Promise((resolve) => { + setTimeout(() => { + // 模拟验证管理员账号密码 + if (username === 'admin' && password === '123456') { + resolve({ + success: true, + data: { + id: 1, + userName: '系统管理员', + userAccount: 'admin', + userRole: 'admin', + avatar: null, + createTime: new Date().toISOString() + }, + message: '登录成功' + }) + } else { + resolve({ + success: false, + data: null, + message: '账号或密码错误' + }) + } + }, 1000) // 模拟网络延迟 + }) + }, + + // 获取会员码统计数据 + getVipCodeStats() { + return api.get('/vip-code/stats') + }, + + // 获取会员码统计数量 + getVipCodeCount() { + console.log('调用getVipCodeCount接口...') + return api.get('/vip-code/count').then(response => { + console.log('getVipCodeCount接口响应:', response) + return response + }).catch(error => { + console.error('getVipCodeCount接口错误:', error) + throw error + }) + }, + + // 获取会员码列表 + getVipCodeList(params) { + // 构建查询参数 + const queryParams = new URLSearchParams() + + // 分页参数 + if (params.page) queryParams.append('current', params.page) + if (params.size) queryParams.append('pageSize', params.size) + + // 搜索关键词(会员码) + if (params.keyword) queryParams.append('code', params.keyword) + + // 状态筛选 + if (params.status !== undefined && params.status !== '') { + // 直接使用status值作为isUse参数 + queryParams.append('isUse', params.status) + } + + // 有效期筛选 + if (params.expireTime) queryParams.append('vipExpireTime', params.expireTime) + + // 时间范围筛选 + if (params.startTime) queryParams.append('startTime', params.startTime) + if (params.endTime) queryParams.append('endTime', params.endTime) + + // 发起请求 + return api.get(`/vip-code/list/page?${queryParams.toString()}`) + }, + + // 删除会员码 + deleteVipCode(id) { + return api.post(`/vip-code/delete/${id}`) + }, + + // 获取红球历史数据全部记录 + getHistoryAll() { + return api.get('/ball-analysis/history-all') + }, + + // 获取红球最近100期数据记录 + getHistory100() { + return api.get('/ball-analysis/history-100') + }, + + // 获取红球历史数据排行记录 + getHistoryTop() { + return api.get('/ball-analysis/history-top') + }, + + // 获取红球100期数据排行记录 + getHistoryTop100() { + return api.get('/ball-analysis/history-top-100') + }, + + // 获取蓝球历史数据全部记录 + getBlueHistoryAll() { + return api.get('/ball-analysis/blue-history-all') + }, + + // 获取蓝球最近100期数据记录 + getBlueHistory100() { + return api.get('/ball-analysis/blue-history-100') + }, + + // 获取蓝球历史数据排行记录 + getBlueHistoryTop() { + return api.get('/ball-analysis/blue-history-top') + }, + + // 获取蓝球100期数据排行记录 + getBlueHistoryTop100() { + return api.get('/ball-analysis/blue-history-top-100') + }, + + // 发送短信验证码 + sendSmsCode(phoneNumber) { + return api.post('/sms/sendCode', null, { + params: { + phoneNumber + } + }) + }, + + // 手机号登录 + userPhoneLogin(phone, code) { + return api.post('/user/phone/login', { + phone, + code + }) + }, + + // 手机号注册 + userPhoneRegister(userAccount, userPassword, checkPassword, phone, code, userName) { + return api.post('/user/phone/register', { + userAccount, + userPassword, + checkPassword, + phone, + code, + userName + }) + }, + + // 重置密码 + resetPassword(phone, code, newPassword, confirmPassword) { + console.log('调用重置密码接口:', { phone, code, newPassword, confirmPassword }) + return api.post('/user/reset-password', { + phone, + code, + newPassword, + confirmPassword + }, { + headers: { + 'Content-Type': 'application/json' + } + }) + }, + + // 红球组合分析 + redBallCombinationAnalysis(masterBall, slaveBall) { + const params = new URLSearchParams() + params.append('masterBall', masterBall) + params.append('slaveBall', slaveBall) + + return api.get(`/ball-analysis/red-ball-combination-analysis?${params.toString()}`) + }, + + // 红球与蓝球的组合性分析 + redBlueCombinationAnalysis(masterBall, slaveBall) { + const params = new URLSearchParams() + params.append('masterBall', masterBall) + params.append('slaveBall', slaveBall) + + return api.get(`/ball-analysis/red-blue-combination-analysis?${params.toString()}`) + }, + + // 蓝球与红球的组合性分析 + blueRedCombinationAnalysis(masterBall, slaveBall) { + const params = new URLSearchParams() + params.append('masterBall', masterBall) + params.append('slaveBall', slaveBall) + + return api.get(`/ball-analysis/blue-red-combination-analysis?${params.toString()}`) + }, + + // 红球与红球的接续性分析 + redRedPersistenceAnalysis(masterBall, slaveBall) { + const params = new URLSearchParams() + params.append('masterBall', masterBall) + params.append('slaveBall', slaveBall) + + return api.get(`/ball-analysis/red-red-persistence-analysis?${params.toString()}`) + }, + + // 蓝球与蓝球的接续性分析 + blueBluePersistenceAnalysis(masterBall, slaveBall) { + const params = new URLSearchParams() + params.append('masterBall', masterBall) + params.append('slaveBall', slaveBall) + + return api.get(`/ball-analysis/blue-blue-persistence-analysis?${params.toString()}`) + }, + + // 红球与蓝球的接续性分析 + redBluePersistenceAnalysis(masterBall, slaveBall) { + const params = new URLSearchParams() + params.append('masterBall', masterBall) + params.append('slaveBall', slaveBall) + + return api.get(`/ball-analysis/red-blue-persistence-analysis?${params.toString()}`) + }, + + // 蓝球与红球的接续性分析 + blueRedPersistenceAnalysis(masterBall, slaveBall) { + const params = new URLSearchParams() + params.append('masterBall', masterBall) + params.append('slaveBall', slaveBall) + + return api.get(`/ball-analysis/blue-red-persistence-analysis?${params.toString()}`) + }, + + // 根据开奖期号查询开奖球号 + getDrawNumbersById(drawId) { + return api.get(`/ball-analysis/draw/${drawId}/numbers`) + }, + + // 获取近10期开奖期号 + getRecent10DrawIds() { + return api.get('/ball-analysis/recent-10-draw-ids') + }, + + // 根据操作模块获取操作历史(真实接口) + getOperationHistoryByModule(operationModule) { + console.log('调用根据操作模块获取操作历史接口:', operationModule) + return api.get(`/operation-history/module/${operationModule}`) + }, + + // 根据操作结果获取操作历史(真实接口) + getOperationHistoryByResult(operationResult) { + console.log('调用根据操作结果获取操作历史接口:', operationResult) + return api.get(`/operation-history/result/${operationResult}`) + }, + + // 获取操作历史列表(统一接口) + getOperationHistoryList(params) { + console.log('调用获取操作历史列表接口:', params) + const queryParams = new URLSearchParams() + + if (params?.operationModule !== undefined && params.operationModule !== '') { + queryParams.append('operationModule', params.operationModule) + } + + if (params?.operationResult !== undefined && params.operationResult !== '') { + queryParams.append('operationResult', params.operationResult) + } + + if (params?.keyword !== undefined && params.keyword !== '') { + queryParams.append('keyword', params.keyword) + } + + return api.get(`/operation-history/list${queryParams.toString() ? '?' + queryParams.toString() : ''}`) + }, + + // ==================== 公告管理接口 ==================== + + // 添加公告 + addAnnouncement(data) { + console.log('调用添加公告接口:', data) + return api.post('/announcement/add', data) + }, + + // 查询公告列表(分页) + getAnnouncementList(params) { + console.log('调用查询公告列表接口:', params) + const queryParams = new URLSearchParams() + + if (params?.current) queryParams.append('current', params.current) + if (params?.pageSize) queryParams.append('pageSize', params.pageSize) + if (params?.title) queryParams.append('title', params.title) + if (params?.status !== undefined && params?.status !== null && params?.status !== '') { + queryParams.append('status', params.status) + } + if (params?.priority !== undefined && params?.priority !== null && params?.priority !== '') { + queryParams.append('priority', params.priority) + } + if (params?.publisherId) queryParams.append('publisherId', params.publisherId) + if (params?.publisherName) queryParams.append('publisherName', params.publisherName) + if (params?.startTime) queryParams.append('startTime', params.startTime) + if (params?.endTime) queryParams.append('endTime', params.endTime) + + return api.get(`/announcement/list/page${queryParams.toString() ? '?' + queryParams.toString() : ''}`) + }, + + // 根据ID查询公告详情 + getAnnouncementById(id) { + console.log('调用根据ID查询公告接口:', id) + return api.get(`/announcement/${id}`) + }, + + // 更新公告 + updateAnnouncement(data) { + console.log('调用更新公告接口:', data) + return api.post('/announcement/update', data) + }, + + // 删除公告 + deleteAnnouncement(id) { + console.log('调用删除公告接口:', id) + return api.delete(`/announcement/delete/${id}`) + }, + + // 获取置顶公告 + getTopAnnouncements() { + console.log('调用获取置顶公告接口') + return api.get('/announcement/top') + }, + + // 获取所有已发布公告 + getPublishedAnnouncements() { + console.log('调用获取所有已发布公告接口') + return api.get('/announcement/published') + }, + + // ==================== 推测管理接口 ==================== + + // 管理员获取所有双色球推测记录 + getAllSsqPredictRecords(params) { + const queryParams = new URLSearchParams() + if (params?.userId) queryParams.append('userId', params.userId) + if (params?.predictResult) queryParams.append('predictResult', params.predictResult) + if (params?.current) queryParams.append('current', params.current) + if (params?.pageSize) queryParams.append('pageSize', params.pageSize) + + return api.get(`/ball-analysis/admin/all-records?${queryParams.toString()}`) + }, + + // 管理员获取所有大乐透推测记录 + getAllDltPredictRecords(params) { + const queryParams = new URLSearchParams() + if (params?.userId) queryParams.append('userId', params.userId) + if (params?.predictResult) queryParams.append('predictResult', params.predictResult) + if (params?.current) queryParams.append('current', params.current) + if (params?.pageSize) queryParams.append('pageSize', params.pageSize) + + return api.get(`/dlt-predict/admin/all-records?${queryParams.toString()}`) + }, + + // ==================== 奖金统计接口 ==================== + + // 管理员获取双色球中奖记录明细 + getAdminPrizeStatistics(params) { + const queryParams = new URLSearchParams() + if (params?.userId) queryParams.append('userId', params.userId) + if (params?.prizeGrade) queryParams.append('prizeGrade', params.prizeGrade) + if (params?.current) queryParams.append('current', params.current) + if (params?.pageSize) queryParams.append('pageSize', params.pageSize) + + return api.get(`/ball-analysis/admin/prize-statistics?${queryParams.toString()}`) + }, + + // 管理员获取大乐透中奖记录明细 + getAdminDltPrizeStatistics(params) { + const queryParams = new URLSearchParams() + if (params?.userId) queryParams.append('userId', params.userId) + if (params?.prizeGrade) queryParams.append('prizeGrade', params.prizeGrade) + if (params?.current) queryParams.append('current', params.current) + if (params?.pageSize) queryParams.append('pageSize', params.pageSize) + + return api.get(`/dlt-predict/admin/prize-statistics?${queryParams.toString()}`) + }, + + // 记录页面访问PV + recordPageView(pagePath) { + return api.post(`/pv/record?pagePath=${encodeURIComponent(pagePath)}`) + }, + + // 获取总PV + getTotalPageViews() { + return api.get('/pv/total') + }, + + // 获取今日PV + getTodayPageViews() { + return api.get('/pv/today') + }, + + // 获取近N天PV统计 + getPageViewsByDays(days = 7) { + return api.get(`/pv/stats?days=${days}`) + } +} + +export default api \ No newline at end of file diff --git a/src/assets/3D.png b/src/assets/3D.png new file mode 100644 index 0000000..ee2a3b2 Binary files /dev/null and b/src/assets/3D.png differ diff --git a/src/assets/7lecai.png b/src/assets/7lecai.png new file mode 100644 index 0000000..a2dbf1d Binary files /dev/null and b/src/assets/7lecai.png differ diff --git a/src/assets/7星彩.png b/src/assets/7星彩.png new file mode 100644 index 0000000..80151f8 Binary files /dev/null and b/src/assets/7星彩.png differ diff --git a/src/assets/backend.png b/src/assets/backend.png new file mode 100644 index 0000000..06dc2c2 Binary files /dev/null and b/src/assets/backend.png differ diff --git a/src/assets/banner/backend1.png b/src/assets/banner/backend1.png new file mode 100644 index 0000000..d90dbfd Binary files /dev/null and b/src/assets/banner/backend1.png differ diff --git a/src/assets/banner/banner.png b/src/assets/banner/banner.png new file mode 100644 index 0000000..a8b8dbe Binary files /dev/null and b/src/assets/banner/banner.png differ diff --git a/src/assets/banner/banner.svg b/src/assets/banner/banner.svg new file mode 100644 index 0000000..3c26d43 --- /dev/null +++ b/src/assets/banner/banner.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/banner/home.png b/src/assets/banner/home.png new file mode 100644 index 0000000..420b055 Binary files /dev/null and b/src/assets/banner/home.png differ diff --git a/src/assets/banner/kaijiang.png b/src/assets/banner/kaijiang.png new file mode 100644 index 0000000..7a1ab98 Binary files /dev/null and b/src/assets/banner/kaijiang.png differ diff --git a/src/assets/banner/wode.png b/src/assets/banner/wode.png new file mode 100644 index 0000000..8c9c8d1 Binary files /dev/null and b/src/assets/banner/wode.png differ diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000..8816868 --- /dev/null +++ b/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/src/assets/daletou.png b/src/assets/daletou.png new file mode 100644 index 0000000..77b4e63 Binary files /dev/null and b/src/assets/daletou.png differ diff --git a/src/assets/icon/ai.svg b/src/assets/icon/ai.svg new file mode 100644 index 0000000..46c12bf --- /dev/null +++ b/src/assets/icon/ai.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icon/bzzx.svg b/src/assets/icon/bzzx.svg new file mode 100644 index 0000000..8aa6e9e --- /dev/null +++ b/src/assets/icon/bzzx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/dhjl.svg b/src/assets/icon/dhjl.svg new file mode 100644 index 0000000..5ed88fc --- /dev/null +++ b/src/assets/icon/dhjl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/gywm.svg b/src/assets/icon/gywm.svg new file mode 100644 index 0000000..42e037a --- /dev/null +++ b/src/assets/icon/gywm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/login/mima.png b/src/assets/icon/login/mima.png new file mode 100644 index 0000000..8f55449 Binary files /dev/null and b/src/assets/icon/login/mima.png differ diff --git a/src/assets/icon/login/nicheng.png b/src/assets/icon/login/nicheng.png new file mode 100644 index 0000000..42894e9 Binary files /dev/null and b/src/assets/icon/login/nicheng.png differ diff --git a/src/assets/icon/login/shouji.png b/src/assets/icon/login/shouji.png new file mode 100644 index 0000000..ccc34df Binary files /dev/null and b/src/assets/icon/login/shouji.png differ diff --git a/src/assets/icon/login/yingcang.png b/src/assets/icon/login/yingcang.png new file mode 100644 index 0000000..f649469 Binary files /dev/null and b/src/assets/icon/login/yingcang.png differ diff --git a/src/assets/icon/login/zhanghao.png b/src/assets/icon/login/zhanghao.png new file mode 100644 index 0000000..19b9306 Binary files /dev/null and b/src/assets/icon/login/zhanghao.png differ diff --git a/src/assets/icon/login/zhanshi.png b/src/assets/icon/login/zhanshi.png new file mode 100644 index 0000000..d153dc3 Binary files /dev/null and b/src/assets/icon/login/zhanshi.png differ diff --git a/src/assets/icon/sjfx.svg b/src/assets/icon/sjfx.svg new file mode 100644 index 0000000..48f6e95 --- /dev/null +++ b/src/assets/icon/sjfx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/tcjl.svg b/src/assets/icon/tcjl.svg new file mode 100644 index 0000000..38d8982 --- /dev/null +++ b/src/assets/icon/tcjl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon/tuichu.png b/src/assets/icon/tuichu.png new file mode 100644 index 0000000..77ef405 Binary files /dev/null and b/src/assets/icon/tuichu.png differ diff --git a/src/assets/icon/zuanshi.png b/src/assets/icon/zuanshi.png new file mode 100644 index 0000000..abb3a90 Binary files /dev/null and b/src/assets/icon/zuanshi.png differ diff --git a/src/assets/kuaile8.png b/src/assets/kuaile8.png new file mode 100644 index 0000000..ba7d646 Binary files /dev/null and b/src/assets/kuaile8.png differ diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..004a380 --- /dev/null +++ b/src/assets/main.css @@ -0,0 +1,25 @@ +@import './base.css'; + +#app { + margin: 0 auto; + font-weight: normal; + width: 100%; + min-height: 100vh; + background-color: rgb(240, 242, 245); +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; + padding: 3px; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +/* 移除可能影响布局的媒体查询 */ diff --git a/src/assets/pailie3.png b/src/assets/pailie3.png new file mode 100644 index 0000000..36fde62 Binary files /dev/null and b/src/assets/pailie3.png differ diff --git a/src/assets/pailie5.png b/src/assets/pailie5.png new file mode 100644 index 0000000..84ff5cc Binary files /dev/null and b/src/assets/pailie5.png differ diff --git a/src/assets/shuangseqiu.png b/src/assets/shuangseqiu.png new file mode 100644 index 0000000..804ff77 Binary files /dev/null and b/src/assets/shuangseqiu.png differ diff --git a/src/assets/weixin.png b/src/assets/weixin.png new file mode 100644 index 0000000..508e58f Binary files /dev/null and b/src/assets/weixin.png differ diff --git a/src/components/AlgorithmProcessModal.vue b/src/components/AlgorithmProcessModal.vue new file mode 100644 index 0000000..d08772a --- /dev/null +++ b/src/components/AlgorithmProcessModal.vue @@ -0,0 +1,440 @@ + + + + + diff --git a/src/components/BottomNavigation.vue b/src/components/BottomNavigation.vue new file mode 100644 index 0000000..2c3c7b0 --- /dev/null +++ b/src/components/BottomNavigation.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/components/CozeChat.vue b/src/components/CozeChat.vue new file mode 100644 index 0000000..f12996e --- /dev/null +++ b/src/components/CozeChat.vue @@ -0,0 +1,526 @@ + + + + + diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..eff59f1 --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/TheWelcome.vue b/src/components/TheWelcome.vue new file mode 100644 index 0000000..fe48afc --- /dev/null +++ b/src/components/TheWelcome.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/components/WelcomeItem.vue b/src/components/WelcomeItem.vue new file mode 100644 index 0000000..6d7086a --- /dev/null +++ b/src/components/WelcomeItem.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..f7fa1fd --- /dev/null +++ b/src/main.js @@ -0,0 +1,50 @@ +import './assets/main.css' +import './styles/global.css' + +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' +// 引入用户状态管理,确保在应用启动时初始化 +import './store/user' + +// 导入 Element Plus +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import * as ElementPlusIconsVue from '@element-plus/icons-vue' +// 导入 Element Plus 中文语言包 +import zhCn from 'element-plus/es/locale/lang/zh-cn' + +// 导入 Toast 通知组件 +import Toast from 'vue-toastification' +import 'vue-toastification/dist/index.css' + +// Toast 配置选项 +const toastOptions = { + position: "top-right", + timeout: 3000, + closeOnClick: true, + pauseOnFocusLoss: true, + pauseOnHover: true, + draggable: true, + draggablePercent: 0.6, + showCloseButtonOnHover: false, + hideProgressBar: false, + closeButton: "button", + icon: true, + rtl: false +} + +const app = createApp(App) + +// 注册所有 Element Plus 图标 +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} + +app.use(router) +app.use(Toast, toastOptions) +app.use(ElementPlus, { + locale: zhCn, +}) + +app.mount('#app') diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..747267e --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,531 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { ElMessage } from 'element-plus' +import LotterySelection from '../views/LotterySelection.vue' +import LotteryPremium from '../views/LotteryPremium.vue' +import Home from '../views/ssq/Home.vue' +import DltHome from '../views/dlt/Home.vue' +import LotteryInfo from '../views/LotteryInfo.vue' +import Profile from '../views/Profile.vue' +import Login from '../views/Login.vue' +import Register from '../views/Register.vue' +import ResetPassword from '../views/ResetPassword.vue' +import PredictRecords from '../views/PredictRecords.vue' +import DltPredictRecords from '../views/dlt/PredictRecords.vue' + +import ExcelImportManagement from '../views/ExcelImportManagement.vue' +import ExchangeRecords from '../views/ExchangeRecords.vue' +import TrendAnalysis from '../views/ssq/TrendAnalysis.vue' +import SurfaceAnalysis from '../views/ssq/SurfaceAnalysis.vue' +import LineAnalysis from '../views/ssq/LineAnalysis.vue' +import SsqTableAnalysis from '../views/ssq/SsqTableAnalysis.vue' +import DataAnalysis from '../views/DataAnalysis.vue' +import HelpCenter from '../views/HelpCenter.vue' +import AboutUs from '../views/AboutUs.vue' +import UserAgreement from '../views/UserAgreement.vue' +import UserGuide from '../views/UserGuide.vue' +import MemberAgreement from '../views/MemberAgreement.vue' +import HitAnalysis from '../views/ssq/HitAnalysis.vue' +import DltHitAnalysis from '../views/dlt/HitAnalysis.vue' +import UsageStats from '../views/ssq/UsageStats.vue' +import DltUsageStats from '../views/dlt/UsageStats.vue' +import PrizeStatistics from '../views/ssq/PrizeStatistics.vue' +import DltPrizeStatistics from '../views/dlt/PrizeStatistics.vue' + +// 双色球相关页面 +import SsqLottery from '../views/ssq/Lottery.vue' + +// 大乐透相关页面 +import DltLottery from '../views/dlt/Lottery.vue' +import DltTableAnalysis from '../views/dlt/DltTableAnalysis.vue' +import DltSurfaceAnalysis from '../views/dlt/SurfaceAnalysis.vue' +import DltLineAnalysis from '../views/dlt/LineAnalysis.vue' +import DltTrendAnalysis from '../views/dlt/TrendAnalysis.vue' + +// 精推版页面 +import JtSsqHome from '../views/jt/SsqHome.vue' +import JtDltHome from '../views/jt/DltHome.vue' + + +// 后台管理相关组件 +import AdminLogin from '../views/admin/AdminLogin.vue' +import AdminLayout from '../views/admin/layout/AdminLayout.vue' +import AdminVipCodeManagement from '../views/admin/VipCodeManagement.vue' +import AdminExcelImportManagement from '../views/admin/ExcelImportManagement.vue' +import AdminDltExcelImportManagement from '../views/admin/DltExcelImportManagement.vue' +import AdminPredictionManagement from '../views/admin/PredictionManagement.vue' +import AdminDltPredictionManagement from '../views/admin/DltPredictionManagement.vue' +import AdminPrizeStatistics from '../views/admin/PrizeStatistics.vue' +import AdminDltPrizeStatistics from '../views/admin/DltPrizeStatistics.vue' +import AdminUsageStats from '../views/ssq/UsageStats.vue' +import AdminDltUsageStats from '../views/dlt/UsageStats.vue' + +const routes = [ + // 前台用户路由 + { + path: '/', + name: 'LotterySelection', + component: LotterySelection + }, + { + path: '/lottery-premium', + name: 'LotteryPremium', + component: LotteryPremium + }, + { + path: '/shuangseqiu', + name: 'Shuangseqiu', + component: Home + }, + { + path: '/daletou', + name: 'DaLeTou', + component: DltHome + }, + { + path: '/jt/shuangseqiu', + name: 'JtShuangseqiu', + component: JtSsqHome + }, + { + path: '/jt/daletou', + name: 'JtDaLeTou', + component: JtDltHome + }, + { + path: '/lottery-info', + name: 'LotteryInfo', + component: LotteryInfo + }, + { + path: '/lottery-info/ssq', + name: 'SsqLottery', + component: SsqLottery + }, + { + path: '/lottery-info/dlt', + name: 'DltLottery', + component: DltLottery + }, + { + path: '/dlt-table-analysis', + name: 'DltTableAnalysis', + component: DltTableAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/dlt-surface-analysis', + name: 'DltSurfaceAnalysis', + component: DltSurfaceAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/dlt-line-analysis', + name: 'DltLineAnalysis', + component: DltLineAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/dlt-trend-analysis', + name: 'DltTrendAnalysis', + component: DltTrendAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/profile', + name: 'Profile', + component: Profile + }, + { + path: '/login', + name: 'Login', + component: Login + }, + { + path: '/reset-password', + name: 'ResetPassword', + component: ResetPassword + }, + { + path: '/register', + name: 'Register', + component: Register + }, + { + path: '/predict-records', + name: 'PredictRecords', + component: PredictRecords + }, + { + path: '/dlt/predict-records', + name: 'DltPredictRecords', + component: DltPredictRecords, + meta: { requiresAuth: true } + }, + + { + path: '/excel-import', + name: 'ExcelImportManagement', + component: ExcelImportManagement + }, + { + path: '/exchange-records', + name: 'ExchangeRecords', + component: ExchangeRecords + }, + { + path: '/trend-analysis', + name: 'TrendAnalysis', + component: TrendAnalysis + }, + { + path: '/surface-analysis', + name: 'SurfaceAnalysis', + component: SurfaceAnalysis + }, + { + path: '/line-analysis', + name: 'LineAnalysis', + component: LineAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/data-analysis', + name: 'DataAnalysis', + component: DataAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/hit-analysis', + name: 'HitAnalysis', + component: HitAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/daletou/hit-analysis', + name: 'DltHitAnalysis', + component: DltHitAnalysis, + meta: { requiresAuth: true } + }, + { + path: '/usage-stats', + name: 'UsageStats', + component: UsageStats, + meta: { requiresAuth: true } + }, + { + path: '/daletou/usage-stats', + name: 'DltUsageStats', + component: DltUsageStats, + meta: { requiresAuth: true } + }, + { + path: '/prize-statistics', + name: 'PrizeStatistics', + component: PrizeStatistics, + meta: { requiresAuth: true } + }, + { + path: '/daletou/prize-statistics', + name: 'DltPrizeStatistics', + component: DltPrizeStatistics, + meta: { requiresAuth: true } + }, + { + path: '/help-center', + name: 'HelpCenter', + component: HelpCenter, + meta: { requiresAuth: true } + }, + { + path: '/about-us', + name: 'AboutUs', + component: AboutUs, + meta: { requiresAuth: true } + }, + { + path: '/user-agreement', + name: 'UserAgreement', + component: UserAgreement, + meta: { requiresAuth: true } + }, + { + path: '/user-guide', + name: 'UserGuide', + component: UserGuide, + meta: { requiresAuth: true } + }, + { + path: '/member-agreement', + name: 'MemberAgreement', + component: MemberAgreement, + meta: { requiresAuth: true } + }, + { + path: '/table-analysis', + name: 'SsqTableAnalysis', + component: SsqTableAnalysis + }, + + + // 后台管理路由 - 完全隔离 + { + path: '/cpzsadmin/login', + name: 'AdminLogin', + component: AdminLogin, + meta: { + title: '后台登录', + requiresAuth: false, + isAdmin: true + } + }, + { + path: '/cpzsadmin', + component: AdminLayout, + meta: { + requiresAuth: true, + isAdmin: true + }, + children: [ + { + path: '', + redirect: '/cpzsadmin/dashboard' + }, + { + path: 'dashboard', + name: 'AdminDashboard', + component: () => import('../views/admin/Dashboard.vue'), + meta: { + title: '控制面板', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'vip-code', + name: 'AdminVipCodeManagement', + component: AdminVipCodeManagement, + meta: { + title: '会员码管理', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'excel-import', + meta: { + title: '数据导入', + requiresAuth: true, + isAdmin: true + }, + children: [ + { + path: '', + name: 'AdminExcelImportManagement', + component: AdminExcelImportManagement, + meta: { + title: '数据导入', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'ssq', + name: 'AdminExcelImportSSQ', + component: AdminExcelImportManagement, + meta: { + title: '双色球数据导入', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'dlt', + name: 'AdminExcelImportDLT', + component: AdminDltExcelImportManagement, + meta: { + title: '大乐透数据导入', + requiresAuth: true, + isAdmin: true + } + } + ] + }, + { + path: 'prediction', + meta: { + title: '推测管理', + requiresAuth: true, + isAdmin: true + }, + children: [ + { + path: 'ssq', + name: 'AdminPredictionSSQ', + component: AdminPredictionManagement, + meta: { + title: '双色球推测管理', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'dlt', + name: 'AdminPredictionDLT', + component: AdminDltPredictionManagement, + meta: { + title: '大乐透推测管理', + requiresAuth: true, + isAdmin: true + } + } + ] + }, + { + path: 'prize-statistics', + meta: { + title: '奖金统计', + requiresAuth: true, + isAdmin: true + }, + children: [ + { + path: 'ssq', + name: 'AdminPrizeStatisticsSSQ', + component: AdminPrizeStatistics, + meta: { + title: '双色球奖金统计', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'dlt', + name: 'AdminPrizeStatisticsDLT', + component: AdminDltPrizeStatistics, + meta: { + title: '大乐透奖金统计', + requiresAuth: true, + isAdmin: true + } + } + ] + }, + { + path: 'usage-stats', + meta: { + title: '使用统计', + requiresAuth: true, + isAdmin: true + }, + children: [ + { + path: 'ssq', + name: 'AdminUsageStatsSSQ', + component: AdminUsageStats, + meta: { + title: '双色球使用统计', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'dlt', + name: 'AdminUsageStatsDLT', + component: AdminDltUsageStats, + meta: { + title: '大乐透使用统计', + requiresAuth: true, + isAdmin: true + } + } + ] + }, + { + path: 'user-list', + name: 'AdminUserList', + component: () => import('../views/admin/UserList.vue'), + meta: { + title: '用户列表', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'operation-history', + name: 'AdminOperationHistory', + component: () => import('../views/admin/OperationHistory.vue'), + meta: { + title: '操作历史', + requiresAuth: true, + isAdmin: true + } + }, + { + path: 'announcement', + name: 'AdminAnnouncementManagement', + component: () => import('../views/admin/AnnouncementManagement.vue'), + meta: { + title: '公告管理', + requiresAuth: true, + isAdmin: true + } + } + ] + }, + + // 404 页面 + { + path: '/:pathMatch(.*)*', + name: 'NotFound', + component: () => import('../views/NotFound.vue') + } +] + +const router = createRouter({ + history: createWebHistory(), + routes +}) + +// 路由守卫 - 权限控制 +router.beforeEach((to, from, next) => { + // 设置页面标题 + if (to.meta.title) { + document.title = to.meta.title + ' - 彩票推测系统' + } + + // 后台管理路由权限检查 + if (to.meta.isAdmin) { + // 如果是登录页面,直接放行 + if (to.name === 'AdminLogin') { + next() + return + } + + // 从store中导入userStore + import('../store/user.js').then(({ userStore }) => { + // 检查是否已登录(使用session存储) + if (!userStore.isAdminLoggedIn()) { + ElMessage.error('请先登录后台管理系统') + next('/cpzsadmin/login') + return + } + + // 检查是否是管理员或VIP用户 + const adminInfo = JSON.parse(sessionStorage.getItem('adminInfo') || '{}') + if (adminInfo.userRole === 'user') { + ElMessage.error('您没有权限访问后台管理系统') + next('/cpzsadmin/login') + return + } + + next() + }).catch(error => { + console.error('加载用户状态出错:', error) + next('/cpzsadmin/login') + }) + } else { + next() + } +}) + +export default router \ No newline at end of file diff --git a/src/store/user.js b/src/store/user.js new file mode 100644 index 0000000..b7260fd --- /dev/null +++ b/src/store/user.js @@ -0,0 +1,283 @@ +import { reactive } from 'vue' +import { lotteryApi } from '../api/index.js' + +// 用户状态管理 +export const userStore = reactive({ + // 用户信息 + user: null, + isLoggedIn: false, + isKickedOut: false, // 标记是否被其他设备踢出 + lastCheckTime: null, // 最后一次检查登录状态的时间 + + // 获取登录用户信息 + async fetchLoginUser() { + try { + const response = await lotteryApi.getLoginUser() + if (response.success === true) { + const userData = response.data + // 更新用户信息,保留现有的本地数据结构 + this.user = { + id: String(userData.id), // 确保ID始终为字符串,避免精度丢失 + username: userData.userName || userData.userAccount || userData.username || userData.name, + email: userData.email, + phone: userData.phone, + nickname: userData.nickname || userData.userName || userData.userAccount || userData.username || userData.name, + avatar: userData.userAvatar || userData.avatar || null, + userType: userData.userType || 'trial', + isVip: userData.isVip, + expireDate: userData.vipExpire || userData.expireDate || '2025-06-30', + registeredAt: userData.createTime || userData.registeredAt || new Date().toISOString(), + status: userData.status !== undefined ? userData.status : 0, // 添加status字段,默认为0 (正常) + stats: { + predictCount: userData.stats?.predictCount || 0, + hitCount: userData.stats?.hitCount || 0, + hitRate: userData.stats?.hitRate || 0 + } + } + this.isLoggedIn = true + + // 保存到本地存储 + localStorage.setItem('user', JSON.stringify(this.user)) + localStorage.setItem('isLoggedIn', 'true') + + return this.user + } else { + console.error('获取用户信息失败:', response.message) + this.logout() + return null + } + } catch (error) { + console.error('获取用户信息出错:', error) + this.logout() + return null + } + }, + + // 登录 + login(userInfo) { + this.user = { + id: userInfo.id || Date.now(), + username: userInfo.username, + email: userInfo.email, + phone: userInfo.phone, + nickname: userInfo.nickname || userInfo.username, + avatar: userInfo.avatar || null, + userType: userInfo.userType || 'trial', // trial: 体验版, premium: 正式版 + expireDate: userInfo.expireDate || '2025-06-30', + registeredAt: userInfo.registeredAt || new Date().toISOString(), + stats: { + predictCount: userInfo.stats?.predictCount || 0, + hitCount: userInfo.stats?.hitCount || 0, + hitRate: userInfo.stats?.hitRate || 0 + } + } + this.isLoggedIn = true + this.isKickedOut = false // 重置被踢出状态 + this.lastCheckTime = Date.now() // 记录登录时间 + + // 保存到本地存储 + localStorage.setItem('user', JSON.stringify(this.user)) + localStorage.setItem('isLoggedIn', 'true') + }, + + // 登出 + logout(isKickedOut = false) { + // 如果是被踢出,标记状态 + if (isKickedOut) { + this.isKickedOut = true + console.log('[安全] 账号在其他设备登录,当前会话已被踢出') + } + + this.user = null; + this.isLoggedIn = false; + this.lastCheckTime = null; + + // 清除所有本地存储的用户信息 + localStorage.removeItem('user'); + localStorage.removeItem('userInfo'); + localStorage.removeItem('isLoggedIn'); + + // 清除可能存在的其他相关存储 + sessionStorage.removeItem('user'); + sessionStorage.removeItem('userInfo'); + sessionStorage.removeItem('isLoggedIn'); + }, + + // 更新用户信息 + updateUser(updates) { + if (this.user) { + Object.assign(this.user, updates) + localStorage.setItem('user', JSON.stringify(this.user)) + } + }, + + // 从本地存储恢复用户状态 + restoreFromStorage() { + const savedUser = localStorage.getItem('user') + const savedLoginState = localStorage.getItem('isLoggedIn') + + if (savedUser && savedLoginState === 'true') { + const user = JSON.parse(savedUser) + // 确保ID始终为字符串,避免精度丢失 + if (user.id) { + user.id = String(user.id) + } + this.user = user + this.isLoggedIn = true + } + }, + + // 更新用户统计 + updateStats(stats) { + if (this.user) { + this.user.stats = { ...this.user.stats, ...stats } + localStorage.setItem('user', JSON.stringify(this.user)) + } + }, + + // 检查用户是否为付费用户 + isPremiumUser() { + return this.user?.userType === 'premium' + }, + + // 获取用户ID + getUserId() { + return this.user?.id + }, + + // 设置用户信息(用于管理员登录) + setUserInfo(userInfo) { + this.user = { + id: String(userInfo.id), // 确保ID始终为字符串,避免精度丢失 + username: userInfo.userAccount || userInfo.userName, + nickname: userInfo.userName || userInfo.userAccount, + avatar: userInfo.avatar || null, + userRole: userInfo.userRole || 'user', + status: userInfo.status !== undefined ? userInfo.status : 0, // 添加status字段,默认为0 (正常) + createTime: userInfo.createTime || new Date().toISOString() + } + this.isLoggedIn = true + + // 使用sessionStorage而不是localStorage存储管理员登录状态 + sessionStorage.setItem('adminInfo', JSON.stringify(this.user)) + sessionStorage.setItem('adminLoggedIn', 'true') + }, + + // 获取用户信息 + getUserInfo() { + // 如果内存中有用户信息,直接返回 + if (this.user) { + return this.user; + } + + // 尝试从sessionStorage中获取管理员信息 + const adminInfo = sessionStorage.getItem('adminInfo'); + if (adminInfo) { + try { + const parsedAdminInfo = JSON.parse(adminInfo); + // 将解析后的信息赋值给this.user,确保内存中也有 + this.user = parsedAdminInfo; + return parsedAdminInfo; + } catch (e) { + console.error('解析管理员信息失败:', e); + } + } + + // 尝试从localStorage中获取普通用户信息 + const userInfo = localStorage.getItem('userInfo'); + if (userInfo) { + try { + return JSON.parse(userInfo); + } catch (e) { + console.error('解析用户信息失败:', e); + } + } + + // 如果都没有,返回空对象 + return {}; + }, + + // 检查管理员是否已登录 + isAdminLoggedIn() { + return sessionStorage.getItem('adminLoggedIn') === 'true' + }, + + // 管理员登出 + adminLogout(isKickedOut = false) { + // 如果是被踢出,标记状态 + if (isKickedOut) { + this.isKickedOut = true + console.log('[安全] 管理员账号在其他设备登录,当前会话已被踢出') + } + + this.user = null; + this.isLoggedIn = false; + this.lastCheckTime = null; + + // 清除所有session存储的管理员信息 + sessionStorage.removeItem('adminInfo'); + sessionStorage.removeItem('adminLoggedIn'); + }, + + // 主动检查登录状态是否有效 + async checkLoginStatus() { + // 如果没有登录,直接返回 + if (!this.isLoggedIn) { + return { valid: false, reason: 'not_logged_in' } + } + + // 避免频繁检查(10秒内只检查一次) + const now = Date.now() + if (this.lastCheckTime && (now - this.lastCheckTime) < 10000) { + return { valid: true, reason: 'recently_checked' } + } + + try { + // 调用后端接口验证登录状态 + const response = await lotteryApi.getLoginUser() + + if (response.success === true) { + // 登录状态有效,更新检查时间 + this.lastCheckTime = now + this.isKickedOut = false + return { valid: true, reason: 'verified' } + } else { + // 检查是否是被踢出 + const message = response.message || '' + if (message.includes('其他设备登录') || message.includes('当前会话已失效')) { + this.logout(true) // 标记为被踢出 + return { valid: false, reason: 'kicked_out', message } + } else { + this.logout(false) + return { valid: false, reason: 'session_expired', message } + } + } + } catch (error) { + console.error('[Store] 检查登录状态失败:', error) + // 网络错误等情况,不清除登录状态,让用户继续使用 + return { valid: true, reason: 'check_failed', error } + } + }, + + // 重置被踢出状态(用于重新登录后) + resetKickedOutStatus() { + this.isKickedOut = false + } +}) + +// 初始化时从本地存储恢复状态 +// 检查是否有管理员登录信息,优先恢复管理员状态 +const adminInfo = sessionStorage.getItem('adminInfo'); +if (adminInfo) { + try { + userStore.user = JSON.parse(adminInfo); + userStore.isLoggedIn = true; + } catch (e) { + console.error('恢复管理员状态失败:', e); + // 如果管理员信息恢复失败,尝试恢复普通用户状态 + userStore.restoreFromStorage(); + } +} else { + // 没有管理员信息,尝试恢复普通用户状态 + userStore.restoreFromStorage(); +} \ No newline at end of file diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..5644b54 --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,258 @@ +/* 全局样式 */ +* { + box-sizing: border-box; +} + +/* 强制设置根元素背景 */ +:root { + background: #f0f2f5 !important; +} + +html { + background: #f0f2f5 !important; + min-height: 100vh; + width: 100%; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin: 0 !important; + padding: 0 !important; + background: #f0f2f5 !important; + min-height: 100vh; + width: 100%; +} + +/* 后台管理系统样式 */ +.admin-layout, +.admin-login { + position: fixed !important; + top: 0 !important; + left: 0 !important; + right: 0 !important; + bottom: 0 !important; + width: 100vw !important; + height: 100vh !important; + overflow: hidden !important; + z-index: 9999 !important; +} + +/* 后台管理系统覆盖全局背景 */ +body.admin-body { + background: #f0f2f5 !important; + overflow: hidden; +} + +/* 页面头部样式 */ +.page-header { + text-align: center; + padding: 60px 20px 30px; + background: linear-gradient(135deg, #e53e3e 0%, #ff6b6b 100%); + color: white; + margin-bottom: 0; + position: relative; + overflow: hidden; +} + +.page-header::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: url('data:image/svg+xml,'); + pointer-events: none; +} + +.page-title { + font-size: 28px; + font-weight: 700; + margin-bottom: 8px; + position: relative; + z-index: 1; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.page-subtitle { + font-size: 16px; + opacity: 0.9; + position: relative; + z-index: 1; +} + +/* 通用按钮样式 */ +.btn { + display: inline-block; + padding: 12px 24px; + border-radius: 8px; + text-decoration: none; + font-weight: bold; + text-align: center; + transition: all 0.3s; + border: none; + cursor: pointer; + font-size: 14px; +} + +.btn-primary { + background: linear-gradient(135deg, #e53e3e, #ff6b6b); + color: white; +} + +.btn-primary:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(229, 62, 62, 0.3); +} + +.btn-secondary { + background: #f8f9fa; + color: #666; + border: 1px solid #e0e0e0; +} + +.btn-secondary:hover:not(:disabled) { + background: #e9ecef; + border-color: #ccc; +} + +.btn:disabled { + opacity: 0.7; + cursor: not-allowed; + transform: none !important; +} + +/* 通用模态框样式 */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +.modal-content { + background: white; + padding: 30px; + border-radius: 12px; + max-width: 400px; + width: 90%; + text-align: center; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); +} + +.modal-content h3 { + margin-bottom: 15px; + color: #333; + font-size: 18px; +} + +.modal-content p { + margin-bottom: 20px; + color: #666; + line-height: 1.5; + font-size: 14px; +} + +/* 容器样式 */ +.container { + width: 100%; + position: relative; +} + +/* 主页特殊容器 */ +.home-container { + background: #f0f2f5; + position: relative; + display: flex; + flex-direction: column; + flex: 1; +} + +/* 各页面容器 */ +.lottery-container, +.profile-container, +.login-page-container, +.register-page-container { + background: #f0f2f5; + position: relative; + padding: 0; + flex: 1; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .page-header { + padding: 20px 15px 15px; + } + + .page-title { + font-size: 20px; + } + + .page-subtitle { + font-size: 13px; + } + + .modal-content { + padding: 25px 20px; + } + + .lottery-container, + .profile-container, + .login-page-container, + .register-page-container { + padding: 0 15px; + } +} + +/* 加载动画 */ +.loading { + display: inline-block; + width: 16px; + height: 16px; + border: 2px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + border-top-color: white; + animation: spin 1s ease-in-out infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* 错误提示样式 */ +.error-message { + background: #ffebee; + color: #c62828; + padding: 12px; + border-radius: 6px; + font-size: 14px; + margin-bottom: 15px; + border-left: 4px solid #e53e3e; +} + +/* 成功提示样式 */ +.success-message { + background: #e8f5e8; + color: #2e7d32; + padding: 12px; + border-radius: 6px; + font-size: 14px; + margin-bottom: 15px; + border-left: 4px solid #4caf50; +} + +/* 隐藏子页面顶部背景图的浮动元素 */ +.page-header-modern::before { + display: none !important; +} \ No newline at end of file diff --git a/src/views/AboutUs.vue b/src/views/AboutUs.vue new file mode 100644 index 0000000..26402cb --- /dev/null +++ b/src/views/AboutUs.vue @@ -0,0 +1,797 @@ + + + + + \ No newline at end of file diff --git a/src/views/DataAnalysis.vue b/src/views/DataAnalysis.vue new file mode 100644 index 0000000..d1153b3 --- /dev/null +++ b/src/views/DataAnalysis.vue @@ -0,0 +1,763 @@ + + + + + \ No newline at end of file diff --git a/src/views/ExcelImportManagement.vue b/src/views/ExcelImportManagement.vue new file mode 100644 index 0000000..d051f4e --- /dev/null +++ b/src/views/ExcelImportManagement.vue @@ -0,0 +1,769 @@ + + + + + \ No newline at end of file diff --git a/src/views/ExchangeRecords.vue b/src/views/ExchangeRecords.vue new file mode 100644 index 0000000..8b7c7c3 --- /dev/null +++ b/src/views/ExchangeRecords.vue @@ -0,0 +1,924 @@ + + + + + \ No newline at end of file diff --git a/src/views/HelpCenter.vue b/src/views/HelpCenter.vue new file mode 100644 index 0000000..03eca8e --- /dev/null +++ b/src/views/HelpCenter.vue @@ -0,0 +1,490 @@ + + + + + \ No newline at end of file diff --git a/src/views/Login.vue b/src/views/Login.vue new file mode 100644 index 0000000..f160be6 --- /dev/null +++ b/src/views/Login.vue @@ -0,0 +1,924 @@ + + + + + \ No newline at end of file diff --git a/src/views/LotteryInfo.vue b/src/views/LotteryInfo.vue new file mode 100644 index 0000000..3fcba21 --- /dev/null +++ b/src/views/LotteryInfo.vue @@ -0,0 +1,770 @@ + + + + + \ No newline at end of file diff --git a/src/views/LotteryPremium.vue b/src/views/LotteryPremium.vue new file mode 100644 index 0000000..8eeaf0e --- /dev/null +++ b/src/views/LotteryPremium.vue @@ -0,0 +1,1275 @@ + + + + + \ No newline at end of file diff --git a/src/views/LotterySelection.vue b/src/views/LotterySelection.vue new file mode 100644 index 0000000..61d5223 --- /dev/null +++ b/src/views/LotterySelection.vue @@ -0,0 +1,1280 @@ + + + + + \ No newline at end of file diff --git a/src/views/MemberAgreement.vue b/src/views/MemberAgreement.vue new file mode 100644 index 0000000..0244ecb --- /dev/null +++ b/src/views/MemberAgreement.vue @@ -0,0 +1,543 @@ + + + + + diff --git a/src/views/NotFound.vue b/src/views/NotFound.vue new file mode 100644 index 0000000..8c8261e --- /dev/null +++ b/src/views/NotFound.vue @@ -0,0 +1,487 @@ + + + + + \ No newline at end of file diff --git a/src/views/PredictRecords.vue b/src/views/PredictRecords.vue new file mode 100644 index 0000000..a6ff277 --- /dev/null +++ b/src/views/PredictRecords.vue @@ -0,0 +1,1388 @@ + + + + + \ No newline at end of file diff --git a/src/views/Profile.vue b/src/views/Profile.vue new file mode 100644 index 0000000..f433d6a --- /dev/null +++ b/src/views/Profile.vue @@ -0,0 +1,2159 @@ + + + + + \ No newline at end of file diff --git a/src/views/Register.vue b/src/views/Register.vue new file mode 100644 index 0000000..04b1320 --- /dev/null +++ b/src/views/Register.vue @@ -0,0 +1,982 @@ + + + + + \ No newline at end of file diff --git a/src/views/ResetPassword.vue b/src/views/ResetPassword.vue new file mode 100644 index 0000000..27c7193 --- /dev/null +++ b/src/views/ResetPassword.vue @@ -0,0 +1,743 @@ + + + + + \ No newline at end of file diff --git a/src/views/UserAgreement.vue b/src/views/UserAgreement.vue new file mode 100644 index 0000000..fbc839e --- /dev/null +++ b/src/views/UserAgreement.vue @@ -0,0 +1,196 @@ + + + + + \ No newline at end of file diff --git a/src/views/UserGuide.vue b/src/views/UserGuide.vue new file mode 100644 index 0000000..d5f9da5 --- /dev/null +++ b/src/views/UserGuide.vue @@ -0,0 +1,727 @@ + + + + + diff --git a/src/views/admin/AdminLogin.vue b/src/views/admin/AdminLogin.vue new file mode 100644 index 0000000..57979b5 --- /dev/null +++ b/src/views/admin/AdminLogin.vue @@ -0,0 +1,447 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/AnnouncementManagement.vue b/src/views/admin/AnnouncementManagement.vue new file mode 100644 index 0000000..fa50280 --- /dev/null +++ b/src/views/admin/AnnouncementManagement.vue @@ -0,0 +1,753 @@ + + + + + diff --git a/src/views/admin/Dashboard.vue b/src/views/admin/Dashboard.vue new file mode 100644 index 0000000..b7e7fad --- /dev/null +++ b/src/views/admin/Dashboard.vue @@ -0,0 +1,926 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/DltExcelImportManagement.vue b/src/views/admin/DltExcelImportManagement.vue new file mode 100644 index 0000000..8eba8fa --- /dev/null +++ b/src/views/admin/DltExcelImportManagement.vue @@ -0,0 +1,779 @@ + + + + + + diff --git a/src/views/admin/DltPredictionManagement.vue b/src/views/admin/DltPredictionManagement.vue new file mode 100644 index 0000000..136e87a --- /dev/null +++ b/src/views/admin/DltPredictionManagement.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/src/views/admin/DltPrizeStatistics.vue b/src/views/admin/DltPrizeStatistics.vue new file mode 100644 index 0000000..0f5b5f3 --- /dev/null +++ b/src/views/admin/DltPrizeStatistics.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/views/admin/ExcelImportManagement.vue b/src/views/admin/ExcelImportManagement.vue new file mode 100644 index 0000000..24736c3 --- /dev/null +++ b/src/views/admin/ExcelImportManagement.vue @@ -0,0 +1,789 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/OperationHistory.vue b/src/views/admin/OperationHistory.vue new file mode 100644 index 0000000..a543ac5 --- /dev/null +++ b/src/views/admin/OperationHistory.vue @@ -0,0 +1,435 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/PredictionManagement.vue b/src/views/admin/PredictionManagement.vue new file mode 100644 index 0000000..1e6b2e0 --- /dev/null +++ b/src/views/admin/PredictionManagement.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/src/views/admin/PrizeStatistics.vue b/src/views/admin/PrizeStatistics.vue new file mode 100644 index 0000000..7bcec1c --- /dev/null +++ b/src/views/admin/PrizeStatistics.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/views/admin/UserList.vue b/src/views/admin/UserList.vue new file mode 100644 index 0000000..5118d92 --- /dev/null +++ b/src/views/admin/UserList.vue @@ -0,0 +1,1162 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/UserRole.vue b/src/views/admin/UserRole.vue new file mode 100644 index 0000000..079b6e3 --- /dev/null +++ b/src/views/admin/UserRole.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/VipCodeManagement.vue b/src/views/admin/VipCodeManagement.vue new file mode 100644 index 0000000..5ed8b38 --- /dev/null +++ b/src/views/admin/VipCodeManagement.vue @@ -0,0 +1,1089 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/layout/AdminLayout.vue b/src/views/admin/layout/AdminLayout.vue new file mode 100644 index 0000000..f7c062f --- /dev/null +++ b/src/views/admin/layout/AdminLayout.vue @@ -0,0 +1,611 @@ + + + + + \ No newline at end of file diff --git a/src/views/dlt/DltTableAnalysis.vue b/src/views/dlt/DltTableAnalysis.vue new file mode 100644 index 0000000..1ea14ae --- /dev/null +++ b/src/views/dlt/DltTableAnalysis.vue @@ -0,0 +1,431 @@ + + + + + + diff --git a/src/views/dlt/HitAnalysis.vue b/src/views/dlt/HitAnalysis.vue new file mode 100644 index 0000000..abfbdd8 --- /dev/null +++ b/src/views/dlt/HitAnalysis.vue @@ -0,0 +1,831 @@ + + + + + diff --git a/src/views/dlt/Home.vue b/src/views/dlt/Home.vue new file mode 100644 index 0000000..4c2400c --- /dev/null +++ b/src/views/dlt/Home.vue @@ -0,0 +1,3840 @@ + + + + + diff --git a/src/views/dlt/LineAnalysis.vue b/src/views/dlt/LineAnalysis.vue new file mode 100644 index 0000000..536aadf --- /dev/null +++ b/src/views/dlt/LineAnalysis.vue @@ -0,0 +1,813 @@ + + + + + diff --git a/src/views/dlt/Lottery.vue b/src/views/dlt/Lottery.vue new file mode 100644 index 0000000..755e16e --- /dev/null +++ b/src/views/dlt/Lottery.vue @@ -0,0 +1,1369 @@ + + + + + + diff --git a/src/views/dlt/PredictRecords.vue b/src/views/dlt/PredictRecords.vue new file mode 100644 index 0000000..2b08ae6 --- /dev/null +++ b/src/views/dlt/PredictRecords.vue @@ -0,0 +1,1324 @@ + + + + + diff --git a/src/views/dlt/PrizeStatistics.vue b/src/views/dlt/PrizeStatistics.vue new file mode 100644 index 0000000..da591f8 --- /dev/null +++ b/src/views/dlt/PrizeStatistics.vue @@ -0,0 +1,621 @@ + + + + + + diff --git a/src/views/dlt/SurfaceAnalysis.vue b/src/views/dlt/SurfaceAnalysis.vue new file mode 100644 index 0000000..560f1f6 --- /dev/null +++ b/src/views/dlt/SurfaceAnalysis.vue @@ -0,0 +1,913 @@ + + + + + diff --git a/src/views/dlt/TrendAnalysis.vue b/src/views/dlt/TrendAnalysis.vue new file mode 100644 index 0000000..c687427 --- /dev/null +++ b/src/views/dlt/TrendAnalysis.vue @@ -0,0 +1,817 @@ + + + + + diff --git a/src/views/dlt/UsageStats.vue b/src/views/dlt/UsageStats.vue new file mode 100644 index 0000000..eafb54b --- /dev/null +++ b/src/views/dlt/UsageStats.vue @@ -0,0 +1,719 @@ + + + + + diff --git a/src/views/jt/DltHome.vue b/src/views/jt/DltHome.vue new file mode 100644 index 0000000..c36d33c --- /dev/null +++ b/src/views/jt/DltHome.vue @@ -0,0 +1,4108 @@ + + + + + + \ No newline at end of file diff --git a/src/views/jt/SsqHome.vue b/src/views/jt/SsqHome.vue new file mode 100644 index 0000000..f3e273e --- /dev/null +++ b/src/views/jt/SsqHome.vue @@ -0,0 +1,3786 @@ + + + + + \ No newline at end of file diff --git a/src/views/ssq/HitAnalysis.vue b/src/views/ssq/HitAnalysis.vue new file mode 100644 index 0000000..ed881c3 --- /dev/null +++ b/src/views/ssq/HitAnalysis.vue @@ -0,0 +1,791 @@ + + + + + diff --git a/src/views/ssq/Home.vue b/src/views/ssq/Home.vue new file mode 100644 index 0000000..b8678ee --- /dev/null +++ b/src/views/ssq/Home.vue @@ -0,0 +1,3738 @@ + + + + + \ No newline at end of file diff --git a/src/views/ssq/LineAnalysis.vue b/src/views/ssq/LineAnalysis.vue new file mode 100644 index 0000000..c5543ae --- /dev/null +++ b/src/views/ssq/LineAnalysis.vue @@ -0,0 +1,767 @@ + + + + + \ No newline at end of file diff --git a/src/views/ssq/Lottery.vue b/src/views/ssq/Lottery.vue new file mode 100644 index 0000000..83b628b --- /dev/null +++ b/src/views/ssq/Lottery.vue @@ -0,0 +1,1359 @@ + + + + + diff --git a/src/views/ssq/PrizeStatistics.vue b/src/views/ssq/PrizeStatistics.vue new file mode 100644 index 0000000..b71251b --- /dev/null +++ b/src/views/ssq/PrizeStatistics.vue @@ -0,0 +1,624 @@ + + + + + \ No newline at end of file diff --git a/src/views/ssq/SsqTableAnalysis.vue b/src/views/ssq/SsqTableAnalysis.vue new file mode 100644 index 0000000..cfb7c16 --- /dev/null +++ b/src/views/ssq/SsqTableAnalysis.vue @@ -0,0 +1,424 @@ + + + + + diff --git a/src/views/ssq/SurfaceAnalysis.vue b/src/views/ssq/SurfaceAnalysis.vue new file mode 100644 index 0000000..b5c7cee --- /dev/null +++ b/src/views/ssq/SurfaceAnalysis.vue @@ -0,0 +1,892 @@ + + + + + \ No newline at end of file diff --git a/src/views/ssq/TrendAnalysis.vue b/src/views/ssq/TrendAnalysis.vue new file mode 100644 index 0000000..fd3f3b8 --- /dev/null +++ b/src/views/ssq/TrendAnalysis.vue @@ -0,0 +1,793 @@ + + + + + \ No newline at end of file diff --git a/src/views/ssq/UsageStats.vue b/src/views/ssq/UsageStats.vue new file mode 100644 index 0000000..ed66f55 --- /dev/null +++ b/src/views/ssq/UsageStats.vue @@ -0,0 +1,720 @@ + + + + + diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..5151513 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,52 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, + server: { + host: '0.0.0.0', // 允许局域网访问 + port: 5173 + }, + build: { + minify: 'terser', + terserOptions: { + compress: { + drop_console: true, + drop_debugger: true + } + }, + // 生成带hash的文件名,避免浏览器缓存 + rollupOptions: { + output: { + // 入口文件名 + entryFileNames: 'assets/js/[name].[hash].js', + // 代码分割文件名 + chunkFileNames: 'assets/js/[name].[hash].js', + // 资源文件名 + assetFileNames: (assetInfo) => { + // 根据文件类型分目录存放 + if (assetInfo.name.endsWith('.css')) { + return 'assets/css/[name].[hash].[ext]' + } + if (/\.(png|jpe?g|gif|svg|webp|ico)$/.test(assetInfo.name)) { + return 'assets/images/[name].[hash].[ext]' + } + if (/\.(woff2?|eot|ttf|otf)$/.test(assetInfo.name)) { + return 'assets/fonts/[name].[hash].[ext]' + } + return 'assets/[name].[hash].[ext]' + } + } + } + } +}) \ No newline at end of file