需求分析

  1. 多轮抽奖,每轮只有3个环节:展示奖品图,人名闪动,停止闪动确定中奖名单
  2. 中奖分级,例如试用期员工不能中二等奖或以上
  3. 每轮抽奖的中奖人数不同。每个人只能中一次奖
  4. 可临时加场,现场输入奖品名、数量。额外窗口输入,避免被观众看到修改过程。
  5. 本地记录每轮的奖品和中奖名单
  6. 全屏显示。不确定现场的屏幕分辨率,故核心部分固定1024*768,居中显示;背景拉伸铺满全屏。

(本程序仅适合懂点编程知识的人用,非商业化,不讲易用性)

技术选型

搞桌面程序第一时间就想到了这几个框架:Java SwingPython TkinterC++ QtC# WPF。虽然都可行,但感觉开发不够便捷。而且谁知道年会现场那台电脑有没有对应的运行时库。

最后经同事给的灵感想到了用JavaScript做,选定了node-webkit,即nw.js。没有选electron是它需要搭开发环境。我只想用个文本编辑器快点搞出来而已……

既然连开发环境都懒得搭,那自然要应用VueReactAngular的话会比较麻烦。实际上也没必要,小学生才用牛刀杀鸡。

代码开源

开源在 https://github.com/hursing/raffle 。文末会贴一下当前的版本,但以github上的为准。

使用方法

启动

先在GitHub download或clone整份代码。然后到 https://nwjs.io/ 下载node-webkit,解压。

Windows的启动方法:把代码的整个目录拖动到解压出来的nw.exe上。

其它操作系统按官方说明做:

cd /path/to/your/app
/path/to/nw .

/path/to/nw is the binary file of NW.js. On Windows, it’s nw.exe; On Linux, it’s nw; On Mac, it’s nwjs.app/Contents/MacOS/nwjs.

按键

  • f:切换全屏
  • 4:下一步。进入下一轮抽奖的展示奖品图片、进入名单滚动。
  • 空格:立刻停止名单滚动。即确定中奖人员。
  • 8:重新加载配置文件。主要用于临场增加奖项
  • 1:上一步,用来看看上个奖项的情况

核心文件说明

  • index.html:所有代码都在这
  • steps.json:流程配置文件,应该一看就懂。中奖后此文件会被修改,包含中奖名单。如果需要加奖项,不用退出程序,编辑完这个文件后按8就能重新加载配置,继续抽。
  • names.ini:人员名单与可中奖等级,等级数字越小表示可中更大的奖。中奖后此文件会被修改,删除已中奖的人。示例ini中人名也带有数字是方便验证等级机制生效而已,实际不需要。

PS:由于我是在mac上搞的,所以文件保存是以LF换行的。在Windows用记事本来打开的话会不显示换行,因为不是CRLF。文件编码都是utf-8。可以下载个notepad++来编辑。

TODO

  • 启动的时候“设置窗口大小和位置”会造成闪动,可以做得体验好点,虽然没必要
  • 更多的可动态设置项
  • 启动方式还是有点别扭,可打包一下程序

代码

程序步骤说明:

  1. 调整窗口大小和位置
  2. 读取配置文件,得到人员名单和抽奖轮次信息
  3. 进入第1轮。通过按键4和空格进入下个环节
  4. 用state变量来记录状态:展示图片、滚动名单、显示中奖名单

