diff --git a/README-en-US.md b/README-en-US.md index 718cf47d4..07984f512 100755 --- a/README-en-US.md +++ b/README-en-US.md @@ -9,7 +9,7 @@ [![Travis CI](https://img.shields.io/travis/ruibaby/halo.svg)](https://travis-ci.org/ruibaby/halo) ------------------------------ -[简体中文](./README.md) | English +🇨🇳[简体中文](./README.md) | 🇺🇸English ## Catalog diff --git a/README.md b/README.md index a768abc73..789afc565 100755 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![Travis CI](https://img.shields.io/travis/ruibaby/halo.svg)](https://travis-ci.org/ruibaby/halo) ------------------------------ -简体中文 | [English](./README-en-US.md) +🇨🇳简体中文 | 🇺🇸[English](./README-en-US.md) ## 目录 diff --git a/pom.xml b/pom.xml index 217135367..aaa473ae4 100755 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.2.RELEASE + 2.0.4.RELEASE 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 dbaf6714b..4e37d9323 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 @@ -190,8 +190,8 @@ public class AdminController extends BaseController { @GetMapping(value = "/logOut") public String logOut(HttpSession session) { User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY); + session.removeAttribute(HaloConst.USER_SESSION_KEY); logsService.saveByLogs(new Logs(LogsRecord.LOGOUT, user.getUserName(), ServletUtil.getClientIP(request), DateUtil.date())); - session.invalidate(); log.info("用户[{}]退出登录", user.getUserName()); return "redirect:/admin/login"; } 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 9f2d37081..0bc2b6b40 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 @@ -26,7 +26,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; -import javax.websocket.server.PathParam; import java.io.File; import java.text.SimpleDateFormat; import java.util.HashMap; @@ -193,7 +192,7 @@ public class AttachmentController { * @return 模板路径admin/widget/_attachment-detail */ @GetMapping(value = "/attachment") - public String attachmentDetail(Model model, @PathParam("attachId") Long attachId) { + public String attachmentDetail(Model model, @RequestParam("attachId") Long attachId) { Optional attachment = attachmentService.findByAttachId(attachId); model.addAttribute("attachment", attachment.get()); return "admin/widget/_attachment-detail"; @@ -208,7 +207,7 @@ public class AttachmentController { */ @GetMapping(value = "/remove") @ResponseBody - public JsonResult removeAttachment(@PathParam("attachId") Long attachId, + public JsonResult removeAttachment(@RequestParam("attachId") Long attachId, HttpServletRequest request) { Optional attachment = attachmentService.findByAttachId(attachId); String delFileName = attachment.get().getAttachName(); diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/CategoryController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/CategoryController.java index 9695afc8e..1a0eb4cd9 100755 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/CategoryController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/CategoryController.java @@ -1,14 +1,16 @@ package cc.ryanc.halo.web.controller.admin; import cc.ryanc.halo.model.domain.Category; +import cc.ryanc.halo.model.dto.JsonResult; +import cc.ryanc.halo.model.enums.ResultCodeEnum; import cc.ryanc.halo.service.CategoryService; +import cc.ryanc.halo.utils.LocaleMessageUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; -import javax.websocket.server.PathParam; import java.util.Optional; /** @@ -27,6 +29,9 @@ public class CategoryController { @Autowired private CategoryService categoryService; + @Autowired + private LocaleMessageUtil localeMessageUtil; + /** * 查询所有分类并渲染category页面 * @@ -58,13 +63,16 @@ public class CategoryController { * 验证分类目录路径是否已经存在 * * @param cateUrl 分类路径 - * @return true:不存在,false:存在 + * @return JsonResult */ @GetMapping(value = "/checkUrl") @ResponseBody - public boolean checkCateUrlExists(@RequestParam("cateUrl") String cateUrl) { + public JsonResult checkCateUrlExists(@RequestParam("cateUrl") String cateUrl) { Category category = categoryService.findByCateUrl(cateUrl); - return null != category; + if (null != category) { + return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.url-is-exists")); + } + return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), ""); } /** @@ -74,9 +82,9 @@ public class CategoryController { * @return 重定向到/admin/category */ @GetMapping(value = "/remove") - public String removeCategory(@PathParam("cateId") Long cateId) { + public String removeCategory(@RequestParam("cateId") Long cateId) { try { - Category category = categoryService.removeByCateId(cateId); + categoryService.removeByCateId(cateId); } catch (Exception e) { log.error("删除分类失败:{}", e.getMessage()); } @@ -91,7 +99,7 @@ public class CategoryController { * @return 模板路径admin/admin_category */ @GetMapping(value = "/edit") - public String toEditCategory(Model model, @PathParam("cateId") Long cateId) { + public String toEditCategory(Model model, @RequestParam("cateId") Long cateId) { Optional category = categoryService.findByCateId(cateId); model.addAttribute("updateCategory", category.get()); return "admin/admin_category"; 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 d1b02fa5e..d813c947c 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 @@ -34,7 +34,6 @@ import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; -import javax.websocket.server.PathParam; import java.util.HashMap; import java.util.Map; @@ -93,8 +92,8 @@ public class CommentController extends BaseController { * @return 重定向到/admin/comments */ @GetMapping(value = "/throw") - public String moveToTrash(@PathParam("commentId") Long commentId, - @PathParam("status") String status, + public String moveToTrash(@RequestParam("commentId") Long commentId, + @RequestParam("status") String status, @RequestParam(value = "page", defaultValue = "0") Integer page) { try { commentService.updateCommentStatus(commentId, CommentStatusEnum.RECYCLE.getCode()); @@ -113,8 +112,8 @@ public class CommentController extends BaseController { * @return 重定向到/admin/comments */ @GetMapping(value = "/revert") - public String moveToPublish(@PathParam("commentId") Long commentId, - @PathParam("status") Integer status, + public String moveToPublish(@RequestParam("commentId") Long commentId, + @RequestParam("status") Integer status, HttpSession session) { Comment comment = commentService.updateCommentStatus(commentId, CommentStatusEnum.PUBLISHED.getCode()); Post post = comment.getPost(); @@ -134,8 +133,8 @@ public class CommentController extends BaseController { * @return string 重定向到/admin/comments */ @GetMapping(value = "/remove") - public String moveToAway(@PathParam("commentId") Long commentId, - @PathParam("status") Integer status, + public String moveToAway(@RequestParam("commentId") Long commentId, + @RequestParam("status") Integer status, @RequestParam(value = "page", defaultValue = "0") Integer page) { try { commentService.removeByCommentId(commentId); diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/MenuController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/MenuController.java index 331205150..5aefedebc 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/MenuController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/MenuController.java @@ -8,8 +8,6 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; -import javax.websocket.server.PathParam; - /** *
  *     后台菜单管理控制器
@@ -74,7 +72,7 @@ public class MenuController {
      * @return 重定向到/admin/menus
      */
     @GetMapping(value = "/remove")
-    public String removeMenu(@PathParam("menuId") Long menuId) {
+    public String removeMenu(@RequestParam("menuId") Long menuId) {
         try {
             menuService.removeByMenuId(menuId);
         } catch (Exception e) {
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 db3bae694..286e2f4c2 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
@@ -28,7 +28,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-import javax.websocket.server.PathParam;
 import java.util.List;
 import java.util.Optional;
 
@@ -94,7 +93,7 @@ public class PageController {
      * @return String 模板路径admin/admin_page_link
      */
     @GetMapping(value = "/links/edit")
-    public String toEditLink(Model model, @PathParam("linkId") Long linkId) {
+    public String toEditLink(Model model, @RequestParam("linkId") Long linkId) {
         Optional link = linkService.findByLinkId(linkId);
         model.addAttribute("updateLink", link.get());
         return "admin/admin_page_link";
@@ -123,7 +122,7 @@ public class PageController {
      * @return 重定向到/admin/page/links
      */
     @GetMapping(value = "/links/remove")
-    public String removeLink(@PathParam("linkId") Long linkId) {
+    public String removeLink(@RequestParam("linkId") Long linkId) {
         try {
             linkService.removeByLinkId(linkId);
         } catch (Exception e) {
@@ -178,7 +177,7 @@ public class PageController {
      * @return 模板路径admin/widget/_gallery-detail
      */
     @GetMapping(value = "/gallery")
-    public String gallery(Model model, @PathParam("galleryId") Long galleryId) {
+    public String gallery(Model model, @RequestParam("galleryId") Long galleryId) {
         Optional gallery = galleryService.findByGalleryId(galleryId);
         model.addAttribute("gallery", gallery.get());
         return "admin/widget/_gallery-detail";
@@ -259,7 +258,7 @@ public class PageController {
      * @return admin/admin_page_md_editor
      */
     @GetMapping(value = "/edit")
-    public String editPage(@PathParam("pageId") Long pageId, Model model) {
+    public String editPage(@RequestParam("pageId") Long pageId, Model model) {
         Optional post = postService.findByPostId(pageId);
         model.addAttribute("post", post.get());
         return "admin/admin_page_md_editor";
@@ -273,10 +272,10 @@ public class PageController {
      */
     @GetMapping(value = "/checkUrl")
     @ResponseBody
-    public JsonResult checkUrlExists(@PathParam("postUrl") String postUrl) {
+    public JsonResult checkUrlExists(@RequestParam("postUrl") String postUrl) {
         Post post = postService.findByPostUrl(postUrl, PostTypeEnum.POST_TYPE_PAGE.getDesc());
         if (null != post) {
-            return new JsonResult(ResultCodeEnum.FAIL.getCode(), "该路径已经存在!");
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.url-is-exists"));
         }
         return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "");
     }
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 8bf044299..ab62cd791 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
@@ -32,7 +32,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-import javax.websocket.server.PathParam;
 import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Optional;
@@ -141,7 +140,7 @@ public class PostController extends BaseController {
      * @return 模板路径/themes/{theme}/post
      */
     @GetMapping(value = "/view")
-    public String viewPost(@PathParam("postId") Long postId, Model model) {
+    public String viewPost(@RequestParam("postId") Long postId, Model model) {
         Optional post = postService.findByPostId(postId);
         model.addAttribute("post", post.get());
         return this.render("post");
@@ -313,7 +312,7 @@ public class PostController extends BaseController {
      * @return 重定向到/admin/posts
      */
     @GetMapping(value = "/remove")
-    public String removePost(@PathParam("postId") Long postId, @PathParam("postType") String postType) {
+    public String removePost(@RequestParam("postId") Long postId, @RequestParam("postType") String postType) {
         try {
             Optional post = postService.findByPostId(postId);
             postService.removeByPostId(postId);
@@ -335,7 +334,7 @@ public class PostController extends BaseController {
      * @return 模板路径admin/admin_editor
      */
     @GetMapping(value = "/edit")
-    public String editPost(@PathParam("postId") Long postId, Model model) {
+    public String editPost(@RequestParam("postId") Long postId, Model model) {
         Optional post = postService.findByPostId(postId);
         model.addAttribute("post", post.get());
         return "admin/admin_post_md_editor";
@@ -349,29 +348,32 @@ public class PostController extends BaseController {
      */
     @GetMapping(value = "/updateSummary")
     @ResponseBody
-    public JsonResult updateSummary(@PathParam("postSummary") Integer postSummary) {
+    public JsonResult updateSummary(@RequestParam("postSummary") Integer postSummary) {
         try {
             postService.updateAllSummary(postSummary);
         } catch (Exception e) {
             log.error("更新摘要失败:{}", e.getMessage());
             e.printStackTrace();
-            return new JsonResult(ResultCodeEnum.FAIL.getCode(), "更新失败!");
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.update-failed"));
         }
-        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "所有文章摘要更新成功!");
+        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.common.update-success"));
     }
 
     /**
      * 验证文章路径是否已经存在
      *
      * @param postUrl 文章路径
-     * @return true:不存在,false:已存在
+     * @return JsonResult
      */
     @GetMapping(value = "/checkUrl")
     @ResponseBody
-    public boolean checkUrlExists(@PathParam("postUrl") String postUrl) {
+    public JsonResult checkUrlExists(@RequestParam("postUrl") String postUrl) {
         postUrl = urlFilter(postUrl);
         Post post = postService.findByPostUrl(postUrl, PostTypeEnum.POST_TYPE_POST.getDesc());
-        return null != post;
+        if (null != post) {
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.url-is-exists"));
+        }
+        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "");
     }
 
     /**
@@ -382,9 +384,9 @@ public class PostController extends BaseController {
      */
     @GetMapping(value = "/pushAllToBaidu")
     @ResponseBody
-    public JsonResult pushAllToBaidu(@PathParam("baiduToken") String baiduToken) {
+    public JsonResult pushAllToBaidu(@RequestParam("baiduToken") String baiduToken) {
         if (StringUtils.isEmpty(baiduToken)) {
-            return new JsonResult(ResultCodeEnum.FAIL.getCode(), "百度推送Token为空!");
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.post.no-baidu-token"));
         }
         String blogUrl = HaloConst.OPTIONS.get(BlogPropertiesEnum.BLOG_URL.getProp());
         List posts = postService.findAllPosts(PostTypeEnum.POST_TYPE_POST.getDesc());
@@ -397,8 +399,8 @@ public class PostController extends BaseController {
         }
         String result = HaloUtils.baiduPost(blogUrl, baiduToken, urls.toString());
         if (StringUtils.isEmpty(result)) {
-            return new JsonResult(ResultCodeEnum.FAIL.getCode(), "推送所有文章成功!");
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.post.push-to-baidu-failed"));
         }
-        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "推送成功!");
+        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.post.push-to-baidu-success"));
     }
 }
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/TagController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/TagController.java
index 5f43bad8d..c0279c508 100755
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/TagController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/TagController.java
@@ -1,15 +1,16 @@
 package cc.ryanc.halo.web.controller.admin;
 
 import cc.ryanc.halo.model.domain.Tag;
+import cc.ryanc.halo.model.dto.JsonResult;
+import cc.ryanc.halo.model.enums.ResultCodeEnum;
 import cc.ryanc.halo.service.TagService;
+import cc.ryanc.halo.utils.LocaleMessageUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 
-import javax.websocket.server.PathParam;
-
 /**
  * 
  *     后台标签管理控制器
@@ -26,6 +27,9 @@ public class TagController {
     @Autowired
     private TagService tagService;
 
+    @Autowired
+    private LocaleMessageUtil localeMessageUtil;
+
     /**
      * 渲染标签管理页面
      *
@@ -60,9 +64,12 @@ public class TagController {
      */
     @GetMapping(value = "/checkUrl")
     @ResponseBody
-    public boolean checkTagUrlExists(@RequestParam("tagUrl") String tagUrl) {
+    public JsonResult checkTagUrlExists(@RequestParam("tagUrl") String tagUrl) {
         Tag tag = tagService.findByTagUrl(tagUrl);
-        return null != tag;
+        if (null != tag) {
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.url-is-exists"));
+        }
+        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "");
     }
 
     /**
@@ -72,10 +79,9 @@ public class TagController {
      * @return 重定向到/admin/tag
      */
     @GetMapping(value = "/remove")
-    public String removeTag(@PathParam("tagId") Long tagId) {
+    public String removeTag(@RequestParam("tagId") Long tagId) {
         try {
-            Tag tag = tagService.removeByTagId(tagId);
-            log.info("删除的标签:" + tag);
+            tagService.removeByTagId(tagId);
         } catch (Exception e) {
             log.error("删除标签失败:{}", e.getMessage());
         }
@@ -90,7 +96,7 @@ public class TagController {
      * @return 模板路径admin/admin_tag
      */
     @GetMapping(value = "/edit")
-    public String toEditTag(Model model, @PathParam("tagId") Long tagId) {
+    public String toEditTag(Model model, @RequestParam("tagId") Long tagId) {
         Tag tag = tagService.findByTagId(tagId).get();
         model.addAttribute("updateTag", tag);
         return "admin/admin_tag";
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 015856c1e..5a87548c0 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
@@ -30,7 +30,6 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.websocket.server.PathParam;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.util.List;
@@ -84,7 +83,7 @@ public class ThemeController extends BaseController {
     @GetMapping(value = "/set")
     @ResponseBody
     @CacheEvict(value = "posts", allEntries = true, beforeInvocation = true)
-    public JsonResult activeTheme(@PathParam("siteTheme") String siteTheme,
+    public JsonResult activeTheme(@RequestParam("siteTheme") String siteTheme,
                                   HttpServletRequest request) {
         try {
             //保存主题设置项
@@ -129,13 +128,13 @@ public class ThemeController extends BaseController {
                 HaloConst.THEMES = HaloUtils.getThemes();
             } else {
                 log.error("上传主题失败,没有选择文件");
-                return new JsonResult(ResultCodeEnum.FAIL.getCode(), "请选择上传的主题!");
+                return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.upload-no-file"));
             }
         } catch (Exception e) {
             log.error("上传主题失败:{}", e.getMessage());
-            return new JsonResult(ResultCodeEnum.FAIL.getCode(), "主题上传失败!");
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.upload-failed"));
         }
-        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "主题上传成功!");
+        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.theme.upload-success"));
     }
 
     /**
@@ -180,22 +179,22 @@ public class ThemeController extends BaseController {
     public JsonResult cloneFromRemote(@RequestParam(value = "remoteAddr") String remoteAddr,
                                       @RequestParam(value = "themeName") String themeName) {
         if (StringUtils.isBlank(remoteAddr) || StringUtils.isBlank(themeName)) {
-            return new JsonResult(0, "请输入完整信息!");
+            return new JsonResult(0, localeMessageUtil.getMessage("code.admin.common.info-no-complete"));
         }
         try {
             File basePath = new File(ResourceUtils.getURL("classpath:").getPath());
             File themePath = new File(basePath.getAbsolutePath(), "templates/themes");
             String cmdResult = RuntimeUtil.execForStr("git clone " + remoteAddr + " " + themePath.getAbsolutePath() + "/" + themeName);
             if (NOT_FOUND_GIT.equals(cmdResult)) {
-                return new JsonResult(0, "没有安装Git!");
+                return new JsonResult(0, localeMessageUtil.getMessage("code.admin.theme.no-git"));
             }
             HaloConst.THEMES.clear();
             HaloConst.THEMES = HaloUtils.getThemes();
         } catch (FileNotFoundException e) {
             log.error("克隆主题失败:{}", e.getMessage());
-            return new JsonResult(0, "克隆主题失败:" + e.getMessage());
+            return new JsonResult(0, localeMessageUtil.getMessage("code.admin.theme.clone-theme-failed") + e.getMessage());
         }
-        return new JsonResult(1, "安装成功!");
+        return new JsonResult(1, localeMessageUtil.getMessage("code.admin.common.install-success"));
     }
 
     /**
@@ -212,15 +211,15 @@ public class ThemeController extends BaseController {
             File themePath = new File(basePath.getAbsolutePath(), "templates/themes");
             String cmdResult = RuntimeUtil.execForStr("cd " + themePath.getAbsolutePath() + "/" + themeName + " && git pull");
             if (NOT_FOUND_GIT.equals(cmdResult)) {
-                return new JsonResult(0, "没有安装Git!");
+                return new JsonResult(0, localeMessageUtil.getMessage("code.admin.theme.no-git"));
             }
             HaloConst.THEMES.clear();
             HaloConst.THEMES = HaloUtils.getThemes();
         } catch (Exception e) {
             log.error("更新主题失败:{}", e.getMessage());
-            return new JsonResult(0, "更新主题失败:" + e.getMessage());
+            return new JsonResult(0, localeMessageUtil.getMessage("code.admin.theme.update-theme-failed") + e.getMessage());
         }
-        return new JsonResult(1, "更新成功!");
+        return new JsonResult(1, localeMessageUtil.getMessage("code.admin.common.update-success"));
     }
 
     /**
@@ -289,7 +288,7 @@ public class ThemeController extends BaseController {
     public JsonResult saveTpl(@RequestParam("tplName") String tplName,
                               @RequestParam("tplContent") String tplContent) {
         if (StringUtils.isBlank(tplContent)) {
-            return new JsonResult(ResultCodeEnum.FAIL.getCode(), "模板不能为空!");
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.theme.edit.no-content"));
         }
         try {
             //获取项目根路径
@@ -300,8 +299,8 @@ public class ThemeController extends BaseController {
             fileWriter.write(tplContent);
         } catch (Exception e) {
             log.error("模板保存失败:{}", e.getMessage());
-            return new JsonResult(ResultCodeEnum.FAIL.getCode(), "模板保存失败!");
+            return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.save-failed"));
         }
-        return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), "模板保存成功!");
+        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/UserController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/UserController.java
index c0db2dc18..d62e11028 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,6 +1,7 @@
 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;
@@ -67,7 +68,7 @@ public class UserController {
             }
             userService.saveByUser(user);
             configuration.setSharedVariable("user", userService.findUser());
-            session.invalidate();
+            session.removeAttribute(HaloConst.USER_SESSION_KEY);
         } catch (Exception e) {
             log.error("修改用户资料失败:{}", e.getMessage());
             return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.edit-failed"));
@@ -95,7 +96,7 @@ public class UserController {
             if (null != user) {
                 user.setUserPass(SecureUtil.md5(newPass));
                 userService.saveByUser(user);
-                session.invalidate();
+                session.removeAttribute(HaloConst.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/front/FrontIndexController.java b/src/main/java/cc/ryanc/halo/web/controller/front/FrontIndexController.java
index 7d44d50d3..980397a17 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
@@ -15,12 +15,8 @@ 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.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
-import javax.websocket.server.PathParam;
 import java.util.List;
 
 /**
@@ -91,7 +87,7 @@ public class FrontIndexController extends BaseController {
      */
     @GetMapping(value = "next")
     @ResponseBody
-    public List ajaxIndex(@PathParam(value = "page") Integer page) {
+    public List ajaxIndex(@RequestParam(value = "page") Integer page) {
         Sort sort = new Sort(Sort.Direction.DESC, "postDate");
         //默认显示10条
         Integer size = 10;
@@ -114,7 +110,7 @@ public class FrontIndexController extends BaseController {
      * @return 模板路径/themes/{theme}/index
      */
     @GetMapping(value = "search")
-    public String search(@PathParam("keyword") String keyword, Model model) {
+    public String search(@RequestParam("keyword") String keyword, Model model) {
         Page posts = postService.searchByKeywords(keyword, null);
         model.addAttribute("posts", posts);
         return this.render("index");
diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties
index b41431cbe..81a63137a 100644
--- a/src/main/resources/i18n/messages.properties
+++ b/src/main/resources/i18n/messages.properties
@@ -72,6 +72,11 @@ admin.index.widgets.logs-lastest = 最新日志
 admin.index.widgets.btn.clear-logs = 清空日志
 admin.index.blog-data.motto = 加油!不要因为走的太远,而忘了当初为什么出发。
 admin.index.blog-data.during = 在此期间:
+admin.index.blog-data.posts-count-text = 累计发表了 {0} 篇文章。
+admin.index.blog-data.tags-count-text = 累计创建了 {0} 个标签。
+admin.index.blog-data.comments-count-text = 累计获得了 {0} 条评论。
+admin.index.blog-data.links-count-text = 累计添加了 {0} 个友链。
+admin.index.blog-data.views-count-text = 文章总访问 {0} 次。
 
 # 附件管理页面
 admin.attachments.title = 附件管理
@@ -155,6 +160,7 @@ admin.user.profile.form.desc.tips = 部分主题可在页面上显示这段话
 admin.user.profile.form.old-password = 原密码:
 admin.user.profile.form.new-password = 新密码:
 admin.user.profile.form.confirm-password = 确认密码:
+admin.user.profile.form.password.no-same = 两次密码不一样!
 
 # 标签管理页面
 admin.tags.title = 标签
@@ -229,7 +235,7 @@ common.th.file-type = 文件类型
 common.status.published = 已发布
 common.status.checking = 待审核
 common.status.recycle-bin = 回收站
-common.status.draft = 草 稿
+common.status.draft = 草  稿
 
 common.text.no-data = 暂无数据
 common.text.tips = 提示
@@ -239,7 +245,7 @@ common.text.tips.to-release-post = 确定发布该文章?
 
 # js
 common.js.all-attachment = 所有附件
-common.js.info-no-complate = 请输入完整信息!
+common.js.info-no-complete = 请输入完整信息!
 
 # 分页信息
 admin.pageinfo.text.no = 第
@@ -265,6 +271,21 @@ code.admin.backup.have-new-backup = 有新的备份!
 
 code.admin.theme.change-success = 主题已设置为{0}
 code.admin.theme.change-failed = 主题设置失败!
+code.admin.theme.upload-failed = 主题上传失败!
+code.admin.theme.upload-success = 主题上传成功!
+code.admin.theme.upload-no-file = 请选择上传的主题!
+code.admin.theme.no-git = 没有安装Git!
+code.admin.theme.clone-theme-failed = 克隆主题失败:
+code.admin.theme.update-theme-failed = 更新主题失败:
+code.admin.theme.edit.no-content = 模板不能为空!
+
+code.admin.user.old-password-error = 原密码错误!
+code.admin.user.update-password-failed = 修改密码失败!
+code.admin.user.update-password-success = 修改密码成功!
+
+code.admin.post.push-to-baidu-success = 推送成功!
+code.admin.post.push-to-baidu-failed = 推送失败!
+code.admin.post.no-baidu-token = 百度推送Token为空!
 
 code.admin.common.delete-success = 删除成功!
 code.admin.common.delete-failed = 删除失败!
@@ -272,3 +293,11 @@ code.admin.common.no-post = 发信邮箱没有配置!
 
 code.admin.common.save-success = 保存成功!
 code.admin.common.save-failed = 保存失败!
+code.admin.common.update-success = 更新成功!
+code.admin.common.update-failed = 更新失败!
+
+code.admin.common.edit-success = 修改成功!
+code.admin.common.edit-failed = 修改失败!
+code.admin.common.info-no-complete = 请输入完整信息!
+code.admin.common.install-success = 安装成功!
+code.admin.common.url-is-exists = 该路径已经存在!
diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties
index a87da2290..40ccd605a 100644
--- a/src/main/resources/i18n/messages_en_US.properties
+++ b/src/main/resources/i18n/messages_en_US.properties
@@ -160,6 +160,7 @@ admin.user.profile.form.desc.tips = Some themes can display this passage on the
 admin.user.profile.form.old-password = Old password:
 admin.user.profile.form.new-password = New password:
 admin.user.profile.form.confirm-password = Confirm password:
+admin.user.profile.form.password.no-same = The two passwords are different!
 
 # tags page
 admin.tags.title = Tags
@@ -244,7 +245,7 @@ common.text.tips.to-release-post = Are you sure you want to publish this article
 
 # js
 common.js.all-attachment = All attachments
-common.js.info-no-complate = Please enter full information!
+common.js.info-no-complete = Please enter full information!
 
 # Page info
 admin.pageinfo.text.no = (
@@ -270,11 +271,22 @@ code.admin.backup.have-new-backup = Have a new backup!
 
 code.admin.theme.change-success = Theme has been set to {0}
 code.admin.theme.change-failed = Theme settings failed!
+code.admin.theme.upload-failed = Theme upload failed!
+code.admin.theme.upload-success = Theme uploaded successfully!
+code.admin.theme.upload-no-file = Please select the theme you uploaded!
+code.admin.theme.no-git = No Git installed!
+code.admin.theme.clone-theme-failed = Cloning the theme failed:
+code.admin.theme.update-theme-failed = Update theme failed:
+code.admin.theme.edit.no-content = Template can't be empty!
 
 code.admin.user.old-password-error = The original password is wrong!
 code.admin.user.update-password-failed = Failed to change password!
 code.admin.user.update-password-success = Password has been updated!
 
+code.admin.post.push-to-baidu-success = Push successful!
+code.admin.post.push-to-baidu-failed = Push failed!
+code.admin.post.no-baidu-token = Baidu push Token is empty!
+
 code.admin.common.delete-success = Deleted successfully!
 code.admin.common.delete-failed = Deleted Failed!
 code.admin.common.no-post = The mailing mailbox is not configured!
@@ -282,6 +294,10 @@ code.admin.common.no-post = The mailing mailbox is not configured!
 code.admin.common.save-success = Saved successfully!
 code.admin.common.save-failed = Save failed!
 code.admin.common.update-success = Updated successfully!
+code.admin.common.update-failed = Update failed!
 
 code.admin.common.edit-success = Successfully modified!
 code.admin.common.edit-failed = Fail to update!
+code.admin.common.info-no-complete = Please enter full information!
+code.admin.common.install-success = Successful installation!
+code.admin.common.url-is-exists = The url already exists!
diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties
index 8a170c0a9..81a63137a 100644
--- a/src/main/resources/i18n/messages_zh_CN.properties
+++ b/src/main/resources/i18n/messages_zh_CN.properties
@@ -160,6 +160,7 @@ admin.user.profile.form.desc.tips = 部分主题可在页面上显示这段话
 admin.user.profile.form.old-password = 原密码:
 admin.user.profile.form.new-password = 新密码:
 admin.user.profile.form.confirm-password = 确认密码:
+admin.user.profile.form.password.no-same = 两次密码不一样!
 
 # 标签管理页面
 admin.tags.title = 标签
@@ -244,7 +245,7 @@ common.text.tips.to-release-post = 确定发布该文章?
 
 # js
 common.js.all-attachment = 所有附件
-common.js.info-no-complate = 请输入完整信息!
+common.js.info-no-complete = 请输入完整信息!
 
 # 分页信息
 admin.pageinfo.text.no = 第
@@ -270,11 +271,22 @@ code.admin.backup.have-new-backup = 有新的备份!
 
 code.admin.theme.change-success = 主题已设置为{0}
 code.admin.theme.change-failed = 主题设置失败!
+code.admin.theme.upload-failed = 主题上传失败!
+code.admin.theme.upload-success = 主题上传成功!
+code.admin.theme.upload-no-file = 请选择上传的主题!
+code.admin.theme.no-git = 没有安装Git!
+code.admin.theme.clone-theme-failed = 克隆主题失败:
+code.admin.theme.update-theme-failed = 更新主题失败:
+code.admin.theme.edit.no-content = 模板不能为空!
 
 code.admin.user.old-password-error = 原密码错误!
 code.admin.user.update-password-failed = 修改密码失败!
 code.admin.user.update-password-success = 修改密码成功!
 
+code.admin.post.push-to-baidu-success = 推送成功!
+code.admin.post.push-to-baidu-failed = 推送失败!
+code.admin.post.no-baidu-token = 百度推送Token为空!
+
 code.admin.common.delete-success = 删除成功!
 code.admin.common.delete-failed = 删除失败!
 code.admin.common.no-post = 发信邮箱没有配置!
@@ -282,6 +294,10 @@ code.admin.common.no-post = 发信邮箱没有配置!
 code.admin.common.save-success = 保存成功!
 code.admin.common.save-failed = 保存失败!
 code.admin.common.update-success = 更新成功!
+code.admin.common.update-failed = 更新失败!
 
 code.admin.common.edit-success = 修改成功!
 code.admin.common.edit-failed = 修改失败!
+code.admin.common.info-no-complete = 请输入完整信息!
+code.admin.common.install-success = 安装成功!
+code.admin.common.url-is-exists = 该路径已经存在!
diff --git a/src/main/resources/templates/admin/admin_category.ftl b/src/main/resources/templates/admin/admin_category.ftl
index 9e264429e..9be2a75cf 100755
--- a/src/main/resources/templates/admin/admin_category.ftl
+++ b/src/main/resources/templates/admin/admin_category.ftl
@@ -162,7 +162,7 @@
                 var desc = $('#cateDesc').val();
                 var result = true;
                 if(name==""||url==""||desc==""){
-                    showMsg("<@spring.message code='common.js.info-no-complate' />","info",2000);
+                    showMsg("<@spring.message code='common.js.info-no-complete' />","info",2000);
                     result = false;
                 }
                 $.ajax({
@@ -173,8 +173,8 @@
                         'cateUrl' : url
                     },
                     success: function (data) {
-                        if(data==true){
-                            showMsg("该路径已经存在!","info",2000);
+                        if(data.code==0){
+                            showMsg(data.msg,"error",2000);
                             result = false;
                         }
                     }
diff --git a/src/main/resources/templates/admin/admin_page_link.ftl b/src/main/resources/templates/admin/admin_page_link.ftl
index e46e0dc8f..8d650554c 100755
--- a/src/main/resources/templates/admin/admin_page_link.ftl
+++ b/src/main/resources/templates/admin/admin_page_link.ftl
@@ -147,7 +147,7 @@
                 var name = $('#linkName').val();
                 var url = $('#linkUrl').val();
                 if(name==""||url==""){
-                    showMsg("<@spring.message code='common.js.info-no-complate' />","info",2000);
+                    showMsg("<@spring.message code='common.js.info-no-complete' />","info",2000);
                     return false;
                 }
             }
diff --git a/src/main/resources/templates/admin/admin_page_md_editor.ftl b/src/main/resources/templates/admin/admin_page_md_editor.ftl
index 2ace20285..3c9cfd994 100755
--- a/src/main/resources/templates/admin/admin_page_md_editor.ftl
+++ b/src/main/resources/templates/admin/admin_page_md_editor.ftl
@@ -190,7 +190,7 @@
                     },
                     success: function (data) {
                         if(data.code==0){
-                            showMsg("该路径已经存在!","info",2000);
+                            showMsg(data.msg,"error",2000);
                             return;
                         }else{
                             $('#postUrl').html($('#newPostUrl').val());
diff --git a/src/main/resources/templates/admin/admin_post_md_editor.ftl b/src/main/resources/templates/admin/admin_post_md_editor.ftl
index 34fadde32..ee0db345e 100755
--- a/src/main/resources/templates/admin/admin_post_md_editor.ftl
+++ b/src/main/resources/templates/admin/admin_post_md_editor.ftl
@@ -290,8 +290,8 @@
                         'postUrl': $('#newPostUrl').val()
                     },
                     success: function (data) {
-                        if(data==true){
-                            showMsg("该路径已经存在!","info",2000);
+                        if(data.code==0){
+                            showMsg(data.msg,"error",2000);
                             return;
                         }else{
                             $('#postUrl').html($('#newPostUrl').val());
diff --git a/src/main/resources/templates/admin/admin_profile.ftl b/src/main/resources/templates/admin/admin_profile.ftl
index 61680b20b..73f08370c 100644
--- a/src/main/resources/templates/admin/admin_profile.ftl
+++ b/src/main/resources/templates/admin/admin_profile.ftl
@@ -183,11 +183,11 @@
                 var newPass = $('#newPass').val();
                 var reNewPass = $('#reNewPass').val();
                 if(beforePass==""||newPass==""||reNewPass==""){
-                    showMsg("<@spring.message code='common.js.info-no-complate' />","info",2000);
+                    showMsg("<@spring.message code='common.js.info-no-complete' />","info",2000);
                     return;
                 }
                 if(newPass!=reNewPass){
-                    showMsg("两次密码不一样!","error",2000);
+                    showMsg("<@spring.message code='admin.user.profile.form.password.no-same' />","error",2000);
                     return;
                 }
                 var param = $('#passForm').serialize();
diff --git a/src/main/resources/templates/admin/admin_tag.ftl b/src/main/resources/templates/admin/admin_tag.ftl
index 79fb19424..cd0f2c4d1 100755
--- a/src/main/resources/templates/admin/admin_tag.ftl
+++ b/src/main/resources/templates/admin/admin_tag.ftl
@@ -136,7 +136,7 @@
                 var url = $('#tagUrl').val();
                 var result = true;
                 if(name==""||url==""){
-                    showMsg("<@spring.message code='common.js.info-no-complate' />","info",2000);
+                    showMsg("<@spring.message code='common.js.info-no-complete' />","info",2000);
                     result = false;
                 }
                 $.ajax({
@@ -147,8 +147,8 @@
                         'tagUrl' : url
                     },
                     success: function (data) {
-                        if(data==true){
-                            showMsg("该路径已经存在!","info",2000);
+                        if(data.code==0){
+                            showMsg(data.msg,"error",2000);
                             result = false;
                         }
                     }
diff --git a/src/main/resources/templates/admin/widget/_theme-install.ftl b/src/main/resources/templates/admin/widget/_theme-install.ftl
index f2f7e92fd..0d1da7852 100644
--- a/src/main/resources/templates/admin/widget/_theme-install.ftl
+++ b/src/main/resources/templates/admin/widget/_theme-install.ftl
@@ -143,7 +143,7 @@
         var themeName = $("#themeName").val();
         if(remoteAddr==null || themeName==null){
             $.toast({
-                text: "<@spring.message code='common.js.info-no-complate' />",
+                text: "<@spring.message code='common.js.info-no-complete' />",
                 heading: '<@spring.message code="common.text.tips" />',
                 icon: 'error',
                 showHideTransition: 'fade',