需求
1 登陆之后可以评论
2 打分1--2 差评 3 中评 4--5好评
3 用户评论时 可以指定一个印象,如果这个印象已经存在就把数字+1
4 评论的功能完全使用ajax制作 【商品页面有缓存,所有要使用局部不缓存】
实际操作:
1 建表
/************商品评论表***********/
 drop table if exists p40_comment;
 create table p40_comment
 	(
 		id mediumint unsigned not null auto_increment comment ‘id‘,
 		goods_id mediumint unsigned not null comment ‘商品ID‘,
 		member_id mediumint unsigned not null comment ‘会员id‘,
 		content varchar(200) not null comment ‘内容‘,
 		addtime datetime not null comment ‘发表时间‘,
 		start tinyint unsigned not null comment ‘分值‘,
 		click_count smallint unsigned not null default ‘0‘ comment ‘有用的数字‘,
 		primary key(id),
 		key goods_id(goods_id)
 		)engine=InnoDB default charset=utf8 comment ‘评论‘;
 	/************商品评论回复表***********/
 drop table if exists p40_comment_reply;
 create table p40_comment_reply
 	(
 		id mediumint unsigned not null auto_increment comment ‘id‘,
 		comment_id mediumint unsigned not null comment ‘评论ID‘,
 		member_id mediumint unsigned not null comment ‘会员id‘,
 		content varchar(200) not null comment ‘内容‘,
 		addtime datetime not null comment ‘发表时间‘,
 		primary key(id),
 		key comment_id(comment_id)
 		)engine=InnoDB default charset=utf8 comment ‘评论回复‘;
 
/************商品印象表***********/
 drop table if exists p40_yinxiang;
 create table p40_yinxiang
 	(
 		id mediumint unsigned not null auto_increment comment ‘id‘,
 		goods_id mediumint unsigned not null comment ‘商品ID‘,
        yx_name varchar(30) not null comment ‘印象名称‘,
        yx_count smallint unsigned not null default ‘1‘ comment ‘印象的次数‘, 
 		primary key(id),
 		key goods_id(goods_id)
 		)engine=InnoDB default charset=utf8 comment ‘印象‘;
--------------------------------
2 ajax发表评论
2.1 创建评论模型 放在后台
<?php
namespace Admin\Model;
use Think\Model;
class CommentModel extends Model 
{
	 //评论时允许提交的字段
	protected $insertFields=‘start,content,goods_id‘;
	//发表评论时表单验证规则
	 protected $_validate=array(
          array(‘goods_id‘,‘require‘,‘参数错误!‘,1),
          array(‘start‘,‘1,2,3,4,5‘,‘分值只能是1-5!‘,1,‘in‘),
          array(‘content‘,‘1,200‘,‘内容必须是1-200个字符!‘,1,‘length‘),
	 	);
	  protected function _before_insert(&$data,$option)
	    {
           $memberId=session(‘m_id‘);
           if(!$memberId)
           	 {
           	 	$this->error=‘必须先登录!‘;
           	 	return false; 
           	 }
           	 $data[‘member_id‘]=$memberId;
           	 $data[‘addtime‘]=date(‘Y-m-d H:i:s‘);
	    }
}
------------------------------------
控制器代码
<?php
namespace Home\Controller;
use Think\Controller;
class CommentController extends Controller 
{
	 //发表评论
  public function add()
    {
     if(IS_POST)
     	 {
     	 	$model=D(‘Admin/Comment‘);
     	 	if($model->create(I(‘post.‘),1))
     	 		 {
     	 		    if($model->add())
                     {
                        $this->success(‘添加成功!‘,‘‘,TRUE);   因为是ajax所以这里设置返回JSON
                        exit;
                     }	
     	 		 }
                 $this->error($model->getError(),‘‘,TRUE); 
     	 }
    }
}
------------------------------
2.3 修改表单 以AJAX方式提交
1 先修改表单
 <!-- 评论表单 start-->
						<div class="comment_form mt20">
							<form id="comment-form">
								 <input type="hidden" name="goods_id" value="<?php echo $info[‘id‘]; ?>">
								<ul>
									<li>
										<label for=""> 评分:</label>
										<input type="radio" name="start" value="5" checked="checked"/> <strong class="star star5"></strong>
										<input type="radio" name="start" value="4"/> <strong class="star star4"></strong>
										<input type="radio" name="start" value="3"/> <strong class="star star3"></strong>
										<input type="radio" name="start" value="2"/> <strong class="star star2"></strong>
										<input type="radio" name="start" value="1"/> <strong class="star star1"></strong>
									</li>
									<li>
										<label for="">评价内容:</label>
										<textarea name="content" id="" cols="" rows=""></textarea>
									</li>
									<li>
										<label for=""> </label>
										<input type="button" value="提交评论"  class="comment_btn"/>										
									</li>
								</ul>
							</form>
						</div>
						<!--  评论表单 end-->
						