html的部分:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><script>var win = nw.Window.get()win.resizeTo(1024, 768)win.moveTo(0, 0)</script><style type="text/css">* {margin: 0;padding: 0;}html, body {width: 100%;height: 100%;}body {text-align: center;background: url("./bg.png") no-repeat;overflow: hidden;background-size: 100% 100%;font-weight: bold;color: #D40000;}#container {min-width: 1000px;min-height: 700px;}#title {font-size: 100px;margin-top: 80px;}#disc {font-size: 40px;margin: 10px 0;}#image {margin-top: 20px;max-height: 280px;border: 1px solid #E23540FF;border-radius: 20px;}#list {margin: 0 auto;max-width: 800px;}#list span {display: inline-block;width: 160px;font-size: 36px;margin-top: 8px;}</style></head><body><div id="container"><div id="title">XX公司年会</div><div id="disc">奖品描述</div><img id="image" /><div id="list"></div></div><script>var fs = require('fs')var steps = nullvar step = 0var names = nullvar state = ''var disc = document.getElementById('disc')var image = document.getElementById('image')var list = document.getElementById('list')function reloadConf(func) {fs.readFile('./names.ini', 'utf8', function(err, data) {names = data.split('\n').map(x => x.split(','))})fs.readFile('./steps.json', 'utf8', function(err, data) {steps = eval(data)if (func) func()})}function saveConf(func) {fs.writeFile('./steps.json', JSON.stringify(steps), function(err) {if (err) {alert(err)}})fs.writeFile('./names.ini', names.map(x => x.join(',')).join('\n'), function(err) {if (err) {alert(err)}})}function showPic(data) {disc.innerHTML = data.discimage.src = data.imageimage.style.display = 'inline'list.style.display = 'none'while (list.hasChildNodes()) {list.removeChild(list.firstChild)}}function showBlink(data) {disc.innerHTML = data.discimage.style.display = 'none'list.style.display = 'block'var spans = []for (var i = 0; i < data.count; ++i) {var span = document.createElement('span')list.appendChild(span)spans.push(span)}function doBlink() {if (state == 'showBlink') {names.sort(function() {return 0.5 - Math.random()})for (var i = 0; i < data.count; ++i) {spans[i].innerHTML = names[i][0]}window.requestAnimationFrame(doBlink)}}window.requestAnimationFrame(doBlink)}function showList(data) {disc.innerHTML = data.discimage.style.display = 'none'list.style.display = 'block'while (list.hasChildNodes()) {list.removeChild(list.firstChild)}for (var i = 0; i < data.list.length; ++i) {var span = document.createElement('span')span.innerHTML = data.list[i]list.appendChild(span)}}function nextStep() {var data = steps[step]if (state == 'showPic') {data.list = data.list || []if (data.list.length > 0) {state = 'showList'showList(data)} else {state = 'showBlink'showBlink(data)}} else if (state == 'showBlink') {if (data.list.length > 0) {state = 'showList'showList(data)}} else if (state == 'showList') {if (step < (steps.length - 1)) {++stepstate = ''nextStep()}} else {state = 'showPic'showPic(data)}}function previousStep() {if (step > 0) {--step}state = ''nextStep()}function drawPrize() {if (state == 'showBlink') {var data = steps[step]names.sort(function (a, b) {if (a[1] <= data.level && b[1] > data.level) {return -1}return 0})var luck = names.splice(0, data.count)data.list = luck.map(x => x[0])saveConf()nextStep()}}document.addEventListener('keydown', function(e) {e=e||window.eventif (e.keyCode == 56) {// 8reloadConf()} else if (e.keyCode == 52) {// 4nextStep()} else if (e.keyCode == 49) {// 1previousStep()} else if (e.keyCode == 32) {// 空格drawPrize()} else if (e.keyCode == 70) {// fwin.toggleFullscreen()}})reloadConf(nextStep)</script> </bdoy>
</html>

年会抽奖程序:200行HTML+JavaScript写个桌面程序相关推荐

  1. 简单介绍三个C语言图形库C语言其实最擅长的是写纯数据处理的程序 . 非得用C语言写个界面程序那将会变得很困难 . 我刚开始学C语言就是从hello world 开始的 , 后来慢慢开始学从三个数中找

    C语言其实最擅长的是写纯数据处理的程序 . 非得用C语言写个界面程序那将会变得很困难 . 我刚开始学C语言就是从hello world 开始的 , 后来慢慢开始学从三个数中找出最大值 , 和对数组进行 ...

  2. PAIP WEB程序网站安全扫描检测工具(桌面程序)总结

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! PAIP ...

  3. 用200行Go代码写一个自己的区块链!

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链 ...

  4. 只用200行Go代码写一个自己的区块链!

    "用不到200行 Go 代码就能实现一个自己的区块链!" 听起来有意思吗?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事医疗健康领域 ...

  5. 人工智能换脸pythonapp_如何用小200行Python代码做一个换脸程序?

    今日不同往常,每周干货日,场主送出的不是成套的各类编程教学视频,而是一些轻应用实操.因为完成基本的理论学习之后,任何的呈现都在于如何应用及创新. 所以,在分享一系列教材类视频外,场主还会穿插着分享给大 ...

  6. python换脸完整程序_如何用小200行Python代码做一个换脸程序?

    今日不同往常,每周干货日,场主送出的不是成套的各类编程教学视频,而是一些轻应用实操.因为完成基本的理论学习之后,任何的呈现都在于如何应用及创新. 所以,在分享一系列教材类视频外,场主还会穿插着分享给大 ...

  7. c语言程序字体放大,C语言写的俄罗斯方块程序减小字体 增大字体 作者.docx

    C语言写的俄罗斯方块程序减小字体 增大字体 作者 C语言写的俄罗斯方块程序减小字体增大字体作者:佚名来源:不详发布时间:2009-9-21 1:11:22收藏到网摘:合作洽谈大概在最近两天之内编码完成 ...

  8. python手写字体程序_深度学习---手写字体识别程序分析(python)

    我想大部分程序员的第一个程序应该都是"hello world",在深度学习领域,这个"hello world"程序就是手写字体识别程序. 这次我们详细的分析下手 ...

  9. 彩票中奖java程序 随机30选7_写一个彩票程序:30选7

    1. 写一个彩票程序:30选7.随机(1~30之间)生成7个随机数,注意不能重复.然后从键盘输入7个数,对比7个数是否与随机数有相同的.最后显示"中了几个号".同时,如果中了7个号 ...

  10. python 之路200行Python代码写了个打飞机游戏

    先看一下项目结构 \ """ PlayPlane/ |-- bin/ | |-- main.py 程序运行主体程序 |-- config/ | |-- settings. ...

最新文章

  1. ucgui下制作漂亮按键
  2. Activit流程部署、删除
  3. linux字符串转为二进制,Linux printf将十进制转换为二进制?
  4. php中使用mysql的视图_MYSQL中视图的用法介绍(代码示例)
  5. CheckStyle
  6. Gym-101466K Random Numbers(线段树,数学,唯一分解定理)
  7. mysql数据库的体系结构包括什么组件_MySQL数据库的体系结构
  8. react安装_前端大牛进阶---gt;React必会教程
  9. linux xorg 文件 位置,Linux系统中xorg.conf文件详细介绍
  10. Arm公布2019年物联网领域五大预测:智能家居、智慧城市、医疗保健上榜
  11. laravel连接oracle6,Laravel 使用 Oracle 数据库
  12. Ubuntu18.04系统中python3.7安装MultiNEAT库
  13. CIO思考:混合云为行业注入了哪些活力?
  14. MySQL 索引详解大全
  15. 标签 'http' 已声明。标签名称在批查询或存储过程内部必须唯一。
  16. Echarts3 主题设置
  17. 无线通信——GSM系统组成
  18. 【折腾】GitHub Actions 反代 RSSHub + 多实例轮询
  19. Nhanes临床数据库挖掘教程1----数据库下载
  20. Alien Skin Exposure X4 Bundle 4.5.3.66 特别版 Mac 模拟胶片效果调色滤镜

热门文章

  1. Android性能优化第(七)篇---StrickMode严苛模式检测耗时与内存问题
  2. app端-留存分析-周留存率报表开发
  3. python自动化运维开发入门-张子夜-专题视频课程
  4. 魔法阵c语言课程设计,魔法阵真的存在吗?
  5. 初学Java---运算符和语句的使用
  6. 《springboot学习》 十九 springboot集成mybatis-plus
  7. 百钱买百鸡 假设公鸡5文钱一只 母鸡三文钱一只 小鸡1文钱三只,要求用100文钱 , 如何买到100只鸡
  8. 四、大话HTTP协议-用Wireshark研究一个完整的TCP连接
  9. win10执行压缩卷的注意点,否则出现磁盘空间不够的情况
  10. ThinkPHP微信小说小程序源码-自带采集带安装教程