Commit 57df0e68 by 段启岩

Merge remote-tracking branch 'origin/huxueliang'

parents 3863ab3d e533fb19
package cn.meteor.beyondclouds.modules.question.api;
import cn.meteor.beyondclouds.core.annotation.CurrentSubject;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.bean.Subject;
import cn.meteor.beyondclouds.modules.question.bean.QuestionDetails;
import cn.meteor.beyondclouds.modules.question.entity.Question;
import cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException;
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.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
*/
@Api(tags = "问题Api")
@RestController
@RequestMapping("/api")
public class QuestionApi {
IQuestionService questionService;
@Autowired
public QuestionApi(IQuestionService questionService) {
this.questionService = questionService;
}
@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());
question.setCategoryId(Integer.valueOf(questionForm.getCategoryId()));
question.setQuestionAbstract(questionForm.getQuestionAbstract());
HashSet<String> tags = QuestionUtils.toHashSet(questionForm.getTags());
try {
questionService.postQuestion(question,questionForm.getQuestionDetail(),tags);
return Response.success();
} catch (QuestionServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
@ApiOperation("删除问题")
@DeleteMapping("/question/{questionId}")
public Response deleteQuestion(@PathVariable("questionId") String questionId){
questionService.deleteQuestion(questionId);
return Response.success();
}
@ApiOperation("修改问题")
@PutMapping("/question/{questionId}")
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();
question.setQuestionId(questionId);
question.setUserId((String) subject.getId());
question.setQuestionTitle(questionForm.getQuestionTitle());
question.setCategoryId(Integer.valueOf(questionForm.getCategoryId()));
question.setQuestionAbstract(questionForm.getQuestionAbstract());
HashSet<String> tags = QuestionUtils.toHashSet(questionForm.getTags());
try {
questionService.modifyQuestion(question, questionForm.getQuestionDetail(), tags);
return Response.success();
} catch (QuestionServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
@ApiOperation("问题详情")
@GetMapping("/question/{questionId}")
public Response questionDetails(@PathVariable("questionId") String questionId){
QuestionDetails questionDetails = questionService.questionDetails(questionId);
return Response.success(questionDetails);
}
}
package cn.meteor.beyondclouds.modules.question.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author 胡学良
* @date 2020/1/31
*/
@ApiModel("问题详情")
@Data
public class QuestionDetails {
@ApiModelProperty("问题ID")
private String questionId;
@ApiModelProperty("用户ID")
private String userId;
@ApiModelProperty("标题")
private String questionTitle;
@ApiModelProperty("类别")
private String category;
@ApiModelProperty("摘要")
private String questionAbstract;
@ApiModelProperty("详情")
private String questionDetail;
@ApiModelProperty("标签")
private String tags;
}
package cn.meteor.beyondclouds.modules.question.enums;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* @author 胡学良
* @date 2020/1/31
*/
public enum QuestionErrorCode implements IErrorCode {
/**
* 问题没有以?结尾
*/
QUESTION_END_ERROR(3001,"问题没有以?结尾");
private long code;
private String msg;
QuestionErrorCode(long code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public long code() {
return code;
}
@Override
public String msg() {
return msg;
}
public enum QUESTION_END_ERROR {}
}
package cn.meteor.beyondclouds.modules.question.exception;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
* @author 胡学良
* @date 2020/1/31
*/
public class QuestionServiceException extends ServiceException {
public QuestionServiceException(long errorCode, String errorMsg) {
super(errorCode, errorMsg);
}
public QuestionServiceException(IErrorCode errorCode) {
super(errorCode);
}
}
package cn.meteor.beyondclouds.modules.question.form;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
/**
* @author 胡学良
* @date 2020/1/31
*/
@ApiModel("发布问题表单")
@Data
public class QuestionForm {
@ApiModelProperty("类别ID")
@NotEmpty(message = "问题类别ID不能为空")
private String categoryId;
@ApiModelProperty("标题")
@NotEmpty(message = "问题标题不能为空")
@Size(max = 256, message = "问题标题太长")
private String questionTitle;
@ApiModelProperty("摘要")
@Size(max = 256, message = "问题摘要太长")
private String questionAbstract;
@ApiModelProperty("标签")
@Size(max = 12, message = "问题标签个数不能超过5个")
private String tags;
@ApiModelProperty("详情")
private String questionDetail;
}
package cn.meteor.beyondclouds.modules.question.service; package cn.meteor.beyondclouds.modules.question.service;
import cn.meteor.beyondclouds.modules.question.bean.QuestionDetails;
import cn.meteor.beyondclouds.modules.question.entity.Question; import cn.meteor.beyondclouds.modules.question.entity.Question;
import cn.meteor.beyondclouds.modules.question.entity.QuestionExt;
import cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.HashSet;
/** /**
* <p> * <p>
* 问题表 服务类 * 问题表 服务类
...@@ -13,4 +18,37 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +18,37 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IQuestionService extends IService<Question> { public interface IQuestionService extends IService<Question> {
/**
* 发布问题
* @param question 问题基本信息
* @param questionDetail 问题详细信息
* @param tags 问题标签
* @throws QuestionServiceException
*/
void postQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException;
/**
* 删除问题
* @param questionId 问题ID
*/
void deleteQuestion(String questionId);
/**
* 修改问题
* @param question 问题基本信息
* @param questionDetail 问题详细信息
* @param tags 问题标签
* @throws QuestionServiceException
*/
void modifyQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException;
/**
* 问题详情
* @param questionId 问题ID
* @return 问题详情
*/
QuestionDetails questionDetails(String questionId);
} }
...@@ -3,6 +3,8 @@ package cn.meteor.beyondclouds.modules.question.service; ...@@ -3,6 +3,8 @@ package cn.meteor.beyondclouds.modules.question.service;
import cn.meteor.beyondclouds.modules.question.entity.QuestionTag; import cn.meteor.beyondclouds.modules.question.entity.QuestionTag;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.HashSet;
/** /**
* <p> * <p>
* 问题标签表,用来记录问题里面引用的标签 服务类 * 问题标签表,用来记录问题里面引用的标签 服务类
...@@ -13,4 +15,11 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +15,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IQuestionTagService extends IService<QuestionTag> { public interface IQuestionTagService extends IService<QuestionTag> {
/**
* 保存问题标签
* @param tags 问题对应标签
* @param questionId 问题ID
*/
void saveQuestionTag(HashSet<String> tags, String questionId);
} }
package cn.meteor.beyondclouds.modules.question.service.impl; 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.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.enums.QuestionErrorCode;
import cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException;
import cn.meteor.beyondclouds.modules.question.mapper.QuestionMapper; import cn.meteor.beyondclouds.modules.question.mapper.QuestionMapper;
import cn.meteor.beyondclouds.modules.question.service.IQuestionService; import cn.meteor.beyondclouds.modules.question.service.*;
import cn.meteor.beyondclouds.modules.question.util.QuestionUtils;
import cn.meteor.beyondclouds.modules.tag.service.ITagService;
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 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.HashSet;
import java.util.Iterator;
import java.util.List;
/** /**
* <p> * <p>
* 问题表 服务实现类 * 问题表 服务实现类
...@@ -17,4 +33,128 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +33,128 @@ import org.springframework.stereotype.Service;
@Service @Service
public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> implements IQuestionService { public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> implements IQuestionService {
private final String QUESTION_END_EN = "?";
private final String QUESTION_END_CN = "?";
private IQuestionExtService questionExtService;
private IQuestionTagService questionTagService;
private IQuestionReplyService questionReplyService;
private IQuestionReplyCommentService questionReplyCommentService;
private ITagService tagService;
private IQuestionCategoryService questionCategoryService;
@Autowired
public QuestionServiceImpl(IQuestionExtService questionExtService, IQuestionTagService questionTagService, IQuestionReplyService questionReplyService, IQuestionReplyCommentService questionReplyCommentService, ITagService tagService, IQuestionCategoryService questionCategoryService) {
this.questionExtService = questionExtService;
this.questionTagService = questionTagService;
this.questionReplyService = questionReplyService;
this.questionReplyCommentService = questionReplyCommentService;
this.tagService = tagService;
this.questionCategoryService = questionCategoryService;
}
@Override
public void postQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException {
//1.检查问题标题是否以?结尾
if (!question.getQuestionTitle().endsWith(QUESTION_END_EN) && !question.getQuestionTitle().endsWith(QUESTION_END_CN)){
throw new QuestionServiceException(QuestionErrorCode.QUESTION_END_ERROR);
}
//2.创建问题信息
save(question);
//3.创建问题扩展信息
QuestionExt questionExt = new QuestionExt();
questionExt.setQuestionId(question.getQuestionId());
questionExt.setQuestionDetail(questionDetail);
questionExtService.save(questionExt);
//3.创建问题标签信息
questionTagService.saveQuestionTag(tags,question.getQuestionId());
}
@Override
public void deleteQuestion(String questionId) {
//1.删除question表中的问题信息
removeById(questionId);
//2.删除question-ext表中的问题信息
questionExtService.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表中关于该问题的所有回复
for (QuestionReply questionReply : questionReplies){
questionReplyCommentService.remove(QuestionUtils.getWrapper("reply_id",questionReply.getReplyId()));
}
//6.删除question-tag表中关于该问题的标签
questionTagService.remove(QuestionUtils.getWrapper("question_id",questionId));
}
@Override
public void modifyQuestion(Question question, String questionDetail, HashSet<String> tags) throws QuestionServiceException {
//1.检查问题标题是否以?结尾
if (!question.getQuestionTitle().endsWith(QUESTION_END_EN) && !question.getQuestionTitle().endsWith(QUESTION_END_CN)){
throw new QuestionServiceException(QuestionErrorCode.QUESTION_END_ERROR);
}
//2.更新问题信息
update(question,QuestionUtils.getWrapper("question_id",question.getQuestionId()));
//3.更新问题扩展信息
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()));
questionTagService.saveQuestionTag(tags,question.getQuestionId());
}
@Override
public QuestionDetails questionDetails(String questionId) {
//1.获取问题基本信息
Question question = getById(questionId);
//2.获取问题扩展信息
QuestionExt questionExt = questionExtService.getOne(QuestionUtils.getWrapper("question_id", questionId));
//3.获取问题标签
List<QuestionTag> questionTags = questionTagService.list(QuestionUtils.getWrapper("question_id", questionId));
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[");
for (QuestionTag questionTag : questionTags){
stringBuilder.append(tagService.getById(questionTag.getTagId()).getTagName()+",");
}
stringBuilder.deleteCharAt(stringBuilder.length()-1);
stringBuilder.append("]");
String tags = stringBuilder.toString();
//4.生成问题详情对象
QuestionDetails questionDetails = new QuestionDetails();
questionDetails.setUserId(question.getUserId());
questionDetails.setQuestionId(question.getQuestionId());
questionDetails.setQuestionTitle(question.getQuestionTitle());
questionDetails.setQuestionAbstract(question.getQuestionAbstract());
questionDetails.setQuestionDetail(questionExt.getQuestionDetail());
questionDetails.setTags(tags);
questionDetails.setCategory(questionCategoryService.getById(question.getCategoryId()).getCategory());
return questionDetails;
}
} }
...@@ -3,9 +3,13 @@ package cn.meteor.beyondclouds.modules.question.service.impl; ...@@ -3,9 +3,13 @@ package cn.meteor.beyondclouds.modules.question.service.impl;
import cn.meteor.beyondclouds.modules.question.entity.QuestionTag; import cn.meteor.beyondclouds.modules.question.entity.QuestionTag;
import cn.meteor.beyondclouds.modules.question.mapper.QuestionTagMapper; import cn.meteor.beyondclouds.modules.question.mapper.QuestionTagMapper;
import cn.meteor.beyondclouds.modules.question.service.IQuestionTagService; import cn.meteor.beyondclouds.modules.question.service.IQuestionTagService;
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 java.util.HashSet;
import java.util.Iterator;
/** /**
* <p> * <p>
* 问题标签表,用来记录问题里面引用的标签 服务实现类 * 问题标签表,用来记录问题里面引用的标签 服务实现类
...@@ -17,4 +21,17 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +21,17 @@ import org.springframework.stereotype.Service;
@Service @Service
public class QuestionTagServiceImpl extends ServiceImpl<QuestionTagMapper, QuestionTag> implements IQuestionTagService { public class QuestionTagServiceImpl extends ServiceImpl<QuestionTagMapper, QuestionTag> implements IQuestionTagService {
@Override
public void saveQuestionTag(HashSet<String> tags, String questionId) {
Iterator<String> iterator = tags.iterator();
QuestionTag questionTag;
while(iterator.hasNext()){
questionTag = new QuestionTag();
questionTag.setQuestionId(questionId);
questionTag.setTagId(iterator.next());
save(questionTag);
}
}
} }
package cn.meteor.beyondclouds.modules.question.util;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.Arrays;
import java.util.HashSet;
/**
* @author 胡学良
* @date 2020/1/31
*/
public class QuestionUtils {
/**
* 获取相关的条件构造器
* @param field 表中的字段名称
* @param data 比较数据
* @param <T>
* @return
*/
public static <T> QueryWrapper<T> getWrapper(String field, Object data){
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
queryWrapper.eq(field,data);
return queryWrapper;
}
/**
* 处理标签
* @param tags 标签
* @return
*/
public static HashSet<String> toHashSet(String tags){
StringBuilder stringBuilder = new StringBuilder(tags);
stringBuilder.deleteCharAt(0);
stringBuilder.deleteCharAt(stringBuilder.length()-1);
String[] tag = stringBuilder.toString().split(",");
return new HashSet<String>(Arrays.asList(tag));
}
}
...@@ -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: 197442
swagger: swagger:
enable: true 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