本文讲解标签功能,如何给一张图片、帖子、应用打上多个标签?图解 + 代码实践。
场景描述
系统已经具备了帖子功功能或者图片功能,如何给他们打上多个标签?下面以图片为例,讲解如何给一张图片打上多个标签。
分析
本质上是对标签的增删改查,不过可以打上多个标签,改如何设计数据呢?在原本的图片标签加上一个 tags 字段,设计为 String 类型,使用数组格式的string , 如:["风景","海边"] ,一张图片就有了两个标签。
前端->后端->数据库的数据格式,如下图:

前端传递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字符串

当查询时,数据从数据库走向前端,那么需要设计一个 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>。
999

被折叠的 条评论
为什么被折叠?



