|
@@ -1,21 +1,31 @@
|
|
|
<template>
|
|
|
<div class="ev-list-container">
|
|
|
+ <Loading v-show="importLoading"></Loading>
|
|
|
+
|
|
|
<div class="ev-header">
|
|
|
<Icon type="md-bookmarks" size="30" color="rgb(16, 171, 231)" />
|
|
|
- <span class="ev-title">我的题库</span>
|
|
|
+ <span class="ev-title">题库列表</span>
|
|
|
<span class="ev-length">共 {{list.length}} 道题</span>
|
|
|
</div>
|
|
|
<!-- 筛选部分 -->
|
|
|
<div class="filter-wrap">
|
|
|
+ <div class="filter-item">
|
|
|
+ <span class="filter-title">来源:</span>
|
|
|
+ <RadioGroup v-model="filterOrigin" type="button" @on-change="filterOriginChange">
|
|
|
+ <Radio label="self">个人私有库</Radio>
|
|
|
+ <Radio label="school">学校公用库</Radio>
|
|
|
+ <Radio label="system">系统公用库</Radio>
|
|
|
+ </RadioGroup>
|
|
|
+ </div>
|
|
|
<div class="filter-item">
|
|
|
<span class="filter-title">题型:</span>
|
|
|
<RadioGroup v-model="filterType" type="button" @on-change="filterTypeChange">
|
|
|
<Radio label="all">全部</Radio>
|
|
|
- <Radio label="single">单选</Radio>
|
|
|
- <Radio label="multiple">多选</Radio>
|
|
|
- <Radio label="judge">判断</Radio>
|
|
|
- <Radio label="complete">填空</Radio>
|
|
|
- <Radio label="subjective">问答</Radio>
|
|
|
+ <Radio label="Single">单选</Radio>
|
|
|
+ <Radio label="Multiple">多选</Radio>
|
|
|
+ <Radio label="Judge">判断</Radio>
|
|
|
+ <Radio label="Complete">填空</Radio>
|
|
|
+ <Radio label="Subjective">问答</Radio>
|
|
|
</RadioGroup>
|
|
|
</div>
|
|
|
<div class="filter-item">
|
|
@@ -39,6 +49,11 @@
|
|
|
</div>
|
|
|
<div class="ev-list-operation">
|
|
|
<Checkbox v-model="isShowAnswer">展示答案与解析</Checkbox>
|
|
|
+ <span class="import-exercise">
|
|
|
+ <Upload multiple action="api/ImportExercise/uploadWord" :headers="headers" :show-upload-list="isShowUploadList" :on-success="uploadSuccess">
|
|
|
+ <Button type="info">导入习题</Button>
|
|
|
+ </Upload>
|
|
|
+ </span>
|
|
|
<div class="operation-cart">
|
|
|
<Poptip trigger="hover" title="我的试题篮" placement="bottom">
|
|
|
<Badge :count="basketCount" show-zero>
|
|
@@ -49,28 +64,33 @@
|
|
|
<div class="basket-body">
|
|
|
<div class="basket-item">
|
|
|
<span>单选题</span>
|
|
|
- <Progress :percent="basketList.all.length ? Number((basketList.single.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info/>
|
|
|
- <span style="margin-left:10px">{{ basketList.single.length }} 道 <span class="basket-delete" @click="handleBasketDelete('single')">删除</span></span>
|
|
|
+ <Progress :percent="basketList.all.length ? Number((basketList.Single.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info />
|
|
|
+ <span style="margin-left:10px">{{ basketList.Single.length }} 道 <span class="basket-delete" @click="handleBasketDelete('Single')">删除</span></span>
|
|
|
</div>
|
|
|
<div class="basket-item">
|
|
|
<span>多选题</span>
|
|
|
- <Progress :percent="basketList.all.length ? Number((basketList.multiple.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info/>
|
|
|
- <span style="margin-left:10px">{{ basketList.multiple.length}} 道 <span class="basket-delete" @click="handleBasketDelete('multiple')">删除</span></span>
|
|
|
+ <Progress :percent="basketList.all.length ? Number((basketList.Multiple.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info />
|
|
|
+ <span style="margin-left:10px">{{ basketList.Multiple.length}} 道 <span class="basket-delete" @click="handleBasketDelete('Multiple')">删除</span></span>
|
|
|
</div>
|
|
|
<div class="basket-item">
|
|
|
<span>判断题</span>
|
|
|
- <Progress :percent="basketList.all.length ? Number((basketList.judge.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info/>
|
|
|
- <span style="margin-left:10px">{{ basketList.judge.length}} 道 <span class="basket-delete" @click="handleBasketDelete('judge')">删除</span></span>
|
|
|
+ <Progress :percent="basketList.all.length ? Number((basketList.Judge.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info />
|
|
|
+ <span style="margin-left:10px">{{ basketList.Judge.length}} 道 <span class="basket-delete" @click="handleBasketDelete('Judge')">删除</span></span>
|
|
|
</div>
|
|
|
<div class="basket-item">
|
|
|
<span>填空题</span>
|
|
|
- <Progress :percent="basketList.all.length ? Number((basketList.complete.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info/>
|
|
|
- <span style="margin-left:10px">{{ basketList.complete.length}} 道 <span class="basket-delete" @click="handleBasketDelete('complete')">删除</span></span>
|
|
|
+ <Progress :percent="basketList.all.length ? Number((basketList.Complete.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info />
|
|
|
+ <span style="margin-left:10px">{{ basketList.Complete.length}} 道 <span class="basket-delete" @click="handleBasketDelete('Complete')">删除</span></span>
|
|
|
</div>
|
|
|
<div class="basket-item">
|
|
|
<span>问答题</span>
|
|
|
- <Progress :percent="basketList.all.length ? Number((basketList.subjective.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info/>
|
|
|
- <span style="margin-left:10px">{{ basketList.subjective.length}} 道 <span class="basket-delete" @click="handleBasketDelete('subjective')">删除</span></span>
|
|
|
+ <Progress :percent="basketList.all.length ? Number((basketList.Subjective.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info />
|
|
|
+ <span style="margin-left:10px">{{ basketList.Subjective.length}} 道 <span class="basket-delete" @click="handleBasketDelete('Subjective')">删除</span></span>
|
|
|
+ </div>
|
|
|
+ <div class="basket-item">
|
|
|
+ <span>综合题</span>
|
|
|
+ <Progress :percent="basketList.all.length ? Number((basketList.Compose.length / basketList.all.length)*100) : 0" stroke-color="rgb(16, 171, 231)" hide-info />
|
|
|
+ <span style="margin-left:10px">{{ basketList.Compose.length}} 道 <span class="basket-delete" @click="handleBasketDelete('Compose')">删除</span></span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div :class="[basketList.all.length ? 'basket-footer' : 'basket-footer-no']">
|
|
@@ -85,21 +105,36 @@
|
|
|
<div v-if="list.length == 0">暂无数据</div>
|
|
|
<div class="content-wrap" v-else>
|
|
|
<div class="exercise-item" v-for="(item,index) of list">
|
|
|
- <span class="item-difficulty" :style="{backgroundColor:diffColors[item.difficulty]}">{{exersicesDiff[item.difficulty]}}</span>
|
|
|
- <span class="item-type">{{exersicesType[item.type]}}</span>
|
|
|
+ <div>
|
|
|
+ <span class="item-difficulty" :style="{backgroundColor:diffColors[item.difficulty || 3]}">{{exersicesDiff[item.difficulty || 3]}}</span>
|
|
|
+ <span class="item-type">{{exersicesType[item.type]}}</span>
|
|
|
+ <span class="item-relevant-points">
|
|
|
+ <span class="item-tools-bind">
|
|
|
+ <span class="item-tools-tool">
|
|
|
+ <span class="item-bind-point">已关联知识点:</span>
|
|
|
+ <span class="item-bind-point">字音辨析</span>
|
|
|
+ <span class="item-bind-point">字音辨析</span>
|
|
|
+ <span class="item-bind-point">字音辨析</span>
|
|
|
+ <span class="item-bind-point">字音辨析</span>
|
|
|
+ <Icon type="md-link" size="20" />
|
|
|
+ <span @click="handleBindPoint">绑定知识点</span>
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
<div class="item-question">
|
|
|
<p>{{index+1}} : <span v-html="item.question"></span></p>
|
|
|
</div>
|
|
|
- <div v-for="(option,optionIndex) in item.options">
|
|
|
+ <div v-for="(option,optionIndex) in item.option">
|
|
|
<p>{{String.fromCharCode(64 + parseInt(optionIndex+1))}} : <span v-html="option.value"></span></p>
|
|
|
</div>
|
|
|
<div class="item-answer">
|
|
|
<span class="answer-title-line"></span>
|
|
|
<span class="answer-title" @click="showAnswer($event,'answer')">答案:点击展开答案详情</span>
|
|
|
<div class="item-answer-details">
|
|
|
- <span v-html="item.answer" v-if="item.type == 'subjective'"></span>
|
|
|
- <span :class="[ item.type == 'complete' ? 'item-answer-item':'']" v-for="answer in item.answer" v-else-if="item.type == 'complete'" v-html="answer"></span>
|
|
|
- <span :class="[ item.type == 'complete' ? 'item-answer-item':'']" v-for="answer in item.answer" v-else>{{answer}}</span>
|
|
|
+ <span v-html="item.answer" v-if="item.type == 'Subjective'"></span>
|
|
|
+ <span :class="[ item.type == 'Complete' ? 'item-answer-item':'']" v-for="answer in item.answer" v-else-if="item.type == 'Complete'" v-html="answer"></span>
|
|
|
+ <span :class="[ item.type == 'Complete' ? 'item-answer-item':'']" v-for="answer in item.answer" v-else>{{answer}}</span>
|
|
|
|
|
|
</div>
|
|
|
</div>
|
|
@@ -111,13 +146,13 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="item-tools">
|
|
|
- <Button type="primary" @click="handleEdit(item)">编辑题目</Button>
|
|
|
- <Button type="info" @click="handleChoose(item)">选题</Button>
|
|
|
- <span class="item-tools-bind">
|
|
|
- <span class="item-tools-tool" @click="handleBindPoint"><Icon type="ios-link" />绑定知识点</span>
|
|
|
- <span class="item-tools-tool"><Icon type="ios-link" />绑定科目</span>
|
|
|
- <span class="item-tools-tool"><Icon type="ios-link" />绑定课纲</span>
|
|
|
- </span>
|
|
|
+
|
|
|
+ <span class="item-tools-info">来源:浙江省温州市2019年中考数学试卷</span>
|
|
|
+ <span class="item-tools-info">使用次数:98 次</span>
|
|
|
+ <span class="item-tools-info" style="border:0">更新时间:2019-07-01</span>
|
|
|
+
|
|
|
+ <Button type="info" @click="handleChoose(item)">{{basketList.all.indexOf(item) > -1 ? '已选入' : '选题'}}</Button>
|
|
|
+ <Button type="primary" @click="handleEdit(item)" style="margin-right:10px">编辑题目</Button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -139,7 +174,7 @@
|
|
|
<div class="point-list">
|
|
|
<p class="bind-title">选择知识点</p>
|
|
|
<Input search placeholder="搜索知识点..." v-model="searchWord" @on-change="filterChange" />
|
|
|
- <Tabs value="school">
|
|
|
+ <Tabs v-model="tabSelectVal">
|
|
|
<TabPane label="校本知识点" name="school">
|
|
|
<Tree :data="knowPointList" ref="pointTree" :render="renderContent" @on-check-change="pointTreeCheck" check-strictly></Tree>
|
|
|
</TabPane>
|
|
@@ -151,19 +186,21 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="selected-point-list">
|
|
|
- <p class="bind-title">已选知识点<span style="font-weight:500"> (最多绑定5个知识点)</span><span class="btn-clear" @click="handleClearChecked">清空</span></p>
|
|
|
- <span class="checked-point" v-for="item in checkedPointList">{{item.name}}<Icon type="md-close" color="#fff" style="margin-left:5px;cursor:pointer" @click="deleteCheckedPoint(item)"/></span>
|
|
|
+ <p class="bind-title">已选知识点<span style="font-weight:500;font-size:12px"> (最多绑定5个知识点,颜色代表不同来源)</span><span class="btn-clear" @click="handleClearChecked">清空</span></p>
|
|
|
+ <span class="checked-point" :style="{background:item.origin=='school'?'#10abe7':'#12b9ab'}" v-for="item in checkedPointList">{{item.name}}<Icon type="md-close" color="#fff" style="margin-left:5px;cursor:pointer" @click="deleteCheckedPoint(item)" /></span>
|
|
|
</div>
|
|
|
</Modal>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
|
import IconText from '@/components/evaluation/IconText.vue'
|
|
|
+ import Loading from '@/common/Loading.vue'
|
|
|
import questions from './list.json'
|
|
|
import { setTimeout } from 'core-js';
|
|
|
export default {
|
|
|
components: {
|
|
|
- IconText
|
|
|
+ IconText,
|
|
|
+ Loading
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
@@ -172,63 +209,74 @@ import { setTimeout } from 'core-js';
|
|
|
basketCount: 0,
|
|
|
basketList: {
|
|
|
all:[],
|
|
|
- single: [],
|
|
|
- multiple: [],
|
|
|
- judge: [],
|
|
|
- complete: [],
|
|
|
- subjective: []
|
|
|
+ Single: [],
|
|
|
+ Multiple: [],
|
|
|
+ Judge: [],
|
|
|
+ Complete: [],
|
|
|
+ Subjective: [],
|
|
|
+ Compose:[]
|
|
|
},
|
|
|
- pointListLoading:true,
|
|
|
+ pointListLoading: true,
|
|
|
+ isShowUploadList:false,
|
|
|
schoolInfo: {},
|
|
|
bindPointModal: false,
|
|
|
exersicesType: {
|
|
|
- single: "单选",
|
|
|
- multiple: "多选",
|
|
|
- judge: "判断",
|
|
|
- complete: "填空",
|
|
|
- subjective:"问答"
|
|
|
+ Single: "单选",
|
|
|
+ Multiple: "多选",
|
|
|
+ Judge: "判断",
|
|
|
+ Complete: "填空",
|
|
|
+ Subjective:"问答",
|
|
|
+ Compose:"综合题"
|
|
|
},
|
|
|
exersicesDiff: ["容易", "较易", "一般", "较难", "困难"],
|
|
|
diffColors: ['#32CF74', '#E8BE15', '#F19300', '#EB5E00', '#D30000'],
|
|
|
- filterType:"all",
|
|
|
+ filterType: "all",
|
|
|
+ filterOrigin:"self",
|
|
|
filterDiff:"all",
|
|
|
filterSort: "0",
|
|
|
pageSize: 5,
|
|
|
pageNum: 1,
|
|
|
totalNum: 100,
|
|
|
- allList: questions.list,
|
|
|
+ allList: questions.result.data,
|
|
|
knowPointList: [],
|
|
|
schoolPointList: [],
|
|
|
allPointList:[],
|
|
|
checkedPointList: [],
|
|
|
- isShowAnswer: true
|
|
|
+ isShowAnswer: true,
|
|
|
+ importLoading:false,
|
|
|
+ tabSelectVal:"school"
|
|
|
}
|
|
|
},
|
|
|
created() {
|
|
|
this.schoolInfo = JSON.parse(localStorage.getItem('c_role_info')).roleClaim[0];
|
|
|
- this.list = questions.list;
|
|
|
- this.totalNum = questions.list.length;
|
|
|
+ this.list = questions.result.data;
|
|
|
+ this.totalNum = questions.result.data.length;
|
|
|
if (this.$route.params.exerciseItem) {
|
|
|
this.list.unshift(this.$route.params.exerciseItem);
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
|
|
|
+ //根据题库加载题目
|
|
|
+ filterOriginChange(origin) {
|
|
|
+ console.log(origin);
|
|
|
+ },
|
|
|
+
|
|
|
//筛选题型
|
|
|
filterTypeChange(val) {
|
|
|
if (val == "all") {
|
|
|
- this.list = questions.list;
|
|
|
+ this.list = questions.result.data;
|
|
|
} else {
|
|
|
- this.list = questions.list.filter(item => item.type == val);
|
|
|
+ this.list = questions.result.data.filter(item => item.type == val);
|
|
|
}
|
|
|
},
|
|
|
|
|
|
//筛选难度
|
|
|
filterDiffChange(val) {
|
|
|
if (val == "all") {
|
|
|
- this.list = questions.list;
|
|
|
+ this.list = questions.result.data;
|
|
|
} else {
|
|
|
- this.list = questions.list.filter(item => item.difficulty == val);
|
|
|
+ this.list = questions.result.data.filter(item => item.difficulty == val);
|
|
|
}
|
|
|
},
|
|
|
|
|
@@ -269,7 +317,7 @@ import { setTimeout } from 'core-js';
|
|
|
pageChange(page) {
|
|
|
let start = this.pageSize * (page - 1);
|
|
|
let end = this.pageSize * page;
|
|
|
- let list = questions.list;
|
|
|
+ let list = questions.result.data;
|
|
|
this.list = list.slice(start, end);
|
|
|
window.scroll(0, 0);
|
|
|
},
|
|
@@ -352,9 +400,10 @@ import { setTimeout } from 'core-js';
|
|
|
PartitionKey: "zh-CN",
|
|
|
}
|
|
|
}
|
|
|
- //this.$api.FindKnowledgeBlockAndPointByDict(data).then(res => {
|
|
|
-
|
|
|
- //})
|
|
|
+ this.$api.FindKnowledgeBlockAndPointByDict(data).then(res => {
|
|
|
+ let list = res.result.data;
|
|
|
+ this.allPointList = list;
|
|
|
+ })
|
|
|
},
|
|
|
|
|
|
//获取标准知识点仓库数据
|
|
@@ -366,22 +415,25 @@ import { setTimeout } from 'core-js';
|
|
|
}
|
|
|
}
|
|
|
this.$api.FindKnowledgePointByDict(data).then(res => {
|
|
|
- let list = res.result.data;
|
|
|
- this.allPointList = list;
|
|
|
this.pointListLoading = false;
|
|
|
})
|
|
|
},
|
|
|
|
|
|
- //获取学校知识点仓库数据
|
|
|
+ //获取学校知识块仓库数据
|
|
|
getSchoolPoints() {
|
|
|
- let data = {
|
|
|
+ let data = {
|
|
|
+ pointParams: {
|
|
|
SubjectCode: "Subject_Chinese",
|
|
|
PartitionKey: "zh-CN",
|
|
|
SchoolCode: this.schoolInfo.claim[0].claimCode,
|
|
|
- Status:1
|
|
|
+ Status: 1
|
|
|
+ }
|
|
|
}
|
|
|
- this.$api.FindSchoolPointByDict(data).then(res => {
|
|
|
+ this.$api.FindSchoolBlockAndPointByDict(data).then(res => {
|
|
|
let list = res.result.data;
|
|
|
+ list.forEach(item => {
|
|
|
+ item.expand = !item.expand;
|
|
|
+ })
|
|
|
this.schoolPointList = list;
|
|
|
this.pointListLoading = false;
|
|
|
})
|
|
@@ -444,6 +496,7 @@ import { setTimeout } from 'core-js';
|
|
|
click: () => {
|
|
|
if (this.checkedPointList.indexOf(data) == -1) {
|
|
|
if (this.checkedPointList.length < 5) {
|
|
|
+ data.origin = this.tabSelectVal;
|
|
|
this.checkedPointList.push(data);
|
|
|
} else {
|
|
|
this.$Message.warning("最多绑定5个知识点!");
|
|
@@ -451,6 +504,8 @@ import { setTimeout } from 'core-js';
|
|
|
} else {
|
|
|
this.checkedPointList.splice(this.checkedPointList.indexOf(data), 1);
|
|
|
}
|
|
|
+
|
|
|
+ console.log(this.checkedPointList);
|
|
|
}
|
|
|
}
|
|
|
})
|
|
@@ -458,17 +513,17 @@ import { setTimeout } from 'core-js';
|
|
|
]
|
|
|
);
|
|
|
},
|
|
|
- // 标题点击收缩展开
|
|
|
+ //标题点击收缩展开
|
|
|
titleClick(root, node, data, event) {
|
|
|
data.expand = !data.expand;
|
|
|
},
|
|
|
|
|
|
+ //清空已选知识点
|
|
|
handleClearChecked() {
|
|
|
- console.log(this.$refs.pointTree.getCheckedNodes());
|
|
|
- //this.$refs.pointTree.getSelectedNodes() = [];
|
|
|
this.checkedPointList = [];
|
|
|
},
|
|
|
|
|
|
+ //删除指定知识点
|
|
|
deleteCheckedPoint(item) {
|
|
|
this.checkedPointList.splice(this.checkedPointList.indexOf(item), 1);
|
|
|
},
|
|
@@ -476,13 +531,49 @@ import { setTimeout } from 'core-js';
|
|
|
//知识点筛选功能
|
|
|
filterChange() {
|
|
|
this.knowPointList = !this.searchWord ? this.schoolPointList : this.schoolPointList.filter(item => item.name.toUpperCase().indexOf(this.searchWord.toUpperCase()) > -1)
|
|
|
+ },
|
|
|
+
|
|
|
+ //导入试题
|
|
|
+ uploadSuccess(response, file, fileList) {
|
|
|
+ let that = this;
|
|
|
+ this.importLoading = true;
|
|
|
+ if (response.error == null) {
|
|
|
+ let requestData = { htmlString: response.result.data.HtmlString }
|
|
|
+ this.$api.SaveAnalyzeHtml(requestData).then(res => {
|
|
|
+ if (res.error == null) {
|
|
|
+ setTimeout(function () {
|
|
|
+ that.$Message.success('文件上传解析成功!');
|
|
|
+ that.list = res.result.data;
|
|
|
+ that.importLoading = false;
|
|
|
+ },1000)
|
|
|
+ //this.saveItemBank(res.result.data);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ this.$Message.error('对不起,文档解析失败!');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ //保存试题到数据库
|
|
|
+ saveItemBank(list) {
|
|
|
+ this.$api.SaveItemBank(list).then(res => {
|
|
|
+ console.log(res);
|
|
|
+ })
|
|
|
+
|
|
|
}
|
|
|
|
|
|
},
|
|
|
mounted() {
|
|
|
- //this.getStandardList();
|
|
|
+ this.getStandardList();
|
|
|
this.getSchoolPoints();
|
|
|
- //this.getAllPoints();
|
|
|
+ this.getAllPoints();
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ headers(){
|
|
|
+ let hd = {}
|
|
|
+ hd["Authorization"] = "Bearer "+ localStorage.getItem("token");
|
|
|
+ return hd;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
</script>
|