zoukankan      html  css  js  c++  java
  • 刺猬校招互助群研发总结

    这次的活动是自己的处女作,主要的功能有哪些呢??

    1:自己答题  ----->>>根据自己答题的结果来进行打分和排序

    2:邀请好友答题

      每个参与者需要三个好友答完三套不同的题目才能答题成功,此时参与者才能看到好友对自己的评价。评价分数也会相应的展示出来。

    主要操作点:

    1.PHP数组操作,多维数据转一维,数组去重,数组删除指定元素等等

    2.随机数操作,在指定的范围内随机生成n个不同的随机数,8选1,再从剩下的7中选4.

    3.redis 缓存数据库的使用。

    ==============================================================================================================

    正文:

    该活动只能在微信的环境下完成,因此需要获取用户的openid,即用户的唯一标识ID,有了ID号之后接下来才能进行下一步,获取openid的方法如下:

    if (isset($_COOKIE["openid"])) {//先从cookie中获取 用户的openid
                $openid = $_COOKIE["openid"];
                $cacheOpenid = $this->getCacheOpenid($openid);//从缓存中获取该用户是否已经参与活动
                if (empty($cacheOpenid)) {
                    setcookie("openid", "", time() - 5800, "/", ".ciweishixi.com");
                    //没有用户信息
                    header('Location: ' . self::homeurl);
                    die();
                }
            } else {
                $REDIRECT_URI = urlencode(self::homeurl);
                $info = $this->wxUserInfo($REDIRECT_URI, "state");
                if (is_array($info)) {
                    $openid = $info["data"]["openid"];
                    setcookie("openid", $openid, time() + 3600 * 2, "/", ".ciweishixi.com");
                    $data = $info["data"];
                    $model->saveGroupxzProfile($data["openid"], $data["nickname"], $data["headimgurl"]);
                    $this->addCacheOpenid($openid);//将openid 写入缓存
                } else {
                    die("网络繁忙请刷新再试");
                }
            }

    首先从用户的cookie中获取openid,再判断该openID是否存在数据库中,若不存在,则删除本地的cookie,重新设置新的cookie,(用户中cookie的openid并非来自本网站,有可能是伪造的cookie数据)

    没有从用户的cookie中获取到openid的时候,从微信中获取openID。

    从缓存中获取openid的代码如下:

     //从缓存中获取openid,判断该用户是否参加过该活动
        private function getCacheOpenid($openid){
            $key = "pj_group_openid_".$openid;
            $cache = RedisClass::getInstance(12);
            $data = $cache->GET($key);
            if (empty($data)) {//缓存中不存在数据,则在数据库中查询该值
                $model = new SweepstakesModel();
                $data = $model->getGroupxzProfile($openid);
                if (!empty($data)) {//数据库中存在则写入缓存
                    $cache->SET($key, $openid, 3600*24*30);//1个月过期时间
                }
            }
            return $data;
        }

     将新插入到数据库中的数据写入缓存

    //设置openid缓存
        private function addCacheOpenid($openid){
            $key = "pj_group_openid_".$openid;
            $cache = RedisClass::getInstance(12);
            $cache->SET($key, $openid, 3600*24*30);//1个月过期时间
        }

    数组操作:邀请好友的时候,随机给用户分配题目,

    //三批题目没有分发完毕,则进行题目分配            
                /*$numData = $this->getJoinNumBytidCache($tid);//从缓存中获取总共帮助的人数
                //从剩余的题目中进行数据
                $item_id = ($numData % 3)+1;//当前人数对3取模+1 , 给帮测者分配的题目批次号
                $this->setJoinNumBytidCache($tid , $numData+1);//缓存数据加1*/
                $item_key = 0;
                $haveHelpItem = $model->getQuestionItemByTid($tid);//[1,2]
                $allitem = [1, 2, 3];
                if (!empty($haveHelpItem)) {
                    foreach ($haveHelpItem as $key => $value) {
                        unset($allitem[($value['item_id']-1)]);
                    }
                }
                $item_key = array_rand($allitem,1);
                $item_id = $allitem[$item_key];
                //从一个数组中随机取一个值
     $allitem = [1,2,3] 表示最初的三批题目,先从数据库中获取,该用户已经被回答了几批题目,然后从总池子中删除已经被回答的题目,再从剩下的题目中随机分配。

     第二种分配方法利用缓存,每个新进来的人都会分配到不同的题目,用户每次刷新都会获取一个新的题目序号。

    $numData = $this->getJoinNumBytidCache($tid);//从缓存中获取总共帮助的人数
     //从剩余的题目中进行数据
     $item_id = ($numData % 3)+1;//当前人数对3取模+1 , 给帮测者分配的题目批次号
     $this->setJoinNumBytidCache($tid , $numData+1);//缓存数据加1

    选取随机数,8选一,再从中进行7选4

            $answer_score = [] ;
            $answer_id = $answer[2]['answer'] ; //记录第三道题的答案ID
            $answer_point = $this->position[$answer_id-1];//获取第三道题答案对应的中文名称
            $random = range(0,7);//生成0-7的数组
            unset($random[($answer_id-1)]);//排除自测的选项
            unset($this->position[($answer_id-1)]);
            ########## 生成四个不重复的随机数#####
            $random_keys=array_rand($random,4);
            $answer_score[0] = array($answer_point => mt_rand(95,99));//中文名称对应的分数
            $answer_score[1] = array($this->position[$random[$random_keys[0]]] => mt_rand(81,87));
            $answer_score[2] = array($this->position[$random[$random_keys[1]]] => mt_rand(70,80));
            $answer_score[3] = array($this->position[$random[$random_keys[2]]] => mt_rand(70,80));
            $answer_score[4] = array($this->position[$random[$random_keys[3]]] => mt_rand(70,80));
  • 相关阅读:
    基于flash的web视频对讲直播测试
    终于放弃Windows下丑陋的cmd
    直播推流兼容性问题追踪
    32位和64位dll判断
    H264编码参数的一些小细节
    cmake编译win下64位obs
    The certificate used to sign "XXX" has either expired or has been revoked
    记录一次Android交叉编译ffmpeg排查错误
    SDK "iphoneos" cannot be located
    av_interleaved_write_frame 网络不好的情况下返回较慢
  • 原文地址:https://www.cnblogs.com/xs-yqz/p/7367612.html
Copyright © 2011-2022 走看看