您的位置:晶晶的博客 > Ajing主题1.0版安装使用说明

Ajing主题1.0版安装使用说明

首先,感谢您使用由晶晶的博客制作的Ajing主题,本主题包建议使用emlog5.0.0版本。

Ajing主题参考了大前端的设计,在此晶晶的博客承诺本主题(V1.0版)不用于任何商业性售卖;任何获取到本主题包的朋友在保留本主题页面底部“Ajing”标志以及超级链接的情况下,任意使用。

以下是功能概要:

  • 首页将后台设置为“置顶”的文章单独调出,作为首页置顶模块。
  • 碎语将发布碎语的功能添加到了前台界面,发布碎语时可不用再切换至后台界面【*】。
  • 日志列表加入附图功能,首页、栏目页中的所有日志列表均包含有关于该日志的附图【*】。
  • 页面顶部将最新一条碎语单独调出予以显示,起到“公告栏”的作用。
  • 日志相关发布时间显示格式,统一为“xxx前”这种格式,如:1分钟前、半年前(06-06)等;日志自带社会化分享模块(仅能分享至5个sns网站),无需额外添加分享插件。
  • 日志标签云,不同颜色、区块予以显式标出;侧边栏标签云,显示的标签必须包含至少三篇文章,最多显示25个标签,减轻服务器压力。
  • 日志评论改为Ajax提交,无页面跳转,优化发布日志评论的体验;日志评论框自带表情工具栏,无需额外添加其他表情插件。
  • 窄宽屏自适应,最小宽度980px、最大宽度1200px;采用html5,兼容ie6+

Ajing主题安装与使用

安装方式很简单,按照普通主题模板安装方式上传安装并启用即可;主要是本主题更改了部分内核代码,用来辅助实现以上功能概要中提到的许多功能,以下对使用本主题包中的需要自主修改的文件逐一说明:

header.php

这个文件改动的地方只有一处,就是59行中“新浪微博”与“腾讯微博”中的相关微博地址以及data-title属性值,该属性值会在鼠标移动至该元素时浮层显示,如下图所示:

浮层显示示意图

footer.php

该文件中有两个php数组,用于指定页面底部的相关链接信息,如下图所示,该图中的“关于我”、“开源、服务”就是通过修改footer.php中的数组实现的。

主题底部相关信息示意图

修改该文件中第6行的$CorpRight与第20行的$Tools两个数组中的相应内容即可,其中url对应需要打开的链接,若是博客内部page页面,则可以使用BLOG_URL常量,该常量内容即是你的博客首页网址。

然后修改38行、46行中的相应文字即可。

===============

关于主题中的logo图片修改的问题,这个很简单,将主题包中images文件夹下的logo.psd文件使用photoshop打开,自己处理后替换images文件夹下的logo.png以及logo.gif即可,其中logo.gif请保留背景色,png去除背景色并保持透明;gif文件主要用于ie6下的兼容。

===============

emlog核心修改,以支持该模板的ajax方式日志评论。

修改emlog安装目录下的include/controller下的comment_controller.php文件;这里的修改,主要是使emlog处理提交的评论内容后使用json格式返回,便于js的识别与处理;就不详解怎么改了,改动后文件如下:

<?php
/**
* 发表评论
*
* @copyright (c) Emlog All Rights Reserved
*/

