package com.jeecms.cms.action.front;
import static com.jeecms.cms.Constants.TPLDIR_CSI;
import static com.jeecms.cms.Constants.TPLDIR_SPECIAL;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.jeecms.cms.entity.assist.CmsComment;
import com.jeecms.cms.entity.main.ChannelExt;
import com.jeecms.cms.entity.main.CmsSite;
import com.jeecms.cms.entity.main.CmsUser;
import com.jeecms.cms.entity.main.Content;
import com.jeecms.cms.manager.assist.CmsCommentMng;
import com.jeecms.cms.manager.main.ContentMng;
import com.jeecms.cms.web.CmsUtils;
import com.jeecms.cms.web.FrontUtils;
import com.jeecms.common.web.RequestUtils;
import com.jeecms.common.web.ResponseUtils;
import com.jeecms.common.web.session.SessionProvider;
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.ImageCaptchaService;
@Controller
public class CommentAct {
private static final Logger log = LoggerFactory.getLogger(CommentAct.class);
public static final String COMMENT_PAGE = "tpl.commentPage";
public static final String COMMENT_LIST = "tpl.commentList";
@RequestMapping(value = "/comment*.jspx", method = RequestMethod.GET)
public String page(Integer contentId, Integer pageNo,
HttpServletRequest request, HttpServletResponse response,
ModelMap model) {
CmsSite site = CmsUtils.getSite(request);
Content content = contentMng.findById(contentId);
if (content == null) {
return FrontUtils.showMessage(request, model,
"comment.contentNotFound");
}
if (content.getChannel().getCommentControl() == ChannelExt.COMMENT_OFF) {
return FrontUtils.showMessage(request, model, "comment.closed");
}
// 将request中所有参数保存至model中。
model.putAll(RequestUtils.getQueryParams(request));
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
model.addAttribute("content", content);
return FrontUtils.getTplPath(request, site.getSolutionPath(),
TPLDIR_SPECIAL, COMMENT_PAGE);
}
@RequestMapping(value = "/comment_list.jspx")
public String list(Integer siteId, Integer contentId, Integer greatTo,
Integer recommend, Integer checked, Integer orderBy, Integer count,
HttpServletRequest request, HttpServletResponse response,
ModelMap model) {
if (count == null || count <= 0 || count > 200) {
count = 200;
}
boolean desc, rec;
if (orderBy == null || orderBy == 0) {
desc = true;
} else {
desc = false;
}
if (recommend == null || recommend == 0) {
rec = false;
} else {
rec = true;
}
Boolean chk;
if (checked != null) {
chk = checked != 0;
} else {
chk = null;
}
List<CmsComment> list = cmsCommentMng.getListForTag(siteId, contentId,
greatTo, chk, rec, desc, count);
// 将request中所有参数
model.putAll(RequestUtils.getQueryParams(request));
model.addAttribute("list", list);
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
return FrontUtils.getTplPath(request, site.getSolutionPath(),
TPLDIR_CSI, COMMENT_LIST);
}
@RequestMapping(value = "/comment.jspx", method = RequestMethod.POST)
public void submit(Integer contentId, String text, String captcha,
HttpServletRequest request, HttpServletResponse response,
ModelMap model) throws JSONException {
CmsSite site = CmsUtils.getSite(request);
CmsUser user = CmsUtils.getUser(request);
JSONObject json = new JSONObject();
if (contentId == null) {
json.put("success", false);
json.put("status", 100);
ResponseUtils.renderJson(response, json.toString());
return;
}
if (StringUtils.isBlank(text)) {
json.put("success", false);
json.put("status", 101);
ResponseUtils.renderJson(response, json.toString());
return;
}
if (user == null || user.getGroup().getNeedCaptcha()) {
// 验证码错误
try {
if (!imageCaptchaService.validateResponseForID(session
.getSessionId(request, response), captcha)) {
json.put("success", false);
json.put("status", 1);
ResponseUtils.renderJson(response, json.toString());
return;
}
} catch (CaptchaServiceException e) {
json.put("success", false);
json.put("status", 1);
log.warn("", e);
ResponseUtils.renderJson(response, json.toString());
return;
}
}
Content content = contentMng.findById(contentId);
if (content == null) {
// 内容不存在
json.put("success", false);
json.put("status", 2);
} else if (content.getChannel().getCommentControl() == ChannelExt.COMMENT_OFF) {
// 评论关闭
json.put("success", false);
json.put("status", 3);
} else if (content.getChannel().getCommentControl() == ChannelExt.COMMENT_LOGIN
&& user == null) {
// 需要登录才能评论
json.put("success", false);
json.put("status", 4);
} else {
boolean checked = false;
Integer userId = null;
if (user != null) {
checked = !user.getGroup().getNeedCheck();
userId = user.getId();
}
cmsCommentMng.comment(text, RequestUtils.getIpAddr(request),
contentId, site.getId(), userId, checked, false);
json.put("success", true);
json.put("status", 0);
}
ResponseUtils.renderJson(response, json.toString());
}
@RequestMapping(value = "/comment_up.jspx")
public void up(Integer contentId, HttpServletRequest request,
HttpServletResponse response) {
if (exist(contentId)) {
cmsCommentMng.ups(contentId);
ResponseUtils.renderJson(response, "true");
} else {
ResponseUtils.renderJson(response, "false");
}
}
@RequestMapping(value = "/comment_down.jspx")
public void down(Integer contentId, HttpServletRequest request,
HttpServletResponse response) {
if (exist(contentId)) {
cmsCommentMng.downs(contentId);
ResponseUtils.renderJson(response, "true");
} else {
ResponseUtils.renderJson(response, "false");
}
}
private boolean exist(Integer id) {
if (id == null) {
return false;
}
Content content = contentMng.findById(id);
return content != null;
}
@Autowired
private CmsCommentMng cmsCommentMng;
@Autowired
private ContentMng contentMng;
@Autowired
private SessionProvider session;
@Autowired
private ImageCaptchaService imageCaptchaService;
}