2015-12-05 11:09:31 +08:00
|
|
|
|
<?php
|
|
|
|
|
/**
|
2016-10-08 10:20:09 +08:00
|
|
|
|
* 获取访客信息
|
2015-12-05 11:09:31 +08:00
|
|
|
|
*
|
|
|
|
|
* @package Access
|
|
|
|
|
* @author Kokororin
|
2016-12-11 18:52:46 +08:00
|
|
|
|
* @version 1.6
|
2015-12-05 11:09:31 +08:00
|
|
|
|
* @link https://kotori.love
|
|
|
|
|
*/
|
|
|
|
|
class Access_Plugin implements Typecho_Plugin_Interface
|
|
|
|
|
{
|
|
|
|
|
public static $panel = 'Access/page/console.php';
|
|
|
|
|
public static function activate()
|
|
|
|
|
{
|
|
|
|
|
$msg = Access_Plugin::install();
|
|
|
|
|
Helper::addPanel(1, self::$panel, 'Access控制台', 'Access插件控制台', 'subscriber');
|
2016-12-11 18:52:46 +08:00
|
|
|
|
Helper::addRoute("access_write_logs", "/access/log/write.json", "Access_Action", 'writeLogs');
|
2016-08-01 15:00:23 +08:00
|
|
|
|
Helper::addRoute("access_ip", "/access/ip.json", "Access_Action", 'ip');
|
2016-12-11 18:52:46 +08:00
|
|
|
|
Helper::addRoute("access_delete_logs", "/access/log/delete.json", "Access_Action", 'deleteLogs');
|
|
|
|
|
Typecho_Plugin::factory('Widget_Archive')->beforeRender = array('Access_Plugin', 'backend');
|
|
|
|
|
Typecho_Plugin::factory('Widget_Archive')->footer = array('Access_Plugin', 'frontend');
|
2016-10-08 10:20:09 +08:00
|
|
|
|
Typecho_Plugin::factory('admin/footer.php')->end = array('Access_Plugin', 'adminFooter');
|
2015-12-05 11:09:31 +08:00
|
|
|
|
return _t($msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function deactivate()
|
|
|
|
|
{
|
|
|
|
|
$config = Typecho_Widget::widget('Widget_Options')->plugin('Access');
|
|
|
|
|
$isDrop = $config->isDrop;
|
2016-08-01 15:00:23 +08:00
|
|
|
|
if ($isDrop == 0) {
|
2016-03-28 14:45:00 +08:00
|
|
|
|
$db = Typecho_Db::get();
|
2015-12-05 11:09:31 +08:00
|
|
|
|
$prefix = $db->getPrefix();
|
|
|
|
|
$db->query("DROP TABLE `" . $prefix . "access`", Typecho_Db::WRITE);
|
|
|
|
|
}
|
|
|
|
|
Helper::removePanel(1, self::$panel);
|
2016-12-11 18:52:46 +08:00
|
|
|
|
Helper::removeRoute("access_write_logs");
|
2016-08-01 15:00:23 +08:00
|
|
|
|
Helper::removeRoute("access_ip");
|
2016-11-08 13:27:19 +08:00
|
|
|
|
Helper::removeRoute("access_delete_logs");
|
2015-12-05 11:09:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function config(Typecho_Widget_Helper_Form $form)
|
|
|
|
|
{
|
|
|
|
|
$pageSize = new Typecho_Widget_Helper_Form_Element_Text(
|
2016-11-08 13:27:19 +08:00
|
|
|
|
'pageSize', null, '10',
|
2015-12-05 11:09:31 +08:00
|
|
|
|
'分页数量', '每页显示的日志数量');
|
|
|
|
|
$isDrop = new Typecho_Widget_Helper_Form_Element_Radio(
|
|
|
|
|
'isDrop', array(
|
|
|
|
|
'0' => '删除',
|
|
|
|
|
'1' => '不删除',
|
2016-11-08 13:27:19 +08:00
|
|
|
|
), '1', '删除数据表:', '请选择是否在禁用插件时,删除日志数据表');
|
2016-12-11 18:52:46 +08:00
|
|
|
|
$writeType = new Typecho_Widget_Helper_Form_Element_Radio(
|
|
|
|
|
'writeType', array(
|
|
|
|
|
'0' => '后端',
|
|
|
|
|
'1' => '前端',
|
|
|
|
|
), '0', '日志写入类型:', '请选择日志写入类型,数据量大时(几万以上),后端写入可能会拖慢博客访问速度');
|
2016-11-08 13:27:19 +08:00
|
|
|
|
$canAnalytize = new Typecho_Widget_Helper_Form_Element_Radio(
|
|
|
|
|
'canAnalytize', array(
|
|
|
|
|
'0' => '不允许',
|
|
|
|
|
'1' => '允许',
|
|
|
|
|
), '1', '允许统计使用情况:', '请选择是否允许插件作者统计使用情况');
|
2015-12-05 11:09:31 +08:00
|
|
|
|
$form->addInput($pageSize);
|
|
|
|
|
$form->addInput($isDrop);
|
2016-12-11 18:52:46 +08:00
|
|
|
|
$form->addInput($writeType);
|
2016-11-08 13:27:19 +08:00
|
|
|
|
$form->addInput($canAnalytize);
|
2015-12-05 11:09:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function personalConfig(Typecho_Widget_Helper_Form $form)
|
2016-03-28 14:45:00 +08:00
|
|
|
|
{
|
|
|
|
|
}
|
2015-12-05 11:09:31 +08:00
|
|
|
|
|
|
|
|
|
public static function install()
|
|
|
|
|
{
|
2016-08-01 15:00:23 +08:00
|
|
|
|
$configLink = '<a href="' . Helper::options()->adminUrl . 'options-plugin.php?config=Access' . '">请设置</a>';
|
|
|
|
|
if (substr(trim(dirname(__FILE__), '/'), -6) != 'Access') {
|
2015-12-05 11:09:31 +08:00
|
|
|
|
throw new Typecho_Plugin_Exception('插件目录名必须为Access');
|
|
|
|
|
}
|
|
|
|
|
$installDb = Typecho_Db::get();
|
2016-03-28 14:45:00 +08:00
|
|
|
|
$type = explode('_', $installDb->getAdapterName());
|
|
|
|
|
$type = array_pop($type);
|
|
|
|
|
$prefix = $installDb->getPrefix();
|
|
|
|
|
$scripts = "CREATE TABLE `typecho_access` (
|
2015-12-05 11:09:31 +08:00
|
|
|
|
`id` int(10) unsigned NOT NULL auto_increment,
|
|
|
|
|
`ua` varchar(255) default NULL,
|
|
|
|
|
`url` varchar(64) default NULL,
|
|
|
|
|
`ip` varchar(16) default NULL,
|
2016-08-01 15:00:23 +08:00
|
|
|
|
`referer` varchar(255) default NULL,
|
|
|
|
|
`referer_domain` varchar(100) default NULL,
|
2015-12-05 11:09:31 +08:00
|
|
|
|
`date` int(10) unsigned default '0',
|
|
|
|
|
PRIMARY KEY (`id`)
|
|
|
|
|
) ENGINE=MYISAM DEFAULT CHARSET=%charset%;";
|
|
|
|
|
$scripts = str_replace('typecho_', $prefix, $scripts);
|
|
|
|
|
$scripts = str_replace('%charset%', 'utf8', $scripts);
|
|
|
|
|
$scripts = explode(';', $scripts);
|
|
|
|
|
try {
|
2016-08-01 15:00:23 +08:00
|
|
|
|
foreach ($scripts as $script) {
|
2015-12-05 11:09:31 +08:00
|
|
|
|
$script = trim($script);
|
2016-08-01 15:00:23 +08:00
|
|
|
|
if ($script) {
|
2015-12-05 11:09:31 +08:00
|
|
|
|
$installDb->query($script, Typecho_Db::WRITE);
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-08-01 15:00:23 +08:00
|
|
|
|
return '成功创建数据表,插件启用成功,' . $configLink;
|
|
|
|
|
} catch (Typecho_Db_Exception $e) {
|
2015-12-05 11:09:31 +08:00
|
|
|
|
$code = $e->getCode();
|
2016-12-11 18:52:46 +08:00
|
|
|
|
if ($type != 'Mysql') {
|
|
|
|
|
throw new Typecho_Plugin_Exception('你的适配器为' . $type . ',目前只支持Mysql');
|
|
|
|
|
}
|
|
|
|
|
if ($code == (1050 || '42S01')) {
|
2015-12-05 11:09:31 +08:00
|
|
|
|
$script = 'SELECT * from `' . $prefix . 'access`';
|
|
|
|
|
$installDb->query($script, Typecho_Db::READ);
|
2016-11-10 11:26:52 +08:00
|
|
|
|
if (!array_key_exists('referer', $installDb->fetchRow($installDb->select()->from('table.access')))) {
|
|
|
|
|
$installDb->query('ALTER TABLE `' . $prefix . 'access` ADD `referer` varchar(255) NULL AFTER `ip`, ADD `referer_domain` varchar(100) NULL AFTER `referer`;');
|
|
|
|
|
return '数据表结构已更新,插件启用成功,' . $configLink;
|
|
|
|
|
}
|
2016-08-01 15:00:23 +08:00
|
|
|
|
return '数据表已存在,插件启用成功,' . $configLink;
|
|
|
|
|
} else {
|
2015-12-05 11:09:31 +08:00
|
|
|
|
throw new Typecho_Plugin_Exception('数据表建立失败,插件启用失败。错误号:' . $code);
|
|
|
|
|
}
|
2016-12-11 18:52:46 +08:00
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
throw new Typecho_Plugin_Exception($e->getMessage());
|
2015-12-05 11:09:31 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-11 18:52:46 +08:00
|
|
|
|
public static function backend($archive)
|
2015-12-05 11:09:31 +08:00
|
|
|
|
{
|
2016-11-10 11:26:52 +08:00
|
|
|
|
require_once __DIR__ . '/Access_Bootstrap.php';
|
|
|
|
|
$access = new Access_Core();
|
2016-12-11 18:52:46 +08:00
|
|
|
|
$access->getReferer();
|
2015-12-05 11:09:31 +08:00
|
|
|
|
$config = Typecho_Widget::widget('Widget_Options')->plugin('Access');
|
|
|
|
|
|
2016-12-11 18:52:46 +08:00
|
|
|
|
if ($config->writeType == 0) {
|
|
|
|
|
$access->writeLogs();
|
2016-11-08 13:27:19 +08:00
|
|
|
|
}
|
2016-12-11 18:52:46 +08:00
|
|
|
|
}
|
2016-11-08 13:27:19 +08:00
|
|
|
|
|
2016-12-11 18:52:46 +08:00
|
|
|
|
public static function frontend()
|
|
|
|
|
{
|
|
|
|
|
$config = Typecho_Widget::widget('Widget_Options')->plugin('Access');
|
|
|
|
|
if ($config->writeType == 1) {
|
|
|
|
|
echo '<script type="text/javascript">(function(){var xhr=new XMLHttpRequest();xhr.open("GET","' . rtrim(Helper::options()->index, '/') . '/access/log/write.json?u="+location.pathname+location.search+location.hash' . ',true);xhr.send();})();</script>';
|
|
|
|
|
}
|
2015-12-05 11:09:31 +08:00
|
|
|
|
}
|
2016-10-08 10:20:09 +08:00
|
|
|
|
|
|
|
|
|
public static function adminFooter()
|
|
|
|
|
{
|
|
|
|
|
$url = $_SERVER['PHP_SELF'];
|
|
|
|
|
$filename = substr($url, strrpos($url, '/') + 1);
|
|
|
|
|
if ($filename == 'index.php') {
|
|
|
|
|
echo '<script>
|
|
|
|
|
$(document).ready(function() {
|
|
|
|
|
$("#start-link").append("<li><a href=\"';
|
|
|
|
|
Helper::options()->adminUrl('extending.php?panel=' . Access_Plugin::$panel);
|
|
|
|
|
echo '\">Access控制台</a></li>");
|
|
|
|
|
});
|
|
|
|
|
</script>';
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-12-05 11:09:31 +08:00
|
|
|
|
}
|