Package com.jeecms.cms.action.member

Source Code of com.jeecms.cms.action.member.ContributeAct

package com.jeecms.cms.action.member;

import static com.jeecms.cms.Constants.TPLDIR_MEMBER;
import static com.jeecms.common.page.SimplePage.cpn;

import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
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 com.jeecms.cms.entity.main.Channel;
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.entity.main.ContentExt;
import com.jeecms.cms.entity.main.ContentTxt;
import com.jeecms.cms.entity.main.ContentType;
import com.jeecms.cms.entity.main.MemberConfig;
import com.jeecms.cms.manager.main.ChannelMng;
import com.jeecms.cms.manager.main.ContentMng;
import com.jeecms.cms.manager.main.ContentTypeMng;
import com.jeecms.cms.web.CmsUtils;
import com.jeecms.cms.web.FrontUtils;
import com.jeecms.cms.web.WebErrors;
import com.jeecms.common.page.Pagination;
import com.jeecms.common.util.StrUtils;
import com.jeecms.common.web.session.SessionProvider;
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.ImageCaptchaService;

/**
* 会员投稿Action
*
* @author liufang
*
*/
@Controller
public class ContributeAct {
  private static final Logger log = LoggerFactory
      .getLogger(ContributeAct.class);

  public static final String CONTRIBUTE_LIST = "tpl.contributeList";
  public static final String CONTRIBUTE_ADD = "tpl.contributeAdd";
  public static final String CONTRIBUTE_EDIT = "tpl.contributeEdit";

  /**
   * 会员投稿列表
   *
   * @param title
   *            文章标题
   * @param channelId
   *            栏目ID
   * @param pageNo
   *            页码
   * @param request
   * @param model
   * @return
   */
  @RequestMapping(value = "/member/contribute_list.jspx")
  public String list(String queryTitle, Integer queryChannelId,
      Integer pageNo, HttpServletRequest request, ModelMap model) {
    CmsSite site = CmsUtils.getSite(request);
    CmsUser user = CmsUtils.getUser(request);
    FrontUtils.frontData(request, model, site);
    MemberConfig mcfg = site.getConfig().getMemberConfig();
    // 没有开启会员功能
    if (!mcfg.isMemberOn()) {
      return FrontUtils.showMessage(request, model, "member.memberClose");
    }
    if (user == null) {
      return FrontUtils.showLogin(request, model, site);
    }
    Pagination p = contentMng.getPageForMember(queryTitle, queryChannelId,
        site.getId(), user.getId(), cpn(pageNo), 20);
    model.addAttribute("pagination", p);
    if (!StringUtils.isBlank(queryTitle)) {
      model.addAttribute("queryTitle", queryTitle);
    }
    if (queryChannelId != null) {
      model.addAttribute("queryChannelId", queryChannelId);
    }
    return FrontUtils.getTplPath(request, site.getSolutionPath(),
        TPLDIR_MEMBER, CONTRIBUTE_LIST);
  }

  /**
   * 会员投稿添加
   *
   * @param request
   * @param model
   * @return
   */
  @RequestMapping(value = "/member/contribute_add.jspx")
  public String add(HttpServletRequest request, ModelMap model) {
    CmsSite site = CmsUtils.getSite(request);
    CmsUser user = CmsUtils.getUser(request);
    FrontUtils.frontData(request, model, site);
    MemberConfig mcfg = site.getConfig().getMemberConfig();
    // 没有开启会员功能
    if (!mcfg.isMemberOn()) {
      return FrontUtils.showMessage(request, model, "member.memberClose");
    }
    if (user == null) {
      return FrontUtils.showLogin(request, model, site);
    }
    // 获得本站栏目列表
    Set<Channel> rights = user.getGroup().getContriChannels();
    List<Channel> topList = channelMng.getTopList(site.getId(), true);
    List<Channel> channelList = Channel.getListForSelect(topList, rights,
        true);
    model.addAttribute("channelList", channelList);
    return FrontUtils.getTplPath(request, site.getSolutionPath(),
        TPLDIR_MEMBER, CONTRIBUTE_ADD);
  }

