Commit 84d39d7d by 段启岩

添加是否关注用户的功能

parent dcc60646
...@@ -26,7 +26,7 @@ public class PageVO<T> { ...@@ -26,7 +26,7 @@ public class PageVO<T> {
/** /**
* 每页数据量 * 每页数据量
*/ */
private long pageNumber; private long pageSize;
/** /**
* 数据 * 数据
...@@ -40,13 +40,13 @@ public class PageVO<T> { ...@@ -40,13 +40,13 @@ public class PageVO<T> {
setDataList(page.getRecords()); setDataList(page.getRecords());
setTotalPage(page.getPages()); setTotalPage(page.getPages());
setTotalRecords(page.getTotal()); setTotalRecords(page.getTotal());
setPageNumber(page.getSize()); setPageSize(page.getSize());
} }
public PageVO(Page<T> page) { public PageVO(Page<T> page) {
setDataList(page.getContent()); setDataList(page.getContent());
setTotalPage(page.getTotalPages()); setTotalPage(page.getTotalPages());
setTotalRecords(page.getTotalElements()); setTotalRecords(page.getTotalElements());
setPageNumber(page.getSize()); setPageSize(page.getSize());
} }
} }
\ No newline at end of file
...@@ -11,5 +11,7 @@ import lombok.Data; ...@@ -11,5 +11,7 @@ import lombok.Data;
@Data @Data
public class BlogDetailDTO extends Blog { public class BlogDetailDTO extends Blog {
private Boolean followedAuthor;
private String content; private String content;
} }
...@@ -20,6 +20,7 @@ import cn.meteor.beyondclouds.modules.topic.enums.TopicReferenceType; ...@@ -20,6 +20,7 @@ import cn.meteor.beyondclouds.modules.topic.enums.TopicReferenceType;
import cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService; import cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService;
import cn.meteor.beyondclouds.modules.topic.service.ITopicService; import cn.meteor.beyondclouds.modules.topic.service.ITopicService;
import cn.meteor.beyondclouds.modules.user.entity.User; import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.service.IUserFollowService;
import cn.meteor.beyondclouds.modules.user.service.IUserService; import cn.meteor.beyondclouds.modules.user.service.IUserService;
import cn.meteor.beyondclouds.util.AbstractUtils; import cn.meteor.beyondclouds.util.AbstractUtils;
import cn.meteor.beyondclouds.util.PageUtils; import cn.meteor.beyondclouds.util.PageUtils;
...@@ -39,6 +40,7 @@ import org.springframework.util.StringUtils; ...@@ -39,6 +40,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -73,6 +75,8 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -73,6 +75,8 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
private IMessageQueueService messageQueueService; private IMessageQueueService messageQueueService;
private IUserFollowService userFollowService;
@Autowired @Autowired
public BlogServiceImpl(IBlogTagService blogTagService, ITopicReferenceService topicReferenceService, IBlogExtService blogExtService, IBlogCategoryService blogCategoryService, BlogMapper blogMapper, ITagService tagService) { public BlogServiceImpl(IBlogTagService blogTagService, ITopicReferenceService topicReferenceService, IBlogExtService blogExtService, IBlogCategoryService blogCategoryService, BlogMapper blogMapper, ITagService tagService) {
this.blogTagService = blogTagService; this.blogTagService = blogTagService;
...@@ -84,6 +88,11 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -84,6 +88,11 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
} }
@Autowired @Autowired
public void setUserFollowService(IUserFollowService userFollowService) {
this.userFollowService = userFollowService;
}
@Autowired
public void setMessageQueueService(IMessageQueueService messageQueueService) { public void setMessageQueueService(IMessageQueueService messageQueueService) {
this.messageQueueService = messageQueueService; this.messageQueueService = messageQueueService;
} }
...@@ -105,6 +114,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -105,6 +114,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 发布博客 * 发布博客
*
* @param blog * @param blog
* @param content * @param content
* @param topicIds * @param topicIds
...@@ -158,6 +168,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -158,6 +168,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 删除博客 * 删除博客
*
* @param userId * @param userId
* @param blogId * @param blogId
* @throws BlogServiceException * @throws BlogServiceException
...@@ -177,8 +188,8 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -177,8 +188,8 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
} }
//2.删除博客评论表 //2.删除博客评论表
QueryWrapper<BlogComment> queryWrapperComment = new QueryWrapper(); QueryWrapper<BlogComment> queryWrapperComment = new QueryWrapper();
queryWrapperComment.eq("blog_id",blogId); queryWrapperComment.eq("blog_id", blogId);
blogCommentService.remove(queryWrapperComment); blogCommentService.remove(queryWrapperComment);
//3.删除博客内容 //3.删除博客内容
...@@ -208,6 +219,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -208,6 +219,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 博客详情 * 博客详情
*
* @param blogId * @param blogId
* @return * @return
* @throws BlogServiceException * @throws BlogServiceException
...@@ -264,15 +276,37 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -264,15 +276,37 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
blog.setTopics(List.of()); blog.setTopics(List.of());
} }
//装配并返回查询到的数据 //装配并返回查询到的数据
BlogDetailDTO blogDetail = new BlogDetailDTO(); BlogDetailDTO blogDetail = new BlogDetailDTO();
BeanUtils.copyProperties(blog, blogDetail); BeanUtils.copyProperties(blog, blogDetail);
blogDetail.setContent(blogExt.getContent()); blogDetail.setContent(blogExt.getContent());
// 查看当前用户有没有关注博主
blogDetail.setFollowedAuthor(false);
Set<String> currentUserFollowedUserIds;
if (subject.isAuthenticated()) {
String currentUserId = (String) subject.getId();
String authorId = blog.getUserId();
currentUserFollowedUserIds = userFollowService.getCurrentUserFollowedUserIds(currentUserId);
if (!CollectionUtils.isEmpty(currentUserFollowedUserIds)
&& currentUserFollowedUserIds.contains(authorId)) {
blogDetail.setFollowedAuthor(true);
} else if (currentUserId.equals(authorId)) {
blogDetail.setFollowedAuthor(true);
} else {
blogDetail.setFollowedAuthor(false);
}
}
return blogDetail; return blogDetail;
} }
/** /**
* 博客列表 * 博客列表
*
* @param pageNumber * @param pageNumber
* @param pageSize * @param pageSize
* @return * @return
...@@ -289,6 +323,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -289,6 +323,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 个人博客列表 * 个人博客列表
*
* @param pageNumber * @param pageNumber
* @param pageSize * @param pageSize
* @param userId * @param userId
...@@ -306,6 +341,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -306,6 +341,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 我的博客列表 * 我的博客列表
*
* @param pageNumber * @param pageNumber
* @param pageSize * @param pageSize
* @param userId * @param userId
...@@ -322,6 +358,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -322,6 +358,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 修改博客 * 修改博客
*
* @param blog * @param blog
* @param content * @param content
* @param topicIds * @param topicIds
...@@ -334,7 +371,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -334,7 +371,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
Assert.notNull(blog, "blog must not be null"); Assert.notNull(blog, "blog must not be null");
Assert.notNull(blog.getBlogId(), "blogId must not be null"); Assert.notNull(blog.getBlogId(), "blogId must not be null");
Assert.notNull(blog.getUserId(),"userId must not be null"); Assert.notNull(blog.getUserId(), "userId must not be null");
//1.判断当前用户是否拥有此博客 //1.判断当前用户是否拥有此博客
QueryWrapper<Blog> blogQueryWrapper = new QueryWrapper<>(); QueryWrapper<Blog> blogQueryWrapper = new QueryWrapper<>();
...@@ -368,7 +405,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -368,7 +405,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
blogExt.setContent(content); blogExt.setContent(content);
QueryWrapper<BlogExt> blogExtQueryWrapper = new QueryWrapper(); QueryWrapper<BlogExt> blogExtQueryWrapper = new QueryWrapper();
blogExtQueryWrapper.eq("blog_id", blog.getBlogId()); blogExtQueryWrapper.eq("blog_id", blog.getBlogId());
blogExtService.update(blogExt,blogExtQueryWrapper); blogExtService.update(blogExt, blogExtQueryWrapper);
} }
//4.更新标签和话题的引用 //4.更新标签和话题的引用
...@@ -384,6 +421,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -384,6 +421,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 更新博客里面对标签和话题的引用 * 更新博客里面对标签和话题的引用
*
* @param tagIds * @param tagIds
* @param topicIds * @param topicIds
* @param blogId * @param blogId
...@@ -453,6 +491,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -453,6 +491,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 删除博客博客的旧话题引用 * 删除博客博客的旧话题引用
*
* @param blogId * @param blogId
*/ */
private void deleteOldTopicReferences(String blogId) { private void deleteOldTopicReferences(String blogId) {
...@@ -474,6 +513,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -474,6 +513,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
/** /**
* 删除博客的旧标签引用 * 删除博客的旧标签引用
*
* @param blogId * @param blogId
*/ */
private void deleteOldTagReferences(String blogId) { private void deleteOldTagReferences(String blogId) {
...@@ -497,13 +537,13 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -497,13 +537,13 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
QueryWrapper<Blog> blogQueryWrapper = new QueryWrapper(); QueryWrapper<Blog> blogQueryWrapper = new QueryWrapper();
blogQueryWrapper.orderByDesc("view_number"); blogQueryWrapper.orderByDesc("view_number");
IPage<Blog> page = new Page<>(pageNumber, pageSize); IPage<Blog> page = new Page<>(pageNumber, pageSize);
return blogMapper.selectPageWithTags(page, blogQueryWrapper); return blogMapper.selectPageWithTags(page, blogQueryWrapper);
} }
@Override @Override
public IPage<Blog> getBlogPageByTagId(Integer pageNumber, Integer pageSize, String tagId) { public IPage<Blog> getBlogPageByTagId(Integer pageNumber, Integer pageSize, String tagId) {
// 查询blogTagPage // 查询blogTagPage
IPage<BlogTag> page = new Page<>(pageNumber , pageSize); IPage<BlogTag> page = new Page<>(pageNumber, pageSize);
QueryWrapper<BlogTag> blogTagQueryWrapper = new QueryWrapper<>(); QueryWrapper<BlogTag> blogTagQueryWrapper = new QueryWrapper<>();
blogTagQueryWrapper.eq("tag_id", tagId); blogTagQueryWrapper.eq("tag_id", tagId);
blogTagQueryWrapper.orderByDesc("create_time"); blogTagQueryWrapper.orderByDesc("create_time");
...@@ -569,7 +609,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB ...@@ -569,7 +609,7 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
blogUserNickUpdateWrapper.eq("user_id", userId); blogUserNickUpdateWrapper.eq("user_id", userId);
blogUserNickUpdateWrapper.set("user_nick", userNick); blogUserNickUpdateWrapper.set("user_nick", userNick);
update(blogUserNickUpdateWrapper); update(blogUserNickUpdateWrapper);
} }
} }
@Override @Override
......
...@@ -12,17 +12,21 @@ import cn.meteor.beyondclouds.modules.post.form.PostForm; ...@@ -12,17 +12,21 @@ import cn.meteor.beyondclouds.modules.post.form.PostForm;
import cn.meteor.beyondclouds.modules.post.service.IPostService; import cn.meteor.beyondclouds.modules.post.service.IPostService;
import cn.meteor.beyondclouds.modules.post.vo.PostVO; import cn.meteor.beyondclouds.modules.post.vo.PostVO;
import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException; import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException;
import cn.meteor.beyondclouds.modules.user.service.IUserFollowService;
import cn.meteor.beyondclouds.util.PageUtils;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -35,9 +39,15 @@ import java.util.stream.Collectors; ...@@ -35,9 +39,15 @@ import java.util.stream.Collectors;
@RestController @RestController
public class PostApi { public class PostApi {
private IUserFollowService userFollowService;
private IPostService postService; private IPostService postService;
@Autowired @Autowired
public void setUserFollowService(IUserFollowService userFollowService) {
this.userFollowService = userFollowService;
}
@Autowired
public void setPostService(IPostService postService) { public void setPostService(IPostService postService) {
this.postService = postService; this.postService = postService;
} }
...@@ -107,12 +117,15 @@ public class PostApi { ...@@ -107,12 +117,15 @@ public class PostApi {
@Anonymous @Anonymous
@ApiOperation("动态列表") @ApiOperation("动态列表")
@GetMapping("/posts") @GetMapping("/posts")
public Response<?> getPostPage (@Valid PageForm pageForm, BindingResult bindingResult) { public Response<?> getPostPage (@Valid PageForm pageForm, BindingResult bindingResult, @CurrentSubject Subject subject) {
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {
return Response.fieldError(bindingResult.getFieldError()); return Response.fieldError(bindingResult.getFieldError());
} }
IPage<Post> postPage = postService.getPostPage(pageForm.getPage(),pageForm.getSize()); IPage<Post> postPage = postService.getPostPage(pageForm.getPage(),pageForm.getSize());
return Response.success(pictureList(postPage));
return Response.success(toPostVOPage(postPage, subject));
} }
/** /**
...@@ -128,7 +141,7 @@ public class PostApi { ...@@ -128,7 +141,7 @@ public class PostApi {
return Response.fieldError(bindingResult.getFieldError()); return Response.fieldError(bindingResult.getFieldError());
} }
IPage<Post> postPage = postService.getUserPostPage(pageForm.getPage(), pageForm.getSize(), (String) subject.getId()); IPage<Post> postPage = postService.getUserPostPage(pageForm.getPage(), pageForm.getSize(), (String) subject.getId());
return Response.success(pictureList(postPage)); return Response.success(toPostVOPage(postPage, subject));
} }
/** /**
...@@ -140,12 +153,12 @@ public class PostApi { ...@@ -140,12 +153,12 @@ public class PostApi {
@Anonymous @Anonymous
@ApiOperation("他人动态列表") @ApiOperation("他人动态列表")
@GetMapping("/user/{userId}/posts") @GetMapping("/user/{userId}/posts")
public Response<?> getOtherPosts (@PathVariable("userId") String userId , @Valid PageForm pageForm, BindingResult bindingResult) { public Response<?> getOtherPosts (@PathVariable("userId") String userId , @Valid PageForm pageForm, BindingResult bindingResult, @CurrentSubject Subject subject) {
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {
return Response.fieldError(bindingResult.getFieldError()); return Response.fieldError(bindingResult.getFieldError());
} }
IPage<Post> postPage = postService.getUserPostPage(pageForm.getPage(), pageForm.getSize(), userId); IPage<Post> postPage = postService.getUserPostPage(pageForm.getPage(), pageForm.getSize(), userId);
return Response.success(pictureList(postPage)); return Response.success(toPostVOPage(postPage, subject));
} }
...@@ -154,19 +167,40 @@ public class PostApi { ...@@ -154,19 +167,40 @@ public class PostApi {
* @param postPage * @param postPage
* @return * @return
*/ */
private PageVO<PostVO> pictureList(IPage<Post> postPage) { private PageVO<? extends PostVO> toPostVOPage(IPage<Post> postPage, Subject subject) {
List<PostVO> postVOList = postPage.getRecords().stream() List<PostVO> postVOList;
.map(post -> { if (null != subject && subject.isAuthenticated()) {
PostVO postVO = new PostVO(); String currentUserId = (String) subject.getId();
BeanUtils.copyProperties(post, postVO); Set<String> currentUserFollowedUserIds = userFollowService.getCurrentUserFollowedUserIds(currentUserId);
if (!StringUtils.isEmpty(post.getPictures())) { postVOList = postPage.getRecords().stream()
postVO.setPictures(post.getPictures().split(",")); .map(post -> {
} PostVO postVO = new PostVO();
return postVO; BeanUtils.copyProperties(post, postVO);
}).collect(Collectors.toList()); if (!StringUtils.isEmpty(post.getPictures())) {
postVO.setPictures(post.getPictures().split(","));
}
postVO.setFollowedAuthor(currentUserId.equals(post.getUserId()) ||
(!CollectionUtils.isEmpty(currentUserFollowedUserIds) &&
currentUserFollowedUserIds.contains(post.getUserId()))
);
return postVO;
}).collect(Collectors.toList());
} else {
postVOList = postPage.getRecords().stream()
.map(post -> {
PostVO postVO = new PostVO();
BeanUtils.copyProperties(post, postVO);
if (!StringUtils.isEmpty(post.getPictures())) {
postVO.setPictures(post.getPictures().split(","));
}
postVO.setFollowedAuthor(false);
return postVO;
}).collect(Collectors.toList());
}
PageVO<PostVO> postPageVO = new PageVO<>(); PageVO<PostVO> postPageVO = new PageVO<>();
PageUtils.copyMeta(postPage, postPageVO);
postPageVO.setDataList(postVOList); postPageVO.setDataList(postVOList);
postPageVO.setTotalPage(postPage.getPages());
return postPageVO; return postPageVO;
} }
} }
...@@ -32,5 +32,5 @@ public class PostVO { ...@@ -32,5 +32,5 @@ public class PostVO {
private Date updateTime; private Date updateTime;
private Boolean followedAuthor;
} }
...@@ -129,11 +129,11 @@ public class ProjectApi { ...@@ -129,11 +129,11 @@ public class ProjectApi {
@Anonymous @Anonymous
@ApiOperation("项目详情") @ApiOperation("项目详情")
@GetMapping("/project/{projectId}") @GetMapping("/project/{projectId}")
public Response<ProjectDetailDTO> getProject(@PathVariable("projectId") String projectId) { public Response<ProjectDetailDTO> getProject(@PathVariable("projectId") String projectId, @CurrentSubject Subject subject) {
try { try {
// 获取项目详情并返回 // 获取项目详情并返回
ProjectDetailDTO projectDetail = projectService.getProject(projectId); ProjectDetailDTO projectDetail = projectService.getProjectDetail(projectId, subject);
return Response.success(projectDetail); return Response.success(projectDetail);
} catch (ProjectServiceException e) { } catch (ProjectServiceException e) {
e.printStackTrace(); e.printStackTrace();
......
...@@ -11,6 +11,11 @@ import lombok.Data; ...@@ -11,6 +11,11 @@ import lombok.Data;
public class ProjectDetailDTO extends Project { public class ProjectDetailDTO extends Project {
/** /**
* 当前用户是否关注作者
*/
private Boolean followedAuthor;
/**
* 项目详情 * 项目详情
*/ */
private String projectDetail; private String projectDetail;
......
package cn.meteor.beyondclouds.modules.project.service; package cn.meteor.beyondclouds.modules.project.service;
import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.project.dto.ProjectDetailDTO; import cn.meteor.beyondclouds.modules.project.dto.ProjectDetailDTO;
import cn.meteor.beyondclouds.modules.project.entity.Project; import cn.meteor.beyondclouds.modules.project.entity.Project;
import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException; import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException;
...@@ -33,9 +34,10 @@ public interface IProjectService extends IService<Project> { ...@@ -33,9 +34,10 @@ public interface IProjectService extends IService<Project> {
/** /**
* 获取项目 * 获取项目
* @param projectId * @param projectId
* @param subject
* @return * @return
*/ */
ProjectDetailDTO getProject(String projectId) throws ProjectServiceException; ProjectDetailDTO getProjectDetail(String projectId, Subject subject) throws ProjectServiceException;
/** /**
* 获取项目列表 * 获取项目列表
......
package cn.meteor.beyondclouds.modules.project.service.impl; package cn.meteor.beyondclouds.modules.project.service.impl;
import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.project.dto.ProjectDetailDTO; import cn.meteor.beyondclouds.modules.project.dto.ProjectDetailDTO;
import cn.meteor.beyondclouds.modules.project.entity.Project; import cn.meteor.beyondclouds.modules.project.entity.Project;
import cn.meteor.beyondclouds.modules.project.entity.ProjectCategory; import cn.meteor.beyondclouds.modules.project.entity.ProjectCategory;
...@@ -16,6 +17,7 @@ import cn.meteor.beyondclouds.core.queue.message.DataItemChangeMessage; ...@@ -16,6 +17,7 @@ import cn.meteor.beyondclouds.core.queue.message.DataItemChangeMessage;
import cn.meteor.beyondclouds.modules.queue.service.IMessageQueueService; import cn.meteor.beyondclouds.modules.queue.service.IMessageQueueService;
import cn.meteor.beyondclouds.modules.search.enums.DataItemType; import cn.meteor.beyondclouds.modules.search.enums.DataItemType;
import cn.meteor.beyondclouds.modules.user.entity.User; import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.service.IUserFollowService;
import cn.meteor.beyondclouds.modules.user.service.IUserService; import cn.meteor.beyondclouds.modules.user.service.IUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
...@@ -27,8 +29,11 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -27,8 +29,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Set;
/** /**
* <p> * <p>
* 项目表 服务实现类 * 项目表 服务实现类
...@@ -51,6 +56,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl ...@@ -51,6 +56,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
private IMessageQueueService messageQueueService; private IMessageQueueService messageQueueService;
private IUserFollowService userFollowService;
@Autowired @Autowired
public ProjectServiceImpl(IProjectExtService projectExtService, ProjectCategoryMapper projectCategoryMapper) { public ProjectServiceImpl(IProjectExtService projectExtService, ProjectCategoryMapper projectCategoryMapper) {
this.projectExtService = projectExtService; this.projectExtService = projectExtService;
...@@ -58,6 +65,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl ...@@ -58,6 +65,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
} }
@Autowired @Autowired
public void setUserFollowService(IUserFollowService userFollowService) {
this.userFollowService = userFollowService;
}
@Autowired
public void setMessageQueueService(IMessageQueueService messageQueueService) { public void setMessageQueueService(IMessageQueueService messageQueueService) {
this.messageQueueService = messageQueueService; this.messageQueueService = messageQueueService;
} }
...@@ -145,7 +157,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl ...@@ -145,7 +157,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
} }
@Override @Override
public ProjectDetailDTO getProject(String projectId) throws ProjectServiceException { public ProjectDetailDTO getProjectDetail(String projectId, Subject subject) throws ProjectServiceException {
Assert.notNull(projectId, "projectId must not be null"); Assert.notNull(projectId, "projectId must not be null");
// 1.获取项目 // 1.获取项目
...@@ -167,6 +179,25 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl ...@@ -167,6 +179,25 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
ProjectDetailDTO projectDetail = new ProjectDetailDTO(); ProjectDetailDTO projectDetail = new ProjectDetailDTO();
BeanUtils.copyProperties(project, projectDetail); BeanUtils.copyProperties(project, projectDetail);
projectDetail.setProjectDetail(projectExt.getProjectDetail()); projectDetail.setProjectDetail(projectExt.getProjectDetail());
// 查看当前用户有没有关注作者
projectDetail.setFollowedAuthor(false);
Set<String> currentUserFollowedUserIds;
if (subject.isAuthenticated()) {
String currentUserId = (String) subject.getId();
String authorId = project.getUserId();
currentUserFollowedUserIds = userFollowService.getCurrentUserFollowedUserIds(currentUserId);
if (!CollectionUtils.isEmpty(currentUserFollowedUserIds)
&& currentUserFollowedUserIds.contains(authorId)) {
projectDetail.setFollowedAuthor(true);
} else if (currentUserId.equals(authorId)) {
projectDetail.setFollowedAuthor(true);
} else {
projectDetail.setFollowedAuthor(false);
}
}
return projectDetail; return projectDetail;
} }
......
...@@ -140,10 +140,10 @@ public class QuestionApi { ...@@ -140,10 +140,10 @@ public class QuestionApi {
@Anonymous @Anonymous
@ApiOperation("问题详情") @ApiOperation("问题详情")
@GetMapping("/question/{questionId}") @GetMapping("/question/{questionId}")
public Response<QuestionDetailDTO> questionDetails(@PathVariable("questionId") String questionId) { public Response<QuestionDetailDTO> questionDetails(@PathVariable("questionId") String questionId, @CurrentSubject Subject subject) {
QuestionDetailDTO questionDetail = null; QuestionDetailDTO questionDetail = null;
try { try {
questionDetail = questionService.questionDetails(questionId); questionDetail = questionService.getQuestionDetail(questionId, subject);
return Response.success(questionDetail); return Response.success(questionDetail);
} catch (QuestionServiceException | QuestionTagServiceException e) { } catch (QuestionServiceException | QuestionTagServiceException e) {
e.printStackTrace(); e.printStackTrace();
......
...@@ -13,6 +13,11 @@ import lombok.Data; ...@@ -13,6 +13,11 @@ import lombok.Data;
@Data @Data
public class QuestionDetailDTO extends Question { public class QuestionDetailDTO extends Question {
/**
* 当前用户是否关注作者
*/
private Boolean followedAuthor;
@ApiModelProperty("详情") @ApiModelProperty("详情")
private String questionDetail; private String questionDetail;
} }
package cn.meteor.beyondclouds.modules.question.service; package cn.meteor.beyondclouds.modules.question.service;
import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.question.dto.QuestionDetailDTO; import cn.meteor.beyondclouds.modules.question.dto.QuestionDetailDTO;
import cn.meteor.beyondclouds.modules.question.entity.Question; import cn.meteor.beyondclouds.modules.question.entity.Question;
import cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException; import cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException;
...@@ -52,11 +53,12 @@ public interface IQuestionService extends IService<Question> { ...@@ -52,11 +53,12 @@ public interface IQuestionService extends IService<Question> {
/** /**
* 问题详情 * 问题详情
* @param questionId 问题ID * @param questionId 问题ID
* @param subject
* @return 问题详情 * @return 问题详情
* @throws QuestionServiceException 问题业务异常 * @throws QuestionServiceException 问题业务异常
* @throws QuestionTagServiceException 问题标签业务异常 * @throws QuestionTagServiceException 问题标签业务异常
*/ */
QuestionDetailDTO questionDetails(String questionId) throws QuestionServiceException, QuestionTagServiceException; QuestionDetailDTO getQuestionDetail(String questionId, Subject subject) throws QuestionServiceException, QuestionTagServiceException;
/** /**
* 获取问答列表 * 获取问答列表
......
package cn.meteor.beyondclouds.modules.question.service.impl; package cn.meteor.beyondclouds.modules.question.service.impl;
import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.question.dto.QuestionDetailDTO; import cn.meteor.beyondclouds.modules.question.dto.QuestionDetailDTO;
import cn.meteor.beyondclouds.modules.question.entity.*; import cn.meteor.beyondclouds.modules.question.entity.*;
import cn.meteor.beyondclouds.modules.question.enums.QuestionErrorCode; import cn.meteor.beyondclouds.modules.question.enums.QuestionErrorCode;
...@@ -20,6 +21,7 @@ import cn.meteor.beyondclouds.modules.topic.enums.TopicReferenceType; ...@@ -20,6 +21,7 @@ import cn.meteor.beyondclouds.modules.topic.enums.TopicReferenceType;
import cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService; import cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService;
import cn.meteor.beyondclouds.modules.topic.service.ITopicService; import cn.meteor.beyondclouds.modules.topic.service.ITopicService;
import cn.meteor.beyondclouds.modules.user.entity.User; import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.service.IUserFollowService;
import cn.meteor.beyondclouds.modules.user.service.IUserService; import cn.meteor.beyondclouds.modules.user.service.IUserService;
import cn.meteor.beyondclouds.util.AbstractUtils; import cn.meteor.beyondclouds.util.AbstractUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
...@@ -36,6 +38,7 @@ import org.springframework.util.StringUtils; ...@@ -36,6 +38,7 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -75,6 +78,8 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i ...@@ -75,6 +78,8 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
private IMessageQueueService messageQueueService; private IMessageQueueService messageQueueService;
private IUserFollowService userFollowService;
@Autowired @Autowired
public QuestionServiceImpl(IQuestionExtService questionExtService, IQuestionCategoryService questionCategoryService, ITopicReferenceService topicReferenceService, QuestionMapper questionMapper) { public QuestionServiceImpl(IQuestionExtService questionExtService, IQuestionCategoryService questionCategoryService, ITopicReferenceService topicReferenceService, QuestionMapper questionMapper) {
this.questionExtService = questionExtService; this.questionExtService = questionExtService;
...@@ -84,6 +89,11 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i ...@@ -84,6 +89,11 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
} }
@Autowired @Autowired
public void setUserFollowService(IUserFollowService userFollowService) {
this.userFollowService = userFollowService;
}
@Autowired
public void setMessageQueueService(IMessageQueueService messageQueueService) { public void setMessageQueueService(IMessageQueueService messageQueueService) {
this.messageQueueService = messageQueueService; this.messageQueueService = messageQueueService;
} }
...@@ -252,7 +262,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i ...@@ -252,7 +262,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
} }
@Override @Override
public QuestionDetailDTO questionDetails(String questionId) throws QuestionServiceException, QuestionTagServiceException { public QuestionDetailDTO getQuestionDetail(String questionId, Subject subject) throws QuestionServiceException, QuestionTagServiceException {
//1.获取问题基本信息 //1.获取问题基本信息
Question question = getById(questionId); Question question = getById(questionId);
...@@ -299,6 +309,25 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i ...@@ -299,6 +309,25 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
QuestionDetailDTO questionDetail = new QuestionDetailDTO(); QuestionDetailDTO questionDetail = new QuestionDetailDTO();
BeanUtils.copyProperties(question, questionDetail); BeanUtils.copyProperties(question, questionDetail);
questionDetail.setQuestionDetail(questionExt.getQuestionDetail()); questionDetail.setQuestionDetail(questionExt.getQuestionDetail());
// 查看当前用户有没有关注作者
questionDetail.setFollowedAuthor(false);
Set<String> currentUserFollowedUserIds;
if (subject.isAuthenticated()) {
String currentUserId = (String) subject.getId();
String authorId = questionDetail.getUserId();
currentUserFollowedUserIds = userFollowService.getCurrentUserFollowedUserIds(currentUserId);
if (!CollectionUtils.isEmpty(currentUserFollowedUserIds)
&& currentUserFollowedUserIds.contains(authorId)) {
questionDetail.setFollowedAuthor(true);
} else if (currentUserId.equals(authorId)) {
questionDetail.setFollowedAuthor(true);
} else {
questionDetail.setFollowedAuthor(false);
}
}
return questionDetail; return questionDetail;
} }
......
...@@ -202,7 +202,7 @@ public class SearchServiceImpl implements ISearchService { ...@@ -202,7 +202,7 @@ public class SearchServiceImpl implements ISearchService {
} }
private SearchItem buildSearchItemFromProject(String projectId) throws ProjectServiceException { private SearchItem buildSearchItemFromProject(String projectId) throws ProjectServiceException {
ProjectDetailDTO projectDetail = projectService.getProject(projectId); ProjectDetailDTO projectDetail = projectService.getProjectDetail(projectId, Subject.anonymous(this.getClass().getName()));
if (null != projectDetail) { if (null != projectDetail) {
SearchItem searchItem = new SearchItem(DataItemType.PROJECT, projectId); SearchItem searchItem = new SearchItem(DataItemType.PROJECT, projectId);
searchItem.setTitle(projectDetail.getProjectName()); searchItem.setTitle(projectDetail.getProjectName());
...@@ -231,7 +231,7 @@ public class SearchServiceImpl implements ISearchService { ...@@ -231,7 +231,7 @@ public class SearchServiceImpl implements ISearchService {
} }
private SearchItem buildSearchItemFromQuestion(String questionId) throws QuestionServiceException, QuestionTagServiceException { private SearchItem buildSearchItemFromQuestion(String questionId) throws QuestionServiceException, QuestionTagServiceException {
QuestionDetailDTO questionDetail = questionService.questionDetails(questionId); QuestionDetailDTO questionDetail = questionService.getQuestionDetail(questionId, Subject.anonymous(this.getClass().getName()));
if (null != questionDetail) { if (null != questionDetail) {
SearchItem searchItem = new SearchItem(DataItemType.QUESTION, questionId); SearchItem searchItem = new SearchItem(DataItemType.QUESTION, questionId);
searchItem.setTitle(questionDetail.getQuestionTitle()); searchItem.setTitle(questionDetail.getQuestionTitle());
......
...@@ -5,6 +5,9 @@ import cn.meteor.beyondclouds.modules.user.exception.UserServiceException; ...@@ -5,6 +5,9 @@ import cn.meteor.beyondclouds.modules.user.exception.UserServiceException;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.io.Serializable;
import java.util.Set;
/** /**
* @author 段启岩 * @author 段启岩
...@@ -48,4 +51,11 @@ public interface IUserFollowService extends IService<UserFollow> { ...@@ -48,4 +51,11 @@ public interface IUserFollowService extends IService<UserFollow> {
*/ */
IPage<UserFollow> getFollowersPage(Integer pageNumber, Integer pageSize, String userId); IPage<UserFollow> getFollowersPage(Integer pageNumber, Integer pageSize, String userId);
/**
* 获取当前用户关注的所有用户的ID
* @param userId
* @return
*/
Set<String> getCurrentUserFollowedUserIds(String userId);
} }
package cn.meteor.beyondclouds.modules.user.service.impl; package cn.meteor.beyondclouds.modules.user.service.impl;
import cn.meteor.beyondclouds.common.helper.IRedisHelper;
import cn.meteor.beyondclouds.core.redis.RedisKey;
import cn.meteor.beyondclouds.modules.user.entity.User; import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.entity.UserBlacklist; import cn.meteor.beyondclouds.modules.user.entity.UserBlacklist;
import cn.meteor.beyondclouds.modules.user.entity.UserFollow; import cn.meteor.beyondclouds.modules.user.entity.UserFollow;
...@@ -16,6 +18,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; ...@@ -16,6 +18,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.Set;
/** /**
* @author 段启岩 * @author 段启岩
...@@ -26,6 +31,12 @@ public class UserFollowServiceImpl extends ServiceImpl<IUserFollowMapper, UserFo ...@@ -26,6 +31,12 @@ public class UserFollowServiceImpl extends ServiceImpl<IUserFollowMapper, UserFo
private IUserService userService; private IUserService userService;
private IUserBlacklistService userBlacklistService; private IUserBlacklistService userBlacklistService;
private IRedisHelper redisHelper;
@Autowired
public void setRedisHelper(IRedisHelper redisHelper) {
this.redisHelper = redisHelper;
}
@Autowired @Autowired
public UserFollowServiceImpl(IUserBlacklistService userBlacklistService) { public UserFollowServiceImpl(IUserBlacklistService userBlacklistService) {
...@@ -163,6 +174,11 @@ public class UserFollowServiceImpl extends ServiceImpl<IUserFollowMapper, UserFo ...@@ -163,6 +174,11 @@ public class UserFollowServiceImpl extends ServiceImpl<IUserFollowMapper, UserFo
userFollowQueryWrapper.eq("follow_status", 0); userFollowQueryWrapper.eq("follow_status", 0);
return page(page, userFollowQueryWrapper); return page(page, userFollowQueryWrapper);
} }
@Override
public Set<String> getCurrentUserFollowedUserIds(String userId) {
return redisHelper.setGet(RedisKey.USER_FOLLOWED(userId));
}
} }
package cn.meteor.beyondclouds.util; package cn.meteor.beyondclouds.util;
import cn.meteor.beyondclouds.modules.blog.entity.Blog; import cn.meteor.beyondclouds.common.vo.PageVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -18,4 +18,10 @@ public class PageUtils { ...@@ -18,4 +18,10 @@ public class PageUtils {
page.setRecords(List.of()); page.setRecords(List.of());
return page; return page;
} }
public static void copyMeta(IPage<?> src, PageVO<?> dest) {
dest.setTotalPage(src.getPages());
dest.setPageSize(src.getSize());
dest.setTotalRecords(src.getTotal());
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment