diff --git a/src/main/java/run/halo/app/controller/content/ContentContentController.java b/src/main/java/run/halo/app/controller/content/ContentContentController.java index 3caee3640..eb633c411 100644 --- a/src/main/java/run/halo/app/controller/content/ContentContentController.java +++ b/src/main/java/run/halo/app/controller/content/ContentContentController.java @@ -2,6 +2,7 @@ package run.halo.app.controller.content; import cn.hutool.core.util.IdUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -127,6 +128,9 @@ public class ContentContentController { if (postPermalinkType.equals(PostPermalinkType.DEFAULT) && optionService.getArchivesPrefix().equals(prefix)) { Post post = postService.getBySlug(slug); return postModel.content(post, token, model); + } else if (postPermalinkType.equals(PostPermalinkType.YEAR) && prefix.length() == 4 && StringUtils.isNumeric(prefix)) { + Post post = postService.getBy(Integer.parseInt(prefix), slug); + return postModel.content(post, token, model); } else if (optionService.getSheetPrefix().equals(prefix)) { Sheet sheet = sheetService.getBySlug(slug); return sheetModel.content(sheet, token, model); diff --git a/src/main/java/run/halo/app/model/enums/PostPermalinkType.java b/src/main/java/run/halo/app/model/enums/PostPermalinkType.java index c9ce61ee3..fd2dacab6 100644 --- a/src/main/java/run/halo/app/model/enums/PostPermalinkType.java +++ b/src/main/java/run/halo/app/model/enums/PostPermalinkType.java @@ -26,7 +26,12 @@ public enum PostPermalinkType implements ValueEnum { /** * /?p=${id} */ - ID(3); + ID(3), + + /** + * /1970/${slug} + */ + YEAR(4); private final Integer value; diff --git a/src/main/java/run/halo/app/repository/PostRepository.java b/src/main/java/run/halo/app/repository/PostRepository.java index 6df63dc92..0601ac1c3 100644 --- a/src/main/java/run/halo/app/repository/PostRepository.java +++ b/src/main/java/run/halo/app/repository/PostRepository.java @@ -48,6 +48,17 @@ public interface PostRepository extends BasePostRepository, JpaSpecificati @Query("select post from Post post where year(post.createTime) = :year and month(post.createTime) = :month and post.slug = :slug") Optional findBy(@Param("year") Integer year, @Param("month") Integer month, @Param("slug") String slug); + /** + * Find by post year and slug. + * + * @param year post create year + * @param slug post slug + * @return a optional of post + */ + @Query("select post from Post post where year(post.createTime) = :year and post.slug = :slug") + Optional findBy(@Param("year") Integer year, @Param("slug") String slug); + + /** * Find by post year and month and slug and status. * diff --git a/src/main/java/run/halo/app/service/PostService.java b/src/main/java/run/halo/app/service/PostService.java index 7ce87e37e..6472d12fd 100755 --- a/src/main/java/run/halo/app/service/PostService.java +++ b/src/main/java/run/halo/app/service/PostService.java @@ -109,6 +109,16 @@ public interface PostService extends BasePostService { @NonNull Post getBy(@NonNull Integer year, @NonNull Integer month, @NonNull String slug); + /** + * Gets post by post year and slug. + * + * @param year post create year. + * @param slug post slug. + * @return post info + */ + @NonNull + Post getBy(@NonNull Integer year, @NonNull String slug); + /** * Gets post by post year and month and slug. * diff --git a/src/main/java/run/halo/app/service/impl/PostCommentServiceImpl.java b/src/main/java/run/halo/app/service/impl/PostCommentServiceImpl.java index 0e57366bc..08d99352f 100644 --- a/src/main/java/run/halo/app/service/impl/PostCommentServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/PostCommentServiceImpl.java @@ -153,6 +153,11 @@ public class PostCommentServiceImpl extends BaseCommentServiceImpl .append(URL_SEPARATOR) .append(post.getSlug()) .append(pathSuffix); + } else if (permalinkType.equals(PostPermalinkType.YEAR)) { + fullPath.append(DateUtil.year(post.getCreateTime())) + .append(URL_SEPARATOR) + .append(post.getSlug()) + .append(pathSuffix); } post.setFullPath(fullPath.toString()); diff --git a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java index ce26a5d21..f2643ee2f 100644 --- a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java @@ -185,6 +185,18 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe .orElseThrow(() -> new NotFoundException("查询不到该文章的信息").setErrorData(slug)); } + @NonNull + @Override + public Post getBy(@NonNull Integer year, @NonNull String slug) { + Assert.notNull(year, "Post create year must not be null"); + Assert.notNull(slug, "Post slug must not be null"); + + Optional postOptional = postRepository.findBy(year, slug); + + return postOptional + .orElseThrow(() -> new NotFoundException("查询不到该文章的信息").setErrorData(slug)); + } + @Override public Post getBy(Integer year, Integer month, String slug, PostStatus status) { Assert.notNull(year, "Post create year must not be null"); @@ -855,6 +867,11 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe .append(URL_SEPARATOR) .append(post.getSlug()) .append(pathSuffix); + } else if (permalinkType.equals(PostPermalinkType.YEAR)) { + fullPath.append(DateUtil.year(post.getCreateTime())) + .append(URL_SEPARATOR) + .append(post.getSlug()) + .append(pathSuffix); } return fullPath.toString(); }