Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-lab
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-lab
Commits
77229fcc
提交
77229fcc
authored
9月 21, 2022
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
d36d9426
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
289 行增加
和
88 行删除
+289
-88
api.ts
src/modules/admin/contest/items/api.ts
+32
-9
ContestantDialog.vue
...dules/admin/contest/items/components/ContestantDialog.vue
+2
-2
ScoringExpertsAddDialog.vue
...dmin/contest/items/components/ScoringExpertsAddDialog.vue
+3
-3
ScoringExpertsDialog.vue
...s/admin/contest/items/components/ScoringExpertsDialog.vue
+3
-3
ScoringRulesBookDialog.vue
...admin/contest/items/components/ScoringRulesBookDialog.vue
+23
-18
ScoringRulesDialog.vue
...les/admin/contest/items/components/ScoringRulesDialog.vue
+199
-39
Index.vue
src/modules/admin/contest/items/views/Index.vue
+2
-2
View.vue
src/modules/admin/contest/items/views/View.vue
+15
-12
dictionary.ts
src/utils/dictionary.ts
+10
-0
没有找到文件。
src/modules/admin/contest/items/api.ts
浏览文件 @
77229fcc
...
...
@@ -8,12 +8,12 @@ import type {
}
from
'./types'
// 获取赛项列表
export
function
getContest
Item
List
(
params
?:
{
page
?:
number
;
'per-page'
?:
number
})
{
export
function
getContestList
(
params
?:
{
page
?:
number
;
'per-page'
?:
number
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/competition/list'
,
{
params
})
}
// 获取赛项详情
export
function
getContest
Item
(
params
:
{
id
:
string
})
{
export
function
getContest
(
params
:
{
id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/competition/detail'
,
{
params
})
}
...
...
@@ -32,9 +32,32 @@ export function getTeacherList(params?: { name?: string }) {
return
httpRequest
.
get
(
'/api/resource/v1/backend/teacher/faculty-advisers'
,
{
params
})
}
// 获取评分规则详情
export
function
getContestRules
(
params
:
{
competition_id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/competition-rule/detail'
,
{
params
})
}
// 更新评分规则
export
function
updateContestRules
(
data
:
ContestUpdateParams
)
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/competition-rule/save'
,
data
)
return
httpRequest
.
post
(
'/api/resource/v1/backend/competition-rule/save'
,
data
,
{
headers
:
{
'Content-Type'
:
'application/json'
}
})
}
// 获取考试列表
export
function
getExamList
(
params
:
{
project
:
string
;
q
?:
string
;
name
?:
string
;
page
?:
number
;
per_page
?:
number
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/exam/search-all-exam'
,
{
params
})
}
// 获取评分细则详情
export
function
getContestRuleBook
(
params
:
{
competition_id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/competition-rubric/detail'
,
{
params
})
}
// 创建评分细则
export
function
createContestRuleBook
(
data
:
ContestBookUpdateParams
)
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/competition-rubric/create'
,
data
)
}
// 更新评分细则
export
function
updateContestRuleBook
(
data
:
ContestBookUpdateParams
)
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/competition-rubric/update'
,
data
)
}
// 获取赛项指导书详情
...
...
@@ -80,25 +103,25 @@ export function deleteContestVideo(data: { id: string }) {
}
// 获取赛项评分专家列表
export
function
getContest
Judge
List
(
params
:
{
id
:
string
})
{
export
function
getContest
Expert
List
(
params
:
{
id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/competition/experts'
,
{
params
})
}
// 获取赛项未绑定的评分专家列表
export
function
getContestUnbind
Judge
List
(
params
:
{
competition_id
:
string
})
{
export
function
getContestUnbind
Expert
List
(
params
:
{
competition_id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/unbind-competition-list'
,
{
params
})
}
// 更新赛项评分专家
export
function
updateContest
Judge
(
data
:
{
id
:
string
;
experts
:
Record
<
string
,
any
>
[]
})
{
export
function
updateContest
Expert
(
data
:
{
id
:
string
;
experts
:
Record
<
string
,
any
>
[]
})
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/competition/bind-experts'
,
data
,
{
headers
:
{
'Content-Type'
:
'application/json'
}
})
}
// 获取评分专家详情
export
function
get
Judge
(
params
:
{
id
:
string
})
{
export
function
get
Expert
(
params
:
{
id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/detail'
,
{
params
})
}
// 获取赛项选手列表
export
function
getContest
Contest
antList
(
params
?:
{
student_name
?:
string
;
page
?:
number
;
'per-page'
?:
number
})
{
export
function
getContestantList
(
params
?:
{
student_name
?:
string
;
page
?:
number
;
'per-page'
?:
number
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/competition-competitor/list'
,
{
params
})
}
src/modules/admin/contest/items/components/ContestantDialog.vue
浏览文件 @
77229fcc
<
script
setup
lang=
"ts"
>
import
type
{
ContestItem
}
from
'../types'
import
AppList
from
'@/components/base/AppList.vue'
import
{
getContest
Contest
antList
}
from
'../api'
import
{
getContestantList
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
const
detail
=
$ref
<
ContestItem
>
(
inject
(
'detail'
))
...
...
@@ -12,7 +12,7 @@ const genderList = useMapStore().getMapValuesByKey('system_gender')
const
listOptions
=
{
remote
:
{
httpRequest
:
getContest
Contest
antList
,
httpRequest
:
getContestantList
,
params
:
{
competition_id
:
detail
.
id
,
student_name
:
''
}
},
filters
:
[{
type
:
'input'
,
prop
:
'student_name'
,
label
:
'选手姓名'
,
placeholder
:
'请输入选手姓名'
}],
...
...
src/modules/admin/contest/items/components/ScoringExpertsAddDialog.vue
浏览文件 @
77229fcc
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
ContestItem
}
from
'../types'
import
{
getContestUnbind
JudgeList
,
getJudge
}
from
'../api'
import
{
getContestUnbind
ExpertList
,
getExpert
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
const
emit
=
defineEmits
<
{
...
...
@@ -15,14 +15,14 @@ const detail = $ref<ContestItem>(inject('detail'))
let
list
=
$ref
<
any
>
([])
function
fetchList
()
{
getContestUnbind
Judge
List
({
competition_id
:
detail
.
id
}).
then
(
res
=>
{
getContestUnbind
Expert
List
({
competition_id
:
detail
.
id
}).
then
(
res
=>
{
list
=
res
.
data
.
list
||
[]
})
}
let
info
=
$ref
<
any
>
()
function
fetchInfo
(
id
:
string
)
{
if
(
id
)
{
get
Judge
({
id
}).
then
(
res
=>
{
get
Expert
({
id
}).
then
(
res
=>
{
info
=
res
.
data
.
detail
})
}
else
{
...
...
src/modules/admin/contest/items/components/ScoringExpertsDialog.vue
浏览文件 @
77229fcc
...
...
@@ -3,7 +3,7 @@ import type { ContestItem } from '../types'
import
{
CirclePlus
}
from
'@element-plus/icons-vue'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
AppList
from
'@/components/base/AppList.vue'
import
{
getContest
JudgeList
,
updateContestJudge
}
from
'../api'
import
{
getContest
ExpertList
,
updateContestExpert
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
const
emit
=
defineEmits
<
{
...
...
@@ -22,7 +22,7 @@ const roleList = useMapStore().getMapValuesByKey('expert_role')
let
list
=
$ref
<
any
>
([])
function
fetchList
()
{
getContest
Judge
List
({
id
:
detail
.
id
}).
then
((
res
:
any
)
=>
{
getContest
Expert
List
({
id
:
detail
.
id
}).
then
((
res
:
any
)
=>
{
list
=
res
.
data
.
detail
})
}
...
...
@@ -73,7 +73,7 @@ function handleSubmit() {
const
experts
=
list
.
map
((
item
:
any
)
=>
{
return
{
id
:
item
.
id
,
expert_id
:
item
.
expert_id
,
role
:
item
.
info
.
role
}
})
updateContest
Judge
({
id
:
detail
.
id
,
experts
}).
then
(()
=>
{
updateContest
Expert
({
id
:
detail
.
id
,
experts
}).
then
(()
=>
{
ElMessage
.
success
(
'保存成功'
)
emit
(
'update:modelValue'
,
false
)
})
...
...
src/modules/admin/contest/items/components/ScoringBookDialog.vue
→
src/modules/admin/contest/items/components/Scoring
Rules
BookDialog.vue
浏览文件 @
77229fcc
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
ContestItem
,
ContestBook
Item
,
ContestBook
UpdateParams
}
from
'../types'
import
type
{
ContestItem
,
ContestBookUpdateParams
}
from
'../types'
import
{
ElMessageBox
,
ElMessage
}
from
'element-plus'
import
{
pick
}
from
'lodash-es'
import
AppUpload
from
'@/components/base/AppUpload.vue'
import
{
createContestBook
,
updateContest
Book
}
from
'../api'
import
{
getContestRuleBook
,
createContestRuleBook
,
updateContestRule
Book
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
interface
Props
{
data
:
ContestBookItem
}
const
props
=
defineProps
<
Props
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
...
...
@@ -24,6 +19,7 @@ const status = useMapStore().getMapValuesByKey('system_status')
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
<
any
>
({
id
:
''
,
competition_id
:
detail
.
id
,
files
:
[],
url
:
''
,
...
...
@@ -32,10 +28,18 @@ const form = reactive<any>({
status
:
'1'
,
protocol
:
false
})
watchEffect
(()
=>
{
if
(
!
props
.
data
)
return
form
.
files
=
[
JSON
.
parse
(
props
.
data
.
url
)]
Object
.
assign
(
form
,
{
protocol
:
true
},
props
.
data
)
function
fetchInfo
()
{
getContestRuleBook
({
competition_id
:
detail
.
id
}).
then
(
res
=>
{
const
data
=
res
.
data
.
detail
if
(
data
?.
id
)
{
form
.
files
=
[
JSON
.
parse
(
data
.
url
)]
Object
.
assign
(
form
,
{
protocol
:
true
},
data
)
}
})
}
onMounted
(()
=>
{
fetchInfo
()
})
const
checkProtocol
=
(
rule
:
any
,
value
:
any
,
callback
:
any
)
=>
{
...
...
@@ -52,8 +56,9 @@ const rules = ref<FormRules>({
experiment_id
:
[{
required
:
true
,
message
:
'请选择关联训练'
,
trigger
:
'change'
}],
protocol
:
[{
validator
:
checkProtocol
,
message
:
'请阅读并同意'
,
trigger
:
'change'
}]
})
const
isUpdate
=
$computed
(()
=>
{
return
!!
props
.
data
?
.
id
return
!!
form
.
id
})
function
handleBeforeUpload
()
{
...
...
@@ -79,16 +84,16 @@ function handleSubmit() {
}
// 新增
function
handleCreate
(
params
:
ContestBookUpdateParams
)
{
createContestBook
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'
创建
成功'
,
type
:
'success'
})
createContest
Rule
Book
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'
保存
成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
})
}
// 修改
function
handleUpdate
(
params
:
ContestBookUpdateParams
)
{
updateContestBook
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'
修改
成功'
,
type
:
'success'
})
updateContest
Rule
Book
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'
保存
成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
})
...
...
@@ -126,14 +131,14 @@ function handleUpdate(params: ContestBookUpdateParams) {
<el-radio
v-for=
"item in status"
:key=
"item.id"
:label=
"item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
prop=
"protocol"
>
<
!-- <
el-form-item prop="protocol">
<el-checkbox label="我已阅读并同意" v-model="form.protocol" />
<a
href="https://view.officeapps.live.com/op/view.aspx?src=https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/%E7%B4%AB%E8%8D%86%E6%95%99%E8%82%B2%E7%94%A8%E6%88%B7%E5%85%A5%E9%A9%BB%E5%8F%8A%E7%BD%91%E7%BB%9C%E6%95%99%E5%AD%A6%E8%B5%84%E6%BA%90%E5%8D%8F%E8%AE%AE(1).docx"
target="_blank"
>《紫荆教育用户入驻及网络教学资源协议》</a
>
</el-form-item>
</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>
...
...
src/modules/admin/contest/items/components/ScoringRulesDialog.vue
浏览文件 @
77229fcc
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
ContestItem
}
from
'../types'
import
{
Plus
}
from
'@element-plus/icons-vue'
import
{
ElMessage
}
from
'element-plus'
import
{
updateContestRules
}
from
'../api'
import
{
getContestRules
,
updateContestRules
,
getExamList
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
import
{
scoreRuleList
}
from
'@/utils/dictionary'
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
...
...
@@ -12,29 +14,96 @@ const emit = defineEmits<{
const
detail
=
$ref
<
ContestItem
>
(
inject
(
'detail'
))
// 评分方法
const
scoreMethods
=
useMapStore
().
getMapValuesByKey
(
'scoring_manner'
)
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
({
name
:
''
,
competition_id
:
''
,
is_more_status
:
1
,
rule_type
:
1
,
const
form
=
reactive
<
any
>
({
name
:
detail
.
name
,
competition_id
:
detail
.
id
,
is_more_status
:
'1'
,
rule_type
:
'1'
,
lowest_number
:
undefined
,
detail_list
:
[]
})
const
rules
=
ref
<
FormRules
>
({
name
:
[{
required
:
true
,
message
:
'请输入赛项名称
'
}]
lowest_number
:
[{
required
:
true
,
message
:
'请输入评分人数
'
}]
})
watchEffect
(()
=>
{
form
.
name
=
detail
.
name
form
.
competition_id
=
detail
.
id
// 获取评分规则详情
function
fetchInfo
()
{
getContestRules
({
competition_id
:
detail
.
id
}).
then
(
res
=>
{
const
data
=
res
.
data
.
detail
if
(
!
data
)
return
const
detailList
=
data
.
details
.
map
((
item
:
any
)
=>
{
return
{
id
:
item
.
id
,
exam_id
:
item
.
exam_id
,
name
:
item
.
name
,
old_score
:
parseFloat
(
item
.
old_score
),
ratio
:
parseFloat
(
item
.
ratio
),
type
:
item
.
type
}
})
Object
.
assign
(
form
,
{
detail_list
:
detailList
,
is_more_status
:
data
.
is_more_status
,
rule_type
:
data
.
rule_type
,
lowest_number
:
parseInt
(
data
.
lowest_number
)
})
})
}
let
examList
=
$ref
<
Record
<
string
,
any
>
[]
>
([])
// 获取关联考试列表
function
fetchExamList
()
{
getExamList
({
project
:
'exam_x1'
,
per_page
:
1000
}).
then
(
res
=>
{
examList
=
res
.
data
.
list
||
[]
})
}
onMounted
(()
=>
{
fetchInfo
()
fetchExamList
()
})
// 最低评分人数
const
minLowestNumber
=
$computed
(()
=>
{
return
form
.
rule_type
===
'3'
?
3
:
2
})
// 合计
const
total
=
$computed
(()
=>
{
return
form
.
detail_list
.
reduce
((
result
:
number
,
item
:
any
)
=>
{
return
result
+
(
item
.
ratio
||
0
)
},
0
)
})
// 添加
function
handleAdd
()
{
form
.
detail_list
.
push
({
id
:
'0'
,
exam_id
:
''
,
name
:
''
,
type
:
undefined
,
old_score
:
100
,
ratio
:
undefined
})
}
// 删除
function
handleRemove
(
index
:
number
)
{
form
.
detail_list
.
splice
(
index
,
1
)
}
// 提交
function
handleSubmit
()
{
formRef
?.
validate
().
then
(()
=>
{
const
params
=
{
...
form
for
(
let
i
=
0
;
i
<
form
.
detail_list
.
length
;
i
++
)
{
const
item
=
form
.
detail_list
[
i
]
if
(
!
item
.
name
||
!
item
.
type
||
!
item
.
old_score
||
!
item
.
ratio
||
(
item
.
type
===
'2'
&&
!
item
.
exam_id
))
{
ElMessage
.
error
(
`第
${
i
+
1
}
行规则配置错误,请检查后重试`
)
return
}
}
if
(
total
<
100
)
{
ElMessage
.
error
(
'占比总和未达到100'
)
return
}
formRef
?.
validate
().
then
(()
=>
{
const
detailList
=
form
.
detail_list
.
map
((
item
:
any
)
=>
{
item
.
exam_id
=
item
.
exam_id
||
'0'
return
item
})
const
params
=
Object
.
assign
({},
form
,
{
detail_list
:
detailList
})
updateContestRules
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'保存成功'
,
type
:
'success'
})
emit
(
'update'
)
...
...
@@ -42,6 +111,32 @@ function handleSubmit() {
})
})
}
// 当前评分方法
function
currentScoreMethods
(
value
:
string
)
{
const
found
=
form
.
detail_list
.
find
((
item
:
any
)
=>
[
'2'
,
'3'
].
includes
(
item
.
type
))
if
(
!
[
'2'
,
'3'
].
includes
(
value
)
&&
found
)
{
return
scoreMethods
.
filter
(
item
=>
!
[
'2'
,
'3'
].
includes
(
item
.
value
))
}
return
scoreMethods
}
// 评分方法改变
function
handleTypeChange
(
row
:
any
)
{
row
.
exam_id
=
''
if
(
row
.
type
===
'2'
)
{
row
.
old_score
=
100
}
}
// 占比改变
function
handleRatioChange
(
row
:
any
,
index
:
number
)
{
const
otherTotal
=
form
.
detail_list
.
reduce
((
result
:
number
,
item
:
any
,
i
:
number
)
=>
{
if
(
index
!==
i
)
{
result
+=
item
.
ratio
||
0
}
return
result
},
0
)
// 最大可输入占比
row
.
ratio
=
Math
.
min
(
100
-
otherTotal
,
row
.
ratio
)
}
</
script
>
<
template
>
...
...
@@ -57,51 +152,89 @@ function handleSubmit() {
</el-form-item>
<el-form-item
label=
"多人评分"
prop=
"is_more_status"
>
<el-radio-group
v-model=
"form.is_more_status"
>
<el-radio
:label=
"1"
>
是
</el-radio>
<el-radio
:label=
"0"
>
否
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"多人评分成绩计算规则"
prop=
"status"
>
<el-radio-group
v-model=
"form.status"
>
<el-radio
v-for=
"item in status"
:key=
"item.id"
:label=
"item.value"
>
{{
item
.
label
}}
</el-radio>
<el-radio
label=
"1"
>
是
</el-radio>
<el-radio
label=
"0"
>
否
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"最低评分人数"
prop=
"lowest_number"
>
<el-input-number
v-model=
"form.lowest_number"
step-strictly
:controls=
"false"
/>
</el-form-item>
<el-form-item>
<el-table>
<el-table-column
prop=
"date"
label=
"评分规则"
>
<template
v-if=
"form.is_more_status === '1'"
>
<el-form-item
label=
"多人评分成绩计算规则"
prop=
"rule_type"
>
<el-radio-group
v-model=
"form.rule_type"
>
<el-radio
v-for=
"item in scoreRuleList"
:key=
"item.value"
:label=
"item.value"
>
{{
item
.
label
}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"最低评分人数"
prop=
"lowest_number"
>
<el-input-number
v-model=
"form.lowest_number"
step-strictly
:min=
"minLowestNumber"
:controls=
"false"
/>
<p
class=
"tips"
>
此处填写对应计算规则的最低评分人数。
<br
/>
综合得分法>=3,其余方法>=2
</p>
</el-form-item>
</
template
>
<el-form-item
class=
"form-table-list"
>
<el-row
justify=
"end"
style=
"width: 100%; margin-bottom: 10px"
>
<el-button
type=
"primary"
:icon=
"Plus"
@
click=
"handleAdd"
></el-button>
</el-row>
<el-table
:data=
"form.detail_list"
:header-cell-style=
"{ background: '#ededed' }"
>
<el-table-column
prop=
"date"
label=
"评分规则"
align=
"center"
>
<
template
#
default=
"{ row }"
>
<el-input
/>
<el-input
v-model=
"row.name"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"date"
label=
"评分方法"
>
<el-table-column
prop=
"date"
label=
"评分方法"
align=
"center"
width=
"124"
>
<
template
#
default=
"{ row }"
>
<el-input
/>
<el-select
v-model=
"row.type"
@
change=
"handleTypeChange(row)"
>
<el-option
v-for=
"item in currentScoreMethods(row.type)"
:key=
"item.id"
:label=
"item.label"
:value=
"item.value"
></el-option>
</el-select>
</
template
>
</el-table-column>
<el-table-column
prop=
"date"
label=
"关联考试"
>
<el-table-column
prop=
"date"
label=
"关联考试"
align=
"center"
>
<
template
#
default=
"{ row }"
>
<el-input
/>
<el-select
v-model=
"row.exam_id"
filterable
v-if=
"row.type === '2'"
>
<el-option
v-for=
"item in examList"
:key=
"item.exam_id"
:label=
"item.name"
:value=
"item.exam_id"
></el-option>
</el-select>
</
template
>
</el-table-column>
<el-table-column
prop=
"date"
label=
"分值"
>
<el-table-column
prop=
"date"
label=
"分值"
align=
"center"
width=
"100"
>
<
template
#
default=
"{ row }"
>
<el-input
/>
<el-input-number
v-model=
"row.old_score"
:min=
"0"
:controls=
"false"
:disabled=
"row.type === '2'"
style=
"width: 100%"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"date"
label=
"占比(%)"
>
<
template
#
default=
"{ row }"
>
<el-input
/>
<el-table-column
prop=
"date"
label=
"占比(%)"
align=
"center"
width=
"100"
>
<
template
#
default=
"{ row, $index }"
>
<el-input-number
v-model=
"row.ratio"
:min=
"0"
:controls=
"false"
@
change=
"handleRatioChange(row, $index)"
style=
"width: 100%"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"date"
label=
"操作"
>
<
template
#
default=
"{
row
}"
>
<el-
button
type=
"text"
>
删除
</el-button
>
<el-table-column
prop=
"date"
label=
"操作"
align=
"center"
width=
"60"
>
<
template
#
default=
"{
$index
}"
>
<el-
link
type=
"primary"
@
click=
"handleRemove($index)"
>
删除
</el-link
>
</
template
>
</el-table-column>
</el-table>
<div
class=
"total"
v-if=
"form.detail_list.length"
>
<p>
合计:{{ total }}%
</p>
</div>
</el-form-item>
<el-row
justify=
"center"
>
<el-button
type=
"primary"
round
auto-insert-space
@
click=
"handleSubmit"
>
保存
</el-button>
...
...
@@ -110,3 +243,30 @@ function handleSubmit() {
</el-form>
</el-dialog>
</template>
<
style
lang=
"scss"
scoped
>
.tips
{
margin-left
:
10px
;
font-size
:
12px
;
line-height
:
1
.2
;
color
:
#979393
;
}
.form-table-list
{
:deep
(
.el-form-item__content
)
{
margin-left
:
0
!
important
;
}
}
.total
{
width
:
100%
;
padding
:
10px
60px
;
text-align
:
right
;
box-sizing
:
border-box
;
p
{
display
:
inline-block
;
min-width
:
100px
;
text-align
:
center
;
color
:
#016fa0
;
background-color
:
#ededed
;
}
}
</
style
>
src/modules/admin/contest/items/views/Index.vue
浏览文件 @
77229fcc
...
...
@@ -2,7 +2,7 @@
import
type
{
ContestItem
}
from
'../types'
import
{
CirclePlus
}
from
'@element-plus/icons-vue'
import
AppList
from
'@/components/base/AppList.vue'
import
{
getContest
Item
List
}
from
'../api'
import
{
getContestList
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
// 赛项类型
...
...
@@ -15,7 +15,7 @@ const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 列表配置
const
listOptions
=
{
remote
:
{
httpRequest
:
getContest
Item
List
httpRequest
:
getContestList
},
columns
:
[
{
label
:
'序号'
,
type
:
'index'
,
width
:
60
},
...
...
src/modules/admin/contest/items/views/View.vue
浏览文件 @
77229fcc
<
script
setup
lang=
"ts"
>
import
type
{
ContestItem
}
from
'../types'
import
{
getContest
Item
}
from
'../api'
import
{
getContest
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
import
dayjs
from
'dayjs'
...
...
@@ -9,7 +9,7 @@ const ViewVideo = defineAsyncComponent(() => import('../components/ViewVideo.vue
const
ScoringRulesDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScoringRulesDialog.vue'
))
const
ScoringExpertsDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScoringExpertsDialog.vue'
))
const
ContestantDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ContestantDialog.vue'
))
const
Scoring
BookDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/Scoring
BookDialog.vue'
))
const
Scoring
RulesBookDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScoringRules
BookDialog.vue'
))
interface
Props
{
id
:
string
...
...
@@ -42,7 +42,7 @@ const statusText = $computed(() => {
})
function
fetchInfo
()
{
getContest
Item
({
id
:
props
.
id
}).
then
(
res
=>
{
getContest
({
id
:
props
.
id
}).
then
(
res
=>
{
detail
=
res
.
data
.
detail
})
}
...
...
@@ -56,22 +56,22 @@ function formatDateTime(timestamp: number): string {
return
dayjs
(
timestamp
*
1000
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
}
// 评分规则
const
judg
ingRulesVisible
=
$ref
(
false
)
const
scor
ingRulesVisible
=
$ref
(
false
)
// 评分专家
const
judge
Visible
=
$ref
(
false
)
const
scoringExperts
Visible
=
$ref
(
false
)
// 参赛选手
const
contestantVisible
=
$ref
(
false
)
// 评分细则
const
judging
BookVisible
=
$ref
(
false
)
const
scoringRules
BookVisible
=
$ref
(
false
)
</
script
>
<
template
>
<AppCard
title=
"查看赛项信息"
>
<template
#
header-aside
>
<el-button
type=
"primary"
@
click=
"
judg
ingRulesVisible = true"
>
评分规则
</el-button>
<el-button
type=
"primary"
@
click=
"
judge
Visible = true"
>
评分专家
</el-button>
<el-button
type=
"primary"
@
click=
"
scor
ingRulesVisible = true"
>
评分规则
</el-button>
<el-button
type=
"primary"
@
click=
"
scoringExperts
Visible = true"
>
评分专家
</el-button>
<el-button
type=
"primary"
@
click=
"contestantVisible = true"
>
参赛选手
</el-button>
<el-button
type=
"primary"
@
click=
"
judging
BookVisible = true"
>
评分细则
</el-button>
<el-button
type=
"primary"
@
click=
"
scoringRules
BookVisible = true"
>
评分细则
</el-button>
</
template
>
<div
class=
"top"
v-if=
"detail"
>
<div
class=
"top-cover"
>
...
...
@@ -102,13 +102,16 @@ const judgingBookVisible = $ref(false)
<ViewVideo
:id=
"id"
></ViewVideo>
</AppCard>
<!-- 评分规则 -->
<ScoringRulesDialog
v-model=
"
judgingRulesVisible"
v-if=
"judg
ingRulesVisible && detail"
></ScoringRulesDialog>
<ScoringRulesDialog
v-model=
"
scoringRulesVisible"
v-if=
"scor
ingRulesVisible && detail"
></ScoringRulesDialog>
<!-- 评分专家 -->
<ScoringExpertsDialog
v-model=
"
judgeVisible"
v-if=
"judge
Visible && detail"
></ScoringExpertsDialog>
<ScoringExpertsDialog
v-model=
"
scoringExpertsVisible"
v-if=
"scoringExperts
Visible && detail"
></ScoringExpertsDialog>
<!-- 参赛选手 -->
<ContestantDialog
v-model=
"contestantVisible"
v-if=
"contestantVisible && detail"
></ContestantDialog>
<!-- 评分细则 -->
<ScoringBookDialog
v-model=
"judgingBookVisible"
v-if=
"judgingBookVisible && detail"
></ScoringBookDialog>
<ScoringRulesBookDialog
v-model=
"scoringRulesBookVisible"
v-if=
"scoringRulesBookVisible && detail"
></ScoringRulesBookDialog>
</template>
<
style
lang=
"scss"
>
...
...
src/utils/dictionary.ts
浏览文件 @
77229fcc
...
...
@@ -9,3 +9,13 @@ export const contestMode: Record<string, any> = {
}
// 参赛模式列表
export
const
contestModeList
=
json2Array
(
contestMode
,
false
)
// 评分规则
export
const
scoreRule
:
Record
<
string
,
any
>
=
{
1
:
'平均法'
,
2
:
'加权平均法'
,
3
:
'综合得分法'
,
4
:
'最高分'
}
// 参赛模式列表
export
const
scoreRuleList
=
json2Array
(
scoreRule
,
false
)
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论