学习内容
今天的内容主要是新闻的新建、修改和搜索。导入news.html和news-input.html文件。同时新建NewsDao,NewsController,以及NewsService接口和实现类。
新建
在NewsController中:
package com.zr.controller;
import com.zr.po.*;
import com.zr.service.NewsService;
import com.zr.service.TagService;
import com.zr.service.TypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.AccessType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
import java.util.List;
@Controller
@RequestMapping("/admin/news")
public class NewsController {
@Autowired
private NewsService newsService;
@Autowired
private TypeService typeService;
@Autowired
private TagService tagService;
//先查询所有
@RequestMapping
public String list(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC ) Pageable pageable,
Model model){
//分页
Page<News> page=newsService.findByPageable(pageable);
model.addAttribute("page",page);
model.addAttribute("types",typeService.listType());
return "admin/news";
}
@RequestMapping("input/{id}")
public String toInput(@PathVariable Long id,Model model){
if(id==-1){
//新增
model.addAttribute("news",new News());
}else{
//编辑,根据id查找
News news=newsService.findNewsById(id);
String tagIds=tagService.getTagIds(news.getTags());
news.setTagIds(tagIds);
model.addAttribute("news",news);
}
List<Type> types=typeService.listType();//重载,查出所有的分类
model.addAttribute("types",types);
//查所有的标签
List<Tag> tags=tagService.listTag();
model.addAttribute("tags",tags);
return "admin/news-input";
}
TagServiceImpl的getTagIds方法:
@Override
public String getTagIds(List<Tag> tags) {
//1,2,3
StringBuffer ids=new StringBuffer();//创建字符串
if(!tags.isEmpty()){
boolean flag=false;
//第一次,第二次需要拼接逗号
for(Tag t:tags){
if(flag){
ids.append(",");
ids.append(t.getId());
}else{//第一次
ids.append(t.getId());
flag=true;
}
}
}
return ids.toString();
}
新建页面:
编辑
在NewsController类中添加以下代码
@RequestMapping("input")
public String input(News news,HttpSession session ){
//从session中取出用户
User user=(User)session.getAttribute("users");
news.setUser(user);
//保存tag的id
List<Tag> tags=tagService.findTagByTagId(news.getTagIds());
news.setTags(tags);
newsService.input(news);
return "redirect:/admin/news";
}
NewsServiceImpl类中的input()方法,用来保存新闻新建的时间和修改新闻的时间(新闻的更新时间)
@Override
public void input(News news) {
if(news.getId()==null){
//创建的时间
news.setCreateTime(new Date());
newsDao.save(news);
}else{
//更新时间
news.setUpdateTime(new Date());
News n=newsDao.getOne(news.getId());
BeanUtils.copyProperties(news,n, MyBeanUtils.getNullPropertyNames(news));
newsDao.save(n);
}
}
TagServiceImpl类中的findTagByTagId()
@Override
public List<Tag> findTagByTagId(String tagIds) {
List<Long> ids=new ArrayList<>();
if(!StringUtils.isEmpty(tagIds)){
String[] strings = tagIds.split(",");//以逗号分隔id,得到一个数组
//对数组进行遍历
for(String s:strings){
if(!StringUtils.isEmpty(s)){
//添加
ids.add(new Long(s));
}
}
}
return tagDao.findAllById(ids);
}
修改页面,将标题为12的新闻分类改为电视剧:
成功修改!
搜索
NewsController:
// 搜索
@RequestMapping("search")
public String search(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC ) Pageable pageable,
NewsQuery newsQuery,
Model model){
Page<News> page=newsService.searchNews(pageable,newsQuery);
//通过NewsQuery拿到前端页面传过来的数据
model.addAttribute("page",page);
return "admin/news :: newsList";
}
NewsServiceImpl:
@Override
public Page<News> searchNews(Pageable pageable, NewsQuery newsQuery) {
Page<News> news=newsDao.findAll(new Specification<News>() {
@Override
public Predicate toPredicate(Root<News> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates=new ArrayList<>();
if(!StringUtils.isEmpty(newsQuery.getTitle())){
predicates.add(criteriaBuilder.like(root.<String>get("title"),"%"+newsQuery.getTitle()+"%"));
}
if(!StringUtils.isEmpty(newsQuery.getTypeId())){
predicates.add(criteriaBuilder.equal(root.<Type>get("type").get("id"),newsQuery.getTypeId()));
}
if(newsQuery.getRecommend()!=null){
predicates.add(criteriaBuilder.equal(root.<Boolean>get("recommend"),newsQuery.getRecommend()));
}
query.where(predicates.toArray(new Predicate[predicates.size()]));
return null;
}
}, pageable);
return news;
}
news.html的j’s部分添加如下函数
function page(obj){
$("[name='page']").val($(obj).data("page"));
load();
}
$("#search-btn").click(function () {
$("[name='page']").val(0);
load();
});
function load() {
$("#table-container").load("/admin/news/search",{
title : $("[name='title']").val(),
typeId : $("[name='typeId']").val(),
recommend : $("[name='recommend']").prop('checked'),
page : $("[name='page']").val()}
)
搜索页面:搜索标题有12的新闻:
总结
今天的学习内容还是比较多的,但是也有和昨天分类、标签类似的地方,今天主要是那个搜索功能的实现,实现起来还是挺复杂的(主要是我没看懂那段代码的意思),上午也遇到了一些问题,课下找了找错,修改代码也挺让人烦躁的。下午的时候开始着手做小组项目了,昨天分完工之后,一直在考虑我负责的那一部分的前端页面怎么写,今天下午看了一些视频也算是知道了前端页面怎么写的了,所以就可以开始着手项目了。