diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index a7cea0b..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["Vue.volar"] -} diff --git a/package-lock.json b/package-lock.json index 0a843a2..e9c63da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@vitejs/plugin-vue": "^4.6.2", "axios": "^1.10.0", "element-plus": "^2.10.3", + "pinia": "^3.0.3", "vite": "^4.5.3", "vue": "^3.5.17", "vue-router": "^4.5.1" @@ -564,6 +565,28 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "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==", + "dependencies": { + "rfdc": "^1.4.1" + } + }, "node_modules/@vue/reactivity": { "version": "3.5.17", "resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/reactivity/-/reactivity-3.5.17.tgz", @@ -725,6 +748,14 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/birpc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.5.0.tgz", + "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://mirrors.huaweicloud.com/repository/npm/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -750,6 +781,20 @@ "node": ">= 0.8" } }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://mirrors.huaweicloud.com/repository/npm/csstype/-/csstype-3.1.3.tgz", @@ -1064,6 +1109,22 @@ "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==" + }, + "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==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://mirrors.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", @@ -1132,6 +1193,11 @@ "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==" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://mirrors.huaweicloud.com/repository/npm/nanoid/-/nanoid-3.3.11.tgz", @@ -1156,12 +1222,45 @@ "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", "license": "BSD-3-Clause" }, + "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==" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://mirrors.huaweicloud.com/repository/npm/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://mirrors.huaweicloud.com/repository/npm/postcss/-/postcss-8.5.6.tgz", @@ -1196,6 +1295,11 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, "node_modules/rollup": { "version": "3.29.5", "resolved": "https://mirrors.huaweicloud.com/repository/npm/rollup/-/rollup-3.29.5.tgz", @@ -1221,6 +1325,25 @@ "node": ">=0.10.0" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/vite": { "version": "4.5.3", "resolved": "https://mirrors.huaweicloud.com/repository/npm/vite/-/vite-4.5.3.tgz", @@ -1591,6 +1714,28 @@ "resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-api/-/devtools-api-6.6.4.tgz", "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, + "@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==", + "requires": { + "@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" + } + }, + "@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "requires": { + "rfdc": "^1.4.1" + } + }, "@vue/reactivity": { "version": "3.5.17", "resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/reactivity/-/reactivity-3.5.17.tgz", @@ -1693,6 +1838,11 @@ "proxy-from-env": "^1.1.0" } }, + "birpc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.5.0.tgz", + "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==" + }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://mirrors.huaweicloud.com/repository/npm/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1710,6 +1860,14 @@ "delayed-stream": "~1.0.0" } }, + "copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "requires": { + "is-what": "^4.1.8" + } + }, "csstype": { "version": "3.1.3", "resolved": "https://mirrors.huaweicloud.com/repository/npm/csstype/-/csstype-3.1.3.tgz", @@ -1910,6 +2068,16 @@ "function-bind": "^1.1.2" } }, + "hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" + }, + "is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==" + }, "lodash": { "version": "4.17.21", "resolved": "https://mirrors.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", @@ -1957,6 +2125,11 @@ "mime-db": "1.52.0" } }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, "nanoid": { "version": "3.3.11", "resolved": "https://mirrors.huaweicloud.com/repository/npm/nanoid/-/nanoid-3.3.11.tgz", @@ -1967,11 +2140,34 @@ "resolved": "https://mirrors.huaweicloud.com/repository/npm/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" }, + "perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" + }, "picocolors": { "version": "1.1.1", "resolved": "https://mirrors.huaweicloud.com/repository/npm/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, + "pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "requires": { + "@vue/devtools-api": "^7.7.2" + }, + "dependencies": { + "@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "requires": { + "@vue/devtools-kit": "^7.7.7" + } + } + } + }, "postcss": { "version": "8.5.6", "resolved": "https://mirrors.huaweicloud.com/repository/npm/postcss/-/postcss-8.5.6.tgz", @@ -1987,6 +2183,11 @@ "resolved": "https://mirrors.huaweicloud.com/repository/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, "rollup": { "version": "3.29.5", "resolved": "https://mirrors.huaweicloud.com/repository/npm/rollup/-/rollup-3.29.5.tgz", @@ -2000,6 +2201,19 @@ "resolved": "https://mirrors.huaweicloud.com/repository/npm/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" }, + "speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==" + }, + "superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "requires": { + "copy-anything": "^3.0.2" + } + }, "vite": { "version": "4.5.3", "resolved": "https://mirrors.huaweicloud.com/repository/npm/vite/-/vite-4.5.3.tgz", diff --git a/package.json b/package.json index 8e874f6..0d3b779 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@vitejs/plugin-vue": "^4.6.2", "axios": "^1.10.0", "element-plus": "^2.10.3", + "pinia": "^3.0.3", "vite": "^4.5.3", "vue": "^3.5.17", "vue-router": "^4.5.1" diff --git a/src/assets/beijingtu.jpg b/src/assets/beijingtu.jpg new file mode 100644 index 0000000..b8f235f Binary files /dev/null and b/src/assets/beijingtu.jpg differ diff --git a/src/assets/daijiemi.png b/src/assets/daijiemi.png new file mode 100644 index 0000000..729c1a9 Binary files /dev/null and b/src/assets/daijiemi.png differ diff --git a/src/assets/image.png b/src/assets/image.png new file mode 100644 index 0000000..0600aee Binary files /dev/null and b/src/assets/image.png differ diff --git a/src/assets/lottery b/src/assets/lottery new file mode 100644 index 0000000..f982404 Binary files /dev/null and b/src/assets/lottery differ diff --git a/src/assets/登录.png b/src/assets/登录.png new file mode 100644 index 0000000..4712b29 Binary files /dev/null and b/src/assets/登录.png differ diff --git a/src/main.js b/src/main.js index 7b19912..c6e72c7 100644 --- a/src/main.js +++ b/src/main.js @@ -1,6 +1,9 @@ import { createApp } from 'vue' +import { createPinia } from 'pinia' + import './style.css' import App from './App.vue' import router from './router' +// import { createPinia } from 'pinia' -createApp(App).use(router).mount('#app') +createApp(App).use(router).use(createPinia()).mount('#app') diff --git a/src/store/lottery.js b/src/store/lottery.js new file mode 100644 index 0000000..e05d4b1 --- /dev/null +++ b/src/store/lottery.js @@ -0,0 +1,16 @@ +// activityLink/src/store/lottery.js +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export const useLotteryStore = defineStore('lottery', () => { + const lotteryState = ref('idle') // idle, ready, rotating, result + + function setLotteryState(state) { + lotteryState.value = state + } + + return { + lotteryState, + setLotteryState + } +}) \ No newline at end of file diff --git a/src/utils/config.js b/src/utils/config.js new file mode 100644 index 0000000..01ada5e --- /dev/null +++ b/src/utils/config.js @@ -0,0 +1,73 @@ +// 【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], + [3, 1], + [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] + ], + "5": [ + [0, 0], [1, 0], [2, 0], [3, 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], + [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] + ], + "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] + ] +}; diff --git a/src/views/choujiang/index.vue b/src/views/choujiang/index.vue index 3dda488..cb2cd20 100644 --- a/src/views/choujiang/index.vue +++ b/src/views/choujiang/index.vue @@ -1,13 +1,172 @@ \ No newline at end of file diff --git a/src/views/choujiang/lottery/CardItem.vue b/src/views/choujiang/lottery/CardItem.vue new file mode 100644 index 0000000..2d80702 --- /dev/null +++ b/src/views/choujiang/lottery/CardItem.vue @@ -0,0 +1,93 @@ + + + + + \ No newline at end of file diff --git a/src/views/choujiang/lottery/ControlBar.vue b/src/views/choujiang/lottery/ControlBar.vue new file mode 100644 index 0000000..c57d198 --- /dev/null +++ b/src/views/choujiang/lottery/ControlBar.vue @@ -0,0 +1,43 @@ + + + + + \ No newline at end of file diff --git a/src/views/choujiang/lottery/Lottery3D.vue b/src/views/choujiang/lottery/Lottery3D.vue new file mode 100644 index 0000000..ff82807 --- /dev/null +++ b/src/views/choujiang/lottery/Lottery3D.vue @@ -0,0 +1,503 @@ + + + + + \ No newline at end of file diff --git a/src/views/choujiang/lottery/MusicPlayer.vue b/src/views/choujiang/lottery/MusicPlayer.vue new file mode 100644 index 0000000..7ea5c9b --- /dev/null +++ b/src/views/choujiang/lottery/MusicPlayer.vue @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/src/views/choujiang/lottery/PrizePanel.vue b/src/views/choujiang/lottery/PrizePanel.vue new file mode 100644 index 0000000..80f96ee --- /dev/null +++ b/src/views/choujiang/lottery/PrizePanel.vue @@ -0,0 +1,386 @@ + + + + + \ No newline at end of file diff --git a/src/views/choujiang/lottery/Qipao.vue b/src/views/choujiang/lottery/Qipao.vue new file mode 100644 index 0000000..5eb20ab --- /dev/null +++ b/src/views/choujiang/lottery/Qipao.vue @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file diff --git a/src/views/choujiang/lottery/UserList.vue b/src/views/choujiang/lottery/UserList.vue new file mode 100644 index 0000000..84311e4 --- /dev/null +++ b/src/views/choujiang/lottery/UserList.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/src/views/choujiang/lottery/dataManager.js b/src/views/choujiang/lottery/dataManager.js new file mode 100644 index 0000000..bce3014 --- /dev/null +++ b/src/views/choujiang/lottery/dataManager.js @@ -0,0 +1,153 @@ +import { reactive } from 'vue'; + +export function useDataManager() { + const state = reactive({ + basicData: { + prizes: [], + users: [], + luckyUsers: {}, + leftUsers: [] + }, + currentPrizeIndex: 0, + currentPrize: null, + currentLuckys: [], + isLotting: false, + config: { + prizes: [], + EACH_COUNT: [], + COMPANY: '', + HIGHLIGHT_CELL: [], + Resolution: 1 + } + }); + + async function getBasicData() { + // 假数据,后续可替换为接口 + const fakePrizes = [ + { type: 0, title: '特别奖', text: 'iPad', count: 10, img: '/src/assets/lottery/ipad.jpg' }, + { type: 1, title: '一等奖', text: 'Kindle', count: 20, img: '/src/assets/lottery/kindle.jpg' }, + { type: 2, title: '二等奖', text: 'MacBook Pro', count: 10, img: '/src/assets/lottery/mbp.jpg' } + ]; + const fakeEachCount = [10, 10, 10]; + const fakeCompany = '前端假公司'; + const fakeLuckyData = {}; + fakePrizes.forEach(prize => { + fakeLuckyData[prize.type] = []; + }); + const fakeLeftUsers = [ + [0, "张三"], + [1, "李四"], + [2, "王五"], + [3, "赵六"], + [4, "孙七"], + [5, "周八"], + [6, "吴九"], + [7, "郑十"], + [8, "钱十一"], + [9, "孙十二"], + [10, "李十三"], + [11, "周十四"], + [12, "吴十五"], + [13, "郑十六"], + [14, "钱十七"], + [15, "孙十八"], + [16, "李十九"], + [17, "周二十"], + [18, "吴二一"], + [19, "郑二二"], + ]; + state.config.prizes = fakePrizes; + state.config.EACH_COUNT = fakeEachCount; + state.config.COMPANY = fakeCompany; + state.config.HIGHLIGHT_CELL = []; + state.basicData.prizes = fakePrizes; + state.basicData.leftUsers = fakeLeftUsers.slice(); + state.basicData.luckyUsers = fakeLuckyData; + determineCurrentPrize(); + return Promise.resolve({ + cfgData: { + prizes: fakePrizes, + EACH_COUNT: fakeEachCount, + COMPANY: fakeCompany + }, + leftUsers: fakeLeftUsers.slice(), + luckyData: fakeLuckyData + }); + } + + async function getUsers() { + const fakeUsers = [ + [0, "张三"], + [1, "李四"], + [2, "王五"], + [3, "赵六"], + [4, "孙七"], + [5, "周八"], + [6, "吴九"], + [7, "郑十"], + [8, "钱十一"], + [9, "孙十二"], + [10, "李十三"], + [11, "周十四"], + [12, "吴十五"], + [13, "郑十六"], + [14, "钱十七"], + [15, "孙十八"], + [16, "李十九"], + [17, "周二十"], + [18, "吴二一"], + [19, "郑二二"], + ]; + state.basicData.users = fakeUsers; + return Promise.resolve(fakeUsers); + } + + function determineCurrentPrize() { + let prizeIndex = state.basicData.prizes.length - 1; + for (; prizeIndex > -1; prizeIndex--) { + if ( + state.basicData.luckyUsers[prizeIndex] && + state.basicData.luckyUsers[prizeIndex].length >= + state.basicData.prizes[prizeIndex].count + ) { + continue; + } + state.currentPrizeIndex = prizeIndex; + state.currentPrize = state.basicData.prizes[state.currentPrizeIndex]; + break; + } + } + + async function saveData(type, data) { + return Promise.resolve(); + } + async function setErrorData(data) { return Promise.resolve(); } + async function exportData() { alert('导出功能为假数据模式,无实际导出。'); return Promise.resolve(); } + async function resetData() { return Promise.resolve(); } + + function getTotalCards() { + return state.config.ROW_COUNT * state.config.COLUMN_COUNT || 50; + } + function setLotteryStatus(status = false) { state.isLotting = status; } + function resetAllData() { + state.basicData.luckyUsers = {}; + state.basicData.leftUsers = state.basicData.users.slice(); + state.currentLuckys = []; + determineCurrentPrize(); + } + function updateCurrentPrize() { determineCurrentPrize(); } + + return { + state, + getBasicData, + getUsers, + saveData, + setErrorData, + exportData, + resetData, + getTotalCards, + setLotteryStatus, + resetAllData, + updateCurrentPrize + }; +} \ No newline at end of file diff --git a/src/views/choujiang/lottery/lotteryEngine.js b/src/views/choujiang/lottery/lotteryEngine.js new file mode 100644 index 0000000..1b07618 --- /dev/null +++ b/src/views/choujiang/lottery/lotteryEngine.js @@ -0,0 +1,79 @@ +import { ref } from 'vue'; +import { useLotteryStore } from '../../../store/lottery' // 路径根据实际情况调整 + +function getRandomInt(max) { + return Math.floor(Math.random() * max); +} + +export function useLotteryEngine(dataManager, renderer3D) { + const isLotting = ref(false); + const lotteryStore = useLotteryStore(); // 只获取一次 + + async function executeLottery() { + if (isLotting.value) return; + isLotting.value = true; + dataManager.setLotteryStatus(true); + await dataManager.saveData(); + changePrize(); + // 重置卡片动画 + await renderer3D.resetCard([]); + // 生成中奖卡片索引和中奖用户 + const perCount = dataManager.state.config.EACH_COUNT[dataManager.state.currentPrizeIndex] || 1; + const totalCards = renderer3D.getTotalCards ? renderer3D.getTotalCards() : 50; + const leftUsers = dataManager.state.basicData.leftUsers; + let selectedCardIndex = []; + let currentLuckys = []; + let leftCount = leftUsers.length; + + console.log('executeLottery - perCount:', perCount, 'leftCount:', leftCount, 'totalCards:', totalCards); + + // 随机抽取中奖用户和卡片索引 + for (let i = 0; i < perCount && leftCount > 0; i++) { + const luckyId = getRandomInt(leftCount); + currentLuckys.push(leftUsers.splice(luckyId, 1)[0]); + leftCount--; + let cardIndex = getRandomInt(totalCards); + while (selectedCardIndex.includes(cardIndex)) { + cardIndex = getRandomInt(totalCards); + } + selectedCardIndex.push(cardIndex); + } + + console.log('executeLottery - selectedCardIndex:', selectedCardIndex, 'currentLuckys:', currentLuckys); + + dataManager.state.currentLuckys = currentLuckys; + // 展示中奖动画 + console.log('executeLottery - calling selectCard'); + await renderer3D.selectCard?.(selectedCardIndex, currentLuckys); + console.log('executeLottery - selectCard completed'); + dataManager.setLotteryStatus(false); + isLotting.value = false; + } + + function performLottery() { + // 已合并到 executeLottery + } + + function changePrize() { + // 可根据中奖情况切换奖品 + dataManager.updateCurrentPrize(); + } + + async function resetLottery() { + if (isLotting.value) return; + dataManager.resetAllData(); + renderer3D.addHighlight && renderer3D.addHighlight(); + lotteryStore.setLotteryState('idle'); // 直接用 + await renderer3D.resetCard([]); + await dataManager.resetData(); + renderer3D.switchScreen && renderer3D.switchScreen('enter'); + } + + return { + isLotting, + executeLottery, + performLottery, + changePrize, + resetLottery + }; +} \ No newline at end of file