All Projects → renmingliang → Vue Lottery

renmingliang / Vue Lottery

🎨 抽奖以及截屏保存图片至本地

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Vue Lottery

D2 Admin
An elegant dashboard
Stars: ✭ 11,012 (+12135.56%)
Mutual labels:  webpack, axios, mock, vuex, element-ui
Vue Cms
基于 Vue 和 ElementUI 构建的一个企业级后台管理系统
Stars: ✭ 415 (+361.11%)
Mutual labels:  webpack, axios, mock, vuex, element-ui
Nx Admin
👍 A magical 🐮 ⚔ vue admin,记得star
Stars: ✭ 2,497 (+2674.44%)
Mutual labels:  webpack, axios, mock, vuex, element-ui
Vue Element Admin
🎉 A magical vue admin https://panjiachen.github.io/vue-element-admin
Stars: ✭ 73,044 (+81060%)
Mutual labels:  webpack, axios, mock, vuex, element-ui
Vue Blog
🎉 基于vue全家桶 + element-ui 构建的一个后台管理集成解决方案
Stars: ✭ 208 (+131.11%)
Mutual labels:  webpack, axios, mock, vuex, element-ui
Vue Todos
vue最新实战项目教程,从零开始,一步一个脚印,循序渐进。跟着我一起学习vue吧!
Stars: ✭ 1,659 (+1743.33%)
Mutual labels:  webpack, axios, vuex, element-ui
Vue Admin Webapp
this is a admin project
Stars: ✭ 673 (+647.78%)
Mutual labels:  webpack, axios, mock, vuex
Front End Doc
前端文档汇总(觉得对您有用的话,别忘了star收藏哦^_^ !)
Stars: ✭ 372 (+313.33%)
Mutual labels:  webpack, axios, vuex, element-ui
Vue2 Manage
基于 vue + element-ui 的后台管理系统
Stars: ✭ 11,345 (+12505.56%)
Mutual labels:  webpack, vuex, element-ui, less
Vue2 Study
vue 的webpack配置,按需加载,element-ui,vuex
Stars: ✭ 16 (-82.22%)
Mutual labels:  webpack, axios, vuex, element-ui
Vue3 Admin
👏vue3.0后台管理框架👏基于vue-cli4+compositionAPI+vue-router4
Stars: ✭ 54 (-40%)
Mutual labels:  axios, mock, vuex, less
Vue Spa Project
vue.js + vuex + vue-router + fetch + element-ui + es6 + webpack + mock 纯前端SPA项目开发实践
Stars: ✭ 118 (+31.11%)
Mutual labels:  webpack, mock, vuex, element-ui
Vue Cli Multi Page
基于vue-cli模板的多页面多路由项目,一个PC端页面入口,一个移动端页面入口,且有各自的路由, vue+webpack+vue-router+vuex+mock+axios
Stars: ✭ 145 (+61.11%)
Mutual labels:  webpack, axios, mock, vuex
Vue Project
基于vue-cli构建的财务后台管理系统(vue2+vuex+axios+vue-router+element-ui+echarts+websocket+vue-i18n)
Stars: ✭ 301 (+234.44%)
Mutual labels:  webpack, axios, vuex, element-ui
Vue Admin Design
基于vue + elementUI的管理系统模板
Stars: ✭ 279 (+210%)
Mutual labels:  webpack, axios, vuex, element-ui
Vue Spa
vue-spa : vue + vue-router + axios + vuex + vux 快速成型移动端项目,直接使用。欢迎star
Stars: ✭ 46 (-48.89%)
Mutual labels:  webpack, axios, vuex, less
Vue Admin Html
Vue-cli3.0 + Element UI + Spring Boot2.0 + ThinkPHP5.1 + 响应式的后台管理系统 https://lmxdawn.github.io/vue-admin
Stars: ✭ 436 (+384.44%)
Mutual labels:  mock, vuex, element-ui
Vue2 blog
使用vue2.x + vue-cli +vue-router+ vuex + axios + mysql + express + pm2 + webpack+nginx构建的具有登录,注册,留言,用户发帖,用户评论等功能的SPA Blog。注意,注意,注意,后端API全部自己手写,很适合刚学习vue以及express的小伙伴学习,喜欢请Star鼓励一下我,谢谢!项目预览:
Stars: ✭ 417 (+363.33%)
Mutual labels:  webpack, axios, vuex
Blog.admin
✨ 基于vue 的管理后台,配合Blog.Core与Blog.Vue等多个项目使用
Stars: ✭ 500 (+455.56%)
Mutual labels:  axios, vuex, element-ui
Ruoyi Vue
(RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统
Stars: ✭ 596 (+562.22%)
Mutual labels:  axios, vuex, element-ui

简介

基于vue.js抽奖项目,截屏保存每次抽奖图片至本地,附带背景音乐

技术栈:vue + vuex + vue-router + axios + mock + elementUI + html2canvas + nprogress + less + ECMAScript6

本项目目前处于持续更新阶段,欢迎star,issue关注!

说明

示例地址

点击查看

实现思路

本项目主要有以下几个点需要注意

  1. 为了保证数据安全,需要设置登录,在登录成功之后的前提下获取后台传递的数据,以及回传数据也需要验证是否已登录;

  2. 这里利用mock来模拟数据,考虑正式抽奖的数据都上千条,cookie和storage存储空间受限都不够用,依次考虑利用浏览器支持的indexDB来存储用户数据库,以及主要奖项和该奖项抽取的人数的;

  3. 每次抽奖完成的结果,须返回给后台存储数据,以保障前后台数据一致性(实现具体抽奖的逻辑功能,不受限,取决于前后台同事自己沟通结果,本示例前端实现抽取,在src/views/lottery文件内);

  4. 记录单次抽奖人数,不论抽多少次,只要满足本轮奖项人数,即宣告本轮抽取结束,代码逻辑不以抽取多少次为依据;

  5. 同时每次抽中的用户数据需要三步处理:

    A. 回传至后台;

    B. 同步至本地indexDB,防止当前页刷新时丢失已抽中用户数据,再一次进入抽奖池;

    C. 截取抽奖屏幕图,用于事后比对;

  6. 考虑抽奖现场肯定会加抽奖项的环节(不多说,参与过年会的都知道,没抽中的人肯定会叫喊老板现场再抽的),故可以在后台设置其他将,人数为空(若为空。前端会默认设置抽取99人,毕竟加抽的奖项人数,99人足够啦,),或者更多,这里也可灵活变动;

配置文件

数据的构造,参照如下代码结构:

// 抽奖数据
data: {
  // 用户
  userData: [
    {Company: '公司测1', CompleteID: '1', HeadImg: 'http://test.baoxianadmin.com/static/m/images/headImage/1.jpg', Name: '测1', Num: 'M1', OpenID: '1', Award: '0'},
    {Company: '公司测13', CompleteID: '13', HeadImg: 'http://test.baoxianadmin.com/static/m/images/headImage/13.jpg', Name: '测13', Num: 'M13', OpenID: '13', Award: '0'}
  ],
  // 奖项
  type: [
    {value: '9', label: '特等奖', number: '3'},
    {value: '1', label: '一等奖', number: '5'},
    {value: '2', label: '二等奖', number: '12'},
    {value: '3', label: '三等奖', number: '20'},
    {value: '4', label: '参与奖', number: '28'},
    {value: '5', label: '其他', number: ''}
  ]
}

本项目配置文件位于src/utils/config,按照注释相应地修改对应项就好。


// global config 注意: 所有接口均为mock测试,项目中需要自己替换
const config = {
  // 1.登录页
  login: {
    // 登录请求地址
    url: '/zt_lottery/login',
    // 检测登陆状态
    checkUrl: '/zt_lottery/check_login',
    state: {
      // 当前公司提示语
      msg: '民太安集团年会抽奖系统',
      form: {
        username: 'mta2018',
        trigger: 'blur',
        show: true
      }
    }
  },
  // 2.加载数据页
  onload: {
    // 获取数据地址
    url: '/zt_lottery/list_member'
  },
  // 3.中奖活动页
  lottery: {
    // 回传中奖数据地址
    url: '/zt_lottery/add',
    state: {
      // 样式
      style: {
        // 主背景图
        bg: { // 在请求资源路径时,需要require
          backgroundImage: `url(${require('../assets/images/background.png')})`,
          backgroundRepeat: 'no-repeat',
          backgroundSize: '100% 100%'
        },
        // 当前抽奖年
        year: {
          show: false,
          img: require('../assets/images/2017.png')
        }
      },
      // 是否需要下载抽奖截图
      download: {
        show: false,
        delay: 800
      },
      // 滚动间隔
      intervalTime: 50,
      // 绑定键盘事件
      keyBand: {
        start: 'Enter',
        stop: 'Space'
      }
    }
  },
  // 4.全局state状态
  state: {
    // indexDB名称
    DBname: 'lottery2018',
    // indexDB版本
    DBver: '2',
    // indexDB存储表名称
    storeName: {
      user: 'user', // 用户
      award: 'type' // 奖项
    },
    // 背景音乐
    music: {
      show: false,
      src: require('../assets/media/shiji.mp3')
    },
    // 参与规则
    rule: {
      show: true,
      img: require('../assets/images/QR-code.jpg'),
      html: '<p>活动规则:<br>关注微信公众号“家家365”<br>回复您的员工编号+姓名<br>(如“M0001234王小明”)完成实名认证<br>收到系统回复后即代表进入抽奖名单中</p>'
    }
  }
}

功能

  1. 抽奖前,选择需要抽取的奖项
  2. 点击开始抽奖按钮(或Enter回车键),数据滚动
  3. 点击抽取(或space空格键)结束滚动,显示中奖人员
  4. 再点击开始抽取进入第2步循环,若完成本轮抽取,则进入第1步选择抽取其他奖项

截图

一。界面截图:

针对1920*1080大屏设计显示,当然也适配其他PC端,以下为该项目主要界面截图:

登录界面 数据加载界面 抽奖界面

二。抽奖截屏:

截屏示例

自动保存的抽奖截图文件至本地思路:

  1. 实现的流程逻辑在src/utils/screenshot文件中;
  2. 由于浏览器browser不支持node.js的模块fs读写文件,因而本示例采用html2canvas来完成截图功能,具体的使用自行百度或谷歌;
  3. 截完屏,最主要的是需要自动保存至本地,利用a标签的download和herf属性可以实现,通过在结束时,自动调用click的事件来触发;
  4. 注意:可能在截屏功能下,出现没有将头像获取下来情况,经查阅资料发现,是由于头像采用的mockjs模拟的,而项目代码部署在另外一个服务器,因而出现跨越情况导致此情况出现,解决办法:前端在html2canvas中添加参数 ==> 允许跨域:allowTaint: true,同时服务器需要允许跨越,即设置 CORS

开发

# 克隆项目
git clone https://github.com/renmingliang/vue-lottery.git

# 切换至目录
cd vue-lottery

# 安装依赖
npm install

# 本地浏览器地址:localhost:9301
npm run dev

# 发布正式版本
npm run build

# build for production and view the bundle analyzer report
npm run build --report

For a detailed explanation on how things work, check out the guide and docs for vue-loader.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].