Commit 64be074a by 段启岩

话题列表添加是否关注

parent 17a9e657
......@@ -7,7 +7,7 @@ import cn.meteor.beyondclouds.core.annotation.CurrentSubject;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.post.entity.Post;
import cn.meteor.beyondclouds.modules.topic.bean.TopicDetail;
import cn.meteor.beyondclouds.modules.topic.bean.TopicDTO;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.enums.TopicAccessWay;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
......@@ -45,7 +45,7 @@ public class TopicApi {
public Response createTopic(@RequestBody @Valid CreateTopicForm createTopicForm, @CurrentSubject Subject subject) {
try {
TopicDetail topic = topicService.createTopic(String.valueOf(subject.getId()), createTopicForm.getTopicName());
TopicDTO topic = topicService.createTopic(String.valueOf(subject.getId()), createTopicForm.getTopicName());
return Response.success(topic);
} catch (TopicServiceException e) {
e.printStackTrace();
......@@ -64,9 +64,8 @@ public class TopicApi {
int pageNo = pageForm.getPage();
int pageSize = pageForm.getSize();
IPage<Topic> topicPage = topicService.getTopicPage(pageNo, pageSize);
PageDTO<Topic> topicPageDTO = new PageDTO<>(topicPage);
return Response.success(topicPageDTO);
PageDTO<TopicDTO> topicPage = topicService.getTopicPage(pageNo, pageSize);
return Response.success(topicPage);
}
@Anonymous
......@@ -78,8 +77,8 @@ public class TopicApi {
return Response.fieldError(bindingResult.getFieldError());
}
IPage<Topic> topicPage = topicService.searchTopics(keywords, pageForm.getPage(), pageForm.getSize());
return Response.success(new PageDTO<>(topicPage));
PageDTO<TopicDTO> topicPage = topicService.searchTopics(keywords, pageForm.getPage(), pageForm.getSize());
return Response.success(topicPage);
}
@Anonymous
......@@ -95,7 +94,7 @@ public class TopicApi {
}
try {
Topic topic = topicService.getTopic(identification, topicAccessWay);
TopicDTO topic = topicService.getTopic(identification, topicAccessWay);
return Response.success(topic);
} catch (TopicServiceException e) {
e.printStackTrace();
......@@ -175,11 +174,10 @@ public class TopicApi {
@Anonymous
@ApiOperation("热门话题")
@GetMapping("/topic/hots")
public Response<PageDTO<Topic>> getHotTags(@Valid PageForm pageForm) {
public Response<PageDTO<TopicDTO>> getHotTags(@Valid PageForm pageForm) {
IPage<Topic> topic = topicService.getHotPage(pageForm.getPage(), pageForm.getSize());
PageDTO<Topic> topicPageDTO = new PageDTO<>(topic);
return Response.success(topicPageDTO);
PageDTO<TopicDTO> topicPage = topicService.getHotPage(pageForm.getPage(), pageForm.getSize());
return Response.success(topicPage);
}
@Anonymous
......
......@@ -7,9 +7,11 @@ import lombok.Data;
* @since 2020/2/8
*/
@Data
public class TopicDetail {
public class TopicDTO {
private String topicId;
private String topicName;
private Boolean followedTopic;
}
package cn.meteor.beyondclouds.modules.topic.service;
import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.topic.entity.TopicFollow;
import cn.meteor.beyondclouds.util.SubjectUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.util.Assert;
import java.util.Set;
/**
* <p>
......@@ -13,4 +19,18 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ITopicFollowService extends IService<TopicFollow> {
/**
* 判断我是否关注过某个话题
* @param topicId
* @return
*/
public boolean hasFollowedTopic(String topicId);
/**
* 获取我关注的所有话题的ID
* @return
*/
Set<String> getFollowedTopicIds();
}
package cn.meteor.beyondclouds.modules.topic.service;
import cn.meteor.beyondclouds.common.dto.PageDTO;
import cn.meteor.beyondclouds.modules.post.entity.Post;
import cn.meteor.beyondclouds.modules.topic.bean.TopicDetail;
import cn.meteor.beyondclouds.modules.topic.bean.TopicDTO;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.enums.TopicAccessWay;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
......@@ -28,7 +29,7 @@ public interface ITopicService extends IService<Topic> {
* @param topicName
* @return TopicDetail
*/
TopicDetail createTopic(String userId, String topicName) throws TopicServiceException;
TopicDTO createTopic(String userId, String topicName) throws TopicServiceException;
/**
* 检索话题
......@@ -36,7 +37,7 @@ public interface ITopicService extends IService<Topic> {
* @param pageNumber
* @param pageSize
*/
IPage<Topic> searchTopics(String keywords, Integer pageNumber, Integer pageSize);
PageDTO<TopicDTO> searchTopics(String keywords, Integer pageNumber, Integer pageSize);
/**
* 关注话题
......@@ -52,7 +53,7 @@ public interface ITopicService extends IService<Topic> {
* @return
* @throws TopicServiceException
*/
Topic getTopic(String identification, TopicAccessWay topicAccessWay) throws TopicServiceException;
TopicDTO getTopic(String identification, TopicAccessWay topicAccessWay) throws TopicServiceException;
/**
* 我关注的话题
......@@ -88,7 +89,7 @@ public interface ITopicService extends IService<Topic> {
* @param pageSize
* @return
*/
IPage<Topic> getTopicPage(Integer pageNumber, Integer pageSize);
PageDTO<TopicDTO> getTopicPage(Integer pageNumber, Integer pageSize);
/**
* 增加话题引用次数
......@@ -132,7 +133,7 @@ public interface ITopicService extends IService<Topic> {
* @param pageSize
* @return
*/
IPage<Topic> getHotPage(Integer pageNumber, Integer pageSize);
PageDTO<TopicDTO> getHotPage(Integer pageNumber, Integer pageSize);
/**
*该话题下所有的动态
......
package cn.meteor.beyondclouds.modules.topic.service.impl;
import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.topic.entity.TopicFollow;
import cn.meteor.beyondclouds.modules.topic.mapper.TopicFollowMapper;
import cn.meteor.beyondclouds.modules.topic.service.ITopicFollowService;
import cn.meteor.beyondclouds.util.SubjectUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* <p>
......@@ -17,4 +25,27 @@ import org.springframework.stereotype.Service;
@Service
public class TopicFollowServiceImpl extends ServiceImpl<TopicFollowMapper, TopicFollow> implements ITopicFollowService {
@Override
public boolean hasFollowedTopic(String topicId) {
Assert.isTrue(SubjectUtils.isAuthenticated(), "user must authenticated");
Subject subject = SubjectUtils.getSubject();
String currentUserId = (String) subject.getId();
QueryWrapper<TopicFollow> topicFollowQueryWrapper = new QueryWrapper<>();
topicFollowQueryWrapper.eq("user_id", currentUserId);
topicFollowQueryWrapper.eq("topic_id", topicId);
return count(topicFollowQueryWrapper) > 0;
}
@Override
public Set<String> getFollowedTopicIds() {
Assert.isTrue(SubjectUtils.isAuthenticated(), "user must authenticated");
Subject subject = SubjectUtils.getSubject();
String currentUserId = (String) subject.getId();
QueryWrapper<TopicFollow> topicFollowQueryWrapper = new QueryWrapper<>();
topicFollowQueryWrapper.eq("user_id", currentUserId);
List<TopicFollow> topicFollows = list(topicFollowQueryWrapper);
return topicFollows.stream()
.map(TopicFollow::getTopicId)
.collect(Collectors.toSet());
}
}
package cn.meteor.beyondclouds.modules.topic.service.impl;
import cn.meteor.beyondclouds.common.dto.PageDTO;
import cn.meteor.beyondclouds.modules.post.entity.Post;
import cn.meteor.beyondclouds.modules.post.service.IPostService;
import cn.meteor.beyondclouds.modules.topic.bean.TopicDetail;
import cn.meteor.beyondclouds.modules.topic.bean.TopicDTO;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.entity.TopicFollow;
import cn.meteor.beyondclouds.modules.topic.entity.TopicReference;
......@@ -15,6 +16,8 @@ import cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService;
import cn.meteor.beyondclouds.modules.topic.service.ITopicService;
import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.service.IUserService;
import cn.meteor.beyondclouds.util.PageUtils;
import cn.meteor.beyondclouds.util.SubjectUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
......@@ -25,8 +28,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
......@@ -68,7 +73,7 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
}
@Override
public TopicDetail createTopic(String userId, String topicName) throws TopicServiceException{
public TopicDTO createTopic(String userId, String topicName) throws TopicServiceException{
//1. 检测是否存在该话题
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
......@@ -84,23 +89,52 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
save(topic);
//3. 返回话题的id与话题名称
TopicDetail topicDetail=new TopicDetail();
BeanUtils.copyProperties(topic, topicDetail);
return topicDetail;
TopicDTO topicDTO =new TopicDTO();
BeanUtils.copyProperties(topic, topicDTO);
return topicDTO;
}
@Override
public IPage<Topic> searchTopics(String keywords, Integer pageNumber, Integer pageSize) {
public PageDTO<TopicDTO> searchTopics(String keywords, Integer pageNumber, Integer pageSize) {
IPage<Topic> page = new Page<>(pageNumber, pageSize);
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
topicQueryWrapper.like("topic_name", keywords);
return page(page, topicQueryWrapper);
IPage<Topic> topicPage = page(page, topicQueryWrapper);
return toPageDTO(topicPage);
}
/**
* 将IPage<Topic>转换成PageDTO<TopicDTO>
* @param topicPage
* @return
*/
private PageDTO<TopicDTO> toPageDTO(IPage<Topic> topicPage) {
List<Topic> topicList = topicPage.getRecords();
Set<String> followedTopicIds = topicFollowService.getFollowedTopicIds();
List<TopicDTO> topicDTOList = new ArrayList<>();
topicList.forEach(topic -> {
TopicDTO topicDTO = new TopicDTO();
BeanUtils.copyProperties(topic, topicDTO);
if (SubjectUtils.isAuthenticated()) {
topicDTO.setFollowedTopic(followedTopicIds.contains(topic.getTopicId()));
} else {
topicDTO.setFollowedTopic(false);
}
topicDTOList.add(topicDTO);
});
PageDTO<TopicDTO> pageDTO = new PageDTO<>();
PageUtils.copyMeta(topicPage, pageDTO);
pageDTO.setDataList(topicDTOList);
return pageDTO;
}
@Override
public Topic getTopic(String identification, TopicAccessWay topicAccessWay) throws TopicServiceException {
public TopicDTO getTopic(String identification, TopicAccessWay topicAccessWay) throws TopicServiceException {
//1. 判断by为话题id,还是话题名称
Topic topic;
......@@ -115,7 +149,23 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
throw new TopicServiceException(TopicErrorCode.TOPIC_NOT_EXISTS);
}
return topic;
return toTopicDTO(topic);
}
/**
* 将topic转换为topicDTO
* @param topic
* @return
*/
private TopicDTO toTopicDTO(Topic topic) {
TopicDTO topicDTO = new TopicDTO();
BeanUtils.copyProperties(topic, topicDTO);
if (SubjectUtils.isAuthenticated()) {
topicDTO.setFollowedTopic(topicFollowService.hasFollowedTopic(topic.getTopicId()));
} else {
topicDTO.setFollowedTopic(false);
}
return topicDTO;
}
......@@ -237,11 +287,11 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
}
@Override
public IPage<Topic> getTopicPage(Integer pageNumber, Integer pageSize) {
public PageDTO<TopicDTO> getTopicPage(Integer pageNumber, Integer pageSize) {
IPage<Topic> page = new Page<>(pageNumber, pageSize);
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
topicQueryWrapper.orderByDesc("create_time");
return page(page, topicQueryWrapper);
return toPageDTO(page(page, topicQueryWrapper));
}
@Override
......@@ -308,12 +358,12 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
* @return
*/
@Override
public IPage<Topic> getHotPage(Integer pageNumber, Integer pageSize) {
public PageDTO<TopicDTO> getHotPage(Integer pageNumber, Integer pageSize) {
IPage<Topic> page = new Page<>(pageNumber, pageSize);
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
topicQueryWrapper.orderByDesc("reference_count");
return page(page, topicQueryWrapper);
return toPageDTO(page(page, topicQueryWrapper));
}
......@@ -387,4 +437,6 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
return topics;
}
}
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