Browse Source

Merge branch 'milestone-20250722-抽奖' of http://39.101.133.168:8807/hongxilin/activityLink into wangyi/feature-20250710191445-抽奖

songtongtong/feature-20250717104937-众筹
Ethereal 4 weeks ago
parent
commit
93ecc22a6b
  1. 2
      .env.production
  2. 2
      README.md
  3. 2
      index.html
  4. 256
      package-lock.json
  5. 5
      package.json
  6. BIN
      public/img/edifier.jpg
  7. BIN
      public/img/huawei.png
  8. BIN
      public/img/ipad.jpg
  9. BIN
      public/img/kindle.jpg
  10. BIN
      public/img/mbp.jpg
  11. BIN
      public/img/secrit.jpg
  12. BIN
      public/img/spark.jpg
  13. 72
      src/api/API.js
  14. 11
      src/assets/css/animate.min.css
  15. BIN
      src/assets/img/bg.png
  16. BIN
      src/assets/img/展开.png
  17. BIN
      src/assets/img/待揭秘.png
  18. BIN
      src/assets/img/抽奖按钮.png
  19. BIN
      src/assets/img/麒麟.png
  20. BIN
      src/data/music.mp3
  21. 27
      src/main.js
  22. 5
      src/router/index.js
  23. 56
      src/style.css
  24. 320
      src/utils/CSS3DRenderer.js
  25. 517
      src/utils/TrackballControls.js
  26. 110
      src/utils/config.js
  27. 260
      src/utils/prizeList.js
  28. 1
      src/utils/request.js
  29. 957
      src/utils/three.min.js
  30. 1
      src/utils/tween.min.js
  31. 2
      src/views/choujiang/Login.vue
  32. 2108
      src/views/choujiang/hxl-cj/cj.vue
  33. 103
      src/views/choujiang/lottery/Lottery3D.vue
  34. 8
      src/views/choujiang/lottery/dataManager.js
  35. 18
      vite.config.js
  36. 22
      vite.config.js.timestamp-1753077096347-78067037e45f7.mjs

2
.env.production

@ -9,7 +9,7 @@ VITE_PUBLIC_PATH = /aixiaocaishen
VITE_USE_MOCK = true
#新数据接口
# VITE_APP_API_BASE_URL = https://api.homilychart.com/link
VITE_APP_API_BASE_URL = https://dbqb.nfdxy.net/devLotApi
# Whether to enable gzip or brotli compression
# Optional: gzip | brotli | none

2
README.md

@ -8,3 +8,5 @@ npm install
npm install vue-router
npm install axios
npm install element-plus --save
npm install pinia
npm install three

2
index.html

@ -7,6 +7,8 @@
<title>Vite + Vue</title>
</head>
<body>
<script src="/src/utils/tween.min.js"></script>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>

256
package-lock.json

