package com.kingschan.blog.controller.pub;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.safety.Whitelist;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.kingschan.blog.common.enums.BLOG_SKIN_PAGE;
import com.kingschan.blog.common.freemarker.util.TemplateStaticUtil;
import com.kingschan.blog.model.vo.ArticleVo;
import com.kingschan.blog.model.vo.LableVo;
import com.kingschan.blog.dao.Pagination;
import com.kingschan.blog.po.WebSite;
import com.kingschan.blog.services.ArticleService;
import com.kingschan.blog.services.font.FontBlogArticleService;
import com.kingschan.blog.services.pub.PubBlogService;
import com.kingschan.blog.util.BlogUtil;
@Controller
public class IndexController {
@Autowired
private ArticleService article_serv;
@Autowired
private PubBlogService pubBlogServ;
@Autowired
private FontBlogArticleService fontBlogServ;
//http://51so.info/kingschan/ 用户主页
//http://51so.info/kingschan/entry/a03e8979-cc61-4922-9ba3-634de32ed50b.html 文章
//http://51so.info/kingschan/category/数据库 文章类型
//http://51so.info/kingschan/tags/java 标签
//http://51so.info/kingschan/date/20160216 日期
//http://51so.info/kingschan/feed/entries/atom 订阅
//http://51so.info/kingschan/mediaresource/60ec8852-951a-4b7c-92d9-bcba35813336 文件
//http://www.51so.info/sitemap.xml sitemap自动生成
//http://51so.info/kingschan/?page=1 分页
@Autowired
private TemplateStaticUtil tsu;
/**
* 主页
* @param request
* @return
*/
@RequestMapping("/home")
public ModelAndView home(HttpServletRequest request,HttpServletResponse response){
/*CookieUtil cu = new CookieUtil(request, response);
for (Cookie coo : cu.getCookies()) {
System.out.println(coo.getName()+"|"+coo.getValue());
}*/
//首页静态化
/*String url=String.format("%s?%s", request.getRequestURL(),request.getQueryString());
String key =CommomEncrypt.MD5(url);
String filename=key.concat(".html");
System.out.println(url);
ModelAndView av =new ModelAndView();
av.addObject("page", request.getParameter("page"));
if (!tsu.existsCache(filename)) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("page", request.getParameter("page"));
map.put(Variable.SESSION_BLOG_WEBSITE.getKey(), request.getSession().getAttribute(Variable.SESSION_BLOG_WEBSITE.getKey()));
String path =new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_INDEX,true).concat(".html");//String.format("/WEB-INF/page/%s.html", new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_INDEX,true));
tsu.crateHTML( map, path, filename);
}
return "cache/"+key;*/
String view=new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_INDEX,true);
ModelAndView av =new ModelAndView(view);
av.addObject("page", request.getParameter("page"));
return av;
}
/**
* 博文目录
* @param request
* @return
*/
@RequestMapping("/article_lis")
public ModelAndView articleLis(HttpServletRequest request,String categoryId){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_ARTICLE_LIS,true));
av.addObject("page", request.getParameter("page"));
av.addObject("categoryId", categoryId);
return av;
}
/**
* 热门标签
* @param request
* @return
*/
@RequestMapping("/lable_lis")
public ModelAndView lableLis(HttpServletRequest request,String labName ){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_LABLE_LIS,true));
av.addObject("page", request.getParameter("page"));
av.addObject("labName",labName);
return av;
}
/**
* 文章时间轴 按年月归档
* @param request
* @return
*/
@RequestMapping("/article_timeline")
public ModelAndView articleTimeline(HttpServletRequest request,Integer page,String date){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_ARTICLE_TIMELINE,true));
av.addObject("page", page);
av.addObject("date", date);
return av;
}
/**
* 书签目录
* @param request
* @param folderId
* @return
*/
@RequestMapping("/bookmark_lis")
public ModelAndView bookmarkLis(HttpServletRequest request,String folderId){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_BOOKMARK_LIS,true));
av.addObject("page", request.getParameter("page"));
av.addObject("folderId", folderId);
return av;
}
//http://51so.info/kingschan/entry/a03e8979-cc61-4922-9ba3-634de32ed50b.html 文章
/**
* 文章详情
* @param request
* @param psw
* @param page
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/entry/*")
public ModelAndView articleInfo(HttpServletRequest request,String psw,Integer page,String model,HttpServletResponse reponse)throws Exception{
ModelAndView av =new ModelAndView();
String url=request.getRequestURI();
String[] s=url.split("/");
String keyword=URLDecoder.decode(s[s.length-1], "utf-8");
if (keyword.endsWith(".html")) {
keyword=keyword.replace(".html", "");
}
BlogUtil blogutil=new BlogUtil(request);
WebSite ws =blogutil.getCurrentFontWebSite();
String userid=blogutil.isLogin()?blogutil.getCurrentUser().getId():"";
int pageindex=null==page?1:page;
String type=null!=model&&model.matches("default|hot|aboutme")?model:"default";
ArticleVo article= article_serv.getArticle(keyword,blogutil.isRobot()?false:true,ws.getId());
if (null!=article) {
if (article.getArticlePrivate()&&!userid.equals(article.getUser().getId())) {
av.setViewName(blogutil.getTemplate(BLOG_SKIN_PAGE.PAGE_MSG,true));
av.addObject("msg", "私密博文禁止访问!");
return av;
}
String dt=article.getArticleUpdatetime();
av.addObject("next", fontBlogServ.getNext(dt, article.getWebsiteid()));
av.addObject("pre", fontBlogServ.getPrevious(dt, article.getWebsiteid()));
if (article.getArticleEditor().equals("markdown")) {
String html=BlogUtil.markDownToHtml(article.getArticleContent());
article.setArticleContent(html);
}
List<String> nav_title = new ArrayList<String>();
String _html=article.getArticleEditor().equals("markdown")?article.getArticleContent():Jsoup.clean(article.getArticleContent(),Whitelist.relaxed());
Document doc = Jsoup.parse(_html);
Elements h= doc.select("h1,h2,h3,h4,h5");
//markdown <h1><a href="#标题1" name="标题1"></a>标题1</h1>
if (null!=h&&h.size()>0) {
for (int i = 0; i < h.size(); i++) {
Element ele= h.get(i);
if (ele.text().trim().isEmpty())continue;
if (article.getArticleEditor().equals("markdown")) {
nav_title.add(String.format("<a href=\"#%s\" class=\"article-nav\" %s >%s</a>", ele.child(0).attr("name"),ele.tagName(),ele.text()));
}else{
ele.attr("id", ele.text());
ele.append(String.format("<a href=\"#%s\" name=\"%s\"></a>",ele.text(),ele.text()));
nav_title.add(String.format("<a href=\"#%s\" class=\"article-nav\" %s>%s</a>", ele.text(),ele.tagName(),ele.text()));
}
}
article.setArticleContent(doc.toString());
}
if (null!=article.getLables()) {
StringBuffer sb = new StringBuffer();
for (LableVo lab : article.getLables()) {
sb.append(" ").append(lab.getLableName());
}
article.setArticleLableStr(sb.toString());
}
av.addObject("nav_title", nav_title);
Pagination p =fontBlogServ.getArticleDiscuss(pageindex, 10, ws.getId(), article.getId(), type,userid);
av.addObject("article_comment_lis", p.getData());
av.addObject("page", p);
//是否已经喜欢了这篇文章
if (StringUtils.isNotEmpty(userid)) {
boolean overLike=null==article_serv.getArticleLike(userid, article.getId())?false:true;
av.addObject("like",overLike);
}
}
av.addObject("keyword",keyword );
av.addObject("article",article);
av.addObject("model",type);
if (null==article) {
reponse.sendError(404, "not found .");
return null;
}else if (null!=article&&null!=article.getArticlePassword()&&!article.getArticlePassword().isEmpty()) {
//登录了
if (blogutil.isLogin()&&blogutil.getCurrentUser().getId().equals(article.getUser().getId())) {
av.setViewName(blogutil.getTemplate(BLOG_SKIN_PAGE.PAGE_ARTICLE_INFO,true));
}else if ((null!=request.getSession().getAttribute(article.getId()))|| (null!=psw&&article.getArticlePassword().equals(psw))) {
//有输入密码
av.setViewName(blogutil.getTemplate(BLOG_SKIN_PAGE.PAGE_ARTICLE_INFO,true));
request.getSession().setAttribute(article.getId(), "");
}else{
if (null!=psw) {
av.addObject("msg","密码错误!" );
}
av.setViewName(blogutil.getTemplate(BLOG_SKIN_PAGE.PAGE_ARTICLE_PSW,true));
}
}else{
av.setViewName(blogutil.getTemplate(BLOG_SKIN_PAGE.PAGE_ARTICLE_INFO,true));
}
return av;
}
/**
* 标签
* @param request
* @return
*/
//http://51so.info/kingschan/tags/java
@RequestMapping("/tags/*")
public ModelAndView tag(HttpServletRequest request){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_INDEX,true));
String url=request.getRequestURI();
av.addObject("url", url);
av.addObject("page", request.getParameter("page"));
String[] s=url.split("/");
try {
String keyword=URLDecoder.decode(s[s.length-1], "utf-8");
av.addObject("tag",keyword );
} catch (Exception e) {
e.printStackTrace();
}
return av;
}
/**
*文章类型
* @param request
* @return
*/
//http://51so.info/kingschan/category/数据库
@RequestMapping("/category/*")
public ModelAndView category(HttpServletRequest request){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_INDEX,true));
String url=request.getRequestURI();
av.addObject("url", url);
av.addObject("page", request.getParameter("page"));
String[] s=url.split("/");
try {
String category=URLDecoder.decode(s[s.length-1], "utf-8");
av.addObject("category", category);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return av;
}
/**
* 网站地图
* @param request
* @return
*/
@RequestMapping("/sitemap.xml")
public ModelAndView sitemap(HttpServletRequest request){
ModelAndView av =new ModelAndView("/font/sitemap");
String url=request.getRequestURI();
av.addObject("url", url);
return av;
}
//http://51so.info/kingschan/date/20160216 日期
/**
* 日期
* @param request
* @return
*/
@RequestMapping("/date/{date}")
public ModelAndView date(@PathVariable String date,HttpServletRequest request,HttpServletResponse reponse){
if (!date.matches("\\d{6,8}")) {
try {
reponse.sendError(404, "not found .");
return null;
} catch (IOException e) {
e.printStackTrace();
}
}
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_INDEX,true));
av.addObject("page", request.getParameter("page"));
av.addObject("date", date);
return av;
}
/**
* 全文检索
* @param request
* @return
*/
@RequestMapping("/query")
public ModelAndView query(HttpServletRequest request,String q){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_INDEX,true));
av.addObject("page", request.getParameter("page"));
try {
if (null!=q&&!q.isEmpty()) {
String kw=BlogUtil.filterXss(q);
av.addObject("fulltext",kw);
av.addObject("keyword",q);
}
} catch (Exception e) {
e.printStackTrace();
}
return av;
}
/**
* 博客时间轴
* @param request
* @param page
* @return
*/
@RequestMapping("/blog-timeline")
public ModelAndView blogTimeline(HttpServletRequest request,String page){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_TIMELINE,true));
try {
BlogUtil bu = new BlogUtil(request);
String userid=bu.getCurrentFontWebSite().getUser().getId();
int _page=null!=page&&page.matches("\\d+")?Integer.valueOf(page):1;
Pagination p= pubBlogServ.blogTimeLine(30, _page, userid,bu.getCurrentFontWebSite().getWebsiteName());
av.addObject("page", p);
} catch (Exception e) {
e.printStackTrace();
}
return av;
}
/**
* 留言板
* @param request
* @param page
* @return
*/
@RequestMapping("/blog-msgboard")
public ModelAndView blogMsgBoard(HttpServletRequest request,String page){
ModelAndView av =new ModelAndView(new BlogUtil(request).getTemplate(BLOG_SKIN_PAGE.PAGE_MSG_BOARD,true));
try {
BlogUtil bu = new BlogUtil(request);
// String userid=bu.getCurrentFontWebSite().getUser().getId();
int _page=null!=page&&page.matches("\\d+")?Integer.valueOf(page):1;
Pagination p= pubBlogServ.blogMsgBoard(6, _page, bu.getCurrentFontWebSite().getId());
av.addObject("page", p);
} catch (Exception e) {
e.printStackTrace();
}
return av;
}
}