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>显示效果如下:
网友回复
腾讯混元模型广场里都是混元模型的垂直小模型,如何api调用?
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?