|
|
@ -133,16 +133,16 @@ |
|
|
|
<el-checkbox v-model="ques.check"></el-checkbox> |
|
|
|
<el-checkbox v-model="ques.check"></el-checkbox> |
|
|
|
<div :class="['ques-info', { disabled: !ques.status, del: ques.isDel, repeat: ques.isRepeat }]"> |
|
|
|
<div :class="['ques-info', { disabled: !ques.status, del: ques.isDel, repeat: ques.isRepeat }]"> |
|
|
|
<div class="top-line"> |
|
|
|
<div class="top-line"> |
|
|
|
<span class="label">{{ j + 1 }} / 10</span> |
|
|
|
<span class="label">{{ j + 1 }} / {{ item.examQuestions.length }}</span> |
|
|
|
<span class="label">{{ questionTypes.find(e => e.id === item.questionType).name }}</span> |
|
|
|
<span class="label">{{ questionTypes.find(e => e.id === item.questionType).name }}</span> |
|
|
|
<div v-html="ques.stem"></div> |
|
|
|
<div :id="'stem' + ques.questionVersionId" v-html="getQuesStem(ques)"></div> |
|
|
|
<p v-if="ques.questionType !== 'fill_blank'">(<el-input class="score" placeholder="请输入" |
|
|
|
<p v-if="item.questionType !== 'fill_blank'">(<el-input class="score" placeholder="请输入" |
|
|
|
v-model="ques.score" />分)</p> |
|
|
|
v-model="ques.score" />分)</p> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<!-- 单选、多选、判断的选项 --> |
|
|
|
<!-- 单选、多选、判断的选项 --> |
|
|
|
<template |
|
|
|
<template |
|
|
|
v-if="ques.questionType !== 'fill_blank' && ques.questionType !== 'essay' && ques.questionAnswerVersionsList"> |
|
|
|
v-if="item.questionType !== 'fill_blank' && item.questionType !== 'essay' && ques.questionAnswerVersionsList"> |
|
|
|
<div v-for="(opt, j) in ques.questionAnswerVersionsList" :key="j" class="opt"> |
|
|
|
<div v-for="(opt, j) in ques.questionAnswerVersionsList" :key="j" class="opt"> |
|
|
|
<span>{{ numToLetter(j) }}. </span> |
|
|
|
<span>{{ numToLetter(j) }}. </span> |
|
|
|
<div v-html="opt.optionText"></div> |
|
|
|
<div v-html="opt.optionText"></div> |
|
|
@ -151,7 +151,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
<div class="bottom-line"> |
|
|
|
<div class="bottom-line"> |
|
|
|
<div class="correct"> |
|
|
|
<div class="correct"> |
|
|
|
【{{ ques.questionType === 'essay' ? '参考答案' : '正确答案' }}】: |
|
|
|
【{{ item.questionType === 'essay' ? '参考答案' : '正确答案' }}】: |
|
|
|
<div v-html="getCorrectAnswer(ques)"></div> |
|
|
|
<div v-html="getCorrectAnswer(ques)"></div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="actions"> |
|
|
|
<div class="actions"> |
|
|
@ -197,6 +197,7 @@ import Template from './template' |
|
|
|
import Manual from './manual' |
|
|
|
import Manual from './manual' |
|
|
|
import Auto from './auto' |
|
|
|
import Auto from './auto' |
|
|
|
import Detail from '@/pages/ques/detail' |
|
|
|
import Detail from '@/pages/ques/detail' |
|
|
|
|
|
|
|
import Decimal from 'decimal.js' |
|
|
|
|
|
|
|
|
|
|
|
export default { |
|
|
|
export default { |
|
|
|
components: { Ueditor, Breadcrumb, Template, Manual, Auto, Detail }, |
|
|
|
components: { Ueditor, Breadcrumb, Template, Manual, Auto, Detail }, |
|
|
@ -229,7 +230,7 @@ export default { |
|
|
|
name: '', |
|
|
|
name: '', |
|
|
|
paperMethod: '', |
|
|
|
paperMethod: '', |
|
|
|
paperType: '', |
|
|
|
paperType: '', |
|
|
|
particularYear: '', |
|
|
|
particularYear: new Date(), |
|
|
|
professionalId: '', |
|
|
|
professionalId: '', |
|
|
|
remarks: '', |
|
|
|
remarks: '', |
|
|
|
score: '', |
|
|
|
score: '', |
|
|
@ -322,6 +323,60 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
mounted () { |
|
|
|
mounted () { |
|
|
|
|
|
|
|
function distributeScores (objects, totalScore) { |
|
|
|
|
|
|
|
const numObjects = objects.length; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果总分数小于数组长度,每个对象只能分配到一部分分数 |
|
|
|
|
|
|
|
const baseScore = totalScore / numObjects; |
|
|
|
|
|
|
|
const hasFraction = baseScore % 1 !== 0; // 判断是否有小数部分 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分配整数部分 |
|
|
|
|
|
|
|
for (let i = 0; i < numObjects; i++) { |
|
|
|
|
|
|
|
objects[i].score = Math.floor(baseScore); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果有小数部分,计算小数部分的总和 |
|
|
|
|
|
|
|
let fractionalPartSum = 0; |
|
|
|
|
|
|
|
if (hasFraction) { |
|
|
|
|
|
|
|
for (let i = 0; i < numObjects; i++) { |
|
|
|
|
|
|
|
fractionalPartSum += baseScore % 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分配小数部分 |
|
|
|
|
|
|
|
let remainingObjects = numObjects; |
|
|
|
|
|
|
|
while (fractionalPartSum > 0) { |
|
|
|
|
|
|
|
objects[--remainingObjects].score += 1; |
|
|
|
|
|
|
|
fractionalPartSum -= 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果总分数不足以给每个对象分配至少一分 |
|
|
|
|
|
|
|
if (totalScore < numObjects) { |
|
|
|
|
|
|
|
// 计算每个对象应该获得的小数部分 |
|
|
|
|
|
|
|
const fractionalDistribution = Math.ceil(fractionalPartSum); |
|
|
|
|
|
|
|
for (let i = 0; i < fractionalDistribution; i++) { |
|
|
|
|
|
|
|
objects[i].score += 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return objects; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 示例 |
|
|
|
|
|
|
|
const objects = [ |
|
|
|
|
|
|
|
{ id: 1 }, |
|
|
|
|
|
|
|
{ id: 2 }, |
|
|
|
|
|
|
|
{ id: 3 }, |
|
|
|
|
|
|
|
{ id: 4 } |
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const totalScore = 3; // 总分数小于数组长度 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const result = distributeScores(objects, totalScore); |
|
|
|
|
|
|
|
console.log(result); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.crumbs = [ |
|
|
|
this.crumbs = [ |
|
|
|
{ |
|
|
|
{ |
|
|
|
name: '试卷管理', |
|
|
|
name: '试卷管理', |
|
|
@ -358,8 +413,6 @@ export default { |
|
|
|
}) |
|
|
|
}) |
|
|
|
if (r.particularYear) r.particularYear = r.particularYear + '' |
|
|
|
if (r.particularYear) r.particularYear = r.particularYear + '' |
|
|
|
this.form = r |
|
|
|
this.form = r |
|
|
|
// this.answerAnalysis = opts[0].answerAnalysis |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} catch (e) { } |
|
|
|
} catch (e) { } |
|
|
|
}, |
|
|
|
}, |
|
|
@ -436,12 +489,65 @@ export default { |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
if (data && data.avgValueList && data.avgValueList.length) { |
|
|
|
if (data && data.avgValueList && data.avgValueList.length) { |
|
|
|
|
|
|
|
const fillBlanks = [] |
|
|
|
data.avgValueList.map((e, i) => { |
|
|
|
data.avgValueList.map((e, i) => { |
|
|
|
|
|
|
|
paper[i].questionType === 'fill_blank' && fillBlanks.push(...paper[i].examQuestions) |
|
|
|
// scores里有-1则不用循环 |
|
|
|
// scores里有-1则不用循环 |
|
|
|
e.scores.includes(-1) || e.scores.map((n, j) => { |
|
|
|
e.scores.includes(-1) || e.scores.map((n, j) => { |
|
|
|
this.$set(paper[i].examQuestions[j], 'score', n) |
|
|
|
this.$set(paper[i].examQuestions[j], 'score', n) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
fillBlanks.length && this.fillBlankAllocation(fillBlanks) // 填空题则需要给里面的每个空再分配一次分数 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
// 大题一键分配分值 |
|
|
|
|
|
|
|
async allocation (item) { |
|
|
|
|
|
|
|
const { data } = await this.$post(this.api.avgValues, { |
|
|
|
|
|
|
|
avgValueList: [{ |
|
|
|
|
|
|
|
questionNum: item.examQuestions.length, |
|
|
|
|
|
|
|
targetScore: +item.targetScore |
|
|
|
|
|
|
|
}] |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
if (data && data.avgValueList && data.avgValueList.length) { |
|
|
|
|
|
|
|
const { scores } = data.avgValueList[0] |
|
|
|
|
|
|
|
scores.includes(-1) || item.examQuestions.forEach((e, i) => { |
|
|
|
|
|
|
|
this.$set(e, 'score', scores[i]) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
item.questionType === 'fill_blank' && this.fillBlankAllocation(item.examQuestions) // 填空题则需要给里面的每个空再分配一次分数 |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
// 填空题一键分配 |
|
|
|
|
|
|
|
async fillBlankAllocation (list) { |
|
|
|
|
|
|
|
const param = list.map(e => { |
|
|
|
|
|
|
|
let { answerData } = e.questionAnswerVersionsList[0] |
|
|
|
|
|
|
|
if (answerData) { |
|
|
|
|
|
|
|
answerData = JSON.parse(answerData) |
|
|
|
|
|
|
|
return { |
|
|
|
|
|
|
|
questionNum: answerData.length, |
|
|
|
|
|
|
|
targetScore: e.score, |
|
|
|
|
|
|
|
questionId: e.questionVersionId |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { data } = await this.$post(this.api.avgValues, { |
|
|
|
|
|
|
|
avgValueList: param |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
if (data && data.avgValueList && data.avgValueList.length) { |
|
|
|
|
|
|
|
data.avgValueList.map((e, i) => { |
|
|
|
|
|
|
|
// scores里有-1则不用循环 |
|
|
|
|
|
|
|
if (!e.scores.includes(-1)) { |
|
|
|
|
|
|
|
const stem = document.querySelector(`#stem` + e.questionId) |
|
|
|
|
|
|
|
if (stem) { |
|
|
|
|
|
|
|
const inputs = stem.querySelectorAll('.fill-input') |
|
|
|
|
|
|
|
if (inputs) { |
|
|
|
|
|
|
|
for (const j in e.scores) { |
|
|
|
|
|
|
|
const item = inputs[j] |
|
|
|
|
|
|
|
inputs[j].value = e.scores[j] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
@ -493,6 +599,29 @@ export default { |
|
|
|
return correct ? (e.questionType === 'judgement' ? correct[0].optionText : correct.map(e => Util.numToLetter(e.optionNumber - 1)).join('')) : '' // 单选多选显示ABC选项,判断题显示选项内容 |
|
|
|
return correct ? (e.questionType === 'judgement' ? correct[0].optionText : correct.map(e => Util.numToLetter(e.optionNumber - 1)).join('')) : '' // 单选多选显示ABC选项,判断题显示选项内容 |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
// 处理题干显示 |
|
|
|
|
|
|
|
getQuesStem (ques) { |
|
|
|
|
|
|
|
let { stem } = ques |
|
|
|
|
|
|
|
if (ques.questionType === 'fill_blank') { // 填空题 |
|
|
|
|
|
|
|
let { jsonText } = ques |
|
|
|
|
|
|
|
if (jsonText) jsonText = JSON.parse(jsonText) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const regex = /<span class="gapfilling-span" data-id="(.*?)">______<\/span>/g |
|
|
|
|
|
|
|
let match |
|
|
|
|
|
|
|
let index = 0 // 用于跟踪索引 |
|
|
|
|
|
|
|
let result = stem |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((match = regex.exec(stem)) !== null) { |
|
|
|
|
|
|
|
const newInput = `<input type="text" class="fill-input" value="${jsonText && jsonText.scores ? jsonText.scores[index] : ''}">` |
|
|
|
|
|
|
|
result = result.replace(match[0], newInput) |
|
|
|
|
|
|
|
index++ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return result |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return stem |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 编辑试题 |
|
|
|
// 编辑试题 |
|
|
|
toQues (item, i, ques) { |
|
|
|
toQues (item, i, ques) { |
|
|
|
this.curType = item |
|
|
|
this.curType = item |
|
|
@ -537,25 +666,6 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (e) { } |
|
|
|
} catch (e) { } |
|
|
|
}, |
|
|
|
}, |
|
|
|
// 大题一键分配分值 |
|
|
|
|
|
|
|
allocation (item) { |
|
|
|
|
|
|
|
const total = +item.targetScore |
|
|
|
|
|
|
|
const len = item.examQuestions.length |
|
|
|
|
|
|
|
const quotient = Math.floor(total / len) // 平均分配的整数部分 |
|
|
|
|
|
|
|
let remainder = total % len // 余数 |
|
|
|
|
|
|
|
// 分配平均分 |
|
|
|
|
|
|
|
item.examQuestions.forEach(e => { |
|
|
|
|
|
|
|
e.score = quotient |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 处理余数 |
|
|
|
|
|
|
|
while (remainder > 0) { |
|
|
|
|
|
|
|
for (let i = 0; i < len && remainder > 0; i++) { |
|
|
|
|
|
|
|
item.examQuestions[i].score += 1 |
|
|
|
|
|
|
|
remainder -= 1 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
// 移除试题 |
|
|
|
// 移除试题 |
|
|
|
delQues (item, i) { |
|
|
|
delQues (item, i) { |
|
|
|
item.examQuestions.splice(i, 1) |
|
|
|
item.examQuestions.splice(i, 1) |
|
|
@ -588,16 +698,38 @@ export default { |
|
|
|
invalid = 1 |
|
|
|
invalid = 1 |
|
|
|
break |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const chineseNum = this.arabicToChinese(+i + 1) |
|
|
|
// 该大题里的小题总数需等于目标题数 |
|
|
|
// 该大题里的小题总数需等于目标题数 |
|
|
|
if (+e.questionNum !== e.examQuestions.length) { |
|
|
|
if (+e.questionNum !== e.examQuestions.length) { |
|
|
|
Util.warningMsg(`第${this.arabicToChinese(i + 1)}大题的小题总数跟目标题数不一致,请重新修改`) |
|
|
|
Util.warningMsg(`第${chineseNum}大题的小题总数跟目标题数不一致,请重新修改`) |
|
|
|
invalid = 1 |
|
|
|
invalid = 1 |
|
|
|
break |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 填空题需要拿每个小空的分数计算 |
|
|
|
|
|
|
|
if (e.questionType === 'fill_blank') { |
|
|
|
|
|
|
|
let totalScore = 0 |
|
|
|
|
|
|
|
e.examQuestions.map(n => { |
|
|
|
|
|
|
|
const stem = document.querySelector(`#stem` + n.questionVersionId) |
|
|
|
|
|
|
|
if (stem) { |
|
|
|
|
|
|
|
const inputs = stem.querySelectorAll('.fill-input') |
|
|
|
|
|
|
|
if (inputs) { |
|
|
|
|
|
|
|
for (const e of inputs) { |
|
|
|
|
|
|
|
totalScore = Decimal(totalScore).add(e.value || 0).toNumber() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (+e.targetScore !== totalScore) { |
|
|
|
|
|
|
|
Util.warningMsg(`第${chineseNum}大题的小题总分跟目标分值不一致,请重新修改`) |
|
|
|
|
|
|
|
invalid = 1 |
|
|
|
|
|
|
|
break |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else if (+e.targetScore !== e.examQuestions.reduce((e, j) => (e += +j.score), 0)) { |
|
|
|
// 该大题里的小题总分需等于目标分值 |
|
|
|
// 该大题里的小题总分需等于目标分值 |
|
|
|
if (+e.targetScore !== e.examQuestions.reduce((e, j) => (e += +j.score), 0)) { |
|
|
|
Util.warningMsg(`第${chineseNum}大题的小题总分跟目标分值不一致,请重新修改`) |
|
|
|
Util.warningMsg(`第${this.arabicToChinese(i + 1)}大题的小题总分跟目标分值不一致,请重新修改`) |
|
|
|
|
|
|
|
invalid = 1 |
|
|
|
invalid = 1 |
|
|
|
break |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
@ -609,7 +741,6 @@ export default { |
|
|
|
break |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// debugger |
|
|
|
|
|
|
|
if (invalid) return false |
|
|
|
if (invalid) return false |
|
|
|
|
|
|
|
|
|
|
|
this.submiting = true |
|
|
|
this.submiting = true |
|
|
@ -627,11 +758,30 @@ export default { |
|
|
|
e.outlineId = '' |
|
|
|
e.outlineId = '' |
|
|
|
} |
|
|
|
} |
|
|
|
e.targetScore = +e.targetScore |
|
|
|
e.targetScore = +e.targetScore |
|
|
|
e.examQuestions = e.examQuestions.map(n => { |
|
|
|
|
|
|
|
|
|
|
|
e.examQuestions = e.examQuestions.map((n, j) => { |
|
|
|
|
|
|
|
// 填空题的各个填空分数处理 |
|
|
|
|
|
|
|
if (n.questionType === 'fill_blank') { |
|
|
|
|
|
|
|
const stem = document.querySelector(`#stem` + n.questionVersionId) |
|
|
|
|
|
|
|
const scores = [] |
|
|
|
|
|
|
|
if (stem) { |
|
|
|
|
|
|
|
const inputs = stem.querySelectorAll('.fill-input') |
|
|
|
|
|
|
|
if (inputs) { |
|
|
|
|
|
|
|
for (const e of inputs) { |
|
|
|
|
|
|
|
scores.push(e.value) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
n.jsonText = JSON.stringify({ |
|
|
|
|
|
|
|
questionVersionId: n.questionVersionId, |
|
|
|
|
|
|
|
scores |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} |
|
|
|
return { |
|
|
|
return { |
|
|
|
questionVersionId: n.questionVersionId, |
|
|
|
questionVersionId: n.questionVersionId, |
|
|
|
serialNumber: n.serialNumber, |
|
|
|
serialNumber: n.serialNumber, |
|
|
|
score: +n.score, |
|
|
|
score: +n.score, |
|
|
|
|
|
|
|
jsonText: n.jsonText, |
|
|
|
paperId: !isCopy && this.paperId || '', |
|
|
|
paperId: !isCopy && this.paperId || '', |
|
|
|
outlineId: !isCopy && e.outlineId || '', |
|
|
|
outlineId: !isCopy && e.outlineId || '', |
|
|
|
} |
|
|
|
} |
|
|
@ -641,6 +791,7 @@ export default { |
|
|
|
form.questionType = [...new Set(paper.map(e => e.questionType))].join('、') // 试题类型 |
|
|
|
form.questionType = [...new Set(paper.map(e => e.questionType))].join('、') // 试题类型 |
|
|
|
form.createSource = 1 |
|
|
|
form.createSource = 1 |
|
|
|
if (isCopy) form.paperId = '' |
|
|
|
if (isCopy) form.paperId = '' |
|
|
|
|
|
|
|
// debugger |
|
|
|
try { |
|
|
|
try { |
|
|
|
await this.$post(this.api.saveExamPaper, form) |
|
|
|
await this.$post(this.api.saveExamPaper, form) |
|
|
|
Util.successMsg('保存成功') |
|
|
|
Util.successMsg('保存成功') |
|
|
@ -774,6 +925,22 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/deep/.fill-input { |
|
|
|
|
|
|
|
width: 100px; |
|
|
|
|
|
|
|
height: 28px; |
|
|
|
|
|
|
|
padding: 0 15px; |
|
|
|
|
|
|
|
margin: 0 10px; |
|
|
|
|
|
|
|
font-size: 13px; |
|
|
|
|
|
|
|
line-height: 28px; |
|
|
|
|
|
|
|
color: #606266; |
|
|
|
|
|
|
|
border: 1px solid #DCDEE0; |
|
|
|
|
|
|
|
border-radius: 2px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:focus { |
|
|
|
|
|
|
|
outline: none; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.opt { |
|
|
|
.opt { |
|
|
|
display: flex; |
|
|
|
display: flex; |
|
|
|
flex-wrap: wrap; |
|
|
|
flex-wrap: wrap; |
|
|
|