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 369e26556..f3b27cd9f 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 @@ -1 +1,295 @@ -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.BlogPropertiesEnum; import cc.ryanc.halo.model.enums.PostTypeEnum; import cc.ryanc.halo.model.enums.ResultCodeEnum; import cc.ryanc.halo.service.GalleryService; import cc.ryanc.halo.service.LinkService; import cc.ryanc.halo.service.LogsService; import cc.ryanc.halo.service.PostService; import cc.ryanc.halo.utils.HaloUtils; import cc.ryanc.halo.utils.LocaleMessageUtil; 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.extra.servlet.ServletUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; 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.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Optional; /** *
 *     后台页面管理控制器
 * 
* * @author : RYAN0UP * @date : 2017/12/10 */ @Slf4j @Controller @RequestMapping(value = "/admin/page") public class PageController { @Autowired LocaleMessageUtil localeMessageUtil; @Autowired private LinkService linkService; @Autowired private GalleryService galleryService; @Autowired private PostService postService; @Autowired private LogsService logsService; @Autowired private HttpServletRequest request; /** * 页面管理页面 * * @param model model * @return 模板路径admin/admin_page */ @GetMapping public String pages(Model model) { List posts = postService.findAllPosts(PostTypeEnum.POST_TYPE_PAGE.getDesc()); model.addAttribute("pages", posts); return "admin/admin_page"; } /** * 获取友情链接列表并渲染页面 * * @return 模板路径admin/admin_page_link */ @GetMapping(value = "/links") public String links() { return "admin/admin_page_link"; } /** * 跳转到修改页面 * * @param model model * @param linkId linkId 友情链接编号 * @return String 模板路径admin/admin_page_link */ @GetMapping(value = "/links/edit") public String toEditLink(Model model, @RequestParam("linkId") Long linkId) { Optional link = linkService.findByLinkId(linkId); model.addAttribute("updateLink", link.get()); return "admin/admin_page_link"; } /** * 处理添加/修改友链的请求并渲染页面 * * @param link Link实体 * @return 重定向到/admin/page/links */ @PostMapping(value = "/links/save") public String saveLink(@ModelAttribute Link link) { try { linkService.saveByLink(link); } catch (Exception e) { log.error("Save/modify friendship link failed: {}", e.getMessage()); } return "redirect:/admin/page/links"; } /** * 处理删除友情链接的请求并重定向 * * @param linkId 友情链接编号 * @return 重定向到/admin/page/links */ @GetMapping(value = "/links/remove") public String removeLink(@RequestParam("linkId") Long linkId) { try { linkService.removeByLinkId(linkId); } catch (Exception e) { log.error("Deleting a friendship link failed: {}", e.getMessage()); } return "redirect:/admin/page/links"; } /** * 图库管理 * * @param model model * @param page 当前页码 * @param size 每页显示的条数 * @return 模板路径admin/admin_page_gallery */ @GetMapping(value = "/galleries") public String gallery(Model model, @RequestParam(value = "page", defaultValue = "0") Integer page, @RequestParam(value = "size", defaultValue = "18") Integer size) { Sort sort = new Sort(Sort.Direction.DESC, "galleryId"); Pageable pageable = PageRequest.of(page, size, sort); Page galleries = galleryService.findAllGalleries(pageable); model.addAttribute("galleries", galleries); return "admin/admin_page_gallery"; } /** * 保存图片 * * @param gallery gallery * @return 重定向到/admin/page/gallery */ @PostMapping(value = "/gallery/save") public String saveGallery(@ModelAttribute Gallery gallery) { try { if (StrUtil.isEmpty(gallery.getGalleryThumbnailUrl())) { gallery.setGalleryThumbnailUrl(gallery.getGalleryUrl()); } galleryService.saveByGallery(gallery); } catch (Exception e) { e.printStackTrace(); } return "redirect:/admin/page/galleries"; } /** * 处理获取图片详情的请求 * * @param model model * @param galleryId 图片编号 * @return 模板路径admin/widget/_gallery-detail */ @GetMapping(value = "/gallery") public String gallery(Model model, @RequestParam("galleryId") Long galleryId) { Optional gallery = galleryService.findByGalleryId(galleryId); model.addAttribute("gallery", gallery.get()); return "admin/widget/_gallery-detail"; } /** * 删除图库中的图片 * * @param galleryId 图片编号 * @return JsonResult */ @GetMapping(value = "/gallery/remove") @ResponseBody public JsonResult removeGallery(@RequestParam("galleryId") Long galleryId) { try { galleryService.removeByGalleryId(galleryId); } catch (Exception e) { log.error("Failed to delete image: {}", e.getMessage()); return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.delete-failed")); } return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.common.delete-success")); } /** * 跳转到新建页面 * * @param model model * @return 模板路径admin/admin_page_md_editor */ @GetMapping(value = "/new") public String newPage(Model model) { List customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp())); model.addAttribute("customTpls",customTpls); return "admin/admin_page_md_editor"; } /** * 发表页面 * * @param post post * @param session session */ @PostMapping(value = "/new/push") @ResponseBody public JsonResult pushPage(@ModelAttribute Post post, HttpSession session) { String msg = localeMessageUtil.getMessage("code.admin.common.save-success"); try { //发表用户 User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY); post.setUser(user); post.setPostType(PostTypeEnum.POST_TYPE_PAGE.getDesc()); if (null != post.getPostId()) { Post oldPost = postService.findByPostId(post.getPostId()).get(); if (null == post.getPostDate()) { post.setPostDate(DateUtil.date()); } post.setPostViews(oldPost.getPostViews()); msg = localeMessageUtil.getMessage("code.admin.common.update-success"); } else { post.setPostDate(DateUtil.date()); } post.setPostUpdate(DateUtil.date()); post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd())); //当没有选择文章缩略图的时候,自动分配一张内置的缩略图 if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) { post.setPostThumbnail("/static/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg"); } postService.saveByPost(post); logsService.saveByLogs(new Logs(LogsRecord.PUSH_PAGE, post.getPostTitle(), ServletUtil.getClientIP(request), DateUtil.date())); return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), msg); } catch (Exception e) { log.error("Save page failed: {}", e.getMessage()); return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.save-failed")); } } /** * 跳转到修改页面 * * @param pageId 页面编号 * @param model model * @return admin/admin_page_md_editor */ @GetMapping(value = "/edit") public String editPage(@RequestParam("pageId") Long pageId, Model model) { Optional post = postService.findByPostId(pageId); List customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp())); model.addAttribute("post", post.orElse(new Post())); model.addAttribute("customTpls",customTpls); return "admin/admin_page_md_editor"; } /** * 检查该路径是否已经存在 * * @param postUrl postUrl * @return JsonResult */ @GetMapping(value = "/checkUrl") @ResponseBody 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(), localeMessageUtil.getMessage("code.admin.common.url-is-exists")); } return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), ""); } @InitBinder public void initBinder(ServletRequestDataBinder binder) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); } } \ No newline at end of file +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.BlogPropertiesEnum; +import cc.ryanc.halo.model.enums.PostTypeEnum; +import cc.ryanc.halo.model.enums.ResultCodeEnum; +import cc.ryanc.halo.service.GalleryService; +import cc.ryanc.halo.service.LinkService; +import cc.ryanc.halo.service.LogsService; +import cc.ryanc.halo.service.PostService; +import cc.ryanc.halo.utils.HaloUtils; +import cc.ryanc.halo.utils.LocaleMessageUtil; +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.extra.servlet.ServletUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.propertyeditors.CustomDateEditor; +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.web.bind.ServletRequestDataBinder; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +/** + *
+ *     后台页面管理控制器
+ * 
+ * + * @author : RYAN0UP + * @date : 2017/12/10 + */ +@Slf4j +@Controller +@RequestMapping(value = "/admin/page") +public class PageController { + + @Autowired + LocaleMessageUtil localeMessageUtil; + @Autowired + private LinkService linkService; + @Autowired + private GalleryService galleryService; + @Autowired + private PostService postService; + @Autowired + private LogsService logsService; + @Autowired + private HttpServletRequest request; + + /** + * 页面管理页面 + * + * @param model model + * @return 模板路径admin/admin_page + */ + @GetMapping + public String pages(Model model) { + List posts = postService.findAllPosts(PostTypeEnum.POST_TYPE_PAGE.getDesc()); + model.addAttribute("pages", posts); + return "admin/admin_page"; + } + + /** + * 获取友情链接列表并渲染页面 + * + * @return 模板路径admin/admin_page_link + */ + @GetMapping(value = "/links") + public String links() { + return "admin/admin_page_link"; + } + + /** + * 跳转到修改页面 + * + * @param model model + * @param linkId linkId 友情链接编号 + * @return String 模板路径admin/admin_page_link + */ + @GetMapping(value = "/links/edit") + public String toEditLink(Model model, @RequestParam("linkId") Long linkId) { + Optional link = linkService.findByLinkId(linkId); + model.addAttribute("updateLink", link.get()); + return "admin/admin_page_link"; + } + + /** + * 处理添加/修改友链的请求并渲染页面 + * + * @param link Link实体 + * @return 重定向到/admin/page/links + */ + @PostMapping(value = "/links/save") + public String saveLink(@ModelAttribute Link link) { + try { + linkService.saveByLink(link); + } catch (Exception e) { + log.error("Save/modify friendship link failed: {}", e.getMessage()); + } + return "redirect:/admin/page/links"; + } + + /** + * 处理删除友情链接的请求并重定向 + * + * @param linkId 友情链接编号 + * @return 重定向到/admin/page/links + */ + @GetMapping(value = "/links/remove") + public String removeLink(@RequestParam("linkId") Long linkId) { + try { + linkService.removeByLinkId(linkId); + } catch (Exception e) { + log.error("Deleting a friendship link failed: {}", e.getMessage()); + } + return "redirect:/admin/page/links"; + } + + /** + * 图库管理 + * + * @param model model + * @param page 当前页码 + * @param size 每页显示的条数 + * @return 模板路径admin/admin_page_gallery + */ + @GetMapping(value = "/galleries") + public String gallery(Model model, + @RequestParam(value = "page", defaultValue = "0") Integer page, + @RequestParam(value = "size", defaultValue = "18") Integer size) { + Sort sort = new Sort(Sort.Direction.DESC, "galleryId"); + Pageable pageable = PageRequest.of(page, size, sort); + Page galleries = galleryService.findAllGalleries(pageable); + model.addAttribute("galleries", galleries); + return "admin/admin_page_gallery"; + } + + /** + * 保存图片 + * + * @param gallery gallery + * @return 重定向到/admin/page/gallery + */ + @PostMapping(value = "/gallery/save") + public String saveGallery(@ModelAttribute Gallery gallery) { + try { + if (StrUtil.isEmpty(gallery.getGalleryThumbnailUrl())) { + gallery.setGalleryThumbnailUrl(gallery.getGalleryUrl()); + } + galleryService.saveByGallery(gallery); + } catch (Exception e) { + e.printStackTrace(); + } + return "redirect:/admin/page/galleries"; + } + + /** + * 处理获取图片详情的请求 + * + * @param model model + * @param galleryId 图片编号 + * @return 模板路径admin/widget/_gallery-detail + */ + @GetMapping(value = "/gallery") + public String gallery(Model model, @RequestParam("galleryId") Long galleryId) { + Optional gallery = galleryService.findByGalleryId(galleryId); + model.addAttribute("gallery", gallery.get()); + return "admin/widget/_gallery-detail"; + } + + /** + * 删除图库中的图片 + * + * @param galleryId 图片编号 + * @return JsonResult + */ + @GetMapping(value = "/gallery/remove") + @ResponseBody + public JsonResult removeGallery(@RequestParam("galleryId") Long galleryId) { + try { + galleryService.removeByGalleryId(galleryId); + } catch (Exception e) { + log.error("Failed to delete image: {}", e.getMessage()); + return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.delete-failed")); + } + return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.common.delete-success")); + } + + /** + * 跳转到新建页面 + * + * @param model model + * @return 模板路径admin/admin_page_md_editor + */ + @GetMapping(value = "/new") + public String newPage(Model model) { + List customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp())); + model.addAttribute("customTpls",customTpls); + return "admin/admin_page_md_editor"; + } + + /** + * 发表页面 + * + * @param post post + * @param session session + */ + @PostMapping(value = "/new/push") + @ResponseBody + public JsonResult pushPage(@ModelAttribute Post post, HttpSession session) { + String msg = localeMessageUtil.getMessage("code.admin.common.save-success"); + try { + //发表用户 + User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY); + post.setUser(user); + post.setPostType(PostTypeEnum.POST_TYPE_PAGE.getDesc()); + if (null != post.getPostId()) { + Post oldPost = postService.findByPostId(post.getPostId()).get(); + if (null == post.getPostDate()) { + post.setPostDate(DateUtil.date()); + } + post.setPostViews(oldPost.getPostViews()); + msg = localeMessageUtil.getMessage("code.admin.common.update-success"); + } else { + post.setPostDate(DateUtil.date()); + } + post.setPostUpdate(DateUtil.date()); + post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd())); + //当没有选择文章缩略图的时候,自动分配一张内置的缩略图 + if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) { + post.setPostThumbnail("/static/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg"); + } + postService.saveByPost(post); + logsService.saveByLogs(new Logs(LogsRecord.PUSH_PAGE, post.getPostTitle(), ServletUtil.getClientIP(request), DateUtil.date())); + return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), msg); + } catch (Exception e) { + log.error("Save page failed: {}", e.getMessage()); + return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.save-failed")); + } + } + + /** + * 跳转到修改页面 + * + * @param pageId 页面编号 + * @param model model + * @return admin/admin_page_md_editor + */ + @GetMapping(value = "/edit") + public String editPage(@RequestParam("pageId") Long pageId, Model model) { + Optional post = postService.findByPostId(pageId); + List customTpls = HaloUtils.getCustomTpl(HaloConst.OPTIONS.get(BlogPropertiesEnum.THEME.getProp())); + model.addAttribute("post", post.orElse(new Post())); + model.addAttribute("customTpls",customTpls); + return "admin/admin_page_md_editor"; + } + + /** + * 检查该路径是否已经存在 + * + * @param postUrl postUrl + * @return JsonResult + */ + @GetMapping(value = "/checkUrl") + @ResponseBody + 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(), localeMessageUtil.getMessage("code.admin.common.url-is-exists")); + } + return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), ""); + } + + @InitBinder + public void initBinder(ServletRequestDataBinder binder) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); + } +}