Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-lab
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-lab
Commits
a54bd8f3
提交
a54bd8f3
authored
9月 22, 2022
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
5c092036
隐藏空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
327 行增加
和
333 行删除
+327
-333
ContestantDialog.vue
...dules/admin/contest/items/components/ContestantDialog.vue
+11
-1
Index.vue
src/modules/teacher/contest/record/views/Index.vue
+2
-3
api.ts
src/modules/teacher/contest/score/api.ts
+8
-29
ImportDialog.vue
...modules/teacher/contest/score/components/ImportDialog.vue
+0
-59
ScoreDialog.vue
src/modules/teacher/contest/score/components/ScoreDialog.vue
+0
-196
ScorePublishDialog.vue
...s/teacher/contest/score/components/ScorePublishDialog.vue
+68
-0
ScoreViewDialog.vue
...ules/teacher/contest/score/components/ScoreViewDialog.vue
+78
-0
index.ts
src/modules/teacher/contest/score/index.ts
+4
-1
types.ts
src/modules/teacher/contest/score/types.ts
+62
-19
Detail.vue
src/modules/teacher/contest/score/views/Detail.vue
+71
-0
Index.vue
src/modules/teacher/contest/score/views/Index.vue
+23
-25
没有找到文件。
src/modules/admin/contest/items/components/ContestantDialog.vue
浏览文件 @
a54bd8f3
...
...
@@ -36,11 +36,21 @@ const listOptions = {
{
label
:
'更新时间'
,
prop
:
'updated_time'
}
]
}
const
exportUrl
=
$computed
(()
=>
{
return
`/api/resource/v1/backend/competition-competitor/export?competition_id=
${
detail
.
id
}
`
})
</
script
>
<
template
>
<el-dialog
title=
"参赛选手列表"
>
<AppList
v-bind=
"listOptions"
ref=
"appList"
></AppList>
<AppList
v-bind=
"listOptions"
ref=
"appList"
>
<template
#
header-buttons
>
<a
:href=
"exportUrl"
target=
"_blank"
>
<el-button
type=
"primary"
>
导出
</el-button>
</a>
</
template
>
</AppList>
<el-row
justify=
"center"
>
<el-button
round
auto-insert-space
@
click=
"$emit('update:modelValue', false)"
>
关闭
</el-button>
</el-row>
...
...
src/modules/teacher/contest/record/views/Index.vue
浏览文件 @
a54bd8f3
...
...
@@ -67,7 +67,7 @@ const listOptions = $computed(() => {
{
label
:
'所在班级'
,
prop
:
'class_id_name'
},
{
label
:
'训练次数'
,
prop
:
'train_count'
},
{
label
:
'评分规则'
,
prop
:
'competition_is_more_status'
},
{
label
:
'已评分人数'
,
prop
:
'
experiment_name
'
,
slots
:
'table-count'
},
{
label
:
'已评分人数'
,
prop
:
'
checked_count
'
,
slots
:
'table-count'
},
{
label
:
'已评分'
,
prop
:
'checked_flag_name'
},
{
label
:
'得分'
,
prop
:
'score'
,
slots
:
'table-score'
},
{
label
:
'更新时间'
,
prop
:
'updated_time'
},
...
...
@@ -138,8 +138,7 @@ function onUpdateSuccess() {
v-model=
"dialogVisible"
:data=
"rowData"
@
update=
"onUpdateSuccess"
v-if=
"dialogVisible && rowData"
></ScoreDialog>
v-if=
"dialogVisible && rowData"
></ScoreDialog>
<!-- 批量导入 -->
<ImportDialog
v-model=
"importVisible"
@
update=
"onUpdateSuccess"
v-if=
"importVisible"
></ImportDialog>
</template>
...
...
src/modules/teacher/contest/score/api.ts
浏览文件 @
a54bd8f3
import
httpRequest
from
'@/utils/axios'
// 获取实验记录列表
export
function
getExperimentRecordList
(
params
?:
{
course_id
?:
string
experiment_id
?:
string
specialty_id
?:
string
class_id
?:
string
student_name
?:
string
page
?:
number
page_size
?:
number
})
{
// 获取赛项成绩列表
export
function
getContestScoreList
(
params
?:
{
competition_id
?:
string
;
page
?:
number
;
'per-page'
?:
number
})
{
return
httpRequest
.
get
(
'/api/lab/v1/expert/score/list'
,
{
params
})
}
...
...
@@ -18,25 +10,12 @@ export function getFilterList() {
return
httpRequest
.
get
(
'/api/lab/v1/expert/score/condition'
)
}
// 获取
实验记录详情
export
function
get
ExperimentRecord
(
params
:
{
experiment_id
:
string
;
student_id
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/
teacher/record/view
'
,
{
params
})
// 获取
选手列表
export
function
get
ContestantsList
(
params
:
{
competition_id
:
string
;
page
?:
number
;
'per-page'
?:
number
})
{
return
httpRequest
.
get
(
'/api/lab/v1/
expert/score/competitors
'
,
{
params
})
}
// 实验记录评分
export
function
checkExperimentRecord
(
data
:
{
experiment_id
:
string
student_id
:
string
operate
:
number
result
:
number
file
:
number
})
{
return
httpRequest
.
post
(
'/api/lab/v1/teacher/record/check'
,
data
)
}
// 批量导入实验记录评分
export
function
uploadCheckExperimentRecord
(
data
:
{
file
:
File
})
{
return
httpRequest
.
post
(
'/api/lab/v1/teacher/record/upload'
,
data
,
{
headers
:
{
'Content-Type'
:
'multipart/form-data'
}
})
// 发布成绩
export
function
publishScore
(
data
:
{
id
:
string
})
{
return
httpRequest
.
post
(
'/api/lab/v1/expert/score/publish'
,
data
)
}
src/modules/teacher/contest/score/components/ImportDialog.vue
deleted
100644 → 0
浏览文件 @
5c092036
<
script
setup
lang=
"ts"
>
import
{
Upload
}
from
'@element-plus/icons-vue'
import
{
useFileDialog
}
from
'@vueuse/core'
import
{
ElMessage
}
from
'element-plus'
import
{
uploadCheckExperimentRecord
}
from
'../api'
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
}
>
()
// 批量导入
const
{
files
,
open
}
=
useFileDialog
()
function
handleImport
()
{
open
({
accept
:
'.csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel'
,
multiple
:
false
})
}
watchEffect
(()
=>
{
if
(
!
files
.
value
?.
length
)
return
const
[
file
]
=
files
.
value
uploadCheckExperimentRecord
({
file
}).
then
(()
=>
{
ElMessage
({
message
:
'导入成功'
,
type
:
'success'
})
emit
(
'update'
)
})
})
</
script
>
<
template
>
<el-dialog
title=
"批量导入"
:close-on-click-modal=
"false"
width=
"400px"
>
<div
class=
"box"
>
<el-button
type=
"primary"
round
:icon=
"Upload"
@
click=
"handleImport"
>
本地上传
</el-button>
<p>
<a
href=
"https://webapp-pub.ezijing.com/project/saas-lab/%E5%AE%9E%E9%AA%8C%E6%88%90%E7%BB%A9%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx"
download
>
下载模板
</a
>
</p>
</div>
</el-dialog>
</
template
>
<
style
lang=
"scss"
scoped
>
.box
{
padding
:
20px
0
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
.el-button
{
width
:
220px
;
}
p
{
color
:
#999
;
margin-left
:
20px
;
}
}
</
style
>
src/modules/teacher/contest/score/components/ScoreDialog.vue
deleted
100644 → 0
浏览文件 @
5c092036
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
RecordItem
,
FileItem
}
from
'../types'
import
{
Document
}
from
'@element-plus/icons-vue'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
{
getExperimentRecord
,
checkExperimentRecord
}
from
'../api'
interface
Props
{
data
:
RecordItem
}
const
props
=
defineProps
<
Props
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
let
detail
=
$ref
<
RecordItem
>
()
function
fetchInfo
()
{
getExperimentRecord
({
experiment_id
:
props
.
data
.
experiment_id
,
student_id
:
props
.
data
.
student_id
}).
then
(
res
=>
{
detail
=
res
.
data
})
}
watchEffect
(()
=>
{
fetchInfo
()
})
// 实验报告文件
const
file
=
$computed
<
FileItem
>
(()
=>
{
try
{
return
detail
?.
file
?
JSON
.
parse
(
detail
.
file
)
:
null
}
catch
(
error
)
{
console
.
log
(
error
)
}
return
null
})
// 实验过程截图
const
pictures
=
$computed
<
FileItem
[]
>
(()
=>
{
try
{
return
detail
?.
pictures
?
JSON
.
parse
(
detail
.
pictures
)
:
[]
}
catch
(
error
)
{
console
.
log
(
error
)
}
return
[]
})
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
<
{
operate
?:
number
;
result
?:
number
;
file
?:
number
}
>
({
operate
:
undefined
,
result
:
undefined
,
file
:
undefined
})
const
score
=
$computed
<
number
>
(()
=>
{
const
result
=
((
form
.
operate
||
0
)
+
(
form
.
result
||
0
)
+
(
form
.
file
||
0
))
/
3
return
parseFloat
(
result
.
toFixed
(
2
))
})
const
rules
=
ref
<
FormRules
>
({
operate
:
[{
required
:
true
,
message
:
'请输入1~100数字'
}],
result
:
[{
required
:
true
,
message
:
'请输入1~100数字'
}],
file
:
[{
required
:
true
,
message
:
'请输入1~100数字'
}]
})
// 提交
function
handleSubmit
()
{
formRef
?.
validate
().
then
(()
=>
{
ElMessageBox
.
confirm
(
'成绩评分不能修改,确认要保存该成绩吗?'
,
'提示'
).
then
(()
=>
{
const
params
:
any
=
{
...
form
,
experiment_id
:
props
.
data
.
experiment_id
,
student_id
:
props
.
data
.
student_id
}
checkExperimentRecord
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'保存成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
})
})
})
}
</
script
>
<
template
>
<el-dialog
title=
"学生实验评分"
:close-on-click-modal=
"false"
width=
"700px"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-form
:rules=
"rules"
label-width=
"120px"
label-suffix=
":"
v-if=
"detail"
>
<el-row>
<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-col
:span=
"12"
>
<el-form-item
label=
"学生姓名"
>
{{
detail
.
student_name
}}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"学生学号"
>
{{
detail
.
sno_number
}}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"所属专业"
>
{{
detail
.
specialty_name
}}
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"所属班级"
>
{{
detail
.
class_name
}}
</el-form-item>
</el-col>
</el-row>
<el-form-item
label=
"实验成绩"
class=
"form-item-score"
>
<el-form
ref=
"formRef"
:model=
"form"
:rules=
"rules"
hide-required-asterisk
inline
label-position=
"top"
style=
"padding: 5px 0 20px"
>
<el-form-item
label=
"实验操作"
prop=
"operate"
>
<el-input-number
:min=
"1"
:max=
"100"
:controls=
"false"
step-strictly
v-model=
"form.operate"
/>
</el-form-item>
<el-form-item
label=
"实验结果"
prop=
"result"
>
<el-input-number
:min=
"1"
:max=
"100"
:controls=
"false"
step-strictly
v-model=
"form.result"
/>
</el-form-item>
<el-form-item
label=
"实验报告"
prop=
"file"
>
<el-input-number
:min=
"1"
:max=
"100"
:controls=
"false"
step-strictly
v-model=
"form.file"
/>
</el-form-item>
<el-form-item
label=
"综合实验成绩"
>
<el-input-number
:min=
"0"
:max=
"100"
:controls=
"false"
disabled
v-model=
"score"
/>
</el-form-item>
</el-form>
</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-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
>
<
style
lang=
"scss"
scoped
>
.file-item
{
display
:
flex
;
align-items
:
center
;
color
:
var
(
--
main-color
);
.el-icon
{
margin-right
:
5px
;
}
}
.picture-list
{
width
:
100%
;
li
{
display
:
flex
;
justify-content
:
space-between
;
}
a
{
color
:
var
(
--
main-color
);
}
.t1
{
flex
:
1
;
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
overflow
:
hidden
;
}
}
.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
>
src/modules/teacher/contest/score/components/ScorePublishDialog.vue
0 → 100644
浏览文件 @
a54bd8f3
<
script
setup
lang=
"ts"
>
import
type
{
ContestScoreItem
}
from
'../types'
import
{
ElMessage
}
from
'element-plus'
import
{
publishScore
}
from
'../api'
interface
Props
{
data
:
ContestScoreItem
}
const
props
=
defineProps
<
Props
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
// 发布
function
handleSubmit
()
{
publishScore
({
id
:
props
.
data
.
id
}).
then
(()
=>
{
ElMessage
.
success
(
'发布成功'
)
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
})
}
</
script
>
<
template
>
<el-dialog
title=
"发布成绩"
width=
"500px"
:close-on-click-modal=
"false"
@
update:modelValue=
"$emit('update:modelValue')"
>
<div
class=
"content"
>
<p>
请确认赛项成绩之后再进行发布成绩!
</p>
<p>
赛项名称:
<b>
{{
data
.
name
}}
</b>
</p>
<br
/>
<p>
<span>
报名人数:
{{
data
.
all_competitor_count
}}
</span>
<span>
完赛人数:
{{
data
.
complete_competitor_count
}}
</span>
<span>
已评分人数:
{{
data
.
checked_competitor_count
}}
</span>
</p>
<br
/>
<p>
请确认是否发布成绩!
</p>
</div>
<el-row
justify=
"center"
style=
"margin-top: 40px"
>
<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-dialog>
</
template
>
<
style
lang=
"scss"
scoped
>
.content
{
text-align
:
center
;
p
{
margin
:
10px
0
;
}
b
{
color
:
var
(
--
main-color
);
}
span
+
span
{
margin-left
:
40px
;
}
}
</
style
>
\ No newline at end of file
src/modules/teacher/contest/score/components/ScoreViewDialog.vue
0 → 100644
浏览文件 @
a54bd8f3
<
script
setup
lang=
"ts"
>
import
type
{
ContestantScoreItem
,
CheckItem
}
from
'../types'
interface
Props
{
data
:
ContestantScoreItem
}
const
props
=
defineProps
<
Props
>
()
// 列表配置
const
listOptions
=
$computed
(()
=>
{
const
columns
=
[
{
label
:
'评分规则'
,
prop
:
'name'
},
{
label
:
'分值'
,
prop
:
'old_score'
},
{
label
:
'占比(%)'
,
prop
:
'ratio'
},
{
label
:
'系统评分'
,
prop
:
'organ_id_name'
,
computed
({
row
}:
{
row
:
CheckItem
}):
string
{
if
(
row
.
type
===
'2'
)
{
const
scoreValues
=
Object
.
values
(
row
.
score
)
return
scoreValues
[
0
]
||
''
}
else
{
return
'--'
}
}
}
]
props
.
data
.
check_details_experts
?.
forEach
(
item
=>
{
columns
.
push
({
label
:
item
.
name
+
'评分'
,
prop
:
item
.
sso_id
,
computed
({
row
}:
{
row
:
CheckItem
}):
string
{
if
(
row
.
type
===
'2'
)
{
return
'--'
}
else
{
return
row
.
score
[
item
.
sso_id
]
||
'--'
}
}
})
})
const
data
=
props
.
data
.
check_details
?.
map
(
item
=>
{
return
{
...
item
,
...
item
.
score
}
})
return
{
columns
,
data
}
})
</
script
>
<
template
>
<el-dialog
title=
"评分详情"
>
<el-descriptions
:column=
"2"
>
<el-descriptions-item
label=
"赛项名称:"
:span=
"2"
>
{{
data
.
competition_id_name
}}
</el-descriptions-item>
<el-descriptions-item
label=
"选手姓名:"
>
{{
data
.
student_name
}}
</el-descriptions-item>
<el-descriptions-item
label=
"选手ID:"
>
{{
data
.
login_id
}}
</el-descriptions-item>
<el-descriptions-item
label=
"评分规则:"
>
{{
data
.
competition_is_more_status
}}
</el-descriptions-item>
<el-descriptions-item
label=
"计算规则:"
>
{{
data
.
competition_rule_type
}}
</el-descriptions-item>
</el-descriptions>
<AppList
v-bind=
"listOptions"
></AppList>
<p
class=
"result"
>
最终得分:
<span>
{{
data
.
score_name
}}
</span>
</p>
<el-row
justify=
"center"
style=
"margin-top: 40px"
>
<el-button
round
auto-insert-space
@
click=
"$emit('update:modelValue', false)"
>
关闭
</el-button>
</el-row>
</el-dialog>
</
template
>
<
style
lang=
"scss"
scoped
>
.result
{
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
span
{
padding
:
0
10px
;
font-size
:
40px
;
color
:
var
(
--
main-color
);
}
}
</
style
>
src/modules/teacher/contest/score/index.ts
浏览文件 @
a54bd8f3
...
...
@@ -5,6 +5,9 @@ export const routes: Array<RouteRecordRaw> = [
{
path
:
'/teacher/contest/score'
,
component
:
AppLayout
,
children
:
[{
path
:
''
,
component
:
()
=>
import
(
'./views/Index.vue'
)
}]
children
:
[
{
path
:
''
,
component
:
()
=>
import
(
'./views/Index.vue'
)
},
{
path
:
':id'
,
component
:
()
=>
import
(
'./views/Detail.vue'
),
props
:
true
}
]
}
]
src/modules/teacher/contest/score/types.ts
浏览文件 @
a54bd8f3
export
interface
RecordItem
{
check_time
:
string
checker_id
?:
string
class_id
:
string
class_name
:
string
commit_time
:
string
course_name
?:
string
experiment_id
:
string
experiment_name
:
string
file
?:
string
pictures
?:
string
export
interface
ContestScoreItem
{
id
:
string
name
:
string
host_unit_id
:
string
type
:
string
publish_status
:
string
updated_time
:
string
host_unit_id_name
:
string
type_name
:
string
publish_status_name
:
string
teachers
:
string
[]
expert_count
:
number
all_competitor_count
:
number
complete_competitor_count
:
number
checked_competitor_count
:
number
}
export
interface
ContestantScoreItem
{
id
:
string
competition_id
:
string
student_id
:
string
login_id
:
string
grade
:
string
train_count
:
string
score
:
string
score_
details
?
:
string
sno_number
:
string
score_
status
:
string
updated_time
:
string
specialty_id
:
string
specialty_name
:
string
status
:
0
|
1
|
2
status_name
:
string
student_id
:
string
specialty_id_name
:
string
class_id
:
string
class_id_name
:
string
student_name
:
string
sno_number
:
string
organ_id
:
string
organ_id_name
:
string
gender
:
string
competition_id_name
:
string
competition_is_more_status
:
string
competition_rule_type
:
string
competition_rubric
:
ScoreBook
checked_count
:
number
need_check_count
:
number
checked_flag
:
true
checked_flag_name
:
string
score_name
:
string
publish_status
:
string
publish_status_name
:
string
check_details_experts
:
CheckExpert
[]
check_details
:
CheckItem
[]
}
export
interface
CheckItem
{
id
:
string
name
:
string
type
:
string
old_score
:
string
ratio
:
string
type_name
:
string
score
:
Record
<
string
,
string
>
}
export
interface
CheckExpert
{
sso_id
:
string
name
:
string
}
export
interface
FileItem
{
export
interface
ScoreBook
{
name
:
string
url
:
string
upload_time
:
string
}
src/modules/teacher/contest/score/views/Detail.vue
0 → 100644
浏览文件 @
a54bd8f3
<
script
setup
lang=
"ts"
>
import
type
{
ContestantScoreItem
}
from
'../types'
import
AppList
from
'@/components/base/AppList.vue'
import
{
getContestantsList
}
from
'../api'
const
ScoreViewDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScoreViewDialog.vue'
))
interface
Props
{
id
:
string
}
const
props
=
defineProps
<
Props
>
()
const
appList
=
$ref
<
InstanceType
<
typeof
AppList
>
|
null
>
(
null
)
// 列表配置
const
listOptions
=
$computed
(()
=>
{
return
{
remote
:
{
httpRequest
:
getContestantsList
,
params
:
{
competition_id
:
props
.
id
}
},
columns
:
[
{
label
:
'序号'
,
type
:
'index'
,
width
:
60
},
{
label
:
'选手姓名'
,
prop
:
'student_name'
},
{
label
:
'参赛ID'
,
prop
:
'login_id'
},
{
label
:
'性别'
,
prop
:
'gender'
},
{
label
:
'所在学校'
,
prop
:
'organ_id_name'
},
{
label
:
'所在专业'
,
prop
:
'specialty_id_name'
},
{
label
:
'所在年级'
,
prop
:
'grade'
},
{
label
:
'训练次数'
,
prop
:
'train_count'
},
{
label
:
'评分规则'
,
prop
:
'competition_is_more_status'
},
{
label
:
'已评分人数'
,
prop
:
'checked_count'
,
slots
:
'table-count'
},
{
label
:
'得分'
,
prop
:
'score_name'
},
{
label
:
'更新时间'
,
prop
:
'updated_time'
},
{
label
:
'操作'
,
slots
:
'table-x'
,
width
:
140
}
]
}
})
let
dialogVisible
=
$ref
(
false
)
const
rowData
=
ref
<
ContestantScoreItem
>
()
// 查看评分详情
function
handleView
(
row
:
ContestantScoreItem
)
{
rowData
.
value
=
row
dialogVisible
=
true
}
function
onUpdateSuccess
()
{
appList
?.
refetch
()
}
</
script
>
<
template
>
<AppCard
title=
"发布成绩"
>
<el-descriptions>
<el-descriptions-item
label=
"赛项名称:"
>
{{
$route
.
query
.
name
}}
</el-descriptions-item>
</el-descriptions>
<AppList
v-bind=
"listOptions"
ref=
"appList"
>
<template
#
table-count=
"
{ row }">
{{
row
.
checked_count
}}
/
{{
row
.
need_check_count
}}
</
template
>
<
template
#
table-x=
"{ row }"
>
<el-button
text
type=
"primary"
@
click=
"handleView(row)"
v-permission=
"'v1-teacher-record-check'"
>
查看评分详情
</el-button>
</
template
>
</AppList>
</AppCard>
<ScoreViewDialog
:data=
"rowData"
v-model=
"dialogVisible"
@
update=
"onUpdateSuccess"
v-if=
"dialogVisible && rowData"
></ScoreViewDialog>
</template>
src/modules/teacher/contest/score/views/Index.vue
浏览文件 @
a54bd8f3
<
script
setup
lang=
"ts"
>
import
type
{
Record
Item
}
from
'../types'
import
type
{
ContestScore
Item
}
from
'../types'
import
AppList
from
'@/components/base/AppList.vue'
import
{
get
ExperimentRecord
List
}
from
'../api'
import
{
get
ContestScore
List
}
from
'../api'
import
{
useFilterList
}
from
'../composables/useFilterList'
const
ScoreDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScoreDialog.vue'
))
const
ImportDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ImportDialog.vue'
))
const
ScorePublishDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScorePublishDialog.vue'
))
const
{
competitions
}
=
useFilterList
()
...
...
@@ -15,10 +14,8 @@ const appList = $ref<InstanceType<typeof AppList> | null>(null)
const
listOptions
=
$computed
(()
=>
{
return
{
remote
:
{
httpRequest
:
getExperimentRecordList
,
params
:
{
competition_id
:
''
}
httpRequest
:
getContestScoreList
,
params
:
{
competition_id
:
''
}
},
filters
:
[
{
...
...
@@ -46,11 +43,10 @@ const listOptions = $computed(() => {
]
}
})
const
importVisible
=
$ref
(
false
)
let
dialogVisible
=
$ref
(
false
)
const
rowData
=
ref
<
Record
Item
>
()
//
评分
function
handle
Score
(
row
:
Record
Item
)
{
const
rowData
=
ref
<
ContestScore
Item
>
()
//
发布成绩
function
handle
Publish
(
row
:
ContestScore
Item
)
{
rowData
.
value
=
row
dialogVisible
=
true
}
...
...
@@ -64,24 +60,26 @@ function onUpdateSuccess() {
<AppList
v-bind=
"listOptions"
ref=
"appList"
>
<template
#
table-teachers=
"
{ row }">
{{
row
.
teachers
.
join
()
}}
</
template
>
<
template
#
table-x=
"{ row }"
>
<el-button
round
type=
"primary"
@
click=
"handleScore(row)"
v-permission=
"'v1-teacher-record-check'"
>
查看成绩
</el-button
>
<el-button
round
type=
"primary"
@
click=
"handleScore(row)"
v-permission=
"'v1-teacher-record-check'"
>
发布赛项成绩
</el-button
>
<el-button
round
type=
"primary"
v-permission=
"'v1-teacher-record-check'"
>
<router-link
:to=
"`/teacher/contest/score/$
{row.id}?name=${row.name}`" target="_blank">查看成绩
</router-link>
</el-button>
<el-button
round
type=
"primary"
@
click=
"handlePublish(row)"
v-permission=
"'v1-teacher-record-check'"
v-if=
"row.publish_status !== '1'"
>
发布赛项成绩
</el-button>
</
template
>
</AppList>
</AppCard>
<!-- 评分 -->
<ScoreDialog
v-model=
"dialogVisible"
<!-- 发布赛项成绩 -->
<ScorePublishDialog
:data=
"rowData"
v-model=
"dialogVisible"
@
update=
"onUpdateSuccess"
v-if=
"dialogVisible && rowData"
></ScoreDialog>
<!-- 批量导入 -->
<ImportDialog
v-model=
"importVisible"
@
update=
"onUpdateSuccess"
v-if=
"importVisible"
></ImportDialog>
v-if=
"dialogVisible && rowData"
></ScorePublishDialog>
</template>
<
style
lang=
"scss"
scoped
>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论