Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
beyond-clouds
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
4
Issues
4
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
段启岩
beyond-clouds
Commits
1c3d1ee6
Commit
1c3d1ee6
authored
Feb 04, 2020
by
段启岩
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加问题类别、标签、详细信息
parent
6fe11361
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
261 additions
and
105 deletions
+261
-105
src/main/java/cn/meteor/beyondclouds/modules/blog/mapper/BlogMapper.java
+0
-7
src/main/java/cn/meteor/beyondclouds/modules/question/api/QuestionApi.java
+7
-10
src/main/java/cn/meteor/beyondclouds/modules/question/bean/QuestionDetails.java
+0
-14
src/main/java/cn/meteor/beyondclouds/modules/question/entity/Question.java
+21
-4
src/main/java/cn/meteor/beyondclouds/modules/question/form/QuestionForm.java
+3
-4
src/main/java/cn/meteor/beyondclouds/modules/question/mapper/QuestionMapper.java
+20
-0
src/main/java/cn/meteor/beyondclouds/modules/question/mapper/QuestionReplyMapper.java
+10
-0
src/main/java/cn/meteor/beyondclouds/modules/question/mapper/xml/QuestionMapper.xml
+52
-0
src/main/java/cn/meteor/beyondclouds/modules/question/service/IQuestionReplyService.java
+8
-1
src/main/java/cn/meteor/beyondclouds/modules/question/service/IQuestionService.java
+1
-3
src/main/java/cn/meteor/beyondclouds/modules/question/service/impl/QuestionReplyServiceImpl.java
+14
-0
src/main/java/cn/meteor/beyondclouds/modules/question/service/impl/QuestionServiceImpl.java
+125
-62
No files found.
src/main/java/cn/meteor/beyondclouds/modules/blog/mapper/BlogMapper.java
View file @
1c3d1ee6
...
@@ -18,13 +18,6 @@ import org.apache.ibatis.annotations.Param;
...
@@ -18,13 +18,6 @@ import org.apache.ibatis.annotations.Param;
public
interface
BlogMapper
extends
BaseMapper
<
Blog
>
{
public
interface
BlogMapper
extends
BaseMapper
<
Blog
>
{
/**
/**
* 分页查询博客获取标签
* @param page
* @return
*/
IPage
<
Blog
>
selectPageWithTags
(
IPage
<
Blog
>
page
);
/**
* 根据查询条件分页查询博客获取标签
* 根据查询条件分页查询博客获取标签
* @param page
* @param page
* @param queryWrapper
* @param queryWrapper
...
...
src/main/java/cn/meteor/beyondclouds/modules/question/api/QuestionApi.java
View file @
1c3d1ee6
...
@@ -8,7 +8,6 @@ import cn.meteor.beyondclouds.core.api.Response;
...
@@ -8,7 +8,6 @@ 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.question.bean.QuestionDetails
;
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.QuestionReply
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionTagServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionTagServiceException
;
import
cn.meteor.beyondclouds.modules.question.form.QuestionForm
;
import
cn.meteor.beyondclouds.modules.question.form.QuestionForm
;
...
@@ -21,13 +20,11 @@ import io.swagger.annotations.Api;
...
@@ -21,13 +20,11 @@ import io.swagger.annotations.Api;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.validation.BindingResult
;
import
org.springframework.validation.BindingResult
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
import
javax.validation.Valid
;
import
javax.validation.Valid
;
import
java.util.HashSet
;
import
java.util.HashSet
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.List
;
/**
/**
...
@@ -66,7 +63,7 @@ public class QuestionApi {
...
@@ -66,7 +63,7 @@ public class QuestionApi {
//将问题表单转换为问题对象
//将问题表单转换为问题对象
Question
question
=
new
Question
();
Question
question
=
new
Question
();
BeanUtils
.
copyProperties
(
questionForm
,
question
);
BeanUtils
.
copyProperties
(
questionForm
,
question
);
question
.
setCategoryId
(
Integer
.
valueOf
(
questionForm
.
getCategoryId
()
));
question
.
setCategoryId
(
questionForm
.
getCategoryId
(
));
//设置用户ID(问题发布者ID)
//设置用户ID(问题发布者ID)
question
.
setUserId
((
String
)
subject
.
getId
());
question
.
setUserId
((
String
)
subject
.
getId
());
...
@@ -222,10 +219,10 @@ public class QuestionApi {
...
@@ -222,10 +219,10 @@ public class QuestionApi {
*/
*/
@ApiOperation
(
"我参与的问答列表"
)
@ApiOperation
(
"我参与的问答列表"
)
@GetMapping
(
"/my/question/participated"
)
@GetMapping
(
"/my/question/participated"
)
public
Response
<
PageVO
<
Question
Reply
>>
getMyParticipateQuestions
(
@Valid
PageForm
pageForm
,
@CurrentSubject
Subject
subject
)
{
public
Response
<
PageVO
<
Question
>>
getMyParticipateQuestions
(
@Valid
PageForm
pageForm
,
@CurrentSubject
Subject
subject
)
{
//获取我的列表并返回
//获取我的列表并返回
IPage
<
Question
Reply
>
myParticipateQuestionReplyPage
=
questionService
.
getUserParticipateQuestionReply
Page
(
pageForm
.
getPage
(),
pageForm
.
getSize
(),
(
String
)
subject
.
getId
());
IPage
<
Question
>
questionPage
=
questionService
.
getUserParticipate
Page
(
pageForm
.
getPage
(),
pageForm
.
getSize
(),
(
String
)
subject
.
getId
());
PageVO
<
Question
Reply
>
questionReplyPageVO
=
new
PageVO
<>(
myParticipateQuestionReply
Page
);
PageVO
<
Question
>
questionReplyPageVO
=
new
PageVO
<>(
question
Page
);
return
Response
.
success
(
questionReplyPageVO
);
return
Response
.
success
(
questionReplyPageVO
);
}
}
...
@@ -254,10 +251,10 @@ public class QuestionApi {
...
@@ -254,10 +251,10 @@ public class QuestionApi {
@Anonymous
@Anonymous
@ApiOperation
(
"用户参与的问答列表"
)
@ApiOperation
(
"用户参与的问答列表"
)
@GetMapping
(
"/user/{userId}/question/participated"
)
@GetMapping
(
"/user/{userId}/question/participated"
)
public
Response
<
PageVO
<
Question
Reply
>>
getUserParticipateQuestions
(
@Valid
PageForm
pageForm
,
@PathVariable
(
"userId"
)
String
userId
)
{
public
Response
<
PageVO
<
Question
>>
getUserParticipateQuestions
(
@Valid
PageForm
pageForm
,
@PathVariable
(
"userId"
)
String
userId
)
{
//获取用户参与的问答列表并返回
//获取用户参与的问答列表并返回
IPage
<
Question
Reply
>
userParticipateQuestionReplyPage
=
questionService
.
getUserParticipateQuestionReply
Page
(
pageForm
.
getPage
(),
pageForm
.
getSize
(),
userId
);
IPage
<
Question
>
userParticipateQuestion
=
questionService
.
getUserParticipate
Page
(
pageForm
.
getPage
(),
pageForm
.
getSize
(),
userId
);
PageVO
<
Question
Reply
>
questionReplyPageVO
=
new
PageVO
<>(
userParticipateQuestionReplyPage
);
PageVO
<
Question
>
questionReplyPageVO
=
new
PageVO
<>(
userParticipateQuestion
);
return
Response
.
success
(
questionReplyPageVO
);
return
Response
.
success
(
questionReplyPageVO
);
}
}
...
...
src/main/java/cn/meteor/beyondclouds/modules/question/bean/QuestionDetails.java
View file @
1c3d1ee6
package
cn
.
meteor
.
beyondclouds
.
modules
.
question
.
bean
;
package
cn
.
meteor
.
beyondclouds
.
modules
.
question
.
bean
;
import
cn.meteor.beyondclouds.modules.question.entity.Question
;
import
cn.meteor.beyondclouds.modules.question.entity.Question
;
import
cn.meteor.beyondclouds.modules.tag.entity.Tag
;
import
cn.meteor.beyondclouds.modules.topic.entity.Topic
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.Data
;
import
java.util.List
;
/**
/**
* @author 胡学良
* @author 胡学良
* @since 2020/1/31
* @since 2020/1/31
...
@@ -17,16 +13,6 @@ import java.util.List;
...
@@ -17,16 +13,6 @@ import java.util.List;
@Data
@Data
public
class
QuestionDetails
extends
Question
{
public
class
QuestionDetails
extends
Question
{
@ApiModelProperty
(
"类别"
)
private
String
category
;
@ApiModelProperty
(
"详情"
)
@ApiModelProperty
(
"详情"
)
private
String
questionDetail
;
private
String
questionDetail
;
@ApiModelProperty
(
"标签"
)
private
List
<
Tag
>
tags
;
@ApiModelProperty
(
"话题"
)
private
List
<
Topic
>
topics
;
}
}
src/main/java/cn/meteor/beyondclouds/modules/question/entity/Question.java
View file @
1c3d1ee6
package
cn
.
meteor
.
beyondclouds
.
modules
.
question
.
entity
;
package
cn
.
meteor
.
beyondclouds
.
modules
.
question
.
entity
;
import
cn.meteor.beyondclouds.modules.tag.entity.Tag
;
import
cn.meteor.beyondclouds.modules.topic.entity.Topic
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
java.time.LocalDateTime
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
java.io.Serializabl
e
;
import
com.fasterxml.jackson.annotation.JsonInclud
e
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.EqualsAndHashCode
;
import
lombok.experimental.Accessors
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.List
;
/**
/**
* <p>
* <p>
* 问题表
* 问题表
...
@@ -35,15 +41,26 @@ public class Question implements Serializable {
...
@@ -35,15 +41,26 @@ public class Question implements Serializable {
@ApiModelProperty
(
value
=
"问题类别ID"
)
@ApiModelProperty
(
value
=
"问题类别ID"
)
private
Integer
categoryId
;
private
Integer
categoryId
;
@ApiModelProperty
(
value
=
"问题类别名称"
)
private
String
category
;
@ApiModelProperty
(
value
=
"问题标题"
)
@ApiModelProperty
(
value
=
"问题标题"
)
private
String
questionTitle
;
private
String
questionTitle
;
@ApiModelProperty
(
value
=
"问题摘要"
)
@ApiModelProperty
(
value
=
"问题摘要"
)
private
String
questionAbstract
;
private
String
questionAbstract
;
private
LocalDateTime
createTime
;
private
Date
createTime
;
private
Date
updateTime
;
@JsonInclude
(
JsonInclude
.
Include
.
NON_NULL
)
@TableField
(
exist
=
false
)
private
List
<
Tag
>
tags
;
private
LocalDateTime
updateTime
;
@JsonInclude
(
JsonInclude
.
Include
.
NON_NULL
)
@TableField
(
exist
=
false
)
private
List
<
Topic
>
topics
;
}
}
src/main/java/cn/meteor/beyondclouds/modules/question/form/QuestionForm.java
View file @
1c3d1ee6
...
@@ -2,11 +2,10 @@ package cn.meteor.beyondclouds.modules.question.form;
...
@@ -2,11 +2,10 @@ package cn.meteor.beyondclouds.modules.question.form;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.Data
;
import
lombok.Data
;
import
javax.validation.constraints.Max
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
import
javax.validation.constraints.Size
;
import
javax.validation.constraints.Size
;
import
java.util.List
;
import
java.util.List
;
...
@@ -21,8 +20,8 @@ public class QuestionForm {
...
@@ -21,8 +20,8 @@ public class QuestionForm {
private
static
final
long
serialVersionUID
=
1L
;
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
"类别ID"
)
@ApiModelProperty
(
"类别ID"
)
@Not
Empty
(
message
=
"问题类别ID不能为空"
)
@Not
Null
(
message
=
"问题类别ID不能为空"
)
private
String
categoryId
;
private
Integer
categoryId
;
@ApiModelProperty
(
"标题"
)
@ApiModelProperty
(
"标题"
)
@NotEmpty
(
message
=
"问题标题不能为空"
)
@NotEmpty
(
message
=
"问题标题不能为空"
)
...
...
src/main/java/cn/meteor/beyondclouds/modules/question/mapper/QuestionMapper.java
View file @
1c3d1ee6
package
cn
.
meteor
.
beyondclouds
.
modules
.
question
.
mapper
;
package
cn
.
meteor
.
beyondclouds
.
modules
.
question
.
mapper
;
import
cn.meteor.beyondclouds.modules.question.entity.Question
;
import
cn.meteor.beyondclouds.modules.question.entity.Question
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.toolkit.Constants
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/**
/**
* <p>
* <p>
...
@@ -12,5 +18,19 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
...
@@ -12,5 +18,19 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @since 2020-01-30
* @since 2020-01-30
*/
*/
public
interface
QuestionMapper
extends
BaseMapper
<
Question
>
{
public
interface
QuestionMapper
extends
BaseMapper
<
Question
>
{
/**
* 根据查询条件分页查询问题并获取标签
* @param page
* @param queryWrapper
* @return
*/
IPage
<
Question
>
selectPageWithTags
(
IPage
<
Question
>
page
,
@Param
(
Constants
.
WRAPPER
)
QueryWrapper
<?>
queryWrapper
);
/**
* 批量查询并获取标签
* @param questionIds
* @return
*/
List
<
Question
>
listByIdsWithTags
(
@Param
(
"questionIds"
)
List
<
String
>
questionIds
);
}
}
src/main/java/cn/meteor/beyondclouds/modules/question/mapper/QuestionReplyMapper.java
View file @
1c3d1ee6
...
@@ -2,6 +2,8 @@ package cn.meteor.beyondclouds.modules.question.mapper;
...
@@ -2,6 +2,8 @@ package cn.meteor.beyondclouds.modules.question.mapper;
import
cn.meteor.beyondclouds.modules.question.entity.QuestionReply
;
import
cn.meteor.beyondclouds.modules.question.entity.QuestionReply
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
org.apache.ibatis.annotations.Select
;
/**
/**
* <p>
* <p>
...
@@ -13,4 +15,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
...
@@ -13,4 +15,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
*/
public
interface
QuestionReplyMapper
extends
BaseMapper
<
QuestionReply
>
{
public
interface
QuestionReplyMapper
extends
BaseMapper
<
QuestionReply
>
{
/**
* 获取参与的问题ID的分页
* @param page
* @param userId
* @return
*/
@Select
(
"select DISTINCT(question_id) from (SELECT * from question_reply where user_id=#{userId} order by create_time desc) t"
)
IPage
<
String
>
participateQuestionIdPage
(
IPage
<
String
>
page
,
String
userId
);
}
}
src/main/java/cn/meteor/beyondclouds/modules/question/mapper/xml/QuestionMapper.xml
View file @
1c3d1ee6
...
@@ -2,4 +2,56 @@
...
@@ -2,4 +2,56 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"cn.meteor.beyondclouds.modules.question.mapper.QuestionMapper"
>
<mapper
namespace=
"cn.meteor.beyondclouds.modules.question.mapper.QuestionMapper"
>
<resultMap
id=
"blogWithTagsResultMap"
type=
"cn.meteor.beyondclouds.modules.question.entity.Question"
>
<id
property=
"questionId"
column=
"question_id"
/>
<result
property=
"userId"
column=
"user_id"
/>
<result
property=
"categoryId"
column=
"category_id"
/>
<result
property=
"category"
column=
"category"
/>
<result
property=
"questionTitle"
column=
"question_title"
/>
<result
property=
"questionAbstract"
column=
"question_abstract"
/>
<result
property=
"createTime"
column=
"create_time"
/>
<result
property=
"updateTime"
column=
"update_time"
/>
<collection
property=
"tags"
ofType=
"cn.meteor.beyondclouds.modules.tag.entity.Tag"
>
<id
property=
"tagId"
column=
"tag_id"
/>
<result
property=
"tagName"
column=
"tag_name"
/>
<result
property=
"tagType"
column=
"tag_type"
/>
</collection>
</resultMap>
<select
id=
"selectPageWithTags"
resultMap=
"blogWithTagsResultMap"
>
select
q.*,
t.tag_id,
t.tag_name,
t.tag_type,
t.create_time,
t.update_time
from question q
left join question_tag qt
on q.question_id = qt.question_id
left join tag t
on t.tag_id = qt.tag_id
<if
test=
"ew != null and ew.sqlSegment != null"
>
where ${ew.sqlSegment}
</if>
</select>
<select
id=
"listByIdsWithTags"
resultMap=
"blogWithTagsResultMap"
>
select
q.*,
t.tag_id,
t.tag_name,
t.tag_type,
t.create_time,
t.update_time
from question q
left join question_tag qt
on q.question_id = qt.question_id
left join tag t
on t.tag_id = qt.tag_id
where q.question_id in
<foreach
collection=
"questionIds"
item=
"questionId"
index=
"index"
open=
"("
close=
")"
separator=
","
>
#{questionId}
</foreach>
</select>
</mapper>
</mapper>
src/main/java/cn/meteor/beyondclouds/modules/question/service/IQuestionReplyService.java
View file @
1c3d1ee6
...
@@ -4,7 +4,6 @@ import cn.meteor.beyondclouds.modules.question.entity.QuestionReply;
...
@@ -4,7 +4,6 @@ import cn.meteor.beyondclouds.modules.question.entity.QuestionReply;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionReplyServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionReplyServiceException
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
io.swagger.models.auth.In
;
/**
/**
* <p>
* <p>
...
@@ -51,4 +50,12 @@ public interface IQuestionReplyService extends IService<QuestionReply> {
...
@@ -51,4 +50,12 @@ public interface IQuestionReplyService extends IService<QuestionReply> {
* @throws QuestionReplyServiceException 问题回复业务异常
* @throws QuestionReplyServiceException 问题回复业务异常
*/
*/
void
deleteReply
(
String
replyId
,
String
userId
)
throws
QuestionReplyServiceException
;
void
deleteReply
(
String
replyId
,
String
userId
)
throws
QuestionReplyServiceException
;
/**
* 获取用户参加过的问题的ID分页列表
* @param page
* @param userId
* @return
*/
IPage
<
String
>
participateQuestionIdPage
(
IPage
<
String
>
page
,
String
userId
);
}
}
src/main/java/cn/meteor/beyondclouds/modules/question/service/IQuestionService.java
View file @
1c3d1ee6
...
@@ -2,8 +2,6 @@ package cn.meteor.beyondclouds.modules.question.service;
...
@@ -2,8 +2,6 @@ package cn.meteor.beyondclouds.modules.question.service;
import
cn.meteor.beyondclouds.modules.question.bean.QuestionDetails
;
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.QuestionReply
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionReplyServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionTagServiceException
;
import
cn.meteor.beyondclouds.modules.question.exception.QuestionTagServiceException
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
...
@@ -84,6 +82,6 @@ public interface IQuestionService extends IService<Question> {
...
@@ -84,6 +82,6 @@ public interface IQuestionService extends IService<Question> {
* @param userId 用户ID
* @param userId 用户ID
* @return 分页对象
* @return 分页对象
*/
*/
IPage
<
Question
Reply
>
getUserParticipateQuestionReply
Page
(
Integer
pageNumber
,
Integer
pageSize
,
String
userId
);
IPage
<
Question
>
getUserParticipate
Page
(
Integer
pageNumber
,
Integer
pageSize
,
String
userId
);
}
}
src/main/java/cn/meteor/beyondclouds/modules/question/service/impl/QuestionReplyServiceImpl.java
View file @
1c3d1ee6
...
@@ -18,6 +18,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
...
@@ -18,6 +18,8 @@ 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
;
import
java.util.List
;
/**
/**
* <p>
* <p>
* 问题回复表 服务实现类
* 问题回复表 服务实现类
...
@@ -35,12 +37,19 @@ public class QuestionReplyServiceImpl extends ServiceImpl<QuestionReplyMapper, Q
...
@@ -35,12 +37,19 @@ public class QuestionReplyServiceImpl extends ServiceImpl<QuestionReplyMapper, Q
private
IQuestionReplyCommentService
questionReplyCommentService
;
private
IQuestionReplyCommentService
questionReplyCommentService
;
private
QuestionReplyMapper
questionReplyMapper
;
@Autowired
@Autowired
public
void
setQuestionService
(
IQuestionService
questionService
)
{
public
void
setQuestionService
(
IQuestionService
questionService
)
{
this
.
questionService
=
questionService
;
this
.
questionService
=
questionService
;
}
}
@Autowired
@Autowired
public
void
setQuestionReplyMapper
(
QuestionReplyMapper
questionReplyMapper
)
{
this
.
questionReplyMapper
=
questionReplyMapper
;
}
@Autowired
public
void
setQuestionReplyCommentService
(
IQuestionReplyCommentService
questionReplyCommentService
)
{
public
void
setQuestionReplyCommentService
(
IQuestionReplyCommentService
questionReplyCommentService
)
{
this
.
questionReplyCommentService
=
questionReplyCommentService
;
this
.
questionReplyCommentService
=
questionReplyCommentService
;
}
}
...
@@ -134,4 +143,9 @@ public class QuestionReplyServiceImpl extends ServiceImpl<QuestionReplyMapper, Q
...
@@ -134,4 +143,9 @@ public class QuestionReplyServiceImpl extends ServiceImpl<QuestionReplyMapper, Q
questionReplyCommentService
.
remove
(
QuestionUtils
.
getWrapper
(
"reply_id"
,
replyId
));
questionReplyCommentService
.
remove
(
QuestionUtils
.
getWrapper
(
"reply_id"
,
replyId
));
removeById
(
replyId
);
removeById
(
replyId
);
}
}
@Override
public
IPage
<
String
>
participateQuestionIdPage
(
IPage
<
String
>
page
,
String
userId
)
{
return
questionReplyMapper
.
participateQuestionIdPage
(
page
,
userId
);
}
}
}
src/main/java/cn/meteor/beyondclouds/modules/question/service/impl/QuestionServiceImpl.java
View file @
1c3d1ee6
...
@@ -9,6 +9,7 @@ import cn.meteor.beyondclouds.modules.question.mapper.QuestionMapper;
...
@@ -9,6 +9,7 @@ import cn.meteor.beyondclouds.modules.question.mapper.QuestionMapper;
import
cn.meteor.beyondclouds.modules.question.service.*
;
import
cn.meteor.beyondclouds.modules.question.service.*
;
import
cn.meteor.beyondclouds.modules.question.util.QuestionUtils
;
import
cn.meteor.beyondclouds.modules.question.util.QuestionUtils
;
import
cn.meteor.beyondclouds.modules.tag.entity.Tag
;
import
cn.meteor.beyondclouds.modules.tag.entity.Tag
;
import
cn.meteor.beyondclouds.modules.tag.service.ITagService
;
import
cn.meteor.beyondclouds.modules.topic.entity.Topic
;
import
cn.meteor.beyondclouds.modules.topic.entity.Topic
;
import
cn.meteor.beyondclouds.modules.topic.entity.TopicReference
;
import
cn.meteor.beyondclouds.modules.topic.entity.TopicReference
;
import
cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService
;
import
cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService
;
...
@@ -22,12 +23,13 @@ import org.springframework.beans.BeanUtils;
...
@@ -22,12 +23,13 @@ import org.springframework.beans.BeanUtils;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.util.StringUtils
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.HashSet
;
import
java.util.HashSet
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.List
;
import
java.util.stream.Collectors
;
/**
/**
* <p>
* <p>
...
@@ -58,12 +60,17 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -58,12 +60,17 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
private
ITopicReferenceService
topicReferenceService
;
private
ITopicReferenceService
topicReferenceService
;
private
ITagService
tagService
;
private
QuestionMapper
questionMapper
;
@Autowired
@Autowired
public
QuestionServiceImpl
(
IQuestionExtService
questionExtService
,
IQuestionCategoryService
questionCategoryService
,
ITopicService
topicService
,
ITopicReferenceService
topicReferenceService
)
{
public
QuestionServiceImpl
(
IQuestionExtService
questionExtService
,
IQuestionCategoryService
questionCategoryService
,
ITopicService
topicService
,
ITopicReferenceService
topicReferenceService
,
QuestionMapper
questionMapper
)
{
this
.
questionExtService
=
questionExtService
;
this
.
questionExtService
=
questionExtService
;
this
.
questionCategoryService
=
questionCategoryService
;
this
.
questionCategoryService
=
questionCategoryService
;
this
.
topicService
=
topicService
;
this
.
topicService
=
topicService
;
this
.
topicReferenceService
=
topicReferenceService
;
this
.
topicReferenceService
=
topicReferenceService
;
this
.
questionMapper
=
questionMapper
;
}
}
@Autowired
@Autowired
...
@@ -81,9 +88,14 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -81,9 +88,14 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
this
.
questionReplyCommentService
=
questionReplyCommentService
;
this
.
questionReplyCommentService
=
questionReplyCommentService
;
}
}
@Autowired
public
void
setTagService
(
ITagService
tagService
)
{
this
.
tagService
=
tagService
;
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
@Override
public
void
postQuestion
(
Question
question
,
String
questionDetail
,
HashSet
<
String
>
tags
,
HashSet
<
String
>
topicIds
)
throws
QuestionServiceException
{
public
void
postQuestion
(
Question
question
,
String
questionDetail
,
HashSet
<
String
>
tag
Id
s
,
HashSet
<
String
>
topicIds
)
throws
QuestionServiceException
{
//1.检查问题标题是否以?结尾
//1.检查问题标题是否以?结尾
if
(!
question
.
getQuestionTitle
().
endsWith
(
QUESTION_END_EN
)
&&
!
question
.
getQuestionTitle
().
endsWith
(
QUESTION_END_CN
)){
if
(!
question
.
getQuestionTitle
().
endsWith
(
QUESTION_END_EN
)
&&
!
question
.
getQuestionTitle
().
endsWith
(
QUESTION_END_CN
)){
throw
new
QuestionServiceException
(
QuestionErrorCode
.
QUESTION_END_ERROR
);
throw
new
QuestionServiceException
(
QuestionErrorCode
.
QUESTION_END_ERROR
);
...
@@ -96,6 +108,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -96,6 +108,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
}
}
//3.保存问题信息
//3.保存问题信息
question
.
setCategory
(
questionCategory
.
getCategory
());
save
(
question
);
save
(
question
);
//4.保存问题扩展信息
//4.保存问题扩展信息
...
@@ -104,30 +117,41 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -104,30 +117,41 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
questionExt
.
setQuestionDetail
(
questionDetail
);
questionExt
.
setQuestionDetail
(
questionDetail
);
questionExtService
.
save
(
questionExt
);
questionExtService
.
save
(
questionExt
);
//5.保存问题标签信息
//5.判断是否引用话题
questionTagService
.
saveQuestionTag
(
tags
,
question
.
getQuestionId
());
if
(!
CollectionUtils
.
isEmpty
(
topicIds
))
{
// 获取要引用的话题,不正确的话题ID会被自动过滤
//6.保存话题引用信息并更新话题引用次数
List
<
String
>
existsTopicIds
=
topicService
.
listByIds
(
topicIds
).
stream
().
map
(
Topic:
:
getTopicId
).
collect
(
Collectors
.
toList
());
Iterator
<
String
>
iterator
=
topicIds
.
iterator
();
if
(!
CollectionUtils
.
isEmpty
(
existsTopicIds
))
{
TopicReference
topicReference
=
null
;
List
<
TopicReference
>
topicReferenceList
=
new
ArrayList
<>();
while
(
iterator
.
hasNext
())
{
for
(
String
topicId
:
existsTopicIds
)
{
Topic
topic
=
topicService
.
getById
(
iterator
.
next
());
TopicReference
topicReference
=
new
TopicReference
();
if
(
topic
==
null
)
{
topicReference
.
setTopicId
(
topicId
);
continue
;
topicReference
.
setReferencerId
(
question
.
getQuestionId
());
topicReference
.
setReferencerType
(
2
);
topicReferenceList
.
add
(
topicReference
);
}
// 批量保存
topicReferenceService
.
saveBatch
(
topicReferenceList
);
// 更新话题引用次数
existsTopicIds
.
forEach
(
topicId
->
{
topicService
.
increaseReferenceCount
(
topicId
,
1
);
});
}
}
}
//保存话题引用信息
//5.判断是否引用标签
topicReference
=
new
TopicReference
();
if
(!
CollectionUtils
.
isEmpty
(
tagIds
))
{
topicReference
.
setTopicId
(
topic
.
getTopicId
());
List
<
String
>
existsTagIds
=
tagService
.
listByIds
(
tagIds
).
stream
().
map
(
Tag:
:
getTagId
).
collect
(
Collectors
.
toList
());
topicReference
.
setReferencerId
(
question
.
getQuestionId
());
if
(!
CollectionUtils
.
isEmpty
(
existsTagIds
))
{
topicReference
.
setReferencerType
(
2
);
List
<
QuestionTag
>
questionTagList
=
new
ArrayList
<>();
topicReferenceService
.
save
(
topicReference
);
for
(
String
tagId
:
existsTagIds
)
{
QuestionTag
questionTag
=
new
QuestionTag
();
//更新话题引用次数
questionTag
.
setQuestionId
(
question
.
getQuestionId
());
UpdateWrapper
<
Topic
>
updateWrapper
=
new
UpdateWrapper
<>();
questionTag
.
setTagId
(
tagId
);
updateWrapper
.
set
(
"reference_count"
,
topic
.
getReferenceCount
()+
1
)
questionTagList
.
add
(
questionTag
);
.
eq
(
"topic_id"
,
topic
.
getTopicId
());
}
topicService
.
update
(
updateWrapper
);
questionTagService
.
saveBatch
(
questionTagList
);
}
}
}
}
}
...
@@ -170,7 +194,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -170,7 +194,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
}
}
@Override
@Override
public
void
updateQuestion
(
Question
question
,
String
questionDetail
,
HashSet
<
String
>
tags
,
HashSet
<
String
>
topicIds
)
throws
QuestionServiceException
{
public
void
updateQuestion
(
Question
question
,
String
questionDetail
,
HashSet
<
String
>
tag
Id
s
,
HashSet
<
String
>
topicIds
)
throws
QuestionServiceException
{
//1.判断自己是否发布过此问题
//1.判断自己是否发布过此问题
QueryWrapper
<
Question
>
questionQueryWrapper
=
new
QueryWrapper
<>();
QueryWrapper
<
Question
>
questionQueryWrapper
=
new
QueryWrapper
<>();
questionQueryWrapper
.
eq
(
"question_id"
,
question
.
getQuestionId
())
questionQueryWrapper
.
eq
(
"question_id"
,
question
.
getQuestionId
())
...
@@ -192,6 +216,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -192,6 +216,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
}
}
//2.更新问题信息
//2.更新问题信息
question
.
setCategory
(
questionCategory
.
getCategory
());
update
(
question
,
QuestionUtils
.
getWrapper
(
"question_id"
,
question
.
getQuestionId
()));
update
(
question
,
QuestionUtils
.
getWrapper
(
"question_id"
,
question
.
getQuestionId
()));
//3.更新问题扩展信息
//3.更新问题扩展信息
...
@@ -204,36 +229,52 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -204,36 +229,52 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
questionExtService
.
update
(
questionExt
,
updateWrapper
);
questionExtService
.
update
(
questionExt
,
updateWrapper
);
}
}
//4.更新问题标签
// 删除旧话题引用
questionTagService
.
remove
(
QuestionUtils
.
getWrapper
(
"question_id"
,
question
.
getQuestionId
()));
QueryWrapper
<
TopicReference
>
topicReferenceQueryWrapper
=
new
QueryWrapper
<>();
questionTagService
.
saveQuestionTag
(
tags
,
question
.
getQuestionId
());
topicReferenceQueryWrapper
.
eq
(
"referencer_id"
,
question
.
getQuestionId
());
topicReferenceService
.
remove
(
topicReferenceQueryWrapper
);
//5.更新话题
//5.判断是否引用话题
if
(!
CollectionUtils
.
isEmpty
(
topicIds
))
{
// 获取要引用的话题,不正确的话题ID会被自动过滤
List
<
String
>
existsTopicIds
=
topicService
.
listByIds
(
topicIds
).
stream
().
map
(
Topic:
:
getTopicId
).
collect
(
Collectors
.
toList
());
if
(!
CollectionUtils
.
isEmpty
(
existsTopicIds
))
{
List
<
TopicReference
>
topicReferenceList
=
new
ArrayList
<>();
for
(
String
topicId
:
existsTopicIds
)
{
TopicReference
topicReference
=
new
TopicReference
();
topicReference
.
setTopicId
(
topicId
);
topicReference
.
setReferencerId
(
question
.
getQuestionId
());
topicReference
.
setReferencerType
(
2
);
topicReferenceList
.
add
(
topicReference
);
}
// 批量保存
topicReferenceService
.
saveBatch
(
topicReferenceList
);
// 更新话题引用次数
existsTopicIds
.
forEach
(
topicId
->
{
topicService
.
increaseReferenceCount
(
topicId
,
1
);
});
}
}
//删除以前的话题信息
topicReferenceService
.
remove
(
QuestionUtils
.
getWrapper
(
"referencer_id"
,
question
.
getQuestionId
()));
//保存更新后的话题信息
//5.判断是否引用标签
Iterator
<
String
>
iterator
=
topicIds
.
iterator
();
// 删除旧标签
TopicReference
topicReference
=
null
;
QueryWrapper
<
QuestionTag
>
questionTagQueryWrapper
=
new
QueryWrapper
<>();
while
(
iterator
.
hasNext
())
{
questionTagQueryWrapper
.
eq
(
"question_id"
,
question
.
getQuestionId
());
Topic
topic
=
topicService
.
getById
(
iterator
.
next
());
questionTagService
.
remove
(
questionTagQueryWrapper
);
if
(
topic
==
null
)
{
continue
;
if
(!
CollectionUtils
.
isEmpty
(
tagIds
))
{
List
<
String
>
existsTagIds
=
tagService
.
listByIds
(
tagIds
).
stream
().
map
(
Tag:
:
getTagId
).
collect
(
Collectors
.
toList
());
if
(!
CollectionUtils
.
isEmpty
(
existsTagIds
))
{
List
<
QuestionTag
>
questionTagList
=
new
ArrayList
<>();
for
(
String
tagId
:
existsTagIds
)
{
QuestionTag
questionTag
=
new
QuestionTag
();
questionTag
.
setQuestionId
(
question
.
getQuestionId
());
questionTag
.
setTagId
(
tagId
);
questionTagList
.
add
(
questionTag
);
}
questionTagService
.
saveBatch
(
questionTagList
);
}
}
//保存话题引用信息
topicReference
=
new
TopicReference
();
topicReference
.
setTopicId
(
topic
.
getTopicId
());
topicReference
.
setReferencerId
(
question
.
getQuestionId
());
topicReference
.
setReferencerType
(
2
);
topicReferenceService
.
save
(
topicReference
);
//更新话题引用次数
UpdateWrapper
<
Topic
>
updateWrapper
=
new
UpdateWrapper
<>();
updateWrapper
.
set
(
"reference_count"
,
topic
.
getReferenceCount
()+
1
)
.
eq
(
"topic_id"
,
topic
.
getTopicId
());
topicService
.
update
(
updateWrapper
);
}
}
}
}
...
@@ -252,6 +293,11 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -252,6 +293,11 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
//4.获取问题标签
//4.获取问题标签
List
<
Tag
>
tags
=
questionTagService
.
getQuestionTags
(
questionId
);
List
<
Tag
>
tags
=
questionTagService
.
getQuestionTags
(
questionId
);
if
(
CollectionUtils
.
isEmpty
(
tags
))
{
question
.
setTags
(
List
.
of
());
}
else
{
question
.
setTags
(
tags
);
}
//5.获取话题详情
//5.获取话题详情
List
<
TopicReference
>
references
=
topicReferenceService
.
list
(
QuestionUtils
.
getWrapper
(
"referencer_id"
,
question
.
getQuestionId
()));
List
<
TopicReference
>
references
=
topicReferenceService
.
list
(
QuestionUtils
.
getWrapper
(
"referencer_id"
,
question
.
getQuestionId
()));
...
@@ -259,14 +305,16 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -259,14 +305,16 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
for
(
TopicReference
topicReference
:
references
)
{
for
(
TopicReference
topicReference
:
references
)
{
topics
.
add
(
topicService
.
getById
(
topicReference
.
getTopicId
()));
topics
.
add
(
topicService
.
getById
(
topicReference
.
getTopicId
()));
}
}
if
(
CollectionUtils
.
isEmpty
(
topics
))
{
question
.
setTopics
(
List
.
of
());
}
else
{
question
.
setTopics
(
topics
);
}
//5.生成问题详情对象
//5.生成问题详情对象
QuestionDetails
questionDetails
=
new
QuestionDetails
();
QuestionDetails
questionDetails
=
new
QuestionDetails
();
BeanUtils
.
copyProperties
(
question
,
questionDetails
);
BeanUtils
.
copyProperties
(
question
,
questionDetails
);
questionDetails
.
setQuestionDetail
(
questionExt
.
getQuestionDetail
());
questionDetails
.
setQuestionDetail
(
questionExt
.
getQuestionDetail
());
questionDetails
.
setTags
(
tags
);
questionDetails
.
setCategory
(
questionCategoryService
.
getById
(
question
.
getCategoryId
()).
getCategory
());
questionDetails
.
setTopics
(
topics
);
return
questionDetails
;
return
questionDetails
;
}
}
...
@@ -274,18 +322,33 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
...
@@ -274,18 +322,33 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
@Override
@Override
public
IPage
<
Question
>
getQuestionPage
(
Integer
pageNumber
,
Integer
pageSize
)
{
public
IPage
<
Question
>
getQuestionPage
(
Integer
pageNumber
,
Integer
pageSize
)
{
IPage
<
Question
>
page
=
new
Page
<>(
pageNumber
,
pageSize
);
IPage
<
Question
>
page
=
new
Page
<>(
pageNumber
,
pageSize
);
return
page
(
page
);
return
questionMapper
.
selectPageWithTags
(
page
,
null
);
}
}
@Override
@Override
public
IPage
<
Question
>
getUserQuestionPage
(
Integer
pageNumber
,
Integer
pageSize
,
String
userId
)
{
public
IPage
<
Question
>
getUserQuestionPage
(
Integer
pageNumber
,
Integer
pageSize
,
String
userId
)
{
IPage
<
Question
>
page
=
new
Page
<>(
pageNumber
,
pageSize
);
IPage
<
Question
>
page
=
new
Page
<>(
pageNumber
,
pageSize
);
return
page
(
page
,
QuestionUtils
.
getWrapper
(
"user_id"
,
userId
));
QueryWrapper
<
Question
>
questionQueryWrapper
=
new
QueryWrapper
<>();
questionQueryWrapper
.
eq
(
"q.user_id"
,
userId
);
return
questionMapper
.
selectPageWithTags
(
page
,
questionQueryWrapper
);
}
}
@Override
@Override
public
IPage
<
QuestionReply
>
getUserParticipateQuestionReplyPage
(
Integer
pageNumber
,
Integer
pageSize
,
String
userId
)
{
public
IPage
<
Question
>
getUserParticipatePage
(
Integer
pageNumber
,
Integer
pageSize
,
String
userId
)
{
IPage
<
QuestionReply
>
page
=
new
Page
<>(
pageNumber
,
pageSize
);
IPage
<
String
>
page
=
new
Page
<>(
pageNumber
,
pageSize
);
return
questionReplyService
.
page
(
page
,
QuestionUtils
.
getWrapper
(
"user_id"
,
userId
));
IPage
<
Question
>
questionPage
=
new
Page
<>(
pageNumber
,
pageSize
);
questionReplyService
.
participateQuestionIdPage
(
page
,
userId
);
questionPage
.
setTotal
(
page
.
getPages
());
questionPage
.
setSize
(
page
.
getSize
());
questionPage
.
setCurrent
(
page
.
getCurrent
());
List
<
String
>
questionIds
=
page
.
getRecords
();
if
(!
CollectionUtils
.
isEmpty
(
questionIds
))
{
questionPage
.
setRecords
(
questionMapper
.
listByIdsWithTags
(
questionIds
));
}
else
{
questionPage
.
setRecords
(
List
.
of
());
}
return
questionPage
;
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment