Commit 75356962 by 胡学良

完善0131代码

parent 5e04066c
package cn.meteor.beyondclouds.modules.question.api;
import cn.meteor.beyondclouds.core.annotation.Anonymous;
import cn.meteor.beyondclouds.core.annotation.CurrentSubject;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.bean.Subject;
......@@ -9,49 +10,58 @@ import cn.meteor.beyondclouds.modules.question.exception.QuestionServiceExceptio
import cn.meteor.beyondclouds.modules.question.form.QuestionForm;
import cn.meteor.beyondclouds.modules.question.service.IQuestionService;
import cn.meteor.beyondclouds.modules.question.util.QuestionUtils;
import cn.meteor.beyondclouds.modules.user.bean.AuthenticationResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.HashSet;
/**
* @author 胡学良
* @date 2020/1/31
* @since 2020/1/31
*/
@Api(tags = "问题Api")
@RestController
@RequestMapping("/api")
public class QuestionApi {
IQuestionService questionService;
private IQuestionService questionService;
@Autowired
public QuestionApi(IQuestionService questionService) {
this.questionService = questionService;
}
/**
* 发布问题
* @param questionForm 问题表单
* @param result 校验信息
* @param subject 访问者信息
* @return default
*/
@ApiOperation("发布问题")
@PostMapping("/question")
public Response postQuestion(@RequestBody @Valid QuestionForm questionForm, BindingResult result, @CurrentSubject Subject subject){
if (result.hasErrors()) {
return Response.fieldError(result.getFieldError());
}
//将问题表单转换为问题对象
Question question = new Question();
question.setUserId((String) subject.getId());
question.setQuestionTitle(questionForm.getQuestionTitle());
BeanUtils.copyProperties(questionForm,question);
question.setCategoryId(Integer.valueOf(questionForm.getCategoryId()));
question.setQuestionAbstract(questionForm.getQuestionAbstract());
//设置用户ID(问题发布者ID)
question.setUserId((String) subject.getId());
//祛除重复标签
HashSet<String> tags = QuestionUtils.toHashSet(questionForm.getTags());
//发布问题
try {
questionService.postQuestion(question,questionForm.getQuestionDetail(),tags);
return Response.success();
......@@ -61,30 +71,56 @@ public class QuestionApi {
}
}
/**
* 删除问题
* @param questionId 问题ID
* @param subject 访问者信息
* @return default
*/
@ApiOperation("删除问题")
@DeleteMapping("/question/{questionId}")
public Response deleteQuestion(@PathVariable("questionId") String questionId){
questionService.deleteQuestion(questionId);
public Response deleteQuestion(@PathVariable("questionId") String questionId, @CurrentSubject Subject subject){
try {
questionService.deleteQuestion(questionId, (String) subject.getId());
return Response.success();
} catch (QuestionServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
/**
* 修改问题
* @param questionId 问题ID
* @param questionForm 问题表单
* @param result 校验信息
* @param subject 访问者信息
* @return default
*/
@ApiOperation("修改问题")
@PutMapping("/question/{questionId}")
public Response modifyQuestion(@PathVariable("questionId") String questionId,@RequestBody @Valid QuestionForm questionForm, BindingResult result, @CurrentSubject Subject subject){
public Response modifyQuestion(@PathVariable("questionId") String questionId, @RequestBody @Valid QuestionForm questionForm, BindingResult result, @CurrentSubject Subject subject){
if (result.hasErrors()) {
return Response.fieldError(result.getFieldError());
}
//将问题表单转换为问题对象
Question question = new Question();
BeanUtils.copyProperties(questionForm,question);
question.setCategoryId(Integer.valueOf(questionForm.getCategoryId()));
//2.设置问题ID
question.setQuestionId(questionId);
//3.设置用户ID
question.setUserId((String) subject.getId());
question.setQuestionTitle(questionForm.getQuestionTitle());
question.setCategoryId(Integer.valueOf(questionForm.getCategoryId()));
question.setQuestionAbstract(questionForm.getQuestionAbstract());
//4.祛除重复标签
HashSet<String> tags = QuestionUtils.toHashSet(questionForm.getTags());
//5.修改问题
try {
questionService.modifyQuestion(question, questionForm.getQuestionDetail(), tags);
questionService.updateQuestion(question, questionForm.getQuestionDetail(), tags);
return Response.success();
} catch (QuestionServiceException e) {
e.printStackTrace();
......@@ -92,11 +128,24 @@ public class QuestionApi {
}
}
/**
* 问题详情
* @param questionId 问题ID
* @return 问题详情
*/
@Anonymous
@ApiOperation("问题详情")
@GetMapping("/question/{questionId}")
public Response questionDetails(@PathVariable("questionId") String questionId){
QuestionDetails questionDetails = questionService.questionDetails(questionId);
QuestionDetails questionDetails = null;
try {
questionDetails = questionService.questionDetails(questionId);
return Response.success(questionDetails);
} catch (QuestionServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
}
package cn.meteor.beyondclouds.modules.question.bean;
import cn.meteor.beyondclouds.modules.question.entity.Question;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author 胡学良
* @date 2020/1/31
* @since 2020/1/31
*/
@ApiModel("问题详情")
@Data
public class QuestionDetails {
@ApiModelProperty("问题ID")
private String questionId;
@ApiModelProperty("用户ID")
private String userId;
@ApiModelProperty("标题")
private String questionTitle;
public class QuestionDetails extends Question {
@ApiModelProperty("类别")
private String category;
@ApiModelProperty("摘要")
private String questionAbstract;
@ApiModelProperty("详情")
private String questionDetail;
......
......@@ -4,13 +4,15 @@ import cn.meteor.beyondclouds.core.IErrorCode;
/**
* @author 胡学良
* @date 2020/1/31
* @since 2020/1/31
*/
public enum QuestionErrorCode implements IErrorCode {
/**
* 问题没有以?结尾
*/
QUESTION_END_ERROR(3001,"问题没有以?结尾");
QUESTION_END_ERROR(3001,"问题没有以?结尾"),
INCORRECT_CATEGORY(3002,"问题类别错误"),
QUESTION_NOT_FOUND(3003, "找不到该问题");
private long code;
private String msg;
......@@ -30,5 +32,4 @@ public enum QuestionErrorCode implements IErrorCode {
return msg;
}
public enum QUESTION_END_ERROR {}
}
......@@ -5,7 +5,7 @@ import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
* @author 胡学良
* @date 2020/1/31
* @since 2020/1/31
*/
public class QuestionServiceException extends ServiceException {
public QuestionServiceException(long errorCode, String errorMsg) {
......
......@@ -10,12 +10,14 @@ import javax.validation.constraints.Size;
/**
* @author 胡学良
* @date 2020/1/31
* @since 2020/1/31
*/
@ApiModel("发布问题表单")
@ApiModel(value = "QuestionForm", description = "问题表单")
@Data
public class QuestionForm {
private static final long serialVersionUID=1L;
@ApiModelProperty("类别ID")
@NotEmpty(message = "问题类别ID不能为空")
private String categoryId;
......
......@@ -24,31 +24,34 @@ public interface IQuestionService extends IService<Question> {
* @param question 问题基本信息
* @param questionDetail 问题详细信息
* @param tags 问题标签
* @throws QuestionServiceException
* @throws QuestionServiceException 问题业务异常
*/
void postQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException;
/**
* 删除问题
* @param questionId 问题ID
* @param userId 用户ID
* @throws QuestionServiceException 问题业务异常
*/
void deleteQuestion(String questionId);
void deleteQuestion(String questionId, String userId) throws QuestionServiceException;
/**
* 修改问题
* @param question 问题基本信息
* @param questionDetail 问题详细信息
* @param tags 问题标签
* @throws QuestionServiceException
* @throws QuestionServiceException 问题业务异常
*/
void modifyQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException;
void updateQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException;
/**
* 问题详情
* @param questionId 问题ID
* @return 问题详情
* @throws QuestionServiceException 问题业务异常
*/
QuestionDetails questionDetails(String questionId);
QuestionDetails questionDetails(String questionId) throws QuestionServiceException;
}
package cn.meteor.beyondclouds.modules.question.service.impl;
import cn.meteor.beyondclouds.modules.question.bean.QuestionDetails;
import cn.meteor.beyondclouds.modules.question.entity.Question;
import cn.meteor.beyondclouds.modules.question.entity.QuestionExt;
import cn.meteor.beyondclouds.modules.question.entity.QuestionReply;
import cn.meteor.beyondclouds.modules.question.entity.QuestionTag;
import cn.meteor.beyondclouds.modules.question.entity.*;
import cn.meteor.beyondclouds.modules.question.enums.QuestionErrorCode;
import cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException;
import cn.meteor.beyondclouds.modules.question.mapper.QuestionMapper;
......@@ -15,8 +12,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.HashSet;
import java.util.Iterator;
......@@ -59,6 +59,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
this.questionCategoryService = questionCategoryService;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void postQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException {
//1.检查问题标题是否以?结尾
......@@ -66,59 +67,93 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
throw new QuestionServiceException(QuestionErrorCode.QUESTION_END_ERROR);
}
//2.创建问题信息
//2.检查问题分类是否存在
QuestionCategory questionCategory = questionCategoryService.getById(question.getCategoryId());
if (null == questionCategory) {
throw new QuestionServiceException(QuestionErrorCode.INCORRECT_CATEGORY);
}
//3.保存问题信息
save(question);
//3.创建问题扩展信息
//4.保存问题扩展信息
QuestionExt questionExt = new QuestionExt();
questionExt.setQuestionId(question.getQuestionId());
questionExt.setQuestionDetail(questionDetail);
questionExtService.save(questionExt);
//3.创建问题标签信息
//5.保存问题标签信息
questionTagService.saveQuestionTag(tags,question.getQuestionId());
}
@Transactional(rollbackFor = Exception.class)
@Override
public void deleteQuestion(String questionId) {
//1.删除question表中的问题信息
removeById(questionId);
public void deleteQuestion(String questionId, String userId) throws QuestionServiceException{
//1.判断自己是否发布过此问题
QueryWrapper<Question> questionQueryWrapper = new QueryWrapper<>();
questionQueryWrapper.eq("question_id",questionId)
.eq("user_id",userId);
Question question = getOne(questionQueryWrapper);
if (null == question) {
throw new QuestionServiceException(QuestionErrorCode.QUESTION_NOT_FOUND);
}
//2.删除question-ext表中的问题信息
questionExtService.remove(QuestionUtils.getWrapper("question_id",questionId));
//2.删除question-tag表中关于该问题的标签
questionTagService.remove(QuestionUtils.getWrapper("question_id",questionId));
//3.获取该问题的所有回复
List<QuestionReply> questionReplies = questionReplyService.list(QuestionUtils.getWrapper("question_id",questionId));
//4.删除question-reply表中关于该问题的所有回复
questionReplyService.remove(QuestionUtils.getWrapper("question_id",questionId));
//5.删除question-reply-comment表中关于该问题的所有回复
//4.删除question-reply-comment表中关于该问题的所有回复
for (QuestionReply questionReply : questionReplies){
questionReplyCommentService.remove(QuestionUtils.getWrapper("reply_id",questionReply.getReplyId()));
}
//6.删除question-tag表中关于该问题的标签
questionTagService.remove(QuestionUtils.getWrapper("question_id",questionId));
//5.删除question-reply表中关于该问题的所有回复
questionReplyService.remove(QuestionUtils.getWrapper("question_id",questionId));
//6.删除question-ext表中的问题信息
questionExtService.remove(QuestionUtils.getWrapper("question_id",questionId));
//7.删除question表中的问题信息
removeById(questionId);
}
@Override
public void modifyQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException {
//1.检查问题标题是否以?结尾
public void updateQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException {
//1.判断自己是否发布过此问题
QueryWrapper<Question> questionQueryWrapper = new QueryWrapper<>();
questionQueryWrapper.eq("question_id",question.getQuestionId())
.eq("user_id",question.getUserId());
Question questionInDb = getOne(questionQueryWrapper);
if (null == questionInDb) {
throw new QuestionServiceException(QuestionErrorCode.QUESTION_NOT_FOUND);
}
//2.检查问题标题是否以?结尾
if (!question.getQuestionTitle().endsWith(QUESTION_END_EN) && !question.getQuestionTitle().endsWith(QUESTION_END_CN)){
throw new QuestionServiceException(QuestionErrorCode.QUESTION_END_ERROR);
}
//3.检查问题分类是否存在
QuestionCategory questionCategory = questionCategoryService.getById(question.getCategoryId());
if (null == questionCategory) {
throw new QuestionServiceException(QuestionErrorCode.INCORRECT_CATEGORY);
}
//2.更新问题信息
update(question,QuestionUtils.getWrapper("question_id",question.getQuestionId()));
//3.更新问题扩展信息
if (!StringUtils.isEmpty(questionDetail)) {
QuestionExt questionExt = new QuestionExt();
questionExt.setQuestionId(question.getQuestionId());
questionExt.setQuestionDetail(questionDetail);
UpdateWrapper<QuestionExt> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("question_id",question.getQuestionId());
questionExtService.update(questionExt,updateWrapper);
}
//4.更新问题标签
questionTagService.remove(QuestionUtils.getWrapper("question_id",question.getQuestionId()));
......@@ -126,15 +161,19 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
}
@Override
public QuestionDetails questionDetails(String questionId) {
public QuestionDetails questionDetails(String questionId) throws QuestionServiceException{
//1.获取问题基本信息
Question question = getById(questionId);
//2.获取问题扩展信息
//2.判断是否存在此问题
if (null == question) {
throw new QuestionServiceException(QuestionErrorCode.QUESTION_NOT_FOUND);
}
//3.获取问题扩展信息
QuestionExt questionExt = questionExtService.getOne(QuestionUtils.getWrapper("question_id", questionId));
//3.获取问题标签
//4.获取问题标签
List<QuestionTag> questionTags = questionTagService.list(QuestionUtils.getWrapper("question_id", questionId));
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[");
......@@ -145,12 +184,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
stringBuilder.append("]");
String tags = stringBuilder.toString();
//4.生成问题详情对象
//5.生成问题详情对象
QuestionDetails questionDetails = new QuestionDetails();
questionDetails.setUserId(question.getUserId());
questionDetails.setQuestionId(question.getQuestionId());
questionDetails.setQuestionTitle(question.getQuestionTitle());
questionDetails.setQuestionAbstract(question.getQuestionAbstract());
BeanUtils.copyProperties(question,questionDetails);
questionDetails.setQuestionDetail(questionExt.getQuestionDetail());
questionDetails.setTags(tags);
questionDetails.setCategory(questionCategoryService.getById(question.getCategoryId()).getCategory());
......
......@@ -3,8 +3,11 @@ package cn.meteor.beyondclouds.modules.question.service.impl;
import cn.meteor.beyondclouds.modules.question.entity.QuestionTag;
import cn.meteor.beyondclouds.modules.question.mapper.QuestionTagMapper;
import cn.meteor.beyondclouds.modules.question.service.IQuestionTagService;
import cn.meteor.beyondclouds.modules.tag.entity.Tag;
import cn.meteor.beyondclouds.modules.tag.service.ITagService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
......@@ -21,14 +24,25 @@ import java.util.Iterator;
@Service
public class QuestionTagServiceImpl extends ServiceImpl<QuestionTagMapper, QuestionTag> implements IQuestionTagService {
private ITagService tagService;
@Autowired
public QuestionTagServiceImpl(ITagService tagService) {
this.tagService = tagService;
}
@Override
public void saveQuestionTag(HashSet<String> tags, String questionId) {
Iterator<String> iterator = tags.iterator();
QuestionTag questionTag;
while(iterator.hasNext()){
Tag tag = tagService.getById(iterator.next());
if (tag == null || tag.getTagType() != 2) {
continue;
}
questionTag = new QuestionTag();
questionTag.setQuestionId(questionId);
questionTag.setTagId(iterator.next());
questionTag.setTagId(tag.getTagId());
save(questionTag);
}
}
......
......@@ -7,7 +7,7 @@ import java.util.HashSet;
/**
* @author 胡学良
* @date 2020/1/31
* @since 2020/1/31
*/
public class QuestionUtils {
......
......@@ -7,6 +7,7 @@ import cn.meteor.beyondclouds.core.bean.Subject;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.form.CreateTopicForm;
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 io.swagger.annotations.Api;
......@@ -57,7 +58,6 @@ public class TopicApi {
int pageNo= pageForm.getPage();
int pageSize= pageForm.getSize();
IPage<Topic> page = new Page<>(pageNo, pageSize);
return Response.success(iTopicService.page(page));
}
......
......@@ -3,7 +3,7 @@ spring:
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
username: root
password: 100Centa30821%mysql
password: 197442
swagger:
enable: true
......
......@@ -3,7 +3,7 @@ spring:
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
username: root
password: 100Centa30821%mysql
password: 197442
swagger:
enable: true
......
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