Commit 64be074a by 段启岩

话题列表添加是否关注

parent 17a9e657
...@@ -7,7 +7,7 @@ import cn.meteor.beyondclouds.core.annotation.CurrentSubject; ...@@ -7,7 +7,7 @@ import cn.meteor.beyondclouds.core.annotation.CurrentSubject;
import cn.meteor.beyondclouds.core.api.Response; import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.authentication.Subject; import cn.meteor.beyondclouds.core.authentication.Subject;
import cn.meteor.beyondclouds.modules.post.entity.Post; 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.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.enums.TopicAccessWay; import cn.meteor.beyondclouds.modules.topic.enums.TopicAccessWay;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException; import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
...@@ -45,7 +45,7 @@ public class TopicApi { ...@@ -45,7 +45,7 @@ public class TopicApi {
public Response createTopic(@RequestBody @Valid CreateTopicForm createTopicForm, @CurrentSubject Subject subject) { public Response createTopic(@RequestBody @Valid CreateTopicForm createTopicForm, @CurrentSubject Subject subject) {
try { 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); return Response.success(topic);
} catch (TopicServiceException e) { } catch (TopicServiceException e) {
e.printStackTrace(); e.printStackTrace();
...@@ -64,9 +64,8 @@ public class TopicApi { ...@@ -64,9 +64,8 @@ public class TopicApi {
int pageNo = pageForm.getPage(); int pageNo = pageForm.getPage();
int pageSize = pageForm.getSize(); int pageSize = pageForm.getSize();
IPage<Topic> topicPage = topicService.getTopicPage(pageNo, pageSize); PageDTO<TopicDTO> topicPage = topicService.getTopicPage(pageNo, pageSize);
PageDTO<Topic> topicPageDTO = new PageDTO<>(topicPage); return Response.success(topicPage);
return Response.success(topicPageDTO);
} }
@Anonymous @Anonymous
...@@ -78,8 +77,8 @@ public class TopicApi { ...@@ -78,8 +77,8 @@ public class TopicApi {
return Response.fieldError(bindingResult.getFieldError()); return Response.fieldError(bindingResult.getFieldError());
} }
IPage<Topic> topicPage = topicService.searchTopics(keywords, pageForm.getPage(), pageForm.getSize()); PageDTO<TopicDTO> topicPage = topicService.searchTopics(keywords, pageForm.getPage(), pageForm.getSize());
return Response.success(new PageDTO<>(topicPage)); return Response.success(topicPage);
} }
@Anonymous @Anonymous
...@@ -95,7 +94,7 @@ public class TopicApi { ...@@ -95,7 +94,7 @@ public class TopicApi {
} }
try { try {
Topic topic = topicService.getTopic(identification, topicAccessWay); TopicDTO topic = topicService.getTopic(identification, topicAccessWay);
return Response.success(topic); return Response.success(topic);
} catch (TopicServiceException e) { } catch (TopicServiceException e) {
e.printStackTrace(); e.printStackTrace();
...@@ -175,11 +174,10 @@ public class TopicApi { ...@@ -175,11 +174,10 @@ public class TopicApi {
@Anonymous @Anonymous
@ApiOperation("热门话题") @ApiOperation("热门话题")
@GetMapping("/topic/hots") @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<TopicDTO> topicPage = topicService.getHotPage(pageForm.getPage(), pageForm.getSize());
PageDTO<Topic> topicPageDTO = new PageDTO<>(topic); return Response.success(topicPage);
return Response.success(topicPageDTO);
} }
@Anonymous @Anonymous
......
...@@ -7,9 +7,11 @@ import lombok.Data; ...@@ -7,9 +7,11 @@ import lombok.Data;
* @since 2020/2/8 * @since 2020/2/8
*/ */
@Data @Data
public class TopicDetail { public class TopicDTO {
private String topicId; private String topicId;
private String topicName; private String topicName;
private Boolean followedTopic;
} }
package cn.meteor.beyondclouds.modules.topic.service; 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.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 com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.util.Assert;
import java.util.Set;
/** /**
* <p> * <p>
...@@ -13,4 +19,18 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +19,18 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface ITopicFollowService extends IService<TopicFollow> { 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; 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.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.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.enums.TopicAccessWay; import cn.meteor.beyondclouds.modules.topic.enums.TopicAccessWay;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException; import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
...@@ -28,7 +29,7 @@ public interface ITopicService extends IService<Topic> { ...@@ -28,7 +29,7 @@ public interface ITopicService extends IService<Topic> {
* @param topicName * @param topicName
* @return TopicDetail * @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> { ...@@ -36,7 +37,7 @@ public interface ITopicService extends IService<Topic> {
* @param pageNumber * @param pageNumber
* @param pageSize * @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> { ...@@ -52,7 +53,7 @@ public interface ITopicService extends IService<Topic> {
* @return * @return
* @throws TopicServiceException * @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> { ...@@ -88,7 +89,7 @@ public interface ITopicService extends IService<Topic> {
* @param pageSize * @param pageSize
* @return * @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> { ...@@ -132,7 +133,7 @@ public interface ITopicService extends IService<Topic> {
* @param pageSize * @param pageSize
* @return * @return
*/ */
IPage<Topic> getHotPage(Integer pageNumber, Integer pageSize); PageDTO<TopicDTO> getHotPage(Integer pageNumber, Integer pageSize);
/** /**
*该话题下所有的动态 *该话题下所有的动态
......
package cn.meteor.beyondclouds.modules.topic.service.impl; 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.entity.TopicFollow;
import cn.meteor.beyondclouds.modules.topic.mapper.TopicFollowMapper; import cn.meteor.beyondclouds.modules.topic.mapper.TopicFollowMapper;
import cn.meteor.beyondclouds.modules.topic.service.ITopicFollowService; 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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
...@@ -17,4 +25,27 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +25,27 @@ import org.springframework.stereotype.Service;
@Service @Service
public class TopicFollowServiceImpl extends ServiceImpl<TopicFollowMapper, TopicFollow> implements ITopicFollowService { 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; 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.entity.Post;
import cn.meteor.beyondclouds.modules.post.service.IPostService; 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.Topic;
import cn.meteor.beyondclouds.modules.topic.entity.TopicFollow; import cn.meteor.beyondclouds.modules.topic.entity.TopicFollow;
import cn.meteor.beyondclouds.modules.topic.entity.TopicReference; import cn.meteor.beyondclouds.modules.topic.entity.TopicReference;
...@@ -15,6 +16,8 @@ import cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService; ...@@ -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.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.IUserService; 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.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
...@@ -25,8 +28,10 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -25,8 +28,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -68,7 +73,7 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements ...@@ -68,7 +73,7 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
} }
@Override @Override
public TopicDetail createTopic(String userId, String topicName) throws TopicServiceException{ public TopicDTO createTopic(String userId, String topicName) throws TopicServiceException{
//1. 检测是否存在该话题 //1. 检测是否存在该话题
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>(); QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
...@@ -84,23 +89,52 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements ...@@ -84,23 +89,52 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
save(topic); save(topic);
//3. 返回话题的id与话题名称 //3. 返回话题的id与话题名称
TopicDetail topicDetail=new TopicDetail(); TopicDTO topicDTO =new TopicDTO();
BeanUtils.copyProperties(topic, topicDetail); BeanUtils.copyProperties(topic, topicDTO);
return topicDetail; return topicDTO;
} }
@Override @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); IPage<Topic> page = new Page<>(pageNumber, pageSize);
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>(); QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
topicQueryWrapper.like("topic_name", keywords); 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 @Override
public Topic getTopic(String identification, TopicAccessWay topicAccessWay) throws TopicServiceException { public TopicDTO getTopic(String identification, TopicAccessWay topicAccessWay) throws TopicServiceException {
//1. 判断by为话题id,还是话题名称 //1. 判断by为话题id,还是话题名称
Topic topic; Topic topic;
...@@ -115,7 +149,23 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements ...@@ -115,7 +149,23 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
throw new TopicServiceException(TopicErrorCode.TOPIC_NOT_EXISTS); 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 ...@@ -237,11 +287,11 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
} }
@Override @Override
public IPage<Topic> getTopicPage(Integer pageNumber, Integer pageSize) { public PageDTO<TopicDTO> getTopicPage(Integer pageNumber, Integer pageSize) {
IPage<Topic> page = new Page<>(pageNumber, pageSize); IPage<Topic> page = new Page<>(pageNumber, pageSize);
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>(); QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
topicQueryWrapper.orderByDesc("create_time"); topicQueryWrapper.orderByDesc("create_time");
return page(page, topicQueryWrapper); return toPageDTO(page(page, topicQueryWrapper));
} }
@Override @Override
...@@ -308,12 +358,12 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements ...@@ -308,12 +358,12 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
* @return * @return
*/ */
@Override @Override
public IPage<Topic> getHotPage(Integer pageNumber, Integer pageSize) { public PageDTO<TopicDTO> getHotPage(Integer pageNumber, Integer pageSize) {
IPage<Topic> page = new Page<>(pageNumber, pageSize); IPage<Topic> page = new Page<>(pageNumber, pageSize);
QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>(); QueryWrapper<Topic> topicQueryWrapper = new QueryWrapper<>();
topicQueryWrapper.orderByDesc("reference_count"); 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 ...@@ -387,4 +437,6 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
return topics; 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