SpringBoot新闻管理系统——分类和标签管理

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";
    }

最后前端根据后台传递来的数据进行显示即可
以下是进行分页显示的代码。
在这里插入图片描述

5 测试

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42189888/article/details/107663680