更新记录

1.0.0(2026-07-13)

1.0.0

  • 新增大转盘抽奖组件 uni-luck-wheel
  • 新增九宫格抽奖组件 uni-luck-grid
  • 新增营销抽奖活动页组件 uni-lottery-campaign
  • 支持活动信息、剩余次数、奖品池、中奖记录、活动规则和中奖弹窗
  • 支持服务端指定中奖结果后播放抽奖动画
  • 新增 mock adapter,方便纯前端快速预览
  • 新增 uniCloud adapter,方便接入云函数
  • 新增 uniCloud 阿里云云函数骨架和数据库 schema

平台兼容性

uni-app(3.8.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-luck-draw 前端抽奖组件

uni-luck-draw 是一个可发布到 uni-app 插件市场的营销抽奖活动解决方案,包含大转盘、九宫格、活动页、中奖弹窗、中奖记录、规则展示和 uniCloud 云端骨架。基础抽奖组件只负责动画,活动编排组件负责把抽奖次数、记录、结果弹窗和数据适配器串起来,适合活动营销、积分抽奖、会员福利、签到抽奖等场景。

特性

  • 支持 Vue2 / Vue3 的 uni-app 项目。
  • 支持 H5、App Vue、主流小程序端。
  • 支持服务端指定中奖结果,也支持前端按权重随机。
  • 抽奖动画、颜色、按钮文案、奖品图文均可配置。
  • 组件内部状态闭环,业务侧通过事件和方法接入,低耦合、易维护。
  • 内置 uni-lottery-campaign 完整活动模板,可直接作为营销活动页二开。
  • 提供 lottery-campaign easycom 别名组件,适配插件市场组件目录校验。
  • 提供 mock adapter、uniCloud adapter 和云函数/数据库 schema 骨架。

安装

在插件市场导入后,或手动将本目录放入项目:

uni_modules/uni-luck-draw

uni-app 会自动扫描 uni_modules 下的组件,无需额外注册。

完整活动模板

<template>
  <uni-lottery-campaign
    :activity="activity"
    :records="records"
    @finish="handleFinish"
    @view-records="handleViewRecords"
  />
</template>

<script>
export default {
  data() {
    return {
      activity: {
        title: '618 会员福利抽奖',
        subtitle: '抽会员权益、优惠券和积分礼包。',
        drawType: 'wheel',
        remainingTimes: 3,
        totalParticipants: 2688
      },
      records: []
    }
  },
  methods: {
    handleFinish(result) {
      console.log('中奖结果', result.prize)
    },
    handleViewRecords(records) {
      console.log('全部记录', records)
    }
  }
}
</script>

接入 uniCloud

import { createUniCloudLotteryAdapter } from '@/uni_modules/uni-luck-draw/js_sdk/uni-luck-draw/cloud-adapter.js'

export default {
  data() {
    return {
      adapter: createUniCloudLotteryAdapter({
        activityId: 'demo-summer-lottery'
      })
    }
  }
}
<uni-lottery-campaign :adapter="adapter" />

云函数和数据库 schema 位于:

uni_modules/uni-luck-draw/uniCloud-aliyun

包含:

  • uni-luck-draw-activity:读取活动配置
  • uni-luck-draw-records:读取用户中奖记录
  • uni-luck-draw-draw:执行抽奖、扣减次数、写入记录
  • uni-luck-draw-activities.schema.json
  • uni-luck-draw-records.schema.json
  • uni-luck-draw-user-quotas.schema.json

大转盘组件

<template>
  <uni-luck-wheel
    ref="wheel"
    :prizes="prizes"
    :auto-start="false"
    @start="drawByServer"
    @finish="handleFinish"
    @error="handleError"
  />
</template>

<script>
export default {
  data() {
    return {
      prizes: [
        { id: 'vip', name: '会员月卡', weight: 1 },
        { id: 'coupon', name: '优惠券', weight: 10 },
        { id: 'point', name: '100积分', weight: 20 },
        { id: 'thanks', name: '谢谢参与', weight: 50 }
      ]
    }
  },
  methods: {
    async drawByServer() {
      const result = await this.requestDraw()
      const index = this.prizes.findIndex(item => item.id === result.prizeId)
      this.$refs.wheel.start(index)
    },
    requestDraw() {
      return Promise.resolve({ prizeId: 'coupon' })
    },
    handleFinish(prize) {
      uni.showToast({ title: `抽中:${prize.name}`, icon: 'none' })
    },
    handleError(error) {
      console.warn(error)
    }
  }
}
</script>

大转盘 Props

属性 类型 默认值 说明
prizes Array [] 奖品列表,支持 idnameimageweightdisabled
targetIndex Number -1 受控中奖下标
targetId String/Number '' 受控中奖奖品 id
size String/Number 620 转盘尺寸,数字按 rpx 处理
duration Number 4200 动画时长,单位 ms
turns Number 6 旋转圈数
disabled Boolean false 是否禁用
buttonText String 开始 按钮默认文案
runningText String 抽奖中 抽奖中文案
themeColor String #e23f3f 外圈主色
accentColor String #ffd36a 按钮强调色
textColor String #642525 奖品文字色
pointerColor String #d83333 指针颜色
segmentColors Array ['#fff7df', '#ffe3a1'] 扇区颜色
autoStart Boolean true 点击后是否自动按当前配置开始

大转盘 Methods

方法 参数 说明
start(index) index?: number 开始抽奖。传入 index 时优先使用传入值
reset() 重置动画和运行状态

九宫格组件

<template>
  <uni-luck-grid
    ref="grid"
    :prizes="prizes"
    :target-id="targetId"
    @finish="handleFinish"
  />
</template>

<script>
export default {
  data() {
    return {
      targetId: 'point',
      prizes: [
        { id: 'vip', name: '会员月卡' },
        { id: 'coupon', name: '优惠券' },
        { id: 'point', name: '100积分' },
        { id: 'gift', name: '实物礼品' },
        { id: 'coin', name: '金币' },
        { id: 'card', name: '权益卡' },
        { id: 'thanks', name: '谢谢参与' },
        { id: 'again', name: '再来一次' }
      ]
    }
  },
  methods: {
    handleFinish(prize) {
      uni.showModal({ title: '抽奖结果', content: prize.name, showCancel: false })
    }
  }
}
</script>

九宫格 Props

属性 类型 默认值 说明
prizes Array [] 奖品列表,3x3 九宫格建议传 8 个奖品
targetIndex Number -1 受控中奖下标
targetId String/Number '' 受控中奖奖品 id
columns Number 3 网格列数,支持 2 到 5
gap String/Number 12 宫格间距,数字按 rpx 处理
durationRounds Number 5 动画循环圈数
disabled Boolean false 是否禁用
buttonText String 开始抽奖 按钮默认文案
runningText String 抽奖中 抽奖中文案
themeColor String #e23f3f 容器主色
cellColor String #fff7df 普通格子颜色
activeColor String #ffd36a 高亮格子颜色
textColor String #642525 奖品文字色
autoStart Boolean true 点击后是否自动按当前配置开始

九宫格 Methods

方法 参数 说明
start(index) index?: number 开始抽奖。传入 index 时优先使用传入值
reset() 重置动画和运行状态

Events

两个组件保持一致的事件设计:

事件名 参数 说明
start 用户点击开始按钮时触发
finish prize 动画结束后触发,返回原始奖品对象
error { message, targetIndex } 配置或中奖结果异常时触发

奖品数据结构

{
  id: 'coupon',
  name: '优惠券',
  image: '/static/coupon.png',
  weight: 10,
  disabled: false
}

weight 仅在未指定 targetIndextargetId 时生效。正式活动建议由服务端完成抽奖并返回中奖奖品,前端只负责展示动画。

设计建议

  • 真实营销活动请使用 :auto-start="false",点击后先请求服务端抽奖接口,再调用 start(index)
  • 前端权重随机只适合演示或非严肃业务。
  • 奖品数量过多时建议使用九宫格,奖品名称保持 4 到 6 个中文字符可获得更稳定的展示效果。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件本身不采集任何用户数据,不主动发送数据到任何第三方服务器。 插件包含可选的 uniCloud 云函数示例,用于活动配置读取、抽奖结果生成、抽奖次数扣减和中奖记录保存。相关数据仅在开发者自行部署的 uniCloud 服务空间内处理,是否启用、采集哪些用户标识和业务数据,由接入方项目自行决定。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: