广州传奇网络

地址:广州市天河区东圃大马路富华楼C座

电话:13808825895

邮箱:gz020wbs@163.com

QQ:1564443073

网址:http://www.020wbs.com/

首页 > 二次开发Ecshop二次开发 > ecshop访问记录插件

二次开发Ecshop二次开发

二次开发Ecshop二次开发

ecshop访问记录插件

ECSHOP后台没有查看访问明细功能,为解决这一问题开发了此插件。此插件完全独立,不影响商城原有功能。

第一步:修改数据库,数据表ecs_stats增加一个编号字段。

ALTER TABLE ecs_stats ADD id INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

第二步:修改相关语言文件。

/languages/zh_cn/admin/common.php增加语言项。

$_LANG['visit_logs'] = '访问明细';

$_LANG['export_visit_logs'] = '下载访问记录';

/languages/zh_cn/admin/log_action.php增加语言项。

$_LANG['log_action']['export'] = '下载';
$_LANG['log_action']['visit_logs'] = '访问记录';

新建语言文件/languages/zh_cn/admin/visit_logs.php。

<?php

/**
* ECSHOP 管理中心访问明细语言文件
* ----------------------------------------------------------------------------
* LEGEND 致力于php技术
* http://www.020wbs.com
* ----------------------------------------------------------------------------
* @author: legend
*/

/* 字段信息 */
$_LANG['id'] = '编号';
$_LANG['acess_time'] = '访问时间';
$_LANG['ip_address'] = "IP地址";
$_LANG['visit_times'] = "访问次数";
$_LANG['browser'] = "浏览器";
$_LANG['system'] = "操作系统";
$_LANG['language'] = "语言";
$_LANG['area'] = "地区";
$_LANG['access_url'] = "受访页面";
$_LANG['keywords'] = '关键字';
$_LANG['drop_logs'] = '删除记录';
$_LANG['area'] = "来源地区";
$_LANG['select_area'] = "选择来源地区...";
$_LANG['drop_logs'] = "清除记录 ";
$_LANG['select_date'] = '选择清除的日期...';
$_LANG['search'] = '搜索';
$_LANG['comfrom'] = '确定';
$_LANG['week_date'] = '一周之前';
$_LANG['month_date'] = '一个月之前';
$_LANG['three_month'] = '三个月之前';
$_LANG['six_month'] = '半年之前';
$_LANG['a_yaer'] = '一年之前';
$_LANG['back_list'] = '返回访问明细列表';
$_LANG['js_languages']['select_date_value'] = "如果您要清除记录,请选择清除的日期";

/* 提示信息 */
$_LANG['drop_sueeccud'] = '操作成功!';
$_LANG['batch_drop_success'] = '成功删除了 %d 个访问记录';
?>

第三步:增加菜单项,/admin/includes/inc_menu.php增加:

$modules['06_stats']['visit_logs'] = 'visit_logs.php?act=list';

第四步:新建主程序/admin/visit_logs.php。

<?php
define('IN_ECS', true);
require(dirname(__FILE__) . '/includes/init.php');

/* act操作项的初始化 */
if (empty($_REQUEST['act']))
{
$_REQUEST['act'] = 'list';
}
else
{
$_REQUEST['act'] = trim($_REQUEST['act']);
}