2 为提交按钮绑定点击事件点击时以ajax的方式提交
/************ajax发表评论*************/
   $(".comment_btn").click(function(){
   	    //先接收表单中的数据 格式 : nametom&age=23
   	    var form = $("#comment-form");
   	    var formData=form.serialize();
        $.ajax({
           type:"POST",
           url:"<?php echo U(‘Comment/add‘); ?>",
           data:formData, //表单中要提交的数据
           dataType:"json", //服务器返回的数据格式
           success:function(data)
            {
            	 if(data.status == 0)
            	 	 alert(data.info);
            	 	else
            	 	 {
                       //清空表单
                       form.trigger("reset");   //触发表单的reset事件
            	 	 }
            }
});
   });
3 发表评论成功之后在以上页面中显示出来新的评论
修改发表评论的控制器
 public function add()
    {
     if(IS_POST)
     	 {
     	 	$model=D(‘Admin/Comment‘);
     	 	if($model->create(I(‘post.‘),1))
     	 		 {
     	 		    if($model->add())
                     {
                        $this->success(array(
                               ‘face‘=>session(‘face‘),
                               ‘username‘=>session(‘username‘),
                               ‘addtime‘=>date(‘Y-n-d H:i:s‘),
                               ‘content‘=>I(‘post.content‘),
                               ‘start‘=>I(‘post.start‘),
                            ),‘‘,TRUE);
                     }	
     	 		 }
                 $this->error($model->getError(),‘‘,TRUE);
     	 }
    }
}
把新评论拼成HTML 并显示在页面中
 <!-- 评论容器 -->
	                        	<div id="comment_container"></div>
	                      
/************ajax发表评论*************/
   $(".comment_btn").click(function(){
   	    //先接收表单中的数据 格式 : nametom&age=23
   	    var form = $("#comment-form");
   	    var formData=form.serialize();
        $.ajax({
           type:"POST",
           url:"<?php echo U(‘Comment/add‘); ?>",
           data:formData, //表单中要提交的数据
           dataType:"json", //服务器返回的数据格式
           success:function(data)
            {
            	 if(data.status == 0)
            	 	 alert(data.info);
            	 	else
            	 	 {
                       //清空表单
                       form.trigger("reset");   //触发表单的reset事件
                         
                        //用新发表的评论数据拼出一个显示的HTML字符串
                        var html=‘	<div class="comment_items mt10 none"><div class="user_pic"><dl><dt><a href=""><img src="‘+data.info.face+‘"  /></a></dt><dd><a href="">‘+data.info.face+‘</a></dd></dl></div><div class="item"><div class="title"><span>‘+data.info.addtime+‘</span><strong class="star star‘+data.info.star+‘"></strong></div><div class="comment_content">‘+data.info.content+‘</div><div class="btns"><a href="" class="reply">回复(0)</a><a href="" class="useful">有用(0)</a></div><div class="cornor"></div></div>‘;
                        //把整个评论的字符串转化成jq的对象
                        html = $(html);
				// 把拼好的评论放到页面中
				$("#comment_container").prepend(html);
				// 让导航条直接滚动第一个评论处
				$("body").animate({
					"scrollTop" : "750px"
				}, 1000, function(){
					html.fadeIn(2000);
				});
            	 	 }
              }
});
   });
原文:http://www.cnblogs.com/gooderic/p/5791546.html