From 7ffbc93ea540c4e1e05fc9162748f47e00cf8eb4 Mon Sep 17 00:00:00 2001 From: ruibaby Date: Wed, 30 Jan 2019 15:23:11 +0800 Subject: [PATCH 01/10] =?UTF-8?q?:art:=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cc/ryanc/halo/Application.java | 2 ++ src/main/java/cc/ryanc/halo/model/domain/Attachment.java | 9 +++++---- src/main/java/cc/ryanc/halo/model/domain/Comment.java | 4 ++++ src/main/java/cc/ryanc/halo/model/domain/Logs.java | 9 +++++---- src/main/java/cc/ryanc/halo/model/domain/Post.java | 6 ++++++ .../java/cc/ryanc/halo/service/impl/LogsServiceImpl.java | 1 - .../java/cc/ryanc/halo/service/impl/PostServiceImpl.java | 1 - .../halo/web/controller/admin/AttachmentController.java | 1 - .../halo/web/controller/admin/CommentController.java | 1 - .../ryanc/halo/web/controller/admin/PageController.java | 3 --- .../ryanc/halo/web/controller/admin/PostController.java | 1 - .../halo/web/controller/core/InstallController.java | 2 -- .../web/controller/front/FrontCommentController.java | 1 - 13 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/main/java/cc/ryanc/halo/Application.java b/src/main/java/cc/ryanc/halo/Application.java index f67e743eb..0f65eb888 100755 --- a/src/main/java/cc/ryanc/halo/Application.java +++ b/src/main/java/cc/ryanc/halo/Application.java @@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.ApplicationContext; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; /** *
@@ -17,6 +18,7 @@ import org.springframework.context.ApplicationContext;
 @Slf4j
 @SpringBootApplication
 @EnableCaching
+@EnableJpaAuditing
 public class Application {
     public static void main(String[] args) {
         ApplicationContext context = SpringApplication.run(Application.class, args);
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Attachment.java b/src/main/java/cc/ryanc/halo/model/domain/Attachment.java
index 365e00c29..b7db4d068 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Attachment.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Attachment.java
@@ -1,11 +1,10 @@
 package cc.ryanc.halo.model.domain;
 
 import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -20,6 +19,7 @@ import java.util.Date;
 @Data
 @Entity
 @Table(name = "halo_attachment")
+@EntityListeners(AuditingEntityListener.class)
 public class Attachment implements Serializable {
 
     private static final long serialVersionUID = 3060117944880138064L;
@@ -59,6 +59,7 @@ public class Attachment implements Serializable {
     /**
      * 上传时间
      */
+    @CreatedDate
     private Date attachCreated;
 
     /**
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Comment.java b/src/main/java/cc/ryanc/halo/model/domain/Comment.java
index b1c3c2c90..d1dd17b04 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Comment.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Comment.java
@@ -2,6 +2,8 @@ package cc.ryanc.halo.model.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
 import javax.persistence.*;
 import javax.validation.constraints.Email;
@@ -21,6 +23,7 @@ import java.util.List;
 @Data
 @Entity
 @Table(name = "halo_comment")
+@EntityListeners(AuditingEntityListener.class)
 public class Comment implements Serializable {
 
     private static final long serialVersionUID = -6639021627094260505L;
@@ -72,6 +75,7 @@ public class Comment implements Serializable {
     /**
      * 评论时间
      */
+    @CreatedDate
     private Date commentDate;
 
     /**
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Logs.java b/src/main/java/cc/ryanc/halo/model/domain/Logs.java
index be550604a..604f026f3 100644
--- a/src/main/java/cc/ryanc/halo/model/domain/Logs.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Logs.java
@@ -1,11 +1,10 @@
 package cc.ryanc.halo.model.domain;
 
 import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -20,6 +19,7 @@ import java.util.Date;
 @Data
 @Entity
 @Table(name = "halo_logs")
+@EntityListeners(AuditingEntityListener.class)
 public class Logs implements Serializable {
 
     private static final long serialVersionUID = -2571815432301283171L;
@@ -49,6 +49,7 @@ public class Logs implements Serializable {
     /**
      * 产生的时间
      */
