Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-lab
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-lab
Commits
c4ac8abb
提交
c4ac8abb
authored
8月 29, 2022
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
73bb10e1
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
293 行增加
和
191 行删除
+293
-191
ImageViewer.vue
src/components/ImageViewer.vue
+9
-0
DiscussItem.vue
src/modules/admin/lab/discuss/components/DiscussItem.vue
+96
-47
ScoreDialog.vue
src/modules/admin/lab/record/components/ScoreDialog.vue
+46
-23
Discuss.vue
src/modules/student/lab/components/Discuss.vue
+3
-13
DiscussCommentPublish.vue
src/modules/student/lab/components/DiscussCommentPublish.vue
+13
-17
DiscussItem.vue
src/modules/student/lab/components/DiscussItem.vue
+105
-62
DiscussPublish.vue
src/modules/student/lab/components/DiscussPublish.vue
+14
-23
VideoItem.vue
src/modules/student/lab/components/VideoItem.vue
+6
-5
Index.vue
src/modules/student/lab/views/Index.vue
+1
-1
没有找到文件。
src/components/ImageViewer.vue
浏览文件 @
c4ac8abb
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
Close
}
from
'@element-plus/icons-vue'
import
{
Close
}
from
'@element-plus/icons-vue'
import
{
onKeyStroke
}
from
'@vueuse/core'
interface
FileItem
{
interface
FileItem
{
name
:
string
name
:
string
...
@@ -15,6 +16,14 @@ withDefaults(defineProps<Props>(), {
...
@@ -15,6 +16,14 @@ withDefaults(defineProps<Props>(), {
modelValue
:
false
,
modelValue
:
false
,
index
:
0
index
:
0
})
})
const
emit
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
// esc 关闭
onKeyStroke
(
'Escape'
,
()
=>
{
emit
(
'update:modelValue'
,
false
)
})
</
script
>
</
script
>
<
template
>
<
template
>
...
...
src/modules/admin/lab/discuss/components/DiscussItem.vue
浏览文件 @
c4ac8abb
...
@@ -16,28 +16,29 @@ defineEmits<{
...
@@ -16,28 +16,29 @@ defineEmits<{
<div
class=
"discuss-item"
>
<div
class=
"discuss-item"
>
<div
class=
"discuss-box"
>
<div
class=
"discuss-box"
>
<div
class=
"discuss-box-user"
>
<div
class=
"discuss-box-user"
>
<img
:src=
"info.created_operator_avatar"
/>
<div
class=
"discuss-box-user__avatar"
><img
:src=
"info.created_operator_avatar"
/></div>
<p>
{{
info
.
student_id_name
}}
</p>
<div
class=
"discuss-box-user__content"
>
<h3>
{{
info
.
student_id_name
}}
</h3>
<p>
{{
info
.
created_time
}}
</p>
</div>
<div
class=
"button-comment"
>
<el-icon><ChatLineRound></ChatLineRound></el-icon>
{{
info
.
replies_num
}}
</div>
</div>
</div>
<div
class=
"discuss-box-main"
>
<div
class=
"discuss-box-main"
>
<div
class=
"discuss-box-header"
>
<p
class=
"discuss-box-time"
>
{{
info
.
created_time
}}
</p>
<div
class=
"tools"
>
<el-icon><ChatLineRound></ChatLineRound></el-icon>
{{
info
.
replies_num
}}
</div>
</div>
<h3>
{{
info
.
title
}}
</h3>
<h3>
{{
info
.
title
}}
</h3>
<div
class=
"discuss-box-content"
v-html=
"info.content"
></div>
<div
class=
"discuss-box-content"
v-html=
"info.content"
></div>
</div>
</div>
</div>
</div>
<div
class=
"discuss-
box discuss-
comment"
v-for=
"item in list"
:key=
"item.id"
>
<div
class=
"discuss-comment"
v-for=
"item in list"
:key=
"item.id"
>
<div
class=
"discuss-
box-use
r"
>
<div
class=
"discuss-
comment__avata
r"
>
<img
:src=
"item.sso_id_avatar"
/>
<img
:src=
"item.sso_id_avatar"
/>
<p>
{{
item
.
sso_id_name
}}
</p>
</div>
</div>
<div
class=
"discuss-box-main"
>
<div
class=
"discuss-comment-content"
>
<p
class=
"discuss-box-time"
>
{{
item
.
created_time
}}
</p>
<span
class=
"discuss-comment__username"
>
{{
item
.
sso_id_name
}}
</span
<div
class=
"discuss-box-content"
v-html=
"item.content"
></div>
>
:
<span
v-html=
"item.content"
></span>
<p
class=
"discuss-comment-time"
>
{{
item
.
created_time
}}
</p>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -45,56 +46,104 @@ defineEmits<{
...
@@ -45,56 +46,104 @@ defineEmits<{
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
.discuss-box
{
.discuss-box
{
padding-bottom
:
20px
;
border-bottom
:
1px
solid
#e6e6e6
;
}
.discuss-box-user
{
display
:
flex
;
display
:
flex
;
margin
:
10px
0
;
align-items
:
center
;
padding
:
10px
;
.button-comment
{
font-size
:
12px
;
display
:
flex
;
color
:
var
(
--
main-color
);
align-items
:
center
;
border-radius
:
10px
;
justify-content
:
center
;
border
:
1px
solid
var
(
--
main-color
);
color
:
#333333
;
&
.discuss-comment
{
cursor
:
pointer
;
margin-left
:
40px
;
&
.is-active
{
color
:
#016fa0
;
color
:
var
(
--
main-color
);
border
:
1px
solid
#016fa0
;
}
}
.el-icon
{
font-size
:
16px
;
margin-left
:
10px
;
margin-right
:
5px
;
}
}
}
}
.discuss-box-user
{
.discuss-box-user__avatar
{
width
:
40px
;
height
:
40px
;
border-radius
:
50%
;
overflow
:
hidden
;
img
{
img
{
width
:
50px
;
width
:
100%
;
height
:
50px
;
height
:
100%
;
border-radius
:
50%
;
overflow
:
hidden
;
object-fit
:
cover
;
object-fit
:
cover
;
}
}
}
.discuss-box-user__content
{
flex
:
1
;
margin-left
:
10px
;
overflow
:
hidden
;
h3
{
font-size
:
16px
;
font-weight
:
500
;
line-height
:
20px
;
color
:
#333333
;
}
p
{
p
{
text-align
:
center
;
font-size
:
14px
;
font-weight
:
400
;
line-height
:
20px
;
color
:
#999999
;
}
}
}
}
.discuss-box-main
{
.discuss-box-main
{
flex
:
1
;
margin-left
:
50px
;
padding-left
:
10px
;
h3
{
h3
{
font-size
:
14px
;
padding
:
16px
0
;
font-size
:
16px
;
font-weight
:
500
;
font-weight
:
500
;
line-height
:
20px
;
color
:
#333333
;
}
}
}
}
.discuss-box-content
{
.discuss-box-content
{
padding
:
5px
0
;
font-size
:
16px
;
color
:
#555
;
font-weight
:
400
;
line-height
:
24px
;
color
:
#333333
;
}
}
.discuss-box-header
{
.discuss-comment
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
margin-top
:
20px
;
justify-content
:
space-between
;
}
.tools
{
.discuss-comment__avatar
{
display
:
fle
x
;
width
:
32p
x
;
align-items
:
center
;
height
:
32px
;
.el-icon
{
border-radius
:
50%
;
font-size
:
16px
;
overflow
:
hidden
;
margin-left
:
10px
;
img
{
margin-right
:
5px
;
width
:
100%
;
color
:
#333333
;
height
:
100%
;
}
object-fit
:
cover
;
}
}
}
}
.discuss-comment-content
{
flex
:
1
;
margin-left
:
10px
;
color
:
#333
;
overflow
:
hidden
;
}
.discuss-comment__username
{
font-size
:
16px
;
line-height
:
20px
;
color
:
var
(
--
main-color
);
}
.discuss-comment-time
{
margin-top
:
10px
;
font-size
:
14px
;
line-height
:
20px
;
color
:
#999999
;
text-align
:
right
;
}
</
style
>
</
style
>
src/modules/admin/lab/record/components/ScoreDialog.vue
浏览文件 @
c4ac8abb
...
@@ -78,8 +78,14 @@ function handleSubmit() {
...
@@ -78,8 +78,14 @@ function handleSubmit() {
<
template
>
<
template
>
<el-dialog
title=
"学生实验评分"
:close-on-click-modal=
"false"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-dialog
title=
"学生实验评分"
:close-on-click-modal=
"false"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-form
:rules=
"rules"
label-width=
"120px"
label-suffix=
":"
v-if=
"detail"
>
<el-form
:rules=
"rules"
label-width=
"120px"
label-suffix=
":"
v-if=
"detail"
>
<el-form-item
label=
"实验名称"
>
{{
detail
.
experiment_name
}}
</el-form-item>
<el-row>
<el-form-item
label=
"实验课程名称"
>
{{
detail
.
course_name
}}
</el-form-item>
<el-col
:span=
"12"
>
<el-form-item
label=
"实验名称"
>
{{
detail
.
experiment_name
}}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"实验课程名称"
>
{{
detail
.
course_name
}}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
<el-form-item
label=
"学生姓名"
>
{{
detail
.
student_name
}}
</el-form-item>
<el-form-item
label=
"学生姓名"
>
{{
detail
.
student_name
}}
</el-form-item>
...
@@ -96,24 +102,8 @@ function handleSubmit() {
...
@@ -96,24 +102,8 @@ function handleSubmit() {
<el-form-item
label=
"所属班级"
>
{{
detail
.
class_name
}}
</el-form-item>
<el-form-item
label=
"所属班级"
>
{{
detail
.
class_name
}}
</el-form-item>
</el-col>
</el-col>
</el-row>
</el-row>
<el-form-item
label=
"实验报告文件"
>
<p
v-if=
"file"
>
<el-form-item
label=
"实验成绩"
class=
"form-item-score"
>
<a
:href=
"file.url"
target=
"_blank"
>
<el-icon><Document
/></el-icon>
{{
file
.
name
}}
</a>
</p>
</el-form-item>
<el-form-item
label=
"实验过程截图"
>
<ul
class=
"picture-list"
>
<li
v-for=
"item in pictures"
:key=
"item.url"
>
<p
class=
"t1"
>
<a
:href=
"item.url"
target=
"_blank"
>
{{
item
.
name
}}
</a>
</p>
<p
class=
"t2"
>
截图时间:
{{
item
.
upload_time
}}
</p>
</li>
</ul>
</el-form-item>
<el-form-item
label=
"实验成绩"
>
<el-form
<el-form
ref=
"formRef"
ref=
"formRef"
:model=
"form"
:model=
"form"
...
@@ -137,6 +127,23 @@ function handleSubmit() {
...
@@ -137,6 +127,23 @@ function handleSubmit() {
</el-form-item>
</el-form-item>
</el-form>
</el-form>
</el-form-item>
</el-form-item>
<el-form-item
label=
"实验报告文件"
>
<div
v-if=
"file"
>
<a
:href=
"file.url"
target=
"_blank"
class=
"file-item"
>
<el-icon><Document
/></el-icon>
{{
file
.
name
}}
</a>
</div>
</el-form-item>
<el-form-item
label=
"实验过程截图"
>
<ul
class=
"picture-list"
>
<li
v-for=
"item in pictures"
:key=
"item.url"
>
<p
class=
"t1"
>
<a
:href=
"item.url"
target=
"_blank"
>
{{
item
.
name
}}
</a>
</p>
<p
class=
"t2"
>
截图时间:
{{
item
.
upload_time
}}
</p>
</li>
</ul>
</el-form-item>
<el-row
justify=
"center"
>
<el-row
justify=
"center"
>
<el-button
type=
"primary"
round
auto-insert-space
@
click=
"handleSubmit"
>
保存
</el-button>
<el-button
type=
"primary"
round
auto-insert-space
@
click=
"handleSubmit"
>
保存
</el-button>
<el-button
round
auto-insert-space
@
click=
"$emit('update:modelValue', false)"
>
取消
</el-button>
<el-button
round
auto-insert-space
@
click=
"$emit('update:modelValue', false)"
>
取消
</el-button>
...
@@ -146,6 +153,14 @@ function handleSubmit() {
...
@@ -146,6 +153,14 @@ function handleSubmit() {
</
template
>
</
template
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
.file-item
{
display
:
flex
;
align-items
:
center
;
color
:
var
(
--
main-color
);
.el-icon
{
margin-right
:
5px
;
}
}
.picture-list
{
.picture-list
{
width
:
100%
;
width
:
100%
;
li
{
li
{
...
@@ -153,7 +168,7 @@ function handleSubmit() {
...
@@ -153,7 +168,7 @@ function handleSubmit() {
justify-content
:
space-between
;
justify-content
:
space-between
;
}
}
a
{
a
{
color
:
blue
;
color
:
var
(
--
main-color
)
;
}
}
.t1
{
.t1
{
flex
:
1
;
flex
:
1
;
...
@@ -161,8 +176,16 @@ function handleSubmit() {
...
@@ -161,8 +176,16 @@ function handleSubmit() {
text-overflow
:
ellipsis
;
text-overflow
:
ellipsis
;
overflow
:
hidden
;
overflow
:
hidden
;
}
}
.t2
{
}
flex
:
1
;
.form-item-score
{
padding-top
:
10px
;
background-color
:
#f8f9fb
;
border-radius
:
16px
;
:deep
(
.el-form-item__label
)
{
text-align
:
center
;
}
.el-input-number
{
width
:
100px
;
}
}
}
}
</
style
>
</
style
>
src/modules/student/lab/components/Discuss.vue
浏览文件 @
c4ac8abb
...
@@ -5,7 +5,7 @@ import { useInfiniteScroll } from '@vueuse/core'
...
@@ -5,7 +5,7 @@ import { useInfiniteScroll } from '@vueuse/core'
import
DiscussItem
from
'./DiscussItem.vue'
import
DiscussItem
from
'./DiscussItem.vue'
import
{
getExperimentDiscussList
}
from
'../api'
import
{
getExperimentDiscussList
}
from
'../api'
const
Discuss
AddDialog
=
defineAsyncComponent
(()
=>
import
(
'./DiscussAddDialog
.vue'
))
const
Discuss
Publish
=
defineAsyncComponent
(()
=>
import
(
'./DiscussPublish
.vue'
))
interface
Props
{
interface
Props
{
experiment_id
?:
string
experiment_id
?:
string
}
}
...
@@ -41,8 +41,6 @@ const isEmpty = $computed(() => {
...
@@ -41,8 +41,6 @@ const isEmpty = $computed(() => {
return
!
props
.
experiment_id
||
!
list
.
length
return
!
props
.
experiment_id
||
!
list
.
length
})
})
const
dialogVisible
=
$ref
(
false
)
// 滚动加载
// 滚动加载
const
scrollRef
=
ref
<
HTMLElement
>
()
const
scrollRef
=
ref
<
HTMLElement
>
()
useInfiniteScroll
(
useInfiniteScroll
(
...
@@ -64,9 +62,8 @@ useInfiniteScroll(
...
@@ -64,9 +62,8 @@ useInfiniteScroll(
<el-radio
:label=
"3"
>
我的小组
</el-radio>
<el-radio
:label=
"3"
>
我的小组
</el-radio>
<el-radio
:label=
"4"
>
我的班级
</el-radio>
<el-radio
:label=
"4"
>
我的班级
</el-radio>
</el-radio-group>
</el-radio-group>
<el-row
justify=
"end"
>
<!-- 发表新话题 -->
<el-button
round
type=
"primary"
@
click=
"dialogVisible = true"
>
发表新话题
</el-button>
<DiscussPublish
:experiment_id=
"experiment_id"
@
update=
"fetchInfo(true)"
v-if=
"experiment_id"
></DiscussPublish>
</el-row>
<el-empty
description=
"暂无数据"
v-if=
"isEmpty"
/>
<el-empty
description=
"暂无数据"
v-if=
"isEmpty"
/>
<template
v-else
>
<template
v-else
>
<div
class=
"discuss-scroll"
ref=
"scrollRef"
>
<div
class=
"discuss-scroll"
ref=
"scrollRef"
>
...
@@ -81,13 +78,6 @@ useInfiniteScroll(
...
@@ -81,13 +78,6 @@ useInfiniteScroll(
</div>
</div>
</
template
>
</
template
>
</div>
</div>
<!-- 发表新话题 -->
<DiscussAddDialog
v-model=
"dialogVisible"
:experiment_id=
"experiment_id"
@
update=
"fetchInfo(true)"
v-if=
"dialogVisible && experiment_id"
></DiscussAddDialog>
</template>
</template>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
...
src/modules/student/lab/components/DiscussComment
AddDialog
.vue
→
src/modules/student/lab/components/DiscussComment
Publish
.vue
浏览文件 @
c4ac8abb
...
@@ -11,7 +11,6 @@ const props = defineProps<Props>()
...
@@ -11,7 +11,6 @@ const props = defineProps<Props>()
const
emit
=
defineEmits
<
{
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
}
>
()
const
formRef
=
$ref
<
FormInstance
>
()
const
formRef
=
$ref
<
FormInstance
>
()
...
@@ -30,26 +29,23 @@ function handleAdd() {
...
@@ -30,26 +29,23 @@ function handleAdd() {
addExperimentDiscussComment
(
params
).
then
(()
=>
{
addExperimentDiscussComment
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'评论成功'
,
type
:
'success'
})
ElMessage
({
message
:
'评论成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
formRef
?.
resetFields
(
)
})
})
}
}
</
script
>
</
script
>
<
template
>
<
template
>
<el-
dialog
<el-
form
title=
"话题评论
"
ref=
"formRef
"
:
close-on-click-modal=
"false
"
:
model=
"form
"
width=
"600px
"
:rules=
"rules
"
@
update:modelValue=
"$emit('update:modelValue')
"
style=
"border-top: 1px dashed #e6e6e6; border-bottom: 1px dashed #e6e6e6; padding: 20px 0
"
>
>
<el-form
ref=
"formRef"
:model=
"form"
:rules=
"rules"
>
<el-form-item
prop=
"content"
>
<el-form-item
prop=
"content"
>
<el-input
type=
"textarea"
v-model=
"form.content"
:autosize=
"
{ minRows: 4, maxRows: 6 }" />
<el-input
type=
"textarea"
v-model=
"form.content"
:autosize=
"
{ minRows: 4, maxRows: 6 }" />
</el-form-item>
</el-form-item>
<el-row
justify=
"end"
>
<el-row
justify=
"center"
>
<el-button
type=
"primary"
@
click=
"handleSubmit"
>
评论
</el-button>
<el-button
round
auto-insert-space
@
click=
"$emit('update:modelValue', false)"
>
取消
</el-button>
</el-row>
<el-button
type=
"primary"
round
auto-insert-space
@
click=
"handleSubmit"
>
评论
</el-button>
</el-form>
</el-row>
</el-form>
</el-dialog>
</
template
>
</
template
>
src/modules/student/lab/components/DiscussItem.vue
浏览文件 @
c4ac8abb
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
import
type
{
ExperimentDiscussType
}
from
'../types'
import
type
{
ExperimentDiscussType
}
from
'../types'
import
{
ChatLineRound
}
from
'@element-plus/icons-vue'
import
{
ChatLineRound
}
from
'@element-plus/icons-vue'
const
DiscussComment
AddDialog
=
defineAsyncComponent
(()
=>
import
(
'./DiscussCommentAddDialog
.vue'
))
const
DiscussComment
Publish
=
defineAsyncComponent
(()
=>
import
(
'./DiscussCommentPublish
.vue'
))
interface
Props
{
interface
Props
{
data
:
ExperimentDiscussType
data
:
ExperimentDiscussType
...
@@ -13,113 +13,156 @@ defineEmits<{
...
@@ -13,113 +13,156 @@ defineEmits<{
(
e
:
'update'
):
void
(
e
:
'update'
):
void
}
>
()
}
>
()
const
commentDialogVisible
=
$ref
(
false
)
const
commentVisible
=
$ref
(
false
)
const
commentVisible
=
$ref
(
false
)
const
commentButtonText
=
$computed
(()
=>
(
commentVisible
?
'收起'
:
'展开'
))
</
script
>
</
script
>
<
template
>
<
template
>
<div
class=
"discuss-item"
>
<div
class=
"discuss-item"
>
<div
class=
"discuss-box"
>
<div
class=
"discuss-box"
>
<div
class=
"discuss-box-user"
>
<div
class=
"discuss-box-user"
>
<img
:src=
"data.sso_user.avatar"
/>
<div
class=
"discuss-box-user__avatar"
><img
:src=
"data.sso_user.avatar"
/></div>
<p>
{{
data
.
sso_user
.
real_name
||
data
.
sso_user
.
nickname
||
data
.
sso_user
.
username
}}
</p>
<div
class=
"discuss-box-user__content"
>
<h3>
{{
data
.
sso_user
.
real_name
||
data
.
sso_user
.
nickname
||
data
.
sso_user
.
username
}}
</h3>
<p>
{{
data
.
created_time
}}
</p>
</div>
</div>
</div>
<div
class=
"discuss-box-main"
>
<div
class=
"discuss-box-main"
>
<div
class=
"discuss-box-header"
>
<p
class=
"discuss-box-time"
>
{{
data
.
created_time
}}
</p>
<div
class=
"tools"
>
<el-button
size=
"small"
type=
"primary"
plain
round
@
click=
"commentVisible = !commentVisible"
>
{{
commentButtonText
}}
</el-button>
<el-icon><ChatLineRound></ChatLineRound></el-icon>
{{
data
.
reply_count
}}
</div>
</div>
<h3>
{{
data
.
title
}}
</h3>
<h3>
{{
data
.
title
}}
</h3>
<div
class=
"discuss-box-content"
v-html=
"data.content"
></div>
<div
class=
"discuss-box-content"
v-html=
"data.content"
></div>
</div>
</div>
<div
class=
"discuss-box-footer"
>
<div
class=
"button-comment"
:class=
"
{ 'is-active': commentVisible }" @click="commentVisible = !commentVisible">
<el-icon><ChatLineRound></ChatLineRound></el-icon>
{{
data
.
reply_count
}}
</div>
</div>
</div>
</div>
<template
v-if=
"commentVisible"
>
<template
v-if=
"commentVisible"
>
<div
class=
"discuss-box discuss-comment"
v-for=
"item in data.replies"
:key=
"item.id"
>
<!-- 我要评论 -->
<div
class=
"discuss-box-user"
>
<DiscussCommentPublish
:data=
"data"
@
update=
"$emit('update')"
></DiscussCommentPublish>
<div
class=
"discuss-comment"
v-for=
"item in data.replies"
:key=
"item.id"
>
<div
class=
"discuss-comment__avatar"
>
<img
:src=
"item.sso_user.avatar"
/>
<img
:src=
"item.sso_user.avatar"
/>
<p>
{{
item
.
sso_user
.
real_name
||
item
.
sso_user
.
nickname
||
item
.
sso_user
.
username
}}
</p>
</div>
</div>
<div
class=
"discuss-box-main"
>
<div
class=
"discuss-comment-content"
>
<p
class=
"discuss-box-time"
>
{{
item
.
created_time
}}
</p>
<span
class=
"discuss-comment__username"
>
{{
<div
class=
"discuss-box-content"
v-html=
"item.content"
></div>
item
.
sso_user
.
real_name
||
item
.
sso_user
.
nickname
||
item
.
sso_user
.
username
}}
</span
>
:
<span
v-html=
"item.content"
></span>
<p
class=
"discuss-comment-time"
>
{{
item
.
created_time
}}
</p>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
<el-row
justify=
"end"
style=
"margin-top: 10px"
>
<el-button
round
type=
"primary"
size=
"small"
@
click=
"commentDialogVisible = true"
>
我要评论
</el-button>
</el-row>
</div>
</div>
<!-- 我要评论 -->
<DiscussCommentAddDialog
:data=
"data"
v-model=
"commentDialogVisible"
@
update=
"$emit('update')"
v-if=
"commentDialogVisible"
></DiscussCommentAddDialog>
</template>
</template>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
.discuss-item
{
.discuss-item
{
margin-top
:
10px
;
margin-top
:
10px
;
padding
:
10px
0
;
border-top
:
1px
solid
#e6e6e6
;
border-top
:
1px
dashed
#ccc
;
}
}
.discuss-box
{
.discuss-box
{
display
:
flex
;
padding
:
20px
0
10px
;
margin
:
10px
0
;
padding
:
10px
;
font-size
:
12px
;
color
:
var
(
--
main-color
);
border-radius
:
10px
;
border
:
1px
solid
var
(
--
main-color
);
&
.discuss-comment
{
margin-left
:
40px
;
color
:
#016fa0
;
border
:
1px
solid
#016fa0
;
}
}
}
.discuss-box-user
{
.discuss-box-user
{
display
:
flex
;
align-items
:
center
;
}
.discuss-box-user__avatar
{
width
:
40px
;
height
:
40px
;
border-radius
:
50%
;
overflow
:
hidden
;
img
{
img
{
width
:
50px
;
width
:
100%
;
height
:
50px
;
height
:
100%
;
border-radius
:
50%
;
overflow
:
hidden
;
object-fit
:
cover
;
object-fit
:
cover
;
}
}
}
.discuss-box-user__content
{
flex
:
1
;
margin-left
:
10px
;
overflow
:
hidden
;
h3
{
font-size
:
16px
;
font-weight
:
500
;
line-height
:
20px
;
color
:
#333333
;
}
p
{
p
{
text-align
:
center
;
font-size
:
14px
;
font-weight
:
400
;
line-height
:
20px
;
color
:
#999999
;
}
}
}
}
.discuss-box-main
{
.discuss-box-main
{
flex
:
1
;
margin-left
:
50px
;
padding-left
:
10px
;
h3
{
h3
{
font-size
:
14px
;
padding
:
16px
0
;
font-size
:
16px
;
font-weight
:
500
;
font-weight
:
500
;
line-height
:
20px
;
color
:
#333333
;
}
}
}
}
.discuss-box-content
{
.discuss-box-content
{
padding
:
5px
0
;
font-size
:
16px
;
color
:
#555
;
font-weight
:
400
;
line-height
:
24px
;
color
:
#333333
;
}
}
.discuss-box-
head
er
{
.discuss-box-
foot
er
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
justify-content
:
flex-end
;
.tools
{
margin-top
:
10px
;
.button-comment
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
.el-icon
{
justify-content
:
center
;
font-size
:
16px
;
color
:
#333333
;
margin-left
:
10px
;
cursor
:
pointer
;
margin-right
:
5px
;
&
.is-active
{
color
:
#333333
;
color
:
var
(
--
main-color
)
;
}
}
}
}
.el-icon
{
font-size
:
16px
;
margin-left
:
10px
;
margin-right
:
5px
;
}
}
.discuss-comment
{
display
:
flex
;
margin-top
:
20px
;
}
.discuss-comment__avatar
{
width
:
32px
;
height
:
32px
;
border-radius
:
50%
;
overflow
:
hidden
;
img
{
width
:
100%
;
height
:
100%
;
object-fit
:
cover
;
}
}
.discuss-comment-content
{
flex
:
1
;
margin-left
:
10px
;
color
:
#333
;
overflow
:
hidden
;
}
.discuss-comment__username
{
font-size
:
16px
;
line-height
:
20px
;
color
:
var
(
--
main-color
);
}
.discuss-comment-time
{
margin-top
:
10px
;
font-size
:
14px
;
line-height
:
20px
;
color
:
#999999
;
text-align
:
right
;
}
}
</
style
>
</
style
>
src/modules/student/lab/components/Discuss
AddDialog
.vue
→
src/modules/student/lab/components/Discuss
Publish
.vue
浏览文件 @
c4ac8abb
...
@@ -10,14 +10,13 @@ const props = defineProps<Props>()
...
@@ -10,14 +10,13 @@ const props = defineProps<Props>()
const
emit
=
defineEmits
<
{
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
}
>
()
const
formRef
=
$ref
<
FormInstance
>
()
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
({
title
:
''
,
content
:
''
})
const
form
=
reactive
({
title
:
''
,
content
:
''
})
const
rules
=
ref
<
FormRules
>
({
const
rules
=
ref
<
FormRules
>
({
title
:
[{
required
:
true
,
message
:
'请输入话题标题'
,
trigger
:
'blur'
}],
title
:
[{
required
:
true
,
message
:
'请输入话题标题'
}],
content
:
[{
required
:
true
,
message
:
'请输入话题描述'
,
trigger
:
'blur'
}]
content
:
[{
required
:
true
,
message
:
'请输入话题描述'
}]
})
})
// 提交
// 提交
...
@@ -30,29 +29,21 @@ function handleAdd() {
...
@@ -30,29 +29,21 @@ function handleAdd() {
addExperimentDiscuss
(
params
).
then
(()
=>
{
addExperimentDiscuss
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'发表成功'
,
type
:
'success'
})
ElMessage
({
message
:
'发表成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
formRef
?.
resetFields
(
)
})
})
}
}
</
script
>
</
script
>
<
template
>
<
template
>
<el-dialog
<el-form
ref=
"formRef"
:model=
"form"
:rules=
"rules"
style=
"padding: 20px 0 10px"
>
title=
"发表新话题"
<el-form-item
prop=
"title"
>
:close-on-click-modal=
"false"
<el-input
v-model=
"form.title"
placeholder=
"话题标题"
></el-input>
width=
"600px"
</el-form-item>
@
update:modelValue=
"$emit('update:modelValue')"
<el-form-item
prop=
"content"
>
>
<el-input
type=
"textarea"
v-model=
"form.content"
placeholder=
"话题描述"
:autosize=
"
{ minRows: 4, maxRows: 6 }" />
<el-form
ref=
"formRef"
:model=
"form"
:rules=
"rules"
>
</el-form-item>
<el-form-item
label=
"话题标题"
prop=
"title"
>
<el-row
justify=
"end"
>
<el-input
v-model=
"form.title"
></el-input>
<el-button
type=
"primary"
@
click=
"handleSubmit"
>
发表
</el-button>
</el-form-item>
</el-row>
<el-form-item
label=
"话题描述"
prop=
"content"
>
</el-form>
<el-input
type=
"textarea"
v-model=
"form.content"
:autosize=
"
{ minRows: 4, maxRows: 6 }" />
</el-form-item>
<el-row
justify=
"center"
>
<el-button
round
auto-insert-space
@
click=
"$emit('update:modelValue', false)"
>
取消
</el-button>
<el-button
type=
"primary"
round
auto-insert-space
@
click=
"handleSubmit"
>
发布
</el-button>
</el-row>
</el-form>
</el-dialog>
</
template
>
</
template
>
src/modules/student/lab/components/VideoItem.vue
浏览文件 @
c4ac8abb
...
@@ -23,11 +23,12 @@ onMounted(() => {
...
@@ -23,11 +23,12 @@ onMounted(() => {
<div
class=
"video-item"
>
<div
class=
"video-item"
>
<h2>
{{
data
.
name
}}
</h2>
<h2>
{{
data
.
name
}}
</h2>
<!--
<img
:src=
"data.cover"
/>
-->
<!--
<img
:src=
"data.cover"
/>
-->
<AppVideoPlayer
<div
style=
"height: 200px"
v-if=
"playUrl"
>
:options=
"
{ sources: [{ src: playUrl, type: 'application/x-mpegURL' }] }"
<AppVideoPlayer
style="width: 100%"
:options=
"
{ sources: [{ src: playUrl, type: 'application/x-mpegURL' }] }"
v-if="playUrl"
style="width: 100%; height: 100%"
>
</AppVideoPlayer>
>
</AppVideoPlayer>
</div>
</div>
</div>
</
template
>
</
template
>
...
...
src/modules/student/lab/views/Index.vue
浏览文件 @
c4ac8abb
...
@@ -88,7 +88,7 @@ onUnmounted(() => {
...
@@ -88,7 +88,7 @@ onUnmounted(() => {
// 上传截图
// 上传截图
function
uploadPicture
(
url
:
string
)
{
function
uploadPicture
(
url
:
string
)
{
const
pictures
=
detail
?.
pictures
||
[]
const
pictures
=
detail
?.
pictures
||
[]
pictures
.
unshift
({
url
,
name
:
'screenshot
.png'
,
upload_time
:
dayjs
().
format
(
'YYYY-MM-DD HH:mm:ss'
)
})
pictures
.
unshift
({
url
,
name
:
Date
.
now
()
+
'
.png'
,
upload_time
:
dayjs
().
format
(
'YYYY-MM-DD HH:mm:ss'
)
})
uploadExperimentPicture
({
experiment_id
:
form
.
experiment_id
,
pictures
:
JSON
.
stringify
(
pictures
)
}).
then
(()
=>
{
uploadExperimentPicture
({
experiment_id
:
form
.
experiment_id
,
pictures
:
JSON
.
stringify
(
pictures
)
}).
then
(()
=>
{
fetchInfo
()
fetchInfo
()
screenshotLoading
=
false
screenshotLoading
=
false
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论