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>显示效果如下:
网友回复


