cyzhao 3 years ago
parent
commit
c9b2a9be57

+ 84 - 0
Gameserver/Public/gamesys/app/providers/newUserRetention.php

@@ -0,0 +1,84 @@
+<?php
+
+/* 
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+include_once dirname(__FILE__) . '/../main.php';
+
+$params = query_paras();
+
+$rType = $params['rType'];
+if($rType == 1){
+$date = $params['date'];
+$zoneid = 1;//先默认是1,其他区还没有
+$day = intval((strtotime($date)+28800) / 86400);
+$memKey = "gamerun-loginUser-byUid-zone".$zoneid."-day_".$day;
+
+if(!gMem()->exists($memKey)){
+    $result = new stdClass();
+    $dic = new stdClass();
+    $dic->data1 = array(0,0,0,0,0,0,0,0);
+    $dic->data2 = array(0,0,0,0,0,0,0);
+    $result->data = $dic;
+    
+    echo json_encode($result);
+} else {
+    $retArr = array();
+    $perArr = array();
+
+    $curLoginUidDic = gMem()->hgetall($memKey);
+    $total = count((array)$curLoginUidDic);
+    $retArr[] = $total;
+
+    $numbersArr = array(1, 2, 3, 4, 5, 6,7);
+    foreach ($numbersArr as $type) {
+        $typeDay = $day + $type; 
+        $memKey = "gamerun-loginUser-byUid-zone".$zoneid."-day_".$typeDay;
+    
+        if(!gMem()->exists($memKey)){
+            $retArr[] = 0;            
+        } else {
+            $typeDic = gMem()->hgetall($memKey);
+            $n = 0;
+            foreach ($curLoginUidDic as $uid=>$val) {
+                if(property_exists($typeDic, $uid)){
+                    $n += 1;
+                }        
+            }
+            $retArr[] = $n;
+        }   
+    }
+
+    $index = 0;
+    foreach ($retArr as $num) {
+        if($index == 0){
+            $index += 1;
+            continue;
+        }
+
+        $per = intval($num/$total*100);
+        $perArr[] = $per;
+    }
+
+    $result = new stdClass();
+    $result->data1 = $retArr;
+    $result->data2 = $perArr;
+    echo json_encode($result);
+}
+
+} else {
+    $startTime = $paras['date1'];
+    $endTime = $paras['date2'];
+    $type = $paras['type'];
+
+    
+    
+    $result = new stdClass();
+    $result->data1 = $retArr;
+    $result->data2 = $perArr;
+    echo json_encode($result);
+}
+
+

+ 2 - 62
Gameserver/Public/gamesys/app/providers/retention.php

@@ -8,7 +8,6 @@ include_once dirname(__FILE__) . '/../main.php';
 $params = query_paras();
 $date = $params['date'];
 
-/*---old
 $numbers = array(1, 3, 5, 7, 15, 30);                                           # 留存天数
 $array = array();
 $array2 = array();
@@ -36,68 +35,9 @@ array_map(function ($n)use($date, $tabName, $new, &$array, &$array2) {
 // 
 
 $result = new stdClass();
-$dic = new stdClass();
-$dic->data1 = $array;
-$dic->data2 = $array2;
-
-$result->data = $dic;
+$result->data1 =$array;
+$result->data2 = $array2;
 echo json_encode($result);
-*/
-
-//------new----/*
-$zoneid = 1;//先默认是1,其他区还没有
-//$r = (strtotime($date)+28800);
-$day = intval((strtotime($date)+28800) / 86400);
-$memKey = "gamerun-loginUser-byUid-zone".$zoneid."-day_".$day;
-
-if(!gMem()->exists($memKey)){
-    $result = new stdClass();
-    $dic = new stdClass();
-    $dic->data1 = array(0,0,0,0,0,0,0,0);
-    $dic->data2 = array(0,0,0,0,0,0,0);
-    $result->data = $dic;
-    
-    echo json_encode($result);
-}
-
-$retArr = array();
-$perArr = array();
 
