Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-lab
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-lab
Commits
e07a9edb
提交
e07a9edb
authored
11月 16, 2022
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
c34bd07b
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
231 行增加
和
14 行删除
+231
-14
index.html
index.html
+1
-0
AppEditor.vue
src/components/base/AppEditor.vue
+7
-1
api.ts
src/modules/student/lab/api.ts
+23
-0
Info.vue
src/modules/student/lab/components/Info.vue
+37
-8
PrepareDialog.vue
src/modules/student/lab/components/PrepareDialog.vue
+66
-0
ResultDialog.vue
src/modules/student/lab/components/ResultDialog.vue
+66
-0
Index.vue
src/modules/student/lab/views/Index.vue
+31
-5
没有找到文件。
index.html
浏览文件 @
e07a9edb
...
...
@@ -5,6 +5,7 @@
<link
rel=
"icon"
href=
"https://zws-imgs-pub.ezijing.com/pc/base/favicon.ico"
/>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1.0"
/>
<title></title>
<script
src=
"https://webapp-pub.ezijing.com/plugins/tinymce@6/tinymce.min.js"
></script>
</head>
<body>
<div
id=
"app"
></div>
...
...
src/components/
tinymce/Index
.vue
→
src/components/
base/AppEditor
.vue
浏览文件 @
e07a9edb
...
...
@@ -6,7 +6,7 @@ import { getSignature, uploadFile } from '@/api/base'
const
props
=
defineProps
({
height
:
{
type
:
Number
,
default
:
6
00
default
:
4
00
}
})
...
...
@@ -63,3 +63,9 @@ const init = {
<
template
>
<editor
:init=
"init"
v-bind=
"$attrs"
style=
"width: 100%"
/>
</
template
>
<
style
lang=
"scss"
>
.tox-tinymce-aux
{
z-index
:
3000
!
important
;
}
</
style
>
src/modules/student/lab/api.ts
浏览文件 @
e07a9edb
...
...
@@ -5,6 +5,11 @@ export function getCourseList() {
return
httpRequest
.
get
(
'/api/lab/v1/student/course/all'
)
}
// 获取实验详情
export
function
getExperiment
(
params
:
{
experiment_id
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/student/experiment/detail'
,
{
params
})
}
// 获取实验指导书
export
function
getExperimentBook
(
params
:
{
experiment_id
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/student/experiment-book/detail'
,
{
params
})
...
...
@@ -56,3 +61,21 @@ export function uploadExperimentReport(data: { experiment_id: string; file: stri
export
function
submitExperimentRecord
(
data
:
{
experiment_id
:
string
})
{
return
httpRequest
.
post
(
'/api/lab/v1/student/experiment-record/submit'
,
data
)
}
// 获取实验准备详情
export
function
getExperimentPrepare
(
params
:
{
experiment_id
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/student/experiment/pre-detail'
,
{
params
})
}
// 更新实验准备
export
function
updateExperimentPrepare
(
data
:
{
experiment_id
:
string
;
detail
:
string
})
{
return
httpRequest
.
post
(
'/api/lab/v1/student/experiment/pre-save'
,
data
)
}
// 获取实验结果详情
export
function
getExperimentResult
(
params
:
{
experiment_id
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/student/experiment/result-detail'
,
{
params
})
}
// 更新实验结果
export
function
updateExperimentResult
(
data
:
{
experiment_id
:
string
;
detail
:
string
})
{
return
httpRequest
.
post
(
'/api/lab/v1/student/experiment/result-save'
,
data
)
}
src/modules/student/lab/components/Info.vue
浏览文件 @
e07a9edb
<
script
setup
lang=
"ts"
>
import
type
{
ExperimentRecord
}
from
'../types'
interface
Props
{
experiment_id
?:
string
}
<
script
setup
>
import
{
getExperiment
}
from
'../api'
const
props
=
defineProps
({
experiment_id
:
String
})
defineProps
<
Props
>
()
let
detail
=
$ref
()
const
detail
=
$ref
(
inject
<
ExperimentRecord
>
(
'detail'
))
const
teacherText
=
$computed
(()
=>
{
if
(
!
detail
)
return
''
return
detail
.
teachers
.
map
(
item
=>
item
.
name
).
join
(
'、'
)
})
function
fetchInfo
()
{
if
(
!
props
.
experiment_id
)
return
getExperiment
({
experiment_id
:
props
.
experiment_id
}).
then
(
res
=>
{
detail
=
res
.
data
.
detail
})
}
watchEffect
(()
=>
{
fetchInfo
()
})
</
script
>
<
template
>
<template
v-if=
"detail && experiment_id"
>
</
template
>
<template
v-if=
"detail && experiment_id"
>
<el-form
label-suffix=
":"
label-width=
"120px"
label-position=
"right"
>
<el-form-item
label=
"实验名称"
>
{{
detail
.
name
}}
</el-form-item>
<el-form-item
label=
"实验课程名称"
>
{{
detail
.
course
.
name
}}
</el-form-item>
<el-form-item
label=
"所属机构/学校"
>
{{
detail
.
organization
.
name
}}
</el-form-item>
<el-form-item
label=
"实验类型"
>
{{
detail
.
type_level
}}
</el-form-item>
<el-form-item
label=
"指导教师"
>
{{
teacherText
}}
</el-form-item>
<el-form-item
label=
"实验学时"
>
{{
detail
.
length
}}
学时
</el-form-item>
<el-form-item
label=
"实验总成绩"
>
{{
detail
.
score
}}
</el-form-item>
</el-form>
<el-divider
/>
<el-form
label-suffix=
":"
label-position=
"top"
>
<el-form-item
label=
"实验目的"
>
{{
detail
.
purpose
}}
</el-form-item>
<el-form-item
label=
"实验要求"
>
{{
detail
.
requirements
}}
</el-form-item>
<el-form-item
label=
"实验内容及原理"
>
{{
detail
.
content
}}
</el-form-item>
<el-form-item
label=
"实验步骤及过程"
>
{{
detail
.
procedure
}}
</el-form-item>
</el-form>
</
template
>
<el-empty
description=
"暂无数据"
v-else
/>
</template>
src/modules/student/lab/components/PrepareDialog.vue
0 → 100644
浏览文件 @
e07a9edb
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
{
ElMessage
}
from
'element-plus'
import
AppEditor
from
'@/components/base/AppEditor.vue'
import
{
getExperimentPrepare
,
updateExperimentPrepare
}
from
'../api'
interface
Props
{
experiment_id
:
string
}
const
props
=
defineProps
<
Props
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
({
experiment_id
:
props
.
experiment_id
,
detail
:
''
})
const
rules
=
ref
<
FormRules
>
({
detail
:
[{
required
:
true
,
message
:
'请输入'
,
trigger
:
'blur'
}]
})
function
fetchInfo
()
{
getExperimentPrepare
({
experiment_id
:
props
.
experiment_id
}).
then
(
res
=>
{
Object
.
assign
(
form
,
res
.
data
.
detail
)
})
}
onMounted
(()
=>
{
fetchInfo
()
})
// 提交
function
handleSubmit
()
{
formRef
?.
validate
().
then
(
update
)
}
// 修改
const
update
=
()
=>
{
updateExperimentPrepare
(
form
).
then
(()
=>
{
ElMessage
({
message
:
'保存成功'
,
type
:
'success'
})
emit
(
'update:modelValue'
,
false
)
})
}
</
script
>
<
template
>
<el-dialog
append-to-body
title=
"实验准备"
:close-on-click-modal=
"false"
width=
"800px"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-form
ref=
"formRef"
:model=
"form"
:rules=
"rules"
>
<el-form-item
prop=
"detail"
>
<AppEditor
v-model=
"form.detail"
></AppEditor>
</el-form-item>
<el-row
justify=
"center"
>
<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-row>
</el-form>
</el-dialog>
</
template
>
src/modules/student/lab/components/ResultDialog.vue
0 → 100644
浏览文件 @
e07a9edb
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
{
ElMessage
}
from
'element-plus'
import
AppEditor
from
'@/components/base/AppEditor.vue'
import
{
getExperimentResult
,
updateExperimentResult
}
from
'../api'
interface
Props
{
experiment_id
:
string
}
const
props
=
defineProps
<
Props
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
({
experiment_id
:
props
.
experiment_id
,
detail
:
''
})
const
rules
=
ref
<
FormRules
>
({
detail
:
[{
required
:
true
,
message
:
'请输入'
,
trigger
:
'blur'
}]
})
function
fetchInfo
()
{
getExperimentResult
({
experiment_id
:
props
.
experiment_id
}).
then
(
res
=>
{
Object
.
assign
(
form
,
res
.
data
.
detail
)
})
}
onMounted
(()
=>
{
fetchInfo
()
})
// 提交
function
handleSubmit
()
{
formRef
?.
validate
().
then
(
update
)
}
// 修改
const
update
=
()
=>
{
updateExperimentResult
(
form
).
then
(()
=>
{
ElMessage
({
message
:
'保存成功'
,
type
:
'success'
})
emit
(
'update:modelValue'
,
false
)
})
}
</
script
>
<
template
>
<el-dialog
append-to-body
title=
"实验结果"
:close-on-click-modal=
"false"
width=
"800px"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-form
ref=
"formRef"
:model=
"form"
:rules=
"rules"
>
<el-form-item
prop=
"detail"
>
<AppEditor
v-model=
"form.detail"
></AppEditor>
</el-form-item>
<el-row
justify=
"center"
>
<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-row>
</el-form>
</el-dialog>
</
template
>
src/modules/student/lab/views/Index.vue
浏览文件 @
e07a9edb
...
...
@@ -14,6 +14,8 @@ const Video = defineAsyncComponent(() => import('../components/Video.vue'))
const
Discuss
=
defineAsyncComponent
(()
=>
import
(
'../components/Discuss.vue'
))
const
Result
=
defineAsyncComponent
(()
=>
import
(
'../components/Result.vue'
))
const
ReportDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ReportDialog.vue'
))
const
PrepareDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/PrepareDialog.vue'
))
const
ResultDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ResultDialog.vue'
))
const
route
=
useRoute
()
...
...
@@ -146,6 +148,11 @@ let resizeKey = $ref(0)
function
handleResize
()
{
resizeKey
=
Date
.
now
()
}
// 实验准备
const
prepareDialogVisible
=
$ref
(
false
)
// 实验结果
const
resultDialogVisible
=
$ref
(
false
)
</
script
>
<
template
>
...
...
@@ -186,15 +193,22 @@ function handleResize() {
<
template
#
right
>
<AppCard>
<el-row
justify=
"space-between"
>
<el-button
type=
"primary"
:icon=
"HomeFilled"
:disabled=
"submitted"
@
click=
"handleBackHome"
>
返回首页
</el-button
>
<div>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"handleSubmit"
>
提交
</el-button>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"reportDialogVisible = true"
>
上传报告
</el-button>
<el-button
type=
"primary"
:icon=
"HomeFilled"
:disabled=
"submitted"
@
click=
"handleBackHome"
>
返回首页
</el-button
>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"handleSubmit"
>
提交实验
</el-button>
</div>
<div>
<el-button
type=
"primary"
:disabled=
"disabled"
:loading=
"screenshotLoading"
@
click=
"handleCapture"
>
截图
</el-button
>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"prepareDialogVisible = true"
>
实验准备
</el-button>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"resultDialogVisible = true"
>
实验结果
</el-button>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"reportDialogVisible = true"
>
在线实验报告
</el-button>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"reportDialogVisible = true"
>
上传实验报告
</el-button>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"reportDialogVisible = true"
>
查看实验报告
</el-button>
<el-button
type=
"primary"
:disabled=
"disabled"
@
click=
"reportDialogVisible = true"
>
导出实验报告
</el-button>
</div>
</el-row>
</AppCard>
...
...
@@ -211,6 +225,18 @@ function handleResize() {
:experiment_id=
"form.experiment_id"
@
update=
"fetchInfo"
v-if=
"reportDialogVisible && form.experiment_id"
></ReportDialog>
<!-- 实验准备 -->
<PrepareDialog
v-model=
"prepareDialogVisible"
:experiment_id=
"form.experiment_id"
v-if=
"prepareDialogVisible && form.experiment_id"
></PrepareDialog>
<!-- 实验结果 -->
<ResultDialog
v-model=
"resultDialogVisible"
:experiment_id=
"form.experiment_id"
v-if=
"resultDialogVisible && form.experiment_id"
></ResultDialog>
</template>
<
style
lang=
"scss"
scoped
>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论