Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
L
learn-online-pc
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
learn-online-pc
Commits
4e7a87ff
提交
4e7a87ff
authored
2月 21, 2022
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 优化课程讨论模块
上级
b3dad309
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
243 行增加
和
108 行删除
+243
-108
en.json
src/modules/discuss/assets/languages/en.json
+3
-3
zh-CN.json
src/modules/discuss/assets/languages/zh-CN.json
+4
-3
answerItem.vue
src/modules/discuss/components/answerItem.vue
+68
-42
commentList.vue
src/modules/discuss/components/commentList.vue
+82
-0
replyDetailItem.vue
src/modules/discuss/components/replyDetailItem.vue
+0
-42
replyItem.vue
src/modules/discuss/components/replyItem.vue
+86
-18
discussDetail.vue
src/modules/discuss/src/discussDetail.vue
+0
-0
discussDetail.vue
src/pages/learn/discussDetail.vue
+0
-0
没有找到文件。
src/modules/discuss/assets/languages/en.json
浏览文件 @
4e7a87ff
...
...
@@ -14,7 +14,8 @@
"send"
:
"Send"
,
"noAnswer"
:
"No answer"
,
"deleteSuccess"
:
"Delete success"
,
"answering"
:
"Answer"
"answering"
:
"Answer"
,
"sendAnswer"
:
"Send"
}
}
}
\ No newline at end of file
}
src/modules/discuss/assets/languages/zh-CN.json
浏览文件 @
4e7a87ff
...
...
@@ -8,13 +8,14 @@
"DiscussDetail"
:
{
"title"
:
"问题详情"
,
"like"
:
"点赞"
,
"discuss"
:
"
讨
论"
,
"discuss"
:
"
评
论"
,
"reply"
:
"回复"
,
"delete"
:
"删除"
,
"send"
:
"发
送
"
,
"send"
:
"发
布
"
,
"noAnswer"
:
"暂无回答"
,
"deleteSuccess"
:
"删除成功"
,
"answering"
:
"回答问题"
"answering"
:
"回答问题"
,
"sendAnswer"
:
"发布回答"
}
}
}
src/modules/discuss/components/answerItem.vue
浏览文件 @
4e7a87ff
<
template
>
<div>
<div
class=
"ask"
>
<div
class=
"user-1"
>
<img
class=
"img-1"
:src=
"avatar"
/>
<div
class=
"right-1"
>
<div
class=
"name-1"
>
{{
data
.
replier
.
nickname
}}
</div>
<div
class=
"time-1"
>
{{
data
.
created_time
}}
</div>
</div>
<div
class=
"answer-item"
>
<div
class=
"user"
>
<img
class=
"user-avatar"
:src=
"avatar"
/>
<div
class=
"user-content"
>
<div
class=
"user-name"
>
{{
data
.
replier
.
nickname
}}
</div>
<div
class=
"user-publishtime"
>
{{
data
.
created_time
}}
</div>
</div>
<div
class=
"text"
v-html=
"contentHtml"
>
</div>
<div
class=
"user"
>
<template
v-if=
"data.mine
"
>
<div
class=
"right-txt"
@
click=
"deleteAnswer(data.id)"
>
{{
$t
(
'pages.learn.discussDetail.delete'
)
}}
</div
>
<
/
template
>
<div
class=
"right-txt"
@
click=
"$emit('reply', { answer_id: data.id })"
>
{{ $t('pages.learn.discussDetail.reply') }}
</div
>
<
div
class=
"right-txt"
@
click=
"commentVisible = !commentVisible"
>
{{ $t('pages.learn.d
iscussDetail.discuss') }}({{ data.comments.length }})
</div>
<div
class=
"right-txt"
@
click=
"$emit('btnlike', { tagId: data.tag ? data.tag.id : null, ansId: data.id })
"
>
{{ $t('pages.learn.discussDetail.like') }}({{ data.tag_count }})
</div>
</div>
<div
class=
"answer-content"
v-html=
"contentHtml"
></div
>
<div
class=
"tools
"
>
<div
class=
"right-txt"
@
click=
"toggleLike"
>
<
i
class=
"el-icon-thumb"
></i
>
{{
$t
(
'DiscussModule.DiscussDetail.like'
)
}}
(
{{
data
.
tag_count
}}
)
</div>
<div
class=
"right-txt"
@
click=
"toggleComment"
>
<
i
class=
"el-icon-chat-round"
></i
>
{{
$t
(
'DiscussModule.D
iscussDetail.discuss'
)
}}
(
{{
data
.
comments
.
length
}}
)
</div>
<div
class=
"right-txt"
@
click=
"handleDelete(data.id)"
v-if=
"data.mine
"
>
<i
class=
"el-icon-delete"
></i>
{{
$t
(
'DiscussModule.DiscussDetail.delete'
)
}}
</div>
<
template
v-if=
"commentVisible"
>
<!-- 评论列表 -->
<template
v-for=
"item in data.comments"
>
<reply-item
v-on=
"$listeners"
:data=
"item"
:dataId=
"data.id"
:key=
"item.id"
></reply-item>
</
template
>
</template>
</div>
<!-- 评论列表 -->
<comment-list
:detail=
"detail"
:list=
"data.comments"
:data=
"data"
v-on=
"$listeners"
v-if=
"commentVisible"
></comment-list>
</div>
</
template
>
<
script
>
import
*
as
api
from
'../api/index.js'
import
replyItem
from
'./replyItem
.vue'
import
commentList
from
'./commentList
.vue'
import
defaultAvatar
from
'../assets/images/person-default.jpg'
export
default
{
components
:
{
replyItem
},
components
:
{
commentList
},
props
:
{
data
:
{
type
:
Object
,
default
:
()
=>
{}
}
data
:
{
type
:
Object
,
default
:
()
=>
{}
},
detail
:
{
type
:
Object
,
default
:
()
=>
{}
}
},
data
()
{
return
{
commentVisible
:
false
commentVisible
:
false
,
publishText
:
''
}
},
computed
:
{
...
...
@@ -56,21 +58,45 @@ export default {
}
},
methods
:
{
deleteAnswer
(
id
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
''
,
spinner
:
''
,
background
:
'rgba(255, 255, 255, 0.9)'
})
api
.
deleteAnswer
(
id
)
.
then
(
json
=>
{
this
.
$emit
(
'updateList'
)
this
.
$message
({
type
:
'success'
,
message
:
this
.
$t
(
'pages.learn.discussDetail.deleteSuccess'
)
})
// 点赞
toggleLike
()
{
const
params
=
{
answer_id
:
this
.
data
.
id
,
question_id
:
this
.
detail
.
id
,
semester_id
:
this
.
detail
.
semester_id
}
if
(
this
.
data
.
tag
)
{
// 取消点赞
api
.
unlike
(
this
.
data
.
tag
.
id
).
then
(
json
=>
{
this
.
$emit
(
'update'
)
})
.
finally
(()
=>
{
loading
.
close
()
}
else
{
// 点赞
api
.
like
(
params
).
then
(
res
=>
{
this
.
$emit
(
'update'
)
})
}
},
// 评论
toggleComment
()
{
this
.
commentVisible
=
!
this
.
commentVisible
},
// 删除回答
handleDelete
(
id
)
{
api
.
deleteAnswer
(
id
).
then
(
json
=>
{
this
.
$message
({
type
:
'success'
,
message
:
this
.
$t
(
'DiscussModule.DiscussDetail.deleteSuccess'
)
})
this
.
$emit
(
'update'
)
})
}
}
}
</
script
>
<
style
lang=
"sass"
scoped
>
<
style
lang=
"scss"
scoped
>
.answer-item
+
.answer-item
{
border-top
:
1px
solid
#f6f6f6
;
}
.answer-item
{
padding-bottom
:
20px
;
}
</
style
>
src/modules/discuss/components/commentList.vue
0 → 100644
浏览文件 @
4e7a87ff
<
template
>
<div
class=
"comment-list"
>
<reply-item
v-for=
"item in list"
:isAnswer=
"isAnswer"
:detail=
"detail"
:data=
"item"
:key=
"item.id"
v-on=
"$listeners"
></reply-item>
<!-- 评论框 -->
<div
class=
"comments-publish"
>
<div
class=
"discuss-publish"
>
<el-input
class=
"discuss-publish-textarea"
resize=
"none"
placeholder=
"写下你的评论……"
v-model=
"publishText"
></el-input>
<el-button
type=
"primary"
@
click=
"handlePublish"
>
{{
$t
(
'DiscussModule.DiscussDetail.send'
)
}}
</el-button>
</div>
</div>
</div>
</
template
>
<
script
>
import
*
as
api
from
'../api/index.js'
import
replyItem
from
'./replyItem.vue'
export
default
{
components
:
{
replyItem
},
props
:
{
list
:
{
type
:
Array
,
default
:
()
=>
[]
},
// 评论列表
data
:
{
type
:
Object
,
default
:
()
=>
({})
},
// 回答数据
detail
:
{
type
:
Object
,
default
:
()
=>
({})
}
// 详情数据
},
data
()
{
return
{
publishText
:
''
}
},
computed
:
{
isAnswer
()
{
return
!!
this
.
data
.
id
}
},
methods
:
{
// 发布评论
handlePublish
()
{
if
(
!
this
.
publishText
)
{
return
this
.
$message
.
error
(
'请输入内容'
)
}
const
params
=
{
answer_id
:
this
.
data
.
id
,
semester_id
:
this
.
detail
.
semester_id
,
comments
:
this
.
publishText
}
if
(
this
.
isAnswer
)
{
params
.
questionId
=
this
.
detail
.
id
}
else
{
params
.
question_id
=
this
.
detail
.
id
}
api
.
callbackComment
(
params
).
then
(
res
=>
{
this
.
publishText
=
''
this
.
$emit
(
'update'
)
})
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.comment-list
{
margin-top
:
20px
;
border-radius
:
4px
;
border
:
1px
solid
#ebebeb
;
box-shadow
:
0
1px
3px
rgb
(
18
18
18
/
10%
);
}
.comments-publish
{
border-top
:
1px
solid
#f6f6f6
;
padding
:
20px
;
}
</
style
>
src/modules/discuss/components/replyDetailItem.vue
deleted
100644 → 0
浏览文件 @
b3dad309
<
template
>
<div
class=
"item-list"
>
<div
class=
"user"
>
<div
class=
"name"
>
{{
data
.
observer
.
nickname
}}
</div>
<div
class=
"time"
>
{{
data
.
created_time
}}
</div>
<template
v-if=
"data.mine"
>
<div
class=
"right-txt"
@
click=
"deleteComment(data.id)"
>
{{
$t
(
'pages.learn.discussDetail.delete'
)
}}
</div>
</
template
>
<div
class=
"right-txt"
@
click=
"$emit('reply', {to: data.observer.nickname, question_id: dataId})"
>
{{ $t('pages.learn.discussDetail.reply') }}
</div>
</div>
<div
class=
"text"
v-html=
"contentHtml"
></div>
</div>
</template>
<
script
>
import
*
as
api
from
'../api/index.js'
export
default
{
props
:
{
data
:
{
type
:
Object
,
default
:
()
=>
{}
},
dataId
:
{
type
:
String
,
default
:
()
=>
{}
}
},
data
()
{
return
{}
},
computed
:
{
contentHtml
()
{
return
this
.
data
.
comments
.
replace
(
/
\n
/g
,
'<br />'
)
}
},
methods
:
{
deleteComment
(
id
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
''
,
spinner
:
''
,
background
:
'rgba(255, 255, 255, 0.9)'
})
api
.
deleteComment
(
id
).
then
(
json
=>
{
this
.
$emit
(
'updateList'
)
this
.
$message
({
type
:
'success'
,
message
:
this
.
$t
(
'pages.learn.discussDetail.deleteSuccess'
)
})
}).
catch
(
e
=>
{
this
.
$message
.
error
(
e
.
message
)
}).
finally
(()
=>
{
loading
.
close
()
})
}
}
}
</
script
>
src/modules/discuss/components/replyItem.vue
浏览文件 @
4e7a87ff
<
template
>
<div
class=
"
item-list
"
>
<div
class=
"
reply-item
"
>
<div
class=
"user"
>
<div
class=
"name"
>
{{
data
.
observer
.
nickname
}}
</div>
<div
class=
"time"
>
{{
data
.
created_time
}}
</div>
<template
v-if=
"data.mine"
>
<div
class=
"right-txt"
@
click=
"deleteComment(data.id)"
>
{{
$t
(
'pages.learn.discussDetail.delete'
)
}}
</div>
</
template
>
<div
class=
"right-txt"
@
click=
"$emit('reply', {answer_id: dataId, to: data.observer.nickname})"
>
{{ $t('pages.learn.discussDetail.reply') }}
</div>
<img
class=
"user-avatar"
:src=
"avatar"
/>
<div
class=
"user-content"
>
<div
class=
"user-name"
>
{{
data
.
observer
.
nickname
}}
</div>
<div
class=
"user-publishtime"
>
{{
data
.
created_time
}}
</div>
</div>
</div>
<div
class=
"reply-content"
v-html=
"contentHtml"
></div>
<div
class=
"tools"
>
<div
class=
"right-txt"
@
click=
"toggleReply"
>
<i
class=
"el-icon-edit"
></i>
{{
$t
(
'DiscussModule.DiscussDetail.reply'
)
}}
</div>
<div
class=
"right-txt"
v-if=
"data.mine"
@
click=
"handleDelete(data.id)"
>
<i
class=
"el-icon-delete"
></i>
{{
$t
(
'DiscussModule.DiscussDetail.delete'
)
}}
</div>
</div>
<div
class=
"discuss-publish"
v-if=
"visible"
>
<el-input
class=
"discuss-publish-textarea"
resize=
"none"
:placeholder=
"publishPholder"
v-model=
"publishText"
ref=
"input"
></el-input>
<el-button
type=
"primary"
@
click=
"handlePublish"
>
{{
$t
(
'DiscussModule.DiscussDetail.send'
)
}}
</el-button>
</div>
<div
class=
"text"
v-html=
"contentHtml"
></div>
</div>
</
template
>
<
script
>
import
*
as
api
from
'../api/index.js'
import
defaultAvatar
from
'../assets/images/person-default.jpg'
export
default
{
props
:
{
isAnswer
:
{
type
:
Boolean
,
default
:
false
},
data
:
{
type
:
Object
,
default
:
()
=>
{}
},
d
ataId
:
{
type
:
String
,
default
:
()
=>
{}
}
d
etail
:
{
type
:
Object
,
default
:
()
=>
{}
}
},
data
()
{
return
{}
return
{
visible
:
false
,
publishText
:
''
}
},
computed
:
{
avatar
()
{
return
this
.
data
.
observer
.
avatar
||
defaultAvatar
},
contentHtml
()
{
return
this
.
data
.
comments
.
replace
(
/
\n
/g
,
'<br />'
)
},
publishPholder
()
{
return
this
.
data
.
mine
?
'回复'
+
this
.
data
.
observer
.
nickname
+
':'
:
'评论'
}
},
methods
:
{
deleteComment
(
id
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
''
,
spinner
:
''
,
background
:
'rgba(255, 255, 255, 0.9)'
})
// 删除评论
handleDelete
(
id
)
{
api
.
deleteComment
(
id
).
then
(
json
=>
{
this
.
$emit
(
'updateList'
)
this
.
$message
({
type
:
'success'
,
message
:
this
.
$t
(
'pages.learn.discussDetail.deleteSuccess'
)
})
}).
catch
(
e
=>
{
this
.
$message
.
error
(
e
.
message
)
}).
finally
(()
=>
{
loading
.
close
()
})
this
.
$emit
(
'update'
)
this
.
$message
({
type
:
'success'
,
message
:
this
.
$t
(
'DiscussModule.DiscussDetail.deleteSuccess'
)
})
})
},
// 回复
toggleReply
()
{
this
.
visible
=
!
this
.
visible
this
.
$nextTick
(()
=>
{
this
.
visible
&&
this
.
$refs
.
input
.
focus
()
})
},
// 发布
handlePublish
()
{
if
(
!
this
.
publishText
)
{
return
this
.
$message
.
error
(
'请输入内容'
)
}
const
comments
=
`回复
${
this
.
data
.
observer
.
nickname
}
:
${
this
.
publishText
}
`
const
params
=
{
semester_id
:
this
.
detail
.
semester_id
,
comments
,
to
:
this
.
data
.
observer
.
nickname
}
if
(
this
.
isAnswer
)
{
params
.
answer_id
=
this
.
data
.
relate_id
params
.
questionId
=
this
.
detail
.
id
}
else
{
params
.
question_id
=
this
.
detail
.
id
}
api
.
callbackComment
(
params
).
then
(
res
=>
{
this
.
visible
=
false
this
.
publishText
=
''
this
.
$emit
(
'update'
)
})
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.reply-item
+
.reply-item
{
border-top
:
1px
solid
#f6f6f6
;
}
.reply-item
{
margin
:
20px
;
}
.discuss-publish
{
margin-top
:
10px
;
}
</
style
>
src/modules/discuss/src/discussDetail.vue
浏览文件 @
4e7a87ff
差异被折叠。
点击展开。
src/pages/learn/discussDetail.vue
浏览文件 @
4e7a87ff
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论