cmspageact.java

来自「为用户提供透明的管理平台」· Java 代码 · 共 280 行

JAVA
280
字号
package com.jeecms.cms.action.front;

import static com.jeecms.cms.Constants.MEMBER_SYS;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.jeecms.article.entity.Article;
import com.jeecms.article.manager.ArticleMng;
import com.jeecms.cms.Constants;
import com.jeecms.cms.entity.CmsChannel;
import com.jeecms.cms.entity.CmsConfig;
import com.jeecms.cms.entity.CmsMember;
import com.jeecms.cms.entity.CmsMemberGroup;
import com.jeecms.cms.manager.CmsChannelMng;
import com.jeecms.cms.manager.CmsConfigMng;
import com.jeecms.cms.manager.CmsMemberMng;
import com.jeecms.cms.service.PageCacheSvc;
import com.jeecms.core.PageBaseAction;
import com.ponyjava.common.page.Paginable;
import com.ponyjava.common.page.SimplePage;

@SuppressWarnings("unchecked")
@Scope("prototype")
@Controller("cms.cmsPageAct")
public class CmsPageAct extends PageBaseAction {
	private static final Logger log = LoggerFactory.getLogger(CmsPageAct.class);

	@Override
	protected String sysIndex() throws IOException {
		String result = SUCCESS;
		if (getConfig().getCacheHomepage()) {
			log.debug("首页缓存开启");
			result = PAGE_CACHE_RESULT;
			if (useHomepageCache()) {
				return null;
			}
		}
		sysType = getConfig().getDefaultSystem();
		chnl = cmsChannelMng.getRoot(getWebId(), sysType);
		if (chnl == null) {
			addActionError("站点首页不存在,请在后台添加首页!");
			return showMessage();
		}
		// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
		// chnl.setVisitTotal(chnl.getVisitTotal() + 1);

		tplPath = chnl.chooseTplChannel();
		return result;
	}

	@Override
	protected String chnlIndex(String chnlName) throws IOException {
		String result = SUCCESS;
		if (getConfig().getCacheChannel()) {
			log.debug("栏目缓存开启");
			result = PAGE_CACHE_RESULT;
			if (useChannelCache(chnlName)) {
				return null;
			}
		}
		chnl = cmsChannelMng.getByPath(getWebId(), chnlName);
		if (chnl == null) {
			return pageNotFound();
		}
		// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
		// chnl.setVisitTotal(chnl.getVisitTotal() + 1);

		tplPath = chnl.chooseTplChannel();
		sysType = chnl.getSysType();
		return result;
	}

	@Override
	protected String content(String chnlName, Long id) {
		arti = articleMng.findAndCheckResPath(id);
		String err = checkArticle(arti, chnlName);
		if (err != null) {
			return err;
		}
		chnl = arti.getChannel();
		sysType = chnl.getSysType();
		pagination = new SimplePage(pageNo, 1, arti.getPageCount());

		// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
		arti.updateVisit(1);

		tplPath = arti.chooseTpl();
		return SUCCESS;
	}

	@Override
	protected String alone(String chnlName) {
		chnl = cmsChannelMng.getByPath(getWebId(), chnlName);
		if (chnl == null) {
			return pageNotFound();
		}
		sysType = chnl.getSysType();
		tplPath = chnl.chooseTplChannel();
		return SUCCESS;
	}

	@Override
	protected String pageNotFound() {
		return handleResult(PAGE_NOT_FOUND, MEMBER_SYS, getConfig()
				.getSolution(MEMBER_SYS));
	}

	@Override
	protected String getSolution() {
		return getConfig().getSolution(getSysType());
	}

