提交 39721f96 authored 作者: matian's avatar matian

updates

上级 c9388c46
...@@ -190,7 +190,7 @@ export const menus: IMenuItem[] = [ ...@@ -190,7 +190,7 @@ export const menus: IMenuItem[] = [
tag: 'v1-backend-lecturer-list', tag: 'v1-backend-lecturer-list',
icon: DataAnalysis, icon: DataAnalysis,
name: '数据画像与分析', name: '数据画像与分析',
path: '' path: 'http://114.242.229.132:18080/bi/?proc=1&action=viewer&hback=true&isInPreview=true&db=!7d2b!!8346!!6559!!80b2!e-SaaS!2f!!8d44!!6e90!!6570!!636e!!753b!!50cf!.db&platform=PC&browserType=chrome'
} }
] ]
} }
......
...@@ -20,6 +20,20 @@ export function getPaperStuList(params?: { ...@@ -20,6 +20,20 @@ export function getPaperStuList(params?: {
}) { }) {
return httpRequest.get('/api/resource/v1/teaching/paper/list', { params }) return httpRequest.get('/api/resource/v1/teaching/paper/list', { params })
} }
// 获取学员详情
export function getPaperStuDetail(params?: { id: string }) {
return httpRequest.get('/api/resource/v1/teaching/paper/view', { params })
}
// 评分
export function updateComment(params?: {
id: string
index: string
child_index?: string
user_score: string
reviews: string
}) {
return httpRequest.get('/api/resource/v1/teaching/paper/update ', { params })
}
// /** // /**
// * 获取试卷详情 // * 获取试卷详情
// */ // */
......
<script lang="ts" setup> <script lang="ts" setup>
import type { IQuestionList } from '../type'
import QuestionItem from './QuestionItem.vue' import QuestionItem from './QuestionItem.vue'
const props = defineProps({
options: {
type: Object
},
question_item_id: {
type: String
}
})
const questionItem = computed(() => { interface Props {
return props.options?.item everyQuestion: any
}) questionList: IQuestionList[]
const sheet_id = computed(() => { }
return props.options?.sheet_id const props = defineProps<Props>()
})
const questionType = computed(() => {
return props.options?.item.question_item_type
})
</script> </script>
<template> <template>
<el-card class="container"> <el-card class="container">
<template #header> <template #header>
<span>{{ questionItem.question_item_title }}</span> <span>{{ everyQuestion?.question_content }}</span>
</template> </template>
<div class="content"> <div class="content">
<template v-for="item in questionItem.question_list"> <template v-for="item in props.questionList">
<div class="sub-content" v-if="item.group_id" :key="item.id"> <div class="sub-content" v-if="item?.children" :key="item.id">
<div class="title" v-html="item.common_content"></div> <div class="title" v-html="item.common_content"></div>
<div class="sub-container"> <div class="sub-container">
<QuestionItem <QuestionItem v-for="subItem in item.children" :key="subItem.id" :question="subItem" />
v-for="subItem in item.list"
:key="subItem.id"
:question="{ item: subItem, question_item_id, questionType, sheet_id }"
:question_item_id="question_item_id"
/>
</div> </div>
</div> </div>
<div v-else :key="item.id"> <div v-else :key="item.id">
<QuestionItem <QuestionItem :question="item" />
:question="{ item, question_item_id, questionType, sheet_id }"
:question_item_id="question_item_id"
/>
</div> </div>
</template> </template>
</div> </div>
......
<script lang="ts" setup> <script lang="ts" setup>
// import { ElMessage } from 'element-plus' import { updateComment } from '../api'
// import { submitPaper } from '../api.js'
const bc: any = ref(null)
const showComment = ref(false) const showComment = ref(false)
const props = defineProps({ const props = defineProps({
question: { question: {
...@@ -15,60 +12,48 @@ const props = defineProps({ ...@@ -15,60 +12,48 @@ const props = defineProps({
type: String type: String
} }
}) })
const questionData = JSON.parse(JSON.stringify(props.question.item)) const questionData = Object.assign({}, props.question)
const questionType = computed(() => { const questionType = computed(() => {
// 1单选,2多选,3简答,5案例题, 6判断, 7实操,8情景 // 1单选,2多选,3简答,5案例题, 6判断, 7实操,8情景
const type = questionData.type || props.question.questionType || 1 if (props.question.child_question_type) {
return parseInt(type) return parseInt(props.question.child_question_type)
} else {
return parseInt(props.question.questionType)
}
}) })
// const sheet_id = computed(() => {
// return props.question.sheet_id
// })
onUnmounted(() => {
bc.value && bc.value.close()
})
const fetchComment = () => { const fetchComment = () => {
console.log('0000') const params = {
// const params: any = { id: '',
// sheet_id: sheet_id, index: '',
// question_item_id: props.question_item_id, child_index: '',
// question_id: questionData.value.id, user_score: '',
// score: questionData.value.get_score, reviews: ''
// comment: questionData.value.comment }
// } updateComment(params).then(() => {
// submitPaper(params).then((res: any) => { console.log('000')
// if (res.success) { })
// ElMessage.success('提交点评成功')
// } else {
// ElMessage.success('提交点评失败')
// }
// bc.value = new BroadcastChannel('exam')
// bc.value.postMessage({ action: 'refetch' })
// })
} }
</script> </script>
<template> <template>
<div class="question-item"> <div class="question-item">
<div class="question-item-title" v-html="questionData.content"></div> <div class="question-item-title" v-html="props.question.question_content"></div>
<template v-if="questionType === 1 || questionType === 6"> <template v-if="questionType === 1 || questionType === 6">
<el-radio-group v-model="questionData.user_answer[0]" :disabled="true" class="question-item-content"> <el-radio-group v-model="questionData.user_answer" :disabled="true" class="question-item-content">
<div class="question-item-option" v-for="subItem in questionData.options" :key="subItem.id"> <div class="question-item-option" v-for="subItem in props.question.question_options" :key="subItem.id">
<el-radio :label="subItem.id">{{ subItem.option }}</el-radio> <el-radio :label="subItem.id">{{ subItem.option }}</el-radio>
</div> </div>
</el-radio-group> </el-radio-group>
</template> </template>
<template v-if="questionType === 2"> <template v-if="questionType === 2">
<el-checkbox-group v-model="questionData.user_answer" :disabled="true" class="question-item-content"> <el-checkbox-group v-model="questionData.user_answer" :disabled="true" class="question-item-content">
<div class="question-item-option" v-for="subItem in questionData.options" :key="subItem.id"> <div class="question-item-option" v-for="subItem in questionData.question_options" :key="subItem.id">
<el-checkbox :label="subItem.id"> {{ subItem.option }} </el-checkbox> <el-checkbox :label="subItem.id"> {{ subItem.option }} </el-checkbox>
</div> </div>
</el-checkbox-group> </el-checkbox-group>
</template> </template>
<template v-if="questionType === 3"> <template v-if="questionType === 3">
<div class="SAQ">{{ questionData.user_answer[0] || '' }}</div> <div class="SAQ">{{ questionData.user_answer || '' }}</div>
-->
<div style="text-align: right"> <div style="text-align: right">
<el-button <el-button
type="primary" type="primary"
...@@ -81,14 +66,14 @@ const fetchComment = () => { ...@@ -81,14 +66,14 @@ const fetchComment = () => {
</div> </div>
<div class="comment" v-show="showComment"> <div class="comment" v-show="showComment">
<div class="comment-top"> <div class="comment-top">
<p>本题{{ questionData.score }}</p> <p>本题{{ props.question.score }}</p>
<div class="get-score"> <div class="get-score">
学生得分:<el-input-number 学生得分:<el-input-number
:disabled="questionData.checked_flag" :disabled="questionData.checked_flag"
v-model="questionData.get_score" v-model="questionData.user_score"
controls-position="right" controls-position="right"
:min="0" :min="0"
:max="questionData.score" :max="props.question.score"
size="small" size="small"
></el-input-number> ></el-input-number>
</div> </div>
...@@ -96,18 +81,18 @@ const fetchComment = () => { ...@@ -96,18 +81,18 @@ const fetchComment = () => {
<el-input <el-input
type="textarea" type="textarea"
placeholder="请输入评语" placeholder="请输入评语"
v-model="questionData.comment" v-model="questionData.reviews"
rows="3" rows="3"
:disabled="questionData.checked_flag" :disabled="questionData.checked_flag"
/> />
<div style="text-align: center; padding-top: 10px"> <div style="text-align: center; padding-top: 10px">
<el-button type="primary" size="small" @click="fetchComment" :disabled="questionData.checked_flag" <el-button type="primary" size="small" @click="fetchComment" :disabled="props.question.checked_flag"
>提交点评</el-button >提交点评</el-button
> >
</div> </div>
</div> </div>
</template> </template>
<div class="question-item-score">得分:{{ questionData.get_score }}分</div> <div class="question-item-score">得分:{{ props.question.user_score }}分</div>
</div> </div>
</template> </template>
......
interface IQuestionptions {
option: string
checked_option: string
checked: boolean
id: string
user_checked: boolean
}
export interface IQuestionList {
id: string
project_prefix: string
permission: number
question_type: number
question_title: string
question_content: string
common_content: string
question_options: IQuestionptions[]
question_analysis: string
question_difficulty: number
status: number
group_id: string
question_order: number
question_tag: string
is_parent: number
child_question_type: number
score: number
children?: IQuestionList[]
}
\ No newline at end of file
...@@ -65,7 +65,7 @@ const listOptions = $computed(() => { ...@@ -65,7 +65,7 @@ const listOptions = $computed(() => {
} }
}) })
const handleCheckPaper = (row: any) => { const handleCheckPaper = (row: any) => {
router.push({ path: '/teach/view', query: { eid: row.exam_id, sid: row.student_id } }) router.push({ path: '/teach/view', query: { id: row.id } })
} }
onMounted(() => { onMounted(() => {
checkPermission('v1-teaching-paper-search-list') && handleGetClassList() checkPermission('v1-teaching-paper-search-list') && handleGetClassList()
......
<script lang="ts" setup> <script lang="ts" setup>
// import { getPaperDetails } from '../api.js' import type { IQuestionList } from '../type'
import { getPaperStuDetail } from '../api'
import PaperQuestion from '../components/PaperQuestion.vue' import PaperQuestion from '../components/PaperQuestion.vue'
// const route = useRoute() const route = useRoute()
const questionList: any = ref<IQuestionList[]>([])
const questionData: any = ref({}) const questionData: any = ref({})
const questionList: any = ref([])
// const eid = route.query.eid as string
// const sid = route.query.sid as string
onMounted(() => {
getDetail()
})
// 获取试卷详情 // 获取试卷详情
const getDetail = () => { getPaperStuDetail({ id: route.query.id as string }).then(res => {
// const params: any = { exam_id: eid, student_id: sid } questionData.value = res.data
// getPaperDetails(params).then((res: any) => { questionList.value = questionData.value.score_details
// questionData.value = res.data.sheet
// assembleData()
// })
questionData.value = {
sheet_id: '6953257027279781888',
student_id: '6953256575158976512',
exam_id: '6952903190949920768',
paper_id: '402839625706909696',
questions: {
paper_id: '402839625706909696',
total_question_count: 7,
total_score: 100,
question_items: [
{
question_item_id: '1',
question_item_title: '单选题',
question_item_type: '1',
question_list: [
{
id: '402782625878831104',
content: '<p>测试单选题1</p>',
options:
'[{"option":"测试1","id":"6949923397711167488"},{"option":"侧事故2","id":"6949923397711167489"},{"option":"大神","id":"6949923397711167490"}]',
answer: '["6949923397711167488"]',
score: 30,
q_order: 1
}
]
},
{
question_item_id: '2',
question_item_title: '多选题',
question_item_type: '2',
question_list: [
{
id: '402782856271941632',
content: '<p>多选题测试1</p>',
options:
'[{"option":"大萨达","id":"6949923628104286208"},{"option":"大萨达as","id":"6949923628104286209"},{"option":"大叔大婶","id":"6949923628104286210"}]',
answer: '["6949923628104286208","6949923628104286209"]',
score: 20,
q_order: 2
}
]
},
{
question_item_id: '3',
question_item_title: '问答题',
question_item_type: '3',
question_list: [
{
id: '402816813826957312',
content: '<p>防守打法是</p>',
options: '[]',
answer: '[]',
score: 20,
q_order: 3
},
{
id: '402784072410382336',
content: '<p>问答题测试1问答题测试1</p>',
options: '[]',
answer: '[]',
score: 10,
q_order: 4
}
]
},
{
question_item_id: '8',
question_item_title: '情景题',
question_item_type: '8',
question_list: [
{
common_content:
'农行厦门江头支行所有员工都有一个专属二维码,随时随地可以掏出手机营销并实现按件计价,因为产品好、门槛低,营销成功率非常高。过去较长一段时间,厦门分行普惠业务发展徘徊滞后,2017年末,该行法人普惠贷款客户仅有157户。在2019年开展数字化转型以来,陆续上线“房抵e贷”“海关e贷”以及“纳税e贷”等三款线上融资产品,扭转了对公业务“空心化”的不利局面,普惠贷款客户数量已经超过6400户, 较2017年增长40多倍,贷款余额和户数增量、增幅连续两年保持当地四大行第一。',
group_id: '6923137023951765577',
list: [
{
id: '375996268660805632',
content: '情境中提到的“海关e贷”、“房抵e贷”和“纳税e贷”这三项线上业务融资产品用到了以下哪个营销策略?',
options:
'[{"checked_option":"A","option":"高额定价策略","id":"6923137025579155456"},{"checked_option":"B","option":"渗透价策略","id":"6923137025579155457"},{"checked_option":"C","option":"产品线填补策略","id":"6923137025579155458"},{"checked_option":"D","option":"关系定价策略","id":"6923137025579155459"}]',
answer: '["6923137025579155458"]',
type: 1,
question_order: 0,
score: 10,
q_order: 5
},
{
id: '375996268681777152',
content: '农行厦门江头支行对于潜在的客户进行了很有效率的市场细分,从题目中来看,该类客户属于?',
options:
'[{"checked_option":"A","option":"人口细分","id":"6923137025604321280"},{"checked_option":"B","option":"地理细分","id":"6923137025604321281"},{"checked_option":"C","option":"行为细分","id":"6923137025604321282"},{"checked_option":"D","option":"公司细分","id":"6923137025604321283"}]',
answer: '["6923137025604321283"]',
type: 1,
question_order: 1,
score: 5,
q_order: 6
},
{
id: '375996268702748672',
content: '农行厦门江头支行的每一位员工都有专属的二维码,从营销渠道来看,该二维码属于?',
options:
'[{"checked_option":"A","option":"微博","id":"6923137025625292800"},{"checked_option":"B","option":"抖音","id":"6923137025625292801"},{"checked_option":"C","option":"公司二维码","id":"6923137025625292802"},{"checked_option":"D","option":"电子广告","id":"6923137025625292803"}]',
answer: '["6923137025625292802"]',
type: 1,
question_order: 2,
score: 5,
q_order: 7
}
]
}
]
}
]
},
answers: {
'1': {
'402782625878831104': {
answer: ['6949923397711167490'],
sign: false
}
},
'2': {
'402782856271941632': {
answer: ['6949923628104286209'],
sign: false
}
},
'3': {
'402816813826957312': {
answer: ['111'],
sign: false
},
'402784072410382336': {
answer: ['2122313'],
sign: false
}
},
'8': {
'375996268660805632': {
answer: ['6923137025579155456'],
sign: false
},
'375996268681777152': {
answer: ['6923137025604321280'],
sign: false
},
'375996268702748672': {
answer: ['6923137025625292800'],
sign: false
}
}
},
status: 1,
score: '0.00',
score_item: {
'1': {
'402782625878831104': {
score: 0,
checked_flag: true
}
},
'2': {
'402782856271941632': {
score: 0,
checked_flag: true
}
},
'3': {
'402816813826957312': {
score: 0,
checked_flag: false
},
'402784072410382336': {
score: 0,
checked_flag: false
}
},
'8': {
'375996268660805632': {
score: 0,
checked_flag: true
},
'375996268681777152': {
score: 0,
checked_flag: true
},
'375996268702748672': {
score: 0,
checked_flag: true
}
}
},
commit_time: '2022-07-14 16:00:04',
checker_id: null,
checked_time: '2022-07-14 16:01:00',
created_time: '2022-07-14 16:01:00',
updated_time: '2022-07-14 16:01:00',
status_text: '已提交'
}
assembleData()
}
const assembleData = () => {
questionList.value = questionData.value.questions.question_items
questionList.value.forEach((item: any) => { questionList.value.forEach((item: any) => {
const score = questionData.value.score_item[item.question_item_id] if (item.children) {
// 用户答案 item.user_answer = [item.user_answer].forEach(it => item.question_options[it.id])
const answer = questionData.value.answers ? questionData.value.answers[item.question_item_id] || {} : {} } else {
item.question_list.forEach((subItem: any) => { item.user_answer = item.question_options[item.id]
if (subItem.group_id) { }
subItem.list.forEach((it: any) => {
const obj = score[it.id]
it.get_score = obj.score || 0
it.checked_flag = obj.checked_flag || false
if (obj.comment) it.comment = obj.comment
if (it.answer) it.answer = JSON.parse(it.answer)
if (it.options) it.options = JSON.parse(it.options)
it.user_answer = answer[it.id]?.answer || []
})
} else {
const obj = score[subItem.id]
subItem.get_score = obj.score || 0
subItem.checked_flag = obj.checked_flag || false
if (obj.comment) subItem.comment = obj.comment
if (subItem.answer) subItem.answer = JSON.parse(subItem.answer)
if (subItem.options) subItem.options = JSON.parse(subItem.options)
subItem.user_answer = answer[subItem.id]?.answer || []
}
})
}) })
} })
</script> </script>
<template> <template>
<div> <div>
<paper-question <paper-question
:options="{ item, sheet_id: questionData.sheet_id, question_item_id: item.question_item_id }" :everyQuestion="item"
:question_item_id="item.question_item_id"
:key="item.question_item_id" :key="item.question_item_id"
:questionList="questionList"
v-for="item in questionList" v-for="item in questionList"
/> />
</div> </div>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论