提交 3a73cbf1 authored 作者: Yroc's avatar Yroc

'学生端优化完善'

上级 5b99ba3f
......@@ -3,7 +3,7 @@
* @Author: AnthonyD
* @Date: 2023-03-28 15:25:05
* @Last Modified by: AnthonyD
* @Last Modified time: 2023-03-29 19:15:23
* @Last Modified time: 2023-04-18 17:21:31
*/
</script><!-- -->
<template>
......@@ -21,8 +21,8 @@ export default {
computed: {},
created() {
console.log('图标数据');
console.log(this.chart_data);
// console.log('图标@@@@@@@@数据');
// console.log(this.chart_data);
},
mounted() {
this.initChart();
......@@ -30,7 +30,9 @@ export default {
methods: {
initChart() {
let colors = ['#bcdfdc', '#47afa0', '#cd9f50'];
let series = this.changData(this.chart_data);
// console.log(series);
let legend_data = this.chart_data.labers.map((item) => {
return item.key;
});
......@@ -40,33 +42,26 @@ export default {
renderer: 'canvas',
useDirtyRect: false,
});
let labers = this.chart_data.labers.map((item) => {
return item.label;
});
let option;
option = {
color: ['#cd9f50', '#47afa0', '#bcdfdc'],
color: colors,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
},
formatter: function (params) {
console.log(params);
let html = '';
_that.chart_data.labers.forEach((e, i) => {
html += `<p>
<span>${e.label}</span>
<span>${params[i].value}</span>
</p>`;
});
return html;
},
},
legend: {
formatter: (name) => {
/* formatter: (name) => {
let objs = this.chart_data.labers.filter((itme) => {
return itme.key == name;
});
return objs[0].label;
},
}, */
data: labers,
},
toolbox: {
show: false,
......@@ -87,6 +82,10 @@ export default {
axisTick: { show: false },
// data: ['2012', '2013', '2014', '2015', '2016']
data: this.chart_data.keys,
axisLabel: {
show: true,
rotate: -90,
},
},
],
yAxis: [
......@@ -106,10 +105,15 @@ export default {
},
//处理数据
changData(data) {
// console.log(data);
let list = [];
data.labers.forEach((item, index) => {
let obj = {
name: item.key,
itemStyle: {
normal: { label: { show: true, position: 'top' } },
},
name: item.label,
type: 'bar',
barGap: 0,
emphasis: {
......
......@@ -9,20 +9,34 @@
<div class="container_box">
<table class="table_box">
<tr>
<th v-for="(e, i) in labers" :key="i">{{ e.label }}</th>
<th v-for="(e, i) in labers" :key="i" class="table_head_box">
{{ e.label
}}<i
class="el-icon-caret-top"
:style="
'color: ' +
(e.key == sort_field && sort_type == 'asc' ? '#038d6e' : '')
"
@click="sort(e.key, 'asc')"
></i>
<i
class="el-icon-caret-bottom"
:style="
'color: ' +
(e.key == sort_field && sort_type == 'desc' ? '#038d6e' : '')
"
@click="sort(e.key, 'desc')"
></i>
</th>
</tr>
<tr v-for="(item, index) in table_data" :key="index">
<td v-for="(e, i) in labers" :key="i">
<div v-if="typeof item[e.key] === 'object'">
<el-popover placement="top-start" width="200" trigger="hover">
<!-- <el-popover placement="top-start" width="200" trigger="hover">
<div>
<el-form label-width="80px">
<!-- <el-form-item label="正确数据: ">
<span v-for="(o, b) in item[e.key].exactness.value">{{ o
}},</span>
</el-form-item> -->
<el-form-item label="错误数据: ">
<span v-for="(o, b) in item[e.key].wrong.value"
<span v-for="(o, b) in item[e.key].wrong.value" :key="b"
>{{ o }},</span
>
</el-form-item>
......@@ -31,33 +45,145 @@
<el-button slot="reference" type="text" size="mini">{{
item[e.key].accuracy.value
}}</el-button>
</el-popover>
</el-popover> -->
<span slot="reference" type="text" size="mini">
{{ item[e.key] }}
</span>
</div>
<el-popover
v-else-if="e.key === 'stability'"
placement="top-start"
width="100%"
trigger="hover"
>
<div
v-if="
Object.prototype.toString.call(item.conclusion_data) ===
'[object Array]'
"
>
学员答案:{{ item.conclusion_data.join(',') }}
</div>
<div v-else>
<el-table
:data="table_data[index].conclusion_table"
height="250"
border
style="width: 100%"
>
<el-table-column
prop="student_id"
sortable
label="学员信息"
width="180"
>
<template slot-scope="scope">
{{ scope.row.name }}({{ scope.row.student_id }})
</template>
</el-table-column>
<el-table-column
prop="conclusion"
sortable
label="稳定性"
width="180"
>
</el-table-column>
<el-table-column
label="学员答案"
sortable
prop="conclusion_data"
width="180"
>
<template slot-scope="scope">
{{ scope.row.conclusion_data.join(',') }}
</template>
</el-table-column>
</el-table>
</div>
<span slot="reference">{{ item[e.key] }}</span>
</el-popover>
<div v-else>{{ item[e.key] }}</div>
</td>
</tr>
</table>
<!-- <el-table :data="table_data" border style="width: 100%">
<el-table-column
v-for="(item, index) in labers"
:key="index"
:label="item.label"
:width="item.width"
>
<template slot="header">
<div>{{ item.label }}</div>
</template>
<template slot-scope="scope">
<div>{{ scope.row[item.key] }}</div>
</template>
</el-table-column>
</el-table> -->
</div>
</template>
<script>
export default {
props: ['table_data', 'labers'],
props: ['table_data', 'labers', 'is_pover'],
data() {
return {};
return {
sort_field: null,
sort_type: null,
};
},
components: {},
computed: {},
created() {},
created() {
// console.log(this.table_data);
// console.log(this.labers);
},
mounted() {},
methods: {
test(item) {
console.log('判断对象');
console.log(item);
console.log(typeof item == 'object');
sort(col, type = 'desc') {
this.sort_field = col;
this.sort_type = type;
if (type == 'asc') {
this.table_data.sort((a, b) => {
let a_n =
parseFloat(a[col]) != a[col] ? a[col].split('~')[0] : a[col];
let b_n =
parseFloat(b[col]) != b[col] ? b[col].split('~')[0] : b[col];
if (parseFloat(a_n) == a_n && parseFloat(b_n) == b_n) {
return a_n - b_n;
} else if (a_n < b_n) {
return -1;
} else if (a_n > b_n) {
return 1;
} else {
return 0;
}
}); //升序
} else {
this.table_data.sort((a, b) => {
let a_n =
parseFloat(a[col]) != a[col] ? a[col].split('~')[0] : a[col];
let b_n =
parseFloat(b[col]) != b[col] ? b[col].split('~')[0] : b[col];
if (parseFloat(a_n) == a_n && parseFloat(b_n) == b_n) {
return b_n - a_n;
} else if (b_n < a_n) {
return -1;
} else if (b_n > a_n) {
return 1;
} else {
return 0;
}
}); //降序
}
},
},
};
......@@ -66,6 +192,19 @@ export default {
.container_box {
width: 100%;
height: 100%;
position: relative;
.table_head_box {
padding: 15px 10px;
}
}
.el-icon-caret-bottom {
position: absolute;
top: 20px;
}
.el-icon-caret-top {
position: absolute;
top: 13px;
}
.table_box {
......@@ -96,4 +235,22 @@ export default {
color: #303133;
}
}
@media screen and (max-width: 600px) {
.container_box {
position: relative;
.el-icon-caret-bottom {
position: absolute;
top: 15px;
}
.el-icon-caret-top {
position: absolute;
top: 8px;
}
.table_head_box {
padding: 10px 15px 10px 0px;
white-space: nowrap;
}
}
}
</style>
<!--
* @Author: czj
* @Date: 2023-03-21 10:14:46
* @Description:
* @FilePath: \AdministrationHome\src\components\AnalyseModule\components\table.vue
-->
<!-- -->
<template>
<div class="container_box">
<div>
<el-select
v-model="select_value"
style="width: 100%"
@change="selectChange"
>
<el-option v-for="(e, i) in select_list" :label="e" :value="e" :key="i">
</el-option>
</el-select>
</div>
<table class="table_box">
<tr>
<!-- #038d6e -->
<th v-for="(e, i) in labers" :key="i" style="padding: 15px 10px">
{{ e.label
}}<span
><i
class="el-icon-caret-bottom"
:style="
'color: ' +
(e.key == sort_field && sort_type == 'desc' ? '#038d6e' : '')
"
@click="sort(e.key, 'desc')"
></i
><i
class="el-icon-caret-top"
:style="
'color: ' +
(e.key == sort_field && sort_type == 'asc' ? '#038d6e' : '')
"
@click="sort(e.key, 'asc')"
></i
></span>
</th>
</tr>
<tr v-for="(item, index) in table_list" :key="index">
<td v-for="(e, i) in labers" :key="i">
<div>{{ item[e.key] }}</div>
</td>
</tr>
</table>
</div>
</template>
<script>
export default {
props: ['table_data', 'labers'],
data() {
return {
sort_field: null,
sort_type: null,
table_list: null,
select_list: [],
select_value: '',
};
},
components: {},
computed: {},
created() {
// console.log('是否加载');
// console.log(this.table_data);
// console.log(this.labers);
this.select_value = this.table_data.select_value;
this.select_list = [...this.table_data.topic];
this.table_list = this.table_data.list[this.table_data.topic[0]];
},
mounted() {},
methods: {
sort(col, type = 'desc') {
this.sort_field = col;
this.sort_type = type;
if (type == 'asc') {
this.table_list.sort((a, b) => {
let a_n =
parseFloat(a[col]) != a[col] ? a[col].split('~')[0] : a[col];
let b_n =
parseFloat(b[col]) != b[col] ? b[col].split('~')[0] : b[col];
if (parseFloat(a_n) == a_n && parseFloat(b_n) == b_n) {
return a_n - b_n;
} else if (a_n < b_n) {
return -1;
} else if (a_n > b_n) {
return 1;
} else {
return 0;
}
}); //升序
} else {
this.table_list.sort((a, b) => {
let a_n =
parseFloat(a[col]) != a[col] ? a[col].split('~')[0] : a[col];
let b_n =
parseFloat(b[col]) != b[col] ? b[col].split('~')[0] : b[col];
if (parseFloat(a_n) == a_n && parseFloat(b_n) == b_n) {
return b_n - a_n;
} else if (b_n < a_n) {
return -1;
} else if (b_n > a_n) {
return 1;
} else {
return 0;
}
}); //降序
}
},
//选择监听
selectChange(val) {
console.log('val');
console.log(val);
this.table_list = [...this.table_data.list[val]];
},
},
};
</script>
<style lang="scss" scoped>
.container_box {
width: 100%;
height: 100%;
position: relative;
}
.el-icon-caret-bottom {
position: absolute;
top: 56px;
}
.el-icon-caret-top {
position: absolute;
top: 49px;
}
.table_box {
width: 100%;
// min-height: 100%;
text-align: center;
font-size: 14px;
border-top: 1px solid #e4e7ed;
border-left: 1px solid #e4e7ed;
border-collapse: collapse;
th,
td {
margin: 0;
padding: 0;
font-size: 14px;
border-bottom: 1px solid #e4e7ed;
border-right: 1px solid #e4e7ed;
}
th {
padding: 15px 0;
color: #909399;
}
td {
padding: 5px 0;
color: #303133;
}
}
</style>
......@@ -7,10 +7,13 @@
<!-- -->
<template>
<div class="container_box">
<!-- <el-select v-model="">
<el-option></el-option>
</el-select> -->
<table class="table_box">
<!-- <tr>
<th v-for="(e, i) in labers" :key="i">{{ e.label }}</th>
</tr> -->
<th v-for="(e, i) in labers" :key="i">{{ e.label }}</th>
</tr> -->
<tr v-for="(item, index) in table_data.labers" :key="index">
<th>{{ item.label }}</th>
<th>{{ keepTwoDecimal(table_data.data[item.key]) }}</th>
......@@ -24,24 +27,32 @@
export default {
props: ['table_data'],
data() {
return {};
return {
sel: '',
};
},
components: {},
computed: {},
created() {},
mounted() {},
mounted() {
// console.log(this.table_data);
},
methods: {
//保留两位,四舍五入
keepTwoDecimal(num) {
var result = parseFloat(num);
if (isNaN(result)) {
return false;
if (num.includes(',')) {
return num;
} else {
result = Math.round(num * 100) / 100;
return result;
var result = parseFloat(num);
if (isNaN(result)) {
return false;
} else {
result = Math.round(num * 100) / 100;
return result;
}
}
},
},
......
......@@ -9,12 +9,37 @@
<div class="container_box">
<table class="table_box">
<tr>
<th v-for="(e, i) in labers" :key="i">{{ e.label }}</th>
<th v-for="(e, i) in labers" :key="i" class="table_head_box">
{{ e.label
}}<span
><i
class="el-icon-caret-top"
:style="
'color: ' +
(e.key == sort_field && sort_type == 'asc' ? '#038d6e' : '')
"
@click="sort(e.key, 'asc')"
></i>
<i
class="el-icon-caret-bottom"
:style="
'color: ' +
(e.key == sort_field && sort_type == 'desc' ? '#038d6e' : '')
"
@click="sort(e.key, 'desc')"
></i
></span>
</th>
</tr>
<tr v-for="(item, index) in table_data" :key="index">
<td v-for="(e, i) in labers" :key="i">
<div v-if="e.key == 'distribute'">
<div v-if="item['distribute'].length > 3">
<div
v-if="
typeof item['distribute'] == 'object' &&
item['distribute'].length > 3
"
>
<el-popover
placement="right"
title="标题"
......@@ -29,9 +54,14 @@
>
</el-popover>
</div>
<div v-else>
<div v-else-if="typeof item['distribute'] == 'object'">
<div v-for="(h, key, j) in item['distribute']" :key="j">
{{ key }}({{ item['distribute'][key] }}题),
{{ key }}({{ item['distribute'][key] }}题)
</div>
</div>
<div v-else>
<div>
{{ item['distribute'] }}
</div>
</div>
</div>
......@@ -61,24 +91,75 @@
export default {
props: ['table_data', 'labers'],
data() {
return {};
return {
sort_field: null,
sort_type: null,
};
},
components: {},
computed: {},
created() {},
mounted() {},
methods: {},
methods: {
sort(col, type = 'desc') {
this.sort_field = col;
this.sort_type = type;
if (type == 'asc') {
this.table_data.sort((a, b) => {
let a_n =
parseFloat(a[col]) != a[col] ? a[col].split('~')[0] : a[col];
let b_n =
parseFloat(b[col]) != b[col] ? b[col].split('~')[0] : b[col];
if (parseFloat(a_n) == a_n && parseFloat(b_n) == b_n) {
return a_n - b_n;
} else if (a_n < b_n) {
return -1;
} else if (a_n > b_n) {
return 1;
} else {
return 0;
}
}); //升序
} else {
this.table_data.sort((a, b) => {
let a_n =
parseFloat(a[col]) != a[col] ? a[col].split('~')[0] : a[col];
let b_n =
parseFloat(b[col]) != b[col] ? b[col].split('~')[0] : b[col];
if (parseFloat(a_n) == a_n && parseFloat(b_n) == b_n) {
return b_n - a_n;
} else if (b_n < a_n) {
return -1;
} else if (b_n > a_n) {
return 1;
} else {
return 0;
}
}); //降序
}
},
},
};
</script>
<style lang="scss" scoped>
.container_box {
width: 100%;
height: 100%;
position: relative;
}
// .el-icon-caret-bottom {
// position: absolute;
// top: 20px;
// }
// .el-icon-caret-top {
// position: absolute;
// top: 13px;
// }
.table_box {
width: 100%;
// min-height: 100%;
......@@ -107,4 +188,38 @@ export default {
color: #303133;
}
}
@media screen and (min-width: 600px) {
.container_box {
position: relative;
.el-icon-caret-bottom {
position: absolute;
top: 15px;
}
.el-icon-caret-top {
position: absolute;
top: 8px;
}
.table_head_box {
padding: 10px 15px;
}
}
}
@media screen and (max-width: 600px) {
.container_box {
position: relative;
.el-icon-caret-bottom {
position: absolute;
top: 15px;
}
.el-icon-caret-top {
position: absolute;
top: 8px;
}
.table_head_box {
padding: 10px 15px 10px 0px;
white-space: nowrap;
}
}
}
</style>
......@@ -16,33 +16,63 @@
<div class="header_box">
<el-row>
<el-col :span="12">
<div class="title_box" :title="original_data.title"> {{ original_data.title }}</div>
<div class="title_box" :title="original_data.title">
{{ original_data.title }}
</div>
</el-col>
<el-col :span="12" style="text-align: right;">
<el-checkbox v-if="original_data.is_show" v-model="original_data.is_show.value" @change="changeSelect">{{
original_data.is_show.value ? '显示' : '隐藏'
}}</el-checkbox>
<el-col :span="12" style="text-align: right">
<el-checkbox
v-if="original_data.is_show"
v-model="original_data.is_show.value"
@change="changeSelect"
>{{ original_data.is_show.value ? '显示' : '隐藏' }}</el-checkbox
>
</el-col>
</el-row>
</div>
<div class="content_container" v-if="original_data.type == 'table'">
<Table :table_data="original_data.list" :labers="original_data.labers"></Table>
<Table
:table_data="original_data.list"
:labers="original_data.labers"
></Table>
</div>
<div class="content_container" v-if="original_data.type == 'select_table'">
<SelectTabe
v-if="original_data"
:table_data="original_data"
:labers="original_data.labers"
>
</SelectTabe>
</div>
<div class="content_container" v-if="false">
<line-chart :chart_data="original_data.data" :chart_id="original_data.chart_id"></line-chart>
<line-chart
:chart_data="original_data.data"
:chart_id="original_data.chart_id"
></line-chart>
</div>
<div class="content_container" v-if="original_data.type == 'bar'">
<bar-chart
:chart_data="{ raw_data: original_data.raw_data, keys: original_data.keys, labers: original_data.labers }"
:chart_id="original_data.chart_id"></bar-chart>
:chart_data="{
raw_data: original_data.raw_data,
keys: original_data.keys,
labers: original_data.labers,
}"
:chart_id="original_data.chart_id"
></bar-chart>
</div>
<div class="content_container" v-if="original_data.type == 'simple_table'">
<simple-table :table_data="original_data"></simple-table>
</div>
<!-- 眼光稳定性 -->
<div class="content_container" v-if="original_data.type == 'eye_stability_table'">
<eye-stability-table :table_data="original_data.list" :labers="original_data.labers"></eye-stability-table>
<div
class="content_container"
v-if="original_data.type == 'eye_stability_table'"
>
<eye-stability-table
:table_data="original_data.list"
:labers="original_data.labers"
></eye-stability-table>
</div>
</div>
</template>
......@@ -53,6 +83,7 @@ import LineChart from './components/LineChart.vue';
import BarChart from './components/BarChart.vue';
import SimpleTable from './components/SimpleTable.vue';
import EyeStabilityTable from './components/EyeStabilityTable.vue';
import SelectTabe from './components/SelectTabe.vue';
export default {
props: ['module_data'],
data() {
......@@ -61,23 +92,28 @@ export default {
};
},
components: { Table, LineChart, BarChart, SimpleTable, EyeStabilityTable },
components: {
Table,
LineChart,
BarChart,
SimpleTable,
EyeStabilityTable,
SelectTabe,
},
computed: {},
created() {
this.original_data = { ...this.module_data };
},
mounted() {
},
mounted() {},
methods: {
//选择框监听
changeSelect() {
this.$emit('changeSelect', this.original_data.is_show);
},
}
}
},
};
</script>
<style lang="scss" scoped>
.analyse_container {
......
......@@ -2,7 +2,7 @@
* @Author: AnthonyD
* @Date: 2023-02-22 11:31:31
* @Last Modified by: AnthonyD
* @Last Modified time: 2023-03-27 16:42:54
* @Last Modified time: 2023-04-04 18:51:52
*/
import Vue from 'vue'
......@@ -30,8 +30,6 @@ import echarts from 'echarts';
//引入加密函数,并将其封装
import { handleParams, Aesdecrypt, removeProperty } from '@/utils/cryptoJS';
Vue.prototype.$handleParams = handleParams;//封装机密格式的参数
......@@ -61,8 +59,6 @@ Vue.use(Element, {
Vue.prototype.$echarts = echarts
// register global utility filters
Object.keys(filters).forEach(key => {
Vue.filter(key, filters[key])
......
......@@ -2,7 +2,7 @@
* @Author: AnthonyD
* @Date: 2023-02-22 11:31:31
* @Last Modified by: AnthonyD
* @Last Modified time: 2023-03-29 19:28:07
* @Last Modified time: 2023-04-18 19:02:01
*/
@import './variables.scss';
@import './mixin.scss';
......@@ -265,4 +265,15 @@ aside {
}
}
.result_chart_box {
.el-radio-button:last-child .el-radio-button__inner {
padding: 10px 5px;
}
}
.pinch-zoom-container {
height: 100vh !important;
padding-top: 40%;
}
}
\ No newline at end of file
......@@ -76,6 +76,16 @@
</AnalyseModule>
</div>
</el-col>
<!-- 学员得分 -->
<el-col :span="8" :xs="24">
<div class="centenr_container">
<AnalyseModule
:module_data="transcript_data"
v-if="transcript_data"
>
</AnalyseModule>
</div>
</el-col>
</el-row>
</div>
</div>
......@@ -228,7 +238,8 @@ export default {
wrong_color_data: null,
//错误组别
wrongG_group_data: null,
//学员得分
transcript_data: null,
//老师点评
found_remark: null,
};
......@@ -264,6 +275,9 @@ export default {
this.province_score = this.changeProvinceScore(
this.appraisal_data.ProvinceScore
); //省区得分
this.transcript_data = this.changeTranscript(
this.appraisal_data.Transcript
); //学员得分
this.breed_score = this.changeBreedScore(this.appraisal_data.breedScore); //品种得分
//最高分、最低分、平均分,中位数、众数、离散(变异系数)
this.get_highes_lowestt_score_data = this.getHighesLowesttScore(
......@@ -285,8 +299,8 @@ export default {
this.appraisal_data.WrongPosition
); //错误部位
this.error_level_data = this.changeErrorLevel(
this.appraisal_data.ErrorLevel
); //错误等级
this.appraisal_data.WrongLevel
); //错误上下一级
this.wrong_color_data = this.changeWrongColor(
this.appraisal_data.WrongColor
); //错误颜色
......@@ -295,7 +309,7 @@ export default {
); //错误组别
console.log('处理好的数据');
console.log(this.wrong_position_data);
console.log(this.error_level_data);
},
//计算百分比
toPercent,
......@@ -312,7 +326,7 @@ export default {
let labers = [
{ label: '分类', key: 'classify' },
{ label: '分数段', key: 'score' },
{ label: '人数', key: 'people' },
{ label: '人次', key: 'people' },
{ label: '占比', key: 'proportion' },
];
keys.forEach((element) => {
......@@ -341,9 +355,9 @@ export default {
if (!datas) return false;
let keys = Object.keys(datas);
let labers = [
{ label: '分数', key: 'ScoreScore' },
{ label: '总分', key: 'assemble' },
{ label: '人数', key: 'student_num' },
{ label: '总题数', key: 'assemble' },
{ label: '正确人次', key: 'success_man_time' },
{ label: '错误人次', key: 'error_man_time' },
];
return {
type: 'bar',
......@@ -360,9 +374,9 @@ export default {
if (!datas) return false;
let keys = Object.keys(datas);
let labers = [
{ label: '分数', key: 'ScoreScore', value: '分数' },
{ label: '总分', key: 'assemble', value: '分数' },
{ label: '人数', key: 'student_num', value: '分数' },
{ label: '总题数', key: 'assemble' },
{ label: '正确人次', key: 'success_man_time' },
{ label: '错误人次', key: 'error_man_time' },
];
return {
type: 'bar',
......@@ -379,9 +393,9 @@ export default {
if (!datas) return false;
let keys = Object.keys(datas);
let labers = [
{ label: '分数', key: 'ScoreScore' },
{ label: '总分', key: 'assemble' },
{ label: '人数', key: 'student_num' },
{ label: '总题数', key: 'assemble' },
{ label: '正确人次', key: 'success_man_time' },
{ label: '错误人次', key: 'error_man_time' },
];
return {
type: 'bar',
......@@ -414,30 +428,61 @@ export default {
data: datas,
};
},
//学员得分情况
changeTranscript(datas) {
if (!datas) return false;
let labers = [
{ label: '姓名', key: 'name' },
{ label: '分数', key: 'score' },
];
let select_list = Object.keys(datas);
return {
type: 'select_table',
chart_id: 'transcript_bar_chart',
color: '#99A9BF',
title: '学员得分情况',
labers,
topic: select_list,
select_value: select_list[0],
// data: datas,
list: datas,
};
},
//眼光稳定性
changeEyeStability(datas) {
if (!datas) return false;
let list = [];
let labers = [
{ label: '题目', key: 'title' },
{ label: '区域', key: 'area' },
{ label: '答案', key: 'answer' },
{ label: '稳定性', key: 'stability' },
];
//处理稳定性数据
const changeStability = (items) => {
let all_num = items.exactness.length + items.wrong.length;
let Accuracy = toPercent(items.exactness.length, all_num); //准确率
return {
accuracy: { label: '正确率', value: Accuracy },
// exactness: { label: '正确数据', value: items.exactness },
wrong: { label: '错误数据', value: items.wrong },
};
};
// const changeStability = (items) => {
// let all_num = items.exactness.length + items.wrong.length;
// let Accuracy = toPercent(items.exactness.length, all_num); //准确率
// return {
// accuracy: { label: '正确率', value: Accuracy },
// // exactness: { label: '正确数据', value: items.exactness },
// wrong: { label: '错误数据', value: items.wrong },
// };
// };
// datas.data.forEach((element, index) => {
// list.push({
// title: datas.title[index],
// answer: element.answer,
// stability: changeStability(element),
// });
// });
datas.data.forEach((element, index) => {
list.push({
title: datas.title[index],
answer: element.answer,
stability: changeStability(element),
area: element.area,
stability: element.conclusion,
conclusion_table: element.conclusion_table,
});
});
return {
......@@ -458,6 +503,7 @@ export default {
{ label: '题目', key: 'title' },
{ label: '结果', key: 'result' },
{ label: '错误率', key: 'errorRate' },
{ label: '比率', key: 'ratio' },
{ label: '错误结果', key: 'distribute' },
];
datas.forEach((element, index) => {
......@@ -465,7 +511,9 @@ export default {
index: index + 1,
title: element.title,
result: element.result,
// errorRate: `${keepTwoDecimal(element.errorRate)}%`,
errorRate: `${element.errorRate}%`,
ratio: `${element.wrong_num + '/' + element.total}`,
distribute: element.distribute,
});
});
......@@ -487,12 +535,15 @@ export default {
{ label: '题目', key: 'title' },
{ label: '结果', key: 'result' },
{ label: '正确率', key: 'errorRate' },
{ label: '比率', key: 'ratio' },
];
datas.forEach((element, index) => {
list.push({
index: index + 1,
title: element.title,
result: element.result,
// errorRate: `${keepTwoDecimal(100 - element.errorRate)}%`,
ratio: `${element.total - element.wrong_num + '/' + element.total}`,
errorRate: `${100 - element.errorRate}%`,
});
});
......@@ -513,7 +564,7 @@ export default {
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '部位', key: 'position' },
{ label: '题目', key: 'position' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......@@ -536,13 +587,13 @@ export default {
list,
};
},
//错误等级
//错误上下一级
changeErrorLevel(datas) {
if (!datas) return false;
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '等级', key: 'level' },
{ label: '题目', key: 'level' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......@@ -560,9 +611,9 @@ export default {
});
return {
type: 'table',
chart_id: 'wrong_position',
chart_id: 'wrong_level',
color: '#505F79',
title: '错误等级',
title: '错误上下一级',
labers,
list,
};
......@@ -573,7 +624,7 @@ export default {
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '颜色', key: 'color' },
{ label: '题目', key: 'color' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......@@ -604,7 +655,7 @@ export default {
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '组别', key: 'group' },
{ label: '题目', key: 'group' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......
......@@ -76,6 +76,16 @@
</AnalyseModule>
</div>
</el-col>
<!-- 学员得分 -->
<el-col :span="8" :xs="24">
<div class="centenr_container">
<AnalyseModule
:module_data="transcript_data"
v-if="transcript_data"
>
</AnalyseModule>
</div>
</el-col>
</el-row>
</div>
</div>
......@@ -228,7 +238,8 @@ export default {
wrong_color_data: null,
//错误组别
wrongG_group_data: null,
//学员得分
transcript_data: null,
//老师点评
found_remark: null,
};
......@@ -264,6 +275,9 @@ export default {
this.province_score = this.changeProvinceScore(
this.summary_data.ProvinceScore
); //省区得分
this.transcript_data = this.changeTranscript(
this.summary_data.Transcript
); //学员得分
this.breed_score = this.changeBreedScore(this.summary_data.breedScore); //品种得分
//最高分、最低分、平均分,中位数、众数、离散(变异系数)
this.get_highes_lowestt_score_data = this.getHighesLowesttScore(
......@@ -285,8 +299,8 @@ export default {
this.summary_data.WrongPosition
); //错误部位
this.error_level_data = this.changeErrorLevel(
this.summary_data.ErrorLevel
); //错误等级
this.summary_data.WrongLevel
); //错误上下一级
this.wrong_color_data = this.changeWrongColor(
this.summary_data.WrongColor
); //错误颜色
......@@ -294,8 +308,8 @@ export default {
this.summary_data.WrongGroup
); //错误组别
console.log('处理好的数据');
console.log(this.wrong_position_data);
// console.log('处理好的数据');
// console.log(this.wrong_position_data);
},
//计算百分比
toPercent,
......@@ -341,9 +355,9 @@ export default {
if (!datas) return false;
let keys = Object.keys(datas);
let labers = [
{ label: '分数', key: 'ScoreScore' },
{ label: '总分', key: 'assemble' },
{ label: '人数', key: 'student_num' },
{ label: '总题数', key: 'assemble' },
{ label: '正确人次', key: 'success_man_time' },
{ label: '错误人次', key: 'error_man_time' },
];
return {
type: 'bar',
......@@ -360,9 +374,9 @@ export default {
if (!datas) return false;
let keys = Object.keys(datas);
let labers = [
{ label: '分数', key: 'ScoreScore' },
{ label: '总分', key: 'assemble' },
{ label: '人数', key: 'student_num' },
{ label: '总题数', key: 'assemble' },
{ label: '正确人次', key: 'success_man_time' },
{ label: '错误人次', key: 'error_man_time' },
];
return {
type: 'bar',
......@@ -393,6 +407,29 @@ export default {
raw_data: datas,
};
},
//学员得分情况
changeTranscript(datas) {
if (!datas) return false;
let labers = [
{ label: '姓名', key: 'name' },
{ label: '分数', key: 'score' },
];
let select_list = Object.keys(datas);
return {
type: 'select_table',
chart_id: 'transcript_bar_chart',
color: '#99A9BF',
title: '学员得分情况',
labers,
topic: select_list,
select_value: select_list[0],
// data: datas,
list: datas,
};
},
//最高分、最低分、平均分,中位数、众数、离散(变异系数)
getHighesLowesttScore(datas) {
if (!datas) return false;
......@@ -420,24 +457,34 @@ export default {
let list = [];
let labers = [
{ label: '题目', key: 'title' },
{ label: '区域', key: 'area' },
{ label: '答案', key: 'answer' },
{ label: '稳定性', key: 'stability' },
];
//处理稳定性数据
const changeStability = (items) => {
let all_num = items.exactness.length + items.wrong.length;
let Accuracy = toPercent(items.exactness.length, all_num); //准确率
return {
accuracy: { label: '正确率', value: Accuracy },
// exactness: { label: '正确数据', value: items.exactness },
wrong: { label: '错误数据', value: items.wrong },
};
};
// const changeStability = (items) => {
// let all_num = items.exactness.length + items.wrong.length;
// let Accuracy = toPercent(items.exactness.length, all_num); //准确率
// return {
// accuracy: { label: '正确率', value: Accuracy },
// // exactness: { label: '正确数据', value: items.exactness },
// wrong: { label: '错误数据', value: items.wrong },
// };
// };
// datas.data.forEach((element, index) => {
// list.push({
// title: datas.title[index],
// answer: element.answer,
// stability: changeStability(element),
// });
// });
datas.data.forEach((element, index) => {
list.push({
title: datas.title[index],
answer: element.answer,
stability: changeStability(element),
area: element.area,
stability: element.conclusion,
conclusion_table: element.conclusion_table,
});
});
return {
......@@ -507,13 +554,11 @@ export default {
},
//错误部位
changeWrongPosition(datas) {
console.log('错误部位原始数据');
console.log(datas);
if (!datas) return false;
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '部位', key: 'position' },
{ label: '题目', key: 'position' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......@@ -536,13 +581,13 @@ export default {
list,
};
},
//错误等级
//错误上下一级
changeErrorLevel(datas) {
if (!datas) return false;
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '等级', key: 'level' },
{ label: '题目', key: 'level' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......@@ -554,15 +599,13 @@ export default {
wrong_num: datas[element].wrong_num,
// distribute: datas[element].distribute,
distribute: countOccurrences(datas[element].distribute),
//countOccurrences(datas[element].distribute)
});
});
return {
type: 'table',
chart_id: 'wrong_position',
color: '#505F79',
title: '错误等级',
title: '错误上下一级',
labers,
list,
};
......@@ -573,7 +616,7 @@ export default {
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '颜色', key: 'color' },
{ label: '题目', key: 'color' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......@@ -585,8 +628,6 @@ export default {
wrong_num: datas[element].wrong_num,
// distribute: datas[element].distribute,
distribute: countOccurrences(datas[element].distribute),
//distribute: countOccurrences(datas[element].distribute),
});
});
return {
......@@ -604,7 +645,7 @@ export default {
let keys = Object.keys(datas);
let list = [];
let labers = [
{ label: '组别', key: 'group' },
{ label: '题目', key: 'group' },
{ label: '正确答案', key: 'answer' },
{ label: '错题数量', key: 'wrong_num' },
{ label: '错误答案内容', key: 'distribute' },
......@@ -616,7 +657,6 @@ export default {
wrong_num: datas[element].wrong_num,
// distribute: datas[element].distribute,
distribute: countOccurrences(datas[element].distribute),
//countOccurrences
});
});
return {
......
......@@ -3,18 +3,12 @@
* @Author: AnthonyD
* @Date: 2023-03-13 09:56:01
* @Last Modified by: AnthonyD
* @Last Modified time: 2023-03-30 11:31:19
* @Last Modified time: 2023-04-18 19:00:30
*/
</script>
<template>
<div class="module_container">
<div class="card_container">
<!-- <examination-header
v-if="student_brief_introduction"
:examination_questions="student_brief_introduction"
:key="new Date().getTime()"
></examination-header> -->
<!-- <test-info></test-info> -->
<test-info v-if="test_card_info" :testdata="test_card_info"></test-info>
<el-card class="box-card">
......@@ -116,11 +110,14 @@
v-if="e.image && e.image != '/'"
class="image_box"
>
<!-- :preview-src-list="[IP + e.image]" -->
<!-- :preview-src-list="[IP + e.image]" -->
<el-image
style="width: 200px"
:src="IP + e.image"
@click="ImageZoomUrl=IP + e.image;is_ImageZoom=true"
@click="
ImageZoomUrl = IP + e.image;
is_ImageZoom = true;
"
>
</el-image>
<!-- <img :src="IP + e.image" alt="" /> -->
......@@ -153,9 +150,9 @@
<el-card class="box-card">
<div style="text-align: center">
<el-radio-group v-model="radio1">
<el-radio-group v-model="radio1" class="result_chart_box">
<el-radio-button label="student_comments">学员点评</el-radio-button>
<el-radio-button label="summary">本轮总结</el-radio-button>
<el-radio-button label="summary">本次总结</el-radio-button>
<el-radio-button label="general_comment"
>本次培训总评</el-radio-button
>
......@@ -188,16 +185,12 @@
</el-card>
</div>
<el-dialog title="" :visible.sync="is_ImageZoom" top="0" style="height:100vh" width="100%">
<div class="table_box">
<!-- -->
<ImageZoom :src="ImageZoomUrl"></ImageZoom>
<div class="dialog_box" v-if="is_ImageZoom">
<div class="close_box" @click="is_ImageZoom = false">
<i class="el-icon-close"></i>
</div>
<!-- <span slot="footer" class="dialog-footer">
<el-button>取 消</el-button>
<el-button type="primary">确 定</el-button>
</span> -->
</el-dialog>
<ImageZoom :src="ImageZoomUrl"></ImageZoom>
</div>
</div>
</template>
......@@ -212,11 +205,17 @@ import OverallAppraisal from './components/overall_appraisal_view.vue';
export default {
name: '',
components: { ImageZoom,TestInfo, Summary, StudentComments, OverallAppraisal },
components: {
ImageZoom,
TestInfo,
Summary,
StudentComments,
OverallAppraisal,
},
data() {
return {
ImageZoomUrl:null,
is_ImageZoom:false,
ImageZoomUrl: null,
is_ImageZoom: false,
IP: process.env.VUE_APP_BASE_API,
//初始化请求参数
......@@ -273,19 +272,11 @@ export default {
//学员评估
this.statistical_results = res.statistical_results;
//本次培训总评
// this.appraisal_data = { ...res.Round_cultivate.review_content };
// this.appraisal_data['found_remark'] = res.Round_cultivate.found_remark;
if (res.Round_cultivate) {
this.appraisal_data = { ...res.Round_cultivate.review_content };
this.appraisal_data['found_remark'] =
res.Round_cultivate.found_remark;
}
//本轮总结
// this.summary_data = {
// ...res.Round.review_content,
// };
// this.summary_data['found_remark'] = res.Round.found_remark;
if (res.Round) {
this.summary_data = {
...res.Round.review_content,
......@@ -300,22 +291,7 @@ export default {
duration: res.answer_duration,
score: res.score,
};
// this.student_brief_introduction = {
// title: res.examination_questions_title || '',
// user_name: res.name || '',
// score: res.score || '',
// duration: res.answer_duration || '',
// status: res.status,
// examination_status: [
// { id: 1, label: '预约完成', type: 'success' },
// { id: 2, label: '考试完成', type: 'success' },
// { id: 3, label: '已发布', type: 'success' },
// { id: 4, label: '取消', type: 'info' },
// { id: 5, label: '失效', type: 'danger' },
// ],
// };
this.questions_list = [];
// if (res.examination_questions) this.questions_list = || [];
res.examination_questions.examination_question_detail.forEach(
(element, index) => {
let obj = JSON.parse(JSON.stringify(element));
......@@ -326,13 +302,13 @@ export default {
let new_arr = [];
if (res.examination_questions.examination_question_detail.length > 0) {
console.log('1111');
// console.log('1111');
new_arr = array_conversion(
res.examination_questions.examination_question_detail,
5
);
} else {
console.log('2222');
// console.log('2222');
for (let index = 0; index < 20; index++) {
let items = [];
for (let i = 0; i < 5; i++) {
......@@ -343,8 +319,8 @@ export default {
new_arr.push(items);
}
}
console.log('二维数据@@@');
console.log(new_arr);
// console.log('二维数据@@@');
// console.log(new_arr);
// console.log(JSON.stringify(new_arr));
this.questions_list = new_arr;
this.detailed_information = res;
......@@ -352,7 +328,6 @@ export default {
},
showImageView(val) {
this.image_url = val;
this.outerVisible = true;
},
},
......@@ -513,6 +488,10 @@ export default {
margin: 0;
}
.result_chart_box {
white-space: nowrap;
}
.row_box {
display: inline-block;
white-space: nowrap;
......@@ -545,4 +524,21 @@ export default {
}
}
}
.dialog_box {
position: fixed;
left: 0;
top: 0;
bottom: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.3);
z-index: 3000;
.close_box {
position: fixed;
right: 10px;
top: 85px;
z-index: 3004;
color: #fff;
}
}
</style>
......@@ -3,7 +3,7 @@
* @Author: AnthonyD
* @Date: 2023-03-01 16:25:21
* @Last Modified by: AnthonyD
* @Last Modified time: 2023-03-30 09:55:37
* @Last Modified time: 2023-04-03 19:52:34
*/
</script>
......@@ -63,82 +63,11 @@
test_result_sub_data[e + (i - 1) * 5 - 1].value
}}
</el-button>
<!-- <el-input
v-if="test_result_sub_data[e + (i - 1) * 5 - 1]"
v-model="
test_result_sub_data[e + (i - 1) * 5 - 1].value
"
style="width: 100%"
class="input_box"
>
</el-input> -->
<!-- <el-popover
style="display: block; width: 100%; height: 100%"
v-if="test_result_sub_data[e + (i - 1) * 5 - 1]"
placement="bottom"
width="370"
height="400"
v-model="
test_result_sub_data[e + (i - 1) * 5 - 1].visible
"
trigger="click"
>
<div style="overflow-y: scroll;max-height: 400px;">
<el-row >
<el-col :span="8" v-for="(tobacco_grades_data_f, tobacco_grades_data_index) in tobacco_grades_data"
:key="'t'+(e + (i - 1) * 5 - 1)+tobacco_grades_data_index" style="height:119px;border-bottom: 1px solid #e6ebf5; padding:8px 0px">
<div style="padding:2px 0px"><el-tag>组别:{{tobacco_grades_data_f.name}}</el-tag></div>
<el-radio-group size="mini" @change="test_result_sub_data[e + (i - 1) * 5 - 1].visible=false" v-model="test_result_sub_data[e + (i - 1) * 5 - 1].value">
<el-radio-button
v-for="(grade_code_i, grade_code_index) in tobacco_grades_data_f.value"
:key="'s'+tobacco_grades_data_index+(e + (i - 1) * 5 - 1)+grade_code_index"
:label="grade_code_i.grade_code">{{grade_code_i.grade_code}}</el-radio-button>
</el-radio-group>
</el-col>
</el-row>
</div>
<el-button
type="text"
style="color: #303133; width: 70px"
slot="reference"
>
{{
test_result_sub_data[e + (i - 1) * 5 - 1].value
}}
</el-button>
</el-popover> -->
</div>
</div>
</div>
</div>
</template>
<!-- <template v-if="false">
<div class="row_box" v-for="e in 5" :key="e">
<div class="row_line row_header">
<div class="left">序号</div>
<div class="right">结果</div>
</div>
<div class="row_line" v-for="i in row" :key="i">
<div class="left_data">
{{
test_result_sub_data[e + (i - 1) * 5 - 1]
? e + (i - 1) * 5
: ''
}}
</div>
<div class="right_data">
<el-input
v-if="test_result_sub_data[e + (i - 1) * 5 - 1]"
v-model="
test_result_sub_data[e + (i - 1) * 5 - 1].value
"
style="width: 100%"
></el-input>
</div>
</div>
</div>
</template> -->
</el-row>
</div>
</div>
......
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论