APP转盘抽奖Java服务端接口详解

应公司需求开发一个微信公众号中抽奖活动

功能:奖品及中奖概率可在后台配置,滚动刷新中奖名单,控制用户每日抽奖次数等。

规则:在活动期间,每日可抽奖一次,中奖后填写个人信息以便奖品的配送。

1.获取抽奖页面数据

/**
 * 获取抽奖页面数据
 * @param request
 * @param response
 * @return
 * @throws ServletException
 * @throws IOException
 */
@RequestMapping(value="/queryLotteryActivity")
@ResponseBody
public AppIntReturn queryLotteryActivity(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 AppIntReturn res = new AppIntReturn();

 // 用户同意授权后,能获取到code
 String code = request.getParameter("code");

 // 用户同意授权
 if (!"authdeny".equals(code)) {
 // 获取网页授权access_token
 WeixinOauth2Token weixinOauth2Token = CommonUtil
 .getOauth2AccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT, code);
 // 用户标识
 String openId = weixinOauth2Token.getOpenId();

 if(!StringUtil.isEmpty(openId)){

 // 查询用户信息
 List<CxhWechatMember> memberList = appLotteryService.getMemberList(openId);
 // 操作次数
 int operNum = 1; // 可写成后台可配置的
 if(memberList != null && memberList.size() > 0){
 operNum = operNum - memberList.size();
 /*// 获取用户信息
 String accessToken = CommonUtil.getAccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT).getToken();
 cxhWechatMember = CommonUtil.getWeChatMemberInfo(accessToken, openId);
 // 保存用户信息
 appLotteryService.saveMemberInfo(cxhWechatMember);*/
 }

 if (null == request.getParameter("activityId") || "".equals(request.getParameter("activityId"))){
 res.setResult("-2");
 res.setMsg("参数错误");
 return res;
 }
 // 查询活动信息
 CxhVoteActivity cxhVoteActivity = appLotteryService.getActivityInfo(request.getParameter("activityId"));
 if (null == cxhVoteActivity){
 res.setResult("-3");
 res.setMsg("暂无该类活动");
 return res;
 }
 CxhVoteAward cxhVoteAward = new CxhVoteAward();
 cxhVoteAward.setCxhVoteActivity(cxhVoteActivity);
 // 查询奖品列表
 List<CxhVoteAward> awardList = appLotteryService.findAwardList(cxhVoteAward);

 // 返回Map
 Map<String, Object> rtnMap = new HashMap<String, Object>();
 rtnMap.put("activity", cxhVoteActivity);
 rtnMap.put("awardList", awardList);
 rtnMap.put("operNum", operNum);
 rtnMap.put("openId", openId);

 res.setResult("0");
 res.setMsg("请求成功");
 res.setData(rtnMap);
 }else{
 res.setResult("-1");
 res.setMsg("授权失败");
 }

 }else{
 res.setResult("-1");
 res.setMsg("授权失败");
 }
 return res;
}

2.中奖名单接口

/**
 * 中奖名单接口
 * @author lee
 * @return
 */
@ResponseBody
@RequestMapping(value = "/winningMemberList")
public Object queryWinningMemberList(HttpServletRequest request, HttpServletResponse response) {
 AppListReturn appResult = new AppListReturn();
 try {
 CxhWechatMember cxhWechatMember = new CxhWechatMember();
 cxhWechatMember.setIswinning("1"); // 中奖
 // 查询中奖用户名单(分页)
 Page<CxhWechatMember> pageList = appLotteryService.findPage(new Page<CxhWechatMember>(request, response), cxhWechatMember);
 appResult.setData(pageList.getList());
 appResult.setPageNumber(pageList.getPageNo());
 appResult.setPageSize(pageList.getPageSize());
 appResult.setTotal((int) pageList.getCount());
 appResult.setTotalPages(pageList.getTotalPage());
 appResult.setResult(0);
 appResult.setMsg("成功");
 } catch (Exception e) {
 appResult.setResult(-9);
 appResult.setMsg("系统异常");
 logger.info(e.toString(), e);
 }
 return appResult;
}

3.抽奖接口

/**
 * 抽奖接口
 * @author lee
 * @return
 */
@ResponseBody
@RequestMapping(value = "/doLottery")
public Object doLottery(HttpServletRequest request, HttpServletResponse response) {
 AppListReturn appResult = new AppListReturn();
 // 返回Map
 Map<String, Object> rtnMap = new HashMap<String, Object>();
 String activityId = request.getParameter("activityId");
 String openId = request.getParameter("openId");
 try {

 if (null == activityId || "".equals(activityId) || null == openId || "".equals(openId)){
 appResult.setResult(-2);
 appResult.setMsg("参数错误");
 return appResult;
 }
 // 查询活动信息
 CxhVoteActivity cxhVoteActivity = appLotteryService.getActivityInfo(request.getParameter("activityId"));
 if (null == cxhVoteActivity){
 appResult.setResult(-3);
 appResult.setMsg("暂无该类活动");
 return appResult;
 }
 CxhVoteAward cxhVoteAward = new CxhVoteAward();
 cxhVoteAward.setCxhVoteActivity(cxhVoteActivity);
 // 查询奖品列表
 List<CxhVoteAward> awardList = appLotteryService.findAwardList(cxhVoteAward);

 Random rd = new Random();
 double dd = rd.nextDouble();
 double before = 0;
 double end = 0;
 cxhVoteAward.setLevel("5"); // 5-未中奖

 // 计算中奖概率
 for (int i = 0; i < awardList.size(); i++) {
 if(i > 0){
 before += awardList.get(i-1).getRate().doubleValue();
 }
 end += awardList.get(i).getRate().doubleValue();
 if(dd >= before && dd < end){
 if(awardList.get(i).getLeftnum() > 0){
  // 中奖奖品
  cxhVoteAward = awardList.get(i);
  // 修改奖品剩余数量
  cxhVoteAward.setLeftnum(cxhVoteAward.getLeftnum() - 1);
  appLotteryService.updateAwardNumber(cxhVoteAward);
 }
 break;
 }
 }

 // 新增用户操作记录
 String accessToken = CommonUtil.getAccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT).getToken();
 CxhWechatMember cxhWechatMember = CommonUtil.getWeChatMemberInfo(accessToken, openId);
 cxhWechatMember.setId(IdGen.uuid());
 cxhWechatMember.setJoindate(new Date());
 cxhWechatMember.setDelFlag("0");
 // 保存用户信息
 appLotteryService.saveMemberInfo(cxhWechatMember);

 rtnMap.put("awardLevel", cxhVoteAward.getLevel());
 rtnMap.put("awardId", cxhVoteAward.getId());
 appResult.setData(rtnMap);
 appResult.setResult(0);
 appResult.setMsg("成功");
 } catch (Exception e) {
 appResult.setResult(-9);
 appResult.setMsg("系统异常");
 logger.info(e.toString(), e);
 }
 return appResult;
}

4.保存中奖用户信息的接口

/**
 * 保存中奖用户信息的接口
 * @author lee
 * @return
 */
