SpringBoot 后端 - 标签功能

本文讲解标签功能,如何给一张图片、帖子、应用打上多个标签?图解 + 代码实践。

场景描述

系统已经具备了帖子功功能或者图片功能,如何给他们打上多个标签?下面以图片为例,讲解如何给一张图片打上多个标签。

分析

本质上是对标签的增删改查,不过可以打上多个标签,改如何设计数据呢?在原本的图片标签加上一个 tags 字段,设计为 String 类型,使用数组格式的string , 如:["风景","海边"] ,一张图片就有了两个标签。

前端->后端->数据库的数据格式,如下图:

img

前端传递JSON 数组给后端,后端得到List<String> tags 列表,对标签比较好处理,做筛选,过滤等操作比 String 类型容易, 后端转成 JSON 字符串 的tags 才能存入数据库,否则类型不兼容。

图片表:

CREATE TABLE picture (
  id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
  user_id BIGINT UNSIGNED NOT NULL COMMENT '上传用户ID',
  image_url VARCHAR(512) NOT NULL COMMENT '图片访问URL',
  tags      VARCHAR(128)   COMMENT '标签',
  
  省略其它字段
  
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图片信息表';

后端开发

按照图片增删改查的思路,图片的添加和更新是前端给后端发送数据,那么后端应该设计 DTO 接收前端的数据。

public class PictureAddRequest {

    private Long id;

    private Long userId;

    private String imageUrl;

    private List<String> tags;
    
}

实体类:

public class Picture {

    private Long id;

    private Long userId;

    private String imageUrl;

    // 类型和 DTO 不同
    private String tags;
    
}

后端控制层接收到数据(简化版):

    @PostMapping("/upload/url")
    public void uploadPictureByUrl(
            @RequestBody PictureUploadRequest pictureUploadRequest) {
    
        Picture picture = new Picture();  
        BeanUtils.copyProperties(pictureUploadRequest, picture);
        // 类型不同,需要转换  
        picture.setTags(JSONUtil.toJsonStr(pictureUploadRequest.getTags()));
        pictureService.save(picture)

    }

这样数据库的标签列是JSON字符串

img

当查询时,数据从数据库走向前端,那么需要设计一个 VO 类:

public class PictureVO {

    private Long id;

    private Long userId;

    private String imageUrl;

    private List<String> tags;
    
}

控制层代码:

    @GetMapping("/get/vo")
    public PictureVO getPictureById(Long PictureId) {
    
        Picture picture = pictureService.getById(id);
        PictureVO pictureVO = new PictureVO();  
        BeanUtils.copyProperties(picture, pictureVO);  
        // 类型不同,需要转换  
        pictureVO.setTags(JSONUtil.toList(picture.getTags(), String.class));
        return pictureVO;  

    }

前端接收到的 Picture 数据,tags 列是一个 JSON 字符串数组。 原理如下:

在典型的 Spring Boot/Spring MVC 应用中 , 当控制器方法返回一个对象(且使用 @ResponseBody@RestController)时,Spring 会通过该 HttpMessageConverter 使用 Jackson 将 Java 对象序列化为 JSON,List<String> 类型的 tags 字段会被序列化为 JSON 数组(例如 ["风景","海边"])。

反之,当客户端以 Content-Type: application/json 提交一个 JSON 请求体并在控制器中使用 @RequestBody Picture picture 接收时,Jackson 会把请求体反序列化为 Picture 实例,tags 字段会被映射为 List<String>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值