	private String checkArticle(Article entity, String chnlName) {
		if (entity == null || !entity.getChannel().getPath().equals(chnlName)) {
			return pageNotFound();
		}
		// 检查阅读权限
		CmsMemberGroup group = entity.getGroup();
		if (group == null) {
			group = entity.getChannel().getGroupVisit();
		}
		if (group != null) {
			CmsMember cmsMember = getCmsMember();
			if (cmsMember == null) {
				return redirectLogin();
			}
			int artiLevel = group.getLevel();
			CmsMemberGroup memberGroup = cmsMember.getGroup();
			int memberLevel = memberGroup.getLevel();
			if (artiLevel > memberLevel) {
				addActionError("您的会员组级别是“" + memberGroup.getName() + "”,该页面需要“"
						+ group.getName() + "”或以上级别才能访问");
				return showMessage();
			}
		}
		if (entity.getDisabled()) {
			addActionError("您所访问的文章已经被关闭");
			return showMessage();
		}
		return null;
	}

	public CmsChannel getChnl() {
		return chnl;
	}

	public Article getArti() {
		return arti;
	}

	public String getSysType() {
		return sysType;
	}

	public CmsConfig getConfig() {
		return cmsConfigMng.findById(getWebId());
	}

	/**
	 * 获得cms会员对象
	 * 
	 * @return
	 */
	public CmsMember getCmsMember() {
		Long memberId = getMemberId();
		if (memberId == null) {
			return null;
		} else {
			return cmsMemberMng.findById(memberId);
		}
	}

	/**
	 * 获得cms会员ID
	 * 
	 * @return
	 */
	public Long getCmsMemberId() {
		CmsMember cmsMember = getCmsMember();
		if (cmsMember == null) {
			return null;
		} else {
			return cmsMember.getId();
		}
	}

	private String showMessage() {
		return handleResult(SHOW_MESSAGE, Constants.MEMBER_SYS);
	}

	protected String redirectLogin() {
		rootWebUrl = getWeb().getRootWeb().getWebUrl();
		return Constants.CMS_MEMBER_LOGIN;
	}

	private boolean useCache(Serializable key, PageCacheSvc cache)
			throws IOException {
		byte[] bytes = cache.get(key);
		if (bytes != null) {
			int i = 0;
			while (i < MAX_WAIT_TIME && bytes.length == 0) {
				try {
					i += SLEEP_FOR_WAIT;
					Thread.sleep(SLEEP_FOR_WAIT);
					bytes = cache.get(key);
					log.debug("等待缓存sleep{}ms" + SLEEP_FOR_WAIT);
				} catch (InterruptedException e1) {
					log.warn("sleep interrupted");
				}
			}
			int len = bytes.length;
			if (i < MAX_WAIT_TIME && len > 0) {
				HttpServletResponse resp = ServletActionContext.getResponse();
				resp.setContentLength(len);
				resp.setCharacterEncoding("GBK");
				resp.setContentType("text/html;charset=GBK");
				OutputStream out = resp.getOutputStream();
				out.write(bytes, 0, len);
				out.flush();
				log.debug("缓存命中");
				return true;
			} else {
				log.warn("等待已经超过{}ms,没有等到缓存", i);
			}
		} else {
			// 准备生成缓存
			cache.put(key, new byte[0]);
			log.debug("准备生成缓存");
		}
		return false;
	}

	private boolean useHomepageCache() throws IOException {
		ckHomepage = getWebId();
		cacheType = HOMEPAGE_CACHE;
		return useCache(ckHomepage, homepageCacheSvc);
	}

	private boolean useChannelCache(String chnlName) throws IOException {
		ckChannel = channelCacheSvc.getKey(getWebId(), chnlName, getPageNo());
		cacheType = CHANNEL_CACHE;
		return useCache(ckChannel, channelCacheSvc);
	}

	private static final int SLEEP_FOR_WAIT = 1000;
	private static final int MAX_WAIT_TIME = 15000;
	@Autowired
	private CmsConfigMng cmsConfigMng;
	@Autowired
	private CmsChannelMng cmsChannelMng;
	@Autowired
	private CmsMemberMng cmsMemberMng;
	@Autowired
	private ArticleMng articleMng;
	private CmsChannel chnl;
	private Article arti;
	private String sysType;
	private Paginable pagination;

	public void setChnl(CmsChannel chnl) {
		this.chnl = chnl;
	}

	public Paginable getPagination() {
		return pagination;
	}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?