@ -11,10 +11,9 @@
"@tweenjs/tween.js": "^18.6.4",
"@vitejs/plugin-vue": "^4.6.2",
"axios": "^1.10.0",
"element-plus": "^2.10.4",
"element-plus": "^2.10.3",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.4.1",
"three": "^0.150.1",
"three": "^0.178.0",
"vite": "^4.5.3",
"vue": "^3.5.17",
"vue-router": "^4.5.1"
@ -537,18 +536,9 @@
"@vue/shared": "3.5.17"
}
},
"node_modules/@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"license": "MIT",
"dependencies": {
"@vue/devtools-kit": "^7.7.7"
}
},
"node_modules/@vue/devtools-kit": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
"integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==",
"license": "MIT",
"dependencies": {
@ -563,7 +553,7 @@
},
"node_modules/@vue/devtools-shared": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
"integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==",
"license": "MIT",
"dependencies": {
@ -760,7 +750,7 @@
},
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
"license": "MIT",
@ -772,9 +762,9 @@
}
},
"node_modules/birpc": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
"integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==",
"version": "2.4.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/birpc/-/birpc-2.4.0.tgz",
"integrity": "sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
@ -850,7 +840,7 @@
},
"node_modules/copy-anything": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/copy-anything/-/copy-anything-3.0.5.tgz",
"integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
"license": "MIT",
"dependencies": {
@ -891,18 +881,6 @@
}
}
},
"node_modules/deep-pick-omit": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
"integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==",
"license": "MIT"
},
"node_modules/defu": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"license": "MIT"
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
@ -911,12 +889,6 @@
"node": ">=0.4.0"
}
},
"node_modules/destr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
"integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
"license": "MIT"
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
@ -1259,7 +1231,7 @@
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"license": "MIT",
@ -1272,7 +1244,7 @@
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
@ -1282,7 +1254,7 @@
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
@ -1295,7 +1267,7 @@
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
@ -1305,7 +1277,7 @@
},
"node_modules/is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-what/-/is-what-4.1.16.tgz",
"integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
"license": "MIT",
"engines": {
@ -1407,7 +1379,7 @@
},
"node_modules/mlly": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/mlly/-/mlly-1.7.4.tgz",
"integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
"dev": true,
"license": "MIT",
@ -1420,14 +1392,14 @@
},
"node_modules/mlly/node_modules/confbox": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/confbox/-/confbox-0.1.8.tgz",
"integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
"dev": true,
"license": "MIT"
},
"node_modules/mlly/node_modules/pkg-types": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/pkg-types/-/pkg-types-1.3.1.tgz",
"integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
"dev": true,
"license": "MIT",
@ -1439,7 +1411,7 @@
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"license": "MIT"
@ -1478,14 +1450,14 @@
},
"node_modules/pathe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/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.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"license": "MIT"
},
@ -1496,7 +1468,7 @@
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
@ -1509,7 +1481,7 @@
},
"node_modules/pinia": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/pinia/-/pinia-3.0.3.tgz",
"integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==",
"license": "MIT",
"dependencies": {
@ -1528,36 +1500,18 @@
}
}
},
"node_modules/pinia-plugin-persistedstate": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.4.1.tgz",
"integrity": "sha512-lmuMPpXla2zJKjxEq34e1E9P9jxkWEhcVwwioCCE0izG45kkTOvQfCzvwhW3i38cvnaWC7T1eRdkd15Re59ldw==",
"node_modules/pinia/node_modules/@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"license": "MIT",
"dependencies": {
"deep-pick-omit": "^1.2.1",
"defu": "^6.1.4",
"destr": "^2.0.5"
},
"peerDependencies": {
"@nuxt/kit": ">=3.0.0",
"@pinia/nuxt": ">=0.10.0",
"pinia": ">=3.0.0"
},
"peerDependenciesMeta": {
"@nuxt/kit": {
"optional": true
},
"@pinia/nuxt": {
"optional": true
},
"pinia": {
"optional": true
}
"@vue/devtools-kit": "^7.7.7"
}
},
"node_modules/pkg-types": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/pkg-types/-/pkg-types-2.2.0.tgz",
"integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==",
"dev": true,
"license": "MIT",
@ -1601,7 +1555,7 @@
},
"node_modules/quansync": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/quansync/-/quansync-0.2.10.tgz",
"integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==",
"dev": true,
"funding": [
@ -1618,7 +1572,7 @@
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
@ -1631,7 +1585,7 @@
},
"node_modules/readdirp/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
@ -1644,7 +1598,7 @@
},
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"license": "MIT"
},
@ -1680,7 +1634,7 @@
},
"node_modules/speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
"license": "BSD-3-Clause",
"engines": {
@ -1702,7 +1656,7 @@
},
"node_modules/superjson": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/superjson/-/superjson-2.2.2.tgz",
"integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
"license": "MIT",
"dependencies": {
@ -1713,13 +1667,14 @@
}
},
"node_modules/three": {
"version": "0.150.1",
"resolved": "https://registry.npmmirror.com/three/-/three-0.150.1.tgz",
"integrity": "sha512-5C1MqKUWaHYo13BX0Q64qcdwImgnnjSOFgBscOzAo8MYCzEtqfQqorEKMcajnA3FHy1yVlIe9AmaMQ0OQracNA=="
"version": "0.178.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/three/-/three-0.178.0.tgz",
"integrity": "sha512-ybFIB0+x8mz0wnZgSGy2MO/WCO6xZhQSZnmfytSPyNpM0sBafGRVhdaj+erYh5U+RhQOAg/eXqw5uVDiM2BjhQ==",
"license": "MIT"
},
"node_modules/tinyglobby": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/tinyglobby/-/tinyglobby-0.2.14.tgz",
"integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
"dev": true,
"license": "MIT",
@ -1736,7 +1691,7 @@
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
@ -1749,14 +1704,14 @@
},
"node_modules/ufo": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/ufo/-/ufo-1.6.1.tgz",
"integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
"dev": true,
"license": "MIT"
},
"node_modules/unimport": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-4.2.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unimport/-/unimport-4.2.0.tgz",
"integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==",
"dev": true,
"license": "MIT",
@ -1782,7 +1737,7 @@
},
"node_modules/unimport/node_modules/estree-walker": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/estree-walker/-/estree-walker-3.0.3.tgz",
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
"license": "MIT",
@ -1792,7 +1747,7 @@
},
"node_modules/unplugin": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.5.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin/-/unplugin-2.3.5.tgz",
"integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==",
"dev": true,
"license": "MIT",
@ -1807,7 +1762,7 @@
},
"node_modules/unplugin-auto-import": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.3.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin-auto-import/-/unplugin-auto-import-19.3.0.tgz",
"integrity": "sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==",
"dev": true,
"license": "MIT",
@ -1840,7 +1795,7 @@
},
"node_modules/unplugin-utils": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin-utils/-/unplugin-utils-0.2.4.tgz",
"integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==",
"dev": true,
"license": "MIT",
@ -1857,7 +1812,7 @@
},
"node_modules/unplugin-vue-components": {
"version": "28.8.0",
"resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz",
"integrity": "sha512-2Q6ZongpoQzuXDK0ZsVzMoshH0MWZQ1pzVL538G7oIDKRTVzHjppBDS8aB99SADGHN3lpGU7frraCG6yWNoL5Q==",
"dev": true,
"license": "MIT",
@ -2276,17 +2231,9 @@
"@vue/shared": "3.5.17"
}
},
"@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"requires": {
"@vue/devtools-kit": "^7.7.7"
}
},
"@vue/devtools-kit": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
"integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==",
"requires": {
"@vue/devtools-shared": "^7.7.7",
@ -2300,7 +2247,7 @@
},
"@vue/devtools-shared": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
"integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==",
"requires": {
"rfdc": "^1.4.1"
@ -2434,14 +2381,14 @@
},
"binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true
},
"birpc": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
"integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="
"version": "2.4.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/birpc/-/birpc-2.4.0.tgz",
"integrity": "sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg=="
},
"braces": {
"version": "3.0.3",
@ -2493,7 +2440,7 @@
},
"copy-anything": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/copy-anything/-/copy-anything-3.0.5.tgz",
"integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
"requires": {
"is-what": "^4.1.8"
@ -2518,26 +2465,11 @@
"ms": "^2.1.3"
}
},
"deep-pick-omit": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
"integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw=="
},
"defu": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"destr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
"integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="
},
"dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
@ -2767,7 +2699,7 @@
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
@ -2776,13 +2708,13 @@
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": {
@ -2791,13 +2723,13 @@
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/is-what/-/is-what-4.1.16.tgz",
"integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="
},
"js-tokens": {
@ -2871,7 +2803,7 @@
},
"mlly": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/mlly/-/mlly-1.7.4.tgz",
"integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
"dev": true,
"requires": {
@ -2883,13 +2815,13 @@
"dependencies": {
"confbox": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/confbox/-/confbox-0.1.8.tgz",
"integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
"dev": true
},
"pkg-types": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/pkg-types/-/pkg-types-1.3.1.tgz",
"integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
"dev": true,
"requires": {
@ -2902,7 +2834,7 @@
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
@ -2924,13 +2856,13 @@
},
"pathe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/pathe/-/pathe-2.0.3.tgz",
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
"dev": true
},
"perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="
},
"picocolors": {
@ -2940,31 +2872,31 @@
},
"picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true
},
"pinia": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/pinia/-/pinia-3.0.3.tgz",
"integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==",
"requires": {
"@vue/devtools-api": "^7.7.2"
}
},
"pinia-plugin-persistedstate": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.4.1.tgz",
"integrity": "sha512-lmuMPpXla2zJKjxEq34e1E9P9jxkWEhcVwwioCCE0izG45kkTOvQfCzvwhW3i38cvnaWC7T1eRdkd15Re59ldw==",
"dependencies": {
"@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"requires": {
"deep-pick-omit": "^1.2.1",
"defu": "^6.1.4",
"destr": "^2.0.5"
"@vue/devtools-kit": "^7.7.7"
}
}
}
},
"pkg-types": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/pkg-types/-/pkg-types-2.2.0.tgz",
"integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==",
"dev": true,
"requires": {
@ -2990,13 +2922,13 @@
},
"quansync": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/quansync/-/quansync-0.2.10.tgz",
"integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==",
"dev": true
},
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
@ -3005,7 +2937,7 @@
"dependencies": {
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
}
@ -3013,7 +2945,7 @@
},
"rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
},
"rollup": {
@ -3037,7 +2969,7 @@
},
"speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="
},
"strip-literal": {
@ -3051,20 +2983,20 @@
},
"superjson": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/superjson/-/superjson-2.2.2.tgz",
"integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
"requires": {
"copy-anything": "^3.0.2"
}
},
"three": {
"version": "0.150.1",
"resolved": "https://registry.npmmirror.com/three/-/three-0.150.1.tgz",
"integrity": "sha512-5C1MqKUWaHYo13BX0Q64qcdwImgnnjSOFgBscOzAo8MYCzEtqfQqorEKMcajnA3FHy1yVlIe9AmaMQ0OQracNA=="
"version": "0.178.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/three/-/three-0.178.0.tgz",
"integrity": "sha512-ybFIB0+x8mz0wnZgSGy2MO/WCO6xZhQSZnmfytSPyNpM0sBafGRVhdaj+erYh5U+RhQOAg/eXqw5uVDiM2BjhQ=="
},
"tinyglobby": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/tinyglobby/-/tinyglobby-0.2.14.tgz",
"integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
"dev": true,
"requires": {
@ -3074,7 +3006,7 @@
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
@ -3083,13 +3015,13 @@
},
"ufo": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/ufo/-/ufo-1.6.1.tgz",
"integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
"dev": true
},
"unimport": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-4.2.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unimport/-/unimport-4.2.0.tgz",
"integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==",
"dev": true,
"requires": {
@ -3111,7 +3043,7 @@
"dependencies": {
"estree-walker": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/estree-walker/-/estree-walker-3.0.3.tgz",
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
"requires": {
@ -3122,7 +3054,7 @@
},
"unplugin": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.5.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin/-/unplugin-2.3.5.tgz",
"integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==",
"dev": true,
"requires": {
@ -3133,7 +3065,7 @@
},
"unplugin-auto-import": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.3.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin-auto-import/-/unplugin-auto-import-19.3.0.tgz",
"integrity": "sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==",
"dev": true,
"requires": {
@ -3147,7 +3079,7 @@
},
"unplugin-utils": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin-utils/-/unplugin-utils-0.2.4.tgz",
"integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==",
"dev": true,
"requires": {
@ -3157,7 +3089,7 @@
},
"unplugin-vue-components": {
"version": "28.8.0",
"resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz",
"integrity": "sha512-2Q6ZongpoQzuXDK0ZsVzMoshH0MWZQ1pzVL538G7oIDKRTVzHjppBDS8aB99SADGHN3lpGU7frraCG6yWNoL5Q==",
"dev": true,
"requires": {

5
package.json

@ -12,10 +12,9 @@
"@tweenjs/tween.js": "^18.6.4",
"@vitejs/plugin-vue": "^4.6.2",
"axios": "^1.10.0",
"three": "^0.150.1",
"element-plus": "^2.10.4",
"element-plus": "^2.10.3",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.4.1",
"three": "^0.178.0",
"vite": "^4.5.3",
"vue": "^3.5.17",
"vue-router": "^4.5.1"

BIN
public/img/edifier.jpg

After

Width: 198  |  Height: 198  |  Size: 23 KiB

BIN
public/img/huawei.png

After

Width: 200  |  Height: 200  |  Size: 49 KiB

BIN
public/img/ipad.jpg

After

Width: 220  |  Height: 220  |  Size: 44 KiB

BIN
public/img/kindle.jpg

After

Width: 289  |  Height: 289  |  Size: 42 KiB

BIN
public/img/mbp.jpg

After

Width: 220  |  Height: 220  |  Size: 6.9 KiB

BIN
public/img/secrit.jpg

After

Width: 224  |  Height: 224  |  Size: 12 KiB

BIN
public/img/spark.jpg

After

Width: 260  |  Height: 260  |  Size: 37 KiB

72
src/api/API.js

@ -3,56 +3,54 @@ import request from "../utils/request";
const APIurl = import.meta.env.VITE_APP_API_BASE_URL;
export function getPrizeList(){
// 查询所有奖品和对应等级,按sort排序
export const getPrizeListApi = function (params) {
return request({
url: '/prize/list',
method: 'post'
})
}
url: `${APIurl}/api/prize/list`,
method: "POST",
data: new URLSearchParams(params),
});
};
// 查询用户
export const getUserListApi = function (params) {
return request({
url: `${APIurl}/api/user/list`,
method: "POST",
data: new URLSearchParams(params),
});
};
export function getUserList(){
// 查询中奖名单
export const getGetPrizeUserListApi = function (params) {
return request({
url: '/user/list',
method: 'post'
})
}
url: `${APIurl}/admin/win/list`,
method: "POST",
data: params,
});
};
export function startLottery(data){
// 开始抽奖
export const startLotteryApi = function (params) {
return request({
url: '/lottery/start',
method: 'post',
data: {
gradeName: data.gradeName,
prizeName: data.prizeName,
perWin: data.perWin
}
})
}
url: `${APIurl}/api/lottery/start`,
method: "POST",
data: params,
});
};
// 新增:每轮抽奖接口
export function drawLottery(data){
export function drawLottery(data) {
return request({
url: '/lottery/start',
method: 'post',
url: `${APIurl}/api/lottery/start`,
method: "post",
data: {
gradeName: data.gradeName,
prizeName: data.prizeName,
perWin: data.perWin,
remainNum: data.remainNum,
gradeId: data.gradeId,
prizeId: data.prizeId
}
})
}
export function updatePrizeList(){
return axios({
url: APIurl + '/admin/win/list',
method: 'post',
data: {},
headers: {
'Content-Type': 'application/json'
}
})
prizeId: data.prizeId,
},
});
}