  /**
   * 会员投稿保存
   *
   * @param id
   *            文章ID
   * @param title
   *            标题
   * @param author
   *            作者
   * @param description
   *            描述
   * @param txt
   *            内容
   * @param tagStr
   *            TAG字符串
   * @param channelId
   *            栏目ID
   * @param nextUrl
   *            下一个页面地址
   * @param request
   * @param response
   * @param model
   * @return
   */
  @RequestMapping(value = "/member/contribute_save.jspx")
  public String save(String title, String author, String description,
      String txt, String tagStr, Integer channelId, String captcha,
      String nextUrl, HttpServletRequest request,
      HttpServletResponse response, ModelMap model) {
    CmsSite site = CmsUtils.getSite(request);
    CmsUser user = CmsUtils.getUser(request);
    FrontUtils.frontData(request, model, site);
    MemberConfig mcfg = site.getConfig().getMemberConfig();
    // 没有开启会员功能
    if (!mcfg.isMemberOn()) {
      return FrontUtils.showMessage(request, model, "member.memberClose");
    }
    if (user == null) {
      return FrontUtils.showLogin(request, model, site);
    }
    WebErrors errors = validateSave(title, author, description, txt,
        tagStr, channelId, site, user, captcha, request, response);
    if (errors.hasErrors()) {
      return FrontUtils.showError(request, response, model, errors);
    }

    Content c = new Content();
    c.setSite(site);
    ContentExt ext = new ContentExt();
    ext.setTitle(title);
    ext.setAuthor(author);
    ext.setDescription(description);
    ContentTxt t = new ContentTxt();
    t.setTxt(txt);
    ContentType type = contentTypeMng.getDef();
    if (type == null) {
      throw new RuntimeException("Default ContentType not found.");
    }
    Integer typeId = type.getId();
    String[] tagArr = StrUtils.splitAndTrim(tagStr, ",", null);
    c = contentMng.save(c, ext, t, null, null, null, tagArr, null, null,
        null, null, null, channelId, typeId, null, user, true);
    log.info("member contribute save Content success. id={}", c.getId());
    return FrontUtils.showSuccess(request, model, nextUrl);
  }

  /**
   * 会员投稿修改
   *
   * @param id
   *            文章ID
   * @param request
   * @param response
   * @param model
   * @return
   */
  @RequestMapping(value = "/member/contribute_edit.jspx")
  public String edit(Integer id, HttpServletRequest request,
      HttpServletResponse response, ModelMap model) {
    CmsSite site = CmsUtils.getSite(request);
    CmsUser user = CmsUtils.getUser(request);
    FrontUtils.frontData(request, model, site);
    MemberConfig mcfg = site.getConfig().getMemberConfig();
    // 没有开启会员功能
    if (!mcfg.isMemberOn()) {
      return FrontUtils.showMessage(request, model, "member.memberClose");
    }
    if (user == null) {
      return FrontUtils.showLogin(request, model, site);
    }
    WebErrors errors = validateEdit(id, site, user, request);
    if (errors.hasErrors()) {
      return FrontUtils.showError(request, response, model, errors);
    }
    Content content = contentMng.findById(id);
    // 获得本站栏目列表
    Set<Channel> rights = user.getGroup().getContriChannels();
    List<Channel> topList = channelMng.getTopList(site.getId(), true);
    List<Channel> channelList = Channel.getListForSelect(topList, rights,
        true);
    model.addAttribute("content", content);
    model.addAttribute("channelList", channelList);
    return FrontUtils.getTplPath(request, site.getSolutionPath(),
        TPLDIR_MEMBER, CONTRIBUTE_EDIT);
  }

  /**
   * 会有投稿更新
   *
   * @param id
   *            文章ID
   * @param title
   *            标题
   * @param author
   *            作者
   * @param description
   *            描述
   * @param txt
   *            内容
   * @param tagStr
   *            TAG字符串
   * @param channelId
   *            栏目ID
   * @param nextUrl
   *            下一个页面地址
   * @param request
   * @param response
   * @param model
   * @return
   */
  @RequestMapping(value = "/member/contribute_update.jspx")
  public String update(Integer id, String title, String author,
      String description, String txt, String tagStr, Integer channelId,
      String nextUrl, HttpServletRequest request,
      HttpServletResponse response, ModelMap model) {
    CmsSite site = CmsUtils.getSite(request);
    CmsUser user = CmsUtils.getUser(request);
    FrontUtils.frontData(request, model, site);
    MemberConfig mcfg = site.getConfig().getMemberConfig();
    // 没有开启会员功能
    if (!mcfg.isMemberOn()) {
      return FrontUtils.showMessage(request, model, "member.memberClose");
    }
    if (user == null) {
      return FrontUtils.showLogin(request, model, site);
    }
    WebErrors errors = validateUpdate(id, channelId, site, user, request);
    if (errors.hasErrors()) {
      return FrontUtils.showError(request, response, model, errors);
    }
    Content c = new Content();
    c.setId(id);
    c.setSite(site);
    ContentExt ext = new ContentExt();
    ext.setId(id);
    ext.setTitle(title);
    ext.setAuthor(author);
    ext.setDescription(description);
    ContentTxt t = new ContentTxt();
    t.setId(id);
    t.setTxt(txt);
    String[] tagArr = StrUtils.splitAndTrim(tagStr, ",", null);
    contentMng.update(c, ext, t, tagArr, null, null, null, null, null,
        null, null, null, null, channelId, null, null, user, true);
    return FrontUtils.showSuccess(request, model, nextUrl);
  }

