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 @@
-