-$curLoginUidDic = gMem()->hgetall($memKey);
-$total = count((array)$curLoginUidDic);
-$retArr[] = $total;
 
-$numbersArr = array(1, 2, 3, 4, 5, 6,7);
-foreach ($numbersArr as $type) {
-    $typeDay = $day + $type; 
-    $memKey = "gamerun-loginUser-byUid-zone".$zoneid."-day_".$typeDay;
-    
-    if(!gMem()->exists($memKey)){
-        $retArr[] = 0;            
-    } else {
-        $typeDic = gMem()->hgetall($memKey);
-        $n = 0;
-        foreach ($curLoginUidDic as $uid=>$val) {
-            if(property_exists($typeDic, $uid)){
-                $n += 1;
-            }        
-        }
-        $retArr[] = $n;
-    }   
-}
 
-$index = 0;
-foreach ($retArr as $num) {
-    if($index == 0){
-        $index += 1;
-        continue;
-    }
-
-    $per = intval($num/$total*100);
-    $perArr[] = $per;
-}
-
-$result = new stdClass();
-$result->data1 =$retArr;
-$result->data2 = $perArr;
-echo json_encode($result);

+ 1 - 1
Gameserver/Public/gamesys/app/providers/retention2.php

@@ -25,7 +25,7 @@ for ($i = 0; $i <= 999; $i++) {
         break;
     }
     $labels[] = $day;
-
+   
     $new = daoInst()->select('*')->from($tabName)
             ->where('ts')->ge($day . " 00:00:00")
             ->andWhere('ts')->le($day . " 23:59:59")

+ 25 - 1
Gameserver/Public/gamesys/home/js/index.js

@@ -468,7 +468,31 @@
                         "F_ModifyDate": "2021-09-13 11:21:20",
                         "F_ModifyUserId": "System",
                         "F_ModifyUserName": "超级管理员"
