为作品添加标签
This commit is contained in:
@@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Api(tags = "Portfolio模块")
|
@Api(tags = "Portfolio模块")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -28,8 +29,8 @@ public class PortfolioController {
|
|||||||
|
|
||||||
@ApiOperation(value = "发布作品集")
|
@ApiOperation(value = "发布作品集")
|
||||||
@PostMapping("/publish")
|
@PostMapping("/publish")
|
||||||
public Response<Boolean> preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String 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));
|
return Response.success(portfolioService.publish(canvas, data, tagsDTOS));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "删除作品集")
|
@ApiOperation(value = "删除作品集")
|
||||||
@@ -117,4 +118,10 @@ public class PortfolioController {
|
|||||||
public Response<Boolean> commentDelete(@Valid @RequestBody CommentDTO commentDTO) {
|
public Response<Boolean> commentDelete(@Valid @RequestBody CommentDTO commentDTO) {
|
||||||
return Response.success(portfolioService.commentDelete(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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
14
src/main/java/com/ai/da/mapper/primary/TagsMapper.java
Normal file
14
src/main/java/com/ai/da/mapper/primary/TagsMapper.java
Normal 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);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
13
src/main/java/com/ai/da/mapper/primary/entity/Tags.java
Normal file
13
src/main/java/com/ai/da/mapper/primary/entity/Tags.java
Normal 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;
|
||||||
|
}
|
||||||
6
src/main/java/com/ai/da/model/dto/TagsDTO.java
Normal file
6
src/main/java/com/ai/da/model/dto/TagsDTO.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package com.ai.da.model.dto;
|
||||||
|
|
||||||
|
import com.ai.da.mapper.primary.entity.Tags;
|
||||||
|
|
||||||
|
public class TagsDTO extends Tags {
|
||||||
|
}
|
||||||
@@ -9,8 +9,10 @@ import com.ai.da.model.vo.UserLikeChooseVO;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface PortfolioService extends IService<Portfolio> {
|
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);
|
PortfolioVO update(PortfolioDTO portfolioDTO);
|
||||||
|
|
||||||
@@ -41,4 +43,6 @@ public interface PortfolioService extends IService<Portfolio> {
|
|||||||
Boolean delete(Long id);
|
Boolean delete(Long id);
|
||||||
|
|
||||||
Portfolio getByIdAll(Long originalPortfolioId);
|
Portfolio getByIdAll(Long originalPortfolioId);
|
||||||
|
|
||||||
|
List<PortfolioVO> queryPortfolioByTag(String tagName);
|
||||||
}
|
}
|
||||||
|
|||||||
8
src/main/java/com/ai/da/service/TagsService.java
Normal file
8
src/main/java/com/ai/da/service/TagsService.java
Normal 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> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -110,9 +110,18 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
|||||||
@Resource
|
@Resource
|
||||||
private WorkspaceRelStyleMapper workspaceRelStyleMapper;
|
private WorkspaceRelStyleMapper workspaceRelStyleMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PortfolioTagsMapper portfolioTagsMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private TagsService tagsService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private TagsMapper tagsMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@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();
|
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
||||||
PortfolioDTO portfolioDTO = JSONObject.parseObject(data, PortfolioDTO.class);
|
PortfolioDTO portfolioDTO = JSONObject.parseObject(data, PortfolioDTO.class);
|
||||||
QueryWrapper<Portfolio> existSameNameQw = new QueryWrapper<>();
|
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.");
|
throw new BusinessException("The title of the published work has been used.");
|
||||||
}
|
}
|
||||||
if (file != null && file.getOriginalFilename() != null) {
|
if (file != null && file.getOriginalFilename() != null) {
|
||||||
|
Long portfolioId;
|
||||||
String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file);
|
String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file);
|
||||||
Canvas canvas = new Canvas();
|
Canvas canvas = new Canvas();
|
||||||
canvas.setUrl(upload);
|
canvas.setUrl(upload);
|
||||||
@@ -191,6 +201,7 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
|||||||
} else {
|
} else {
|
||||||
portfolioMapper.insert(portfolio);
|
portfolioMapper.insert(portfolio);
|
||||||
}
|
}
|
||||||
|
portfolioId = portfolio.getId();
|
||||||
|
|
||||||
List<UserLike> userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId());
|
List<UserLike> userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId());
|
||||||
for (UserLike userLike : userLikeList) {
|
for (UserLike userLike : userLikeList) {
|
||||||
@@ -282,10 +293,12 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
|||||||
} else {
|
} else {
|
||||||
portfolioMapper.insert(portfolio);
|
portfolioMapper.insert(portfolio);
|
||||||
}
|
}
|
||||||
|
portfolioId = portfolio.getId();
|
||||||
}
|
}
|
||||||
|
// 记录作品添加的标签
|
||||||
|
addTagsForPortfolio(tagsDTOS, portfolioId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1043,4 +1056,57 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
|||||||
}
|
}
|
||||||
return null;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
45
src/main/java/com/ai/da/service/impl/TagsServiceImpl.java
Normal file
45
src/main/java/com/ai/da/service/impl/TagsServiceImpl.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
13
src/main/resources/mapper/primary/TagsMapper.xml
Normal file
13
src/main/resources/mapper/primary/TagsMapper.xml
Normal 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>
|
||||||
Reference in New Issue
Block a user