@ResponseBody
@RequestMapping(value = "/saveMemberInfo")
public Object saveMemberInfo(HttpServletRequest request, HttpServletResponse response) {
 AppListReturn appResult = new AppListReturn();
 try {

 // 用户同意授权后,能获取到code
 String openId = request.getParameter("openId");
 String username = request.getParameter("username");
 String phone = request.getParameter("phone");
 String address = request.getParameter("address");
 String awardLevel = request.getParameter("awardLevel");
 String awardId = request.getParameter("awardId");

 if (null == username || "".equals(username)
 || null == phone || "".equals(phone)
 || null == address || "".equals(address)
 || null == openId || "".equals(openId)
 || null == awardLevel || "".equals(awardLevel)
 || null == awardId || "".equals(awardId)){
 appResult.setResult(-2);
 appResult.setMsg("参数错误");
 return appResult;
 }

 // 查询用户信息
 List<CxhWechatMember> memberList = appLotteryService.getMemberList(openId);
 CxhWechatMember cxhWechatMember = memberList.get(0);
 cxhWechatMember.setUsername(username);
 cxhWechatMember.setPhone(phone);
 cxhWechatMember.setAddress(address);
 cxhWechatMember.setIswinning(awardLevel == "5" ? "0" : "1");
 cxhWechatMember.setAwardid(awardId);
 appLotteryService.update(cxhWechatMember);

 appResult.setResult(0);
 appResult.setMsg("成功");

 } catch (Exception e) {
 appResult.setResult(-9);
 appResult.setMsg("系统异常");
 logger.info(e.toString(), e);
 }
 return appResult;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现双色球抽奖随机算法示例

    第一次写技术博客,写一下以前写的一个双色球抽奖随机算法. 原理如下: 1首先初始化一个待抽奖的数组nums,数组的长度k 2. 随机一个1-k之间的随机数,得到nums[k],这样得到第一个抽奖号,nums中剔除该号码,k--. 3. 重复步骤2,直到得到全部中奖号码 class myLuck { private int mTarget; List<Integer> mNums = new ArrayList<Integer>(); //摇奖池 ///从多少个数中产生多少个数 //

  • 简单实现java抽奖系统

    本文为大家分享了java抽奖系统的具体代码,供大家参考,具体内容如下 用户信息类 /* * 用户信息类 * 1.账号 * 2.密码 * 3.卡号 * 4.是否登录 */ public class User { public static String userName = ""; public static String passWord = ""; public static int cardNumber = 0; // 是否登录 public static bo

  • 纯java代码实现抽奖系统

    本文实例为大家分享了java实现抽奖系统 的具体代码,供大家参考,具体内容如下 模拟一个在终端登陆注册的页面 public class Cjtest { public static void main(String[] args) { String isGoOn = "n"; //循环的判断条件是否继续 do { System.out.println("*********幸运52********"); System.out.println("1.注册&qu

  • Java抽奖算法第二例

    本文实例为大家分享了java抽奖算法,供大家参考,具体内容如下 1. 算法分析  根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取随机数,反查落在那个区间上,即为所抽取的奖品. 2. 代码 核心算法 public class Arithmetic { // 放大倍数 private static final int mulriple = 1000000; public int pay(List<Prize> prizes) { int lastScope = 0; // 洗牌,打乱奖品次

  • Java简易抽奖系统小项目

    本文实例为大家分享了Java简易抽奖系统的具体代码,供大家参考,具体内容如下 需求: 实现一个抽奖系统 1 注册 2 登录 3 抽奖 必须先注册  再登陆  再抽奖 随机产生4个随机数作为幸运卡号 用户注册后 登录的时候  用户名密码输入判断只有三次机会 需要做到  还有2次   还有1次  三次输入错误 不能再登录 产生10个随机数  将用户注册得到的随机数作为判断 代码如下: import java.util.*; public class Homeworktest { public sta

  • 基于Java实现抽奖系统

    本次任务要求为某商场开发一套幸运抽奖系统,客户必须首先注册成为该商场会员,会员登录成功后,就可以参加抽奖活动了. 注册 用户选择"注册"菜单,进入注册界面.输入用户名和密码后,系统提示注册成功,并给出会员卡号. 登录 注册成功后,用户选择"登录"菜单,进入登录界面.输入注册时的用户名和密码.登录成功,系统提示欢迎信息.如果用户和密码输入错误,提示用户继续输入,最多有3次机会. 抽奖 登录成功后,用户选择"抽奖"菜单,进入幸运抽奖界面.输入会员卡号

  • Java抽奖抢购算法

    本文示例为大家分享了Java抽奖抢购算法,供大家参考,具体内容如下 应用场景 单件奖品抢购(可限时) 多件奖品按概率中奖(可限时.可不限量) 代码实现 表结构: --抽奖设置 create table AWARD_INFO ( ID NUMBER(11) not null, ACT_ID NUMBER(11), --活动ID NUM NUMBER(11), --奖品总量(0为不限量) REST NUMBER(11), --奖品余量 ODDS NUMBER(11) default 0, --中奖概

  • APP转盘抽奖Java服务端接口详解

    应公司需求开发一个微信公众号中抽奖活动 功能:奖品及中奖概率可在后台配置,滚动刷新中奖名单,控制用户每日抽奖次数等. 规则:在活动期间,每日可抽奖一次,中奖后填写个人信息以便奖品的配送. 1.获取抽奖页面数据 /** * 获取抽奖页面数据 * @param request * @param response * @return * @throws ServletException * @throws IOException */ @RequestMapping(value="/queryLott

  • 微信小程序开发(二)图片上传+服务端接收详解

    这次介绍下小程序当中常用的图片上传. 前几天做了图片上传功能,被坑了一下.接下来我们来看一下微信的上传api. 这里的filePath就是图片的存储路径,类型居然是个String,也就是 只能每次传一张图片,我以前的接口都是接收一个array,我本人又是一个半吊子的PHP,只能自己去改接收图片的接口. 看一下页面效果图 一个很常见的修改头像效果,选择图片(拍照),然后上传. 下面就是贴代码了 首先是小程序的wxml代码 <view class="xd-container">

  • 详解Android项目多服务端接口适配(超简单)

    现状 Android项目如果是多服务端接口时,一般怎么弄呢? 方法1:服务器地址放在Header中 把服务器地址放在接口Header中,然后通过拦截器来动态修改请求地址而实现的.除了默认服务器的接口,其它都要加一个Header,有点麻烦.看起来也不爽,不简洁. interface ApiHeaderCase { /************************** server A ****************************/ @Headers("host:$SERVER_HOS

  • java使用xfire搭建webservice服务的过程详解

    前言 以前用的都是 apache 的cxf来搞webservice,今天做项目发现这个项目用的是 xfire,于是搭一个,写个demo用一下,在此记录一下过程. 搭建过程 本文使用的是maven形式的web工程.不知道如何搭建web工程的看上一篇博文. 引入xfire的依赖 <dependency> <groupId>org.codehaus.xfire</groupId> <artifactId>xfire-all</artifactId> &

  • Java NIO通信基础示例详解

    目录 Java NIO 通信基础介绍 NIO 和 OIO 的对比 使用 FileChannel 完成文件复制的实践案例 使用 DatagramChannel 数据包通道发送数据的实践案例 使用 NIO 实现 Discard 服务器的实践案例 Java NIO 通信基础介绍 高性能的 Java 通信,绝对离不开 Java NIO 技术,现在主流的技术框架或中间件服务器,都使 用了 Java NIO 技术,譬如:Tomcat.Jetty.Netty. Java NIO 由以下三个核心组件组成: Ch

  • java回调机制实例详解

    java回调机制实例详解 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 clas

  • java 接口回调实例详解

    java 接口回调实例详解 首先官方对接口回调的定义是这样的,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法.这样听起来有点绕,我们可以这么理解接口回调:比如我们想知道隔壁老王啥时候回家?但是我们有自己的事情做不能一直监视着老王,那么我们可以雇员小区的保安来完成这个任务,当老王回家口,保安就给我们打电话告诉我们,老王回来了!这样就完成了一个事件的传递: 首先我们定义了一个接口: public interface DynamicMessage

  • JAVA 多线程爬虫实例详解

    JAVA 多线程爬虫实例详解 前言 以前喜欢Python的爬虫是出于他的简洁,但到了后期需要更快,更大规模的爬虫的时候,我才渐渐意识到Java的强大.Java有一个很好的机制,就是多线程.而且Java的代码效率执行起来要比python快很多.这份博客主要用于记录我对多线程爬虫的实践理解. 线程 线程是指一个任务从头至尾的执行流.线程提供了运行一个任务的机制.对于Java而言,可以在一个程序中并发地启动多个线程.这些线程可以在多处理器系统上同时运行. runnable接口 任务类必须实现runna

  • Java多线程同步器代码详解

    同步器 为每种特定的同步问题提供了解决方案,同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作.最常用的同步器是CountDownLatch和Semaphore,不常用的是Barrier 和Exchanger Semaphore Semaphore[信号标:旗语],通过计数器控制对共享资源的访问. 测试类: package concurrent; import concurrent.thread.SemaphoreThread; import java.util.concurrent.

  • 5个主流的Java开源IDE工具详解

    Java IDE工具提供了多种用户独特需求和个人偏好来创建编程环境的方法. Java框架能够简化程序员的工作.这些框架被设计和开发用于在任何服务器环境上运行任意应用程序;包括解析注释.扫描描述符.加载配置和在Java虚拟机(JVM)上启动实际服务方面的动态行为.控制这么大的范围需要更多的代码,使得减少内存占用或加速新应用程序的启动时间变得困难.无论如何,Java在当今使用的编程语言中始终排在前三名,在TIOBE索引中涉及700万到1000万的程序员和开发者. 因为Java如此的普及,意味着集成开

随机推荐