Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-lab
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-lab
Commits
d36d9426
提交
d36d9426
authored
9月 21, 2022
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
718c4ccf
隐藏空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
198 行增加
和
44 行删除
+198
-44
api.ts
src/modules/admin/contest/experts/api.ts
+7
-7
FormDialog.vue
src/modules/admin/contest/experts/components/FormDialog.vue
+6
-6
ImportDialog.vue
...modules/admin/contest/experts/components/ImportDialog.vue
+2
-2
ViewDialog.vue
src/modules/admin/contest/experts/components/ViewDialog.vue
+4
-4
index.ts
src/modules/admin/contest/experts/index.ts
+1
-1
types.ts
src/modules/admin/contest/experts/types.ts
+7
-7
Index.vue
src/modules/admin/contest/experts/views/Index.vue
+8
-8
ContestantDialog.vue
...dules/admin/contest/items/components/ContestantDialog.vue
+0
-1
ScoringBookDialog.vue
...ules/admin/contest/items/components/ScoringBookDialog.vue
+150
-0
ScoringExpertsAddDialog.vue
...dmin/contest/items/components/ScoringExpertsAddDialog.vue
+0
-0
ScoringExpertsDialog.vue
...s/admin/contest/items/components/ScoringExpertsDialog.vue
+2
-2
ScoringRulesDialog.vue
...les/admin/contest/items/components/ScoringRulesDialog.vue
+0
-0
View.vue
src/modules/admin/contest/items/views/View.vue
+10
-5
menu.ts
src/stores/menu.ts
+1
-1
没有找到文件。
src/modules/admin/contest/
judge
s/api.ts
→
src/modules/admin/contest/
expert
s/api.ts
浏览文件 @
d36d9426
import
httpRequest
from
'@/utils/axios'
import
httpRequest
from
'@/utils/axios'
import
type
{
JudgeCreateParams
,
Judge
UpdateParams
}
from
'./types'
import
type
{
ExpertCreateParams
,
Expert
UpdateParams
}
from
'./types'
// 获取评分专家列表
// 获取评分专家列表
export
function
get
Judge
List
(
params
?:
{
name
?:
string
;
page
?:
number
;
'per-page'
?:
number
})
{
export
function
get
Expert
List
(
params
?:
{
name
?:
string
;
page
?:
number
;
'per-page'
?:
number
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/list'
,
{
params
})
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/list'
,
{
params
})
}
}
// 获取评分专家详情
// 获取评分专家详情
export
function
get
Judge
(
params
:
{
id
:
string
})
{
export
function
get
Expert
(
params
:
{
id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/detail'
,
{
params
})
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/detail'
,
{
params
})
}
}
// 创建评分专家
// 创建评分专家
export
function
create
Judge
(
data
:
Judge
CreateParams
)
{
export
function
create
Expert
(
data
:
Expert
CreateParams
)
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/expert/create'
,
data
)
return
httpRequest
.
post
(
'/api/resource/v1/backend/expert/create'
,
data
)
}
}
// 修改评分专家
// 修改评分专家
export
function
update
Judge
(
data
:
Judge
UpdateParams
)
{
export
function
update
Expert
(
data
:
Expert
UpdateParams
)
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/expert/update'
,
data
)
return
httpRequest
.
post
(
'/api/resource/v1/backend/expert/update'
,
data
)
}
}
// 修改评分专家
// 修改评分专家
export
function
import
Judge
(
data
:
{
file
:
File
})
{
export
function
import
Expert
(
data
:
{
file
:
File
})
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/expert/import-exports'
,
data
,
{
return
httpRequest
.
post
(
'/api/resource/v1/backend/expert/import-exports'
,
data
,
{
headers
:
{
'Content-Type'
:
'multipart/form-data'
}
headers
:
{
'Content-Type'
:
'multipart/form-data'
}
})
})
}
}
// 获取评分专家赛项列表
// 获取评分专家赛项列表
export
function
get
Judge
ContestList
(
params
:
{
id
:
string
})
{
export
function
get
Expert
ContestList
(
params
:
{
id
:
string
})
{
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/competitions'
,
{
params
})
return
httpRequest
.
get
(
'/api/resource/v1/backend/expert/competitions'
,
{
params
})
}
}
src/modules/admin/contest/
judge
s/components/FormDialog.vue
→
src/modules/admin/contest/
expert
s/components/FormDialog.vue
浏览文件 @
d36d9426
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
Judge
,
Judge
CreateParams
}
from
'../types'
import
type
{
Expert
,
Expert
CreateParams
}
from
'../types'
import
{
ElMessage
}
from
'element-plus'
import
{
ElMessage
}
from
'element-plus'
import
{
create
Judge
,
updateJudge
}
from
'../api'
import
{
create
Expert
,
updateExpert
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
import
{
useMapStore
}
from
'@/stores/map'
import
{
useArea
}
from
'@/composables/useArea'
import
{
useArea
}
from
'@/composables/useArea'
interface
Props
{
interface
Props
{
data
?:
Judge
data
?:
Expert
}
}
const
props
=
defineProps
<
Props
>
()
const
props
=
defineProps
<
Props
>
()
...
@@ -23,7 +23,7 @@ const genderList = useMapStore().getMapValuesByKey('system_gender')
...
@@ -23,7 +23,7 @@ const genderList = useMapStore().getMapValuesByKey('system_gender')
const
positionList
=
useMapStore
().
getMapValuesByKey
(
'expert_position'
)
const
positionList
=
useMapStore
().
getMapValuesByKey
(
'expert_position'
)
const
formRef
=
$ref
<
FormInstance
>
()
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
<
Judge
CreateParams
>
({
const
form
=
reactive
<
Expert
CreateParams
>
({
name
:
''
,
name
:
''
,
mobile
:
''
,
mobile
:
''
,
company
:
''
,
company
:
''
,
...
@@ -74,7 +74,7 @@ function handleSubmit() {
...
@@ -74,7 +74,7 @@ function handleSubmit() {
}
}
// 新增
// 新增
function
handleCreate
()
{
function
handleCreate
()
{
create
Judge
(
form
).
then
(()
=>
{
create
Expert
(
form
).
then
(()
=>
{
ElMessage
({
message
:
'创建成功'
,
type
:
'success'
})
ElMessage
({
message
:
'创建成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
emit
(
'update:modelValue'
,
false
)
...
@@ -83,7 +83,7 @@ function handleCreate() {
...
@@ -83,7 +83,7 @@ function handleCreate() {
// 修改
// 修改
function
handleUpdate
()
{
function
handleUpdate
()
{
if
(
!
props
.
data
?.
id
)
return
if
(
!
props
.
data
?.
id
)
return
update
Judge
({
id
:
props
.
data
.
id
,
...
form
}).
then
(()
=>
{
update
Expert
({
id
:
props
.
data
.
id
,
...
form
}).
then
(()
=>
{
ElMessage
({
message
:
'修改成功'
,
type
:
'success'
})
ElMessage
({
message
:
'修改成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
emit
(
'update:modelValue'
,
false
)
...
...
src/modules/admin/contest/
judge
s/components/ImportDialog.vue
→
src/modules/admin/contest/
expert
s/components/ImportDialog.vue
浏览文件 @
d36d9426
...
@@ -3,7 +3,7 @@ import { Upload } from '@element-plus/icons-vue'
...
@@ -3,7 +3,7 @@ import { Upload } from '@element-plus/icons-vue'
import
{
useFileDialog
}
from
'@vueuse/core'
import
{
useFileDialog
}
from
'@vueuse/core'
import
{
ElMessage
}
from
'element-plus'
import
{
ElMessage
}
from
'element-plus'
import
{
import
Judge
}
from
'../api'
import
{
import
Expert
}
from
'../api'
const
emit
=
defineEmits
<
{
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update'
):
void
...
@@ -20,7 +20,7 @@ function handleImport() {
...
@@ -20,7 +20,7 @@ function handleImport() {
watchEffect
(()
=>
{
watchEffect
(()
=>
{
if
(
!
files
.
value
?.
length
)
return
if
(
!
files
.
value
?.
length
)
return
const
[
file
]
=
files
.
value
const
[
file
]
=
files
.
value
import
Judge
({
file
}).
then
(()
=>
{
import
Expert
({
file
}).
then
(()
=>
{
ElMessage
({
message
:
'导入成功'
,
type
:
'success'
})
ElMessage
({
message
:
'导入成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update'
)
})
})
...
...
src/modules/admin/contest/
judge
s/components/ViewDialog.vue
→
src/modules/admin/contest/
expert
s/components/ViewDialog.vue
浏览文件 @
d36d9426
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
type
{
Judge
}
from
'../types'
import
type
{
Expert
}
from
'../types'
import
{
get
Judge
ContestList
}
from
'../api'
import
{
get
Expert
ContestList
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
import
{
useMapStore
}
from
'@/stores/map'
interface
Props
{
interface
Props
{
data
:
Judge
data
:
Expert
}
}
const
props
=
defineProps
<
Props
>
()
const
props
=
defineProps
<
Props
>
()
...
@@ -15,7 +15,7 @@ const roleList = useMapStore().getMapValuesByKey('expert_role')
...
@@ -15,7 +15,7 @@ const roleList = useMapStore().getMapValuesByKey('expert_role')
const
listOptions
=
{
const
listOptions
=
{
hasPagination
:
false
,
hasPagination
:
false
,
remote
:
{
remote
:
{
httpRequest
:
get
Judge
ContestList
,
httpRequest
:
get
Expert
ContestList
,
params
:
{
id
:
props
.
data
.
id
},
params
:
{
id
:
props
.
data
.
id
},
callback
(
res
:
any
)
{
callback
(
res
:
any
)
{
return
{
list
:
res
.
detail
.
competitions
}
return
{
list
:
res
.
detail
.
competitions
}
...
...
src/modules/admin/contest/
judge
s/index.ts
→
src/modules/admin/contest/
expert
s/index.ts
浏览文件 @
d36d9426
...
@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
...
@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export
const
routes
:
Array
<
RouteRecordRaw
>
=
[
export
const
routes
:
Array
<
RouteRecordRaw
>
=
[
{
{
path
:
'/admin/contest/
judge
s'
,
path
:
'/admin/contest/
expert
s'
,
component
:
AppLayout
,
component
:
AppLayout
,
children
:
[{
path
:
''
,
component
:
()
=>
import
(
'./views/Index.vue'
)
}]
children
:
[{
path
:
''
,
component
:
()
=>
import
(
'./views/Index.vue'
)
}]
}
}
...
...
src/modules/admin/contest/
judge
s/types.ts
→
src/modules/admin/contest/
expert
s/types.ts
浏览文件 @
d36d9426
export
interface
Judge
{
export
interface
Expert
{
id
:
string
id
:
string
sso_id
:
string
sso_id
:
string
name
:
string
name
:
string
...
@@ -12,20 +12,20 @@ export interface Judge {
...
@@ -12,20 +12,20 @@ export interface Judge {
updated_operator
:
string
updated_operator
:
string
created_time
:
string
created_time
:
string
updated_time
:
string
updated_time
:
string
position
:
Judge
Position
position
:
Expert
Position
competition
:
Judge
Competition
competition
:
Expert
Competition
check_count
:
1
check_count
:
1
}
}
export
interface
Judge
Position
{
export
interface
Expert
Position
{
id
:
string
id
:
string
label
:
string
label
:
string
value
:
string
value
:
string
}
}
export
interface
Judge
Competition
{
export
interface
Expert
Competition
{
id
:
string
id
:
string
name
:
string
name
:
string
}
}
export
interface
Judge
CreateParams
{
export
interface
Expert
CreateParams
{
name
:
string
name
:
string
mobile
:
string
mobile
:
string
company
:
string
company
:
string
...
@@ -36,4 +36,4 @@ export interface JudgeCreateParams {
...
@@ -36,4 +36,4 @@ export interface JudgeCreateParams {
area
:
string
area
:
string
}
}
export
type
JudgeUpdateParams
=
Judge
CreateParams
&
{
id
:
string
}
export
type
ExpertUpdateParams
=
Expert
CreateParams
&
{
id
:
string
}
src/modules/admin/contest/
judge
s/views/Index.vue
→
src/modules/admin/contest/
expert
s/views/Index.vue
浏览文件 @
d36d9426
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
type
{
Judge
}
from
'../types'
import
type
{
Expert
}
from
'../types'
import
{
CirclePlus
,
Upload
}
from
'@element-plus/icons-vue'
import
{
CirclePlus
,
Upload
}
from
'@element-plus/icons-vue'
import
AppList
from
'@/components/base/AppList.vue'
import
AppList
from
'@/components/base/AppList.vue'
import
{
get
Judge
List
}
from
'../api'
import
{
get
Expert
List
}
from
'../api'
import
{
useMapStore
}
from
'@/stores/map'
import
{
useMapStore
}
from
'@/stores/map'
import
{
useGetContestList
}
from
'@/composables/useGetContestList'
import
{
useGetContestList
}
from
'@/composables/useGetContestList'
...
@@ -19,7 +19,7 @@ const { contests } = useGetContestList()
...
@@ -19,7 +19,7 @@ const { contests } = useGetContestList()
const
listOptions
=
$computed
(()
=>
{
const
listOptions
=
$computed
(()
=>
{
return
{
return
{
remote
:
{
remote
:
{
httpRequest
:
get
Judge
List
,
httpRequest
:
get
Expert
List
,
params
:
{
competition_id
:
''
,
name
:
''
}
params
:
{
competition_id
:
''
,
name
:
''
}
},
},
filters
:
[
filters
:
[
...
@@ -41,7 +41,7 @@ const listOptions = $computed(() => {
...
@@ -41,7 +41,7 @@ const listOptions = $computed(() => {
{
{
label
:
'性别'
,
label
:
'性别'
,
prop
:
'sex'
,
prop
:
'sex'
,
computed
({
row
}:
{
row
:
Judge
})
{
computed
({
row
}:
{
row
:
Expert
})
{
const
found
=
genderList
.
find
(
item
=>
item
.
value
===
row
.
sex
)
const
found
=
genderList
.
find
(
item
=>
item
.
value
===
row
.
sex
)
return
found
?.
label
||
row
.
sex
return
found
?.
label
||
row
.
sex
}
}
...
@@ -58,11 +58,11 @@ const listOptions = $computed(() => {
...
@@ -58,11 +58,11 @@ const listOptions = $computed(() => {
})
})
const
importVisible
=
$ref
(
false
)
const
importVisible
=
$ref
(
false
)
const
rowData
=
ref
<
Judge
|
undefined
|
null
>
(
null
)
const
rowData
=
ref
<
Expert
|
undefined
|
null
>
(
null
)
// 查看
// 查看
let
viewDialogVisible
=
$ref
(
false
)
let
viewDialogVisible
=
$ref
(
false
)
function
handleView
(
row
:
Judge
)
{
function
handleView
(
row
:
Expert
)
{
rowData
.
value
=
row
rowData
.
value
=
row
viewDialogVisible
=
true
viewDialogVisible
=
true
}
}
...
@@ -75,7 +75,7 @@ function handleAdd() {
...
@@ -75,7 +75,7 @@ function handleAdd() {
// 编辑
// 编辑
let
dialogVisible
=
$ref
(
false
)
let
dialogVisible
=
$ref
(
false
)
function
handleUpdate
(
row
:
Judge
)
{
function
handleUpdate
(
row
:
Expert
)
{
rowData
.
value
=
row
rowData
.
value
=
row
dialogVisible
=
true
dialogVisible
=
true
}
}
...
@@ -93,7 +93,7 @@ function onUpdateSuccess() {
...
@@ -93,7 +93,7 @@ function onUpdateSuccess() {
<el-button
type=
"primary"
round
:icon=
"Upload"
@
click=
"importVisible = true"
>
批量导入
</el-button>
<el-button
type=
"primary"
round
:icon=
"Upload"
@
click=
"importVisible = true"
>
批量导入
</el-button>
</
template
>
</
template
>
<
template
#
table-x=
"{ row }: { row:
Judge
}"
>
<
template
#
table-x=
"{ row }: { row:
Expert
}"
>
<el-button
type=
"primary"
round
@
click=
"handleView(row)"
v-permission=
"'v1-backend-experiment-view'"
<el-button
type=
"primary"
round
@
click=
"handleView(row)"
v-permission=
"'v1-backend-experiment-view'"
>
查看
</el-button
>
查看
</el-button
>
>
...
...
src/modules/admin/contest/items/components/ContestantDialog.vue
浏览文件 @
d36d9426
...
@@ -18,7 +18,6 @@ const listOptions = {
...
@@ -18,7 +18,6 @@ const listOptions = {
filters
:
[{
type
:
'input'
,
prop
:
'student_name'
,
label
:
'选手姓名'
,
placeholder
:
'请输入选手姓名'
}],
filters
:
[{
type
:
'input'
,
prop
:
'student_name'
,
label
:
'选手姓名'
,
placeholder
:
'请输入选手姓名'
}],
columns
:
[
columns
:
[
{
label
:
'序号'
,
type
:
'index'
,
width
:
60
},
{
label
:
'序号'
,
type
:
'index'
,
width
:
60
},
{
label
:
'赛项名称'
,
prop
:
'competition.name'
},
{
label
:
'选手姓名'
,
prop
:
'student.name'
},
{
label
:
'选手姓名'
,
prop
:
'student.name'
},
{
label
:
'参赛ID'
,
prop
:
'login_id'
},
{
label
:
'参赛ID'
,
prop
:
'login_id'
},
{
{
...
...
src/modules/admin/contest/items/components/ScoringBookDialog.vue
0 → 100644
浏览文件 @
d36d9426
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
ContestItem
,
ContestBookItem
,
ContestBookUpdateParams
}
from
'../types'
import
{
ElMessageBox
,
ElMessage
}
from
'element-plus'
import
{
pick
}
from
'lodash-es'
import
AppUpload
from
'@/components/base/AppUpload.vue'
import
{
createContestBook
,
updateContestBook
}
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
}
>
()
const
detail
=
$ref
<
ContestItem
>
(
inject
(
'detail'
))
// 数据状态
const
status
=
useMapStore
().
getMapValuesByKey
(
'system_status'
)
const
formRef
=
$ref
<
FormInstance
>
()
const
form
=
reactive
<
any
>
({
competition_id
:
detail
.
id
,
files
:
[],
url
:
''
,
type
:
''
,
name
:
''
,
status
:
'1'
,
protocol
:
false
})
watchEffect
(()
=>
{
if
(
!
props
.
data
)
return
form
.
files
=
[
JSON
.
parse
(
props
.
data
.
url
)]
Object
.
assign
(
form
,
{
protocol
:
true
},
props
.
data
)
})
const
checkProtocol
=
(
rule
:
any
,
value
:
any
,
callback
:
any
)
=>
{
if
(
!
value
)
{
return
callback
(
new
Error
(
'请阅读并同意'
))
}
else
{
callback
()
}
}
const
rules
=
ref
<
FormRules
>
({
files
:
[{
type
:
'array'
,
required
:
true
,
message
:
'请上传评分细则'
}],
name
:
[{
required
:
true
,
message
:
'请输入评分细则名称'
,
trigger
:
'blur'
}],
course_id
:
[{
required
:
true
,
message
:
'请选择关联训练课程'
,
trigger
:
'change'
}],
experiment_id
:
[{
required
:
true
,
message
:
'请选择关联训练'
,
trigger
:
'change'
}],
protocol
:
[{
validator
:
checkProtocol
,
message
:
'请阅读并同意'
,
trigger
:
'change'
}]
})
const
isUpdate
=
$computed
(()
=>
{
return
!!
props
.
data
?.
id
})
function
handleBeforeUpload
()
{
if
(
form
.
files
.
length
)
{
return
ElMessageBox
.
confirm
(
'系统仅支持1个评分细则,此操作将覆盖原有评分细则文件,确认上传新文件吗?'
,
'提示'
)
}
return
true
}
function
handleUploadSuccess
(
file
:
any
)
{
form
.
name
=
file
.
name
.
split
(
'.'
).
shift
()
form
.
type
=
file
.
raw
.
type
||
'unknown'
}
// 提交
function
handleSubmit
()
{
formRef
?.
validate
().
then
(()
=>
{
const
[
file
]
=
form
.
files
const
params
=
Object
.
assign
({},
pick
(
form
,
[
'competition_id'
,
'name'
,
'type'
,
'status'
]),
{
url
:
JSON
.
stringify
({
name
:
file
.
name
,
url
:
file
.
url
,
size
:
file
.
size
})
})
isUpdate
?
handleUpdate
(
params
)
:
handleCreate
(
params
)
})
}
// 新增
function
handleCreate
(
params
:
ContestBookUpdateParams
)
{
createContestBook
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'创建成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
})
}
// 修改
function
handleUpdate
(
params
:
ContestBookUpdateParams
)
{
updateContestBook
(
params
).
then
(()
=>
{
ElMessage
({
message
:
'修改成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
})
}
</
script
>
<
template
>
<el-dialog
title=
"编辑评分细则"
:close-on-click-modal=
"false"
width=
"600px"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-form
ref=
"formRef"
:model=
"form"
:rules=
"rules"
label-width=
"124px"
>
<el-form-item
label=
"评分细则文件"
prop=
"files"
>
<AppUpload
v-model=
"form.files"
:limit=
"1"
:beforeUpload=
"handleBeforeUpload"
accept=
".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,.pdf,application/pdf,.ppt,.pptx,application/vnd.ms-powerpoint,.csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
@
success=
"handleUploadSuccess"
>
<template
#
tip
>
评分细则文件支持格式包含:doc docx xls xlsx pdf ppt pptx,大小不超过50M
</
template
>
</AppUpload>
</el-form-item>
<el-form-item
label=
"评分细则名称"
prop=
"name"
>
<el-input
v-model=
"form.name"
></el-input>
<p
class=
"form-tips"
>
评分细则名称自动取值于文件名称,可以进行二次修改。
</p>
</el-form-item>
<el-form-item
label=
"关联赛项"
>
<el-input
:value=
"detail.name"
disabled
></el-input>
</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-group>
</el-form-item>
<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-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
>
.form-tips
{
font-size
:
12px
;
color
:
#999
;
}
</
style
>
src/modules/admin/contest/items/components/
Judge
AddDialog.vue
→
src/modules/admin/contest/items/components/
ScoringExperts
AddDialog.vue
浏览文件 @
d36d9426
File moved
src/modules/admin/contest/items/components/
Judge
Dialog.vue
→
src/modules/admin/contest/items/components/
ScoringExperts
Dialog.vue
浏览文件 @
d36d9426
...
@@ -10,7 +10,7 @@ const emit = defineEmits<{
...
@@ -10,7 +10,7 @@ const emit = defineEmits<{
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
}
>
()
const
JudgeAddDialog
=
defineAsyncComponent
(()
=>
import
(
'./Judge
AddDialog.vue'
))
const
ScoringExpertsAddDialog
=
defineAsyncComponent
(()
=>
import
(
'./ScoringExperts
AddDialog.vue'
))
const
detail
=
$ref
<
ContestItem
>
(
inject
(
'detail'
))
const
detail
=
$ref
<
ContestItem
>
(
inject
(
'detail'
))
...
@@ -104,6 +104,6 @@ function handleRemoveClass(index: number) {
...
@@ -104,6 +104,6 @@ function handleRemoveClass(index: number) {
<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>
</el-row>
</el-row>
<
JudgeAddDialog
v-model=
"dialogVisible"
@
add=
"handleAdd"
v-if=
"dialogVisible"
></Judge
AddDialog>
<
ScoringExpertsAddDialog
v-model=
"dialogVisible"
@
add=
"handleAdd"
v-if=
"dialogVisible"
></ScoringExperts
AddDialog>
</el-dialog>
</el-dialog>
</template>
</template>
src/modules/admin/contest/items/components/
Judg
ingRulesDialog.vue
→
src/modules/admin/contest/items/components/
Scor
ingRulesDialog.vue
浏览文件 @
d36d9426
File moved
src/modules/admin/contest/items/views/View.vue
浏览文件 @
d36d9426
...
@@ -6,9 +6,10 @@ import dayjs from 'dayjs'
...
@@ -6,9 +6,10 @@ import dayjs from 'dayjs'
const
ViewBook
=
defineAsyncComponent
(()
=>
import
(
'../components/ViewBook.vue'
))
const
ViewBook
=
defineAsyncComponent
(()
=>
import
(
'../components/ViewBook.vue'
))
const
ViewVideo
=
defineAsyncComponent
(()
=>
import
(
'../components/ViewVideo.vue'
))
const
ViewVideo
=
defineAsyncComponent
(()
=>
import
(
'../components/ViewVideo.vue'
))
const
JudgingRulesDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/Judg
ingRulesDialog.vue'
))
const
ScoringRulesDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/Scor
ingRulesDialog.vue'
))
const
JudgeDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/Judge
Dialog.vue'
))
const
ScoringExpertsDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScoringExperts
Dialog.vue'
))
const
ContestantDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ContestantDialog.vue'
))
const
ContestantDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ContestantDialog.vue'
))
const
ScoringBookDialog
=
defineAsyncComponent
(()
=>
import
(
'../components/ScoringBookDialog.vue'
))
interface
Props
{
interface
Props
{
id
:
string
id
:
string
...
@@ -60,6 +61,8 @@ const judgingRulesVisible = $ref(false)
...
@@ -60,6 +61,8 @@ const judgingRulesVisible = $ref(false)
const
judgeVisible
=
$ref
(
false
)
const
judgeVisible
=
$ref
(
false
)
// 参赛选手
// 参赛选手
const
contestantVisible
=
$ref
(
false
)
const
contestantVisible
=
$ref
(
false
)
// 评分细则
const
judgingBookVisible
=
$ref
(
false
)
</
script
>
</
script
>
<
template
>
<
template
>
...
@@ -68,7 +71,7 @@ const contestantVisible = $ref(false)
...
@@ -68,7 +71,7 @@ const contestantVisible = $ref(false)
<el-button
type=
"primary"
@
click=
"judgingRulesVisible = true"
>
评分规则
</el-button>
<el-button
type=
"primary"
@
click=
"judgingRulesVisible = true"
>
评分规则
</el-button>
<el-button
type=
"primary"
@
click=
"judgeVisible = true"
>
评分专家
</el-button>
<el-button
type=
"primary"
@
click=
"judgeVisible = true"
>
评分专家
</el-button>
<el-button
type=
"primary"
@
click=
"contestantVisible = true"
>
参赛选手
</el-button>
<el-button
type=
"primary"
@
click=
"contestantVisible = true"
>
参赛选手
</el-button>
<el-button
type=
"primary"
>
评分细则
</el-button>
<el-button
type=
"primary"
@
click=
"judgingBookVisible = true"
>
评分细则
</el-button>
</
template
>
</
template
>
<div
class=
"top"
v-if=
"detail"
>
<div
class=
"top"
v-if=
"detail"
>
<div
class=
"top-cover"
>
<div
class=
"top-cover"
>
...
@@ -99,11 +102,13 @@ const contestantVisible = $ref(false)
...
@@ -99,11 +102,13 @@ const contestantVisible = $ref(false)
<ViewVideo
:id=
"id"
></ViewVideo>
<ViewVideo
:id=
"id"
></ViewVideo>
</AppCard>
</AppCard>
<!-- 评分规则 -->
<!-- 评分规则 -->
<
JudgingRulesDialog
v-model=
"judgingRulesVisible"
v-if=
"judgingRulesVisible && detail"
></Judg
ingRulesDialog>
<
ScoringRulesDialog
v-model=
"judgingRulesVisible"
v-if=
"judgingRulesVisible && detail"
></Scor
ingRulesDialog>
<!-- 评分专家 -->
<!-- 评分专家 -->
<
JudgeDialog
v-model=
"judgeVisible"
v-if=
"judgeVisible && detail"
></Judge
Dialog>
<
ScoringExpertsDialog
v-model=
"judgeVisible"
v-if=
"judgeVisible && detail"
></ScoringExperts
Dialog>
<!-- 参赛选手 -->
<!-- 参赛选手 -->
<ContestantDialog
v-model=
"contestantVisible"
v-if=
"contestantVisible && detail"
></ContestantDialog>
<ContestantDialog
v-model=
"contestantVisible"
v-if=
"contestantVisible && detail"
></ContestantDialog>
<!-- 评分细则 -->
<ScoringBookDialog
v-model=
"judgingBookVisible"
v-if=
"judgingBookVisible && detail"
></ScoringBookDialog>
</template>
</template>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
...
...
src/stores/menu.ts
浏览文件 @
d36d9426
...
@@ -95,7 +95,7 @@ const adminMenus: IMenuItem[] = [
...
@@ -95,7 +95,7 @@ const adminMenus: IMenuItem[] = [
},
},
{
{
name
:
'评分专家管理'
,
name
:
'评分专家管理'
,
path
:
'/admin/contest/
judge
s'
path
:
'/admin/contest/
expert
s'
}
}
]
]
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论