刺猬校招互助群研发总结

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

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));
原文地址:https://www.cnblogs.com/xs-yqz/p/7367612.html