1 创建实体类
首先还是设计实体类。在新闻管理系统中主要还是三个实体:标签、种类和新闻。可以初步设计出他们之间的关系:
根据这个关系,同时整理成各个实体类应该有的属性。这里省略构造方法和getset
Tag类
两个属性:id和标签名。id为主键,标签名不能为空值。
@Entity
@Table(name="t_tag")
public class Tag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "标名不能为空")
private String name;
@ManyToMany(mappedBy = "tags")
private List<News> newsList=new ArrayList<>();
Type类
与标签类似,也是两个属性:id和种类名称。注意它和news是一对多的关系,所以它有一个列表属性用来存放所有的新闻。同时写上注解@OneToMany
@Entity
@Table(name = "t_type")
public class Type {
@Id //主键标识
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "分类名称不能为空")
private String name;
@OneToMany(mappedBy = "type")
private List<News> newsList = new ArrayList<>();
News类
包含信息较多,与新闻信息相关。注意他和Type、User都是多对一的关系,和tags是多对多的关系。多对多关系要建立一个中间表进行存储对应的信息。由于一篇新闻内容可能较多,用懒加载的方式存入数据库中。
@Entity
@Table(name = "t_news")
public class News{
@Id //主键标识
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@Basic(fetch = FetchType.LAZY)//用到时才会加载
@Lob
private String content;
private String firstPicture;
private String flag;
private String views;
private boolean appreciation;
private boolean shareStatement;
private boolean commentabled;
private boolean published;
private boolean recommend;
@Temporal(TemporalType.TIMESTAMP) //指定时间格式
private Date createTime;
@Temporal(TemporalType.TIMESTAMP)
private Date updateTime;
@ManyToOne
private Type type;
@ManyToOne
private User user;
@ManyToMany(cascade = CascadeType.PERSIST)//级联 多对多会生成中间表news-tas
private List<Tag> tags=new ArrayList<>();
@Transient
private String tagIds;//不生成字段
private String description;
2 编写dao层接口
由于是用的jpa所以写的内容不多:
public interface TypeRepository extends JpaRepository<Type,Long> {
Type findByName(String name);
}
public interface TagRepository extends JpaRepository<Tag,Long> {
Tag findByName(String name);
}
public interface NewRepository extends JpaRepository<News,Long> , JpaSpecificationExecutor<News> {
}
3 编写服务层
主要是对Type和Tag进行增删改查操作:
Tag类
@Service
public class TagServiceimpl implements TagService {
@Autowired
private TagRepository tagRepository;
@Override
public Page<Tag> listTag(Pageable pageable) {
return tagRepository.findAll(pageable);
}
@Override
public Tag saveTag(Tag tag) {
return tagRepository.save(tag);
}
@Override
public void deleteTag(Long id) {
tagRepository.deleteById(id);
}
@Override
public Tag getTagByName(String name) {
return tagRepository.findByName(name);
}
@Override
public Tag getTag(Long id) {
return tagRepository.findById(id).orElse(null);
}
@Override
public Tag updateTag(Long id, Tag tag) {
Tag tag1=tagRepository.findById(id).orElse(null);
if(tag1==null){
System.out.println("未获得更新对象");
return null;
}
BeanUtils.copyProperties(tag,tag1);
return tagRepository.save(tag1);
}
@Override
public List<Tag> listTag() {
return tagRepository.findAll();
}
@Override
public List<Tag> listTag(String ids) {
return tagRepository.findAllById(convertToList(ids));
}
Type类
@Service
public class TypeServiceImpl implements TypeService {
@Autowired
private TypeRepository typeRepository;
@Override
public Page<Type> listType(Pageable pageable) {
return typeRepository.findAll(pageable);
}
@Override
public Type saveType(Type type) {
return typeRepository.save(type);
}
@Override
public Type getTypeByName(String name) {
return typeRepository.findByName(name);
}
@Override
public void delete(Long id) {
typeRepository.deleteById(id);
}
@Override
public Type getType(Long id) {
return typeRepository.findById(id).orElse(null);
}
@Override
public Type updateType(Long id, Type type) {
Type type1=typeRepository.findById(id).orElse(null);
if(type1==null){
System.out.println("未获得对象");
return null;
}
BeanUtils.copyProperties(type,type1);
return typeRepository.save(type1);
}
@Override
public List<Type> listType() {
return typeRepository.findAll();
}
}
4 编写Controller层
Tag
这里也是用了分页功能。使用了org.springframework.data.domain.Pageable;分页对象可以自动进行分页操作。只需要指定每页的个数、每一页的排序规则。这里构造了pageable对象,然后将此对象和查询到的tag信息一起放入model中传递给前端。
public class TagController {
@Autowired
private TagService tagService;
@RequestMapping("/tags")
private String tags(@PageableDefault(size=3,sort={"id"},direction = Sort.Direction.DESC)
Pageable pageable, Model model){
model.addAttribute("page",tagService.listTag(pageable));
return "admin/tags";
}
Type的显示,与Tag同理
@Controller
@RequestMapping("/admin")
public class TypeController {
@Autowired
private TypeService typeService;
@RequestMapping("/types")
public String type(@PageableDefault(size = 3,sort = {"id"},direction = Sort.Direction.DESC)
Pageable pageable, Model model){
model.addAttribute("page",typeService.listType(pageable));
return "admin/types";
}
最后前端根据后台传递来的数据进行显示即可
以下是进行分页显示的代码。