  /**
   * 会员投稿删除
   *
   * @param ids
   *            待删除的文章ID数组
   * @param nextUrl
   *            下一个页面地址
   * @param request
   * @param response
   * @param model
   * @return
   */
  @RequestMapping(value = "/member/contribute_delete.jspx")
  public String delete(Integer[] ids, HttpServletRequest request,
      String nextUrl, HttpServletResponse response, ModelMap model) {
    CmsSite site = CmsUtils.getSite(request);
    CmsUser user = CmsUtils.getUser(request);
    FrontUtils.frontData(request, model, site);
    MemberConfig mcfg = site.getConfig().getMemberConfig();
    // 没有开启会员功能
    if (!mcfg.isMemberOn()) {
      return FrontUtils.showMessage(request, model, "member.memberClose");
    }
    if (user == null) {
      return FrontUtils.showLogin(request, model, site);
    }
    WebErrors errors = validateDelete(ids, site, user, request);
    if (errors.hasErrors()) {
      return FrontUtils.showError(request, response, model, errors);
    }
    Content[] arr = contentMng.deleteByIds(ids);
    log.info("member contribute delete Content success. ids={}",
        StringUtils.join(arr, ","));
    return FrontUtils.showSuccess(request, model, nextUrl);
  }

  private WebErrors validateSave(String title, String author,
      String description, String txt, String tagStr, Integer channelId,
      CmsSite site, CmsUser user, String captcha,
      HttpServletRequest request, HttpServletResponse response) {
    WebErrors errors = WebErrors.create(request);
    try {
      if (!imageCaptchaService.validateResponseForID(session
          .getSessionId(request, response), captcha)) {
        errors.addErrorCode("error.invalidCaptcha");
        return errors;
      }
    } catch (CaptchaServiceException e) {
      errors.addErrorCode("error.exceptionCaptcha");
      log.warn("", e);
      return errors;
    }
    if (errors.ifBlank(title, "title", 150)) {
      return errors;
    }
    if (errors.ifMaxLength(author, "author", 100)) {
      return errors;
    }
    if (errors.ifMaxLength(description, "description", 255)) {
      return errors;
    }
    // 内容不能大于1M
    if (errors.ifBlank(txt, "txt", 1048575)) {
      return errors;
    }
    if (errors.ifMaxLength(tagStr, "tagStr", 255)) {
      return errors;
    }
    if (errors.ifNull(channelId, "channelId")) {
      return errors;
    }
    if (vldChannel(errors, site, user, channelId)) {
      return errors;
    }
    return errors;
  }

  private WebErrors validateEdit(Integer id, CmsSite site, CmsUser user,
      HttpServletRequest request) {
    WebErrors errors = WebErrors.create(request);
    if (vldOpt(errors, site, user, new Integer[] { id })) {
      return errors;
    }
    return errors;
  }

  private WebErrors validateUpdate(Integer id, Integer channelId,
      CmsSite site, CmsUser user, HttpServletRequest request) {
    WebErrors errors = WebErrors.create(request);
    if (vldOpt(errors, site, user, new Integer[] { id })) {
      return errors;
    }
    if (vldChannel(errors, site, user, channelId)) {
      return errors;
    }
    return errors;
  }

  private WebErrors validateDelete(Integer[] ids, CmsSite site, CmsUser user,
      HttpServletRequest request) {
    WebErrors errors = WebErrors.create(request);
    if (vldOpt(errors, site, user, ids)) {
      return errors;
    }
    return errors;
  }

  private boolean vldOpt(WebErrors errors, CmsSite site, CmsUser user,
      Integer[] ids) {
    for (Integer id : ids) {
      if (errors.ifNull(id, "id")) {
        return true;
      }
      Content c = contentMng.findById(id);
      // 数据不存在
      if (errors.ifNotExist(c, Content.class, id)) {
        return true;
      }
      // 非本用户数据
      if (!c.getUser().getId().equals(user.getId())) {
        errors.noPermission(Content.class, id);
        return true;
      }
      // 非本站点数据
      if (!c.getSite().getId().equals(site.getId())) {
        errors.notInSite(Content.class, id);
        return true;
      }
      // 文章级别大于0,不允许修改
      if (c.getCheckStep() > 0) {
        errors.addErrorCode("member.contentChecked");
        return true;
      }
    }
    return false;
  }

  private boolean vldChannel(WebErrors errors, CmsSite site, CmsUser user,
      Integer channelId) {
    Channel channel = channelMng.findById(channelId);
    if (errors.ifNotExist(channel, Channel.class, channelId)) {
      return true;
    }
    if (!channel.getSite().getId().equals(site.getId())) {
      errors.notInSite(Channel.class, channelId);
      return true;
    }
    if (!channel.getContriGroups().contains(user.getGroup())) {
      errors.noPermission(Channel.class, channelId);
      return true;
    }
    return false;
  }

  @Autowired
  private ContentMng contentMng;
  @Autowired
  private ContentTypeMng contentTypeMng;
  @Autowired
  private ChannelMng channelMng;
  @Autowired
  private SessionProvider session;
  @Autowired
  private ImageCaptchaService imageCaptchaService;
}
TOP

Related Classes of com.jeecms.cms.action.member.ContributeAct

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.