diff --git a/pom.xml b/pom.xml index e4baf30f..512f2f21 100644 --- a/pom.xml +++ b/pom.xml @@ -220,11 +220,12 @@ 1.2.3 + - org.kohsuke.redstone - redstone - 1.1.1 - + org.kohsuke.redstone + redstone + 1.1.1 + diff --git a/src/main/java/com/zblog/biz/CommentManager.java b/src/main/java/com/zblog/biz/CommentManager.java new file mode 100644 index 00000000..2c37fcb2 --- /dev/null +++ b/src/main/java/com/zblog/biz/CommentManager.java @@ -0,0 +1,52 @@ +package com.zblog.biz; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import com.zblog.core.plugin.MapContainer; +import com.zblog.core.plugin.TreeUtils; +import com.zblog.core.util.constants.CommentConstants; +import com.zblog.service.CommentService; +import com.zblog.service.PostService; + +@Component +public class CommentManager{ + @Autowired + private CommentService commentService; + @Autowired + private PostService postService; + + public List getAsTree(String postid, String creator){ + List list = commentService.listByPost(postid, creator); + TreeUtils.rebuildTree(list); + + return list; + } + + /** + * 更改评论状态,同时更改该评论对应的post的评论数 + * + * @param commentid + * @param newStatus + */ + @Transactional + public void setStatus(String commentid, String newStatus){ + commentService.setStatus(commentid, newStatus); + postService.addCcount(commentid, CommentConstants.TYPE_APPROVE.equals(newStatus) ? 1 : -1); + } + + /** + * 删除评论,同时删除对应文章的评论数 + * + * @param commentid + */ + @Transactional + public void deleteComment(String commentid){ + commentService.deleteById(commentid); + postService.addCcount(commentid, -1); + } + +} diff --git a/src/main/java/com/zblog/biz/MetaWeblogManager.java b/src/main/java/com/zblog/biz/MetaWeblogManager.java index fb24f2c0..f0b4923e 100644 --- a/src/main/java/com/zblog/biz/MetaWeblogManager.java +++ b/src/main/java/com/zblog/biz/MetaWeblogManager.java @@ -15,7 +15,6 @@ import redstone.xmlrpc.XmlRpcException; import redstone.xmlrpc.XmlRpcStruct; -import com.zblog.core.dal.entity.Category; import com.zblog.core.dal.entity.Post; import com.zblog.core.dal.entity.Upload; import com.zblog.core.dal.entity.User; @@ -182,17 +181,15 @@ public Object getRecentPosts(String blogid, String username, String pwd, int num if(user == null) loginError(); - List list = postService.listRecent(numberOfPosts); + List list = postManager.listRecent(numberOfPosts); MapContainer[] result = new MapContainer[list.size()]; for(int i = 0; i < list.size(); i++){ MapContainer temp = list.get(i); - Category category = categoryService.loadById(temp.getAsString("categoryid")); result[i] = new MapContainer("dateCreated", temp.getAsDate("createTime")) - .put("userid", temp.getAsString("creator")).put("postid", temp.getAsString("id")).put("description", "") - .put("title", temp.getAsString("title")).put("link", toLink("/posts/" + temp.get("id"))) - .put("permaLink", toLink("/posts/" + temp.get("id"))).put("categories", Arrays.asList(category.getName())) - .put("post_status", "publish"); - ; + .put("userid", temp.getAsString("creator")).put("postid", temp.getAsString("id")) + .put("description", temp.getAsString("content")).put("title", temp.getAsString("title")) + .put("link", toLink("/posts/" + temp.get("id"))).put("permaLink", toLink("/posts/" + temp.get("id"))) + .put("categories", Arrays.asList(temp.getAsString("categoryName"))).put("post_status", "publish"); } return result; } diff --git a/src/main/java/com/zblog/biz/PostManager.java b/src/main/java/com/zblog/biz/PostManager.java index ffb3f09f..933a76ce 100644 --- a/src/main/java/com/zblog/biz/PostManager.java +++ b/src/main/java/com/zblog/biz/PostManager.java @@ -10,8 +10,10 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import com.zblog.biz.aop.PostIndexManager; import com.zblog.core.dal.entity.Post; import com.zblog.core.plugin.MapContainer; +import com.zblog.core.plugin.PageModel; import com.zblog.core.util.CollectionUtils; import com.zblog.core.util.JsoupUtils; import com.zblog.core.util.constants.PostConstants; @@ -28,6 +30,8 @@ public class PostManager{ private UploadService uploadService; @Autowired private OptionsService optionsService; + @Autowired + private PostIndexManager postIndexManager; /** * 插入文章,同时更新上传文件的postid @@ -106,6 +110,28 @@ public Collection listPageAsTree(){ return tree; } + public List listRecent(int nums){ + List list = postService.listRecent(nums); + List result = new ArrayList<>(list.size()); + for(String id : list){ + result.add(postService.loadReadById(id)); + } + + return result; + } + + public PageModel search(String word, int pageIndex){ + PageModel page = postIndexManager.search(word, pageIndex); + /* 填充其他属性,更好的做法是:搜索结果只包含对象id,详细资料到数据库查询(缓存) */ + for(MapContainer mc : page.getContent()){ + MapContainer all = postService.loadReadById(mc.getAsString("id")); + mc.put("createTime", all.get("createTime")).put("nickName", all.get("nickName")) + .put("rcount", all.get("rcount")); + } + + return page; + } + /** * 去掉图片中src地址的http域名前缀 * diff --git a/src/main/java/com/zblog/biz/VisitStatManager.java b/src/main/java/com/zblog/biz/VisitStatManager.java new file mode 100644 index 00000000..f15d2c1a --- /dev/null +++ b/src/main/java/com/zblog/biz/VisitStatManager.java @@ -0,0 +1,47 @@ +package com.zblog.biz; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.zblog.service.PostService; + +/** + * 文章的访问统计 + * + * @author zhou + * + */ +@Component +public class VisitStatManager{ + private static final Logger logger = LoggerFactory.getLogger(VisitStatManager.class); + @Autowired + private PostService postService; + private ConcurrentMap visit = new ConcurrentHashMap<>(); + + public void flush(){ + ConcurrentMap copy = visit; + visit = new ConcurrentHashMap(); + if(!copy.isEmpty()){ + logger.debug("flush visit stat to database"); + } + + for(Map.Entry entry : copy.entrySet()){ + postService.addRcount(entry.getKey(), entry.getValue()); + } + copy.clear(); + copy = null; + } + + public void record(String postid){ + Integer count = visit.get(postid); + /* 该数据,并发问题忽略 */ + visit.put(postid, count == null ? 1 : count + 1); + } + +} diff --git a/src/main/java/com/zblog/biz/aop/PostIndexManager.java b/src/main/java/com/zblog/biz/aop/PostIndexManager.java index 7477b117..5fbd06a5 100644 --- a/src/main/java/com/zblog/biz/aop/PostIndexManager.java +++ b/src/main/java/com/zblog/biz/aop/PostIndexManager.java @@ -5,18 +5,15 @@ import org.apache.lucene.index.Term; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.zblog.core.dal.entity.Post; import com.zblog.core.lucene.LuceneUtils; import com.zblog.core.lucene.QueryBuilder; import com.zblog.core.lucene.SearchEnginer; -import com.zblog.core.plugin.MapContainer; import com.zblog.core.plugin.PageModel; import com.zblog.core.util.JsoupUtils; import com.zblog.core.util.constants.PostConstants; -import com.zblog.service.PostService; /** * 文章Lucene索引管理器 @@ -27,8 +24,6 @@ @Component public class PostIndexManager{ private static final Logger logger = LoggerFactory.getLogger(PostIndexManager.class); - @Autowired - private PostService postService; /** * 只有添加文章才插入Lucene索引 @@ -61,12 +56,8 @@ public PageModel search(String word, int pageIndex){ PageModel result = new PageModel(pageIndex, 15); QueryBuilder builder = new QueryBuilder(SearchEnginer.postEnginer().getAnalyzer()); builder.addShould("title", word).addShould("excerpt", word); + builder.addLighter("title","excerpt"); SearchEnginer.postEnginer().searchHighlight(builder, result); - /* 填充其他属性 */ - for(MapContainer mc : result.getContent()){ - MapContainer all = postService.loadReadById(mc.getAsString("id")); - mc.put("createTime", all.get("createTime")).put("nickName", all.get("nickName")).put("rcount", all.get("rcount")); - } return result; } @@ -77,7 +68,6 @@ private Document convert(Post post){ doc.add(new Field("title", post.getTitle(), LuceneUtils.searchType())); /* 用jsoup剔除html标签 */ doc.add(new Field("excerpt", JsoupUtils.plainText(post.getContent()), LuceneUtils.searchType())); - doc.add(new Field("creator", post.getCreator(), LuceneUtils.storeType())); // doc.add(new LongField("createTime", post.getCreateTime().getTime(), // LuceneUtils.storeType())); return doc; diff --git a/src/main/java/com/zblog/biz/aop/StaticTemplate.java b/src/main/java/com/zblog/biz/aop/StaticTemplate.java index c339e847..33b5a429 100644 --- a/src/main/java/com/zblog/biz/aop/StaticTemplate.java +++ b/src/main/java/com/zblog/biz/aop/StaticTemplate.java @@ -1,7 +1,14 @@ package com.zblog.biz.aop; import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import org.apache.commons.io.IOUtils; +import org.jsoup.Jsoup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -10,6 +17,7 @@ import com.zblog.biz.PostManager; import com.zblog.core.dal.entity.Post; import com.zblog.core.plugin.MapContainer; +import com.zblog.core.util.constants.Constants; import com.zblog.core.util.constants.PostConstants; import com.zblog.core.util.constants.WebConstants; import com.zblog.service.CategoryService; @@ -35,6 +43,23 @@ public class StaticTemplate{ @Autowired private LinkService linksService; + public boolean staticIndex(String url, File file){ + boolean result = true; + Writer writer = null; + try{ + String text = Jsoup.connect(url).execute().body(); + writer = new OutputStreamWriter(new FileOutputStream(file), Charset.forName(Constants.ENCODING_UTF_8)); + IOUtils.write(text, writer); + }catch(IOException e){ + logger.error("staticIndex error-->" + url, e); + result = true; + }finally{ + IOUtils.closeQuietly(writer); + } + + return result; + } + /** * 静态化导航栏 */ diff --git a/src/main/java/com/zblog/core/dal/mapper/CommentMapper.java b/src/main/java/com/zblog/core/dal/mapper/CommentMapper.java index 83309407..3c68adcc 100644 --- a/src/main/java/com/zblog/core/dal/mapper/CommentMapper.java +++ b/src/main/java/com/zblog/core/dal/mapper/CommentMapper.java @@ -9,6 +9,8 @@ public interface CommentMapper extends BaseMapper{ List listRecent(); + + public List listCountByGroupStatus(); /** * 根据postid获取被批准的评论和指定creator的评论 @@ -24,6 +26,6 @@ public interface CommentMapper extends BaseMapper{ * * @param commentid */ - void setStutas(@Param("commentid")String commentid, @Param("status")String status); + void setStatus(@Param("commentid")String commentid, @Param("status")String status); } diff --git a/src/main/java/com/zblog/core/dal/mapper/PostMapper.java b/src/main/java/com/zblog/core/dal/mapper/PostMapper.java index 0a52bdac..d27a4892 100644 --- a/src/main/java/com/zblog/core/dal/mapper/PostMapper.java +++ b/src/main/java/com/zblog/core/dal/mapper/PostMapper.java @@ -9,7 +9,7 @@ import com.zblog.core.plugin.PageModel; public interface PostMapper extends BaseMapper{ - + public MapContainer loadReadById(String postid); /** @@ -36,14 +36,16 @@ public interface PostMapper extends BaseMapper{ */ List listPage(boolean onlyParent); + public void addRcount(@Param("postid") String postid, @Param("count") int count); + + public void addCcount(@Param("commentid") String commentid, @Param("count") int count); + /** * 获取最近发表文章 * - * @return + * @return 文章id */ - List listRecent(int nums); - - List listRss(); + List listRecent(int nums); List listByCategory(PageModel model); diff --git a/src/main/java/com/zblog/core/dal/mybatis/CommentMapper.xml b/src/main/java/com/zblog/core/dal/mybatis/CommentMapper.xml index c591e3f6..edec1929 100644 --- a/src/main/java/com/zblog/core/dal/mybatis/CommentMapper.xml +++ b/src/main/java/com/zblog/core/dal/mybatis/CommentMapper.xml @@ -9,11 +9,15 @@ + + @@ -25,30 +25,24 @@ - + select id from post where type='post' order by createTime desc limit #{nums} - - - + select p.id, p.title, p.excerpt, p.creator, p.rcount, u.nickName, p.createTime from post p inner join category c on p.categoryid=c.id left join user u on p.creator=u.id - where c.name=#{query.categoryName} and p.type=#{query.type} order by p.createTime desc + where c.name=#{query.categoryName} and p.type='post' order by p.createTime desc @@ -67,6 +61,14 @@ #{item} + + + update post set rcount=rcount+#{count} where id=#{postid} + + + + update post set ccount=ccount+#{count} where id = (select postid from comment where id=#{commentid}) + delete from post where id = #{id} diff --git a/src/main/java/com/zblog/core/feed/ArticleAdapter.java b/src/main/java/com/zblog/core/feed/ArticleAdapter.java index 3dd0d864..ce4bbfd6 100644 --- a/src/main/java/com/zblog/core/feed/ArticleAdapter.java +++ b/src/main/java/com/zblog/core/feed/ArticleAdapter.java @@ -34,7 +34,7 @@ public String getAuthor(){ @Override public String getDescription(){ - return post.getAsString("excerpt"); + return post.getAsString("content"); } @Override diff --git a/src/main/java/com/zblog/core/feed/RssFeedWriter.java b/src/main/java/com/zblog/core/feed/RssFeedWriter.java index 5d5e2beb..abaf2448 100644 --- a/src/main/java/com/zblog/core/feed/RssFeedWriter.java +++ b/src/main/java/com/zblog/core/feed/RssFeedWriter.java @@ -30,6 +30,7 @@ public static void write(Channel channel, OutputStream out) throws XMLStreamExce writer.writeStartElement("rss"); writer.writeAttribute("version", "2.0"); + writer.writeNamespace("content", "http://purl.org/rss/1.0/modules/content/"); writer.writeStartElement("channel"); @@ -53,9 +54,11 @@ public static void write(Channel channel, OutputStream out) throws XMLStreamExce createNode(writer, "link", channel.getDomain() + article.getLink()); createNode(writer, "category", article.getCategory()); createNode(writer, "author", article.getAuthor()); - createNode(writer, "description", article.getDescription()); + createNode(writer, "description", ""); + createNode(writer, "content", "http://purl.org/rss/1.0/modules/content/", "encoded", article.getDescription()); createNode(writer, "pubDate", format.format(article.getPubDate())); createNode(writer, "guid", channel.getDomain() + article.getGuid()); + createNode(writer, "comments", channel.getDomain() + article.getGuid() + "#comments"); writer.writeEndElement(); } @@ -76,4 +79,11 @@ private static void createNode(XMLStreamWriter writer, String name, String value writer.writeEndElement(); } + private static void createNode(XMLStreamWriter writer, String prefix, String namespace, String name, String value) + throws XMLStreamException{ + writer.writeStartElement(prefix, name, namespace); + writer.writeCData(value); + writer.writeEndElement(); + } + } diff --git a/src/main/java/com/zblog/core/filter/LoginFilter.java b/src/main/java/com/zblog/core/filter/LoginFilter.java index 4789d210..3040ae53 100644 --- a/src/main/java/com/zblog/core/filter/LoginFilter.java +++ b/src/main/java/com/zblog/core/filter/LoginFilter.java @@ -47,6 +47,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse filterChain.doFilter(request, response); }catch(Exception e){ if(ServletUtils.isAjax(request)){ + logger.error("error happend", e); response.setContentType("application/json"); response.setCharacterEncoding(Constants.ENCODING_UTF_8); response.getWriter().write("{'status':'500','success':false,'msg':'操作失败,服务端出错'}"); diff --git a/src/main/java/com/zblog/core/plugin/BeanPropertyUtils.java b/src/main/java/com/zblog/core/plugin/BeanPropertyUtils.java index f62dbc65..7b7955cd 100644 --- a/src/main/java/com/zblog/core/plugin/BeanPropertyUtils.java +++ b/src/main/java/com/zblog/core/plugin/BeanPropertyUtils.java @@ -22,7 +22,7 @@ public static Object getFieldValue(Object obj, String fieldName){ } } }catch(Exception e){ - logger.warn("can't get field " + fieldName + " value in class " + obj); + logger.debug("can't get field " + fieldName + " value in class " + obj); } return value; @@ -38,7 +38,7 @@ public static Field getFieldByFieldName(Object obj, String fieldName){ try{ return superClass.getDeclaredField(fieldName); }catch(Exception e){ - logger.warn("can't found field " + fieldName + " in class " + logger.debug("can't found field " + fieldName + " in class " + obj.getClass()); } } diff --git a/src/main/java/com/zblog/core/plugin/TreeUtils.java b/src/main/java/com/zblog/core/plugin/TreeUtils.java index 3e5c74a2..211b2032 100644 --- a/src/main/java/com/zblog/core/plugin/TreeUtils.java +++ b/src/main/java/com/zblog/core/plugin/TreeUtils.java @@ -1,7 +1,10 @@ package com.zblog.core.plugin; +import java.util.Iterator; import java.util.List; +import com.zblog.core.util.StringUtils; + public class TreeUtils{ private TreeUtils(){ @@ -46,4 +49,70 @@ private static MapContainer getLastParentByLevel(MapContainer mc, int currentlev return current; } + public static void rebuildTree(List list){ + /* 原理就是把list中parent不为Root的元素全删除 */ + while(!solve(list)){ + Iterator it = list.iterator(); + while(it.hasNext()){ + MapContainer item = it.next(); + if(!hasChild(list, item.getAsString("id"))){ + if(!StringUtils.isBlank(item.getAsString("parent"))){ + MapContainer parent = getParent(list, item); + /* 有可能该条评论的parent以前被批准后又被驳回/删除 */ + if(parent != null){ + it.remove(); + parent.getAsList("children", MapContainer.class).add(item); + } + } + } + } + } + } + + /** + * 指定id是否有子节点 + * + * @param list + * @param id + * @return + */ + private static boolean hasChild(List list, String id){ + for(MapContainer mc : list){ + if(id.equals(mc.get("parent"))) + return true; + } + return false; + } + + /** + * 获取item的父节点 + * + * @param list + * @param item + * @return + */ + private static MapContainer getParent(List list, MapContainer item){ + for(MapContainer mc : list){ + if(item.getAsString("parent").equals(mc.get("id"))) + return mc; + } + + return null; + } + + /** + * 如果在当前所有顶级节点中没有任何一个有子节点,就意味着森林构建成功 + * + * @param list + * @return + */ + private static boolean solve(List list){ + for(MapContainer mc : list){ + if(hasChild(list, mc.getAsString("id"))) + return false; + } + + return true; + } + } diff --git a/src/main/java/com/zblog/core/util/constants/CommentConstants.java b/src/main/java/com/zblog/core/util/constants/CommentConstants.java index 0998d957..1c476880 100644 --- a/src/main/java/com/zblog/core/util/constants/CommentConstants.java +++ b/src/main/java/com/zblog/core/util/constants/CommentConstants.java @@ -9,5 +9,4 @@ private CommentConstants(){ public static final String TYPE_APPROVE = "approve"; public static final String TYPE_REJECT = "reject"; public static final String TYPE_TRASH = "trash"; - } diff --git a/src/main/java/com/zblog/service/CommentService.java b/src/main/java/com/zblog/service/CommentService.java index 2bfe1c7b..749ceab8 100644 --- a/src/main/java/com/zblog/service/CommentService.java +++ b/src/main/java/com/zblog/service/CommentService.java @@ -32,6 +32,21 @@ public PageModel listByStatus(int pageIndex, int pageSize, Collection st return page; } + /** + * 获取各种状态评论的总数 + * + * @return + */ + public MapContainer listCountByGroupStatus(){ + List list = commentMapper.listCountByGroupStatus(); + MapContainer mc = new MapContainer(); + for(MapContainer temp : list){ + mc.put(temp.getAsString("status"), temp.get("count")); + } + + return mc; + } + /** * 最近留言 * @@ -42,7 +57,7 @@ public List listRecent(){ } /** - * 根据postid获取被批准的评论和指定creator的评论 + * 根据postid获取被批准的评论+指定creator的评论 * * @param postid * @param creator @@ -51,9 +66,9 @@ public List listRecent(){ public List listByPost(String postid, String creator){ return commentMapper.listByPost(postid, creator); } - - public void setStutas(String commentid, String newStatus){ - commentMapper.setStutas(commentid, newStatus); + + public void setStatus(String commentid, String newStatus){ + commentMapper.setStatus(commentid, newStatus); } @Override diff --git a/src/main/java/com/zblog/service/PostService.java b/src/main/java/com/zblog/service/PostService.java index 1edeb9be..93b8016a 100644 --- a/src/main/java/com/zblog/service/PostService.java +++ b/src/main/java/com/zblog/service/PostService.java @@ -16,7 +16,7 @@ public class PostService extends BaseService{ @Autowired private PostMapper postMapper; - + public MapContainer loadReadById(String postid){ return postMapper.loadReadById(postid); } @@ -38,21 +38,36 @@ public PageModel listPost(int pageIndex, int pageSize){ return page; } - public List listRecent(int nums){ - return postMapper.listRecent(nums); + /** + * 更改阅读数 + * + * @param postid + * @param count + */ + public void addRcount(String postid, int count){ + postMapper.addRcount(postid, count); } - public List listRss(){ - return postMapper.listRss(); + /** + * 更改评论数 + * + * @param commentid + * @param count + */ + public void addCcount(String commentid, int count){ + postMapper.addCcount(commentid, count); + } + + public List listRecent(int nums){ + return postMapper.listRecent(nums); } public PageModel listByCategory(String categoryName, int pageIndex, int pageSize){ PageModel page = new PageModel(pageIndex, pageSize); - page.insertQuery("type", PostConstants.TYPE_POST); page.insertQuery("categoryName", categoryName); List content = postMapper.listByCategory(page); page.setContent(content); - page.removeQuery("type"); + page.removeQuery("categoryName"); return page; } diff --git a/src/main/java/com/zblog/service/freemarker/FreeMarkerUtils.java b/src/main/java/com/zblog/service/freemarker/FreeMarkerUtils.java index 5dc1015a..b70e54ed 100644 --- a/src/main/java/com/zblog/service/freemarker/FreeMarkerUtils.java +++ b/src/main/java/com/zblog/service/freemarker/FreeMarkerUtils.java @@ -25,6 +25,8 @@ public class FreeMarkerUtils{ config = new Configuration(); config.setCacheStorage(new NullCacheStorage()); config.setAutoFlush(false); + /* 不产生指令造成的空白行 */ + config.setWhitespaceStripping(true); config.setOutputEncoding(Constants.ENCODING_UTF_8); URL uri = FreeMarkerUtils.class.getResource("ftl"); config.setDirectoryForTemplateLoading(new File(uri.toURI())); diff --git a/src/main/java/com/zblog/web/backend/controller/BackendController.java b/src/main/java/com/zblog/web/backend/controller/BackendController.java index e3f83afe..ce9e1876 100644 --- a/src/main/java/com/zblog/web/backend/controller/BackendController.java +++ b/src/main/java/com/zblog/web/backend/controller/BackendController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import com.zblog.biz.PostManager; import com.zblog.core.dal.entity.User; import com.zblog.core.filter.CookieRemberManager; import com.zblog.core.plugin.MapContainer; @@ -20,7 +21,6 @@ import com.zblog.core.util.constants.Constants; import com.zblog.core.util.web.WebContextFactory; import com.zblog.service.CommentService; -import com.zblog.service.PostService; import com.zblog.service.UserService; import com.zblog.service.shiro.StatelessToken; import com.zblog.web.backend.form.LoginForm; @@ -32,7 +32,7 @@ public class BackendController{ @Autowired private UserService userService; @Autowired - private PostService postService; + private PostManager postManager; @Autowired private CommentService commentService; @@ -43,7 +43,7 @@ public String index(Model model){ model.addAttribute("javaVersion", System.getProperty("java.version")); model.addAttribute("memory", Runtime.getRuntime().totalMemory() / 1024 / 1024); - model.addAttribute("posts", postService.listRecent(10)); + model.addAttribute("posts", postManager.listRecent(10)); model.addAttribute("comments", commentService.listRecent()); return "backend/index"; } diff --git a/src/main/java/com/zblog/web/backend/controller/CommentController.java b/src/main/java/com/zblog/web/backend/controller/CommentController.java index c309c4ff..27b3f660 100644 --- a/src/main/java/com/zblog/web/backend/controller/CommentController.java +++ b/src/main/java/com/zblog/web/backend/controller/CommentController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import com.zblog.biz.CommentManager; import com.zblog.core.plugin.MapContainer; import com.zblog.core.plugin.PageModel; import com.zblog.core.util.constants.CommentConstants; @@ -24,6 +25,8 @@ public class CommentController{ @Autowired private CommentService commentService; + @Autowired + private CommentManager commentManager; @RequestMapping(method = RequestMethod.GET) public String index(@RequestParam(value = "page", defaultValue = "1") int page, @@ -33,26 +36,28 @@ public String index(@RequestParam(value = "page", defaultValue = "1") int page, PageModel pageModel = commentService.listByStatus(page, 15, status); model.addAttribute("page", pageModel); model.addAttribute("type", type); + model.addAttribute("stat", commentService.listCountByGroupStatus()); return "backend/comment/list"; } @ResponseBody @RequestMapping(value = "/{commentid}", method = RequestMethod.DELETE) public Object remove(@PathVariable("commentid") String commentid){ - commentService.deleteById(commentid); + commentManager.deleteComment(commentid); return new MapContainer("success", true); } /** - * 批准留言 + * 修改评论状态 * * @param commentid + * @param status * @return */ @ResponseBody @RequestMapping(value = "/{commentid}", method = RequestMethod.PUT) - public Object approve(@PathVariable("commentid") String commentid){ - commentService.setStutas(commentid, CommentConstants.TYPE_APPROVE); + public Object approve(@PathVariable("commentid") String commentid, String status){ + commentManager.setStatus(commentid, status); return new MapContainer("success", true); } diff --git a/src/main/java/com/zblog/web/front/controller/CommentController.java b/src/main/java/com/zblog/web/front/controller/CommentController.java index ccb394f3..c5b2d758 100644 --- a/src/main/java/com/zblog/web/front/controller/CommentController.java +++ b/src/main/java/com/zblog/web/front/controller/CommentController.java @@ -15,6 +15,7 @@ import com.zblog.core.util.JsoupUtils; import com.zblog.core.util.ServletUtils; import com.zblog.core.util.StringUtils; +import com.zblog.core.util.constants.WebConstants; import com.zblog.service.CommentService; import com.zblog.web.front.validator.CommentValidator; @@ -26,6 +27,9 @@ public class CommentController{ @RequestMapping(method = RequestMethod.POST) public String post(Comment comment, HttpServletRequest request, HttpServletResponse response){ + if(!WebConstants.ALLOW_COMMENT) + return "redirect:/posts/" + comment.getPostid(); + CookieUtil cookieUtil = new CookieUtil(request, response); if(StringUtils.isBlank(comment.getCreator())){ comment.setCreator(cookieUtil.getCookie("comment_author")); @@ -34,9 +38,12 @@ public String post(Comment comment, HttpServletRequest request, HttpServletRespo } if(!CommentValidator.validate(comment).isEmpty()){ - return "redirect:/posts/"+comment.getPostid(); + return "redirect:/posts/" + comment.getPostid(); } + if(StringUtils.isBlank(comment.getParent())) + comment.setParent(null); + /* 根据RFC-2109中的规定,在Cookie中只能包含ASCII的编码 */ cookieUtil.setCookie("comment_author", comment.getCreator(), "/", false, 365 * 24 * 3600, true); cookieUtil.setCookie("comment_author_email", comment.getEmail(), "/", false, 365 * 24 * 3600, false); @@ -49,7 +56,7 @@ public String post(Comment comment, HttpServletRequest request, HttpServletRespo String content = HtmlUtils.htmlUnescape(comment.getContent()); comment.setContent(JsoupUtils.simpleText(content)); commentService.insert(comment); - return "redirect:/posts/"+comment.getPostid(); + return "redirect:/posts/" + comment.getPostid(); } - + } diff --git a/src/main/java/com/zblog/web/front/controller/IndexController.java b/src/main/java/com/zblog/web/front/controller/IndexController.java index 97f418fe..61889fe7 100644 --- a/src/main/java/com/zblog/web/front/controller/IndexController.java +++ b/src/main/java/com/zblog/web/front/controller/IndexController.java @@ -1,5 +1,6 @@ package com.zblog.web.front.controller; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -11,13 +12,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; -import com.zblog.biz.aop.PostIndexManager; -import com.zblog.core.dal.entity.Option; +import com.zblog.biz.PostManager; +import com.zblog.biz.aop.StaticTemplate; import com.zblog.core.feed.ArticleAdapter; import com.zblog.core.feed.Channel; import com.zblog.core.feed.Channel.Article; @@ -26,6 +26,7 @@ import com.zblog.core.util.ServletUtils; import com.zblog.core.util.StringUtils; import com.zblog.core.util.constants.WebConstants; +import com.zblog.core.util.web.ServletRequestReader; import com.zblog.service.PostService; @Controller @@ -33,16 +34,19 @@ public class IndexController{ @Autowired private PostService postService; @Autowired - private PostIndexManager postIndexManager; + private PostManager postManager; + @Autowired + private StaticTemplate staticTemplate; @RequestMapping(value = "/", method = RequestMethod.GET) public String index(@RequestParam(value = "page", defaultValue = "1") int page, String word, Model model){ if(!StringUtils.isBlank(word)){ - model.addAttribute("page", postIndexManager.search(word, page)); + model.addAttribute("page", postManager.search(word, page)); model.addAttribute(WebConstants.PRE_TITLE_KEY, word); }else{ model.addAttribute("page", postService.listPost(page, 10)); } + return "index"; } @@ -50,12 +54,12 @@ public String index(@RequestParam(value = "page", defaultValue = "1") int page, public void rss(HttpServletRequest request, HttpServletResponse response) throws IOException{ Channel channel = new Channel(); channel.setDomain(ServletUtils.getDomain(request)); - channel.setLogoUrl(channel.getDomain()+"/resource/img/logo.png"); + channel.setLogoUrl(channel.getDomain() + "/resource/img/logo.png"); channel.setTitle(WebConstants.TITLE); channel.setDescription(WebConstants.DESCRIPTION); - + List
items = new ArrayList<>(); - for(MapContainer mc : postService.listRss()){ + for(MapContainer mc : postManager.listRecent(10)){ items.add(new ArticleAdapter(mc)); } channel.setItems(items); @@ -67,10 +71,11 @@ public void rss(HttpServletRequest request, HttpServletResponse response) throws } } - @RequestMapping("/init.json") - public void init(@ModelAttribute Option option){ - option.setName("此为测试页"); - option.setValue("hello"); + @RequestMapping("/restatic.json") + public void restatic(HttpServletRequest request){ + /* 静态化首页 */ + ServletRequestReader reader = new ServletRequestReader(request); + staticTemplate.staticIndex(reader.getDomain(), new File(reader.getRealPath("/"), "index.html")); } } diff --git a/src/main/java/com/zblog/web/front/controller/PageController.java b/src/main/java/com/zblog/web/front/controller/PageController.java index d3cd9105..24b84da2 100644 --- a/src/main/java/com/zblog/web/front/controller/PageController.java +++ b/src/main/java/com/zblog/web/front/controller/PageController.java @@ -8,10 +8,11 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import com.zblog.biz.CommentManager; +import com.zblog.biz.VisitStatManager; import com.zblog.core.plugin.MapContainer; import com.zblog.core.util.CookieUtil; import com.zblog.core.util.constants.WebConstants; -import com.zblog.service.CommentService; import com.zblog.service.PostService; @Controller @@ -20,18 +21,21 @@ public class PageController{ @Autowired private PostService postService; @Autowired - private CommentService commentService; + private CommentManager commentManager; + @Autowired + private VisitStatManager visitStatManager; @RequestMapping("/{pageid}") public String page(@PathVariable("pageid") String pageid, HttpServletRequest request, Model model){ MapContainer post = postService.loadReadById(pageid); if(post != null){ + visitStatManager.record(pageid); model.addAttribute(WebConstants.PRE_TITLE_KEY, post.getAsString("title")); model.addAttribute("post", post); model.addAttribute("comments", - commentService.listByPost(pageid, new CookieUtil(request, null).getCookie("comment_author"))); + commentManager.getAsTree(pageid, new CookieUtil(request, null).getCookie("comment_author"))); } - + return post != null ? "post" : "404"; } diff --git a/src/main/java/com/zblog/web/front/controller/PostController.java b/src/main/java/com/zblog/web/front/controller/PostController.java index e6562544..6b3839b5 100644 --- a/src/main/java/com/zblog/web/front/controller/PostController.java +++ b/src/main/java/com/zblog/web/front/controller/PostController.java @@ -9,10 +9,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import com.zblog.biz.CommentManager; +import com.zblog.biz.VisitStatManager; import com.zblog.core.plugin.MapContainer; import com.zblog.core.util.CookieUtil; import com.zblog.core.util.constants.WebConstants; -import com.zblog.service.CommentService; import com.zblog.service.PostService; @Controller @@ -21,16 +22,19 @@ public class PostController{ @Autowired private PostService postService; @Autowired - private CommentService commentService; + private CommentManager commentManager; + @Autowired + private VisitStatManager visitStatManager; @RequestMapping(value = "/{postid}", method = RequestMethod.GET) public String post(@PathVariable("postid") String id, HttpServletRequest request, Model model){ MapContainer post = postService.loadReadById(id); if(post != null){ + visitStatManager.record(id); model.addAttribute(WebConstants.PRE_TITLE_KEY, post.getAsString("title")); model.addAttribute("post", post); model.addAttribute("comments", - commentService.listByPost(id, new CookieUtil(request, null).getCookie("comment_author"))); + commentManager.getAsTree(id, new CookieUtil(request, null).getCookie("comment_author"))); /* 上一篇,下一篇 */ model.addAttribute("next", postService.getNextPost(id)); model.addAttribute("prev", postService.getPrevPost(id)); diff --git a/src/main/java/com/zblog/web/front/validator/CommentValidator.java b/src/main/java/com/zblog/web/front/validator/CommentValidator.java index 28101227..72d75009 100644 --- a/src/main/java/com/zblog/web/front/validator/CommentValidator.java +++ b/src/main/java/com/zblog/web/front/validator/CommentValidator.java @@ -1,5 +1,7 @@ package com.zblog.web.front.validator; +import java.util.regex.Pattern; + import com.zblog.core.dal.entity.Comment; import com.zblog.core.plugin.MapContainer; import com.zblog.core.util.CommRegular; @@ -19,7 +21,7 @@ public static MapContainer validate(Comment comment){ result.put("msg", "需填写用户昵称"); }else if(comment.isApproved()){ result.put("msg", "非法请求"); - }else if(StringUtils.isBlank(comment.getContent())){ + }else if(StringUtils.isBlank(comment.getContent()) || !Pattern.matches("[\u4e00-\u9fa5]", comment.getContent())){ result.put("msg", "请填写评价内容"); } diff --git a/src/main/resources/config/ehcache.xml b/src/main/resources/config/ehcache.xml index 3fe9fd3b..598c8361 100644 --- a/src/main/resources/config/ehcache.xml +++ b/src/main/resources/config/ehcache.xml @@ -37,5 +37,5 @@ maxEntriesLocalDisk="1000" eternal="false" timeToIdleSeconds="2400" timeToLiveSeconds="7200" memoryStoreEvictionPolicy="LFU" transactionalMode="off" /> - + diff --git a/src/main/resources/config/spring-service.xml b/src/main/resources/config/spring-service.xml index 65e168a7..3aae196e 100644 --- a/src/main/resources/config/spring-service.xml +++ b/src/main/resources/config/spring-service.xml @@ -1,11 +1,20 @@ + http://www.springframework.org/schema/context/spring-context-3.2.xsd + http://www.springframework.org/schema/task + http://www.springframework.org/schema/task/spring-task-3.2.xsd"> + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/backend/comment/list.jsp b/src/main/webapp/WEB-INF/jsp/backend/comment/list.jsp index 41934fa1..8c6444ee 100644 --- a/src/main/webapp/WEB-INF/jsp/backend/comment/list.jsp +++ b/src/main/webapp/WEB-INF/jsp/backend/comment/list.jsp @@ -24,9 +24,15 @@
@@ -42,12 +48,16 @@ ${z:substring(comment.url, 7)}
${comment.email}
${comment.ip} - - + diff --git a/src/main/webapp/WEB-INF/jsp/backend/user/edit.jsp b/src/main/webapp/WEB-INF/jsp/backend/user/edit.jsp index 061cbb84..b9557d07 100644 --- a/src/main/webapp/WEB-INF/jsp/backend/user/edit.jsp +++ b/src/main/webapp/WEB-INF/jsp/backend/user/edit.jsp @@ -22,10 +22,10 @@
新建账户
-
+ - +
diff --git a/src/main/webapp/WEB-INF/jsp/common/comments_form.jsp b/src/main/webapp/WEB-INF/jsp/common/comments_form.jsp index 87527c2b..1fa75225 100644 --- a/src/main/webapp/WEB-INF/jsp/common/comments_form.jsp +++ b/src/main/webapp/WEB-INF/jsp/common/comments_form.jsp @@ -3,11 +3,12 @@ <%@ taglib prefix="z" uri="/WEB-INF/tld/function.tld" %>
- +
+
登录身份:${z:cookieValue('comment_author')}
diff --git a/src/main/webapp/WEB-INF/jsp/common/comments_list.jsp b/src/main/webapp/WEB-INF/jsp/common/comments_list.jsp new file mode 100644 index 00000000..d1b4658b --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/common/comments_list.jsp @@ -0,0 +1,39 @@ +<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +
    + + + +
  1. + + +
  2. + + +
    + + + +
    +
    + + 你的评论正在等待审核。。。 + +

    ${comment.content}

    +
    + + + + + + + + + +
  3. +
    +
diff --git a/src/main/webapp/WEB-INF/jsp/common/head.jsp b/src/main/webapp/WEB-INF/jsp/common/head.jsp index 7938b4f6..2c7b67a7 100644 --- a/src/main/webapp/WEB-INF/jsp/common/head.jsp +++ b/src/main/webapp/WEB-INF/jsp/common/head.jsp @@ -6,4 +6,5 @@ ${ptitle}${ptitle!=null?' | ':''}${g.title} + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/index.jsp b/src/main/webapp/WEB-INF/jsp/index.jsp index 385f7c3d..5c055aca 100644 --- a/src/main/webapp/WEB-INF/jsp/index.jsp +++ b/src/main/webapp/WEB-INF/jsp/index.jsp @@ -4,96 +4,97 @@ <%@ taglib prefix="page" uri="/WEB-INF/tld/pagination.tld" %> - - - - - <%@include file="common/header.html" %> -
-
- -

'${categoryName}'目录归档

-
- -
-
-

${post.title}

-
-

${post.excerpt}...

-

阅读全文

+ + + + + <%@include file="common/header.html" %> +
+
+ +

'${categoryName}'目录归档

+
+ +
+
+

${post.title}

+
+

${post.excerpt}...

+

阅读全文

-
-
- -
-
-
- -
-
-
-
-

About

- -

You can show your site introduction by using Site Introduction Widget. + + +

  • <<
  • + + +
  • ${pageNumber}
  • +
    + +
  • ${pageNumber}
  • +
    + +
  • ${pageNumber}
  • +
    + +
  • >>
  • +
    + + +
    +
    +
    +
    +
    +
    +

    About

    + +

    You can show your site introduction by using Site Introduction Widget. You also can show Social Icon on upper part, and search form at bottom.

    -
    - -
    - -
    -
    - -
    - -
    -
    - <%@include file="common/recent.html" %> - <%@include file="common/link.html" %> -
    - -
    - +
    +
    +
    + +
    +
    + +
    + +
    +
    + <%@include file="common/recent.html" %> + <%@include file="common/link.html" %> +
    + +
    + diff --git a/src/main/webapp/WEB-INF/jsp/post.jsp b/src/main/webapp/WEB-INF/jsp/post.jsp index 53bd194c..bdf1051d 100644 --- a/src/main/webapp/WEB-INF/jsp/post.jsp +++ b/src/main/webapp/WEB-INF/jsp/post.jsp @@ -1,85 +1,66 @@ <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> -<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> - - - - - <%@include file="common/header.html" %> -
    -
    - -
    -
    - 评论 (${post.ccount}) -
    -
    -
    -
      - - -
    1. 暂无评论

    2. -
      - - -
    3. -
      - - - -
      -
      - - 你的评论正在等待审核。。。 - -

      ${comment.content}

      -
      -
    4. -
      -
      -
      -
    -
    + + + + + <%@include file="common/header.html" %> +
    +
    + +
    +
    + 评论 (${post.ccount}) +
    +
    +
    + + +
    1. 暂无评论

    +
    + + + +
    +
    -
    -
    -
    - -
    -
    -
    -
    +
    +
    +
    + +
    +
    +
    +

    About

    You can show your site introduction by using Site Introduction Widget. You also can show Social Icon on upper part, and search form at bottom.

    -
    - -
    -
    - -
    - -
    -
    - <%@include file="common/recent.html" %> - <%@include file="common/link.html" %> -
    - -
    - +
    + +
    +
    + +
    + +
    +
    + <%@include file="common/recent.html" %> + <%@include file="common/link.html" %> +
    + +
    + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 79266676..aaa72fa4 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,8 +1,8 @@ - + @@ -10,6 +10,11 @@ true UTF-8 + + + *.jsp + true + @@ -28,12 +33,17 @@ com.zblog.core.listener.InitApplicationListener + - loginFilter + HttpPutFormContentFilter + org.springframework.web.filter.HttpPutFormContentFilter + + + LoginFilter com.zblog.core.filter.LoginFilter - xssFilter + XssFilter com.zblog.core.filter.XssFilter @@ -43,7 +53,7 @@ - statelessCsrfFilter + StatelessCsrfFilter com.zblog.core.filter.StatelessCsrfFilter exclude @@ -68,15 +78,19 @@ - loginFilter + HttpPutFormContentFilter + Zblog + + + LoginFilter Zblog - xssFilter + XssFilter /* - statelessCsrfFilter + StatelessCsrfFilter Zblog @@ -89,10 +103,6 @@ default /resource/* - - default - *.ico - Zblog diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 48961745..d7b09228 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -1,2 +1,2 @@ <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> -< + diff --git a/src/main/webapp/resource/css/backend.css b/src/main/webapp/resource/css/backend.css index 73f29d24..47306767 100644 --- a/src/main/webapp/resource/css/backend.css +++ b/src/main/webapp/resource/css/backend.css @@ -47,7 +47,8 @@ ul.ul-group li{padding: 5px 0;} ul.table-nav{float: left;font-size: 12px;font-family: sans-serif;} ul.table-nav li{ float: left;display: inline-block;} -ul.table-nav li a{line-height: 2;padding: 0.2em;} +ul.table-nav li a, ul.table-nav li span{line-height: 2;padding: 0.2em;} +ul.table-nav li span{color:#999;font-weight: normal;} ul.table-nav li a.active{color: #000;font-weight: bold;} /********** 数据table表格 **************/ diff --git a/src/main/webapp/resource/css/style.css b/src/main/webapp/resource/css/style.css index da80b914..90b59920 100644 --- a/src/main/webapp/resource/css/style.css +++ b/src/main/webapp/resource/css/style.css @@ -163,12 +163,13 @@ a:hover{color: #009dc4;} /**************** comments ****************/ #comments_wrapper{float: right;font-size: 12px;position: relative;width: 86%;z-index: 3;} -#comments_wrapper a{color: #888;text-decoration: underline;} +#comments_wrapper a{color: #888;} +#comments_wrapper a:hover{color: #00a19e;} #comment_header{border-bottom: 1px solid #ccc;font-size: 11px;margin: 0 340px 0 0;min-width: 200px;padding: 0 4%;position: relative;} #comment_header span.comments_right{float:right; position:relative; bottom:-1px; padding:5px 10px; background:#fff;border:1px solid #ccc;border-bottom-width: 0;} #comments{margin: 0 340px 0 0;padding: 20px 4% 15px 4%;} -#comment_area{margin:15px 0 20px; padding:0 0 5px 0;} +#comment_area{margin:15px 0 20px;} .commentlist{list-style-type:none; margin:0; padding:0; } .comment{border:1px solid #ccc; color:#666; margin:0 0 15px; padding:15px 20px 3px; background:#f7f7f7; -moz-border-radius:4px; -khtml-border-radius:4px; -webkit-border-radius:4px; border-radius:4px; } .even_comment{ background:#f7f7f7; } @@ -176,8 +177,7 @@ a:hover{color: #009dc4;} /************ comment-meta *************/ .comment-meta{height:56px; position:relative; } -.comment-meta .comment-reply{position: absolute;right: 0px;top:7px;display: none;} -li.comment:hover .comment-reply{display: block;} +.comment-meta .comment-reply{position: absolute;right: 0px;top:7px;} .avatar{border:1px solid #ccc; background:#fff; width:37px; height:37px; padding:2px; display:inline; float:left; margin:0 10px 0 0; } ul.comment-name-date{padding:6px 0 0 0; float:left;} ul.comment-name-date li{padding: 0 0 5px;} @@ -187,12 +187,13 @@ ul.comment-name-date li{padding: 0 0 5px;} .comment-content{padding:0; clear:both; margin:0; } .comment-content p{line-height: 250%;} * html .comment-content{padding:5px 0 0 0; } +.comment-note{background: none repeat scroll 0 0 #d6f4f0;border: 1px solid #94ddd4;color: #33a8e5;display: block;font-size: 11px;margin: 0 0 1em;padding: 10px 15px;} .comment-content a, .comment-content a:visited{text-decoration:underline; } /************ comment-form ************/ -.comment_form_wrapper{background: #fff;border: 1px solid #ccc;border-radius: 4px;box-shadow: 0 0 2px 1px #ddd;padding: 15px;font-size: 12px;} -#cancel_comment_reply{background:url(../img/arrow2.gif) no-repeat left center; margin:0 0 1em 0; padding:0 0 0 11px; } +.comment_form_wrapper{background: #fff;border: 1px solid #ccc;border-radius: 4px;box-shadow: 0 0 2px 1px #ddd;padding: 15px;font-size: 12px;margin-bottom: 15px;} +#cancel_comment_reply{background:url(../img/arrow2.gif) no-repeat left center; margin:0 0 1em 0; padding:0 0 0 11px;display: none;} #guest_info{padding:0; width:100%; } #guest_info div{margin:0 0 12px 0; text-align:left; } #guest_info input{margin:0; padding:5px 0; border:1px solid #ccc; width:100%; background:#fff; color:#666; } @@ -232,11 +233,12 @@ ul.comment-name-date li{padding: 0 0 5px;} /*social_link*/ #introduction_widget{position: relative;} -#social_link{padding: 0;position: absolute;right: 0;top: 7px;} -#social_link li{float: left;} -#social_link li a{display: block;width: 27px;height: 27px;} -#social_link li.rss_button a{background-image: url("../img/rss.gif");text-indent: -9999px;} -#social_link li.rss_button a:hover{background-position: bottom;} +#social_link{padding: 0;position: absolute;right: 0;top: 5px;} +#social_link li{float: left;margin: 0 5px 0 0;} +#social_link li a{display: block;width: 20px;height: 20px;text-indent: -9999px;} +#social_link li.rss_button a{background-image: url("../img/rss.png");} +#social_link li.github_button a{background-image: url("../img/github.png");} +#social_link li a:hover{background-position: bottom;} /*********** search_area *************/ #search_area{background-color:#eee;border-radius: 20px;height: 33px;position: relative;width: 100%;margin-top: 20px;} diff --git a/src/main/webapp/resource/img/favicon.ico b/src/main/webapp/resource/img/favicon.ico deleted file mode 100644 index 217bec9e..00000000 Binary files a/src/main/webapp/resource/img/favicon.ico and /dev/null differ diff --git a/src/main/webapp/resource/img/github.png b/src/main/webapp/resource/img/github.png new file mode 100644 index 00000000..7819b670 Binary files /dev/null and b/src/main/webapp/resource/img/github.png differ diff --git a/src/main/webapp/resource/img/github32px.png b/src/main/webapp/resource/img/github32px.png deleted file mode 100644 index 8b25551a..00000000 Binary files a/src/main/webapp/resource/img/github32px.png and /dev/null differ diff --git a/src/main/webapp/resource/img/rss.png b/src/main/webapp/resource/img/rss.png new file mode 100644 index 00000000..d8884f03 Binary files /dev/null and b/src/main/webapp/resource/img/rss.png differ diff --git a/src/main/webapp/resource/js/backend/admin.comment.js b/src/main/webapp/resource/js/backend/admin.comment.js index a00a28f6..1c682b61 100644 --- a/src/main/webapp/resource/js/backend/admin.comment.js +++ b/src/main/webapp/resource/js/backend/admin.comment.js @@ -15,13 +15,12 @@ zblog.comment.remove=function(commentid){ }); } -zblog.comment.approve=function(commentid,state){ - console.info(event.target); +zblog.comment.approve=function(commentid,status){ $.ajax({ type:"PUT", url:"comments/"+commentid, dateType:"json", - data:{'state':state} + data:{'status':status}, success:function(data){ if(data&&data.success){ window.location.href="."; diff --git a/src/main/webapp/resource/js/zblog.js b/src/main/webapp/resource/js/zblog.js index 04345f10..78219990 100644 --- a/src/main/webapp/resource/js/zblog.js +++ b/src/main/webapp/resource/js/zblog.js @@ -45,7 +45,26 @@ $(function(){ } var content = $.trim($("#comment").val()); - mark = content && content != ""; + /* 评论中需包含中文,escape对字符串进行编码时,字符值大于255(非英文字符)的以"%u****"格式存储 */ + mark = content && content != "" && escape(content).indexOf("%u")>0; return mark; }); + + $(".comment-reply a").each(function(){ + var t=$(this); + t.click(function(){ + $("#cancel_comment_reply").show(); + var commentMeta=t.parent().parent(); + $("#comment_parent").val(commentMeta.parent().attr("id").substring(8)); + $("#respond").insertAfter(commentMeta.next()); + return false; + }); + }); + + $("#cancel_comment_reply").click(function(){ + $("#cancel_comment_reply").hide(); + $("#comment_parent").val(''); + $("#respond").insertAfter($("#comment_area")); + return false; + }); }); \ No newline at end of file diff --git a/zblog.sql b/zblog.sql index 12f18faa..9a8f482c 100644 --- a/zblog.sql +++ b/zblog.sql @@ -52,6 +52,8 @@ CREATE TABLE `comment` ( `createTime` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_comment_post` (`postid`), + KEY `index_parent` (`parent`) USING BTREE, + CONSTRAINT `index_comment` FOREIGN KEY (`parent`) REFERENCES `comment` (`id`) ON DELETE CASCADE, CONSTRAINT `index_comment_post` FOREIGN KEY (`postid`) REFERENCES `post` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    提交于 -
    +
    提交于 + + | 回复给 + ${comment.pcreator} + +

    ${comment.content}

    - ${comment.status=='wait'?'批准':'驳回'} |  + ${comment.status=='wait'?'批准':'驳回'} |  垃圾评论 |  移动到回收站 diff --git a/src/main/webapp/WEB-INF/jsp/backend/post/list.jsp b/src/main/webapp/WEB-INF/jsp/backend/post/list.jsp index 230cb10f..261dd44a 100644 --- a/src/main/webapp/WEB-INF/jsp/backend/post/list.jsp +++ b/src/main/webapp/WEB-INF/jsp/backend/post/list.jsp @@ -41,7 +41,7 @@ 移到回收站 |  查看
    ${post.nickName}${post.category}${post.categoryName} ${post.rcount} views