在织梦(DedeCMS)系统中,用户评论功能是增强网站互动性的重要模块,但有时默认的评论样式或功能可能无法满足个性化需求,仿制或自定义评论模块成为常见需求,以下将从原理分析、步骤拆解、代码实现及注意事项等方面详细说明如何仿制织梦用户评论功能,确保功能完整且符合设计要求。

仿制评论的核心逻辑
织梦的评论系统基于数据表(dede_feedback)存储评论内容,通过PHP调用数据库并配合前端模板渲染,仿制评论需遵循三个核心步骤:数据表设计、后端逻辑开发、前端模板适配,需确保新评论模块与织梦原有架构兼容,避免冲突。
详细操作步骤
数据表分析与扩展
默认评论表dede_feedback包含字段:id(评论ID)、aid(文章ID)、typeid(栏目ID)、username(用户名)、arctitle)、ip(IP地址)、dtime(评论时间)、msg)、ischeck(审核状态),若需扩展功能(如点赞、回复),可添加新字段:
ALTER TABLE `dede_feedback` ADD `like_count` INT(10) DEFAULT '0' COMMENT '点赞数'; ALTER TABLE `dede_feedback` ADD `reply_id` INT(10) DEFAULT '0' COMMENT '回复ID';
后端逻辑开发
(1)评论提交接口
新建文件ajax_post.php,处理评论提交请求,需包含以下逻辑:
- 验证用户权限(是否登录、是否关闭评论等)。
- 过滤敏感内容(使用织梦自带的
FilterSearch函数)。 - 写入数据库并返回JSON结果。
require_once(dirname(__FILE__)."/include/common.inc.php"); if(empty($cfg_ml->M_ID)) exit('{"status":0,"msg":"请先登录"}'); $aid = isset($aid) ? intval($aid) : 0; $msg = isset($msg) ? trim(HtmlReplace($msg, 1)) : ''; if(empty($msg)) exit('{"status":0,"msg":"评论内容不能为空"}'); $rs = $dsql->ExecuteNoneQuery("INSERT INTO `dede_feedback` (`aid`, `typeid`, `username`, `arctitle`, `msg`, `ip`, `dtime`, `ischeck`) VALUES ('$aid', '$typeid', '{$cfg_ml->M_UserName}', '$arctitle', '$msg', '".GetIP()."', '".time()."', '0')"); if($rs) exit('{"status":1,"msg":"评论成功"}'); else exit('{"status":0,"msg":"评论失败"}');
(2)评论列表调用
使用织梦标签{dede:feedback}调用评论列表,若需自定义排序或字段,可修改标签源码(include/taglib/feedback.lib.php)或直接用SQL查询:

$dsql->SetQuery("SELECT * FROM `dede_feedback` WHERE aid=$aid ORDER BY dtime DESC");
$dsql->Execute();
while($row = $dsql->GetArray()){
$msg .= "<div class='comment-item'>
<span class='user'>".$row['username']."</span>
<span class='time'>".date('Y-m-d H:i', $row['dtime'])."</span>
<p>".$row['msg']."</p>
</div>";
}
echo $msg;
前端模板适配
(1)评论表单页(article_article.htm)中添加表单:
<form id="comment-form" action="/ajax_post.php" method="post">
<input type="hidden" name="aid" value="{dede:field.id/}">
<textarea name="msg" placeholder="写下你的评论..."></textarea>
<button type="submit">提交评论</button>
</form>
(2)评论列表
使用自定义样式渲染评论数据,
<div class="comment-list">
{dede:feedback}
<div class="comment-item">
<div class="user-info">
<span class="username">[field:username/]</span>
<span class="time">[field:time function="MyDate('Y-m-d H:i',@me)"/]</span>
</div>
<div class="comment-content">[field:msg/]</div>
</div>
{/dede:feedback}
</div>
(3)样式美化
通过CSS调整布局,
.comment-item{border-bottom:1px solid #eee;padding:10px 0;}
.user-info{color:#666;font-size:12px;margin-bottom:5px;}
.comment-content{line-height:1.6;}
功能扩展(如点赞)
(1)点赞按钮
在评论列表中添加点赞按钮:
<span class="like-btn" data-id="{$comment.id}">赞({$comment.like_count})</span>
(2)AJAX处理
在ajax_post.php中添加点赞逻辑:

if($action == 'like'){
$id = isset($id) ? intval($id) : 0;
$dsql->ExecuteNoneQuery("UPDATE `dede_feedback` SET `like_count`=`like_count`+1 WHERE id=$id");
echo json_encode(['status'=>1, 'count'=>$dsql->GetOne("SELECT `like_count` FROM `dede_feedback` WHERE id=$id")]);
}
注意事项
- 安全性:需对用户输入进行转义和过滤,防止XSS攻击(使用
htmlspecialchars或织梦内置函数)。 - 权限控制:确保只有登录用户可评论,管理员需审核后显示。
- 性能优化:评论列表分页加载,避免一次性查询过多数据(可修改
feedback.lib.php支持分页)。 - 兼容性:若使用织梦标签,需确保标签未被覆盖;若直接调用SQL,需注意字段名与表前缀一致。
常见问题与解决方案
问题1:评论提交后不显示或显示乱码?
解答:
- 检查数据库编码是否为UTF-8,确保评论内容字段(
msg)支持中文。 - 确认
ajax_post.php中包含require_once引入织梦核心文件,且正确初始化$dsql数据库连接。 - 若乱码,检查文件编码是否为UTF-8(无BOM头),并在表单提交时设置
accept-charset="UTF-8"。
问题2:如何实现评论回复功能?
解答:
- 在
dede_feedback表中添加reply_id字段,存储被回复评论的ID。 - 提交评论时,通过JS获取被回复评论的ID并传递给后端:
document.querySelector('.reply-btn').addEventListener('click', function(){ document.getElementById('comment-form').action += '&reply_id='+this.dataset.id; }); - 后端存储
reply_id,前端通过CSS样式区分主评论与回复(如缩进或背景色)。
通过以上步骤,可完整仿制织梦用户评论功能,并根据需求扩展个性化特性,开发过程中需注重代码规范与安全性,确保系统稳定运行。
