4 Commits

  1. 11
      src/store/lottery.js
  2. 1
      src/views/choujiang/hxl-cj/cj.vue
  3. 89
      src/views/choujiang/index.vue
  4. 7
      src/views/choujiang/lottery/Lottery3D.vue
  5. 7
      src/views/choujiang/lottery/PrizePanel.vue
  6. 7
      src/views/choujiang/lottery/dataManager.js
  7. 38
      src/views/choujiang/lottery/lotteryEngine.js

11
src/store/lottery.js

@ -14,6 +14,9 @@ export const useLotteryStore = defineStore('lottery', () => {
const allUsers = ref([]) const allUsers = ref([])
const isUsersLoaded = ref(false) const isUsersLoaded = ref(false)
const winnerList = ref([])
function setWinners(list) { function setWinners(list) {
// 如果是数组,则添加到现有数组中;如果是单个项目,则直接添加 // 如果是数组,则添加到现有数组中;如果是单个项目,则直接添加
if (Array.isArray(list)) { if (Array.isArray(list)) {
@ -54,6 +57,10 @@ export const useLotteryStore = defineStore('lottery', () => {
return "" return ""
} }
function setWinnerList(list) {
winnerList.value = list
}
return { return {
lotteryState, lotteryState,
setLotteryState, setLotteryState,
@ -67,6 +74,8 @@ export const useLotteryStore = defineStore('lottery', () => {
allUsers, allUsers,
isUsersLoaded, isUsersLoaded,
setAllUsers, setAllUsers,
getRandomUserName
getRandomUserName,
winnerList,
setWinnerList
} }
}) })

1
src/views/choujiang/hxl-cj/cj.vue

@ -368,6 +368,7 @@ const initAll = async () => {
getPrizeListApi(), getPrizeListApi(),
getUserListApi(), getUserListApi(),
]); ]);
console.log("hxl-cj调用一次接口", prizeList);
// //
prizes.value = prizeList.data; prizes.value = prizeList.data;
// //

89
src/views/choujiang/index.vue

@ -19,6 +19,12 @@
</div> </div>
</div> </div>
<div v-if="showPrizeExhaustedModal1" class="prize-exhausted-modal">
<div class="modal-content">
<p class="modal-text">请先揭秘一个礼品</p>
</div>
</div>
<!-- <UserList <!-- <UserList
:lucky-users=" :lucky-users="
dataManager.state.basicData.luckyUsers[ dataManager.state.basicData.luckyUsers[
@ -44,10 +50,12 @@ import { useDataManager } from "./lottery/dataManager.js";
import { useLotteryEngine } from "./lottery/lotteryEngine.js"; import { useLotteryEngine } from "./lottery/lotteryEngine.js";
import { useLotteryStore } from "../../store/lottery"; // import { useLotteryStore } from "../../store/lottery"; //
import { drawLottery } from "../../api/API";
const qipaoText = ref(""); const qipaoText = ref("");
const showQipao = ref(false); const showQipao = ref(false);
const showPrizeExhaustedModal = ref(false); const showPrizeExhaustedModal = ref(false);
const showPrizeExhaustedModal1 = ref(false);
// const lotteryState = ref('idle'); // idle, ready, rotating, result // const lotteryState = ref('idle'); // idle, ready, rotating, result
@ -68,6 +76,11 @@ const waitingForNextReveal = computed({
set: (val) => lotteryStore.setWaitingForNextReveal(val), set: (val) => lotteryStore.setWaitingForNextReveal(val),
}); });
const winnerList = computed({
get: () => lotteryStore.winnerList,
set: (val) => lotteryStore.setWinnerList(val),
});
const isDisabled = ref(false); const isDisabled = ref(false);
watch(isDisabled, (newVal, oldVal) => { watch(isDisabled, (newVal, oldVal) => {
@ -88,12 +101,17 @@ const lotteryEngine = useLotteryEngine(dataManager, {
}); });
onMounted(async () => { onMounted(async () => {
isDisabled.value = true;
setTimeout(() => {
isDisabled.value = false;
}, 4000);
await dataManager.getBasicData(); await dataManager.getBasicData();
await dataManager.getUsers(); await dataManager.getUsers();
// dataManager window 使 // dataManager window 使
window.dataManager = dataManager; window.dataManager = dataManager;
// //
setTimeout(() => { setTimeout(() => {
if (musicPlayerRef.value && !musicPlayerRef.value.isPlaying()) { if (musicPlayerRef.value && !musicPlayerRef.value.isPlaying()) {
@ -121,12 +139,15 @@ function showLotteryQipao() {
async function handleLotteryClick() { async function handleLotteryClick() {
if (isDisabled.value) return; // 2 if (isDisabled.value) return; // 2
isDisabled.value = true; isDisabled.value = true;
setTimeout(() => {
isDisabled.value = false;
}, 2000);
// setTimeout(() => {
// isDisabled.value = false;
// }, 2000);
switch (lotteryState.value) { switch (lotteryState.value) {
case "idle": case "idle":
setTimeout(() => {
isDisabled.value = false;
}, 2000);
// //
await lottery3DRef.value?.switchScreen?.("lottery"); await lottery3DRef.value?.switchScreen?.("lottery");
@ -135,6 +156,7 @@ async function handleLotteryClick() {
lotteryState.value = "ready"; lotteryState.value = "ready";
console.log("lotteryState 变更后:", lotteryState.value); console.log("lotteryState 变更后:", lotteryState.value);
break; break;
case "ready": case "ready":
if (waitingForNextReveal.value) { if (waitingForNextReveal.value) {
@ -144,25 +166,72 @@ async function handleLotteryClick() {
setTimeout(() => { setTimeout(() => {
showPrizeExhaustedModal.value = false; showPrizeExhaustedModal.value = false;
}, 1000); }, 1000);
isDisabled.value = false;
break; break;
} }
if (lastRevealed.value === -1) { if (lastRevealed.value === -1) {
console.log("lastRevealed.value", lastRevealed.value); console.log("lastRevealed.value", lastRevealed.value);
showPrizeExhaustedModal1.value = true;
setTimeout(() => {
showPrizeExhaustedModal1.value = false;
}, 1000);
isDisabled.value = false;
break; break;
} }
//
console.log("lotteryState 变更前:", lotteryState.value, "-> rotating"); console.log("lotteryState 变更前:", lotteryState.value, "-> rotating");
lotteryState.value = "rotating"; lotteryState.value = "rotating";
console.log("lotteryState 变更后:", lotteryState.value); console.log("lotteryState 变更后:", lotteryState.value);
//
// isRunning.value = false; //
await lottery3DRef.value?.rotateBallStart?.();
const prize = dataManager.state.basicData.prizes[lastRevealed.value];
console.log("准备调用 drawLottery,prize:", prize);
console.log("lastRevealed.value:", lastRevealed.value);
//
const rotatePromise = lottery3DRef.value?.rotateBallStart?.();
//
try {
winnerList.value = await drawLottery({
perWin: prize.perWin,
remainNum: prize.remainNum,
gradeId: prize.gradeId,
prizeId: prize.prizeId,
});
setTimeout(() => {
isDisabled.value = false;
}, 2000);
console.log("drawLottery 调用成功,结果:", winnerList.value);
} catch (error) {
console.error("drawLottery 调用失败:", error);
}
// await rotatePromise
break; break;
case "rotating": case "rotating":
setTimeout(() => {
isDisabled.value = false;
}, 2000);
// //
// const prize = dataManager.state.basicData.prizes[lastRevealed.value];
// console.log(" drawLotteryprize:", prize);
// console.log("lastRevealed.value:", lastRevealed.value);
// try {
// winnerList.value = await drawLottery({
// perWin: prize.perWin,
// remainNum: prize.remainNum,
// gradeId: prize.gradeId,
// prizeId: prize.prizeId,
// });
// console.log("drawLottery :", winnerList.value);
// } catch (error) {
// console.error("drawLottery :", error);
// }
await lottery3DRef.value?.rotateBallStop?.(); await lottery3DRef.value?.rotateBallStop?.();
await lotteryEngine.executeLottery(); await lotteryEngine.executeLottery();
await nextTick(); await nextTick();
@ -174,7 +243,11 @@ async function handleLotteryClick() {
break; break;
case "result": case "result":
setTimeout(() => {
isDisabled.value = false;
}, 2800);
// result // result
await lottery3DRef.value?.switchScreen?.("lottery"); await lottery3DRef.value?.switchScreen?.("lottery");
await new Promise((resolve) => setTimeout(resolve, 2500)); await new Promise((resolve) => setTimeout(resolve, 2500));

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

@ -154,8 +154,10 @@ function createSphereTargets() {
const theta = Math.sqrt(l * Math.PI) * phi; const theta = Math.sqrt(l * Math.PI) * phi;
const object = new THREE.Object3D(); const object = new THREE.Object3D();
object.position.setFromSphericalCoords(600, phi, theta); object.position.setFromSphericalCoords(600, phi, theta);
// object.position.y -= 400; // 10px// object.position.y -= 20; // yOffset
vector.copy(object.position).multiplyScalar(2);
object.position.y -= 200; // 200px
//
vector.set(0, -200, 0); // Y
object.lookAt(vector); object.lookAt(vector);
targets.sphere.push(object); targets.sphere.push(object);
} }
@ -735,6 +737,7 @@ onMounted(async () => {
}; };
const userList = await getUserListApi(); const userList = await getUserListApi();
console.log("3D调用一次接口", userList);
// lotteryStore.setWinners(userList); // lotteryStore.setWinners(userList);
// console.log("userList", userList); // console.log("userList", userList);
// 3D // 3D

7
src/views/choujiang/lottery/PrizePanel.vue

@ -175,6 +175,7 @@ import { ref, computed, nextTick, watch, onMounted } from "vue";
import { useLotteryStore } from "../../../store/lottery"; import { useLotteryStore } from "../../../store/lottery";
import { useDataManager } from "../lottery/dataManager"; import { useDataManager } from "../lottery/dataManager";
const props = defineProps({ const props = defineProps({
prizes: Array, prizes: Array,
}); });
@ -275,11 +276,12 @@ const fakeWinners = ref([]);
// fakeWinners.value = winners.value; // fakeWinners.value = winners.value;
console.log("fakeWinners", fakeWinners.value); console.log("fakeWinners", fakeWinners.value);
import { getGetPrizeUserListApi } from "../../../api/API";
const updateWinners = async () => { const updateWinners = async () => {
try { try {
const response = await useDataManager().updatePrizeList();
const response = await getGetPrizeUserListApi({})
console.log("updatePrizeList response", response); console.log("updatePrizeList response", response);
fakeWinners.value = response.data.data.list;
fakeWinners.value = response.data.list;
console.log("updateWinners fakeWinners", fakeWinners.value); console.log("updateWinners fakeWinners", fakeWinners.value);
} catch (error) { } catch (error) {
console.error("updatePrizeList error", error); console.error("updatePrizeList error", error);
@ -412,7 +414,6 @@ function getProgressPercent(prize) {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
display: flex; display: flex;
align-items: center; align-items: center;
min-width: 320px; min-width: 320px;
} }
.prize-card { .prize-card {

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

@ -36,7 +36,8 @@ export function useDataManager() {
img: item.imageUrl, img: item.imageUrl,
gradeId: item.gradeId, gradeId: item.gradeId,
prizeId: item.prizeId, prizeId: item.prizeId,
remainNum: item.remainNum
remainNum: item.remainNum,
perWin: item.perWin
})); }));
const fakeEachCount = prizeList.data.map(item => item.perWin); const fakeEachCount = prizeList.data.map(item => item.perWin);
@ -49,6 +50,7 @@ export function useDataManager() {
// 获取真实用户数据 // 获取真实用户数据
const userListResponse = await getUserListApi(); const userListResponse = await getUserListApi();
console.log("dataManager调用一次接口", userListResponse);
console.log("userList", userListResponse); console.log("userList", userListResponse);
// 将后端返回的用户数据转换为兼容格式 // 将后端返回的用户数据转换为兼容格式
@ -170,7 +172,8 @@ export function useDataManager() {
img: item.imageUrl, img: item.imageUrl,
gradeId: item.gradeId, gradeId: item.gradeId,
prizeId: item.prizeId, prizeId: item.prizeId,
remainNum: item.remainNum
remainNum: item.remainNum,
perWin: item.perWin
})); }));
const fakeEachCount = prizeList.data.map(item => item.perWin); const fakeEachCount = prizeList.data.map(item => item.perWin);

38
src/views/choujiang/lottery/lotteryEngine.js

@ -2,14 +2,26 @@ import { ref, computed, watch } from 'vue';
import { useLotteryStore } from '../../../store/lottery' // 路径根据实际情况调整 import { useLotteryStore } from '../../../store/lottery' // 路径根据实际情况调整
import { drawLottery } from '../../../api/API'; // 导入新的抽奖接口 import { drawLottery } from '../../../api/API'; // 导入新的抽奖接口
function getRandomInt(max) { function getRandomInt(max) {
return Math.floor(Math.random() * max); return Math.floor(Math.random() * max);
} }
const lotteryStore = useLotteryStore(); const lotteryStore = useLotteryStore();
const winners = computed({
get: () => lotteryStore.winners,
set: (val) => lotteryStore.setWinners(val),
// const winners = computed({
// get: () => lotteryStore.winners,
// set: (val) => lotteryStore.setWinners(val),
// });
const lastRevealed = computed({
get: () => lotteryStore.lastRevealedIdx,
set: (val) => lotteryStore.setLastRevealedIdx(val),
});
const winnerList = computed({
get: () => lotteryStore.winnerList,
set: (val) => lotteryStore.setWinnerList(val),
}); });
@ -34,13 +46,13 @@ export function useLotteryEngine(dataManager, renderer3D) {
// 计算本次应该抽奖的人数 // 计算本次应该抽奖的人数
const currentPrizeIndex = dataManager.state.currentPrizeIndex; const currentPrizeIndex = dataManager.state.currentPrizeIndex;
const prize = dataManager.state.basicData.prizes[currentPrizeIndex];
const luckyUsers = dataManager.state.basicData.luckyUsers[currentPrizeIndex] || [];
const prize = dataManager.state.basicData.prizes[lastRevealed.value];
const luckyUsers = dataManager.state.basicData.luckyUsers[lastRevealed.value] || [];
const remainingPrizeCount = prize.count - luckyUsers.length; // 奖品剩余数量 const remainingPrizeCount = prize.count - luckyUsers.length; // 奖品剩余数量
const basePerCount = dataManager.state.config.EACH_COUNT[currentPrizeIndex] || 1;
const basePerCount = dataManager.state.config.EACH_COUNT[lastRevealed.value] || 1;
const actualPerCount = Math.min(basePerCount, remainingPrizeCount); // 取最小值 const actualPerCount = Math.min(basePerCount, remainingPrizeCount); // 取最小值
console.log('executeLottery - currentPrizeIndex:', currentPrizeIndex, 'prize:', prize, 'basePerCount:', basePerCount, 'remainingPrizeCount:', remainingPrizeCount, 'actualPerCount:', actualPerCount);
console.log('executeLottery - currentPrizeIndex:', lastRevealed.value, 'prize:', prize, 'basePerCount:', basePerCount, 'remainingPrizeCount:', remainingPrizeCount, 'actualPerCount:', actualPerCount);
// 请求后端进行抽奖 // 请求后端进行抽奖
try { try {
@ -51,14 +63,14 @@ export function useLotteryEngine(dataManager, renderer3D) {
remainNum: prize.remainNum remainNum: prize.remainNum
}; };
console.log('请求后端抽奖,参数:', lotteryData);
const response = await drawLottery(lotteryData);
console.log('response', response);
winners.value = response.data.data;
console.log('抽奖的winners', winners.value);
// console.log('请求后端抽奖,参数:', lotteryData);
const response = winnerList.value
console.log('后端抽奖返回结果:', response);
// winners.value = response.data.data;
// console.log('抽奖的winners', winners.value);
// winners.value = response.data; // winners.value = response.data;
console.log('后端抽奖返回结果:', response);
// console.log('后端抽奖返回结果:', response);
if (response && response.data.data && Array.isArray(response.data.data)) { if (response && response.data.data && Array.isArray(response.data.data)) {
// 后端返回中奖用户数据 // 后端返回中奖用户数据

Loading…
Cancel
Save