+    @CreatedDate
     private Date logCreated;
 
     public Logs() {
diff --git a/src/main/java/cc/ryanc/halo/model/domain/Post.java b/src/main/java/cc/ryanc/halo/model/domain/Post.java
index 777b85641..4f54480e5 100755
--- a/src/main/java/cc/ryanc/halo/model/domain/Post.java
+++ b/src/main/java/cc/ryanc/halo/model/domain/Post.java
@@ -2,6 +2,9 @@ package cc.ryanc.halo.model.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
 import javax.persistence.*;
 import java.io.Serializable;
@@ -20,6 +23,7 @@ import java.util.List;
 @Data
 @Entity
 @Table(name = "halo_post")
+@EntityListeners(AuditingEntityListener.class)
 public class Post implements Serializable {
 
     private static final long serialVersionUID = -6019684584665869629L;
@@ -105,11 +109,13 @@ public class Post implements Serializable {
     /**
      * 发表日期
      */
+    @CreatedDate
     private Date postDate;
 
     /**
      * 最后一次更新时间
      */
+    @LastModifiedDate
     private Date postUpdate;
 
     /**
diff --git a/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java
index 078296b26..cf0cd042d 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/LogsServiceImpl.java
@@ -39,7 +39,6 @@ public class LogsServiceImpl implements LogsService {
         final Logs logs = new Logs();
         logs.setLogTitle(logTitle);
         logs.setLogContent(logContent);
-        logs.setLogCreated(new Date());
         logs.setLogIp(ServletUtil.getClientIP(request));
         logsRepository.save(logs);
     }
diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
index e4fb1ab3d..8671464ff 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
@@ -73,7 +73,6 @@ public class PostServiceImpl implements PostService {
         } else {
             post.setPostSummary(summaryText);
         }
-        post.setPostUpdate(DateUtil.date());
         return postRepository.save(post);
     }
 
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java
index e41d2f94d..ff9ded0b3 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/AttachmentController.java
@@ -133,7 +133,6 @@ public class AttachmentController {
                 attachment.setAttachSmallPath(resultMap.get("smallPath"));
                 attachment.setAttachType(file.getContentType());
                 attachment.setAttachSuffix(resultMap.get("suffix"));
-                attachment.setAttachCreated(DateUtil.date());
                 attachment.setAttachSize(resultMap.get("size"));
                 attachment.setAttachWh(resultMap.get("wh"));
                 attachment.setAttachLocation(resultMap.get("location"));
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java
index 675929a2d..dedd8f2ca 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java
@@ -182,7 +182,6 @@ public class CommentController extends BaseController {
             comment.setCommentAuthorUrl(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
             comment.setCommentAuthorIp(ServletUtil.getClientIP(request));
             comment.setCommentAuthorAvatarMd5(SecureUtil.md5(user.getUserEmail()));
-            comment.setCommentDate(DateUtil.date());
 
             final StrBuilder buildContent = new StrBuilder("
Date: Thu, 31 Jan 2019 13:43:23 +0800
Subject: [PATCH 05/10] =?UTF-8?q?:art:=20=E4=BB=A3=E7=A0=81=E4=BC=98?=
 =?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ryanc/halo/listener/StartedListener.java  | 11 +--
 .../service/impl/AttachmentServiceImpl.java   | 51 ++++++-----
 .../halo/service/impl/MailServiceImpl.java    | 27 +++---
 .../halo/service/impl/PostServiceImpl.java    | 84 ++++++++++++-------
 .../java/cc/ryanc/halo/task/PostSyncTask.java |  9 +-
 .../java/cc/ryanc/halo/utils/HaloUtils.java   | 19 +++--
 .../java/cc/ryanc/halo/utils/OwoUtil.java     |  8 +-
 .../web/controller/admin/AdminController.java | 22 +++--
 .../controller/admin/BackupController.java    | 12 +--
 .../controller/admin/CommentController.java   | 31 +++----
 .../controller/admin/OptionController.java    |  7 +-
 .../web/controller/admin/PageController.java  | 12 +--
 .../web/controller/admin/PostController.java  | 25 ++++--
 .../web/controller/admin/ThemeController.java | 30 +++----
 .../web/controller/admin/UserController.java  |  9 +-
 .../web/controller/api/ApiMetaWeBlog.java     | 28 ++++---
 .../web/controller/api/ApiPostController.java |  7 +-
 .../controller/core/InstallController.java    | 15 ++--
 .../front/FrontArchiveController.java         | 14 +++-
 .../front/FrontCategoryController.java        |  7 +-
 .../front/FrontCommentController.java         | 36 ++++----
 .../front/FrontIndexController.java           |  9 +-
 .../front/FrontOthersController.java          | 22 +++--
 .../controller/front/FrontPageController.java |  9 +-
 .../front/FrontSearchController.java          | 11 ++-
 .../controller/front/FrontTagController.java  |  7 +-
 .../halo/web/interceptor/ApiInterceptor.java  |  7 +-
 .../web/interceptor/InstallInterceptor.java   |  5 +-
 .../web/interceptor/LocaleInterceptor.java    |  5 +-
 .../web/interceptor/LoginInterceptor.java     |  5 +-
 30 files changed, 323 insertions(+), 221 deletions(-)

diff --git a/src/main/java/cc/ryanc/halo/listener/StartedListener.java b/src/main/java/cc/ryanc/halo/listener/StartedListener.java
index afa2e249e..24a56b99b 100644
--- a/src/main/java/cc/ryanc/halo/listener/StartedListener.java
+++ b/src/main/java/cc/ryanc/halo/listener/StartedListener.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.listener;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.Theme;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.service.OptionsService;
@@ -19,6 +18,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static cc.ryanc.halo.model.dto.HaloConst.*;
+
 /**
  * 
  *     应用启动完成后所执行的方法
@@ -72,7 +73,7 @@ public class StartedListener implements ApplicationListener options = optionsService.findAllOptions();
         if (options != null && !options.isEmpty()) {
-            HaloConst.OPTIONS = options;
+            OPTIONS = options;
         }
     }
 
@@ -80,10 +81,10 @@ public class StartedListener implements ApplicationListener themes = HaloUtils.getThemes();
         if (null != themes) {
-            HaloConst.THEMES = themes;
+            THEMES = themes;
         }
     }
 
@@ -227,6 +228,6 @@ public class StartedListener implements ApplicationListener");
         map.put("@(黑线)", "黑线.png");
         map.put("@(鼓掌)", "鼓掌.png");
-        HaloConst.OWO = map;
+        OWO = map;
     }
 }
diff --git a/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java
index 2431be8c8..dbf567331 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/AttachmentServiceImpl.java
@@ -1,7 +1,6 @@
 package cc.ryanc.halo.service.impl;
 
 import cc.ryanc.halo.model.domain.Attachment;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.QiNiuPutSet;
 import cc.ryanc.halo.model.enums.AttachLocationEnum;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@@ -42,6 +41,8 @@ import java.io.IOException;
 import java.nio.file.Paths;
 import java.util.*;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     附件业务逻辑实现类
@@ -62,6 +63,7 @@ public class AttachmentServiceImpl implements AttachmentService {
      * 新增附件信息
      *
      * @param attachment attachment
+     *
      * @return Attachment
      */
     @Override
@@ -85,6 +87,7 @@ public class AttachmentServiceImpl implements AttachmentService {
      * 获取所有附件信息 分页
      *
      * @param pageable pageable
+     *
      * @return Page
      */
     @Override
@@ -96,6 +99,7 @@ public class AttachmentServiceImpl implements AttachmentService {
      * 根据附件id查询附件
      *
      * @param attachId attachId
+     *
      * @return Optional
      */
     @Override
@@ -107,6 +111,7 @@ public class AttachmentServiceImpl implements AttachmentService {
      * 根据编号移除附件
      *
      * @param attachId attachId
+     *
      * @return Attachment
      */
     @Override
@@ -122,12 +127,13 @@ public class AttachmentServiceImpl implements AttachmentService {
      *
      * @param file    file
      * @param request request
+     *
      * @return Map
      */
     @Override
     public Map upload(MultipartFile file, HttpServletRequest request) {
         Map resultMap;
-        String attachLoc = HaloConst.OPTIONS.get(BlogPropertiesEnum.ATTACH_LOC.getProp());
+        String attachLoc = OPTIONS.get(BlogPropertiesEnum.ATTACH_LOC.getProp());
         if (StrUtil.isEmpty(attachLoc)) {
             attachLoc = "server";
         }
@@ -153,6 +159,7 @@ public class AttachmentServiceImpl implements AttachmentService {
      *
      * @param file    file
      * @param request request
+     *
      * @return Map
      */
     @Override
@@ -244,6 +251,7 @@ public class AttachmentServiceImpl implements AttachmentService {
      *
      * @param file    file
      * @param request request
+     *
      * @return Map
      */
     @Override
@@ -252,11 +260,11 @@ public class AttachmentServiceImpl implements AttachmentService {
         try {
             final Configuration cfg = new Configuration(Zone.zone0());
             final String key = Md5Util.getMD5Checksum(file);
-            final String accessKey = HaloConst.OPTIONS.get("qiniu_access_key");
-            final String secretKey = HaloConst.OPTIONS.get("qiniu_secret_key");
-            final String domain = HaloConst.OPTIONS.get("qiniu_domain");
-            final String bucket = HaloConst.OPTIONS.get("qiniu_bucket");
-            final String smallUrl = HaloConst.OPTIONS.get("qiniu_small_url");
+            final String accessKey = OPTIONS.get("qiniu_access_key");
+            final String secretKey = OPTIONS.get("qiniu_secret_key");
+            final String domain = OPTIONS.get("qiniu_domain");
+            final String bucket = OPTIONS.get("qiniu_bucket");
+            final String smallUrl = OPTIONS.get("qiniu_small_url");
             if (StrUtil.isEmpty(accessKey) || StrUtil.isEmpty(secretKey) || StrUtil.isEmpty(domain) || StrUtil.isEmpty(bucket)) {
                 return resultMap;
             }
@@ -304,6 +312,7 @@ public class AttachmentServiceImpl implements AttachmentService {
      *
      * @param file    file
      * @param request request
+     *
      * @return Map
      */
     @Override
@@ -311,12 +320,12 @@ public class AttachmentServiceImpl implements AttachmentService {
         final Map resultMap = new HashMap<>(6);
         try {
             final String key = Md5Util.getMD5Checksum(file);
-            final String ossSrc = HaloConst.OPTIONS.get("upyun_oss_src");
-            final String ossPwd = HaloConst.OPTIONS.get("upyun_oss_pwd");
-            final String bucket = HaloConst.OPTIONS.get("upyun_oss_bucket");
-            final String domain = HaloConst.OPTIONS.get("upyun_oss_domain");
-            final String operator = HaloConst.OPTIONS.get("upyun_oss_operator");
-            final String smallUrl = HaloConst.OPTIONS.get("upyun_oss_small");
+            final String ossSrc = OPTIONS.get("upyun_oss_src");
+            final String ossPwd = OPTIONS.get("upyun_oss_pwd");
+            final String bucket = OPTIONS.get("upyun_oss_bucket");
+            final String domain = OPTIONS.get("upyun_oss_domain");
+            final String operator = OPTIONS.get("upyun_oss_operator");
+            final String smallUrl = OPTIONS.get("upyun_oss_small");
             if (StrUtil.isEmpty(ossSrc) || StrUtil.isEmpty(ossPwd) || StrUtil.isEmpty(domain) || StrUtil.isEmpty(bucket) || StrUtil.isEmpty(operator)) {
                 return resultMap;
             }
@@ -353,15 +362,16 @@ public class AttachmentServiceImpl implements AttachmentService {
      * 七牛云删除附件
      *
      * @param key key
+     *
      * @return boolean
      */
     @Override
     public boolean deleteQiNiuAttachment(String key) {
         boolean flag = true;
         final Configuration cfg = new Configuration(Zone.zone0());
-        final String accessKey = HaloConst.OPTIONS.get("qiniu_access_key");
-        final String secretKey = HaloConst.OPTIONS.get("qiniu_secret_key");
-        final String bucket = HaloConst.OPTIONS.get("qiniu_bucket");
+        final String accessKey = OPTIONS.get("qiniu_access_key");
+        final String secretKey = OPTIONS.get("qiniu_secret_key");
+        final String bucket = OPTIONS.get("qiniu_bucket");
         if (StrUtil.isEmpty(accessKey) || StrUtil.isEmpty(secretKey) || StrUtil.isEmpty(bucket)) {
             return false;
         }
@@ -381,15 +391,16 @@ public class AttachmentServiceImpl implements AttachmentService {
      * 又拍云删除附件
      *
      * @param fileName fileName
+     *
      * @return boolean
      */
     @Override
     public boolean deleteUpYunAttachment(String fileName) {
         boolean flag = true;
-        final String ossSrc = HaloConst.OPTIONS.get("upyun_oss_src");
-        final String ossPwd = HaloConst.OPTIONS.get("upyun_oss_pwd");
-        final String bucket = HaloConst.OPTIONS.get("upyun_oss_bucket");
-        final String operator = HaloConst.OPTIONS.get("upyun_oss_operator");
+        final String ossSrc = OPTIONS.get("upyun_oss_src");
+        final String ossPwd = OPTIONS.get("upyun_oss_pwd");
+        final String bucket = OPTIONS.get("upyun_oss_bucket");
+        final String operator = OPTIONS.get("upyun_oss_operator");
         if (StrUtil.isEmpty(ossSrc) || StrUtil.isEmpty(ossPwd) || StrUtil.isEmpty(bucket) || StrUtil.isEmpty(operator)) {
             return false;
         }
diff --git a/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java
index 56e69011f..3bbab106a 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.service.impl;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.service.MailService;
 import cc.ryanc.halo.utils.HaloUtils;
@@ -15,6 +14,8 @@ import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
 import java.io.File;
 import java.util.Map;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     邮件发送业务逻辑实现类
@@ -40,12 +41,12 @@ public class MailServiceImpl implements MailService {
     public void sendMail(String to, String subject, String content) {
         //配置邮件服务器
         HaloUtils.configMail(
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
         try {
             OhMyEmail.subject(subject)
-                    .from(HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
+                    .from(OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
                     .to(to)
                     .text(content)
                     .send();
@@ -66,15 +67,15 @@ public class MailServiceImpl implements MailService {
     public void sendTemplateMail(String to, String subject, Map content, String templateName) {
         //配置邮件服务器
         HaloUtils.configMail(
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
         StrBuilder text = new StrBuilder();
         try {
             final Template template = freeMarker.getConfiguration().getTemplate(templateName);
             text.append(FreeMarkerTemplateUtils.processTemplateIntoString(template, content));
             OhMyEmail.subject(subject)
-                    .from(HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
+                    .from(OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
                     .to(to)
                     .html(text.toString())
                     .send();
@@ -96,16 +97,16 @@ public class MailServiceImpl implements MailService {
     public void sendAttachMail(String to, String subject, Map content, String templateName, String attachSrc) {
         //配置邮件服务器
         HaloUtils.configMail(
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
-                HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_HOST.getProp()),
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_USERNAME.getProp()),
+                OPTIONS.get(BlogPropertiesEnum.MAIL_SMTP_PASSWORD.getProp()));
         File file = new File(attachSrc);
         StrBuilder text = new StrBuilder();
         try {
             final Template template = freeMarker.getConfiguration().getTemplate(templateName);
             text.append(FreeMarkerTemplateUtils.processTemplateIntoString(template, content));
             OhMyEmail.subject(subject)
-                    .from(HaloConst.OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
+                    .from(OPTIONS.get(BlogPropertiesEnum.MAIL_FROM_NAME.getProp()))
                     .to(to)
                     .html(text.toString())
                     .attach(file, file.getName())
diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
index 8671464ff..7c86b09d9 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
@@ -4,7 +4,6 @@ import cc.ryanc.halo.model.domain.Category;
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.Tag;
 import cc.ryanc.halo.model.dto.Archive;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.PostStatusEnum;
 import cc.ryanc.halo.model.enums.PostTypeEnum;
@@ -13,7 +12,6 @@ import cc.ryanc.halo.service.CategoryService;
 import cc.ryanc.halo.service.PostService;
 import cc.ryanc.halo.service.TagService;
 import cc.ryanc.halo.utils.HaloUtils;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HtmlUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +27,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+import static cc.ryanc.halo.model.dto.HaloConst.POSTS_VIEWS;
+
 /**
  * 
  *     文章业务逻辑实现类
@@ -57,14 +58,15 @@ public class PostServiceImpl implements PostService {
      * 保存文章
      *
      * @param post Post
+     *
      * @return Post
      */
     @Override
     @CacheEvict(value = {POSTS_CACHE_NAME, COMMENTS_CACHE_NAME}, allEntries = true, beforeInvocation = true)
     public Post save(Post post) {
         int postSummary = 50;
-        if (StrUtil.isNotEmpty(HaloConst.OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()))) {
-            postSummary = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()));
+        if (StrUtil.isNotEmpty(OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()))) {
+            postSummary = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()));
         }
         final String summaryText = StrUtil.cleanBlank(HtmlUtil.cleanHtmlTag(post.getPostContent()));
         if (summaryText.length() > postSummary) {
@@ -80,6 +82,7 @@ public class PostServiceImpl implements PostService {
      * 根据编号移除文章
      *
      * @param postId postId
+     *
      * @return Post
      */
     @Override
@@ -95,6 +98,7 @@ public class PostServiceImpl implements PostService {
      *
      * @param postId postId
      * @param status status
+     *
      * @return Post
      */
     @Override
@@ -129,6 +133,7 @@ public class PostServiceImpl implements PostService {
      * 获取文章列表 不分页
      *
      * @param postType post or page
+     *
      * @return List
      */
     @Override
@@ -144,11 +149,12 @@ public class PostServiceImpl implements PostService {
      * @param postType   文章类型
      * @param postStatus 文章状态
      * @param pageable   分页信息
+     *
      * @return Page
      */
     @Override
     public Page searchPosts(String keyword, String postType, Integer postStatus, Pageable pageable) {
-        Page posts = postRepository.findByPostTypeAndPostStatusAndPostTitleLikeOrPostTypeAndPostStatusAndPostContentLike(
+        return postRepository.findByPostTypeAndPostStatusAndPostTitleLikeOrPostTypeAndPostStatusAndPostContentLike(
                 postType,
                 postStatus,
                 "%" + keyword + "%",
@@ -156,13 +162,12 @@ public class PostServiceImpl implements PostService {
                 postStatus,
                 "%" + keyword + "%",
                 pageable
-        );
-        for (Post post : posts.getContent()) {
+        ).map(post -> {
             if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostSummary("该文章为加密文章");
             }
-        }
-        return posts;
+            return post;
+        });
     }
 
     /**
@@ -171,35 +176,35 @@ public class PostServiceImpl implements PostService {
      * @param status   0,1,2
      * @param postType post or page
      * @param pageable 分页信息
+     *
      * @return Page
      */
     @Override
     public Page findPostByStatus(Integer status, String postType, Pageable pageable) {
-        Page posts = postRepository.findPostsByPostStatusAndPostType(status, postType, pageable);
-        for (Post post : posts.getContent()) {
+        return postRepository.findPostsByPostStatusAndPostType(status, postType, pageable).map(post -> {
             if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostSummary("该文章为加密文章");
             }
-        }
-        return posts;
+            return post;
+        });
     }
 
     /**
      * 根据文章状态查询 分页,首页分页
      *
      * @param pageable pageable
+     *
      * @return Page
      */
     @Override
     @Cacheable(value = POSTS_CACHE_NAME, key = "'posts_page_'+#pageable.pageNumber")
     public Page findPostByStatus(Pageable pageable) {
-        Page posts = postRepository.findPostsByPostStatusAndPostType(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
-        for (Post post : posts.getContent()) {
+        return postRepository.findPostsByPostStatusAndPostType(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable).map(post -> {
             if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostSummary("该文章为加密文章");
             }
-        }
-        return posts;
+            return post;
+        });
     }
 
     /**
@@ -207,6 +212,7 @@ public class PostServiceImpl implements PostService {
      *
      * @param status   0,1,2
      * @param postType post or page
+     *
      * @return List
      */
     @Override
@@ -219,6 +225,7 @@ public class PostServiceImpl implements PostService {
      * 根据编号查询文章
      *
      * @param postId postId
+     *
      * @return Optional
      */
     @Override
@@ -230,6 +237,7 @@ public class PostServiceImpl implements PostService {
      * 根据编号和类型查询文章
      *
      * @param postId postId
+     *
      * @return Post
      */
     @Override
@@ -242,6 +250,7 @@ public class PostServiceImpl implements PostService {
      *
      * @param postUrl  路径
      * @param postType post or page
+     *
      * @return Post
      */
     @Override
@@ -265,6 +274,7 @@ public class PostServiceImpl implements PostService {
      * 获取下一篇文章 较新
      *
      * @param postDate postDate
+     *
      * @return Post
      */
     @Override
@@ -276,6 +286,7 @@ public class PostServiceImpl implements PostService {
      * 获取下一篇文章 较老
      *
      * @param postDate postDate
+     *
      * @return Post
      */
     @Override
@@ -328,6 +339,7 @@ public class PostServiceImpl implements PostService {
 
     /**
      * @return List
+     *
      * @Author Aquan
      * @Description 查询归档信息 返回所有文章
      * @Date 2019.1.4 11:16
@@ -354,6 +366,7 @@ public class PostServiceImpl implements PostService {
      *
      * @param year  year
      * @param month month
+     *
      * @return List
      */
     @Override
@@ -366,6 +379,7 @@ public class PostServiceImpl implements PostService {
      * 根据年份查询文章
      *
      * @param year year
+     *
      * @return List
      */
     @Override
@@ -380,17 +394,17 @@ public class PostServiceImpl implements PostService {
      * @param year     year year
      * @param month    month month
      * @param pageable pageable pageable
+     *
      * @return Page
      */
     @Override
     public Page findPostByYearAndMonth(String year, String month, Pageable pageable) {
-        Page posts = postRepository.findPostByYearAndMonth(year, month, null);
-        for (Post post : posts.getContent()) {
+        return postRepository.findPostByYearAndMonth(year, month, null).map(post -> {
             if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostSummary("该文章为加密文章");
             }
-        }
-        return posts;
+            return post;
+        });
     }
 
     /**
@@ -399,18 +413,18 @@ public class PostServiceImpl implements PostService {
      * @param category category
      * @param status   status
      * @param pageable pageable
+     *
      * @return Page
      */
     @Override
     @CachePut(value = POSTS_CACHE_NAME, key = "'posts_category_'+#category.cateId+'_'+#pageable.pageNumber")
     public Page findPostByCategories(Category category, Pageable pageable) {
-        Page posts = postRepository.findPostByCategoriesAndPostStatus(category, PostStatusEnum.PUBLISHED.getCode(), pageable);
-        for (Post post : posts.getContent()) {
+        return postRepository.findPostByCategoriesAndPostStatus(category, PostStatusEnum.PUBLISHED.getCode(), pageable).map(post -> {
             if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostSummary("该文章为加密文章");
             }
-        }
-        return posts;
+            return post;
+        });
     }
 
     /**
@@ -419,18 +433,18 @@ public class PostServiceImpl implements PostService {
      * @param tag      tag
      * @param status   status
      * @param pageable pageable
+     *
      * @return Page
      */
     @Override
     @CachePut(value = POSTS_CACHE_NAME, key = "'posts_tag_'+#tag.tagId+'_'+#pageable.pageNumber")
     public Page findPostsByTags(Tag tag, Pageable pageable) {
-        Page posts = postRepository.findPostsByTagsAndPostStatus(tag, PostStatusEnum.PUBLISHED.getCode(), pageable);
-        for (Post post : posts.getContent()) {
+        return postRepository.findPostsByTagsAndPostStatus(tag, PostStatusEnum.PUBLISHED.getCode(), pageable).map(post -> {
             if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostSummary("该文章为加密文章");
             }
-        }
-        return posts;
+            return post;
+        });
     }
 
     /**
@@ -448,6 +462,7 @@ public class PostServiceImpl implements PostService {
      * 当前文章的相似文章
      *
      * @param post post
+     *
      * @return List
      */
     @Override
@@ -485,6 +500,7 @@ public class PostServiceImpl implements PostService {
      * 根据文章状态查询数量
      *
      * @param status 文章状态
+     *
      * @return 文章数量
      */
     @Override
@@ -496,6 +512,7 @@ public class PostServiceImpl implements PostService {
      * 生成rss
      *
      * @param posts posts
+     *
      * @return String
      */
     @Override
@@ -513,6 +530,7 @@ public class PostServiceImpl implements PostService {
      * 生成sitemap
      *
      * @param posts posts
+     *
      * @return String
      */
     @Override
@@ -527,10 +545,10 @@ public class PostServiceImpl implements PostService {
      */
     @Override
     public void cacheViews(Long postId) {
-        if (null != HaloConst.POSTS_VIEWS.get(postId)) {
-            HaloConst.POSTS_VIEWS.put(postId, HaloConst.POSTS_VIEWS.get(postId) + 1);
+        if (null != POSTS_VIEWS.get(postId)) {
+            POSTS_VIEWS.put(postId, POSTS_VIEWS.get(postId) + 1);
         } else {
-            HaloConst.POSTS_VIEWS.put(postId, 1L);
+            POSTS_VIEWS.put(postId, 1L);
         }
     }
 
@@ -540,6 +558,7 @@ public class PostServiceImpl implements PostService {
      * @param post     post
      * @param cateList cateList
      * @param tagList  tagList
+     *
      * @return Post Post
      */
     @Override
@@ -557,6 +576,7 @@ public class PostServiceImpl implements PostService {
      * 获取最近的文章
      *
      * @param limit 条数
+     *
      * @return List
      */
     @Override
diff --git a/src/main/java/cc/ryanc/halo/task/PostSyncTask.java b/src/main/java/cc/ryanc/halo/task/PostSyncTask.java
index bb01797eb..0a40111fc 100644
--- a/src/main/java/cc/ryanc/halo/task/PostSyncTask.java
+++ b/src/main/java/cc/ryanc/halo/task/PostSyncTask.java
@@ -1,11 +1,12 @@
 package cc.ryanc.halo.task;
 
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.service.PostService;
 import cc.ryanc.halo.utils.SpringUtil;
 import lombok.extern.slf4j.Slf4j;
 
+import static cc.ryanc.halo.model.dto.HaloConst.POSTS_VIEWS;
+
 /**
  * @author : RYAN0UP
  * @date : 2018/12/5
@@ -20,15 +21,15 @@ public class PostSyncTask {
         final PostService postService = SpringUtil.getBean(PostService.class);
         Post post = null;
         int count = 0;
-        for (Long key : HaloConst.POSTS_VIEWS.keySet()) {
+        for (Long key : POSTS_VIEWS.keySet()) {
             post = postService.findByPostId(key).orElse(null);
             if (null != post) {
-                post.setPostViews(post.getPostViews() + HaloConst.POSTS_VIEWS.get(key));
+                post.setPostViews(post.getPostViews() + POSTS_VIEWS.get(key));
                 postService.save(post);
                 count++;
             }
         }
         log.info("The number of visits to {} posts has been updated", count);
-        HaloConst.POSTS_VIEWS.clear();
+        POSTS_VIEWS.clear();
     }
 }
diff --git a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
index d11273f71..a2d31b04f 100755
--- a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
+++ b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
@@ -2,7 +2,6 @@ package cc.ryanc.halo.utils;
 
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.dto.BackupDto;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.Theme;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.CommonParamsEnum;
@@ -33,6 +32,8 @@ import java.nio.file.attribute.BasicFileAttributeView;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.*;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  * 常用工具
@@ -297,20 +298,20 @@ public class HaloUtils {
         Assert.notEmpty(posts, "posts must not be empty");
 
         final Channel channel = new Channel("rss_2.0");
-        if (null == HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp())) {
+        if (null == OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp())) {
             channel.setTitle("");
         } else {
-            channel.setTitle(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
+            channel.setTitle(OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
         }
-        if (null == HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())) {
+        if (null == OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())) {
             channel.setLink("");
         } else {
-            channel.setLink(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+            channel.setLink(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
         }
-        if (null == HaloConst.OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp())) {
+        if (null == OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp())) {
             channel.setDescription("");
         } else {
-            channel.setDescription(HaloConst.OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp()));
+            channel.setDescription(OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp()));
         }
         channel.setLanguage("zh-CN");
         final List items = new ArrayList<>();
@@ -330,7 +331,7 @@ public class HaloUtils {
             value = new String(xmlChar);
             content.setValue(value);
             item.setContent(content);
-            item.setLink(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/" + post.getPostUrl());
+            item.setLink(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/" + post.getPostUrl());
             item.setPubDate(post.getPostDate());
             items.add(item);
         }
@@ -350,7 +351,7 @@ public class HaloUtils {
         Assert.notEmpty(posts, "post mut not be empty");
         final StrBuilder head = new StrBuilder("\n");
         final StrBuilder urlBody = new StrBuilder();
-        final String urlPath = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/";
+        final String urlPath = OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/";
         for (Post post : posts) {
             urlBody.append("");
             urlBody.append(urlPath);
diff --git a/src/main/java/cc/ryanc/halo/utils/OwoUtil.java b/src/main/java/cc/ryanc/halo/utils/OwoUtil.java
index ac08b31e8..3e527eb1e 100644
--- a/src/main/java/cc/ryanc/halo/utils/OwoUtil.java
+++ b/src/main/java/cc/ryanc/halo/utils/OwoUtil.java
@@ -1,8 +1,9 @@
 package cc.ryanc.halo.utils;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import lombok.extern.slf4j.Slf4j;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OWO;
+
 /**
  * 
  *     OwO表情工具类
@@ -18,11 +19,12 @@ public class OwoUtil {
      * 将表情标志转化为图片地址
      *
      * @param mark 表情标志
+     *
      * @return 表情图片地址
      */
     public static String markToImg(String mark) {
-        for (String key : HaloConst.OWO.keySet()) {
-            mark = mark.replace(key, HaloConst.OWO.get(key));
+        for (String key : OWO.keySet()) {
+            mark = mark.replace(key, OWO.get(key));
         }
         return mark;
     }
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java
index 6069aabbb..8d08b5fe8 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java
@@ -1,7 +1,6 @@
 package cc.ryanc.halo.web.controller.admin;
 
 import cc.ryanc.halo.model.domain.*;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.dto.LogsRecord;
 import cc.ryanc.halo.model.enums.*;
@@ -33,6 +32,9 @@ import javax.servlet.http.HttpSession;
 import java.io.IOException;
 import java.util.*;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
+
 /**
  * 
  *     后台首页控制器
@@ -78,6 +80,7 @@ public class AdminController extends BaseController {
      *
      * @param model   model
      * @param session session
+     *
      * @return 模板路径admin/admin_index
      */
     @GetMapping(value = {"", "/index"})
@@ -107,7 +110,7 @@ public class AdminController extends BaseController {
         model.addAttribute("postViewsSum", postViewsSum);
 
         //成立天数
-        final Date blogStart = DateUtil.parse(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_START.getProp()));
+        final Date blogStart = DateUtil.parse(OPTIONS.get(BlogPropertiesEnum.BLOG_START.getProp()));
         final long hadDays = DateUtil.between(blogStart, DateUtil.date(), DateUnit.DAY);
         model.addAttribute("hadDays", hadDays);
         return "admin/admin_index";
@@ -117,11 +120,12 @@ public class AdminController extends BaseController {
      * 处理跳转到登录页的请求
      *
      * @param session session
+     *
      * @return 模板路径admin/admin_login
      */
     @GetMapping(value = "/login")
     public String login(HttpSession session) {
-        final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+        final User user = (User) session.getAttribute(USER_SESSION_KEY);
         //如果session存在,跳转到后台首页
         if (null != user) {
             return "redirect:/admin";
@@ -135,6 +139,7 @@ public class AdminController extends BaseController {
      * @param loginName 登录名:邮箱/用户名
      * @param loginPwd  loginPwd 密码
      * @param session   session session
+     *
      * @return JsonResult JsonResult
      */
     @PostMapping(value = "/getLogin")
@@ -163,7 +168,7 @@ public class AdminController extends BaseController {
         userService.updateUserLoginLast(DateUtil.date());
         //判断User对象是否相等
         if (ObjectUtil.equal(aUser, user)) {
-            session.setAttribute(HaloConst.USER_SESSION_KEY, aUser);
+            session.setAttribute(USER_SESSION_KEY, aUser);
             //重置用户的登录状态为正常
             userService.updateUserNormal();
             logsService.save(LogsRecord.LOGIN, LogsRecord.LOGIN_SUCCESS, request);
@@ -186,12 +191,13 @@ public class AdminController extends BaseController {
      * 退出登录 销毁session
      *
      * @param session session
+     *
      * @return 重定向到/admin/login
      */
     @GetMapping(value = "/logOut")
     public String logOut(HttpSession session) {
-        final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
-        session.removeAttribute(HaloConst.USER_SESSION_KEY);
+        final User user = (User) session.getAttribute(USER_SESSION_KEY);
+        session.removeAttribute(USER_SESSION_KEY);
         logsService.save(LogsRecord.LOGOUT, user.getUserName(), request);
         log.info("User {} has logged out", user.getUserName());
         return "redirect:/admin/login";
@@ -203,6 +209,7 @@ public class AdminController extends BaseController {
      * @param model model model
      * @param page  page 当前页码
      * @param size  size 每页条数
+     *
      * @return 模板路径admin/widget/_logs-all
      */
     @GetMapping(value = "/logs")
@@ -279,6 +286,7 @@ public class AdminController extends BaseController {
      *
      * @param file    file
      * @param request request
+     *
      * @return JsonResult
      */
     @PostMapping(value = "/tools/markdownImport")
@@ -286,7 +294,7 @@ public class AdminController extends BaseController {
     public JsonResult markdownImport(@RequestParam("file") MultipartFile file,
                                      HttpServletRequest request,
                                      HttpSession session) throws IOException {
-        final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+        final User user = (User) session.getAttribute(USER_SESSION_KEY);
         final String markdown = IoUtil.read(file.getInputStream(), "UTF-8");
         final String content = MarkdownUtils.renderMarkdown(markdown);
         final Map> frontMatters = MarkdownUtils.getFrontMatter(markdown);
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/BackupController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/BackupController.java
index 4162489ba..414b2f589 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/BackupController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/BackupController.java
@@ -5,7 +5,6 @@ import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.Tag;
 import cc.ryanc.halo.model.domain.User;
 import cc.ryanc.halo.model.dto.BackupDto;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.enums.*;
 import cc.ryanc.halo.service.MailService;
@@ -34,6 +33,9 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
+
 /**
  * 
  *     后台备份控制器
@@ -170,14 +172,14 @@ public class BackupController {
                 content.append("date: ").append(post.getPostDate()).append("\n");
                 content.append("updated: ").append(post.getPostUpdate()).append("\n");
                 content.append("thumbnail: ").append(post.getPostThumbnail()).append("\n");
-                if(post.getTags().size()>0){
+                if (post.getTags().size() > 0) {
                     content.append("tags:").append("\n");
                     final List tags = post.getTags();
                     for (Tag tag : tags) {
                         content.append("  - ").append(tag.getTagName()).append("\n");
                     }
                 }
-                if(post.getCategories().size()>0){
+                if (post.getCategories().size() > 0) {
                     content.append("categories:").append("\n");
                     final List categories = post.getCategories();
                     for (Category category : categories) {
@@ -236,11 +238,11 @@ public class BackupController {
                                   @RequestParam("type") String type,
                                   HttpSession session) {
         final String srcPath = System.getProperties().getProperty("user.home") + "/halo/backup/" + type + "/" + fileName;
-        final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+        final User user = (User) session.getAttribute(USER_SESSION_KEY);
         if (null == user.getUserEmail() || StrUtil.isEmpty(user.getUserEmail())) {
             return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.backup.no-email"));
         }
-        if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.FALSE.getDesc())) {
+        if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.FALSE.getDesc())) {
             return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.no-post"));
         }
         new EmailToAdmin(srcPath, user).start();
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java
index dedd8f2ca..2ee8ec8c0 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/CommentController.java
@@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.admin;
 import cc.ryanc.halo.model.domain.Comment;
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.User;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.enums.*;
 import cc.ryanc.halo.service.CommentService;
@@ -11,7 +10,6 @@ import cc.ryanc.halo.service.MailService;
 import cc.ryanc.halo.service.PostService;
 import cc.ryanc.halo.utils.OwoUtil;
 import cc.ryanc.halo.web.controller.core.BaseController;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.text.StrBuilder;
 import cn.hutool.core.util.StrUtil;
@@ -33,6 +31,9 @@ import javax.servlet.http.HttpSession;
 import java.util.HashMap;
 import java.util.Map;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
+
 /**
  * 
  *     后台评论管理控制器
@@ -116,7 +117,7 @@ public class CommentController extends BaseController {
                                 HttpSession session) {
         final Comment comment = commentService.updateCommentStatus(commentId, CommentStatusEnum.PUBLISHED.getCode());
         final Post post = comment.getPost();
-        final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+        final User user = (User) session.getAttribute(USER_SESSION_KEY);
 
         //判断是否启用邮件服务
         new NoticeToAuthor(comment, post, user, status).start();
@@ -165,7 +166,7 @@ public class CommentController extends BaseController {
             final Post post = postService.findByPostId(postId).orElse(new Post());
 
             //博主信息
-            final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+            final User user = (User) session.getAttribute(USER_SESSION_KEY);
 
             //被回复的评论
             final Comment lastComment = commentService.findCommentById(commentId).orElse(new Comment());
@@ -179,7 +180,7 @@ public class CommentController extends BaseController {
             comment.setPost(post);
             comment.setCommentAuthor(user.getUserDisplayName());
             comment.setCommentAuthorEmail(user.getUserEmail());
-            comment.setCommentAuthorUrl(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+            comment.setCommentAuthorUrl(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
             comment.setCommentAuthorIp(ServletUtil.getClientIP(request));
             comment.setCommentAuthorAvatarMd5(SecureUtil.md5(user.getUserEmail()));
 
@@ -227,14 +228,14 @@ public class CommentController extends BaseController {
 
         @Override
         public void run() {
-            if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
+            if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
                 if (Validator.isEmail(lastComment.getCommentAuthorEmail())) {
                     final Map map = new HashMap<>(8);
-                    map.put("blogTitle", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
+                    map.put("blogTitle", OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
                     map.put("commentAuthor", lastComment.getCommentAuthor());
                     map.put("pageName", lastComment.getPost().getPostTitle());
 
-                    final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+                    final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
                     if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
                         pageUrl.append("/archives/");
                     } else {
@@ -248,9 +249,9 @@ public class CommentController extends BaseController {
                     map.put("commentContent", lastComment.getCommentContent());
                     map.put("replyAuthor", user.getUserDisplayName());
                     map.put("replyContent", commentContent);
-                    map.put("blogUrl", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+                    map.put("blogUrl", OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
                     mailService.sendTemplateMail(
-                            lastComment.getCommentAuthorEmail(), "您在" + HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
+                            lastComment.getCommentAuthorEmail(), "您在" + OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
                 }
             }
         }
@@ -275,12 +276,12 @@ public class CommentController extends BaseController {
 
         @Override
         public void run() {
-            if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
+            if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
                 try {
                     if (status == 1 && Validator.isEmail(comment.getCommentAuthorEmail())) {
                         final Map map = new HashMap<>(6);
 
-                        final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+                        final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
                         if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
                             pageUrl.append("/archives/");
                         } else {
@@ -293,12 +294,12 @@ public class CommentController extends BaseController {
                         map.put("pageUrl", pageUrl.toString());
                         map.put("pageName", post.getPostTitle());
                         map.put("commentContent", comment.getCommentContent());
-                        map.put("blogUrl", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
-                        map.put("blogTitle", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
+                        map.put("blogUrl", OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+                        map.put("blogTitle", OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
                         map.put("author", user.getUserDisplayName());
                         mailService.sendTemplateMail(
                                 comment.getCommentAuthorEmail(),
-                                "您在" + HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论已审核通过!", map, "common/mail_template/mail_passed.ftl");
+                                "您在" + OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "的评论已审核通过!", map, "common/mail_template/mail_passed.ftl");
                     }
                 } catch (Exception e) {
                     log.error("Mail server not configured: {}", e.getMessage());
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java
index a4ac70c04..04396d6f2 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.web.controller.admin;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.enums.ResultCodeEnum;
 import cc.ryanc.halo.service.OptionsService;
@@ -15,6 +14,8 @@ import org.springframework.web.servlet.i18n.SessionLocaleResolver;
 import javax.servlet.http.HttpSession;
 import java.util.Map;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     后台设置选项控制器
@@ -61,8 +62,8 @@ public class OptionController {
             optionsService.saveOptions(options);
             //刷新options
             configuration.setSharedVariable("options", optionsService.findAllOptions());
-            HaloConst.OPTIONS.clear();
-            HaloConst.OPTIONS = optionsService.findAllOptions();
+            OPTIONS.clear();
+            OPTIONS = optionsService.findAllOptions();
             session.removeAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);
             log.info("List of saved options: " + options);
             return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.common.save-success"));
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java
index 7703b724f..305c68709 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java
@@ -4,7 +4,6 @@ import cc.ryanc.halo.model.domain.Gallery;
 import cc.ryanc.halo.model.domain.Link;
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.User;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.dto.LogsRecord;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@@ -42,6 +41,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
+
 /**
  * 
  *     后台页面管理控制器
@@ -234,7 +236,7 @@ public class PageController {
      */
     @GetMapping(value = "/new")
     public String newPage(Model model) {
-        final List customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
+        final List customTpls = HaloUtils.getCustomTpl(OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
         model.addAttribute("customTpls", customTpls);
         return "admin/admin_page_md_editor";
     }
@@ -251,7 +253,7 @@ public class PageController {
         String msg = localeMessageUtil.getMessage("code.admin.common.save-success");
         try {
             //发表用户
-            final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+            final User user = (User) session.getAttribute(USER_SESSION_KEY);
             post.setUser(user);
             post.setPostType(PostTypeEnum.POST_TYPE_PAGE.getDesc());
             if (null != post.getPostId()) {
@@ -265,7 +267,7 @@ public class PageController {
             post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd()));
             //当没有选择文章缩略图的时候,自动分配一张内置的缩略图
             if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) {
-                post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg");
+                post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
             }
             postService.save(post);
             logsService.save(LogsRecord.PUSH_PAGE, post.getPostTitle(), request);
@@ -287,7 +289,7 @@ public class PageController {
     @GetMapping(value = "/edit")
     public String editPage(@RequestParam("pageId") Long pageId, Model model) {
         final Optional post = postService.findByPostId(pageId);
-        final List customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
+        final List customTpls = HaloUtils.getCustomTpl(OPTIONS.get(BlogPropertiesEnum.THEME.getProp()));
         model.addAttribute("post", post.orElse(new Post()));
         model.addAttribute("customTpls", customTpls);
         return "admin/admin_page_md_editor";
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java
index be28538ca..31fa9df8a 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java
@@ -2,7 +2,6 @@ package cc.ryanc.halo.web.controller.admin;
 
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.User;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.dto.LogsRecord;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@@ -15,7 +14,6 @@ import cc.ryanc.halo.utils.HaloUtils;
 import cc.ryanc.halo.utils.LocaleMessageUtil;
 import cc.ryanc.halo.utils.MarkdownUtils;
 import cc.ryanc.halo.web.controller.core.BaseController;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.SecureUtil;
@@ -38,6 +36,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
+
 /**
  * 
  *     后台文章管理控制器
@@ -67,6 +68,7 @@ public class PostController extends BaseController {
      * 去除html,htm后缀,以及将空格替换成-
      *
      * @param url url
+     *
      * @return String
      */
     private static String urlFilter(String url) {
@@ -85,6 +87,7 @@ public class PostController extends BaseController {
      * @param model model
      * @param page  当前页码
      * @param size  每页显示的条数
+     *
      * @return 模板路径admin/admin_post
      */
     @GetMapping
@@ -110,6 +113,7 @@ public class PostController extends BaseController {
      * @param keyword keyword 关键字
      * @param page    page 当前页码
      * @param size    size 每页显示条数
+     *
      * @return 模板路径admin/admin_post
      */
     @PostMapping(value = "/search")
@@ -133,6 +137,7 @@ public class PostController extends BaseController {
      *
      * @param postId 文章编号
      * @param model  model
+     *
      * @return 模板路径/themes/{theme}/post
      */
     @GetMapping(value = "/view")
@@ -157,6 +162,7 @@ public class PostController extends BaseController {
      *
      * @param postId 文章编号
      * @param model  model
+     *
      * @return 模板路径admin/admin_editor
      */
     @GetMapping(value = "/edit")
@@ -180,7 +186,7 @@ public class PostController extends BaseController {
                            @RequestParam("cateList") List cateList,
                            @RequestParam("tagList") String tagList,
                            HttpSession session) {
-        final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
+        final User user = (User) session.getAttribute(USER_SESSION_KEY);
         try {
             post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd()));
             post.setUser(user);
@@ -191,7 +197,7 @@ public class PostController extends BaseController {
             }
             //当没有选择文章缩略图的时候,自动分配一张内置的缩略图
             if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) {
-                post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg");
+                post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
             }
             postService.save(post);
             logsService.save(LogsRecord.PUSH_POST, post.getPostTitle(), request);
@@ -210,6 +216,7 @@ public class PostController extends BaseController {
      * @param cateList 分类目录
      * @param tagList  标签
      * @param session  session
+     *
      * @return JsonResult
      */
     @PostMapping(value = "/update")
@@ -231,7 +238,7 @@ public class PostController extends BaseController {
         }
         //当没有选择文章缩略图的时候,自动分配一张内置的缩略图
         if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) {
-            post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg");
+            post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
         }
         post = postService.save(post);
         if (null != post) {
@@ -245,6 +252,7 @@ public class PostController extends BaseController {
      * 处理移至回收站的请求
      *
      * @param postId 文章编号
+     *
      * @return 重定向到/admin/posts
      */
     @GetMapping(value = "/throw")
@@ -262,6 +270,7 @@ public class PostController extends BaseController {
      * 处理文章为发布的状态
      *
      * @param postId 文章编号
+     *
      * @return 重定向到/admin/posts
      */
     @GetMapping(value = "/revert")
@@ -280,6 +289,7 @@ public class PostController extends BaseController {
      * 处理删除文章的请求
      *
      * @param postId 文章编号
+     *
      * @return 重定向到/admin/posts
      */
     @GetMapping(value = "/remove")
@@ -301,6 +311,7 @@ public class PostController extends BaseController {
      * 更新所有摘要
      *
      * @param postSummary 文章摘要字数
+     *
      * @return JsonResult
      */
     @GetMapping(value = "/updateSummary")
@@ -320,6 +331,7 @@ public class PostController extends BaseController {
      * 验证文章路径是否已经存在
      *
      * @param postUrl 文章路径
+     *
      * @return JsonResult
      */
     @GetMapping(value = "/checkUrl")
@@ -337,6 +349,7 @@ public class PostController extends BaseController {
      * 将所有文章推送到百度
      *
      * @param baiduToken baiduToken
+     *
      * @return JsonResult
      */
     @GetMapping(value = "/pushAllToBaidu")
@@ -345,7 +358,7 @@ public class PostController extends BaseController {
         if (StrUtil.isBlank(baiduToken)) {
             return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.post.no-baidu-token"));
         }
-        final String blogUrl = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
+        final String blogUrl = OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
         final List posts = postService.findAll(PostTypeEnum.POST_TYPE_POST.getDesc());
         final StringBuilder urls = new StringBuilder();
         for (Post post : posts) {
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java
index e58a2f51b..087edacf0 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.web.controller.admin;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.dto.LogsRecord;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
@@ -33,6 +32,9 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.util.List;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+import static cc.ryanc.halo.model.dto.HaloConst.THEMES;
+
 /**
  * 
  *     后台主题管理控制器
@@ -70,8 +72,8 @@ public class ThemeController extends BaseController {
     @GetMapping
     public String themes(Model model) {
         model.addAttribute("activeTheme", BaseController.THEME);
-        if (null != HaloConst.THEMES) {
-            model.addAttribute("themes", HaloConst.THEMES);
+        if (null != THEMES) {
+            model.addAttribute("themes", THEMES);
         }
         return "admin/admin_theme";
     }
@@ -94,10 +96,10 @@ public class ThemeController extends BaseController {
             optionsService.saveOption(BlogPropertiesEnum.THEME.getProp(), siteTheme);
             //设置主题
             BaseController.THEME = siteTheme;
-            HaloConst.OPTIONS.clear();
-            HaloConst.OPTIONS = optionsService.findAllOptions();
+            OPTIONS.clear();
+            OPTIONS = optionsService.findAllOptions();
             configuration.setSharedVariable("themeName", siteTheme);
-            configuration.setSharedVariable("options", HaloConst.OPTIONS);
+            configuration.setSharedVariable("options", OPTIONS);
             log.info("Changed theme to {}", siteTheme);
             logsService.save(LogsRecord.CHANGE_THEME, "更换为" + siteTheme, request);
             return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.theme.change-success", new Object[]{siteTheme}));
@@ -128,8 +130,8 @@ public class ThemeController extends BaseController {
                 logsService.save(LogsRecord.UPLOAD_THEME, file.getOriginalFilename(), request);
                 ZipUtil.unzip(themePath, new File(basePath.getAbsolutePath(), "templates/themes/"));
                 FileUtil.del(themePath);
-                HaloConst.THEMES.clear();
-                HaloConst.THEMES = HaloUtils.getThemes();
+                THEMES.clear();
+                THEMES = HaloUtils.getThemes();
             } else {
                 log.error("Upload theme failed, no file selected");
                 return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.upload-no-file"));
@@ -154,8 +156,8 @@ public class ThemeController extends BaseController {
             final File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
             final File themePath = new File(basePath.getAbsolutePath(), "templates/themes/" + themeName);
             FileUtil.del(themePath);
-            HaloConst.THEMES.clear();
-            HaloConst.THEMES = HaloUtils.getThemes();
+            THEMES.clear();
+            THEMES = HaloUtils.getThemes();
         } catch (Exception e) {
             log.error("Delete theme failed: {}", e.getMessage());
         }
@@ -194,8 +196,8 @@ public class ThemeController extends BaseController {
             if (NOT_FOUND_GIT.equals(cmdResult)) {
                 return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.no-git"));
             }
-            HaloConst.THEMES.clear();
-            HaloConst.THEMES = HaloUtils.getThemes();
+            THEMES.clear();
+            THEMES = HaloUtils.getThemes();
         } catch (FileNotFoundException e) {
             log.error("Cloning theme failed: {}", e.getMessage());
             return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.clone-theme-failed") + e.getMessage());
@@ -220,8 +222,8 @@ public class ThemeController extends BaseController {
             if (NOT_FOUND_GIT.equals(cmdResult)) {
                 return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.no-git"));
             }
-            HaloConst.THEMES.clear();
-            HaloConst.THEMES = HaloUtils.getThemes();
+            THEMES.clear();
+            THEMES = HaloUtils.getThemes();
         } catch (Exception e) {
             log.error("Update theme failed: {}", e.getMessage());
             return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.update-theme-failed") + e.getMessage());
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/UserController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/UserController.java
index ca98297bd..0430b5fc1 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/UserController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/UserController.java
@@ -1,7 +1,6 @@
 package cc.ryanc.halo.web.controller.admin;
 
 import cc.ryanc.halo.model.domain.User;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.enums.ResultCodeEnum;
 import cc.ryanc.halo.service.UserService;
@@ -18,6 +17,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpSession;
 import javax.validation.Valid;
 
+import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
+
 /**
  * 
  *     后台用户管理控制器
@@ -55,6 +56,7 @@ public class UserController {
      *
      * @param user    user
      * @param session session
+     *
      * @return JsonResult
      */
     @PostMapping(value = "save")
@@ -68,7 +70,7 @@ public class UserController {
             }
             userService.save(user);
             configuration.setSharedVariable("user", userService.findUser());
-            session.removeAttribute(HaloConst.USER_SESSION_KEY);
+            session.removeAttribute(USER_SESSION_KEY);
         } catch (Exception e) {
             log.error("Failed to modify user profile: {}", e.getMessage());
             return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.edit-failed"));
@@ -83,6 +85,7 @@ public class UserController {
      * @param newPass    新密码
      * @param userId     用户编号
      * @param session    session
+     *
      * @return JsonResult
      */
     @PostMapping(value = "changePass")
@@ -96,7 +99,7 @@ public class UserController {
             if (null != user) {
                 user.setUserPass(SecureUtil.md5(newPass));
                 userService.save(user);
-                session.removeAttribute(HaloConst.USER_SESSION_KEY);
+                session.removeAttribute(USER_SESSION_KEY);
             } else {
                 return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.user.old-password-error"));
             }
diff --git a/src/main/java/cc/ryanc/halo/web/controller/api/ApiMetaWeBlog.java b/src/main/java/cc/ryanc/halo/web/controller/api/ApiMetaWeBlog.java
index 71a94def6..2ca7c40d9 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/api/ApiMetaWeBlog.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/api/ApiMetaWeBlog.java
@@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.api;
 import cc.ryanc.halo.model.domain.Category;
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.User;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.service.CategoryService;
 import cc.ryanc.halo.service.PostService;
@@ -26,6 +25,8 @@ import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
 import java.util.List;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * @author : RYAN0UP
  * @date : 2018/12/11
@@ -47,6 +48,7 @@ public class ApiMetaWeBlog {
 
     /**
      * @param request request
+     *
      * @return String
      */
     @PostMapping
@@ -124,7 +126,9 @@ public class ApiMetaWeBlog {
 
     /**
      * @param methodCall
+     *
      * @return
+     *
      * @throws Exception
      */
     private Post parsetPost(final JSONObject methodCall) throws Exception {
@@ -136,20 +140,20 @@ public class ApiMetaWeBlog {
         for (int i = 0; i < members.length(); i++) {
             final JSONObject member = members.getJSONObject(i);
             final String name = member.getString("name");
-            if("dateCreated".equals(name)){
+            if ("dateCreated".equals(name)) {
                 final String dateString = member.getJSONObject("value").getString("dateTime.iso8601");
                 Date date = DateUtil.parseDate(dateString);
                 ret.setPostDate(date);
-            }else if ("title".equals(name)){
+            } else if ("title".equals(name)) {
                 ret.setPostTitle(member.getJSONObject("value").getString("string"));
-            }else if("description".equals(name)){
+            } else if ("description".equals(name)) {
                 final String content = member.getJSONObject("value").optString("string");
                 ret.setPostContent(content);
                 ret.setPostContentMd(content);
-            }else if("categories".equals(name)){
+            } else if ("categories".equals(name)) {
                 final StrBuilder cateBuilder = new StrBuilder();
                 final JSONObject data = member.getJSONObject("value").getJSONObject("array").getJSONObject("data");
-                if(0==data.length()){
+                if (0 == data.length()) {
                     throw new Exception("At least one category");
                 }
             }
@@ -161,6 +165,7 @@ public class ApiMetaWeBlog {
      * 根据文章编号获取文章信息
      *
      * @param postId 文章编号
+     *
      * @return 文章信息xml格式
      */
     private String getPost(Long postId) {
@@ -175,6 +180,7 @@ public class ApiMetaWeBlog {
      * 根据文章编号构建文章信息
      *
      * @param postId 文章编号
+     *
      * @return 文章信息xml格式
      */
     private String buildPost(final Long postId) {
@@ -224,13 +230,13 @@ public class ApiMetaWeBlog {
      * @return 博客信息xml节点
      */
     private String buildBlogInfo() {
-        final String blogId = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
-        final String blogTitle = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp());
+        final String blogId = OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
+        final String blogTitle = OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp());
         final StrBuilder strBuilder = new StrBuilder("blogid");
         strBuilder.append(blogId);
         strBuilder.append("");
         strBuilder.append("url");
-        strBuilder.append(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+        strBuilder.append(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
         strBuilder.append("");
         strBuilder.append("blogName");
         strBuilder.append(blogTitle);
@@ -242,6 +248,7 @@ public class ApiMetaWeBlog {
      * 组装分类信息
      *
      * @return 分类信息xml格式
+     *
      * @throws Exception Exception
      */
     private String getCategories() throws Exception {
@@ -258,6 +265,7 @@ public class ApiMetaWeBlog {
      * 构建分类信息
      *
      * @return 分类信息xml节点
+     *
      * @throws Exception Exception
      */
     private String buildCategories() throws Exception {
@@ -271,7 +279,7 @@ public class ApiMetaWeBlog {
             strBuilder.append("description").append("").append(cateName).append("");
             strBuilder.append("title").append("").append(cateName).append("");
             strBuilder.append("categoryid").append("").append(cateId).append("");
-            strBuilder.append("htmlUrl").append("").append(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())).append("/categories/").append(cateName).append("");
+            strBuilder.append("htmlUrl").append("").append(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())).append("/categories/").append(cateName).append("");
             strBuilder.append("");
         }
         return strBuilder.toString();
diff --git a/src/main/java/cc/ryanc/halo/web/controller/api/ApiPostController.java b/src/main/java/cc/ryanc/halo/web/controller/api/ApiPostController.java
index afdf492e9..0c660ef32 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/api/ApiPostController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/api/ApiPostController.java
@@ -1,7 +1,6 @@
 package cc.ryanc.halo.web.controller.api;
 
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.PostStatusEnum;
@@ -16,6 +15,8 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.web.bind.annotation.*;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     文章API
@@ -102,8 +103,8 @@ public class ApiPostController {
     public JsonResult posts(@PathVariable(value = "page") Integer page) {
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         int size = 10;
-        if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
-            size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
+        if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
+            size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
         }
         final Pageable pageable = PageRequest.of(page - 1, size, sort);
         final Page posts = postService.findPostByStatus(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
diff --git a/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java b/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java
index 8317ad3df..2ad060383 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java
@@ -1,13 +1,13 @@
 package cc.ryanc.halo.web.controller.core;
 
 import cc.ryanc.halo.model.domain.*;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
 import cc.ryanc.halo.model.dto.LogsRecord;
 import cc.ryanc.halo.model.enums.*;
 import cc.ryanc.halo.service.*;
 import cc.ryanc.halo.utils.MarkdownUtils;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.SecureUtil;
 import freemarker.template.Configuration;
@@ -23,6 +23,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static cc.ryanc.halo.model.dto.HaloConst.*;
+
 /**
  * 
  *     博客初始化控制器
@@ -70,7 +72,7 @@ public class InstallController {
     @GetMapping
     public String install(Model model) {
         try {
-            if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
+            if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
                 model.addAttribute("isInstall", true);
             } else {
                 model.addAttribute("isInstall", false);
@@ -106,7 +108,7 @@ public class InstallController {
                                 @RequestParam("userPwd") String userPwd,
                                 HttpServletRequest request) {
         try {
-            if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
+            if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
                 return new JsonResult(ResultCodeEnum.FAIL.getCode(), "该博客已初始化,不能再次安装!");
             }
             //创建新的用户
@@ -141,6 +143,7 @@ public class InstallController {
             post.setUser(user);
             post.setCategories(categories);
             post.setAllowComment(AllowCommentEnum.ALLOW.getCode());
+            post.setPostThumbnail("/static/halo-frontend/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 11) + ".jpg");
             postService.save(post);
 
             //第一个评论
@@ -188,9 +191,9 @@ public class InstallController {
             menuArchive.setMenuIcon(" ");
             menuService.save(menuArchive);
 
-            HaloConst.OPTIONS.clear();
-            HaloConst.OPTIONS = optionsService.findAllOptions();
-            configuration.setSharedVariable("options", HaloConst.OPTIONS);
+            OPTIONS.clear();
+            OPTIONS = optionsService.findAllOptions();
+            configuration.setSharedVariable("options", OPTIONS);
             configuration.setSharedVariable("user", userService.findUser());
         } catch (Exception e) {
             log.error(e.getMessage());
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontArchiveController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontArchiveController.java
index 520afc667..63f1edafb 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontArchiveController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontArchiveController.java
@@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.front;
 import cc.ryanc.halo.model.domain.Comment;
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.Tag;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.ListPage;
 import cc.ryanc.halo.model.enums.*;
 import cc.ryanc.halo.service.CommentService;
@@ -33,6 +32,8 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     前台文章归档控制器
@@ -58,6 +59,7 @@ public class FrontArchiveController extends BaseController {
      * 文章归档
      *
      * @param model model
+     *
      * @return 模板路径
      */
     @GetMapping
@@ -70,6 +72,7 @@ public class FrontArchiveController extends BaseController {
      *
      * @param model model
      * @param page  page 当前页码
+     *
      * @return 模板路径/themes/{theme}/archives
      */
     @GetMapping(value = "page/{page}")
@@ -94,6 +97,7 @@ public class FrontArchiveController extends BaseController {
      * @param model model
      * @param year  year 年份
      * @param month month 月份
+     *
      * @return 模板路径/themes/{theme}/archives
      */
     @GetMapping(value = "{year}/{month}")
@@ -114,6 +118,7 @@ public class FrontArchiveController extends BaseController {
      *
      * @param postUrl 文章路径名
      * @param model   model
+     *
      * @return 模板路径/themes/{theme}/post
      */
     @GetMapping(value = "{postUrl}")
@@ -140,7 +145,7 @@ public class FrontArchiveController extends BaseController {
             model.addAttribute("nextPost", nextPost);
         }
         List comments = null;
-        if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
+        if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
             comments = commentService.findCommentsByPostAndCommentStatus(post, CommentStatusEnum.PUBLISHED.getCode());
         } else {
             comments = commentService.findCommentsByPostAndCommentStatusNot(post, CommentStatusEnum.RECYCLE.getCode());
@@ -156,8 +161,8 @@ public class FrontArchiveController extends BaseController {
         //默认显示10条
         int size = 10;
         //获取每页评论条数
-        if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
-            size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
+        if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
+            size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
         }
         //评论分页
         final ListPage commentsPage = new ListPage(CommentUtil.getComments(comments), cp, size);
@@ -187,6 +192,7 @@ public class FrontArchiveController extends BaseController {
      * @param postId       postId
      * @param postPassword postPassword
      * @param response     response
+     *
      * @return String
      */
     @PostMapping(value = "/verifyPostPassword")
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontCategoryController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontCategoryController.java
index c0c385111..0d5809dc1 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontCategoryController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontCategoryController.java
@@ -2,7 +2,6 @@ package cc.ryanc.halo.web.controller.front;
 
 import cc.ryanc.halo.model.domain.Category;
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.service.CategoryService;
 import cc.ryanc.halo.service.PostService;
@@ -22,6 +21,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 
 import java.util.List;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     前台文章分类控制器
@@ -87,8 +88,8 @@ public class FrontCategoryController extends BaseController {
         }
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         int size = 10;
-        if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
-            size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
+        if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
+            size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
         }
         final Pageable pageable = PageRequest.of(page - 1, size, sort);
         final Page posts = postService.findPostByCategories(category, pageable);
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontCommentController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontCommentController.java
index 4658f1a1a..d730d09b0 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontCommentController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontCommentController.java
@@ -2,16 +2,16 @@ package cc.ryanc.halo.web.controller.front;
 
 import cc.ryanc.halo.model.domain.Comment;
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.JsonResult;
-import cc.ryanc.halo.model.enums.*;
+import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
+import cc.ryanc.halo.model.enums.PostTypeEnum;
+import cc.ryanc.halo.model.enums.ResultCodeEnum;
+import cc.ryanc.halo.model.enums.TrueFalseEnum;
 import cc.ryanc.halo.service.CommentService;
 import cc.ryanc.halo.service.MailService;
 import cc.ryanc.halo.service.PostService;
 import cc.ryanc.halo.service.UserService;
-import cc.ryanc.halo.utils.CommentUtil;
 import cc.ryanc.halo.utils.OwoUtil;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.text.StrBuilder;
 import cn.hutool.core.util.StrUtil;
@@ -21,21 +21,19 @@ import cn.hutool.extra.servlet.ServletUtil;
 import cn.hutool.http.HtmlUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.Optional;
+
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
 
 /**
  * 
@@ -115,7 +113,7 @@ public class FrontCommentController {
             } else {
                 new EmailToAdmin(comment, post).start();
             }
-            if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
+            if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
                 return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "你的评论已经提交,待博主审核之后可显示。");
             } else {
                 return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "你的评论已经提交,刷新后即可显示。");
@@ -139,11 +137,11 @@ public class FrontCommentController {
 
         @Override
         public void run() {
-            if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
+            if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
                 try {
                     //发送邮件到博主
                     final Map map = new HashMap<>(5);
-                    final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+                    final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
                     if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
                         pageUrl.append("/archives/");
                     } else {
@@ -182,10 +180,10 @@ public class FrontCommentController {
         @Override
         public void run() {
             //发送通知给对方
-            if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
+            if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp()), TrueFalseEnum.TRUE.getDesc()) && StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp()), TrueFalseEnum.TRUE.getDesc())) {
                 if (Validator.isEmail(lastComment.getCommentAuthorEmail())) {
                     final Map map = new HashMap<>(8);
-                    final StrBuilder pageUrl = new StrBuilder(HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+                    final StrBuilder pageUrl = new StrBuilder(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
                     if (StrUtil.equals(post.getPostType(), PostTypeEnum.POST_TYPE_POST.getDesc())) {
                         pageUrl.append("/archives/");
 
@@ -196,15 +194,15 @@ public class FrontCommentController {
                     pageUrl.append("#comment-id-");
                     pageUrl.append(comment.getCommentId());
                     map.put("pageUrl", pageUrl.toString());
-                    map.put("blogTitle", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
+                    map.put("blogTitle", OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
                     map.put("commentAuthor", lastComment.getCommentAuthor());
                     map.put("pageName", lastComment.getPost().getPostTitle());
                     map.put("commentContent", lastComment.getCommentContent());
                     map.put("replyAuthor", comment.getCommentAuthor());
                     map.put("replyContent", comment.getCommentContent());
-                    map.put("blogUrl", HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
+                    map.put("blogUrl", OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
                     mailService.sendTemplateMail(
-                            lastComment.getCommentAuthorEmail(), "您在" + HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
+                            lastComment.getCommentAuthorEmail(), "您在" + OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()) + "的评论有了新回复", map, "common/mail_template/mail_reply.ftl");
                 }
             }
         }
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontIndexController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontIndexController.java
index c7e6751cf..14a51a13c 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontIndexController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontIndexController.java
@@ -1,7 +1,6 @@
 package cc.ryanc.halo.web.controller.front;
 
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.service.PostService;
 import cc.ryanc.halo.web.controller.core.BaseController;
@@ -19,6 +18,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     前台首页控制器
@@ -40,6 +41,7 @@ public class FrontIndexController extends BaseController {
      * 请求首页
      *
      * @param model model
+     *
      * @return 模板路径
      */
     @GetMapping
@@ -53,6 +55,7 @@ public class FrontIndexController extends BaseController {
      * @param model model
      * @param page  当前页码
      * @param size  每页数量
+     *
      * @return 模板路径/themes/{theme}/index
      */
     @GetMapping(value = "page/{page}")
@@ -61,8 +64,8 @@ public class FrontIndexController extends BaseController {
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         //默认显示10条
         int size = 10;
-        if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
-            size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
+        if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
+            size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
         }
         //所有文章数据,分页
         final Pageable pageable = PageRequest.of(page - 1, size, sort);
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java
index 4b3001046..474ba865d 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java
@@ -17,6 +17,8 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
 
+import static cc.ryanc.halo.model.dto.HaloConst.*;
+
 /**
  * 
  *     sitemap,rss页面控制器
@@ -39,20 +41,21 @@ public class FrontOthersController {
     @GetMapping(value = {"feed", "feed.xml", "atom", "atom.xml"}, produces = "application/xml;charset=UTF-8")
     @ResponseBody
     public String feed() {
-        String rssPosts = HaloConst.OPTIONS.get(BlogPropertiesEnum.RSS_POSTS.getProp());
+        String rssPosts = OPTIONS.get(BlogPropertiesEnum.RSS_POSTS.getProp());
         if (StrUtil.isBlank(rssPosts)) {
             rssPosts = "20";
         }
         //获取文章列表并根据时间排序
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         final Pageable pageable = PageRequest.of(0, Integer.parseInt(rssPosts), sort);
-        final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
-        final List posts = postsPage.getContent();
-        for (Post post : posts) {
+        final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable).map(post -> {
             if(StrUtil.isNotEmpty(post.getPostPassword())){
                 post.setPostContent("该文章为加密文章");
+                post.setPostSummary("该文章为加密文章");
             }
-        }
+            return post;
+        });
+        final List posts = postsPage.getContent();
         return postService.buildRss(posts);
     }
 
@@ -67,13 +70,14 @@ public class FrontOthersController {
         //获取文章列表并根据时间排序
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         final Pageable pageable = PageRequest.of(0, 999, sort);
-        final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
-        final List posts = postsPage.getContent();
-        for (Post post : posts) {
+        final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable).map(post -> {
             if(StrUtil.isNotEmpty(post.getPostPassword())){
                 post.setPostContent("该文章为加密文章");
+                post.setPostSummary("该文章为加密文章");
             }
-        }
+            return post;
+        });
+        final List posts = postsPage.getContent();
         return postService.buildSiteMap(posts);
     }
 }
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontPageController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontPageController.java
index c46bcd552..4dd7b258a 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontPageController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontPageController.java
@@ -3,7 +3,6 @@ package cc.ryanc.halo.web.controller.front;
 import cc.ryanc.halo.model.domain.Comment;
 import cc.ryanc.halo.model.domain.Gallery;
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.dto.ListPage;
 import cc.ryanc.halo.model.enums.*;
 import cc.ryanc.halo.service.CommentService;
@@ -22,6 +21,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     前台内置页面,自定义页面控制器
@@ -81,15 +82,15 @@ public class FrontPageController extends BaseController {
             return this.renderNotFound();
         }
         List comments = null;
-        if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
+        if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
             comments = commentService.findCommentsByPostAndCommentStatus(post, CommentStatusEnum.PUBLISHED.getCode());
         } else {
             comments = commentService.findCommentsByPostAndCommentStatusNot(post, CommentStatusEnum.RECYCLE.getCode());
         }
         //默认显示10条
         int size = 10;
-        if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
-            size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
+        if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
+            size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
         }
         //评论分页
         final ListPage commentsPage = new ListPage(CommentUtil.getComments(comments), cp, size);
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontSearchController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontSearchController.java
index f231767ed..4050cd5eb 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontSearchController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontSearchController.java
@@ -1,7 +1,6 @@
 package cc.ryanc.halo.web.controller.front;
 
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.PostStatusEnum;
 import cc.ryanc.halo.model.enums.PostTypeEnum;
@@ -23,6 +22,8 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     文章检索
@@ -44,6 +45,7 @@ public class FrontSearchController extends BaseController {
      *
      * @param model   model
      * @param keyword 关键词
+     *
      * @return 模板路径/themes/{theme}/search
      */
     @GetMapping
@@ -58,6 +60,7 @@ public class FrontSearchController extends BaseController {
      * @param model   model
      * @param keyword 关键词
      * @param page    当前页码
+     *
      * @return 模板路径/themes/{theme}/search
      */
     @GetMapping(value = "page/{page}")
@@ -66,11 +69,11 @@ public class FrontSearchController extends BaseController {
                          @PathVariable(value = "page") Integer page) {
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         int size = 10;
-        if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
-            size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
+        if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
+            size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
         }
         final Pageable pageable = PageRequest.of(page - 1, size, sort);
-        final Page posts = postService.searchPosts(HtmlUtil.escape(keyword),PostTypeEnum.POST_TYPE_POST.getDesc(),PostStatusEnum.PUBLISHED.getCode(),pageable);
+        final Page posts = postService.searchPosts(HtmlUtil.escape(keyword), PostTypeEnum.POST_TYPE_POST.getDesc(), PostStatusEnum.PUBLISHED.getCode(), pageable);
         final int[] rainbow = PageUtil.rainbow(page, posts.getTotalPages(), 3);
         model.addAttribute("is_search", true);
         model.addAttribute("keyword", keyword);
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontTagController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontTagController.java
index fce93bbd2..f4097e68e 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontTagController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontTagController.java
@@ -2,7 +2,6 @@ package cc.ryanc.halo.web.controller.front;
 
 import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.domain.Tag;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.service.PostService;
 import cc.ryanc.halo.service.TagService;
@@ -20,6 +19,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     前台标签控制器
@@ -81,8 +82,8 @@ public class FrontTagController extends BaseController {
         }
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         int size = 10;
-        if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
-            size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
+        if (StrUtil.isNotBlank(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()))) {
+            size = Integer.parseInt(OPTIONS.get(BlogPropertiesEnum.INDEX_POSTS.getProp()));
         }
         final Pageable pageable = PageRequest.of(page - 1, size, sort);
         final Page posts = postService.findPostsByTags(tag, pageable);
diff --git a/src/main/java/cc/ryanc/halo/web/interceptor/ApiInterceptor.java b/src/main/java/cc/ryanc/halo/web/interceptor/ApiInterceptor.java
index 89841c385..06c7b4b4d 100644
--- a/src/main/java/cc/ryanc/halo/web/interceptor/ApiInterceptor.java
+++ b/src/main/java/cc/ryanc/halo/web/interceptor/ApiInterceptor.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.web.interceptor;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.TrueFalseEnum;
 import cn.hutool.core.util.StrUtil;
@@ -14,6 +13,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
 import java.util.Map;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     API接口拦截器,用户可自己选择关闭或者开启
@@ -29,8 +30,8 @@ public class ApiInterceptor implements HandlerInterceptor {
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.API_STATUS.getProp()))) {
-            if (StrUtil.equals(request.getHeader(TOKEN), HaloConst.OPTIONS.get(BlogPropertiesEnum.API_TOKEN.getProp()))) {
+        if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.API_STATUS.getProp()))) {
+            if (StrUtil.equals(request.getHeader(TOKEN), OPTIONS.get(BlogPropertiesEnum.API_TOKEN.getProp()))) {
                 return true;
             } else {
                 response.setCharacterEncoding("UTF-8");
diff --git a/src/main/java/cc/ryanc/halo/web/interceptor/InstallInterceptor.java b/src/main/java/cc/ryanc/halo/web/interceptor/InstallInterceptor.java
index d69166598..c418a9217 100644
--- a/src/main/java/cc/ryanc/halo/web/interceptor/InstallInterceptor.java
+++ b/src/main/java/cc/ryanc/halo/web/interceptor/InstallInterceptor.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.web.interceptor;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.TrueFalseEnum;
 import cn.hutool.core.util.StrUtil;
@@ -11,6 +10,8 @@ import org.springframework.web.servlet.ModelAndView;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * 
  *     博客初始化拦截器
@@ -24,7 +25,7 @@ public class InstallInterceptor implements HandlerInterceptor {
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
-        if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), HaloConst.OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
+        if (StrUtil.equals(TrueFalseEnum.TRUE.getDesc(), OPTIONS.get(BlogPropertiesEnum.IS_INSTALL.getProp()))) {
             return true;
         }
         response.sendRedirect("/install");
diff --git a/src/main/java/cc/ryanc/halo/web/interceptor/LocaleInterceptor.java b/src/main/java/cc/ryanc/halo/web/interceptor/LocaleInterceptor.java
index 73b301ecb..736262570 100644
--- a/src/main/java/cc/ryanc/halo/web/interceptor/LocaleInterceptor.java
+++ b/src/main/java/cc/ryanc/halo/web/interceptor/LocaleInterceptor.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.web.interceptor;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.LocaleEnum;
 import cn.hutool.core.util.StrUtil;
@@ -13,6 +12,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Locale;
 
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
+
 /**
  * @author : wangry
  * @version : 1.0
@@ -27,7 +28,7 @@ public class LocaleInterceptor implements HandlerInterceptor {
         if (null != attribute) {
             return true;
         }
-        if (StrUtil.equals(LocaleEnum.EN_US.getValue(), HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_LOCALE.getProp()))) {
+        if (StrUtil.equals(LocaleEnum.EN_US.getValue(), OPTIONS.get(BlogPropertiesEnum.BLOG_LOCALE.getProp()))) {
             request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en", "US"));
         } else {
             request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh", "CN"));
diff --git a/src/main/java/cc/ryanc/halo/web/interceptor/LoginInterceptor.java b/src/main/java/cc/ryanc/halo/web/interceptor/LoginInterceptor.java
index 11e618b4c..c1d17595d 100755
--- a/src/main/java/cc/ryanc/halo/web/interceptor/LoginInterceptor.java
+++ b/src/main/java/cc/ryanc/halo/web/interceptor/LoginInterceptor.java
@@ -1,6 +1,5 @@
 package cc.ryanc.halo.web.interceptor;
 
-import cc.ryanc.halo.model.dto.HaloConst;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
@@ -8,6 +7,8 @@ import org.springframework.web.servlet.ModelAndView;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import static cc.ryanc.halo.model.dto.HaloConst.USER_SESSION_KEY;
+
 /**
  * 
  *     后台登录控制器
@@ -21,7 +22,7 @@ public class LoginInterceptor implements HandlerInterceptor {
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        final Object obj = request.getSession().getAttribute(HaloConst.USER_SESSION_KEY);
+        final Object obj = request.getSession().getAttribute(USER_SESSION_KEY);
         //如果user不为空则放行
         if (null != obj) {
             return true;

From d68d7019f0a9cf50a76f217c32b76b75c8d4a5d9 Mon Sep 17 00:00:00 2001
From: ruibaby 
Date: Thu, 31 Jan 2019 15:18:58 +0800
Subject: [PATCH 06/10] =?UTF-8?q?:art:=20=E4=BF=AE=E6=94=B9rss/sitemap?=
 =?UTF-8?q?=E7=9A=84=E6=B8=B2=E6=9F=93=E6=96=B9=E5=BC=8F=EF=BC=8C=E6=96=B0?=
 =?UTF-8?q?=E5=A2=9Ehtml=E5=BD=A2=E5=BC=8F=E7=9A=84sitemap?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                       |   8 -
 .../halo/config/WebMvcAutoConfiguration.java  |   3 +-
 .../cc/ryanc/halo/service/PostService.java    |  16 --
 .../halo/service/impl/PostServiceImpl.java    |  30 ---
 .../java/cc/ryanc/halo/utils/HaloUtils.java   |  88 --------
 .../front/FrontOthersController.java          |  88 ++++++--
 src/main/resources/robots.txt                 |   3 -
 .../resources/templates/common/web/robots.ftl |   4 +
 .../resources/templates/common/web/rss.ftl    |  21 ++
 .../templates/common/web/sitemap_html.ftl     | 201 ++++++++++++++++++
 .../templates/common/web/sitemap_xml.ftl      |  11 +
 11 files changed, 310 insertions(+), 163 deletions(-)
 delete mode 100644 src/main/resources/robots.txt
 create mode 100644 src/main/resources/templates/common/web/robots.ftl
 create mode 100644 src/main/resources/templates/common/web/rss.ftl
 create mode 100644 src/main/resources/templates/common/web/sitemap_html.ftl
 create mode 100644 src/main/resources/templates/common/web/sitemap_xml.ftl

diff --git a/pom.xml b/pom.xml
index b21416366..7a53b326f 100755
--- a/pom.xml
+++ b/pom.xml
@@ -34,7 +34,6 @@
 		0.0.4
 		1.18.4
 		3.6.3
-		1.0
 		4.4.2
 		4.0.1
 		7.2.18
@@ -120,13 +119,6 @@
 			${ehcache.version}
 		
 
-		
-		
-			rome
-			rome
-			${rome.version}
-		
-
 		
 		
 			cn.hutool
diff --git a/src/main/java/cc/ryanc/halo/config/WebMvcAutoConfiguration.java b/src/main/java/cc/ryanc/halo/config/WebMvcAutoConfiguration.java
index 621ffe815..27e4737c8 100644
--- a/src/main/java/cc/ryanc/halo/config/WebMvcAutoConfiguration.java
+++ b/src/main/java/cc/ryanc/halo/config/WebMvcAutoConfiguration.java
@@ -83,8 +83,7 @@ public class WebMvcAutoConfiguration implements WebMvcConfigurer {
         registry.addResourceHandler("/static/**")
                 .addResourceLocations("classpath:/static/");
         registry.addResourceHandler("/**")
-                .addResourceLocations("classpath:/templates/themes/")
-                .addResourceLocations("classpath:/robots.txt");
+                .addResourceLocations("classpath:/templates/themes/");
         registry.addResourceHandler("/upload/**")
                 .addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/halo/upload/");
         registry.addResourceHandler("/favicon.ico")
diff --git a/src/main/java/cc/ryanc/halo/service/PostService.java b/src/main/java/cc/ryanc/halo/service/PostService.java
index 2a5bd1131..f35acaa36 100755
--- a/src/main/java/cc/ryanc/halo/service/PostService.java
+++ b/src/main/java/cc/ryanc/halo/service/PostService.java
@@ -248,22 +248,6 @@ public interface PostService {
      */
     Integer getCountByStatus(Integer status);
 
-    /**
-     * 生成rss
-     *
-     * @param posts posts
-     * @return String
-     */
-    String buildRss(List posts);
-
-    /**
-     * 生成sitemap
-     *
-     * @param posts posts
-     * @return String
-     */
-    String buildSiteMap(List posts);
-
     /**
      * 缓存阅读数
      *
diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
index 7c86b09d9..ca127cc43 100755
--- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java
@@ -508,36 +508,6 @@ public class PostServiceImpl implements PostService {
         return postRepository.countAllByPostStatusAndPostType(status, PostTypeEnum.POST_TYPE_POST.getDesc());
     }
 
-    /**
-     * 生成rss
-     *
-     * @param posts posts
-     *
-     * @return String
-     */
-    @Override
-    public String buildRss(List posts) {
-        String rss = "";
-        try {
-            rss = HaloUtils.getRss(posts);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return rss;
-    }
-
-    /**
-     * 生成sitemap
-     *
-     * @param posts posts
-     *
-     * @return String
-     */
-    @Override
-    public String buildSiteMap(List posts) {
-        return HaloUtils.getSiteMap(posts);
-    }
-
     /**
      * 缓存阅读数
      *
diff --git a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
index a2d31b04f..381df8fe2 100755
--- a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
+++ b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java
@@ -1,19 +1,11 @@
 package cc.ryanc.halo.utils;
 
-import cc.ryanc.halo.model.domain.Post;
 import cc.ryanc.halo.model.dto.BackupDto;
 import cc.ryanc.halo.model.dto.Theme;
-import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.CommonParamsEnum;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.text.StrBuilder;
 import cn.hutool.core.util.StrUtil;
-import com.sun.syndication.feed.rss.Channel;
-import com.sun.syndication.feed.rss.Content;
-import com.sun.syndication.feed.rss.Item;
-import com.sun.syndication.io.FeedException;
-import com.sun.syndication.io.WireFeedOutput;
 import io.github.biezhi.ome.OhMyEmail;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.util.Assert;
@@ -32,8 +24,6 @@ import java.nio.file.attribute.BasicFileAttributeView;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.*;
 
-import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
-
 /**
  * 
  * 常用工具
@@ -285,84 +275,6 @@ public class HaloUtils {
         }
     }
 
-    /**
-     * 生成rss
-     *
-     * @param posts posts
-     *
-     * @return String
-     *
-     * @throws FeedException FeedException
-     */
-    public static String getRss(List posts) throws FeedException {
-        Assert.notEmpty(posts, "posts must not be empty");
-
-        final Channel channel = new Channel("rss_2.0");
-        if (null == OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp())) {
-            channel.setTitle("");
-        } else {
-            channel.setTitle(OPTIONS.get(BlogPropertiesEnum.BLOG_TITLE.getProp()));
-        }
-        if (null == OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp())) {
-            channel.setLink("");
-        } else {
-            channel.setLink(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()));
-        }
-        if (null == OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp())) {
-            channel.setDescription("");
-        } else {
-            channel.setDescription(OPTIONS.get(BlogPropertiesEnum.SEO_DESC.getProp()));
-        }
-        channel.setLanguage("zh-CN");
-        final List items = new ArrayList<>();
-        for (Post post : posts) {
-            final Item item = new Item();
-            item.setTitle(post.getPostTitle());
-            final Content content = new Content();
-            String value = post.getPostContent();
-            final char[] xmlChar = value.toCharArray();
-            for (int i = 0; i < xmlChar.length; ++i) {
-                if (xmlChar[i] > 0xFFFD) {
-                    xmlChar[i] = ' ';
-                } else if (xmlChar[i] < 0x20 && xmlChar[i] != 't' & xmlChar[i] != 'n' & xmlChar[i] != 'r') {
-                    xmlChar[i] = ' ';
-                }
-            }
-            value = new String(xmlChar);
-            content.setValue(value);
-            item.setContent(content);
-            item.setLink(OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/" + post.getPostUrl());
-            item.setPubDate(post.getPostDate());
-            items.add(item);
-        }
-        channel.setItems(items);
-        final WireFeedOutput out = new WireFeedOutput();
-        return out.outputString(channel);
-    }
-
-    /**
-     * 获取sitemap
-     *
-     * @param posts posts
-     *
-     * @return String
-     */
-    public static String getSiteMap(List posts) {
-        Assert.notEmpty(posts, "post mut not be empty");
-        final StrBuilder head = new StrBuilder("\n");
-        final StrBuilder urlBody = new StrBuilder();
-        final String urlPath = OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp()) + "/archives/";
-        for (Post post : posts) {
-            urlBody.append("");
-            urlBody.append(urlPath);
-            urlBody.append(post.getPostUrl());
-            urlBody.append("");
-            urlBody.append(DateUtil.format(post.getPostDate(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
-            urlBody.append("");
-        }
-        return head.append(urlBody).append("").toString();
-    }
-
     /**
      * 配置邮件
      *
diff --git a/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java
index 474ba865d..956914b9f 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/front/FrontOthersController.java
@@ -1,23 +1,28 @@
 package cc.ryanc.halo.web.controller.front;
 
 import cc.ryanc.halo.model.domain.Post;
-import cc.ryanc.halo.model.dto.HaloConst;
 import cc.ryanc.halo.model.enums.BlogPropertiesEnum;
 import cc.ryanc.halo.model.enums.PostTypeEnum;
 import cc.ryanc.halo.service.PostService;
 import cn.hutool.core.util.StrUtil;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
 
+import java.io.IOException;
 import java.util.List;
 
-import static cc.ryanc.halo.model.dto.HaloConst.*;
+import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS;
 
 /**
  * 
@@ -33,51 +38,102 @@ public class FrontOthersController {
     @Autowired
     private PostService postService;
 
+    @Autowired
+    private FreeMarkerConfigurer freeMarker;
+
     /**
      * 获取文章rss
      *
-     * @return rss
+     * @param model model
+     *
+     * @return String
+     *
+     * @throws IOException       IOException
+     * @throws TemplateException TemplateException
      */
     @GetMapping(value = {"feed", "feed.xml", "atom", "atom.xml"}, produces = "application/xml;charset=UTF-8")
     @ResponseBody
-    public String feed() {
+    public String feed(Model model) throws IOException, TemplateException {
         String rssPosts = OPTIONS.get(BlogPropertiesEnum.RSS_POSTS.getProp());
         if (StrUtil.isBlank(rssPosts)) {
             rssPosts = "20";
         }
-        //获取文章列表并根据时间排序
         final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         final Pageable pageable = PageRequest.of(0, Integer.parseInt(rssPosts), sort);
         final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable).map(post -> {
-            if(StrUtil.isNotEmpty(post.getPostPassword())){
+            if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostContent("该文章为加密文章");
                 post.setPostSummary("该文章为加密文章");
             }
             return post;
         });
         final List posts = postsPage.getContent();
-        return postService.buildRss(posts);
+        model.addAttribute("posts", posts);
+        final Template template = freeMarker.getConfiguration().getTemplate("common/web/rss.ftl");
+        return FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
     }
 
     /**
-     * 获取sitemap
+     * 获取 XML 格式的站点地图
      *
-     * @return sitemap
+     * @param model model
+     *
+     * @return String
+     *
+     * @throws IOException       IOException
+     * @throws TemplateException TemplateException
      */
     @GetMapping(value = {"sitemap", "sitemap.xml"}, produces = "application/xml;charset=UTF-8")
     @ResponseBody
-    public String siteMap() {
-        //获取文章列表并根据时间排序
-        final Sort sort = new Sort(Sort.Direction.DESC, "postDate");
-        final Pageable pageable = PageRequest.of(0, 999, sort);
-        final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), pageable).map(post -> {
-            if(StrUtil.isNotEmpty(post.getPostPassword())){
+    public String sitemapXml(Model model) throws IOException, TemplateException {
+        final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), null).map(post -> {
+            if (StrUtil.isNotEmpty(post.getPostPassword())) {
                 post.setPostContent("该文章为加密文章");
                 post.setPostSummary("该文章为加密文章");
             }
             return post;
         });
         final List posts = postsPage.getContent();
-        return postService.buildSiteMap(posts);
+        model.addAttribute("posts", posts);
+        final Template template = freeMarker.getConfiguration().getTemplate("common/web/sitemap_xml.ftl");
+        return FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
+    }
+
+    /**
+     * 获取 HTML 格式的站点地图
+     *
+     * @param model model
+     *
+     * @return String
+     */
+    @GetMapping(value = "sitemap.html", produces = {"text/html"})
+    public String sitemapHtml(Model model) {
+        final Page postsPage = postService.findPostByStatus(0, PostTypeEnum.POST_TYPE_POST.getDesc(), null).map(post -> {
+            if (StrUtil.isNotEmpty(post.getPostPassword())) {
+                post.setPostContent("该文章为加密文章");
+                post.setPostSummary("该文章为加密文章");
+            }
+            return post;
+        });
+        final List posts = postsPage.getContent();
+        model.addAttribute("posts", posts);
+        return "common/web/sitemap_html";
+    }
+
+    /**
+     * robots
+     *
+     * @param model model
+     *
+     * @return String
+     *
+     * @throws IOException       IOException
+     * @throws TemplateException TemplateException
+     */
+    @GetMapping(value = "robots.txt", produces = {"text/plain"})
+    @ResponseBody
+    public String robots(Model model) throws IOException, TemplateException {
+        final Template template = freeMarker.getConfiguration().getTemplate("common/web/robots.ftl");
+        return FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
     }
 }
diff --git a/src/main/resources/robots.txt b/src/main/resources/robots.txt
deleted file mode 100644
index f9b88f793..000000000
--- a/src/main/resources/robots.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-User-agent: *
-Disallow: /admin/
-Sitemap: /sitemap.xml
\ No newline at end of file
diff --git a/src/main/resources/templates/common/web/robots.ftl b/src/main/resources/templates/common/web/robots.ftl
new file mode 100644
index 000000000..e7bfbaab7
--- /dev/null
+++ b/src/main/resources/templates/common/web/robots.ftl
@@ -0,0 +1,4 @@
+User-agent: *
+Disallow: /admin/
+Sitemap: ${options.blog_url!}/sitemap.xml
+Sitemap: ${options.blog_url!}/sitemap.html
\ No newline at end of file
diff --git a/src/main/resources/templates/common/web/rss.ftl b/src/main/resources/templates/common/web/rss.ftl
new file mode 100644
index 000000000..27e709958
--- /dev/null
+++ b/src/main/resources/templates/common/web/rss.ftl
@@ -0,0 +1,21 @@
+
+
+    
+        ${options.blog_title!}
+        ${options.blog_url!}
+        <#if user.userDesc??>
+            ${user.userDesc!}
+        
+        zh-CN
+        <#if posts?? && posts?size gt 0>
+            <#list posts as post>
+                
+                    ${post.postTitle!}
+                    ${options.blog_url}/archives/${post.postUrl!}
+                    ${post.postContent!}
+                    ${post.postDate}
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/src/main/resources/templates/common/web/sitemap_html.ftl b/src/main/resources/templates/common/web/sitemap_html.ftl
new file mode 100644
index 000000000..7577bbf25
--- /dev/null
+++ b/src/main/resources/templates/common/web/sitemap_html.ftl
@@ -0,0 +1,201 @@
+<#--
+see https://gitee.com/yadong.zhang/DBlog/blob/master/blog-web/src/main/java/com/zyd/blog/controller/RestWebSiteController.java
+-->
+<#compress >
+
+
+
+    
+    
+    ${options.blog_title!} 网站地图
+    
+    
+
+
+

${options.blog_title!} 网站地图

+ +
+ +
+

标签目录

+ +
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/common/web/sitemap_xml.ftl b/src/main/resources/templates/common/web/sitemap_xml.ftl new file mode 100644 index 000000000..732d7ed52 --- /dev/null +++ b/src/main/resources/templates/common/web/sitemap_xml.ftl @@ -0,0 +1,11 @@ + + + <#if posts?? && posts?size gt 0> + <#list posts as post> + + ${options.blog_url!}/archives/${post.postUrl!} + ${post.postDate?iso_local} + + + + \ No newline at end of file From 74e27a431c1f01eef6cbc2cea82a364de87d0f1b Mon Sep 17 00:00:00 2001 From: ruibaby Date: Thu, 31 Jan 2019 15:27:41 +0800 Subject: [PATCH 07/10] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8Drss=E7=94=9F?= =?UTF-8?q?=E6=88=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/common/web/rss.ftl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/resources/templates/common/web/rss.ftl b/src/main/resources/templates/common/web/rss.ftl index 27e709958..4a7b03f78 100644 --- a/src/main/resources/templates/common/web/rss.ftl +++ b/src/main/resources/templates/common/web/rss.ftl @@ -12,7 +12,11 @@ ${post.postTitle!} ${options.blog_url}/archives/${post.postUrl!} - ${post.postContent!} + + + ${post.postDate} From d65379d362db77149051e4342f5e3b3a8ebfc1ae Mon Sep 17 00:00:00 2001 From: ruibaby Date: Thu, 31 Jan 2019 16:14:22 +0800 Subject: [PATCH 08/10] =?UTF-8?q?:sparkles:=20=E6=8F=90=E4=BE=9B=E8=AF=84?= =?UTF-8?q?=E8=AE=BA=E7=9A=84api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/ApiCommentController.java | 87 ++++++++++++++++++- .../controller/api/ApiOptionController.java | 4 +- .../templates/admin/admin_option.ftl | 17 ++++ 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/src/main/java/cc/ryanc/halo/web/controller/api/ApiCommentController.java b/src/main/java/cc/ryanc/halo/web/controller/api/ApiCommentController.java index a7b9c0860..bc0c20dcb 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/api/ApiCommentController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/api/ApiCommentController.java @@ -1,10 +1,29 @@ package cc.ryanc.halo.web.controller.api; +import cc.ryanc.halo.model.domain.Comment; +import cc.ryanc.halo.model.domain.Post; +import cc.ryanc.halo.model.dto.JsonResult; +import cc.ryanc.halo.model.enums.BlogPropertiesEnum; +import cc.ryanc.halo.model.enums.ResponseStatusEnum; +import cc.ryanc.halo.model.enums.TrueFalseEnum; import cc.ryanc.halo.service.CommentService; +import cc.ryanc.halo.service.PostService; +import cc.ryanc.halo.utils.OwoUtil; +import cn.hutool.core.text.StrBuilder; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.http.HtmlUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import static cc.ryanc.halo.model.dto.HaloConst.OPTIONS; /** *
@@ -21,4 +40,66 @@ public class ApiCommentController {
 
     @Autowired
     private CommentService commentService;
+
+    @Autowired
+    private PostService postService;
+
+    /**
+     * 新增评论
+     *
+     * @param comment comment
+     * @param result  result
+     * @param postId  postId
+     * @param request request
+     *
+     * @return JsonResult
+     */
+    @PostMapping(value = "/save")
+    @ResponseBody
+    public JsonResult save(@Valid Comment comment,
+                           BindingResult result,
+                           @RequestParam(value = "postId") Long postId,
+                           HttpServletRequest request) {
+        if (result.hasErrors()) {
+            for (ObjectError error : result.getAllErrors()) {
+                return new JsonResult(ResponseStatusEnum.ERROR.getCode(), error.getDefaultMessage());
+            }
+        }
+        try {
+            Comment lastComment = null;
+            final Post post = postService.findByPostId(postId).orElse(new Post());
+            comment.setCommentAuthorEmail(HtmlUtil.escape(comment.getCommentAuthorEmail()).toLowerCase());
+            comment.setPost(post);
+            comment.setCommentAuthorIp(ServletUtil.getClientIP(request));
+            comment.setIsAdmin(0);
+            comment.setCommentAuthor(HtmlUtil.escape(comment.getCommentAuthor()));
+            if (StrUtil.isNotBlank(comment.getCommentAuthorEmail())) {
+                comment.setCommentAuthorAvatarMd5(SecureUtil.md5(comment.getCommentAuthorEmail()));
+            }
+            if (comment.getCommentParent() > 0) {
+                lastComment = commentService.findCommentById(comment.getCommentParent()).orElse(new Comment());
+                final StrBuilder buildContent = new StrBuilder("@");
+                buildContent.append(lastComment.getCommentAuthor());
+                buildContent.append(" ");
+                buildContent.append(OwoUtil.markToImg(HtmlUtil.escape(comment.getCommentContent()).replace("<br/>", "
"))); + comment.setCommentContent(buildContent.toString()); + } else { + //将评论内容的字符专为安全字符 + comment.setCommentContent(OwoUtil.markToImg(HtmlUtil.escape(comment.getCommentContent()).replace("<br/>", "
"))); + } + if (StrUtil.isNotEmpty(comment.getCommentAuthorUrl())) { + comment.setCommentAuthorUrl(URLUtil.normalize(comment.getCommentAuthorUrl())); + } + commentService.save(comment); + if (StrUtil.equals(OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()), TrueFalseEnum.TRUE.getDesc()) || OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) { + return new JsonResult(ResponseStatusEnum.SUCCESS.getCode(), "你的评论已经提交,待博主审核之后可显示。"); + } else { + return new JsonResult(ResponseStatusEnum.SUCCESS.getCode(), "你的评论已经提交,刷新后即可显示。"); + } + } catch (Exception e) { + return new JsonResult(ResponseStatusEnum.ERROR.getCode(), "评论失败!"); + } + } } diff --git a/src/main/java/cc/ryanc/halo/web/controller/api/ApiOptionController.java b/src/main/java/cc/ryanc/halo/web/controller/api/ApiOptionController.java index 7af077bb1..5c62edc15 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/api/ApiOptionController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/api/ApiOptionController.java @@ -85,8 +85,8 @@ public class ApiOptionController { * * @return JsonResult */ - @GetMapping(value = "/{optionName}") - public JsonResult option(@PathVariable(value = "optionName") String optionName) { + @GetMapping(value = "/one") + public JsonResult option(@RequestParam(value = "optionName") String optionName) { final String optionValue = optionsService.findOneOption(optionName); return new JsonResult(ResponseStatusEnum.SUCCESS.getCode(), ResponseStatusEnum.SUCCESS.getMsg(), optionValue); } diff --git a/src/main/resources/templates/admin/admin_option.ftl b/src/main/resources/templates/admin/admin_option.ftl index 2f25bc13d..9ac6a2fbd 100755 --- a/src/main/resources/templates/admin/admin_option.ftl +++ b/src/main/resources/templates/admin/admin_option.ftl @@ -322,6 +322,23 @@ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+