Commit 1ad60127 by 胡明森

TopicApi0201

parent 5e04066c
package cn.meteor.beyondclouds.modules.topic.api; package cn.meteor.beyondclouds.modules.topic.api;
import cn.meteor.beyondclouds.common.form.PageForm; import cn.meteor.beyondclouds.common.form.PageForm;
import cn.meteor.beyondclouds.core.annotation.Anonymous;
import cn.meteor.beyondclouds.core.annotation.CurrentSubject; 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.bean.Subject; import cn.meteor.beyondclouds.core.bean.Subject;
import cn.meteor.beyondclouds.modules.topic.entity.Topic; import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
import cn.meteor.beyondclouds.modules.topic.form.CreateTopicForm; import cn.meteor.beyondclouds.modules.topic.form.CreateTopicForm;
import cn.meteor.beyondclouds.modules.topic.service.ITopicFollowService;
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 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;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -30,12 +34,17 @@ public class TopicApi { ...@@ -30,12 +34,17 @@ public class TopicApi {
private ITopicService iTopicService; private ITopicService iTopicService;
private ITopicFollowService iTopicFollowService;
@Autowired @Autowired
public void setiTopicService(ITopicService iTopicService) { public void setiTopicService(ITopicService iTopicService) {
this.iTopicService = iTopicService; this.iTopicService = iTopicService;
} }
@Autowired
public void setiTopicFollowService(ITopicFollowService iTopicFollowService) {
this.iTopicFollowService = iTopicFollowService;
}
@ApiOperation("创建话题") @ApiOperation("创建话题")
@PostMapping("/topic") @PostMapping("/topic")
...@@ -72,4 +81,58 @@ public class TopicApi { ...@@ -72,4 +81,58 @@ public class TopicApi {
} }
@Anonymous
@ApiOperation("话题详情")
@GetMapping("/topic/{topicId}")
public Response getTopic(@PathVariable("topicId") String topicId){
try {
Topic topic = iTopicService.getTopic(topicId);
return Response.success(topic);
} catch (TopicServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
@ApiOperation("关注话题")
@PostMapping("/topic/{topicId}/follower")
public Response topicFollower(@PathVariable("topicId") String topicId,@CurrentSubject Subject subject){
try {
iTopicService.topicFollower((String) subject.getId(),topicId);
return Response.success();
} catch (TopicServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
@ApiOperation("话题关注者列表")
@GetMapping("/topic/{topicId}/follower")
public Response topicsFollower(@PathVariable("topicId") @Valid String topicId, PageForm pageForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return Response.fieldError(bindingResult.getFieldError());
}
IPage<User> page = iTopicService.getTopicsFollower(pageForm.getPage(), pageForm.getSize(),topicId);
return Response.success(page);
}
@ApiOperation("我关注的话题")
@GetMapping("/my/topic/followed")
public Response topicsMyFollowed(@Valid PageForm pageForm, @CurrentSubject Subject subject, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return Response.fieldError(bindingResult.getFieldError());
}
IPage<Topic> page = iTopicService.getTopicsMyFollowed(pageForm.getPage(), pageForm.getSize(),String.valueOf(subject.getId()));
return Response.success(page);
}
} }
package cn.meteor.beyondclouds.modules.topic.enums;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* 话题相关错误码
* @author 胡明森
*/
public enum TopicErrorCode implements IErrorCode {
/**
* 话题已存在
*/
TOPIC_EXISTS(3001, "该话题已存在"),
TOPIC_NOT_EXISTS(3002, "该话题不存在");
TopicErrorCode(long code, String msg) {
this.code = code;
this.msg = msg;
}
private long code;
private String msg;
@Override
public long code () {
return code;
}
@Override
public String msg() {
return msg;
}
}
package cn.meteor.beyondclouds.modules.topic.exception;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
import lombok.Data;
/**
* 话题业务异常
* @author 胡明森
* @since 2020/1/28
*/
@Data
public class TopicServiceException extends ServiceException {
public TopicServiceException(long errorCode, String errorMsg) {
super(errorCode, errorMsg);
}
public TopicServiceException(IErrorCode errorCode) {
this(errorCode.code(), errorCode.msg());
}
}
package cn.meteor.beyondclouds.modules.topic.service; package cn.meteor.beyondclouds.modules.topic.service;
import cn.meteor.beyondclouds.modules.topic.entity.Topic; import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
import cn.meteor.beyondclouds.modules.user.entity.User;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
...@@ -27,4 +30,37 @@ public interface ITopicService extends IService<Topic> { ...@@ -27,4 +30,37 @@ public interface ITopicService extends IService<Topic> {
* @param keywords * @param keywords
*/ */
List<Topic> searchTopics(String keywords); List<Topic> searchTopics(String keywords);
/**
* 关注话题
* @param userId
* @param topicId
*/
void topicFollower(String userId, String topicId) throws TopicServiceException;
/**
* 话题详情
* @param topicId
* @return
*/
Topic getTopic(String topicId) throws TopicServiceException;
/**
* 我关注的话题
* @param page
* @param size
* @param userId
* @return
*/
IPage<Topic> getTopicsMyFollowed(Integer page, Integer size, String userId);
/**
* 话题关注者列表
* @param page
* @param size
* @param topicId
* @return
*/
IPage<User> getTopicsFollower(Integer page, Integer size, String topicId);
} }
package cn.meteor.beyondclouds.modules.topic.service.impl; package cn.meteor.beyondclouds.modules.topic.service.impl;
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.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.modules.topic.service.ITopicService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/** /**
* <p> * <p>
* 话题关注表,记录了用户和话题之间的关注关系 服务实现类 * 话题关注表,记录了用户和话题之间的关注关系 服务实现类
...@@ -17,4 +26,19 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +26,19 @@ 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 {
private ITopicFollowService iTopicFollowService;
private ITopicService iTopicService;
@Autowired
public void setiTopicFollowService(ITopicFollowService iTopicFollowService) {
this.iTopicFollowService = iTopicFollowService;
}
@Autowired
public void setiTopicService(ITopicService iTopicService) {
this.iTopicService = iTopicService;
}
} }
package cn.meteor.beyondclouds.modules.topic.service.impl; package cn.meteor.beyondclouds.modules.topic.service.impl;
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.enums.TopicErrorCode;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
import cn.meteor.beyondclouds.modules.topic.mapper.TopicMapper; import cn.meteor.beyondclouds.modules.topic.mapper.TopicMapper;
import cn.meteor.beyondclouds.modules.topic.service.ITopicFollowService;
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.service.IUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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;
...@@ -25,6 +34,15 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements ...@@ -25,6 +34,15 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
private ITopicService iTopicService; private ITopicService iTopicService;
private ITopicFollowService iTopicFollowService;
private IUserService iUserService;
@Autowired
public void setiUserService(IUserService iUserService) {
this.iUserService = iUserService;
}
@Autowired @Autowired
public void setTopicMapper(TopicMapper topicMapper) { public void setTopicMapper(TopicMapper topicMapper) {
this.topicMapper = topicMapper; this.topicMapper = topicMapper;
...@@ -35,6 +53,11 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements ...@@ -35,6 +53,11 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
this.iTopicService = iTopicService; this.iTopicService = iTopicService;
} }
@Autowired
public void setiTopicFollowService(ITopicFollowService iTopicFollowService) {
this.iTopicFollowService = iTopicFollowService;
}
@Override @Override
public void createTopic(String userId, String topicName) { public void createTopic(String userId, String topicName) {
...@@ -50,4 +73,80 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements ...@@ -50,4 +73,80 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
return topicMapper.searchTopics(keywords); return topicMapper.searchTopics(keywords);
} }
@Override
public Topic getTopic(String topicId) throws TopicServiceException{
//1. 获取话题
Topic topic=iTopicService.getById(topicId);
//2. 找不到该话题,抛出业务异常
if(topic == null) {
throw new TopicServiceException(TopicErrorCode.TOPIC_NOT_EXISTS);
}
return topic;
}
@Override
public void topicFollower(String userId, String topicId) throws TopicServiceException{
//1. 获取话题
Topic topic=iTopicService.getById(topicId);
//2. 找不到该话题,抛出业务异常
if(topic == null) {
throw new TopicServiceException(TopicErrorCode.TOPIC_NOT_EXISTS);
}
//3. 关注话题
TopicFollow topicFollow=new TopicFollow();
topicFollow.setTopicId(topicId);
topicFollow.setUserId(userId);
iTopicFollowService.save(topicFollow);
}
@Override
public IPage<Topic> getTopicsMyFollowed(Integer page, Integer size, String userId) {
//1. 通过用户id获取我关注的所有话题的id
IPage<TopicFollow> pages = new Page<>(page, size);
QueryWrapper<TopicFollow> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId);
IPage<TopicFollow> page1 = iTopicFollowService.page(pages, queryWrapper);
//2. 通过话题id获取话题详情
IPage<Topic> page2 = new Page<>(page, size);
QueryWrapper<Topic> queryWrapper1 = new QueryWrapper<>();
queryWrapper.eq("topic_id", page1.getRecords());
//3. 分页返回
return iTopicService.page(page2, queryWrapper1);
}
@Override
public IPage<User> getTopicsFollower(Integer page, Integer size, String topicId) {
//1. 通过话题id获取该话题所有关注着
IPage<TopicFollow> pages = new Page<>(page, size);
QueryWrapper<TopicFollow> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("topic_id", topicId);
IPage<TopicFollow> page1 = iTopicFollowService.page(pages, queryWrapper);
//2. 通过用户id获取用户详情
IPage<User> page2 = new Page<>(page, size);
QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
queryWrapper.eq("user_id", page1.getRecords());
//3. 分页返回
return iUserService.page(page2, queryWrapper1);
}
} }
...@@ -3,7 +3,7 @@ spring: ...@@ -3,7 +3,7 @@ spring:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/beyond_clouds?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true url: jdbc:mysql://127.0.0.1:3306/beyond_clouds?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true
username: root username: root
password: 100Centa30821%mysql password: password
swagger: swagger:
enable: true enable: true
...@@ -31,4 +31,6 @@ beyondclouds: ...@@ -31,4 +31,6 @@ beyondclouds:
qq: qq:
client-id: 101846021 client-id: 101846021
client-secret: 5bc41deeb7e152e2e6aff97726bbf86a client-secret: 5bc41deeb7e152e2e6aff97726bbf86a
redirect-uri: http://meteor.natapp1.cc/auth/qq redirect-uri: http://meteor.natapp1.cc/auth/qq
\ No newline at end of file server:
port: 8081
\ No newline at end of file
...@@ -3,7 +3,7 @@ spring: ...@@ -3,7 +3,7 @@ spring:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/beyond_clouds?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true url: jdbc:mysql://127.0.0.1:3306/beyond_clouds?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true
username: root username: root
password: 100Centa30821%mysql password: password
swagger: swagger:
enable: true enable: true
...@@ -31,4 +31,6 @@ beyondclouds: ...@@ -31,4 +31,6 @@ beyondclouds:
qq: qq:
client-id: 101846021 client-id: 101846021
client-secret: 5bc41deeb7e152e2e6aff97726bbf86a client-secret: 5bc41deeb7e152e2e6aff97726bbf86a
redirect-uri: http://meteor.natapp1.cc/auth/qq redirect-uri: http://meteor.natapp1.cc/auth/qq
\ No newline at end of file server:
port: 8081
\ No newline at end of file
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