Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
center-exam-show
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
center-exam-show
Commits
db4b2303
提交
db4b2303
authored
7月 23, 2021
作者:
lihuihui
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update: 优化缓存请求
上级
9c8e7ffe
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
166 行增加
和
129 行删除
+166
-129
.config.pro.js
.config.pro.js
+1
-1
question.vue
src/components/exam/question.vue
+165
-127
examAnswer.vue
src/pages/exam/examAnswer.vue
+0
-1
没有找到文件。
.config.pro.js
浏览文件 @
db4b2303
...
...
@@ -3,7 +3,7 @@ module.exports = {
DesDir
:
'./client-dist'
,
apiBaseURL
:
'/api'
,
isUploadStatic
:
false
,
isEnableToIphoneDebugger
:
tru
e
,
isEnableToIphoneDebugger
:
fals
e
,
webpack
:
{
externals
:
{
'CKEDITOR'
:
'window.CKEDITOR'
,
...
...
src/components/exam/question.vue
浏览文件 @
db4b2303
<
template
>
<div>
<!-- 单选多选判断题(题目描述dom结构一样,只那选项区分) -->
<template
v-if=
"questionData.question_item_type == 1 || questionData.question_item_type == 2 || questionData.question_item_type == 6"
>
<template
v-if=
"
questionData.question_item_type == 1 ||
questionData.question_item_type == 2 ||
questionData.question_item_type == 6
"
>
<div
class=
"title-type"
>
<div
class=
"type"
>
{{
questionData
.
question_item_title
}}
</div>
<div
class=
"num"
>
{{
questionData
.
q_order
}}
/
{{
questionParams
.
question
.
total_question_count
}}
</div>
</div>
<div
class=
"title"
>
<div
class=
"num"
>
{{
questionData
.
q_order
}}
.
</div><div
class=
"des"
v-html=
"questionData.content"
></div>
<div
class=
"num"
>
{{
questionData
.
q_order
}}
.
</div>
<div
class=
"des"
v-html=
"questionData.content"
></div>
</div>
<!--
<div
class=
"describe"
></div>
-->
<ul
:class=
"questionData.question_item_type == 2 ? 'check-option' : 'radio-option'"
>
<template
v-for=
"(item, index) in questionData.options"
>
<li
:key=
"index"
:class=
"questionParams.answerRecord[questionData.question_item_id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id].answer.find(id =>
{ return id === item.id })
? 'active'
:class=
"
questionParams.answerRecord[questionData.question_item_id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id].answer.find(id =>
{
return id === item.id
})
? 'active'
: ''
: ''
: ''
: ''"
"
>
<div
@
click=
"
changeOptions(questionData.question_item_type, questionData.question_item_id, questionData.id, item.id)
"
>
<div
@
click=
"changeOptions(questionData.question_item_type, questionData.question_item_id, questionData.id, item.id)"
>
<div
class=
"icon"
></div>
<div
class=
"txt"
v-html=
"item.option"
></div>
</div>
...
...
@@ -37,9 +52,15 @@
<div
class=
"num"
>
{{
questionData
.
q_order
}}
/
{{
questionParams
.
question
.
total_question_count
}}
</div>
</div>
<div
class=
"title"
>
<div
class=
"num"
>
{{
questionData
.
q_order
}}
.
</div><div
class=
"des"
v-html=
"questionData.content"
></div>
<div
class=
"num"
>
{{
questionData
.
q_order
}}
.
</div>
<div
class=
"des"
v-html=
"questionData.content"
></div>
</div>
<el-input
@
input=
"QAChange(questionData.question_item_id, questionData.id)"
type=
"textarea"
placeholder=
"请输入内容"
v-model=
"questionData.textContent"
></el-input>
<el-input
@
input=
"QAChange(questionData.question_item_id, questionData.id)"
type=
"textarea"
placeholder=
"请输入内容"
v-model=
"questionData.textContent"
></el-input>
</
template
>
<!-- 复合题 -->
<
template
v-if=
"questionData.question_item_type == 5"
>
...
...
@@ -54,25 +75,33 @@
<template
v-for=
"(item, index) in questionData.list"
>
<li
:key=
"'type5' + index"
>
<div
class=
"title"
>
<div
class=
"num"
>
{{
item
.
q_order
}}
.
</div><div
class=
"des"
v-html=
"item.content"
></div>
<div
class=
"num"
>
{{
item
.
q_order
}}
.
</div>
<div
class=
"des"
v-html=
"item.content"
></div>
</div>
<ul
:class=
"item.type == 2 ? 'check-option' : 'radio-option'"
>
<!-- radio-option check-option -->
<ul
:class=
"item.type == 2 ? 'check-option' : 'radio-option'"
>
<!-- radio-option check-option -->
<template
v-if=
"item.options"
>
<template
v-for=
"(items, cIndex) in item.options"
>
<li
:id=
"items.id"
:key=
"'c' + cIndex"
:class=
"questionParams.answerRecord[questionData.question_item_id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id].answer.find(id =>
{ return id === items.id })
? 'active'
:class=
"
questionParams.answerRecord[questionData.question_item_id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id]
? questionParams.answerRecord[questionData.question_item_id][questionData.id].answer.find(
id =>
{
return id === items.id
}
)
? 'active'
: ''
: ''
: ''
: ''
"
>
"
>
<div
@
click=
"changeOptions(item.type, questionData.question_item_id, questionData.id, items.id)"
>
<div
class=
"icon"
></div>
<div
class=
"txt"
>
{{
items
.
option
}}
</div>
<div
class=
"txt"
>
{{
items
.
option
}}
</div>
</div>
</li>
</
template
>
...
...
@@ -90,8 +119,7 @@ import action from '@action'
import
Bus
from
'@/components/common/bus.js'
import
_
from
'lodash'
export
default
{
components
:
{
},
components
:
{},
props
:
{
contentHeight
:
{
type
:
Number
,
default
:
()
=>
{}
},
questionParams
:
{
type
:
Object
,
default
:
()
=>
{}
}
...
...
@@ -107,13 +135,12 @@ export default {
beforeDestroy
()
{
clearInterval
(
this
.
setCacheTime
)
},
created
()
{
},
created
()
{},
mounted
()
{
clearInterval
(
this
.
setCacheTime
)
this
.
setCacheTime
=
setInterval
(()
=>
{
this
.
setCache
()
},
3
000
)
},
10
000
)
this
.
dataCombined
()
},
methods
:
{
...
...
@@ -122,7 +149,9 @@ export default {
this
.
questionParams
.
question
.
question_items
.
map
((
item
,
index
)
=>
{
if
(
parseInt
(
item
.
question_item_type
)
===
5
)
{
item
.
question_list
.
map
(
cItem
=>
{
const
currentItem
=
cItem
.
list
.
find
(
items
=>
{
return
items
.
q_order
===
this
.
questionParams
.
questionIndex
+
1
})
const
currentItem
=
cItem
.
list
.
find
(
items
=>
{
return
items
.
q_order
===
this
.
questionParams
.
questionIndex
+
1
})
if
(
currentItem
)
{
this
.
questionData
=
{}
this
.
questionData
.
common_content
=
cItem
.
common_content
...
...
@@ -146,14 +175,17 @@ export default {
}
})
}
else
{
const
currentItem
=
item
.
question_list
.
find
(
items
=>
{
return
items
.
q_order
===
this
.
questionParams
.
questionIndex
+
1
})
const
currentItem
=
item
.
question_list
.
find
(
items
=>
{
return
items
.
q_order
===
this
.
questionParams
.
questionIndex
+
1
})
if
(
currentItem
)
{
this
.
questionData
=
currentItem
const
key
=
[
'question_item_id'
,
'question_item_title'
,
'question_item_type'
]
key
.
map
(
k
=>
{
this
.
questionData
[
k
]
=
item
[
k
]
})
typeof
this
.
questionData
.
options
===
'string'
&&
(
this
.
questionData
.
options
=
JSON
.
parse
(
currentItem
.
options
))
typeof
this
.
questionData
.
options
===
'string'
&&
(
this
.
questionData
.
options
=
JSON
.
parse
(
currentItem
.
options
))
const
pId
=
this
.
questionData
.
question_item_id
const
cId
=
this
.
questionData
.
id
console
.
log
(
this
.
questionData
.
question_item_id
,
this
.
questionData
.
id
,
'321++'
)
...
...
@@ -174,56 +206,58 @@ export default {
QAChange
(
pId
,
cId
)
{
this
.
questionParams
.
answerRecord
[
pId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
=
[
this
.
questionData
.
textContent
]
:
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
answer
:
[
this
.
questionData
.
textContent
],
sign
:
false
}
:
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
answer
:
[
this
.
questionData
.
textContent
],
sign
:
false
}
}
?
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
=
[
this
.
questionData
.
textContent
])
:
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
answer
:
[
this
.
questionData
.
textContent
],
sign
:
false
})
:
(
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
answer
:
[
this
.
questionData
.
textContent
],
sign
:
false
}
})
this
.
$forceUpdate
()
},
// 选项选择
changeOptions
:
_
.
debounce
(
function
(
type
,
pId
,
cId
,
optId
)
{
changeOptions
:
_
.
debounce
(
function
(
type
,
pId
,
cId
,
optId
)
{
if
(
parseInt
(
type
)
!==
2
)
{
this
.
questionParams
.
answerRecord
[
pId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
=
[
optId
]
:
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
answer
:
[
optId
],
sign
:
false
}
:
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
answer
:
[
optId
],
sign
:
false
}
}
?
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
=
[
optId
])
:
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
answer
:
[
optId
],
sign
:
false
})
:
(
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
answer
:
[
optId
],
sign
:
false
}
})
}
else
{
this
.
questionParams
.
answerRecord
[
pId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
?
(()
=>
{
const
optChack
=
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
.
findIndex
(
item
=>
{
return
item
===
optId
})
if
(
optChack
===
-
1
)
{
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
.
push
(
optId
)
}
else
{
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
.
splice
(
optChack
,
1
)
const
optChack
=
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
.
findIndex
(
item
=>
{
return
item
===
optId
})
if
(
optChack
===
-
1
)
{
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
.
push
(
optId
)
}
else
{
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
answer
.
splice
(
optChack
,
1
)
}
})()
:
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
answer
:
[
optId
],
sign
:
false
})
:
(
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
answer
:
[
optId
],
sign
:
false
}
})()
:
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
answer
:
[
optId
],
sign
:
false
}
:
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
answer
:
[
optId
],
sign
:
false
}
}
})
}
Bus
.
$emit
(
'monitoringChanges'
)
this
.
$forceUpdate
()
...
...
@@ -232,26 +266,29 @@ export default {
const
param
=
{
answer
:
JSON
.
stringify
(
this
.
questionParams
.
answerRecord
)
}
action
.
Exam
.
setCache
(
this
.
$route
.
params
.
examId
,
param
).
then
(
res
=>
{
}).
catch
(
err
=>
{
if
(
err
.
message
.
indexOf
(
'error'
)
!==
-
1
)
{
this
.
$confirm
(
'网络异常,请保持网络通畅'
,
'提示'
,
{
confirmButtonText
:
'退出考试'
,
cancelButtonText
:
'重新提交'
,
type
:
'warning'
}).
then
(()
=>
{
this
.
$router
.
replace
({
path
:
`/login/
${
JSON
.
parse
(
window
.
localStorage
.
getItem
(
'examInfo'
)).
exam_id
}
`
action
.
Exam
.
setCache
(
this
.
$route
.
params
.
examId
,
param
)
.
then
(
res
=>
{})
.
catch
(
err
=>
{
if
(
err
.
message
.
indexOf
(
'error'
)
!==
-
1
)
{
this
.
$confirm
(
'网络异常,请保持网络通畅'
,
'提示'
,
{
confirmButtonText
:
'退出考试'
,
cancelButtonText
:
'重新提交'
,
type
:
'warning'
})
}).
catch
(()
=>
{
this
.
endExamRequest
()
})
}
else
{
this
.
$alert
(
err
.
message
,
{
callback
:
action
=>
{}
})
}
})
.
then
(()
=>
{
this
.
$router
.
replace
({
path
:
`/login/
${
JSON
.
parse
(
window
.
localStorage
.
getItem
(
'examInfo'
)).
exam_id
}
`
})
})
.
catch
(()
=>
{
this
.
endExamRequest
()
})
}
else
{
this
.
$alert
(
err
.
message
,
{
callback
:
action
=>
{}
})
}
})
},
// 标记
onSignHandle
()
{
...
...
@@ -260,18 +297,18 @@ export default {
this
.
questionParams
.
answerRecord
[
pId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
sign
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
sign
=
false
:
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
sign
=
true
:
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
sign
:
true
,
answer
:
[]
}
:
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
sign
:
true
,
answer
:
[]
}
}
?
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
sign
=
false
)
:
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
sign
=
true
)
:
(
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
=
{
sign
:
true
,
answer
:
[]
})
:
(
this
.
questionParams
.
answerRecord
[
pId
]
=
{
[
cId
]:
{
sign
:
true
,
answer
:
[]
}
})
this
.
signCallback
()
},
signCallback
()
{
...
...
@@ -280,9 +317,9 @@ export default {
let
isSign
=
false
this
.
questionParams
.
answerRecord
[
pId
]
?
this
.
questionParams
.
answerRecord
[
pId
][
cId
]
?
isSign
=
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
sign
:
isSign
=
false
:
isSign
=
false
?
(
isSign
=
this
.
questionParams
.
answerRecord
[
pId
][
cId
].
sign
)
:
(
isSign
=
false
)
:
(
isSign
=
false
)
this
.
$emit
(
'isSign'
,
isSign
)
Bus
.
$emit
(
'monitoringChanges'
)
},
...
...
@@ -327,60 +364,61 @@ export default {
}
</
script
>
<
style
lang=
"scss"
scoped
>
::v-deep
{
.el-textarea__inner
{
::v-deep
{
.el-textarea__inner
{
height
:
150px
;
}
}
.title-type
{
.title-type
{
width
:
100%
;
height
:
45px
;
border-bottom
:
1px
solid
#ccc
;
border-bottom
:
1px
solid
#ccc
;
display
:
flex
;
align-items
:
center
;
.type
{
.type
{
font-size
:
18px
;
color
:
#222222
;
}
.num
{
.num
{
margin-left
:
auto
;
font-size
:
18px
;
color
:
#222222
;
}
}
.title
{
.title
{
font-size
:
18px
;
font-weight
:
bold
;
color
:
#222222
;
line-height
:
25px
;
display
:
flex
;
.num
{
.num
{
font-size
:
32px
;
font-weight
:
bold
;
color
:
#222222
;
line-height
:
45px
;
margin-top
:
5px
;
}
.des
{
.des
{
margin-left
:
5px
;
padding-top
:
18px
;
&
:
:
v-deep
p
{
&
:
:
v-deep
p
{
margin
:
0
;
}
}
}
.describe
{
.describe
{
font-size
:
18px
;
color
:
#222222
;
line-height
:
25px
;
margin-top
:
20px
;
}
.radio-option
,
.check-option
{
.radio-option
,
.check-option
{
padding
:
24px
0
0
0
;
margin
:
0
;
list-style
:
none
;
li
{
li
{
// cursor: pointer;
margin-bottom
:
20px
;
// display: flex;
...
...
@@ -389,7 +427,7 @@ export default {
div
{
float
:
left
;
cursor
:
pointer
;
.icon
{
.icon
{
width
:
18px
;
height
:
18px
;
border
:
1px
solid
#999999
;
...
...
@@ -397,14 +435,14 @@ export default {
margin-top
:
3px
;
float
:
left
;
}
.txt
{
.txt
{
max-width
:
95%
;
font-size
:
18px
;
color
:
#222222
;
line-height
:
28px
;
margin-left
:
10px
;
float
:
left
;
&
:
:
v-deep
p
{
&
:
:
v-deep
p
{
margin
:
0
;
}
}
...
...
@@ -423,30 +461,30 @@ export default {
// line-height: 28px;
// margin-left: 10px;
// }
&
.active
{
.icon
{
&
.active
{
.icon
{
width
:
8px
;
height
:
8px
;
border
:
6px
solid
#
C
01540
;
border
:
6px
solid
#
c
01540
;
}
}
}
}
.check-option
{
.icon
{
.check-option
{
.icon
{
border-radius
:
3px
!
important
;
}
}
.case-que
{
.case-que
{
display
:
flex
;
.stem
{
.stem
{
flex
:
1
;
font-size
:
14px
;
font-weight
:
bold
;
color
:
#222222
;
line-height
:
28px
;
}
.topics
{
.topics
{
flex
:
1
;
margin
:
0
;
padding
:
0
0
0
20px
;
...
...
@@ -456,13 +494,13 @@ export default {
&
:
:-
webkit-scrollbar
{
display
:
none
;
}
li
{
.title
{
li
{
.title
{
font-size
:
18px
;
font-weight
:
bold
;
color
:
#222222
;
line-height
:
25px
;
span
{
span
{
font-size
:
32px
;
font-weight
:
bold
;
color
:
#222222
;
...
...
src/pages/exam/examAnswer.vue
浏览文件 @
db4b2303
...
...
@@ -316,7 +316,6 @@ export default {
})
},
switchQuestion
()
{
console
.
log
(
1111
)
this
.
refreshBscroll
()
},
getTopic
()
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论