Complete search controller.

pull/146/head
ruibaby 2019-04-21 15:55:31 +08:00
parent 6fa03b0f21
commit 4c2eaa1266
4 changed files with 104 additions and 8 deletions

View File

@ -77,6 +77,15 @@ public interface PostService extends CrudService<Post, Integer> {
@NonNull
Page<Post> pageBy(@NonNull PostQuery postQuery, @NonNull Pageable pageable);
/**
* Pages post by keyword
*
* @param keyword keyword
* @param pageable pageable
* @return a page of post
*/
@NonNull
Page<Post> pageBy(@NonNull String keyword, @NonNull Pageable pageable);
/**
* Lists simple output dto by status.

View File

@ -117,6 +117,18 @@ public class PostServiceImpl extends AbstractCrudService<Post, Integer> implemen
return postRepository.findAll(buildSpecByQuery(postQuery), pageable);
}
@Override
public Page<Post> pageBy(String keyword, Pageable pageable) {
Assert.notNull(keyword, "keyword must not be null");
Assert.notNull(pageable, "Page info must not be null");
PostQuery postQuery = new PostQuery();
postQuery.setKeyword(keyword);
// Build specification and find all
return postRepository.findAll(buildSpecByQuery(postQuery), pageable);
}
/**
* Build specification by post query.
*

View File

@ -0,0 +1,83 @@
package run.halo.app.web.controller.content;
import cn.hutool.core.util.PageUtil;
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.data.web.SortDefault;
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.RequestParam;
import org.springframework.web.util.HtmlUtils;
import run.halo.app.model.entity.Post;
import run.halo.app.model.vo.PostListVO;
import run.halo.app.service.OptionService;
import run.halo.app.service.PostService;
import run.halo.app.service.ThemeService;
import static org.springframework.data.domain.Sort.Direction.DESC;
/**
* Search Controller
*
* @author : RYAN0UP
* @date : 2019-04-21
*/
@Controller
@RequestMapping(value = "/search")
public class ContentSearchController {
private final PostService postService;
private final OptionService optionService;
private final ThemeService themeService;
public ContentSearchController(PostService postService, OptionService optionService, ThemeService themeService) {
this.postService = postService;
this.optionService = optionService;
this.themeService = themeService;
}
/**
* Render post search page.
*
* @param model model
* @param keyword keyword
* @return template path : themes/{theme}/search
*/
@GetMapping
public String search(Model model,
@RequestParam(value = "keyword") String keyword) {
return this.search(model, HtmlUtils.htmlEscape(keyword), 1, Sort.by(DESC, "createTime"));
}
/**
* Render post search page.
*
* @param model model
* @param keyword keyword
* @return template path :themes/{theme}/search
*/
@GetMapping(value = "page/{page}")
public String search(Model model,
@RequestParam(value = "keyword") String keyword,
@PathVariable(value = "page") Integer page,
@SortDefault(sort = "createTime", direction = DESC) Sort sort) {
final Pageable pageable = PageRequest.of(page - 1, optionService.getPostPageSize(), sort);
final Page<Post> posts = postService.pageBy(keyword, pageable);
final Page<PostListVO> postPage = postService.convertToListVo(posts);
final int[] rainbow = PageUtil.rainbow(page, postPage.getTotalPages(), 3);
model.addAttribute("is_search", true);
model.addAttribute("keyword", keyword);
model.addAttribute("posts", postPage);
model.addAttribute("rainbow", rainbow);
return themeService.render("search");
}
}

View File

@ -1,8 +0,0 @@
theme.id=caicai_anatole
theme.name=Anatole
theme.website=https://github.com/hi-caicai/farbox-theme-Anatole
theme.description=A other farbox theme
theme.logo=https://ryanc.cc/anatole/source/images/logo@2x.png
theme.version=1.0
theme.author=Caicai
theme.author.website=https://www.caicai.me/