欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot后端分类管理+标签管理

程序员文章站 2024-03-04 12:00:11
...

SpringBoot后端分类管理+标签管理

新建实体

Type.java:

@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>  news = new ArrayList<>();
	//省略get和set方法
}

Tag.java:

@Entity
@Table(name = "t_tag")
public class Tag {

    @Id  //主键标识
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotBlank(message = "标签名称不能为空")
    private String name;
    //省略get和set方法
}

分类管理

TypeService.java接口中新增如下方法:

    Type getTypeByName(String name);

    void delete(Long id);

    Type getType(Long id);

    Type updateType(Long id,Type type);

在TypeServiceImpl.java文件中具体实现上述方法:

//TypeServiceImpl.java
@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);
    }
}

然后新建TypeController.java类:

//TypeController.java
@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";
    }

    @GetMapping("/types/input")
    public String input(Model model){
        model.addAttribute("type",new Type());
        return "admin/types-input";
    }

    @PostMapping("/types/add")
    public String add(@Valid Type type, BindingResult result, RedirectAttributes attributes){
        System.out.println(type);
        Type type1 = typeService.getTypeByName(type.getName());
        System.out.println(type1);
        if(type1!=null){
            result.rejectValue("name","nameError","不能添加相同的分类");
        }
        if(result.hasErrors()){
            return "admin/types-input";
        }
        Type type2 = typeService.saveType(type);
        System.out.println(type2);
        if(type2==null){
            attributes.addFlashAttribute("message","新增失败");
        }else{
            attributes.addFlashAttribute("message","新增成功");
        }
        return "redirect:/admin/types";
    }

    @RequestMapping("/types/{id}/delete")
    public String delete(@PathVariable Long id,RedirectAttributes attributes){
        typeService.delete(id);
        attributes.addFlashAttribute("message","删除成功");
        return "redirect:/admin/types";
    }

	//跳转到更新界面
    @RequestMapping("/types/{id}/toUpdate")
    public String toUpdate(@PathVariable Long id, Model model){
        model.addAttribute("type",typeService.getType(id));
        return "admin/types-input";
    }

	//更新信息
    @RequestMapping("/types/update/{id}")
    public String update(Type type,@PathVariable Long id,RedirectAttributes attributes,BindingResult result){
        Type type1 = typeService.getTypeByName(type.getName());
        if(type1!=null){
            result.rejectValue("name","nameError","不能添加重复的类");
        }
        if(result.hasErrors()){
            return "admin/types-input";
        }
        Type type2 = typeService.updateType(id,type);
        if(type2!=null){
            attributes.addFlashAttribute("message","更新成功");
        }else{
            attributes.addFlashAttribute("message","更新失败");
        }
        return "redirect:/admin/types";
    }
}

标签管理

在Dao层新建TagRepository.java文件:

public interface TagRepository extends JpaRepository<Tag,Long> {

    Tag findByName(String name);

}

在Service层新建TagService.java接口:

public interface TagService {
    Page<Tag> ListTag(Pageable pageable);

    Tag saveTag(Tag tag);

    void deleteTag(Long id);

    Tag getTagByName(String name);

    Tag getTag(Long id);

    Tag updateTag(Long id,Tag tag);
}

新建TagServiceImpl.java文件实现上述方法:

@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;
        }else{
            BeanUtils.copyProperties(tag,tag1);
            return tagRepository.save(tag1);
        }

    }
}

新建一个TagController.java类:

@Controller
@RequestMapping("/admin")
public class TagController {

    @Autowired
    private TagService tagService;

    @RequestMapping("/tags")
    public String tags(@PageableDefault(size = 3,sort = {"id"},direction = Sort.Direction.DESC)
                               Pageable pageable, Model model){
        model.addAttribute("page",tagService.ListTag(pageable));
        return "admin/tags";
    }

    @GetMapping("/tags/input")
    public String input(Model model){
        model.addAttribute("tag",new Tag());
        return "admin/tags-input";
    }

    @PostMapping("/tags/add")
    public String add(@Valid Tag tag, BindingResult result, RedirectAttributes attributes){
        Tag tag1 = tagService.getTagByName(tag.getName());
        if(tag1!=null){
            result.rejectValue("name","nameError","不能添加相同的标签");
        }
        if(result.hasErrors()){
            return "admin/tags-input";
        }
        Tag tag2 = tagService.saveTag(tag);
        System.out.println(tag2);
        if(tag2==null){
            attributes.addFlashAttribute("message","新增失败");
        }else{
            attributes.addFlashAttribute("message","新增成功");
        }
        return "redirect:/admin/tags";
    }

    @RequestMapping("/tags/{id}/toUpdate")
    public String toUpdate(@PathVariable Long id, Model model){
        model.addAttribute("tag",tagService.getTag(id));
        return "admin/tags-input";
    }


    @RequestMapping("/tags/update/{id}")
    public String update(Tag tag, @PathVariable Long id, RedirectAttributes attributes, BindingResult result){
        Tag tag1 = tagService.getTagByName(tag.getName());
        if(tag1!=null){
            result.rejectValue("name","nameError","不能添加重复的类");
        }
        if(result.hasErrors()){
            return "admin/tags-input";
        }
        Tag tag2 = tagService.updateTag(id,tag);
        if(tag2!=null){
            attributes.addFlashAttribute("message","更新成功");
        }else{
            attributes.addFlashAttribute("message","更新失败");
        }
        return "redirect:/admin/tags";
    }
}

报错信息对应的前端代码:

<div class="ui negative message" th:if="${#fields.hasErrors('name')}">
  <i class="close icon"></i>
  <p th:errors="*{name}">提交信息不符合规则</p>
</div>

界面展示

分类页面:
SpringBoot后端分类管理+标签管理
分类编辑:
SpringBoot后端分类管理+标签管理
如果输入为空:
SpringBoot后端分类管理+标签管理
若分类重复:
SpringBoot后端分类管理+标签管理
更新成功:
SpringBoot后端分类管理+标签管理
新增标签:
SpringBoot后端分类管理+标签管理
新增成功:
SpringBoot后端分类管理+标签管理

标签界面:
SpringBoot后端分类管理+标签管理
标签界面基本和分类界面是一样的样式,不再描述。

Bug记录

在新增标签页面输入信息之后点击提交出现报错:
SpringBoot后端分类管理+标签管理
在浏览器使用开发者模式查看报错信息:
SpringBoot后端分类管理+标签管理
发现这个请求居然是跳转到了update也就是更新的界面,查看前端代码发现前端是如果id等于null的话才跳转新增界面,不等于null就跳转的为更新界面:
SpringBoot后端分类管理+标签管理
经过排查发现自己问题出在Type.java实体类中:
SpringBoot后端分类管理+标签管理
自己把Long写成了long,而long生成的默认值为0,Long生成的默认值为null,因此在生成一个新的Type的时候给默认赋值成了0,才会跳转到错误的页面。

总结

这回的Bug真的是坑,找了很久才发现问题,因为之前运行的时候也是正常的所以没有注意太多。默认参数这一块真的会有好多坑,例如室友所说的还有String,在前端传null,后台收到的是"",之类的问题以后还是要多注意一下。

相关标签: java spring