-                    }, 
+                    },
+                    {
+                        "F_ModuleId": "7ae94059-9aa5-48eb-8330-4e2a6565b193",
+                        "F_ParentId": "1",
+                        "F_EnCode": "AreaManage",
+                        "F_FullName": "新增用户留存",
+                        "F_Icon": "fa fa-leaf",
+                        "F_UrlAddress": "pages/newUserRetention/newUserRetention.html",
+                        "F_Target": "iframe",
+                        "F_IsMenu": 1,
+                        "F_AllowExpand": 1,
+                        "F_IsPublic": 0,
+                        "F_AllowEdit": null,
+                        "F_AllowDelete": null,
+                        "F_SortCode": 1,
+                        "F_DeleteMark": 0,
+                        "F_EnabledMark": 1,
+                        "F_Description": "新增用户留存",
+                        "F_CreateDate": "2021-11-25 11:21:20",
+                        "F_CreateUserId": "System",
+                        "F_CreateUserName": "超级管理员",
+                        "F_ModifyDate": "2021-09-13 11:21:20",
+                        "F_ModifyUserId": "System",
+                        "F_ModifyUserName": "超级管理员"
+                    },
                     {
                         "F_ModuleId": "99",
                         "F_ParentId": "0",

+ 107 - 0
Gameserver/Public/gamesys/home/pages/newUserRetention/newUserRetention.html

@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>新用户留存率统计</title>
+    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
+    <link rel="stylesheet" href="../../js/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" href="../../js/bootstrap/css/bootstrap-datetimepicker.min.css">
+    <link rel="stylesheet" href="../../css/font-awesome.min.css">
+    <link rel="stylesheet" href="../../css/index.css">
+  </head>
+  <body>
+    <div class="container-fluid">
+      <div class="row">
+        <div class="col-md-12">
+          <div class="panel panel-default">
+            <div class="panel-heading">
+              <h3 class="panel-title">单日</h3>
+            </div>
+            <div class="panel-body">
+              <div class="col-md-12">
+                <form class="form-inline">
+                  <div class="form-group">
+                    <label for="date-text" class="control-label">基准日期</label>
+                    <div class="input-group date form_date" data-date="" data-date-format="yyyy-mm-dd" data-link-field="dtp_input2" data-link-format="yyyy-mm-dd">
+                      <input id="date-text" class="form-control" size="40" type="text" value="" readonly>
+                      <span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
+                      <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
+                    </div>
+                  </div>
+                  <button type="button" class="btn btn-default" onclick="searchDay()">查询</button>
+                </form>
+              </div>
+              <div class="col-md-6" id="dayCanvasParent">
+                <canvas id="dayCanvas" height="200"></canvas>
+              </div>
+              <div class="col-md-6" id="day2CanvasParent">
+                <canvas id="day2Canvas" height="200"></canvas>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col-md-12">
+          <div class="panel panel-default">
+            <div class="panel-heading">
+              <h3 class="panel-title">走势</h3>
+            </div>
+            <div class="panel-body">
+              <div class="container-fluid">
+                <div class="row">
+                  <div class="col-md-12">
+                    <form class="form-inline">
+                      <div class="form-group">
+                        <label for="date-text1" class="control-label">开始时间</label>
+                        <div class="input-group date form_date" data-date="" data-date-format="yyyy-mm-dd" data-link-field="dtp_input2" data-link-format="yyyy-mm-dd">
+                          <input id="date-text1" class="form-control" size="40" type="text" value="" readonly>
+                          <span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
+                          <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
+                        </div>
+                      </div>
+                      <div class="form-group">
+                        <label for="date-text2" class="control-label">结束时间</label>
+                        <div class="input-group date form_date" data-date="" data-date-format="yyyy-mm-dd" data-link-field="dtp_input2" data-link-format="yyyy-mm-dd">
+                          <input id="date-text2" class="form-control" size="40" type="text" value="" readonly>
+                          <span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
+                          <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
+                        </div>
+                      </div>
+                    </form>
+                  </div>
+                </div>
+                <div class="row">
+                  <div class="col-md-12">
+                    <div class="input-group btn-group" role="group">
+                      <button type="button" class="btn btn-default" onclick="searchDays(0)">新增人数</button>
+                      <button type="button" class="btn btn-default" onclick="searchDays(1)">次日留存率</button>
+                      <button type="button" class="btn btn-default" onclick="searchDays(3)">2日留存率</button>
+                      <button type="button" class="btn btn-default" onclick="searchDays(3)">3日留存率</button>
+                      <button type="button" class="btn btn-default" onclick="searchDays(4)">4日留存率</button>
+                      <button type="button" class="btn btn-default" onclick="searchDays(5)">5五日留存率</button>
+                      <button type="button" class="btn btn-default" onclick="searchDays(6)">6日留存率</button>
+                      <button type="button" class="btn btn-default" onclick="searchDays(7)">7日留存率</button>
+                    </div>
+                  </div>
+                </div>
+                <div class="row">
+                  <div class="col-md-12" id="daysCanvasParent">
+                    <canvas id="daysCanvas" height="200"></canvas>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <script src="../../js/jquery/jQuery-2.2.0.min.js"></script>
+    <script src="../../js/charts/Chart.js"></script>
+    <script src="../../js/bootstrap/js/bootstrap-datetimepicker.min.js"></script>
+    <script src="../../js/bootstrap/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>
+    <script src="../api.js"></script>
+    <script src="newUserRetention.js"></script>
+  </body>
+</html>

+ 111 - 0
Gameserver/Public/gamesys/home/pages/newUserRetention/newUserRetention.js

@@ -0,0 +1,111 @@
+$('.form_date').datetimepicker({
+    language: 'zh-CN',
+    weekStart: 1,
+    todayBtn: 1,
+    autoclose: 1,
+    todayHighlight: 1,
+    startView: 2,
+    minView: 2,
+    forceParse: 0
+});
+
+var chart = null;
+var chart2 = null;
+var chart3 = null;
+
+
+function Canvas(datas, datas2) {
+    var lineChartData = {
+        //原来是1 3 5 7 15 30
+        labels: ["新增人数", "次日留存人数", "2日留存人数", "3日留存人数", "4日留存人数", "5日留存人数", "6日留存人数","7日留存人数"],
+        datasets: [
+            {
+                fillColor: "rgba(220,220,220,0.5)",
+                strokeColor: "rgba(220,220,220,1)",
+                data: datas
+            },
+        ]
+    }
+    $('#dayCanvas').attr("width", $('#dayCanvasParent').width());
+    var ctx = document.getElementById("dayCanvas").getContext("2d");
+    if (chart != null) {
+        chart.destroy();
+    }
+    chart = new Chart(ctx).Bar(lineChartData);
+
+
+
+    var lineChartData2 = {
+        labels: ["次日留存率", "2日留存率", "3日留存率", "4日留存率", "5日留存率", "6日留存率","7日留存率"],
+        datasets: [
+            {
+			fillColor : "rgba(151,187,205,0.5)",
+			strokeColor : "rgba(151,187,205,1)",
+                data: datas2
+            },
+        ]
+    }
+    $('#day2Canvas').attr("width", $('#day2CanvasParent').width());
+    var ctx2 = document.getElementById("day2Canvas").getContext("2d");
+    if (chart2 != null) {
+        chart2.destroy();
+    }
+    chart2 = new Chart(ctx2).Bar(lineChartData2,{
+        scaleLabel: "<%=value%>%"
+    });
+}
+
+function searchDay() {
+    var date = $("#date-text").val();
+    $.post(
+            getProviderUrl("newUserRetention"),
+            {date: date,rType: 1},
+            function (data) {
+                Canvas(data.data1, data.data2);
+            }
+    , 'json');
+}
+
+function searchDays(type) {
+    var date1 = $("#date-text1").val();
+    var date2 = $("#date-text2").val();
+    post(                    
+            getProviderUrl("newUserRetention"),
+            {date1: date1,date2: date2,type:type,rType: 2},
+            function (data) {
+                Canvas2(data.data, data.labels,type);
+            }
+    , 'json');
+}
+
+function Canvas2(datas, labels,type) {
+    var lineChartData = {
+        labels: labels,
+        datasets: [
+            {
+                fillColor: "rgba(220,220,220,0.2)",
+                strokeColor: "rgba(220,220,220,1)",
+                pointColor: "rgba(220,220,220,1)",
+                pointStrokeColor: "#fff",
+                pointHighlightFill: "#fff",
+                pointHighlightStroke: "rgba(220,220,220,1)",
+                data: datas
+            },
+        ]
+    }
+    $('#daysCanvas').attr("width", $('#daysCanvasParent').width());
+    var ctx = document.getElementById("daysCanvas").getContext("2d");
+    if (chart3 != null) {
+        chart3.destroy();
+    }
+    if(type == 0){
+        chart3 = new Chart(ctx).Line(lineChartData);
+    }
+    else
+    {
+        chart3 = new Chart(ctx).Line(lineChartData,{
+        scaleLabel: "<%=value%>%"
+    });
+    }
+
+}

+ 2 - 2
Gameserver/Public/gamesys/home/pages/retention/retention.js

@@ -17,7 +17,7 @@ var chart3 = null;
 function Canvas(datas, datas2) {
     var lineChartData = {
         //原来是1 3 5 7 15 30
-        labels: ["当天新增人数", "次日留存人数", "2日留存人数", "3日留存人数", "4日留存人数", "5日留存人数", "6日留存人数","7日留存人数"],
+        labels: ["当天新增人数", "次日留存人数", "3日留存人数", "5日留存人数", "7日留存人数", "15日留存人数", "30日留存人数"],
         datasets: [
             {
                 fillColor: "rgba(220,220,220,0.5)",
@@ -36,7 +36,7 @@ function Canvas(datas, datas2) {
 
 
     var lineChartData2 = {
-        labels: ["次日留存率", "2日留存率", "3日留存率", "4日留存率", "5日留存率", "6日留存率","6日留存率"],
+        labels: ["次日留存率", "3日留存率", "5日留存率", "7日留存率", "15日留存率", "30日留存率"],
         datasets: [
             {
 			fillColor : "rgba(151,187,205,0.5)",