完成评论删除和评论字数长度校验

This commit is contained in:
柏码の讲师 2023-10-28 02:14:25 +08:00
parent be982beb9e
commit 0bc34bd784
5 changed files with 47 additions and 8 deletions

View File

@ -106,4 +106,11 @@ public class ForumController {
@RequestParam @Min(0) int page) {
return RestBean.success(topicService.comments(tid, page + 1));
}
@GetMapping("/delete-comment")
public RestBean<Void> deleteComment(@RequestParam @Min(0) int id,
@RequestAttribute(Const.ATTR_USER_ID) int uid) {
topicService.deleteComment(id, uid);
return RestBean.success();
}
}

View File

@ -24,5 +24,6 @@ public interface TopicService extends IService<Topic> {
void interact(Interact interact, boolean state);
List<TopicPreviewVO> listCollectTopic(int uid);
String createComment(AddCommentVO vo, int uid);
void deleteComment(int id, int uid);
List<CommentVO> comments(int tid, int pageNumber);
}

View File

@ -74,7 +74,7 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
@Override
public String createTopic(int uid, TopicCreateVO vo) {
if(!this.textLimitCheck(vo.getContent()))
if(!this.textLimitCheck(vo.getContent(), 20000))
return "文章长度过大,发文失败!";
String key = Const.FORUM_TOPIC_CREATE_COUNTER + uid;
if(!flowUtils.limitPeriodCounterCheck(key, 3, 3600))
@ -161,6 +161,8 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
@Override
public String createComment(AddCommentVO vo, int uid) {
if(!this.textLimitCheck(JSONObject.parseObject(vo.getContent()), 2000))
return "评论长度过大,发表失败!";
String key = Const.FORUM_TOPIC_COMMENT_COUNTER + uid;
if(!flowUtils.limitPeriodCounterCheck(key, 2, 60))
return "发表评论频繁,请稍后再试!";
@ -172,6 +174,14 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
return null;
}
@Override
public void deleteComment(int id, int uid) {
commentMapper.delete(Wrappers.<TopicComment>query()
.eq("id", id)
.eq("uid", uid)
);
}
@Override
public List<CommentVO> comments(int tid, int pageNumber) {
Page<TopicComment> comments = Page.of(pageNumber, 10);
@ -279,12 +289,12 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
}
}
private boolean textLimitCheck(JSONObject object) {
private boolean textLimitCheck(JSONObject object, int limit) {
if(object == null) return false;
long length = 0;
for (Object op : object.getJSONArray("ops")) {
length += JSONObject.from(op).getString("insert").length();
}
return length <= 20000;
return length <= limit;
}
}

View File

@ -19,6 +19,10 @@ function init() {
}
function submitComment() {
if(deltaToText(content).length > 2000) {
ElMessage.warning('评论字数长度已经超出最大限制,请缩减评论内容!')
return
}
post('/api/forum/add-comment', {
tid: props.tid,
content: JSON.stringify(content.value),
@ -29,11 +33,17 @@ function submitComment() {
})
}
function deltaToSimpleText(delta) {
function deltaToText(delta) {
if(!delta?.ops) return ""
let str = ''
for (let op of JSON.parse(delta).ops) {
str += op.insert
for (let ops of delta.ops) {
str += ops.insert
}
return str.replace(/\s/g, "")
}
function deltaToSimpleText(delta) {
let str = deltaToText(JSON.parse(delta))
if(str.length > 35) str = str.substring(0, 35) + "..."
return str
}
@ -52,7 +62,10 @@ function deltaToSimpleText(delta) {
<quill-editor style="height: 100px" v-model:content="content"
placeholder="请发表友善的评论,不要使用脏话骂人,都是大学生素质高一点"/>
</div>
<div style="margin-top: 10px;text-align: right">
<div style="margin-top: 10px;display: flex">
<div style="flex: 1;font-size: 13px;color: grey">
字数统计: {{deltaToText(content).length}}最大支持2000字
</div>
<el-button @click="submitComment" type="success" plain>发表评论</el-button>
</div>
</div>

View File

@ -77,6 +77,13 @@ function loadComments(page){
topic.page = page + 1
get(`/api/forum/comments?tid=${tid}&page=${page}`, data => topic.comments = data)
}
function deleteComment(id) {
get(`/api/forum/delete-comment?id=${id}`, () => {
ElMessage.success('删除评论成功!')
loadComments(topic.page - 1)
})
}
</script>
<template>
@ -176,6 +183,7 @@ function loadComments(page){
<el-link :icon="ChatSquare" @click="comment.show = true;comment.quote = item"
type="info">&nbsp;回复评论</el-link>
<el-link :icon="Delete" type="danger" v-if="item.user.id === store.user.id"
@click="deleteComment(item.id)"
style="margin-left: 20px">&nbsp;删除评论</el-link>
</div>
</div>
@ -194,7 +202,7 @@ function loadComments(page){
:submit="updateTopic"/>
<topic-comment-editor :show="comment.show" @close="comment.show = false"
:quote="comment.quote" :tid="tid"
@comment="comment.show = false;loadComments(Math.min(1, Math.ceil(topic.data.commentCount / 10)))"/>
@comment="comment.show = false;loadComments(Math.ceil(topic.data.commentCount / 10) - 1)"/>
<div class="add-comment" @click="comment.show = true">
<el-icon><Plus /></el-icon>
</div>