class Comment_Controller {
function addComment($params) {
$name = isset($_POST['comname']) ? addslashes(trim($_POST['comname'])) : '';
$content = isset($_POST['comment']) ? addslashes(trim($_POST['comment'])) : '';
$mail = isset($_POST['commail']) ? addslashes(trim($_POST['commail'])) : '';
$url = isset($_POST['comurl']) ? addslashes(trim($_POST['comurl'])) : '';
$imgcode = isset($_POST['imgcode']) ? strtoupper(trim($_POST['imgcode'])) : '';
$blogId = isset($_POST['gid']) ? intval($_POST['gid']) : -1;
$pid = isset($_POST['pid']) ? intval($_POST['pid']) : 0;

if (ISLOGIN === true) {
$CACHE = Cache::getInstance();
$user_cache = $CACHE->readCache('user');
$name = addslashes($user_cache[UID]['name_orig']);
$mail = addslashes($user_cache[UID]['mail']);
$url = addslashes(BLOG_URL);
}

if ($url && strncasecmp($url,'https://',7)) {
$url = 'https://'.$url;
}

doAction('comment_post');

$Comment_Model = new Comment_Model();
$Comment_Model->setCommentCookie($name,$mail,$url);
if($Comment_Model->isLogCanComment($blogId) === false) {
$this->AjaxEcho('评论失败:该日志已关闭评论');exit();
} elseif ($Comment_Model->isCommentExist($blogId, $name, $content) === true) {
$this->AjaxEcho('评论失败:已存在相同内容评论');exit();
} elseif ($Comment_Model->isCommentTooFast() === true) {
$this->AjaxEcho('评论失败:您提交评论的速度太快了,请稍后再发表评论');exit();
} elseif (empty($name)) {
$this->AjaxEcho('评论失败:请填写姓名');exit();
} elseif (strlen($name) > 20) {
$this->AjaxEcho('评论失败:姓名不符合规范');exit();
} elseif ($mail != '' && !checkMail($mail)) {
$this->AjaxEcho('评论失败:邮件地址不符合规范');exit();
} elseif (ISLOGIN == false && $Comment_Model->isNameAndMailValid($name, $mail) === false) {
$this->AjaxEcho('评论失败:禁止使用管理员昵称或邮箱评论');exit();
} elseif (!empty($url) && preg_match("/^(http|https)\:\/\/[^<>'\"]*$/", $url) == false) {
$this->AjaxEcho('评论失败:主页地址不符合规范');exit();
} elseif (empty($content)) {
$this->AjaxEcho('评论失败:请填写评论内容');exit();
} elseif (strlen($content) > 8000) {
$this->AjaxEcho('评论失败:内容不符合规范');exit();
} elseif (ROLE == 'visitor' && Option::get('comment_needchinese') == 'y' && !preg_match('/[\x{4e00}-\x{9fa5}]/iu', $content)) {
$this->AjaxEcho('评论失败:评论内容需包含中文');exit();
} elseif (ISLOGIN == false && Option::get('comment_code') == 'y' && session_start() && $imgcode != $_SESSION['code']) {
$this->AjaxEcho('评论失败:验证码错误');exit();
} else {
$ret = $Comment_Model->addComment($name, $content, $mail, $url, $imgcode, $blogId, $pid);
if($ret) {
if(is_array($ret)) {$this->AjaxEcho('评论发表成功,请等待管理员审核',true);exit();}
$this->AjaxEcho('评论发表成功',true);exit();
}
$this->AjaxEcho('意外错误,评论失败');exit();
}
}
function AjaxEcho($msgInfo,$isSuccess=false) {
$msg = array();
$msg['code'] = 10000;
if(!$isSuccess) {
$msg['code'] = 10001;
}
$msg['info'] = $msgInfo;
echo json_encode($msg);
}
}

基本上,emlog装机的博主都会使用由emlog官方出品的“反垃圾评论”(地址:https://www.emlog.net/plugin/10)插件,同理这个插件也需要修改。修改方式:修改博客安装目录下的content/plugins/anti_spam_comment目录下的anti_spam_comment.php文件。

修改该插件的文件也是因为需要评论处理后进行ajax的json格式返回,而不是页面跳转,就不具体讲解怎么修改了,改动后文件如下(特别说明:目前该插件已进化至3.5版,为了您的博客安全,请使用3.5版):

<?php
/*
Plugin Name: 反垃圾评论
Version: 3.5
Plugin URL:
Description: 尝试判断垃圾评论并过滤之,可设置IP黑名单和屏蔽词汇
Author: 奇遇
Author Email: qiyuuu@gmail.com
Author URL: https://www.qiyuuu.com
*/
!defined('EMLOG_ROOT') && exit('access deined!');
function AjaxEcho($msgInfo) {
$msg = array();
$msg['code'] = 10001;
$msg['info'] = $msgInfo;
echo json_encode($msg);exit();
}
function asc_time_limit($ip,$time_limit) {
$DB = MySql::getInstance();
if($time_limit <= 0) {
return;
}
$time_line = time() - $time_limit;
$sql = "SELECT ip FROM ".DB_PREFIX."comment WHERE ip='$ip' AND date > $time_line";
$query = $DB->query($sql);
$num = $DB->num_rows($query);
if($num) {
AjaxEcho("{$time_limit}秒内只能发表一次评论,评论发表失败");
}
}
function asc_filter_keywords($keywords, $need_chinese) {
$comment = isset($_POST['comment']) ? addslashes(trim($_POST['comment'])) : '';
if($need_chinese && !preg_match('/[\x{4e00}-\x{9fa5}]/iu', $comment)) {
AjaxEcho("您发表的评论未包含汉字,评论发表失败");
}
foreach($keywords as $keyword) {
$keyword = asc_preg_quote($keyword);
preg_match($keyword, stripslashes($comment), $matches);
if(!empty($matches[0])) {
AjaxEcho("您发表的评论含有禁止内容".htmlspecialchars($matches[0]).",评论发表失败");
}
}
}
function asc_filter_name($keywords) {
$comname = isset($_POST['comname']) ? addslashes(trim($_POST['comname'])) : '';
foreach($keywords as $keyword) {
$keyword = asc_preg_quote($keyword);
preg_match($keyword, stripslashes($comname), $matches);
if(!empty($matches[0])) {
AjaxEcho("您的昵称含有禁止内容".htmlspecialchars($matches[0]).",评论发表失败");
}
}
}
function asc_filter_url($keywords) {
$comurl = isset($_POST['comurl']) ? addslashes(trim($_POST['comurl'])) : '';
foreach($keywords as $keyword) {
$keyword = asc_preg_quote($keyword);
preg_match($keyword, stripslashes($comurl), $matches);
if(!empty($matches[0])) {
AjaxEcho("您填写的地址含有禁止内容".htmlspecialchars($matches[0]).",评论发表失败");
}
}
}
function asc_filter_blacklist($ip,$blacklist) {
$ipArray = explode('.',$ip);
$ip = $ipArray[0];
if(in_array($ip, $blacklist, true)) {
AjaxEcho("您的IP已被系统屏蔽,评论发表失败");
}
for($i = 1; $i < count($ipArray); $i++) {
$ip .= '.'.$ipArray[$i];
if(in_array($ip, $blacklist, true)) {
AjaxEcho("您的IP已被系统屏蔽,评论发表失败");
}
}
}
function asc_add_to_blacklist($ip, $auto_blacklist, $max_attempt) {
if($auto_blacklist) {
$time = time();
$temp = asc_read('temp');
$key = array_search($ip,$temp['ip']);
if($key !== false) {
if($temp['time'][$key] < $time - 60) {
$temp['time'][$key] = $time;
$temp['attempt'][$key] = 1;
} else {
$temp['attempt'][$key]++;
if($max_attempt > 0 && $temp['attempt'][$key] > $max_attempt) {
$comname = isset($_POST['comname']) ? addslashes(trim($_POST['comname'])) : '';
$comurl = isset($_POST['comurl']) ? addslashes(trim($_POST['comurl'])) : '';
$data = asc_read();
if(strstr($data['name_keywords'], $comname) === false) $data['name_keywords'] .= '|' . $comname;
if(array_search($comurl, $data['url_keywords']) === false) $data['url_keywords'][] = $comurl;
if(array_search($ip, $data['blacklist']) === false) $data['blacklist'][] = $ip;
asc_write($data);
AjaxEcho("您的IP已被系统屏蔽,评论发表失败");
}
}
} else {
$temp['ip'][] = $ip;
$temp['time'][] = $time;
$temp['attempt'][] = 1;
}
if(count($temp['time']) > 50) {
foreach($temp['time'] as $key => $val) {
if($val < $time - 60) {
unset($temp['ip'][$key]);
unset($temp['time'][$key]);
unset($temp['attempt'][$key]);
}
}
}
asc_write($temp, 'temp');
}
}
function ascMsg($msg, $url = 'javascript:history.back(-1);') {
if(isset($_GET['gid'])) {
define ('TEMPLATE_PATH', EMLOG_ROOT . '/m/view/');
$url = BLOG_URL . 'm/?post='. intval($_GET['gid']);
include View::getView('header');
include View::getView('msg');
include View::getView('footer');
View::output();
exit;
} else {
emMsg($msg,$url);
}
}
function asc_preg_quote($keyword) {
$keyword = str_replace('\*', '.*', preg_quote($keyword, "/"));
$variable = array("asc_letter","asc_digit","asc_char","asc_star");
$variable_to_be = array("^[a-zA-Z]+$","[0-9]+","^[\x01-\x7E]+$","\*");
$keyword = str_replace($variable, $variable_to_be, $keyword);
$keyword = '/' . $keyword . '/i';
return $keyword;
}
function asc_read($type = 'data') {
$file = EMLOG_ROOT.'/content/plugins/anti_spam_comment/'.$type;
$data = unserialize(file_get_contents($file));
return $data;
}
function asc_write($data, $type = 'data'){
$file = EMLOG_ROOT.'/content/plugins/anti_spam_comment/'.$type;
@$fp = fopen($file, 'w');
@$fw = fwrite($fp,serialize($data));
@fclose($fp);
}
function asc_adm_menu() {
echo '<div class="sidebarsubmenu" id="anti_spam_comment"><a href="./plugin.php?plugin=anti_spam_comment">反垃圾评论</a></div>';
}
addAction('adm_sidebar_ext', 'asc_adm_menu');
$action = isset($_GET['action']) ? addslashes(trim($_GET['action'], '?')) : '';
if($action == 'addcom' && ROLE == 'visitor') {
$data = asc_read();
extract($data);
$keywords = explode("|",$keywords);
$name_keywords = explode("|",$name_keywords);
$ipaddr = getIp();
asc_add_to_blacklist($ipaddr,$auto_blacklist,$max_attempt);
asc_time_limit($ipaddr,$time_limit);
asc_filter_blacklist($ipaddr,$blacklist);
asc_filter_keywords($keywords, $need_chinese);
asc_filter_name($name_keywords);
asc_filter_url($url_keywords);
}
?>

自此,您的博客就可以很顺利的支持ajax日志评论了,您可以对比本文提供的修改后代码与emlog之前的代码,以上两处修改仅对数据返回方式进行了处理,若不修改,无法使用ajax方式进行日志评论数据提交,必须有页面跳转。

==================

碎语部分,因为Ajing主题将前台显示的碎语页面添加了发布碎语(ajax方式)的功能,当然咯必须是管理员登陆的情况下才会显示发布碎语的模块的。固需要在博客安装目录下的admin目录中添加一个处理前台碎语界面所发布的碎语的php脚本,该脚本与admin目录下twiter.php区别不大,也可以进行对比;添加新文件的原因主要在于admin目录下的twiter.php后台界面任然需要使用,固新增了一个前台碎语界面进行碎语处理的脚本,更改的主要原因任然在于数据返回的方式上[这个脚本添加的必要性不大,但若不添加,则前台碎语界面将无法发布碎语。该功能主要是针对管理员,普通访客看不到这个发布框的!]。前台碎语发布样式如下图所示:

前台ajax发布碎语样式

==================

以下是该文件的代码内容,将该代码段复制并保存为ajax_t_manage.php,然后上传至博客安装目录下的admin目录中即可。您也可以直接下载本文件:ajax_t_manage.zip

<?php
/*ajax管理碎语 后台处理程序*/
require_once 'globals.php';
$Twitter_Model = new Twitter_Model();
// .
if ($action == 'post') {
$t = isset($_POST['t']) ? addslashes(trim($_POST['t'])) : '';
$img = isset($_POST['img']) ? addslashes(trim($_POST['img'])) : '';

if (!$t) {
TAjaxEcho("碎语内容不得为空");
exit();
}

$tdata = array('content' => $Twitter_Model->formatTwitter($t),
'author' => UID,
'date' => time(),
'img' => str_replace('../', '', $img)
);

$twid = $Twitter_Model->addTwitter($tdata);
$CACHE->updateCache(array('sta','newtw'));
doAction('post_twitter', $t, $twid);
TAjaxEcho("碎语发布成功",true);
exit();
}
// .
if ($action == 'del') {
$id = isset($_GET['id']) ? intval($_GET['id']) : '';
$Twitter_Model->delTwitter($id);
$CACHE->updateCache(array('sta','newtw'));
emDirect("twitter.php?active_del=true");
}
//ajax
function TAjaxEcho($msgInfo,$isSuccess=false) {
$msg = array();
$msg['code'] = 10000;
if(!$isSuccess) {
$msg['code'] = 10001;
}
$msg['info'] = $msgInfo;
echo json_encode($msg);
}
?>

文章列表附图处理,因为文章列表中的附图需要读取发布日志时上传的附件,但emlog附件默认不缓存图片类型,固需要修改下emlog的缓存方法,修改方法很简单,修改博客安装目录下的include/lib目录下的cache.php文件463行为:

if (in_array($postfix, array('jpg', 'jpeg', 'gif', 'png', 'bmp','rar','zip','txt','pdf','docx','doc','xls','xlsx'))) {

关于Ajing主题的其他使用技巧,请参考:https://blog.jjonline.cn/userInterFace/148.html

分享到:

哟嚯,本文评论功能关闭啦~