/*------------------------------------------------------ */
//-- 获取所有访问明细
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'list')
{
$id = !empty($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;
$ip_address = !empty($_REQUEST['ip_address']) ? $_REQUEST['ip_address'] : '';
$area = !empty($_REQUEST['area']) ? $_REQUEST['area'] : '';
$access_time = !empty($_REQUEST['access_time']) ? $_REQUEST['access_time'] : '';

/* 查询来源地区列表 */
$area_list = array();
$res = $db->query("SELECT DISTINCT area FROM " .$ecs->table('stats'));
while ($row = $db->FetchRow($res))
{
$area_list[$row['area']] = $row['area'];
}

$smarty->assign('ur_here', $_LANG['visit_logs']);
$smarty->assign('area_list', $area_list);
$smarty->assign('full_page', 1);

$visit_list = get_visit_logs();

$smarty->assign('visit_list', $visit_list['list']);
$smarty->assign('filter', $visit_list['filter']);
$smarty->assign('record_count', $visit_list['record_count']);
$smarty->assign('page_count', $visit_list['page_count']);

$sort_flag = sort_flag($visit_list['filter']);
$smarty->assign($sort_flag['tag'], $sort_flag['img']);
$smarty->assign('action_link', array('text' => $_LANG['export_visit_logs'],'href'=>'visit_logs.php?act=export'));

assign_query_info();
$smarty->display('visit_logs.htm');
}

/*------------------------------------------------------ */
//-- 排序、分页、查询
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'query')
{
$visit_list = get_visit_logs();

$smarty->assign('visit_list', $visit_list['list']);
$smarty->assign('filter', $visit_list['filter']);
$smarty->assign('record_count', $visit_list['record_count']);
$smarty->assign('page_count', $visit_list['page_count']);

$sort_flag = sort_flag($visit_list['filter']);
$smarty->assign($sort_flag['tag'], $sort_flag['img']);

make_json_result($smarty->fetch('visit_logs.htm'), '',
array('filter' => $visit_list['filter'], 'page_count' => $visit_list['page_count']));
}

/*------------------------------------------------------ */
//-- 批量删除访问记录
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'batch_drop')
{
$drop_type_date = isset($_POST['drop_type_date']) ? $_POST['drop_type_date'] : '';

/* 按日期删除 */
if ($drop_type_date)
{
if ($_POST['access_time'] == '0')
{
ecs_header("Location: visit_logs.php?act=list\n");
exit;
}
elseif ($_POST['$access_time'] > '0')
{
$where = " WHERE 1 ";
switch ($_POST['$access_time'])
{
case '1':
$a_week = gmtime()-(3600 * 24 * 7);
$where .= " AND $access_time <= '".$a_week."'";
break;
case '2':
$a_month = gmtime()-(3600 * 24 * 30);
$where .= " AND $access_time <= '".$a_month."'";
break;
case '3':
$three_month = gmtime()-(3600 * 24 * 90);
$where .= " AND $access_time <= '".$three_month."'";
break;
case '4':
$half_year = gmtime()-(3600 * 24 * 180);
$where .= " AND $access_time <= '".$half_year."'";
break;
case '5':
$a_year = gmtime()-(3600 * 24 * 365);
$where .= " AND $access_time <= '".$a_year."'";
break;
}
$sql = "DELETE FROM " .$ecs->table('stats').$where;
$res = $db->query($sql);
if ($res)
{
admin_log('', 'remove', 'visit_logs'); //记录操作日志
$link[] = array('text' => $_LANG['back_list'], 'href' => 'visit_logs.php?act=list');
sys_msg($_LANG['drop_sueeccud'], 1, $link);
}
}
}
/* 如果不是按日期来删除, 就按ID删除 */
else
{
$count = 0;
foreach ($_POST['checkboxes'] AS $key => $id)
{
$sql = "DELETE FROM " .$ecs->table('stats'). " WHERE id = '$id'";
$result = $db->query($sql);

$count++;
}
if ($result)
{
admin_log('', 'remove', 'visit_logs'); //记录操作日志
$link[] = array('text' => $_LANG['back_list'], 'href' => 'visit_logs.php?act=list');
sys_msg(sprintf($_LANG['batch_drop_success'], $count), 0, $link);
}
}
}

