为作品添加标签

This commit is contained in:
2024-10-07 21:27:37 +08:00
parent deda511e32
commit a597f7a67a
11 changed files with 206 additions and 5 deletions

View File

@@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
@Api(tags = "Portfolio模块")
@Slf4j
@@ -28,8 +29,8 @@ public class PortfolioController {
@ApiOperation(value = "发布作品集")
@PostMapping("/publish")
public Response<Boolean> preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) {
return Response.success(portfolioService.publish(canvas, data));
public Response<Boolean> preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data, @RequestParam("tags") List<TagsDTO> tagsDTOS) {
return Response.success(portfolioService.publish(canvas, data, tagsDTOS));
}
@ApiOperation(value = "删除作品集")
@@ -117,4 +118,10 @@ public class PortfolioController {
public Response<Boolean> commentDelete(@Valid @RequestBody CommentDTO commentDTO) {
return Response.success(portfolioService.commentDelete(commentDTO));
}
@ApiOperation(value = "按标签名查询作品")
@PostMapping("/queryPortfolioByTag")
public Response<List<PortfolioVO>> queryPortfolioByTag(@RequestParam("tagName") String tagName) {
return Response.success(portfolioService.queryPortfolioByTag(tagName));
}
}

View File

@@ -0,0 +1,11 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.PortfolioTags;
import com.ai.da.mapper.primary.entity.Tags;
public interface PortfolioTagsMapper extends CommonMapper<PortfolioTags> {
}

View File

@@ -0,0 +1,14 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Tags;
import java.util.List;
import java.util.Map;
public interface TagsMapper extends CommonMapper<Tags> {
List<Map<String, String>> getMatchingTags(String userInput);
}

View File

@@ -0,0 +1,14 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@TableName("t_portfolio_tags")
@Data
public class PortfolioTags extends BaseEntity{
private Long portfolioId;
private Long tagId;
}

View File

@@ -0,0 +1,13 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@TableName("t_tags")
@Data
public class Tags extends BaseEntity{
private String tagName;
}

View File

@@ -0,0 +1,6 @@
package com.ai.da.model.dto;
import com.ai.da.mapper.primary.entity.Tags;
public class TagsDTO extends Tags {
}

View File

