+
95
-

回答

bfwsoa框架内置简单的系统访问统计模块,只需要在dom的config目录下的config.php中开启即可

<?php
//应用配置文件
$_config_arr['App'] = [
     "stat_open" => true,
    "stat_driver" => "file", //redis或file
    "stat_redis_ip" => "127.0.0.1",
    "stat_redis_port" => 6379,
    "stat_token" => "888888",

stat_driver可以选择redis或file,选择redis的话要指定redis的ip和端口,另外stat_token也要设置,这个是获取统计数据的关键,还能屏蔽指定的ip

下面是页面的php代码,用于显示站点下的访问统计信息

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title网站访问统计</title>
        <meta name="robots" content="all">
        <link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/bfw.css">

        <!-- 引入Vue.js CDN -->
        <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue@2.6.1-dev.js"></script>
        <!-- 引入Axios CDN -->
        <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/axios.1.4.0.js"></script>


        <style>

        </style>
    </head>
    <body>

        <div style="">

            <div class="bfw-middle bfw-color-b-w"
                >
                <div class="bfw-row-owner bfw-height-auto">
                    <div class="bfw-row-20 bfw-m-hide " style="background: #f3f3f3">

                    </div>
                    <div id="app">
                        <h1 class="bfw-mar-l bfw-bline-1 bfw-pad-l">网站统计<span id="sitenamespan">{{response.host}}</span></h1>
                        <div>
                            <div class="bfw-row-owner bfw-mar-s" style="line-height: 90px; font-size: 30px;">
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #4CAF50;">
                                        本月PV/ <span id="monthpvspan">{{response.monthly_pv}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #2196F3;">
                                        本月IP/ <span id="monthipspan">{{response.monthly_unique_ips}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #FF9800;">
                                        今日PV/ <span id="todaypvspan">{{response.daily_pv}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #F44336;">
                                        今日IP/ <span id="todayipspan">{{response.daily_unique_ips}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #9C27B0;">
                                        5分钟内/ <span id="fivempvspan">{{response.five_minute_visits}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #3F51B5;">
                                        正常请求PV/ <span id="broswerpvspan">{{response.browser_requests}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #FFC107;">
                                        其他请求PV/ <span id="otherpvspan">{{response.other_requests}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #795548;">
                                        ajax请求PV/ <span id="ajaxpvspan">{{response.ajax_requests}}</span>
                                    </div>
                                </div>
                                <div class="bfw-row-3 bfw-color-w bfw-align-c">
                                    <div class="bfw-mar-s" style="background: #607D8B;">
                                        bot请求PV/ <span id="botpvspan">{{response.bot_requests}}</span>
                                    </div>
                                </div>
                            </div>

                            <div class="bfw-mar-l">
                                <h2>IP黑名单</h2>
                                <a v-for="(ip) in response.ban_ips" :key="ip">{{ip}}<span style="margin-left:10px;cursor:pointer;"  @click="unforbidip(ip)">恢复ip</span></a>
                            </div>
                            <div class="bfw-align-c bfw-mar-l">
                                <div class="bfw-mar-s" style="">
                                    <h2>5分钟内高频IP</h2>
                                </div>

                                <table border="1" class="bfw-table">
                                    <thead>
                                        <tr>
                                            <th>IP Address</th>
                                            <th>Count</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <tr v-for="(count, ip) in response.five_minute_ipvisits" :key="ip">
                                            <td>{{ ip }}<span style="margin-left:10px;cursor:pointer;"  @click="forbidip(ip)">禁止访问</span></td>
                                            <td>{{ count }}</td>
                                        </tr>
                                    </tbody>
                                </table>

                            </div>

                        </div>
                    </div>

                    <div class="bfw-row-clear "></div>
                </div>
            </div>

        </div>
        <script type="text/javascript">

            new Vue({
                el: '#app',
                data: {

                    response: null
                },
                methods: {
                    forbidip(ip) {
                        if (confirm("确定禁止ip"+ip+"用户访问?")) {
                            axios.post('/', {
                                bfwstattoken: "<?=STAT_TOKEN ?>", banip: ip
                            }, {
                                headers: {
                                    'Content-Type': 'application/x-www-form-urlencoded',

                                }})
                            .then(response => {

                                alert("禁止成功");
                            })
                            .catch(error => {
                                console.error('There was an error!', error);
                            });
                        }

                    },

                    unforbidip(ip) {
                        if (confirm("确定恢复ip"+ip+"用户访问?")) {
                            axios.post('/', {
                                bfwstattoken: "<?=STAT_TOKEN ?>", unbanip: ip
                            }, {
                                headers: {
                                    'Content-Type': 'application/x-www-form-urlencoded',

                                }})
                            .then(response => {

                                alert("恢复成功");
                            })
                            .catch(error => {
                                console.error('There was an error!', error);
                            });
                        }

                    },
           
                    initreq() {
                        axios.post('/', {
                            bfwstattoken: "<?=STAT_TOKEN ?>"
                        }, {
                            headers: {
                                'Content-Type': 'application/x-www-form-urlencoded',

                            }})
                        .then(response => {
                            this.response = response.data;
                            console.log(this.response)
                        })
                        .catch(error => {
                            console.error('There was an error!', error);
                        });
                        console.log('Periodic task executed.');
                        // 这里可以加入你需要定期执行的代码
                    }
                },
                mounted() {
                    // 调用初始方法
                    this.initreq();
                    // 设置定时器,initreq
                    setInterval(this.initreq, 5000);
                }
            });
        </script>
    </body>
</html>

显示效果如下:

800_auto

网友回复

我知道答案,我要回答