/* EXCEL文件下载 */
if ($_REQUEST['act'] == 'export')
{
$sql = 'SELECT * FROM ' .$GLOBALS['ecs']->table('stats');
$res = $GLOBALS['db']->query($sql);

$file_name = $_SERVER['SERVER_NAME'] . '_VisitLogs';
header("Content-type: application/vnd.ms-excel; charset=utf-8");
header("Content-Disposition: attachment; filename=$file_name.xls");

/* 编号,操作者,操作时间,IP,操作记录 */
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['id']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['ip_address']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['visit_times']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['browser']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['system']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['language']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['area']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $_LANG['access_url']) . "\t\n";

while ($row = $GLOBALS['db']->fetchRow($res))
{
$row['access_time'] = local_date($GLOBALS['_CFG']['time_format'], $row['access_time']);
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['id']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['ip_address']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['visit_times']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['browser']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['system']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['language']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['area']) . "\t";
echo ecs_iconv(EC_CHARSET, 'GB2312', $row['access_url']) . "\t";
echo "\n";
}
admin_log('', 'export', 'visit_logs'); //记录操作日志
exit;
}

/* 获取访问明细 */
function get_visit_logs()
{
$id = !empty($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;
$area = !empty($_REQUEST['area']) ? $_REQUEST['area'] : '';
$keywords = !empty($_REQUEST['keywords']) ? trim($_REQUEST['keywords']) : '';
$start_time = empty($_REQUEST['start_time']) ? '' : (strpos($_REQUEST['start_time'], '-') > 0 ? local_strtotime($_REQUEST['start_time']) : $_REQUEST['start_time']);
$end_time = empty($_REQUEST['end_time']) ? '' : (strpos($_REQUEST['end_time'], '-') > 0 ? local_strtotime($_REQUEST['end_time']) : $_REQUEST['end_time']);


$filter = array();
$filter['sort_by'] = empty($_REQUEST['sort_by']) ? 'id' : trim($_REQUEST['sort_by']);
$filter['sort_order'] = empty($_REQUEST['sort_order']) ? 'DESC' : trim($_REQUEST['sort_order']);

//查询条件
$where = " WHERE 1 ";
if (!empty($id))
{
$where .= " AND id = '$id' ";
}
elseif (!empty($area))
{
$where .= " AND area = '$area' ";
}
if (!empty($keywords))
{
$where .= " AND referer_path like '%$keywords%' ";
}
if (!empty($start_time))
{
$where .= " AND access_time >= '$start_time'";
}
if (!empty($end_time))
{
$where .= " AND access_time <= '$end_time'";
}

/* 获得总记录数据 */
$sql = 'SELECT COUNT(*) FROM ' .$GLOBALS['ecs']->table('stats'). $where;
$filter['record_count'] = $GLOBALS['db']->getOne($sql);

$filter = page_and_size($filter);


/* 获取访问明细 */
$list = array();
$sql = 'SELECT * FROM ' .$GLOBALS['ecs']->table('stats').
$where .' ORDER by '.$filter['sort_by'].' '.$filter['sort_order'];
$res = $GLOBALS['db']->selectLimit($sql, $filter['page_size'], $filter['start']);

while ($rows = $GLOBALS['db']->fetchRow($res))
{
$rows['access_time'] = local_date($GLOBALS['_CFG']['time_format'], $rows['access_time']);

$list[] = $rows;
}

return array('list' => $list, 'filter' => $filter, 'page_count' => $filter['page_count'], 'record_count' => $filter['record_count']);
}

?>

第五步:新建模板文件/admin/templates/visit_logs.htm。

{if $full_page}
{include file="pageheader.htm"}
<script type="text/javascript" src="../js/calendar.php"></script>
<link href="../js/calendar/calendar.css" rel="stylesheet" type="text/css" />
{insert_scripts files="../js/utils.js,listtable.js"}

<div class="form-div">
<table>
<tr>
<td width="100%">
<form name="theForm" method="POST" action="visit_logs.php">
{$lang.area}
<select name="ip">
<option value='0'>{$lang.select_area}</option>
{html_options options=$area_list selected=$area}
</select>
{$lang.keywords}
<input type="text" name="keywords" size="40" />
{$lang.acess_time}
<input type="text" name="start_time" maxlength="60" size="20" readonly="readonly" id="start_time_id" />
<input name="start_time_btn" type="button" id="start_time_btn" onclick="return showCalendar('start_time_id', '%Y-%m-%d %H:%M', '24', false, 'start_time_btn');" value="{$lang.btn_select}" class="button"/>
~
<input type="text" name="end_time" maxlength="60" size="20" readonly="readonly" id="end_time_id" />
<input name="end_time_btn" type="button" id="end_time_btn" onclick="return showCalendar('end_time_id', '%Y-%m-%d %H:%M', '24', false, 'end_time_btn');" value="{$lang.btn_select}" class="button"/>
<input type="submit" value="{$lang.search}" class="button" />
</form>
</td>
</tr>
</table>
</div>

<form method="POST" action="visit_logs.php?act=batch_drop" name="listForm">
<!-- start visit_logs list -->
<div class="list-div" id="listDiv">
{/if}

<table cellpadding="3" cellspacing="1">
<tr>
<th><input onclick='listTable.selectAll(this, "checkboxes")' type="checkbox">
<a href="javascript:listTable.sort('id'); ">{$lang.id}</a>{$sort_id}</th>
<th><a href="javascript:listTable.sort('access_time'); ">{$lang.visit_times}</a>{$sort_access_time}</th>
<th><a href="javascript:listTable.sort('ip_address'); ">{$lang.ip_address}</a>{$sort_ip_address}</th>
<th><a href="javascript:listTable.sort('visit_times'); ">{$lang.visit_times}</a>{$sort_visit_times}</th>
<th><a href="javascript:listTable.sort('browser'); ">{$lang.browser}</a>{$sort_browser}</th>
<th><a href="javascript:listTable.sort('system'); ">{$lang.system}</a>{$sort_system}</th>
<th><a href="javascript:listTable.sort('language'); ">{$lang.language}</a>{$sort_language}</th>
<th><a href="javascript:listTable.sort('area'); ">{$lang.area}</a>{$sort_area}</th>
<th><a href="javascript:listTable.sort('access_url'); ">{$lang.access_url}</a>{$sort_access_url}</th>
</tr>
{foreach from=$visit_list item=list}
<tr>
<td width="10%"><span><input name="checkboxes[]" type="checkbox" value="{$list.id}" />{$list.id}</span></td>
<td width="15%" align="center"><span>{$list.access_time}</span></td>
<td width="5%" align="center"><span>{$list.ip_address}</span></td>
<td width="5%" align="center"><span>{$list.visit_times}</span></td>
<td width="10%" align="center"><span>{$list.browser}</span></td>
<td width="10%" align="center"><span>{$list.system}</span></td>
<td width="10%" align="center"><span>{$list.language}</span></td>
<td width="10%" align="center"><span>{$list.area}</span></td>
<td width="25%" align="center"><span>{$list.access_url}</span></td>
</tr>
{/foreach}
<tr>
<td colspan="2"><input name="drop_type_id" type="submit" id="btnSubmit" value="{$lang.drop_logs}" disabled="true" class="button" /></td>
<td align="right" nowrap="true" colspan="10">{include file="page.htm"}</td>
</tr>
</table>

{if $full_page}
</div>
<!-- end ad_position list -->

<script type="text/javascript" language="JavaScript">
listTable.recordCount = {$record_count};
listTable.pageCount = {$page_count};

{foreach from=$filter item=item key=key}
listTable.filter.{$key} = '{$item}';
{/foreach}
{literal}
onload = function()
{
// >#65533;>#65533;>#700;>#65533;>#65533;鹜>#65533;>#65533;
startCheckOrder();
}
{/literal}
</script>
{include file="pagefooter.htm"}
{/if}

本插件有日志记录功能,暂未使用权限管理