|
@@ -1266,6 +1266,7 @@
|
|
>
|
|
>
|
|
<el-option label="开放问题" :value="0" />
|
|
<el-option label="开放问题" :value="0" />
|
|
<el-option label="单选题" :value="1" />
|
|
<el-option label="单选题" :value="1" />
|
|
|
|
+ <el-option label="看图选答案" :value="3" />
|
|
<el-option label="多选题" value="multiple" />
|
|
<el-option label="多选题" value="multiple" />
|
|
<el-option label="填空题" value="fill" />
|
|
<el-option label="填空题" value="fill" />
|
|
<el-option label="自言语" value="self" />
|
|
<el-option label="自言语" value="self" />
|
|
@@ -1290,7 +1291,8 @@
|
|
</el-select>
|
|
</el-select>
|
|
<div class="form-tip">选择题目适用的职位类型,可多选</div>
|
|
<div class="form-tip">选择题目适用的职位类型,可多选</div>
|
|
</div>
|
|
</div>
|
|
- <div class="form-item" v-if="questionForm.question_form === 1 || questionForm.question_form === 2">
|
|
|
|
|
|
+ <div class="form-item" v-if="questionForm.question_form === 1 ||
|
|
|
|
+ questionForm.question_form === 2 || questionForm.question_form === 3">
|
|
<div class="form-label">选项</div>
|
|
<div class="form-label">选项</div>
|
|
<div>
|
|
<div>
|
|
<div class="option-header" style="display: flex; margin-bottom: 10px; font-weight: bold;">
|
|
<div class="option-header" style="display: flex; margin-bottom: 10px; font-weight: bold;">
|
|
@@ -1317,7 +1319,7 @@
|
|
>
|
|
>
|
|
<div
|
|
<div
|
|
@click="() => {
|
|
@click="() => {
|
|
- if (questionForm.question_form === 1) {
|
|
|
|
|
|
+ if (questionForm.question_form === 1 || questionForm.question_form === 3) {
|
|
// 单选题:只能有一个正确答案
|
|
// 单选题:只能有一个正确答案
|
|
questionForm.options.forEach((item, idx) => {
|
|
questionForm.options.forEach((item, idx) => {
|
|
item.is_correct = (idx === index);
|
|
item.is_correct = (idx === index);
|
|
@@ -1329,7 +1331,7 @@
|
|
}"
|
|
}"
|
|
style="cursor: pointer; width: 80px; text-align: center;"
|
|
style="cursor: pointer; width: 80px; text-align: center;"
|
|
>
|
|
>
|
|
- <template v-if="questionForm.question_form === 1">
|
|
|
|
|
|
+ <template v-if="questionForm.question_form === 1 || questionForm.question_form === 3">
|
|
<!-- 单选题使用单选按钮 -->
|
|
<!-- 单选题使用单选按钮 -->
|
|
<el-radio
|
|
<el-radio
|
|
:disabled="true"
|
|
:disabled="true"
|
|
@@ -1379,7 +1381,21 @@
|
|
</div>
|
|
</div>
|
|
<div class="form-tip">添加选项并设置正确答案,单选题只能有一个正确答案,多选题可以有多个正确答案</div>
|
|
<div class="form-tip">添加选项并设置正确答案,单选题只能有一个正确答案,多选题可以有多个正确答案</div>
|
|
</div>
|
|
</div>
|
|
-
|
|
|
|
|
|
+ <div v-if="questionForm.question_form === 3">
|
|
|
|
+ <div class="form-label">题目图片</div>
|
|
|
|
+ <img :src="questionForm.question_image_url" alt="">
|
|
|
|
+ <!-- <el-upload
|
|
|
|
+ class="avatar-uploader"
|
|
|
|
+ :action="uploadUrl"
|
|
|
|
+ :show-file-list="false"
|
|
|
|
+ :on-success="handleAvatarSuccess"
|
|
|
|
+ :auto-upload="false"
|
|
|
|
+ :file-list="questionForm.question_image_url"
|
|
|
|
+ :disabled="true"
|
|
|
|
+ >
|
|
|
|
+ <el-button size="small" type="primary">点击上传</el-button>
|
|
|
|
+ </el-upload> -->
|
|
|
|
+ </div>
|
|
<div class="form-item">
|
|
<div class="form-item">
|
|
<div class="form-label">分类</div>
|
|
<div class="form-label">分类</div>
|
|
<el-select
|
|
<el-select
|
|
@@ -1966,7 +1982,7 @@
|
|
<div class="setting-item">
|
|
<div class="setting-item">
|
|
<div class="setting-info">
|
|
<div class="setting-info">
|
|
<span class="setting-name">「人脸一致性检测」</span>
|
|
<span class="setting-name">「人脸一致性检测」</span>
|
|
- <p class="setting-desc">该强调,非本人操作人脸可视化提醒和警示,默认开启</p>
|
|
|
|
|
|
+ <p class="setting-desc">选取后,将会在候选人离开前置摄像头时进行提示,默认开启</p>
|
|
</div>
|
|
</div>
|
|
<el-switch v-model="interviewSettings.faceConsistency" :disabled="true"/>
|
|
<el-switch v-model="interviewSettings.faceConsistency" :disabled="true"/>
|
|
</div>
|
|
</div>
|
|
@@ -1974,7 +1990,7 @@
|
|
<div class="setting-item">
|
|
<div class="setting-item">
|
|
<div class="setting-info">
|
|
<div class="setting-info">
|
|
<span class="setting-name">「 防截屏 / 录屏 」</span>
|
|
<span class="setting-name">「 防截屏 / 录屏 」</span>
|
|
- <p class="setting-desc">该强调,非本人前来体验截屏录屏以上行为,为防止提醒</p>
|
|
|
|
|
|
+ <p class="setting-desc">选取后,将会在候选人截屏或录屏时进行提示,为防止泄题,默认开启</p>
|
|
</div>
|
|
</div>
|
|
<el-switch v-model="interviewSettings.preventScreenshot" :disabled="true"/>
|
|
<el-switch v-model="interviewSettings.preventScreenshot" :disabled="true"/>
|
|
</div>
|
|
</div>
|
|
@@ -1982,28 +1998,28 @@
|
|
<div class="setting-item">
|
|
<div class="setting-item">
|
|
<div class="setting-info">
|
|
<div class="setting-info">
|
|
<span class="setting-name">「 切 屏 预 制 」</span>
|
|
<span class="setting-name">「 切 屏 预 制 」</span>
|
|
- <p class="setting-desc">该强调,非本人前使用切屏处理用页面,为防作弊警示</p>
|
|
|
|
|
|
+ <p class="setting-desc">选取后,将会在候选人切屏时进行提示,为防止作弊,默认开启</p>
|
|
</div>
|
|
</div>
|
|
<el-switch v-model="interviewSettings.screenSwitchAlert" :disabled="true">
|
|
<el-switch v-model="interviewSettings.screenSwitchAlert" :disabled="true">
|
|
- <span class="switch-desc">切屏超过 2 次关闭,作答本关面试</span>
|
|
|
|
|
|
+ <span class="switch-desc">切屏超过 2 次关闭,作废本关面试</span>
|
|
</el-switch>
|
|
</el-switch>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="setting-item">
|
|
<div class="setting-item">
|
|
<div class="setting-info">
|
|
<div class="setting-info">
|
|
- <span class="setting-name">「 情 绪 识 别」</span>
|
|
|
|
- <p class="setting-desc">该现已,条件较差以及入侵过程中的作弊,条件等好等</p>
|
|
|
|
|
|
+ <span class="setting-name">「情绪/眼动检测」</span>
|
|
|
|
+ <p class="setting-desc">该现已,将对候选人整场面试的情绪与压力表现进行分析,建议开启</p>
|
|
</div>
|
|
</div>
|
|
- <el-switch v-model="interviewSettings.positionDetection" :disabled="true"/>
|
|
|
|
|
|
+ <el-switch v-model="interviewSettings.positionDetection" />
|
|
</div>
|
|
</div>
|
|
|
|
|
|
- <div class="setting-item">
|
|
|
|
|
|
+ <!-- <div class="setting-item">
|
|
<div class="setting-info">
|
|
<div class="setting-info">
|
|
<span class="setting-name">「 眼 动 检 测 」</span>
|
|
<span class="setting-name">「 眼 动 检 测 」</span>
|
|
<p class="setting-desc">视实检测候选人的眼动频率进行分析,页面等较等</p>
|
|
<p class="setting-desc">视实检测候选人的眼动频率进行分析,页面等较等</p>
|
|
</div>
|
|
</div>
|
|
<el-switch v-model="interviewSettings.eyeMovementDetection" :disabled="true"/>
|
|
<el-switch v-model="interviewSettings.eyeMovementDetection" :disabled="true"/>
|
|
- </div>
|
|
|
|
|
|
+ </div> -->
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<!-- 其他设置 -->
|
|
<!-- 其他设置 -->
|
|
@@ -2202,7 +2218,22 @@
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<template #footer>
|
|
<template #footer>
|
|
|
|
+ <!-- <div class="selected-questions-preview" v-if="selectedQuestions.length > 0">
|
|
|
|
+ <div class="preview-title">已选择的题目({{ selectedQuestions.length }}):</div>
|
|
|
|
+ <div class="preview-list">
|
|
|
|
+ <el-tag
|
|
|
|
+ v-for="(question, index) in selectedQuestions"
|
|
|
|
+ :key="index"
|
|
|
|
+ class="preview-item"
|
|
|
|
+ closable
|
|
|
|
+ @close="removeSelectedQuestion(question)"
|
|
|
|
+ >
|
|
|
|
+ {{ question.question }}
|
|
|
|
+ </el-tag>
|
|
|
|
+ </div>
|
|
|
|
+ </div> -->
|
|
<span class="dialog-footer">
|
|
<span class="dialog-footer">
|
|
|
|
+ <el-button @click="handleQuestionSelectPreview">预览已选</el-button>
|
|
<el-button @click="cancelQuestionSelect">取消</el-button>
|
|
<el-button @click="cancelQuestionSelect">取消</el-button>
|
|
<el-button type="primary" @click="confirmSelect" style="background-color: #ed7d31;border-color: #ed7d31;">确定</el-button>
|
|
<el-button type="primary" @click="confirmSelect" style="background-color: #ed7d31;border-color: #ed7d31;">确定</el-button>
|
|
</span>
|
|
</span>
|
|
@@ -2373,6 +2404,30 @@
|
|
</span>
|
|
</span>
|
|
</template>
|
|
</template>
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
+ <!-- 查看已选 -->
|
|
|
|
+ <el-dialog
|
|
|
|
+ v-model="previewDialog"
|
|
|
|
+ title="预览"
|
|
|
|
+ width="60%"
|
|
|
|
+ :close-on-click-modal="false">
|
|
|
|
+ <div class="selected-questions-preview" v-if="selectedQuestions.length > 0">
|
|
|
|
+ <div class="preview-title">已选择的题目({{ selectedQuestions.length }}):</div>
|
|
|
|
+ <div class="preview-list">
|
|
|
|
+ <el-tag
|
|
|
|
+ v-for="(question, index) in selectedQuestions"
|
|
|
|
+ :key="index"
|
|
|
|
+ class="preview-item"
|
|
|
|
+ closable
|
|
|
|
+ style="margin-bottom: 10px;"
|
|
|
|
+ >
|
|
|
|
+ {{ question.question }}
|
|
|
|
+ </el-tag>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="preview-footer">
|
|
|
|
+ <el-button type="primary" @click="previewDialog = false">关闭</el-button>
|
|
|
|
+ </div>
|
|
|
|
+ </el-dialog>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
@@ -2671,6 +2726,12 @@ const handleLocationChange = (value: any) => {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+const previewDialog=ref(false)
|
|
|
|
+/* 预览已选 */
|
|
|
|
+const handleQuestionSelectPreview = () => {
|
|
|
|
+ previewDialog.value = true;
|
|
|
|
+}
|
|
|
|
+
|
|
const handleIsRequiredCorrectChange = (id: number, value: boolean) => {
|
|
const handleIsRequiredCorrectChange = (id: number, value: boolean) => {
|
|
// UpdateObj({
|
|
// UpdateObj({
|
|
// id: id,
|
|
// id: id,
|
|
@@ -2817,7 +2878,8 @@ const questionForm = reactive({
|
|
category: '', // 分类
|
|
category: '', // 分类
|
|
tags: [], // 标签
|
|
tags: [], // 标签
|
|
suggestedDuration: 60, // 建议时长,默认60秒
|
|
suggestedDuration: 60, // 建议时长,默认60秒
|
|
- scoring_reference: '' // 评分标准
|
|
|
|
|
|
+ scoring_reference: '', // 评分标准
|
|
|
|
+ question_image_url: '' // 题目图片
|
|
});
|
|
});
|
|
|
|
|
|
// 定义胜任力标签类型
|
|
// 定义胜任力标签类型
|
|
@@ -2871,7 +2933,8 @@ const resetQuestionForm = () => {
|
|
category: '',
|
|
category: '',
|
|
tags: [],
|
|
tags: [],
|
|
suggestedDuration: 60,
|
|
suggestedDuration: 60,
|
|
- scoring_reference: ''
|
|
|
|
|
|
+ scoring_reference: '',
|
|
|
|
+ question_image_url: ''
|
|
});
|
|
});
|
|
};
|
|
};
|
|
|
|
|
|
@@ -2923,6 +2986,7 @@ const confirmAddQuestion = async () => {
|
|
category: questionForm.category,
|
|
category: questionForm.category,
|
|
suggestedDuration: questionForm.suggestedDuration,
|
|
suggestedDuration: questionForm.suggestedDuration,
|
|
scoring_reference: questionForm.scoring_reference,
|
|
scoring_reference: questionForm.scoring_reference,
|
|
|
|
+ question_image_url: questionForm.question_image_url
|
|
};
|
|
};
|
|
console.log(newQuestion);
|
|
console.log(newQuestion);
|
|
|
|
|
|
@@ -3937,7 +4001,7 @@ const handleImportQuestion = () => {
|
|
// 重置表单数据
|
|
// 重置表单数据
|
|
questionBankFormData.value = {
|
|
questionBankFormData.value = {
|
|
question: '',
|
|
question: '',
|
|
- question_form: null,
|
|
|
|
|
|
+ question_form: 0,
|
|
competency_tags: [],
|
|
competency_tags: [],
|
|
position_types: [],
|
|
position_types: [],
|
|
category_id: null,
|
|
category_id: null,
|
|
@@ -3982,7 +4046,8 @@ const handleQuestionBankFormSubmit = async (formData: any) => {
|
|
enable_follow_up: false,
|
|
enable_follow_up: false,
|
|
maxAnswers: 1,
|
|
maxAnswers: 1,
|
|
weight: 100,
|
|
weight: 100,
|
|
- source: 'custom_selected' as const
|
|
|
|
|
|
+ source: 'custom_selected' as const,
|
|
|
|
+ question_image_url: formData.question_image_url || ''
|
|
};
|
|
};
|
|
|
|
|
|
// 添加到题目列表
|
|
// 添加到题目列表
|
|
@@ -4046,6 +4111,7 @@ const editQuestion = (index: number) => {
|
|
enable_follow_up:res.data.enable_follow_up,
|
|
enable_follow_up:res.data.enable_follow_up,
|
|
maxAnswers:res.data.maxAnswers,
|
|
maxAnswers:res.data.maxAnswers,
|
|
weight:res.data.weight,
|
|
weight:res.data.weight,
|
|
|
|
+ question_image_url:res.data.question_image_url
|
|
}
|
|
}
|
|
Object.assign(questionForm, data);
|
|
Object.assign(questionForm, data);
|
|
}
|
|
}
|
|
@@ -5977,10 +6043,10 @@ const saveFieldConfig = async () => {
|
|
const getBasicFields = () => {
|
|
const getBasicFields = () => {
|
|
const basicFields = {
|
|
const basicFields = {
|
|
name: fieldConfig.name,
|
|
name: fieldConfig.name,
|
|
|
|
+ id_card: fieldConfig.id_card,
|
|
|
|
+ phone: fieldConfig.phone,
|
|
gender: fieldConfig.gender,
|
|
gender: fieldConfig.gender,
|
|
three_period: fieldConfig.three_period,
|
|
three_period: fieldConfig.three_period,
|
|
- phone: fieldConfig.phone,
|
|
|
|
- id_card: fieldConfig.id_card,
|
|
|
|
ethnicity: fieldConfig.ethnicity,
|
|
ethnicity: fieldConfig.ethnicity,
|
|
height: fieldConfig.height,
|
|
height: fieldConfig.height,
|
|
weight: fieldConfig.weight,
|
|
weight: fieldConfig.weight,
|
|
@@ -6693,7 +6759,7 @@ const getTreeData = () => {
|
|
GetCategoryList({}).then((res: any) => {
|
|
GetCategoryList({}).then((res: any) => {
|
|
console.log('res', res);
|
|
console.log('res', res);
|
|
const categoryList = res.data.items.filter((item: any) =>
|
|
const categoryList = res.data.items.filter((item: any) =>
|
|
- !['技术能力', '服务意识', '职业素质','基本常识','色盲检测','内容铺垫'].includes(item.name)
|
|
|
|
|
|
+ !['技术能力', '服务意识', '职业素质','基本常识','色盲检测','内容铺垫','心理测试1'].includes(item.name)
|
|
);
|
|
);
|
|
GetTagList({}).then((res: any) => {
|
|
GetTagList({}).then((res: any) => {
|
|
console.log('res', res);
|
|
console.log('res', res);
|