11
src/assets/css/animate.min.css
File diff suppressed because it is too large
View File

BIN
src/assets/img/bg.png

After

Width: 1920  |  Height: 1080  |  Size: 1.8 MiB

BIN
src/assets/img/展开.png

After

Width: 40  |  Height: 34  |  Size: 2.9 KiB

BIN
src/assets/img/待揭秘.png

After

Width: 383  |  Height: 110  |  Size: 47 KiB

BIN
src/assets/img/抽奖按钮.png

After

Width: 259  |  Height: 95  |  Size: 8.1 KiB

BIN
src/assets/img/麒麟.png

After

Width: 252  |  Height: 335  |  Size: 104 KiB

BIN
src/data/music.mp3

27
src/main.js

@ -1,14 +1,15 @@
import { createApp } from 'vue'
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
import App from './App.vue'
import router from './router'
// import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { createApp } from "vue";
import { createPinia } from "pinia";
import "./style.css";
import App from "./App.vue";
import router from "./router";
import ElementPlus from "element-plus";
const pinia = createPinia();
const app = createApp(App);
const pinia = createPinia().use(piniaPluginPersistedstate);
app.use(pinia)
.use(router)
.use(ElementPlus)
.mount('#app');
app.use(router);
app.use(ElementPlus);
app.use(pinia);
app.mount("#app");

5
src/router/index.js

