抽奖顺序控制:支持多种抽奖顺序的实现与持久化

272 阅读3分钟

在年会抽奖系统中,不同场景下的抽奖顺序需求可能会有所不同。例如:

  • 随机抽取奖品,营造紧张感和未知性。
  • 按奖品等级高到低的顺序抽取,提升活动的层次感。
  • 按奖品等级低到高的顺序抽取,逐渐递进到高潮。

本文将探讨如何支持多种抽奖顺序并通过 localStorage 实现设置的持久化。


问题描述

当前的抽奖系统默认按奖品等级从高到低排序,不能灵活切换顺序。需要支持以下三种抽奖顺序:

  1. 随机顺序:打乱奖品列表,随机抽取。
  2. 等级高到低:先抽特别奖和高等级奖,后抽低等级奖。
  3. 等级低到高:先抽低等级奖,最后抽特别奖。

此外,为了提升用户体验,还需要在页面刷新或重新登录后记住用户选择的抽奖顺序。


解决方案

1. 添加抽奖顺序设置

我们可以通过 UI 提供用户选项,让用户选择抽奖顺序。例如:

<label>
  <input type="radio" name="order" value="random" checked /> 随机顺序
</label>
<label>
  <input type="radio" name="order" value="desc" /> 等级高到低
</label>
<label>
  <input type="radio" name="order" value="asc" /> 等级低到高
</label>

2. 实现抽奖顺序逻辑

根据用户选择的顺序,动态排序奖品列表。以下是 JavaScript 实现代码:

// 奖品数据
const prizes = [
  { name: "三等奖", level: 1 },
  { name: "二等奖", level: 2 },
  { name: "一等奖", level: 3 },
  { name: "特别奖", level: 4 },
];

// 抽奖顺序设置(持久化到 localStorage)
function getDrawOrder() {
  return localStorage.getItem("drawOrder") || "random"; // 默认随机
}

function setDrawOrder(order) {
  localStorage.setItem("drawOrder", order);
}

// 排序逻辑
function sortPrizes(order, prizes) {
  if (order === "random") {
    return prizes.sort(() => Math.random() - 0.5); // 随机排序
  } else if (order === "desc") {
    return prizes.sort((a, b) => b.level - a.level); // 等级高到低
  } else if (order === "asc") {
    return prizes.sort((a, b) => a.level - b.level); // 等级低到高
  }
  return prizes;
}

// 获取用户选择的顺序
const userOrder = getDrawOrder();

// 排序奖品
const sortedPrizes = sortPrizes(userOrder, prizes);
console.log(sortedPrizes);

3. 用户设置持久化

当用户选择某种抽奖顺序时,我们将其存储到 localStorage 中,以便在页面刷新后仍能记住用户的选择。

// 绑定事件监听用户选择
document.querySelectorAll('input[name="order"]').forEach((input) => {
  input.addEventListener("change", (e) => {
    const selectedOrder = e.target.value;
    setDrawOrder(selectedOrder); // 保存到 localStorage
    const sortedPrizes = sortPrizes(selectedOrder, prizes); // 更新排序
    console.log(sortedPrizes); // 调试输出
  });
});

完整功能的演示效果

  1. 默认顺序(随机)
    用户首次打开抽奖页面时,奖品顺序为随机。
  2. 用户选择某种排序规则后
    奖品顺序会按照用户的选择展示,并立即生效。
  3. 页面刷新后
    用户上次选择的抽奖顺序会自动加载,带来一致的使用体验。

扩展与优化

1. 支持更多抽奖规则

如果年会抽奖系统未来需要支持更复杂的规则,例如:

  • 按奖品价值排序。
  • 按奖品剩余数量动态调整优先级。

可以通过增加规则选项和对应的排序逻辑轻松扩展。

2. 动态更新奖品

在抽奖过程中,每次抽出一个奖品后,奖品列表应实时更新排序。可以在抽取逻辑中重新调用 sortPrizes

function drawPrize() {
  const remainingPrizes = sortedPrizes.shift(); // 抽出第一个奖品
  console.log("抽中的奖品:", remainingPrizes);
  console.log("剩余奖品:", sortPrizes(getDrawOrder(), sortedPrizes));
}

3. 改善用户体验

  • 实时反馈:在用户选择排序规则时,奖品列表立即更新并展示。
  • UI 美化:通过动画效果切换不同排序顺序,增加抽奖的互动感和趣味性。

总结

通过为年会抽奖系统添加抽奖顺序设置,用户可以自由选择随机、等级高到低、等级低到高等多种排序规则,并且借助 localStorage 实现了设置的持久化。
这一改进不仅提升了抽奖环节的灵活性和趣味性,还为用户提供了更贴心的体验。

在年会抽奖的实际场景中,排序逻辑的设计是细节决定体验的典型案例。希望本文的实现方案能为你的抽奖系统开发带来帮助!