field: mining 格式: { "progress": 10, "symbol": "etc", "icon": "http://x.png", "price": 20, "total": 20 } */ $defStatus = [ 'progress'=> 0, 'symbol'=>$symbo, 'icon'=>$icon, 'total'=> 0, 'ts' => time(), ]; if ($symbo) { $smymining = Redis::hGet('user:'.$uid, 'mining'); $mymining = json_decode($smymining, true) ?? $defStatus; if ($mymining['progress'] > 0) { $mymining = $this->calcMining($mymining); } } /* 跑马灯 列表: 键 sys:carousel 格式: { "text": "", "uri": "page/boards", } */ $arrStr = Redis::lRange('sys:carousel', 0, 10)??[]; $carousel = []; foreach ($arrStr as $str) { array_push($carousel, json_decode($str, true)); } return app('json')->successful(compact('unread', 'mymining', 'carousel')); } /** * 根据上次挖矿状态, 和过去的时长, 计算当前的状态 * @param $p * @return mixed */ protected function calcMining(&$p) { if ($p['progress'] <= 0) { return $p; } if (!isset($p['ts'])) { return $p; } $now = time(); $secs_passed = $now - $p['ts']; $reward_unit = Config::get('app.mining_num_per_5_sec'); $hours = Config::get('app.mining_time'); if (count($hours) != 2 || $hours[1] < $hours[0]) { Log::warning('app.mining_time config error.'); return $p; } $hour = random_int($hours[1], $hours[0]); $secs = $hour * 60 * 60; // if ($secs_passed >= $secs) { // 挖矿结束 $p['progress'] = 0; // 本次个数 $count = floatval(bcmul(bcdiv($secs, 5.0, 2), $reward_unit, 2)); // TODO save to database $p['total'] += $count; return $p; } $count = floatval(bcmul(bcdiv($secs_passed, 5.0, 2), $reward_unit, 2)); $p['progress'] = $count; return $p; } }