提交 23abb27b authored 作者: matian's avatar matian

feat:列表接口增加

上级 0d7e6e11
...@@ -2,22 +2,16 @@ ...@@ -2,22 +2,16 @@
<div class="table-list"> <div class="table-list">
<div class="table-list-hd"> <div class="table-list-hd">
<!-- 筛选 --> <!-- 筛选 -->
<div class="table-list-filter" v-if="filters.length"> <div class="table-list-filter">
<el-form :inline="true" :model="params" ref="filterForm" @submit.native.prevent> <el-form v-if="filters.length" :inline="true" :model="params" ref="filterForm">
<template v-for="item in filters"> <template v-for="item in filters">
<el-form-item :label="item.label" :prop="item.prop" :key="item.prop"> <el-form-item :label="item.label" :prop="item.prop" :key="item.prop" class="filter-form-item">
<template v-if="item.slots"> <template v-if="item.slots">
<slot :name="item.slots" v-bind="{ params }"></slot> <slot :name="item.slots" v-bind="{ params }"></slot>
</template> </template>
<template v-else> <template v-else>
<!-- input --> <!-- input -->
<el-input <el-input v-model="params[item.prop]" v-bind="item" clearable v-if="item.type === 'input'" />
v-model="params[item.prop]"
v-bind="item"
clearable
v-if="item.type === 'input'"
@keyup.native.enter="search"
/>
<!-- select --> <!-- select -->
<el-select <el-select
v-model="params[item.prop]" v-model="params[item.prop]"
...@@ -37,29 +31,31 @@ ...@@ -37,29 +31,31 @@
</template> </template>
</el-form-item> </el-form-item>
</template> </template>
<el-form-item class="filter-buttons"> <el-form-item class="filter-buttons" v-if="!searchResetSeparateLine">
<el-button type="primary" icon="el-icon-search" @click="search">查询</el-button> <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
<el-button icon="el-icon-refresh-left" @click="reset">重置</el-button> <el-button icon="el-icon-refresh-left" @click="reset">重置</el-button>
<el-button @click="showMoreFilter" v-if="hasMoreFilter">更多筛选</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="filter-bar">
<div class="filte-bar-left-btns">
<template v-if="searchResetSeparateLine">
<el-button type="primary" icon="el-icon-search" size="small" @click="search">搜索</el-button>
<el-button icon="el-icon-refresh-left" size="small" @click="reset">重置</el-button>
</template>
</div>
<div class="filter-bar-right">
<slot name="filter-bar-right" />
</div>
</div>
</div> </div>
<div class="table-list-hd-aside"><slot name="header-aside" /></div> <div class="table-list-hd-aside"><slot name="header-aside" /></div>
</div> </div>
<slot></slot> <slot></slot>
<!-- 主体 -->
<div class="table-list-bd"> <div class="table-list-bd">
<slot name="body" v-bind="{ data: dataList }"> <slot name="body" v-bind="{ data: dataList }">
<el-table <el-table :data="dataList" v-loading="loading" v-bind="$attrs" v-on="$listeners" ref="table">
:data="dataList"
v-loading="loading"
v-bind="$attrs"
v-on="$listeners"
style="height: 100%"
ref="table"
>
<template v-for="item in columns"> <template v-for="item in columns">
<el-table-column v-bind="item" :key="item.prop" v-if="visible(item)"> <el-table-column v-bind="item" :key="item.prop" v-if="visible(item)" align="center">
<template v-slot:default="scope" v-if="item.slots || item.computed"> <template v-slot:default="scope" v-if="item.slots || item.computed">
<slot :name="item.slots" v-bind="scope" v-if="item.slots"></slot> <slot :name="item.slots" v-bind="scope" v-if="item.slots"></slot>
<div v-html="item.computed(scope)" v-if="item.computed"></div> <div v-html="item.computed(scope)" v-if="item.computed"></div>
...@@ -69,9 +65,8 @@ ...@@ -69,9 +65,8 @@
</el-table> </el-table>
</slot> </slot>
</div> </div>
<!-- 底部 -->
<div class="table-list-ft"> <div class="table-list-ft">
<div style="padding: 10px 0"> <div>
<slot name="footer"></slot> <slot name="footer"></slot>
</div> </div>
<el-pagination <el-pagination
...@@ -83,51 +78,10 @@ ...@@ -83,51 +78,10 @@
:current-page.sync="page.currentPage" :current-page.sync="page.currentPage"
@size-change="pageSizeChange" @size-change="pageSizeChange"
@current-change="fetchList()" @current-change="fetchList()"
:hide-on-single-page="true"
v-if="hasPagination" v-if="hasPagination"
> >
</el-pagination> </el-pagination>
</div> </div>
<!-- 更多筛选 -->
<el-drawer title="更多筛选" :visible.sync="moreFilterVisible" ref="drawer">
<div class="more-filter-drawer">
<div class="more-filter">
<el-form :model="params" ref="moreFilterForm">
<template v-for="item in moreFilters">
<el-form-item :label="item.label" :prop="item.prop" :key="item.prop">
<template v-if="item.slots">
<slot :name="item.slots" v-bind="{ params }"></slot>
</template>
<template v-else>
<!-- input -->
<el-input v-model="params[item.prop]" v-bind="item" clearable v-if="item.type === 'input'" />
<!-- select -->
<el-select
v-model="params[item.prop]"
clearable
v-bind="item"
v-if="item.type === 'select'"
style="width: 100%"
>
<template v-for="(option, index) in item.options">
<el-option
:label="option[item.labelKey] || option.label"
:value="option[item.valueKey] || option.value"
:key="index"
></el-option>
</template>
</el-select>
</template>
</el-form-item>
</template>
</el-form>
</div>
<div class="more-filter-buttons">
<el-button @click="cancelMoreFilter">取 消</el-button>
<el-button type="primary" @click="primaryMoreFilter">确定</el-button>
</div>
</div>
</el-drawer>
</div> </div>
</template> </template>
...@@ -139,8 +93,7 @@ export default { ...@@ -139,8 +93,7 @@ export default {
remote: { type: Object, default: () => ({}) }, remote: { type: Object, default: () => ({}) },
// 筛选 // 筛选
filters: { type: Array, default: () => [] }, filters: { type: Array, default: () => [] },
// 更多筛选 searchResetSeparateLine: { type: Boolean, default: false },
moreFilters: { type: Array, default: () => [] },
// 列表项 // 列表项
columns: { type: Array, default: () => [] }, columns: { type: Array, default: () => [] },
// 列表数据 // 列表数据
...@@ -155,8 +108,7 @@ export default { ...@@ -155,8 +108,7 @@ export default {
loading: false, loading: false,
params: this.remote.params || {}, params: this.remote.params || {},
dataList: this.data, dataList: this.data,
page: { total: 0, size: this.limit, currentPage: 1 }, page: { total: 0, size: this.limit, currentPage: 1 }
moreFilterVisible: false
} }
}, },
watch: { watch: {
...@@ -176,9 +128,6 @@ export default { ...@@ -176,9 +128,6 @@ export default {
computed: { computed: {
table() { table() {
return this.$refs.table return this.$refs.table
},
hasMoreFilter() {
return !!this.moreFilters.length
} }
}, },
methods: { methods: {
...@@ -196,25 +145,24 @@ export default { ...@@ -196,25 +145,24 @@ export default {
let params = this.params let params = this.params
// 翻页参数设置 // 翻页参数设置
if (this.hasPagination) { if (this.hasPagination) {
params.page = this.page.currentPage params.page = this.page.currentPage.toString()
params.page_size = this.page.size params.limit = this.page.size.toString()
} }
// 接口请求之前 // 接口请求之前
if (beforeRequest) { if (beforeRequest) {
params = beforeRequest(params, isReset) params = beforeRequest(params, isReset)
} }
for (const key in params) { for (const key in params) {
if (params[key] === '' || params[key] === undefined || params[key] === undefined) { if (params[key] === '' || params[key] === undefined || params[key] === null) {
delete params[key] delete params[key]
} }
} }
this.loading = true this.loading = true
httpRequest(params) httpRequest(params)
.then(res => { .then(res => {
const data = res.data || {} const { data = {} } = res || {}
const { list = [], total = 0 } = data this.page.total = parseInt(data.total || 0)
this.page.total = total this.dataList = callback ? callback(data) : data
this.dataList = callback ? callback(data) : list
}) })
.catch(() => { .catch(() => {
this.page.total = 0 this.page.total = 0
...@@ -233,8 +181,6 @@ export default { ...@@ -233,8 +181,6 @@ export default {
reset() { reset() {
// 清空筛选条件 // 清空筛选条件
this.$refs.filterForm && this.$refs.filterForm.resetFields() this.$refs.filterForm && this.$refs.filterForm.resetFields()
// 清空更多筛选条件
this.hasMoreFilter && this.$refs.moreFilterForm && this.$refs.moreFilterForm.resetFields()
// 初始化页码 // 初始化页码
this.page.currentPage = 1 this.page.currentPage = 1
// 刷新列表 // 刷新列表
...@@ -252,21 +198,6 @@ export default { ...@@ -252,21 +198,6 @@ export default {
}, },
visible(item) { visible(item) {
return Object.prototype.hasOwnProperty.call(item, 'visible') ? item.visible : true return Object.prototype.hasOwnProperty.call(item, 'visible') ? item.visible : true
},
// 显示更多筛选
showMoreFilter() {
this.moreFilterVisible = true
},
// 取消更多筛选
cancelMoreFilter() {
this.moreFilterVisible = false
// 清空筛选条件
this.$refs.moreFilterForm && this.$refs.moreFilterForm.resetFields()
},
// 确定更多筛选
primaryMoreFilter() {
this.moreFilterVisible = false
this.search()
} }
}, },
beforeMount() { beforeMount() {
...@@ -284,11 +215,20 @@ export default { ...@@ -284,11 +215,20 @@ export default {
} }
.table-list-hd { .table-list-hd {
display: flex; display: flex;
margin-bottom: 10px;
} }
.table-list-filter { .table-list-filter {
flex: 1; flex: 1;
} }
.filter-bar {
display: flex;
margin-bottom: 15px;
}
.filte-bar-left-btns {
flex: 1;
}
.el-form--inline .el-form-item {
margin-right: 30px;
}
.table-list-bd { .table-list-bd {
flex: 1; flex: 1;
} }
...@@ -304,21 +244,4 @@ export default { ...@@ -304,21 +244,4 @@ export default {
.el-table-column--selection .cell { .el-table-column--selection .cell {
padding: 0 14px !important; padding: 0 14px !important;
} }
.more-filter-drawer {
height: 100%;
display: flex;
flex-direction: column;
padding: 0 20px 20px;
box-sizing: border-box;
}
.more-filter {
flex: 1;
overflow-y: auto;
}
.more-filter-buttons {
display: flex;
.el-button {
flex: 1;
}
}
</style> </style>
...@@ -11,3 +11,15 @@ export function getExamReivewList(params) { ...@@ -11,3 +11,15 @@ export function getExamReivewList(params) {
export function getReviewDetails(params) { export function getReviewDetails(params) {
return httpRequest.get('/api/zy/v3-teacher/examination/sheet-details', { params }) return httpRequest.get('/api/zy/v3-teacher/examination/sheet-details', { params })
} }
/**
* 获取考试筛选条件列表
*/
export function getConditionList(params) {
return httpRequest.get('/api/zy/v3-teacher/statistics/search-condition', { params })
}
/**
* 获取考试数据列表
*/
export function getExamList(params) {
return httpRequest.get('/api/zy/v3-teacher/statistics/total-list', { params })
}
...@@ -26,7 +26,8 @@ export default { ...@@ -26,7 +26,8 @@ export default {
axisPointer: { axisPointer: {
type: 'shadow' type: 'shadow'
}, },
formatter: function(data) { formatter: function (data) {
console.log(data)
const res = `<div>${data[0].axisValue}</div><div>${data[0].value}%</div>` const res = `<div>${data[0].axisValue}</div><div>${data[0].value}%</div>`
return res return res
} }
......
...@@ -11,13 +11,13 @@ ...@@ -11,13 +11,13 @@
</template> </template>
<script> <script>
// import { getExamList } from '../api' import { getExamList, getConditionList } from '../api'
export default { export default {
data() { data() {
return { return {
conditionList: { conditionList: {
examList: [], examination_list: [],
courseList: [] course_list: []
} }
} }
}, },
...@@ -26,54 +26,59 @@ export default { ...@@ -26,54 +26,59 @@ export default {
tableOptions() { tableOptions() {
return { return {
remote: { remote: {
// httpRequest: getExamList, httpRequest: getExamList,
params: {} params: {
type: 'examination',
course_id: '',
examination_id: ''
}
}, },
filters: [ filters: [
{ {
type: 'select', type: 'select',
prop: 'exam_id', prop: 'examination_list',
placeholder: '考试名称', placeholder: '考试名称',
label: '考试名称', label: '考试名称',
options: this.conditionList.examList, options: this.conditionList.examination_list,
labelKey: 'exam_name', labelKey: 'paper_title',
valueKey: 'exam_id', valueKey: 'id',
filterable: true, filterable: true
remote: true
}, },
{ {
type: 'select', type: 'select',
prop: 'course_id', prop: 'course_list',
placeholder: '所属课程', placeholder: '所属课程',
label: '所属课程', label: '所属课程',
options: this.conditionList.courseList, options: this.conditionList.course_list,
labelKey: 'course_name', labelKey: 'course_name',
valueKey: 'course_id', valueKey: 'id',
filterable: true, filterable: true
remote: true
} }
], ],
columns: [ columns: [
{ label: '考试名称', prop: 'paper_title', align: 'center' }, { label: '考试名称', prop: 'examination_name', align: 'center' },
{ label: '所属课程', prop: 'class_name', align: 'center' }, { label: '所属课程', prop: 'course_name', align: 'center' },
{ label: '参考人数', prop: 'cankao_num', align: 'center' }, { label: '参考人数', prop: 'join_num', align: 'center' },
{ label: '参考率', prop: 'rfert', align: 'center' }, { label: '参考率', prop: 'join_rate', align: 'center' },
{ label: '平均得分', prop: 'average_num', align: 'center' }, { label: '平均得分', prop: 'average', align: 'center' },
{ label: '最高分', prop: 'top', align: 'center' }, { label: '最高分', prop: 'max', align: 'center' },
{ label: '最低分', prop: 'low', align: 'center' }, { label: '最低分', prop: 'min', align: 'center' },
{ label: '题目总数', prop: 'title_num', align: 'center' }, { label: '题目总数', prop: 'question_num', align: 'center' },
{ label: '及格率', prop: 'title_percent', align: 'center' }, { label: '及格率', prop: 'pass_rate', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: 150 } { label: '操作', slots: 'table-operate', align: 'center', minWidth: 150 }
],
data: [
{
class_name: '1w1e'
}
] ]
} }
} }
}, },
created() {
this.getConditionList()
},
methods: { methods: {
getConditionList() {
getConditionList({ type: 'examination' }).then(res => {
this.conditionList = res
})
},
toExamData(row) { toExamData(row) {
this.$router.push({ this.$router.push({
path: '/teacher/data/exam/examData', path: '/teacher/data/exam/examData',
......
...@@ -5,3 +5,15 @@ import httpRequest from '@/utils/axios' ...@@ -5,3 +5,15 @@ import httpRequest from '@/utils/axios'
export function getExamReivewList(params) { export function getExamReivewList(params) {
return httpRequest.get('/api/zy/v3-teacher/examination/examination-list', { params }) return httpRequest.get('/api/zy/v3-teacher/examination/examination-list', { params })
} }
/**
* 获取练习筛选条件列表
*/
export function getConditionList(params) {
return httpRequest.get('/api/zy/v3-teacher/statistics/search-condition', { params })
}
/**
* 获取练习数据列表
*/
export function getTestList(params) {
return httpRequest.get('/api/zy/v3-teacher/statistics/total-list', { params })
}
...@@ -11,11 +11,11 @@ ...@@ -11,11 +11,11 @@
</template> </template>
<script> <script>
import { getConditionList } from '../api'
export default { export default {
data() { data() {
return { return {
visible: false, conditionList: {}
currentClickRow: {}
} }
}, },
computed: { computed: {
...@@ -24,8 +24,26 @@ export default { ...@@ -24,8 +24,26 @@ export default {
return { return {
remote: {}, remote: {},
filters: [ filters: [
{ type: 'select', prop: 'class_name', placeholder: '练习名称' }, {
{ type: 'select', prop: 'paper_title', placeholder: '所属课程' } type: 'select',
prop: 'examination_list',
placeholder: '考试名称',
label: '练习名称',
options: this.conditionList.examination_list,
labelKey: 'paper_title',
valueKey: 'id',
filterable: true
},
{
type: 'select',
prop: 'course_list',
placeholder: '所属课程',
label: '所属课程',
options: this.conditionList.course_list,
labelKey: 'course_name',
valueKey: 'id',
filterable: true
}
], ],
columns: [ columns: [
{ label: '练习名称', prop: 'paper_title', align: 'center' }, { label: '练习名称', prop: 'paper_title', align: 'center' },
...@@ -43,7 +61,15 @@ export default { ...@@ -43,7 +61,15 @@ export default {
} }
} }
}, },
created() {
this.getConditionList()
},
methods: { methods: {
getConditionList() {
getConditionList({ type: 'chapter' }).then(res => {
this.conditionList = res
})
},
toClassData(row) { toClassData(row) {
this.$router.push({ this.$router.push({
path: '/teacher/data/classList', path: '/teacher/data/classList',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论