@@ -9,8 +9,10 @@ import com.ai.da.model.vo.UserLikeChooseVO;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface PortfolioService extends IService<Portfolio> {
Boolean publish(MultipartFile canvas, String data);
Boolean publish(MultipartFile canvas, String data, List<TagsDTO> tagsDTOS);
PortfolioVO update(PortfolioDTO portfolioDTO);
@@ -41,4 +43,6 @@ public interface PortfolioService extends IService<Portfolio> {
Boolean delete(Long id);
Portfolio getByIdAll(Long originalPortfolioId);
List<PortfolioVO> queryPortfolioByTag(String tagName);
}

View File

@@ -0,0 +1,8 @@
package com.ai.da.service;
import com.ai.da.mapper.primary.entity.Tags;
import com.baomidou.mybatisplus.extension.service.IService;
public interface TagsService extends IService<Tags> {
}

View File

@@ -110,9 +110,18 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
@Resource
private WorkspaceRelStyleMapper workspaceRelStyleMapper;
@Resource
private PortfolioTagsMapper portfolioTagsMapper;
@Resource
private TagsService tagsService;
@Resource
private TagsMapper tagsMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean publish(MultipartFile file, String data) {
public Boolean publish(MultipartFile file, String data, List<TagsDTO> tagsDTOS) {
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
PortfolioDTO portfolioDTO = JSONObject.parseObject(data, PortfolioDTO.class);
QueryWrapper<Portfolio> existSameNameQw = new QueryWrapper<>();
@@ -123,6 +132,7 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
throw new BusinessException("The title of the published work has been used.");
}
if (file != null && file.getOriginalFilename() != null) {
Long portfolioId;
String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file);
Canvas canvas = new Canvas();
canvas.setUrl(upload);
@@ -191,6 +201,7 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
} else {
portfolioMapper.insert(portfolio);
}
portfolioId = portfolio.getId();
List<UserLike> userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId());
for (UserLike userLike : userLikeList) {
@@ -282,10 +293,12 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
} else {
portfolioMapper.insert(portfolio);
}
portfolioId = portfolio.getId();
}
// 记录作品添加的标签
addTagsForPortfolio(tagsDTOS, portfolioId);
}
return Boolean.TRUE;
}
@@ -1043,4 +1056,57 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
}
return null;
}
public void addTagsForPortfolio(List<TagsDTO> tagsDTOS, Long portfolioId) {
// 遍历数组添加到t_portfolio_tags表中没有id的tag添加到t_tags表中
tagsDTOS.forEach(tag -> {
PortfolioTags portfolioTags = new PortfolioTags();
if (Objects.isNull(tag.getId())){
Tags newTag = new Tags();
newTag.setTagName(tag.getTagName());
newTag.setCreateTime(LocalDateTime.now());
tagsService.save(newTag);
portfolioTags.setTagId(newTag.getId());
}else {
portfolioTags.setTagId(tag.getId());
}
portfolioTags.setPortfolioId(portfolioId);
portfolioTags.setCreateTime(LocalDateTime.now());
portfolioTagsMapper.insert(portfolioTags);
});
}
public List<PortfolioVO> queryPortfolioByTag(String tagName){
ArrayList<PortfolioVO> portfolioVOS = new ArrayList<>();
List<Map<String, String>> matchingTags = tagsMapper.getMatchingTags(tagName);
Map<String, String> tagMap = matchingTags.get(0);
long bestMatchTagId = Long.parseLong(tagMap.get("id"));
QueryWrapper<PortfolioTags> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("tag_id", bestMatchTagId).select("portfolio_id");
List<PortfolioTags> portfolioTags = portfolioTagsMapper.selectList(queryWrapper);
List<Long> portfolioIdList = portfolioTags.stream().map(PortfolioTags::getPortfolioId).collect(Collectors.toList());
QueryWrapper<Portfolio> qw = new QueryWrapper<>();
qw.in("id", portfolioIdList);
List<Portfolio> portfolios = baseMapper.selectList(qw);
portfolios.forEach(portfolio -> {
if (portfolio != null) {
PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class);
Canvas canvas = canvasMapper.selectById(vo.getCanvasId());
vo.setCanvasUrl(minioUtil.getPreSignedUrl(canvas.getUrl(), 24 * 60));
vo.setLikeNum(redisUtil.getLikeCount(vo.getId()));
vo.setViewNums(redisUtil.getViewCount(vo.getId()));
Long accountId = vo.getAccountId();
vo.setUserName(accountMapper.selectById(accountId).getUserName());
if (vo.getOriginal() == 0) {
vo.setOriginalUserName(accountMapper.selectById(vo.getOriginalAccountId()).getUserName());
}
portfolioVOS.add(vo);
}
});
return portfolioVOS;
}
}

View File

@@ -0,0 +1,45 @@
package com.ai.da.service.impl;
import com.ai.da.mapper.primary.TagsMapper;
import com.ai.da.mapper.primary.entity.Tags;
import com.ai.da.service.TagsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class TagsServiceImpl extends ServiceImpl<TagsMapper, Tags> implements TagsService {
public List<Tags> getTags(String tagPrefix){
// 1、根据tag前缀,查询
QueryWrapper<Tags> queryWrapper = new QueryWrapper<>();
queryWrapper.likeLeft("tag_name", tagPrefix);
// 需返回标签内容和id
return baseMapper.selectList(queryWrapper);
}
public Tags addTag(String tagName) {
// 1、判断有无该tag
QueryWrapper<Tags> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("tag_name", tagName);
Tags tags = baseMapper.selectOne(queryWrapper);
// 2、没有该数据时插入新标签并返回标签id等
if (Objects.isNull(tags)){
tags = new Tags();
tags.setTagName(tagName);
tags.setCreateTime(LocalDateTime.now());
baseMapper.insert(tags);
}
return tags;
}
}

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ai.da.mapper.primary.TagsMapper">
<select id="getMatchingTags" resultType="java.util.List">
SELECT id, tag_name, MATCH(tag_name) AGAINST(#{userInput}) AS relevance
FROM t_tags
WHERE MATCH(tag_name) AGAINST(#{userInput})
ORDER BY relevance DESC;
</select>
</mapper>