@ -24,6 +24,11 @@ const routes = [
component: () => import('../views/zhongchou/index.vue'),
},
{
path: '/hxlCj',
name: 'hxlCj',
component: () => import('../views/choujiang/hxl-cj/cj.vue'),
},
{
path: '/login',
name: 'login',
component: () => import('../views/choujiang/Login.vue'),

56
src/style.css

@ -1,26 +1,4 @@
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
@ -35,20 +13,6 @@ h1 {
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
@ -57,23 +21,3 @@ button:focus-visible {
.card {
padding: 2em;
}
#app {
/* max-width: 1280px; */
/* margin: 0 auto; */
/* padding: 2rem; */
/* text-align: center; */
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

320
src/utils/CSS3DRenderer.js

@ -0,0 +1,320 @@
/**
* Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs
* @author mrdoob / http://mrdoob.com/
* @author yomotsu / https://yomotsu.net/
*/
import * as THREE from "three";
export class CSS3DObject extends THREE.Object3D {
constructor(element) {
super();
this.element = element;
this.element.style.position = "absolute";
this.addEventListener("removed", function () {
if (this.element.parentNode !== null) {
this.element.parentNode.removeChild(this.element);
}
});
}
}
export class CSS3DSprite extends CSS3DObject {
constructor(element) {
super(element);
}
}
//
export function CSS3DRenderer() {
console.log("THREE.CSS3DRenderer", THREE.REVISION);
var _width, _height;
var _widthHalf, _heightHalf;
var matrix = new THREE.Matrix4();
var cache = {
camera: { fov: 0, style: "" },
objects: new WeakMap(),
};
var domElement = document.createElement("div");
domElement.style.overflow = "hidden";
this.domElement = domElement;
var cameraElement = document.createElement("div");
cameraElement.style.WebkitTransformStyle = "preserve-3d";
cameraElement.style.transformStyle = "preserve-3d";
domElement.appendChild(cameraElement);
var isIE = /Trident/i.test(navigator.userAgent);
this.getSize = function () {
return {
width: _width,
height: _height,
};
};
this.setSize = function (width, height) {
_width = width;
_height = height;
_widthHalf = _width / 2;
_heightHalf = _height / 2;
domElement.style.width = width + "px";
domElement.style.height = height + "px";
cameraElement.style.width = width + "px";
cameraElement.style.height = height + "px";
};
function epsilon(value) {
return Math.abs(value) < 1e-10 ? 0 : value;
}
function getCameraCSSMatrix(matrix) {
var elements = matrix.elements;
return (
"matrix3d(" +
epsilon(elements[0]) +
"," +
epsilon(-elements[1]) +
"," +
epsilon(elements[2]) +
"," +
epsilon(elements[3]) +
"," +
epsilon(elements[4]) +
"," +
epsilon(-elements[5]) +
"," +
epsilon(elements[6]) +
"," +
epsilon(elements[7]) +
"," +
epsilon(elements[8]) +
"," +
epsilon(-elements[9]) +
"," +
epsilon(elements[10]) +
"," +
epsilon(elements[11]) +
"," +
epsilon(elements[12]) +
"," +
epsilon(-elements[13]) +
"," +
epsilon(elements[14]) +
"," +
epsilon(elements[15]) +
")"
);
}
function getObjectCSSMatrix(matrix, cameraCSSMatrix) {
var elements = matrix.elements;
var matrix3d =
"matrix3d(" +
epsilon(elements[0]) +
"," +
epsilon(elements[1]) +
"," +
epsilon(elements[2]) +
"," +
epsilon(elements[3]) +
"," +
epsilon(-elements[4]) +
"," +
epsilon(-elements[5]) +
"," +
epsilon(-elements[6]) +
"," +
epsilon(-elements[7]) +
"," +
epsilon(elements[8]) +
"," +
epsilon(elements[9]) +
"," +
epsilon(elements[10]) +
"," +
epsilon(elements[11]) +
"," +
epsilon(elements[12]) +
"," +
epsilon(elements[13]) +
"," +
epsilon(elements[14]) +
"," +
epsilon(elements[15]) +
")";
if (isIE) {
return (
"translate(-50%,-50%)" +
"translate(" +
_widthHalf +
"px," +
_heightHalf +
"px)" +
cameraCSSMatrix +
matrix3d
);
}
return "translate(-50%,-50%)" + matrix3d;
}
function renderObject(object, camera, cameraCSSMatrix) {
if (object instanceof CSS3DObject) {
var style;
if (object instanceof CSS3DSprite) {
// http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/
matrix.copy(camera.matrixWorldInverse);
matrix.transpose();
matrix.copyPosition(object.matrixWorld);
matrix.scale(object.scale);
matrix.elements[3] = 0;
matrix.elements[7] = 0;
matrix.elements[11] = 0;
matrix.elements[15] = 1;
style = getObjectCSSMatrix(matrix, cameraCSSMatrix);
} else {
style = getObjectCSSMatrix(object.matrixWorld, cameraCSSMatrix);
}
var element = object.element;
var cachedObject = cache.objects.get(object);
if (cachedObject === undefined || cachedObject.style !== style) {
element.style.WebkitTransform = style;
element.style.transform = style;
var objectData = { style: style };
if (isIE) {
objectData.distanceToCameraSquared = getDistanceToSquared(
camera,
object
);
}
cache.objects.set(object, objectData);
}
if (element.parentNode !== cameraElement) {
cameraElement.appendChild(element);
}
}
for (var i = 0, l = object.children.length; i < l; i++) {
renderObject(object.children[i], camera, cameraCSSMatrix);
}
}
var getDistanceToSquared = (function () {
var a = new THREE.Vector3();
var b = new THREE.Vector3();
return function (object1, object2) {
a.setFromMatrixPosition(object1.matrixWorld);
b.setFromMatrixPosition(object2.matrixWorld);
return a.distanceToSquared(b);
};
})();
function filterAndFlatten(scene) {
var result = [];
scene.traverse(function (object) {
if (object instanceof THREE.CSS3DObject) result.push(object);
});
return result;
}
function zOrder(scene) {
var sorted = filterAndFlatten(scene).sort(function (a, b) {
var distanceA = cache.objects.get(a).distanceToCameraSquared;
var distanceB = cache.objects.get(b).distanceToCameraSquared;
return distanceA - distanceB;
});
var zMax = sorted.length;
for (var i = 0, l = sorted.length; i < l; i++) {
sorted[i].element.style.zIndex = zMax - i;
}
}
this.render = function (scene, camera) {
var fov = camera.projectionMatrix.elements[5] * _heightHalf;
if (cache.camera.fov !== fov) {
if (camera.isPerspectiveCamera) {
domElement.style.WebkitPerspective = fov + "px";
domElement.style.perspective = fov + "px";
}
cache.camera.fov = fov;
}
scene.updateMatrixWorld();
if (camera.parent === null) camera.updateMatrixWorld();
if (camera.isOrthographicCamera) {
var tx = -(camera.right + camera.left) / 2;
var ty = (camera.top + camera.bottom) / 2;
}
var cameraCSSMatrix = camera.isOrthographicCamera
? "scale(" +
fov +
")" +
"translate(" +
epsilon(tx) +
"px," +
epsilon(ty) +
"px)" +
getCameraCSSMatrix(camera.matrixWorldInverse)
: "translateZ(" +
fov +
"px)" +
getCameraCSSMatrix(camera.matrixWorldInverse);
var style =
cameraCSSMatrix + "translate(" + _widthHalf + "px," + _heightHalf + "px)";
if (cache.camera.style !== style && !isIE) {
cameraElement.style.WebkitTransform = style;
cameraElement.style.transform = style;
cache.camera.style = style;
}
renderObject(scene, camera, cameraCSSMatrix);
if (isIE) {
// IE10 and 11 does not support 'preserve-3d'.
// Thus, z-order in 3D will not work.
// We have to calc z-order manually and set CSS z-index for IE.
// FYI: z-index can't handle object intersection
zOrder(scene);
}
};
}

517
src/utils/TrackballControls.js

@ -0,0 +1,517 @@
import * as THREE from 'three';
// 创建 TrackballControls 类并导出
export class TrackballControls extends THREE.EventDispatcher {
constructor(object, domElement) {
super(); // 调用父类构造函数
var _this = this;
var STATE = { NONE: -1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };
this.object = object;
this.domElement = (domElement !== undefined) ? domElement : document;
// API
this.enabled = true;
this.screen = { left: 0, top: 0, width: 0, height: 0 };
this.rotateSpeed = 1.0;
this.zoomSpeed = 1.2;
this.panSpeed = 0.3;
this.noRotate = false;
this.noZoom = false;
this.noPan = false;
this.staticMoving = false;
this.dynamicDampingFactor = 0.2;
this.minDistance = 0;
this.maxDistance = Infinity;
this.keys = [65 /*A*/, 83 /*S*/, 68 /*D*/];
// internals
this.target = new THREE.Vector3();
var EPS = 0.000001;
var lastPosition = new THREE.Vector3();
var _state = STATE.NONE,
_prevState = STATE.NONE,
_eye = new THREE.Vector3(),
_movePrev = new THREE.Vector2(),
_moveCurr = new THREE.Vector2(),
_lastAxis = new THREE.Vector3(),
_lastAngle = 0,
_zoomStart = new THREE.Vector2(),
_zoomEnd = new THREE.Vector2(),
_touchZoomDistanceStart = 0,
_touchZoomDistanceEnd = 0,
_panStart = new THREE.Vector2(),
_panEnd = new THREE.Vector2();
// for reset
this.target0 = this.target.clone();
this.position0 = this.object.position.clone();
this.up0 = this.object.up.clone();
// events
var changeEvent = { type: "change" };
var startEvent = { type: "start" };
var endEvent = { type: "end" };
// methods
this.handleResize = function () {
if (this.domElement === document) {
this.screen.left = 0;
this.screen.top = 0;
this.screen.width = window.innerWidth;
this.screen.height = window.innerHeight;
} else {
var box = this.domElement.getBoundingClientRect();
// adjustments come from similar code in the jquery offset() function
var d = this.domElement.ownerDocument.documentElement;
this.screen.left = box.left + window.pageXOffset - d.clientLeft;
this.screen.top = box.top + window.pageYOffset - d.clientTop;
this.screen.width = box.width;
this.screen.height = box.height;
}
};
var getMouseOnScreen = (function () {
var vector = new THREE.Vector2();
return function getMouseOnScreen(pageX, pageY) {
vector.set(
(pageX - _this.screen.left) / _this.screen.width,
(pageY - _this.screen.top) / _this.screen.height
);
return vector;
};
})();
var getMouseOnCircle = (function () {
var vector = new THREE.Vector2();
return function getMouseOnCircle(pageX, pageY) {
vector.set(
(pageX - _this.screen.width * 0.5 - _this.screen.left) /
(_this.screen.width * 0.5),
(_this.screen.height + 2 * (_this.screen.top - pageY)) /
_this.screen.width // screen.width intentional
);
return vector;
};
})();
this.rotateCamera = (function () {
var axis = new THREE.Vector3(),
quaternion = new THREE.Quaternion(),
eyeDirection = new THREE.Vector3(),
objectUpDirection = new THREE.Vector3(),
objectSidewaysDirection = new THREE.Vector3(),
moveDirection = new THREE.Vector3(),
angle;
return function rotateCamera() {
moveDirection.set(
_moveCurr.x - _movePrev.x,
_moveCurr.y - _movePrev.y,
0
);
angle = moveDirection.length();
if (angle) {
_eye.copy(_this.object.position).sub(_this.target);
eyeDirection.copy(_eye).normalize();
objectUpDirection.copy(_this.object.up).normalize();
objectSidewaysDirection
.crossVectors(objectUpDirection, eyeDirection)
.normalize();
objectUpDirection.setLength(_moveCurr.y - _movePrev.y);
objectSidewaysDirection.setLength(_moveCurr.x - _movePrev.x);
moveDirection.copy(objectUpDirection.add(objectSidewaysDirection));
axis.crossVectors(moveDirection, _eye).normalize();
angle *= _this.rotateSpeed;
quaternion.setFromAxisAngle(axis, angle);
_eye.applyQuaternion(quaternion);
_this.object.up.applyQuaternion(quaternion);
_lastAxis.copy(axis);
_lastAngle = angle;
} else if (!_this.staticMoving && _lastAngle) {
_lastAngle *= Math.sqrt(1.0 - _this.dynamicDampingFactor);
_eye.copy(_this.object.position).sub(_this.target);
quaternion.setFromAxisAngle(_lastAxis, _lastAngle);
_eye.applyQuaternion(quaternion);
_this.object.up.applyQuaternion(quaternion);
}
_movePrev.copy(_moveCurr);
};
})();
this.zoomCamera = function () {
var factor;
if (_state === STATE.TOUCH_ZOOM_PAN) {
factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;
_touchZoomDistanceStart = _touchZoomDistanceEnd;
_eye.multiplyScalar(factor);
} else {
factor = 1.0 + (_zoomEnd.y - _zoomStart.y) * _this.zoomSpeed;
if (factor !== 1.0 && factor > 0.0) {
_eye.multiplyScalar(factor);
}
if (_this.staticMoving) {
_zoomStart.copy(_zoomEnd);
} else {
_zoomStart.y +=
(_zoomEnd.y - _zoomStart.y) * this.dynamicDampingFactor;
}
}
};
this.panCamera = (function () {
var mouseChange = new THREE.Vector2(),
objectUp = new THREE.Vector3(),
pan = new THREE.Vector3();
return function panCamera() {
mouseChange.copy(_panEnd).sub(_panStart);
if (mouseChange.lengthSq()) {
mouseChange.multiplyScalar(_eye.length() * _this.panSpeed);
pan.copy(_eye).cross(_this.object.up).setLength(mouseChange.x);
pan.add(objectUp.copy(_this.object.up).setLength(mouseChange.y));
_this.object.position.add(pan);
_this.target.add(pan);
if (_this.staticMoving) {
_panStart.copy(_panEnd);
} else {
_panStart.add(
mouseChange
.subVectors(_panEnd, _panStart)
.multiplyScalar(_this.dynamicDampingFactor)
);
}
}
};
})();
this.checkDistances = function () {
if (!_this.noZoom || !_this.noPan) {
if (_eye.lengthSq() > _this.maxDistance * _this.maxDistance) {
_this.object.position.addVectors(
_this.target,
_eye.setLength(_this.maxDistance)
);
_zoomStart.copy(_zoomEnd);
}
if (_eye.lengthSq() < _this.minDistance * _this.minDistance) {
_this.object.position.addVectors(
_this.target,
_eye.setLength(_this.minDistance)
);
_zoomStart.copy(_zoomEnd);
}
}
};
this.update = function () {
_eye.subVectors(_this.object.position, _this.target);
if (!_this.noRotate) {
_this.rotateCamera();
}
if (!_this.noZoom) {
_this.zoomCamera();
}
if (!_this.noPan) {
_this.panCamera();
}
_this.object.position.addVectors(_this.target, _eye);
_this.checkDistances();
_this.object.lookAt(_this.target);
if (lastPosition.distanceToSquared(_this.object.position) > EPS) {
_this.dispatchEvent(changeEvent);
lastPosition.copy(_this.object.position);
}
};
this.reset = function () {
_state = STATE.NONE;
_prevState = STATE.NONE;
_this.target.copy(_this.target0);
_this.object.position.copy(_this.position0);
_this.object.up.copy(_this.up0);
_eye.subVectors(_this.object.position, _this.target);
_this.object.lookAt(_this.target);
_this.dispatchEvent(changeEvent);
lastPosition.copy(_this.object.position);
};
// listeners
function keydown(event) {
if (_this.enabled === false) return;
window.removeEventListener("keydown", keydown);
_prevState = _state;
if (_state !== STATE.NONE) {
return;
} else if (
event.keyCode === _this.keys[STATE.ROTATE] &&
!_this.noRotate
) {
_state = STATE.ROTATE;
} else if (event.keyCode === _this.keys[STATE.ZOOM] && !_this.noZoom) {
_state = STATE.ZOOM;
} else if (event.keyCode === _this.keys[STATE.PAN] && !_this.noPan) {
_state = STATE.PAN;
}
}
function keyup(event) {
if (_this.enabled === false) return;
_state = _prevState;
window.addEventListener("keydown", keydown, false);
}
function mousedown(event) {
if (_this.enabled === false) return;
event.preventDefault();
event.stopPropagation();
if (_state === STATE.NONE) {
_state = event.button;
}
// 阻止浏览器的默认行为
return;
if (_state === STATE.ROTATE && !_this.noRotate) {
_moveCurr.copy(getMouseOnCircle(event.pageX, event.pageY));
_movePrev.copy(_moveCurr);
} else if (_state === STATE.ZOOM && !_this.noZoom) {
_zoomStart.copy(getMouseOnScreen(event.pageX, event.pageY));
_zoomEnd.copy(_zoomStart);
} else if (_state === STATE.PAN && !_this.noPan) {
_panStart.copy(getMouseOnScreen(event.pageX, event.pageY));
_panEnd.copy(_panStart);
}
document.addEventListener("mousemove", mousemove, false);
document.addEventListener("mouseup", mouseup, false);
_this.dispatchEvent(startEvent);
}
function mousemove(event) {
if (_this.enabled === false) return;
event.preventDefault();
event.stopPropagation();
if (_state === STATE.ROTATE && !_this.noRotate) {
_movePrev.copy(_moveCurr);
_moveCurr.copy(getMouseOnCircle(event.pageX, event.pageY));
} else if (_state === STATE.ZOOM && !_this.noZoom) {
_zoomEnd.copy(getMouseOnScreen(event.pageX, event.pageY));
} else if (_state === STATE.PAN && !_this.noPan) {
_panEnd.copy(getMouseOnScreen(event.pageX, event.pageY));
}
}
function mouseup(event) {
if (_this.enabled === false) return;
event.preventDefault();
event.stopPropagation();
_state = STATE.NONE;
document.removeEventListener("mousemove", mousemove);
document.removeEventListener("mouseup", mouseup);
_this.dispatchEvent(endEvent);
}
function mousewheel(event) {
if (_this.enabled === false) return;
if (_this.noZoom === true) return;
event.preventDefault();
event.stopPropagation();
// return;
switch (event.deltaMode) {
case 2:
// Zoom in pages
_zoomStart.y -= event.deltaY * 0.025;
break;
case 1:
// Zoom in lines
_zoomStart.y -= event.deltaY * 0.01;
break;
default:
// undefined, 0, assume pixels
_zoomStart.y -= event.deltaY * 0.00025;
break;
}
_this.dispatchEvent(startEvent);
_this.dispatchEvent(endEvent);
}
function touchstart(event) {
if (_this.enabled === false) return;
event.preventDefault();
switch (event.touches.length) {
case 1:
_state = STATE.TOUCH_ROTATE;
_moveCurr.copy(
getMouseOnCircle(event.touches[0].pageX, event.touches[0].pageY)
);
_movePrev.copy(_moveCurr);
break;
default: // 2 or more
_state = STATE.TOUCH_ZOOM_PAN;
var dx = event.touches[0].pageX - event.touches[1].pageX;
var dy = event.touches[0].pageY - event.touches[1].pageY;
_touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt(
dx * dx + dy * dy
);
var x = (event.touches[0].pageX + event.touches[1].pageX) / 2;
var y = (event.touches[0].pageY + event.touches[1].pageY) / 2;
_panStart.copy(getMouseOnScreen(x, y));
_panEnd.copy(_panStart);
break;
}
_this.dispatchEvent(startEvent);
}
function touchmove(event) {
if (_this.enabled === false) return;
event.preventDefault();
event.stopPropagation();
switch (event.touches.length) {
case 1:
_movePrev.copy(_moveCurr);
_moveCurr.copy(
getMouseOnCircle(event.touches[0].pageX, event.touches[0].pageY)
);
break;
default: // 2 or more
var dx = event.touches[0].pageX - event.touches[1].pageX;
var dy = event.touches[0].pageY - event.touches[1].pageY;
_touchZoomDistanceEnd = Math.sqrt(dx * dx + dy * dy);
var x = (event.touches[0].pageX + event.touches[1].pageX) / 2;
var y = (event.touches[0].pageY + event.touches[1].pageY) / 2;
_panEnd.copy(getMouseOnScreen(x, y));
break;
}
}
function touchend(event) {
if (_this.enabled === false) return;
switch (event.touches.length) {
case 0:
_state = STATE.NONE;
break;
case 1:
_state = STATE.TOUCH_ROTATE;
_moveCurr.copy(
getMouseOnCircle(event.touches[0].pageX, event.touches[0].pageY)
);
_movePrev.copy(_moveCurr);
break;
}
_this.dispatchEvent(endEvent);
}
function contextmenu(event) {
if (_this.enabled === false) return;
event.preventDefault();
}
this.dispose = function () {
this.domElement.removeEventListener("contextmenu", contextmenu, false);
this.domElement.removeEventListener("mousedown", mousedown, false);
// this.domElement.removeEventListener("wheel", mousewheel, false);
this.domElement.removeEventListener("touchstart", touchstart, false);
this.domElement.removeEventListener("touchend", touchend, false);
this.domElement.removeEventListener("touchmove", touchmove, false);
document.removeEventListener("mousemove", mousemove, false);
document.removeEventListener("mouseup", mouseup, false);
window.removeEventListener("keydown", keydown, false);
window.removeEventListener("keyup", keyup, false);
};
this.domElement.addEventListener("contextmenu", contextmenu, false);
this.domElement.addEventListener("mousedown", mousedown, false);
// this.domElement.addEventListener("wheel", mousewheel, false);
this.domElement.addEventListener("touchstart", touchstart, false);
this.domElement.addEventListener("touchend", touchend, false);
this.domElement.addEventListener("touchmove", touchmove, false);
window.addEventListener("keydown", keydown, false);
window.addEventListener("keyup", keyup, false);
this.handleResize();
// force an update at start
this.update();
}
}

110
src/utils/config.js

@ -1,73 +1,55 @@
// 【2,3】:第3列,第4行
export const NUMBER_MATRIX = {
"0": [
[1, 1], [4, 1], [6, 1], [10, 1], [11, 1], [12, 1], [13, 1],[15,1],[16,1],[17,1],[18,1],
[1,2], [4,2], [6,2], [13,2], [18,2],
[1,3],[2,3],[3,3],[4,3] ,[6,3], [12,3], [17,3],
[1,4], [4,4], [6,4], [11,4], [16,4],
[1,5],[4,5], [6,5],[7,5],[8,5], [10,5],[11,5],[12,5],[13,5], [16,5]
],
"1": [
[1, 0], [2, 0],
[0, 1], [1, 1], [2, 1],
[1, 2],
[1, 3],
[1, 4]
],
"2": [
[0, 0], [1, 0], [2, 0], [3, 0],
const NUMBER_MATRIX = [
[
//H
[0, 0],
[3, 0],
[0, 1],
[3, 1],
[0, 2], [1, 2], [2, 2], [3, 2],
[0, 2],
[1, 2],
[2, 2],
[3, 2],
[0, 3],
[0, 4], [1, 4], [2, 4], [3, 4]
],
"3": [
[0, 0], [1, 0], [2, 0], [3, 0],
[3, 1],
[0, 2], [1, 2], [2, 2], [3, 2],
[3, 3],
[0, 4], [1, 4], [2, 4], [3, 4]
],
"4": [
[0, 0], [3, 0],
[0, 1], [3, 1],
[0, 2], [1, 2], [2, 2], [3, 2],
[3, 3],
[3, 4]
[0, 4],
[3, 4],
],
"5": [
[0, 0], [1, 0], [2, 0], [3, 0],
[
//L
[0, 0],
[0, 1],
[0, 2], [1, 2], [2, 2], [3, 2],
[3, 3],
[0, 4], [1, 4], [2, 4], [3, 4]
],
"6": [
[0, 0], [1, 0], [2, 0], [3, 0],
[0, 1],
[0, 2], [1, 2], [2, 2], [3, 2],
[0, 3], [3, 3],
[0, 4], [1, 4], [2, 4], [3, 4]
],
"7": [
[0, 0], [1, 0], [2, 0], [3, 0],
[0, 2],
[0, 3],
[0, 4],
[1, 4],
[2, 4],
[3, 4],
],
[
//2
[0, 0],
[1, 0],
[2, 0],
[3, 0],
[3, 1],
[2, 2],
[1, 3],
[0, 4]
],
"8": [
[0, 0], [1, 0], [2, 0], [3, 0],
[0, 1], [3, 1],
[0, 2], [1, 2], [2, 2], [3, 2],
[0, 3], [3, 3],
[0, 4], [1, 4], [2, 4], [3, 4]
[0, 4],
[1, 4],
[2, 4],
[3, 4],
],
[
//7
[0, 0],
[1, 0],
[2, 0],
[3, 0],
[3, 1],
[2, 2],
[1, 3],
[1, 4],
],
"9": [
[0, 0], [1, 0], [2, 0], [3, 0],
[0, 1], [3, 1],
[0, 2], [1, 2], [2, 2], [3, 2],
[3, 3],
[0, 4], [1, 4], [2, 4], [3, 4]
]
};
];
export { NUMBER_MATRIX };

260
src/utils/prizeList.js

@ -0,0 +1,260 @@
import * as TWEEN from "./tween.min.js";
const MAX_TOP = 300;
const MAX_WIDTH = document.body.clientWidth;
let defaultType = 0;
let prizes;
let lastDanMuList = [];
let prizeElement = {};
let lasetPrizeIndex = 0;
const DEFAULT_MESS = [
"我是该抽中一等奖还是一等奖呢,纠结ing...",
"听说要提前一个月吃素才能中大奖喔!",
"好想要一等奖啊!!!",
"一等奖有没有人想要呢?",
"五等奖也不错,只要自己能中奖就行",
"祝大家新年快乐!",
"中不中奖不重要,大家吃好喝好。",
"新年,祝福大家事事顺遂。",
"作为专业陪跑的我,我就看看你们有谁跟我一样",
"新的一年祝福大家越来越好!",
"来年再战!!!",
];
class DanMu {
constructor(option) {
if (typeof option !== "object") {
option = {
text: option,
};
}
this.position = {};
this.text = option.text;
this.onComplete = option.onComplete;
this.init();
}
init() {
this.element = document.createElement("div");
this.element.className = "dan-mu";
document.body.appendChild(this.element);
this.start();
}
setText(text) {
this.text = text || this.text;
this.element.textContent = this.text;
this.width = this.element.clientWidth + 100;
}
start(text) {
let speed = ~~(Math.random() * 10000) + 6000;
this.position = {
x: MAX_WIDTH,
};
let delay = speed / 10;
this.setText(text);
this.element.style.transform = "translateX(" + this.position.x + "px)";
this.element.style.top = ~~(Math.random() * MAX_TOP) + 10 + "px";
this.element.classList.add("active");
this.tween = new TWEEN.Tween(this.position)
.to(
{
x: -this.width,
},
speed
)
.onUpdate(() => {
this.render();
})
.onComplete(() => {
this.onComplete && this.onComplete();
})
.start();
}
render() {
this.element.style.transform = "translateX(" + this.position.x + "px)";
}
}
class Qipao {
constructor(option) {
if (typeof option !== "object") {
option = {
text: option,
};
}
this.text = option.text;
this.onComplete = option.onComplete;
this.$par = document.querySelector(".qipao-container");
if (!this.$par) {
this.$par = document.createElement("div");
this.$par.className = "qipao-container";
document.body.appendChild(this.$par);
}
this.init();
}
init() {
this.element = document.createElement("div");
this.element.className = "qipao animated";
this.$par.appendChild(this.element);
this.start();
}
setText(text) {
this.text = text || this.text;
this.element.textContent = this.text;
}
start(text) {
this.setText(text);
this.element.classList.remove("bounceOutRight");
this.element.classList.add("bounceInRight");
setTimeout(() => {
this.element.classList.remove("bounceInRight");
this.element.classList.add("bounceOutRight");
this.onComplete && this.onComplete();
}, 4000);
}
}
function setPrizes(pri) {
prizes = pri;
defaultType = prizes[0]["type"];
lasetPrizeIndex = pri.length - 1;
}
function showPrizeList(currentPrizeIndex) {
let currentPrize = prizes[currentPrizeIndex];
if (currentPrize.type === defaultType) {
currentPrize.count = "不限制";
}
}
function resetPrize(currentPrizeIndex) {
prizeElement = {};
lasetPrizeIndex = currentPrizeIndex;
showPrizeList(currentPrizeIndex);
}
let setPrizeData = (function () {
return function (currentPrizeIndex, count, isInit) {
let currentPrize = prizes[currentPrizeIndex],
type = currentPrize.type,
elements = prizeElement[type],
totalCount = currentPrize.count;
if (!elements) {
elements = {
box: document.querySelector(`#prize-item-${type}`),
bar: document.querySelector(`#prize-bar-${type}`),
text: document.querySelector(`#prize-count-${type}`),
};
prizeElement[type] = elements;
}
if (!prizeElement.prizeType) {
prizeElement.prizeType = document.querySelector("#prizeType");
prizeElement.prizeLeft = document.querySelector("#prizeLeft");
prizeElement.prizeText = document.querySelector("#prizeText");
}
if (isInit) {
for (let i = prizes.length - 1; i > currentPrizeIndex; i--) {
let type = prizes[i]["type"];
document.querySelector(`#prize-item-${type}`).className =
"prize-item done";
document.querySelector(`#prize-bar-${type}`).style.width = "0";
document.querySelector(`#prize-count-${type}`).textContent =
"0" + "/" + prizes[i]["count"];
}
}
if (lasetPrizeIndex !== currentPrizeIndex) {
let lastPrize = prizes[lasetPrizeIndex],
lastBox = document.querySelector(`#prize-item-${lastPrize.type}`);
lastBox.classList.remove("shine");
lastBox.classList.add("done");
elements.box && elements.box.classList.add("shine");
prizeElement.prizeType.textContent = currentPrize.text;
prizeElement.prizeText.textContent = currentPrize.title;
lasetPrizeIndex = currentPrizeIndex;
}
if (currentPrizeIndex === 0) {
prizeElement.prizeType.textContent = "特别奖";
prizeElement.prizeText.textContent = " ";
prizeElement.prizeLeft.textContent = "不限制";
return;
}
count = totalCount - count;
count = count < 0 ? 0 : count;
let percent = (count / totalCount).toFixed(2);
elements.bar && (elements.bar.style.width = percent * 100 + "%");
elements.text && (elements.text.textContent = count + "/" + totalCount);
prizeElement.prizeLeft.textContent = count;
};
})();
function startMaoPao() {
let len = DEFAULT_MESS.length,
count = 5,
index = ~~(Math.random() * len),
danmuList = [],
total = 0;
function restart() {
total = 0;
danmuList.forEach((item) => {
let text =
lastDanMuList.length > 0
? lastDanMuList.shift()
: DEFAULT_MESS[index++];
item.start(text);
index = index > len ? 0 : index;
});
}
for (let i = 0; i < count; i++) {
setTimeout(() => {
danmuList.push(
new DanMu({
text: DEFAULT_MESS[index++],
onComplete: function () {
setTimeout(() => {
this.start(DEFAULT_MESS[index++]);
index = index > len ? 0 : index;
}, 1000);
},
})
);
index = index > len ? 0 : index;
}, 1500 * i);
}
}
function addDanMu(text) {
lastDanMuList.push(text);
}
export {
startMaoPao,
showPrizeList,
setPrizeData,
addDanMu,
setPrizes,
resetPrize,
};

1
src/utils/request.js

@ -1,7 +1,6 @@
import axios from 'axios'
import { ElMessage } from 'element-plus'
const ERROR_MESSAGES = {
badRequest: '请求错误(400)',
unauthorized: '未授权,请登录(401)',

957
src/utils/three.min.js
File diff suppressed because it is too large
View File

1
src/utils/tween.min.js

@ -0,0 +1 @@
"use strict";var TWEEN=TWEEN||(function(){var b=[];return{REVISION:"7",getAll:function(){return b},removeAll:function(){b=[]},add:function(a){b.push(a)},remove:function(a){a=b.indexOf(a);-1!==a&&b.splice(a,1)},update:function(f){if(0===b.length){return !1}for(var a=0,e=b.length,f=void 0!==f?f:Date.now();a<e;){b[a].update(f)?a++:(b.splice(a,1),e--)}return !0}}})();TWEEN.Tween=function(A){var y={},z={},x=1000,w=0,v=null,u=TWEEN.Easing.Linear.None,g=TWEEN.Interpolation.Linear,t=[],q=null,o=!1,j=null,B=null,i=null;this.to=function(b,d){null!==d&&(x=d);z=b;return this};this.start=function(b){TWEEN.add(this);o=!1;v=void 0!==b?b:Date.now();v+=w;for(var a in z){if(null!==A[a]){if(z[a] instanceof Array){if(0===z[a].length){continue}z[a]=[A[a]].concat(z[a])}y[a]=A[a]}}return this};this.stop=function(){TWEEN.remove(this);B&&B.call(this);return this};this.delay=function(b){w=b;return this};this.easing=function(b){u=b;return this};this.interpolation=function(b){g=b;return this};this.chain=function(){t=arguments;return this};this.onStart=function(b){q=b;return this};this.onStop=function(b){B=b;return this};this.onUpdate=function(b){j=b;return this};this.onComplete=function(b){i=b;return this};this.update=function(h){if(h<v){return !0}!1===o&&(null!==q&&q.call(A),(o=!0));var d=(h-v)/x,d=1<d?1:d,b=u(d),a;for(a in y){var c=y[a],f=z[a];A[a]=f instanceof Array?g(f,b):c+(f-c)*b}null!==j&&j.call(A,b);if(1==d){null!==i&&i.call(A);d=0;for(b=t.length;d<b;d++){t[d].start(h)}return !1}return !0}};TWEEN.Easing={Linear:{None:function(b){return b}},Quadratic:{In:function(b){return b*b},Out:function(b){return b*(2-b)},InOut:function(b){return 1>(b*=2)?0.5*b*b:-0.5*(--b*(b-2)-1)}},Cubic:{In:function(b){return b*b*b},Out:function(b){return --b*b*b+1},InOut:function(b){return 1>(b*=2)?0.5*b*b*b:0.5*((b-=2)*b*b+2)}},Quartic:{In:function(b){return b*b*b*b},Out:function(b){return 1- --b*b*b*b},InOut:function(b){return 1>(b*=2)?0.5*b*b*b*b:-0.5*((b-=2)*b*b*b-2)}},Quintic:{In:function(b){return b*b*b*b*b},Out:function(b){return --b*b*b*b*b+1},InOut:function(b){return 1>(b*=2)?0.5*b*b*b*b*b:0.5*((b-=2)*b*b*b*b+2)}},Sinusoidal:{In:function(b){return 1-Math.cos((b*Math.PI)/2)},Out:function(b){return Math.sin((b*Math.PI)/2)},InOut:function(b){return 0.5*(1-Math.cos(Math.PI*b))}},Exponential:{In:function(b){return 0===b?0:Math.pow(1024,b-1)},Out:function(b){return 1===b?1:1-Math.pow(2,-10*b)},InOut:function(b){return 0===b?0:1===b?1:1>(b*=2)?0.5*Math.pow(1024,b-1):0.5*(-Math.pow(2,-10*(b-1))+2)}},Circular:{In:function(b){return 1-Math.sqrt(1-b*b)},Out:function(b){return Math.sqrt(1- --b*b)},InOut:function(b){return 1>(b*=2)?-0.5*(Math.sqrt(1-b*b)-1):0.5*(Math.sqrt(1-(b-=2)*b)+1)}},Elastic:{In:function(e){var f,d=0.1;if(0===e){return 0}if(1===e){return 1}!d||1>d?((d=1),(f=0.1)):(f=(0.4*Math.asin(1/d))/(2*Math.PI));return -(d*Math.pow(2,10*(e-=1))*Math.sin(((e-f)*2*Math.PI)/0.4))},Out:function(e){var f,d=0.1;if(0===e){return 0}if(1===e){return 1}!d||1>d?((d=1),(f=0.1)):(f=(0.4*Math.asin(1/d))/(2*Math.PI));return(d*Math.pow(2,-10*e)*Math.sin(((e-f)*2*Math.PI)/0.4)+1)},InOut:function(e){var f,d=0.1;if(0===e){return 0}if(1===e){return 1}!d||1>d?((d=1),(f=0.1)):(f=(0.4*Math.asin(1/d))/(2*Math.PI));return 1>(e*=2)?-0.5*d*Math.pow(2,10*(e-=1))*Math.sin(((e-f)*2*Math.PI)/0.4):0.5*d*Math.pow(2,-10*(e-=1))*Math.sin(((e-f)*2*Math.PI)/0.4)+1}},Back:{In:function(b){return b*b*(2.70158*b-1.70158)},Out:function(b){return --b*b*(2.70158*b+1.70158)+1},InOut:function(b){return 1>(b*=2)?0.5*b*b*(3.5949095*b-2.5949095):0.5*((b-=2)*b*(3.5949095*b+2.5949095)+2)}},Bounce:{In:function(b){return 1-TWEEN.Easing.Bounce.Out(1-b)},Out:function(b){return b<1/2.75?7.5625*b*b:b<2/2.75?7.5625*(b-=1.5/2.75)*b+0.75:b<2.5/2.75?7.5625*(b-=2.25/2.75)*b+0.9375:7.5625*(b-=2.625/2.75)*b+0.984375},InOut:function(b){return 0.5>b?0.5*TWEEN.Easing.Bounce.In(2*b):0.5*TWEEN.Easing.Bounce.Out(2*b-1)+0.5}}};TWEEN.Interpolation={Linear:function(h,l){var g=h.length-1,k=g*l,j=Math.floor(k),i=TWEEN.Interpolation.Utils.Linear;return 0>l?i(h[0],h[1],k):1<l?i(h[g],h[g-1],g-k):i(h[j],h[j+1>g?g:j+1],k-j)},Bezier:function(i,n){var g=0,m=i.length-1,l=Math.pow,k=TWEEN.Interpolation.Utils.Bernstein,j;for(j=0;j<=m;j++){g+=l(1-n,m-j)*l(n,j)*i[j]*k(m,j)}return g},CatmullRom:function(h,l){var g=h.length-1,k=g*l,j=Math.floor(k),i=TWEEN.Interpolation.Utils.CatmullRom;return h[0]===h[g]?(0>l&&(j=Math.floor((k=g*(1+l)))),i(h[(j-1+g)%g],h[j],h[(j+1)%g],h[(j+2)%g],k-j)):0>l?h[0]-(i(h[0],h[0],h[1],h[1],-k)-h[0]):1<l?h[g]-(i(h[g],h[g],h[g-1],h[g-1],k-g)-h[g]):i(h[j?j-1:0],h[j],h[g<j+1?g:j+1],h[g<j+2?g:j+2],k-j)},Utils:{Linear:function(e,f,d){return(f-e)*d+e},Bernstein:function(e,f){var d=TWEEN.Interpolation.Utils.Factorial;return d(e)/d(f)/d(e-f)},Factorial:(function(){var b=[1];return function(f){var a=1,e;if(b[f]){return b[f]}for(e=f;1<e;e--){a*=e}return(b[f]=a)}})(),CatmullRom:function(h,l,g,k,j){var h=0.5*(g-h),k=0.5*(k-l),i=j*j;return((2*l-2*g+h+k)*j*i+(-3*l+3*g-2*h-k)*i+h*j+l)}}};

2
src/views/choujiang/Login.vue

@ -55,7 +55,7 @@ const handleLogin = () => {
position: fixed; /* 使用fixed定位确保背景图片覆盖整个页面 */
top: 0;
left: 0;
z-index: -1; /* 确保背景图片在其他内容下方 */
/* z-index: -1; 确保背景图片在其他内容下方 */
}
.login-card {

2108
src/views/choujiang/hxl-cj/cj.vue
File diff suppressed because it is too large
View File

103
src/views/choujiang/lottery/Lottery3D.vue

@ -18,7 +18,14 @@
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount, defineExpose, watch, computed } from "vue";
import {
ref,
onMounted,
onBeforeUnmount,
defineExpose,
watch,
computed,
} from "vue";
import * as THREE from "three";
import {
CSS3DRenderer,
@ -29,7 +36,7 @@ import TWEEN from "@tweenjs/tween.js";
import { NUMBER_MATRIX } from "../../../utils/config.js";
import CardItem from "./CardItem.vue";
import { createApp } from "vue";
import { getUserList } from "../../../api/API";
import { getUserListApi } from "../../../api/API";
import { useLotteryStore } from "../../../store/lottery";
const lotteryStore = useLotteryStore();
@ -38,8 +45,6 @@ const winners = computed({
set: (val) => lotteryStore.setWinners(val),
});
const threeContainer = ref(null);
let renderer, scene, camera, animationId;
// let controls; // controls
@ -200,7 +205,10 @@ function selectCard(selectedCardIndex, currentLuckys, duration = 600) {
for (let page = 0; page < totalPages.value; page++) {
const startIndex = page * cardsPerPage;
const endIndex = Math.min((page + 1) * cardsPerPage, currentLuckys.length);
const endIndex = Math.min(
(page + 1) * cardsPerPage,
currentLuckys.length
);
const pageCount = endIndex - startIndex;
const pageLocate = [];
@ -316,7 +324,8 @@ function selectCard(selectedCardIndex, currentLuckys, duration = 600) {
function switchPage(direction) {
if (isPageTransitioning || totalPages.value <= 1) return;
const newPage = direction === 'next' ? currentPage.value + 1 : currentPage.value - 1;
const newPage =
direction === "next" ? currentPage.value + 1 : currentPage.value - 1;
if (newPage < 0 || newPage >= totalPages.value) return;
isPageTransitioning = true;
@ -325,11 +334,11 @@ function switchPage(direction) {
// 使
const pageLocates = window.pageLocates;
if (!pageLocates) {
console.error('页面位置信息未找到');
console.error("页面位置信息未找到");
isPageTransitioning = false;
return;
}
console.log("globalCardIndexes", globalCardIndexes);
//
globalCardIndexes.forEach((cardIndex, index) => {
const object = threeDCards[cardIndex];
@ -345,7 +354,7 @@ function switchPage(direction) {
let targetY;
if (isVisible) {
//
if (direction === 'next') {
if (direction === "next") {
//
targetY = pageLocate.y;
} else {
@ -354,7 +363,7 @@ function switchPage(direction) {
}
} else {
//
if (direction === 'next') {
if (direction === "next") {
//
targetY = pageLocate.y + 1000;
} else {
@ -370,7 +379,7 @@ function switchPage(direction) {
startY = object.position.y;
} else {
//
if (direction === 'next') {
if (direction === "next") {
//
startY = pageLocate.y - 1000;
} else {
@ -401,12 +410,13 @@ function switchPage(direction) {
.onComplete(() => {
currentPage.value = newPage;
isPageTransitioning = false;
console.log(`切换到第 ${currentPage.value + 1} 页,共 ${totalPages.value}`);
console.log(
`切换到第 ${currentPage.value + 1} 页,共 ${totalPages.value}`
);
})
.start();
}
//
function handleWheel(event) {
if (isPageTransitioning || totalPages.value <= 1) return;
@ -415,24 +425,26 @@ function handleWheel(event) {
if (event.deltaY > 0) {
//
switchPage('next');
switchPage("next");
} else if (event.deltaY < 0) {
//
switchPage('prev');
switchPage("prev");
}
}
//
function addWheelListener() {
if (threeContainer.value) {
threeContainer.value.addEventListener('wheel', handleWheel, { passive: false });
threeContainer.value.addEventListener("wheel", handleWheel, {
passive: false,
});
}
}
//
function removeWheelListener() {
if (threeContainer.value) {
threeContainer.value.removeEventListener('wheel', handleWheel);
threeContainer.value.removeEventListener("wheel", handleWheel);
}
}
@ -532,7 +544,7 @@ function changeCard(cardIndex, user) {
}
function changeCard1() {
console.log('执行取消高光,当前卡片索引:', globalCardIndexes);
console.log("执行取消高光,当前卡片索引:", globalCardIndexes);
//
removeWheelListener();
@ -547,7 +559,7 @@ function changeCard1() {
delete window.pageLocates;
}
globalCardIndexes.forEach(cardIndex => {
globalCardIndexes.forEach((cardIndex) => {
const card = threeDCards[cardIndex].element;
// console.log('', cardIndex, '');
@ -558,7 +570,7 @@ function changeCard1() {
}
// prizeCardItem
card.classList.remove('prize');
card.classList.remove("prize");
});
//
globalCardIndexes = [];
@ -649,7 +661,7 @@ function getTotalCards() {
return threeDCards.length;
}
onMounted( async () => {
onMounted(async () => {
// 3D
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(
@ -659,9 +671,9 @@ function getTotalCards() {
10000
);
camera.position.z = 3000;
// camera.position.y = 250; // 10px
//
// scene.position.y = 10; // 10px
// camera.position.y = 250; // 10px
//
// scene.position.y = 10; // 10px
renderer = new CSS3DRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
if (threeContainer.value) {
@ -669,23 +681,41 @@ function getTotalCards() {
}
// 2. 8
const highlightCells = NUMBER_MATRIX["0"].map(([x, y]) => `${x}-${y}`);
let text = "0123";
let step = 5;
let xoffset = 1;
let yoffset = 1;
let highlight = [];
text.split("").forEach((n) => {
highlight = highlight.concat(
NUMBER_MATRIX[n].map((item) => {
return `${item[0] + xoffset}-${item[1] + yoffset}`;
})
);
xoffset += step;
});
// const highlightCells = NUMBER_MATRIX["0"].map(([x, y]) => `${x}-${y}`);
const config = {
ROW_COUNT: 7, // 5
COLUMN_COUNT: 20, // 4
HIGHLIGHT_CELL: highlightCells,
COLUMN_COUNT: 21, // 4
HIGHLIGHT_CELL: highlight,
COMPANY: "演示公司",
};
const userList = await getUserList();
const userList = await getUserListApi();
// lotteryStore.setWinners(userList);
// console.log("userList", userList);
// 3D
const member = userList.data.map(item => [item.jwcode, item.username, "PSST"]);
const member = userList.data.map((item) => [
item.jwcode,
item.username,
"PSST",
]);
// store
const userNames = userList.data.map(item => item.jwcode || item.username || "");
const userNames = userList.data.map(
(item) => item.jwcode || item.username || ""
);
lotteryStore.setAllUsers(userNames);
const length = member.length;
@ -792,7 +822,7 @@ defineExpose({
animation: fadeInOut 2s ease-in-out infinite;
}
.price-font{
.price-font {
font-size: 16px;
font-weight: bold;
color: #ffffff;
@ -805,7 +835,12 @@ defineExpose({
}
@keyframes fadeInOut {
0%, 100% { opacity: 0.6; }
50% { opacity: 1; }
0%,
100% {
opacity: 0.6;
}
50% {
opacity: 1;
}
}
</style>

8
src/views/choujiang/lottery/dataManager.js

@ -1,5 +1,5 @@
import { reactive } from 'vue';
import { getPrizeList, getUserList } from '../../../api/API';
import { getPrizeListApi, getUserListApi } from '../../../api/API';
export function useDataManager() {
const state = reactive({
basicData: {
@ -27,7 +27,7 @@ export function useDataManager() {
async function getBasicData() {
// 获取奖品列表
const prizeList = await getPrizeList();
const prizeList = await getPrizeListApi();
const fakePrizes = prizeList.data.map((item, index) => ({
type: index, // 使用索引作为type
title: item.gradeName,
@ -48,7 +48,7 @@ export function useDataManager() {
});
// 获取真实用户数据
const userListResponse = await getUserList();
const userListResponse = await getUserListApi();
console.log("userList", userListResponse);
// 将后端返回的用户数据转换为兼容格式
@ -79,7 +79,7 @@ export function useDataManager() {
}
async function getUsers() {
const userList = await getUserList();
const userList = await getUserListApi();
console.log("userList", userList);
// 将后端返回的用户数据转换为兼容格式

18
vite.config.js

@ -2,17 +2,21 @@ import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vite.dev/config/
// export default defineConfig({
// plugins: [vue()],
// })
export default defineConfig({
plugins: [vue()],
plugins: [
vue(),
],
server: {
host: '0.0.0.0',
port: 3000,
proxy: {
'/api': {
target: 'https://dbqb.nfdxy.net',
'/Api': {
target: 'https://dbqb.nfdxy.net/devLotApi',
// target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
rewrite: (path) => path.replace(/^\/api/, '/devLotApi/api')
rewrite: (path) => path.replace(/^\/Api/, '')
}
}
}

22
vite.config.js.timestamp-1753077096347-78067037e45f7.mjs

@ -0,0 +1,22 @@
// vite.config.js
import { defineConfig } from "file:///E:/hxl/gitFile/activityLink/node_modules/vite/dist/node/index.js";
import vue from "file:///E:/hxl/gitFile/activityLink/node_modules/@vitejs/plugin-vue/dist/index.mjs";
var vite_config_default = defineConfig({
plugins: [
vue()
],
server: {
proxy: {
"/Api": {
target: "https://dbqb.nfdxy.net/devLotApi",
// target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/Api/, "")
}
}
}
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxoeGxcXFxcZ2l0RmlsZVxcXFxhY3Rpdml0eUxpbmtcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXGh4bFxcXFxnaXRGaWxlXFxcXGFjdGl2aXR5TGlua1xcXFx2aXRlLmNvbmZpZy5qc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovaHhsL2dpdEZpbGUvYWN0aXZpdHlMaW5rL3ZpdGUuY29uZmlnLmpzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJ1xuXG4vLyBodHRwczovL3ZpdGUuZGV2L2NvbmZpZy9cbi8vIGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4vLyAgIHBsdWdpbnM6IFt2dWUoKV0sXG4vLyB9KVxuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwbHVnaW5zOiBbXG4gICAgdnVlKCksXG4gIF0sXG4gIHNlcnZlcjoge1xuICAgIHByb3h5OiB7XG4gICAgICAnL0FwaSc6IHtcbiAgICAgICAgdGFyZ2V0OiAnaHR0cHM6Ly9kYnFiLm5mZHh5Lm5ldC9kZXZMb3RBcGknLFxuICAgICAgICAvLyB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjgwODAnLFxuICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXG4gICAgICAgIHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLnJlcGxhY2UoL15cXC9BcGkvLCAnJylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQTJRLFNBQVMsb0JBQW9CO0FBQ3hTLE9BQU8sU0FBUztBQU9oQixJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixTQUFTO0FBQUEsSUFDUCxJQUFJO0FBQUEsRUFDTjtBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQ04sT0FBTztBQUFBLE1BQ0wsUUFBUTtBQUFBLFFBQ04sUUFBUTtBQUFBO0FBQUEsUUFFUixjQUFjO0FBQUEsUUFDZCxTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsVUFBVSxFQUFFO0FBQUEsTUFDOUM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==
Loading…
Cancel
Save